From b6eecc44834a7ab11e5b88d838184baf0378c660 Mon Sep 17 00:00:00 2001 From: Oronemu Date: Sat, 10 Jan 2026 08:24:55 +0700 Subject: [PATCH] Time tracker app --- backend/app/api/v1/wheel.py | 41 +- backend/app/main.py | 7 +- backend/app/models/assignment.py | 1 + backend/app/schemas/__init__.py | 1 + backend/app/schemas/assignment.py | 6 + desktop/.gitignore | 28 + desktop/package-lock.json | 6893 +++++++++++++++++ desktop/package.json | 80 + desktop/postcss.config.js | 6 + desktop/resources/.gitkeep | 2 + desktop/resources/icon.ico | Bin 0 -> 432254 bytes desktop/resources/logo.jpg | Bin 0 -> 53735 bytes desktop/src/main/apiClient.ts | 145 + desktop/src/main/autolaunch.ts | 42 + desktop/src/main/index.ts | 181 + desktop/src/main/ipc.ts | 174 + desktop/src/main/storeTypes.ts | 28 + desktop/src/main/tracking/processTracker.ts | 284 + desktop/src/main/tracking/steamIntegration.ts | 215 + desktop/src/main/tracking/timeStorage.ts | 155 + desktop/src/main/tray.ts | 115 + desktop/src/main/updater.ts | 187 + desktop/src/preload/index.ts | 96 + desktop/src/renderer/App.tsx | 65 + desktop/src/renderer/components/Layout.tsx | 70 + .../src/renderer/components/ui/GlassCard.tsx | 40 + desktop/src/renderer/components/ui/Input.tsx | 48 + .../src/renderer/components/ui/NeonButton.tsx | 118 + desktop/src/renderer/index.css | 134 + desktop/src/renderer/index.html | 16 + desktop/src/renderer/logo.jpg | Bin 0 -> 53735 bytes desktop/src/renderer/main.tsx | 13 + desktop/src/renderer/pages/DashboardPage.tsx | 481 ++ desktop/src/renderer/pages/GamesPage.tsx | 298 + desktop/src/renderer/pages/LoginPage.tsx | 183 + desktop/src/renderer/pages/SettingsPage.tsx | 267 + desktop/src/renderer/splash.html | 104 + desktop/src/renderer/store/auth.ts | 149 + desktop/src/renderer/store/marathon.ts | 123 + desktop/src/renderer/store/tracking.ts | 81 + desktop/src/renderer/vite-env.d.ts | 54 + desktop/src/shared/types.ts | 226 + desktop/tailwind.config.js | 147 + desktop/tsconfig.json | 26 + desktop/tsconfig.main.json | 18 + desktop/vite.config.ts | 22 + 46 files changed, 11368 insertions(+), 2 deletions(-) create mode 100644 desktop/.gitignore create mode 100644 desktop/package-lock.json create mode 100644 desktop/package.json create mode 100644 desktop/postcss.config.js create mode 100644 desktop/resources/.gitkeep create mode 100644 desktop/resources/icon.ico create mode 100644 desktop/resources/logo.jpg create mode 100644 desktop/src/main/apiClient.ts create mode 100644 desktop/src/main/autolaunch.ts create mode 100644 desktop/src/main/index.ts create mode 100644 desktop/src/main/ipc.ts create mode 100644 desktop/src/main/storeTypes.ts create mode 100644 desktop/src/main/tracking/processTracker.ts create mode 100644 desktop/src/main/tracking/steamIntegration.ts create mode 100644 desktop/src/main/tracking/timeStorage.ts create mode 100644 desktop/src/main/tray.ts create mode 100644 desktop/src/main/updater.ts create mode 100644 desktop/src/preload/index.ts create mode 100644 desktop/src/renderer/App.tsx create mode 100644 desktop/src/renderer/components/Layout.tsx create mode 100644 desktop/src/renderer/components/ui/GlassCard.tsx create mode 100644 desktop/src/renderer/components/ui/Input.tsx create mode 100644 desktop/src/renderer/components/ui/NeonButton.tsx create mode 100644 desktop/src/renderer/index.css create mode 100644 desktop/src/renderer/index.html create mode 100644 desktop/src/renderer/logo.jpg create mode 100644 desktop/src/renderer/main.tsx create mode 100644 desktop/src/renderer/pages/DashboardPage.tsx create mode 100644 desktop/src/renderer/pages/GamesPage.tsx create mode 100644 desktop/src/renderer/pages/LoginPage.tsx create mode 100644 desktop/src/renderer/pages/SettingsPage.tsx create mode 100644 desktop/src/renderer/splash.html create mode 100644 desktop/src/renderer/store/auth.ts create mode 100644 desktop/src/renderer/store/marathon.ts create mode 100644 desktop/src/renderer/store/tracking.ts create mode 100644 desktop/src/renderer/vite-env.d.ts create mode 100644 desktop/src/shared/types.ts create mode 100644 desktop/tailwind.config.js create mode 100644 desktop/tsconfig.json create mode 100644 desktop/tsconfig.main.json create mode 100644 desktop/vite.config.ts diff --git a/backend/app/api/v1/wheel.py b/backend/app/api/v1/wheel.py index b8e2b18..8d9ab06 100644 --- a/backend/app/api/v1/wheel.py +++ b/backend/app/api/v1/wheel.py @@ -15,6 +15,7 @@ from app.models import ( from app.schemas import ( SpinResult, AssignmentResponse, CompleteResult, DropResult, GameResponse, ChallengeResponse, GameShort, UserPublic, MessageResponse, + TrackTimeRequest, ) from app.schemas.game import PlaythroughInfo from app.services.points import PointsService @@ -589,7 +590,14 @@ async def complete_assignment( if assignment.is_playthrough: game = assignment.game marathon_id = game.marathon_id - base_playthrough_points = game.playthrough_points + + # If tracked time exists (from desktop app), calculate points as hours * 30 + # Otherwise use admin-set playthrough_points + if assignment.tracked_time_minutes > 0: + hours = assignment.tracked_time_minutes / 60 + base_playthrough_points = int(hours * 30) + else: + base_playthrough_points = game.playthrough_points # Calculate BASE bonus points from completed bonus assignments (before multiplier) base_bonus_points = sum( @@ -850,6 +858,37 @@ async def complete_assignment( ) +@router.patch("/assignments/{assignment_id}/track-time", response_model=MessageResponse) +async def track_assignment_time( + assignment_id: int, + data: TrackTimeRequest, + current_user: CurrentUser, + db: DbSession, +): + """Update tracked time for an assignment (from desktop app)""" + result = await db.execute( + select(Assignment) + .options(selectinload(Assignment.participant)) + .where(Assignment.id == assignment_id) + ) + assignment = result.scalar_one_or_none() + + if not assignment: + raise HTTPException(status_code=404, detail="Assignment not found") + + if assignment.participant.user_id != current_user.id: + raise HTTPException(status_code=403, detail="This is not your assignment") + + if assignment.status != AssignmentStatus.ACTIVE.value: + raise HTTPException(status_code=400, detail="Assignment is not active") + + # Update tracked time (replace with new value) + assignment.tracked_time_minutes = max(0, data.minutes) + await db.commit() + + return MessageResponse(message=f"Tracked time updated to {data.minutes} minutes") + + @router.post("/assignments/{assignment_id}/drop", response_model=DropResult) async def drop_assignment(assignment_id: int, current_user: CurrentUser, db: DbSession): """Drop current assignment""" diff --git a/backend/app/main.py b/backend/app/main.py index 4c92886..0809306 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -60,7 +60,12 @@ app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # CORS app.add_middleware( CORSMiddleware, - allow_origins=["http://localhost:3000", "http://127.0.0.1:3000"], + allow_origins=[ + "http://localhost:3000", + "http://127.0.0.1:3000", + "http://localhost:5173", # Desktop app dev + "http://127.0.0.1:5173", + ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], diff --git a/backend/app/models/assignment.py b/backend/app/models/assignment.py index 66aacff..18c1326 100644 --- a/backend/app/models/assignment.py +++ b/backend/app/models/assignment.py @@ -32,6 +32,7 @@ class Assignment(Base): proof_comment: Mapped[str | None] = mapped_column(Text, nullable=True) points_earned: Mapped[int] = mapped_column(Integer, default=0) streak_at_completion: Mapped[int | None] = mapped_column(Integer, nullable=True) + tracked_time_minutes: Mapped[int] = mapped_column(Integer, default=0) # Time tracked by desktop app started_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) completed_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) diff --git a/backend/app/schemas/__init__.py b/backend/app/schemas/__init__.py index eeb867e..66bcbdb 100644 --- a/backend/app/schemas/__init__.py +++ b/backend/app/schemas/__init__.py @@ -52,6 +52,7 @@ from app.schemas.assignment import ( CompleteBonusAssignment, BonusCompleteResult, AvailableGamesCount, + TrackTimeRequest, ) from app.schemas.activity import ( ActivityResponse, diff --git a/backend/app/schemas/assignment.py b/backend/app/schemas/assignment.py index e80ec84..a70fd90 100644 --- a/backend/app/schemas/assignment.py +++ b/backend/app/schemas/assignment.py @@ -52,6 +52,7 @@ class AssignmentResponse(BaseModel): proof_comment: str | None = None points_earned: int streak_at_completion: int | None = None + tracked_time_minutes: int = 0 # Time tracked by desktop app started_at: datetime completed_at: datetime | None = None drop_penalty: int = 0 # Calculated penalty if dropped @@ -62,6 +63,11 @@ class AssignmentResponse(BaseModel): from_attributes = True +class TrackTimeRequest(BaseModel): + """Request to update tracked time for an assignment""" + minutes: int # Total minutes tracked (replaces previous value) + + class SpinResult(BaseModel): assignment_id: int game: GameResponse diff --git a/desktop/.gitignore b/desktop/.gitignore new file mode 100644 index 0000000..73bccf9 --- /dev/null +++ b/desktop/.gitignore @@ -0,0 +1,28 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +release/ + +# Logs +*.log +npm-debug.log* + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Environment +.env +.env.local +.env.*.local + +# Electron +*.asar diff --git a/desktop/package-lock.json b/desktop/package-lock.json new file mode 100644 index 0000000..e04b477 --- /dev/null +++ b/desktop/package-lock.json @@ -0,0 +1,6893 @@ +{ + "name": "game-marathon-tracker", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "game-marathon-tracker", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "auto-launch": "^5.0.6", + "axios": "^1.6.7", + "clsx": "^2.1.0", + "electron-store": "^8.1.0", + "electron-updater": "^6.7.3", + "lucide-react": "^0.323.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.0", + "tailwind-merge": "^2.2.1", + "vdf-parser": "^1.0.3", + "zustand": "^4.5.0" + }, + "devDependencies": { + "@types/auto-launch": "^5.0.5", + "@types/node": "^20.11.16", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.17", + "concurrently": "^8.2.2", + "electron": "^28.2.0", + "electron-builder": "^24.9.1", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "typescript": "^5.3.3", + "vite": "^5.1.0", + "wait-on": "^7.2.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/auto-launch": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/auto-launch/-/auto-launch-5.0.5.tgz", + "integrity": "sha512-/nGvQZSzM/pvCMCh4Gt2kIeiUmOP/cKGJbjlInI+A+5MoV/7XmT56DJ6EU8bqc3+ItxEe4UC2GVspmPzcCc8cg==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/applescript": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", + "integrity": "sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ==" + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/auto-launch": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.6.tgz", + "integrity": "sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA==", + "dependencies": { + "applescript": "^1.0.0", + "mkdirp": "^0.5.1", + "path-is-absolute": "^1.0.0", + "untildify": "^3.0.2", + "winreg": "1.2.4" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builder-util": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/conf/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/conf/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "optional": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dmg-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "28.3.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-28.3.3.tgz", + "integrity": "sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "peer": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-store": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", + "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", + "dependencies": { + "conf": "^10.2.0", + "type-fest": "^2.17.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true + }, + "node_modules/electron-updater": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.7.3.tgz", + "integrity": "sha512-EgkT8Z9noqXKbwc3u5FkJA+r48jwZ5DTUiOkJMOTEEH//n5Am6wfQGz7nvSFEA2oIAMv9jRzn5JKTyWeSKOPgg==", + "dependencies": { + "builder-util-runtime": "9.5.1", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "~7.7.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/builder-util-runtime": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "peer": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.323.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.323.0.tgz", + "integrity": "sha512-rTXZFILl2Y4d1SG9p1Mdcf17AcPvPvpc/egFIzUrp7IUy60MUQo3Oi1mu8LGYXUVwuRZYsSMt3csHRW5mAovJg==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vdf-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vdf-parser/-/vdf-parser-1.2.1.tgz", + "integrity": "sha512-g5c73LP8NSebruEiVjOpV6KlN6xgVXBXc5UbexHWzjkatLJR++gUBhg76YqfJ9j4ZLfZ+Hv00592uiDywR+dWg==" + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/wait-on": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "dev": true, + "dependencies": { + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winreg": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", + "integrity": "sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/desktop/package.json b/desktop/package.json new file mode 100644 index 0000000..25487db --- /dev/null +++ b/desktop/package.json @@ -0,0 +1,80 @@ +{ + "name": "game-marathon-tracker", + "version": "1.0.0", + "description": "Desktop app for tracking game time in Game Marathon", + "main": "dist/main/main/index.js", + "author": "Game Marathon", + "license": "MIT", + "scripts": { + "dev": "concurrently -k \"npm run dev:main\" \"npm run dev:renderer\" \"npm run dev:electron\"", + "dev:main": "tsc -p tsconfig.main.json --watch", + "dev:renderer": "vite", + "dev:electron": "wait-on http://localhost:5173 && electron .", + "build": "npm run build:main && npm run build:renderer", + "build:main": "tsc -p tsconfig.main.json", + "build:renderer": "vite build && node -e \"require('fs').copyFileSync('src/renderer/splash.html', 'dist/renderer/splash.html'); require('fs').copyFileSync('src/renderer/logo.jpg', 'dist/renderer/logo.jpg')\"", + "start": "electron .", + "pack": "electron-builder --dir", + "dist": "npm run build && electron-builder --win" + }, + "dependencies": { + "auto-launch": "^5.0.6", + "axios": "^1.6.7", + "clsx": "^2.1.0", + "electron-store": "^8.1.0", + "electron-updater": "^6.7.3", + "lucide-react": "^0.323.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.0", + "tailwind-merge": "^2.2.1", + "vdf-parser": "^1.0.3", + "zustand": "^4.5.0" + }, + "devDependencies": { + "@types/auto-launch": "^5.0.5", + "@types/node": "^20.11.16", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.17", + "concurrently": "^8.2.2", + "electron": "^28.2.0", + "electron-builder": "^24.9.1", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "typescript": "^5.3.3", + "vite": "^5.1.0", + "wait-on": "^7.2.0" + }, + "build": { + "appId": "com.gamemarathon.tracker", + "productName": "Game Marathon Tracker", + "directories": { + "output": "release" + }, + "files": [ + "dist/**/*", + "resources/**/*" + ], + "win": { + "target": [ + "nsis", + "portable" + ], + "icon": "resources/icon.ico", + "signAndEditExecutable": false + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true, + "createDesktopShortcut": true, + "createStartMenuShortcut": true + }, + "publish": { + "provider": "github", + "owner": "Oronemu", + "repo": "marathon_tracker" + } + } +} diff --git a/desktop/postcss.config.js b/desktop/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/desktop/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/desktop/resources/.gitkeep b/desktop/resources/.gitkeep new file mode 100644 index 0000000..7b3d74a --- /dev/null +++ b/desktop/resources/.gitkeep @@ -0,0 +1,2 @@ +# Resources placeholder +# Add icon.ico and tray-icon.png here diff --git a/desktop/resources/icon.ico b/desktop/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..702f3d0e533d1fc41c5ae3a24080c14c7b74312b GIT binary patch literal 432254 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%0Aw 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%0DjHjdG0qK<2m+rli z{qp*vY3XQURMiU;Q-+eZq+O#b@udH3jJ>9)iQlC&R**>iptS(1D^}jnroVV0n)eb# zJeWX?nZ=&biuuhRSdsC!>rlCfCI6v{y(_Ltj1}gt!3*J0ITrO!5XLicc{i<9*QL+x zVb<w?AS zza9TygokbVQ}=2=1m#&p?>C;BfW7aK-sFW$*88=t5Q}d=oQf6|V+}2%s3(*&*Kl%f zW2J40uBN*^%2!R zy`sH%(M3#=z8Qd2_`*Y13O#OfQdQ>T{`e^zB#QdtK@~i{2{W()_@8J_j&)J{Z z$3S8q_4sfI`w`>MdT$Emd^{a-#kdZEF`cNAPAvX#F0S7<55eU9P}1DVy+xc+%)v!P z6E6m$PLWR7MXWZg+3iMGJLu0}Sz-k1HGn}i=J1-V6=Pmky1!4k!CVIn+;Ziulzl!g z>%B}Khd9nb9tbD>eHaU#)_5^qnri9#2=)W17}W${KMqW8c>{kJ&ELf`_p8{C>Hz2A1W4^(C>f`97+^I*h^7D%M z%9m?XC5;$h7ItoJPrlI_GWxdsES&RPAv+wW4~)f`10(Rk3su!L}Ey2}r@&98@dpY4rzpXrxMSI zpGtHr&Q-2!vGUk541I7AZaut=vcCxxnBxeR4NBk|9Qr8!`RMtXzZXWcx#?*YCdiVSGneD2;2Qdtk+XZF>7_n|JhV`goO{-l%ky^~LGt>>YwrX5cU^TnIY6XT09 z@^4M&a;B*W&5>JL9>ByW^P$y5r#uUC_3EHvJFIzw8hFZprfWX8l=5b%ug<7`X9U zVCJ`|98(!SiWRW8roPiKlY0SNPuGUJ`uin(yyd{vWrvv0LRjPNAfNgY>y&I&1mm|) z!1B*-!Zhl^Qrr_Ph;b=r6zi^O`%|k|Lb2ve5uKk$KcDYMux39b4(+Rt!P>E};Qs0F zV{-eItcNK~TCu+mYx?{t(`6$o;qa`}czxn-_DV}8Z51ctdLrh8g19ay*pEFxebqBO z8Lv;@hiOfh@;MdzO~&}<^YQ(5ph9#LzQ^A3j1^k3Ut&M%ze~~fx4vg`Q=&g*M6#+r z=^bmzR&T((A(fFy43Nor*|M+>-hZ^4$pNTNM7sLN-p%?geR0uZXjS6JY1lZc67yNq z+q41E)UWF4Yw~jZj&wyN^}BH4)^#m#WY16(;offPj3+0P->T;Y!_20mFuB%nOsO#rV=9i|8q`?E{`q~{dq3)kWY*P> zs4)TK>dwT-np4<+cP8r>im^^t=c5gw9t-C4`%wS+@OpvVbJmB?9Yl;8!G5+;MKdw- z$!+us$ztELPtS?3(RA8u1VqIk%;_Q@`SD)DXrCkb+SkN+h4~@^q|^N|stR)zl>Hek z78{<^dQOwSA?<^>wl{?TtG>TPL{(zH@6bBG7w3oZ1)ogZKY2So+jP|Ue&LK2hO$oF z;vLeyKz{YN(%tiW(gUh#lT2%Wq*6(~IDLe<)b%}#&zH%#*ogL7!~i3iW8peh;w9zA zT<+gMjI2DnFn$zur+z0)pFr#uMPuNu<9YNj+j>eUv!|b2GYM#oQJ56A#!n-9GyB zJL;)z)?e@*eR*&8XBUp7b%2S{(f^lkz~^^Rw}lV~Ie5KL)`o`D)(7x7@;}?KinK2` zZ~#*3)3`b)F!}+)ie2gRe{%h4#(66l-Jj-L8hbW=i3cY?YxF?`b-#uEwHBPX zPZ*B$`?Eu_G|@AjF?RLqfBL?@jLXeOg=FoU#+*fN5YFr#hEd&$897(2ptZ)=it~vF zY#gv*DRu4HiC8(dqUjZr#C;Q72H#saLq3Cv50Gy6ZD@<5pABJ;Zeniw5W=4|GJWy= z@rhV=ot6KIqJJ)2s92)u2gYYs-op0xm3LKM#~!L5)jDl`{-aMwx)SS!QrCwCF~1k2 zSiR*t+vhPc0qFwbmLNW#gZJ%6U659(9M+K5^=Hf?<|i(Uje&236XUi&hk0*(1fLN0 zX<|QsAg=!nVxO--#(RR8>v0B17x*!b$9jR=Xi@t-Kpn_lJvH`awk znLZJ+8T!8JtfXheKl<*bmCZ=&;TYQ^9fR6t;@Z|JnA(T=7WR@^#+;+{e-!nH@QJP^ zx@(Bv?L4NT8}HqY1L%LndhGXgyy!LO&Z^(F-nTzD-ytsrk_Y@b0z*Sc6V{(Ks4JHp zrTbiq(C|>C3f#2sIB`J&bq(z~@rdL(6%haZUjswFp}eUOjHzByb+ z{%7reL49H6fm8>?7zg!Y7IER(J>yW8`!%W`zkGJl#O49* zYoq+0_-DmT<^+$A$CEeLH!&m=4^myWp}$qXD?HG*Z7$BAoWR+g%eW)Q_cP7$>;2Qw zs#d14`DVX2T}L{fbk`8i+Rxxgzu)p&bx8%k_tSHc{#@rF{Slp&g=Htc#nq2Ijlk3l z;z9Cs=_**f?<7V&{1kB}WgwV731vTs>;E0J<*p#=2+H$yjR-i|(`!Yy^~40KE1;b> zaU08atG+yp*iU@XJg*z}-FzP9V;B!7?N#^lt1Uh-F+tk=V$1`5 z_zdf54h+WZUirkk%&Rcwr`qi>@_>8?)#XJq-_nRRUwt~2K(8x{qIaia=-0I*YLsMu zEdIvC_}sKN^yfXAxDJn=H1w2x&-V+y{-y5~y+dx!Fq#*u__&ieT7DPqm5R+B%d`-7q=1LQN~_Y3#`vAB=@oSsM9 z28f=@1qg4?8A&Y9*jKLxDco1piUn?8-2%Jl3##^0-;+L2Zy5P+e9d!+&cgMo+tN{ZPOpuAF?wHd9@>7&id|PG8CI@e zykOSW>vK16*zsNSnfpEKHDy{j&;1*{XZS(q;!s~v&8fvR(lPQ2h|joJk1u~$v0E<; zd;BF#e02}5UUwf7N>(IIi7P@Gi>2%f!@Gi2d+K29zX9H#`X$ca1N5&oiu6^y!ewYD z+@{)n_4W&8+&7RIF*~pXKD_ZP`c|LJ`H*_0w512}P*1IudJbOpuit>>r<|n;w`~d#e%J-74q?xJF zCJkrwCyqEe8E4o^Z@6-7l0UAku!dgSBaEMO{%Ci#_9l!vTD@4*mq)qz3xhV9j@1SW#WFwK~T-U{5oAbn3&MS z>qtA}^D*`tVK8D4hF713cdtLeeUM8sCzxh(KCj=h8*i@KOc@6ejj5+#`YWf z|7Zg}W%n#weJtxirSruD zHodghN+fN);z^1pE*@2jaluJAzx!$|9a7TN4=G+8OI)egvHA&^o+IJ~(p_~zT5BQw zp!Ied+J8m+tGhVVe@T0^gc571|6&j^lyYhEtNch8*;45cYsl~O&q9xy!`rP2m$#KPe<435j7e>Sc=*V!Uj&Mk;O!j;rz4;yC zP3`fh{y|z_pc-=RGZ4*v{Gy1nBjn$aZg%`fNAXV_YbvusBev1hP|q+=!|#MC$49**Ur#z*w2WkID3G?Id)Z;^_Xd=Ts>eK63hyNc_e^;b$F>t+ zILh<4!hLqWpZbToNj9n=?Jn2<$_I#+(ZqMk|GxLq1RVKzft3$(1+&+`5B9TP(*rlP zAnyv-S!=(98?}a5K3fsy?z`7vJ)7bQi~)*XS5!*IYY+D^@j>yydt2LL@!+ytrID>nTa4nzd<;Xll7~^;0T?Z6Z+a9lM?1#^{^E>ZRunw|D`^#wyzuLy3i?OE9e5~%e0INGM!m3V7u9`?r+$cmH6|H)D(4?X+6FSVTO+m( zz8H2Ak9B_zB_qpQ`a<=d!71dYa15wA2}hYbDiu+WYpRneCuvwSWGlXViSdT0TExtX z_pA5YkNG~^r@376eyQ^aOACK%JzoZOzz5F`$I(5r7;E?CzK%i2V{OFlZN0Jcfu5!= zTy(9H5rPMAW(~lpC3y744k*T0ZWQ?_hB(i~JiGLJ_xf3A%5~+*)cIGiKk%~2b@AFG zeQ@kO#>Wp#2Tn2u@D115d_%waB!%kGa-4m4DQl2t;oc>Kv3OtyjA&I09V?VVz3d#6 ziH>KTQX~>NKQ8KS@tEQY(m|@-wuk;#&M=TRU;XwYsPAKZW4IS}3is$Pf-3Q~7<0c8 zgQ|_e{ASCrwbv8et7RXK%=!*rGjH?_>$=V^rEcdqu!zeArZXlx@OkDPmY_~r3(}4E z5m*MLW2#eDX(uS-VO-Crp1w8X8sfc?2XKn~HNM^~#_@B=2V4W{QwE=`K8=N4Z|8j{ zQun2zUQ$Q)7GrvV{Y!Mn1W))`J-M@1Vb~p>?=gXDxl)uSEu#eIu50A4l;+ zINj(hXbeo)8fvgWT!W(3#jrlMorT(ql|hoZhdIi~yd?vi-^> zs6RRTv@zG76IvJ*<12GtkUH%9R}bZ5DP%wa^gUGvpb3yz)4*Sl|Htxtg(+FCXAv_roA*w z-H%yQ%{gZ-NBvf{Z-#P%*3fGX&ff(;&+YTc9}8hDUD!XA*epywB5So2pI6ORhy2dy zkkg$yyaB4jkp2k`(ITrOdXyT333V3Wj_!|O*OV`DmU8_ib;9l49zn^NYKGpy#QW0O z>gOB5xLpYKfrIqCx(xH$Yre%9nzHkcskh%4>LRPgzjF!B$-BU$whPEx!q#y{e^|91 zs`I$KF`r-K7tvojKs9`_>rKi;k=A$Osk{0xC*Z^NUSaHqaYBPDkBrD}S6G zY1Q_bULfwcfOtUvOE)XFQ#vgig{&&{kU zUeEOgi;&AbwzYqbYCaUF)S64ve}_ja7G%Y36wk4-v2ctT^pyiROw5gQXleruhPLHN z?{$c)xyb|w7kS&4l$r&OZ4T{|5C9&`2~4gV^ObED%Wup#qiD*Fuq51jO|tf zL)%s59+Ra|Aysmqn3*r*ef%A1Y}QzjzV^K<7i8D>7VLLpKGWyo2lHDiKjcgMWcKfI zpGQ0rz;(2Nj3=ljBQ+!o%Gq=;)ffFL4@ck1!_c`@A2iIlf_+M>aLqAx)0Kt^K16x=KNYm@q*-6e8BT@-Hl>BVXP06PcN({oThOhNALb$ zHRKtLwW$w}>K#Q#-Jj?4+w>QmFZn)ybKyIDeS!Xr`|6yE<41=?vF?zyBjh*vYo7Pv z`C9eIiWex)8%#{07?Fv~>As{}jGj?!iS(!ajxaTV4)iQLocn;VpI_0w_EZtqwXk-kXnz2s=YN6DW{xP!o_fKP_7`639I_3hnebmG_hKDaWejN}T%fq1 za=D5HlE$R7L-{?$aVY1?!>E4i0zVqsGp6XKzwC+Dbf{m8)_qnuiB^Y{ueY zl}%reoS0x@A0K?Y{Th6>eIW8!PpiI>iV2yu(fqwld!5g&%g{aAc3QDVeMi@_dP7oA z5YI_3+}&;p?PgUYkLtCn@8}#C=&1ii%K}56n``MhKl2^Qs_>yOpk#b*wFMYda*%ng zIvv?^J8p0AH~IOZ>$q)_b$))vxTN~?N%mF$=S%-0FSr8s-*N_9M?TBARtoznWzn8y z;8Qb7qA0@8gb27F>%;!)}$bC(tQwluOMc4itKGSpAbWz?`@!2HG`}R9~k_XnY z?@p>&2d+Ays+mDJ`Q|vh`Or0#CB}9+H}U~39-!~dxzo9HPD2}y`xhVBJfiP~Q>Tg^ zJ&HHNs{_|jCUqWSG|jDO;68`V0|n>B(8GN#eP+?;M;@{HPB>DwI+%Weu2(v`9Cmbj zgK>pC>K^i=DE~fwC#4zQ^d10=(uiUj?7{ulnD9M$tyPT5E-(xi+U_^k_(p~+yw$+z84*LJJ1*$PMc7XHkiPP=-mi$|C zFMFY0zT`8;K6a0~7X!<5FtpJ=il*kD_hRdif_!A3PoL{L8uoVzVg`NJ(%)|UPaQ8F zxV_nCENiIsJH)75Yva)VE20O_b;&{gv2DKUb5z@}y5Bgz9Ig-h2=6T1hs;36MFJ9y z?r&S1Yaw?rR6Xwn=Fu{Yk0`uv)pkhVSm(Q(Io=EN!e{Y0(*IKQw9jYL>DTG6nljN}aT|;N)e>rB|HQK>7gLLL zBu1tEzhDQXdpPX#+jN)Cmd_u-JdyH?X@SM?#+*;_{tX9_$F)2$jPDBXRf%tnZ=a#s z-?SHL0cD5}wa1U@x@7Y$-@&5)e_!@Bmp1+FdDZ{Q^F=eSqgY($+N=rqW&=KWZUXB? z{mBCkBoWuwF2w$Tug$`~r=~MMr`l-d`Ix^AbMt^`ZQBCPrCvK|JHseH^7TuEq~V*D z?_qr1J_ZB2RI|xBzCiz9;bWUVzeIoASI~TGuT8~Sh5J;qy`}GyxVP_9)ZxtUt8WkM z^a4mygXRzf|{G%E^C-Xas0hEZWjgN0UhS%opVIQ@!%!8+~*GDSKyBgxq))P3w zec#JO*5$bsmsCGL)%93DgcYCoXVBiJxqZ}p*>xgX{}bcpfx)edk_R^9oySL`bi6Mz zm=jE7%)er?10QXh&N$!AXj&rG_<51c>qZdci;n7xVf7ucv2V@J#FT$ea3Dy2+|0dONH_YvV!|d0)ZQ|?9a};AvH`(Nc%0)F|eCH^> zdEp1tOK;D);F?e7_C$NDCeYIRe|MbcQuFgm?`iHVoJOCG{#^{|DLrs)bLI)Tc6iql zlSp^2m7$GDqR!8E`r(;XjCp;$8Dp-fYQ7u6d5h8>3Y42r4#jPS^&?695bDmx>6L(| zPGNGBA@reGb4`1o-nn+|<}cmfMW6i=pYXFE0@TgvK)KhRpRwd8Pug3$|DRy+i(__8!p#TNWn|Jb=$$ zUd-p@eip0+%?J-Sy(5QhGsrV00UGfUsT|vAb$AJCCYA3g;(t&)@bq z`p{{d+3^D!ZF&K^`#kC?25h4ClP6UPm<>z3Ugo z`2+WIy~sv%U=B|`r8Bs8Hk!w-Rf^-(^BZwu+XnQkP}by%A~@f1!R&p{;pCk6EXADC ztEX^X%i+`&)Gt~;DOr|;F(k$feR;38+{mzwJU z%D;^RRkIbzeEcgn?8e^JM~T(cdr$qk5}ALZpUzmm@-$t_49DlIza!4ykD9Cl3Su2c zLU0CcSTgx%0M1k9KY!pDswOojj^Vmd{`SXu4jb=XY}1T=a`UA9Z2zs}&(UA^qx&@R z8qTfR-_I@Ajq?(4vomPd_3X`=M}AFaAIx+t)F5$udaF@`Jq(}?X`9{Nbw!&yNl|$ zb#249Kk8cLF@9<8FM4)<_pkcj_MLz3{GNJ1_1{_pqP$M2xG?P4FoU__cktlCF(?_% zzKP7OB(Y{MmY?^kS_KF0+kzjSei2K%4nQgPzgXD1KO5+r=6;$(X$OQM)fZ2BTGh=d zre^B^`NxuTYna!RcR$iNFjQ;l{87I1IE>}|CzWl^H5$YYp^U@QhfpoIHLs$#HOyKn zLx1J%v>u20oiTXjZIS~Dc2ed3atrY{XY51&gUAvUx4PGbF6tUn9K6~T(9*U_9*z- z-}%3IKx-&9v=&7Bc4_~VMCNU77}}i))Aw-jxh?2gwv@34;(-{_GJ|qDx6@Vl=Fu1N z{nl53?H}Ug-LIg!Bg5E Q+U~RQaxRA7!|7UD~>;U;ebEqC`Cg;Y_{dry=`s#6+ z?BDb3ar9rl5Uy>BA|CK(oPhNfoZqq$iQEf!B)(Yp1oyi501pmWg67HP882l$w&K3T zSn8t`Mtm49EU4TI>2Bik^c(z$9sPnCZ*_9LHS4artoRRxdK{6xM9GPxaMdt!}X%Dwj4kPZo^T-Q!%jU6*S#<@qBrdxgplbSDO zY^Ri=ZA?HC?=OM+y*k#6Ch-59VZBYCq7MB#AL0YWbi;X0Yt0_7C;Mf_ulujRMk|~C zzxKVq`*Yhr6fRItpD5Pu$e+*WJ{@aGdmMNdr(XOICNyt>Y+}DC>iHPXzl+C`&Qwfk z*b^Tv;bd>vgZC#tj=6P5p;ol^7_{;;%G0UOl38oVy_Eb}+vU$Wc7(@s&cjgQ$}t$X zm-}VB_6-JX-;W`?e!#HT&LOE}Gp_CDzCNL>-D0gz5P8YLz1Xx~(~p>3cwe=fs^u#k zQx8LH%)?`&cjC|*n*X^UVQ{S($Z?c2eqOk*_CkqAqE88oZGIh&KlQDt*`3pKmFd?m z|ISIA7et=bnozq}kLBC{dD@Gn|5WN%#$O_3J z9V~vZY&-XVqkWCZsEBbd9>EyaQuN&XCTZRr<6ij^Lp}!D-|`&&!3?hJPT_ir{0>;tb`{sZ-rBPyjdfd_^^L+w;Q)&(r4_Q$~wBj zjr)^hu-=q91wr1sy=qJ)2kKj8MfqR~( z;rt4RHok)S+!w8SOmW%;)@4#BXnzFN=c?XDHMwP3N8hbzFU+jJ6t}i|5XBQ~kriby=pv@Rkt|!WbvF9o2r8RzvwP_unu$eW8`)I?RvBfa$nNKl_ z^zX~{KhE^(2#PF((8N3h5&IWzcnwCqeGZfOdB=rY4E=rSTWX!Q@V)GS^0ivK>qngE zWW2Yivlgx@KM49cNXvp07oNb-W`L z;cREP{R;;|{Xv$&O;Em(~U2>fM5e zN9@90E<-uEifeo3?8c;)*Q0n$ZQi5yZe`Ab_)+TtRjZ*|j|=ODFX;NeSI>LW$CLiQ zMAP5%nSFkn_O^ZhJ?GGO&F{qnq`$EVJgTNgxqT;Xf_TC1=afjAG*4}U#Z8uC=b#U9 zb~3{VlUOn{^d#_eugPD-6OZW#&z78^#5FFP~0|U19iX);GB8+Sf3&_I#90 zY-n)4wT4)IM(H2QXJF34!t{zEP|hXmM&AEkx_i#Q=GGpb?_ZABI|CPiI#u@*NMfK4Ty%57_5x561ryh!IB2+Fsj;o{*JypV{Vi0dllnJ``*u; zMRv1Mh|I2!s6zD+mce}$)3}FPc1^?-ZA$uc4ae|XFoZa8KJj4VJ~MglKCj^@u zjN+&~ws#|z(}=ZjyX*K;S)@A(tx_w*t3dSXAi zJ+==$o;ZZwPaVg#J5Hhh3#ZWgm2(*O)_L6U)>lZ*uEO((&(s6l>J<>km_!KUjiK6W znR?#j=7r_mc;1TNTsnXBPok;hReJiLbWgwKUW{!aFQ_+?S>xm8hhW9!DT5)@zk!Ua z1c#?$!XrB|dFR&{yYn0-P^QOHw@>(j{n8EsLx=~4?gNH%jN+KY*xYoEX`gT%=38g6 z;KTE%)qRqoyK)18Ixp$2+HS=J4UQ*Hwdt+nKSkI7(mdKU|F_ZKzHdF7!3j3+%C3?J zlrOXPRMB25tdV8BCpKFMagE|v#)wvq!h0QS856R28kwq=*K*SpJK`;HtRuiVwGQ->wn^B_B{TZ>3`{Y zrB0xIkQ|!$J+Yz>@q!Oy2tLfMCK+8|JbHQHv|5f~N`zIIa_dgFDnss{gQu>c5O`H#H&p4t2YRc*kwe3)WryRnPwa{k*mhDZ8Zcr+J_N z-&nk*noh~Db<}HL(%IJ>3&=I~$iIyymwV3s&gb`}|KEAt|D|h5ZvL&$W7GfN%)|ff zx&OD*-%I;HC%@kL`*ZX6-@bZ9{2fRGs+(9`N#jmj}E&;N<}?4|sXN%L85>@bZ9{2fRGs=EqAGLk)B{5RkPpkCHkU^H*H@1xodde|NZ=D z&#CmQcmBL{@K^DG-IuxGQN5He?14eKx8>j4H~a75MO*&=D!O~m`}ffCub5{~d+m9C zPZ_o4RD9&mJ;eh8{CMOZ%6uId#630Kqu_7sy(@q6zFP-q|2B;apS$gopPwHzbU&W= zr`MkM=zaai=fl>~-Z}i^bNFwWy9@H=DQg#G(AsBPdu>a;?GeQPwcqYfhu*hFFpt53 z+;7c29D#iQqT$DVu&m(-^yBX|?BD)aAntDVGNa7M zhTFr)5BI4G(xA*(GS2VldyK~ikq^v!lwBQV=OvdRl+#d-aJ~-bXW^1{dj#<{hk2jJ z2o4uNbMgC;LB9Oo-@F&W-?=Uf>vMg_8Q{Zn`SASI2Yek&-5^Y0>6k$7(aL?e{DRCd z`?y}vKg0@r4vpU`|DL+elV-Lre7W`?_B^-u^}k%M{w;W@fc#tgO8%?R%EA}-XIpSwpekHI>ZKlKB3g7k$3&+U}HpiXd6AGxS|B6yF&5yBTC{Ej*D zJ>iZJ;sQO3o=N)b=VaSc{(kN|p7QUFhkNDKlV|=FuPMg?l!*(2vSa(lvh%W=vgILW z1RD9V^Z?(Z%!LQ}P`-UAlfHoGhXo=fEC{J# z4y1+$Ay#D6)I(0&ZlSh{|Qk?t_^+}R+L`Wc#LU=TK!C~$%l6WH`i1>v01wBtF zb%69i7>9I&bez!z)Oi>AJN&$$4zTrvj&_XG-<@ah%s2eo_`!R>|C{vGm; zQ7RfuN<^Yzu?W=84Mo-TAe2k=N6AZ>IB67j?nal{qUXHoQJBKe%s15Ts!-1vYP!T1U`Cg9xIvTy4In;*RL|L>7^ zyAH&r-T%tbU{Pc1>DTjUV^b?n?q_5_kajYNeC{CMhwvCqo|cVQjNVCp7e;o;k2di* z$_ah=B;xL5`rFBrC)wH*j=~W>s9h)=Jt%k6uC9P})0^SxHJ!2hiQzc%&UAdee-UtU zC2)2PaAqyXI`>ik^Yz)=fvmsrCGS6USYAeJ95T z;P^WHaCjxY{qzQ$cxN^~***q4Huk~h>sn*cpc)w1ESq{E3Z)YLkWSo^=ufObouGI@ z0%HdWiYJ5wxMK&3Eh_h*yo7uMJC11O733e-a&K}U{NHn)J^h0J6`r~r&tc13!QSL~daIf^nL8x&;8 zfa3A=tK(@aqZw0=@uMvz&MqJCkM`x_Ft&X@)=g=Q7dKst&tIH`Z$4QF9KH!SL0La7 zS(aRH{BfMQ!+QVt3gF9|ac=*O_;%0rIP<|moTSY^`t}SQetjCgcx4JcducL0eQ^r* zzA%;No`wT26Ccq2AE#WO-Ms+kK3#(I2YIdItEdxhqaNV3PV-t{aYz@Opnf<(y>W^< z;}q}Z=xTiX`7#`OYXRPPU=;3J*a5TpR6(a|X{eMEY%oi#FLeU3e+pw5$%+>+juGqN zT+la&rXDc3fUgzz5I)lU1#|pZdn6yq@&!Dxfz2oX6Fl}O<;1f_!1MKgV{ZP}`c z*TdU6Z9c2+~Y@!+*aR=?Z77&x|^GI%THi$li~{QuZ8;NWt6Cp-M^TKKYQZJmOUN~|a&U|=1K6+vt9=N_ergSfb=A|Q%&-g@wd?2cm;$;LqWw`t40Nf=*d1lJ8e@HBq8ayNtiLE@{rMb)7$;EdE{pm79H$?0=||)-ACS+y zKtA(*g*kFL3h6VB!Wzsc6z2Wr@xF5uSLDbgme>83WlXVpnlBpXhoE!i7z}EbiP?S1 z;`V9vv3+$HeDK&XoOp8%u#eAhobrESEq>tf2kD06>+!=EYjEh5Ie7ZEURW@oI$BqV zGrAy=IxvQQPAv66tdn?v^At~f5KEmI!`NY@d;{v!5X!%XFoATf=3Vg>(Zf^zZC^}B zuRQX55bN6^#l)5x!rT@8|RV{OBNlkMHpuMR<-Pd|jNQ7)MdQm(Lh~E^~l6%>QLm zw`Ef=7~R07q4Fm=E&`VL2k5f0OT*mpaQ zzq$m^-qsJ-_pe2Ll8j=}tViNJCD7)lan6!Mi3fs(2ONx%I!w)z>WvgTwD169D~z#< zF46(Q0iJrH7ySKt;NLF);u&M>X>-J5S}&veHs!6XoE_tN^jB3I7e%>Oy<7tA zrpb>phM&edI>|`Yj9`pxR~(Ps+{MT|j?q3U{&tMd0Wiy zSB`#j9I9pcQ3fgJJVyp)J%boIow@xC=KnHW4(9bK?;Lp?g_(QHqip8#{ajZt)`cg0WGtUrc^nlR` zyhc8+k!P;u;5DgdI12H8vUv~b;r`4=S}_daj&g}UXjLK{6IvI>hN+G4+CBYo@*VmN zpVLP;#Mq)4j4$rH17E$l6fdtGh{b(spjpu(e1%BqAmIe+l;{v-Mus4RSRjZ0=TO&ZWK;gL zcwbpAe{HrfX@cILP zn?K}f`+X=s|L8S~9(DP)%!_vv?^EtcYv2^emk+93m6I|r{!5~7n!xyVTv({7kxixC zmx%F0uSSJ%&-Lwa@U2*x8hyLX`Dv%2Yai@=WH@v#1BMnJdVNr0jDPqU`5T7P1*<$mYFd(N;=t$oH>6 znW>o?fF^}P(583pyCRs{sWfJEDTi5I%3@~cvY6hfEGD)oiIGi< z@_Sk6Tp+Ji! z&(t)n+9*`^h{#g5NR~)MvWAp!+scv_icr}~rNvTI(xNDm7D`cBTTqhrn)mPdy3SnF z$J}w3pWBVEKhEQP<}>GW&UMbYUhn1gUalDA0$8sZAL;CnYUChl+*KHV70E2dUbVz7 z(ec@wBL^%iN2yJN6np53BW(I}oowSr1F;9>A0P+5e~HgyY|GN8Y~Bku*!>qZwHEov z9()7k7>GkvZnEMAiO6GDgTT9qU~{!bd{>e8C2l~QxB+cHlL!CEg8#ZK@G?O7*XIM( zzkk^A9{-Fnl-m=Z7sYp~Z;fEC#h}}h(PwGc`5DCNvzgx+@MS6B{@~P#cH3F?Z0?9F zZ2KzaGI6p!=(OG6YfcX)$EJr(e&S5)-nP1(Pz{|82J-P;tKi?tN3WI$X3(_-Z29rT z&$W@CUj^M>2$rg2TNm-0>R`Mk7?QtzOqED$3%0KT*S$L&V#97d-X=cM#^#UcXrE5J z(Y~49(>Bb#*ETPB*tRe2Z+lh^z!!&O`~q9#OXSk$#O+qYJ*=R>e_-AJK4@}!2M6y_&=1`v+&(3-n`8ozwszLkJwuyxOwqq1?coV@R5(5 zUWKht{pNw5TjP9u_n`Bv4?1O69FGbinh4?E~kQFuLPw-r7A`6ZtSKy}8 z>)9IvF17FH^E}rg2i8omJ>OsxeDR`v^X7v#^qQ0HjOxi&#QAfP$*M(Aeqq231~Ndo zgptGvUAzDr&g*{96aHbkYY$uR^ zUmd@?D5g9-8M+)kt^l4pKLPt0EEK}o7s+SGug)V!E+5R-M^2ndO#VtZ|Gu3Mvp4#k zV=G?0&VKsfezTQedMzA+c=T_%9+=#<{89UEZXa9u#vS(l3!QE9qiyZQdrq|h*B)i} zbv(>&Yg^B*Kcl8~JfW&}J*CLz5ASTY;wjtl$y2sx#gn#uVLyAe`$=}~$whW+n}hHN z>f1w?Hnjm=jA7+p<;PQ#st2SDB z7#{!O>YE_B&iATAuFNJsFLcw~F8lXyo$vqr?oVv%m&jwU55()c9y!>FE{4zlWB4o| zKaqKoL@X)|+`C#@?9Q6#;;YDwSunm6^In`Dw(}gBFE~3@oaom z`R(Gzh4Dgcd~tI%_`44LnYi?7`0L8&KL~sNj0SPYjQZgBJp263p0?#<Y{$&p_je)!qqmmcN=@8b5pzil&8HOFu8+|DpK{Kx$JmS~x>!SGP9Z*h0XkSVc@D>Av8mobeBr_H8pjtzTibdm zcGWQjc2E05?YW+3*xOHcwpGZTEep`qD;euL^z?c*IQ`vA2iwc~UI6l)>(3KC+l1EP3Nk@yA31ndIw2Fiu3f^T(nZoJ)p@zJ*8wSO_* zakgvCYg`98@bv^+HL;J~f5B09I6g%lc@??j8mlHzxmR(O!W?H4DC%}283+6Vc1JCj0}yMqh^2LEmSI~KBDcPJ9js2am-}?E z`pC7~Nr}V`N&Y@{kX8ksHUt&0TP4rrmx{LuA6~ zHut$}ZSCv_Y|p1~p5GDQ)3#=$ZC*IYJ{Zx>p1P@}b#9)Itxw#Mdr;1iVhlBTM)HBG zuql^8*RB#9iyWnY0r%J}Gu--Kd4jEay$|-r7@pO5!z1_L2er;Qw!mfAU6M-H4O-;)jKIHuSu3uRI>*lEm?y zbVdx^Uc7Qr;pKA4K~s+IG4ORm$;039vFdEV=0@Vzo1e37s~)mR15URqj?S=#=v?vf z((~2P^VQ|!5=Zo>S=ktlSXW19=LEbhu&@2^rF;H4&mSmfz_sgl&HPl~9r=E;^o6GQLT!G3PWahD&LX(R7wVV}Kvo9+5Un1^d)+q&c-TRf(V zJ>TObyZ*EyYf&=>n?Z3lHf)Iuwlpx9syqYNiwCTO!Bl$xB(o{+$Zv{IxMQ$i)R!X% z%=#RH>i8Vhh$D15s=#)BGQxI(efxf|f{A zwfD*K-?s2RbRZo1dTe`i{-;xJvghtP!8)IiXU7spsLhLb;UE3o@rZoexom{(`fdjJpJmV9 zdX~%msg;5c4*qjEUOCGd$Qp-xT?-lN`gdUes~>2rY$oC(`cD5#WJ}Usbr1R-@*oBK zNqPKfj41{CJsm98f$wNrFWLHH+su3BD*I_6@rbXm;pNva9coJ_^sq;-X<=v9O|gS` zenp&5oIn-D3$Vw=;by!Lb_t7;^n zZ^4(2%>e(Zzmc2?@@s;eXZcEQli$P^&2x1*QOHsGPzh}De5bq|q>F(C0bG zo(%CS@bTj88i5mU@}xkm+@r)n%b zA$&%V52cu?CI~Jf9E$ywI3G@w_WRIF}|5LpwmfKi}BP*i~>(!ADqg!kUkIkbp;%$eB~e)x`aEC zOl9-WwY1kC<5m50Eci-bOX71HTL$BI@`&^2!0#*nN4mKNe$I(i6K!DU6Yaa{W0YmgCEa)1iZ}ZC%a2n$-|{B4bQE_t$mEJZTUs(X~Ri(p;&M@7;Pq*!vOMz?p0X^*PhI)c;F7MmGM8@^EbZtp)!U)^((evaXg5l+Gt#JK2<`1(s9=h5tXq<2Lcwg1AjS7hw<|0+mq@lwVrx3@G!?g;yW{t!cCxiN4eiF~?W%`CZXT>YYpM6%)$2JO=sG9wbQJQ_yO==h%Jy$tW!PCt6<;c$3{_`L2MCh-+Sh%_We|1 zg`dtL=W({#!nbYO{dZaOyc|nH2Bbwqy87Y-_yE}fu73;jM7)q&gN5_>wF~~i`Cgot za&2?!{s2C*X&QlgcDMo`J4uSuf6}54#W> zcp$nE8-3#-Tle9uc7NxC>wSC6zkA3tMvw`t^fwkmLh`S1*i z&!vkW1E1pAWUnjlNIA!@Pd4}B^H=4Ust!SNt?V-n^?4)*g;QUntXw$p2wBAH^0|*f zuy%4mtbILW5IqObi(k*N`_Dht)z(x4|C#bZuosdUhcK&W=f;8@5xxVTs>D8)+^wKq zhrEN5O}Tb{(>Pp=MdM-9dLc=iC)L>`s-YmiLL6R^u3p|LyT!cK=7+x8}LOR-o$xzs=84&An*NIdoVOdOitVkw(s0E;hI7 zM>>(Cw{pr=`1isA_WJt4Hh<(L*5Rl`s}1gzr&pagc2(?jZL<57qo$mj^BPClxQ9-J zLxUsS0Jlfp|MFL^w?6Ia*s)o}1k`T_JNMY!2)@4;`9fT3-Rrh^#NBpuhB&Lh_D?6q zuC+U)`^A-slMv4r;4Q#$Sx(B|bLc*FZt8oFf1OADg@yl2@UPwhRl(cwnGx_4eX&)* z|LPgmt94TscTjxI)zvxtD}OHF9e$4g5RP2$0Q`H~OMA%yw?-LzZlBHY3QbZ^zzwtqGrS^Orkfbn*H^SV|9ehaXXijdtG*3Yw7?`UsZ-oYOD zlw9BiFWCoA-DTZQXoO9#yhUU*9AWin@`$O=QqEE~+)gI8$RXqp48HV2`)T%6vt`JD z#q(_2&#sxy3|Nq6$WpVHS{$D(cviO(Z z8O=L)d^Gc4_P%O&(s-|hN9&pi5(`j>AWp>OsH|s>@Mr zN;T!~z>AA>ZU}F8cZZtx<%}-)_x+sC|7OmeHt71Jsp*RfICS{ID&+O&lG7@^ba%U^ z=(AVJwZRWvJ<)o#X<`L%jq+Jt?I1W1&nEv^{jj5*&XJ$5c^Bwek8l5M%Y!-pS$qF~ zx99J&_)iA^s#8{6zY5RcDD0Sz#vqrz1^@74-C8zsF;8*-(*Hr94dp@xvdH0|&!OXS zHMLx;Y%gvv1DqTv`HjY-P5yNPm`W12iHuR6ZVuy-?r#c@vS1kUbmL4Hlbkj1Mr%ag z^+EXbwPRw5|Hr!CX$|=9rsL|_dxLHx--lSir;}~x>=*5oo>x*ck#0rE_9EkA6iuftmhT;X2*_1!*VgroZ z`;~ql`uzVde)f1TyZ_>X$kL%sa&T5nt^ylH2JnV!5=5aM@SE?k!6XN3@nH51FFSvyb)7Yll`_J5Nhm#wq zzBYO2fAQgpohKl(G;YW7$<{8puLFIadL~}q>Rgg1%4HV*l?PA-d^e@Gc>c4!!2ev^ zy=0PIgPv6$v1D8Zx>j*RjY%UoOJot4|4(D`GC)}In{;R-coL?>10-{e3}iq) zwUmkh+|>LK>X;_b4{4Tdn?J_79(RzdU8v@`!C+l7*Hc7#o#UI3W6|fF6YTTR*fGoT z7m#CLPk6%aYICgB$Ii>+x#r*lq=&%;5LeBLjN#s5EfE=TdX)lu|6$(A{C91~f_Kf{ zn`^W0>ut@`GAy;6>WQQAeZYT7u7H;TdMBP2)N}q%&*AU<|FXFEfB%v9?EHS-iRPHo zc}~X=*TIfXgp-fM9!z1*i|0E$r-HrIw~g&s1HZrFX?VV2gotmj%a2aC>evLz*H=$1 z@p4tkM^`OM73R<($c2YG)kRfa2Y#u?S@*cD7~9ouKB>^<_2sBW7rmKB&TI~N&Vy5~ zB0USQUll#1T%y}AJPI2Cd-Z#4fK{(p&(j;1;0=2lIpBI)y3p3n$tYN7b=RIP-jLarxwu7XkMl;9uvHeAT)A zcr>)+Woszt2XlRYMM(T99m`x?gTP-p9xKjCke;lkC-=U94qBl8g1_ zVE1Q6Md5EmVsj8LKn7$po~AMJHoEgQwrAROD}En;;DZls>0?jXc~xqXr$jGy;#>c%qX(R=9mAkQ2d5!~lv`{(lg@kQY_zV9ivYxSMjrH{Z#-(#ci zKh;_lVcVlGwLV@t^HcdX@?|r)ZYF#6vew^==Y(Yy)1ORTZum*{EGun4u2lwJs4kkYJcR} zTIs)6$+4-0j|~19ug8DTTPw(o`8WK-@p+8@+Fr2<{nq_na*1~(KGMY`-~b$!kvkn4 z*S2jRN%zmSZS%(2<&CRbF5}5ld|xsG+a(KKoFrRLat!Qe@a$au0WzRA@3{NPN80ic z)EF$pzyENmEq?Mr>vDKKtHb{b!lSrWEH*%tvk7v*ein8?t%{NM@R{xGhsnH`g^RHV z7Tc<4$5_V(P3Y0A8jC2#8pH=xJK$@FB**@* z^H1|zYwJ{&&cx<-y}8i)3Ft4y(VgDle<#+8vG*t7ud{x|F0Ey;nS7F=XW23N#GlbS zdD#2;*yG}$s>Z^MpH9hmkT@EjZeYxQQTR!z_yZO{=RtLF|#{bp7Kb_wz-(K8( z3U+{EW{Tr0zNIy`GsSPix92m*uRgA>?f95}K;KR!KKL^BLj$;H&I9JsI97an0?$uz zJD1}Vf`6a8p=YZ5|FvhUXC(g3$wV+0tV4h-1T$%l52Keaw$Y^C^Z@wgUEA{h1o8ok zEM0hGEQNeaFW3>SDFPY`!>ro@F-AHbZ=&{1_)Y@EzEv$d165NCKad2e~}U7TKxx z;*FQv=C_FVEtzgxri`{{E;-*CtCox7a$@3mC+Pq1Xk<1109$^!%698L~+f^Y!Pg-X~Ifmf$mlIk@kKIeHMS`&t3-n z-uMrFW*+};ZWCjU0P`*eO>9|ybI^wq>@ly>vE|djXe;7-3+bC-n_sZ)-{SB8@RW_} z--=%O@Ag*^`hZ?qa&Q0j*{n$&}V{}A#*hk+g`rA zYFvbQ*Naj%2b-(Gar0a909n9s(x(O30FoPT4HR$4Jo|RK&Bp$&hn$d2uKXXDYs=hG z-j3{l>3`j;e+GKSq4LmwUv^)Lf6gV`3IEc$$|p=i|7R=Kj=mg!M+ahT@7RXfqgeMN zhx~Z;*o2GZo`ipwZzNx&1pkiH=bQ(Ef8TRY<8X0x&MUtn4Zb~-dYp7{-mYGeZGC?d zw%G^v!>rMER-JrugNf4+uW)OoV7n-XNqmIt28~U*QOYUQUU~e=k<7#{P#v`Rzgv!L zYO6*N(^>qs+1zP1?d~4LJW{C%q^1!bF+-R}2Bd-i!Z7kLkpY)CI?C3Lz=xQ>)ONhL zgtlXE*{w&PjC@f3lxheSAB^C+gkxvQ76@cO7<-TRviq{{=I{Eq*H40csl8KgD)p|8u;wWYYFo0 zm2)2l_T3r)e0KFY;9t4C!dxyKL&qbk+Gf?LtbdC>TobUn@w?Gm8ORjL4*fQoXQCu>s|)z&m28a8KF6+c_c0=So?*%KJX-d+STo2Cnm`rXWnQn z`%~*A*hjCSzkd|RPhT$9!h5V|Q`a-II(o1wIeb}QJ{P`THSy|kb9~K8HuVW|&pxLI z$J##j@#HJ)>JxIUI=V6ky_g1{mxykZpB^V2>F_SjUiCQ2lSLM}c^YtMu5Lzl0b^6o zzS`SROK^7}n3GI&zCXC|G9Z$B z)*8b}j77QqinR~xdKPhzIrjCWr|tOsMC@sN5&VM$j!`bG=lyj)$syt2+qe7k{=6=9 zHP?(q&&cHyaqbM&Ta_KOmgv z8_t}>A7Gq*^Y^X&{ye9Dj`_J934I@ZgjU7}ia^aJlZ6PrH=JK*G6 zV4t4)T6=2uh9_+&Snl7g3H5sLK;+#Nk{_-b(tPxOHPw({z;e(QL5=Ae@S zV8z8mkVmR9Qcm3Cold8|W{!RF@(}Wr67Z?TTM(Z^*15bF=Cs%U4*Mba-=DdyV}uFC z%bfks`L$L`446sBp3VlJPhEE<&m5oo%faU^$IgUncu3 z)6#3&f(M6M@yw5H&&;K^dE7g8QIa6Y=V1$}zvkG}zapPXA_^t;K+ z>wEp7ZY>L8J`aCi^&xrW@mE!yF7l#%vl#n$+y&_UyQw+3oqjdPlB0*8$Tc!JE}8SX z++5~Wf^2=^z5@D)G5NJ;0)IW2mztZxjdZwbUt}N1cTHoTDjpl%+xHS`Ts}c3t$NE| zxaDG(lcYFcJolnGuRK}Tv#w;W%l6qH%;_2W=OtaO--)Z1u2c=NWIzf!UVZZVwbvMC z+sc;)lk1FL9bnKE&aB{QJ4>bAR^r&ir@oSkB?`FB$3Tk+A*a%hO9R zH`_jc^(8pS&usOCm+YAIR7>Q2r{Wi+aDC2l~{_Q_LEna!GIyCzPuA?+@*hLwp2fa6T;fE?Ka;sv7%+`FvKNs%uWnu;tU*V}Jh3e)_nV4Z5zOHNs9%--}f2gA}kY?8<^*$W^ zE5Uzg?#+Ml1$;if>;U~PSffzBGxi1ePvsio9PVp`-bPlz*%~IWg!? z#kvCg2QozXch}{7ZhrIkugzB-6FdiT{sDfKhb(_R1>0VAH@(k0le*mb zwfU)V{>k|7$-;k$-S6@5o(I2oeqhP-*4ivVkB8v-d%Hlsc|5pOY#@<)l72|#nx|H& zY9I9*Xg22^+c|lfO}P3-J2X0x*oWe^!~?*8I{H01A|4qTZD*v^w8gzgSn-t4@CR1f zhLJPu$_6d)6SUq-G-HflUPK1(im@pk;9~+oTtIb$tV{eKp4YEE%m3^D)4X#!mA$Yh z`&+)XYFaauKaX8rC#izH{^a@S{Smf(!}Hkw!))k1C(?tLnq73RdhlkFpOZ(8ejc(w zJvVxsUCq|b!B+VGKKp6$E!L-VeX9%ipU*k7$N@@4531+C=B?B9T-)Q_>wAZJ=DOyj z--H#fcU_;s5}6U`Ch*TWReRc}-HGI(!vn0GZbQ4ab-i)Y!G>%MSLO%9eDYZ78@_MySO|NsS+fN@V zpYK82G{2kO(XPw~1-ie) z_b9<|Bv=&JrXFCo9*gZUZ>H^T#{U9sRCriVyji?feP7zwH^DG_0*P$)Ns@ zctCby&_^#{IX&RNka^y%Rj&Owk9?E0_t_5%ZnK-)6j2kSe$k2_;4|_Ll~$yn==y=%-`n}h|@{6@jRt(p^?2sDhz?W>=T{pUT zfOvn|JHAJ5U~dQa;qkVw>-qcj$7t`a&ECr%Cx5`d@@Z@HKIc9N_LeWQc@OorM)+hY z9GeLKb)47xuJ)e4HTF{5hvP!8<3D?O+ZWm2FUi%dBrEB!}X=Y|2K+Bv8mVH zWyRxX+0JpZ?DeZ}w`LK^^f!kKjEsX1jE5JDV_pQlK!<8AY;}M73B9_??2T{igFDCB zad9<>HDgzhSD3^*jbT$9B9iy#o?i+6HO|my_mBSnWm)jEcjoyqA z68=y3p?+A(Ptd%sfsA_do{r?HjI*WGvmM4-+;RL*`bxHg$FHB)x^Cz^`lZjM_~&?! z1&0T&8Hap}1pnvOsbco(aGTt{i{k^u`^&Zx20iAyjpK3VeSlxOu8#9#_4-&og!Hg% z@i?yA>Cl61$DC=ld)73&v1t=mkCT9Ht{yzXs5Tw1F-U&;^Zn8@_hTv58705*_wD>2 zje+N`*n?!d`aLF+*V7;}#l~KBn-z~GPw1t$?UjzVSflV1))=MMFd~7tZ;ayu(j*tk z#n`nC&an+o&$r#LAp>6h(k5Qb*PR`RF6P^;u$mSKBEy$m2to=aI{+ zzWBjf+1UQbiYuEZ+M4NCp!XlJZx>u^x1O2n)}>YrYL@bJ$m@ya8sXUAk(^&RbaA*6 z3?uqGRzeZ#8u-6Z-B&3Mv!uzrQ= z(-Od_H~>8Zulsbp1DQwuIeHujOTxBr7S1(V7G&DC7az5;*L1+oWjrqS7~rlH|GL+b z>sDZ|E%aW?e%AQ>b%XcEH93bcEq|&i*LkJqP3Zm)Y|5QItS0}HP3L?Lj`6Zb*VpGz z{OjDITiI*-zy0;~yh`t#>j;nWU^5;bBnCb}xqOM>w0>BEO}OHA>;Qa$vG3aGOS@a$ z%H%`A38a!2l+6EAD#Hax9+Zo>dyemHdqyv_U9Wy&HsKq4?A$xaJx)YsL=$_A;a($| zx5xlCaROmnSL@A)2lV6jWBq6Ua~TlmOy<0Qcj)10@E8YHlEG#+IXG3o>CyS&_WoG7 z{;fl?`Jc1(AKq@~ADQab%B&%-AAPQPdYOmZ) zya42jd{e~(hj)PspF7N^-_?fMAfWYqcI@se-*V-RG+2cSsbU5IdIvW`Lhk?Up z=}ELK>TN?WIR`#FkVpD|z+Xv!1;5jrb^a@RCj+>C=>3L%*0KJ%==ajS+VpIt`&$=Q zu}!ayvTd)9BJa1h`z{Gx>~Zh(CGR^-GFZ=w^ZEPs*zx<&>xO>T|NXs($^hx)s0tWEc>uMs175$5{y;C2hsZYi!fsZpJh~tIKMnk+SBkUjO0n>x^cXCcVk6r< zV8t(gX}exuXFDf+Vcn0o6kdaT5n_n(;6J)zl*4~G_zy?kSLWKG_}3Ui$NX3P9IEGj zukrgna;|P&@1Odbc(!!nw8?P8S=8@0AU-#`H@PdD$m_%3-|}T|>vcgjr}q`x%T<00 z{dcnA`_qscrxk|TCu7?>n}5sV8(BA|rq#ygcU%zmx6gMKwcNZ(0j zx%>w{M}jfM$Ys|&NiB}ec->y;807lIz;)=k`|D}17`irH`y+9feAYX0vbkjM z|JFH5enimKETb_IFMl$Z^sUUKgn@Cls%m&w5@u-~Q;5eO)*7eEa(UZ~3kg`d;%~xgych zk;rM)#VBT-P7F_LQr>;VA@tH22=-ruzkkdg@6p7qKVPK2Uf2g|^xw%s?`M)5a2Wl1 zW<1^!ey|6%cQ@O^o$9zXrgF)}&BWhN;ux(N?_zwyzGM#9_nYRi!@i!^Z^1vmbMw#D zD+N5FWI%uo`J~EUhHnHLx1D&f*~ES}?wWHQAFgK*MqRMCKSJ>zI)8rYIqMiN0|E>P z|J)<^k1h{Kg3UAcj;rm~=FJ=*AYMSYlMeQHEQ`Nix|aW5*A)Is z`ecx;fATRqJ|oS^J=Fucen%nKJW%|5pG5Py?3{Mv*@p}e{{0q%{!grget{2Ym08Q) zzvCIR7Z%y(C*HE2&CbBKCvKtmAhvyC#aQ@La;4z{TBT8A^uW7juYYg5CvLP4ZkuLJ zVrsFbKm>WC*b2yim7HvNAdw)1_=Mpvw{62z7and{NLM(e1}&?TfZ~U zaQO$}yxRz5gSY)db^n3r|FS-b=4I*JWbBe*rE-wZfepYIC6keZQRU$!D^TBu9gs}D zZ;SN0w)i$;Nl(0Q>-)TF7uP%n`K+D;)CzE1Ja#||xkBm0|GU&~kDOQqcd!W#af7|k zZjjY1M=lq#A_<=%9$O&-d7yVE{z3S6GJxmvpPuFK^?(07wD;#Mozr~xXVCwCeg*SX zyn9e*qdruwe-ClKX8DzE(d*RD?jB{feY~xjdA*%g51eCL=Fn>^2fd%8{ucC;%EwN) zy=@iNez}r5@at^C{l~CQEq(-ZKN;U37N1{zDC4oc!m%@iGwFVhw*YJ4mt*|c{IfgI zy_W&X$8&wLkp;?U@HU3_uFo78xuAZ5t?PTWJ=iMX0aa(}k2_HOYn*=U!Tb;67s^Kr z$F_(A{|~foN$z0{tIW04?^e&>+sKj;`u+agua9SGUO9ct@8sWzN2$pDRUziM{EnWs z;(>dd-w_4QqQHe}Xe4hWYrNj~e21H(C1ddSQM%`NZ~uqxLwO39a})CWy)r=d4bN3_ z3OhhDKz=}?xIyA~!g|}hCbqfenwT+vLRoO zH7iupnx&p^*a2B^_ZJ?XNIe<8=F;nI{!^`4XBzA&u7=&8>T36}`I(oo9IH69=AW>y zEztX5AB>dFw~~3ZzxT7R<20Yux5W3-@VM6XDkJa0;ETn>k2w1nn|V=vUCvV49A{1GB1mM<_Q)?EnXP+E{q8O&VFaFG4JbMe(5`1M|dp9 zxnjV7JafJr_jD0;x0@gBZ`UMT!S=Q5p-MOR>*;&=_?dT_g1Q`)j)IegXep z7I-Riq-Pl~Wvz zPlIkJ-zTj?tW_(QXQSK0Lyy{HHg2bV^WZ0TMrKR?A5Xng401M*0TIZTQ2bZo`S^SK zBlb?7mb}kU>>lVl_G1k_hyU)k?mb5naK)9%#+r8a%gsdi@LIG6XSK0QfbARfKr zWBlr~uewx^eaFo^JTmwAUb?HS9toXK{_}y{x1P6b0^#1v0QE7F9TEi(b!<|sz1{U( z>)f!=+0Bt~;lBs|D{>8CzdV?fYzxQtu8a*JIS}yd0p2|R1O31M`1j937!&T4{~pD) zloCt*N&KFNH}g!j)S)^|en2>W!_wb=deeLJ4Fg%dhk zivnuc@Ch=}_sZGHB4u*Bm>Ha+P-+G;2`<?YnV+OmY8}RHJ|FI=hnc4J51ud>J_3|Jgr9+ z#kB(48rjcxzVEK%0GK18HmT-}Hb3{u?kn;?&BIW+`fK+divNHsuVCfDqU_;{)BsfD z^L?kCXpOSdtr8d#M-~o0=dZiJGTR>?x)&}&|K8VUja@#y_v?S{Ui|-b9)~UNp}er9 zXU5pCKH^Bb?vTcg?^g|g_wS|a{ifggYx?v3(%z5Pxv-35;yL$J9 zZqoa%e+Zb5R!tweI!>E%dhrDk*s{yVS-sRE?1Omp2I~eQ1C;NhxL|U{1lB33V#CiK zVm4;C71PpWWxv&SS_Xaqc>(dn4`caF6fz)^^NJ4$Vgihb=jHF|m+txR_`R3UPQPK} zMxnn`d1sl}>1na_%t3E=Y*}DGvZj`8$L{~(F?-^s!<|gXP=7ysey!cBp0LVWPZX~Y zreoyiQy-8>FF(b!T~98)Pay84wdsStJ@8-r#;vuZ7%lQ43i%NwxqzPZoV4_TpF`3a z{yqKM{x{%X7T#e;fBN zeCOsH<2sOer*j7~61~q@g}*q)-L#;ptJSE)+8TP-`rhkkk5&Cv*V-R>_P%OwGQn{gcx{qf!9IB9GO+&=4|Aj~9Dk7=mnWT% ze1PY7Ju}h$ss~C^%?vUmp5MwINa0+{=S>FJ3GjXD+Y?W`Te&_?4oF_84vyoM_Zov- z2-e(F-of5jfH?8exB#EMz3S($pNslipWQs%PizYRUIxhas37~C=c2f@I}f^3c`4!y zHJAOhv_Fvd>3>)DH~#y5?aLnfAOF^vO2(*X;jyXQ-$?51#G~jsPL7ovr@wWqySM#( zW*UbdudX3(Ms|~XUVQfd^XHZ9mL1~wU1!^)&%w0f65=3TtqwLxB=b)8zrKq>|7#2E z0Q&r(tCchDHhvo~yFfTb_s7EnCO9sTT;Ynz_zQ{Fx$ecbaqtG>fzZ{%w%QE`-%Ly) z8SW_&&eL;&!vEfQfH;sKNBD0p14?4(ZZ0q<#DO`!AKzE`Ckf>Fs3&w4bnzoy8wBg| z!uf4odB0tIY8A`ld-dqf6#l`ta4ud?y?52)Uj1`osQrnR{wH79t*6a#sj@AQ8_FTd zB+i~iTp<(tA(Ow=4@>pLiO7+_CSV>Q1EP@$T1&vM$LHigs6F84ZpggTef>wQgv|9) z-wXV!&QX6WS0D^-NL-!kZxM3*ft>rleXPfL*}Y_>o`dwV_8yD!b3*mK{^$R{zhm{k z(O&W<^xFE{UCUiZm=A1x;aWHs?-Pq`6^HNadgA@D4WCpC=A5z5@0CY>9kM#uiA1^DiowYa`F2=PYzp@ik^z5gTyTG%`|ojFs6VOqC+s`F8-8CsHMQdzp#v$L=3<@3HjirmlyWSQYi=a5^4t4}40myS`cMW#1?8Kk0S( z16pG)jT~QLJr(~yiJbowu9uD+No6l?Fj?QRi9bj~eyB%o5}WE_b#B=ek^wG8z+93p z34FIJv~s2@)@eM+QU@6Ab4ZiusBQtjxX=V-4_sU^--9@8-|` zoq9HT{ELf|jh=zt&VbKXO#jsZZNUCWw|zSGayzR&eSP8kwWg!$b!6jf4GHP}X!L(n z309N9e=^6(_D_Qw)UjD$yc*vfT|E*$p{m_^>7n+}HO*{bw`1+Wu18w8b`9);6AP_r zHP*&u%_;SXNMDtmtY?PW~pb5~xi!##LX ztUVf>#yae4kM0KB(Qqlb zsCt;yt(Xpf&m1Vv+L7ULV4b)>vOxWQ6d#BY51`s5aRbN#`2o%bfbY-72Ds1_zT^C)pRxCyy)HkWm;rxBu_ehD z0H^8EU>BQSy?Yzd$MgDgYS@H97uXjI?zf%mIPbR)QwwwteZTIee&9a-?rq!GJZP)v z_5aF{GwtSfwX9hca&fQ+63NRE*PwN}DUoptdm=C+I7a}S==(!GW1Blq`yK9@i8 z9sFL`+7~VzHh;%^_VcCeUbt5bUpijyF0*r_tnr3-g)i^y6}B*&S`J zuvrg|u(c!S+K!3KiPbGP8~+J)ztsGU`-s2k^~ttr%mRDwzEO7fDOcE0iPga~K7n%j z$@xnH`*G-e`2phcqEzq4CQcyP`2q3R0EzSwXk@dyv991N_yO1fquRZOZ%_k!g4{s) z0N4!C)CW|ihfrmg8x-&Xzt{WuGoDB9(c5Xlk8*EZe{6hr<@(j7XV<_p_l+FT`Z9^|65=S7JEU<(um%0S_SyoW`sg40AE2(^hukQO`=9^q{d@K$_P)3} z^%;pF_cjXbD{j}O`e8Qq)`#u8m*-KdNB^#u7ulBQSodhibo+t6ep?2DD%OKHT}Ru) zoe#15F0E_*i7~u*-w`%*cuV_w=7q=t>V>|%44dE_`(aT#+x7)E!G>P;(ZmjR+3{Jd z(<81j;1{*Fhj>Akzkmz~c;$*MNIvkIonN zT@4Y~SMN>r^hu{?;*5g&HoNaLtlzQBw!SpSHa$7XwhgC;@0fYEd&Jwe?A~W=RQp@( zzT+>ntLmR*9cwqYi;9l2>kn&fkGAe=vu}9RwmyzL81{~B>^H?W41U{+>G`$1|7&&* z{eaV`^G|g4J3at7j|2Ov2T-1GbOq)55bv*?M6O_(T~^f5)(`p7c5(Sl&u+KQb*@D| z5eI-zh#?*rLHt1YcQOF(LjH`uU){fdp1+l+^}qjL>_g{;@DN~McC-3;!^eyFL#JwO zyzb{!w>_-cv4{G;ouA)pSGCHcuRlF{-~?UV9{g*sIGs2-^#jr-e?J>rplLy6oAE3< ze*4q5@$;K);|lP+=5pKcUI!a~*HL!%QE676zM!fl%EG3|fEUanKOm3uR!^#EC)A0v zo);9^tl=lJHXnAu=N)X@;&W}of_7HC_7>Z^;#M1Y{Sj7^b;GnKfNT!M4Sj4tIYT~g z$j1i`gzNrayr19enxXIcx12Nd_o1I%J|UR*xc71V;5i4_7q71#9?9&p;qtq;ILE%7 z2+n6Mv+stzZd;xr8SlmEw(I$+Hsi*Jtji%M+96RH*zytN>`>3grh5KFwgk2ewtAH_ z?c!R;*~?enk6nOG@Yqb-JaD@09>3HUJv6~iPOgU?5Q`n3fF2{i7wjjn#li!|$_79N z#FS4ZHkgRdUuYvcyk@&671KKyI`EnqR=r|v^go;;$4Op9!U04&J3ui(>V&u#wk!V%05i*bw;t+= za)~A8t3OzbdI@VSYPde+P+fWkUw2x8z4Jm#+rxSGEW6OYpMR$Pw1Tz3zrD{!KGez@ zXTddatoTOd6Z+gC=M(VGls71!;DGt=efYrs{r{Qwp_u(GJReiWN*fmpB|Tb|k=#S6&&IXmwnTl46*@DI?=FKn}`YIouL zH0&30gUe$#u({k|cm>r7DL0@p_x4xEzvhBseL;PTxbi?p#-R68RO3gCEfqc7<)kXM zAIHW!{3{+$%ul)>nUMe|pF$0Qba|(vGwi43_t@?= zy==>Ju)p>iTQZ@oom3Nh5FMWtAFTc1>WP&<$ZyjXA7smre}N66*kcwlAy@VYzd4lr z!#-Elwe@rHCstizTR%L{epuSciof}ny*{wD9a#YHh!5lPkHtqaPUR7n))LCzAx@y2 zH=oPnvGG@w<$mn@+6(`ReT4G=E_PY+-M;?+v+qiN@8w9~D{@Y7FBu@bt461Srlv!BMlWj{TO&Yv*H);uxZdL4f@wYv%64IdJmCaZr3 z^*G63H3^-a$Ua5i^I4mEcc{i+J-@OlCQ|bkXLmJkZ(HFBw>>h`*7sxGf(f7T-Ie?g zE&x6-0UIEOEgHF^Jb^gmOgyqd-z88tT&-Mfd*Q+{wufcTcOsU?T{hKfRH(&$;3voq zpjS{-dE$Z8A3H7(f1naFprUd?S+iX8rF70HKKK`k5xQ7E_Og0j3jgZ&mIzO$*nA3h zTg~`#HgV8dJecQQFVE@2&$Wic0rJt;X>fj8XWQlBU~9+m8^!*__opHQwEj;$*7Ke+ z9L)dF&o(cGKltiuTRpSAokP#hYS{L9tnr&c&R+(#fazdgzmrXoB0kY?oKx!wsn3|! z{>i78NC9~Wh1d=4upj0;b0U1<<+f$<`L=1HY>RvB{m~ul)Y{mN$gd<~7s1*Uswq{j zkYt@UF9XB}sP-=4#7f`gUsT_hl>wnx_81P04~G8V|2FhHpTqCu2hUIcb25OrBHQ2D z{o?rL?}Pt%bbcZ|c+|V=h@@P5d%!TWg)8jav9GiIi?Bb-=G`~QPRl>Y@c|iNG9And z@7m(k$A?WeyS7Ahc0!2{pCnlT{v{Jqu>-R4dipl?h3{xo>N%Z^X8A6DH%ynnRq z!Unkhw5qHD&3YW*HG|)%elNg3{hQIVvj64x=hEXh4?TT#>q6VI_Hp>WZnpE&4z~T{ zEA58X^!CO+&yT~lN2iNpNZ~iaz2gnpt7cH=avOGq*1k$6cBnN5oS%TK$OYFK*cXRn zR_Us5Q=sG3_`yX{(T<5exv_slg?M2o@#egpA*FQh`*~ZKmPlX$$9q95cuLH ztL(c`6KM~Ff*m`}#$40G8YW~Bho?>qu091FpMYH*N8YVA)#9nfr*wnIR~%0~zIZ$@ zC&ck3VF#q+qaPkw#TMK=+-%TX+thy!F}*Lz9lDtuA=V258lSP*grO z!7jP{=u%hL1HP3P7}W2n|5&i89#5P8mQ0WgP)@&W0N2YeTsl0?Zfkt5?H&xb@W?y1 zYs6Ap3NO$osv6fI@0Z+P@&8f815_I%8$h@gKadcXLauR=U0SOv%hK+!V#L(v{WsVt z8RzqTBDuu)3e*=z$_9V~2#3!Il>x3kK+pIuU@!Xjuf68G?{gD{uN(uOQ^8jbc6%ZApCj~4wNy$O) zqcavRx9>;1V!KDb0nhh_-QV(TDB4_U3~y@C8!e! z@b6>*$9ox&f(%HL{)Q7w1EY<@a&7*t_^D4Vv5kX>F}%FWt~&HwVh6|y^7>-&0b;Z?9jm`wnK^50dzmk0ju?|LwP|3kI~UT)9IOXvsO(%BCM^bg44m~`R?X~+?+%@)V; zI!}z74{&jTzsS4%qwp`>`+4KBFP~ra*W&r2 zd53XeKZ*Ew-N*!+G2ltFPgdL7F%!w#onqU^PPSW)KMkJ%zfOFfHre`MIZ7M)R5`)2 zKgB`$TpR86w~xPTA1VU^Zb1G+9BYHC#y`gTw7AA>C^^FY>HR(7D|_~`K3tcW0r*b= z?~3cm?pNKQ;{y0D0sb)+8z7M$0XHcOCwGv+rI(%LT`<12mbG~ZHq3pUCTSz9TyQdKz`)Kg}L>=($U>+ zjTblv#Tm{!^+j$w%#>BO=um^If2apWt(XNJl`|*v$9PYBs z3vYtdx!Yz8KFgYABjd0GRGSosyb5d!$w1Auy){FBr+ROXUE$boUZ-mx`knh+V#j*@ z@9LaOj#Hl#)mW(?TRhK9Ya|K(N$BjFU~23gz0E%Q%+|f~hHaTJ8PoAi`&Y{|@%7FUJ%1|e z{%-0&+jczmp6z*Vg)Qzg$qvFUNW=b5#fDF03-C`a5Vn9mCm=sk=ns%sKE)1;ZEhd; zT5Y@F0e+x9=-PvO5}U|`2c*9!zm0&G495>p9H0`t$ty8t)rb96a!C~P))wT%YTl!B zscTa|f937u5_1=)cGYRb{MJ4J{>RyuAKY#&YQm%9Bcvc3(!h@Ve)YbT9i61OKc9Vl zPZl=7$#r7vt3}<=!8hB^#qI6eIn-@6h^99fb~^Y^L;t(pApA}>2F}iBUX}LqaJ)n? z&wO5z-@E?&8aHz=hE3~(B=Fm0@UNa@Im8o`M|4Zusgv6!5`rPeCzaB}+80{|J}?0)3|i~Ebi?vOly1HcbRWnICHa``s+lo7Ud z96TVkfv;RK!>W|4kKK^s?1XT9j&S?{)dg21zEPRYtvTtRSIAuXqu%v_Tt{;1-|!Ev z)q79ey7F(d-uB1`&kTC`?|#9?Ki0;I-~+OSeK4cG|I+)yj`m5C0muY#_gUEXk{=yU z%C((q|AjA3KL64SZSJ!ztTFk0`CwE0fUDyN`^weRT3W)r$G*cM&LpkdoSxs?~VDO-)h{x|FeG|iub#9$Q9?KH%Arl zJ?Jvt^Ri{Oe##WvI-X>Dus`I2%gEysS413^I$Yu2_4i>P)CKJI^LU|)H8!oT7G3FPW%UEpkdfM?G|4n6ac{rD(r0l)OQU47Vja+ImJ@(^ba(-7_WY6|G#MSTTDb|mUb~(ey4e4#^@KBpy zI#~TS{8)qD`aw^EQW?PieSM$S1(gohxD-D~VjM|uf@$;}E98C#-+H+1S@!@jh@RvO z-(?8jh z#fbGx+!}?_zr^^X+0>6Gn_8ZKwLZ&=7tFWKZ&AN9fpt0Fm|~+lb+sDg^dxYcctQ2+ zi3j&VpAW4ovKRaEy?kFHe@*TEm^{Z;Y72n92<(kWa&lZu5Whopeaacsy5T*KASZ0Z zC-y^sYKUH4XMNAF@E;HUW8e|1mTzD)Z=CD!zn#!UpA#Q-wF2Sz z7~!%Tz<*`rPX*zhakxIgJf8!3KmV&^ojm2)2K_yReSBzia0)ocBHvFr_cxtam0JAA z;QhzjXLD}06KaODz7q05eLumPFqQzWRC6!RU-5p${W26c;26dB2X#M&7(Do2NS^NHAsHYJ zF`nEc^&v<@Rw+M8IZPvZw_ttYeztMJ4YqyRjka|`SG(if>Q1i3ahz%uW8npy9Z)jg zH75hv6Yv6|bJNXF#`eE@j|X~PjaPBIviIQs_E^*2Z~lMkeJH&g;8gXz%Ew?0cle;L zM;~Kb-kD+BW>2vnSwGC)debI#yM;BnBjMB{I8O08_3iU{f#4RI;PWmtAA=msy}bi< zU2lhI@3|N^cacA`y~PD8Cr@!hSLcf!SKXi1YP+QN3ATIKB6t8W4F1P-eF7gOjl4m8 zeDJUOKjB~eU#b2lA2?320C>cB{Qcf72AFCBi>I5X(xA@I<@|u(Y+_^TB~< zw`af;q&WNw$3Mq^9=3f=@&+ajJ{JO|H#Pj|e|&)JTIZmT$s1BFAn|_54fXEQ`hK$e zg?p`kS8D(516v;dejoJbMRrIxmB@f7$rR3$$oo)#QN<&Z8S|m()H3yC)w_WGwsL8FPgnG)#mkm$eP5%wX<$lVu{|D z&+qaBv~fYJ=-vF zwrv^wzU>(Mh0W{px*b#@AN(s1NIijnj{i9Qt~@b5>VcBU6^duwuvXda?29M9L!OZf zFl0SzkG8|^R}4}0K-m8-A6Rh!9}E0z;6K1u3I6H%?AGy=?pAM4=6~~pqU@_V_)o>- zZQC~w+l_6iS)TMZG5-|gLn`t5T>R@CVt4Ylh2y~Q4*K}zBPZ%7ma}(9UuwI*{g-Y1 zQ39T=sMf;X;=GlMkhO~5!?>*S$&Qa({%kq zn2(-k^fF2N&^hXDlhU#No6ORhq(QH+&|}1_YYYAE|M&C1oe#UN^qd}BJd>Y|zwG^# z{OxeYXMf+qzIyKp!|KTy$FpitkY}H~JksprS+;p9Iev3rwNHl*v=*7^JWK2^j#E4^ z7Q0_L!QSrIXW?HtgQ_7C&dc-8)Qc>1Y~CJm`k!OmduOkCvKRl#3lNXUxX9;8A%-8v z`X5Kc7TMPiO||V$%(ov$EVrePy={%cs`38>mj|d`V2T?A`ahQ6A`{U4k^`v~Q}7cq ztgyntHnHn$r~kK3EVkQ^dBn*D9TScX5Jn6jk{YDH3jQ@$^**J~q}QCi%zSYDebA8^ ztjnodom<+~#^)z~%No9)&brP{sHOTl>H)N7H}-uF@w*yv5!SMH8gd}8|CPI=Je+jZ z=TP(0h;_XeOzvuX*0c5^`M5v6eq}G%vU>WPz(c#STy(5cwJ61hp2C^!)jalWo^tqHsX?<$w|D?=Dm2K z9aVt6%9c{NnFC0QpQ{|sE{X%)(PIh3E zRAjDezN-&kMgEpg>viDI=KrtUw|_RejyoUc(wZI>*mMs0>y>z>`oDZk^xJ-cOZyc3xpWXYK?R;{fZGLu%efh)(c64k#`g^K3NTSOZcD(`d8FDM9!ENUg zOXPpV|Kh0!N)AtjFUYhzk9o|ty+@8r`)sFR>GAM8h2-N8sjE*W>bV zOYzS-cf=sveB}M=9q-RG^Z3{A93HV1O7YJ;kCK0Z3`oQdNXCXy-jezXcWjw$-@Q-0 z$fvj2=0(&Btn6WLJ$Z&TE5s&21|~B`^&?h3yL=Ma6gsbZA_llut&9E^R`?FvLR%!~ z7MJSQtAra8W+M5G_ai)yrgOM4Gj8quTo0Y&`*Z)AXZnqvgBu4jRJ~ig-JiDJx>mBPF8TU{QTa@pXr!MyOLoG`^#UH%<@d;*wG;Mvq-J=g!o+<8D} zRc2qGmW1@Y=?SSM^rmz{0TmS~f(22EN|lZx76d7R6e%K2niK`WihXP}Q4s|@A~rw- zRFDnsS46>on?u=kGVw1#X}5i#18Un(qX#8d~Y!M{?FT~U60V4GnZNb+5YHudhsh~Pdz}#cdTNw zd)I*zrMC~Zd>r3TCg&%Woc?rt|BILf{`IG3s~dYta|r5EpcL!X3+#8!*UD5EDGY z4079kkG(bbD!VWfzN$Di&Dc6Fz9AjRwQ_coh6E${C)iEo;v>2;a`vWANrqgnl85i zIT)tnfaeS)CgSuu=c4)Al3~*QvH^mef6r$M&)3=3vey;6=U&%}E^Tkkz&G5n+77-y z*G|1Z+m609$L_eeHvKkKW2N4kaDL?Y$aYdq(3u`U{Jv&t=$`rK=wsZoe>|Cg?t4Y$ zga4kBo#)_RwS6v^2mDtmnMhy%rDl&410)Y%@BA;UMOZW5IP#W_T3r!mc~{g6&#=pEa)@=4N*)UoSbV zH1@t%)3bU)V_Vp-###L12dG{+8SXCw8=`U9VEgui`@sLb^!4jzKd$O*m!bdl8T~KU zBb3Lo&%Kztu>a5FUot}H<#PgB7uvM`g@3nUX9@%A4XiDiV~rfIp^hH%NLNGfM0`8m%o2$dV;N+O&#dAm3H`p zg;ubhnUCuh+L#+Iae1M!iti&o6wi$U>zb3M>*B=>ymQvQ`n~fyw~xBc--zZ5 z^`1LdhkyA`949#dng=GIUNb)`5Xajv0#4$IFCG35Ed0{iBsFBc5+j5IbUi@n`w@xF zkX^itJ#pn6Ym?XvY*UXEOde3lWNa962Fd-O+Wav$=HldYv?aXpHR1>r`F=dIE!ydS z`2gqk2>-MD_j~96pMI?<{ypDc_us3bQOsWTGbz~hvzXg$dE`!!^S^3Ad#g!*Kk@bH z%Gp70rejC9suE&9J>SA+^{mMClKz(rQLGIa0JhVG|7`LHJ{;!of0CO2U2D35f9kdQ zzIuE3`1kVfJss#{SJ&?U_xkC3zD?k;TDbm{C!lpL{Fg=+sLn`rM-@2MNj<9B(NFtQ zFVMq|Y$k_g`vCj=$!nQoN{upHM*`1Majp6){TzmosejUiY=xej@>T1I}wy@5P>R63<`d{(6AkHlu z8zBH@l>_B*LXvY{d`&vPetN)0-Pp*szA*#d^aVS-ZknC?aIT&BaIsD3+`=+AcaPtv zhKuVRgFWZ^uoqr?`TIIP$*RBOC=2C*@b6>*vdCe9&--{kcYo#{gMY^Z>R71_bTL35 z|E1z><0#@0%f15t!~q}MVr`Nel7mc-0rbE4|LEdy`N)HG?EF_+FR`)J?}fX-H_(ib z5(&tObUvSAUCZBLd*>dPNo*gD+-40TF6VoR$bdLx0QErl0O9~kQN!TR2>Gk`?>~)u z|M$; z*p%+M^iaT82G0TY<^un!4M+u34Kqt&{|_bS2LA7>TkV(km1LC z=|CU*+Uwf=tJhC@#@XkEcDl3A`Cak)$~AO7O0j$5s1?u*;|F_Gvb>M_Sl*^C_UotZ z$yexaCqEisuRYw{x?Y}Rsqhx@_z#*tCSFiJezf`{a{iZ8O9t;9ZTE-x#NRzgtaB8+ z7&h|fL#Thlm-_fVJM!L0dv{@fyZeSZ)I<}PB=0B^*`ZjP^RGEJ;n+X-e|-L)ec=2! z&QbogWJ`spP`kflOZ$BBgLdrgh46CJ!>@bzUM?65qkVN}rEORNBer1OjeQv)l*ksKU>tWw3Pmno(>Ia1XFJHe5`F^iny~N&Z zv7A04*{&yGJpMyci4?~HG>&R+UySsOzk?t2wB|MFxeosI z85d_m|M|T+bzGkPe-;D2?E0go!(KR$?;c4GvvmH&<+AO=$EG+gzTj>8 zxZ9=1~}AGW*|Q|#2+k_pT0*Ebj21D&p-KL)y=^&5e&uiS}9 zWPxP+>yvLsmOW|*-y3iF8~BaSX4`kmhg*-vHiU5AO@g5pAqQeDj~_XY1|7| zK<@u>Z2vuTH(I0Us^C^VK?B$;iuoyyA47g}qP^O3iEZorsWpjch}@I^pF&<(GC2&% z)GJrB=Wbo&>H*{fjJ#|r+(9P4k-+*@4!R!Q zFKjMXhILaK4oWqzs+(1iwF3CivRkNi;X5h#1q;S>fCrmJKJi_4bUisvpY*r<5BuAW zSGwE!Ih}0P)EjN%f?Mcy3$L&aS-84~?SGS;h>u3w&nqTamrE-<8$1FV#Kl12qJ$su z?(zxT@w>RFWSKW(To@2ydcRejs|?Y%R__PsR5 zKA(H1tsL9k-hYU`YfFb){#&!nR?M@*uTI5Az%KacWm|s#V5<+Rtx|vv~tsTcb2;cX=;{o(-<{m*Y@gkn{6}cg{hZ!>BvXv-o#@0RO|k zPulyRD;f_digi8KXM7pqKlkx3j#BtnUmyAYVQ~8Aho#%M6aPkk@XdB|{$|@X;~lFP zUj9t{F9zKoLq2~npU*^>ztQ3;J8|1j)~#$O@Q?pb{67gBAQ28Q4x3=i<&W5LLSp&k z13uC9Z^(>F_)PQ+fCtpTv;{udBz(e^#E5dYJ@}0X67xaA%v!_A0jj#%1m8{&rO?3%sk&IKVo~ zfG3?Xnx00x=h=}B1MJi%J;{CVXDc6SMW56hYmyyqmFY!L2JBYl+O@0@W8-hCWnV1? z`|k{}BX4xK{C7v%FDu8`4fU`$!BPaWQ@tg1jKT0QLD*d(98+oTi{mkPt~rd-t6uy8 zULE-z;JcSsDrY~gU19|v%&}vyj>OKO@7ZHRZCv|H?259)wj=1H&5Z9%?q8j_Fza5w znynet-wNJjO}{Z6Iq(She%+Q0>1Aa&|8VSg#pzYwSt$@=cU|AuhTnLRH7y%!smS{X z)(=qido3KR5GJIRMz< zq2&KGh$&A$-?f%cACQ8DTWrht*Q{npHhw)Ze)PZWfA#+gCtjFctc<+|{_XZWn_7PY z96+Lr|HqX`A{J1F`;%&&E8b=Y9?duP23t3LlT{DCknd9u43`)|EFp~F2`Lf>@N)tF zSMcv)z>7D9lJlqduWWzy@lyZ(D&Y0a#rVAjXL9&an>wh5l_%%70zG<^&y%8=-rW09 zZPV!G*4YlNY=I3(|75r?=}zHacC`9xWPyLp30u4LX6k>&Sl*ZP{vg-3GxdOR{D$za zSwYJGlm1tX-sykI0Jh(=6N}>d_tupETG7uHeXQT~H~9tL=Gog`4-0$(?2#DG!{^Wv zz+P4ioCY#3fR0iBLHWeDwXI?WyJyj7bP&F9AKUwOU%Rh;Rm#l8*43Xxv6UEJ zi{za3dK2P`ua3IHY%Mb2Rcwp*huP+3cUjGN#jQMBNPX8s#Vg95MW@O~k!=~Ocp7q2 zc|2a<4e{$Gku#<2!-eClVB>t`3Vg%+Q|$R+9jrkzJ+*W!{BPM3A@c3{y>RZAVgXsm z;UO*S*)PlGA8;;kdneaFYXe(0CXT`JQm?0+@M!TwJeQ3jdqD9E)%q*1Ad+jMy)RdN zJ74%OiJbCvxMG_{x1#q&kNtc1XZzoLhx3+g?ficie^m~ka)1;AfR6+JO_OVY*Nt|P z`d?f8t$jc)KqYi}Jbl38lp`qogV|{E{xXQ?EpCKO)cd5p)$$ek{+5N$z(>ITk1JUQ zKP?I0p`~pZv&&Au0X;lxpEXZXU$8`KiPSepeStJ5gg5}lQA)lW*T!9k|DygcRp=i( zS;;-nI*=bMeJ5W{wfbeiYZa?ndl z?#B10fA`jBn%k8XRL==7=Hp-afAE0WF{PaBSU$B4_#aP+ zSAf3)H(edejkcy5_WtCE6;Dl60?h8evNp!818orwnGduNxX&d8;#!}`Ou?r zB|G#Y+y%Zs!J5Y~^(R}kcx+?NRsEepIhF`&{7OsT>pF1FB3RSPVesnlxo_^Vr~BQ# zE5yI-d1te84}AXWT>k&}?&rDpOwS!hP~=|fx&FWEfYb{>^ZhjQTlfzL|JP<;XnBu+ zX?Zh0qmk$L_H6fuvGeH>2(IIh0Ws?Ths_>K&aXKCG1a+#y^q`G8$PuQLh5j@z<-Hk z@QwYC9H>yTmc7-Vej=|^((-h^^{O_Q>zC%?pWje#P=|kx#nb(g0m`fR$7}NU&iCBc z{(tQMAn@Yk&pV@>Cf-5M+RJIneu_ahk6NVzIhDm-o^Df7tJCSpBBz_ia^dra8Ifr zA2-as!3tL0;rxJap1I9xCh;APCmL)jHqgCQC3|^FdwYfLnaS;A#x_u1(Wrtn+C?fa*OTD?@_TGYQrD`y8CBss78N^zdTuAYnQkH%&WxIUfu zeVvb2NAUMGu88_LHp1<0!J$GB1gsVCKIPOCV z_{L`~l}fEs4!r=EIr~2k8(_kf3y|4a$W!$MAr43$aTvabj>WhA|J(SN{`c{(d*gEB z3)g}AAofoUkodEBbeA^85~cs;FAwini9Y<}nDGby_5E!&_ul%<{-utvu>SAg zjeqHyqHE;b$Nn0VZFvLt))Yr{QGOh9d^K!l-hPe4IJN(`dYkpn|YaIK8-?+ARSv#_EksVn* z9-n`Vjci-T>GT+Kw4$+L!nv>FdHft4ott{R3%lysCEi{(LH(o%`*!jDc5=mZ;slS| z%JKBf#@3Jwad}h7G$)@qC+AD>-O|Vw*Mmp;SMq?(&uP}W7dPkZE54&OD1Gg3MemD$ zPm1n~zVAQwf8*?P{XfMR6#M5mUF;8^1-m{D{Xgn*@;ILP!H!J-lyKIMHsaFWu0L=h zxjpg$qTvdaD;Osqo|s^(xMsGq>sC84D9?K5_TxHI0{{o;;Xe(Tnr?$?kEN&4X*>ER z9AM`+h<~Uzcp|U)yovp4+UaADga4Op<>Tc2P`^`_JnyUkSO)*<+1KfUNIS%gPGe^0y=}9Jk81uG zI*;|Q{`v{%zf@}fve55Y*a5wpCeiPo{y$&iSA5&s-hB9S7e7peA5fnF#S6s&$oBU+ zK*s~JX0#su=sb(A756zld&bvfote=6y$A!F~5>vuGBKt4h= zJZGbfQ2XZT9(M9=@crQk8`+_b^RJ_jBZ=VcjrnjfyTSig!avvV>wE2om-<`XYaI1{ z>QDFBWsdv9Ch_`_i2H{hkxw5SNiJfT&1pxT;`6(y|J_6n zz-`v8QVZ~}+<$s}f`8XP82-=I`@jLz3#)5ibi`K}Vm7{}#{otKOZS(-W=KOuq*}+U z{1*urfC~GA2O$TX9l$aF={a$&{@w5Y z5&p&5h?mm3RS*6g^v#nKiSwL##`XJJH1=X_)M8dH797U}BL~1VvF^LB&Ll5pFnQly z?UqLPP3VY3^u5DB@NzdY6btsa%(yB6p8!W{nR-_r#yb_q87 zSX=whO~miu3g9pmr*OQgJC}3u@9A>+0FrC!d!kt0otM{wms~);z$`oR)$ljIRl;2l5cT?2Fa6je_|L$;FH3!JqwEs)`ATwMc2ftiSnvFd>G$j&L_Nsum7bNogOJX#xrZ?4`kvW;oou0fAAfxC4JBLNzeNJ9{wc*9PXVA zIExwKSUkS?@5^c=Gjn`|9sh(mW7t8rTufhh7yp3wbGY+lh4Op79zq^w!VB^5`jvwh z#TXK?ot6%63HDJq8%NkPW7@hngJKZk=k)(14`k;nb|9ZYJbVo6t2Er5F#F^%at=P7 zgYEx-y*avry4NJfdugn`-6S$<>dtwr5$v z+GTcAz4IOZ)z>LpGC;8dWS6Up=KHSJiEE?tjO4yat||9lT!YSEGEg-}nyDg=)!|$+ zfUW5L`$LTX$$dPFe{2wRnPPwP|DzqB$82D9@&`kh=eul|omlX_{V;8VHH@r+Ur-qP zBkwmFzE1N$qQvu&zmtl7f9zuH-x28cj_+9I5;b@)3H+zArNa|sTEp;`wsGus%Lo74 z9z95(gN`2lkrNU8rav2?w8Q>?AOHTfmEWbf;dyo@3ekzMBsJ z(VUOuM%_2g`T!gb?( z%_3_}aYd)+Wy`YmLs+}oTuqO|K3FZ(X-?1an%`3}61&FXpPJ`=8;076kGtFPk9u0S z%QEr(@T0_Kf)g*EsX7704Wws1xh5=Vlf5n7ug?nqPuJB+VvveG%3hFsl8qzG z$AEX&ZxNp_KwlV_Q?0lJyn^cus_UwAapzOW2Xe3f5l>U}{`!yod+hdH0~h;a@AdxB zJfA}RGt*feG~{ zT0Sn<$9=Zg1)-NvM@;@-N%ag8{?n~$sYbTyp3m*{8ffij3an$rf&4}iTw)4w2XTP- zX4C?yC$Vxl{@eQBzjoSd{d=)LbU*iA_G${;Uk3PXT8(}`pAQHBui23u6YSXr&FpHZ`k&(t&X8^WFE19*18 z8SL}B!oT{F$)0*=b|)4aai`Bl+e3XXc6bW|_nMhql1=q@ib1HCfX+wfsJw*;zAxKg zQnwbw4l6~Rz zc9I>0Ex_j60=iE{*XKWa?BCZv!@qj?N8|fnlhMTX&-lhp%>5n?aId{MU@`VQd_J~+ zEZC1y{Es@|2=E^UZy(R=(L5eh4UTohaocv!9%~kJ4R%oyvxTzBd!r7JEwflHTi$Cm z%>XHndByCudJi~WAjaW8-u;%F4@Mqm$o~NTi(WIW8|fq659R%7K5r^KT?YH>E{wH( z+s1+aH*C-5`|X8Y<*e6jqwR@%8(Mkddzs`0x?bRa zhkyKAY=%ty(YremSJ*kq4#Jn&Hv?@-{~F{QsHRZgRljce#MqduhrjCo7hNmT^Zs+4 zujBNz&Uox}KIbi7PklKw=OY}uNA~>LP5RQSgLbwpkG&dxPhToF>E@dtGqZ_@uAFx> z`LOg4{-~?HF}0~xfG1H;q(t$c*a`BzT~0%xO!0NUxB;)v3jQ`&XK>$Hi!2}Bjr@W6_!0~4(?z3Q-j~*k zdbH@cUGD_;0q$2EIz#?m2IttPxJM^H!qAD9Q1#H-k-vMpSm3^f5A_7c}tN|05Fhx3L5ERQU>wkEYftH@dVdbG{xd!A*3?F{lt z#pTKF_h$A=|0@O{4iNm~Tin<%()N6Dj~)B&USfc~?S+YrTrXbr5=vx!#LH*Y8sRu) zpU779b+nZZIY;oHj2!IP zD$8D5c8mS;%}6^zPvv8KrrN%(W9^%DgKg%RE3E;uUnC=^1 z;GeMtlI6{?!K6@5=cwA22ux z{Kq-JU-(zAk4S8Rc(5BsyzknSw)W$YU+lnxC#+AoyYR;{Sf5$sPG{0DCWq&hY+Un4 z9sW&|Oviv>7{!hPTpS(W68fF)>YP?q|z63FV(&Ud9x2{cMZU08%P@6~F zxXu+^%rHHIHN=`1<|PAs4#4XH&TrE%=#t#xws}=g%ilTD)zy9W+_i8AtS4+l$)I@F zvco^e=I{^JJ>AXqQq08Pis<>G*URBv*k_ZzKf_alqi|kxv3u5?^D|iM(dgb7e0KG* z3Vl>$2IBuy=Z7D#dPWPYN31k~^GL>~ zNkA@YerhtM?D!^}&2LBB^W)pH#=Ka4DEXAK zgM2xtbJ7-6czwiosm4slBo1Ki?d{B{1 zKnA)xO^zilG@Sls$ar3RZ4CKYpDeMX@652gcNWnfv9jYEqmj?z6P=GB9|w6UduQr! za_fGgrtrv2J9&JZojUfQ6&xCCr}vGw(|eFb`yaG#*WG5fwl2&0bA5?1iIZ@75z<3k z7jZ2A4F3JRf8oeszYzbzm@p^qPkEN=@%>i6rFMG3PCGn{IYf)L+tumHucWUh7?qzN zBi`TPKL-3069E75;Qz|l7WVC3KU&_j(>C<{FYRgs~Zo_ZL zcD1iwPY|!}-{GHiuKgMO<6o!_==I0o01u9{li&1!KkH`K)*%NI-H=Faq55(wZ%%P@ zXa5($zq9TCA^yD>vv>gK=P1ujTv;URUR+lq`zz|k+MQi0+Tfm*ZSbvC?A~75 zs@mOME7_o%%Gtn9xpqzC1S<>g5r-bvx|eU@VgTsDDC~wZ$dEaM8=L)bpB-G^*-n4b z)t(qt$Ewm>T)H#`-K%(D9GmNvtT=~k4Qh0iFL6bc7~Ap^b;4Vz&)+nHUK$TrD{^`i zU-Wv8d)L9Yfr|F`(Djjwlpi4cC?E0Ca!I!1h3UkkA0~Epzy0{^-PWxEI*a$>h>xph zQ!;Wo5xc`3PdNDn$c9*sMe)K#{jb4xSY(H(7q%~+v6sdUur%&XJUU<8UKIG3%!pHO zSg=2BF!s;UDR$z(D0;*))A@(HY{z>&$cb)mJJ$EK6WhjG{tjfoj}z&oGSYgqsfbOZ z`X+LXkfq{O!~^`Z_%Cs$FNn@x_P>|+r#alhf28nF{Y|~7s`lN4_wCs1ZPfklv`@yr zV>N@zd)y!MyQK47+z%NLjZBDk`ajX(|B}e2_Qf6F*vVPs_cfY<&rp_H&vZ*Jk%;NSJs4XAz~QESBMxWX6!y3)=7@Un zYW2v)M|3#$Yye@}myJdJKmRrDefg%(x|}<(?>KMdTnM>|QRw~}*c)@FUSa!x7)U+x zUGyZl4+3`>=RDl)Pyal`3U)Fpc=uhl@4JEa%*>WnH-|huabCzi#k9nAJMIp~cM+R0Mx6ZnDem)p?vaj&`y~iH+=X?P0qdGvv*N-hQ0gVz9Sr ztQ~w|v`xCHu{BAHa&~9?6RC> zWG6Bc{AOus zSF$aukZ-%FKi)gpzM{^dZVq+L*frt~6oZg&oq%;9R6bA=t6_nqyZx`n*oeYULEe7Ha5@)7ed&ipRL{>k@I@1Gd9DCvKC z{UjDkwz?q=?EQY9SOHL&(QF~Qy_|>tl3A8g3Om18E^|fb75Pd5*A2FO=mvU((^HW5 z6$4Nmpzt3|9-#VxN&mb2AJ&h*et&yjXV>??`*lADE(Gjr6aIw@*XtX5Q2jj01xj0a zWcvIO=(GKgk^A$sEqkz;)u8ULMuPB99gpk)@IUtE3iP!ZPM!Ne>wRe)egl0$0`vny zj<|ll(*2SHtQT>DvM)06i8TjoVA~4dZjv4N`Zj#t+il*xb)Ak$LKi8%EZ zx{;Q@WehqT9MM1YDE`svdF^a+p9>t;dtRAtcV1n=ruT1X?>&CA6?`=Y{|T<{3*^tX zhi%cl%^i0jeo=XLs;iL=Q&jGqSr^zrPL@lqfqyqU2mC8ep}uW1ZpFrW|7kn%7B>7_ zwZ>FBJX#ftHeC~we#EHoxC8kpr zdD*)K{>^8DEbmuh6F-f&as8^{hhYOCPt;FUy%f*IzwYgsb1js6zOC%;JF?NwE7q(% z<=IQes^&*|{E^J%3Xu1Ef8)M(`thG_?-cO=^gbJY`Q6|aj-Q@hKK@;=f9wF~0}v00 zqlPbu8sO?BYTJsQ>#Sgb+5FZ|yBhyExW8oZom?uH-_Nn@%l5T>%TJQG1r0Fj3+jR{ zB%e47J~b5^B-Y~qi{c+&P3Lv)+SP0R`JH>-|IX+Bd<^MUhkr04doBZfmWv5>`hUqd z;`)c5#Hm?kk3VpkRpTC3iw|=6uNX(aPwxF>>}C7ze)_=lx9*K%sP7@ihrGZ{m@o&h3*xA?Ke!jKklK&uF#$fBXx*queI!E<626LS*&ap4w zL|*K8kU0Xk*-`Zn{+hW$Tah#5>z>fOVel$< z4VY!8i0PkPO|Rb7C^r0id-rkIv-i;I`Q#73Y~R21s9jg9iu3tZ^QV|!w3Ew{eenOt z^jc+u?ECe%*@=VGoZOr;xDIg-Vn7L@_>ts^Qzw=YU)r+c$iKmUTr%zwJN3&W*Z?!^ z&4n%DnmJeUnqu&)g#G^?{5!pm9MH88@8{!RwtpD)l}T`X%e&3Af`vcZf$87d;RQRa zU3P2iEBekMA0pBJF6Rf^U-dl!o@?HxW_=`4%U2m&{*^AP%(z5Pw*MP_f9P*3?6W16 z%5nH_oklPFCy$Y{1?@8NJNg4(g5L*E5L5;oFT9P%teIr#f93^c!Wq>~DM>G|f$+rCsc*U6cC749e_-*$ z=u&izY=#IPD_>0ht!!N7n)@8FY($qc!uyh=L98FW=J;_Qi`P^hYN+CSY~t_Z@k?T` zJ=$KLU_|8xb?a^VEZ=rvD15p z*p~HOtUkGl(c%Z`W{4$rL$!?e_#G9?s104 z;U21grZ(CB{M@iPPsYXP#BA3(*vtO8_e(K;{uIFgG z{<3&W;NE7&hgupOaZ+rUC7~;_W2qZOCvXb*N=UkWIdX*^o3+!9Kf06t zKO60W@bmG(==aTMVifns{*T5^k3m<*!3T)@Pr`OjDV}B(!TXC{Rxmf%?1fw2w%lTM zoNb>{sw{kNE_Os&Yo2n8?Rw$};3rh_&^D`H`f}_+dMJ`77zMu=MlMllatoCQEN((M z9I65SJ^lZi^W^^h|2&s(s7>p{*A@C5-zF9>u1$JXxqq_%g-`YTC`bHHy)U1fNFHh) zam^FY+MFScts*j^T6{41KWy<~^s9ttzM~F$af%&Why8y+9CbX{2i)&+;J*xdJQ+O5 z4p2Qn0yc6YGeFY8e-?4XTsVf;W?YZIJ;e@_2Xq2m+5J*_fw1P2#YchvaO?!>KjGhT z;JoM6lz7)pb8XJdwm~QVCU0N(=kvmU1Z&mxBIf+$v)%;$5AP($Hg7N-RXeMdp`2&c zDB{0xUYYDA$I2q(uBsDiyFcs0XGhzv&-&R#6~oDuz)qoFN%F+aK6Kb8CWd}g?@+}K zWPjgqX|_Ext(|?n=1$xD*>F4b)o45X)dRNgvyrxq8lN}kceA0L8`=fb?+9y}wV=5~ znhD^1dd^#1-#=Ody4SvMM{<6b){MaB zA7rPFJZwKRFX8Ho0`!Do-dk*_rBWlB&b~|>wW4w0AG@$^!)V+06+HtFK1NLWUaQaC zHRVc2A@9}mR5giSez0Z^NWM$95wk6_sg~%>=JM#hnz~@@Iv@Y?w>6JTHUHOSHMXNO z;ru6WqlN9S_Uau^qr+3-=HmH`?0n{fqVuD{zUKVKmVo!8#y^=JA1Ni$$q_u?Uh1;a z;s5on%=;`(&4BEG@ShS?-o^TwC3mvjPaJms|Ho6dTg`~(U_TStR)&~t66d8H0P29q zLl6fb{L63g@&AwR??3zgx%l_<;Jh^=Iq*mLm;T592menA|Hr}q$!Bc#;ETxpIg9_Q z^otVy7YxRS{+V7;@84m4x%XAc4XTt#ZUAc_4PCFke<@%nz~caOV#=^j$3{>u0Oc5r z?}hx>Kh+Lzf&WboDwdF4Mg`NqnFi{!OPFrwID60)F1Qixq#Ibc^`kZRXo zkZvu`ORzfB`jvqP_4??@m(WaNzRNL-7n9HLo##Kszmx4;4_^kT=2pI)^Mk;VVr;Sr z)T<{M`=lzpg_@L0wX4oAXD!dmwFcRVFpa&-~ad$Y2ZH-jz8O~7OQ8k zcUepB05t$TKVn{JL++`#zg+NN0sQCM6-k}!r={Q@|NrxuJFHe@3+E%mqW{n0Uo~9+ zEBNZ|35vs6}sQUzhVKEi{QUnA^sm5)(HGhvjgkzf=7yWGr`Km zN1)${FTvv{;qRy755|!*k`PK97CWE}c3@d>rkei_jZ*FCwg>UA?*spXY}KsGT?;l~zd-h*^3(je9xg`j{C@aHFqs5i%)cD@PabD1d0xo8tb}lMe}HQniM%UeYoF1 zkOlQJm1q`ea1w*eQXO5ibS}phj;xT)Ec@B( zo568%eww@G>}syR^5|W^4A!u(w>@sd^KDB6c za#DHUszVgk-Ldh$uD56JBe(EpgnRWV3g`SHkfG6Brx^UVcrc#Ay}hSvH9Jmj&xyVC zbi}8cGQ7T>mnr#(kA(e~L4T;GHNx$=nK#1y&9x&tXJhltvHl&-bM+H3%qECH285w6 zLg|ANLVQNp_qM;s{n_`tbJTgdb1jVhg@G^4?^Qg%X6Z_{Y0UeUH+?sGe>-j4Olo){ zYPr1LSh)W<;(XEg{%OTCEQh#WPO%DBu6PxzP`s*DDSp0H$Jg(kJ%BNgztA%j{P+Ld z&JSurkDDCF{U?_yj||DN7HOT&;Q#YSen9_Y{|o;m)4+cU*B|~*_*V`fu?gq@bFY1w zeeON{SD*i#{SV&tn#YS5#Xt9!wddnMm3x~j{vVrt*`yZE_t%i4MI)O!{MP{gHSq7N z!|%xcUpSolkX;kuu16sQhT67Q$@zG?lWkbi);?HpjlDgijlDVkN_*k%26p$A<=s31 z`2~tIs>fIs_|XFY>; z$MLgng*WM2)w_vrNP<K3A_|^(-kHr#>XbY(U#|a@FAE4i2;puU>1FlJt4(13o98 zB@r2w!WvgU?`E~||LN;<`tW_!LG-egwWEk>5!*sOWS|3OC&*q%=6@;QUwuyl$UAWt z{xL_ObCoZk`Woj?bKIU^?fESJeUZM_nh^F~-J)z@J?Gy2mCbRzg}>qdrpupjGE;tq z$N6|NRDKm3*G&4|)fB=%gd(rP;YuTfcXWdCpCh<75u9HHdOw={tpGV5aqvKi<~e5o@s!Iur18>o6Z#ru`-LmrW^ z59cS{9|^yIU1l>oGHaLZ8@H97-}~&1yI#ikr*|iFx?=f^SL2&uV;hdMH?Mok-e|kh zR&;vTR&;sSR(4%yZ+G5kTZiqn0~1f#Q4W3O0Q7&U#t#39rQrV@{&THmdKcUC)KSO( zeKz9z6QR%a)4?il(wqGa~2N8e+U10-`;O0wsMbuBDO@%H-T3Cg7L(& zvFkracfQlX-sd+egRfN9RT(%k%?wr_%Te91U{yuUV$Op3h6S13SWAig7XdiLKV~^Md z;;c=X`4S-iFg8HECz9Tr_=^$I*zA$a-$5pXh0?E=dBK`58bsZ&=8yV5!CC#!3}$qx zHs$+-!mX>`#+K#fO=6)Y;)Id z%u_Wjd-mu{y(w()Ka;`c|80lU^lc%?}q+A>iqwY zrfjqGLYo!hzYO??|0B+L7XO9(|9?>b|Bt^fcx3hO1ZfdWMYG4yP*R}JB2f5sLbZj~pO9vO%)Qht{n}*wouLhDY)793@yTYo% z6{YZg0&+riDq&iavXNP4o;yuNXB2^m?))bez2z&FUtJAIL^<}N+b(z-Vnsm4I zYMWvGug|cVqifjFeaNe0BUrbctRg;(@(vQwak0pO06JWDfP9vwRYGmYhMVlvp8odB z_g!pM|8mx=b&d_Zv7!y2cX2OzB=)#A%euGBvTj#qQ8yiFx!4WLUku|nRmZ5lzw%ME zhKq8P!k#ui-_4f+Mfbif;J;S%-ky~ezP<4Kd;hz?*&`n$3*0dvhe~jrOCWDUkX>P{ zgD~nAO7XlHGOZZb)a`j3j!Z}-z8}vT2%rmMu?dr6i`&H)MA>u8+S;LC!2Qul=njCS z{n6>*f42Sf?Rc9#=@PrJ20jz~ZvwnPTof_*D0Fo+`SB6LGQD!p+adVprP#Z^S@1?d z@Pn#<4xz`9=4m;-FWi$mtp47@eHfn?_QT2J3!rZk$>V+E20%OWi0z;Jqa9oHtFKZZ_K^U>ci_)NB>t9 z{u4u}1tP!f_8R!^57_CQqwS+7+gs;L66~^arHLKWKQf)3w(xwFu$7flo-WRuwXWO| z+2`qCJA?mseo8T0zq|{%;q(LglzDlp+FOenUs&C14C_3OQ;oN7u;OKn%z;~F6~#xsl zs>e4-l+w46xwoOhu7fx zSH8mzzL@Xuzv}+anHA887y|gm|NmdZzxw}b3uZgZ|A}vt%`5zq|AVbRhFF{(Am~Bw z&oz&CvBrON!!v$c6>?U5pPf+KztQ0e_*34ZV@Ls_>7li3N+1;sIEv z$`db&fAuU;olr2kD~0v?Z-+%AV z?0`SRzmoy7OR!ZOzlRPk!95GB7;GJ;f?eeLllc$ZQy9cgo_NTX93Ep2ZyIRr$6scF zs_1KMz}O^aijWf?k8X&IrREN9AQE0M9vdzW9TDKZMBsZxVN=8fkn6~bxM=ME0303I zFCSjZhF&qtRu1~nJ{gv0-;FJ>?GsPiwuesH2g84|nb$10MsaP>@A3G2^7qwC58pt( zJ~n~Z;~V{tTyXezzJG+>lyg0)+`H|-*qy}xj@fg)m$`Uflz9K*#Q52w;N?P@hY&%3 z#h75``;r3?k8h9w@1ImFvx39lV}igLSF@DT^IK{@?HFf6W9v>+_wfqyLl7ef_WXr*$abT70?kf0N|@ zga2~ezrnXuvQvBKf&ahR2haDgOS6jE`O5#J2B13nU-%z-#b<1zDHBaAYtDn8W*1m8fafHsc_1(U9_}e~q^811I-Mc;Q zqRN^(!SV8YVf>cjYA%N1YynUA{}Jx}*L{rt*_v?qfXIs9lLP1CU%tO$>p{-vNA7TJ zL7Z!8a9@mlLcLfUzNVi&XA5lM$wzDf*nh%iF#&3}EiIUCPn?`$&z+oZk~* zVcH6Pf5q~n_}qjmMg!PmwpaLHc-)3H8SGwHd@qI^zesX_)SDwz@jvQ=1FH8S=RcXe z-xP9p(t@)r1D?Nmpo4uea+e)@%Itw=3#p+b=2ueKui*55G|%s7NRHg%^-vhGH6Q=ty~Y3MfZKl8k*lFxZF|$cB7d!AWRurNPcnet(T2`a9iHliBZ(LE zxju*Z60#_Nf_?B>Tjt(kuaLi6J+ru-FWHr$=WJz)S>;q_?%>a8R&NYEjB47W;1QgR zkuGF&y)oE(^AOednC}tOtV|trCHkIKroO*AeUQ}8uvS_ztDjxmZfF!{U#_{qPXBN} zb&dC0`zw=O%wKWyP~pGOe-Q`Z{C=?L9OnbBMt5z^G5AJ@i?R(@GYnj&Ei~BK~&&}o%_W67yK0pk9MI>?{M!A2) z{?*s3jO*=_VXYHyu`Ofw*ukY{cU|-_yh1tNC-(;#kXot&zgfxdzk+<~)#!ine;)7i zimU%m2+9KgUJt-fVv*wi#8v)Zm9Zn__L;3B z{yo~RJs+Q+{FsW|U@(~SL)*vAf6kI zj!|6P^#q6aRxZBeKss_E4H-}oTjFoCuOgRVh#mg0BfWHQw!ZWq(!2@9-|+h2 z`gQ=%@g)*@Up0Am(0}Cgk*Rk2)QVr{&g?K>AL&PXMaxyocr6-|4#OB z-a+_$!hR6PUkq8;xKB-6UNFbzAD?DVpIm6SKi}E1uS&Gga`1ua@O*H5?PfK%CGhx9 z9G`;>c+_sBHnb$VAP`624EVqpbVM}qfk?Ipd;yQ!r*7KC50DMuKfH7#z0P{uSC5>s zucjZduOB^S<8OEt4&YMoltbQLSu0zrwso&D+}<9xos#I|wjEb)QuC+b+p>{c>hVK; z54a8097NUn@K~{Y#r-ahg9947)ecSEXQyVJu=fVPi*KJpUJr9Un9HSnANBZ(z)q0N z2qRxWb^6i8i3?%}#L_D`iTs~Ldi`9Jb}PQfVf%IQY3p_VXncqqY}OoRp61Z^A(#4} zO7`%zOX-hH%-}tH)6$BB%ewZNgdnxAni)ikA!E#Q+ooRvwz{a`lMH zB>z{r@Yi0HU)2(i_6aQh@{e_@nW0jt%(eRyy79pJFk23I*yS%G-B1M@Yssw zE4Lv99hV#h?vVkm&mjDP^4Qg%(&f6!u3&RLapiCDzKe~^PGFN9QfyE?bds@^5|qb8 z{6C9zp2`2JpB+R#VJB*Z9<+ns47GODGnA(OM)fnL@m0NE;ylI<2w_u<-rtI1-PhYb zb`}2)DhXD7tQYQo`y5%p=g!6wxzETn)eoHA_mmX<7)4G`WF$2>_<<3`_aoV&;Dw@z@x{baXNO%pro(gg9W`}Zmz=Og1J+qa@p{Bh z6UZ5&zjio1_JdV_pKUi+8fu@y!~e)q{9x#IJ1@4Wl@Mmp*TQ}ze1K-5mWIa@wl%lw z&hu}#6Elz7ujBWS`$tc%HdB!)iVJ{!+571H2;@gNafUEn4?#amN2~8w4E}mNIeUrJ z?g{^0%iUwY%*nT13-j&9as!b+S>QhxKY{%JlI)9}XA3*MK))2iNyva<&Gf%Aku@3A z6EFjWV+!T}h2Wo@)%||{zsCXmnZEvazvtH%i~CXh$L9crfn@Yl8f&=>e)$#WN7#>F zz?*^p6Z8S=c~uJdFG=hV-A@i+IeGwJggyP~lW=3l7uY*b+(=EI;&#OK*~Ik;|C*nz z{9afn0_Gk#Vz*H($-czmEXcPPr}9*Z>ZRw z+mIuY1pzp^6!>Jt3U2Ev{1dP}Io{rRo}3==ub$(|>rcT(kgisLvjpWL%O~Mj0?49h z$v=+ex7GUNi)EnCVye)%Tq+a}tf z?}l0X%QIY_t%rZrt!7`}fpzWlOwOD%s6rDc=%TmJkLc2k8;_yx$G zAmJbTL$(8aq5ATA8~yq48#J#kidaNKNsa+OAW$sD?yNc14n2lSnts48Pwa$D$U-*c z;saz;BTx=sqrNTgz0%eG9D0j!p>;-bE~;Z=J{Z3v{QI$g&HpInYJa@>KRyTe@5cC_ z{oWb;gZ-lTSKLeXt#W`fhym3nuWRG${lWhV>f{%|2bOm=0LlTbgdbM{Szil`y+Lk( z9b0Ihzj7<{0l})|2sjhAg?%?)mc1_nWNY}j@#-JxdV-*vl~1&C@pTYC_b|V%gX^Q! z?xHw)0%;}*{v)4No}zpS%?MPTu<)M>{)GPlUCMJD4`Tn1vNg-wSVjEuG_aq>x=hlB z-dDe?1Z+qBU+Hu80h6yUeedxKKDVfSp`U@x9vMXL3s{kii~{@05lAFwHI;sOSsZ%? zaf~wP|2pI|fAaFp#2+S8*KogeY?kG6?2F=GeePV18^7x?ie6X$PB)KDj|*|@^7abf z^Kx9h&r3!Wl>uiS%dX=+)j>P_OV6LPd3kjD4DSj5$iWcqcX4=|gbU(r-tI~8e)DbG zmI)Sj0r_#M;TD@7$;OOK_Q_?Km77j~oSLO=!p4zIhI!JSI6B8F-B`g&;0HyK7aE3M z2*(Bp1N&|R|6$kx;ZgAHG3edMSmwahvS)^TY+KN&tH&O;y2)(`{{iOz#RkCxfc0^g&b5jt^5#%Bxh!2z~=VE;;hHP}T|35!}+}f4D9sFnTeekdTU-%@>_a|N<{r^9M z|3dvQ`(HX){F?Nl>R__)-Kv70*B>JuXRo4Dm)WF2HLW^+UNz!8!hc2f)$rRF+eVDbHVh0@A5XO~HpB)2Ax=gu`tA$DI+l z-ROT`9Xm^P1Mo^5o8NyzzKZ6H1dv%NiZg)!emCV>!O;hB!tfcNy$X&JzZ~4>uolx< zlWAa7K7fl!V*h*nFOemZQ^*qa8};G}tX*tlhkstv>*^cgdjAn4jN>@2e-EHxIM$_mMrCzpd{Ff&U=nz3^WG{3q5- zu({hN+cJB^ru{I<;xC~-HkDqX8SrAle^#U=f&G|F?Cc98ZTj~U?0Je}=I)zn8CR!S z3D!m=b^c-K|8Vrj8T{i5gmG=c$@S3|1^1s8Qr#ZA{X^R{ufW#8`8O?hJ3cx6HlmrW z8%k|%cp9>u89Sj#^eQ{wmiAk3KM{Z1GV!QgRkn}I4T>TkKv*uN_#Jk;^7%uk_q{%+ zqaBCuzyvJ$x)B73X`|86%JuvnDn#UvEU)s&&z;|$u)tgr_M9Bbr2zbB%allk! zd-JX%2adm2@7Q3KN;V*0fExq_HMfnEzNPS=Ryd3H+ZCyuu{D?hL+mdS zEs)nh>H%5~eY|8sb7JJrAp@54 zxQW$8CR9r#1^|~^F)7&819T`kaOweYlpa>yuRvbovnM(IFB{*}*_tgb%)3pG*~GW0 zW>)=vQ;72=5{JA7e(AuMaDZC|*y*pk+dGf8B1QxU2<{vQfFCVAEd8(Ef{wG09gd9X zb7NV{KQzKl=MAw{Pce%Ge%|#d1e@99{fn2(fD23^Cn*J=T{0yJ`#m0P#)1Xa?VjNP zxHgJaC>AK4ABW$Q2#1&iR+8v%UWVVvqCY??znKQ#l|jrjhZt9b^pdvWg&W{QrdZyO zdq3zh%xV_WzyjUBE!ef9cKt-hDfhQ3s83wEMr*t$Fy_r7O0`1sd) zP`GM9{rrO+-v#t5) zD=Y*Vnwn0(`-}uDlNE1eauclty-_Z`yNNB&f5M)&1vdW6krqLXR0!8NJizP>eEcwc zNDu$g`*8H&J|YVJ8wuAQAogD})5dmq(Kcbzzcb~eJe_4Hfc;Mi?Sv>L=R3{7{haAu*IS>l|OH&gV4Q`{c0dnx|U+VF$M&Q}p z4li37xW2ej;2$ngK0q9~fAR^wS@4U)|HjGNtad~z`iY49r}m%NUuof=-wxvcdDxc> z@a%ur$NGN+|C&$ltbL{RMx_yju+|Ezh<7W8C*|5$b3s+X6YAbwArp%+X0=oR{M{X#FyFT2^{ z4L$7ohOsV>M)gAR;3yj1?BQRWB{-I>0b@O{%eLdc4z*Kh?Y-#6nthvaJ3T!!S z<&kHZ$SXHzgmY8xx+M0>^NE3DP&`6>qWXmS*q40~fG^Ojop`v16l@#S52%(P6Wb>f zn>U9|zg>xZmrIE`e(^>RYK3Px{I{3>7ygkknsuXo1U~+?55unrC#NMs8@a8KTFcn5 z(Zsc)*di6*B7exuvp`OGJ@P&M?c-luq2l?Pc^#&BIB_vACr0tH!i`vY1i!8KUH&nj zcYX-hvNZQ9RQx~Z(RxBFd+hW)n|5r9&Af&(PZc1iLr_R8Jg*bno`2?EoP-t-3iTMl-O z{B-^ocn!q|h`|m}Os{fCU0Z+G7wG@vMvS_?_jW|A${Z+wqaH!Ek#e;r{Re0^q+R_WsYy^XwG4 zzi;0Ak(DcP5gZ~jAWN$EpY(q;|0CR+|Lc7J|1SPZlJldrBW_s!zw%L>{g2=1;U7L5 z{hkIc1~8ZFm}USl1MIuCeXLd0lHlLt04tK~k%Jy>Rq>khArT@?3 zU)a}1FB!M@pJUIn{*)Uee>`1W9eRA$eV3A>_pt5XbSrs918mw|bu0tyrQvfYfFt#! zasEF(do0hDryox(eHYCu`DL)>?Yq|wZS7_&mR)Mk&%MH4c;pg$c19C>Zra7RY+_?u zJf57B@pWz4l!i8QL<75|YB;hS{SJ>12NnX@Bbw_G;2ad|Q$M?AwPS4NNWMF<3Aw#Z z?1_m@ZRw=TY}vHS?3o!?*z>b5x0fDmMxNC5me&tZA-YX#Ru20G3{TokBRNSJ?W&aoqoz5yVt&;21 zC+)WbsK6doNAO$tBth_hC32|!FNdt6Kl}yb?C2Y~$RE%mp!?tG4_Xu5&+Lzq#QueU zcnRe!s&3(bLI3+Xr*1X|vOxU5tFObKRu7tF)GtQ-iK|)?B=cqh~i|$(9&w_E>&1K+a)2 z>$pMLQ2TTZbp)p-SsppM1qTMh!wu!QuuTr!hkRmBzW@JY?>)ezD7Urk87AkPU|`5F zWC1}D1xaGS00^ikh=_oIk|gIO8Hu8zqL_2u=A01~B?=fwl5?10X4Zc{Z%skNM)yAZ zobNyG{e9QPOLg~jS65Znv*NSXvi(EhE3gj0}YxekB3t{(FzYtrtjT&zQcRn4!{fEPe0G?<9P2h`{LD}mYYQ! zTsFCMKgX!rMPWY-J3uqB)tkC`+4?r+syl4v6@zTnrGstGCBtk^%aJy-*+`q-bhLG= zd>wtL=po5|q_5N)NBa!rx|ZM?M4(e5*iTMmIlHsLAiM9H2W@ui`8I#Uwyo#c z*yhvW(>FpE;9GDkCD>0m_E!|wGLqjt246@vKoxjY3x1w$PZm95OY`oxr_u6HV(UMZ z|EN7*^te57Y^gn0^rYRlYmuGPqn4GxCrnC5x2Mxb6Z|J&1H`59JdJ!Bx&HVxV(zIa zi;Bx(vYhLa@hB$zF>?&5j=$eP<^#ynMZszqYF0fnc^l|bc7Qa8%<=@c5 z(!s=2LW7BauoRP%Zyt>e5Q=>eM{Xer+{PjY`qUY2d$B#X+;_~{WOw5=)uval>=NYt zA}UgwP{XFR;~+mH?DPrzz{~E%KB-&iv=VJfP|L3>U@5lO|^6CF8 z`|&v=+WPZ<<(H~YRtow^b@v(AgPP;hgdD&MYPn_q7w%bXsd3Lm%{ zw)K_j%pb#5?@!b>fbEuli=l_DJXPIn?5< zc$a=Vd+7^AF7Wt|1MQYpS@>PbxzTq5*`nB@>qW`?^|@5)!^G8ZPwmNf%oZ=&JsAwb z1vmte^eBA)Jhpk$cucL*(NR{gcLa6~_&?m=R#5+2mAs{Tj;aSpy6g*SMyNT@OBQob4Z1AC+t=FK~DX6 zs+GUGq6HCSNv5|~GI)x zkX_?AJj4N_(ftjg8{7B8*4oY~M{U>aq zaB%>z`^5o}uAhGCBX*p;!-`425&ORkyC56T&B{ za|E^x>tQ0N6p%l!ROn|(HGk6agA*@_WsOK=hzDmHnJl-@8Ubg z(f9jCt5Oo1hj?H~J*u=hdZ0eo$ZNk9% zHl7}+2xcaAy{f!b&qnTn{dlnN#rEjuNqkfBxmfgX9QR)d@LV^cf^E6y zJ$lPAmuBI5J28Kw9Vdo#eCl@E4eml*9kBcfdDf@O9TtR-5J~P*eK6F^OEa$JQ$qxSoZ!?tVsaoc%!f$f4%zkSjP+cS&$)tk48Ux|`Q9Cf^fE`+Bwy5JHU@@KZgfHyyPYh1DN8g7?4?F$OH9+@AIR9V10d|Y( z0`Vux2G_D@Z=rthSvdW-e`XblPbRzAUs-(r3XbE~Aog-wId2n23%BWmyRCVucm}1> zf5Jbr|G>YC{Y(El`=9SG*8Trm`d_&s*$c`8NET>*gkn*O0Vr3m`drn%mc<9Cg#KGF zvM$(%sD5PLtD8bD_QPzP86f8mbH(=2Z_Slu$*rgpD{Z=@I?dYXMHUhmFm?ZoCWi; z1zaC~UQ;|V0iPzGn45ZUCQuh39I6+HWP@gQWMU`uzAnr1_MyX%jGd z&p-75B)6BNxIQ>g|IZz(s4F@=)V8kaW=(4f!{|NsBi^C*ulj=+zE81!_0$tC<5aUw ze9z4vQU5ZovG{qxoU8hAg>v4>=%__H#+_q9$W;AKlGlp)ONXg1hRYvf|6iDPp}l_Fo3>``CdP-awdKRt5DQylUkzDh zD@LxjFNd$So2&Qb*vXS)Z;Age4wB*k;XHP8IJv%&_*YT*K4Ij6T-`r1FbJ6+L@pqR zm}d|%(6xM zW+~?|JiLHrxuW2Ut#53U(bxN3jB7JtYeivwwu_Wt)%p4 z+Ip)MehKm@3;mzTJ(0@s(f60*7Vke4nG=HFadLJg@tXgN-TpuI-a!0opC|E;{#UME z{QFbBxUlSQn9lm!Jay?hn3TKAZO&FV#?A3dk zJD;GG%h@4Q(AVbw2gLmk-P4Cdl=Wkz@} zo7tzjn-7$&T%nE;e5sBwNeexj%6+U^meG7~0yd21`Ko?UbN6Idh(lD0V^!bbJ35xP z`~%=Wf4D7wucOr}Ma+|Xz5+eM$|3hO!>EFCh8#!RhVT-RZ3Tyi+pg8OTWfmPC`OP& zEl_Ffq>^s`-ZfJ{a2WyNs{ap-zb5G$OtwOG=dL(v3 zIE#C$MtCK9NL02uk=3j`{b(bDeSK5YtC?sF$*iPd#nG4BB2x8y#QlPZ_nq747F%{?Kg?mX`2|IGPkxb2J#yS89X@7L z4(HjN!-aO=;Ueq$@DmnMu7X7*;Tz)vL`GxJM-e-W1S=8fOE@|a;9D_%tuXxkFm!zw zI@-%|D6R>%$kV&on)vH2)33Il#%;H)lMmVMg(vL8QQvaz)g1Q335q2Crrw+C59;)P zApVI5ikmAtUAYAH09OpKeYxJYc@g!4_#-{*jmDNJ!#vmW@P5h@FRlR3usU_ieJ!>! zNzi>iPqtfIrhpTC0Q~=&De42nZ%>Zsy+y?B_uXx4-n_}0RUwXmzRkp@lspmk`gYW2R&E}A&bdVchQ&Dwv+X6!vmJ+ayK^A}qX9KX0k zbbJgLr`J~mHTdDo>j_6+M^Y=LZ5TOA+09|(=~eqH|6e}8^s01!9P%NNT;beHm)JhS zJikobXL*>aqw$60GsMFQ(p;}F^lu5ySDe34?ER2p-LL&B_ow{4^7Kys!~KcHh97>> zLOb#VF^Cy^?Bdi89{xk&{+FoexIa0>`Iq&3-NpTnzHc_J^*zY)ip9FWnD@^<-OP`Z z_~*Jy@B0hA@IR&3|JD6?F#v2qjz#lg)c4)>0>%d@O)O0HvR}T|1^hoxtm}T8aeHmc z1^+dP0aS%sQw<(qRk&ZX`zQu5lKB=xnDqvi6D*eEo>6^%95#UFyea;#ev_^aMvqxu zEHYyipYd`I4g}Wx&u^+K5umOhAb4&QmrsrHK?oGw)lX<^zu6coq zCA#^X;KcbA+|SA{NCqfQAh{u~aNmyQ?8Fi3!wVI~IO zUp=!N7eH|cma92*pHU17Ulh5a9zd=JiT%nCaK3=H{9a-FZsD9;IOi#zPy{kB5<5zA zKs+DC@k?Z;+t9cFMwS4*f1Eu2#~)ivgL5qiE>I*~pYYTq3$9e&u9`c~79PpB1^e@C z$*x0|bMa-!BkW>$Q{nXc3&&3nhXWA~-ys~nLKw%Z6%Ka7iJR&5X!-lf`=hTF^N+%R zIxn@ktsk+~c2CW-?ep_&Z7-6xR<&_lkcLj(j|ogOlygzMcP1eo*fv z&k{rKuS`&FTXy3|YJF?3_4~#umVoz1PG5e1T5uJ7%kp+kWOMs`>S`-M_wRo`-#X`t zX9RDNxW8xnEB5F0Fp~_E?Oy_!{;%Tn|J3JP3_$lH_ky?pelGy!0m~5MDMJk4zVVHS z0bmFfJZ0}Lz1Hf92bd8FzYgBM@DColHH)=<-}mHVOt*zY>$u+enlbHqe}EC;Ul=(P z|Go^+%(_JGJN3?$&7c{fv+in0Y<)VMz#ilRd)s%~8d~WRvQG#0g5`-j(m7 z{-4q4IK?vLYdE`u*JT@|3jf%&>d)D`V;Re5US-jV3H1N!Wan3+Pg!~it3`i9^*F08 zjuSn>RFiQ11^EAK`(Z0g0{?f~#plF1zF`W-5bv;$%t3A`#vxgz^HGoOlQUM)>zcJD z?7R4DF#OZD5^mAP3m5`SG~M*zCv&uTK_n2p&t81nwvB zvEu~u8+hDc;UAg9Z>HW#suOm$fb0SMod|wc@q9|~Jf~GNTfA?N%{`iDvv%*X(pR*x z5cqy6WtpE*nmO4yr7b?Yqy?4Ev0g8}YRirm*%QajZkV+Y9|oNB-Ux?(Y<%HguQ}bX zKAAjL>`Zb1n;;UM@A$jIKl6JO-tN@VAqRkso{XN9ovvBgPCuTZ|9$+cpKmPh@#g;#55#_MMz6Wwz8%14~`utNPfNar+oY3 z*ZlYX+1Aw%IsCI9uCMHXFzmQ6&N&R5E1dak(Qtc$@E;mu<1al?VDs|vli&Z)LQ7{; zCs5LoOR=(8*`+M4OlkPRDbxvFZ_D-{rH7E&9WT6v4?uiA3LP0u?jSyiUb z7T~{!f+5xTD$cJu|5$SVQTXW1(yy>}V|LhM0aM{~!4cH`f?tTNW3wj@gYB?t)uD%@6%RGD=jy{w#;j zQO<@opKHfR-4uR7oU_;4*bKSE4l?mw)17T1{6{Kw;cOYj{*c>$W&9W0o4Sw1g-wGC zR}y=<40^6rjR^Y%Tbv1~aO`H;koINi^G6RIe1JN{ebo~%mt5gPqw0hIX?Bo#w>_A# zmyQljB}S%Pp!mhE$2_k&9z6H0u;SxC65m;NYYKL$%Nr^lkL+163>)CcY-Vuwh6vK# z);`n5F2XlZ-LL!$aSc^R;Npu;2YdQou?D>+Y$`sWUS8_)odkBfT*1ux-NWs~p%J$J z%XW5YRqPpjm^#=sb%=G>Ce~et+;(lwscW-H+q+=^Jm?v=YvW*RTt|FUI7fVM9Cn4i z!|OlposZ5*zPhvZ!FwR~U4MRF^JTR#D14v9?O7h{J-)v8G3$TEf9`Mn*M;9uE!p_~ zlJ3`Q?C&2f&jtYd#Dc<*10k$XZLzgN$>oQ0?W5`08^m?Jbm(2SERPsJ>-ra7wGeQh znw?<@rO1Jmqy~oPX~=|xH13CsE~2O4E_;lez>xR8wh|fSA|tTOr z$L0?M_gbz;2f07R`xDUp>F|J;w0*`7lk3|seZSNF%euVeasjc#@ubhy6I?UFUEPgz zzhWTH_vUo$F__Cuk-^Ob`Eu()Rh%; z>J;CTUGB~E!S4kp{*nw(e|*Kx646(RK_(D?%tX((tV|q$+QR(ZlWhO;&h!Sj)fNn_ z{F!XEa$7{Ld4S($6k6{I<^#g`0if0aBA5^9@|L}p*`^(}!1VVl zSJpCfSY_#hRk|$vfYR1>!NY3B>+Jt7^B?5%@Q7l;DKaG-FzGuh4@W7MIY05L_g8;0*&c8ePRIXW5BvJfg@0!^p2WZOG(G@+y7Fd<;VGAQ zUE>7Xxe9JOOwgmhO}0L5_#KFkSHbqLnjFkr0DNcc*|7`E`U-Rb57svG7aR~o^Vk;E?%|9l0Pn_|7`4h4UT<-wRJDfRvk($-T3NKaK z?*8gKyPtCVNqdf4k9R(^_zRlB4K8V6X(cTrHOqp_RkcO~$J(r4_S?dp`L^U>f#qIv zodppS4+Z~GU_X*Ne&Js$47)#q++TR8xHHrfz{k_9?pSJg}qw_n_;| zvtrz8s}-p_KlS!1_WNafJN$dPH-G87 z#9!>(xHiQ5bLb0rhq5D<$u&^louN=C1ZipAJ9v#BqM^9XbZhsnlKWLARKc6|E z;2+%QG6$|Ie7P!c#riQ@S2Hne*Cbmyq^_&E&0-(gmuhPr2gt`f_mz_at`5ob2lV~Q zohz5;Vs`i-s=4jjGTZjAA7@85^|M3t2sXIEiw4)UipZvn82U=`-QovI&bWS~eEwuS z5dH7>^H8tfbZl770c_hm#qJs3*q&v+$y4`TZBH?)?wJR#vF9FcXU{KfZ_hu{-drzm0}#6pB8PXuExlX}VA8ImHg#v7-Sy2TYdK?y z)$TRi&L2F*ZhQGto3l0Frf<%7`oGs>FH#=>KZgGQ;nBp%i2W(n7osIu;QV*;{p9yG z_d`8-66wnwMQpA)@x31=ZnwSn7TEShhwR{^h1R$J2;z3hoG;iXMi}F;r?{aX?94C{&>P*7BM_=0q^cto%$C7F3bd6!yLCZRq3w-Z$^2*s`SCBOpl$W6+-BNa|5>X zR9pSh^>$%-><4mh;uIvp2XZrU*{{z55QdZ|_pv1WM}vRI2?opJ`pXU|1s8YTu!|tL z(~k`vUf$|%^a{SwZf~Q0&En&z9~X6m;8XMKB|rS{a@d#ef&7W$d^9geav}w}lFSls zD24OWtb$Zx7H+G@TKqi`PHz&|Mlnn;h9RA=oPBW&qgZzOG9VEDXT!9QD|g+w-oBjh zxBuuffuH|pA8Vg~w%@bei)Y)no5iO%9sJ8MctA0V1H>g*$Gc}b88H0-{F@#5HgQLx z-My8*zB|mO?jeu1vq+=3?DkjRr-x7teq;20Ed4v8qAfTAKY)D-|I+#5_-KBwba^~{ zzvcpzhba2;@}JPt~=SbEGe|j59itSxg+88l!5C(FE4C=<^E**cdtFn_PtI3 z1N?t7{RcRk7r{5D)))NyoMdqhBOK@d-wXeWTf00UdRaO+o+Vzccy5{4&utsTFk9;` z8l6951QvFq_{gA-hVuIA{p;5O z$>(<%Is^ZHPh$Dmspwky58@=(rSJaxOFOw)JNs64VP0rA+wj&k*0Di6+*f1(`3i9t zmG2ktM>dS?4G;f3mJcA=z%jVGLF9n!k`(zFoMS3>isJfOI#%(KRKF01z3ch|!byl` zIsb)wO4rIQUAKVsr}#&T;zb(9M&S9&;DhPT`^;U zmB=cG9Rcp({fFW|L`AX>Y={u>FS}pde%H?r+{c7dAHYfgpEs*|$(($otP~x0Lu`1$;v46%_Y# zyhOzv@n4Wb;w_x6|Icn`ow~mNd%l5we=XM&lzUWhE%^b7vH`$|=5W+b4Ys!)YflVd z8Ts&s?X`KWT|HnGxHDDY%$J8ZSDv{24RB_+eReZ80KNDYwWdx0E+Dxh_1f}r>FH6Q zFLQb>KsJcu@F07X+jq79!CX7 zD2^+zkB+kixX=8aTdr>(=O8)Y_2Toct%v*5v9Hg#{#?it$M?mqIK}xxZ}I%}6(|qR z{M)JL&Q|C9oqXZgv~|a#*NT@ogQph92u~>lzLM@oAN!|oiJNhpZhnwr+UV_wNOUbY zj)=t$AkLmpy$+m!!Pa%*W7h5A7wr0bpR~({PqmzeEyx#$x z0{2r{?7kdk{h<5F0bZEY(N^8Jo#JFdQ7<2{cIA4)HG=PlZxTt|&v6KeCwP5@{Me(8 zAz*QB{|b0N^B7LypZgK)3;&95C1LZX(C$A3~;gn9P!-M3UEC_Z#NVc#PkH=c_7Ox( z|Kwsn!PFba;wQvV?-L#g*M`5xI=(+x7k58(8_r?+%}>t0XfcTXhVqdwa?==RHNM%u>D zZsQ_6MNf?fYb%#uX=Sj|pQaPJf6{=22uwI8>S)8)e{KbROE`|_8!PyBC=MehmY{JiDIuaFza5^o`o zl&9x9hJkDG_Cmq4RuuL8anab+tf(05>p1Fk*+x<46GNR}OeFn5(Cwkb_0*3$jup*g z;a@p;&C3*zCYheS^}?Fiz1Kcz+X*@SI-S~n`v0pR$5XxjW@W-^I(t73`$2eC3|}_4 z<2XxZ@tTJ_j^WeK*_pMK_z=J=gJ*GWopvc!~F?JchQe#~=Gh z)WSv(*I6~h${Bcef{smb3ePrhGJ(IVhrhT9%K5u~MzROQX=Zs_WJ2-Z)zeqHSABN8 z8MWv>9_w}W?{a;A^*QYWA2EjeHWodm9-wYZ?kh&~>9vR@$GGQUn)sNvgm28+a~R;_L`8E?&ID3$H6yrN^!(u3nc6aJ*S$1oyG(Zz4EO z^(Xf15Kjgv1`q*PM|}No?vF@pfkZs zPb|+}Td*&@pW^!bU*UG!_WV(r6Y+2H7HW*HBxaa}e$AhGyJ-WI7vsDv_zP$P3Bx+$sgZ~$?!Dm{3W&@Rh7gLSCVCuJDh1&UC zp3m%AiD1nz=7SHlMFVSCdE)6M=`ocG4wHB+PN3v~%L#(3zr#Pcm;D`!%`g70N#=2;|wnFKJC2!0ZZ=&AI{hvUMt7cbg>2U(vBz)Rr^lB1+Pt@PRRy?o8NylO<$0?_-`dMsd zE!Q7MGKeL+!Nsp!{#^VUac^Zyc=AIwh?4`zGtbXJZt$A3H#nad&MO)j5Q%>uiGLr( zIcVNr9Jr6?m}5BhXpSe6 zg2Q$Y>_2|%hgKt|F_`tvF$x?pAh^+`kLrw3Q&-l&LwP}`RDe8ctlEh6?e_okplX7Ks-Gm-%w2SB=Ccq--splj6cL$L#GGh9x99vyIyCUmcAhgJ`fN;x4=dU z_iQqlN(yE!9vrk->hxpSMzhodIF{P|xFBL5^!!R>n?(J767Nao@2S+VrxNe>7PEA* zX;aC0r?5>fUWw$gwGz;G@htVfkKuFC^a#<649(D$UEur+tz3{HdncL&D6@o7I*&r&S}^HFVGibigj3Q(3n4tP(D>e|% zbNT*pe0L%`CJDPgi8+3%O~}wfmuJH}Rt~aP%QE)s+wl2zPP79X`r6@Dw@@?O$E{Vb zw6h7fRK+LpxXdNNb~bfv+0?UV!)+)9$0*bBf;dOTCx{2Cf2nxI%0H%HtEYf<$pU9H zkgG}o^C`q4lBtJD!InrP7nVkzFayjdV+Y5hALAU3$sNESNMNO~vVu8YWJ3*NWet+E ztZB*e+)p*^+T3%kM}rnNpvl!Xta(Qpe`!~naz%IQTj_mtX@8r2*1fs%ySMc?Ti9xx&2Kr@=CvGWvs;X&XYdG{)Od)EJAbf^Jh#6Ms@=!>=H6=E%XPMn zC9k%Y)XO)HZ)A1C>kz-H#7qm#xy2SnPN+wga%t)p?$yI#8=#+E|6H)<&CSGSz;=)w zt$W_d1!Rfp^CTyt$ft>~r<`4a`gF4ruxYP86>!RB1K z%r?#1t+bMDoq61TnRCSU^7yB@`)zoO1~s^LwL52f8~zmg%?{~=Y- z^XJ&qwvSoC_uT61>4Gu*Gy4CYi<~DnLEPWh{a&9>&;IbR9}qj0Ok$l4XMfe#LcxEy z!$0vc;y&_wl_Sf-hE|{4hVTKudA*CnznysAo}22`1Xa=OAm%?*B^FSYSm32q!|bPb z$pylp-SAF#SI<)x%w&K)VJ-uF$+ws9tz4gCZC?K#;{M12%_S6PFBx4Zxsy&VE=BkQ z|Jm5&n*Wi3K3Ct+mer!|msWhu6rL&JGMovvmwB|WCMCXTK)9#OXBf0G>0pWIKJ~O zoPQxd1AIn-Z|V4Omi%n=q-u7>;nNI{+L6tyTXkv&Z+yenP1$1y$m{=3@9tmcAGJO3 z`n6u~_qAPFx;wHd3%LSEhxwh!$d^>=^c?nGuReTlV(*HzL}B-<=HJZ)k$pofPIY+E z$SURd#m`BEPmmf;eG>IL-D?cDZSZ~eK5f?Lyy>ofK>5B*<@@3Mrw3KChOzDJyZg7G zM<@aPy1;I`U_8geY@!H!7WMdKzrOBwxd#{b3()`E!+!n6Ulr?TJua{>{HsTti_c?s z$FtJKu_M2h1rEpds0m*lG8Vl7xBhUKbvi$mnPAxd)CHEKKR|hUgH^-MzlS+~MLTC( z;ns0B?~WQ)34NV~jgW~Cp9S`0cRSynt@81*x0Ul#%r2Q+dp6j!c<$VoFZROwKD!ohI=zW4mAJ8xML$l?d zn0@h?6@2`O9ee*HJO0kccKmOj+VR)Fu)J56TmDPm+41MUvtv(xXGb4fi4FXt9erS} z<=wZz^6%ZqeCtgtdIc}|)sD^I%-Uv0=l;&i8Gp&#LY|ir4gdBzAgyv0Yy=xUMyfX=&G# z?qWk5O=YIu%l7%;Uv1m00^7X+({OHqZDz*T?)wYvFgdvIr){>uO{Y^=QOOKvf z@b=#5`>h?t?|*C9N~<2xocB?)h)thK+|SMU4XQ>jvH5o7b8d0)|JnR+EjOw$`^m;8 zPUX8i&QFx{hg7TV$Nf&nzpI`2H`D);32sIZTjvKjI~-hMi%VZh4>ze8YHQx@K^)*Q zD?GZ$9vpw6RVOBwn?zsW6l%lZ168G;?xnfm@P)g(8u|@y-)L9S%eN%`14`0IR@_3z zzXR`@Kb(QhtsdX0*a*pBu6{;{&FS61w!X#pth>v0|80PEsHgb~@N&`5nh7MClum9S zOP|L^*F2!c6(XoXZelyW8%7P^I6JXt^gtb?vTpHLY*!igxS8Io7pFwspI>jP+}iYhyY$uzUKpw5KOtZyzt| zYa3n}Z->4hLA4qub^T))tlYq>iHrR3wB>*Em>pmKxE=laDLeGl({_0IbLfzlt?;{d zxXHo)iZ7WPy8>B&&i|UE@|WoR&(QfFZm`1lHd?`3%$|A`tUtGjF>D*{$iu89n~(#) z*s=S6wZrJ8!}o206SvI{-MhmMFWPO#?mJ+|mK?Mr_wVODhpcc3T-67Q7+}Xed|x55 zBj1iM%Cn>N$UVfYoPG2P-#K}|?Vhm5c8}l9V&2Up=4VbgfxN(M8(YX|lVh}Z-(%nR z`N>}C^sdcs^{@@A&penK{q2T|%xKH$W>=TG34GsdohtOSTdLk={m+?f5 z_yx)M1ukYMJ}+`fd3`nhL+#7#+G>|r`^v4XZ3T2_*%o$9 z4%;#z8~3FgTJ;PMy+O6&UV{5`;hIQpU=E(?(@Zkc63pJ9h#Fz3D*JJGHQ?gHe#=B z9d^)m3_WH$hvnIhktb~XDEjSe8RY#lf@;{~B5zcRG}74QWvE*osipMnoS%<$-{JIEQ9 zBK{T(XVB}poyENPQpDoQfZ0~LvG&a5)^>E|2yiw5q32tEG}V;dY^H;^^d4y_qtht~|Z!>dQxv9;sv_}Ynfbp73y zzi~dtN1$p8MPplDvJ+r_&zH+={i}2Bi-*VCa}#d2#r-S%1UC1;NYwx+sho0-@*Hq5r+_w`|a1^2kf_zhwbO#hiv1pL$+bq zVcR(3sI4D;+}4fFxAo)lY|}(Id((<+2O@JXxqP*d*n+(IirzYlIy`BeYu;(O%#gE7_UC>9xy4SK#9YQ4;Ma!dtKQui+?u-9(? z(5@}tojf9bN-+J$!s$H}0%pn8rO>-4o4nn$wolsr*UMhhFxwHLn-!_N+WAB^YdEq3Ek(fWR4D|_&v%g<~YIVSmon<|2!4@y8?Kea${x7qgS`tBewUavDUSDx>dptubLK49Dx4N z=<7;gaU3(c3)hc#HGE$_+}7&SH@r0YgfjHpE{Dypc|)VFuVR}&7%Zm{Y|gR5pU2xv zv#zk_6=JCI!Do=q&wG=VYvWkF-oNzXBMz6Ucp~w z%gE+$)e?fKQH-=+ZOTwjc!9mOtP4FrhZDb;VEcZWZ27;D(@^qh7vH~!pwvE;;z70t zFjDtCV1>Ugq4wZm%m4L3bp8GI+Xwg97mts%Cnnx%W4pAnZcS?1l~qeyBj#Y$MW$8M z_k!yTaGVN$(^(ntQ8UnEX~fOauxC@Xh^M(&hT<9I3zNtpB*Ljla*M~}2>2Wy#~1LP z>$P}fh~@_CaRQIUBT^ndmRzH_1>)H%M(6tG5zmieMU(FnXHM~c^~H8Ee=sH8n}IH@ z7#Kv_<+T{jD;&OUX>dNQK7Hp$?z2OLqK@Kz{kCwY zEo`^UE{JK3%qvN*Fq4>ZIdpef;+uVK&HR1DTNg4kau@g?&8 z3p*gszu=Z$g-dq#k5)V4BB%Egi9tp>pG5kfoFn*GO`(_bFUGyYzE>yl@2va17=Twd z>ShIF1Gw5?VuGr#O~dCFZZ9r}ZhxgS7Ym1~@DY3a;cM)CdjC|VH((_=K~>mRq@VVA zrGxC_huYu+OeP*T)*c$x$eQw6J-7p18mH4^texfk4(<*t;f9(+50Ozei{3wV;2Wgl z52WHRq@nB6(DAAb^l}9rKi|zQfJaacUeU)7-AqkDZ#%J~gY9~!vpqSXiCuR=2H00G zfna8UQ%}r$)d!?9a;aWcsI{mPZynFeu)b|7+QeHM*z5stPe)&7_f5Fk7LL9OS#hP! z=zp1wy1A*{(YBu5)U={qU8l62Un-G!Cb5fPKmJedkbFrxxXmQ@pGj}aOt`P<)Vimk z@6+J{q=CzmSO=%c@Me<1Z=#m)OztWUe=?4kws?aHJoe{-i=z|EbGPt2oZBg_PJ4?IB_W#muRqs}O+8FC)8`f6C?n6~!X zfEAYa8nK24_TfL>hTN%!Jqg!`I=@ob{i^3{Q}!0y_S8Y*w#c>*3+&Dd#v-?|A>==( zN3i@5orm!6Y=1xQr}}>BeGmKpu5rJ!*(izys(-vV@Lo*}b~bvo3^sd7usOI>4qRLu zKI#IFt4COVaJ+r{Y$yBZ@s74W}I5r(XZ!>nS(jbB0ux=X(7Y$0bs+{U`USZ-u|~ zC$@K!9b3`aPQV4&^G#QKhk4**Z?0fh){A1!sK*<~Mh=wW_)B9Ok5Au<$E%)J!b=P_ zZ_X#+c`O);!U9lKpYBlvw0o+K)JqH*%MmG1TDq+730_aFV2AQEIwX> zTjb@yru>aWmorpOKzsu7?|d$f_a-?Xqyqi(FSZWldNHT?5&L++Cff$)cVc$!yGJoX zdT&)9gpAtgK{61yLD^<6uK@IHjes7t2 z`>4kM)zP1_-v;!h750_yrxyX&%c~z2=g0H?{aT+AVBg7r0Q>)Jc>1?{4g8<-1CRm8 z0@Vhlqx+JG)z?Mee{g?m;sC_Ki=MR=FLkq)73d2HAE07-6n(95PoF!b%bJ8L)_ zAa6JEv;Fwb1fB{GKV(G*$Rqqb&z_xnDLsB8o!_2Ao=`nRGlYHcmH6ADs}bNi z93}CF#Jf%4aXEa7pg_pf>()$KW+8u-^dPt6MT=7oZ1{^l(`4p_Wbv+Ga) zo1PbchQEoge{!Z5`_$Y^H$y|;$Nef^jJSV_TexeZeyD*u$+);$QWHS)fSx#Ya}3 zPxac3l0OcgFOh8){y_KI%ypaen;i!KN1i)whsf{mdx~4_g(5pf%0Mx;Ezrhz}rr43~$#8=2_oTbjn(-nGQ| zi(cSj-*58=Twv9ip;4Z>8WrgiR$KU|POv%t!Y5B%2kwcTBLnjH-D?GV?zNpijIya+ ztJ^u)4LRU02R@E^5W88TU{Blte}-rj92>7*z^fB>J%6zU)Hf&|S(S)AeqPxKn{wN^ z%q6(lj{Yl0yZfd~;WUZ|Ec`Qv9DFB$ z?f8?6*d+IaxXh|?((K*SY6X2+AbD`cax#L~RCD|Hi`U_roW4AHBAKGvVOO`~%NS&k zYW=*w{r%R%71$EK+(Hh>b^v?oE0RcF{mur1?S;;7+S03^u^CMl+bH<5gYnhxtUJp3 z*B@z$7mSf6?mc#m{`dDqt`GmO|@Xho|P zeVKhQW{sWr23q@f(5rg9fNw!Qg1O&{`K!)Hc29(G&v&1y^AY|}#s2=Cc)ovx`M}qO ze^(QrIG~Sz{QoHQVk(#{g1HBw@% z8koMhMKZh`@@))nDP%bHz7_p#G(9=hN4z||fO5G$@~34GV2GF)DH_#R0OlXU2OY5c)*%f zrUo2NkYbVv+y^n>++VKtSJ#ZCYv+1`a9n#K3*R($reFZHzuT$(Ma zdVg1=ON`Og`SaY(y)NE*c7P`v^t!(!7f#t6{$uIeSmx-G%T1^XPj8zY#>Lw@G2gaM z0=I;6w@siA-xL=4{2epk(Q}FRgXevic01=5+8!>`USflLA1Ji_4|;14Hu?7Z@@>_e zUG_xpw}}@Fw_34{@DIG1znc3OjNA!E$EzohSCfp)LN4hT<=<#I{5#(TUj#cq`d|1@ zC)TgHU)``~_C)tjZ1-b)|I_I7SIi#k{*IN!#!q$gyvl-qaeX|V?}Qc)*&*mzwxQ5| zeR8+8EY%rV#5`a27stLG*ALwRj4cqy}iwye0zil_@veb77ix3P2S2T}?9U%bF->KBR~pxD6dJ~i#cb__paeLFsc zLy{W>AD@~Ya)-(V%C3-X5tjWKAAZje^$YRw?`^%FMb0LWjNtfGpQl;C>f@!jfc*T% zm7=W2)m3f5sMhxJv%PKGiivh)Bgv!R;qYuhIc>uU-ONp{T>l0zzm~O*+{Rkg8veFQ z_(y4dN1$oN68m88K*x8A#XeG)1LMSjk3%@m!1w*xW9?g? z^?LevHk*?jyr$P(FK>>oMDYsj5vF@reQ`sBIbQ6IQ+9&z7iA?wvTf1TkJx5r?CzM2 zk3JK<%BA^Tvv=l@%Lng!xP-fK=ae!z@DQ=Hr7Y6IyC2H4-yb+^>t=7W_lB&nh1Wg< z=EsmDp}#J<2F>{nBhILLKF6iQABn(@@_TuCHjbXF_lW1`IQ(;5ic^a3r~csL_9w#) zNG9*6c|DoL76+d@&vq|8?l}G{rf#<8DcJq^CDQll!4-%d(BF$VKdTQl1YKN{(rX`|3ABr{^)PM58!46qGwg3qgnEr zyC>|YqSwnH59ao(i*0|eonU5g-nLmb>bgp1gT3`|H~Z{~-uCq~ci8f$2in(9 z4z@3!7-XL;z0=-a*w>yO*VPvGZEHi@H$k>3uEm^R>VaG@AZ(KemN4)4+SB#)G5tr^ z)}QeaxDDoWXU+@?{Jj2lwiSr$lep)2wC~{Jw;t&0@y+Jg5_)AndDE-#1>S>8`;oog=L383wzuuEF0a`9c8}Y*R&%Xi zqmc>)*N^L-%t;Pb1u&+>aVSi^)%h-H-Kei7G?ULp7xijztfI_x|A2kQO*ET2E{ zKJy>@K7ew8nnkTTJ%=@T0rCUVu>UjAwHMG2!vFXBaEjYkjDPH8-TdC<_{*RZkL+9B=H7i7jVoe#1X{nSAAYQOOMrWye#p*3e*=? zAjVe?xmH%a5AZ{>c)x0V^!^x@I6A727j~k-Q*?;xCjS4yzvRQ&mXCjJwE|^I5dMy;=dU8lAm0=|Kt^jfBjD3 z*#B;x5Arw}n_E3P(y`gI+1}VB-FAa#JF(P?4&Gxg&u(E2$ho<>+OAhv31*0gS#A7) zF&%Q?&i2Q6oNTLKypdj>;sWCPQ%jTqzaS0WpTz#-xEEZ10Q7*ve6jBL@bCH8-s{D& zG~!ln7A~I?cR99LhN!QYxC7!brP32XG0bFF%PU{Ot4U7bGpW2!TjeS3-JfVg^*ycTHl>z?>OqW{mpwvY3(;ojk$bMf&nJK!|i;-vmB z*8Ra8GnkbO@cZe-5_5Akw)o}Z9XK5f$3U@o_1;vzP`$5D%NvTbuf^*gS3x;M#q-6R zQ?0J*biI0g@#mF0)3GYw?5-Klef(>y*v3ix>v)t4K>s_AF!)ytFcH0dQ|?{N1lvo) zAoca2z9*(Rbvvc74XEu8F7I;wsrUh{GHSQ_eeHy4qmS@ zPsYTfchq~pVV%z^c7HO4&$&kv4~?YeSAMo;0V)>}9!x$kD%F~o&PC5j9(XZ(@7~q@ z?D+%!bv$$HWB2d2#n(FU{m$lRe}DJhfAE^aJnwNn0Q*&3*SmLRCs6B&y&r;q9mKg* zOQT;x$@8&sh`Dj!hsYN|=P3rKnY!w6rygQ%hK94jy*!=pFFV=g>|LA;%z)Ey_gFJ| z=oRSnXK}9{@a+2=UJP9}wTFMthYHB2>zcZphmHaL?|22u|G@_&Kam7CPcg)%>Fw;x zi5mevx6^%lsUf}vnLu1H3>yXCKpg*+kjl&rXlPI0@xH^oZ7Q%IAKGE(r(8q6FB4f$ zu3tPq{C+ow#MSr(#{49!{_}Ny;C*-IW5okJPLS{@J|6vQh|?=yubvw9=@IbGgV!); zkDyTgBlhc81Ly@DYq`YstI!{$3VwcdRyBA*7vVF!e}4;tMH4Ka`1|8S&$DXS;92ww zOGBolgMIY?alHcJ;5gf#>o0xp@UO=X`=0F`sDJ&(PA2dk-*0fUPQZiu9J~I5;9Ofj zb}!uPvA_S5Tj_jO94j^$yBPVA1`mJk<$bMpqbtyxnh~HFd$I0f|Nb$Yc@6#Ne}-lM zJ#LG<`B(Ape~0fgIP9alB%>5(bp3zP=RxTGx@qUwlI!oa21)g?_Z4>&rwAPL-Y76A z{CP`Qlw6Qs>@Tkemy6qDKe!&F_z{jH>+EJfUv?^I=G#Zw>O4=yEl=rx&;D1=6PYCZ z^L?&|8L@*n&E5q2)gmvlmj--eC*CBi{7k+LZZr$NLM2zvpN7w$Q3Bl`f$vXjaKOdW zZ7-#mwi-^*r+L=1(OCR}a>VIi_Nbl3v&#&pT9#L@K-CBm14z*9@Nmn;X1JnS zg#GyH_4onP;p~mDnYY%U-xx6k>H;;7JOiAmAAn+xius>u_n+C{-qRnR-c>BlE#!o@ ze%|fOZJ<06-raXNeUIF5vPSnmIX-ZZfQ_u4nqlCjPt{hovd=?SFNRt7#1O>iQB1}+Ffcwr>OEqa7=9kiT`L0*QOTwIF)yZP_%&-r;a z(<%IWeak)BqaJ38#m9+jNR6-NZk7tF!)(4+?dY>`fM3PuZ@-MW9yQSU*ez=g4iun_>2SCy9+KSzBsQ^9K~^n59F_?R1*8Sv{AD?Cnp0JSs^(RV{R!OGyj0{AaWzQ0mB zIcD_y%@?NF_Rsqv112%&Z;%bUrlN}nCK0bwUoQ3d5VywT07&c)|uVVwZf%lcu zExNCqevyvxa%67yfoun!d&|pn`trq_>*3>{xES}adLqew(7cTEVk_8&{*T&2E$_t6 z^lS!UUrT;~e{A~xKf-Jv#{cZGj@jRb@8`Ss>sSI8@B6d;xW5(SKb-3sDZ5(dguWK9 zI2^mbeO4#?zUM0IU+oUZ;Z?6q>F^M2c*i5qXNoc5a9)hF*Q8w9&Q&gp()m*{@a zZ$a<7^OhVdUL4auyuJbF_n-J){btf>!kc1YejZ-4vNTg8lYV%a%y(0b&Eu0BVUW!x z7C=9YP19}ob>*x&vA=5R)DY4upd7sdY9&)6z-t3Kl(Hj=2X32TyFVLfy{{mqi{8(m z_h=?{zp2FI;_(68JRbMmr~Ljv?CY_AU-@xxhmk+{T~5jaKIiX8*md%ad(p?V@UIo2 znnQ9}k6ks)j!k*rt}Jy9wg7nnbf4aP@_oho`yatS`|{7_739C_WHGN+47seVdnh>_yMx>@!!Fp@b2LeuCa8zbb0aeaqAz` zncwR__y2z8*7?;Z_orhi{w~QTVvR1|r#c1d5~AS#%Vr;X!3^8EINwgZX!hyE_0}Z0 z9X3Aozs&7QQM@1gmkg~$z2CXE=qBp4KS56XP(Yo}VQXKhFZm4k{i^LHe-KmLb0C8J zh2jU zAp1n~gO5?)lTWY5uLfGzrU{-5$bdVD45*~}L5d3yBb?g3ish{x%M78}_VWjQt!s-k zD+#wCBO0!~;{%E7OUyw$K$h>*dvO8DgHtxQe}A3Sn}70q`5Xry|Juq&I1~GB{s+0R z>&iE=yy;)qyWJO&Qx;!UIl$BLuj}H=BL5i9-2SuogwEw3;s2lAR~Q)cI5pw{a-PUC z*}38&Mw6QhC8p7}AZoC|; zDmFq*8`N~F?R@hDx&A^sMs44Smh+L};sMZ;l%Ak5_!6<`eesGS@GnBeLFBu2Zi<_R zU@QGU{Cl>gep}(+EimPfrJ=5^tv#8z6q*l0ngCyJh#X#^+jZppr_Wi3j zTf6G9jt5YQew?Zms*(_8W$7QPI-$h_>cG#Pf-kVZHoo88u5Xe+3;@0%{XW$%R5?e< z0L>_nEgr>VPgkGr6ZpsIbU*L=BYgP!-{rq~pVR#(u}_Q;ov6CJIBY@1{wkp--nkVn z;JhEKU#)idqQod24@f?OY-!I1_@BnVF9UR5?y=;V&a3#j&f_1Qqmy&sU;c@>Hm=uO zv7S{vPB8%4@s%U1*}I)Tw=Mm4Tf6K|_yOedq<0n1Ck7{Z;TE5f+z3VfJIwzV@qg;r zrSCZxzT2DOfvjQQu4ai`pJt_qKcK$h@#Ois)E;OX=hEvGy}y3p9_v(jAlRp#N4!4S z{GsIg!ped1%63DIyKL*z^hEuRerVYJPxXD1y5PEw+n*4ucz=?UFUl#Z)0&pPq)F zKcs#qE4=4>`=a+FRuhhRB6x_S20;8H=SK@$EXfh~y=>3a`~GwPn*O7$_T$%;`{yL= zD5kH^3j2SCfBzi)t(SX~{`c~gf%$cDbX0>kh?&=ihMK*6EqDpZ<=n`(^EVfR!w%3) z0p|+{AN=Nl_r*W;n9n)<>+^c-w%8TmKC~Evj$=TqPdz|mm>m)chp=PK+if+yKJuQY zWMlC@>sD(7HcBPxtxFN>D~-M{i@qoW7pa^zE7RG2T(Zpym*ew)i;r;6N@n=9CeF$4 z#>^qtXN*3fnh_9AuFvt3itT$hy0`8??379fxqoZ{EKtL5>H2Q0H>$P z-DeQnD}xO=7b=oP5Be&QcT5f_vV5KAuJlK~!neLFtzSpVoZ@G)^3 z{-yuXi}H&#Um_m;o`C<`JU-Xf-UYF2-j6n_ephtAW(J7|vR7d{QJ2-e=GSD0^dRR^~w0U&K2Cr*B1Y`c1#`n`j*vpXhf0qpl5c7i@B3? z7q<_Yr?`QSf60;4@WTGjJnz$|PFT9bF3;{ltd{vb z;q>(&cc7U9njtKkUq1h-UcTP72|TAi`+fdz`di@d=&-|YExb9-oqR~-fOs_t=wg~TvBmp);S zj=R{a&)L4vetnDi(oIUap8r|Y2&9PD4`)~3VMx4&~cybcRC&ap6-t3 z{&amdxG$vp6Tp8-YCs=s16S$3P4?5E7wy96D(DT(1QKtEytra%C-Hwu{|8>LKRSl9 z9arFM`rLm9|7X??#kF+Fkegll|YbYTqVJLLij`zX_RzvoJ;5`8|ocKONb zfg?_!ch0BcfoEdo4`jgKVILoY>!y67#|xCdFK(ag4UR+e&EWCeRAUgeM0>1=IRDN^ zj$7Y`W1Y>f{(fnp^zIKGi_;l$h3Y!A)* z%7~4ybo>D6`!^S~B`5HRouKbe{^r>>wbwarmUu;a1yv>nPzn8C0d7DxzCdk!fhWc^ zw!#hEgumZsKYuvF23%g=$`TJqrT31j?I9*0nd9V-F9V3j`7*$_1++bBJ9F&Hsq1(3 z|L*C3;a_=v{0ixG@Sn;(n24V5kbR-;p7j;8IDVrJzAt&_Soq2G@si9#cPbAq{QEJ( zK>Z(ho&J@_I!=F`JO^I;@7e#l$4|xc9dAb%lz$H{RGZg0p}GAqc&i1+m%_aptS{dqn-@wWv|_VXrV^H;~uFGY^ViUq-X6|r9bioKvHy)VKECwGrT1TB z>WA*SWPh!GpE}*8>MNSa43)rZ%_$U6>h!20sj z4~uf&YiO@2(!$BVz`+vrr@f2+*lJzX5dun*6V%*_C&h2-&EeDDb7 z1Fh7Cr)ax=`?vJ=yAr)$ml_Q)kKV6}{x2rhUjY6~sr4Dv`aZ3DnUK?5`k7DLtZPmh zgRHJk{RaI-h#N+kPZ%YZ5W??ILC#dx{kAXu-uxwJ_*BBB{~heC>rd(bimz|^G?uGx zwYz4Y8()`YaY37vM-2ZT&9d~-YxLc)22Cp-(s%C;(k}KisatdA{N7Al;NMy~dxS=u+niZ3%m}7OShmRk-YaIl$980ZlLJ21`I{~0 z(f>cLA>;duzc;{-@TCqbclTOEvbSfpARpp&~CPgEMRWI$h5m zr~i#JFdJf9`@iDe{FcWR@Aud0f3yAL_%3Y4Z@C&L>Djoh=C_g^VE(_G^@optNa69C zfA!~DeV=s8$&aIJYvDH={>=tJXB+;Jg*I<{EB?#*e0LVHUD%HwFKiFwrtt{Yi`e?= zT0KwHW(31E6w{CQ+Ex#0>AmZ;i5?#Bj`{{4;1aM;9Y6kiK@$0WF2}bF{MRMMzmJBW zN-vL>Hfi&mP0seev&*BZmbf?l0ZPz8Puo44jxn9;^$V~%8>{29zWtUPKwlqnge^a?-C@Q0{LLZw0uLbr z9?*C5uT_^;rK-*E>Jk&E4*qN6Hy9sKNS^Q>aEMp8X`=3-LRr_c@=&;iZFN>$Ph=d9ANc4z&mS zgllN_m2j3XF4Y&KXR2l4KAbyn&unh5*CrS+{O}sKe0SC?aO5hTRn`UG6CQwB9oB=~ zWIzb~x|(0?0IL&9w#A-!c>&l1$jBtV7wdQAVhy~9>HcKCBeVIfN2t~Er!%u76(6Hk zsHtv0?@4__DfycJ&~oLbMda&r!{(x&F!p|Saus^`SbX1d{A)8ObT3_h8n)z%`1`Xr zYV%x1DE56#dnO+W&sT_Uu-Tu;EP4l<&2RjMVSg*%=lL#%|H`(@&iW2__t*I;{Cjah z>;SlWH}8|Vxz^{W44j{Hc!557eUP&OwDR9tI%|l!x2*1Z@YW$esEmF9)#$HVEt*Py zFmi>k9eN*IM_;^&L;A(T%;$MP&kS#`L#h&+BmX`h`@-yunDqcc=2%Ui>$}NWbUK;u z*X8Eg)#2a!f6Lo9>{~Bh>$z=xxpTm`&D*}QWe+%~PZ=7sOk-OQQ%%l(k@d{B-unD~ zI(pA)XnY*~R;=#meEine^q&`x3^v{G^9BBU`89Y>ZejoUJfLC2{BN77WwZEBt<_PB zMy=3l{O|uac=yT+A*HTR)3_B!%(x?Wc}EmztiE zIIw@l-L8k%s#)at!1X^pV3PI>A4%;3vLXfS<4ai2P^;%Rf8XhS?sscmzv17rQ3CvL z%j@}P<>#(G{_XEf2bv9FHA2=$(teJBf9uniL2vAARx!E#){DOlGXOq*tslKWs1;iN zFthuv(M2cLR$b&nnb`r+G?&oY;zh3K=Z?XO?_`RbG zn(6DiNE&_P2YoSa9=g9dy<{?YZF=Z4i^AlE;oo$cuSDJ-&_5T*H6py^<$QMXMOyvet)mNnsYsK z4XNc>Np8>6z27DW`9$o4>iCdVU5_8@^O=v|pUJ95Prp&E$t{0{9>4Q8Xv2Ku)1Wt) zGu(o>AoDtzL2mQJT#gU+j2GJ|=lYTNTk*fuKMC;v+wkw7DgSCbfq%BF*2HpyqV(yt zexBCX%Vzhv9^c@(^?rH!?9~C-0ptg*7|*=Uks5HuKB`SFVeL%Q{mcl%ZzyJ!!VTIS z-d1%pH2F?=#1D}HtfkN1sLM|}K&5bux!^vB**e)F@QgiR`FR$@bF($TYJ~G>aXr^7 zsQhs{KWC!%a?uZYa6~2Ort#;~|L>)*2!Jiuedms#mrNG1CYzZ-4H~k-^naR*gBza) zmQ06$DO>(N?3^q9IrLMyODtc&dWnUI>4%Z6X~<6N50VzL zz95;ZnMj}ImSeT(&L5b8Y_!lu-Fo%})lWUp<>=>9!=FR{jvV@s7s2&qWAm4Q{hLpJ zP#fU-Hq1uvL(e=t=uPdxeWj7tm&Kg&OlFCNo!;ktkUL(zaz)%%h*_c+9QJ>OeBIuD z2LD$sKj72NrZT-~Hh|dz)^o#hcbzYQJ&;Y^a4!5_0sZvb9$cu!lLnLX_k=dDdV+eP zyO|%_Tn&jE)+9%`262Hss0Auxm0}0vfw4yP5xD1)6PUMqFM}taW`4s%dZf>}%&Li@ zr|}2UQmGq27BD9;2mIR{4x7JW*mVo+NBKF1uFGJV-CxLT`vUyg*0m4Q%JK80*S^v6 z3GeIF(!(6*pNsA{e!!k@cCXhT!?6GR;orDATh@=u_u(sFcZBg@aweVpD(3*)d@##} z2dg&o(q{42OlqWwmrd6OeC!nyq^ph^#Xgm?XXMk+f5-mDVuKO%ti|swXWuP!zR3hP zKg4qE&98tv%%ScsN-oa6%<#Rh(pL!oM6fVCp@fZ4Wk=s*1EsxFU zu{m7@aR0Rv573?Gjn~Fk!9MePHiP{au9`|O?-pR3dkMoM@*YvUcNgQgoCcFg7N<4L z+uCaLZ}IyB?EfbHvfcCLw?FsLQhogD zH7I~5wc)$Rndft_ZtHclnvf$@i@&Lr86htqm7aX~1(7sndWG-};xzE&{g@Sg8v&x{ z@c*8rrwenc_o+)Pm^uV{^cOIbD;F8y<_CiJOt9`@-X0s*Z*e?01oT}Y=d%ua{<%wT zVVKls;Qw1a+5I;9Mdt8Y%$~v4HUA*p&XeWCqc3e%vdi}`*Z;rPPT%hSm7hh^`-$vZ zJhCc|Gwb*As(f|1wB@#kZ-e;PpL%^?hS=|ot8*L%Hh}3#>$4rk&T&09@z0G1=y~7} zt-vl{Z`*w1XKImqy2Ee=en6)A0muOB$?dp2i{rUvc{bSk#M`W|j@c8|L$H|mefvgN z=*^*@=zkUlLZ-Za)qJ(A*&aFT>3ZwcnN2>w_4X{l-p_`MYz)R9>iMiTPNKEMj7?fQ zM|$*%*VHi5f_o{!zcgObWRX|PZ+?u&JHSiW_wy6$@7~wvr_M;_|2IAJ%XN)s3nznf zAOGePxcEGB!D54!A7uUaipck|xm;&AFV=#I)Bvvdk2Zftqn6JeW2WcXI-rmq;q(|P z&43R`Ph&n9d_X$#fE1L)_2b#JI*KMQ*_k83fprvl=AT^k>(b^kYCn_gd{HRIn`+uAK$%&!0(IEF}|bnzWtJ){k`>btK#joczwfuJhn?5_aDc8S?+EM_Kfw( zj6=2>zvp}od*3aKzhjSgB#Zp_bN6QQx|{>_dhJ@T9rMxYvtv8}HTU(x2kMP$7ibM% zi_Oy;eZ~a#s~)j6tAn5iAG+7e4Y1z1;GH>M>8@^%*?rX6WipRDMlN5|%$6F}<_Rsn zYmHXHDSq+bdfk4`lWG<{&S5w!xfFR!kI^LZ`4frvg=!!(O4U5?L_IfTx;Bx9wUPM# z+P9=}7e3==b){qTXZT#7#rU{q>r0k`d^euon|Wa0O$D1Dndiw!_Q~XI1^sV+k^SuU z$oempuZn;3cYM4(9_i=y!Ox@c_yA8=T2H?SHb9K?YH|B4WPrs5O3~;4s1wucclW{< zn5a$5U!Wd%qF%rA5*<+^rkdCZwdo~Xg5OZx#S+OCjF{f0r(j;1#&thiYu>_;{9uwc z&v-%8ZW^Zcdp1yQY=L61RDf-m7h*1_@%#9o`RMz6xcnk~{wkcCCiH%uKI}e!tFjV^XNHM`gqb61j}w_4YB_5O$N=k?YdE*}^y`W$Uw{6+Is4$>uetZ@ZnyN= z#g@(h+i76;lB2HI3b6mf3!C-Hm~V7Um2=?&>Hixp86W)EZ%bIT&9v8UQK8mKpie5@6GML)pr&$!_$b!I+TNn9i6-{&x+!*XX=lA*g-#)L0 z{cXQ5+bhGqFN5tn`7LMu=l6W)@N9qd`}~%@@b}q|3s`Qf-#6d-dDu(=%N2^D+pNyF zh&^wbnW70-x24bn1@SF9ec20|`REXx)2y140cGjw%AsHbb!?TY8&rd;?Z~2w(JP(&It9SnfMQumxk|v-*5A>O!qskyBz!OZ1GvF9@cv6xwEq) z{5#C~*zfho9a)I`Mzp>su$QSCeQ?WTx z$s@4Y;pUrF>`k@>|9n3_$M5nJ?EA9+-*P;o`QGxY^gO19|Zr%fTa`l^_06b^z=it53`3#u<5Hu zGhB{9RUTJK#SXw0C`gPaj+~?WdUVo?mq{Lb=WS``WW6_TEd8QR)V`_N*z@!p;9AXA zn1y|MbVhA`FbW5E>gVYHrFzEs{n^+D%X7vQx8=0a3-XQcMQm z8ziuoCOb?9RNU{MeO!JIJ||Wg|JK*r_4bClvpBl--WYV;XnjW=&WdL@5)WLXv+7=i zZYLKfxfVPNoM5;F`>K@u3Fd4hAFTdI-mIzDF4p&?QT@R7&cAt?Ew4PFCWq4`O0nn3VV|fZ+PBn16156AOG(A<2k=suI}KwulRm{rN>+L;x~Ra z!-um2+*$Q}x@`UlRGO@z@H9_y+N|ue|3k(N_)w4*#C+_w>KT>?}{m@_D@Z zJcfTaYl}Ev3?8s~-U*sF@(XZDo9Abxr+U7vTFleQr`K+N8uK;C%`J`F&-Lhe_0swJ zimz_%MBKPX*Xf~dukyW}3BJqlrI;xUzn6!tZ}a;K5^LgP)xp=Vqa%yX(sNh5rOo*I zn--7@gx&x0_49RHjdt8a3HBoXhWQxyY!*|nydJCLP2s+`&giV@>wB_!oBjWpGwh#r zyZUy(uX+CN__zL^{QrEmE!bdRjT12b%q?dF#A8R2BLJ^ekVbqEjz2FUPG{^}rnwXT z1z9v%o4!GxFMV5!o*1nz%^RsY{9Xwhe~m~K{ve%MBvEP&kOyhV0cP9nmzAv>&p1E`DZ7p|$)v^*ss1Cp^_l8H+sP!Abza=^Wo z*#YIYfXSktxQB|ihtreh(-`)#aa?|$i{)9LedF>ip2n&cnApkQYFToQ?m6#eeRao?~CF6_a@KJ>h(PzKPTR1 z2-U*pBafeWUyb;EbwRVM^#1+WV7OuH-=$|4qWk_H6V*7{0_^7#+ow;rd1o!eqd&dA|R*zU-)c^?(0Yy4s%XjQjQM z0Iz4C<>b12QNAPVEpEMiqVQVA2jtLgbdifN<@!b-Bp_wP1c65rehCG*AKIv z)~NQa)hrexPt9zB7=Mp{k8U)7pd=k1A6(>P?;TcBsPSCN@wiJYTZue!Ewen>k?lhREWra<^Rm**>s- z&Dr&Joj*Gz!2fTPe?PV7&JMs{O|ivye|n4u&-Xa z;$K?(+!SO0obsd(wC;uZTKych!AtLH$sNz@glIk0A%Q=}oZ0*-yjGHNdg&R8OM}CT z7J%<89en-}4SG*Hclvs@pSelr&Df|8^swwb@pEO6kCcFHN=`4pUdZG59w(4UU82ti zSiYc>17IQnjN9X_vdCnRm+xmi{R}@LWSi@KO}AAE@OZFcUN{i(COqyMj{_jmMnf4AQ`{5wo|et^XVw)g^^UF#uW zoS@b6Se`&WGyC$86;;4^+kN)X^l|tDAL9!w!4_CN6KddTjX3*MHIL#4aJH+ZW~wUK ztpc{H5$`L3J1%dYtv{&5qEdt8Ssrghny1EY!MZ=aP3mORLAv)Ywxl(E+Jt z#01EHhjXhI&QuZDtV$he9(e#(`xfQ=SslF9mAIL-yk{D^$Mp&4-mNcQ0&5%n>*96z z>JI-F+cUi%Qv&iTK9Z#*?EZLow!%G+)}R^7)a}301?0JOnz>mWSmz@P1|SnoyYVT- zrPfp=R+Z=ED=9UHmFeV2684T^-N(PZmuG7j-(tGn)AxzUuOx79^?qJoee3aQF@Mwd z8@? zU?+>SoQY1)LIyM?XK2iYXKTe|6wYU0c(K_6(=_vr8`Y!verkw5E>BXpi_J z&a>qQ5jTVru-t)MWJ;Fh$Z;O6Kc>aYBVftzk!L(qJXrHMXs;H=!=mAn1<#krJ;kSG zqx-X!63JCcTCw6{b=2veS9BRvM7tU5)oIpdT{vr#+RsA&bL}u^t*&@q_yPUM2_!C` zS(O+8zCfCBf)*d-b%_aB-L3b2p1iTgDg3|X#Mm6(6u3rEF%u(X^g>dqR=bx_YPI^H9z3E#mqdxaLaQ{7={>Nih=-vw^>iFs%h|ASy z56n+5W`D>HK-U-I+dI7b&3Ontc0v)b1GWH>3A4`6qm(iw?bkI!kH{ zd5tu9z7RZLg!qf)4O{rrYv#a8TZtM{Fa!&wUO|MR%}v+R-GhaY#@T04YK!1ri% z{1NoN^%XQ;Ad@qk2j5pfZC^Ebf%eTBY3gV={`aRbb7&?-YIErQ@{-2)>7kQ|`PXDt zS2cJ#)BlC=cm>$+wu;f07T3=szF&j<)HCWHsE5zLQcG@mUYnnQAHdGmql>g`flJgx#J1ZsQ~5tfp6m^DEYV=Uu5`n8Karu2a|9o782_2KAo5Q9b^em5B>d! zT2^aI9zcDtZFxXdz$!8Q`0CULRwZr<*OzR4IcxAYdy?aOp2kz3zwAZ)e7Fr^&#Zbw zdZgbZ9a{BNaBti``rh(}xTcbO7{dPu@tJHMk<(P%0nK z(~_qi)#$U@>9FiV>i3f97e&5LC=;ImSpd&ojBQyZltb(~6CRq{B5-|Fej^PzuA`<6 z8LxH!=5Rjo4ZVN9*QPOx_34lqdg9Ex)vr-!9UVPDWpG+C4UF+hy(s^_sO_SA8TM zf7Ab|_j3z15FOcb_F8p?3%nE?;Fy8;)7z(pQZj2052%6-P>BA|=6y222Yvi(@tOT) z`2;@B)2!y6I{q}P-y^P<4(2n#e6@sn#7s_5+lH5ENc@yjNeBdMY-QJu%CjQN~D%E8QJf+ zO5;!}@R?ii{~I~_-&0-$`2Y3zHygm^V8R2Y;6uB)qdfL{`O)Xk>iW$V;F^mJDCBVo zK0(V`HTA@0{k8f{IR1}NE}!90zW1&cKJc)H9Q#i-3sc8~|6h#nZu-9p7_16bs^Ak? zK42j>Zvi;20-l?uma0>uQ}kfFky>;;f$01HC*6miI(CiL-}H?>xpbbMrvCg2;#wyZ z`~zR29(IA{x}sYxSC1MR7n=s_VQhqCbbcbTA(6+4yk{KTM2Pv}DG@llNELX1n(BDR zi@FxOzuO#iKm9BFVTSab{H2mh4%5MHF4w3f(nZ(>7h)51q0d#nY3o#Sz&Ydr!vi1# zl8^x=Pg3yNQ+N;4>nX^#5OOZW|D|Eir^2BnypSX$ON19sh>Hiw7dErFj^0s z^@gVO`%<5bM8{K?_Z{h1i^p!#q#+;CV{5!luG5{IiG#s(b!3L+_f}<2EX<{p5EV-u50f&T7e?mBKkNgV%cV5_gRd zV=&$^Y&;(}zmuWZEgtqw_iyX(SI*!6J@Nc&Upv76Z^yqsZ`AAoTgDkWj)1G>5Su^X z>;ZCLtp86gGN2~0zAgtHswp?$rj1ka2Ns}A7cA7~w`XhG@Y~g^`ElASoR2?C%@OCT z1Ptbb#cX`%Tx38M^k)@(e5>`d{(q%l`k2h-8hp@2dga20_2tlanE|p=x(%Pz*0n3O zr2mJSM9h2a(Y$`c?${7VsVr2N=jTy7N8UcK6HktjEwlTRz+(z_e*)MK$4cw z{WTKo_nN;}y_i$ihhA1g(D8c_2Z&4ELkZ01?)J!=8nRfr5F4P=%=PMlh&yl0G$ls& z!iFeQdOEg1dLgzz7BYwTAU2+e-y9Ez8HavP!d}UWugeU!7CN$Kdv!SIT8%t|e5&pr zY1Y8i`tTZ3EWrJjx8RbGSgqGC`%oiKe?n(A=%+@JW7%KJ&%w5LIlI-d$9O&PZkW$O z2E?e_Nl(E3=l6RdQ~Dh}LeuW}P@AD<%+}w``uf$idZ5n>I=Xs0UT+Wf$YOxZ;l$35 zxVRp&3K^V&e`VaHHcyz{DBPQfc4_fK?W2e3yS07)dZb>*>NZ7ox2{?rs+7$^D(67 ze4sV2&eqfs_h{&`XX=oQ66^+S0XXk!%z~^+jam^oWyRQ@)(fBztQKN}7J(mI4X|Zf zWgVe`d-v93^qPJD(z*I!*tgPfVpdQPx|V#ED^}>Ui$B$??cUIxM?Ijvjfd)tlC!mc z>>yPK$JRS9gdGwx>}M1!B^4jJ*5MjD<#P>MB=y11?=jD_`_COWS#fzym0r+T@tJj0 za(EkE{oX2af!3)rK0qhd5L}&o&mDmcP^M_CrV_CMlA`46hsd)DH6$JJ%CNS^tzDY9%FVpxgb2RYSd)2Z=M|yA^1V(GS*uBlk zjFPjLlTgj&>t&;>vr@40iRWd(=bJr{L0(^z=+QiXq^6BxuP1xB7u#?3dM^&2sWaKT z!nnrR4xY{6=I~h_A9lXw?^`S)3EbPvQOim2_!G1Hx3&4VvH$;MKL5_fSAdav6|@46wexZkbPDya2s_3eXMt$bkcLN;Klkj#_m8Q^fl*sONmb`b?W9f24(X zKC4?#>8@6J-~`>AL(Xd+F)yq4D?kS1aW3=FpH>54oPUhiUle(f4OdVNyI}uVQ=MJA zt*)a_^~AGY(87xsYSo|>(opPztBHpXp~dNy`Poz1#*?kZJ1>|E>v>RgH&vi4M5lsWc8?$LGpZP%G= z)Ps0nA8hK2U;0)#4Nj#dpo-%H!n}40xNLp!)w;jyLOtDcncf<>L9@A^1=qo|59fN# zCQZBIdrjyxSJ$5OsM_swg$^n_l^MXzu*a*z379QT9KiMXLAQhZ7f2u*DBR23VZX z)e~X|xS4=lt=E_J`^cj%D3_RgF)@H+3d=OQO?NH+H%+6aU}(<)M04ox_4Z;ddEgC= zIqyoHTxvP21y0u&(9b3he>n$zor7JPOHACZnQ&3r$cQY<1HdM*`IuSw(>1`sff)zr zoU-#Y?2sGv@6(^r^BresdaqCPVXx)-Z=dBlv(6>>168s8i@<&j#l;t^(LXxrjzyc) z2c6z+-bQt$kL6%;-wq!zR`FSllwI6dX@&K%0qQF?tDe&89i^+@{9IS^H{Hk!?lN_~ z24h#Z8TktGVGpH6OL_gO$e1E}svoP{JG`TbeaX-3{*4~&uu!AUdQ$_A9jmjN4AB0> z^NJIja8K}$e1;@qeQAbIeDF-{_zZeyXHZ|8VSRp(1IEo|Q|}+)@6BhgPM-f6HF{{= z`OoORvER~v8@#^(?x9Oozp_bhU%x>854%ncQf+=vA#o9U1UT$_y?|2D^{!SIxtn5( zIE~AZ+G6K>`3k1%cQ+f~F#S`jvJMRJ|6}}D^aZSsr}gx;xwbZo(|Uepu#6kXB5x?m z#R=#mhR@%ss3BM%pwAz8k$NBa!Kq(U?+3T{+ET_5%+sqE->b_Gps#SWzRUlySs%IR zr+lzq1ZSRuO^|`DYW?N1Sy|Wz##2Y&3v70#^|Md6_#kqmIvl`0nJsim%?>)LtOL&} zQ8GEoDd^|qlxhl*TX5C$?+KNu9y8$eXKqk`eE#nLS*TF;!xhPI0`~V*8rYBI*X3~o zX9FArCvXd9%ti13-QfWH%~+%1mJ@I~xxvVka7J~7BgDX-&Sw6|eBl*raJ65ShYik;1gIZklI0HW(M)abn*zTRyV|+ z8b9IUk>=-HE)w6D>laap-!pk%854i?pDXf$6(1YcD}S~>JO2IqtN1zm$CW?J&idKs z1h@1PKn8erfXyTJW)XV118@VJs~qfsT=MPm$N??|qetb}W5z^h&AR3>t$qw;`Vw(I zThA}khDVm@y>>o-wg8gGN`YOqWi7h zE(e~jZgLBqR-)ui#o+X{>I zXAn2H8MQW7D%*4>ShN1Nrbq4UN6B3?KQ|25pPWWM8=PMh&Mz*hNVWGrOZR@fT7y5_ zsNUrHbR@3VABwWo&YW32vO*}i_xIN3;w^{?RPJToZHk#L`49xRgdA7gdA0LlpHh)3_ z`q2D*_w$c+W5sjvS9)9-Gycy%h5zmS|E~PJ{{2?I?vnc~=LF0r*q%LLy}oU(XF4m! z%H;gz5RcCxSJwFmgNpWUNuCk7PUpF)h2#ZfDv?~HFtt0W$fgu@z3FAk ztqCK;Qt=0(^xdqQw4V+vJe%CyVf5sCR<92DLOr&3!FUvF!oIp-XI-$62T|3Is)VMyxM#)52xp9i!CRL+-RE_YV}gv)<}8S z-<9Y3k9zOQxbc79CHUEn&+&8n;NNfM>(4#!clmue{>@KJCQs1sF%-rRaQ(;8EyfL6 zZB81?!1{Vyygwg4Z|_iTonQN(8rSM(&FlG=Ru9K7xRn?m@%~LW zZ`KAd@!eJ5>)q}P^~^tC)OGvbs&>^bRMWHrv6X9r2aEe-=Ni8iMh*~@Pm7Y*no&lq zzf{LxFi1}>1Mlyw(8a|2`=I*=;es68d6cvJL-_fjoH|O)DFgSV$N|HDDgRenDewTP z*Z`5-#!4wYTwR}Cpv#R5AXl)@40>rUkvfl=NI!r&@C?=A8>%3CipVuI{cbq`S>*p% zjxV*i2@TaO`$V;=d#Q#U`4IKH^EC5{<@)fZP1HeB+c$>T;9bNB@1*tKzrNFi9&fAf z5&zPm1*gKPHi2I#<}+HIkZ~YzhwvcQH`p-m>3s9=%k!YiG4J?%?6Dum?{+^Qe@AD% zGH(2z|El=kmG^D$T`@Lby~b_1+Tsc_z-Is0ysxeH0Qm#v8?fB$P-I7xo_kiumrkBw zAz0ZjwTU{^Xs0`m8Lg?EXK3k=@3iiEa@elH_Z>{V>mZBqkt5fCxu$gdKo6brimpBA zPPMPoM-8$MAQulmIGq`knI%dJ(-*65OFb~>Yu*0&M)myfYI6Ok>BDz#H-4_-N)Ay< zK@)|^K~BkS0Ot2#AqVgQQnTyg57bwf{||xx%%Z)C^EX!g)B5Y`52Q=yuUAiGz-8~O z(|v?C_CD!i{ETAigNQTY#A#sO;`WAntAPlS;~aux zvDzY6V`SLJ#^0K=;QjRKTPKrm>j?cuo%JC*>{wCUIe zk$C2WU>D>d3mSwP>-6ep>H33i)C;G-riI;?=<5ONv~1vJ{VGGX>5 zOLS<_$>0D!Esflm%u-jg+xf;P_4xO2b#sW{ljGlm{GI;OH>jjVCv5&k3RP{YLmKW+_bo0>n*TC7q`BTq(F_hze-N#|~H^HWFs+26^@i~nY z&Vm2SCFY;Uf(uCFaauN2#4vINegms9M=4Bgc*kIpxHz;cLO{~@@6 zRBZoLCkw1UjxDc0j?I#?TK{zLkjDA8*(n*sK)k;bdGW2ETCAeu>1j*OLH2%am0ABJ#cER% zQ+BLErAI0epCF;?L0k`3O3fAu*K4I%gHx2#@C@bd(?*2{o~Qf++o{Fir>PqtCkXua ze0#NqFIca;=dV_+gWC`fzy|^UiPSem$rC=Mes>*R^#bh?IRXx#E}wze0J6bwo$6wA zTrDq;8Up({%xAQj8qU54-yWA|eUCgI->$Zop3XPD@7L#6^7AX=f0v()Uv|y|d9a)A z6KBzzdu!MyHfY=c_z#1BvjeQRuV)h=Bly|jonBd1(`&Xt#QJ?$zZ_(O^~kh-xhePw zNyvmGI7I8C5yt0Eqb@%VJK&7Iqx95r5#L{{3#VPx*Gy^xuqUinP!IfxfitiHkTreBO~M8!b39~-USZZVB%VBmczpOcyJv77!k$lc zIZSYQ_F4E$wv5N~mS_7Uf%7Ex#as5+mh}+%v99;|y#PPI4nL+deZ6Tmwy#_L{|ol> z*X`#H_X`Tk)bNhPPw@@h+(o}xS7U!m(i-Jq`1R-*gqcQ1|f^_3`I$~3F=CyiEU8QT@U8nKH2KGDg zB4iNudxW}Q>Y{9>h^s>+U%`C&WbWB=@vH}+7oRu0dwibj7v%K3kM~MflL^>TUd+By z?#^x&v)|!a+DZ1zPvQU1;!FP#d+PA2&F0d|4e2aYpvvcZ=R zUjKi~WpTY{v3b4zxz_IkT*0@wz8jHJUGnhTx|?*O%jT`d-(RQRvn|R zb>7U?I)Bz0oezI^!Q3_KIB%`mQv-Nz`8toB!1KuuJdfwKCr7Y7_5bbpxr5aK&soiD z8J9?p@Of+K5sW>-dtAbEhrG8=V~8^jdg)_01vmpZ`ebUG61l$w@^ZXhB-Go0b=LJHyHO zzkwEG*RihV@eug?p^LriRXpyu2pfR7V3%^;-vj;MlQ>@={;wZ-f|v9AVf@_<#QPbe zr+=|-wuQ}qqrLXRbs9eRTV4M85_K5!wlWHuDbZ?b=`$W*j(sA*XzJG1J$Ty57j*A92GS@PO;KvijURBrh&_|IU&?U#<3E}fwrEYKK9)lQRJKN zw{LSTkEiY`O#GeR_owi0|NnQ|hu{0N`ukjYU;Vg7W&gnLCjs0iFlWSOXKjmr)0Lji zbTfOgqvNr)3;h3`d*=Lo zu8e<&bHn=fqhhGD@L9#TwgN1&r|4YmPE~8Jb8_A#OmXaO_ulI@*m8`cYeL6_njZ_K391z z?v~HFbNBxD!p`pYx)smh_Ri_<_IdxRpU1u%C!c-Z3xCZ7*6HP}v|PmnG5v;9B6PokzE$>#qs|0AB~ z#;4Lpoc`bO^fgW3JrbCImcT5e1bU^%Q{S+4HlQ~bsG`jBY#E=!3$XrIJ%_=4@0zo_ z1^;F29(aY71wJoq)vz-$IL zD~NhJHy_xp#@loC{*LEjTe#OSY-4LAa<%3B`|_({-u2kv{SEg){BHNqF@c=k`aSxb zeZ`ujirncg*{dzOb?bfFeYiY1heN}o;nvs7=xNi{EKg6{)%(5aZ?}lo#gT6m?>NS- zf9GO%Td=*YUBA_)-->;c0lQ>R0v!_U`|ofDD&xN5&wsje&Kx6$zjFED`~;sbaM(BQ zpu%Fm?DNF&e>P9lu_D&s q!43pF5bQv(1HldiI}q$Zumiyk1UnGyK(GVB4g@<8?7&}s2mT-Y;Sk*b literal 0 HcmV?d00001 diff --git a/desktop/resources/logo.jpg b/desktop/resources/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5078d1617871d67e9310042c4ca3bc851166cbdd GIT binary patch literal 53735 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%0AjA+=0Z2o@lSEwRZuvb7D*vC$Vu|Tar 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 Cf{p { + data: T + status: number +} + +interface ApiError { + status: number + message: string + detail?: unknown +} + +export class ApiClient { + private store: StoreType + + constructor(store: StoreType) { + this.store = store + } + + private getBaseUrl(): string { + return this.store.get('settings').apiUrl || 'https://marathon.animeenigma.ru/api/v1' + } + + private getToken(): string | null { + return this.store.get('token') + } + + async request( + method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', + endpoint: string, + data?: unknown + ): Promise> { + const baseUrl = this.getBaseUrl().replace(/\/$/, '') // Remove trailing slash + const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}` + const fullUrl = `${baseUrl}${cleanEndpoint}` + const url = new URL(fullUrl) + const token = this.getToken() + + const isHttps = url.protocol === 'https:' + const httpModule = isHttps ? https : http + + const body = data ? JSON.stringify(data) : undefined + + const options = { + hostname: url.hostname, + port: url.port || (isHttps ? 443 : 80), + path: url.pathname + url.search, + method, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + ...(token ? { 'Authorization': `Bearer ${token}` } : {}), + ...(body ? { 'Content-Length': Buffer.byteLength(body) } : {}), + }, + } + + console.log(`[ApiClient] ${method} ${url.href}`) + + return new Promise((resolve, reject) => { + const req = httpModule.request(options, (res) => { + let responseData = '' + + res.on('data', (chunk) => { + responseData += chunk + }) + + res.on('end', () => { + console.log(`[ApiClient] Response status: ${res.statusCode}`) + console.log(`[ApiClient] Response body: ${responseData.substring(0, 500)}`) + try { + const parsed = responseData ? JSON.parse(responseData) : {} + + if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) { + resolve({ + data: parsed as T, + status: res.statusCode, + }) + } else { + const error: ApiError = { + status: res.statusCode || 500, + message: parsed.detail || 'Request failed', + detail: parsed.detail, + } + reject(error) + } + } catch (e) { + console.error('[ApiClient] Parse error:', e) + console.error('[ApiClient] Raw response:', responseData) + reject({ + status: res.statusCode || 500, + message: 'Failed to parse response', + }) + } + }) + }) + + req.on('error', (e) => { + console.error('[ApiClient] Request error:', e) + reject({ + status: 0, + message: e.message || 'Network error', + }) + }) + + req.setTimeout(30000, () => { + console.error('[ApiClient] Request timeout') + req.destroy() + reject({ + status: 0, + message: 'Request timeout', + }) + }) + + if (body) { + req.write(body) + } + + req.end() + }) + } + + async get(endpoint: string): Promise> { + return this.request('GET', endpoint) + } + + async post(endpoint: string, data?: unknown): Promise> { + return this.request('POST', endpoint, data) + } + + async put(endpoint: string, data?: unknown): Promise> { + return this.request('PUT', endpoint, data) + } + + async patch(endpoint: string, data?: unknown): Promise> { + return this.request('PATCH', endpoint, data) + } + + async delete(endpoint: string): Promise> { + return this.request('DELETE', endpoint) + } +} diff --git a/desktop/src/main/autolaunch.ts b/desktop/src/main/autolaunch.ts new file mode 100644 index 0000000..9777f09 --- /dev/null +++ b/desktop/src/main/autolaunch.ts @@ -0,0 +1,42 @@ +import AutoLaunch from 'auto-launch' +import { app } from 'electron' + +let autoLauncher: AutoLaunch | null = null + +export async function setupAutoLaunch(enabled: boolean): Promise { + if (!autoLauncher) { + autoLauncher = new AutoLaunch({ + name: 'Game Marathon Tracker', + path: app.getPath('exe'), + }) + } + + try { + const isEnabled = await autoLauncher.isEnabled() + + if (enabled && !isEnabled) { + await autoLauncher.enable() + console.log('Auto-launch enabled') + } else if (!enabled && isEnabled) { + await autoLauncher.disable() + console.log('Auto-launch disabled') + } + } catch (error) { + console.error('Failed to setup auto-launch:', error) + } +} + +export async function isAutoLaunchEnabled(): Promise { + if (!autoLauncher) { + autoLauncher = new AutoLaunch({ + name: 'Game Marathon Tracker', + path: app.getPath('exe'), + }) + } + + try { + return await autoLauncher.isEnabled() + } catch { + return false + } +} diff --git a/desktop/src/main/index.ts b/desktop/src/main/index.ts new file mode 100644 index 0000000..0e2c1a4 --- /dev/null +++ b/desktop/src/main/index.ts @@ -0,0 +1,181 @@ +import { app, BrowserWindow, ipcMain } from 'electron' +import * as path from 'path' +import Store from 'electron-store' +import { setupTray, destroyTray } from './tray' +import { setupAutoLaunch } from './autolaunch' +import { setupIpcHandlers } from './ipc' +import { ProcessTracker } from './tracking/processTracker' +import { createSplashWindow, setupAutoUpdater, setupUpdateIpcHandlers } from './updater' +import type { StoreType } from './storeTypes' +import './storeTypes' // Import for global type declarations + +// Initialize electron store +const store = new Store({ + defaults: { + settings: { + autoLaunch: false, + minimizeToTray: true, + trackingInterval: 5000, + apiUrl: 'https://marathon.animeenigma.ru/api/v1', + theme: 'dark', + }, + token: null, + trackedGames: {}, + trackingData: {}, + }, +}) as StoreType + +let mainWindow: BrowserWindow | null = null +let processTracker: ProcessTracker | null = null +let isMonitoringEnabled = false + +const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged + +// Prevent multiple instances +const gotTheLock = app.requestSingleInstanceLock() +if (!gotTheLock) { + app.quit() +} + +function createWindow() { + // __dirname is dist/main/main/ in both dev and prod + const iconPath = path.join(__dirname, '../../../resources/icon.ico') + + mainWindow = new BrowserWindow({ + width: 450, + height: 750, + resizable: false, + frame: false, + titleBarStyle: 'hidden', + backgroundColor: '#0d0e14', + webPreferences: { + preload: path.join(__dirname, '../preload/index.js'), + nodeIntegration: false, + contextIsolation: true, + }, + icon: iconPath, + }) + + // Load the app + if (isDev) { + mainWindow.loadURL('http://localhost:5173') + mainWindow.webContents.openDevTools({ mode: 'detach' }) + } else { + // In production: __dirname is dist/main/main/, so go up twice to dist/renderer/ + mainWindow.loadFile(path.join(__dirname, '../../renderer/index.html')) + } + + // Handle close to tray + mainWindow.on('close', (event) => { + const settings = store.get('settings') + if (settings.minimizeToTray && !app.isQuitting) { + event.preventDefault() + mainWindow?.hide() + } + }) + + mainWindow.on('closed', () => { + mainWindow = null + }) + + // Setup tray icon + setupTray(mainWindow, store) + + return mainWindow +} + + +app.whenReady().then(async () => { + // Setup IPC handlers + setupIpcHandlers(store, () => mainWindow) + setupUpdateIpcHandlers() + + // Show splash screen and check for updates + createSplashWindow() + + setupAutoUpdater(async () => { + // This runs after update check is complete (or skipped) + + // Create the main window + createWindow() + + // Setup auto-launch + const settings = store.get('settings') + await setupAutoLaunch(settings.autoLaunch) + + // Initialize process tracker (but don't start automatically) + processTracker = new ProcessTracker( + store, + (stats) => { + mainWindow?.webContents.send('tracking-update', stats) + }, + (event) => { + // Game started + mainWindow?.webContents.send('game-started', event.gameName, event.gameId) + }, + (event) => { + // Game stopped + mainWindow?.webContents.send('game-stopped', event.gameName, event.duration || 0) + } + ) + // Don't start automatically - user will start via button + }) + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow() + } + }) +}) + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + // Don't quit on Windows if minimize to tray is enabled + const settings = store.get('settings') + if (!settings.minimizeToTray) { + app.quit() + } + } +}) + +app.on('before-quit', () => { + app.isQuitting = true + processTracker?.stop() + destroyTray() +}) + +// Handle IPC for window controls +ipcMain.on('minimize-to-tray', () => { + mainWindow?.hide() +}) + +ipcMain.on('quit-app', () => { + app.isQuitting = true + app.quit() +}) + +// Monitoring control +ipcMain.handle('start-monitoring', () => { + if (!isMonitoringEnabled && processTracker) { + processTracker.start() + isMonitoringEnabled = true + console.log('Monitoring started') + } + return isMonitoringEnabled +}) + +ipcMain.handle('stop-monitoring', () => { + if (isMonitoringEnabled && processTracker) { + processTracker.stop() + isMonitoringEnabled = false + console.log('Monitoring stopped') + } + return isMonitoringEnabled +}) + +ipcMain.handle('get-monitoring-status', () => { + return isMonitoringEnabled +}) + +// Export for use in other modules +export { store, mainWindow } diff --git a/desktop/src/main/ipc.ts b/desktop/src/main/ipc.ts new file mode 100644 index 0000000..fbc62c9 --- /dev/null +++ b/desktop/src/main/ipc.ts @@ -0,0 +1,174 @@ +import { ipcMain, BrowserWindow } from 'electron' +import { setupAutoLaunch } from './autolaunch' +import { getRunningProcesses, getForegroundWindow } from './tracking/processTracker' +import { getSteamGames, getSteamPath } from './tracking/steamIntegration' +import { getTrackingStats, getTrackedGames, addTrackedGame, removeTrackedGame } from './tracking/timeStorage' +import { ApiClient } from './apiClient' +import type { TrackedGame, AppSettings, User, LoginResponse } from '../shared/types' +import type { StoreType } from './storeTypes' + +export function setupIpcHandlers( + store: StoreType, + getMainWindow: () => BrowserWindow | null +) { + const apiClient = new ApiClient(store) + // Settings handlers + ipcMain.handle('get-settings', () => { + return store.get('settings') + }) + + ipcMain.handle('save-settings', async (_event, settings: Partial) => { + const currentSettings = store.get('settings') + const newSettings = { ...currentSettings, ...settings } + store.set('settings', newSettings) + + // Handle auto-launch setting change + if (settings.autoLaunch !== undefined) { + await setupAutoLaunch(settings.autoLaunch) + } + + return newSettings + }) + + // Auth handlers + ipcMain.handle('get-token', () => { + return store.get('token') + }) + + ipcMain.handle('save-token', (_event, token: string) => { + store.set('token', token) + }) + + ipcMain.handle('clear-token', () => { + store.set('token', null) + }) + + // Process tracking handlers + ipcMain.handle('get-running-processes', async () => { + return await getRunningProcesses() + }) + + ipcMain.handle('get-foreground-window', async () => { + return await getForegroundWindow() + }) + + ipcMain.handle('get-tracking-stats', () => { + return getTrackingStats(store) + }) + + // Steam handlers + ipcMain.handle('get-steam-games', async () => { + return await getSteamGames() + }) + + ipcMain.handle('get-steam-path', () => { + return getSteamPath() + }) + + // Tracked games handlers + ipcMain.handle('get-tracked-games', () => { + return getTrackedGames(store) + }) + + ipcMain.handle('add-tracked-game', (_event, game: Omit) => { + return addTrackedGame(store, game) + }) + + ipcMain.handle('remove-tracked-game', (_event, gameId: string) => { + removeTrackedGame(store, gameId) + }) + + // API handlers - all requests go through main process (no CORS issues) + ipcMain.handle('api-login', async (_event, login: string, password: string) => { + console.log('[API] Login attempt for:', login) + try { + const response = await apiClient.post('/auth/login', { login, password }) + console.log('[API] Login response:', response.status) + + // Save token if login successful + if (response.data.access_token) { + store.set('token', response.data.access_token) + } + + return { success: true, data: response.data } + } catch (error: unknown) { + console.error('[API] Login error:', error) + const err = error as { status?: number; message?: string; detail?: unknown } + return { + success: false, + error: err.detail || err.message || 'Login failed', + status: err.status + } + } + }) + + ipcMain.handle('api-get-me', async () => { + try { + const response = await apiClient.get('/auth/me') + return { success: true, data: response.data } + } catch (error: unknown) { + const err = error as { status?: number; message?: string; detail?: unknown } + return { + success: false, + error: err.detail || err.message || 'Failed to get user', + status: err.status + } + } + }) + + ipcMain.handle('api-2fa-verify', async (_event, sessionId: number, code: string) => { + console.log('[API] 2FA verify attempt') + try { + const response = await apiClient.post(`/auth/2fa/verify?session_id=${sessionId}&code=${code}`) + console.log('[API] 2FA verify response:', response.status) + + // Save token if verification successful + if (response.data.access_token) { + store.set('token', response.data.access_token) + } + + return { success: true, data: response.data } + } catch (error: unknown) { + console.error('[API] 2FA verify error:', error) + const err = error as { status?: number; message?: string; detail?: unknown } + return { + success: false, + error: err.detail || err.message || '2FA verification failed', + status: err.status + } + } + }) + + ipcMain.handle('api-request', async (_event, method: string, endpoint: string, data?: unknown) => { + try { + let response + switch (method.toUpperCase()) { + case 'GET': + response = await apiClient.get(endpoint) + break + case 'POST': + response = await apiClient.post(endpoint, data) + break + case 'PUT': + response = await apiClient.put(endpoint, data) + break + case 'PATCH': + response = await apiClient.patch(endpoint, data) + break + case 'DELETE': + response = await apiClient.delete(endpoint) + break + default: + throw new Error(`Unknown method: ${method}`) + } + return { success: true, data: response.data } + } catch (error: unknown) { + const err = error as { status?: number; message?: string; detail?: unknown } + return { + success: false, + error: err.detail || err.message || 'Request failed', + status: err.status + } + } + }) +} diff --git a/desktop/src/main/storeTypes.ts b/desktop/src/main/storeTypes.ts new file mode 100644 index 0000000..49775c5 --- /dev/null +++ b/desktop/src/main/storeTypes.ts @@ -0,0 +1,28 @@ +import Store from 'electron-store' +import type { AppSettings, TrackedGame } from '../shared/types' + +export interface GameTrackingData { + totalTime: number + sessions: Array<{ + startTime: number + endTime: number + duration: number + }> + lastPlayed: number +} + +export type StoreType = Store<{ + settings: AppSettings + token: string | null + trackedGames: Record + trackingData: Record +}> + +// Extend Electron App type +declare global { + namespace Electron { + interface App { + isQuitting?: boolean + } + } +} diff --git a/desktop/src/main/tracking/processTracker.ts b/desktop/src/main/tracking/processTracker.ts new file mode 100644 index 0000000..ac51fce --- /dev/null +++ b/desktop/src/main/tracking/processTracker.ts @@ -0,0 +1,284 @@ +import { exec } from 'child_process' +import { promisify } from 'util' +import type { TrackedProcess, TrackingStats, TrackedGame } from '../../shared/types' +import type { StoreType } from '../storeTypes' +import { updateGameTime, getTrackedGames } from './timeStorage' +import { updateTrayMenu } from '../tray' + +const execAsync = promisify(exec) + +interface ProcessInfo { + ProcessName: string + MainWindowTitle: string + Id: number +} + +export async function getRunningProcesses(): Promise { + try { + const { stdout } = await execAsync( + 'powershell -NoProfile -Command "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-Process | Where-Object {$_.MainWindowTitle} | Select-Object ProcessName, MainWindowTitle, Id | ConvertTo-Json -Compress"', + { encoding: 'utf8', maxBuffer: 10 * 1024 * 1024 } + ) + + if (!stdout.trim()) { + return [] + } + + let processes: ProcessInfo[] + try { + const parsed = JSON.parse(stdout) + processes = Array.isArray(parsed) ? parsed : [parsed] + } catch { + return [] + } + + return processes.map((proc) => ({ + id: proc.Id.toString(), + name: proc.ProcessName, + displayName: proc.MainWindowTitle || proc.ProcessName, + windowTitle: proc.MainWindowTitle, + isGame: isLikelyGame(proc.ProcessName, proc.MainWindowTitle), + })) + } catch (error) { + console.error('Failed to get running processes:', error) + return [] + } +} + +export async function getForegroundWindow(): Promise { + try { + // Use base64 encoded script to avoid escaping issues + const script = ` +Add-Type -TypeDefinition @" +using System; +using System.Runtime.InteropServices; +public class FGWindow { + [DllImport("user32.dll")] + public static extern IntPtr GetForegroundWindow(); + [DllImport("user32.dll")] + public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); +} +"@ +\$hwnd = [FGWindow]::GetForegroundWindow() +\$processId = 0 +[void][FGWindow]::GetWindowThreadProcessId(\$hwnd, [ref]\$processId) +\$proc = Get-Process -Id \$processId -ErrorAction SilentlyContinue +if (\$proc) { Write-Output \$proc.ProcessName } +` + // Encode script as base64 + const base64Script = Buffer.from(script, 'utf16le').toString('base64') + + const { stdout } = await execAsync( + `powershell -NoProfile -ExecutionPolicy Bypass -EncodedCommand ${base64Script}`, + { encoding: 'utf8', timeout: 5000 } + ) + + const result = stdout.trim() + return result || null + } catch (error) { + console.error('[getForegroundWindow] Error:', error) + return null + } +} + +function isLikelyGame(processName: string, windowTitle: string): boolean { + const gameIndicators = [ + 'game', 'steam', 'epic', 'uplay', 'origin', 'battle.net', + 'unity', 'unreal', 'godot', 'ue4', 'ue5', + ] + + const lowerName = processName.toLowerCase() + const lowerTitle = (windowTitle || '').toLowerCase() + + // Check for common game launchers/engines + for (const indicator of gameIndicators) { + if (lowerName.includes(indicator) || lowerTitle.includes(indicator)) { + return true + } + } + + // Exclude common non-game processes + const nonGameProcesses = [ + 'explorer', 'chrome', 'firefox', 'edge', 'opera', 'brave', + 'code', 'idea', 'webstorm', 'pycharm', 'rider', + 'discord', 'slack', 'teams', 'zoom', 'telegram', + 'spotify', 'vlc', 'foobar', 'winamp', + 'notepad', 'word', 'excel', 'powerpoint', 'outlook', + 'cmd', 'powershell', 'terminal', 'windowsterminal', + ] + + for (const nonGame of nonGameProcesses) { + if (lowerName.includes(nonGame)) { + return false + } + } + + return true +} + +interface GameEvent { + gameName: string + gameId: string + duration?: number +} + +export class ProcessTracker { + private intervalId: NodeJS.Timeout | null = null + private currentGame: string | null = null + private currentGameName: string | null = null + private sessionStart: number | null = null + private store: StoreType + private onUpdate: (stats: TrackingStats) => void + private onGameStarted: (event: GameEvent) => void + private onGameStopped: (event: GameEvent) => void + + constructor( + store: StoreType, + onUpdate: (stats: TrackingStats) => void, + onGameStarted?: (event: GameEvent) => void, + onGameStopped?: (event: GameEvent) => void + ) { + this.store = store + this.onUpdate = onUpdate + this.onGameStarted = onGameStarted || (() => {}) + this.onGameStopped = onGameStopped || (() => {}) + } + + start() { + const settings = this.store.get('settings') + const interval = settings.trackingInterval || 5000 + + this.intervalId = setInterval(() => this.tick(), interval) + console.log(`Process tracker started with ${interval}ms interval`) + } + + stop() { + if (this.intervalId) { + clearInterval(this.intervalId) + this.intervalId = null + } + + // End current session if any + if (this.currentGame && this.sessionStart) { + const duration = Date.now() - this.sessionStart + updateGameTime(this.store, this.currentGame, duration) + } + + this.currentGame = null + this.sessionStart = null + console.log('Process tracker stopped') + } + + private async tick() { + const foregroundProcess = await getForegroundWindow() + const trackedGames = getTrackedGames(this.store) + + // Debug logging - ALWAYS log + console.log('[Tracker] Foreground:', foregroundProcess || 'NULL', '| Tracked:', trackedGames.length, 'games:', trackedGames.map(g => g.executableName).join(', ') || 'none') + + // Find if foreground process matches any tracked game + let matchedGame: TrackedGame | null = null + if (foregroundProcess) { + const lowerForeground = foregroundProcess.toLowerCase().replace('.exe', '') + for (const game of trackedGames) { + const lowerExe = game.executableName.toLowerCase().replace('.exe', '') + // More flexible matching + const matches = lowerForeground === lowerExe || + lowerForeground.includes(lowerExe) || + lowerExe.includes(lowerForeground) + if (matches) { + console.log('[Tracker] MATCH:', foregroundProcess, '===', game.executableName) + matchedGame = game + break + } + } + } + + // Handle game state changes + if (matchedGame && matchedGame.id !== this.currentGame) { + // New game started + if (this.currentGame && this.sessionStart && this.currentGameName) { + // End previous session + const duration = Date.now() - this.sessionStart + updateGameTime(this.store, this.currentGame, duration) + // Emit game stopped event for previous game + this.onGameStopped({ + gameName: this.currentGameName, + gameId: this.currentGame, + duration + }) + } + + this.currentGame = matchedGame.id + this.currentGameName = matchedGame.name + this.sessionStart = Date.now() + console.log(`Started tracking: ${matchedGame.name}`) + updateTrayMenu(null, true, matchedGame.name) + // Emit game started event + this.onGameStarted({ + gameName: matchedGame.name, + gameId: matchedGame.id + }) + } else if (!matchedGame && this.currentGame) { + // Game stopped + if (this.sessionStart) { + const duration = Date.now() - this.sessionStart + updateGameTime(this.store, this.currentGame, duration) + // Emit game stopped event + if (this.currentGameName) { + this.onGameStopped({ + gameName: this.currentGameName, + gameId: this.currentGame, + duration + }) + } + } + + console.log(`Stopped tracking: ${this.currentGame}`) + this.currentGame = null + this.currentGameName = null + this.sessionStart = null + updateTrayMenu(null, false) + } + + // Emit update + const stats = this.getStats() + this.onUpdate(stats) + } + + private getStats(): TrackingStats { + const trackedGames = getTrackedGames(this.store) + const now = Date.now() + const todayStart = new Date().setHours(0, 0, 0, 0) + const weekStart = now - 7 * 24 * 60 * 60 * 1000 + const monthStart = now - 30 * 24 * 60 * 60 * 1000 + + let totalTimeToday = 0 + let totalTimeWeek = 0 + let totalTimeMonth = 0 + + // Add current session time if active + if (this.currentGame && this.sessionStart) { + const currentSessionTime = now - this.sessionStart + totalTimeToday += currentSessionTime + totalTimeWeek += currentSessionTime + totalTimeMonth += currentSessionTime + } + + // This is a simplified version - full implementation would track sessions with timestamps + for (const game of trackedGames) { + totalTimeMonth += game.totalTime + // For simplicity, assume all recorded time is from this week/today + // A full implementation would store session timestamps + } + + return { + totalTimeToday, + totalTimeWeek, + totalTimeMonth, + sessions: [], + currentGame: this.currentGameName, + currentSessionDuration: this.currentGame && this.sessionStart ? now - this.sessionStart : 0, + } + } +} diff --git a/desktop/src/main/tracking/steamIntegration.ts b/desktop/src/main/tracking/steamIntegration.ts new file mode 100644 index 0000000..83f3ab8 --- /dev/null +++ b/desktop/src/main/tracking/steamIntegration.ts @@ -0,0 +1,215 @@ +import * as fs from 'fs' +import * as path from 'path' +import type { SteamGame } from '../../shared/types' + +// Common Steam installation paths on Windows +const STEAM_PATHS = [ + 'C:\\Program Files (x86)\\Steam', + 'C:\\Program Files\\Steam', + 'D:\\Steam', + 'D:\\SteamLibrary', + 'E:\\Steam', + 'E:\\SteamLibrary', +] + +let cachedSteamPath: string | null = null + +export function getSteamPath(): string | null { + if (cachedSteamPath) { + return cachedSteamPath + } + + // Try common paths + for (const steamPath of STEAM_PATHS) { + if (fs.existsSync(path.join(steamPath, 'steam.exe')) || + fs.existsSync(path.join(steamPath, 'steamapps'))) { + cachedSteamPath = steamPath + return steamPath + } + } + + // Try to find via registry (would require node-winreg or similar) + // For now, just check common paths + + return null +} + +export async function getSteamGames(): Promise { + const steamPath = getSteamPath() + if (!steamPath) { + console.log('Steam not found') + return [] + } + + const games: SteamGame[] = [] + const libraryPaths = await getLibraryPaths(steamPath) + + for (const libraryPath of libraryPaths) { + const steamAppsPath = path.join(libraryPath, 'steamapps') + if (!fs.existsSync(steamAppsPath)) continue + + try { + const files = fs.readdirSync(steamAppsPath) + const manifests = files.filter((f) => f.startsWith('appmanifest_') && f.endsWith('.acf')) + + for (const manifest of manifests) { + const game = await parseAppManifest(path.join(steamAppsPath, manifest), libraryPath) + if (game) { + games.push(game) + } + } + } catch (error) { + console.error(`Error reading steam apps from ${steamAppsPath}:`, error) + } + } + + return games.sort((a, b) => a.name.localeCompare(b.name)) +} + +async function getLibraryPaths(steamPath: string): Promise { + const paths: string[] = [steamPath] + const libraryFoldersPath = path.join(steamPath, 'steamapps', 'libraryfolders.vdf') + + if (!fs.existsSync(libraryFoldersPath)) { + return paths + } + + try { + const content = fs.readFileSync(libraryFoldersPath, 'utf8') + const libraryPaths = parseLibraryFolders(content) + paths.push(...libraryPaths.filter((p) => !paths.includes(p))) + } catch (error) { + console.error('Error reading library folders:', error) + } + + return paths +} + +function parseLibraryFolders(content: string): string[] { + const paths: string[] = [] + + // Simple VDF parser for library folders + // Format: "path" "C:\\SteamLibrary" + const pathRegex = /"path"\s+"([^"]+)"/g + let match + + while ((match = pathRegex.exec(content)) !== null) { + const libPath = match[1].replace(/\\\\/g, '\\') + if (fs.existsSync(libPath)) { + paths.push(libPath) + } + } + + return paths +} + +async function parseAppManifest(manifestPath: string, libraryPath: string): Promise { + try { + const content = fs.readFileSync(manifestPath, 'utf8') + + const appIdMatch = content.match(/"appid"\s+"(\d+)"/) + const nameMatch = content.match(/"name"\s+"([^"]+)"/) + const installDirMatch = content.match(/"installdir"\s+"([^"]+)"/) + + if (!appIdMatch || !nameMatch || !installDirMatch) { + return null + } + + const appId = appIdMatch[1] + const name = nameMatch[1] + const installDir = installDirMatch[1] + + // Filter out tools, servers, etc. + const skipTypes = ['Tool', 'Config', 'DLC', 'Music', 'Video'] + const typeMatch = content.match(/"type"\s+"([^"]+)"/) + if (typeMatch && skipTypes.includes(typeMatch[1])) { + return null + } + + const fullInstallPath = path.join(libraryPath, 'steamapps', 'common', installDir) + let executable: string | undefined + + // Try to find main executable + if (fs.existsSync(fullInstallPath)) { + executable = findMainExecutable(fullInstallPath, name) + } + + return { + appId, + name, + installDir: fullInstallPath, + executable, + iconPath: getGameIconPath(steamPath, appId), + } + } catch (error) { + console.error(`Error parsing manifest ${manifestPath}:`, error) + return null + } +} + +function findMainExecutable(installPath: string, gameName: string): string | undefined { + try { + const files = fs.readdirSync(installPath) + const exeFiles = files.filter((f) => f.endsWith('.exe')) + + if (exeFiles.length === 0) { + // Check subdirectories (one level deep) + for (const dir of files) { + const subPath = path.join(installPath, dir) + if (fs.statSync(subPath).isDirectory()) { + const subFiles = fs.readdirSync(subPath) + const subExe = subFiles.filter((f) => f.endsWith('.exe')) + exeFiles.push(...subExe.map((f) => path.join(dir, f))) + } + } + } + + if (exeFiles.length === 0) return undefined + + // Try to find exe that matches game name + const lowerName = gameName.toLowerCase().replace(/[^a-z0-9]/g, '') + for (const exe of exeFiles) { + const lowerExe = exe.toLowerCase().replace(/[^a-z0-9]/g, '') + if (lowerExe.includes(lowerName) || lowerName.includes(lowerExe.replace('.exe', ''))) { + return exe + } + } + + // Filter out common non-game executables + const skipExes = [ + 'unins', 'setup', 'install', 'config', 'crash', 'report', + 'launcher', 'updater', 'redistributable', 'vcredist', 'directx', + 'dxsetup', 'ue4prereqsetup', 'dotnet', + ] + + const gameExes = exeFiles.filter((exe) => { + const lower = exe.toLowerCase() + return !skipExes.some((skip) => lower.includes(skip)) + }) + + return gameExes[0] || exeFiles[0] + } catch { + return undefined + } +} + +function getGameIconPath(steamPath: string | null, appId: string): string | undefined { + if (!steamPath) return undefined + + // Steam stores icons in appcache/librarycache + const iconPath = path.join(steamPath, 'appcache', 'librarycache', `${appId}_icon.jpg`) + if (fs.existsSync(iconPath)) { + return iconPath + } + + // Try header image + const headerPath = path.join(steamPath, 'appcache', 'librarycache', `${appId}_header.jpg`) + if (fs.existsSync(headerPath)) { + return headerPath + } + + return undefined +} + +// Re-export for use +const steamPath = getSteamPath() diff --git a/desktop/src/main/tracking/timeStorage.ts b/desktop/src/main/tracking/timeStorage.ts new file mode 100644 index 0000000..718f4e5 --- /dev/null +++ b/desktop/src/main/tracking/timeStorage.ts @@ -0,0 +1,155 @@ +import type { TrackedGame, TrackingStats, GameSession } from '../../shared/types' +import type { StoreType, GameTrackingData } from '../storeTypes' + +export type { GameTrackingData } + +export function getTrackedGames(store: StoreType): TrackedGame[] { + const trackedGames = store.get('trackedGames') || {} + return Object.values(trackedGames) +} + +export function addTrackedGame( + store: StoreType, + game: Omit +): TrackedGame { + const trackedGames = store.get('trackedGames') || {} + + const newGame: TrackedGame = { + ...game, + totalTime: 0, + lastPlayed: undefined, + } + + trackedGames[game.id] = newGame + store.set('trackedGames', trackedGames) + + // Initialize tracking data + const trackingData = store.get('trackingData') || {} + trackingData[game.id] = { + totalTime: 0, + sessions: [], + lastPlayed: 0, + } + store.set('trackingData', trackingData) + + return newGame +} + +export function removeTrackedGame(store: StoreType, gameId: string): void { + const trackedGames = store.get('trackedGames') || {} + delete trackedGames[gameId] + store.set('trackedGames', trackedGames) + + const trackingData = store.get('trackingData') || {} + delete trackingData[gameId] + store.set('trackingData', trackingData) +} + +export function updateGameTime(store: StoreType, gameId: string, duration: number): void { + // Update tracked games + const trackedGames = store.get('trackedGames') || {} + if (trackedGames[gameId]) { + trackedGames[gameId].totalTime += duration + trackedGames[gameId].lastPlayed = Date.now() + store.set('trackedGames', trackedGames) + } + + // Update tracking data with session + const trackingData = store.get('trackingData') || {} + if (!trackingData[gameId]) { + trackingData[gameId] = { + totalTime: 0, + sessions: [], + lastPlayed: 0, + } + } + + const now = Date.now() + trackingData[gameId].totalTime += duration + trackingData[gameId].lastPlayed = now + trackingData[gameId].sessions.push({ + startTime: now - duration, + endTime: now, + duration, + }) + + // Keep only last 100 sessions to prevent data bloat + if (trackingData[gameId].sessions.length > 100) { + trackingData[gameId].sessions = trackingData[gameId].sessions.slice(-100) + } + + store.set('trackingData', trackingData) +} + +export function getTrackingStats(store: StoreType): TrackingStats { + const trackingData = store.get('trackingData') || {} + const now = Date.now() + + const todayStart = new Date().setHours(0, 0, 0, 0) + const weekStart = now - 7 * 24 * 60 * 60 * 1000 + const monthStart = now - 30 * 24 * 60 * 60 * 1000 + + let totalTimeToday = 0 + let totalTimeWeek = 0 + let totalTimeMonth = 0 + const recentSessions: GameSession[] = [] + + for (const [gameId, data] of Object.entries(trackingData)) { + for (const session of data.sessions) { + if (session.endTime >= monthStart) { + totalTimeMonth += session.duration + + if (session.endTime >= weekStart) { + totalTimeWeek += session.duration + } + + if (session.endTime >= todayStart) { + totalTimeToday += session.duration + } + } + } + + // Get last session for each game + if (data.sessions.length > 0) { + const lastSession = data.sessions[data.sessions.length - 1] + const trackedGames = store.get('trackedGames') || {} + const game = trackedGames[gameId] + + if (game && lastSession.endTime >= weekStart) { + recentSessions.push({ + gameId, + gameName: game.name, + startTime: lastSession.startTime, + endTime: lastSession.endTime, + duration: lastSession.duration, + isActive: false, + }) + } + } + } + + // Sort by most recent + recentSessions.sort((a, b) => (b.endTime || 0) - (a.endTime || 0)) + + return { + totalTimeToday, + totalTimeWeek, + totalTimeMonth, + sessions: recentSessions.slice(0, 10), + } +} + +export function formatTime(ms: number): string { + const seconds = Math.floor(ms / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + + if (hours > 0) { + const remainingMinutes = minutes % 60 + return `${hours}ч ${remainingMinutes}м` + } else if (minutes > 0) { + return `${minutes}м` + } else { + return `${seconds}с` + } +} diff --git a/desktop/src/main/tray.ts b/desktop/src/main/tray.ts new file mode 100644 index 0000000..b1f164d --- /dev/null +++ b/desktop/src/main/tray.ts @@ -0,0 +1,115 @@ +import { Tray, Menu, nativeImage, BrowserWindow, app, NativeImage } from 'electron' +import * as path from 'path' +import type { StoreType } from './storeTypes' + +let tray: Tray | null = null + +export function setupTray( + mainWindow: BrowserWindow | null, + store: StoreType +) { + const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged + + // In dev: __dirname is dist/main/main/, in prod: same + const iconPath = isDev + ? path.join(__dirname, '../../../resources/icon.ico') + : path.join(__dirname, '../../../resources/icon.ico') + + // Create tray icon + let trayIcon: NativeImage + try { + trayIcon = nativeImage.createFromPath(iconPath) + if (trayIcon.isEmpty()) { + trayIcon = nativeImage.createEmpty() + } + } catch { + trayIcon = nativeImage.createEmpty() + } + + // Resize for tray (16x16 on Windows) + if (!trayIcon.isEmpty()) { + trayIcon = trayIcon.resize({ width: 16, height: 16 }) + } + + tray = new Tray(trayIcon) + tray.setToolTip('Game Marathon Tracker') + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Открыть', + click: () => { + mainWindow?.show() + mainWindow?.focus() + }, + }, + { type: 'separator' }, + { + label: 'Статус: Отслеживание', + enabled: false, + }, + { type: 'separator' }, + { + label: 'Выход', + click: () => { + app.isQuitting = true + app.quit() + }, + }, + ]) + + tray.setContextMenu(contextMenu) + + // Double-click to show window + tray.on('double-click', () => { + mainWindow?.show() + mainWindow?.focus() + }) + + return tray +} + +export function updateTrayMenu( + mainWindow: BrowserWindow | null, + isTracking: boolean, + currentGame?: string +) { + if (!tray) return + + const statusLabel = isTracking + ? `Отслеживание: ${currentGame || 'Активно'}` + : 'Отслеживание: Неактивно' + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Открыть', + click: () => { + mainWindow?.show() + mainWindow?.focus() + }, + }, + { type: 'separator' }, + { + label: statusLabel, + enabled: false, + }, + { type: 'separator' }, + { + label: 'Выход', + click: () => { + app.isQuitting = true + app.quit() + }, + }, + ]) + + tray.setContextMenu(contextMenu) +} + +export function destroyTray() { + if (tray) { + tray.destroy() + tray = null + } +} + +export { tray } diff --git a/desktop/src/main/updater.ts b/desktop/src/main/updater.ts new file mode 100644 index 0000000..91da0e5 --- /dev/null +++ b/desktop/src/main/updater.ts @@ -0,0 +1,187 @@ +import { autoUpdater } from 'electron-updater' +import { BrowserWindow, ipcMain, app } from 'electron' +import * as path from 'path' + +let splashWindow: BrowserWindow | null = null + +export function createSplashWindow(): BrowserWindow { + splashWindow = new BrowserWindow({ + width: 350, + height: 250, + frame: false, + transparent: false, + resizable: false, + center: true, + backgroundColor: '#0d0e14', + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + }, + }) + + const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged + + if (isDev) { + // In dev mode: __dirname is dist/main/main/, need to go up 3 levels to project root + splashWindow.loadFile(path.join(__dirname, '../../../src/renderer/splash.html')) + } else { + // In production: __dirname is dist/main/main/, so go up twice to dist/renderer/ + splashWindow.loadFile(path.join(__dirname, '../../renderer/splash.html')) + } + + return splashWindow +} + +export function closeSplashWindow() { + if (splashWindow) { + splashWindow.close() + splashWindow = null + } +} + +function sendStatusToSplash(status: string) { + if (splashWindow) { + splashWindow.webContents.send('update-status', status) + } +} + +function sendProgressToSplash(percent: number) { + if (splashWindow) { + splashWindow.webContents.send('update-progress', percent) + } +} + +export function setupAutoUpdater(onComplete: () => void) { + const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged + + // In development, skip update check + if (isDev) { + console.log('[Updater] Skipping update check in development mode') + sendStatusToSplash('Режим разработки') + setTimeout(() => { + closeSplashWindow() + onComplete() + }, 1500) + return + } + + // Configure auto-updater + autoUpdater.autoDownload = true + autoUpdater.autoInstallOnAppQuit = true + + // Check for updates + autoUpdater.on('checking-for-update', () => { + console.log('[Updater] Checking for updates...') + sendStatusToSplash('Проверка обновлений...') + }) + + autoUpdater.on('update-available', (info) => { + console.log('[Updater] Update available:', info.version) + sendStatusToSplash(`Найдено обновление v${info.version}`) + }) + + autoUpdater.on('update-not-available', () => { + console.log('[Updater] No updates available') + sendStatusToSplash('Актуальная версия') + setTimeout(() => { + closeSplashWindow() + onComplete() + }, 1000) + }) + + autoUpdater.on('download-progress', (progress) => { + const percent = Math.round(progress.percent) + console.log(`[Updater] Download progress: ${percent}%`) + sendStatusToSplash(`Загрузка обновления... ${percent}%`) + sendProgressToSplash(percent) + }) + + autoUpdater.on('update-downloaded', (info) => { + console.log('[Updater] Update downloaded:', info.version) + sendStatusToSplash('Установка обновления...') + // Install and restart + setTimeout(() => { + autoUpdater.quitAndInstall(false, true) + }, 1500) + }) + + autoUpdater.on('error', (error) => { + console.error('[Updater] Error:', error) + sendStatusToSplash('Ошибка проверки обновлений') + setTimeout(() => { + closeSplashWindow() + onComplete() + }, 2000) + }) + + // Start checking + autoUpdater.checkForUpdates().catch((error) => { + console.error('[Updater] Failed to check for updates:', error) + sendStatusToSplash('Не удалось проверить обновления') + setTimeout(() => { + closeSplashWindow() + onComplete() + }, 2000) + }) +} + +// Manual check for updates (from settings) +export function checkForUpdatesManual(): Promise<{ available: boolean; version?: string; error?: string }> { + return new Promise((resolve) => { + const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged + + if (isDev) { + resolve({ available: false, error: 'В режиме разработки обновления недоступны' }) + return + } + + const onUpdateAvailable = (info: { version: string }) => { + cleanup() + resolve({ available: true, version: info.version }) + } + + const onUpdateNotAvailable = () => { + cleanup() + resolve({ available: false }) + } + + const onError = (error: Error) => { + cleanup() + resolve({ available: false, error: error.message }) + } + + const cleanup = () => { + autoUpdater.off('update-available', onUpdateAvailable) + autoUpdater.off('update-not-available', onUpdateNotAvailable) + autoUpdater.off('error', onError) + } + + autoUpdater.on('update-available', onUpdateAvailable) + autoUpdater.on('update-not-available', onUpdateNotAvailable) + autoUpdater.on('error', onError) + + autoUpdater.checkForUpdates().catch((error) => { + cleanup() + resolve({ available: false, error: error.message }) + }) + }) +} + +// Setup IPC handlers for updates +export function setupUpdateIpcHandlers() { + ipcMain.handle('get-app-version', () => { + return app.getVersion() + }) + + ipcMain.handle('check-for-updates', async () => { + return await checkForUpdatesManual() + }) + + ipcMain.handle('download-update', () => { + autoUpdater.downloadUpdate() + }) + + ipcMain.handle('install-update', () => { + autoUpdater.quitAndInstall(false, true) + }) +} diff --git a/desktop/src/preload/index.ts b/desktop/src/preload/index.ts new file mode 100644 index 0000000..059aee5 --- /dev/null +++ b/desktop/src/preload/index.ts @@ -0,0 +1,96 @@ +import { contextBridge, ipcRenderer } from 'electron' +import type { AppSettings, TrackedProcess, SteamGame, TrackedGame, TrackingStats, User, LoginResponse } from '../shared/types' + +interface ApiResult { + success: boolean + data?: T + error?: string + status?: number +} + +// Expose protected methods that allow the renderer process to use +// ipcRenderer without exposing the entire object +const electronAPI = { + // Settings + getSettings: (): Promise => ipcRenderer.invoke('get-settings'), + saveSettings: (settings: Partial): Promise => + ipcRenderer.invoke('save-settings', settings), + + // Auth (local storage) + getToken: (): Promise => ipcRenderer.invoke('get-token'), + saveToken: (token: string): Promise => ipcRenderer.invoke('save-token', token), + clearToken: (): Promise => ipcRenderer.invoke('clear-token'), + + // API calls (through main process - no CORS) + apiLogin: (login: string, password: string): Promise> => + ipcRenderer.invoke('api-login', login, password), + api2faVerify: (sessionId: number, code: string): Promise> => + ipcRenderer.invoke('api-2fa-verify', sessionId, code), + apiGetMe: (): Promise> => + ipcRenderer.invoke('api-get-me'), + apiRequest: (method: string, endpoint: string, data?: unknown): Promise> => + ipcRenderer.invoke('api-request', method, endpoint, data), + + // Process tracking + getRunningProcesses: (): Promise => + ipcRenderer.invoke('get-running-processes'), + getForegroundWindow: (): Promise => + ipcRenderer.invoke('get-foreground-window'), + getTrackingStats: (): Promise => + ipcRenderer.invoke('get-tracking-stats'), + + // Steam + getSteamGames: (): Promise => ipcRenderer.invoke('get-steam-games'), + getSteamPath: (): Promise => ipcRenderer.invoke('get-steam-path'), + + // Tracked games + getTrackedGames: (): Promise => ipcRenderer.invoke('get-tracked-games'), + addTrackedGame: (game: Omit): Promise => + ipcRenderer.invoke('add-tracked-game', game), + removeTrackedGame: (gameId: string): Promise => + ipcRenderer.invoke('remove-tracked-game', gameId), + + // Window controls + minimizeToTray: (): void => ipcRenderer.send('minimize-to-tray'), + quitApp: (): void => ipcRenderer.send('quit-app'), + + // Monitoring control + startMonitoring: (): Promise => ipcRenderer.invoke('start-monitoring'), + stopMonitoring: (): Promise => ipcRenderer.invoke('stop-monitoring'), + getMonitoringStatus: (): Promise => ipcRenderer.invoke('get-monitoring-status'), + + // Updates + getAppVersion: (): Promise => ipcRenderer.invoke('get-app-version'), + checkForUpdates: (): Promise<{ available: boolean; version?: string; error?: string }> => + ipcRenderer.invoke('check-for-updates'), + installUpdate: (): Promise => ipcRenderer.invoke('install-update'), + + // Events + onTrackingUpdate: (callback: (stats: TrackingStats) => void) => { + const subscription = (_event: Electron.IpcRendererEvent, stats: TrackingStats) => callback(stats) + ipcRenderer.on('tracking-update', subscription) + return () => ipcRenderer.removeListener('tracking-update', subscription) + }, + + onGameStarted: (callback: (gameName: string, gameId: string) => void) => { + const subscription = (_event: Electron.IpcRendererEvent, gameName: string, gameId: string) => callback(gameName, gameId) + ipcRenderer.on('game-started', subscription) + return () => ipcRenderer.removeListener('game-started', subscription) + }, + + onGameStopped: (callback: (gameName: string, duration: number) => void) => { + const subscription = (_event: Electron.IpcRendererEvent, gameName: string, duration: number) => + callback(gameName, duration) + ipcRenderer.on('game-stopped', subscription) + return () => ipcRenderer.removeListener('game-stopped', subscription) + }, +} + +contextBridge.exposeInMainWorld('electronAPI', electronAPI) + +// Type declaration for renderer process +declare global { + interface Window { + electronAPI: typeof electronAPI + } +} diff --git a/desktop/src/renderer/App.tsx b/desktop/src/renderer/App.tsx new file mode 100644 index 0000000..64f38ef --- /dev/null +++ b/desktop/src/renderer/App.tsx @@ -0,0 +1,65 @@ +import { Routes, Route, Navigate } from 'react-router-dom' +import { useEffect } from 'react' +import { useAuthStore } from './store/auth' +import { Layout } from './components/Layout' +import { LoginPage } from './pages/LoginPage' +import { DashboardPage } from './pages/DashboardPage' +import { SettingsPage } from './pages/SettingsPage' +import { GamesPage } from './pages/GamesPage' + +function ProtectedRoute({ children }: { children: React.ReactNode }) { + const { isAuthenticated, isLoading } = useAuthStore() + + if (isLoading) { + return ( +
+
+
+ ) + } + + if (!isAuthenticated) { + return + } + + return {children} +} + +export default function App() { + const { syncUser } = useAuthStore() + + useEffect(() => { + syncUser() + }, [syncUser]) + + return ( + + } /> + + + + } + /> + + + + } + /> + + + + } + /> + } /> + + ) +} diff --git a/desktop/src/renderer/components/Layout.tsx b/desktop/src/renderer/components/Layout.tsx new file mode 100644 index 0000000..37e22c7 --- /dev/null +++ b/desktop/src/renderer/components/Layout.tsx @@ -0,0 +1,70 @@ +import { ReactNode } from 'react' +import { NavLink, useLocation } from 'react-router-dom' +import { Gamepad2, Settings, LayoutDashboard, X, Minus } from 'lucide-react' +import { clsx } from 'clsx' + +interface LayoutProps { + children: ReactNode +} + +export function Layout({ children }: LayoutProps) { + const location = useLocation() + + const navItems = [ + { path: '/', icon: LayoutDashboard, label: 'Главная' }, + { path: '/games', icon: Gamepad2, label: 'Игры' }, + { path: '/settings', icon: Settings, label: 'Настройки' }, + ] + + return ( +
+ {/* Custom title bar */} +
+
+ + Game Marathon Tracker +
+
+ + +
+
+ + {/* Main content */} +
{children}
+ + {/* Bottom navigation */} + +
+ ) +} diff --git a/desktop/src/renderer/components/ui/GlassCard.tsx b/desktop/src/renderer/components/ui/GlassCard.tsx new file mode 100644 index 0000000..b385805 --- /dev/null +++ b/desktop/src/renderer/components/ui/GlassCard.tsx @@ -0,0 +1,40 @@ +import { type ReactNode, type HTMLAttributes } from 'react' +import { clsx } from 'clsx' + +interface GlassCardProps extends HTMLAttributes { + children: ReactNode + variant?: 'default' | 'dark' | 'neon' + hover?: boolean + glow?: boolean + className?: string +} + +export function GlassCard({ + children, + variant = 'default', + hover = false, + glow = false, + className, + ...props +}: GlassCardProps) { + const variantClasses = { + default: 'glass', + dark: 'glass-dark', + neon: 'glass-neon', + } + + return ( +
+ {children} +
+ ) +} diff --git a/desktop/src/renderer/components/ui/Input.tsx b/desktop/src/renderer/components/ui/Input.tsx new file mode 100644 index 0000000..6365ab1 --- /dev/null +++ b/desktop/src/renderer/components/ui/Input.tsx @@ -0,0 +1,48 @@ +import { forwardRef, type InputHTMLAttributes } from 'react' +import { clsx } from 'clsx' + +interface InputProps extends InputHTMLAttributes { + label?: string + error?: string + icon?: React.ReactNode +} + +export const Input = forwardRef( + ({ className, label, error, icon, ...props }, ref) => { + return ( +
+ {label && ( + + )} +
+ {icon && ( +
+ {icon} +
+ )} + +
+ {error && ( +

{error}

+ )} +
+ ) + } +) + +Input.displayName = 'Input' diff --git a/desktop/src/renderer/components/ui/NeonButton.tsx b/desktop/src/renderer/components/ui/NeonButton.tsx new file mode 100644 index 0000000..4bb0d1a --- /dev/null +++ b/desktop/src/renderer/components/ui/NeonButton.tsx @@ -0,0 +1,118 @@ +import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react' +import { clsx } from 'clsx' +import { Loader2 } from 'lucide-react' + +interface NeonButtonProps extends ButtonHTMLAttributes { + variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' + size?: 'sm' | 'md' | 'lg' + color?: 'neon' | 'purple' | 'pink' + isLoading?: boolean + icon?: ReactNode + iconPosition?: 'left' | 'right' + glow?: boolean +} + +export const NeonButton = forwardRef( + ( + { + className, + variant = 'primary', + size = 'md', + color = 'neon', + isLoading, + icon, + iconPosition = 'left', + glow = true, + children, + disabled, + ...props + }, + ref + ) => { + const colorMap = { + neon: { + primary: 'bg-neon-500 hover:bg-neon-400 text-dark-900', + secondary: 'bg-dark-600 hover:bg-dark-500 text-neon-400 border border-neon-500/30', + outline: 'bg-transparent border-2 border-neon-500 text-neon-500 hover:bg-neon-500 hover:text-dark-900', + ghost: 'bg-transparent hover:bg-neon-500/10 text-neon-400', + danger: 'bg-red-600 hover:bg-red-700 text-white', + glow: '0 0 12px rgba(34, 211, 238, 0.4)', + glowHover: '0 0 18px rgba(34, 211, 238, 0.55)', + }, + purple: { + primary: 'bg-accent-500 hover:bg-accent-400 text-white', + secondary: 'bg-dark-600 hover:bg-dark-500 text-accent-400 border border-accent-500/30', + outline: 'bg-transparent border-2 border-accent-500 text-accent-500 hover:bg-accent-500 hover:text-white', + ghost: 'bg-transparent hover:bg-accent-500/10 text-accent-400', + danger: 'bg-red-600 hover:bg-red-700 text-white', + glow: '0 0 12px rgba(139, 92, 246, 0.4)', + glowHover: '0 0 18px rgba(139, 92, 246, 0.55)', + }, + pink: { + primary: 'bg-pink-500 hover:bg-pink-400 text-white', + secondary: 'bg-dark-600 hover:bg-dark-500 text-pink-400 border border-pink-500/30', + outline: 'bg-transparent border-2 border-pink-500 text-pink-500 hover:bg-pink-500 hover:text-white', + ghost: 'bg-transparent hover:bg-pink-500/10 text-pink-400', + danger: 'bg-red-600 hover:bg-red-700 text-white', + glow: '0 0 12px rgba(244, 114, 182, 0.4)', + glowHover: '0 0 18px rgba(244, 114, 182, 0.55)', + }, + } + + const iconSizes = { + sm: 'w-4 h-4', + md: 'w-5 h-5', + lg: 'w-6 h-6', + } + + const sizeClasses = { + sm: 'px-3 py-1.5 text-sm gap-1.5', + md: 'px-4 py-2.5 text-base gap-2', + lg: 'px-6 py-3 text-lg gap-2.5', + } + + const colors = colorMap[color] + + return ( + + ) + } +) + +NeonButton.displayName = 'NeonButton' diff --git a/desktop/src/renderer/index.css b/desktop/src/renderer/index.css new file mode 100644 index 0000000..a295133 --- /dev/null +++ b/desktop/src/renderer/index.css @@ -0,0 +1,134 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #14161e; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: #252732; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #2e313d; +} + +/* Glass effect */ +.glass { + background: rgba(20, 22, 30, 0.8); + backdrop-filter: blur(12px); + border: 1px solid rgba(34, 211, 238, 0.1); +} + +.glass-dark { + background: rgba(13, 14, 20, 0.9); + backdrop-filter: blur(16px); + border: 1px solid rgba(34, 211, 238, 0.08); +} + +.glass-neon { + background: rgba(20, 22, 30, 0.85); + backdrop-filter: blur(12px); + border: 1px solid rgba(34, 211, 238, 0.2); + box-shadow: 0 0 20px rgba(34, 211, 238, 0.08); +} + +/* Neon glow effect */ +.neon-glow { + box-shadow: 0 0 8px rgba(34, 211, 238, 0.4), 0 0 16px rgba(34, 211, 238, 0.2); +} + +.neon-glow-purple { + box-shadow: 0 0 8px rgba(139, 92, 246, 0.4), 0 0 16px rgba(139, 92, 246, 0.2); +} + +.neon-glow-pulse { + animation: glow-pulse 2s ease-in-out infinite; +} + +/* Gradient border */ +.gradient-border { + position: relative; + background: #14161e; +} + +.gradient-border::before { + content: ''; + position: absolute; + inset: -1px; + padding: 1px; + border-radius: inherit; + background: linear-gradient(135deg, #22d3ee, #8b5cf6, #f472b6); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + opacity: 0.5; +} + +/* Card hover effect */ +.card-hover { + transition: all 0.3s ease; +} + +.card-hover:hover { + transform: translateY(-2px); + border-color: rgba(34, 211, 238, 0.3); + box-shadow: 0 4px 20px rgba(34, 211, 238, 0.1); +} + +/* Title bar drag region */ +.titlebar { + -webkit-app-region: drag; +} + +.titlebar button { + -webkit-app-region: no-drag; +} + +/* Live indicator */ +.live-indicator { + width: 8px; + height: 8px; + background: #22c55e; + border-radius: 50%; + animation: pulse-live 2s infinite; +} + +@keyframes pulse-live { + 0% { + box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7); + } + 70% { + box-shadow: 0 0 0 6px rgba(34, 197, 94, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); + } +} + +/* Input focus styles */ +input:focus { + outline: none; + border-color: rgba(34, 211, 238, 0.5); + box-shadow: 0 0 0 2px rgba(34, 211, 238, 0.1); +} + +/* Selection */ +::selection { + background: rgba(34, 211, 238, 0.3); +} + +/* Transition utilities */ +.transition-all-300 { + transition: all 0.3s ease; +} diff --git a/desktop/src/renderer/index.html b/desktop/src/renderer/index.html new file mode 100644 index 0000000..4a9b434 --- /dev/null +++ b/desktop/src/renderer/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + Game Marathon Tracker + + +
+ + + diff --git a/desktop/src/renderer/logo.jpg b/desktop/src/renderer/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5078d1617871d67e9310042c4ca3bc851166cbdd GIT binary patch literal 53735 zcmeFYWl-Etw=RlnfIt`s9^Bm_K=9x;3^tJ9?(V@YSa5e4U?8|da0|}h?h@QJhyVVt z>plD3XP!@)D3a* zsg0Zf1T@@|lsr-z#?FB?gtVM$z<~H4N%^(!>7-3e9bH_5^3I4Dcr~>W3#Md2Zowf5 z)m`0u{AP7Mual6zP7ja#uWNuqL3o`76&~%iR~+|s39nT&BosKL*LJwqCBIg2ktsP* z@Wj>LQ5iZ0#OF=ob5(Z%s3p`l&bW=7&Iu$n0)OPw)S%K${au86gZMfG7ZDdu4DMT< z)c-I4x&sDexVX3;7*teD@vnt{6T$|D@TifHO)9GEf9v}n8VG}4=P<~p`hO}HUAVY} zrQ!c6k?WCX+hyReX8s-FQWTJ*jAQ5BFOexYu{)I5Y6(<`jkxbjP5qy0O!6@ZD|9usrrOWRTDLnw_q?6946VsBrCzk;A;T^BQC12sdbPCehIqjVd%cxfQ{X+Y{aJsKQ zXPU8?rQ45Nq=1+BKb2gOF|(}5(!$G0`C#8rgBM>)S9>Q_Ft+br3gkLenwF*vEd)*=6FL$YGCSQz8c>Z`?4xBM0RfL@%dd{pQriyCydT~= zUXF@`#{FnEf)W4*7Pccd*#RUWdaoyiXK6PwgGmh+!0?|}YE8>y~_iwk_c z-2Wow_URC?!8dtkDyH2vUUjq|9kY04@Bm?-IqKBEaIq5CVDI1>QRQ+(0$(U!p;+uf zecUsZ&d(_&&XwrGq>|zkiU`YU<MQb*uxSQPIC{*w zyyWARP?UOpi=v!GNPiag&$lkY$-i5;$K$WD3Q;IEX>mw{Y zl`Z{6HGiT&_W29>KkskvSL;Ts`0)dJ&VO^JMl%``g^V3AdGXJaIGw(1H>kHj1>E%m zfQ^SAj~q)ll!$6f7SJ6}(J|&^1@t^g@b+4+qaDD!B_cX26NRL6e8a}EuqI|x4_A4m zAWk&R@7ayrWerut?t++tnbo zLwi`9>JWV#>ChJ)@=k60T$q8eKT-)HO!Y_$roJ5@mp5yzeyF~NLM0o`JKDR!E*RUI zTa=Md1^;mE`?TTu=^0uQ&uJgDvgbX{O2^2{MB`%y7MKQZCbRfbp^$nn(*7c1NVYNw&b&^62q4M>{saJTlC+jK`^X7i62qFVrM-n& zAGSyP>JZycya?L79%ro6Qh=vRK%&+^3fjZ8V&))?=e-pAUkqQOjLggrATJNd?G-t> z;XFB~a6gN0TA2wOq@XKWNcmaXkP$&{eKA5ndW+QbDE4vPq5J5qvQdFTGA(fu;N&k{ zL?1=0V6z*rwPicEX>JhKJagQx0!ozl(2>)#g2fZfX4~Vzitam(<8l06uZ_~9+Bm6KyLr5XZsb!zB z@l-xzbvJ@$dMI;$MNHN^i6a3PwRgV^&~YPq6L{8nQV$?u4+A1R$f2Dhc|%Qx>h0~* zGv9;^rC86V`MC)-g9`><(8WS`XFPWF$#;E#TNg|>OV`92{$ZbPe$}f_%t)sZl0{-_ zegpM5O^~7<&y8qCwEDnkn5(_0e|Jb6nV^VrfR#F|!Mb+&;~~duif z*u+{9)Z=A2++5St14`<6bjhdOv#R+N%E4MBLRybqD?PPgd{*1smvpBg+w9J*X!v0J zwlw+NKlo6*PD~2ezHXpWVIH;7Q)Ljy&pSxQuAOtOMA*VSS5sW>5Q9>XC1k1-#-xZc z3yI@vdPtr&jO*twJi^`n2$IqZ-b+7MR2mwHtg!e4tfFS_uM|00As`T6S)f2(SI`LJ zl`kS*FsXaZ!?T5nF5b;8`n52+j(Ek^1#!r8+ z26GR2MfkfBdpmUw*W9&MD524@B@YJ7tN85!&jBxynPhe8?}XsGsZCxOy<=!koMuZ) zrE?4V31)?tWUPSR_e|b_sW!QR%?E;!;%8 zf~A;TEay9w1=8ULx8xcR#`y1~mHG!e_WC=x_GZb^YV#6xZMCgJ#e$|bA3zg-w%>Al z6+6HfV@>zhk3hiCTWw#U@pN5m#*TVc>T{(_o@Jo3O-eABHa51FD@W6hv^bI_nRIiZ z&TtB0V{);uVSfj!atPn`|r3K+wKLOJ%vkw^@(jzU07@)vs+RRe*P?D0tQcLEVMNY*eNI1U`}v% zs2n3XXI{En?MQ4pXU}7zwfdD*5;Urt(D=tnn~_USuXQMPdw4cL~wfu^jCb#YP{UgcM> zI$CEjc6*7Z;R=}ObKf>q*^Co;)u-3v=yh0)B@e7nmJFQq8HWM2;?=C<_xbyTYN;~& zfYhRFUWGa3?h~zabyySh3G~o z*A-HPL$OM=AyIDs_8QA~r96S%n(gQEh}BM(tY^(*rm;Mwj;qgw-;Nh%te91%LO0G` z^|A9k!G{&?sk@p(WP+WBGJN;28bx(nZROD7H-nTGS<+D(W9^x&y=Ec=-bSlx%V9P_ zZ>!Rs2^F!gzTI#EQ;d#{*8lWil^McP3t(UNlep^ZJLP8+EOGRmsE56T1C@k-_L=p4 z;bx&oz1C6P(g-9`UAp-mo4#Pou-}7j`T&kNR@csh=^wmVw3}2@OBWR8>K8?K71oT+ zcA-3uzWxh0*jDn+nwo3Vyg)XgxX{ zD-~8P9xmz;v=80C)^(e7m8i_S7vplH@pCm>jL`}yCS&vBu=C8j)V<#y5mg*0iv${q z_dW@B-YZLa-!W`a0xJ*o1@CH%8umfOId27MwEB)NLjS7G#ag%Br<$p z^})MuEAn4$jP0egS>ON3TmctegX5C_A)s!q9RhsPe|6zu$Jz4nWFv{J6~$6uO{5Up zhPip28>LYn16&Kfc48%`vU?Zmew?*)50Jt^fvg~jY6_xy>R0FzgUSIQg7O&@qOwXi z-9a(U#=M5WVo}^fQVcV*-CMbG4^PZa!M0P*VBSY5S+J&u8e<=EGs9i24dp3?!h{Y- z=`Rwqqk?2{O06%W#H#+Z2VD(B{h}WYk~a-l!pkAC+q%=!CWDNrGq~h{YaMdyh5Y3p zfS`xhhyx+?sQadceWY93>$p;}Qu7NHbv(zd?VS&^C(Xn(zw6pvY%{Qrbee20136na zaED-UfpMr#0SSAcVP#pg`c7}NAlc?X6QjJ=eAo>*@Ht`uhkTQ2YZIh!gykJdIbEze zss%StdwhXmzc{lU#{ZrmYYGNx;tXPw{M1+hpWo%-b^T-?a1jH91c8#EY+$3KQO^$B zZyF>a_aD!pfxWuz_s@@WVU{)tli?KkwKc4rC<(GwWOSK*LWq(RR@^@G-_GtZtDNM7IooxLrmGWSnJQ*r7~#o!qUv$ikB> zGt%VYbqG3PnlHUDwgYyU*s19$XN>m@%n%-hEyvT(*Zc%M&AQpPEj#8l4X=Fr5~SXf zrk#6k2Ud5KKH^+l5XW-c|8ol*jnNwBm%NoVQ)n*(*AFjGC4nGArEU7oKkfw-a_P}^ zsDP!JKicn`mP?-!+ILTAk_OjyE785Bd$b5JLtt@Fb1oxMygYiPL+?p69EXcOWLB3i z8EF~6l&`&IAu&C!WSdM02O|QCphYodsFEKJn{;d-Wr|#=$W5(W`M*p0a?sC{5ELYy zJmI`UX2;vA#h5JBM~8{02XsJ%6G&E|&8B>JtB(^WvCYP^^ajPE9>zgkw?3n{SVVzd zD{rS4Tnq^M<}$7ZtuuOFQpJm~?>%*1_FLLOh60?L zh3cJD%7I0~LPdg?e!!q3p$(Vt#3f?~ci_m~_btkcn`}Q!%?Mbe#{+?tUlcTnx@uaV zB-UHnb1y|#3cPtb$?d}CPE(jPytZAo_ZMz!s>!=8N$+V^71Ub@Sne)U45Fct{IRVS z)`o3Mdy?!|!cCTJgUoiG>A3VfcuBgK{!%l*`eL>yUrJVNxg(sMY9VhxTPJ;G^&>mx6g5?OQ6 zU#+!In+<_Xx()WB3!j5HondyRqN+;(Fz+{Vwa0JV0SQ$Kw363eKhsjS)t+wX}?{6JLG{2U#@!g`@)3OlyV2{`49}B+wgMYluONHPA^ZY_;HD~G$yh092dvil z{U0Wu6A0AYL^dAVkdrdsaDy%Gy)CUD%fj1TUMA+ko^CK28FmC}o=!~OpTkzps}pUt zIRWyRT!Up7hZE5w(~p1Q@>q1z57f(Nx8CUSD-`smXCRgycz5Rp2^^%*u9vqDx@*!b z7e9w6bKr6u4(szc1#Oe+aACFj3_AU(<41cSf4D(b7Qr~^5z6T@2$j!qRx_*J_Yz)4 ziYQ9d!TP*P{BReN#cc$MJUQaO#YyWtB=v8Geu}6!2~l_{zZWbga8PMG|3C%`>X}ke zZy6g9*Gr07scK4S(>k1F4dc{!^I4HNdvqI#CdVu=OKw@3hNok?vS zKZA$})aE!sOaXmzZcHFSj6^AE`G0|lUW&d5Dw&)@z4XcqLl#IIZeU z*|!!ZP07Vdw0QQCM%(nhQ5WgFiLcGTvJn@(SU}ve3>eh?o{T!^Q?vHP=UKiJKFs1U zz=8T=ELpzq9-5v796xRf`C;-g^@Z11D{1kXV5FdUzKec@^r`SYEMACzf|jo*8k5@8 zEj7#edb8_M0CUk*ry@!WVZm;Ruai@|L*Lp)-osVu%I7b+O&+t7K%VMw-FcJ!mv;sHx$zgLc}@FcBc zVz>Jg`^e{h35j)^et4FN9p$}>sPR%6WW(5DBfXD#TEGVTczRSUFc(-i5~XQJl#D4y zl5vqTm-GC-myum|Vc3|AoEidGm3^cxKKf)kOrk~$)5d#$<)t1&CgBupFn4u-Me0Or zwS?N_>+gJyT-j-V!1py`e3N@n#PY$!XrB5-Y+7U zj90OlCL6X|YKJPrbjK|T1$Y%AD{bDxeRMSU+xt6$WWqSe9g&jWfH>0p_aY;NV*GK8 zj-MHB(c^~Cf)05zY3qs$IJ4M4T1+)cS;zoWHZHG*D3Uj(Y?7;zS`>!?1EL9P7O6S7 zmu8Z(%MO6=2K0Dz4b9}|Csi;Rr#Q!l%5M=mRLhkD6{S2WEige`K<%-1Z_?KUSI`N1 z>yUb6(#~)jO|w#)M9Z~8NUul{opTjCRv~bq7XJ{X zZzx?QB(c91B?CUvU)TY0D%eliMRpOLRa1IrX#fgLD;WINdpjTcvZft_6W4HB&@Zxs zKH%n*L1HZ=*|MAEEf7MT+eabmXdPH%4qUh}^O)IDUq_W|HA2Ui$5%ll6<))w_~NeEKZm@}-(yG5g8uQ-}W`D@rt!Febseui^ zWx)|(a+oO?&mdZJHp#w~uzskfGpFwIo}F4?YB4RHe}s>mt_%1KcTW@BF5B!;r*%`1RyVv3$Oo6!{0doxs*gvbsu;58MB zZMFJgtStH4aalvPUHisT`s%-MzB{aD$F!{DS2?D0AC`M8TGk4|H%(_R7Y2mFS~?vd zt$62ZFU3fom-VQF8w63ZGFc9K2HIMeUZa)a?mm=KecV#le9_#AYljhm(wGjn zmJ@!`$moGsV2#9q@}&x5PwS8QAg%*yEGz6K=9oD*-da~t;jJ0QCAqXOc%h1u#eWil zE1jd9rsNL4tY0&9H3#X(yn}%hdR*Ozi(oMj`)4SV;fb|<>xPCxB=-yX%qou%GML&i z`_bEU(n`;r^&5VDi>v;~({et7;K8{#8cafNHO zV+9-;A+77fK3!^BG(R+D^*X4Rn;9;6_d#@9$0h{<(c~r$k~G=h8IfW+f5`!KZ_v{z znazCGBJk0uF*^~X@`I9<@%48WP|3vw}DIx($xRsT|?X-qI}y8f(r z7Q@$2F=LkEI9qt`s1)-?y16-eX0g|`62+{WzX34J1ugH$bR@@P*NTJxvx9?u#_B80 zTyVtCd8PKS{LwDWust;QaP?(O+C%)N-1;Y-)|(Kk&rI|*ZXj5_qq;CT`h%5CL*Da&)nLS8E9iQ>Wty8kG1^8%>dT50rFRPLa#c5Lz0 zmfQer3(e0CE<(rq?z%mm+8b>pipN3k&rf1^@OQJ*603ix=tbuP@^jmwM`HF^|(8dY}v6H8knzSTC*1{)oAL>M& zaAG1=P zEZ9=wAUoB;HG=4p`^5elUfDQvnO@%KzR`f@X4c60usRv?o3c*{&z89M{Te>=fHLJyYeI<(Ytm)$K-ulphg?fMH z?IkTs6ci>D5c40_oG9FS1MStBp`dC@cQ=oP-WtIdw8Ff&$0vw4e>C z1FI3ek>6gA7JO4lI!lnAo(8x}QfB9D!N2k1GHTzTMfTiMNvXsfJe{&blX7Xq+}DJ| zG21WaIF;^WA>+Yu5AR}f7MnohA>lzo=mtrNGof7 zEyW@E;XzStFbzZRKZ?%g`G{kv4J}m?T@`r8t=P!MAm!j5ud(->7&<+v$6Y$vuC-1*Y`C}a5*aIri#?@9EUk-NJ0o|x zUJqEu2gU@AzgP7Os*M9M8d_1)z+8Y*hnmn1VSufk7JzmhTA}`$a*ka5-vfewt2G78 zm%;u?9aC0|AL|EuJZ9=l3^-M9$MLW!@uhGTX-6TvLuOJq!L+G^ZwhaM241liT6i>) zg-W)srLxVsL}XDZHwZkVym#)l}Xk=f}aj$`-r*yW ze{5R$+T*ySh2|P5lVr+S&j~(>=@=W8Uzg-jC;I@d36Jx{PN(e*WR z(MbhZFV^i@Y3c-1A;3SIiV{0byT%s({;Z|B=oqs{Cpc7(E*4bT1OHW+Lh(JeG|VZ} zxEbSpyK1T22}2`n>?gC1-+qqOVl7#TwvBLO-sJUlbBqAT9p<)(oxkBN6Em&8!KCID z{)%=+Rr4eA4e_tp6+N06`uX`6NAcR;h-PP*{P{Zh0H@h=q=3QWRZ(amGwZZ6v`S}_K(?VXU)y2f$M1# zxbzl}Y2PZAL%gUg6D|kbM-GWW8Kfo7AI$(K6Wh& zRP@jJ(UOn=$H8^`Z7Ud?OS$bXw3C@h`p)DXG(>H$|f zlmhc#sYqZDY`jKF+7=9&zW(P_GKJNvSE3r}ReSMDNjriuDH{y7N;0jP8LjM=8v^nL z$ZOb@#4xF+)Q>6@#|g0yj97!LJ24O2D1{=F#^&ia8OzY)zdD2FX;NqfwE~2nCM8IlO6PbK+EF+5jT^k}1(o|=Kg@deOXg+x4C?@Ne&2=x17st8>9i1Gx=Sb?jjM3MHB>A!{sA`|45UK!1JoYjoo1Y3O)BP3;*S zk2>_8Mp~uRONfq{t}KzmrP^$Izacf0qDho0)7ABZudLDFD8QNk5?B= zIGOgm4h9aJe`hqc3Q{a043P2ju5Nx1Q54d{jD!h*Db>$&m5h_BH9{h|@L$+eS6S;K zsvIBJE|>@DSIJ1T$=XA7iy(KQp*iO$DbJGeY7xntzT=VH0Nsg}+-4LX*+H)?LfKyC z;Y>iCXthhHw8>1FAwV6 z;8C`Qmw-i&3k;DjI-(*591q<0wj##AmNb?HoSDa5EU#S#5U_4qBXt}Rc$k-Wa;9-*;1qy{CRk(XL%_Y;1Kfruek_bWQ^*1Rg&}UlU zt3xLLnjg_@9QAsym4Y$c^vb$>&Aj~TZU^SuTqwO*{Y2A5sLha0Yjb=73$wK{n>OlG z;%@qaD4wr((|-1xg+x9d%qWNT`7aU;fdm0ZBbeDF? z<{gS|j60@p;%$4F-XxU0?=G&pR-4_xDM-EEI^wt_mHn~A=g3MKvd6b8l1!IR71(s9 zn;#C%AE?QDb^cnItu`A1=G%p+N?QS+qek*y^&Rb`o)%)Yx_&rK88Q$c!8}=QnnL}- zoY`yM7{aCzcnO}l4o9OhkwjvbK-K}&n7sPvyloiy3X zcMA+Eh8Z<>T9iMU?{;{a7`awfLfDCTOi(`%_;E&xy{q7|m`srUz$2}E!c+uWW&SL# z);*=kl(i}k&6cYj(lCN11C&oNij-ezY+W7@R!ShWJe({Xf-*?cj3CjpU&&KZEX;c< zAjYdNV9wg#bbK$}&9^~R&3|RWSF-!2!nQ*HLk9M_ovMPd{m!fIOR;GMXf?L*o9vig@_>fnz-^m1C^d*$)aGp@FhG<;p#9J|#UkI1d_xNTZm(0Mgj@w!vWD4Y z1^^q%9pzc&F}Hhu`N@~H7$Y`jTqOCwE#RrSnlzbujkae1!a@kJoN;fpHbd_jsS^R# zGYp>~(Zu4pzKe(h0qaCdotUA30|*C6x!S^MY=k6Mjys5@EkLx5$?F<|-nVgX@p}N=EN`3CB^94avxFk-d zk-I1t3+eTVza|86&qR(A1qw6OYzU(Lg?p>NI}7)bS)4~Xy01ur*;15T!3z89C8|Wr z^s(fz7J9v{A+Axum~CW3cvRo_|BeFlPg~?>16kzRO?fmSFzfaB)dv9%G*Jo$EOI=j z7U9TF0klw!zvE28D|n4pfsrK9dSX|%6yTd^+{8TXFXlPMw4Pd4^y%p8C=oVnE_qYuFI+wu@8B@eM|ST(c(NjS7vC=)E~dg=M!ST4 zycJ#9`^mPn`3@95zLsl!yj?aM(dST9l8s2$EL#pv!~SsAQ|x<>Bp_$_UpT=R@)u0w zx~9B9_MmUq%iPr8ZpEa(32n~sfVHAFw=(!t8=aJmn`a~EB0fFcW~Xp2;Izn`6Kryy z5(1c7PNo5m6!gD`6H_njFo4N7qZUHagjSK}!67|}SfLe0CuygMS6Dcr=Iu5&APfNu z$^6m1-CZ0uH}djw(Y`*mzA*=_H;+I%Rl61iQWj`g!+lx2ap;dqd!1K~(shGxtm_v- zNqlSd2(D&zmloWO+UC#M%-gH&*3q15L-kFwV1y@pk-DU&qMkA)ZfmE#E{pQ>^fw}% zPhsCY9WT@(Sxy{%MaYL+Dp8Tkc$?MB(p*J!-^H*7+xSu(Y<9&=V&!VNe)gI=)TgA< zfg4pHsyQ&4#&30+`aYm~!#6g*$M{hj@mK5kZJ+bd&0&VO8`_XaNB0r9j4kmR+2BCK zQQtY-V>N2Ds>58oCC&RUoNOosnRti*FI35}MWN)PSUo@B_7~mBv*zw)J+wr-<_*q= zsK0Rg6WO$x%jD5H-0c!|qs9GJWcLo*{zb!-nG*)Z((QlYUO`EUiBgUZzWRbJnMse+ zq$sP(S1K;y;zgSO$@+AJVC~-YU%1I}_WZ&lMCE$pB?<=daP#FB7rt3zirtmkl9_&Pqgy<0M#`K5w)(T|ql5+A(r| zRIdzCm_ugsKbWXZMVl?x&*R- zQ5@BMeA3N&l&bpum8vnTxI@OYlc_V-3Ca^zEr@WjdMi?^Kpg&Af8I)%2e12ht}ZZF z)5BMjG$Y|>-OY1SlIl(IE4{h~VGbqkH8s{8UCH29>1QJrV*9u*~XW*G%*+Lt$9YrdYA_uIRE(s^`C^tFsqN*U80c1ch4u+umW z{~TNsAb_W$ciyi zc%>q%87AEQ)3eI#Y#(1LcFC3KRdET7p;hDV{bez68s`b^s-F%#cKFqUy>*OPWt0psTlw)%gA;*oQy@#smStapt zwykT)Vu3Pd<_M7`NTFK2lF9A9oLN_*2p3oHKS1XH`p`o1&2JMaTe41_uNX{os%TsA zWi7W?ZmyEoM@jAy5w(dk6F`lMTy$5OuM8_0CHrN#O4S<|F+M{>;W>8Bkg&b@3v5q1 zdm;ywT$3+!v3$8K=WUj9p4fUqzC>9|tEtw-GmecYPJBrw=u?ItY|>xp5#Q8$yNChd z{HTwhNbdibW^HF0BBC&CbLi?xUU+*NDC$d_y0Ens!So zXAsR{^O3paFI@H@HicL*9PD-fcV{^wR#MnD^D1>KUw(3m3~jQWftBE7bOm2??mJVm|@(>W7mKBH_zKybHHx z)~bCaXo)w=^=^@Li-_}|g}kvNc&Rv#Kd@n_U)>Hf3*~f^)u&1o^&Ez{#=XpdSa~&B zWp_Hu{ZLg9e?dbGFe40|e3Z#I*99CKsRUv*2~#vn3~Emn5=ml`pP9^=I930g)2k`fnh->f0*M$<(d}Xh5m(G)zA@*+Ul}C zC#Agl!_Cd-i{FScklQOpr(98>_NR^69Q09!>V4PaEsfr!sL+zw zeM)CYKZ?2NMcH4tsA@)~tuVI!A9=PXD*EbtWF(Yfq8L%u8;9w%Gdr}k{O8gjZT~0| zd&XIFVZ(bo_~II9-Nv1$o~bX4?xw*?>19U0ZfI>ECNpv^r}MrGgueKGjXdt(gaZYhX( zi=>oqx#=ZHQ}jMdKq?tORZ^~r{;&?%%r$j4@v;*JU7=SnE>1y*gNF1CY-a&!M`W>TvxRMh`mpFeiyG1m9IY?6JB zeTgaZ7pb>C8}2DIHRTJ1_Rs;smwcw}(?@bnKFq{EXDPmTRJ!@C#y+6zdvx6)I8FAR;B!ian#(I%%>0X1dEh#Yq*b00 z=ZH1fvQF46iXuIC@v028*4s_iU6$r1Thw66*VZS1+JD#3_-0|3voU^ezwoDx35)G^ z;sY|u&#Nz`3%-iJ9HQJdT4uXp*Hla19mc{BczPPl%-q_J?no60(ufpf`t?0g8P&fd zNQeh#H2%VE9#@eCtHr_&YxQbU&7W1C6X}3F38h}vCdylpjRni=G;OQUn40<=ju?pb z97DgzW%&AEI2{{9r9pyc4f|64#QQI4r4j59$K4&-r4R2j$9KMg0pSi!V4H!rYLB$a zV%=%KZb+bxtcusEEV|#4=uXRiBHpNoD&t%#nYr=ppjS!yrZy9V1GHD}RlVp6WA=Ll z0&gw)HwR`)ez%PEo9Hm-Dq^-KVauyTx)huq+L^|6>kk`>9BV!V7{3qQXFGFzjp)$SAbRdAYn~!fYKNUSYf>El8V1&cpT^xjuUK!Ar?vavHii;uhWbHkOi zKe@A?ltZV#)-|zmKzh;E*0F2dRUozr4DhfJ`TWcWxG2Bz`AMG{Pwz(DONM%by9No zSOlA&n?<{9M%~r_JnQb8iBHQl%d+7JzkQrsT^9jVny$T~5X%vuhH@Kx-6T=DpJ#sO z4(gag$E66h7YkeISI|T+$jjWRXp{=O+zv(8`BFS0$5OQ~R_DH1b?rkX(;>+@a1#_Q zR%COSMouY37jA)0meb^6C5&&pRlW<2y;#9G%okNuDH$S^H23ahwiv9s-^9d+ zVqS;Zo|1l)=<=1>WJ)HUS?RJ+vO`OGXG@e3&s^1h{BkP?h>xehUt+8MPGJq8gI3_&putMni#Cm?8X;=?ar-&IxQz2I=B>mQ8 z&XIycu2dLv&cqMQSDJ7AlH)A%$#+g@AzgzerXqoh4SrYIPSlfWqtDA!ExdZbCuLAN z7yH~%5C5Q}tMFh;98t8YfmZI$l&|E&V@R(%L+&ItHEDcVldIgh=L0ROO-dV$@1zcN z7%PLMfs@q7TEgFCIPN&UwxxSfwR?~;OZZCg4#(-ITWGP3EPfPbP`00F4=?`x2tAOi zA^(KA!MJt7PwmZzv+AC*Hn{=7Ubem`Uf|4(kR|xmO6zM;aZEZ&&-t(SUgId?`dq9JT(($6o=&v`!b%u=v{|lY*E%3CBIdV_gP)w#;w23 z-zC;!cT2Whe7|=fdl^Zz#hzf9$>fwM8vLZQ`2hNWhcfgset8nMGQe>Y_jMxIDHd@pss;gfZoO)9N%L zcFOc&`I}Q#@SgXy$9Tt{Mgiga)oDRwKZ2v)%67iS=CuYz`pN=Zqjar@^gCJExAYmc zqU8rnbNXGnamujrgtAb5=LE(9%!iQzMx=jO#LUWvX{2^wU|yU|m)SRj9p}Gr=Lg{M zYjid6o_699>N1~-C0o5l>yR#h3(-NobFz9dI8_8YzW*x#aL<1UB5ORn50av3>WHt~fjY z<&#ExJR=Is^t6k7dGQR4B>gJI+I-mH$UH zPph`}^$C)GNd#0_3_JJB9VvUjWG%OZqz@aQi>#wWhYi5^%xV%}ekU@*2Pv)bv6*75 zuqk(Hbusbh5pb+F?VUP5v$+*(q2#C;R=Kx~8V*;Qiqq60-_$OjsTu0TNc6>qj=HEkGJ>Yr zW@(G#lY5jNuP4;c8Z#S>#7r8%VtXg1t5iu6jN7!`1TWhQ^~?YK;5yCrOJ9}dY}V@I zjz!ryo<>&IUJsB*0|gqkUz0Ze-I3_R8#U1kpN1}mRhX=%1N*N0&*C)EPUg(k;6~HnZ!Hh#N0_-p$V|6K9KTzZbB2pe`z1Sy z+8cdA?-^XrI4$_@WuSQy+ngCw+j8XVP2!`$ysT~yl>}Uy58`ftGY!E+r4b8#ZZ0Ky z4AVxqG4w*m$8#ePZz5Boy_(xMRVRX&No_`#X2R;8=F7-Bjd^NNVa`M3dsh}LS z`v#ze*l07^XjVy$d)Gsnm}&;Uw4$Wc&T9PcK2@^9i zYQU=QEkN^=>XWv760fc}CuwPKP4R`nZU*jA0WrCk^^?z9rtxeZnL?w)$T{lPzvGpX ztnF`ugVmGOtToL+uCULIigqbk=--709=i(|6T;t1lTKsSN{8>+{5XqL{`3#YA=I87 z>cxuhHX;nmYvW-3!OgQc(oa=&b0)xEW9NMQZJH>6d5RvAN{Fs4Rm`*QXfvrZejrWQ z8FH=X49DhH_#6Ex3@^(&ljWN`CzrO01CJ&l(DZzrEaxiB_Wn_Gt#%?VZz1D}#d+IGx2WN@vewzLz1>i?OEmhSQoS?{N@y8t90C-$bji;0llp_(9}bR;AYmjw=CW2BRc z0#wP^RHIbbykF<(hbPuiXvxsm8Oyj&@ygh)mtKP38XO1b=*7_Yj0$)ve-Ip~V2J${ zl2kami zX8$)8Vc^eWlEutN-TOo?9Y9~i#xp@+pQ`Z;n1>M$#x^RwUHXuECiwfw zVNgrSBg^W93y9!iSt-ibMvjoX)gP=qrZU}v8;Xp=i7}&1Id0`YZzC*7S!vwUV8O?~{ix!2+ZNY~OUfG3 z9JAJ+p#o;p2)zfygdjPEJhO7KWgzb!ZY+}3p<@cF(Fy(9X8t zf-C6$hNEDx+gZki8UG(ryn%B2jRpIYv!uaOs-Pdov%yP(Hg)i{Pj|i8IRnN&B)!g6 zWD3}Pi8gf#cXRTmTCeAA8(h^}2zmn7E{WFmNQKwnzfdBh#g%``V z_EiT2pLu%uP5+dNbz~#7a|BP#dFLGQ?F%64B4yn+X)txf23&EBe$ZO=<_oY3;$5F* zxSTvQK0`L%xU1`|`b70s)!w@h=Pw_M^|WbobVXrDma>=R0_FVC*&%;JOwS!3;eHW1 zGX7kVM2NlCG7vhvIMxrKG_r@i?Q`*GqxY*IpQJ?XteIE)vL8)Te_MFre30pk7uxfq z9v96c4$L0PK{x<69nlJ+hOY8be$7z$hg44b%7gDR&>GL#>Q;%jV*Z%zWML*al^xnD zTl7BS^=&vYyOHp{VLy1OdP$TG=O9AvG4Cfu>@}=c|@rBuVPQMYf!v|;<{O@ z=yfqhB$SzGhFv#XhqZ9S;vZ7Y%jY0@ZLUH{xoT_Ou3VewL1<&3bGi^-FmB;{Sf9#Y zDoIOv<8_~X4aqT!4k*0&kf?ovs8KxqS$Upk`V(+Pk%xGt3WESj0bZAVvPA881Lfq7cVOySgyjx|(`D+WQ91gQd6`g+)#%f} zrT5pPc{7G#otUmqlr&VvkEL_1ALi?q91{;_6JZ3o(G_wa77Q%*t zlUx6t%BB>Fl2J$b#~N<)9!E>=%rvwx+0}2tk-`9ro9FGT85iRdVPf1?Lh<Ha#_m~A`A9VKFc({d07{J(7tAP%?y@!%meM!(>#C?H*;2Sva_Ea*GAL)DJ6ekp+9K$I7{>f zV;{88W$`<*ph%pZ9aJ)j!pQ&b;!n50F@u9-E&WuUh)4;fLAtl;FNa}zAtI&uD$BA7 zScpVHtE?Aafx1rEpHue>JS0SIt>+ef!ge~YNX(X3wg;3Af4$vq`wTE}lYh)@xKbu9 zwDNjP%6ea6ibcNbyH92Q^HR07Ko>BIJ)w)E6+W!*$`pR7)P_~=HaqIUibI(A%XWCd zQDgB#jQDI=_gLD-UcorTW4lk?%V>gGd1NfG0cItc?7%L^Xzm$ynz=7xBH;R@~Zd zio@Y{dX=3hsgK)aLdx^I1o9W48v1gph@n=Ae@F*sY_Zz{i_}P3T`#)yqB)L6`6%$$ z-kPJHlJBc2%S~CABxEdxl-XozuB4kK&J0{69Us`0$C!9AJ+wlFK>v`M?38IZ(3^%} zhkld#4ehW$Hi7gmy@p+ltG-!h4TWXO$8GgRjq76;;D%+7Owem3IkWY>xEaBRTt1r} zj8y-g)`gM`T>d8`&U2Kwk1ED7)|IqPA;quv5RsE*gv-TN0g*OQ z=R%;N#H|HDo6?4muteE>N!|aVU~5N`>%1C&H3ec3FPyPAS#1^MrF;n!4&n=ETc&LV zo*hCvY9&YCLSH64`&dxap*n7&V^tQD8NV(gGJLXscz$1i7+2CIUcZhm7CPz4ybDO( z7N+aI9VkdxD$>$l>)?L0-XeD(PbB3n5#(Wt2-?`8(B;F!L^MH2z&>)3PE#Df*1#=Q z++}s-@S)jH9m1%Piz2?J2dS=T5nR z{fYTFd@Dy6PyTXVxuUsLsR`i`$Pl65`%Ef6XAtd9non|E-7D|O9d1VKN^pA2U2}(> zjODSiN!|<{x3^2i2apF?@FZ`eLrLhNfag4%469E4F7t8;w3CLX6EsZgVA$e)(s_>9 z*P)^eN)OrFJhEqK6G5)^1a5K>pj!KiTxldxoi1TNzBX17W|wjgJS=Z6B}QD%e%&m8 z&Ux0Y+@5O2y%9}U`|47Z^ljuc`v@Uu-`u)U$LK@oqZg@cPkvim+yY`*2JU!gXac1v-b1zwC3s;z^lCVZ|I z7m;4wR$i%U8;E(zj*(OFKg1WzIkP&_C&#=)P2S zl`>i?&YJo!a=mvZbqht!HMNDV0@avGNuBiBIUsJf`;uVe>G(#6jCE@EL`W_vb2Bd0 zN1ej?GF<-3YKN6#EA?9jG;2#&=edp5>S*9gbkfy3yDxACLUd~WF<7I+j7|ko$=ut1 zn=2~AOY0W^#z)+6SLYWhnTRhQ3^IeqqGTR~m#FZHEbumelMT~lz3zibY5^W0#(zS; z|8wEgtBaH-+6fW%M$82)IQ+)jC7uCI&#@#!0B;QR7{2pT_sZ=WmxoU&KsC*3&!0c0 zt{|(S;;d7}#VS{cnl+}58>w9p#L4+4=06bDvPUaKN4ksdS4(FTJfKBi@YdV(U+)4U zHk~yyT-`@Y1WzyG7Sc5MNanpV__!)?t9yFp-W%EI$hfELJ@a( zP71y>_%Mwmtgz%Q`%vyF?yxtKG}AVIDlmhR@=Q7CQZM5u4Qorir1>fabcehBjehbb zBp_pN@Nu+SnY8Hf{B%1&pORk0r!7%`w8$&qMCq9I=?M;3X|7s7jXC^%K}1!c)0=Ye zoL5-*Ogneke1%R<<>>TFSi}BGVp?*&~oLKHz1I0cq{2QlS@b?#;E zrz524Oj#yaVn30L^*OQ3gIU-j1e?34xz6(}+5UM%(3a>Xhy`&TCmFVaNu`K=#hM{z zTihxC?Jkg*BH3tDu%QJ9Cb9lp#pbvDm6i?Fg!yJqFg&+R9C{c`G2K2>&HiXV;w%v z(V&eEQn>#^y1Rl(0K9256%_#z91uG!iQk;77<nAM8}$EyJn#=q@|{N{!FJI*dx^I(k$if$;3IJotZ3^Vm9 z4^2}PBO<02dDtrI5cH0X0y#0jKAYg;PVP0XXy(_xgO++i6T<1^;-AYlSMx_*G*%(c)6uJ2~udXRZkQm-H>IxdJW7z_2_YJjPoS2CM2WDFK7! zSSSr`4ii7-M!hqy>*Ju0lFau0hI6v0(wR@L5&l)+x#=_(#O5S@ryQ4XTW?=9C-|ET z=QzQp%(o1FintHCepRD~dM1xQw@Q7FJW*m-j-qlO)%e`?#ktRRrUKOKjnYc6 zHe=YL@IA`g5P*??tlyV@+C)mMM$En-A3ZFNaKqHBZ%|QE4)qf=m4)#i==YDn-&G&! z!fTie%VJ|%-G9d5e5wdJ-*qW3?}H1BxKmScI*da`66PLMM&X$TQwx4C+p&f(^Ho3R^|o? z`jVz6eVO`ZTFA!t!9M!&3>vmSLFHO^^lpw&cGYmt9@Wb)l1bN2QqCUS_}axJgmvpQ zQg03J!&cGx`ZN*|EHY#3j+}LB3X7EqH1rEN{fBf!{KaSVXfGt5hLn0b8!e4tiH1jU zm1kjQ2lFt_Yc_2jr_JQ!Iu%{hSJq5^l%}6e>RshAL1{k~Vk8~OO+7@Jd-)hNh7wx8 z&P9$*7ZUH)iEPk|Xo-DsbEO*3mTxP87~CpO2p|jdNm;bfvWS5~C1hepmJ;M}dzp(V zTb`Et*Y91v_@9=YKTUcJte`rkM0N7BTrfN9vYa!cqQk@ zV|m`6$;bhT_}*vSM^@=r@Ft;(xk#Nvf$^(Ht{sepJH^|N-3t^dRrABoDM37zeOg*s zDk&Xo?-EIzgmzOFfsMNQQH)h- z`+V2J=5$uM;V94vY6WI__ha3`%WuF2q)9STK4PxX#FMTQ0Od4W zXgiX(m5(0_b}Hp?3zb^(TRJ!*vbOA$MnJ=`@Z95=Z~H{ZII(JlU(C9HAID`Uy*mXBEMh9e~xJa7crX9S-bc1wMKS!VCd-OQ#UnZ@LWsgErz40`{?F( z03Vqz9)!o&Cykfw4L{tJDTSU3IS=9irA08?De_ulDY|dcapD*@j=wK9els6v(1~Lo z#39%97&6h3AA~pr%>f_i9kQm*;>}orE^<~sjfyU%exp@B<4>hJFJF7wpGTaAq^ZfH z+wF9qQcc|Ik((U8NqLY?ucvm#f`|5vZnA6Z^EOK_kcJj+8H`YW*9;&wN`|Uh+bzbh zEoCT$_l^HhE>%2xeu3f9(dB6ciuKG0wDF*0MNX#5iyxCw^o1b~wu^-ji90*6QIR>|NyW{d1oXUo~PYPs!5l%+iJTm_ka?6?;%*lIA{I`~cilr*75eclIVU8Y5!AKwh6b|$w)U&}H&rb9oJtCrMlHtFF(SXdxBIvWV)KH+~V z{Qt(_V~#X~q0qk4oS~ZVIaQ&7PHQYj1H9c9;Wf4Wt%InLyk;1eZv5={;Na~@ufeZR zQ|OvsTn*a$-|yv+e|t0>qi*RL4veQLcI8y#{wm;>ujb6B=04)Pw%)?Gys}L^a1)M#I{Nc}GU7o?FR!Vx9JKuX^a=@j3h2^r-QDnJMsI z%VlkARd=>DXhul+UJUY#WZMEWKGJm_v;!uNt#Iji7tuo;(mPzsbbm(s7;x}!0s4qq+D^ExRbZHj`PZ$a-&!Q=b)h_ot;3-szA`s_WjG@&Oxw` zP(38X?9b^l=w*IpOYttr@8Wdx!cueQ`j@pK`ge?@I>sXf+CQK53;D-R3f27EdKj6 zei6eV1f@SA>B8d5*%2gmAz`q{j7=?Ena(pxhwBq4;S%H@M!}+4!yAmD^-~}U7SmP= zsnL2v<=Kc?fI>fCM4rfgJdfXl^A9OzP}#=2OeF$C9eb^ToXYlB)U7wL-qSU%$ULqg zFS%L|6SvYaD?!n&O?HsOL#<%Ob6a@Tq4g3lV+=0ozw(vyas4PO|AN zI^8#cmjQaOH74{{Svq2uW?;i6t^g7jfRn?e)`@*hPclQv;nvdMgahnk29w*3&?Uls zlfTkR(JDc6BUX-@#K3qTp)k$@(3WKcPfN9$`C;(XGGW{UO4*k(2MetcX(!h%?;ASL zz%CfR4!q`&D4L0W@98Gv8r+j7_f@GoWkZ4Q_5ILfctaOXX$1%EE`o< zwm{6t6_I&kkuTCdwoX#!vbu+=PCaot|NJ1!St=;;Z8zzsRQPJM!Z}cwNuxvEj|5bF z?mNu_4fd9hi(>!PEDJu%*(0E7ZH!0_w9g5vKk__OLs`9pOl1pjxPYZwe*Q{%`?JCp z;jd4oRENiFm26U)9yN*f+0q`wjno@Ze-oGr$Vc7k%P$(eZ)RU&_oD}*k%xcF6^9Rf zSOHL~DEH(pRR6f}Tj;2scG9yT$gxVDDAROe2D!umMAh#{24cot)7Io16~|r#9G&$p zO*03rKTKBX^|{@~d`4$*uqmwRm1^CVk9C=5x|-t1o7%4lP5R?2>B?^m)aD>HI9pD% zQ>+AStvxJ@=H81;+`6*qi^3q)_WMZVQI~*_;E<+r7nzUxXv$jW5z?C;dKuLo2He^FzeQ9jE%3b6PK7LB#w1X`h$I3o>LX&KR~M zzI%6LelV@OCU`T^@PT^6Gdtumsh?zbs~4G*-{1eWhB?ntbOzV zyCV=PxHRjsGOotDi*n~LZ+?aMckkRKBLwu@rC@(|Yi9h2cEPwTn?=9ebKnu$viD8z z-Sj#AUR$ZlzGDMV*B>u=Qa0tS+j2s_1coJB*H!xr!|#YL2lX-Q}L`PP!xqH)MmSw>;}08Le{{~B!c!Um_B5kk)5|5=VD z-RsTGjEZUBt-mHjD4{JxMbA zX(5R?SC_oWw{m}Vg|S2c!nE9V+>xCpmpJng-~Fao#P%_ltnk#@>RzND5ji#w9zI$DKNS-i1wv>Aa)g!pZbgC{bN# zIC{XU#B^_(4*T(mn)uZ|y9bY^kJr;|;)1H>io;v!=dZ-wlNssD9(?9&tvkm~Hxw3t zra4$&E~^fDdS8)-se)Hy+hg1J=)bx$3Y_~bWc=%7>4RHB7&22DN?Pkh>TWxl>g%jb z--I_Bnn4*3t%p)_HBnyy=x`<3`eNrO#bJwSP1iJa{$rnH6qgFkfP}DpYMs@p0-PO% zeMO&IQ}V}o4>6fLuteZAj3BUv{EZdWxF+u+CPO7|wpB@5+s=FYzy4f};I$ogM)TB@ z;?tH9Mr!%uDRT`I5z2AS{pk1lKXe49#hz2ueKT1sX%1_ZE=nMxr1XV+II0Q)BZHME zdw;TSVsReWVIREdxhpwVNN)n)1Y5WSWfFa39#emHA@s8*V7Jb(IB9W7Yq03azwPx| z^+_4gS*%2>MLZLs%3)s|xyE?Ps`C64`*N`D0h68y|caBz#q~q?Cmno z!AIoL0Yu~#=Vj@}F;rBLA2WvIArvC|HSmzOI7IxEEn+4;!j0$I?|Mn%6@cQk)&IcYzyZ46G$CS{}{s54#a@gn{X#qGJMtP+=XS)&7=j#~#dboY07 zY$?no%&Q#~pN}!{TM6NqiW$?r=|2xG<{VL@9r{kx9_omzW<`Tr_qR1;?)(EK%QmD5 z$D7ARH!-^*g6T7|h@g5|82rp41WL;y(}M6}eMLAd90HQDbg^M79Px_1KxN; z{TVg`*D(@qvQ7VMUhymOP!^D*B3hroO;0q+aTFtc&azTzuLu;isEw{(K9pv`N!|k+ zNBz&N>$5~#fI(uw~!_z$~T;-s(c_+9Vz!d00&RVcvGHR8wNkS-hpa8@>q?A0) z`lMm(JK*$Z#WS2q;L@|_!Y(3_CMAo&IQ>=Fmg=zviT~*G40?Jps$)mgWfarjjKLi4 zlE4F!I95lY!fV|SjSr^BMrLdya)Qn}P;S|G&ie_KX7uOyFarKaU>avX`@0^Oa9nm% znPrQO?+;j-WmY{ZxV6}hfmZNZZ}3Q?Ap7@|LEpBG=nFi0L}VyUP|E7l88q~g$~3QD zJ6M6-Y{|=m5FNU{>%9Y0w6LI>|7(x2pg8|PK@?h^xL!eV&DaVIdJ9J@iHsgF{aX@g z|2y$j^P{gF^HBFi5hE3-dJn&hx4hqV2}Mw9+9o2g&4pBb!h01Mu2fGVB60gRz$NC( zB`Y#Jd1{X7)*#k|9DDqJ{A)S=+q{+rwqAF^sSy%8jksIAGMy%sP6*R6!^N^YQ&QX zmu{>qXtOCP+AT6NdR>IO%pR5D{FT}{welptw{*^E$r*8CWA-ClHBmxYm@a~ zM5a12{?;Vy9kL38qZ)NvRyV19ADFS0%a_{>JkK7IRjc6}EwCx-f1wZ3E#UoB8+()< zOBfZXfkP7a4@nr_KG5lf2RyZQd(1%9B0c-HLYVY0RnvR5wcV7D;kgTn4*V+c*uFhW z|GE(cdwOvi&`g&_?f<5vu~_FGw~SV-sabMjsbhAak1y(Lu_&zQn@`o{tLAa@7GX^e z>(AfMdNJa=97)!b+~3-BH~0OV@iJzIUS!fOi|1kQvnA*4jR{RRaT|golsVQv2YLcC zve~j|cY`l86+|Otm*{D_o=+g4lq&f6x?BJ0fZX1hyjs4clVo$GgQ~QSH54H85HESm z2j4vPPMtGdU*sIWO&Wb)F<+-grvdr?rh|(>HDVUgFq*9+EObwUdg_xhi1o|y5gS?} zY{xlK!-m3R<7_b#=?LP-{TpZ34W)GIi;9|6rN{T_dtPV}#;q2v_m{%-!l$$fFK5;+ zkfAkKIhwKZ)>`MUr^I&SN#~M&;jv;Zryru3yf;nmfo0Y?ddxR~2V3yos){SrQe#m# z5QfmQm#FH6QykRc%%~zl|B(OP#vufG&9GFg$UMYiRO@5Un6wh^JRCBJ0E^6sy@~U7 z8hE#cC|llGJOSM?bluv^jBVr*KUfNd?{#?~S1xtj%W2Clxk5VLKO}_r%izLamYE_y z*xdalN~hV+`suk%H*<(PS=PB(tula5rc=v2B-~7H@tiHkGY+~0_=hy&`wt0U=Uj8? z1B9*OcmHF*U!ZMQ+P_B{1I}tZr{c~DzkHwb7Nzy$4{klGG_$i*?L{FH z*R&M6_|)c+6SdHRJd;Rjx#W?jM}&N7`x0+#85!+-ahc`|(J@>-ma?T^G3StkEpMf@ zB{Jmzc=ga6{`2gCHxbGd(SFc~3s(P!Q-I^=@ZJ_m*yB*jP`D{YpJc#YY5{pXdpEm* zrcwvD*h}T>TYa_UbVsEd1elqep>;fvbaQMuD-A;s0ne%0tbR3CCBjD2N^v{8d z@!wxXACS=G)h>&~!hFJZ1ew+As=%5;l_(ShNBO01Ot*&!U9Q$N`*Vd)f_!%zp0XL+}kZ&5Jff3)o*mVbuX zP6ko=45et=<8~(AGT2;bTc#87g2GmF#sTt$zHXra*Pkm@!VVh@ot;%@a7KvgFUU6j zVFG|{WZ(f~vT6%M5Lzp>GIoG1;qM9R09^szF#y= z=z}q}V$IR$>+US+@!vqz=yW%FutrqZf8^sxc(|H>-gUL&*=dB=;S*C~A3{q?hDdXJ z{_y`~;bYxIK|QcFQ!)%{hfmJV)@P= z!Tw(N6Y2hmFBNIU()Lqyw|#$Eb?oVH`7aPcvU~rfroFLvLMAT1S$W~1{Q7atA-X>@ zDWYLkYPBR@PEhW(`ah0MBDZSPgQ$gI2rTeGz+>PlxYa$qs zWe|PVRQ=%_)xCvP_~yU}AG#nz8cyZD5wD}7tUhyk&P@dGjn@z&wtKl~poE%$*rg~N zhH5}G*o>T9TSs|8>fG-Dj`YW`Ae~f|iF4l3{>jqy{OM81+eKXvER?mv<#~M5uJ5i{ z1&W35tH+i%San$IT(&&+qMv`99x`7|B_N2ic>JJ!-|4|u0CR!iaBU8PU0-dJ&2NGX zLRmGjkoP_NA6>a_Fiz}3Au~Q=2tG~fWx_hABnURDBp)QU#Ya@{W?oPlfmj^saQ`9I zBiCdWP%RFe`o_8zo76iQtWhDFi8JfBpFXcPJrk92byRyj9_}%E8{IEZhOsa`IpSsIR49a2|+(fb>HrU)SRrkb7InXn^{)2mujfu?$knQx!Uf*NgQ{5Jd06W^ccT=04GhSa=8{4)!nGb#Se|5VJ4C+isnoMNS z&YRq?YiLggn=%)^S)zJf|2*Da$j8S-nKN47p2DE2pm1Z|8noD*ygg`MoAQh1*Ilp$ z^jCnS87gAro-Q$jg__;VX?WdmWAmtfdRk#pGpXh?vfJ_s&df4V2hjs-S9G;&y``dj zxopzDt@Euy&&y{$yc;HD>mcpS7Zd2dB$|H`f8RcmJ5tkr=Llhao;}Ep@bBtQMQ&Z# zT3j1_y}jl~-_(A~nz}XgVG*M378l0ZMEnvEg12LgF8LngJtkv=4?!dWSV}#S3pA>Rw@Z@6&PIa>2TKWrp{g5R*|3nK0iHGtswFq#J zal)GwCywgo6OFAb^~q@(q}IqS#7TcyCtM2T9CH$@j&5{*+-sCSGkH^?oohzFx+F`6 zs+Ss%xB>ZmPpko~@U7|iQ5&{!)~k=a4V$<*C_69WQrM#qp&Blnr==oWdOeLDhAEg? z@!_#*@ztO^CWHLVRTIuPN${+gAdNiaWRxs`y4k0#gvzx zq2g7{+Yf5*3|Ba6%uTFstrqN1_j$DcAVzwj-6jpxJ?Nnlue%WqzXGS(f~H@7U%SR2 z`~@Ig9BhbM#26{g@l0fCZ&uLXd7AsxJ??A0Y3(E%f!>!QMKoT$EM#bwyf$TzfoF$eZUybBWLpEu!I3G|@>8w;Ao zY(+6J`H3V=VU1{vg%4`DS$Os2}EPR{DtpFQ>`Y+jjr(>T0i6=RH%Y0`<`X!n9iqm z*2iyM*y|PhCea4+?X6lBx)44{Jz~`pD~FPJdm!D9CAL>$TDiSgd8~gojdDaK09^F5 zS(MT5AfI?@lQOv=VuJf|8LoBgl9f^qJT|zldMd9fhdD4P4)jG9ZDAx0*OL=6^RFf> zU#PWMm-PJwXzq%GQg5Qb73naRkH!2D?L#bKeowYn{|U6F2`BS8I_k+&Bz}ZfvRZXC zSa3nDF5<pA2P{pfD*!YOJN&Jt+S1Lts zR$}pk*>%7k^>GfSQls?;ijr0Pr}5NMA{`yNf}{9HxLq>8RNm1M+g~y+IF_)m*z43{ zGK`RA%6_XHv0KNWs(M1JrEV#z()(0cJ&I_-aJoM;CIk}>mxU9`sW!_-KGFQqSI+1h z01=DiM$6Ozk)Jhw3b1c}3Nz#V8|Pk;Rju#P=PsLks6jbFW`DbG3*YmSkL#n<*xUH^ zyTbi8@|R+y_y8yAiv91sMpb1itL0?mWDkiZ_R_p7k8q_sz<4{#^=6<(e1HjtI`j}J^J(!%VoL;1q?aj&5RSJ=eoaCgYG$L zg}Ule?L34uv9c;uLkA^-4JRsF81!=`P(Es6%&@+GRp*XChykeeUk*zYC}pC9v9}rh z4b_lh?A7K5B4aGCBe~|P*E>D{3x^oLctKL{Y*a*qXQ8Zd0F%0$R@DcRYJ|7jDcIay zaujQXm;q$1a)WpZ5 z$t?zamkB+{&@D{%F)D40R=`J(+K5R)KZ0oI_;nuA?~#b*N~|{0!kxsNl>`(%VX2A8 zGPdbT+f3-x567so;8Th|2FP(;Tb3RadbgA0PyH;>pycdkQV|+U4w-$A$8^G~v7rCa zunBUxBb#y5OURBTl%K{pVBP#G`*Z_XZ~X{_nY0oB;n1Jl>e()|EX1W7s7Cpc>SdOi zI*z)3jzMoN3Qz7A2KL1*qPrCqN>f^()nK zGKInR6+`=b`D3g`=Rn_2BJair>3-cdF{J`vRSYeV56$-i4C)Q1zip>qBTCQ?79@RJ z@Fhh+O_^ubf&t99UgP#tc_{wT$E4j?&Sh1>lPQx?Qi5yjx`=TK*7SkjON8UErbLfB zTkj>mNCG!J_A^hzWRfr9vZ%GlZR27QDS(}dKh#e=NS`sB`jmRV70hqClD_wC0p!(b zn&8$xX6twQ(I&JTY!+|M3Hft8W`IZ!x|O>Sb^P;z0Q%geOx=I5``OQ7A3JZ>Yt+i1 z9>3L^`Jkhe&?8_EF|;Fjo9xMqTesdIlF(|O)mjUCh6}EJ^5;% z2$9Yv2%lW29S-JM6D;$<8%d%S2_>$l-|#mODjs~gd^1H~w$Nv*oRl@W>yZ{+nntB~ z&@}B-Vn6(8B1er~~%wTW7Y@zO1{c{s+fUE5)>z$bU$tSgIIsKm}}` zAK_HgEj3Pk;AJPQM+k{$tKsFd-ahY!_tJTm>*hUj&cof1=+(hv;yN=K^ zoqHJuqC&_KbaCiabzV0kDu(it3m{8x*^sk(kc0gq=ONi>@vMQBZ-2w%h0d*9C`5a+ zqP4}jEEj#X1VKw#aitbz?c8038u~KuNU?hKHSal460MXjDppf(tZfXpyTU6qxj$$o zQV9q!!~(&VkH2Q<5iAP(uQusREhup`w~!Uhd#_~M+mSD=Q8sqTZ$lj-?d7T+W!`mI zHF9I4C%VaK|2JiT<+Uli~2m?blv(PwtKd!eVFV4EhEXlbg+)iB!b{rulpGTC=DIBr8Gv^QVjMlyU1eieDkvSlJk%>We^MIUP(xUL%&hNl`9Ybwk1d@a_>NS<{_O% zNZ%Dc;`v6Srj2i%x_v;_tPYaW$jHzuPKsq4D{H}mhnP*EvzI(eHb13B{KiRCAtLoY z<}?G-i07RDE30nYUQ@&3cd`Yz+k80%4Rw&n9-Ulmkp`Hc<(F!zoHD0uoY@cdb1)skMtUk1qeeR zke2Eth@6H!VLgH;SC~;JrV%2t-^1Qvq3S4}aJ5D+Hx8+?tUqaSD1Y*+5O!Ck-9t9@ z6AKQDHRQmA8Vb*D1Sv)pL>(hy&ds)sx|8~v4RUbXoc@J#JDv9ahmmmWuz2?2Vj%66 z?z@Q)ACB)88kJzHg!D>B)g`Q8vcgA@mk>fr{hS@q!XWoNA;YO(Wfcs*+c>PuYxtOO zcoB)_F*an`xlMn$3U2pBQ3-1;^<+Ro)z4ob?&_~aV7S>g|eUwOXi*`m{EqmoHk!u#XakI{RA5sfo_B*+5 zzx2NC+;fuM9#H~NR5{J^xgCx6@Idii=1@N`dsSumc3V70OJLx)Br`mxa;D*tKLK{) zRoqClh&|K@8*SZs_!C_s?$hmcp;_`L8q2Dgvu}(h2O#eGRZqqR(EasrsQMe_k7l;r z@)C_17(`330u+l!9QNNxndI68!b@K4HxFe6=NxO2IqFjqbH?3db=1sBHA;`@D_gq@ zFV7Fv<7l|9+Z%CV97E81rYSKL(ESsu~%vNyms8UuiSulGpBxwiL6yZzV0^wNH|~h=8|Ud8!_w zv{;MU;~=KE6(99#zS6nBm}w$o&&*S{7+PN{$O6$*wf`@|-a4qQe{1`$0c|NzXoE|k zKyivYv=oXvAxLm565O?g;_mJq2ownfFU7q`aCb{^hyLF5oaemveg1gn*)z<}9)_7P zg!Nr=t?QE)ll;^DEWZuAkkk*QjKgb(%)Jc?j0{nOxKe#`i655uv?Cb=nE7;rX06iy zuF@v$Tq?8mpy@7$ZkAQ<;_A02FV~rqO@`1A?)IH`m<)*7Rl&`=_biqp@HNQr{ndhc zMvx9u6K)qC>A`*8mqhWCC9$`x@WKXM*T!#~_U5M-53g^vz-Wr?eRM(h zc_&BrfTsf(T&$6P!xu=;(QS@7KU(%`u*36EKvrwm0!ai?y}pw5ODL3j65|I7432L> zNIUX-a%g%~iM=8JBD=)i{NV8=@D^Ie$uJKTzY2lFjW81a9FX_ez+;h8JG4k zY>nPQP>cG!mb5yg7YjRgG+zop_x;``fO!u&?!?dX9~AtyA981|GFPwX5VjP=rlRFH z0F?7}%CX?xY8AZ7x5U=zS)y8dG*|Ra>ZYf7j6KxDkbUG_m*CN#%W|13LO=SuWCH?i zW`_52BTM^_t>2e%J=M`sI^{L2p9}b5qe?2i^=mfTm$3lQnJ<0~;Lclgg|A?Z>&cnD zaJSlEeNZL}OLPi<;*u%{U-KzxFV# zM^_S81z&;Y`P`mgg ze7NG2y=0EysI?|`wpH#ddZlO^Nt<8D2+2>th zM>J=O2;vialV7rFj|H2(6E7|*<4LG@7^aN!w9+6cuwf1VdgRpHM zL;P_H1HM{$GEw@zm4$qd91dJkN93jm&DO2SNePVrcbvMl3W0|QiJT8MX8fTV4`+O< z#`hsz1{}c#^$|}_&g{T-*R@aanu`}R35l=v72XWS(}Xl9XLBCxKf?_i2UJ~@@?xye ze(8+lzxd^F01ezaC(5fW7(U*0W;lG_r~lgegqWAByHV_PJ;qYv)=>SQ2W467b4BC( zwJ7kn=syaGH=mkd;ejSmI|FjEiA)=-nXpnbV>f;zkniF-F@KlriSXgDzqDb{a^pLD#u>_2eBT!z;g$HFm$9 zFK@FZ%Tk9Q&$hPO4Fbp#p|*Q)CwBf6K!5E<(_3m0T0|tG?0oFvvG{Vo4V-(~Ai~lKG$PNfPWr5PqLM$ zg-Ds)c#oiAhG`ttZVS%OAtrhBIkA@8i#p~7u=nGxSk4R1=9WsZa3^ltn(?y^v{dT9%lt~4m$Fn=wg96H*_mNEX< z48?40pD@CvdLwvT8;D84-ZXdjzK0fem9fffiiqn1PQFyyo@h-4t-ugS0=OQCP-mYL z0C)UrV^4^&I!kkz752At6pRDIlsF zBdwPyCWHFqzyD|<@1E)RaYdbnDYM=Fmf*SNT--99AUAsHFC@k98sAts)&+G%3JeQ~A=Yv2SwhsghrKkDH9kR}AO# zeQ9@*vkUf;4%?km!8%tOc#+e1H9iwx5mzRXQq5K0u3$AWn&Ti>U;iWK0klJys9G=!z}NY@!qFrum{MyLflSF!deyj7b5@2R~J zjZ@)FQklcAWh$pIOA%R|=!j9+p5%&)cQU2zS#7JpPC7Mqt7rotXhU-p-L`{{q59zx}& z&0w}ax6Wm1W{rsay;2hrKgfv3$*8Y=qH#}V#AD(E7N&1COcEjWLgv_Q2x3GjxEozD zK}b>eZH)};t-v*I@rWpmhryFALdBsv8cc8;LvS`8Y}87=u*(Ht_UV ztcuwHh0j!0-*f1-6@5$@Lxq^W4U#luq8BLGZ_?PFO!yqG#1RDM{GR>KgQgXV_x|_U zA3TMOtS&g7xp6pNaNtHH4Uml4@@ry0v;e(hs=>n>MzZej6>; z4Bowiy=V_whs%X%;$|Zc$E@4Ns>T?ydBxQ$6x2hPM|@lj3guSBr=$2TmaHVb*t^BK z^cC59uS<~@4}-MYy|hoaxHa^3H_3iEnjYrs2(W9Z1gP-$Rp|G($m8J1_8kyxlVngX6ATD$^>}+9#N_PB1JT^$9JM zjrY!ULEJ8YG^NUH?ex)VJ>TC?uYd6E1fTI7p0 zV%7|x`S%hyK_+W#H(rfp%dHd@z_hn!utg7q2AADQs&-9Y4T&31>BQ#I?aHotcMqbf z40@8V%A_Wsb`Viq#M=3W)av7jOOR~On90NXC0s=ZFA^%$GLZgSATfkt;mB6NbW{Sn9nXkeTMHTk%}E=YsEv(l>d;P8X2Xc!7dsgI~)oeeBu1Q z_YH#8JW9;Efz%qGRGqf{RO^ax@kFW@vt^N?U!Qx1w6w&<*Aza(E^E-h^P5I~5G#;^ zSLIH#BrncCs+G(}ag^hAIEf-gAdC?KGa|C&h@!p6lzf)@CuAk&!WuLM>h>WXAgTPW zS?#50wX{iZZzeGJ4!e7m2!FfLhF4a(%SRShi|jwsY2ueHtkU7e0a=UmogAj^6&N)N&DrwEf3y)2!QXEUbhcX%rxamz$ZqBwAWp^mLdD0LcD#>as15?$fnuDvRQfYi_m(Os#QLLyStoc zt#>1mt|d$RaNF*O{7Pca)oa=Bhcpr4)mVEr4@H$mk(R3!e1cy&N5$3`cv#Fit-C}G z3&LAYIgHaGFTVSS!OMLIHJxByKo(BoOZt9+q1JT<(Yu1ihs`Q-TqrG?d2z&_#hio{ z__^os$XVOoaQ7D0aHRV+3_XT?)FZ_w@UEA32N2Hyc^W6B58XTz!1#EoR%5Eq|9t_v zJ>%yP>vK>YwG05H!%R8T=@nucXafn58yzDfl+ z??|)-kf*uJ;`tO~HMTVWYKBt02z`&sjEfkW3NUe+sb#t!NG23{zUd-^{VW^;Ts925 z@ih+)nW=+Ez8_kV$Wz&Q2XL`X^vflPp#fr|yE6m4L;nj#O2L34ro^wtvh2g(o6S&y zZ`mwlq*mrn>xY_>P8vByt6#TD&jDlaghPh^B-jxRN2~0I+9@lCC$)}*4dspSZHVU8 z+a$5!K=fgJExW)+#>=i4SD|-xn#Sr6D`j>-!*!gz6lUZH-<&hHy_vwi4k~cBQU0cJ zzyO1txi2SKzYeCFbON+yD}Z%tK5C7DrSKGT!&~SA=NgrwQRNJADF6uihgO%YX2?#7 zym}4n3VG_@EtpKj6!eGgay6*Kvn}bY-C#sVnXT-2Il`>V*;UeT9V267HPVIf&(}EW zX$lg~6wGNBi&eQOWT5ZpO0+E~_n#F~bsioxejZ0X{Z1}y>YkGtO%+&o!%<(Y-GHLN zyGaZ%iL%#NCmy~hv}&W;e4q=P>{bvo3n-q@XQ~$yTb{eRH}F5{X%*4Iphn}-{qc*24kR`bNR4=@(~**i}wp;XQ%(VucWHRD+SW;c~Cmz8x> zGjuHOo-D~iENk`u>3{#v9n**XJJml~B_vdr`kDy(o-(O(>FU(q$J?C0kd5N6R&gRWy{_4E`)cBHP-$)NVqyEhZJzwjlCc;5m`F0<}(tKLo#r&@W| zQZzfxAAe?)F5)_K_iAer74J%)^1UO+u5P0E-1Ey~p;LVfYz`sbzY^kkHwn|JKSMTGrr-Q{rQB;gptG-c>#r`K1} zubket`~|%4zh2wtlw;el@zaw1VT?;s!QY@si=&l4jhV{Psz$M}h1OC<(B_*cNJ;L0 z{`&)AYpKqqn~33%PZxSx89^N!-DbDIwFAx4=Co|e+46=VWcyt!K;f*ru-yt1iZLUlK9-jci({FYsTTrloj zr<%91qaaL=YL+)X1TtI4vtNxZf^#Ryf^$CXAcGK+J)tZn$n9LGxDF_}$$4Xfq{`m4 zwRmCb@BUp%>xYi+hSR|$!@6UW-qlEX8ychB*2npx-}usA1d9>oVEe$?z~!&IPYxX8 zf3#V$rIx%`1wSu0&Q{JeLAHK49KA zkw2o>k6|eeR;=og51!Y$xyNCmAztM~70f1?vDcXK;LniI9LW%x@!Ry1+|@ zzZ$Cv#egZOLgD704eZniF?87fNJ;+B9f83wQia!N0OZD;3mWH&BocUddgA#WEny@~U$24uSU z;JqG0US$`X+#Tz_R;!UwpCj6;KQ8Rv4!I|{a0W$cg7R8IMdH++f|HV z)?MR^a(`=#*Bc=fs50ADG6Ah*n>*Z4)_=kGSw`T|s_7RG&u-?la*A4SWA9%*sT3oM zrjQ)R5h_MG8y#bPBrXl}@5*pTXJ_X4jw3zs8P7)vsV>(LGhrT>#Qyt_(62a-Be;b| z=d=eegrW%M(IlhumLYOV+H+Tpfopu1x-H-{vZ=*mt=vgn#&;d@w!%1TD+-%oaL${Z z@w>(edJ76VLW!|IS9GH>+gM&E5rY@9p47u~UFbXEN3YK|QqWA6gC&OjzGEAlnVNqP0E3;Ih)yIb-*cGcI^S(f62 zZQ1XXIS!9-un-bqy#KaqL=lT_pWkEF7DDDCUS^b+{_lG6e|DlUr9DZAl$6q+FD+}~ zn3V=-M73rnCOd|Zz!*s0$a(kVoEFV~b8h87Y@l!6Thp_CeSc4;SoIi0!BA6D>cdH3 zHM&<$tf#Fl#4+>(3ZN}G`fZQjeNgEska)%G+G)q#h$k%G=kE#zZ8$Zy7V66t z^-@kvyAaJ6uP_~x1Rrey3z0VZ`Ac8G4TD?&M_|Vorw49JJ|-Nqv-UqaSn);9Q*Z{* zDz(|f{pC27HbyRbHX&|(kgEW#Wj<&7^s?%VE$BnAt!B=NhpD>PC87o*9Tk_?%cMDR zEa+>ZjT_0;+L_4R%8hI=eKlU#h*~^zG38rwnEG{aP8bA(>U?*3q)1J!d~l2zYQ~Hi7rO1^qUGvQzn&ivl&X}92S&+Cz#h|sg-cJji36YjPO4wh|+ zw)DYGa)PaH#chXzyan>zHCI-sX5Wwi?xNKY-q_swDGgRsj3B~%rczLTAV9QI`fVjp z#0SaTK1?k9O9-<#k3qx!_l3ZmXoyC|__gw=_@S^1mce<4V*mJCF+Q1Q7Qui9o(v0v zT^HYf9!x>J{h5^?UXKO$GRz+}4kVEjy|wh>4#dSif@*u31i6i6Fh;Mkk% z#h8wv^LQ=s^QZZQv9z+4WG!LiYhsL(H`#8(_{W<~Xf)2xN}ee7{@^v+iU>*j^)C09 za4OHNN|e@3n+=02SFkmyjfU&K!+NZGmQPMelkbH`e9t!4XXx$_QF3LTj0QkogfVil z@+o~GrxbZ9C7&N4&rMjy6bRnEGKr7g^q`zeOj0gRV8<^=)hgdH?qZH4+VLgetKTR+ zOGg$X4I*y=wDQW;2^RjTqNYvf;pS{ zr#9y5#kE3T{StJFk)|)t@Oj5jns>1d-Nsi0NWcGo#j}fM6C`aUrxw0vw9`g|^OUL#XVhWo4 zjqY$AJwY>Yw;Pr2C4wevoWq)P27VNNoI zw$lC-123JU!5VtTOCh`STfSgP1#;Dw@jU%-e17qw9_k~YAhIQos=HV;eV)4&7|s$bH5PP_A4stzD+RC4rsWVfSytQfBdvmcpccxA_q3Epjdc-sC1)^{C!m$n%{u(hU`R znfFJ+7?`~?k{Wvmk>R_ z_P-N(_-8)%Ve|cH#FqDhs;)+gln3{YOiu#j>y6W2lWnW~I&>n9c8AhRas^iYV~DP{ zVxmcfT`bw#YVPjW6gNLxpEGnFUo6JJNzPqd!PU${U<}`|^<5px>A|c^+a0FwemG{U ziAut*01LnDj`10i_JQ>~Yu8h;Z7+jbS%Uj~Q((`;TVkI4S`iubbT?_4vv{0-a=`qJ z?M}=Zk9saxqnzOWQdOeT2f-PS#Lg@AzyVB_PFfYH^}+d{6*p#A(5_X_^Em}i7>#Y| zrK)G_Ebo%osCzJ#HdPLsuevE#f&nCZa2*E3hUi*tsOd|M&fgujb&vOalbkeb7-vKH zkU;1uD~NueNctp6SfOwuM5PT3(uP65gV^HGNt?agTCoVkR^`(&u8pG(2Jfx4_Hr)I z0kPLzCWnV@1#83bJy5bt;e2B9v+L8sh!zD<_ZseCT_lWA~+?}<;NKwS<56nOG=tLL~a<@xV|HukA~Nwts#`xXU#(89J^ zT6+JYriGkNh=yx=qexrIi*PL%azVavvrdZVnhz4= zt55{dXby-*EJ`k{m5EPcRv!!h>ofhI2mEeKE&+h>v;N{}9Ewk@RMwXx79a9)O!9IY zbgMc1Es*nBWRF!U#ZjS5zId8;^!v3`YG?ksa)>r=h^Oohi zBuYTX%WBThBG3CPb@DAXf$c!6lmr5S$N=ZL(l1<&kVHvYz)7`9mBHKG$h2=X)NHF z!c3?go=>X+n}U75i7T&(MCVD5Juh;~1US7QfdYbQ>m&)pSL(5kQ8Z0?Jpv>%FQ#?z z?NI$-pkw2cWz7_C2VDV%a#f}VEOI5j!$IsZhLeGs*<5~yHy0aa*g|@4u`(7m=-r0% zRk>((jmq%Mmq(w|SHce%%)w#Y5&|q2mExmc_o6wu-@VKPlK0QCxA+Xek2E)@*+|gT zgY{XUQcZe_T1E-xwL{TkLXLL-_%)2qh>c|A(pt-u&PMuc4aU(Fgo?;lNIVidWU_1H7-iq`n@CTtF)3taYq6ch*RR zuJPpSx8YGsPA7#RVbN8{&LbM@PG@(eB+Q-}Mt~N+MpvJqaETnwmc;;%5g7UT-(&jU zsQs(%NV|1zK+d;+ASJ9_1UDGST=K*S#$pO+_jres1!Tof}TUUJqJ zZ|JQhG;HiQ)#BK%S#yM6nd#U6uI5amrC{`*bK3s3U_%c+nr|Ygc^wy%tvi+S!cHg3Ct<%r5qt&s3 zh~+s>-OXo{ALcxMas@T>m>c9>qDR(Qx$K3{3rZk#5GmiOA)DKNTvMjSB#)u%sKzu{`c3nSUc~6*EL0}wXix(}>Y4u7X#0-VoR(zn+w)tHL(6N2ZrEhm8@K@&D z%-|fa>bNL-#MQuI&i&pb)jiC0eW%+!Jni>n(}%b1+7=TRXz=Klqx|Dzhsd7#$!}e5 zG5MWrmqGifDq=_!%it5oZ{sXJupEPFmy{p~t+Utct=5fm?%pdE^l;IS=@HqXS7-gX z@WLi`Xm^Q^CgkRf8-ruM7N9LalVG9D1+8`qh;h{VPIP9dS>~?1mg?;GzkP5+5;ALmT1%emcqOWQozZv>|+ z7Y=diEFa%|t#h13Lhd3G)S+UK#uHRt#x5>fQ+XV@IWj4sRrbsK=-Zu985O&fHjJ#e zl*%nKhQj$sEmNHwmQzI<#W2Jn=C*C5+-Q{}j%BkwT+YgOu3t2_^t#V}a<>|sWIF5+ zP9NRCg^urhM?qclO>0a+f!5}ZKpZ(y>iCrFx!drwW|b0SFc1Q!)tZVL)^pKBpJ?V- zvl7=Jpo<%2fB&NY=ieUKB^^uFuK`7s@(Ks_duWs<)?%-J<9nmRY2QRuVRB#PH04!szI>l+_<#QujKjw4=Hhv}lJ! z%Ft4##yY9O(rHo6?fY~7QSD>m^AlX5_ptJl5QZf?sO>iOoVUbmXc_gZk5sm3n=?Ge zu(-tq z)mc*z40U?`F@I%Dg#n2Vv&ckMiY<>B02+ps43yw+_No#dh55`M;9i>Z(^NG46#jLE zKb@vpx6Z*sJC%hOJo_@$Lm^;ceey*~>24lP3ZrSw^{jSDif^)8o(_f$oMO^~q1fZm znnP7Z2myss(hzm5F|afQ4E!pOF%5W{#9Z5N#s~d@X~@Lhcz2vD4yNT#c;@3eap5Kj zeVh>|)W?3+>CSIG7^$a8jGMNTxT`;dDr-to=xLG|w^Z!meBax3H+@yMg&V|e86F;4 zKz2EQP_Ox;dSp3ale)a;B*>X$m*%L z74PJ#<-Bp%NI<>jI>L%RnNmh@PZ{Q5>|6KaUT9~{pxmWBYuOUwAK(;QPX6Kh%olp+ zvc@Exy6~0K8@QJqsCq=oHkPXoZ?HpFMvP-&N4+S~ENWw~>2n_ppM5NU#UJtYY-Ma{ z_T(%%=q9r$S{HvjcaDF?Y<>>svX?#Tw`uDYt6Y_sN`v_g~p(zh2AOdRuvM|!Y5Rtk~_U{rwm8i+{7OXZ0xXX3_)g@&U)tChR_R(0lh~8R$ZJ9h_dEH5{6L|uOXrYoR07bbn`m`<+0ge=Uuw;S>2Izil(f&X#M+^7yzt8;8Kh=KtF>2 zT&(ame73Fxtn_0|67!dFrrU!Z{LI^emGJp+gzaP75a99%seNmrz_wcf-NSMZK8o%b` z8&2F`9_jBG8YffcZh~iuidM(oh;`}o2tWbD{ zTW!9MwDA0H`We^bSnJ1tUoh2rdF|guv?eBmV6t4KJRPQ9q(-V^=A0cUP&%Pz(Y&JD zXvK-h#;Y|NAGjLl21LpudQ&uADK}yv;=HHcWn*GHeusizfFW-CVt#1W%4QMy1$Dzj zMvLJtyJ?VZSrd^THGR5^2+$9w(p;R)TJkHmA!`OE{avMmm%rt6#W?Vnfk;9znnum? z2-=|6;im(aT9Tos7k%02M$#R}?ovBA(`08oB7Yx3IoE zplB*Ew!n2eDMToa7AjlIIudaFfJL4Zg?vQzGR^~7bRy1~H9Jxi-H%m{sD3p`^UNBC zxTsV1==XlR1(f@547UivEM(oFAXlxzk^BYcQsn37Y*(BaMC9V@Uz?n$ppSVu!Zr&n zi2Ggw6M-ZqMMi=;nwUH_;wJ~@O;ZgVh4-6sgvSAPQ>y^_IyUdR>tWhYZhIuv>3uV` z?xdQBIKSJo%_ht=uxsNCh57R5`hx&);i=)MFc;S%&sXLxo!r_snHju)+BBe+L92A` z&n)`e4cF5QLU=Q$)l7A@CuGurZjg^#kG@ooj->k=@}1+82airOdJN(tS(Foq&rE2G zH7?IS_()al;i{2vxb>m?Qq8fE#=oxl)7mj3;wcff0}zpE#?j;~uNkEGhZ|chtwRHr z-1GQW{9U#EsnduAd)X(%3*3uJ;YYql+xW+vVPi`P?<~BBBcOZH8+!P!n!kG$sW~bV zgZk?k)9SV~Xs}724moSyc#BcHH0QHa@PCzha%xkG6Jn)jtvxp=$Jin^J!tK$RwpK5 zG;R8e)^9txgG=ccrgQ~%reYm)Nb z<+1SP@1VF>5enhcVL6Rtdodcrrc=PQtfu8euW~cJObj##jQNtH*2;}9!z3r4P|{Ya z|1-q~(j?(>!s9pZ_hPRU z77dIVqY(9p=LBJ^80d_V;@b1_FT8MK)pnmWJ$G==K zG&b76EudJAMeAwhACMi8-qDK_sc%-Go;C=w2ni7WB;Gj7DI3$dx0rk{A3;YYDW#+I zib$8e7-wt_ObkDklRc)l(U*zTAdbb?a#p!imR3RIO=629u_@esH)}_d5WHto zDv~?A9j?GaGKSiuE`e{`ep<~9XUibgaOAGapTL^q8?6>&_ucO0=3M1@@;5wRWG|&) z@y=OHp_=3JK2>wa^^}0|zy2Vi-l^u2P18^b?Hp5l;C{(9mj@vAqpdy1E)IbaBAaI1 zE}TSP1B57pI*IUY?{EVoODHtbaf+7+x0gMbKHjV!F3Hg z=h{W^nUhaeOj#CG^w_B3miuewKY+;bHMJ!kOFUgy>Qx`NCFX`R#lnUG%5=-H8%*zm%SfJi1ZQCRn z?v97Mp2}yi`aYkbHeD2AarrsN^pvKAXUT>7IW+^{dHwy{9llewb>UCrP=bNjLkWiI zr&&CQB!I~{4vj%fq=^OnZ`!R}W2YraM|TX6WI1wUHIYBMs7S_ah=fS@ z*=qHsD-;F##J(PzpYRL6nP#un6SgwQXo%0AjA+=0Z2o@lSEwRZuvb7D*vC$Vu|Tar z{hVp=($d90*p~U{0inrNLvR|SZ6YPnsPX5_ztl{&DDj57Rt z;Qj{MW+^-G<3S5!bZJ0ozD{d=x*)(^YcTsD|0|Qv=n6Eci1oOT|!> zd;{}LBBA?5TO!Wb7f|oUL7A6%MeO~sCotS4p6=Y^p9jW(c3hK|VGYBuG=I7r#$7+Z z&T7kUvPWp-<7$hggtHXz2+2HP@64Tf>V>6DwztK24m$i+pLVCRF?s(-73<#PvwggL zlDEC$VJaGAarQ%&#lE7i`=!ZalmdP>5Q&Ic4u-f^166;A_9Z*!JRGd6xM+kOf+^Nc zdUZ`FWS)&4MadLRtmCSh;7Apc;P2ZQu-#@?R-jV0z^)C$;SMAyh$uk;72I2u{A=@R zkEUCrf$vP68!m)96=y7(m4?#M*u*3Gd^K{j>+}zxcL>Y|pqC$DwSIX?q{WOWUbK)& zf4fZomkXoXz;uoNbFqG#!OY4ld1FBli5#3Cdp)W5dW1NzX00X{i;yNSQy$|V{f*~e zs`%GtKZ+E1I4gx}J4^O!Yacs!u&3}=RSe3A%scMzHE0(sv-8zUi>=?TFIjmO!_HV` z`X;Y0FStXI90$8XbZ=aAQgbDjtAOl-`BWAmLN~5j6agEagrimu9W(+9Q9hl`;>tDL z6~(&^&%7vN)WsusUauuXS&Gq3^S!DrVhiCL9?`FW--nM~1QyS!)+01I7Ls9|mPcGNW6#=VJ zTBFxkxqiXgd&5z|fS`Jo+(;RnZ5SPXKE#XJElLmTx5jOuw zFTJc2?-yP5hl1O1|Mz~4Ty5F~eAXMJ2dew_q4kd2XQ}?HbovGkzqQ2rRg1xh)+zS% z)8@=AotqG##_EsJ>)2S%%{zC1631^%jrQCwQe7DefBU7^FHUKWcXWF5C?DVQShtCN zhP}?LgWcC`d+3Yr+YH$$v07x<(?&JZ^=GkYRHCBqEH1gNJzc&9y^j!_<71v)E7lK9wvvhq;6%#-2o2s?5GsgJ@4S>h17v9co`LtK}b+lLiiw z)2{J|ZO>X5t3F*{UOUX+8?4ru-Ds3z>Axs-$z7D!Gw;PTFeHD-(i&>!vxX;14?rA0 zRXdaEjN!(XIvtP!;GZ*$5)G7Y@dE#OfW*MyJz(0VwT(R?OMv<2rNuGwnam&tj$wcu&Sn z@aoW1MfS{5>sAN2m;-0ljdfryQj|TFWsdeDAD&)@8PbD6516V5the|P5HxrNrKkN6 zk}Ue2`OikraHq4;^Jtcefn{LB;LZnMOH=ZmKk9dnw9uLnDNM2a8rBrr6}AL*Xv7a^ zB_R_xGGuqPTdzw%#%QEHWIox~ zC|miJ}fXy~0NBO;Uv&8PCR|+XqJpI~!L<2Bp{D^V0{$Cme0GsRv@1zLC_r5F)uC}j?x#g)mBmeJP;_m&}L6AMl6^iGj(&P z*F_g@S)aCv;5e(ZwvOG6hmjYV6oD({p}^v1wK6$6W+M9RH5WuBYqXuAYt%6Wl~hBi zXE9J90nFY#8+trjC+gj!@JUTWL-$Wqx)Y6Sdoa`Pyz^EYF)KHtCV3FCkV5?R)4B;- zL@1)nY~1hL9#D>V|DOk(KhL%GNmhQxoM-767cD-Wz4A*VMzu9YL|@D|XL$(lkStmm zAQ|gz4>&(1S2kOzI;7_n5u1`}XYA0>P5Cq#!H=UiekFg=40fvg>Zppv;!?2-%0< z?yQqV_zY(};i=}#xD9EB>WrzgxneV9cgR(kp}th`vXbB3hIX*zbl@EAqO$5QB)Mi?mrrk3Z{62G@RA@FLWsI)^Emvn8)uq0eO;ZrL~{p>r{oQnqmQSmEYtUY2?W zan3$x^h&APG9i6wet1P1>A@&lFGA;~DIf0}86e@0!MF=ny#RB^1#<-hnT>(Q6~x_; zzjHM(Y9WTp=>EJ|bixQ>$f=z~phffRZNupEsL`Ow_h7u$+4K|*Q{Gqet{0-whQO$K zw{r8D=CH(T)s0u`q^=<$m5da!pvP$v&wtA)Ut|!Px7orx5MU|rh~*zKmTU;-qYON( z6b#?y79Ue*uXKh~l&;gN>c^v*6;G373)XyauH_)h5wnagy%xRyJb24>pFSC|M95l` zOtTL0|AGl;1U4QV(-;g9-%W1OuO;-a-{>f3Mir+3G3`6nvmQTYhJEeI; zpyOI>a8)Ue%ZE##Xnxj2I(fz8c1A4?1f_}jp?09n$3tG~+07h&jtJh}U}jUT#$Y}Z zZz@h*SQ~wzsYq2Lb9D-(5JH{X{xX=m;FR;q!XLB(_HfFeA;bmb?vR0 zhimm}z5EB|oR8<~3umR-_kdiby|n1#2Nj?C(sw#iiz(`C`0^0jT$3^Kw$k6!%2W7O z(`sbMRGE3^YIdT}d<`1k|l!Gw1XQK0BC)HW-d6`j?g&H`yb zgo_c8p^W@EiDp{QCb_m#Ece9rsb2wgQR@l5#1QL@M0r>5O$yc*O=`@ojPzitZGYZ; z19M5BWEq{=wen!l_;`*z$NS|`f;6rP@$-BJdki_4_}gex zKakLy53|pV{7+~6Ka>9d+%>l_Iey`Po(x`@VFrr%|H=6O-tA98fI5RfGf)ErMB(TN z?DnmBS;nqk=NZktlS;^MI{98_^sDP^lH=oJD?Y0rFJ05C*QX1okFN!YA3ftRYH83! zj!QX-52}DdCV;h0S_@v$>m3lW&~uFt=cFI(AIg6K=x7Sn_Vh`*J<%4wr)UQqHZ`pr z+H4o_U4m^N=q^myykd6!Ts%=Ef^8~Ak6+`Bkx-9jQVb9#9#^E+&9}7q=&j$qE1<_x zcvBVdvB|6ONT}|X!(O8nUT42snyu7q>vJZ~y3KtNbZWpAdpDzLpZ%KfjxK4Omc~Pi zav+2|M~$i0q?uSY?pfUtm*7<8qYpu< zEPbJ+7_K2^P10bh&<1x8cagVyHHTy;q2{;ZpI(4bQmxGGi5Hv|=QS7}sM4x3X@e~Y zmBujr?6|Qf@j-$aEbb+AK6GTl3i~qe6qniuKfq_!Eqhorxj%uum40jI$&O5YIri20 zEPpq0by|jTix|;3je>6MJxtLsjtI#8MJ4YlZY1(t-Mr+vh%@ z)+~O3y5V-n&7c_ktfqckV5Ik2x4q-|xv7_D%`x?=#rbf*tGmpCR?#VT0lGf|ZVKzp z)tCIeAa1=7rEM#6w8@EpdrH>^5qts86@!hhEuO_2oPOMt^w67kSdU*`|E6Ye=3!Rw z^_1q%z{F@i+G9o{2B@6iyJ4>u9#C-Suepj%@c;blo`+=^BqiI%vzDccFS;abW4C?z-rO z3}4K2fwqkJy$;rXhlLD}S})&oU#btX`sYDF=Gu(4TMfn>xk&s^@yPriWykJgJ}M6@ zx6IYo&znzT?sUH^kn0LE#x`z5Tm-=b0bO+8Dqb!vhRjOpzf%^fY5AQcKt4@FK-Rs5 z+2i(FB=~p}UI~#%$D8=t9;`&D&Z)Wiw$s5qh%wBd%pVP_Z|P|m2=1#hwqKupx5AwC z5MZNEa-e*{9qMxdqw|sw=c|bFZFd(y$(rJ$A;|6M3~S`iz>%|)SBq%7qQ`HYQa9w+ zW4eE!`rNwgHo`(i#ebMw4PCR+DZE3^_Y`SAx}#j4TVA}B_Wa<+34&EJ!KwzXwD}A;3 zcnb~qCjLMz&z348Jw_Pv-p(3v77hUwmP1}GW>(%N1&IsDkZ5sKA50AYf7P8^RMOcO z$Gccoj#?&pOPDOw0n@Z5GaapL%FE*wa$6i>+F5@{(g=(!UuXTa(L=% z`#H8NHPl%y{n&4hO9nSAMtGBz4!Mq7$A{DtpC+iEF}U5SnbEw09@K@KYFom)m8(jv zXUvw(sYCjOFUCq-+WMcL*U~tqg}&+WTAqbK$6UKjs&6kJ!CS5mu+&p&?U~&~9=^T+ zNJlVy0@x@_N%#PjZL>Xb(g>z&gn}-zEQ~P5JlL$@J=E?NYfhFSo#X3NczKh_r znlo*7)O+frB#juRBDQVSL31r#(`;;^_L}?}3_N259=5x^tdXWY{}0URk`Ovi$W#XV z7QEmM6x^vJ78c_=*zuOIDYQK9s8KJ&j~Oy-;$N9IpAo{qETOCB=nDVg`Hs;LS#e*g zRmpCkVV3Y^;Z&b|?smDRl5_L3mhPTZL;3?Z-f{Q#m zthzzfME^2@?D^?1`Jsx4KCE-j*(qkFdqm?YHhp_iZ*y$-xZTIJ74yB7?Xnvv$fh4x zaTbzlx0;xMCFZ=7+&T{GRpqrU4Wp?Q5e*ZCl77Dxp7v4gv+n`orDon#yfk!C77rI zr$dpNldnU{T<0bD=H@8Jppj|B>7N~nIh5tpgL3x1bnx}}(jbmSa#?AWxl!v=UD zlrm>?>y61sgHCapiTvkw35eKgEPi|kj?=j|s- zAZJm+j#tey?4ZU4gI#*0s#rhWHXpMCo3Fiy=Th@FP*Y4yi6M+k77g_VNmuHkbteYq z*_Q(E`8LXE8=DGuQD3+9hceBo!Et8DvkDPn<=5`lM|G$$!pU7rpj*`w?VLsdnH*d&^&Svi0V`?{r&%DtKkcLV^QEl17SJ9mH z?#UhQ?+y#g5mO2^BUwzn$*cv_kL6RQu`t4PzP8(FQB_;KVoWvRS;r?lqOOV;cQ+~x~kJG0=oug(U3o~xIUikGvv&*8I#fhQ#QfYc4 zt_xj8p$+5AJwfK^bc9EeGRdKC#n&{meS)U%zw`*|*bU7#w%yEFRKR>Dx47TiFGLQS zc2z*wS((JI>r`D7NUnFjuJct&vY|O?q|atZg+6aLRDWHkc&_FB9h1`7Ig~F)Y@8$$ z!$qaxWdcaD_f^F;JknaVB!nN&)7zOtXdv+=B8^MA5R(#EN!N|M;-r2)TS-}#9_x<3 zX^jB+c4L^Y`&-srw?EkU(-s6N%?ppOO+K6T^f5n)Bj5ODt_s~mkC%l@SKV~c*o|`s z;rXCRls$doff=g;Tj*r9kbhFR(ioHO{O3h@c6z`YFXRXr{pYy-NonfZPcIpEcFHlQ z_k=F5QU_T@ZGmn(PcR)+YMWlT0Yo{$RAr$t?5*dvMFwEg(F*AYra36=OT2H`(dHYD3SA+ug*CJu>*ON^*Hj$(6dM7g%frPFfesdKA0}%*I|Udleo` z2m`Ud_*abE3xsUJdSsanl8PmX%cJE4&4>&#kg0v&()rhn?0@$5fBr205|5c*hyMV; Cf{p + + + + +) diff --git a/desktop/src/renderer/pages/DashboardPage.tsx b/desktop/src/renderer/pages/DashboardPage.tsx new file mode 100644 index 0000000..1b15c89 --- /dev/null +++ b/desktop/src/renderer/pages/DashboardPage.tsx @@ -0,0 +1,481 @@ +import { useEffect, useRef, useCallback, useState } from 'react' +import { Link } from 'react-router-dom' +import { Clock, Gamepad2, Plus, Trophy, Target, Loader2, ChevronDown, Timer, Play, Square } from 'lucide-react' +import { useTrackingStore } from '../store/tracking' +import { useAuthStore } from '../store/auth' +import { useMarathonStore } from '../store/marathon' +import { GlassCard } from '../components/ui/GlassCard' +import { NeonButton } from '../components/ui/NeonButton' + +function formatTime(ms: number): string { + const seconds = Math.floor(ms / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + + if (hours > 0) { + const remainingMinutes = minutes % 60 + return `${hours}ч ${remainingMinutes}м` + } else if (minutes > 0) { + return `${minutes}м` + } else { + return `${seconds}с` + } +} + +function formatMinutes(minutes: number): string { + const hours = Math.floor(minutes / 60) + const mins = minutes % 60 + + if (hours > 0) { + return `${hours}ч ${mins}м` + } + return `${mins}м` +} + +function getDifficultyColor(difficulty: string): string { + switch (difficulty) { + case 'easy': return 'text-green-400' + case 'medium': return 'text-yellow-400' + case 'hard': return 'text-red-400' + default: return 'text-gray-400' + } +} + +function getDifficultyLabel(difficulty: string): string { + switch (difficulty) { + case 'easy': return 'Легкий' + case 'medium': return 'Средний' + case 'hard': return 'Сложный' + default: return difficulty + } +} + +export function DashboardPage() { + const { user } = useAuthStore() + const { trackedGames, stats, currentGame, loadTrackedGames, updateStats } = useTrackingStore() + const { + marathons, + selectedMarathonId, + currentAssignment, + isLoading, + loadMarathons, + selectMarathon, + syncTime + } = useMarathonStore() + + // Monitoring state + const [isMonitoring, setIsMonitoring] = useState(false) + const [localSessionSeconds, setLocalSessionSeconds] = useState(0) + + // Refs for time tracking sync + const syncIntervalRef = useRef(null) + const lastSyncedMinutesRef = useRef(0) + const sessionStartRef = useRef(null) + + // Check if we should track time: any tracked game is running + active assignment exists + const isTrackingAssignment = !!(currentGame && currentAssignment && currentAssignment.status === 'active') + + // Sync time to server + const doSyncTime = useCallback(async () => { + if (!currentAssignment || !isTrackingAssignment) { + return + } + + // Calculate total minutes: previous tracked + current session + const sessionDuration = sessionStartRef.current + ? Math.floor((Date.now() - sessionStartRef.current) / 60000) + : 0 + const totalMinutes = currentAssignment.tracked_time_minutes + sessionDuration + + if (totalMinutes !== lastSyncedMinutesRef.current && totalMinutes > 0) { + console.log(`[Sync] Syncing ${totalMinutes} minutes for assignment ${currentAssignment.id}`) + await syncTime(totalMinutes) + lastSyncedMinutesRef.current = totalMinutes + } + }, [currentAssignment, isTrackingAssignment, syncTime]) + + useEffect(() => { + loadTrackedGames() + loadMarathons() + + // Load monitoring status + window.electronAPI.getMonitoringStatus().then(setIsMonitoring) + + // Subscribe to tracking updates + const unsubscribe = window.electronAPI.onTrackingUpdate((newStats) => { + updateStats(newStats) + }) + + // Subscribe to game started event + const unsubGameStarted = window.electronAPI.onGameStarted((gameName, _gameId) => { + console.log(`[Game] Started: ${gameName}`) + sessionStartRef.current = Date.now() + setLocalSessionSeconds(0) + }) + + // Subscribe to game stopped event + const unsubGameStopped = window.electronAPI.onGameStopped((gameName, _duration) => { + console.log(`[Game] Stopped: ${gameName}`) + sessionStartRef.current = null + setLocalSessionSeconds(0) + }) + + // Get initial stats + window.electronAPI.getTrackingStats().then(updateStats) + + return () => { + unsubscribe() + unsubGameStarted() + unsubGameStopped() + } + }, [loadTrackedGames, loadMarathons, updateStats]) + + // Setup sync interval and local timer when tracking + useEffect(() => { + let localTimerInterval: NodeJS.Timeout | null = null + + if (isTrackingAssignment) { + // Start session if not already started + if (!sessionStartRef.current) { + sessionStartRef.current = Date.now() + } + + // Sync immediately when game starts + doSyncTime() + + // Setup periodic sync every 60 seconds + syncIntervalRef.current = setInterval(() => { + doSyncTime() + }, 60000) + + // Update local timer every second for UI + localTimerInterval = setInterval(() => { + if (sessionStartRef.current) { + setLocalSessionSeconds(Math.floor((Date.now() - sessionStartRef.current) / 1000)) + } + }, 1000) + + } else { + // Do final sync when game stops + if (syncIntervalRef.current) { + doSyncTime() + clearInterval(syncIntervalRef.current) + syncIntervalRef.current = null + sessionStartRef.current = null + } + setLocalSessionSeconds(0) + } + + return () => { + if (syncIntervalRef.current) { + clearInterval(syncIntervalRef.current) + syncIntervalRef.current = null + } + if (localTimerInterval) { + clearInterval(localTimerInterval) + } + } + }, [isTrackingAssignment, doSyncTime]) + + // Toggle monitoring + const toggleMonitoring = async () => { + if (isMonitoring) { + await window.electronAPI.stopMonitoring() + setIsMonitoring(false) + } else { + await window.electronAPI.startMonitoring() + setIsMonitoring(true) + } + } + + const todayTime = stats?.totalTimeToday || 0 + const weekTime = stats?.totalTimeWeek || 0 + + const selectedMarathon = marathons.find(m => m.id === selectedMarathonId) + + const renderCurrentChallenge = () => { + if (isLoading) { + return ( +
+ +
+ ) + } + + if (marathons.length === 0) { + return ( +

+ Нет активных марафонов. Присоединитесь к марафону на сайте. +

+ ) + } + + if (!currentAssignment) { + return ( +

+ Нет активного задания. Крутите колесо на сайте! +

+ ) + } + + const assignment = currentAssignment + + // Playthrough assignment + if (assignment.is_playthrough && assignment.playthrough_info) { + // Use localSessionSeconds for live display (updates every second) + const sessionSeconds = isTrackingAssignment ? localSessionSeconds : 0 + const totalSeconds = (assignment.tracked_time_minutes * 60) + sessionSeconds + const totalMinutes = Math.floor(totalSeconds / 60) + const trackedHours = totalMinutes / 60 + const estimatedPoints = Math.floor(trackedHours * 30) + + // Format with seconds when actively tracking + const formatLiveTime = () => { + if (isTrackingAssignment && sessionSeconds > 0) { + const hours = Math.floor(totalSeconds / 3600) + const mins = Math.floor((totalSeconds % 3600) / 60) + const secs = totalSeconds % 60 + if (hours > 0) { + return `${hours}ч ${mins}м ${secs}с` + } + return `${mins}м ${secs}с` + } + return formatMinutes(totalMinutes) + } + + return ( +
+
+
+
+

+ Прохождение: {assignment.game.title} +

+ {isTrackingAssignment && ( + +
+ Идёт запись + + )} +
+ {assignment.playthrough_info.description && ( +

+ {assignment.playthrough_info.description} +

+ )} +
+ {totalSeconds > 0 || isTrackingAssignment ? ( + <> + + + {formatLiveTime()} + + + ~{estimatedPoints} очков + + + ) : ( + + Базово: {assignment.playthrough_info.points} очков + + )} +
+
+
+
+ ) + } + + // Challenge assignment + if (assignment.challenge) { + const challenge = assignment.challenge + return ( +
+
+
+

{challenge.title}

+

{challenge.game.title}

+

+ {challenge.description} +

+
+ + [{getDifficultyLabel(challenge.difficulty)}] + + + +{challenge.points} очков + + {challenge.estimated_time && ( + + ~{challenge.estimated_time} мин + + )} +
+
+
+
+ ) + } + + return ( +

+ Задание загружается... +

+ ) + } + + return ( +
+ {/* Header */} +
+
+

+ Привет, {user?.nickname || 'Игрок'}! +

+

+ {isMonitoring ? (currentGame ? `Играет: ${currentGame}` : 'Мониторинг активен') : 'Мониторинг выключен'} +

+
+
+ {currentGame && isMonitoring && ( +
+
+ {currentGame} +
+ )} + +
+
+ + {/* Stats cards */} +
+ +
+
+ +
+
+

Сегодня

+

{formatTime(todayTime)}

+
+
+
+ + +
+
+ +
+
+

За неделю

+

{formatTime(weekTime)}

+
+
+
+
+ + {/* Current challenge */} + +
+
+ +

Текущий челлендж

+
+ + {/* Marathon selector */} + {marathons.length > 1 && ( +
+ + +
+ )} +
+ + {/* Marathon title for single marathon */} + {marathons.length === 1 && selectedMarathon && ( +

{selectedMarathon.title}

+ )} + + {renderCurrentChallenge()} +
+ + {/* Tracked games */} +
+
+

+ + Отслеживаемые игры +

+ + }> + Добавить + + +
+ + {trackedGames.length === 0 ? ( + + +

+ Нет отслеживаемых игр +

+ + + Добавить игру + + +
+ ) : ( +
+ {trackedGames.slice(0, 4).map((game) => ( + +
+ {currentGame === game.name &&
} +

+ {game.name} +

+
+

+ {formatTime(game.totalTime)} +

+ + ))} +
+ )} + + {trackedGames.length > 4 && ( + + + Показать все ({trackedGames.length}) + + + )} +
+
+ ) +} diff --git a/desktop/src/renderer/pages/GamesPage.tsx b/desktop/src/renderer/pages/GamesPage.tsx new file mode 100644 index 0000000..72a0b48 --- /dev/null +++ b/desktop/src/renderer/pages/GamesPage.tsx @@ -0,0 +1,298 @@ +import { useEffect, useState } from 'react' +import { Gamepad2, Plus, Trash2, Search, FolderOpen, Cpu, RefreshCw, Loader2 } from 'lucide-react' +import { useTrackingStore } from '../store/tracking' +import { GlassCard } from '../components/ui/GlassCard' +import { NeonButton } from '../components/ui/NeonButton' +import { Input } from '../components/ui/Input' +import type { TrackedProcess } from '@shared/types' + +function formatTime(ms: number): string { + const seconds = Math.floor(ms / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + + if (hours > 0) { + const remainingMinutes = minutes % 60 + return `${hours}ч ${remainingMinutes}м` + } else if (minutes > 0) { + return `${minutes}м` + } else { + return `${seconds}с` + } +} + +// System processes to filter out +const SYSTEM_PROCESSES = new Set([ + 'svchost', 'csrss', 'wininit', 'services', 'lsass', 'smss', 'winlogon', + 'dwm', 'explorer', 'taskhost', 'conhost', 'spoolsv', 'searchhost', + 'runtimebroker', 'sihost', 'fontdrvhost', 'ctfmon', 'dllhost', + 'securityhealthservice', 'searchindexer', 'audiodg', 'wudfhost', + 'system', 'registry', 'idle', 'memory compression', 'ntoskrnl', + 'shellexperiencehost', 'startmenuexperiencehost', 'applicationframehost', + 'systemsettings', 'textinputhost', 'searchui', 'cortana', 'lockapp', + 'windowsinternal', 'taskhostw', 'wmiprvse', 'msiexec', 'trustedinstaller', + 'tiworker', 'smartscreen', 'securityhealthsystray', 'sgrmbroker', + 'gamebarpresencewriter', 'gamebar', 'gamebarftserver', + 'microsoftedge', 'msedge', 'chrome', 'firefox', 'opera', 'brave', + 'discord', 'slack', 'teams', 'zoom', 'skype', + 'powershell', 'cmd', 'windowsterminal', 'code', 'devenv', + 'node', 'npm', 'electron', 'vite' +]) + +export function GamesPage() { + const { trackedGames, currentGame, loadTrackedGames, addGame, removeGame } = useTrackingStore() + const [showAddModal, setShowAddModal] = useState(false) + const [searchQuery, setSearchQuery] = useState('') + const [addMode, setAddMode] = useState<'process' | 'manual'>('process') + const [manualGame, setManualGame] = useState({ name: '', executableName: '' }) + const [processes, setProcesses] = useState([]) + const [isLoadingProcesses, setIsLoadingProcesses] = useState(false) + + useEffect(() => { + loadTrackedGames() + }, [loadTrackedGames]) + + const loadProcesses = async () => { + setIsLoadingProcesses(true) + try { + const procs = await window.electronAPI.getRunningProcesses() + // Filter out system processes and already tracked games + const filtered = procs.filter(p => { + const name = p.name.toLowerCase().replace('.exe', '') + return !SYSTEM_PROCESSES.has(name) && + !trackedGames.some(tg => + tg.executableName.toLowerCase().replace('.exe', '') === name + ) + }) + setProcesses(filtered) + } catch (error) { + console.error('Failed to load processes:', error) + } finally { + setIsLoadingProcesses(false) + } + } + + useEffect(() => { + if (showAddModal && addMode === 'process') { + loadProcesses() + } + }, [showAddModal, addMode]) + + const filteredProcesses = processes.filter( + (proc) => + proc.name.toLowerCase().includes(searchQuery.toLowerCase()) || + (proc.windowTitle && proc.windowTitle.toLowerCase().includes(searchQuery.toLowerCase())) + ) + + const handleAddProcess = async (process: TrackedProcess) => { + const name = process.windowTitle || process.displayName || process.name.replace('.exe', '') + await addGame({ + id: `proc_${Date.now()}`, + name: name, + executableName: process.name, + executablePath: process.executablePath, + }) + setShowAddModal(false) + setSearchQuery('') + } + + const handleAddManualGame = async () => { + if (!manualGame.name || !manualGame.executableName) return + + await addGame({ + id: `manual_${Date.now()}`, + name: manualGame.name, + executableName: manualGame.executableName, + }) + setShowAddModal(false) + setManualGame({ name: '', executableName: '' }) + } + + const handleRemoveGame = async (gameId: string) => { + if (confirm('Удалить игру из отслеживания?')) { + await removeGame(gameId) + } + } + + return ( +
+ {/* Header */} +
+

+ + Игры +

+ } + onClick={() => setShowAddModal(true)} + > + Добавить + +
+ + {/* Games list */} + {trackedGames.length === 0 ? ( + + +

Нет игр

+

+ Добавьте игры для отслеживания времени +

+ setShowAddModal(true)}> + Добавить игру + +
+ ) : ( +
+ {trackedGames.map((game) => ( + +
+ {currentGame === game.name &&
} +
+

{game.name}

+

+ {formatTime(game.totalTime)} наиграно + {game.steamAppId && ' • Steam'} +

+
+
+ + + ))} +
+ )} + + {/* Add game modal */} + {showAddModal && ( +
+ +
+

Добавить игру

+ +
+ + {/* Mode tabs */} +
+ + +
+ + {addMode === 'process' && ( + <> +
+
+ setSearchQuery(e.target.value)} + icon={} + /> +
+ +
+

+ Запустите игру и нажмите обновить +

+
+ {isLoadingProcesses ? ( +
+ +
+ ) : filteredProcesses.length === 0 ? ( +

+ {processes.length === 0 ? 'Нет подходящих процессов' : 'Ничего не найдено'} +

+ ) : ( + filteredProcesses.slice(0, 20).map((proc) => ( + + )) + )} +
+ + )} + + {addMode === 'manual' && ( +
+ setManualGame({ ...manualGame, name: e.target.value })} + /> + setManualGame({ ...manualGame, executableName: e.target.value })} + /> + + Добавить + +
+ )} +
+
+ )} +
+ ) +} diff --git a/desktop/src/renderer/pages/LoginPage.tsx b/desktop/src/renderer/pages/LoginPage.tsx new file mode 100644 index 0000000..f9c1f2a --- /dev/null +++ b/desktop/src/renderer/pages/LoginPage.tsx @@ -0,0 +1,183 @@ +import { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import { Gamepad2, User, Lock, X, Minus, Shield, ArrowLeft } from 'lucide-react' +import { useAuthStore } from '../store/auth' +import { NeonButton } from '../components/ui/NeonButton' +import { Input } from '../components/ui/Input' + +export function LoginPage() { + const navigate = useNavigate() + const { login, verify2fa, isLoading, error, clearError, requires2fa, reset2fa } = useAuthStore() + const [formData, setFormData] = useState({ + login: '', + password: '', + }) + const [twoFactorCode, setTwoFactorCode] = useState('') + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + const success = await login(formData.login, formData.password) + if (success) { + navigate('/') + } + } + + const handle2faSubmit = async (e: React.FormEvent) => { + e.preventDefault() + const success = await verify2fa(twoFactorCode) + if (success) { + navigate('/') + } + } + + const handleBack = () => { + reset2fa() + setTwoFactorCode('') + } + + return ( +
+ {/* Custom title bar */} +
+
+ + Game Marathon Tracker +
+
+ + +
+
+ + {/* Login form */} +
+
+ {/* Logo */} +
+
+ {requires2fa ? ( + + ) : ( + + )} +
+

+ {requires2fa ? 'Подтверждение' : 'Game Marathon'} +

+

+ {requires2fa + ? 'Введите код из Telegram' + : 'Войдите в свой аккаунт'} +

+
+ + {requires2fa ? ( + /* 2FA Form */ +
+ { + setTwoFactorCode(e.target.value.replace(/\D/g, '').slice(0, 6)) + clearError() + }} + icon={} + placeholder="000000" + maxLength={6} + required + autoFocus + /> + + {error && ( +
+

{error}

+
+ )} + + + Подтвердить + + + + + ) : ( + /* Login Form */ +
+ { + setFormData({ ...formData, login: e.target.value }) + clearError() + }} + icon={} + placeholder="Введите логин" + required + /> + + { + setFormData({ ...formData, password: e.target.value }) + clearError() + }} + icon={} + placeholder="Введите пароль" + required + /> + + {error && ( +
+

{error}

+
+ )} + + + Войти + + + )} + + {/* Footer */} + {!requires2fa && ( +

+ Нет аккаунта? Зарегистрируйтесь на сайте +

+ )} +
+
+
+ ) +} diff --git a/desktop/src/renderer/pages/SettingsPage.tsx b/desktop/src/renderer/pages/SettingsPage.tsx new file mode 100644 index 0000000..584846f --- /dev/null +++ b/desktop/src/renderer/pages/SettingsPage.tsx @@ -0,0 +1,267 @@ +import { useEffect, useState } from 'react' +import { Settings, Power, Monitor, Clock, Globe, LogOut, Download, RefreshCw, Check, AlertCircle } from 'lucide-react' +import { useNavigate } from 'react-router-dom' +import { useAuthStore } from '../store/auth' +import { GlassCard } from '../components/ui/GlassCard' +import { NeonButton } from '../components/ui/NeonButton' +import { Input } from '../components/ui/Input' +import type { AppSettings } from '@shared/types' + +export function SettingsPage() { + const navigate = useNavigate() + const { user, logout } = useAuthStore() + const [settings, setSettings] = useState(null) + const [isSaving, setIsSaving] = useState(false) + const [appVersion, setAppVersion] = useState('') + const [updateStatus, setUpdateStatus] = useState<'idle' | 'checking' | 'available' | 'not-available' | 'error'>('idle') + const [updateVersion, setUpdateVersion] = useState('') + const [updateError, setUpdateError] = useState('') + + useEffect(() => { + window.electronAPI.getSettings().then(setSettings) + window.electronAPI.getAppVersion().then(setAppVersion) + }, []) + + const handleCheckForUpdates = async () => { + setUpdateStatus('checking') + setUpdateError('') + try { + const result = await window.electronAPI.checkForUpdates() + if (result.error) { + setUpdateStatus('error') + setUpdateError(result.error) + } else if (result.available) { + setUpdateStatus('available') + setUpdateVersion(result.version || '') + } else { + setUpdateStatus('not-available') + } + } catch (err) { + setUpdateStatus('error') + setUpdateError('Ошибка проверки') + } + } + + const handleInstallUpdate = () => { + window.electronAPI.installUpdate() + } + + const handleToggle = async (key: keyof AppSettings, value: boolean) => { + if (!settings) return + setIsSaving(true) + try { + await window.electronAPI.saveSettings({ [key]: value }) + setSettings({ ...settings, [key]: value }) + } finally { + setIsSaving(false) + } + } + + const handleApiUrlChange = async (url: string) => { + if (!settings) return + setSettings({ ...settings, apiUrl: url }) + } + + const handleApiUrlSave = async () => { + if (!settings) return + setIsSaving(true) + try { + await window.electronAPI.saveSettings({ apiUrl: settings.apiUrl }) + } finally { + setIsSaving(false) + } + } + + const handleLogout = async () => { + await logout() + navigate('/login') + } + + if (!settings) { + return ( +
+
+
+ ) + } + + return ( +
+ {/* Header */} +
+ +

Настройки

+
+ + {/* User info */} + +
+
+ + {user?.nickname?.charAt(0).toUpperCase() || 'U'} + +
+
+

{user?.nickname}

+

@{user?.login}

+
+
+ } onClick={handleLogout}> + Выйти + +
+ + {/* Settings */} +
+ {/* Auto-launch */} + +
+
+ +
+
+

Автозапуск

+

Запускать при старте Windows

+
+
+ +
+ + {/* Minimize to tray */} + +
+
+ +
+
+

Сворачивать в трей

+

При закрытии скрывать в трей

+
+
+ +
+ + {/* Tracking interval */} + +
+
+ +
+
+

Интервал проверки

+

Как часто проверять процессы

+
+
+ +
+ + {/* Updates */} + +
+
+
+ +
+
+

Обновления

+

+ {updateStatus === 'checking' && 'Проверка...'} + {updateStatus === 'available' && `Доступна v${updateVersion}`} + {updateStatus === 'not-available' && 'Актуальная версия'} + {updateStatus === 'error' && (updateError || 'Ошибка')} + {updateStatus === 'idle' && `Текущая версия: v${appVersion}`} +

+
+
+ {updateStatus === 'available' ? ( + + Установить + + ) : ( + + )} +
+
+ + {/* API URL (for developers) */} + +
+
+ +
+
+

API URL

+

Для разработки

+
+
+
+ handleApiUrlChange(e.target.value)} + placeholder="http://localhost:8000/api/v1" + className="flex-1" + /> + + Сохранить + +
+
+
+ + {/* Version */} +

+ Game Marathon Tracker v{appVersion || '...'} +

+
+ ) +} diff --git a/desktop/src/renderer/splash.html b/desktop/src/renderer/splash.html new file mode 100644 index 0000000..32c4f1a --- /dev/null +++ b/desktop/src/renderer/splash.html @@ -0,0 +1,104 @@ + + + + + + Game Marathon Tracker + + + + Logo +
Проверка обновлений...
+
+
+
+
+ + + + diff --git a/desktop/src/renderer/store/auth.ts b/desktop/src/renderer/store/auth.ts new file mode 100644 index 0000000..f851530 --- /dev/null +++ b/desktop/src/renderer/store/auth.ts @@ -0,0 +1,149 @@ +import { create } from 'zustand' +import type { User } from '@shared/types' + +interface AuthState { + user: User | null + token: string | null + isAuthenticated: boolean + isLoading: boolean + error: string | null + // 2FA state + requires2fa: boolean + twoFactorSessionId: number | null + + login: (login: string, password: string) => Promise + verify2fa: (code: string) => Promise + logout: () => Promise + syncUser: () => Promise + clearError: () => void + reset2fa: () => void +} + +export const useAuthStore = create((set, get) => ({ + user: null, + token: null, + isAuthenticated: false, + isLoading: true, + error: null, + requires2fa: false, + twoFactorSessionId: null, + + login: async (login: string, password: string) => { + set({ isLoading: true, error: null, requires2fa: false, twoFactorSessionId: null }) + + const result = await window.electronAPI.apiLogin(login, password) + + if (!result.success) { + set({ + isLoading: false, + error: typeof result.error === 'string' ? result.error : 'Ошибка авторизации', + }) + return false + } + + const response = result.data! + + if (response.requires_2fa && response.two_factor_session_id) { + set({ + isLoading: false, + requires2fa: true, + twoFactorSessionId: response.two_factor_session_id, + }) + return false // Not fully logged in yet + } + + if (response.access_token && response.user) { + set({ + user: response.user, + token: response.access_token, + isAuthenticated: true, + isLoading: false, + }) + return true + } + + set({ isLoading: false }) + return false + }, + + verify2fa: async (code: string) => { + const sessionId = get().twoFactorSessionId + if (!sessionId) { + set({ error: 'Нет активной сессии 2FA' }) + return false + } + + set({ isLoading: true, error: null }) + + const result = await window.electronAPI.api2faVerify(sessionId, code) + + if (!result.success) { + set({ + isLoading: false, + error: typeof result.error === 'string' ? result.error : 'Неверный код', + }) + return false + } + + const response = result.data! + + if (response.access_token && response.user) { + set({ + user: response.user, + token: response.access_token, + isAuthenticated: true, + isLoading: false, + requires2fa: false, + twoFactorSessionId: null, + }) + return true + } + + set({ isLoading: false }) + return false + }, + + reset2fa: () => set({ requires2fa: false, twoFactorSessionId: null, error: null }), + + logout: async () => { + await window.electronAPI.clearToken() + set({ + user: null, + token: null, + isAuthenticated: false, + error: null, + }) + }, + + syncUser: async () => { + set({ isLoading: true }) + + const token = await window.electronAPI.getToken() + if (!token) { + set({ isLoading: false, isAuthenticated: false }) + return + } + + const result = await window.electronAPI.apiGetMe() + + if (!result.success) { + await window.electronAPI.clearToken() + set({ + user: null, + token: null, + isAuthenticated: false, + isLoading: false, + }) + return + } + + set({ + user: result.data!, + token, + isAuthenticated: true, + isLoading: false, + }) + }, + + clearError: () => set({ error: null }), +})) diff --git a/desktop/src/renderer/store/marathon.ts b/desktop/src/renderer/store/marathon.ts new file mode 100644 index 0000000..090bb9d --- /dev/null +++ b/desktop/src/renderer/store/marathon.ts @@ -0,0 +1,123 @@ +import { create } from 'zustand' +import { persist } from 'zustand/middleware' +import type { MarathonResponse, AssignmentResponse } from '@shared/types' + +interface MarathonState { + marathons: MarathonResponse[] + selectedMarathonId: number | null + currentAssignment: AssignmentResponse | null + isLoading: boolean + error: string | null + + loadMarathons: () => Promise + selectMarathon: (marathonId: number) => Promise + loadCurrentAssignment: () => Promise + syncTime: (minutes: number) => Promise + reset: () => void +} + +export const useMarathonStore = create()( + persist( + (set, get) => ({ + marathons: [], + selectedMarathonId: null, + currentAssignment: null, + isLoading: false, + error: null, + + loadMarathons: async () => { + set({ isLoading: true, error: null }) + + const result = await window.electronAPI.apiRequest('GET', '/marathons') + + if (!result.success) { + set({ isLoading: false, error: result.error || 'Failed to load marathons' }) + return + } + + const marathons = result.data || [] + const activeMarathons = marathons.filter(m => m.status === 'active') + + set({ marathons: activeMarathons, isLoading: false }) + + // If we have a selected marathon, verify it's still valid + const { selectedMarathonId } = get() + if (selectedMarathonId) { + const stillExists = activeMarathons.some(m => m.id === selectedMarathonId) + if (!stillExists && activeMarathons.length > 0) { + // Select first available marathon + await get().selectMarathon(activeMarathons[0].id) + } else if (stillExists) { + // Reload assignment for current selection + await get().loadCurrentAssignment() + } + } else if (activeMarathons.length > 0) { + // No selection, select first marathon + await get().selectMarathon(activeMarathons[0].id) + } + }, + + selectMarathon: async (marathonId: number) => { + set({ selectedMarathonId: marathonId, currentAssignment: null }) + await get().loadCurrentAssignment() + }, + + loadCurrentAssignment: async () => { + const { selectedMarathonId } = get() + if (!selectedMarathonId) { + set({ currentAssignment: null }) + return + } + + const result = await window.electronAPI.apiRequest( + 'GET', + `/marathons/${selectedMarathonId}/current-assignment` + ) + + if (result.success) { + set({ currentAssignment: result.data ?? null }) + } else { + // User might not be participant of this marathon + set({ currentAssignment: null, error: result.error }) + } + }, + + syncTime: async (minutes: number) => { + const { currentAssignment } = get() + if (!currentAssignment || currentAssignment.status !== 'active') { + return + } + + const result = await window.electronAPI.apiRequest( + 'PATCH', + `/assignments/${currentAssignment.id}/track-time`, + { minutes } + ) + + if (result.success) { + // Update local assignment with new tracked time + set({ + currentAssignment: { + ...currentAssignment, + tracked_time_minutes: minutes + } + }) + } + }, + + reset: () => { + set({ + marathons: [], + selectedMarathonId: null, + currentAssignment: null, + isLoading: false, + error: null + }) + } + }), + { + name: 'marathon-storage', + partialize: (state) => ({ selectedMarathonId: state.selectedMarathonId }) + } + ) +) diff --git a/desktop/src/renderer/store/tracking.ts b/desktop/src/renderer/store/tracking.ts new file mode 100644 index 0000000..d6d03eb --- /dev/null +++ b/desktop/src/renderer/store/tracking.ts @@ -0,0 +1,81 @@ +import { create } from 'zustand' +import type { TrackedGame, TrackingStats, SteamGame } from '@shared/types' + +interface TrackingState { + trackedGames: TrackedGame[] + steamGames: SteamGame[] + stats: TrackingStats | null + currentGame: string | null + isLoading: boolean + + loadTrackedGames: () => Promise + loadSteamGames: () => Promise + addGame: (game: Omit) => Promise + removeGame: (gameId: string) => Promise + updateStats: (stats: TrackingStats) => void + setCurrentGame: (gameName: string | null) => void +} + +export const useTrackingStore = create((set) => ({ + trackedGames: [], + steamGames: [], + stats: null, + currentGame: null, + isLoading: false, + + loadTrackedGames: async () => { + set({ isLoading: true }) + try { + const games = await window.electronAPI.getTrackedGames() + set({ trackedGames: games, isLoading: false }) + } catch (error) { + console.error('Failed to load tracked games:', error) + set({ isLoading: false }) + } + }, + + loadSteamGames: async () => { + try { + const games = await window.electronAPI.getSteamGames() + set({ steamGames: games }) + } catch (error) { + console.error('Failed to load Steam games:', error) + } + }, + + addGame: async (game) => { + try { + const newGame = await window.electronAPI.addTrackedGame(game) + set((state) => ({ + trackedGames: [...state.trackedGames, newGame], + })) + } catch (error) { + console.error('Failed to add game:', error) + throw error + } + }, + + removeGame: async (gameId) => { + try { + await window.electronAPI.removeTrackedGame(gameId) + set((state) => ({ + trackedGames: state.trackedGames.filter((g) => g.id !== gameId), + })) + } catch (error) { + console.error('Failed to remove game:', error) + throw error + } + }, + + updateStats: (stats) => { + if (stats.currentGame) { + console.log('[Tracking] Current game:', stats.currentGame, 'Session:', Math.floor((stats.currentSessionDuration || 0) / 1000), 's') + } + set({ + stats, + currentGame: stats.currentGame || null + }) + }, + + setCurrentGame: (gameName) => set({ currentGame: gameName }), +})) diff --git a/desktop/src/renderer/vite-env.d.ts b/desktop/src/renderer/vite-env.d.ts new file mode 100644 index 0000000..313dcc7 --- /dev/null +++ b/desktop/src/renderer/vite-env.d.ts @@ -0,0 +1,54 @@ +/// + +import type { AppSettings, TrackedProcess, SteamGame, TrackedGame, TrackingStats, User, LoginResponse } from '@shared/types' + +interface ApiResult { + success: boolean + data?: T + error?: string + status?: number +} + +declare global { + interface Window { + electronAPI: { + // Settings + getSettings: () => Promise + saveSettings: (settings: Partial) => Promise + + // Auth (local storage) + getToken: () => Promise + saveToken: (token: string) => Promise + clearToken: () => Promise + + // API calls (through main process - no CORS) + apiLogin: (login: string, password: string) => Promise> + api2faVerify: (sessionId: number, code: string) => Promise> + apiGetMe: () => Promise> + apiRequest: (method: string, endpoint: string, data?: unknown) => Promise> + + // Process tracking + getRunningProcesses: () => Promise + getForegroundWindow: () => Promise + getTrackingStats: () => Promise + + // Steam + getSteamGames: () => Promise + getSteamPath: () => Promise + + // Tracked games + getTrackedGames: () => Promise + addTrackedGame: (game: Omit) => Promise + removeTrackedGame: (gameId: string) => Promise + + // Window controls + minimizeToTray: () => void + quitApp: () => void + + // Events + onTrackingUpdate: (callback: (stats: TrackingStats) => void) => () => void + onGameStarted: (callback: (gameName: string) => void) => () => void + onGameStopped: (callback: (gameName: string, duration: number) => void) => () => void + } + } +} diff --git a/desktop/src/shared/types.ts b/desktop/src/shared/types.ts new file mode 100644 index 0000000..d4a0e99 --- /dev/null +++ b/desktop/src/shared/types.ts @@ -0,0 +1,226 @@ +// Shared types between main and renderer processes + +export interface User { + id: number + login: string + nickname: string + avatar_url?: string + role: 'USER' | 'ADMIN' +} + +export interface TokenResponse { + access_token: string + token_type: string + user: User +} + +export interface LoginResponse { + access_token?: string + token_type?: string + user?: User + requires_2fa?: boolean + two_factor_session_id?: number +} + +// API Response types +export interface MarathonResponse { + id: number + title: string + description?: string + status: 'preparing' | 'active' | 'finished' + start_date?: string + end_date?: string + cover_url?: string + is_public: boolean + participation?: { + is_organizer: boolean + points: number + completed_count: number + dropped_count: number + } +} + +export interface GameShort { + id: number + title: string + cover_url?: string + download_url?: string + game_type?: 'challenges' | 'playthrough' +} + +export interface ChallengeResponse { + id: number + title: string + description: string + type: string + difficulty: 'easy' | 'medium' | 'hard' + points: number + estimated_time?: number + proof_type: string + proof_hint?: string + game: GameShort + is_generated: boolean +} + +export interface PlaythroughInfo { + description?: string + points: number + proof_type: string + proof_hint?: string +} + +export interface AssignmentResponse { + id: number + challenge?: ChallengeResponse + game: GameShort + is_playthrough: boolean + playthrough_info?: PlaythroughInfo + status: 'active' | 'completed' | 'dropped' | 'returned' + proof_url?: string + proof_comment?: string + points_earned: number + tracked_time_minutes: number + started_at: string + completed_at?: string + can_drop: boolean + drop_penalty: number + event_type?: string +} + +export interface Marathon { + id: number + title: string + description?: string + status: 'lobby' | 'active' | 'finished' + start_date: string + end_date?: string + cover_url?: string +} + +export interface Game { + id: number + name: string + genre?: string + cover_url?: string + marathon_id: number +} + +export interface Challenge { + id: number + game_id: number + title: string + description: string + type: string + difficulty: 'easy' | 'medium' | 'hard' + points: number + estimated_time: number + proof_type: string + proof_hint?: string +} + +export interface Assignment { + id: number + participant_id: number + game_id: number + challenge_id?: number + game: Game + challenge?: Challenge + status: 'active' | 'completed' | 'dropped' + started_at: string + completed_at?: string + time_spent_minutes?: number +} + +export interface CurrentChallenge { + marathon: Marathon + assignment?: Assignment +} + +// Process tracking types +export interface TrackedProcess { + id: string + name: string + displayName: string + executablePath?: string + windowTitle?: string + isGame: boolean + steamAppId?: string +} + +export interface GameSession { + gameId: string + gameName: string + startTime: number + endTime?: number + duration: number + isActive: boolean +} + +export interface TrackingStats { + totalTimeToday: number + totalTimeWeek: number + totalTimeMonth: number + sessions: GameSession[] + currentGame?: string | null + currentSessionDuration?: number +} + +export interface SteamGame { + appId: string + name: string + installDir: string + executable?: string + iconPath?: string +} + +export interface TrackedGame { + id: string + name: string + executableName: string + executablePath?: string + steamAppId?: string + iconPath?: string + totalTime: number + lastPlayed?: number +} + +export interface AppSettings { + autoLaunch: boolean + minimizeToTray: boolean + trackingInterval: number + apiUrl: string + theme: 'dark' +} + +// IPC Channel types +export interface IpcChannels { + // Settings + 'get-settings': () => AppSettings + 'save-settings': (settings: Partial) => void + + // Auth + 'get-token': () => string | null + 'save-token': (token: string) => void + 'clear-token': () => void + + // Process tracking + 'get-running-processes': () => TrackedProcess[] + 'get-foreground-window': () => string | null + 'start-tracking': (processName: string) => void + 'stop-tracking': () => void + 'get-tracking-stats': () => TrackingStats + + // Steam + 'get-steam-games': () => SteamGame[] + 'get-steam-path': () => string | null + + // Tracked games + 'get-tracked-games': () => TrackedGame[] + 'add-tracked-game': (game: Omit) => TrackedGame + 'remove-tracked-game': (gameId: string) => void + 'update-game-time': (gameId: string, time: number) => void + + // Window + 'minimize-to-tray': () => void + 'quit-app': () => void +} diff --git a/desktop/tailwind.config.js b/desktop/tailwind.config.js new file mode 100644 index 0000000..58be014 --- /dev/null +++ b/desktop/tailwind.config.js @@ -0,0 +1,147 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/renderer/index.html", + "./src/renderer/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + dark: { + 950: '#08090d', + 900: '#0d0e14', + 800: '#14161e', + 700: '#1c1e28', + 600: '#252732', + 500: '#2e313d', + }, + neon: { + 50: '#ecfeff', + 100: '#cffafe', + 200: '#a5f3fc', + 300: '#67e8f9', + 400: '#67e8f9', + 500: '#22d3ee', + 600: '#06b6d4', + 700: '#0891b2', + 800: '#155e75', + 900: '#164e63', + }, + accent: { + 50: '#f5f3ff', + 100: '#ede9fe', + 200: '#ddd6fe', + 300: '#c4b5fd', + 400: '#a78bfa', + 500: '#8b5cf6', + 600: '#7c3aed', + 700: '#6d28d9', + 800: '#5b21b6', + 900: '#4c1d95', + }, + pink: { + 400: '#f472b6', + 500: '#ec4899', + 600: '#db2777', + }, + primary: { + 50: '#ecfeff', + 100: '#cffafe', + 200: '#a5f3fc', + 300: '#67e8f9', + 400: '#67e8f9', + 500: '#22d3ee', + 600: '#06b6d4', + 700: '#0891b2', + 800: '#155e75', + 900: '#164e63', + }, + }, + fontFamily: { + sans: ['Inter', 'system-ui', 'sans-serif'], + mono: ['JetBrains Mono', 'monospace'], + display: ['Orbitron', 'sans-serif'], + }, + animation: { + 'spin-slow': 'spin 3s linear infinite', + 'fade-in': 'fade-in 0.3s ease-out forwards', + 'slide-up': 'slide-up 0.3s ease-out forwards', + 'glow-pulse': 'glow-pulse 2s ease-in-out infinite', + 'float': 'float 6s ease-in-out infinite', + 'shimmer': 'shimmer 2s linear infinite', + 'slide-in-up': 'slide-in-up 0.4s ease-out forwards', + 'scale-in': 'scale-in 0.2s ease-out forwards', + 'bounce-in': 'bounce-in 0.5s ease-out forwards', + 'pulse-neon': 'pulse-neon 2s ease-in-out infinite', + }, + keyframes: { + 'fade-in': { + '0%': { opacity: '0' }, + '100%': { opacity: '1' }, + }, + 'slide-up': { + '0%': { opacity: '0', transform: 'translateY(10px)' }, + '100%': { opacity: '1', transform: 'translateY(0)' }, + }, + 'glow-pulse': { + '0%, 100%': { + boxShadow: '0 0 6px rgba(34, 211, 238, 0.4), 0 0 12px rgba(34, 211, 238, 0.2)' + }, + '50%': { + boxShadow: '0 0 10px rgba(34, 211, 238, 0.5), 0 0 20px rgba(34, 211, 238, 0.3)' + }, + }, + 'float': { + '0%, 100%': { transform: 'translateY(0)' }, + '50%': { transform: 'translateY(-10px)' }, + }, + 'shimmer': { + '0%': { backgroundPosition: '-200% 0' }, + '100%': { backgroundPosition: '200% 0' }, + }, + 'slide-in-up': { + '0%': { opacity: '0', transform: 'translateY(30px)' }, + '100%': { opacity: '1', transform: 'translateY(0)' }, + }, + 'scale-in': { + '0%': { opacity: '0', transform: 'scale(0.9)' }, + '100%': { opacity: '1', transform: 'scale(1)' }, + }, + 'bounce-in': { + '0%': { opacity: '0', transform: 'scale(0.3)' }, + '50%': { transform: 'scale(1.05)' }, + '70%': { transform: 'scale(0.9)' }, + '100%': { opacity: '1', transform: 'scale(1)' }, + }, + 'pulse-neon': { + '0%, 100%': { + textShadow: '0 0 6px rgba(34, 211, 238, 0.5), 0 0 12px rgba(34, 211, 238, 0.25)' + }, + '50%': { + textShadow: '0 0 10px rgba(34, 211, 238, 0.6), 0 0 18px rgba(34, 211, 238, 0.35)' + }, + }, + }, + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'neon-glow': 'linear-gradient(90deg, #22d3ee, #8b5cf6, #22d3ee)', + 'cyber-grid': ` + linear-gradient(rgba(34, 211, 238, 0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(34, 211, 238, 0.02) 1px, transparent 1px) + `, + }, + backgroundSize: { + 'grid': '50px 50px', + }, + boxShadow: { + 'neon': '0 0 8px rgba(34, 211, 238, 0.4), 0 0 16px rgba(34, 211, 238, 0.2)', + 'neon-lg': '0 0 12px rgba(34, 211, 238, 0.5), 0 0 24px rgba(34, 211, 238, 0.3)', + 'neon-purple': '0 0 8px rgba(139, 92, 246, 0.4), 0 0 16px rgba(139, 92, 246, 0.2)', + 'neon-pink': '0 0 8px rgba(244, 114, 182, 0.4), 0 0 16px rgba(244, 114, 182, 0.2)', + 'inner-glow': 'inset 0 0 20px rgba(34, 211, 238, 0.06)', + 'glass': '0 8px 32px 0 rgba(0, 0, 0, 0.37)', + }, + }, + }, + plugins: [], +} diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json new file mode 100644 index 0000000..31012f8 --- /dev/null +++ b/desktop/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/renderer/*"], + "@shared/*": ["src/shared/*"] + } + }, + "include": ["src/renderer/**/*", "src/shared/**/*"], + "references": [{ "path": "./tsconfig.main.json" }] +} diff --git a/desktop/tsconfig.main.json b/desktop/tsconfig.main.json new file mode 100644 index 0000000..6cc67b7 --- /dev/null +++ b/desktop/tsconfig.main.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "lib": ["ES2020"], + "outDir": "dist/main", + "rootDir": "src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": false, + "declarationMap": false, + "sourceMap": true + }, + "include": ["src/main/**/*", "src/shared/**/*", "src/preload/**/*"] +} diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts new file mode 100644 index 0000000..1523c3d --- /dev/null +++ b/desktop/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + root: 'src/renderer', + base: './', + build: { + outDir: '../../dist/renderer', + emptyOutDir: true, + }, + resolve: { + alias: { + '@': path.resolve(__dirname, 'src/renderer'), + '@shared': path.resolve(__dirname, 'src/shared'), + }, + }, + server: { + port: 5173, + }, +})