From 9404e34bd32b9c81ddae9d2d164b44e67ee503ed Mon Sep 17 00:00:00 2001 From: nap0o Date: Mon, 2 Mar 2026 23:40:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AF=BC=E5=85=A5=E6=9B=B4=E5=A4=9AApp?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- backend/package.json | 16 +- backend/schema.sql | 12 +- .../auth/providers/baseOAuthProvider.ts | 3 +- .../providers/cloudflareAccessProvider.ts | 22 +- .../features/auth/providers/giteeProvider.ts | 4 +- .../features/auth/providers/githubProvider.ts | 2 +- .../features/auth/providers/googleProvider.ts | 7 +- .../auth/providers/nodeLocProvider.ts | 2 +- .../auth/providers/telegramProvider.ts | 2 +- backend/src/features/vault/vaultService.ts | 114 ++- backend/src/shared/db/db.ts | 11 +- .../shared/db/repositories/vaultRepository.ts | 18 + backend/src/shared/db/schema.ts | 2 + frontend/package.json | 19 +- frontend/public/pwa-192x192.png | Bin 1367 -> 1141 bytes frontend/public/pwa-512x512.png | Bin 3926 -> 3344 bytes frontend/public/sql-wasm.wasm | Bin 0 -> 659734 bytes frontend/src/app/router.js | 10 +- frontend/src/app/styles/main.css | 7 + .../auth/composables/useOAuthCallback.js | 124 +++ .../auth/composables/useOAuthProviders.js | 77 ++ .../src/features/auth/service/authService.js | 99 +++ .../store/{userStore.js => authUserStore.js} | 26 +- frontend/src/features/auth/views/login.vue | 88 +-- .../src/features/auth/views/oauthCallback.vue | 127 +-- .../backup/components/backupSettings.vue | 264 ++----- .../backup/composables/useBackupActions.js | 146 ++++ .../backup/composables/useBackupProviders.js | 166 ++++ .../features/backup/service/backupService.js | 158 ++++ .../backup/service/migrationService.js | 171 ----- .../src/features/backup/views/dataExport.vue | 119 --- .../src/features/backup/views/dataImport.vue | 117 --- .../migration/composables/useDataExport.js | 208 +++++ .../migration/composables/useDataImport.js | 291 +++++++ .../migration/service/dataMigrationService.js | 722 ++++++++++++++++++ .../features/migration/views/dataExport.vue | 343 +++++++++ .../features/migration/views/dataImport.vue | 254 ++++++ .../migration/views/dataMigration.vue | 30 + .../features/tools/components/timeSync.vue | 53 +- .../features/tools/components/totpSecret.vue | 212 +---- .../features/tools/composables/useTimeSync.js | 65 ++ .../tools/composables/useTotpToolbox.js | 159 ++++ .../composables/useTotpToolboxActions.js | 74 ++ .../src/features/tools/service/toolService.js | 23 + .../vault/components/addVaultManual.vue | 7 +- .../vault/components/addVaultScan.vue | 7 +- .../features/vault/components/appSidebar.vue | 6 +- .../features/vault/components/vaultList.vue | 375 ++------- .../vault/composables/useTotpTimer.js | 96 +++ .../vault/composables/useVaultActions.js | 191 +++++ .../vault/composables/useVaultList.js | 144 ++++ .../features/vault/service/vaultService.js | 150 ++++ frontend/src/features/vault/views/home.vue | 4 +- frontend/src/main.js | 23 +- .../src/shared/components/icons/icon2FAS.vue | 11 + .../src/shared/components/icons/iconAegis.vue | 8 + .../shared/components/icons/iconBitwarden.vue | 8 + .../components/icons/iconCloudflare.vue | 8 + .../src/shared/components/icons/iconGitee.vue | 9 + .../shared/components/icons/iconGithub.vue | 8 + .../shared/components/icons/iconGoogle.vue | 8 + .../components/icons/iconGoogleAuth.vue | 8 + .../components/icons/iconMicrosoftAuth.vue | 13 + .../shared/components/icons/iconNodeloc.vue | 21 + .../shared/components/icons/iconTelegram.vue | 8 + frontend/src/shared/components/theFooter.vue | 2 +- frontend/src/shared/components/theHeader.vue | 12 +- frontend/src/shared/utils/encoding.js | 28 + frontend/src/shared/utils/errors/authError.js | 14 + .../src/shared/utils/errors/backupError.js | 13 + .../src/shared/utils/errors/migrationError.js | 8 + .../src/shared/utils/errors/toolsError.js | 14 + .../src/shared/utils/errors/vaultError.js | 12 + frontend/src/shared/utils/request.js | 6 +- .../shared/utils/serializers/aegisStrategy.js | 72 ++ .../shared/utils/serializers/csvStrategy.js | 67 ++ .../shared/utils/serializers/gauthStrategy.js | 129 ++++ frontend/vite.config.js | 23 +- 79 files changed, 4414 insertions(+), 1474 deletions(-) create mode 100755 frontend/public/sql-wasm.wasm create mode 100644 frontend/src/features/auth/composables/useOAuthCallback.js create mode 100644 frontend/src/features/auth/composables/useOAuthProviders.js create mode 100644 frontend/src/features/auth/service/authService.js rename frontend/src/features/auth/store/{userStore.js => authUserStore.js} (69%) create mode 100644 frontend/src/features/backup/composables/useBackupActions.js create mode 100644 frontend/src/features/backup/composables/useBackupProviders.js create mode 100644 frontend/src/features/backup/service/backupService.js delete mode 100644 frontend/src/features/backup/service/migrationService.js delete mode 100644 frontend/src/features/backup/views/dataExport.vue delete mode 100644 frontend/src/features/backup/views/dataImport.vue create mode 100644 frontend/src/features/migration/composables/useDataExport.js create mode 100644 frontend/src/features/migration/composables/useDataImport.js create mode 100644 frontend/src/features/migration/service/dataMigrationService.js create mode 100644 frontend/src/features/migration/views/dataExport.vue create mode 100644 frontend/src/features/migration/views/dataImport.vue create mode 100644 frontend/src/features/migration/views/dataMigration.vue create mode 100644 frontend/src/features/tools/composables/useTimeSync.js create mode 100644 frontend/src/features/tools/composables/useTotpToolbox.js create mode 100644 frontend/src/features/tools/composables/useTotpToolboxActions.js create mode 100644 frontend/src/features/tools/service/toolService.js create mode 100644 frontend/src/features/vault/composables/useTotpTimer.js create mode 100644 frontend/src/features/vault/composables/useVaultActions.js create mode 100644 frontend/src/features/vault/composables/useVaultList.js create mode 100644 frontend/src/features/vault/service/vaultService.js create mode 100644 frontend/src/shared/components/icons/icon2FAS.vue create mode 100644 frontend/src/shared/components/icons/iconAegis.vue create mode 100644 frontend/src/shared/components/icons/iconBitwarden.vue create mode 100644 frontend/src/shared/components/icons/iconCloudflare.vue create mode 100644 frontend/src/shared/components/icons/iconGitee.vue create mode 100644 frontend/src/shared/components/icons/iconGithub.vue create mode 100644 frontend/src/shared/components/icons/iconGoogle.vue create mode 100644 frontend/src/shared/components/icons/iconGoogleAuth.vue create mode 100644 frontend/src/shared/components/icons/iconMicrosoftAuth.vue create mode 100644 frontend/src/shared/components/icons/iconNodeloc.vue create mode 100644 frontend/src/shared/components/icons/iconTelegram.vue create mode 100644 frontend/src/shared/utils/encoding.js create mode 100644 frontend/src/shared/utils/errors/authError.js create mode 100644 frontend/src/shared/utils/errors/backupError.js create mode 100644 frontend/src/shared/utils/errors/migrationError.js create mode 100644 frontend/src/shared/utils/errors/toolsError.js create mode 100644 frontend/src/shared/utils/errors/vaultError.js create mode 100644 frontend/src/shared/utils/serializers/aegisStrategy.js create mode 100644 frontend/src/shared/utils/serializers/csvStrategy.js create mode 100644 frontend/src/shared/utils/serializers/gauthStrategy.js diff --git a/README.md b/README.md index 915e709..d44e6bf 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,6 @@ curl "https://api.telegram.org/bot<你的BotToken>/setWebhook?url=https://<你 | :--- | :--- | :--- | | `CLOUDFLARE_ACCOUNT_ID` | 你的 CF 账户 ID | `a1b2c3d4e5f6g7h8i9j0` (CF 面板的概述页右下角) | | `CLOUDFLARE_API_TOKEN` | CF 部署令牌 [前往获取](https://dash.cloudflare.com/profile/api-tokens)
点击“创建令牌” -> “创建自定义令牌”
权限 1: **账户** -> **D1** -> **编辑**
权限 2: **账户** -> **Workers 脚本** -> **编辑** | `r4_xyz...` | -| `CLOUDFLARE_D1_DATABASE_ID` | D1 数据库 ID | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | #### 🔐 必填:系统安全参数 @@ -161,15 +160,14 @@ cd 2fauth-worker cd frontend && npm install cd ../backend && npm install -# 2. 在 backend 目录,修改 example.dev.vars 为 .dev.vars, 按说明写入开发用的测试密钥 +# 2. 在 backend 目录,复制 example.dev.vars 为 .dev.vars, 按说明写入开发用的测试密钥 +cp example.dev.vars .dev.vars # 3. 初始化本地的 SQLite Sandbox 数据库 -cd backend npx wrangler d1 execute 2fauth-db-dev --local --env dev --file=schema.sql # 4. 终端启动应用 -```bash -cd backend && npm run dev +npm run dev ``` --- diff --git a/backend/package.json b/backend/package.json index 7eb5516..369b22a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -6,14 +6,18 @@ "deploy": "wrangler deploy --minify" }, "dependencies": { - "aws4fetch": "^1.0.19", - "drizzle-orm": "^0.30.9", - "hono": "^4.11.10", + "aws4fetch": "^1.0.20", + "drizzle-orm": "^0.45.1", + "hono": "^4.12.3", "webdav": "^5.9.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20260226.1", - "drizzle-kit": "^0.20.14", - "wrangler": "^3.0.0" + "drizzle-kit": "^0.31.9", + "typescript": "^5.9.3", + "wrangler": "^4.69.0" + }, + "overrides": { + "esbuild": ">=0.25.0" } -} \ No newline at end of file +} diff --git a/backend/schema.sql b/backend/schema.sql index 34ea6a7..4340f09 100644 --- a/backend/schema.sql +++ b/backend/schema.sql @@ -32,4 +32,14 @@ CREATE TABLE IF NOT EXISTS backup_providers ( -- 索引 CREATE INDEX IF NOT EXISTS idx_vault_service ON vault(service); -CREATE INDEX IF NOT EXISTS idx_vault_created_at ON vault(created_at DESC); \ No newline at end of file +CREATE INDEX IF NOT EXISTS idx_vault_created_at ON vault(created_at DESC); + +-- Remove any existing duplicates before enforcing unique constraint; keep the earliest +DELETE FROM vault +WHERE rowid NOT IN ( + SELECT MIN(rowid) + FROM vault + GROUP BY lower(service), lower(account) +); + +CREATE UNIQUE INDEX IF NOT EXISTS vault_service_account_uq ON vault(lower(service), lower(account)); \ No newline at end of file diff --git a/backend/src/features/auth/providers/baseOAuthProvider.ts b/backend/src/features/auth/providers/baseOAuthProvider.ts index 4619508..11935ac 100644 --- a/backend/src/features/auth/providers/baseOAuthProvider.ts +++ b/backend/src/features/auth/providers/baseOAuthProvider.ts @@ -14,11 +14,10 @@ export abstract class BaseOAuthProvider { constructor(env: EnvBindings) { this.env = env; } - abstract readonly id: string; abstract readonly name: string; abstract readonly color: string; // 按钮背景色 - abstract readonly icon: string; // 前端图标 SVG 代码 (完整 标签) + abstract readonly icon: string; // 前端 Vue 图标组件名,如 'iconGithub' abstract readonly whitelistFields: string[]; // 新增:定义该 Provider 支持哪些白名单字段 (如 ['email', 'username']) // 1. 获取授权跳转链接 diff --git a/backend/src/features/auth/providers/cloudflareAccessProvider.ts b/backend/src/features/auth/providers/cloudflareAccessProvider.ts index a79306f..8d2aee0 100644 --- a/backend/src/features/auth/providers/cloudflareAccessProvider.ts +++ b/backend/src/features/auth/providers/cloudflareAccessProvider.ts @@ -32,7 +32,7 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { readonly id = 'cloudflare'; readonly name = 'Cloudflare Access'; readonly color = '#F38020'; - readonly icon = ''; + readonly icon = 'iconCloudflare'; readonly whitelistFields = ['email']; // Cloudflare Access 主要基于邮箱验证 constructor(env: EnvBindings) { @@ -43,12 +43,12 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { private getBaseUrl(): string { const orgDomain = this.env.OAUTH_CLOUDFLARE_ORG_DOMAIN; if (!orgDomain) { - throw new AppError('Cloudflare Access configuration incomplete: Missing OAUTH_CLOUDFLARE_ORG_DOMAIN', 500); + throw new AppError('Cloudflare Access configuration incomplete: Missing OAUTH_CLOUDFLARE_ORG_DOMAIN', 500); } let baseUrl = orgDomain.replace(/\/$/, ''); if (!baseUrl.startsWith('http')) { - baseUrl = `https://${baseUrl}`; + baseUrl = `https://${baseUrl}`; } return baseUrl; } @@ -58,9 +58,9 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { const redirectUri = this.env.OAUTH_CLOUDFLARE_REDIRECT_URI; if (!clientId || !redirectUri) { - throw new AppError('Cloudflare Access configuration incomplete', 500); + throw new AppError('Cloudflare Access configuration incomplete', 500); } - + const baseUrl = this.getBaseUrl(); const { verifier, challenge } = await generatePKCE(); @@ -74,7 +74,7 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { code_challenge_method: 'S256' }); - const url = `${baseUrl}/cdn-cgi/access/sso/oidc/${clientId}/authorization?${params.toString()}`; + const url = `${baseUrl}/cdn-cgi/access/sso/oidc/${clientId}/authorization?${params.toString()}`; return { url, codeVerifier: verifier }; } @@ -91,7 +91,7 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { const redirectUri = this.env.OAUTH_CLOUDFLARE_REDIRECT_URI; if (!clientId || !clientSecret || !redirectUri) { - throw new AppError('Cloudflare Access configuration incomplete', 500); + throw new AppError('Cloudflare Access configuration incomplete', 500); } const baseUrl = this.getBaseUrl(); @@ -113,10 +113,10 @@ export class CloudflareAccessProvider extends BaseOAuthProvider { }); if (!tokenResponse.ok) { - // 增加更详细的错误日志,方便调试 - const errorText = await tokenResponse.text(); - console.error(`Cloudflare Access Token Error: ${tokenResponse.status} - ${errorText}`); - throw new AppError(`Cloudflare Access Token Exchange failed: ${tokenResponse.status}`, 502); + // 增加更详细的错误日志,方便调试 + const errorText = await tokenResponse.text(); + console.error(`Cloudflare Access Token Error: ${tokenResponse.status} - ${errorText}`); + throw new AppError(`Cloudflare Access Token Exchange failed: ${tokenResponse.status}`, 502); } const tokenData: any = await tokenResponse.json(); diff --git a/backend/src/features/auth/providers/giteeProvider.ts b/backend/src/features/auth/providers/giteeProvider.ts index cd3d99c..bbb8a35 100644 --- a/backend/src/features/auth/providers/giteeProvider.ts +++ b/backend/src/features/auth/providers/giteeProvider.ts @@ -4,8 +4,8 @@ import { EnvBindings, AppError } from '@/app/config'; export class GiteeProvider extends BaseOAuthProvider { readonly id = 'gitee'; readonly name = 'Gitee'; - readonly color = '#c71d23'; - readonly icon = ''; + readonly color = '#C71D23'; + readonly icon = 'iconGitee'; readonly whitelistFields = ['email']; constructor(env: EnvBindings) { diff --git a/backend/src/features/auth/providers/githubProvider.ts b/backend/src/features/auth/providers/githubProvider.ts index 50fe087..1c1268e 100644 --- a/backend/src/features/auth/providers/githubProvider.ts +++ b/backend/src/features/auth/providers/githubProvider.ts @@ -5,7 +5,7 @@ export class GitHubProvider extends BaseOAuthProvider { readonly id = 'github'; readonly name = 'GitHub'; readonly color = '#24292e'; - readonly icon = ''; + readonly icon = 'iconGithub'; readonly whitelistFields = ['email']; constructor(env: EnvBindings) { diff --git a/backend/src/features/auth/providers/googleProvider.ts b/backend/src/features/auth/providers/googleProvider.ts index 1f45d4b..d959a9e 100644 --- a/backend/src/features/auth/providers/googleProvider.ts +++ b/backend/src/features/auth/providers/googleProvider.ts @@ -5,8 +5,7 @@ export class GoogleProvider extends BaseOAuthProvider { readonly id = 'google'; readonly name = 'Google'; readonly color = '#33A854'; - // Google "G" Logo SVG - readonly icon = ''; + readonly icon = 'iconGoogle'; readonly whitelistFields = ['email']; // Google 主要基于邮箱验证 constructor(env: EnvBindings) { @@ -65,8 +64,8 @@ export class GoogleProvider extends BaseOAuthProvider { }); if (!tokenResponse.ok) { - const errText = await tokenResponse.text(); - throw new AppError(`Google Token Exchange failed: ${tokenResponse.status} - ${errText}`, 502); + const errText = await tokenResponse.text(); + throw new AppError(`Google Token Exchange failed: ${tokenResponse.status} - ${errText}`, 502); } const tokenData: any = await tokenResponse.json(); diff --git a/backend/src/features/auth/providers/nodeLocProvider.ts b/backend/src/features/auth/providers/nodeLocProvider.ts index 1d955ac..347dee0 100644 --- a/backend/src/features/auth/providers/nodeLocProvider.ts +++ b/backend/src/features/auth/providers/nodeLocProvider.ts @@ -5,7 +5,7 @@ export class NodeLocProvider extends BaseOAuthProvider { readonly id = 'nodeloc'; readonly name = 'NodeLoc'; readonly color = '#475569'; - readonly icon = ''; + readonly icon = 'iconNodeloc'; readonly whitelistFields = ['email']; constructor(env: EnvBindings) { diff --git a/backend/src/features/auth/providers/telegramProvider.ts b/backend/src/features/auth/providers/telegramProvider.ts index c46f015..f4ac8a0 100644 --- a/backend/src/features/auth/providers/telegramProvider.ts +++ b/backend/src/features/auth/providers/telegramProvider.ts @@ -5,7 +5,7 @@ export class TelegramProvider extends BaseOAuthProvider { readonly id = 'telegram'; readonly name = 'Telegram'; readonly color = '#54a9eb'; - readonly icon = ''; + readonly icon = 'iconTelegram'; readonly whitelistFields = ['id']; // Telegram 不保证提供 email constructor(env: EnvBindings) { diff --git a/backend/src/features/vault/vaultService.ts b/backend/src/features/vault/vaultService.ts index 3620161..3bf0445 100644 --- a/backend/src/features/vault/vaultService.ts +++ b/backend/src/features/vault/vaultService.ts @@ -53,13 +53,29 @@ export class VaultService { /** * 创建账户 */ + // normalize a service+account pair for comparison + private normalizeSignature(service: string, account: string) { + return `${(service || '').toString().trim().toLowerCase()}:${(account||'').toString().trim().toLowerCase()}`; + } + async createAccount(userId: string, data: any) { - const { service, account, category, secret, digits, period, algorithm } = data; + let { service, account, category, secret, digits, period, algorithm } = data; if (!service || !account || !secret || !validateBase32Secret(secret)) { throw new AppError('Invalid account data or secret format', 400); } + // 入库清洗:去掉 account 中可能带有的 Issuer: 前缀 + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + + // duplicate check (case‑insensitive & trimmed) using repository helper + const existing = await this.repository.findByServiceAccount(service, account); + if (existing) { + throw new AppError('Account already exists', 409); + } + const normalizedSecret = secret.replace(/\s/g, '').toUpperCase(); const encryptedSecret = await encryptField(normalizedSecret, this.encryptionKey); @@ -81,12 +97,17 @@ export class VaultService { * 更新账户 */ async updateAccount(id: string, data: any) { - const { service, account, category, secret, digits, period, algorithm } = data; + let { service, account, category, secret, digits, period, algorithm } = data; if (!service || !account) { throw new AppError('Service and account are required', 400); } + // 入库清洗:去掉 account 中可能带有的 Issuer: 前缀 + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + // secret 可选:若未传则保留数据库中已有的加密值 let encryptedSecret: string; if (secret) { @@ -211,15 +232,21 @@ export class VaultService { validAccounts = data.accounts; // 格式 B: 标准导出格式 (data.secrets[] with issuer field) } else if (Array.isArray(data.secrets)) { - validAccounts = data.secrets.map((item: any) => ({ - service: item.issuer || item.service || item.name || 'Unknown', - account: item.account || item.label || '', - secret: item.secret, - algorithm: item.algorithm || 'SHA1', - digits: item.digits || 6, - period: item.period || 30, - category: item.category || '', - })); + validAccounts = data.secrets.map((item: any) => { + let account = item.account || item.label || ''; + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + return { + service: item.issuer || item.service || item.name || 'Unknown', + account, + secret: item.secret, + algorithm: item.algorithm || 'SHA1', + digits: item.digits || 6, + period: item.period || 30, + category: item.category || '', + }; + }); // 格式 C: 旧版 2FAuth 开源项目导出 (data.data[]) } else if (data.app && data.app.includes('2fauth') && Array.isArray(data.data)) { validAccounts = data.data.map((item: any) => ({ ...item, category: '' })); @@ -228,29 +255,41 @@ export class VaultService { validAccounts = data; // 格式 E: 老版 2FAS JSON (data.services[]) } else if (data.services) { - validAccounts = data.services.map((s: any) => ({ - service: s.otp?.issuer || s.name || s.service, - account: s.otp?.account || s.account || s.login || '', - secret: s.secret, - algorithm: s.otp?.algorithm || s.algorithm || 'SHA1', - digits: s.otp?.digits || s.digits || 6, - period: s.otp?.period || s.period || 30, - category: s.group || '', - })); + validAccounts = data.services.map((s: any) => { + let account = s.otp?.account || s.account || s.login || ''; + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + return { + service: s.otp?.issuer || s.name || s.service, + account, + secret: s.secret, + algorithm: s.otp?.algorithm || s.algorithm || 'SHA1', + digits: s.otp?.digits || s.digits || 6, + period: s.otp?.period || s.period || 30, + category: s.group || '', + }; + }); } } else if (type === '2fas') { const data = JSON.parse(content); if (Array.isArray(data.services)) { - validAccounts = data.services.map((s: any) => ({ - // 2FAS backup 格式 schemaVersion 4:字段在 otp 子对象中 - service: s.otp?.issuer || s.name || s.otp?.issuer || 'Unknown', - account: s.otp?.account || s.account || s.username || '', - secret: s.secret || '', - algorithm: (s.otp?.algorithm || s.algorithm || 'SHA1').toUpperCase(), - digits: s.otp?.digits || s.digits || 6, - period: s.otp?.period || s.period || 30, - category: s.group || s.category || '', - })); + validAccounts = data.services.map((s: any) => { + let account = s.otp?.account || s.account || s.username || ''; + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + return { + // 2FAS backup 格式 schemaVersion 4:字段在 otp 子对象中 + service: s.otp?.issuer || s.name || s.otp?.issuer || 'Unknown', + account, + secret: s.secret || '', + algorithm: (s.otp?.algorithm || s.algorithm || 'SHA1').toUpperCase(), + digits: s.otp?.digits || s.digits || 6, + period: s.otp?.period || s.period || 30, + category: s.group || s.category || '', + }; + }); } } else if (type === 'text') { const lines = content.split('\n').filter((line: string) => line.trim()); @@ -271,16 +310,21 @@ export class VaultService { if (type === 'raw') validAccounts = JSON.parse(content); - // 获取现有以去重 + // 获取现有以去重 (使用小写/去空格以避免大小写差异导致重复) const existingItems = await this.repository.findAll(); - const existingSet = new Set(existingItems.map((row: any) => `${row.service}:${row.account}`)); + const existingSet = new Set(existingItems.map((row: any) => this.normalizeSignature(row.service, row.account))); - const uniqueAccountsToInsert = []; - const seenInBatch = new Set(); + const uniqueAccountsToInsert: any[] = []; + const seenInBatch = new Set(); for (const acc of validAccounts) { if (acc.service && acc.account && validateBase32Secret(acc.secret)) { - const signature = `${acc.service}:${acc.account}`; + // 统一清洗:去掉 account 中可能带有的 Issuer: 前缀 + if (typeof acc.account === 'string' && acc.account.includes(':')) { + acc.account = acc.account.split(':').pop()?.trim() || acc.account; + } + + const signature = this.normalizeSignature(acc.service, acc.account); if (!existingSet.has(signature) && !seenInBatch.has(signature)) { uniqueAccountsToInsert.push(acc); seenInBatch.add(signature); diff --git a/backend/src/shared/db/db.ts b/backend/src/shared/db/db.ts index 03f845e..b561eda 100644 --- a/backend/src/shared/db/db.ts +++ b/backend/src/shared/db/db.ts @@ -61,10 +61,13 @@ export async function batchInsertVaultItems( }; })); - // 2. 逐行写入:D1 每条 SQL 最多 100 个绑定参数,vault 表约 12 列 - // 单行插入 = 12 变量,远低于限制,彻底规避超限问题 - for (const item of preparedItems) { - await dbClient.insert(schema.vault).values(item).run(); + // 2. 批量写入:使用 D1 的 batch 功能避免连接超时。 + // 分批写入,每批最多 50 条。 + const CHUNK_SIZE = 50; + for (let i = 0; i < preparedItems.length; i += CHUNK_SIZE) { + const chunk = preparedItems.slice(i, i + CHUNK_SIZE); + const stmts = chunk.map(item => dbClient.insert(schema.vault).values(item)); + await dbClient.batch(stmts as any); } diff --git a/backend/src/shared/db/repositories/vaultRepository.ts b/backend/src/shared/db/repositories/vaultRepository.ts index 9c753dd..2db6289 100644 --- a/backend/src/shared/db/repositories/vaultRepository.ts +++ b/backend/src/shared/db/repositories/vaultRepository.ts @@ -90,6 +90,24 @@ export class VaultRepository { return result[0]; } + /** + * 根据 service/account 查找记录 (大小写不敏感,自动 trim) + */ + async findByServiceAccount(service: string, account: string): Promise { + // 使用 lower() 函数进行数据库级别的大小写不敏感比较 + const normalizedService = service.trim().toLowerCase(); + const normalizedAccount = account.trim().toLowerCase(); + const result = await this.db + .select() + .from(vault) + .where( + sql`lower(${vault.service}) = ${normalizedService}`, + sql`lower(${vault.account}) = ${normalizedAccount}` + ) + .limit(1); + return result[0]; + } + /** * 创建一个新 item */ diff --git a/backend/src/shared/db/schema.ts b/backend/src/shared/db/schema.ts index a16bf28..900c0e5 100644 --- a/backend/src/shared/db/schema.ts +++ b/backend/src/shared/db/schema.ts @@ -1,6 +1,8 @@ import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; // 1. 金库项目表 (Vault Items -> mapped to 'vault' table in D1) +// 注意:唯一索引在 D1 上需手动创建,通过迁移命令运行一次即可。 +// 该项目使用 SQLite schema 定义仅描述列,复杂索引/约束由数据库层管理。 export const vault = sqliteTable('vault', { id: text('id').primaryKey(), // UUID service: text('service').notNull(), diff --git a/frontend/package.json b/frontend/package.json index e9bcbaf..bc0a68e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,21 +10,26 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.3.2", - "@tanstack/vue-query": "^5.0.0", - "element-plus": "^2.13.2", + "@tanstack/vue-query": "^5.66.0", + "element-plus": "^2.9.5", "jsqr": "^1.4.0", "pinia": "^3.0.4", - "qrcode": "^1.5.3", + "qrcode": "^1.5.4", + "scrypt-js": "^3.0.1", + "sql.js": "^1.10.3", "vue": "^3.5.25", - "vue-router": "^5.0.2" + "vue-router": "^5.0.3" }, "devDependencies": { "@playwright/test": "^1.58.2", - "@types/node": "^25.3.0", + "@types/node": "^22.13.5", "@vitejs/plugin-vue": "^6.0.2", "unplugin-auto-import": "^0.19.0", - "unplugin-vue-components": "^0.26.0", - "vite": "^6.0.0", + "unplugin-vue-components": "^0.28.0", + "vite": "^6.2.0", "vite-plugin-pwa": "^0.21.1" + }, + "overrides": { + "serialize-javascript": "^7.0.3" } } diff --git a/frontend/public/pwa-192x192.png b/frontend/public/pwa-192x192.png index 6f273da493accc0a2b2d5b7da5b3cc60115a89d4..61d546575466f663f257a10edbc396e6e00db433 100644 GIT binary patch delta 1120 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 literal 3926 zcmb_eXEdB$yMBxzdK)D}Fj@#kZ_&F9iHI&ph!7DGy+)fzw2&B`7%d3V8GW>95kv_> zlu6OcgpmwF=Hq+6bJjZN{oeOGKhC|b_1xFKulv6C{;{96cC3l90X+>T4FCZ2h)cSr z0026nAb^VeB)usX95_kICYR0iPO=vISQCA$m3wSZNYcnX);{6r-zQ7WKah8H!Y#^3 z+W91%0@6wG56PhTlwYYh{c7eOT`D1+)c+|R{n4Y7e2#MV3d*j!s7gRVL*J)ky z`Rj=D0pV>%r_%PeyO%{<7rRy@V$Sx3C#GjEmg+Lj!$5snOI4zY(G}nFvss;gfq7MI z*4j?-LFA^18D604N;Pj4c(xhdd~s@2Xmr3G;#t?-o1zIBE9f6Kx{(Ox%zy{aF?jXa z=lN}a8`(mbnn%yd(>2@w27Pu2SrGTg4d8R_<#SQHy$Wq~NTZp0jMbO>SfA6c+^hno z&#JUhB#>*FN$_n5XEMp%I&@HjdqG^gJ>IwMGE;vTQL7udWlp&vKb5~nV8$opsT+5< z)Nz3Qf*c_|XSpl-z23S|RU=HJ1Gtk(;e-cZi`G@M!}N#(lSu^yuBFQ+MJe|jg~Rxp z*aeX5<;}{(u%k9F|7o3X;{n^7^|SU0YpzglzvWAmWna{rScsc10)9rfdZSlDDs_2v zK$9^t62lFYBayecAFQX906Ra$+gZ!ZUSq426jG1U45)sZ+)pv%b4Ne5xfe;hD=mA& z?lv2Gg2xPFyb={pokYvJB+<+ytz`0}xb*#F@JD`$)h<236$rxBlYUf; zn%SIrbs1k|+e8lAkE#zZOD>ABSb=OjawlV`<+r}naWZ}-!w5wzq-GI6+>!SIUDT0f z-<{*IOlBFdrncl$_>h+U-f)yFO`3ME{C zW1+lYgRao=b55^Tjof*D&WAv`ozllnE=Q>$C+GFe@~-DWCXSTYo}@z*eNC&t1LBRL zw{MM26CdW^&&{rh57;Kp)C?L!J5vOQl5{=#YI`7BZ&^lfbf9L3v@gDTSu>0ZKI{qa zI7hw*9(-$UT43~>SW?2&8==pyX*3)vWC#-eWx9s>HB%nr_N?1 z3wJeXF?OPnUA%uv`ssa(L2uA7aZ_fKhE3**b=>H2t`D6J!*x)&Qh*Eg%dpD@M&!*z z1P2JfNCENu9YJgQz<2v6$m+7v)p6BHXYtzBBBpla`cpVM<(Qb$ZM{WVmX|>Zy`^?2WG4 zaq=_N;i>-K&t+(ms10YcYrtje-7HZaZ-(I?YooA{I=-P%k)}NMSYz9$NSR`Vl~%4) z&~Jx)VG+lV!&JCzqv=6g%z#oZZ&DIyWMyo{zh32GTh<$vJv;BaLr(}oeanVC3o<#v z8+$^tp6zO(E(Wa=_k9$5WN}W${qKt684Q$C&w90UXKr*J9PY*bX!-rr&RgBdX>NBx z<>mz_Cw9xOHHDBVOT90dwCewy@EF@_Z^RbUE!9RR3%jD%nIb1U?3-Ol&}a$W3NLEl z5FMebTlmGa&YZ#cM2zA$Z<)favBdhpTN=}39oZq_Nv&J7tX^Bs#s_Tn^bHe^KhXr1 zCqzfwq?cFaBXz~$s#wx`c%CNtuulfm{t`7~XEP7yi=TQqo?T@d85X=3ge8a)mHmh4 zZ#`QGsWk6GQ69h?5XPcHG?bA-XONiOt)?E+egR-?7B7U4AI7w)H1CFY|I#N!T%*59 zrBW1K_~o4*_&-6w@hd7P#4^@SdKZgXTTc2bo~vPK9ORa`KSqBgQS zrWv8fie;WTD(OT&cY@150t!Y6*!LVzvBOt=;A~_fhV5ANx}l}o2#aWoWV=|)e5!)^ zUgV@i0|gH)D^^j>0inIVXKmW}MvEliLS33%{j%6VCuh7f?KvTwRr)}{`7NscnjG^b za|dahNk1W(FD$rMxQ9XQH7Atb!aYLcU38gG3Nfy)O{k(xgY!#k66(0>j%!&KH+>Bs zKn4TA5daea(gdggvcFig{JDM!3jWjBg-3rff;s<}wFnii`QmZ#bq$`?I>8R2!5}KS zpM2xMWw!i4(X6)QcliKRA|3oW(DogjGCrB#7Ke&MbxYcyjFw96+42`8vAxx6`Fp!^ZkzbrwYcA0M7$OxaXS9_httvxZjGFgI~YHjqSm56G)+k3X5X9EFqHA z0jK9+KZEuJu}=rPsXC1qZ|gKTdFs>)(jL-PHVG4y1J~YjkHtL=aq{dJhDPf- zq_@!xR0~t4w(GIKif59&&caZ}29X#Hmye=g*PpP59V9_5v$DD*M>b(je8 zi^U~MHgO}nkM-NpTF;y>LRo7>e(rA?eJz&sPy_pN+vn|CdA zJ6)eSAw|_{UG@8htXaN-OlqDONm65LU&3Bl4xlKYkS1RZ(_8OQQBM&zNQ%6&&}zZ+ zPV5p12uzF(D(M2X(VTM65G`%mkuyHgl9Lh%#8t)^vUOR0Dtq}@L}ZNS7wP88BgumL zAZT}#8WGaX$JZ)Fuq+mxSb3E>0>S!kSl`j3_{%%_=i7RnF`|z=ZwGKy1vpPBtnE{k zPKPZ6?=xoxGNw<5%cZY1;0?#22wounNA_XsB%wu+F{1M)m4yC`}DMP&Vdm&)r+DT)p%r;~_j2t_&WwE=Ko#+S#n1&14ERroDEhaC{FI)r zQttW00p1y+&bN%2H5n32w@(ZQ@~cv~PRg}s-7x4NJ;289E~e%*%Y9M?!y+!))3pvet+`*j=S>+in7r3<|R2`ep5@e(*q<>Tb@iWEHV3)9+vB;zHPul&W_< zC?s2^kfpfZo>?i@hpYbO^okf-Ba8T;uUidz+BH?vkBmx_!$# zR<2eLJnp;cYiF;Q-j8$awDNYoufjY_D9H)2)ncLoNvX1rMRx1NT}p|y6lMMO`|7ka zg}um{G8c(Rr?R>If?Wn%q$Md4K=u$LlcC=ZVN)WT7=T0!=m z_>rMe>*Yju+>d9GU86j<>6Y;NJMCbdT^R!;DdFaAbQiur&iBGkjk(zZW5&8pTduvj k*s?&hNBl1T|NLovcfgccfV(~BY{RL5&@k=T3`xs<#dO>cSrQ z=jU?UwC8%^R6~z^Q8#$yPHXuxR*3h()?n*tfl5+dEuA|6;#_s_Uu+A`<@Hu~TBojT zW!i%qDo51gXVCcklFq|G;~u;kD&LQ~&^XVv(VnY!P5^D=&usfPK$S=aJ@QMfty@(r z+*%LeTN3p7B3Qgy(M6UuzD8Y}==!`b|AJwR0|bIG5^b zfVUz7gJ=kKy6>u0|39m%K`~CX>+z%RDNS`AF-mL5w?q@}v}{n_evS6Q*6_!{LBYmg zqigf`B`)IcU%4^w?l7+Z zm(@Mf%4~K`o@}wYXSsswv+c>>TA6d~`tR)TE9~$8b}K0JO80dBR&FJKrwqd9S_^C4 z2v62o%j@m$2K#%gOL=~rwRya?^E`Wgf@?caVrcOQQ#UuqZVH5{VYPom`qiZx`*KWCmQMjPlq;e1jsf!}VW!!EqY(y?}A$1)8 zcTwnKiUeUCEOt@M!*IWpTdwzSG^1vF!NM}mGUu{JbH9dj&8!(T7Nl*&)h!6yfY%5E zYPF(95H_CKYP5r*-Dm{uW)y|7Ys3Ma#tWK@+mUMyxd6OmVHhu_vtVfkSZO0}jWUR4 zqZzw6jv4?VID#xXh{l@%5YdKF?v1_K0o-xR%(QLH?Mm-WOh~j2LGjYf3VjYr#V|9D9weipYu z%N^iaLEa9-u$i~ot~;JJvX*N$8-EzJ_lxMc-2^+0CM4}b0TB-JWuoBlA%74IuR44< zj)ORCG*e)Rnno-aFzQwas6ev}z@cNKF$6-|)CYKm)`(i*)J5$UbZ?~Xcu^|`1A?8} zkk`4@OBV&LCXItc;BVyWyb(acpz*W_6uD?wGg@Ty;CbxAwle^Ng$+6eGmC?vxZ4d~ z){a|2_W;0XF9ni@%R$n3V`&s>bRl55Aj-o=BZ}HlGt9#rCUUKY8_Jf2O;Ln8petNB z6ahZ~gU+r795fGJz=IAXiyDnC{2Dp^2La*~vIBY?0~8FI?%x6x@Npa+x*VJ`u%LNF zV|cjXQOM}S=*T~USSh>#f?FL2zXkCS_~3tZp;lp~AQ0OMlP=0yjUZ##&6vLcy?DQ9 zSv$>_H<}@+8p;;6g_Nuvgjv*XWYlSd%>(iw1|77QHZz0^=7tFzBUH1Zrsx-iVWtXg z#wEx=RXc2iE%-8OEDL!cR3Ik|G(sW}y-wF1<={4nPXqCbUFn*On$0+Mi+B!6;eFB1 z1#K5Elo*SV++tWjIA(k;jkSp)(13%S0ntW7OyOFtLwRVBb()P<5C<*k4KQ^y=nBFV zsc1kW7j#=|TF|!v(U7kw7(y(XpfebyK>Tco+%7Y#)%C<i zG~21$kGB<=YVHp;89QVGML^CNAQCLo1yp#@EulF?k^bALwG06Atlc3IN{RYLpR5}q;$hf&S^ymnOb?X)Q)gi_i(n}cRn&lV@GYF!b#1tcLgM=X-HWV5 zE`KhKOQZ0w{-G7LDO#fiQXQk`|6mgSW7Mc4{_AvT8x6*Qnl0!&I>J!V-klCLz=aD6 z7mbd%ri5Hi>`oDtrd~#tpP`Pj{|xrrZO}RNO~=`tUhi#vuPY|D$Kv zhYnp=u+yyTM*3e2n&9dv4ih*Jrf^F7#c7)sz*{Nq5;Y8fF>6C z>^*;VgYE)mAxpo5H%8>&J(jt~jTr!n>LQB&pIr@ZVRA8RBRJFjG(swZZ-m>ohs_S2 zR<+~Hw}we;M|gPfd}x27dpr+L0v#v2gM&YI6TzRj$HU+S;Qxj0*}*C9n?dlW?rlME zs{7A8c#*px4F1ghG7MhqZVQ9IbYDn=G578u+_=%L4_~s;eI^b6YNNX+4o~0cUJ(BE zMt4^b{?Co>#ou`Fb`?GLnqgxYh+USl8U$)WRn1(Ok=suN( z|7)ZBbr7Dp(cKb+n>V^ors0;2?$cp-)<*ZiPI&f4cSR8X?MC;3PI%5n_lY$8yN&LK zG(URVA4@MxA8x-Uekl3R$e=m;5aGM)dRK zUz49C_a;9|ewF_+e<*(>|L64A`Ewr2uZX^ud^Pz>a$EA{A?n*S*OVSZ2kgM4p(cmA#X-T99EUHLoncjPyAzngt0ySMqH=9jWBW?#rYpY6%s z)4e%+d-rR>KV?^CJF{!EYqIxbS7-0ec4Y6${w?`w^5f)($@h~xlW!;AN*-rS#VH>*;Oj7t=lI73t^FFQ=EMS43AtZ%^NrUY7p4 z{nqr-^iAm-(>L(+_37)<*QT#YFG(*>FG|l#U!87GpGba_Jf1w3{5ttn@@Vo%^3(Ri z$$ur6HLr+%ncS1?P3~^|Ah|oaD|w>zz2v*ecarbmVSYRRm;8?WoB22LujjYtU(3Im zeUnn13q&Wd4c#hWz9C$MTQn zAIbkY|8V}H{QCTZ`3Le{`E~jG^MA_Um+#E4&EK2+DzAquC?b!`Xjjzsw%W{xf?p`;Y8_>=)U;XaAPn zpZz@h*X(E6ec4a5pJX5J-W~rqyEpq$_QUL+Y;X31?C$LQ*+;r}W#7y0%)XuN&Th&+ zlYO`O>FmbrQ`sl8*K|LT-H?4e`&jnT>?73v=j_AThqCLl4`v_8c4gOP-^$+K{g>>X z<{jBLvu|Wy&u-7YmVGtb+5Jj(TlVGbbJ^XEE4ueIZ_RG0uRfc-KYL&H-s~T^q&yv$tn&%Pz~_n!P2vv-9Tc((Fyy8?!fLug_kW{UE(Ny(_&leNA>r zc5!x5c42lwc7AqV_UdeV_C)%d^zrnu^w;UH(nr%r(udRkN`IL?l>TS>VEP~F1L-f) ze^37{y+8eV`mgEF()-e%rawu4oZg%MDE(o2Pr5h#e)_%iyXkk*o6_BB8r~CjKlGym z@62;ox-uxkGOAoLo}3f}+e#NtR*$?f9>+nPEM0ZYn{+uGxL!~_usha2?#p0ib?BV{cRxgHT-Qij#;2ZL$e zFrxZurqBDN3;?^Qk?=ztnou^`28G*y6K$^AXK&%MeU9C6wd9;FTar-$B=o|V+s5XHlm}0K0NB#SwaTCmQnHJ7VRNpONwjarDg2ViwqRc)aaoz7jg0- zT(NCnV%u3g7;ijG`@wj)rsU7$bmfi}s(Q2yI97>2YpbrV*Yq1R2uOJLuHufU4~5r; zlVxDImGDi%DLiOY@7;F1=ZwkfUiUJ%>t6Tr6ZNFnVbZ;}XYzoAQXMu7&z=_4o8TOY zH-N0IpVFy4g&)+9=Lf6fig&h>F|g$2H$r|RFSCZx;z!a{CPW_~k|7HgoLiEJDf&S* zwpl|wBocE4Rom_kjS!QyVzVcn_`xlI6;DoWAN+3{#b#eU_jF$QV*FJL;bYAq4Lhh7 zY&Jd~58M2Du<-QCV9Fg4p^A8}?xqdp63hj~jp5QVI3#NK&>$YzGWvakdT@472QhLw zrS;+}D5Z{rYx|)AP(g7R1(rsEs0heJe--~8B}btd=1CSj(SzF#i7o-iQ@{#0#rs>5 zxp%k39L4)U5&ZL>V7~0VEliSE1rY!U1TY%e$faazB1JTXG}W&H(?6L@U=Y3OhgFPz zskWbYLAwl1>&}$XmTLQ}&%59ioBhvvic>bE36zl6U_25yZYEjjhacE@C)`3>Y(3AE z2t%Dd$}MErp0D82ov4blY~bTz(T7W>`Xi&uyqjsAl~srZx7* zx=yIH2UJCGz@s50t#2uYqP|wOXs%8&43Nd$$XexK`{IlwIh-ffbKfMeK{NDoLExnY zmN*%9)J=tCFBTbgc9P^D7YB>Q=6eIw^O#em;&Uye;eB6j6mJfCk(rn3J~!RlkE)k| zuLWw?_0wJ}n)FnfaF+*?UGQ2zimE4q%^2f6a^$b*Y=STWQVIjr@ak}^qUq8tcW=jH zoS1=<;^qdOVV+v!;SIDV$!|&WcZR}9Yr_4H>b$^sf$I;|!`fq1qKYdQ6uTQseeE7S zwh&R-@f)D&ir|U>TJLt7rJEYOqsDF#e>Fe;eNt@?1fIRS(Z9PAA!E!9SU29l+ib!eSOuGVjifB9 zc5%HK?XjvQGny4A2t8>dsZf^uL%{2nduEF^_42Y&cTwFJPWReL**59uB|u1xh<`kr za79&URBbp?4^YTecup@C`(wt|XJMIuD3l}+ipTP4+K#|XJvNVzTRlE*1r5a~NvX^| z#sA`|wD5+^^U8Qw_5$o(dqZ!r1X68v%b?87?GhHpsviSk3X%5fH9eckHG}9} z27kj~OwjorynYh^`$NZOlu)A$MleKCqe00_*BhcWDadjNkYtR9NfcF&1sgKRM+K0n zf5(sZ$Su=Gze(G@5iu?1ap4BoW3In)7%|rn<@Tnr&R(nC3{cLnG$XmKaM z-W=`z@K=sLBD`Jq?uc+tP+jspP!@uk(3G)V>29C@W-*O|4ys=u@kNqGow(UduQ)$(nV7j{X`~Vn=>EcK*HUg7~M9^HN%Et2;0(QG78}cII`>^cJ zu|gY4!OX5v{p5il>9?!PuL;U_b^XO*@rGbj-g#I(dP|_UuwuBGM|d&Sm7>gsT1UH+GQgo>4_0JelHu{yoXuY=#BI+Od?Z-T|xD4UliG(QLmv6 z{NPYwtHT|GT6cU^!0oVF6!E}G2T;%02zOV31KrKC&Fb(Ys{TD!Ef=xZ!vfb2+WS_{ zo9orwllkCnmwG-xS*srj>b(Bcg~5g*Gz#q=wD}>i!EOT)WhXBz0m6QRNRB}XM`fe9 zN!Jr3=Bk#^gYvK66`u)uv0SQJ_g8HhhoTHt5#4PqJ0h)a+II7Zze$U&AVo&ID5LA< ziXlVd)Z0C$P7(Q{6Fv|urJ1^>Zxe*hwJ8AUfHo<1Maaz`2BF>T4yTLLDnw68rR?Bh zTa$q`=}HveE6_aHZyCB%`x42qlKHm;Lm~6Qk9>N}z1Lbvxd7hrej;&(_Y14K6|>~l@ytW0J)GSQH?fZ(F<#LUoiVJ zRZyb-QYrTnP_i`hdK|=cWpj(ayEMe=(IOV442GL9nk=UoO0Rv9P23uwE1RQeT1YVK z-#CUO|Hj-BiLe|3{Tajity-8TVN3OKTL#sRr4@6BjxD3j{iqt2Em~AP3sh9YbRbtm z8lsE)wml?x^6ncg_XE-=<_zu$8kI{bt|xG{Kz3B6#9_sI;(im1Hr024pMQeDRZIht zNJbE~L0oyKC6xx3jC^njBHKclAV4Z{P~@xA4|(58Ui4?7?qF;n^#G zsdL-xyW4noTm8;{d3!IiC$2q z8uwOGEGgU#0v%6+;?GxyTkWz5Rr^GsWAbs#UBtF|_vbgj|2A;FNc}ESGp^TC_m$i# z&jkDc#8#<+y#d`5w`~v1yBGK4@t47fg`l?w3~<8oP#Bzo!_UV(_}WL;B!p|A=4EycY2*J7}h5JiLSFK9*K0U^Vw9l1dfsQ{nc(^V{}) zew%-;F7|jh_Q?1bXV9zw#8@*n8xciz`y#tThN}deh%utNjF(gZ#$lTbWb$0gZ&+k6 ztV>=|jrwWG&g~)Mmv<1;PjjC=BXQ zy&9n@(b}Yhk`{0qsazQ`bs^9I3ug}tt*4?agx9=*IHwoN5R^cnWF<45pAMvlyp|Q# z!s2pelQCZ?c(b(_6|WEFRR#8l+;DKVY_1-F`m?L{mR-fWB+&H9!{TjZ`e^H!rKw9; zN9_rCsYo%1d?)jUMl8W7Ay)bmD{m>(GOEie@K;%IWQ?xBF{K47Ygs*l&`K>1<`9JV z(~NgDo}lG5OX}d(h#~cAQVN6 z(AG__tw->$kk&<2yyYloHhf86wA4rsw_1lpJA-Z4_M@52GE?;0hrf@b;kXQE8Zc%! zBN8a1*LdD&0wWszF<`xrf3divY@AreTO^_O9}n8##lSaNRa!kNUfc2fZsZ;huOUG| zk2KyiM^ByKC2zIQx|fn1Nm_igiyx*d?;Ic+G;>)beb;nkM`4RP#X z-bQ<*Zw*r8RFE5&t#$avf}5}jS*Vm;i46W|eFmNkZnbaPN@{8u40&__A!vHGIoTEp z8(M!IY!+UdXc-W0GYvqUB&P(*v!ha&bmFJ|VsQom`Y*gLu3t?BThUd*6Ue?6XAkib z+rpMl`Ra7XI0BXbe>mynd3J8jN!DP(4Of?1j?ooAuu)Y3?n$y?o&d-V@GRp{VaUFM z5r8whR-8z>7uF0xj0(YWs4rB8;)EzU9cAJ9lnF=1M29~>+sVs=sODfv=-@g{I+`!g z?nmU5QHjT&2 z2gHfeHD)C)A$}U}V&VwAjc^Y<4ByEAs1^g93`V1R6>`dOiz{%5F(^Dro(}3Hr%&>G z!AejZmL$CQ%4BQubJj3o^dvEKEf(lEEp<WNMi#+d`>S434-bJrr`ORTdFEn zjQ~km>mZC|M!Zr7H_ekWF9(2=~0+ksNEa!7QP*+8VUl zN&1alWwfgdc5U6-@0875FM<|PuWfLmn0O?-jnC}*)4n790z05{Mk!!s6^fvTWG5QQ zi#^{`+ET7i1EccG0E?!H08yZL3!XEiyWRC*vI*Bz3LfCObmUsl4@vcP-XWak14}&? z2Q5vKovgar7J53msqMdc;)&L)re1yC_U*5DAsQQ;NXi*rP~EKR>2&d9Vl0c98N4$JLVCQmdjkS5NL2-j zze{-*GiNibryoDM#Ru}^;X}MDu52k5n+oLn7Z*)ku>Dfi3(r59fuI8>mL@hFDI{0C zJ{n~rAOWhdcq3K#gVLKd5t3c~Cq-Fjdg6X#3#rQOHUWa;%;aBzdI6(iHpO`iRB?iN z-f^|ZZScMsBDG%88anSm5>NONs*;-K{F{p92EYK?u;Ymp0N4_ot4LJ%0zfX^A>{rO zm?t36hs_mtJP#O{k$g9!AIDH?)<(8={ z{)XB>GopL4c*RcXH#H|HCs5Z+VYv0BtKJ{1-=bt(Fkn;*R;mwr?nN(ZaM(NbK$=V? z<$A%cx`vIoqlzhHEXxokhJRslUNh*L!>E)NJP+eAamJ*T@xM(7u7QX9=)E=JB%B;d zTqrY4Dp|tf8BeB~Y-aUcOI9KXn|jjVbA`WcFI;t`8Xkw8_$kYF@oAg)bk$M*fjuAh z&y_!_j?nX!zI^>0-j6G?%glKM#WDMtCz zC>u(T6z40Mrpr~n;>x|`!_P4|wQU%~sf_B^$Zg8+r&bld^1b@Qt7Gmn+t@z|t5}lMXop1vT%w<%( zmCh1_P2DH-27>^`>ZI%>tR9Xn6EM)_{6?UInxLdTj2J4x5;F56nUSEFbQK#RyLepqEDs~TIw`a1*x6SM9Gna@KP!7O2Q zh{Tv~BMifPlUdbST3b9dCmP#CRLmeKB_}#u;WD{?S_ELqU^xYf8EJFgm^SwrJSmD2 zU{S9j`2aX5f>Q~XEJ*Qi0-JCX4mT9Hz;1oqUTGHT(ckVB_gP@jEu$>pKBSE9jkhr6MQPo9W{#aL(|FGy=G0yguAiG%7x zlB}k|R*kJkw+GehP!LUHbtDs5QZ2=i*bStZ&=>2NRJY2xVP{&Yxc=BoxqXta{S&zY zF%Z5=H%%{h4TOVPJ#hzA_)5gBZ;>?l2whkcN)M`uNM5Q5;z-0teUmOvO6`h4u6Thb%QF@_J?t`1MY zg_Qt5sAM3G<9_-@d({G*AR4z8ET=J8O^K4^{wTLV9$<9`fkRN;=9GZ|M5oIH?vwko zqzdtBmIz73PvjA4`QH+L!eRxz#)E1GAC1n?sFXL8cPzqOLd-@IoIczMTk6F;yR@3; z*>dZMs-b^K1i<<$taU)XfqsAto(!g*aDU3*)+If$9zDkPwqyy@iIz921Fd3%QX3j$ z*$B~TRn>@)?rh?z*m8gr5xUnLO ztOy{_FJff~51Cr7mRSK!VT*n)=|L2vVX*8Gf+%|x7atG$uDBc{JeQ_p9ywVCuT-x- z?If7=v0LMcJ2=Qy+sL6N$&Y-p8T2zkWD!+mdC3WPh`P9a2NC2vkkv6d^9qa|$PFopD5N{WY{=vZc% ztFM1+!6yBgR`V}oo(4uoba%Zo+*CdG(Kmm?O*8ZSa%xn&pE0equF{=6nc>N$(aWc+ zgQh?3CuzQM`R*Ndb>=%RtFC^m*>8}@7G!@=v$RBi?;X)5K|NA!|Ni%aP1Dzv?$D_8 z4NSgi@@jwO_8zn2F_yFtar;Klj(!e?p&jj%0U;VgVZvcQ!JBU*=F7QL@gYf1kCs$wh z)tBJw;yuunhnU1c{+sBg*hxOdKb=Dj`8h+44Q;2A%TbL7WJeGY1HW2vHSw>0EOw!- z7x`{293mlXWney)A({kN)vy6n!>s1D>`mT0Ap@wwp$AJi^dQQV{>5x4tr@fdg90n+ zF~op*2QR3uv={{^!aJ^vzabP~LBNNrCFG$y!IuPK)$}gRg%kV0ezrIr)#(?fgC|T~ z-7;aT@t8Tsq*~DK6`6z!$U^WJ1;E-9P4Lqy?T`Va2v`Kuh8tNJ>f8uJ)^{x_Nw;pos-4GUeK38LaJJ)Y*>3kwr2lUqAU`#`>2&W|fLaTgUUG;#_I z!ITWazxEo;wMh#wZ8K~v8cGm6ucoz zowJVuel`!Uf z;xMH-BJqosIGE#2R}bFF8?7dmJ)s>*^=zdS>80z}kfF?AWu;!K*S(3U&tjc9$Stja zph*b`yE5NMa#@`O)j!W&KDfs^@UE&om#&cFGRWZOUR3>jkNL8C>|O0auYMSa&OAtn zs4PgKv|qwxE!9J_rZtN`S3&uhxE}Bv`~tHjC)LBs2-N#N;M7C1?1H)a>~0@MwO!XjB)S zb#17JN|I}Xd=8q8cd1!Ffzp-B#f=5W$7T zRHkfPR5rJg_GnDCwqnUbv69*#;t`XQfua{N-b}sV#l(=vLCx_zDDE;4lm!6So9caH z@r)&Gfob7PiM!&GKXiKkB1v>xYe)LOLp99P3dy-Ri-b7!s;=tZOG!3J71FUhPB46Q z@EFXh30Lf3RDA;t^nfliU zZZ%SY^c`0Q;ep#Ct=M>g)qJv`s@)@I6pt6r?PVHHJpv1Ot3{Yb{ww}Uh!XZ}$t#?; z(p!jXIe5HAYl(!#m11jo1Qio1uQF4w*wqX!1&VKwVi8g3hMv`f3in&`3Cz53TjEWi zD4N9=S|9-zMn02GLD)44&w>Bl0Rr&pW3Y(3S^av5sY|>B#Pk1bwhj&0PVEF1pKn=G zP~EN7`1oC=AI%sQwr6FK{{bf;Vn`*Hvr&Pc@gAyj$!|$p?4)dH6|97* zm;t9k4uP++gY{-Lh>58|8K_Wf^u^4(RNEy1J3r$PBB~yK;-+n)!fq!jV3ELm$p|Y; z?kThTSzK#re_i!S#T#l?D#wr9f@%U{TT$H6#tHl|alYK^Z6wicgdU3L%+jA!A7xlP zBPv?F?zjLXxGa`9I_#%7rY@&PyB@V0*75Tq0xt z6`!)Ar3s=rw`lxgQx*8tPW-3|Nnu3Y$1JrE%}V$(Ucssqc9&>Xis)DtSEGsrVO;GV zFdDC-3Mtsrz^eL}fwal85=VTn|#gqj4lhQR7C z8YUYDqQ;aFK-)tq@l_Q`ZTAXU{ipsu9;Ol=pRHIubq!u>H;!qQPz9%5N>)=VWoDv)EK@z`g}SqZnPOs1hCY&71jZp&Omd& zsRV3}k$qj4k&L5BuVFJ~wYl@Ek86=#loSf8P%azbY~PJ4mARng8tF<+b=sasDDo#n zNIcWl56@rdCj?sD*YstZew7$J;ZaK@kY&m)uC4l;Ge#&$?hk1rC9#z0$+iBcWF-Zh zL$|981DG*hP@HwOiv-P*9#gzxWU!`%m!vMuFs-2&LnwSRaleZLM$^iXsIwkcOd;2j z)gikNxIBdPXLLz@$&$?N^(8X)2>Julh%K9Nj|5ohRMs`A*aU>~#90JoqK`CIqsot> zP?fWX!6P&7w=1TCA*af%>1XTMjwMY)I3S+Th)4-Zf~30H2r(@MOfEvsGPw@hNn^XQ zs!v|QdNGhk-2D;U3Rz_2^*1Z%R{LvS5=|P4F=DuqFcULd6+l*xC}jmNUK^HK#te4Z z(zy!sc_iIv>P0*Nk!#WOc0`E8Z)_lMzy)$wc~$I(wU%eD`tbzPbciSoQrq4a5GiVm z^pt8*6wwnP6qPr{e|739Q+|bfAv1hi9iEMj&>iv+moD-RNl&5&1 z!_fFgKr3xZX4^Xky^c;%;9XQ|6#_;CaRXD4JWgaC{Pw$2L`;H9#5~J6QlO{NPYvZEiJ_+SDX*Ta(0dtiveQU~CGocM}Z8__}kvju2(y^&#uv z*=(ewb2UWi)xwFn9>D$aS-4S`HQbtKLW{1V^g=Ru{A8NPg?97;0SjEdGB?%~F;F=k~G=QD6cHrkBnnMSP!Qi+{(1)mgZTl_@?R!D&)t0o% z@fjW<745Y`)eX6mpncaTc?;Oct;YMw=kb ztJAEDIWOA_^G*UFW@|6L+K{+&Nafk}D`E`MFO!W@8Y5gHMl>QH4pzg%*YZVJHqrw> zk&93nCw55K z)Mj#cZH5!sT_qC)ep=pK+hkx9H1kNO4=5R^Qp#fSJC>PITB9F70RI3rAf+jB=xYhe zXQi&#OanEFS0NdCF?D2dwDv8yUPnAyb}$S+uu^u#49_ZTTr5S2Ppa;4+X$Q6#){@h zfGP7;BiLOL1^fylAJNkshjl`Pa5)M_b32Y1cr!1D<1NGmBs3i=1LmrqV4LAhaoUm!o$GzcY^7tgO#tpJ2jQ%pH#TW!MIr1&eTD*sTLL{;Pf zX(cK@X7#ZXH@DOx87QTt#Bt-{$^EF(3NdT5cKWD2Cg&Bm&j<>$950_vwnzMj-bjnx zt)*7qCRCM^pb;zx3GC`pAmbA5Ge9&@j0J3Cai%z##uAhSm{-NG-tU9YTU>#IcuK6;igoUvcf$J~i9G9Rv zrd)`l>?au)a(&E6qq{CD55Ayxu$`vLy@UL<sA$DPv?)xLbz9V_}#)b;Spdh|UoR zpIwng)IVe?31|)rpX^1Ox@&n*Gx)iJ#t5B-HWSBQoS3HcT!95(y910XtPQ>&o zrzB+NsrY)Zf>pp@oppN})ixCQy&AkFx6HCxB?b}u_Hn(@vyD0$^!Cx-^x2GIN{E@5 zV;QX(DjkQU-8B%gW7Y!f85^>5$1Zfn*O1lM6lqFOCFNmAoM(sOCAimSbU}_9N#T{ru0~_sn;>{A_TTPZ>rS3uxY6^+>3@|_{6mpZ392py_Y10rCzIhZzXdw>9d*>7zuN9e$%*(HDM%Tp1CxQ4cBClc-e z7Fg2M?8AY)(beJhu!?;Dn*@>8XwG%6rF(5H-4mUUa*sm3dH-#z7hGwY%Knoxr%85z zGe2G{Xf>8%@ZfdU{QOzU?9GWv>yk^-_0>xk{v*zU>C zu;@=J7uC9`l%EHBpCGhs;L%fhe zUvL#+l^{dKkBI1X+74AOOh{>>?!^?A1CT=Xi(y3qULLD85hzZHRLUb0DFrPODZmj= zfe8UhoXOKk3U#Z9tCd`*5_$Cj_9k3V{mj;>vapO?MeXUYv9yfPNXTP2#NfT6*p4O; z_*Q+Argob2>ap%y(X{N?K+Dzylfu!`rWer!YG6J|{$kLo$_Rr-s5JvZX(j1k)NsRJ_*>6W z#2+A;Co-n3lJ&n*d?qDjP$I*JaiYV;VIPd+F&q{=i~NnADXRnv;0TGIjkiS;_Pej} zK13}q_O{lglq=KaZbD+_^|Vr+cSuC3w-U9Fx=opQ)a~+WuiI3nq*be(4cvCxXpB;j z*Gg&oxhpPo?vCOfdAriwrdcA>EM*3deu;-zh`^(0P5*!@n(31;(VB<>b3aYAlf986 znkv2_Q{vr0zfjPUxCNFNn`YHa^I1gHsIF6NJIFWE)J{3u5Xz!wY}EYuf${*U;?k!& zy+jvGhp0vYclVcZ@`26x+5?E(Sz0h_z0_)ndVTV||D7sg z!0Hx1i(GwH-ne#yk!&_b!$~(^kK~GcG~matM)A$1T6iunaEs0K2|Rh`@!9=k8lF$J ziOYNyJvB$n0Hu~DPFUsAE2J}Mmaf&aga>At~i{SC0 z%Mkz(g{+gkb!QeV9k%~O5wvVx$P2!#yBZysN_Gy*R1AQcMJc@$a`z79B|Pxkq4jv#-QcT%?pVgx zJ4RHCs|)bp&HjLQA$LvjeDGy#yPPQjZ#P7to|w5^Tq~i$^dK2}%9!|Z#r4=vZJ5Tb zfuB0X%Vtx=7-9}BQ5S3lCaV(p?7J`&Fm{G@gdbLPSitOA**Pp2*BU9H6H>&U>`~wy zOaEaHe|!!;Jm-YTQLp)axq;U#cG&tW;_s~b31$bW)qLo)m=>a)j00_282iuC5XxL$ zL?r8pB&CcS&r!{|J1V7A7=(HjN@B)L25850)8<$r)zb*drz+oKW}clN z1iRoy$P%jX3|AThWZqj!%YI%ZEB7!-`#gfM@})0dot2zdHaDubx^n}R8r^zjt zOG7Y-uhPafMtOy5pP={*IxjWWGT&F| z5ZP^KD~-r`F`sn8P1tYsNMjoD;ni|6sR9KFgr7U3VYvYRI{YbfARTQt}3IfQV2J!oq`+;(8M+H&nwuFSW(RD6n zW!y>^F+yrE;w5s!3Bic8bct&PpT$!-f&8_JuZt;luWg| z4xFlR{pgl*VNJndiP?fOFPI=mY1)=<-n5Y+HjzPvy7;Gl+bFt2+wv( z&Y4`%dm5Ks=KG7vVL8IGDEvEqwBK9b-(Q2WDEAQ-%vA4sOHjS-GF)+`r#R}4qgCFb zT=1E+0%wDyZ~hT*==i;tSZ`R%!AR>~Qihz?BTed&{?=Ge==Zf9pajqF^a&1wp;B3Rk_JW(*uA+Mi+zB09=thDlkEgE=J#Y=J9X?QN-E_VtusZcGe z?g455(4sBPBJt#POoXViriB2YRZQ}iGHg*RhrJ|#^yPh22}oZK4ZsVNGn$No9cV~} zt*O3mX+O1Ou$#6P#~`LQNRy`fyiXL>zELFKNGlU8fqtZXq`{EKw2RIAN5EKuGSsWY z6i2B>pTk~R6kK4}W)oWBWVxv9$w0#lEB(APiH1$RMYh7o2QY*z7QtB9;@_70Qzfe| ztZ{;}x6r&4M#%}w*6Lgiv$tL>+eQ_vnPqbdCRBQI&y2saim576!~EBg2+B%%nu21j z&hjr_I;-5|)MHzbjH*2&p>J!~K1*ULj+@*s*rmLl;DvozTB8RKl?O~0pGIBIF_TZT z%IqL|Pz-aP5xA5G7~xIJi0ru%FPqF6=|>gn$CI#IF0KfTqHmR&*t)Aes>mr~0v`82wt53HV+F+B}yK$E8CwNrHtbIBnV-|pJE%-Qj6o3;GCCjH zjF|eN#H_v-7h-A$1{Y;zQ{x0igVvYPx*EU|)@Izc-exMYL;x&YS3b>_R=Vmp=9|_?_rJGS}Okz)hJ;F#IxJE8; z;7z!Op7=T|%NA21gF*`|x}7Z~_8AmHT}0w{+|VAJ(c7PYtZkHe({!xj;ICK~yGwM$ zI2=Na@sl{5P~t;UM(*+=l+_~MvKXVsiM^Vi%%}VNtD{A$!yA!#%+LPylc#fX@$3^= zkH;K6s5#NR95p*<3{D&_)kq z1FZJps_;Svt*;&QEoTC-J)ksYR4?IM-W%mX3}!5|$e32CF@BW;>>tQD57aoBT0r3+ z+dD9XWBe}lQ8DB*d`|8eb2+);x%{14ns*DZJW0yYd5K3No&Kn_)o}Hepd1y~KSd2K zCpnPgiv-so{o!#8m$!`CxaG8ObFqGv15hp@0(vRL=v0h)HXk!u+=%+qR%)I}eI`~Y zsj%bw7SdSjefE@=peRovr`$H}_3>QE!6?Diu8!hdfEW>3KPq=dRsgKl0Y7ZKrqmHfF`!8fz-t^L7T5DyMAk$@!>+`OCs#~kn-?m zj_G{zv!_4Bv;F5iQ)fce+{okKGxEMS2k5YNnH%l22s5Yl4YmM4!@?~2LmE8ZTOvES zpSD3S@TWb@BF5T4Of4&f!@WjH=1mZ-#YqkY*ka8WXFG5kilS--jWTG^gYE^7a;v?Q zVCfyW28HMl&1UZ0Y)* z!4Jy(R>!{^8*@SdHvI4_<>I_>?1P+ru`=j$9!BQj$r$iS81j=s)^;10fT5BSKo1Vu znj7Q%k=wFq1I^0?3jv-&E+WqzUM|`)i-Vvxm5jGFJg=7)vqXsF+>O+~huxOWv76u{ zeN7TjGBJWm#&VhHdHwKzOH}d1Q&Mt{js_-%!jIUmy7JV7Sq7|FGyR;hg2Vg(S*l_z z6p&3tg<8A1?yBp$ZR1MR0Cff}YYxVWsk%|g2U+t9;Bu&)`RxzH+2);mwCiILez^nAZ-uof-vN_+8z9E7?=rR5f3Z^G?{>m$1G1{8tGA1YI{~8_GQ`rT%gN=2*pb%Gdr1NtIr^=){hKw9HwjW z<(NH$rS-y7IKIgyr}bv=DN zNfxKWyiUN!C6!(vn=4=IX5B_`%g}VoA*$xrEEmXowN)pnhKf_ngO4{QD|QZqL9%82fsKnN)q!Z41$iY)DZk%OWL~Gnvzy3*@9aaISzMpj@OikwQgf zCl@C=)Q8(Pb1>rDlmxM2Uo0o~gjBu$;d_r@vI$Ed=S(k%;iS5Ugr1@S4o5qOLoJ7z%Yra-J@qjf}&$3gHlIjj?4ATTG9_Oh^g1Kb`^a^c;ib?;9o`>kn z7;c0rEZa>gYm{Z5+>>diN}wv->F6NGuqFW-!mXz4Gpd7UId2r&n({HBU^|#VM)m{i zTH>*qB|=6HPl7gr z6(4W$FqPH-SXRIK-2fD2IiOacX>F(-A(!@W&*0P9r%tTNZVYW500td9$BTTpO4vSVF~ z9HzWU22*L4*i$D<$BBYiL7Fy$YFDfk09{5p+r3-EY;(-k^ZbdK z`Pj`Wu?yrCb}d_GXeTUG2Q;gB<0|{z2rLYNy9|LG+5LMF=m|$cUUY-L$nrI|+n5_V zD}Egset$21YW&Kk&Y_5JduZKihB~;J#oZ8*6h2~X9CaUhU`C5W(fHB_sh@FT&SaHX zM)bdqudmp;eXif(uPtPi0#No`n;&%el?!YZNgP7&@RXgxW5~BFro5E+M|-UCa~vH? zGMU9T0HDIom|MXaS#+nR^(ZXHt(8$)hRd}YfT7Vm{yd1J8b<9c$8nPx)3g&|d$q$> z*FY$S!)se+1>}4Atc~A&Aa0)RmYS<@RcPOL8L;$0Q>S6^bq)t+Wr)FBADcuk)YT-t zD=rMx9Yne!#K4=Tu)57%#csC$NOQoAHl4wO2|n{BgFZ-?ax*_OVCJcIco91t2201d z4d$t7_mH1yH;SP|7@5-Y(ygq&LQmD(H;PX-;C(bmjP#=n@QAc}dLOYyER1WJW`IOW zD|nx}4H^0oYI1;m$b>gxcWWpURyI|FR<2&d-XhQQ;P*!8b7^3V@((+N+DoCR7(GC> z8D*^rTmLg3)1GfMK-%3G>9C?>v_HGaW505kQ~_nN=>5b$UdB9G__gOgDGwsN--t&fH`Wzty%L~-244K&Y0%^ z2mk*!=&zeZ;lNcmbogikaRAetjkqseq^524iUiS!u|1eajO|Y%#yU`aRwwnAyg^rcVZa9<~WHXZoEvYylRbOyvQgvd{tC5-v<+CAioM`a_mKnDLrGkThPXJTCVvTczhI*Ruqs%SOa z;-dLm3;FOmDnENUSkfF$0=|9hDX?>wkr88^;;OjMZZu|#q#BudGaKMErOW{s3RzL0 zwj(c^qz#|5AUiHA97i-NPe{QT7c2v2ExzqfJ2vy0okbQ;p%z%?t~gkJzHB=sO#0Du zK+v>B807+ev{=k){X1LEQQT>JjW8Xn7=)ey1sEjvQIshF0JBc`v7CL0YQ@u(zpo9d zcr8MSngea#voBkgZeN661$f&=1o3^hWD*GIRov&@!IpNYk-9gZOXHV9(-tNzg*R5R zmxK_*f~kV>G* z%_$?64{9c~2Czm2az#UJ!Y|GtBgoU?mge-TV{KQpEfSP5TH>m$@+Ymw$XVImU;t^r zCA&y0d?Cs?4&DM?+*Wd#tuo+s_zs#q*Pbh8pu{R7i|QG%C`ckhk2vqpOZx)-9LXF! zJT1zw)X7JbXiLpZeDNJY@d>`SsfAE5()#_tXMaSC6l}6&ADgpx zzDqfx7TG!W+isI)gUb;CL*TEyRr0AcHEiyMX|)|*t6lg7nV21>)w+0RAVvx4O*Bj< zatX*VK|w~UOD_XJvqTH1qJ?SlSqTsEq^wSzr(b9p?Rk@zw0B0iWKQhBBxUGK6Hr2m z^%NXJs^cJ!1hkC&2NDGI`}kW2{R&jp`Jo`yGn+@WE49nq5deT~4;4Y=h)vfa(Aq`# zu@)h==5|z~!`sDkFPKwnBG=}4wOLH!IXBd&Zo3teO_l**jqFcf`IRL!?YogPFXHSae|(z?zuoBx_+ z3-;P3Lc8Q~U$oRV;@S2^;B57pYEPZY_O~oKqWEUE8moGIJ(Ql79E!X+B0|aRAgxOc z(pH}P;=bS@h|p}t@1UuzW$@jZz0&2pmRL?oYF};wa6T*l7@0CwOp{6yAGimcN7_ufvvW)ErnqQo3{`_i<15k zwJ6!fr1bIEQgqE;x4Ex{Maa{B;sLZRoe3!P?V;w{RRLc)<}|yyLG_HuI-ze{Ake(^ zu1%RToQa-#07Bcds1bN*%LsNE_8?_JnJS_V%zw+eK z>CEx+!z_C_Lc2-bvj)f(HF{N|0|1!c7D{6{g@0z6$QV!e5_%Wn^62`RuA!|Up9rw%vlNrd3LM9ZBZGE)!f+7>{$XW#AmFuIiVJO&yi^B5vgH*VSK%68HPkB29y+s0*au3uHYN-(E&3S zf5_QX9*F|5xqa|R3Y5`Yz)mkp$D`HJI6kNo371k~a?dyx(PK}N1WO#iM#ywa?`frd zmtLGigSH-1M`)<&vacl^#)uFACZ-ojFzy^;V3LB>z{ByY&~zEhlm`?yG_+Y$ei){Z zhj6y7CsE=JZ`H(OG5!xs-bJtSv%eOLEa@#WVOcECkfc}HoVI?!Va(8j;t|xOsUV?qte-F`VEdWjfWuklLmOl81AL%BqfxREMu%dF%f*N#YeX&P zqZ4C5y5W&{69)JQ9+37qSe^nOx%jx&im4+2QEGrAPHYD?H*35i6e}{LW8x)!VZloI zB#OX+0_VRi52SejGg0{^19-ex%pnXQB=$hZW^WS%b00CW_N$Hck~evXItxtB;q1nH z?V)JvBrv7OH}REKt*2KAh(foNm(6dKs9nuORULhG43`p<=Jzs@FqVpfcugN5;k#?} z)JA@F-lj#BtO3=je5|<0(H^FC&R0e*c@9U-!A8M~fEfg{y4W#!*RnAFczGD9436cQ zKI&HDu-O{F9^?;`g_PvW8kIF!hEQr%@+neI{;Pp}?#vFbE4E98(IjbS>!TKIQj2;j zms&@63=X$r5)BuP7n6`GtbVMSsiLybn9WH%bBDl^@QKQx+?5!$Ly>i4T2!Ezh@ZtL zDW?@`b^hAH=W$^+r8D6!4qK;V4O9oOjtGZ#{_OE~V!kT5ez;Bz=_=B};1Ot=aLV)X zHsEcBcPY#VYGk_SD6OxApa!{^Nfyz#fGyrZ0j(W&#fk)Hl+W>jE@lV8$>6(uJJgzu zaEJeRBp)Q@mKgMHIMD--sy=X^EB40KB0KQiROx{1eD@g7NJ$87w&9xH@*0rZsSn{7 zPd=#KQ#3St2EPn}Oa1_S`0SsCG3lpa%F>cFHvTcjhqqTI$qK`XZ+Z!xS~Nfzul-fC zc$YB*#1jrrvUAYQ4fD;q9sm^Qvtp!r)8`t+n{~3NJ0!XUGkXfn>gD@c6z__6x5Qb+ zd77;Z`NA%cy`zyVu#duVeS28^5wE`%*5`Fjv9stTC@s)<{Y?8zXNWQ&i5gD5n#r5p zTr&*OlW8|;AHG48Bu?e|DpYYi-yRF8%~B10xXoI^V0da5A897Zw3k3j#k%TBLhA@l zgL|F-e5wuHmPQ1CVLWe{4mzNW^3j2`iTdM#^tfeB^)X4o#zsgvYqLD0~dpd}vz z9TQk$KVuCMbqOD~_{9$%=RCn$JTz%a?>c%SWSZGVC}%)tU2?~~AGYc?^pSA}6XDF@ z3Gn+25*GWD*SilQ%6j03ToWU1p_Ufv!>t@q541kjTUWr;>&k}V0U`n(XnKv0#O#jq zWc~*7TXAR%O0AyqL+ORg@u22nz6dEXGsgmymCdWC+!a2%aygZfq_}JNp)(kn2q8ekl+`dReBIlZJ4wsUE0-Cw&kQz6oCJ zqYNvsmybcwxISR@F*alpa!4V=Ft~ApMtm77eqVT!w3fP&GDRv)BUwbJuT1JR(T{N) zFdB^;`IUo@UV`=&r5y*(;5m+!OgRk|CtxmAI_aS!0{aZCTA?)K;O`j;-yPs+Y03&6 z5e(KxY{98CBfBpG&htlBufH(Vp2%JR_v(<`>ZWbSd%-~sF!iJ=X2XuzOz9@)@d8>; zk$F-*{zNqR2f&Q!Og6+{AF+&4<2z12=Wgc2QJzTCCC7Q0VW|3M@&dnXfubB%2cX6G z1EM;;G_}ZCh5?ELb0Ce)Z`(A=1mB=>$=)=~IHOnxxT+QIhHiv`Ao8XEbj>1P~ ze+rj5z0gm-_enGZ7`gTe?oR}Q05d|opI8Wx#BnRA>@aKz4Wwa6J& z^BXR^n?M4a-pYPMjG#0PnZ+%3N6)QYe(Rpg;st(C^vzMv{_w|=^X`@i5o`?66>371sXslSy^=l8ryc;Q2u}t> zF=&Y=qe=R!*+K(S;B0th%r^AjMy5h=1g0L7_X(+|6L*Xp!vNEQ^aGeY(~NLb>ibYv zP^y>FBLUnvh-)hMYv)Jk3ASC~3>kRz7>-mypr-xsv8K2GqtmmvZ`rz@t(h^dC3iz9 zboE|+a)wP{a2|)FN0Ugtn{vH^-)@;J&p@Y%0j`ctkhWKlntg4 z-peN3FEAsf8*zNqe(Zw=LU)D$N|g}ek1=UUQoeYYWiNWkocc1_G0qw)e$g?nnV=Dc zTk@ezlUYKHz@%3*>l>0jr>m4qn@fBd)!fH=*kUb&nTu{x3WHC;v?vqh0?cnByoAO9 z0w4kRTGW&qm?!UOyR;$lZ?_{Y`+M5)io)8#JHa%RC^`KoRl&q1XL7GIoe4M7y{tOq zVOyvLUDa!shzRvl;401&QCo$+C?MpZ363p;&3wIT#w=bqSv_KBuG>NZPL(MAH^FHc zz>5>=I&Lb}r>|`>fvJ;A<+Lztj4<=uSTP?oVaD<0Y8P5gEMFo+%cc|+So*ed@@pA? z%%eV)mEc;bqp92E7I#T0z=qvX83VZhIGnt!bYLgv76*2R197=_Brb!5uLCitM7hse z9ZM7@r9z!EB|^Y-CNH-gfd@^4@-Lw}x%<-l-|Cm+))aU0d^L!%mL@3-FL98G+FivR zUMHul=o4DY`5`SZ&JQCW<45s^!POViHAo&R{S!}b;3I4BIyxy~u<|0i$$oQQBn}0i zM`buyCCNq}dp9~3Mk>pk#{w4F5g4RanXZO(D z-hB;{i(~Jp6G1n|Tqro@{<2T~X z0sxxVhklJ};8QuJsiHW;X01y;`lokIE5(oDW6-Mkl`%sIt8VQRGqyhco&9_)?sh=u zl0Wg;xO&eUWwj%-rmos^tCWplBp#N0hYW`=p!K5aHvcNrsO*)=gvM^8fhsA3isnAJ z+o$e1T8aU+t5`Y-3C+0lLGFnVNY{Lt> zb!XC}rKdbD(>{I#^;ARpVU#%OJSbIv1}09{<7vWb@PV6{qzDm=XX0jJJ{1e?5msp-z%qISPe_(-*2FT(7 zSehs&tP-YzVP%oQ!X{L)(VP53{pKhKgt*GP?PGJ5&A#dL9ntK2Wokk`g*GU8yDzC} zXT3SfNmzUVObJ&7MSZ0uvz7MxN_ckSO4A_X9#3KoL6Ip)LIq3qA|7ovY+2Y%!N0g|H^R6y+COjrL}At3GeK@m}DTD@)V|V zuxQs#E0{piC!AxR3U6vE+&WknLCl0YsfqzZu?HevFa$(3CsAb*PanLn9PJ539fEM-! zJ)i)QeeGG>!0X@OPhi9%U2w}oqK7J?asnpZ|3}`thg()v2fpjE_j&Dos#Z}2b>I}R z_O>FYs8dv_Sd>u8S*Ljv0!nP!yub9#m+sK#U~Z})XeR}Agc6B2L1OH*CM2nNHJHRo zFfkq4Xe<;Wi6$TEJlc+$pdaSi_w#n_1pAu)Q10(H=Gyz50yOFTdnu~+ddxNFm}8FD z9COSutB(|d@Am|rg#3fkL_k!?cQ|tMWbs8OEttf56p0Vx-db9SouW2t9p|UW1m>fY zz285xn2R%WA~^))rZkV02Kc!06 zSv+lWA6^kbAY9;Vv=OL`oh9IhF8ZF%Qpnp^hzik!n;~iWjZyfPxIC7~DZevn;$p$| z@g^$T85J=Y(O__Zs!G$N-NwW1O%PASN2TFN$}?aSR|z;k3e=|b>NIjF%`jt3E63Db z%sz*psVr~^E(e_Fm8u55XzXmR`US@M(t_B51rrj5jw~^EL-aEpFT0W&tp~j5_zV%?0%= zHu-IkrU6S6@VyvLQWVx&a44G>qofy65?vPsoq^+g-jf}S)kUP+tdC<*M*FH4>DaK( z;AlgVs}9CVJGnc}J<&oZwp-xQAYO`_-w zEyUQDZ?xS%nQ@XTQlyVSRASbByrNXia@PTJ>XH}$duj<=6P?bp8z2;4>D&qggBUQH zY$B(T37dMmc&%MnqV2zG)XVp|EbU){CP=Rr5}U{}EQ5jJf;j-NoUa)3={S#%P7?fG z2zEVOse0B)&uj;40#`fLvUBa?A^#A~#uj7uv4IW#9gkQfn1|>cu@q(Qmh<#92J!6r zoa3xdqYGMb2~3z9vP|E$U`70OQ}x-$myf+E(j_E_Y3RF+oZ|N;zILU0(sQlu#1&5q zTt{>aYfFwIRV>tJ-<2{6vjm#y6J%qk)e|-tGiv>b)g{#@a{Uo4Ji%#2tf4U1$1K%H zFx#$(7ka$d`mBmR2ly`yS7D(qfw^D&S*xj&L`_EcFn*l@_K%IhL41&sLLg9f47S>3 z2GvtHA}5)IJmDeq=G1>7)emN+H*KuV)$4}a_vSAi&Z9sbI+6GvyYnt__(x|Etnm86(6Le{HXUzK8k~JbP)bL0a#BRVf`6Y0)y?R*k#=T`fH6{NYXhrkZ9ymrgo&uRq!QCY=mjk3EYhjzcL9(Cj6u0;L=%e6OrjlGHLT-+r?N6DXt`B{~o9$fwUyTv*YYFsj=T#qgyE6 zK$IPf(f&_!Zkn#2?x`@vsGh&@WJ{^^?LWwNjlMxGW1YhB$*^~+j8xv&^ zP$vLV9VR_O+`O;)({hOBpi=M^1>P{s_+)?a23pOcCG3^fNkE+x(tE;>iroPM!(sZOn!g0gYLz;{jLQojg8Z0jO$PSsbR1N{Ri)f6btAL=D{r8W@c(SdQ5RstvhdzYYjGFFMtGCb@*>4sd4+ z%`;!)Q1W~xNN}9J5%U{H$g9`YrF2M-+b7=NO-4e{q&Fw3MAut8hIaK3bV3ZIli`0? z;>rpHvFj-vSd)S$&PmqA=wIytWPnMcn1^w*F{t6atgg)z-Mrf^IbhmZY2NH~BSPN% z5y@>48xe-!$Us;ooPl|#s!w6`%`grAw2 zwbBwOa3(3s1&G$Ad0hS)5M{XpRwp!$v`cLta*R>*8yJX>Qd4k|9{B)@>jVqmr9)F8 zjX-|%Q;;&SGT-Z6WP?OD=B2C!xltcq$5jnVeLdG24lKF8u^2m|(juvLu7yJ4HV?kP zQ(ZV>3G0$B^6K~Up~UJ$SW5j&zGZ?}z{d8&RGPL?dMuNITE^d3&4)KsmP6Sta&&Ko zGh-ujr}^lH_k72ovjD@#brBv32)%lVkvMP~?Nr~RBLHZC7K+!kL`gl-+=UAY7dcnS z!{k+Xn6SBlt9lQWxG)1DpD5eYKt&TQc3=3)AU!Ny=iB-zYPUTSXSc@97ho5XJvK+$F%tKr(EC0HwNMEVPpdRUNJn4Wx7BVXYm{6h zCeEwsGkCLtRS3L|i~i`MBF5Yj#07nNx}3&&k{?YTQwTLS-<6p-qJR99ZAj7pzt@19 z2-s_|pjPp37DO2gigL-~b>})J8o6}bF|NTr-G8j-w6e)>(Ftr_hjEKGL|Z5|xiEw> z@RH$tv?lAhem3|$8xl{-!Qa%C5-lJnMhn<2V2Mlkep3**8WMxfK~2 zAq;+h4L37>uZHmZfL;r&(_G|SJ%xM+2qjGB=XreI0&oqtv&;W})XHo5q=koSS!g^B z9_(z9V?XQ?-+Jw7H8dD7)km01LMH9wwt0{!bi)kyF^EoRNgwQX({7Q0{RBVplVLZd zyIzaC5zPIz(}WfMQC9a)VIR!k^Vqk_1y5e3&$O*axCHj}8a51|wrVOH<%*>mOx(~p zdPSE0TN_J$3OPr+S{u#-&pK?>{zz>9)}YYy39z zGw<}j|9E+O@f{y(A!*srBER$D|NLM6>gcCme#PQX{MEm@apuSeQxS(@9g=c-*D4~A9!E{$+#5qv7Xp1es`BsCx)Bbj(zzUlfupa+kC=3<7|l7X0eHd zGF?ODSHTb2D-R#O5?ao#i?N#wi?m?s+!VMzAz8Q79lM45bo_%~$QzlC`lNj7Ztox~ zIDC|XbnAj+by$N9H=NFOhBO1lajaK4@;#^6u6nfm6M`!zHTF=g1Y@xUXbt0G>vKXN zA84Z(ad>^a+xtM?*1(EhFkl<+)?rOHz(6~UCi5A!vO1EbICeT1Q3MhjAU2^eGehl_ zsp=Hu;c5>*1A08P7j7jui|0utAsnmQoD4%{OvAY3I9(R4<3>%Z3GP;V6fkly-sIKo z;IDV{xZB-mXixUN@)_e|{RY7Q_w1^qRvrXARP5M8Aisi7OHufud?%hss%{_SCqV5l z0!}h|b#VQ-^Bpt~(Uq*#HJ|u6rgO2>Je`&xCyB0nCmS>~#?WvmM^}{S2H%^X`YbaM z(Bb`4e}yDwVS~wLIOkDIq!4HE*?9;+*-JL&I1h<+WzqfEqZwBBo$_G>KxVyr@^*y_ zo!we?qQE$yuzgVbq8G87GRXs$LlI@r2qz67$i)@ka32eyxp$zwUFK*%CUWx37+eAu ze%jfGAOdHKE9gWx0jSKYeFSm;q;!-b9G53w3mO(;{+}(c6*q>w$(E}djYC_`?-@ug zaB58a8NlUEdbE(t($FOUyj-B%&KXxU`C6%JIlnu7zM4LlfwKpi$-|(#dE%p`JD66Q znbqFIy%R;jJoSz`lQf8T1n&F>dtP1OqKwpz8S%{5o_U6Y?~F}-BnuzBxWwT8Fk zxM#xxWhLjU_xgxhispR}dx;a$D~U8y-=Y0k+eaoK0kT2SeEC%8rP|=lLmwmj1#|i2 zaN_oV&dXDAKb%|+{|YW64xjrrrWbw%uFK{`Y8|5>G1NMIsamUcWHCinV~L&1<{bgl z^|NsmKxx99R^5OH5ggL{e`C;s7O*_@R{?+X!_K?3T#D*5oix}wuQ1YMx_2{Njgvc4 zlnruwoa}dIEjoHYG8bZ8_SG!_U4|vlmdhM5{9(9vUMCBZsb4BfE8W#Tisu@G6k{@AX&>4j4W5X3(AfdA^?DV<4M`9d zeih_ESokmGtnB87i;ng-EM^{3Md&?_v!tzQFpQaJvct_JQ??@mtX*c40G};p1*OB6 zQ}D7`qtJTkO}BE|ip9&eI8YJN^;6uEJ3nIGx(~3aWR3r-@0=ev4NkG&OkbFy5PAM! zznBI<>#SUe6PTLLvkTK9BBK#*6Udz*QaS;0?&(S4pfNRMx@uQDnI#Nq08xQqyfVnj zsLUW^#|~2%?Cr@MH?9b0q$O?Ov^K{U*l1R|aw>)I`3{Xu2ZXd*)abTtvZ=feUR}+&Gb5 zjm;1aAwG>obVlM-ZU_Xc?lC%~yG9px#-YqbNgH%+Dhkol_=3>nNa4X(5xI;V=ENbw zler>Z`G`Ml2=ftFzelkThQC0!u#C|R{4oE-Ro;BYNCu_=ez%5PAf`EC>FIn8Y;PtWB_^tvJ$5tiQDz^o|Do30E5{_09nJEN1Vin|Mcf z>7Y$skKEziX$_RtnZi)0uvoDR>m_J}4?DLtDUyV{D8B*1rd;U(L^Pt^szu5aXFLmP zvG|WbA5j<7FCPE@j6OIYNx?=B4wA=17;df+K7(xGx0WDBtQlkfJUr>HgDG$-`JyEu z+mQKqMmt6Id$`!`f4JHH_i=HoXbYr6_1p;u zag6t3y)~=>KsnJq%BqhSdiqY#g|IKeIJOCmhrcag<0uWF>=0vSm4f5i4S7H{#OEBF zRblG!I@}PI9UoR0Ip8#G6~iG6`{?~Z;7)gS*p3>Dy7)T!1UpBXyU^2xVv!$>3n=>u z(8MIb7NT?2L#1Bx!e5WDe)3~^b&Hz1Sq#*$m6jmfZynq6nO@)b=V87m8mph52-BP@ z5qpE5LyH{S`2Ll(7gIz45pr9PDz$jq{7w z9pF($EYhE>?wxeE5+?;Ys71mFa;tg~P`Mg3muxA`qJ1}qI~&DWcgM4$m@$#+CT%*x zP;D?3Y=9nmnjtg^2-G~X&v+I)P+4k^%y7vU>wfMO?~`AQC-zj{+*=UA3GONh;jR%*B5_@Fs|1(yoM=D4H@08dw& zwR=nbl&#{WC?8ocPny^V>B}^t8c#WYvW;JYtcQCa%o+PMCoXqpLJ@@KN-<-P{EO@z zW%DplyNx%1hZ4`Cu`)4R*?g3z3c}bqXi5U!T$VFF&8}p*e{5V}2pZf?O*0D;C_oj} z+W;lqm(3#-)!1i0wpE_iZu-{hokRD&+{q_f!KEj8LU44FWz~CnP)74x4^FYuG^}0l zkrA{HLY=AS^T|3bmnc1%x+*OT4jkt;4gMjP`)kE;GF;_&dT4-)Ws6!OR7N1L&409mpk5zNDx>RytYkyDvg9 zSfD5Hxak~;**@n~P0ER$3$_$Ng!t$&ob&3lA)jNclWk8HbT|Dv2gN$37D`6SkM`pk zIy(CJIN5lhOknPT0;~H{jn)^(~D}W3Cf~A|v5eIDvE#2%idtc$G?}$wm>aV7jmj(Yca~Np=(CXKB5&cJ7l!^<8PFB#T09o5_LAtsQbpN=}lx z2V60E%X?od^NE&Qx=ThkSFT7@H)`JAexxoJ}9}OQdO;c6CHS z(wCtA;$iIOa9S}sDLhZvVAID-)z9}VWVor$p=we7> zlBF9=)mTG#NMSh|YT#xnwYGNLV;+k@OEuE;)t?0sQN=dqdz4DC0Sv{>5?98>D;zpj zZzA$GT3f7stKIoHOzsZ^eDfPI-;biG8t{P)G#OflURckcDcaj-yr!n=dt+087j@Cj zGf5?20NfY;Tci@$loU=*a9`+Kcj>ZvZIYm(SxC)9kT8Z8-sS(h)J|z0&B$H{+x+r$ z+s8B@Z9{(sLnKm27$EhQ{fmfw!O*8-ImK?1RB*l5j9Ho$m7K}Jjy zY)|T3B%!E?#;eGc!^DUKV-u=7;={#jzxOw=RBA&->d5AlXml7)Id$t7?x;3{T93nv z>&>?`)$7TGHRPiI`XTbb!;?1M(oDUc6aO}^ut3+lrI~y^MTrmPZ)NJAnfPj&j8E~^ zW*TM(&k$KvBOE;fn@zP*W|AD*QRb|glN5O!HS;g6a`X~^wh}&7pAirG_3X-UHi~a& zZ!6FHQ9PcLz=5>Q@scF(Hbx6TNm{=4&E)HmUYz9z1R9{z@p{Hq=^R}ELY~p^87oAw zcA_eZkxk9^sp<@YA+3?6At15?Ie!&V6ZKh91${_W*sr=9Rj^!UeW_<;R-%Y+sDc$g zAlY8e#kUhRk!%Tbe9hTa@iir^Dt$d;5iEoF+R&SJ5VLUhK>7w#_WnFCShO&zV4ufR zWG)0|yD}Cn*4F;zT^|{Ce(`0cx-_rz509R8c~W`njss*5#_BWFaNW&xU1P)swv!y-C{E{X}8Jw@&h z^YnBCopw$*i&OL<9H?DUV{-g*J`5i=HIq-nO}9E=oqe%7hw6%hkOCk(%)|D88d;obkttWTBfK0}U5sg*0s`@CsvT{U_CAUr;h+0uQO8PQ=78jb% zW2}xs4^GMQ=2O|t&3!-aJow7$H#uIMp+tSlf24}-H18y#?jNANvgYmFofzL~(71C1 zdQtJ_&4=C|Jd!oPywL&k}S;~?sqs=%M7DAx~Cg9X)oSguqt;~!E z6M)_fvY_G|h5VJhUu#`FEQrRWRpHxbB&ZU+*sS8U)BM*=8tycImwq915XE^jSh2Ci zDQ$U1fU-)5*x`##k~-#>`vm9`AtZ>5FBDQ82=(IFD)gK$KAwtOciMbb+Jm$J_TD@t zG)V9QqG%(&`h7~&y!uhHDgm1QzE?Pe;GOpt`l@8J)3KJ59H01<2*^B~p)5f19F&7z zy7m>$W$sqHTHRnq0D1s1AjF|%l*g~Yg9JtLP5Y|jD`%nM4sh>xMEoGZpI|5INI|ff z{<4;tlgp2x+Ep+|p*jJ&zjXvN4EJOG=e@`6aNAEiX(KB9xLZ z<_yG+(2pM+13n~0pPsim-QjNFE^`**EM4C_?itX68D{LM`n;2zqR<>87QO=>j&W(g z&Bft(F<(?f_mv)Wc3B3W6MZGu_xOdBxHXiiK4-Vp>bzc6YM@9 zN0dpcm|-yY%y?~ZwPX&w5+ZNb6>YGKs0sLE6xKy+@3ZR^QwFnV)uWS0#kc&ispi_H z`aRjd=aaVPthqPd=@X1Wc`T&Znav|UAWo-w+s1D%$^iw*(VVS)-2Cgl_0 zdrXrd3n)di_9$J9qRkx?C~tc`J6STFoRpcvGNrIXkiJMZ8AyXL&HBVshymGJHrrSU z<`%z%I~qj=jwp!39rvsv@g9Mze`Q$E5q8kF_k5stFg%HwhM)c=2n@WI1RON?Jlg6h z!~ih?iK{R@g6W}rphd!gXYHvLGSpIL1h(-FAP=z2qs)90f_(7fuw_ht8!plN$`%~D z&2ccnUvMcV5*iGRh1}SLSNRFp(6439Ua`WE*2Qo-#p*_MpK<|)b7=~ZYBymiM4Xs& zTHU^=yQZFt9%HiTS#s?B!&t;xM)Qs|j&9`lI$T}Nj{_@zfweYL-!8xuEmF#M?600> z>mmhx?W4FrAt%ZhGU>2R?oyo=~Kp3n}Hs>Q_ zXo#r3WV5}HyQ$lLU|6i)25~FHZavbx;ubj*#TedoHKIy`gGb~>_cKBL$67|jhR9=X zr-##L05B0ywKO}2UL z@ucD(5%bKokwx~hYN)&}2G|$&yc~`ZF^tA_Yl#es(M#8wdPq8?XxI-26?$|A29r;kQB*hCyeF%DxfsZ0#W!8`Yjy9Z7mr3R^Iw4k_oifFD z7d`fN3_g{I*aa_cXrv}6$0r2#A;FXM7*4r813S1_YEXL!UB;wXJyPe~9KPu^XpjX7 z8np6rp>bt5VpS0R5?VMOV~vR31|T>_bT;7_F!D3$1bWCCo1~kL+F|At^q#kZPr|3a zIbq~dd>OPQ4zTlswni%fj5}l+x^6U@t?Wu8FIS0}5TUNi2gBJi=onFOI_&T!2s~7e zG0q`BC(Mt4rBg0BR+3((@x|4)2s)+maY;}uAmuef)N^FM_UYqK(5tXN=STN;~>Y7`UeMSO;kfPzEQsqOPsOvB*DIb;z>N@WEKo*${ zWx^6;O0P|3(g?wTCLy#p942c{Ql$}Mh+vq42BOPQaw{JunioQ(%7-k;2l(RF)#eoh zBPQP$E2iscQvhT!i}wd&JDazO-=`A4k5Sp;S2k6<;(M!^t0NDyKzSG$JQf!az9Zb6 zdz&I4&_NUqqK`;W9wQ$>HT`8Y>TWnTFvX$jDI{f+u^@1yCMymr(TvJ?jPXkl`HVB7 zT-rE@5Y0786vr|RBg>?*KPK93S7Csvr>B4>V>LDmAa(M@YHKQ}E8FQ=3^ke|VoEm* zH9Qjf!lB-vFk`5b!US2$w$V_B?Ym*9u3b=)|QCyR@<6HW>` z-cppvSUh~hrhe*I{_Iz}w+O(O9!p4TJ~X;mt9y7?5Zn+R`C-YVR8L$#JJmcCEeyLf z_F%fiD$x5rbv;;}Cc)A)%wRoxvdmLS6|3pbsEdAk>aorsV@Q!18J^|vnYc!x3|YB` zZMt4fCAwmc{~oj%$)=#%9Q{U@{4CTGLIL$5PppEmu1I5|4wns8-O7cQ1lp1P7dusGjY8k`a?Y*6`8@=%X>z z9%zbHGRRSTD(`X;RBU1TNS{oh5m*Ofbc#R>#sf2b)aBH9l+`L&w8*q2*CR=y-;aiw|(Y z*wT}Rz4A06v*5tj26+QrX9vd+npAJuAICmC4^XQ9`c}^tE3Vyln)?CZi-8TwI|XED zuBT*qtzp^pxzAd+R}6X=Z&Pq$UD8q+En$uXk8YU3fMm)84mDB}utu9y{Jd?3VV)6= zBGaxTv@YBaGDakDK^kQ7ku!=VFcj(wA7|@Oa6pU!f;G(EVpte8w~SPPPOpjz_a?p5p#& zp@%$Z1`~=9{K!sNtWPO;JepD<|0$t?m8P*8SUiy(>#*s>p@HD^5$nX3QD9AfP=rB` z$pCYV=Mn|B0xwRt6=E&{(538%>nzPBvhiFZFP4g>ksSghYm0^i^_k=uz(m6VQGrbX z@x>g1Xguc-paL>T%V}fNtq7LJX3!$iMi5~{u`q`~<`5DoCS#7krf*1xX&n;;$a$D! zEXLMxYK8uy%c5}B#O*|gg&3Pic>~N5@)3I&{d}Il##joCu%)J5gX~6eG(0= zDnLPbj870d{3DT&voi?^m)b{)6B`dbCZQ@gU2rc~4WerWB1uHyMd_bG4LDoKN$&G3 zZ-vS=IV93Y&*zSK&PNhWLW#BnNXKER!zisHYJalKug|L}mKdToi>5e-1fS!baOOL5 z_b?iuz^Mkq7BfrgnTss22oyyJ_YPfK$}s~5n&CN?I|dgg_F`Let4WVea|r@MFPCa9 zQCx!B)(~TqhuI3=b05aIh99J)Bor}PK@o_R>fb>xabiI{I0V52unugl0Iy3w1($61YX3^6&0V<3P1;mF^cs@UktqG(VOmS(s^W7-2{th=)C z18~onps_3j!KA5)loT(vja~p=*=$zd(sd{HFlMVTnIceH?1c&y*UUNE*IX%v%2q*P zDH2a;9}Mma_5BU$4A00vhR!g?)KL7mU6@{sb`8s8zLNj7N#eh#3PyraL0z*2Ey-e&gPf|nNLedyPYH_7j z8evy4g2aO0rb0c2KP%?LHp!R-s@;?s3!9nA1YDboRb`1O{n50=h;7#XAT1dKJV&aO zMV_Jj+0Ye^VYWy?Bzv+P%9ywnRYdiCHo8+lQDS_e%!ZdBLv_@weKN8qg~dAFr8#c{ zcC5KCy*`X%Wwfc2aQ=23wd+PFU}ON%Yk05Fm|UPc(Mftx@>ogKV2V6=T(rZ=mD`@k zxl=aTz=pEM@K7#3!|H@JQ zPYfac(oZM<5qW8Vr#svAt(0&<;u>IItd55lif+OPPjfoSzt)a8D#_%j!uUYCDzm(l zq~R)TY7W1lyUrXMp3F0Kr*~hElVGh3iX(2-e-?QPEe!B4QILSt$S&r%v=cV?!FY!N z4#ISA_z-{@^OBK>sBI6XkfM`&ZI7>fl6^H z+`*~Rn-4e8QSka0msAvn83>iuIb%`}!?7@@`U1ySY$ormHb<|Sod7|Ub{K}6tA9O2 zm&Yc=qsDt`gA-9oNbIY5s%V?7`^1a`f7;Ct?wYvDbyh^`Vt90e7Upc;+`>r&j9Z8{B6$3~Jdz1XGW8ok<;# zVC=&4HR2wurr--}4zUy;stDrSE5@-wAgI+m)!!JYD6k&57kiX`Ue8u)Gv%&=GI|i5 z6iv^@oQBgpNR@UYUltr28K#sTL7#wl3LK?`ODR$s!S>ngDqa__R^!O&dGmsn?5am* z28e9*4UY?|+oOKvx*SzK+il8_oK!qLs@Ro<{SF%LlqJ*OHxqs?h;nrzL=vC!;r!zf0IW;js zu1EfJiq>q6Y$MID6ELOU0eu5L_((}QoN$RkB}aQ|zUn_P2w_gf@Rik5X@eQ)c~^Hh zq5PDE84=!Cn@;*pvnYiH;0KkWSdRy}wO&L5&aGRjA4&H{OZX|ZcdGrP3fiLWtGF8# zj3TiZ7`0jCN8(v15=o2)dI|S8F9i_th0((`GSq>0b@xQ|`5f96=t*}DzA0DXL|=J8 zfFTc*Y*9P^Xdy$J*6TCkE?v~F-pz10Djj*ct-wU>QR6VL-fL`kr)H>4j4WOfQK4G? z6Qof6pA04snS?$UOMC|nqdlwlvfx7vWJO;`k6Kd#n`qw1YJ{8h{Sn`(Xw(}{1SPFy zMjNMf@v#hK=SGm)Eq3{mdr3g(QNMEBI@OZ1+K8e2>;?H5BZFd0j3N(WJeYnCJeLaN zNv!FAgLg~n;^+GlL4gHOkcVGk3T4W6?%l%qI4EHY@xUyz23eN3a7kPe zUz&4y3&M1Y?X;quG@9;?bbvc-)UvijDG`P@lY;+dMAwcw?zW*n|Abp|QETzLl4L+q z9OXH)H=nbDV0nBi#GFSHoa6+#*~y!M3cXXtc?u1OI>Zb9VdkHnWfF|&!w$)8_qy8N zmDLaM%jD_0sD_uK%p61;&o7uVXLhqdCU{CFPuO!C(E^C4(-2yF(ZpV_8rW% z;Cx~35Quj}gEYfE=(U&M0=uJJ(=)?3O`;64vw;en;h-pPk&AM+VL2R3MR$73tU*%T z8Kl9m^l!$_>o$)cdLfIy@SFH56Q+Q9-X%iY- zGjomVD=zLmk_|Ek!5qDX4O71b7Ke7zgZ;Qc&Ire1Mg}>E80f7333#AEmaD*S08!qDj2m)!m5rRk_AyOPd|CgLQ_l zpNJ&e-DZ@CnNOfun{N{_H%iJE(lXL(tvE7_UHWlDk_BeJurZdqd6=ycDaZlNPp1^j zj20MLNAn-kH&Ddk7V9XdPplG<51>B?zPrJg;5twjHW7CNP)Rf&%F7^QtV25CRd6Z2 zOI!-;_=Zy%JSzh!PeX0@ttX}7#Tj&jKdv(=0GXL-0`#@}f6-ILXaHHJu< zFYPrKJB#3afc?ddJl%h3c8DJ+=pZ6YlWZDE&G62YjA1<^c{<&bZ9OJskQYmJUmnL0 zP`X1!`-^Y4r$89sahoM)A!9#7|3$t#07;N?x#KPA$pT7b zChzXUjiJqqXV49{7>RDh&6@wT3!2@x!Vv>jt+5JMfJHUVb{B-;-ZUVyX9eSyo=y*5 zLb|yrEf7Rnbx$^dEqDn)JOrGmgKM5v@0v6qjIZ!IN5lss<}Txo^kfr5OpY6a`Xoc^ zwUP%$?jY2_FLhJt;O!|oqu3fq_34kh6V-ug+^qTw7U&R&V?2N*p5#FR_Z48C_7otH~I4wQEr zH#ECL#;+*4&Xs=G?*4)rU_~T6<9)t1uu=wPIFd4~aC|pUe;#RgNX*c*`qr{zSmMEX zY87azeF~U!;O^g09@)Ahy&QegzI=}q!duANCqo8+tzOBrr>fLdaJ7SR{OEew?mAib zG2?j=B{5&K=3(*%=pSaq;gdfW-deJvekto!|3`jK|7=HSZSBM;RS`P$Bzy$9`Ik)| zc#TA4y9Y_>3GEh$(dPW*cEKiU(O7*jB+)FxP?G;{7Ri<@6DF(e&e9Eqe*;--<6u2D zdQ;~VA{aXN^c3v;*^r&|bsrX4j|J&{QCjf{aMh7s9Hb^CHK*LjFNO7`-c91{YsNYU zdu&psX-+fZnBYxO-NPNnc$iLs7~Ykd`Lx0(KRnN&9P!SSgkFUrs6pP_{>1qbXF~7l zqit;lofRsk)ig)(Z~y>ifa4`wqKg;XtwnpX-Dz(UTBrI=Iit;$bVyGgMPU>=QYTvD zU;JtH)RswBJJcS&s`fQ$Q*LSo^K3zf6rYw@>O*L{bef4%;ZB!)La^7QyP$XbzT3Vq8TQ-Y6JpJjn?~)*cLm@SRElj-So|98kxW4ZY)5 z_lLst7L`98#hq{q*^Bj9nOE-FpUAx3Rt`pO9y6IWKckmCCwNB8Q5#(TzFr^o7TdlN zQ#?2^*=Nmna(V4O;tQ{X3hr+uOh_Q^*X^w@ZGiQFR+ucWy@e;@bcpQz2uzM>;?RN( zrHOjV2e^J1{qU8P;VVHP3~8bA|Gp~k{#!hIM>#JPt(w=jzc zhO9VH={}%R(XHDESmoh5A)y7_Sp8~`>=h8W7i2V8SHA#rN%JxZv^hXfZrNNK|GpGQ zj#87vUE4(B>cEr1u>V5FpU#bOcLg2B3S0_LFI=>d2)G?vGhE*s=Cm>*ug~B!UCe>^ z>Q@jnLdgr#B#^^^fAn|r9Oru?u<)DE8cR+{7W0a1h6gr*`hLAdM^O|w6pj@N9j#ys zif(Q$iN%vlT-UQs$vVwt)xSV8^0v|<4XkKVKv$F^WK-@URR^OTA1RJWoZjqDeh3xZ z1cjUZsrWSP>pjS{__nL&O$WO{*+mb~kKY(O+ImQmiLh^9nwCgNH!_Avq^%QYkl&cn zAeD_~Rp3|4ne`K^1bbM_AW4!LyVdCS1}3&26Lwpz)`@NxY2g%19vq?cK((Y*(-MCe z=4|lh3u?vzRQ;h^zt4<`d(x|THGvZ#EUeU%aMu4}R6y`K6M6-yvCRb;lf@z!vi|Dp zlg*Df5k`IK6SRTQrSKlJfM|{y;bz3C{ooTks4;@U{?4m|{T+2A3YtW&^3z3y3^pI{ z-;WkW{I@4`Ss+{th%w26`qS1Tdk>!)=lB&%wfs)y>NqUeFl6N;COo*?A{YRBL#n`-ifBSh&*Av_ zo4@+nM~)pfpmYuzi-}jKx$nfC9HM2yDZ2o;)izJ~ z(>a9i83^!>K^yjhJZ#_v#EuNp2!8e*j(%4JpfSK<1{0B8=s=hWUmvG&#g<<~#!$IJ znMb0ly4(AFFIkeU9g`Z=q40>&V4RGF6zXXr64MRFwWV!^p7%9YtI_rC<&Oi$2W?BwVg3mNGSxC1r2Mk#QtPzAVF>oRIQEqA#fEV8~Qs zDpgsC`hConYfHopgt`!{7@=-*F|m3}fRVMCzx=>>J%v+NeUAPUMqk~mTG4$FVHP<% zpb@j|{Jl7^&+*%b9YFd3q7c1A0hMXnyEEF_VJlxwo4iv~4ETn-P zAy(5CQUy&{<_l+b*Kp$v7excI0JepvtfX8g^1Cb z1t__d`L=GQzuwD09Fh_VePA(-(TcbP`pwAsG0zbilvVGU0j=HZ{bJ5Otm2MZI%x180@N$SklT(m_TQG_KCx`Cip-%!N z;-d&@1)Z=uUqTd^uFOQ!o^HPPYnJxIUhZ9&lV82CW)Jn`p9+anoE&zJdfp3V!P-MJ z?mkYfgVP7_-;Y;;mAku~6NkXLf&nyC&9x*s!^;Y=d z{8!GSke-BK77A8Av+DjyMNp?$TITL0d3E>l<0l@zvwPPKqOf||aAKJ-!*pf_^86Lx zG}be->fStzeq_cVgLRXX>9j&cNkUEIT=N+;$LPsO&O=cvk@isf#)f>Y=X53S_Y{sJg9L1 za)b;fg1{7HD|DI04=WQ;EI5kg5wZmxzA~hVwATCTEk%87$|ECAV4IzhB%qn`B(uR> z&B+W-M9y%!}RIEx6mm@(OcA`VGYe;t6Sgr`%}f{F&awtO~|G$jiyg@(cNyxGZ1bhlh3g*&!ZJFpAt_ zGgay7PP`g>81m)?dc~*WB;_H~65Uv8=pi&v@(PfaCCZDBc>Ot`@4+O7T^L>me;mIOBhI-OQuIG&3a%mJW@p;afv-uf^t(S0`XS8 zI2cTToKXip*xA-{;EOtplHg9(5@xLPOh^xC2NiW!afEOpwOPFqIx>1Vyr2eNbFE#* zQOAmzphQl=h`5?E37IeuC9L;C(eT%g4%zRE91>Q}*l;akksokY^Rq2^gNt3{r|VVk zoIHLB7g-a>zQSWczU1qxT8Tz|m+<$c)k}fPDp`!9Zg(rq9iFegT7WyyP(4mk5#Ftk zHgW@4KrN4*VG72b{Gjz~8v7r(3C;)~76+B_5wT+uJ?ny=cv(+71p0Uw$31d3OYTX8 zL&-Og^$babqvFzRZ}=u72?M5$a?`A;G(d)dw}Fi6`&7cVdUjV?d%!jVtq^q~F#(I=3kd5TaKOlX)93-61=A2u52_#wrc~jF z*zum}oDBgqdHnFvF}1V}Mk*?A&aV58u5CfpIN|2D*_~gk6{vXX?(|i z8c@Y@mJVJIztxoqAtmquL(ZZp(Jwh$i6l=Y`yF*Y#$cmmL=caeP;)-Io4Xm`x>`Oa zlUMgmV)j_HhPRP#j?E^awbF3Zyvj=XejVW9j37(GJm%PFNpcKwZ*N{(AL&oqNr~V? z=50rqr7_#28N5oIG!D6K=nrIFy~R`py;jmhFB9ZpHO8i<*62#|ffDsJEriBH*4Hs; z&f;>6ZpL^)IWYcXh!7eeu|Aku&|nB$b%p?04Ox!bopL(TvoqQ4m7t$vD5-28mKiGP zBIl4Qq9Dg2)E6!|4qmu3M<)GjH{lP=V%63+AP6j2eV|Os4{4ovJZ=a>V4~p|HiV*f z_OyrDmrcpShn2EVVNZ4m8fRV~>R>jA$suuaI3xjq;uhA>5je|OPX`c*Q# ziau;nmx(Y%YJO%t03d!An+x=7ML16^%P4XdhFe8fj9aLqFt#H9Fh=j5Y!T6MMswnR z7s;W1^h#GrgWI$Sp;W~%1;^=0!6iA^3Si*n`mmFGmu3{P(81=5lj!z?azpJBd-Zqu zCFK+|@9COl9b{+o`Rp($`>?}sK`L10>HMzx!s7$hO+9@mKP>s}TF&aN^E}(?0T%qz z8%!@}gWWCB9jiBKRd7hMgym6rAa3`7i6P^=&rQiQa^(Ui*ZGy+mxIla`3y!VavC%P zSiNw35LxZ%{K5)AEL1^pP{8G^snd5=4`7U(4dPTz=(ukMCw>69MXH}%3q_KwuijNPqJ97|{^6gLr@&(+zp3{x(26**RUTT->s@zaYaWs#@}mR2dpb73*lfOhY_Ka@K+!(N z$$6bC?FVa?jNy@3u$@~dh=gh_l`t^i3_$N!cNNgMT^msaPvi%rN}6zlrf<7Q;%n>e zoLqh;ze_%CZGyoTK)8_J?i%i1F1`cufS&+@T1-Q|GPi(C!% z(0SHSg+ya)1j*^P5f<&bmAbo5X#7@Si48FIZX8^zF&B-=F2WZY6?vmA3m4XV?ix6M zq+_^-m}p7`?O3xEcj17%nvo4(=FMwIJ=6;Kie%V~8I$*aMvdJs}r%__Y|tSXyvo%0#NFGpAclPFI8JZay3;2TFxkw!)U5WEOSxf)Fze!&k=WOl0mGX1Z9!h{!UaiL{hwnM@ExGk zvzKNU@i26iEpshG!bwEn5MD(xD6wB!Yj)~zkGbO(itv}Ihp8U0CU=s}khk^W;npjU z47M{Cy?W>XfbvSW>s-B46>%^ziCjq&2dnGRz|4DY7;K@tza8Zu4TgN2%yEjGEIw6tLV|GTMR;$~ zB!9q}RpJZwrOv-tt5tebYGWt4*m=KMd0NFt1Ggj+uh?_Lr34qSTv>y6B}8X0_Fj2d%u!i%5gdT;B*-U2*@T3^vy7?Eb~ODY zEdDsml4{b@Uyz$9T@ze|FHCv72;jOk7J&!mInc68(2|$|4IT<&v^(b&Ac6;HmNFnq z(5y*dtQ1R)(eb?EBy-LDi*o&0cVOKFi}5h#HW5i$I&aDAGcB9~aj|e_pfFYEnJn47 zCGQQ-BA|yM0k~{=&ND-iFW4hKxXx6Tah26)q02e$CXN08KGbGlit5O_fOnRDF7^p2 zyFbM#uG!U^d)CVO!v|x@NC2_-R`z)ODM1mN!=si1Ub=W{yzC!lh-#4RI{)*PVdGy45VHhC6AUL|LmU0( zD`1Mzz@6mhamA3bj){22kaAW<-qMf?u0ZyA_n`G z>c4QshCk*8o;tZiAfm~WKrFSJIzil_zZVCPKiq`lyT!m}LM}Ghn;B^iqJ>!O2y_*r ziMM+kJQRXuQ;LF3;9{Sn1J>TCzk`;&Hk^(&W&!#_+rnSXKCY^DS7XH4;F!g}S)LQ9oqy<6@!SGXiEgAKS*PDXLcLg_q}`Oz#vfKB5^Od^2Jz^Ce?7?lM5@ z*C&s~^V1jdWNx?_`r0gg4fl>oL{T(A1xZ|~!OaNJI;+pDK3@zsV^eIV1bHOhOcc;& zkM4-LM2bjS~~#pP;Tx{}}qqdJh9eFw!ZPxHl~mRKBE2P4iu zd2YW8`;7@2-A@xoh%)Ruxn;c{x`ph?bE?oRficDw05(eKB*Jtv5V)P1lT-4^XiU+O z6tRqucwu-F#8jwuBd>Ug^sk&hK#@9~5VK&YTI|IXVYc2xZPA-pzCs)rpN;z~T)srz zBAyYCrtQai&#J49D1>z^V>OOVmUmSa|B;HH-AfR2^K8G z4aS^HahZ`tT;GINNtRzzh4vLJ{9Dz2W!{F4V?St{X$x);@lnIpB;w&7*60|908vCi zQqgkt_u9F!GqVj;`H1JHWz1oLCgvi5c|rP6Dj5S>YNBQdP^`l+QC(caOn5#>!io(( z7LsWq-lBn6H+T-%+Y;Ck5D1ngHnF*cLu&~2Qe$rsv--Yn0QE6ZLSNjVO{t#0K@;dY z*e~v`Yv=MDw*aPzPEu=aFVz~@P?8!fs?&~XB}+{l`o%B~5ZgWt0)znefjfTK=l}sO zLx9U`CqGXG6dmGrLdy-$QTbtCFxNvhey(#}=MJJTx*TmX-1;zzT5rgaF*!>?RLtaO|6m^7YKFErSrt0(X2bz=eDMf7K~ z9_1DSj_;h0OThZ}`3E2nXlW9n?p2GBH!$ABmJNQA?_id$Lq$p9VnekG*DSNvnxrR>gr)PH4Bx4z>6Vtrl3$cc!EL1R6}X*n!S2N`+3c@3r&6kbxF z&KJEu2ol#hp(eFMxLH3WoSpUF1Z)(45pn<+k`a-uqpt=`(9wY)2D z$Vbd`!Ot1b?XiEtuQm%GJD)=-zI+RHxtad+2~=By7>`&8c{PlQrsZAIo+`h z_tI=feU_RE1Sqdz`WfkX3FQCIF-%N-67y*k(&Xd{2XGz1rg1n8y=^8RvaelhfA;3* z)uooC+%^NQ{=nsNRi=3N;d2qsLt(;tQb2(?5~MIH{AJ>>B@JCsI||Qmnu8$TB_J zmq58TAj`pKK-pdZtkp{gh|RWrMV+*$faQ7zG=wq1t{2zPBT~7UTBQskmS|b4Jc~eU zD!IjAWk`b&0Sco$Fh1?cT$27BhlwpiXEE?ElF(Yw9Guq@NL=IQ3`V69rzxX9ls5{4 zAF>aIsps%TAzA|Fbwf|b2g)7PGhK&>hv{e@u9qMa={c;JivhLYurwmuN{Xi#X*n*W zg8Bgu2XprV!~ISqX}>uS;^d{A0xfi#JCV3|MlwwnvKe%ZLDyyC;M@^-PW{}&gC?NC zptW+z~T_Y0Y7mw>GUaW=n0 zgcbL(HCQnk(2P*e@GDvnh$8_Jp^M%FKA%%dDWtL0qhJS6bD+7DmLP`aWz8jG!RXxf z+NC+{D)??)4_(2N#N_q1=7L*f?-HP{BHPkB2{3uy$5>%hV7`RXJ10Li_A&QP`Su$ z*r`O|tcdRXs#_x69jwSt5Y)i`8zK*9(>B274)@YR z(XkPC(rzs@53*>0qECTaW3PQ ze7X^@!MYsssO?mCHOowxxVU0i9N2#4;9L;8y`Du=VZtziX+9TiEMiwbTMrV3Cb5nn zAhYyA75fxJ+w$#@&BJq;JYX}am5<@BdpRfzBMv`}iT+(K-r@mN`)=k4Ho_f;vnEiB z*ax>_YM^kVPl$*-6P=yc>@%>M?tyi_{ub@RqA@#CtSE*J)Ge2I6`3m?9gHgo7<(t= zVrvzqdK^1dYZmqkgT|B|O!!xfV7lv~4T=Nwjq~y7d=S{ViD62#f1J7PX5i+$an&I3^lKmU|sKU?0U3KD=1#`fk-^nGmAs+e>^F zL46!bxz<4=^w4(UM(WfILi3h)s=K}qFlF*k&MF*<0KMugn$wfDR&bMG;v&qpp}3V} zv$24Np9e=junEXuGU$axq!$*T^yg92{mAHZXl@_^EpgieZE2_t6#Ug&O!% z*XLAkF7)FASBO`Hih--tf805HJD%7WBmm-%fWkv;2*eM$!QIjdz^x8czu8+u4Frl* z74b4jNif30+BlvrGpH>wDzQnikNI_GU2l{N4A_>H*oQU7Z6L{gc|vK0{pQ?ggG2_l z!JN;96`y~O#Vp8oYe-+c73Ts-6eDEQp$(Btd0hb^k}FLfR;yZ{MSLH#H2u=s>UsO* zatVbsn?{qe_%_@KG>e#znLk$3z5$DfL55gAtaKt|ceS=^0ajv?S`WKd&(r=!6ykfa zXGBxg-O+j%J~M`r5G`dip#{{A+PyT}hrr^5=q=Pcj~v=mVO3|<-@92Me&Js9(xEuP zaHc*dKnns1s|XtEu?HuC4c|Rq$IeePH!Ld_Iu!VQvu*Uj#(pYK{k;xnE9ZgNnD03jW)% z6~XjNU1$8u<$RDR{fcNlY(3=atkx-1x@k~I$h!^b$GE>x>Ey^aaKt>BEc^%`FSQsw z93f$E>a1x9VDtU);V5nf=5hea1GqXm~-iDbN?hGH%$N>jnl; zVhj(r(y=g&x7ItTrChg*cO<)*wzt;jV?s0?IAzoPk$T$^7NVX^v@zI3b6c8;m?S2r zCjvYT_|q^SI+yj?W_krD7rrJX#dM7Cmcds0D`7Kr4u>Y!H^Gjra3C%#i}%lw0b3HQ zIKc=;>oZF80evC#u?*C2m<&ek&cj1U7EC_T>(|WFff4wl@9Ohc`BXZPgpdkqcBdB9~$VxpZ4{F{c9orFfs7nV~wP{AL*%{Wew1??>dqOh9s(KAl|7 z<@2&l(Ss0vHrZqYHIHMDF(hRwU%ppgke9PwCXt~><_bC$!RcxIx8MyZno^vA-MWU& zJ+kggEvqLyBIC~?7C^Rr9vR#^#*$3J`N_ znbzGwUXAK=Nu4i_v+OTZ&*KD5Pl9^;!`_SY;c{{Ja_8vs)A;{3-^D??h=;JWS!&Y+ zBpwqd4;n&qmTDN9>%#%K?vR+inz2DRZ`8ZPEo2JA?Th*{Q&S9RiQg5AfEh>Jhl!~K zQBQdu$q@oT?d)lMa+11x)c)4L99Ug8cDZm$pEXX+4Lky}2 zFjg@6%y|~3FF+zV=z$h7idwG?Zo^yoN8%!Q0*$yfYsa6ROG05by zMex~>9+z|VuI4Vy`}-!_v`f|*dto3`XbKc`GzOAC53?}l=G3FJi@7F+Jj@*=YK6cp zq)m!kGvviUu%uj)(=BdT>-naA2FC~7;ZLJ<8qZiek5h}_RUAnu^gQz}a`PO4fy0PT z!wkL0@`!ZAfWXWw0UC&lzr-9f|Q011a(V3Z*0;Bv9cf&mQQ$0ZF|5Wtjry$q$Jt1@%@ zs;+=bImmmRpNmqINrAl}yi1U! zzR_=y8NQ|7ZCJ$acJ|Jk&#?uPorY-=b~sf%JtMQCL)lgkNh+p#e^qc)sw22MXg37o zCV_^B{pOFeTLwh8a?5TYd%Jxe&M6LKPvciO9HBm)!#Fhv;#3l0!k`FgKskrM=T+Jg z!9*YeR2VQIE0ZbMD;JMhQXunz4U)i8%&SMq*0%xk?Ngpksm(G!h? ztoieYGn|wxi>8TZ$GPF6b!hVN9is)Di!0TyP6#nVd%&wyPx31~`6xB$RoDgcVJrOY zg0MRrf3OIn24JEf$23W1MF8Ov3K0AR2399_Mz%ntKImP{sz1#k1F(@N1;g+>kwb2o zacocIVq+1R#m^57W@w&l5_R=1YHx;SxNn0#3b!bIAkg$BbQXxAX)+>EX+qwE3IUGp z)BB{er+Um72)vdS;~8W4L;T<@G(t4cIBA_(^h#;k1tW?ja+YCtRlgvCcZG{kf1y&Y z*OSaT44%)xZZz|=raIvUavxrn550n%oNech5{^gyiA^`~Z`4={y26##hkgp3@##*0 zEvw&>z$dDk`4_9oPT?kuZt)h6MMih`=KrDS1vcP%aY!Yum4-ZdRa3A{>{TwZxyt1* ze#X^Vx?xs+ybuP3L4{?n_s_^i0l`vqGlIbG(?y+CEECxLVs*VSuXd1)#+<~ZK?r~% zLc*$ky6F8&_Pm!%pp9>Ki;z;yXq|R?KU?GzFxB!iS(`cHV3sxJis#Yz*#k6y$M4cCw_;;(bI24L9MvZhrgIo$A71=8*PScmDE? z(tT5r<%oBDwV07W;er~cZD-Y|$pSZvJ9-aG6~$HQKmbm}V0I}a-@{ARsA&%uAT&SG z%-sqK*S=n|TjkaxTuw2j+;KH`+mR#tvz_4EMbN3CGgY)-$ftm~Ug-hy#H*PdZ;7)U z7@n!-Z(6W9zlU2uBY6>#enTcx)n5o)8QnOhvL$O96%IEm2wpNYqn$a)wuXm+Hwj)Q zytT)ZC$RlsAb)CCCANfY3ijcGl4g)sDZB4OS_X&V$e*7~Di6CIB25NB?sG7JI zW0jw)Q&3u4eX7nbj@pe}ySk~L-SoIkduI3oc3k?1T%sa(4COj_QIsLu6faqBpvN9L z(fnEqqJdD(8$iYgRcRJs$XnD7Ak)=r%n8Pmjg6#xJV&Dwq8WZm7C3T#H+T|mr;b{uW=L!KMf1W`Pks^aq%oSFN z;xmN!4J7O%I0$htKfp>)$7ot@zW&L2^<=(U6%Xx)gwy%qkmCgzx9Mw!lT?Cc<9aD-Tw4PxZGul7B3NH_oH*))1J#M!<6h&0;0Dz>=UalngQZOpOdhB2KY zA+f3*dZ-CdHgo5aXV%%DK`J)<4>38bEun6(_1u4iK*9AHR;BxZ%thrfDuk&`K!AUY z{JEtUyc}Z`Kq2`;)FEKf$i;pJpH{D_V@eCI0Gk1^FX5zL!JpXUb#T4CL*6^ym@Zq_ z#g$e?2t{o`qZsxzU%ofyJ3QU_gXxe-wNa7Y_O6VDTq@a;tlVz(dwJRkA5xdv7$euN zlQc^681yVG26dGHq>OAEEk})_S~fPT6|1@#H7bbAp$;&rAe*WCh*wAw*76E(f>$El zvQi%Jo|T|LM!n2R6Bw8e#x;9; znx{^6{L35YF?!cL6fe2A9Ew!Y`$j4*;mqeNwH0>{QpRM z6KJ`v@<8_tb*t*$sw*AIvMu|{_*Au6mTk!r!C)gZXy4XgY%>K&lSi*4E0DKn$?X>l z#S0#?CEH?bVhki95JSw6m?Ty=&>;i}SYZlDXMl_(kYKkRws;otwf|NU=VvnN!N=C5V70T0%3wk`KwbPOzG)YLqEy{+C) z&ao=gKKQD_6{4o<#*_q)Aq~)FI$&!2s&0MRDk<$OjQ1;d7FerXJUVvrY~dOunec@i z+b4qybzTEtE{l#nJge9ITBN0*bIn!J(Dvkv_JCvj0)AHsHXLwNAm)gyb!cU=i7=Bu zr{<{wvk=BlPv;DE_4JNc8igP+?jQdUA?O?c310qk4?Q*;f&I-z=u4viv`4zKywXmu z{;)*P?Fb)HL@-|w3^(#;$SsX379_(-4GOu@z z`O`(U18*Mm%$v8pT5l)`67y^HNcw?BgcQ?o0jmLl;(+GAxYlwiYypm`ONRCZuDkF%S~kQENDyxmn8E6ti`HunUcGlG0!d(KC^;F@;mwc`n!R~n3C)wX(kdP{%q`7lqy zT;)^DT>j2AzhejwLr1Z-tJ}he7Y-Tj`iRn}7t>AmGM!jU9K#qkGzjb{Kre^Zx96_Z zf1d*h!k|`eL>aUjUlzQ4^J6ga&hO++KbvE7qnpYuDP~BAZAC#+K*@G%0d_tS6#ZKX zt@M;W8c(H^4XTs?CWvvGPcn3accanI*Kiy& z3ugSZ6E!)F#c=scv3w+JKCl-T9_n;q7{l?dlaS>KZxVFXD$Wz*GH#WQ!?B{qfG>kBjca%Zt)SgUKv zCn{Qdl~0FTEbW-8ehjbLWsl-fB(pl%mmLS9(7Yzj-15Q=Eqlt>-h3GTDd0N;4`vFd zmM71^lY3O9g)3FY4(E(?PseA!jO4$bXTo~v4vln>OYu|2`G^?muuT~fNLNUum@m*w zb6&m^r+7G~t0l9dPzJ5fo4BH*yy9JN^jW#DpY>$U6wwL6JILq*{n>O!ka%egyY&$x zDt9|1cs_{tp^$>p2wddaQi?nJDg{fEH z0HRg%x1L&}+Aw;SX*FpF%nFuHEg2CA5_V&Dg{;2z0c65s;pS5$VF(yR;!MDR9XMEk z$87RO-x*Z{(pHA=VJgoD{B$D@GV}<_=seDsvvAq$EY7lW&{}s3(-BF1oR$Y%=O?)* zNLW|EJn3@HVo_Fgub%7o2aDs8fduJqKUr`L%`vBrT3L~)(rsT@{Rk;nrMG{%NOLQt zh=f9`9xFFk=VG83VROy>rCIxDFXmA?irlp*;5tO%S$TC?5uQn%+nOI^*=Q274>D-y zuEYST={nc3Vu?K&WW8E35qtDSb>NU~E~t3i17y>O-dU!Pv*mON&Ut@tyr_^|SlN-X z_D4`1pcO#J1fS##opQ4f$_+4qpkQLz{W2SkHoC}1m|dWN=iLPYFbI)?YN?u`M79VH zd|j+kp@^u`loElJOe?l3W@>;AaOIcg;P+AR1q<5>GBr{u*{ncB^U;Z23mX?;cp`Mv z3phw5ohP52Pj7pDL}fx^E2Dt6Eh`!g^3dHZNW2%kqb<-q=rXbcK0D0=`h_pEJjrW2 zPXQQ`@r|*kLT^fGgPJXnjbTemXl+dZFZ8B24&Vs z>lu`T=vSeKud4K&6ZmQ!F@&he!=D&GZWgrHh*J8M4|H|K0D^f@m&1|RpkF!-OWr#z z%ru=L*Nuv{dn)Hq;%H>nT>N0Sz<+xZk|#RBghl7*mxJ+HF45V{0~9@9 zRicxDRzNwI0apistEnVkI|yPhHRX0RKh`08APuYA%%IrA_?d9>GM^+s z8EMtCP_aO=h&)LS8DQVDhK$K=DOnJNfQ{VAWppqsnV5*E7lpEUJ^9e-*H*%^={$Qb zz;r1syKsGkhpQbtA+|rSoc|BLS5k(*lFV&jBTQ==utIm>k0`ti`t_N;Ij z=FhY|ZibKWoK!~fsEDBu0IRml7AV?~6B|D=8cd9b?kpaPc>Ot35Zi42*N%;Gq#QZR zH5k0w>-n$nDmeh%$!b?D!c2`zV{$?WbL2JA_g4mli*|(G!@<-hmj|YJK?#Ux7xp`A zy*+rhsw+9}8}i7g7VT_9jXc>P1`W$d@Mg_$9?v%~hFqZ|0J(^m(U6;Z`U~l^nLAX; zV{@cgGoWPkpgh14Fl;XyFm8R0#~`@GR3NBen-eG@Z@jqL(0p%BlOOOf6|tiwE^)xm zU>grw1muOXz2lIyQ$FbL2`7aOVQodQ0|bW{~la{K^TkQ4MOQapTUzZ*S7UK zHQnRpKSTJ+)KO44%V&R6mcwr4Bn-SzzY%~e^TzT5tGfs|b}woxDE7;(MTK&bzWlm+ z|Mt=?KNO)y)*C1nCFv5Zqu}WBII%jQ9cw=wQ(rhimrpsj8m;2Q<<8C(LUfJ_Sj41? zu+_uz9V3)`kj6N$JUdBTs7&tJk5ft3SD-A8W?_(k|Z_+{?*>LMBkR~ z_nLslagYqZ3+C?S1h=tzx-tE;d(ca43(B*m%L!sKlJHGoeXXcFZLn>PghepKt+o|N z%zp2Re5Op0d4>vr7u^E=v6di4ARIOaRwG<+L~Y<(B+`%!-7CxZECIcw7gf=o1IK~( zvi=m`5VPEM>K}4H{c1-r1#0312YX(#WM?8RI}l)?Osp93%b5*BDnhKK5(h1Q*rNIM zGCvW52s(Bj0iaj}bIAyXvdJZ(0=yb*!TrXc{~QF170_`ldjS}QDAg8Ak`?P+u`Uvx z^|L2r)-%7Xu;~KDy5H)27%LoKH?4xR6%?-i^r!Ksp?<(S08m^!@3*_m-)iwYDxbtQ474jnzb2C|PK^Hr85tS03c| zMpE`s7jlfboUS>*G6_qGMYdL~TKX~@bnyNy-8{rvJMut7Rp1(9*}SffPSAfOPN*hK zy8tq8@{P!w^5*3dVVU0dL6-nS9q*^RYx6#?)ZVq_WX~D_fEP0nI8^bJSzMFO{g7w$I!C>bJ&i-d})E z;mM7Q;z?|ZHT`$)t!SEo;)HnSTPL}~sI?RY3b3k3x-4P>p_FjwZ4Eq*-4hVuk3cs& z3pRIpIum+{fIe(1F64(Wg64l#)PP8`6om1qA^u^n!NzEfq8BZq z>L9c^ILN|U8i<0e{9L?Wl5CkP)aa+^vB>5AJ}yk{hpwO%VJkt-vF2;LujmJLny#1v z&Oy&q&+de${Y^3-9nt)3&Ofap<-XZh3`TauAiyOfW7Jjfw!-QhAXL7yAVkA=SNQ@3 z0T*R#v1b`E(V3+wDkKU77}^#pv`pg8f)u1kU%pclda{*^Gp5oY3MR1}hx=wp>au1K zL@fXiTpCopmk+sd5w~7f0i+Gb)i-c5}UdSQ7=)^DVCAvV* za7{A#V2VsT#Cr2myg1=6BkMCLP9c7nE}-*&fJZE?d2%giOXuv`7VtbgDcy;NflnD_ zwp8D)o395@yY(ewLFjl-rJPzq={mI*caesJKh!bG^1rBMbQYL}cJ+>O8vdXF1}|~^ zpB;-z+ltr3`76yE2Z(9fX>RI|eu$5#qYE?R@(|(5%tnsg{&NXWLz$GTFN@)rHd8NRB3=N(CAIZVqoOP)4d3G ziC5IaRA3OJ46xBShdn5m#<*YZf&jQQ9BQ(_pr~dXhsL*ac(`J59+*VrGV()6nNYhm z#}azbbWz~#*iTwtD8My?F<`;gV5sqpZ;|I@>e{beu<}kFe*tiST4+nOTjgD+$OPpA zHq6?ZuD5G-DGUuwmz`44>PYlhb1x@r`JBx82UKH;PfQW`x+amF9*UW)g_|)B#?33w z!5r@m2r!!LEOc1z2B2@6E6x@Q(e`pfOs24*b3Ea>9y&Ge9?Y1yM`(mc7)ce2{~3%? z5x}6b7=`=&NO*W!J3nEB;hbb+_TE5Ynqs3-ZmgI>Yc_3tEE|)PaUUl%Lwp7%j1NxM z%7m%JJaTJy796Cf1dC(R&~1oaK&>Hkytpb4u3d*rg?G_r-hKwI`l$Jybw)*iC3fC{ zMml<6Kfo8>7fTzCdcOHC>(?Ms^M29|1KMbIFBGFw5*eCz@cGUhWGYv&~+UWaV21$u#tccQy+K z;n38xCe7&-8xq7EQJ{U7jIKr{b{4ES8bYdf4FyW@0k{lY;54aZL(Iz~_;0AR1dF4O zgboi;>A1&V6+Ncj*-j+dShW*r7(0<-1aKBX>6xE6z($BKsA{Ooo4xz;@Q2fn*uEXZ zs?xdFNhA9KO?`kujHt?CnO)<6Z3PYiG2!Sorl@~qAUvZA2ZFSLy$mxbS3}*NYyhg{ z(Rd*6?PKIG9vasT;5uN1OuZv-k#%HF5yE1agRsr*p_5>=*vmh}ia~lY8*n4g$#bbG zFid}*Yot6_%o{SEL3JHim;~$A?bkOW%Kj;lW6%N!>{gflKDNU~rFn{Hy>sK=3U0U~ zsDc-Ws)1S5fLL-8oi^%ncWF#p9ZSQr-K8|b{8A_XhxLGupfDEQT4{Ho-bLSPX_jg~ z9)kcp!6P^plZlS4V|8>l2zHqMSrlrb<@6Z{Ous^)Peyq39at}TxoDmA4d!sqhhRtE zD2isgS);FuIY1t71eAep(TKQKV9uhEHa|>inB~SWJ%*R!mSmps`y^Tz4-*R}FE6{* z$+kR*zLE$wuBdenQeLYw*gTcy&}v;tDqZ|&-Il^k17K}PgSHM+FZ4Cp>kVk}6Otd;@=(d)!NMjQnz z3}{w`fuo^J5t%^fC!HNTI;D>v+E2R83LHN$-_G;qvfNecilCg8FU$i;ZPjR-HL=$G zN;tPsEzHBq+Vm@5W*968P?5ZWg3bF>WzGhiTtAb+WT56?Q`NQCRz$$7193WtLs`Iz z;&V($@8+lYl1nFRh{8nd>_JE-+ZaG)TQML`gtb$@AV15N&V=U$4e3_VaLbOQw&tk# zP<>ogq8syw;qVwk-g(SSr2CU6L;HOnWne~2LW_(F4f78_h zkz%{0zstAa8czJYVuGk(O-z`B-_w%aAEWf;?kgsYFrXL|ZeDfH^uK&H`f3&PoaLV< z0J^@KGuom*PJpPBUN*NdejYYMY;K12$QnfGW>1;ScFHxmH4J={-j0`rm)5c^Xv!ut#{iM`YBL( zvjaaEn7xgGV7y(Pib{Jf<>z-R*M>7+i_=XoLdJ z9-KflhL_-)k|(^ctCS~~`kFnzMk-G1xSvsF+59CcuT9zS)Qp}8v~!;$0FjPBCLMLa zj~on+A(y)%yb!(s-lI)G0MK(lrq{e1y9I!49}(nEp!}|Cmq1$2#LeyFP4xs_5yEQf1$8OYI<;<_LtRFZki@H)98(un}1Z=jFd@->J4b z1^;S6YK-XkpoO-NJ{`JkTcyXj+#`8999t%&F6xX+00k!k?fiwHkm8(|7Ed>HPn%Po zZt9-0Q(#ru&E3=Xl&4#}r&~^Ws_k!UJ5G7}=?2pCsFDwtZbJxFdd5kW=8Sv z^7^DSFz#XWgs8$zrB&h>fXuc#!OIj{T0AV|axet2jJkQiQ(yW#sAs>Ne)QO)+EvlE zygDC3g~S89!o1E8wd@&7SkC#H%^YPoNJftVdvz}Jp32#y8VZ0|J(Xwhc6<4YWx5X+ z1=j{>T0nzz?<;fsVysM}RpMDWo{8*NJ(LV z7SY9j#x@@n(1;iq#XMK5VmIYWbw8 zj{BjF4q5yNwnvy0ePijFJ}($8HH?Ey4lnPxzOz@|%G3QIcX?k5sFXzw`yqRIyuAdONzp8)xZ_7y2&sUF!Kx%mi>BqrJYNs;gaDQ zAKTfUF$V>pEha_nzdEzdnklOAkyS zy#gCeYWbJP8y+G1(Z zylYut z=bi1`orjn2DGp=J-JCZ%ra_E>(^_dhuUh$8WS@zTm`4Vfmj(d~@01Ne@7ypZJYp&Y z#po?%Fymk|l8A+iFn}tq+sY^#{gpoFDi0KoT4qXqk;~yBQcdiNxx!Y(8&GXcU6h4T zX+DNkOkLWrMf1wcs#r+M2*)ipOy{bEQy zfmy;$C5-n9qoT8?uxQ@Lsn@+`w|^d!@v!-lr#-MSJ;%tuvOKkB1|NJRJc{Bw2u4d0 z_JK@dqHJnXG3Z*diuibLG|93}j1cl}qgKVNbc8ZdnCGESff3yTJcDLx!d#jypT6i! z_9N%P#zLO$%?Zr>Pk{fxzfi&+__T$r*(u5lOsh4QoppNmU$3`*eQ$Pi^0#+-zksWH3}cK8?t5#?yR_UEip-?(b%QB>vL@0m~5;5U;<=YtusnXwy7z zU=I!fP}Bk`Tn7Pn*aFWN_`HgOP#YrjM2=mHJ-jeoqCdyr`m8>sDx0)p6iXu|L8#aY zXOWSDxmN&^Gqs@as3O6VCA|}|?zAqK~`1|_>rpa17 zR-gP_!OH0#uJbVHm=rJz1SfAvdLO$zej_jQB~q)V_s9Jx^?*I;UiYVW4v8w=vjn^{ zKx#s&!6vbX9_IkGg28v=jW_j*w06ApspCau`8SMLl%w zfl%dS2>d`hjcQ*k%WSD@lErbHmo;<(mv|t-)^i3Fx&hY_j>+#L|EQouhz)+wqb#+9+l-EcTBAbOkk z5~jtx;#Uo1%yg}nlvyuG(lKKNABp@wBU%F!OPf5xK#G9nJbH;I88M?C}qXcCFaufkv$-;ZwSio4!yNY+ zsFdQ%6%0N(H}PEe{;UE>;sH2~8lr**wm48A9%x$yj5=zp?ReRMCed*w&aScAIivef zQS)TdD@BM-`2t7>{7Uv5Df?IEIN)b==S&<{io;Ixh>tAnN8&~mUF#rN6(wsxxgS{$ zOHyDwET`+&gMiF|0Wu&w=yoc=C0MMY75bWu_!(uuC1eVfT*6@g%%oTfWEvICH&9Wm zhs53W-0^MzAx&|<&L9F3!6=k$Hkr3j&?L-{CNUiYtyhSVQx=H_feVLdVofpP_g(5q zZ~J9vS72u20<9Qn6d`#76=bxd@JGags@x*XQi`vtd$FhxBryHFSXr!+wDgam77W$j zP?pehWJO{(3(T=nkOv;*n_sF!qCuEb!XZ z^C_9H8r+2G?r-L;qVRFWSZp%DPH(PkJ`!usJ%X4~8Uut1JU7wbThNnd#3kPAM^;aZ z%eU%sc{26mq(@zW`=&SE1Y7Vl>*jW}>V3>48YS)z=%zP~ut%aFf%|lR1@Z{LdDb2| zeGq0epzr_G2RasFER1qzae;6?3Po=5USsL4<+KN*jb=#`=eib84=D@c>Zikt)O;%f z#Wo3)x_Q2n!UO7udD`prmPJkwcPfCK>|JLM%Ka+)wZNR?%E!gp%J2F$Dg$Vk@V_6WYYnmmq^GqpAgfs?+ z4tV!#5QNck+etU#5r%1}@aA_$&iR1Av<;fc#nT)nOIa{F5g=wg#(WPGU@RQ-tKlw8 zRtoF@DDRB|I|2cM0%_azZjeR!8&JjN##2Qt4KiX3J0^!d4|zP!I@q8XC=`fvQXjO5 zuZVfXn{yfX$l(`UM$Z}=es`cAX_YeO<+Q-F&y4lzKHGfqv$pMnl*i-4cJ`qI!W#-u zNAASq+VG)=cwIL)>bwFa!9-1H5D(@ui7yUK7Gr&2oHciRyY5@VV7j^`?TUH8;6evP zLT)(%TdG0U_A`>f<`1OtHG)A+ix9!_H3vpEz-J={9#`qm)u^?B=7HSJ^WlcP!9!Y{ zFZy}nOz+O+qrd&y^KUqedrNd7kskr$LKkSBoNt531thHvPEWg@7#tzGsmWI^lN;RX2P&UpEIpS_2hGv50wDOGCgC=Lw= zxedjMXV~8B?yKCS0iv0kD|itky&6ph9hxu%S_e5ik6s=qS|a2?8xbz!?aBHKJwi6u zfkPRc*R}n3y>YV6htHoOQaActuh{h_yFPyJo7(la-`960aGzzoJ2{2Q_ps`FAr74b zS4USp%5}>jNga=72(m8U|Gocp^Nk<zF!9I?KzZl@0X_TPNU%P;@H|IJM8E{@*Se)q@|mVb)*a!;!wi66oTw|EyIn4yZm z+Fk5=_8$zs^Y_cQuV4~j18P8*Ud72cTUCw*=}$ka2qCUWs0S9V)EG1!N>h5(M=eFu zxm3{ltlc2_dPi|#=gNQ0tLJW5ZePr%t{|5|ddX;I&|p5J+`|sGRYT|IWT#MR2I;k5 zwK=rA5NlwbQ=LEYAZgaS`pgHfKfK@@pg2l@k1Ek9_fT>H?I3;hGgbmXR|8qtQ?WqK zpg9#>0r()oA_M;J?St~!-(8ka`0Bv{KLaQ|nvv_>kIV2D{|4z-UW&km2j$^FP+}ks z8-~<8f4P_tIe=F|I8INWoL28LEq>Z!WG72MJB!%81I+2dB4Cl~=vh51ogTf%~ zj29O$Vj0dWcY|g2feO(1)JA&g*Zyes zFm?bmmqgG!FK&Sp2;4MP=TN;3bmSD68N0%Y;h@e);JGk5H&!r~x3DYC6^K%wJeH$G zkEL9Wj3F>YuHc!6PL$d|Y}RRuwu%Q>qJ$iV9?zB+8roT`8GYn}>dYg(Zj<`j%>|Ug z5;>l1|CoGr+PDRbN~yc6NbPSDZ0C{Hy+AeHi-0-9q+R3YrfRaOx}lv%+)PL5hm^`h zWj1dm>dXQgFll@FeRr}E3Hh6s#%iNiH&>(S*#i9RcGEEhg(vgz9f#poQ&#`l5KOk@ zn$`UFVlLgPr!(pfhX}=+Ux=fI$T@z@69CSjyL5vveKYMIZCP?Qy|kaObI2UZd>^ft zHF-j&a2PNjEYXRjW7D%aES>%3?GlG3PR?;Y$LaNFVSAnLwQt*{r-k|m_z^>~dP|Ud z>Jp5vE-law#{nw`1|4PdYi@iF0B~hG%z|9Tt$Rt@ zO`MWzidO9CS%4|Ch7M|^VT$9nCYl0d+9C$Ixz{@5gtS1MxIz~spAIkofhbTG@eoR* ztSru;<({H|R(A^WT9gOt5@u*}y}U7J-f7L5k?Db}oCV4EAQMhEsar9Kwt2u2UJ#;2 zRNZ{6G|K>{uZSf_tD2AEfe=;E;U2UbtC0})<8->sEb{zf#6B4dMqGd@*~ye1xeund zEy8VhqEz*rK)r^DG%gx0`uiZ<4;GhGl)ncl0%oAEcv!AhnYQ{k5mX+ZHn3%0TF09! zuKN5;C=tb!E-1@K80DYns~6VKchlB$NCi*K1vT)aSUof{KSSgjwbMtE*b5B`ScqwONfx^JIa3* z=hK2ffzf%F%ob?*qgV?G%wJFkg&9MA36zr*x=G? zp71F#@+y@;%au25 z56M+vyVT1iKVVCnm)C;A1HW!conKsDr<7a?vC3=Fc}j zkKYW!S)rz0^ZWShGc~c=DmAI?qY$xTm{s6tae7viLW8Hi2^;#nMbq#PN8J?Db<1z9 zkunS51;mg^y&Xtx!42>owK&31B97MTB<#M}Ss10y8EbK;T;icPfF3D!Eo4=&6kiwG zjp@SXwmCY#(7bZcuFLY}bfpN!7~AmE32#4mf=P4brH#MXKAxbz7BSZk(0vHCyZZ`~p0OMgt zgrkA4IvVc$K7M$YX=QQMXgGt3@6y&hphX9?sJoH9VUs2Pe>R=XBTOo-Y$|jGzmPbH z8;@Ov8^d^Hia~lxD_y}OWPn3MW_gTCI1W$q-3BxJpM7lN848|^tINqr&K^I+=FO8$ zVPP>)S_Lu2Zrk#9gz;y!raxT)Uz9+JXn4mF!(%1S-9*$a&r` zNd$QZ{}mv8M$#_w=U~U*xh6wRdTa=8-U`utgP!WysGoP;M;QM#7o5+;wYxd#gzVhk zbfoz&tDZw)@w~~;gCOET{!l86efDXXTB_Z6t;b&U(&KO-0U|_AXa55tW`wwmx%9{b zB(P<~Fo||f=9p=95Rwl{br(VqXNE{jABC5I8i2?U;!L|7bQIK()4)ed8{0(%g|&(g7-gh8#l0xl@j(M{*1LGgb|@t;iBsd2*UdHU zdd|_}+pMFVC_?M7TeA*#V~u_Tmi=&DlTC<)kwGM&2)}VWbbL~GKon9zN2cdTBVzz; z+>C)^RH2^CdB{D|7^l*IqTBfutS9Ctpc_;cEv-pE#MiK)<`Vw@h{#USYd6Y?F&JbN zd6HQ}RlTW$Ayc)ymD9T>HL~@gS-c+lC$Zlq8p0>0-+$&jQdj7wj8lg zP#RoSKU>?}PW0{ltd`*dWDBPJD|e~$=HWh%Ai*^bOBWFfuACjq$}p#5Gf?j68H;V8 z;(F?hyekZ%JXzsny|6tE2p|ie>-l}mEfkFyCa<*)LWGfzYDkh~jDgB1^ZQ$Ux4L1C zL)^eZN3810X22iD1un>30&6X=oZ~HxooTm3wW2+tkix1$e`9I~EB<2k$$q*#NW4Gr%SC;e7gv0^ z+I^{IC3mwR6P~hBQUi?6;AS5B5sM8M_ z>sCj8GCIfll55qO5BHl}OB~yk_A89pBb0B2Ye^y?cIUBR;=B@(%TB46M4elf0!(a% z#{;hJU2}Zkz@xI+Jx9w#PvKMb$>C?oQKuV^3N6RJdZMH6iBqj;6cM#4_YcK~5o15v zK?ZNP1P!fYC$WzT)QH}C#5!N{Xg9A{_gams=OBky;e^$uyD2&V3kk_kD^o&MnUd7r z)4698(m_3jIx{b3HM?vnu*t_9d?Gpot^*NhLr&TQ#PPDJ z0Q$g2lU874FU=mt9ijG2f?kg@dlQ7!W;UoZKoKFcl)%wW?`ic9iWQySQ>*ugCJQ?Y zlg(#Hpx0;^{yX%aA~s#F@SiEL)cqFj6ZhK3{@7beBCLa-mKt6J4e4zHqYGx0UV?v& zB$Hu@Vr3oA=pcc9#6lh1?db5@B`)fv)hRo)pKOh8~-L>0_hcNpz zm-pyW!3!E@B5&cgY$wRMe2(AF6cin}b^5fr8{qm3umcVJ6K=0D+n4PH1q|1`sNC!Z za>r@yYZYruF;c?*d){PuxOt9NOU(;Ta*FeM>Rl8=W5~KD94tK8uJ{<&6AJSOV%tg( z9_o^(Scr{uY|J_Xf)S5O_+hLi1f|^#4b;_?z)j{M=qTWF6`k%ikHecCDTZ9maBo?W z?v8PQB0VPl;ykt^aq|JD{^`sMeeE^@(*+O+Pd70Qfp2`vqqcekQB3b597q36=-j>L zHE0ssio1zCe7sa?_bJ$X-VM#$xux;akScCu{-7aVk&;MlqYs zfeF1+@5-Bd|5)BK+cbO{uF7=VpLH8;b+NLy*3p&eJ9$%Wd`tEb@OAHH<>i2t2qLts zped1ys3d_v3n+8Dc~2#K=_aoPzytOJ+gm@HlGcsgKrnqkr7x5=W7{u){NeQL_9!+L z`+Ro*BySw1;S(J-$9~{)^xGw=s0kd)=b`0>fdX88yAe5L|M9S(puf5FvW@#dr9s{` ztGcelAjX#PG`j0-y3R%xBv2;Cl|D(H;O6DQqfnx@72Bs+hVafUY&@#>%9g=XGr@=J zdlNrl5yOB*fT+ec-t!@QMD)(f)wys2kT&}LaTpa1KLf3fDKi)gW)g5aAWzV5K$zJf zj_D-k0!#g)s7p)wdMWf1EIYW3lN}!*({x_I;>Z0fIAMNC+&lv;q+2v7wWHW`&J}`8 zPS)$1v_YSmW}l@7Z~J$efD)uPK8_!T=gdLQz$&&@V-0m+`w7oo%6$RgLM>8Rbw8{K z<-ouA3HMUQ9b)1L)7S-whhyg_Lt za}%PGkb&PZK)>|r{mn=6#+_Lj1vk$ANDvk$Vg{0DDl!>&e9v}wyTPXO?HqZ*71ISt zx%1z{f!VWqCnosgVs#6h?h~45gg>o%Mw(E*wg2o0+ z)*Cz;19x9I0N~kpXTdSsqs?)1VRR9;I|Vo_b_Ckdf_sSJVm#%af+KdF21YfX546LO zW<%d_w2#47yM#{mtI}OEMPT+@GdG(R&IFZ(2089xV5{)mWMxJ=**zNl57`mqy9+SH zf-z7bn;(Ijig4Kj{fL#5b5I1T<$ta(sdvb2M9Qi=tp@MQovwaTbd2n(BG*}w7P)%K zs{l>0j^GD6&VI?Z)`@%$Ktt}~SOEt&1~BudRNKUN&Hj_0%84q10)bsQx~Y!&a7G+y zFxCJBjTh;S=elwhT?R08g@5HW@XPXQ7%)(+i}Uq0SgJ_|4j_lQCn= zytl08@K31RSL`Pa{uOwxf$KfN0ixlceM#ZOs7;V2`8C5!6+4USw<; zj4rU|GBpWmq`RuRWZcdwUK%GDZrrf`Ir`$ZdLtnT<>4;2xCY4(f964`uEp_a^UlB0 zp14&6Ek_f&vVQ6Q2`Bg(>+6=9v+7;duGrWC*85Km;=1rdHMC017%`n0cA3Gld72i2 zrlT12xZrygYJ1OmM|q%0e3X5CYTCK#2mFl&bqB(bX$wn~q(CUQ_;4rsl2}ffoXP+3 z9ZgQ-|1N!aju?J{yg8-qotS_$li{k0yHU)ZAPcmx%hVoNb9Py?Jt6*^FA08M(_7iq z2)2~OsqR}`%>Ajj!9z*i#(=Z41N(J-*p3?rn&LW*|d=JC*iN5D^p*d=39O z(2IGp8;oc+IBWn>FFe@UrE=z8cK8u3dNnOzo9a@Ltna-S)^i4aWt>V6j@|<3jBQ0d zZPu(SaisMIgSq~2I6o?eWp#E&aPSNIqCw&sk60RX#{MDn$BFENBTl9y2x3W)eNHS& z&l90p8YeX}nt*R(g4xe`F>-afwEVaiPdBwoFKjnmKiQPFwHt`aDW1Ay!5Mx`Hd%Y} zV;cLnRsIMnr#}98qU4$MhQqA!?CQ%QtDbs5JK!WfwWjn?a#1iY4I4Pkq)H!&jtWL_0D%oceoW1ERw_PG>4rugqS#$i9-PAh|Sov zyl|A^F5Gba^qf1u4=!(7E`NB5%X60NXDp$FKwm%mtzthsO)U&|EDGJS@?<2?;j=i7 zncp)WR+N*6w3}inJzI8+X^DRiIXXS3eaH>h-!ZF+NB>uQ&V*%C1H$K!fuKDpd(8li zI;l~ZcGx5{+S%mbLyWYu)B|9t{;yNqG*=(6ROqBE9*cm~)=RDfP$_$Ogl+7Awn`T? z^T{Z4Q9V0++C^W0pLn5DEpB)1hB+B?w9>D34P_-bj?~=rWVaIlgSjqiRC=SJh`}fa zRD!zUwB@SdM71&Q!FW@k)$XGEZ*s2DG@hU1I>8ecPscYXp(|^7qI#JndUNIE+%f5T z9*ENy)dGp$+JU%MCr3m@|8D&TYvyN zE5^kal#~UXV8>^SS8iOUyN+DJnsJ6+t`orLu}l8U7P(wu66{Qi2ntt>qN*7kLL2rF z#Jj(ELT)ii_?~BLyJv3ciQ{*lVxLm~Iy!ZQ3Z-oYJ0~g=PVO8D3w?bs>~z61=u*>9G6|So1VJF z?>RT%1m#_G*l0Lty7^eojq4`F<)cvJV)o$>oCL~|?oWtd40f z(--b76>VsW@LRN$8M}0v=Hl&K_tq8thOCGNjEiD;`}rB~X~zc{aPh>0KA%hq)W~TR-78p>c@0suWFHvv*QfGqL@~eyl}ism-R7 zPHIondG_8orBA-0Oz-)lk`FnGWp0UV#|VMJoq#sS(QK-BQQJAjl*|Jknbj;CT($T3 z$~bO;>lhf?s^I5qF7WE z&Bgb~jS&Z7XFp!-lXgnex_z3>%lJ@J$iwG?Z=pUuZ0_Pp?o&3O4l<=wyur@! zDz0JqV5G(JnIbskcM~t-lx(S9!YXVO}>v|rSEX2moqV z=4uOsCTB}jt%lAlNP&PRH!&`e*KrDPr}1_jL~zqS<00b0ue~rgF5d@_?PziTWSqm- z*w(L2hNlXF$R$5)?M_EO@K@VW$%rlE;)&{4o{QY8zybfkG{_%Z7gect%N{p+!WDXj zdIQ$;VCFpo9MoDHsdzDSgn&CgBi4jSM{ULS+!bm6EGIr~b7#c4uS0Az1$DYGZdc0u zBnVfhdp?K{g8G(kB+P}_{;kOgv$FT0!x{U+f8V~pxOvs}Q>-1oShbZ3&>P?rxts-` zvgESP`R(bMYg&%2Vf6dlN7c8>>#OLg*3

fBHW@JNyUd?mqm%pL^)>$G_WzQ6kGPapo|V|H)-*-!t}(-scCCx0GUG#}*a+?m*R8m+(Xwf^_+$L-D+Kl(fQ z^T5g3=i*DW{__2gJ?E~U`ocvS>~{Y87|uJMw)>k8yX*y@_~ykQpLJfh%;)5*_^qG*5o_G)=$vbxSc*w@j~*Z$gne3ra1gO1PnZ}YAPd=5#RY&>+u zbMG5WmM}Hw5u1Qd#h)cm=f1)9;ts{yCHVMKIva1tMy2wZ5%0JZdvu2F>H85l==q)A ze@EJZFwH9QERZLi*>cJa@))Ga+B3pgBRl{TW1QL` z<^iAL%K}GPIL|e4yMtTLk5B>6NEbYXezODUsup?kM479RDkc90S1#p`ZN-{YRamI+c={*OPMvyeQt@_9GlLFXjPE!-%qRc0?l}aV?QTY8ps-T> z?NDL8tI|r5;n2^V>m-g%uDcE~WTt};+4M81!oUSMD1PKEDfCin{teTkqANksN53zb zrZ2|H;dT1l=TMX298UvLKK;33OMxeFrlW&AY$;*~1)IChBCM5a_bd)bvD0oq0ah^* z)+14fa`<|Vz`OFwXJYcS;I6+M*!8YBIBkeA)h0h}kLc5+YVU+-BZPq^fo5$$zxcdT^N zT2A@fF0z-d5VLv2d+ci|>LOF^)b57|C7h0O65qAv?CW~AQroIBAX60BmM#o*gm{Xp zrhQI$0jejx27%GjLKMXn64^f?6-P>e^ z>s{0p`ss6@<@{=Nts>53`BWLpVf2rdruB1Kz;aYzeNYiI>jNkm(DG1)tY|T75Kp2I zPlc$Zv?SBfn~vfC(Q=TBvs2;5n~psXKZrkANKsEfywuKc$p+A0z@qnTA10Mnx zB~@m&!Nf4DW?iBN320SsCM6*Seo>6RQgYgS`e=7zGXtyEf#X2si;ULuwDJP1x$XDF z8Pj`$VP+K{XvKMNf~^Z=uzzz@LuB0$wyJ&F=iF#!$(0Nx!SHNwLj2`V_@%JPVIoa|D&>>iq!F$cqIH)2vB(SzPCRGy2GRx*M9F_%CI(&a5 zwHRfgV?p5s7M1BUg;c*0KRaVB)7$Q<)pHJrVT`u&|j<8>u=UWsT zHt9KvSh=60#d|&sR6QJdq4|9{1x(>W6}N(bCi#uj45e0pB#d)(E;cD~y&{Lxok3I)bX$8FGU{h ziYPI)_($wE5^_uRDfrUL*M0EOZqfS%!mED)`xL|eNILcbyad~d3#R}%n8R;>Fq{l- zbd5cpXQxkG2J5=Jfck6ygmX1d==R=4AO$VV6FO!33++$>+2&%ja8egz_y9CEFiMv5 z;=hYcp{-HLN{GDB5v}{K3qna>{1UdRK82lj$G)m65_tgxo3}FQI2HtKtHli`>^jCy zj3-Rj+7H_DPcM$dAqZfWoP!yB4!tBtcH-m`c8bdbFsN_;R@uB4gB<{^Z9WMtM=T%8 z{aSt5j9~-1CZltWd(h&&z~e`=ykM%D53GDJE9rM_F1d;CzF*=7wOKV_zdCXj&dO(>BDW|MFiPw8VYKfcWk$&_#74Z2 zfO>nK)&V&neaiQ&Fmck1=xo^{1g{HIxh>F=U6-J+-W;$Lg5e02CevBbyoL2FpgokJ z0%1N?IUC~gs3W@qJzcUR)*>)Fdg6PikB;44890<_z5sb@(3>`aq;bZ`Js#1ZmtIg5 zIt)o8Wz5~Vyy0-OOi?+~qz=-gkA4s9MN4UJpSM;_9cZI?WYM&9Fw+9q`BMKgB1%II5@bm7`y`c@g#(!*j9sYG==U}deMtTAZ}C|c;5UfE1rT? zhX>U*=UJ-pN94gTEMtd5f4!`#8)UBp^Gqvz+HHA!ieNjuyl~jw{0LrPStdhPJO#Jq z;w)?iYUNbeoKMV`XR)}yvp6gIH4WLq*{s0+!^B+3mYqEXP44jQxM2FTlfx^K31E1r zEsRD5qHL?>`NO81j)Ylq43p8o3z!7rj&RB;2x3T}^}n1Ijq)dZmj-fP~5;Dd|G4A2ot~f_Ps^Vtu?wNT_7s z8G-v!beR?=gRW1&iPE7O$;YO(a2p?OszYW8)GUOk6?gg7IH32DY?#VGs-BKd{r{2|cV4RrXor5*^u zDCS-Ew|Ub@1|$Q>2P+|ZnH{>LQ`c&R0pCm_wS`x#6Qee6ip^I&0(28dg=A| zbD-c>I2OEQ3qOpXs6M*tIdCirAC1_$!Gy^ZSngm7mqctPqVh4VVJk}_cqJnMpJ}!y zzY*IMs^+(9ytGxijT%K=+VT9t{6%BHey48ml7k@v2L92NkO%M45s^sEY5~bV7JGTe zE(qY)VK3F9vk_QWkOk$%)rbv4_PA^2{ui+F6xI;y!UPjVm-Boz-;RNmY%&YWo<2NG z39xEfPR=IlH1yAR<3JR>({bCxEpw(gggfO$lUNX7RQT@SmFI%mzhULu3M_j3J@N5Y zj9*GY%u&mhd^4nEz8dFm98WLDsa0XGKwcjs&=$_w{7I~jcF7Srlmim~-QsdyT!UJ~ zl^zI^R`|c)h344GcO{G@UnvZ3+g!rJ9g$ZIuNV%qtON`7Z?}}v;$r?Z|;r$pG*cE&c;I?SLy%t zWJ9`l^~|}$b%#*s%pS}d3lxDXyy^^NYC~<#&LlCm1Jjo3SUIKttZEyxdOBzO%%mw9 zm%H70)bev3_I#*>gvv>b_~=QL`NbL@2x%#8NB`9gB=*(FDE3#rtWq0O%b62ngv(s> zPKycw_woRo(@_q9>#SAy=6ENLe;MQjhJgeKzDo1&yJR)ozd6oYAD_8%F?w+ zgg?^+ShVA6lI;XuFWt%1={0gq$Iv^(AKz1%6HxX!fKJAY#VVnfConH+v0gsuEc60{_0otg&w?llp zfniFtTI~3q=@9ru{gQgE3Y~<8)`GDT5TkykzK_sLKr@~wYno?TUw20l2StAYcvxXk zIanWAG`do)rGiJ8aD$%Dp3^}#Tg02F0s?DoklHqDzHfFNU`?(o%nPuAS%P?@3@l2y znqdK7?dC8B!vT5P5)NohZqxzY*7@<_)y*YvLXKzFN{0W1_OLuZ}J|5F&)aDVPILu19_+N@zSG5809@`N7=1zUcA&7t%=uc$N- z?7>{RNxj46+2Sw)P3D2O@;DfXix;U+Pt3P#rB0@9WT^ zJ9z38IkpwxAQKbfJiJoV<|$!G(U80@Z?$Y2;KPXXteXO*2!undH-u}ny$l&aLI?^&kutfw(_#C#l@lJd$N9jpM%x8t7y z_8`(OqE2~!_9W0^_r#!LJaj}{dd@Nb5P^KZ2J*vS_rSdi?Z^|P82H*Ozk{WredFYc zHJp~ztEx_P%Elf|9Kk64)?d2WC(>6yl2Cf{>iTTkYD*{-3$J-P-H%lfV%yqz*89>C z4fC>Xew0Cxo5J)Z6d+jGohY2?S2CQ;N!z{$1u}qGfaynAK?c)ow^JjcY}-VjuCmQi|pSsNfzCe#?Wx zX~e06a+yIs$gtwnL8V);|L9s^?+Oy&Nyz4OZ*)@y69>^|22zPy-E!&!)B6^%7atOQ z^8_m;C(3gf5t9`mxdu)9xG}37cMzHJVaqCC#AT&e6)O;9nQW3?guZ)njhspJYOwB zmZ^1PawlKNT$mQGw0b#%dBbCwQO60BM7|2(QW7$BzkUdShC%Jp8Bbiwp;PmE3~+90 zz+-`g#$tjKyc5GT$$J6%=~2oB#}fmA;~`qY_Y`ufNmKKaFbzA4Go2&j zWn}e?Pedxc2`3?w^HJ7X=lS(~&pu#adV|ctwqTkp6?V&0^PcAlnGEHj(EO8_>uMAx z6+4h1MbcOy3=U|OiYA1JH?Kun(3D-@R-DNXR2=Mxr53tLcT`C!PoHx6Q%ds!JWt=~ z_7FN831G2G-~Fq+*)R{hV^JW4fj}rK!I^^B#=v+V16|8+izA#L5@NHG%dD|yUYIfT zI=m1vvf4;5b#DPeK$+#pQUzb5&_iKAHvI~=(U6<@YUc@I(mO`Z9DWhaN1fUTE!v;PL`A30aVhQv$gd=i^ZHb zcG1|_<)-Eis;gujp-@Mvg)P^JI6F9UZKvDB5m-i-u411yF#+ZABuv#85? z3D}0l)Us2TIp+LA%Eg4NFx7x`H><>jJdn9&)(UT$G58qlY&)xj)Jw7N_13@6sOY{0 zYSBN89vH;4Kk$%F(M74~%#gHL@M#i8$ zn$8im!BzP|P!~X&)f>N*CcLj-psDue@ND*W6p=_e<}4Hy&T+m|^@1lbJ=vIITNS1` zbdXmlg1s#;0W!DAX^;MMeXVCdb2+>&?zq}`oh3!|hZU@#J*=pgn-}?8EpL3$F)w<{ z!xtUnN>rIOdwjWl(J}R--ucwOcKOm5wQHBD|K{Z_e8lC^`vx~tL0lgF_S&0s9c!0| zFX5dJc(c)K%K5<-uKAp+OJ8#A*fA#^zvzMEqv_hG1E{qsoO7JK1i(A36X9m~!-K|8No6s!E zHmWRj2C_~USczkp^2de!?$Lz0Bw8~54cYm~B1rm^_s=yK;DPkK7guCrRbs<*k;0MW zv$wODx|BC&P-q30l`YTVT$}lEkl_}McN{is=EiYzTjYoj2$(oVZIJJ$Y@cfvFJEe& zGVKEZ`tALJP{16yLW*Z7?xKHvqT|4)4jpFF%?93lNb>RI5M_8BaU#`+F-!#7x|xc? zJoK8cli`lKW0~(jR-<_yy^Duq63?*enR^FhnL?wAd2~S3AE&R*z(h1{seUO!kZ%=x zzfXZvraPm6ndw$PK3lPsP<^4$zz4A907pd-Qe~WOy%@)3P)5Y05f1ifabuDU&GG%q zObB@gM^OY57k0dPA$d(XSy2u%PPgCHO)gy=BzYR>B!`6!vnsT;I0K6Ts;|;Nzb{Ij zsVM6+Ck~QM;a7{$3ixnC4m61*?8PFGmO}IGFrSnl?*jkSUCL_}0SvXzfePx9v5B~^ zQ%uV_v{pI$#mpQ(z2+7AA4a3S;aO5WMUGKWZCfLw%sabygbd<2o~B4j!ZnL{cvnPP zmT8)YW1JSFhetKC(kio316)wFL$u&&qe2(^bYpmg=lf7Iu5_=_v;-* z{S4n6{PS8+v%HqDh0IzR*498&@>i~Ih&X#U-c1Kjb(y>!JUyBX{8FB|iHE+>-Nh1T{&vd~`D==Xpm z*&?^B_h>CXb_|Ag{ z_`;N++(VhBp}QsrFKh?bqZN>Vy;gL+OdJI{@3ZxG)$R+ zrR?J_n-7y35cgV_&tr2(v>4a)KhU7J4&zxMOO4FXd85Oz7@-h=W-o?dvEW`o4gM-Dlfl2(q4V#YM8g&fmueLcJ|Lx_bv_Q0E ztap;(>hJ2&=&3Aq&QiaqqR}(WM<)@ikL7r9u+v7HTU?sQJOWM8npy0WVbb0q-xyqn z0y`SrQ-(_!r$?rfOY=%JgVW)+F^z-P5Y}5j-H1}qmIT_Z83Mp!Zh$T5MKC#lD$wro zK0>4{U!hg)EReHtv$G&DqI;asKA?8?IT10=4r(SRqVup|J~0I7<`r3Q+0Bk1+A-e< zv#xHwfVf8ewp}M1gmRUHAr+KBCFAv@y#hloV;$kk_3Y4fzC}GcG1E-y;}aKYB-y-8 zJ>Xi!q2z6kA2w)ki=uYe}-Q!J#OhqY~J&%ffCnfI>WX0&_QN*HvUeUah|_v`(7H>yKO6;u;6- z<|goWbhXkq^lgzw$_&HTE3Y57b5>bRo>6?szk~Z?#-(* z8f^*O+F3*hsjK1`bMSEvO%Ec438eMSJ23CQT9w0S=VGAFM~ZgpN1M@04SFM2{`-5f z^$IHp1n)3;hOymeOg|qku#qp&onFs%m>oo@(n>cnNrZtd%|I;M!L&-lhd$)N7x^n#cQk{AV?E=7jJsn&C7 zCT?b~@IxJHb;kX%>u}cPiHAsP}kz4=PH7R^}G- zQ1^&i;4)G#5A#RsLN&pS6=@|+sq37%EGC2V-1K+`(89lN@JsV4c!e$^o}q8gsgEFP z_jiF@&EJJqbB}2J9l}2r8Nrt7?y`9$&-L})jgtrOJF=f%9iI+j(-=B?J3LHWbUQfm zSff(91Uzkh4IqDH^%e$2Md!15>9JM8mzA~)sJy-Wg%VaWx{P0X6uhQqTPI6nbRn04 z*xcxuRY`nT1)$vgT;8b`dUC5X*&1EYaY@|G5&4R?=)XP#`=L6(Ej!X9(poM)DRZ#i z)1mIXO5*~R;d9Ip{iGUBe2BogyrMKPBoF9Z9*fQjlqd%C!>Puh;O=nBV*uW5nG#v;HP zU&+4KnADsdeY8D~gD&U*x~e{qgRYD zx4iVShFHvot^8P><@(1DwuN3zKIF{^tV7{ZU8KY6k9HLiK8wzZ#wI+I2I;!mbGNdY?-o}it=&5MBZEc zbjNhzz?FRSe^$N;cijTo0A0cNdVrr2mAqYGS0|gNp*@5S+>d%LC&3n7$5_Pj`r{y6 z7D*1k6KgVBF==JY2A{h{E!vzQg&eFc_i$^(5?Z3(d8Q3ukc2gJG6FKFyLVuJnmf?W zU(;2^7&s3>X*o!5$!1mwD6w#+Jy&piAHpboI}E7lfU&)vwG-?%Gw=JJ;`O29hH4>p z!6xlYA6AE0rvlwTDhBW3TrUh7YK?xmlq~8*9r!mmC#tiox-B6Y<#CcYD3)#7d3L)E z6=^sbhqFR)1TEm-(Uz)Q@Bet7ER4XYIO?2+yeR+)?J%Xx35d?xCLMzUs2>(YSJX98 zEM)h8Gz8ohr%7Moy>jZ3_!PbyR;=gsId`x}z16z|tdG?BwDB)An3CD>5s1Snazu0V?y`gZPt*TDp%>j$k$md%GR1 z)SLYTWqS9l7Ha&u4vfmQb*5M6cx45qO)As>j)EjL zD$`fvl3;+KvJ3W+ILSJlozoL5m(?yh7iM<407i$_FNmtNeQz*|c#}PZ^fi_&TPB4| zE6;s)>8(uv5DgK=UZzLVkp$3kn~$;gvzg0}9?kCAswkt5OYL<;OgzG?v#j7tC+m8Y z56_snPGb;{={7V{kUcxaINJ0uv|@awUti)C8K81uXM*%L0URE(C4cqn`*IdH&N}uf znQY0ycJlHpACeKYOn)B_*LnGkxNPWBOlt=)q)Y`M+X$-$jEb9hMVvv{E&()XO?Bry zwZxK>N2tHe;CuAR%jj!7juGrUkbXudeVJ~FL2x3*ZCPI47AQj@7ogZ^zmSLA9>h)6 z-Bl|>Uq|l(Gkyv(u6|3Gdg;@AxJXm)vT6v~Ue8jLXkDg9hqi{BUJXBwT_qsngu?^W zI@7yhz216&ljgBl!$+Bj7}a&;qZzq+RC4|Z#S*4h2h=E|_Y0r`)_SF%A1QPjYqjLa z!a8l)$8C-*&SVBGfPJnZ7H{U#`62k16>6Y&W#zByb%drQ!1)61$1i`%#_vTOUz1*ktYDUJvsc-M=3;51cE&(cP>g%=l~4f)p6x*K zz9kcJYz_yBCZ$f#Vj_6Ew>&W{fV{+Ap~^y*MVY%QX)w4e_|3_(wbwxqb#W;{jvy zBf$$NyonzklpH`G>n*Ug+>w=j>yJF%J{$6`$Pi_c!L+dk3gJ_k8Z3$H-pu zG3I#u#_v6T<2S(K#<*GAU55-(i(d8ws6}~{mA?v}=fg^^oYF4;9OAA943u&1;a=~W z=srsyvBxh2XGjtYzu(3dw3n>JHf$U-CRkMHj=BAb)fABc5P6qXEx3gg2es*pjE}c< zk1z5FoUiZPg(i>MdPS98v1#5NkcMG6FaCOt1M9b}IccZe5bbW@O?ah>%# zMUck|P)9^+R(bc^z#noSl%Itk|`3O9@Uq1_Y#CT*gkd^f@@ zz~OrM@YZ@FA22}RQa=#(jn<5&h$C?eHg17Dop7Xi<}xH9SX6`YxxT1Q#Y$|2F!aPP zp2tIWd9u5c&8y?GHeCK8UkO{2&qS#KjdMhu*+IG5$db8iuf+gihjf*i=tgrDU5jVz zP=-5dsLx_`ZWB2XZ1FL5c@-iB8#|(`m9hhdY9rmdeVUdQ8E0p3T9mYVJ zo@-^iJP1Sxx5pghFkkF)vnUvli|oier8mLhscXPWAxl>*7yhw;vD(X(IP@xPdM<|r z{)D4~3f>y$03HwLFG-wd^rfV)lnh!HRJ9k$@|ogia?I1wY*l<}=~{f?+@3|PWMDt>4TCp>cx&EO7o z;di83z&ddv3n4e?!IAJSJaI6=?gz%jEra4(N*SYvJIf#E&At~6qo`bPjL|p)q5B~7 z=r+D-hS3lUBe5^3Sw@q^Of~)l?}e>W6ceuLG2`Z%UR7O=G8FpZ5`5r9xL841tY~0^ z^{pZk-{mn}cAz9gh1Egisv6<%0#9Ga8pAMwM-iSgP&9*MIGv)a$4-EoVj+)N;$U6f z_g2uoeUx?HP7^EP@(t@#eB#craHJBh;x3ffE0GN*4E~BCR?SEwc#&iiQY*kAWPGc> z{%YLCVZ1QTo|w%3l@~GN45>=~mjoaNgC@cz2O^AYC*=^B7}n=&QgAeNPFQDy5!ShK zw$7D9*Ah4xz)$t9syrbOhOjd--9zaUE$D;pv8rQt>CRd_FR}7O!V0(BH+MMDc#q6> zft!rezM4~Pw@7t|mr-JnZjnz#_#{9tH4F?y6WehQgYoXgH zU0zhg713B1(URWOoa%za=tCUS>P=_`bY4fQGnywXao3wzA|;29utK>fpiQ(0=Mz3E zJ{g^dSbDoeg7gV2Vx^xrKdXGiB*Px(dbe+%q8n_mxnDPU@*v$9wHwsA?*Lad1BAB3 z(Fd<=u7j|v=%AIYVvw?Vz8R9lY~_1^NP_4dOq%Gm6ddPqt_n54XKTSnNi{5azGxyj z=!ix1#HwA5q}^J?-%&Q=scBWFl*y>7Dii0I#hGQZi-aIxq4HhKDc{Ac^35BRZ+3}R zASyo38uK>#ff&I%$+O@qFUyUR0W9P#ho9wDu?63FYa^8s0yUz$noIM6@eEPn8L}`b z9mXmibT?oMa`;4TqH3|~t7w2batq{$k>Enmkhqbbu;H*M+ozIiO8rI>q3TUL!QA zz?rAhp+xeCn`5elu4>R7H;gfO|0QrU>;l~^`g$CJM^bCL88Et|c{zM=?1tiq*|*15 z+0OE!385fZ*;0B$6s>OqGSr}CZcaWH@&J8{T4Od3>g8J}JjHz;c!@US$kq3@HltjeU}+oqGs>>;J+&9;@v{rtXK z_9ubv1^Pwi$HN|l69TIUTw#cvdV1>>3OWe6-hq*tRAM_*d z8sG$6)NRuXBO(@4GiZQhp4a_1PlS7xARPIjbG^=Fhe>s%6!FFX;~UFF%`yGC+;ximf|OH4)FgBY}XI2whtw23y{k_2F4V zT&a>4fUCI3f|-w2`bh*FQ8$v?|zU;h$wY{tz8b?G~ns zutIpmyEn(nH$Rv3_Og_)JBZqIX`6sl!dAK0DOg2q-k@e-Xf_MuSJ)nMlH2ki1Y1^0)Xf!e=G}5~H zH3%|=)IuwRIA{;5J(l;5A zUQ_D1Yb-ORd5yZzJYHwcKkCHlUk^4z$ISIuG%Larxd1%emOBBe0UNv5 zoap6WHlLSRE8=UJe>0K`h#$O3ec06x(b z>!~Zje_SQDs^W)CO=3i=K7AN-hBYK+Q0YSY-9nvQBmh%h{le$HYJod{fjOX3#mqz_ za7bSTSZ7$Qfnc6#!sko)+~S-9A*xJO&K}PU!<(!>`|pGWDQ4CvdB>}9&2IMfS7(a4 zOCnt!Z7xFlvvLkYGa81TEl9ymd~sOLdAC*XWOg&KLOdpVem)i?c;}(S?%K!9#oRl# zzlgdR@iX~g;$$E)QCE*&u^s497ON}O(-=h5#4uPtf(QjP*yy)Muv1t>3(p2NLywvl ztpE+9XD3Mhi0tL1{C9!}ACV zTOF(+;}%;-7!>d){R?Gmi#CXKb+0t>(>&;7S|{j(z6op6G7z9(l%(ri zCQt;R5z=ih^6i2$L1Seqw@kRi7Znx^A4Xavk5J?bHtOo1GHBSnp7`3^+f$WnE{>|k zBgC?OaBKBo>Ep8a-`>amwPBX&_OJi-8}(l^JxhNxTJ8$*u=JCg)}M7L$Dq}Be=*zE zz4oYl+Vv*@(5)g#Kg+D_yZ5lS3$bD{g`VpwTvDO}-Tnj2~$ z%T(Hm)rxF$(MJRTQAPv^vptQ9a4~Q72r=!GD@ajOfF?v1Q)EbUAwbqca}#V_QI4!f zBCyQ4RR#b(n4k%AJt`-3$80(fXt(=@5fZ#2;a18umyzpSxovEp zn}ww`rWh=AeU<>|Lvv~Nv}5{{AO$FBN)}jWqj#u8rnKmYs_CjL1RMefoxB;3UeJ}{DNCa=Qvvx$D!hYXzzo%%#&U?_TDTyDK!~z# z+m?derp;D9`l&~dVPS*1I85j1ccew+VX!c|zpRhDBtQ@e1H@j~1o{+WIU<8&T-ubq z!Bk4E$3RyS$=0ejxM`#%%fRS`cH1YL^<|=(qD^KA=@AJEx#J78>v&}9LTKHXG5Acr zt31oVwB;tFgX^`+Zx@k)3ml_YU3%AQjvU2X4d)cf;#c|(B@G0NPtZT9BGkk9v=0x? z9sU?6L8E&lcmxn$mMEf`uxL)7{BX8tm~6GQqb&=jL-))F+y-cxM3q&fa6LI}S6OvB z074Gb(R>4Qbisfa1{KDlr*n#dFifx++bO~6bzo`oVU325LaF!2S*I<)2dL1C>U&YL ziUp1`q864V=HYFlT!l|%ifISw7^t$Ndro^c1bbZl9v)%RkMz&mX@pr?k2Y^&Tfv5q z2p1fK0D)4TU9w+rg0>)^J!lt@1jCgN5P^ZmMFSI}FYq7YDnUs4A1Z)I>+bVb({8a* z9>rG0z4!W8G0!U34uOCoh@LZA#B9T%|RyX#$wHCWn*Zs)Ng2NZ;uNgPi+>d0Z);beNM z3)zn#WW1?Mu@C_M%Mg%WcFtj0SL$PGTMxC`#RyJ-#uWto>>@R}ouJMQi5L&mU<-jf zsz&u7N)KZKml3<7R2%Dtzr&BdK zL}!2?t*;MbbV37&fz?N7nv%>~&cgJY|7!-ERfAZ~bK;WDbSy2{5y)q}-iZR|@*=&}H)b^*_VYBANiGmtu`QT9!R z8VWZd@fpt$v^ewY4@FMVl87!R7?E4@+^5`e`uU-Bg1p&TxFT3@C6zNCPCtj}2H5os zk9vVT4n@IJp>`3PWlQA?%i|drf#zn%GO&|Qus%ZSs`j?37vEN;IFpjCO;(eKWt?=( z9;Kr)FlJm#A8#<&dIKbf&#zPx7??GAe)Z$2`ZCpu`Y^23`o}?LQsPlP3E;N&O;D(i z6w1_sM1WP*tDHS%?%4uYNhu1Ty%|-RM zuykn|3k7;9S1;$$eF5XYOzro~M!E>X74AHPv8|?#g^cPkAR=QBh}yyLWbR;{RR~U@ ze}f0Mbib4v*})4I)?Kadq&ssyHtd_DVc%~>2WP&wDn7#PBGeU%XypGqSrhfKRj zyH(s12iHNuU?s_|u9FF!&VH1T_h_yO9%JR-hQmiT!^zX1&X}F5*yV;`u8!l_948f)7A16hq=0AJ0-AXu~fb z1(WBhh5_?LXDna?W-KMN`lE2s`5Eq1NtlV}1Uzz_g6VFYaPldw>>G zS45Ln1L~|$ERKoOVLP@0s$Bhcj$C{@+G_n$^N3FXVOC6-(Jg)Dt$e$es!_7*T9J2; zG)$H3BMo!z_+tE|SI@R!~L$ZT$$`2;VBLi2Mj5PtQcLh(Ye$`qG z-ZgckexQp-W-zU4q^XUHkq{hp$zgIz2tH`|{cNKl{TLxa)!EKe$|3}&Q5>3NZis!n zZQbsnXg~FDiGme5*^;f=4|s|vfr9*;T)*kMmK?5Qp>Fp(PN zV=yfI%bI=6s$@xG%ysGZXsrnb>E>pv$npY}I;1xj^%3ei9L}-Pgd+P_XOP(= z3{xbjI};G8Do1LL*eW^7J84(ULslP7m{4A{GIZ~e8mWWmfB15J>=p)m-T{S?`cci@ zu-t?+i#l^+f2v8%%MCD|&C1K|3Dsm|<*laF3sW5&T*0Jd(NUV;vVwZ7^XK9fyr;fn zFIj=i$U4HXWJqJ>YBW!W28+SavLil>&shHYKA>2kg&hx5pE!~4x;FFjV0|i5pJJ6^ zes!S>gd68wMSWU16JMVwzPpkU!^wu{D9m8fqIuzxFE@nWStW41+}K^5Im2V{ZKeUo zqTSq&>r@FDmwjB5Yk7IM`XtYXY?t4B`T@6dI)bV1R->9cB;w zbw!8uo2-1f0Y{zsv!K1U59^A~Pk06mA9`lYsbL3_^PxGK{1q7HgTf5O^yny_aG}03 zGZV?agB7JF+U4I+HEv9k0e9+!U|tckMh8H%#3=0Opk-H4b9&5D3mIefUey^YZ|aDI z!ku~tLt)AS4h$hIgPU^`9RR6ghv#WTTt>#gs9gU*htARj=3&c6tK2V$m$5z-74;;L zR$j+V*Jjfx?m!8g)KuCw)yayY$U$uu=KOr6pL4}Ggy-o!a7Q<>Ze>UHfOi6qX z4G!H8WF%2LvkRdm^)B#aR5Kn!0bHQK%cJgg{i~2GZCSKS1n?Sm-~Z^o`%ZPJ^ptLn zmdA&aJXB$p!O`YfvEmdm9Qy8V3`VRfJz73OKe7{5<=tn*X8T}b@D}NkuAWI;3zd#G zd5@Xa&)7r(31iX(MVn*!!RRTnxOKbNDaIj)JscuncC?T#tKt|7W~-B&&hdi+iMBn| zwbgm(t?G4xCU>DvcQkLz7J_oN4lFFd?vk}2*M0?VlBEbNumYx}>K0;arj29DLw#)p z=;3MtLTYcV@~ye{e~4MsfE0g-N+-Pb#L)!5b^VD^;F54xvF!{Ki*poEN}8-1Nvzct0IKC$~ zC1mv_UlU8>Rcv^L>W7B{e30W=TEw53$zi1X)n)lapqdWx;VhB-OJcbUx3#|)=LKUN8V6x! zroj^p%Y0|$^`JuZWG4eEHu5jh_wk4kQ^#c-5B1(6VuL2z)P<>ZRr&;Dw1o?T@ng-q zAXn#ngZ3NNlL{V4X&WLBRf(HB4eH>F5+12R$0bj1Y@VVlT<;~1uoHSUh9u@eujV=S zL$99PP+a3L?{~%TQP>KU2g|k`ncd){D=2%D&j_XD9Mi>|L=<=RPPjVo#O_d{eYq3K zaR4Sk1Fw!fTnm$V*q5L3fv zp**q{pS$Y;H}1WOQ1m<2-)e4n6X5MnHD5)r0Y=U#1M(xQcP#)=(S`DgHt`<~N<4A0 zHE)I|F?g8GtUOKWh~X11fUN%95sZH(#t+M%Ep;}dMY$E#qwEXl&}9cul*3LK0YxP> zmZpfHX{Ur|2n&qZ5Eu&t#{#}hMl&76+Y-htwPB_{mmgsAY_zdkUgiYAr^+K84kAiw zw($kkf;hbbcPx&E*+Gee^`iQw-RN1n=>*s^7$>AOMmOk|&(VokBL}PT71ZI(V72j7 z!&+CIk6pt9()7_)#>_sHG%*ubj?Ikhr z@{KSO>J5Pw1{iWlPu}UrXkVcQ)Oe{3T%j;iRepOk5iv6xUOn-S|1fgVWJ2ij!B}e} z9ByHR+OVrO*>%}q`j9O1ToT&DD?C=N!)KvbL_E%0C0xK6kqem&mKUo~S`~fvE`Io@III8pAylxY&PeB=_az))^LpX4#=lzs&O>gP z%>;*E+zK2>sto|@)A}0Iv^u5Rn7~qFc)`Ldo(ED6San1G4yLj0+hi7^pHrRLy2254 zcogI$QHo5kBqA|4jm@mHo#S3?pLlGAxE2f#h++49#(cI@5c$R70|!JEldE$U zsM2RSGGRfO&*I6#a75^J)!r1JN2{r3#k-jYhOsCdCF2mrcwjWSe0b{cnR=EE%S$A~ zxL;rAB-~nWujgi`Vuc#zRi6sf9`iKUE#84F&3e-OF7kpkOyC{LYwFyrJ1I2mxfV=m zv~RsahuY{yc>#u!l0+WVEx!m;>y|f+GJ?>U8N~YFO2^JlDGLn=cU&QnVGXp0`43JZ z6fp3R`&1BbS?mI?)#$b5FA+}UOXp^+zBQqZ26XCrDE~>4@Fl#`E-5DqInSuo%KBK} zqGn2r0bCGM7*nbtHfG1wV`?P-gF0Y4l7j~zB2Tz>jMF_golz_;HLx@du*21QCJG7$b(jqURxtcQvB{{Yy9LhC-EtBXG0O3{>I_eXFfW}^cyL^FxhB5i=or>H zS)~L6<9k?>KDnT0tZ{jh4qc2hNd;ggu~IyKk`x2*XMEYr)^sA&S&`F-a@=ymxssXf zL{VMK6keE?0_*F40(9s|R=@q0(ee*qhj0uCgt0CoV9H;nq`X|)V3H^j<{uxkFEwwM ziK?;R67duoNK!-TQjjTBgWX#Gk#07GB;qYM;KNz{L|#7Ku8h_f@Dy00@8GNeR(#A^ zB)Ak-qecxp&_KPMwZ~rg;|F*_js<{M;w!_+0k_uWkAy}so!W-sRUfrwn+d-r>z5x! zxsBV(Be8(YUO%6id)|hFW3H99Q9bJIy2L@(@`Iyjwe`Z%`N8z57{LXqj|R&;A2_hS z6TvBgwB>auF^um$>Y3K8u1vx%`f=`m_z__sM*{2LiGlA1*)a|D*?_nwqL}Gui43_+ z;H>k9cPCia+T?3t?#9G517d=0f$mI|0|3&~&;_i^pw~GJ@!F>|Aonz2c}G7drgTsv@GO1q7(h0 zQlZE{Jv3Pj1?VC{3}P|g-I}u)phRRiuvO^-a9R1)3BeZ2w|BQtND0VOC1YX5^cFTz zFRqqhgvgk~61vir#~)vaE33Yes*e=yS&A)BF^xAcXoI%86~r^lv*%FXh~$2YyFr+m zoBSo1^ay56RQC?wxaDpk8X;9PkO zXON@Kf@s1wBq*VFB-pCdWmgv)2cgqW(z^vUixd*TYV!G$MmjLS4p31Y3lkCbin>+q z)Lw@x=mNWe*s1ao*XZM>eDCn$Ah9f-h2x{K5VMFH8-bss;s-U@*JEbr&uU~OL?!f= zl^1gWsep%Lb`TMfUpH*Q@Vj>03xr@Jq6Tj|of%uv1g>|>j}y*%dVdnGK0Xu)|9}75 zD^_5)O&z>w<>-Q?;}g}xS1dg!dq{uqu<5Zis}JmqEN!>CtMK#c4Z}i}zo? zG@0->!_AVl&5#M0VaV%%=y<*BycTE0;<>r<1sh1w3eKre#!tJ)E~2sWS2+YG=z~pm zh}i}&!>@K9_)-x)%*f4b!rxn&IZ{Z+2J@wxWJnJ@Pe0CddcA3&tX_5NU3O@WYe!p7=S}v$oRjbm~pRc&IpXr49VAKR8b&z*B?$3@|@oI0+zay*P z@C{;`6XFd4!{hQ$sBO%bMpD$7227tm2^VYyLzHF#5`dWl2t^=UMabwrU;){i3V`4t z*`I}4WSZDNOH(uNJ0byC3V3g)*BoHs;DG~PeQc|Yrdw<&XCl&0j(SfzTZ&PNAuVSj z?fk{-9Lmrk*+bdTLLFqM5TvJ5RhnYKfp3V)!2stss;4o%{4vi6xNRVNnrsCKLvsZ* zfkIkgH+uL3L3upVK$<2Jup7SKd-(hj_L;g(ryb7Z3GWF8F`QHcz$O@JnpdVW`_mPJ zRfo5(q|Ma@`I(SVt7x7_WpC9GpQ(i2*oz+|gnJkRiD8>@eQ^YG5t z!=K*L+$F+EVQQjB>+vhP2K@XvO%>(c9ohs)?0>I`BgX%#pvM(hld`Dc1lpf}DO@%b zPvfVBYqSw#bDV)5;?c|PcgPN8#>V1)X#J*eRl{?^>w+mjzUhp=Z?v!cuf-|Uu2|Qg zGYZU3{TLpu1*GCO&tgsDt6ahG<9!@z8JD4;M2N*a)r8TUK-HcWY4^u^4}}pVfXa;4 z7f+RjeJEEWEZ{*n)L`}#(7M7fgh9!&;3pq#?;P?dN<}oP)85QDhhE2E`x!In7fj+u z+Yl>tWg)9KMiWY0)X1g?B# zT?Byx&*DkJ_0Ii~^A6jCNe6qu@*k@|I$jRA<`m}P7NpR5!o2IO$7mQ#?=0Fo6hRjfE_j& z>8UVm4xo?X%UR=2s*&-;ThMEsZLLSQ^EW(nzxXnsY1l`|2tg`TY1l%Mg`&GFsfVPwddnaTa$)PbY0?}s_N%t|xs z6hHmtXE@=jC>z-UMhylzOC2}W6?6LC{f+&iqwj!FR46&NHFbNX-JV=g;r%KDqlrLt4J*-c1SuyrtkpSE@E7o z_#jJldvRs5AhVtek^J|4ADThZ&`s(aUtOI0)v^a|b<^qP`$qbVBLvXHHf6_GtH4#T z@_05@X4S)ZtrijGtY*IlttNe6UNzp7y=vUDrb|l{1dq6<6})H2R2w6LfkLGI_k=-4 zn9K&sNeDi}I=)V8;}4pfT>*w-r&TXWK2*t5AK+ZoGCjO>OF?7(4Mm){iVf1-(~-Sk zFNTF8scSam{XlYC*i^7t7$&!PibGy%&=V+i&Yd}if5zm zruE5|Bs0aSR}5Km4cLLJdh9jN21`P**oq|4=QcrUcz-r9gw(6pJ9IGL=pr31YltDZ z$sgWt(SUw5{6z&{f~732fv#9ME@>R@`UyMO=u()uP5h+_3Dx1-z!XV)XSp3?wd7jd zRdK>L*+GoQOY66_{UuC=ew*)eyhbCuCTBQNp5{7rpEv3P`oKL<%7o$oysvU!Jqg9W z?r$w08Sx^WdevNEWHA&$>J8e1BmrkxEddy=Y(ZUI;J4J!Wd3(J^+JlEIfq@yF+ z^e3~j2q^0)C_fM4fm5ofb@*nA!;;ymc;Ul?) z3hg934^s>f)BsbTMkF?eeg=%x)hI?km(@t%$w^~fhBhDfF+V`i( zZBY4cCLGrBkQMzEVg156i)KzxL9mj-)_s%Q%@2|S8PStQQIZF9x5gY5D?C|+d@{;F zu#*+ZT4P#q54-{MzEQLH=P1T(OJDr>Y*y_r>kkwet(!{uoJvn+i8Ru6${=czWd31S~6qY~H3Vd4yO zWqtY!>(SUP#}wy$C0VPR!8YXJ`)Cbt8)byv*afISCu3*1ogp^e=^bn9jDzDlZbZO; z)(w2Q(G7I`wA@Y~%^V2-Z&7O~?RY$cxzSO374B0SH%4UNf@^h>=5sz#c{}v16*y*o z84z)uwlsy9emD}_QqjD{Gw7Vl+fm7Nz#5X6yl`4NBndwpMqLVv%zO_(3(1`Epd7l z<7QEgk#?=~$g#R6f$FBv5s!K7o%6+{xmk zUgl|vjw7A)ZtxBSFA&q3!(J!v{+z&4f67cco2R#$#Tfb>URC^`ES^b zHKZ6SpkFX9VqM~^xp&|_nG1&aKA-gklEZ0Xj-vTIs;7=~wGGtLxZXfRS<}hHqJjcj z^=IaHXP=IKV)zDy8=m&e;K2`IzWeq-9hrt=@`1-AtHQVw23COpNH0d{y1!74CEd9R zKr9`t$bgNAEDalZGw*+uKFefq`5~=1`R%Q0al85KM1NtQS#0w$fP{a6wMAT;1vR7tWJc z02|>_6~=0)Kcd-QTfTzjjV0BhE+m)`hV695rb)AlWjTGPAOTrhyi+d%9OEQESO`HL z5aiKcOe<}ci)i5hzVdXVz~~dWNoq^IzzCHCY?k-4TFvb1$wsRIMcWm*@I%tsLoTm& zYS)9U|Kw5$J{W-$|BWgr|LJcKs#Jxq64g704Ab zNg;?1@u_BQZQi^!T~lAN*RzTq`enT`Iuq@xTqZ(G?UD^9+Pl*BJ}P*x9JZIUvCB;r z4+en;ZHBzaj2YmBhQmw`WwDdJNA;D@>T@q{cEM0D785L2wEN%e{&h|FciH{d+WlR2 zzZ;4%&4LL%sC@gPlmU3UVvHoy+hGf>%RE8)npKz2kMs@j=V% z`u!~&(dmi{oSO`K|hzpXGQL`dDU-Zr9#2iHorQ!H>ZQn#}5hRhrVj@G+eKn z)Ykq~i^x&>40{_3@aS-G5vAX%W97q`PUe>%3~!PWiLEWoJbu7^Z^Jqz*ajhAJ_&Y| zv{Vp5YQQthk1wa0ZI#E8MPK|o5D~%l(Q8>0PzWPh#Zfysys{uanJgN-sB;jdMS6z8 z_#Ac-4Gun!8ct)sPfG+Ay8UjPHdF;#*>YePEpvs#HvBKZ^`ouHspLT!MAi}PSwBgw z%Vj%U@{F(?{N&PRM)N;Ng%Sk|VoOyF0?1BTegK}1kNSLrp5A_XI2m)05;dCm0`csvm;xpU8^{#-s|2Ben%N-ho#J!UT&l1b>mepw_Xz z@(O(l^1QHN^>}sB(&{VD*P=TQZvP$oPA~{W82Xibo}R_1iC=STI<{6)%7T5NjM0W` z1pkFT*6i`r4xS};x3MO~gECMgr3`+c3~eOeat&F4DtLyZOMnbfv^MJS0@<7m3&sb~aAww5r?xMPrb-LF-BtG)&6~6}JA?=fJB9Dw0YiVO9*iHUb#6 zFLfx@!ajIvNuR@ba9}6rYn)OCug&@y^3p^ob@ky80K|2|ma*L8f-v^0Uw^s&YNJcVf_!F|8^{saFO)^E8Te|%z&*=7zeQxDkc+7C*&`5 z60eMg_R)1*9?(KZxs@)DdTQ2ONh%;dX|tuO(b^HP^T&8jw(oPZM%sk-i%nr71JIgp8- zpH1*qpk>)7tr?j>z1I6dm;R9bRp4ZNKH(y7UTowt7Zp%} zxol`ST&M0*3c4Az4$B9u>$sqzK;KY28@l=0ZD0iQ106k(8XToGNXW5P0>X#fj?IIE~%jVF*m)^tOd2O+c2u*DV+ndS@K?S<${@7 zPecf3G17Y1lwk1R+%~$bAX@A8Te9E|^{&bK&b^s$4`9_Dl`gF#Avv9_2|u)v)^L3r zdDkLa+hDx@$?hgTY3I3lQn|bAGlk3AtvhiRoD>mk*7lNk=vIkW`*DS0maJai}&js z!4ot3nmR^7e7k9BBYe1d@Tur<)qZr*EitvPEg?|!GVkVBWikQo9fAgvfMifg${gY3< z8UIMB#*1;8lXDMN3aa z*0d*E9)gtiUK*gdy}sv`OUMN*?dDW)U8(?DYCC3xwF}mqs&$GxrFHXiwC0=AniD$M z^QfyuwSq-+Q8{P3Q4cke-H`!h{5;u2lAMX_Ovd*6)~@cBggwB&4fe$HTMtk$Q@G@Q zVx$)^B!-fTd5G3n{?OgtP@LQXx47H*i|*TU78GXZ(F#z|;>1$A&hWGP3!m_4%(Un# z^@0>J5?zDC!#Q=Drs6b5CFrl@9E6PwgoI?yM_KvG5t7oBZ)~~LNuSGeg^!KcNxYXf z2Mp(i**$_$2FfyoAbS<)M^yA&fdxti3oTFNg7?kA?jGmzgBGFHe#UL<>6YW`>|=xWbNFpPH^obKQ)#SQmLb z9IN{j1JeAs8X?QKHK1ap8X{Ght^symQv+9WY|Qe&elk!K$Yh;8<{9w1xu5-?Ztmv} zmhL`4^_v~aZ1#$`cn#VlKvFF8;F$^Ixq2E1No&y|YQ_vXE+(H~zG^TYr+J+g(V7CbwJ-~X zsq!s}d}sJyeunX#Aa(fx>K<`SBOz}b2Xof_Z&?gm&dit)!fS~2toS?AK6O*}bmDgS zjtVytoENgh%<(9X?C3&iS;g;NzlCthSE3B^sLIx6ZvaS7=Co6^ts9HTsbaiK$@-sk z@>DTjTzD#zflAn^f0S?cu)aSnt~_f#v-3fU&=ZQ^+` z2q?4sY^V=w%Y*o`K%z#Qs}L!vZ14vc5NURr2~c*11VZuvaiD35@Zd(|KAVu-6$?H< zo6tXd6$6Fj1z@>Q$|G|V%%prBUZL_;=mxTdgZwGWgPce5BC#t+24wa8w9B{fWf8P7 z>>C}-1~3GA6gIU?&tbuX7Umg=dsc(X)P`b5sdz;>H==;iKB83^-m|*hnTEk~bO(&u z4p2>e1jB=XE&9}je8wv3vH{`%Sa2LEL!=K!5AvsQMfUvsNfDpgs^9-%*m1)$`E)(6 z`EoglTeg*WL9Gs9P<{xG+9nh=#6CR)$UJ=y@R96*2E$uj9E&zxr=`^LPZ9_~s%vOL zxi1&v50{0&VN~6#a*!!8x-=RpVT+v&l%H|qqfxIl1UHln4wWJG`VL){_VgEW()Woj z@4I4>aa42tqpLKSLj*+c;VvMhjmK_5WCt|kLDA@w@j-@={DmK>YGUQ4jOV{f8P9X1 z6$Kj!mvw(^my3-wpVd3AlQBF2rhau?g&^`eW`zdoYp!eipQEBxyeXVBU=%=oSv)+> z2OqlD_f_Vx-dw9{BDwF`)%HK$(AzdkaCd$@VO_)qG+ zmwNfn7K>DGy<=VnxK16YA_9oXYIP3}MhhY&?-zYZK4c>Y2TYYB0Z6Y0n%B4Mz3F`Q zPS(9uPzCNLp^1W>@Ed%IbEbms)`ka|@7E@s&kt4;2_Rl24HRA(JS()4wUrywlXMT8 zNA9(zK`EgD;S*0SkIifL1p`>IZEeMPV;XqrJF3qe>DmTUVo--+qncHxJ7tj^x;P7C?3nH{=48`MyWE+FJr_d(P4kpO zF4tJ3{JUODBwoP0zIMm#?Qa9+M9 z%>S{?h#HvN7|A$lRSoFn8MWJ^yycKalV(wErzU_H{bKYK9*z;GU$svn92)&`wAe@v z9y*P40SCBVsa0Bq0t0=-of7=RWRb#V{~61YXbx8!wcq!5WMycdgox$-B+zPwBDp3m zne&)d40<)OiJP|@iaRsIsYAi)oE<4iKh8QY_@Wv)cEuIt38ASl;{;IXpx;>O7><3u z^68Fw6&w|lB@fAX24ix%S1laD7O^Y*=aNmEgY0@Fbz}o`CoC5jSK2b{SokRJF}AN3 zqKu;GR&EfWB#oGy)&k44puDIZ>iuH3E9 z?a|Fq4w+?2nYR@HmhyI@GDWGB%XpaN60LQstN)kY-YUPE_t`8y!3?7rvnz_kx1AVq zSMPtf4+#(>AS9`!bs{*(J`e(Ai8D2Yya%?9ZYMY%Zx;Dm0>mk`{MPzY1u>XRg_)`7 z+61|h(d6)J)|bJfQ6m`*H~5G*z;d|;7^)If`{M0UK;Hyg*W>ze%@zCfGcXMMn7}>`p+%EKz^@Ao=3=g(S2;_y>+O@`O@{~gU zeiaQyH(hb#C*OPNzukQ0-Ek_DeHf2E-2LER)K~oQ<=?Tp&FEjL3(h+XCDP}%AkSqzGSwbSZI`Ib1b=^~TnQQ?VC zimp&9VcD+iDY!dNj7ha$^-sUS5X!4Dt|qA>dLA9FFZfYW$smy|4%3qE}j##=QP{2Tx8ZZR91R2$1sm{5H0(O?m*7&I>Oc#fhXsB-dNN3YWW~>xey(2T$2#wxzFBc99zI$kSFH01gPLCa| zp8R@LuAdul2iTw&*Jy}@AuKVF1c)LwNe>>G$42UrI$*JuA>RTs7Yt51=Z&pn51gwc zgsGTqoBHO)6;3yi>9%YWQwVF|5I{XPtF(2~oS&a}~D&p7od&F(tJkob7M8HqWm%OwMoq-LsP!}72- z6078T2*INDsH_}!n9m(|$O1)k);MoC?hr-fNYF7#Z~R{?&1R1fo(WsAl2rj7XX}X5 zDnmnF-7r`Ch#&>7xL&W4m3z^^_VyAf96zbj7XvylNPzO3QTSi58N0dY`=k!S^I?@?v? zIFBNuwHqh5CglbeXzjVmP5Md}n+$hUR-U2&r4I2!PpFb9P%x38=>;S)K(<2GDiCwj z7t2E|@kY)_x)@lcP(liUGU8-1Dd9CgH_jqy3{@+T!P!TDQ0%j$u?iCJl4)|}^t!0g zKdPc0Gq*ymgluCE)~B+?w*KwgyXEWhV@ z;rQj^<1kj!rnKu{ieHAc;ZFLNoO$w^u4F+TfNd(+?W0R)y|r*OtaSo(5Rcx7X&~W#CH4VC_{(V1S@C zT{6;r^~dw#fRu%0W@0YCG#6=YW57_ z2jB0+Dn7Z{9vCp!}d!F9k1K z_0jR&J}vQdKb`%T8l61+fa36LJE1#%@gdnN?E_9(r$Itfe?xNkm@I$eo3xwceRm0F zcHc%~Nh-8FTXkGxzb6XGgBdRZVAq@w7rp7 z=Jperh!&b4Hqv?TDPmca*b41mX1du1i4Z}1!ep#Qf589w_kSSp zzXk!Y@O$Ii1_w;tRKQwV?M|mNGBP?gKGE$>PW2X)3l}Y(UUGi%I`)>nwm7$V4KX=q z7q2c}1@nAm@rvT*1mv7iysUU>F;m=^|1R(SHvdij>-<;wFY|lzU*tc}f0o~q|1|$e z{^NXa-uqGh!~Fc>2l+V|AK%aK%D^4s&<@*m~B@8sXkzm@OFZ_U4% zeXcoUY&n5|8oA3{KNT&@(<=8$gj$; z%-_#npS>@?g8z2r@6F$nU*6nZkzbZyn!h{0B)>R+SN_iY9r=#@?fF0EZ_6*r-45RJ%3aF#{3QW>rtUE$j{GTm!HSK*XHNuugTBJ&(2?+zbZc~e`WrP{N?$X`5F1k z_WAeHd?r8rw3nRv4}br6FMjd=Jmp0{%1`FM7oN2J1<(K6=bdPe-be4YZT)io|D5nQ z|AW7O{ak?god5n;zIyhv{_p?xmtSPefAQyk_RQm-@r0sMMlo_JJ~tg|0mrvw)iI!P#Em5uQX^(9 zEdut`6q8$L#CSW_=L|O)sqy~A;U>I~2O54DI1Fmut_f~WK*2+sLj4O@t69{eKmTd@ zRFZ*pLU1u0x@UYu42R}#)-E?5kXLjy_MWm3VGw5M-8}~%18Ey#o&X0VXwhXySG=NM zq>YT7m~Mtfo5L8;FGo$&s46PFbig)l!x%{5c@Mgr|5VI?vg@8{!Hz>h>ldY9$RW7= zo=HNBx-CbRQU1lvQZX~y9HQ9qxPr0za9ZF&Zb@(IRWBVNVF#^~npn`w zSYc1~&ba<4Mp!X!MDc2ZuIssu&(Q_wh?ipwkhq>XP_b-+pe8c{J3(-oZ5zabp;bhT zHYX$1=bas4)hYF$w!*Q1p13FEvv=#$j}aT(F$jMQSR#GwW73_GeLgkxi&lyVUG8yB zE!fjOQ)7IlU0=mG(%aPIG-1rv1F)DNUAD!N7;@&#a{W)>36_@VM z_MW@3ZSjadYXw-)67l?AmtXJnUTv}RH>15*aZyM+WslQ}xtzusij~@XrFQ{k+2Ll# z@d`hRBK)xdNQchf)akw4H?{%Pe9E)v zG6yxV=5b#japuu!Gw>Z^(A?cJDwfgPb<}*vqo{eER)=+hW_y@&b6XMS)Y)488oU0$ zP1RYKBDW5_)F3#3a$p1o%oI<91rZg#)g{b5D`Nz?f%C*p0j!a2eGt;)-0EwMb%YpZ zG;l|Zg{*h|EMlm@Y1*P3g^_BG3Tyd#NV^_a?~m%ox7A<$6$T^_l2FDe3+?=Ws!zkC z#lm!S#a{L9!x$N@cgGkt@ppIdZt{D5Cw04SD3q*y5TPRwLX2J~(!H;V&0m^32C@+K zI`jJ2_XV*yjWBK=6A$ZIQVJT6>LjH-SG&@uvD>*7Ku=sg#qde0fZDk&+BhLQG>BNB zr&rR`J4nh)^?J*|O2N2}&gsC*BOAp{*%sqy#_NmFNRW9+pi%`c5Ca!)&5TlGa^kJR z1*3;j;1fTfAZ+R=*0u*WkYRKU?jgo$zE>Pl;N zZdnVXv+;g7-Q+A0?lA&fw4iGJ+wT#0Q}1ASEP>ja6hak}58D)`7h-RWo;L%tL%0z$ zhUr>hRMyO8O27xlp?klIk1Z4@ZBw4UMOPz>YwAsU6kl=KRGIaD*$id&!M#3k`4pwJ-TTGtYXksr zbdEj$B{5TcU_SU+Jm6i~yC*K&)F0r9PDq+bu4KKRHt!P$OtmD@B7gizygee|ngCYR zl_R0LmCbLAjQe)FrwirRg1P=UJ`OGo8KjT)DQtcRYMT3EuU~*xq*3Edyhb)yTZw&; z2I&+BY(h}9%Io1dS?`DOc5UjYfVbiVVaPg_`9YLnnup&HOVCCtad(txhHEX92yr(o zIa}BFoA#Qz?q6=U#=D07!Vx{30HQAf1Ju5Gx_aBAk*E8jWPl65I|3u?eUCa)m!p|b zIm=(cX6&GF)e|_x$qW-zKDYr%Q;PWtnK!`9e4Dx-TM}o2_EGyMwj>Y_=XYAS!d@I z>EIq(PD!O;xv4vp!^=Lh4Y;0H^lr7H^5wXB_H=WI!YN7v~YyvIaq)K z?y)(h0_QOv^YY3znrXV`^Ls|sn%njAq|Kt6ryYb%2JMW@5cZ3b&xsnu32?0>A^0RB z-i>MO>>(u-`pRH}YWXi^CZi|Jw?d2xSjua*Ww3RRFm>dev5ujlfE-FjR+9mZ3-52n zy*gUoz&O*nQV0fA{4G>}2gmhgj-;bgfJ z4#eCD;p9!RgVeX4(Q}~kdix?(HdH~h0SgosAVLjGST^{Q-q(SCBQE<(hp^}TnIY_# zHn1mzMc_;{;8Y8j4B74z#55QIebf9nsPd~Fs5q8!0-I*$C}d_xAq=O@W>`jN=2Wz9 z6?GuVRx}`5f9!R6ebw7zBDS;EeWf*AADY~ivo#3GyfHYShCt1Qe0$!oge(F=;xHMZ z=O$zJD8$|0(Yac~39%7c9BhUr1$#?f&4i zp=8pqB!RJ=NJ5Oc2@OJ$5D8b)*xbNV(jnXDpg=I!5^D{q!F92gTaHfv&_51mO1ECc zoUbJzM-*F!(P)HF7+IM06T_Wr0I};f*hy0QgjbDS+{6TgMFUShR1E&HXk~V=IkcnG>)-)f2dvkbkI-*zB9IuA z;^1|h6M@KsWik4#gZ+m?r|Y4$RvlB15M9-(7R1$ZHW=H3W3>}FUWnV}Plzm7AnsOT zl&G0js;VO&?nVYR^3bKjSgF1&U-whhyElF-raM2Jh%^LRE!&s+C z@b!}3O+ni2Z5)w2Yx3*7 z)a*l2*wv`~r~5_SEz*0by>*A(NN+E^DK(AM0~FO%QlbYDv=*5W$T!hKp|B~E~E8iMo zyCshzG%z+gB_|^D)2hFtSZR|#7JsTF4)4(c*uuoYoqC$M*s32XT);>eMS5@>U*UL+ ztUS0$O93;%?fY3Kwu>brnu9z;TI3uss~XnjA=yL14KE5rM>$3%26TfR{-;~*Fh{7A z&+mPW5<@}Nc&W1iTyH3-jC52<2>%7djaN&MW1P$OCx=MPN!U~an?5Df%SN5R$3oXn zqpRua>>@73;-7eoc+t6@`Prpi zbJwq<1|ZlRL5d#h#5SU6oJ25I5GsxgYywIBK{Wb0&>tElB7(fAuq!>OB;f$lAE4hb za6B^QTgUsv|A`tO60*paEgoinWrG(x{pICl{vvuwG914<9O)~*Dfo8;zC@`DeT&FB z&tI_WoaXne=J!m0sb$8mcfH@QXX5LL`iDPN)}F>_m|nU@RD_$cspOv6lpSdZ+x5S` z#g9xr_ z&5ieazju@+)Zu$>z7#k6*LPl!%wp%)87_Y`+WYr-x2(SBeBCnP%z!(1-S{S8!=ZO*u?jt+B~#|CFnSVH5N5sAF$azY6V(i1Tx_MYXzCI3(W;71bkgQ{)L{t6C0e7 zwM^Rw+yfg7r-YxT6)|?ip^v-@hoM{K=hOi{oJjKq8zLK2yT192&WGus8iE;P54nIq z508jFEQj)k_<_;E5L;h#Or|qv_x>#|QN-K5e~rr{w(;5SS+5CzezbE6)HY9E&r}Y9 zb!3+Ju8%LO^hHd{T-h%;?RcT`-WQ@2#-U_|%U}q&h{+>2(GaekIBGW-KXP#BIY9f9 za?jomxh+-!t%>pnI5Acsk44n1_xWfb`6eI>TS36qFI5oJxuV9CBS9oz$Bmr<7;B@+ zQLgUQ>LcjFdmU`TQ->oWl+a#GQb}k!T4UoU>WXcCZeE+(zSm{jY*)C3rwG2(U=@y& z=u((nYAN~=_;Ul>C-CXd^{Vs0Ub)5;`(Dv?pqU%-SL!8!{!z*_Q&;j65Mo)*zG5Gs zXJ~;CsNaq(=)&t;u~Nt>#W-5QfD_fx9L4S!1w9$|JpoY{Mo>hIB8?~cZ5&MfGRMGx z`FqR#2f=FBENJ6+=71MFHl3QCl@{e{M{^ymBZyrnH;+v z<3n8F1e8m7{xW5m5se{FKto1nz0WeDc769l!P_;x&&17}(#^lbSf}Z=Zh7F&?(9`j z?7DapLze|$81z2f6b>gFN&rJm?*aB|X&ZKCxlc8p25Q;rw-W&fL`ijAKDf zWT4!NF4mq?QhhUREg2hu^^#_@VJ069j6VS%{zf7bzp4fGcVD7ixd{MPvO@U`T>&bZ* zRb_Mc@!&&AWTbTh&;_29#9gXV-lIa)2z%u+By(oqDQ0nFMRFMNHWro1g(qu;Hz6(v zsvsYbiwCg$m57LyxDQ(J1$so+odl*}b>o-|&+4uYKHhcVXB~0?zP&DpR!Rsro!j&i zC*Y!I;dx|C@!$&>&>Tn~G~ST?EE@>cz(+$?(XfsoE8z``?(_LTaDmbK`VNP#RI#3G z$63%fFogCagWXuUEszZ)nl7I_yj)iP6_;Thi(aLS#G?VL6g{Juk2BXN!uX}Ih>0EC zri$irES@fK>00FDWv_fPtONShUMJ~7cs84!0CisL18&r#20sCJ;9F8g5@)8&c;ZgX zitII55>Mr?gIMbYwY~)FL+`X9o$jF@tDg~yd?Qg(%R?|J3s=J zx9~>CHOo%+Q>`8_9ibve0dj&%ppc#F*_*LxVfRsKu ziH9mR*hlHjM<47P_EWTaA9=8E;?0MfH;thcsyrXW7JjPsv7NqqwD&JHNbzTVNpdjtd~rnvg8>>cV~4YIaWMTIfdkPkh-JNph_%c2 zDx79*8k{(X6QAMt66Y>IzU(&{cWjtS5<_%$k+L4IZ`z&J-^Z@OW?)tj8K{{o9m(_| zBlpcVUTdX;%3-gbs3zDnz?j0E21VipI2jHQIs)#1lly!Q9%4T8O{9AZoV(JFeM!$& zWP8(jJyL(N$({LqbP%cm`EY5gXpWS3sbajzFf-Jxs0+;`2-eDQ=S5-ge96TJf=*%ZH0EP?V zsEdNAz_g(-XhNrk+9+jrGjSoe*;v05ND#&3vTR%j*8t&f=Pc!&(fV8`ReRs-vk)g~ zaBmDd^*v3=hyX}~6FHCfi_7C(73=@0SJBP#jgTAfftIp1kT=R-7Uk~`D84L@fA9}3 z9e%*lV*QW8Aq*u3`slP0rFa@@;InfBH)OG&*2l`@k%%%&q%^!xy@4Lt;CtFVD_3|9 zE5O8QZbQhHkLbO-86SY4O#8n{I5ybc-1@hbo^}CMH%5dzPCok47&}NtDu%J`n*>4Y4N6bUaLNclL zsp(x0R@1wpCPvY&&(43(sNWgoi2f0tLl1K5f&l(5gcD2>XKkGKvhB_Ox_cx>LXrNrygRT{B!Sr_b8VeJ6b*|3M0X=b&) z!r(HH25e9#+7Ko??LJ!2VKN0IZBu2Aw!Wl8$R3?xTISXLOS)d1UZJvCGjG`f@eW~Of%uP5?=ZGHpml%{v z^YE)jB#aoc82~P$3FptW^BcVzF*Dw5qdOjqmUaX#(9w49?Qz)z2sM2W?O>Ko2dE2u zg8&vC7`=at@)2!@-G@3yC+sMc2AU#`Gq75W1r|(Dd@P3>eu)+V*&7Wgqe+SZr-XiZ%HPhNgNvpFOLqk6VJim&6BU!0)(g`ghE2-y*|3Yn&yLcVPA9!JOy0> zZD@UnF8_72Q0BhPUf94T+;c=k$AF1fjL7ABhX1{o?q$6TqFmFBAZGtqT%i_FZIRI?r4o4Ejd?gh?r9OBMtK}4BKLCA?$&u!hKoEXsok=#C z0AVy?mvB<{&a*RA>I9;rCu$;)Ke~|~JFoEqVC($ZfCu-XX^@wB8Bv0 z3%lrFQ&}U~=|VG%S4Vvf{x+ro?;1s^VKA?XLM}i6yLuIG!`k_WB$)%_{bZolO(nQyFdXirK`B={3PC3OeRCHdW9YCZjG)W5RBR$3SD& zs}I;X9=nQ6yjFHeOpNo^#GYzk0#>~e0hE-(h6hk2!b+Bas50;v;eJ$JC3sWSlVjTJ zPagsatcm%@5WKYr)Jr(iY~R4jS)?&*WR=kjZ*Zk61Z`j`IE8~Qqn40eG`D#Y#pJ+C zMFE{#=4I`HvD%NgO4VF`%1R6CyJ{};T7Cs(#6v>oX(7yhNJJn7AMoA1hLf(6?@(2{ z_j10t->!rgi{*SVTHi~C=R3l%Ix`v%E;yo#uk`}@a5P2CUVVo#C=3|8FW#Ndydyo1 z@AR=H0(v$t&Xv2TZwcY!J&G<5k{uYSXkmvf+?^_dQQY<7(0$KnIw4U_>^-q19q2zXhlCU#&P8x(B`vRyS}eJSr93xC44@|zi-QCH&BNF{{VTs%X+6hu#T7bh*>Xtr;1a-nBU#*{ezFSreos30&a)QINAp5$Crk~=Wl@Fz9s+-Y#vC}&_6&k*ZaZ+^HYSVc;OyL(=x8t5)-T%wk zy8zf#m52WOan78X*=NEIL<}a%p3?{eB#_o92q@Xp5P~4$17CgG+SX>MH4)MKzkv)8 zDO#=6SH)5d!Gi52RjaL79|RR2^-){3*H)@%(Q36yA69D7+~4n8`%ET?z5QP!bM|BH zwZ8SOZ+)-zt#A46?}L@^w64?7g5^{&Z&?WWycS0u0NCt84#IUC&EREi2=@ zr*&e+X#|W>?eN!A7nGL?ck37GPeRF2B<#%gRY%od9u%8-5*;Mw#i>Z?aIA)=&_;qw zdxrAW{af^)Kn!puj#1|(^fzbc$Qp-~kb!r!L1x)Su`N zpBpgSrJH=!ECjH;md1bW@R!{f4=+yrbkaqw^dIFG)tke zPv>JWsciUk-;ULws1V$yS5Na*XKs|zSNHs>J`c2Abm(KKk1{%n!b^kg{gg5HFrEv8 zH1NaA;qWPbmayh$+^kwy{^gT@qQQXGm(mSCtCjz8wBap!*MI}~{w!|A(DWqksmq#?Ti#fDZp zCNP@B#C4PyGp`_`^y72U5d6l@bl;&xCv!nFSua64smy83#`fr!(=htQl<)jd9TRCc zUW}f_IzIYd)M5{*9Eeb3S@zWbP0;8m8S!^J&&bI5<```w)1w6>MCR1BfKj*qdRL=??VYs~f?zs9?+oW~z zogff78=PDCabRCS1N9g2d(&qhCAP=kF-xTRj^!<(2atkF?hPt=yabf&{2<6f#X9US zFMPg*laaC{!I2PA1Al%P^{Pc(Jvc&#=iRR{-XW$ez#rtq{RS?59qe=XI6pm{v2)zFjfztr_a>vK#i5hWy+o(qSGZci=!*Ps*6JpM53lAY?ZDyK8?$AZp75&9D+;BJqz6Ep2;T5)%qQyVUD6PXK`dHK z*m+1YaYG97-C@c}{pYHDpaP1XYVU)hO{JGj4d<7z+IkghB%8eo_H>q4F>(>z2FR?{ zvgTfF_Ma@uGYXvoT}X=o7GE$mD{q;O4R0*q^;$TauTY@1SSCy6dGsSC80cN1;iKPC zzj2&8UO$(LDyJ@|S z5h@}m;n>hg_>vkni8#@130^jW;nAFXq_x$;hzsWw0QZvfb^;H%ub3~ECBo7;t-cz9 zsR{dXr~?^e>D~@8J2GEfR^M0XS%wR3N;x(z)`Dlfn2F$kMb=-;|Bcka4;W|s!4P2v zZqR@LUGGy$kfb1fjUqBSBch6CPS4Qm;B?f)F13=d0HcdyoEh^GRhrxY6Smq;w0CR| zNmx%#X*5xqVwh5+hXS`06} zLGK`;zSD#?T(Ja>zu&>BuR-|IsW#|hk`v53&dqL4oE1r)a)sUpX+THA$4L6{G&RAP z0n0{vk)da>}y#n2QLp_@FP49?R4ahRAn)0XpJ8{~f0DFGHdDvkJyZxW*B*5&mKdmnmsJnf?&Nc(TI% zY;t^?7JRN@ElLi~G&wrP-M$eDsy|AJAA01ev?J6^#76-pN8R^^kFxDF#Jn2gr~Z7H zWsgkV?kM7ZFNx=ac=yPX*&YG)wg>hko8H;d-rC(n;N4rhn~#j+2uzmZeiQH(0R%y+ z0+(>*gcuJv4~Z6j1h)Y_>+;-*$V86K_h_~;I`3h09KnD> z_gWiUh&O4J$tpz@2It{&t3H`r3 zg-0Pz_?pbpR*fAP2QC?_rXLND7MCFK9yte>|E0D0_$|)lWAD<@F_W4zHbC zq~keRjJh2qC$Lp&bnMNTG?sZZkC_;0q8AFqkp72*`3$kx9m>L1=l`i7vQls{R|+y8#z({f{qEk(?x0fmF0n zDpENZp5hgQ)El1M(Z2K}KiJ?sEWIAG_0x&6#BrEC9l7zF>inE>AAVW?@4@h-RDR5W z4r71yUk`>S^1fpfOZD*S5~Ik8vKX?sX`|i8ydJkn$3Ht5&P5&MYZ@LeoMXfPxb7x6 z+QZXLz-5p0Acl(T&5ter47w-bnOKn zz1o3Eg1)oiL%Y`p1>(?KU#<1kss$x%HeBNkR(9Ml`@MmBtSPi*uO>O(!$p{Ec#H)? z6DAdMku!#9igQ zfUrIknl2V71WNcbTaeM#0MEeNPvh4OCv=Gm+6v_B!KY8o5zKnmdE7*K)41J=3X?&W zEe9v}Q)U@=bDuI?74TB4q;nKE(0D>=qOCwk{kg%A#K{uDSe|v{<%iJJ%J^_hRXjYL zn(A@A-PaU|MgUxDI)c|@3=#VVT9T>4wIyRyKTjARM3K|<9#(y0$d534F8tDhFh+B_ ztfhPr`vx^gsp2p+;e;RwHnoZ-TLQNtE6mnYTMbRb7Ri5?&@^@sp9X6FUDPL>dybOzBMnv(U#Vz??ma3xE;e&wEmIjGN z3CdlnC2*Z!O6E$m!`cQV!isx}2MH9UOf6RHOM+{0LpYmEhoA}wa>0rrO~9g!)a-)O z0oGTvo8on}M<8M+7vptAD|F^%RN?F3CGooC>*Ne6P=5`6AkcCSPCHt$zbW}Yt5*AW z?V8Vb)o;Xkghg>Ui&ebBg_DEDOyxWypP zUunaCB#>C8Hq#?exV~lfSkq{^$IcHgpC9gW6{@e=g+GNU#|4ubCP!NW6s`0{h)=>-Mpwuc z01({J+n?^u*2JZ48$99Fj7hp^H384 ze`-%jS^(J4897tVZuoTXYs&3RG$6fXoCA0?c}DJO=!+91{H8DB>?>2|7bAHunR%&J z2gEx29?5>)VH?SQCrI|2lJ^E*3=klvbq?@UvSAugST-xq$XTmG&|hD&6iNdmJYK_& zFHzTT{~@^JxHW6=`LH2(@;#{1X*8jx-C4^v$Q@vs!3)U%l=WAU0d?b1 z3wPfkPDvkky0|7cb&ei{Kj9cGXwdD~e8G<%G7j4dTdn>4KTuEYT39wtE^Y?QIEIX} z>_Ep~z}HGRevcxnI-$S`wms%TAHQs4JBjbz8^EV57mH#Nj&sBqKM#wutT}mQ+N|)C z$cKc;5L{XH(q1~O^R4VqFDQV6A+qGNlq-UY5Y!-9j}o1HBjQ092W+gy7jXHGNHLBy z?6n`|NE3#a^K1f{95?r2RlAR}_P*>a%YvA!t{<;1M;@hsxMD!XMEggdm?9rN$=lnv z#+B5;YcmJgI-b_7zE-Caw$h(yOz=xg8CZIo8T{o{G&AnDcS?Ydn^Ts!$;$4P}=q(a^qQ#S(;!N-Mg3d6F**qw-x;0-qeN?)ndmyC%E@+Hn3=)JrN(bfW zV=6Yc_g*W~V|ui&XD~U)1U$FXU9r?W$0eQy8Ve8E{GG{>^GmSm<0T%ZHI2|edTblc z&X5xnfpqK;E&3CX_-$mvascAo)V%suUiNqAyYkCPl+GEfCD8NnB*;{M@_IOe=7>tb zrTC`^zb?2&EE38R)9sX;(++ozkAWRLx&%%RDCg-U2k&~= zSz}*{n70N5iq_Rs>(Qf%Lq?HTQVMn~5#MbFqp0ugS4VIph#2qc8x_tK z#6eG>IQkCzpS9rvHFrfp@}-Unl7>Kcdvq`m8z2c#IR?lN{Wm61+d-l>MIulLUo}Gj zVIvupw2ObsNsFpMJmAD_+GYBYlWD0>g$@`x#$FZ6Ol^m@>POUn9m1jD%aYd{vMo_e zMw!t8by0k)^d6)oR9P*#JEI}S8}3klGo6g=22rszD_BAFRdsQUh=N+_I%?2x& ztDl#oCn#^{I4X!*8M_X6t~-$9D!M^Iqlam{J^00P#|Ua1cY+a!$8Y4Yx-s}U;A=nT zWJT!+I_287x9Zsi@`;K_-CAJ*LW)y&e3gl1z_|Y$9?O5Eb2}X^I20^`A|p zDqhH8kqk8+#H~rjF~{3E)l1#}1=_7g3~z5A{Oe$_sIQ$Gd16RNKpa*~zK}XGH-g3T zDsrxV=KUP8nJPcZPSXBpB6&0uQ!sA@Rn@CKK0J3Gu6kZD8{#*=}AX;5d zeoNQuk4-+L34VK5o_wQ$6)e^%9REhS>l3k{$lBPxiqp9)Toa;bm^XWCni ztYdakng_IGItOJlVP`=)-10(s_rIM|%*|lq8V}Y$L-F1s1smd8I7EFQtT9^WSy&p; zn{S3x@L|?|lauOFNhF@*w;_97PGCR9bB3oVF&YTAqfD&4$ zg(SD1h$KFIgI7&jcpc}DwR&0sc#2K9Go^X|nz)}ihlhi6c6c~>p|g((@0Y^x>bxzH zk2a1f&kqfRPT%h7)&IzN*Z+wYCrh}f$uO15xt1Xk&+8%uHV`=?^qc8N_2 z|MGuoREs5yPnt?+Gc$}3!9}6pU`bMOpv8_Pp=Lude}lCOt!J#OI8zqK7y5l2e^78fKv7Q7hN)GXn|m1nFJ2LFTHwA@ zdkom@b#1`e(XxSv);y2ZM%5`L)c|bD5^hz2AkdZim$aLl{#*|E!JESAVP|u=pSW{! ze;rA&96CB|9!bIZ8bjP&-VM2RiqWfjfwBZ8rG*n%>fe|`HQ5M;?NhLR#s(Lz@~sq$ zDAm!)3%EMex#$KPstTy*C4CUWh>Vey#byk9rWcBSp3iLDNVRcu8rm<2bQ1}$HZpF1 z{4!sWJo|J80YC;oid%&gEF2}(Fo6T#x*32wx|Sp06x?_)5Jc@v`xXw3ROP)A<`@dA z;>~3WXuu=eLcFG!kNBqHn}2;jz6pI0*k-MeevrsS@`r`Heaooe)HIwn+{Pqkv|4x6 zeB+grsNan2N!3pn&}gI0%887L4^)X}^p|Y|iEu#AF#@}OK{FqRMZb0tiBW$9O>w52 z&t_w-@BHrY(J{JnXW#u%?!ZC|9W_BdQqo-Up4^@Ca6Mca9Ipx2Ylh+BL<8jrJjTXD zH>UwbqjsA2`*(Rl;WF~>*RKF&9rEzOEkho1A4f=@dxHp6-r-O}f9r#FGuRt%$r;sk?GEN7M zCx@Ib0GH%*?h3Ik-9*1>G|kle<5V(k20ui`;bl40pV&PJJV8($!4ufbf#!^_4YeOh zCq^rDidB~>LVy&iRmn# zmoM)<(7Z&>)E{L1Mscu+j_&U@>gw`bSZpv@Z?P`1`Z4ls71a=cJ;0XB;O59b82t?6 zghZ`hgHq;^c^K2nhtUCImfy!;a+H)BsX<2fMVJBC8&RMFc`^&{QMtA4a3OB(e-pLuJ%*LOD0W*K|Vpyj_Hg zI~>DP%jb0S$lEmA?C7n)6xv3N9Tc6j{OS7x&>-&*bnngNsI4CF-jm*$|0ZimdGB5$ zR6jX2^c9_K`{aP>>~lEsI!Dy?0HVRs7W3+({W9O(!%h~#{M%K4hWC=Qnia=xcNI#~ z_dfOVD|=y&y?2?xd)3%1zV~4ERQ6p=%x6#TZQhc_|L(a>J95jnAN{=_%%6Pq=4S`i zyLWf(-p9+l{lJ}{`$2gw%!y2^cf9{#i7I9#&j9{>Hs5mTng8RF-+uHzK1QnM%e$!P ztGDfy=64@@``+bm&)TaFoo)HSl_&kuIS=~oS^LHfp4DVG?Y$4P?46@>sos5l+LTLG z@7r6Az*Fv@P=FT#%6P$m}-+zps98>l^iv5$A1wQtnhhu3rI-TwbE&c=cd^^Vn z7P(d=@4C7Ge0+7=-Wa9?!KZHfMMx`Q+b4IOwRikUcEBM^xM{Mz-RJk5<>z_JIjQ^S zH(h-jKEk|xbP&p+)+i)e$KNpc)Kl&gv7CoFu1P?~*Jn{-lP^S-U?7^^>))og1Q4}S z!%>eX2f@Bs#7(A&S?;1#)(y!%aIM7Ggy@~$c6j+ww!yB|GR^t^e6B^ zhdZc2D#iNy7=-+WrZ+Bo*1o+rRIe1YrQRhNi$mXyN(TDSYkFMXARF}GmTMpMF~IvC zfWGjFw;z4+?N1fZ^8=9IKMO!86CIALEuT5|;-cF>>eI`9{Ttm#?{af~mZ3%ST@NjO)L0Vz!yf^ESM6?eV9V2e?es$Ozw9y*bYc>3DH6 z{Gnr8>GJln4Cnuyg>W?2RAuyzyIJTtZ9F6ghgULU-6>Hsor!&e_r~b z)UD4mXd`bwI!Jcu;RV`zo)dN5^PI=8XQvben5 z6<)0{Jl{LY$82*Ds~la^S@x`D{8CKqyV3as3sgom+0yLG((`aM9z6J6`EAi&@gi2P zaya#+I`mKlFvE$0m8Lt|>dfmBy<>jk_*uKK$UcTxb;_rK#K9rug!zSG70fN9&8{lWimZtim($Nw!2xhEFW{mGgBO0i?+PRh%(p zrR|$h@F_e=A9J1CzuaJi(9$pxUi(Idsh7H%2Sb*x-%xNd$8t8mC?@`C#_C5Cz+jMu z_Pv^dKnN&mMMIAl9?-2~bF#iroH9t8=2ndt^g~gY1GJJ@Kf;4h0D9m7hK7^o0vG__ zn)zV$#mP$(wu*}%>nMpmXgj!%)n2vP_>Xnw0X1N)>G;$5K%eNGJX7kd7dG+pbRMJB zbw@HErr-fR9+2-C3!^?o6Ih#m%CRxgpg6+E*Eko_Y3ZU6ZT27x7d)#&~x0$}&p3zdw~`IqJO ze3+%}fWk$4cVN1(|G>b5x$UC}rGnJ}JWdgR=wDlHml<-yQSGuc+Ga(X?XUB5yXvd* zs5Edr-qEPVZ8L<`h^EkZXcoFDn#N6CvR}#`o zk?y~8bCV~nn#6X6#sH)}SM0U1-Sx*f?K_b76>?_J<~##0>Q>abA^WGXLcS4?9H$-m zA?tN~fqE9yFofEV=5h!u^;2T42;v=5X+B@nk9$ah0r0ng!|q6iHdgfNcYzGsLkUhQ z5R?XO)sK;X12PcQ{{pRen^scLi60rgVzBWLa>~z&UY6&qGynye8&=XaX2*K(TC^1M zXn3edUcGCg=p|n)>rJ>~6JJ;vXN}Q&dU|9_mLCH%v-%5@1vr{3wv6-=baAll*Ipc^ zO|Sk3{IWpBD1fEZy{?l~L;7z_f)!#<8yilv1KAI#@mWBsT_bS*6WV_DfaPZ|? z-Gdk=K6p<+H`Vm;S4E7!pNwndSLgLRW#Pfc;)jDSg0(uz8?wkF&Gf0?jw?t)@&L~I z3y5Mb(j1P}f&NgttMF337N;ph0IKdo!hwg?opaU}Jf1cpogtOPEU#49&?h;YjY? zFQkNC3mz!UwM@q?b36dTR2&XiBDZ8!LbVw)&GgZQ{j==wU>qmIsKz!&?PNo z?PUE&(@xlsYC%$v1YS+*RT%I#ky?NP|DRt~|8p);({-u}SU_Tejx{~s;{3%o8Az&+ zmn*~~TEAgT491EHZO2n=Us`Ci6Yz8Tn|j3BVM2d1*dfa3>wfmRL~j^yyHh=>Q>&t^ zSi2h?iO+Dl8d-HW!@tI`ho(3Wxx3$Rv$WEx=jF%RoJ#mgX+}x#j&!=ZNRbK$NX>#$ zMxEv^XkXXsRu@kw>Ql>GK{E`iU_F%MT;g)$sU@2Y;&SfPaxa}g;UN4eel~*V)!Xaq z0A-F-S7r<5W||eo2Li9j2ql0{n&s_YqMRrmUjv zRJ2XE&;{Z}uTLhHI&_PJqW$+^4HwYg13jnG>++-$ZQd>#ip}$M?Gbr>_52l!dk9}R zkX?156TiM82c`UO9f7^`Ww7|JJ(>c|X{aAYYD0oP$B8ihCfoQZZzE!Jlr z&m2+7cAd!C+0bBd-cGq>-fmuCJW59>^adacWv$pe{wI^GTWpKF{;fMQb74iF(!C54 z%-X->n7dxR$DEwZx4b^@(Pbu$WbJGJo)+taz2NG+*}#8W>w{qla;FHZx6by8%`VQb zj18SYx*Q+= z{nJ(w9P=%?`s8NYWYWYC$V`G)$$KcLDnW_RFCeq^gwNS0NzQ#-k18(aErY%icO?yS z1#^gBf8?E3I>QH*l+l$uOuiltA8*RvVzgS zY)NTk@Y{SAvV=`|_6)zZ$H=&9owc`TvR6V!3W_in=oQA0ytQa=c~JXq4rlqpAw)H~ zgYXsh_o9B$>GngLL?5&qSP!+A5lP5GH+xMHx|!%Y0W2idY%Un-{HI>AxCn1xjgN(b zIuMOHFzU}Q-uJPquK38;vu8T-##13P&}h93h*jt3lL~q9&X2F!HNSZ4btf#|jA+eo z4WoGDd0*VTH?FSv?3Xs*sOJ&=nw7M6*RO4F|F&XwHu*cZ{IdVM`ezTMqSQ}qQi0X_s9k@{Asr|i^@PA(@ejXU35x^w5FvUQXkNUm_=(=&qlv+DXhtrzq8jfmOD@ z|80ua-oNAZgZf1LA-Q&8(<2xu_ad)9TM(K2RzNp$aWB6iU$~|2yYhmX#5bXg&WES1 zSyDd%{XS_HzVBm~Xv4DH~Y?gxeUfw6Fw1~mO8(_D;(&>Q15j=)3 zHL)|EO3qXo+w=HMzRxtH`JUC%Gx?rg!Q|)K#ojn>sMZfa0VXba?PCm>Uu}`zhjozG zU!R7i==aI_Dn+_Ka3{mh&d6ExJ2^j^$Gkln!ILkfH^GBJ^Vij39_Zu8J;buYqkWkrgb_0jia^b1b_QGa7P0)-}!YS6*gra_UP5S(Tg13g`| zSAYH^S^We9t-v~VYO>x>OT*(}X*ei)s06feEpEG~R76^1mxD1pr_;t2V%^Tj2@!HQ z*84-k#NXE?dEo7HcRG2-(O+8F(EK$(uZn`PHC zr9^~Nc$0&?B1`iOj=9l=wIbtMqMTQWjvcBP2K0kCg|I0!+n8R)&CbC@JXjP ze>weP029>>oP0IOI+mZ*zbj3Z5D+_$p=Rn>g>+sDNP_;hs$2(ONtul4CR65D=nXR_ zg}Yi4IR2HY+DNS%GS0rrx`x&>gxF4$cFSSbu4Kxcg6NE0(-7H-!EqdC1|9?G)LEKL zOL0rJ22K2U^?P}QBNdzFs|{+H9qFyamJO?e=|cy=>qL76ab^G{`F83+eO=F}dmhzY z2p1itDIUN~+QlX*iMi?0V-kgfDvvzrmeDcAKr+rTP=2=_p?;I;$zma(sBRLxz%7;* zkbyJEh74S{K=WgR9g?eGtS-+!y)y{7z$>Wqj~_Neq|G34hsV%8DHm%jOd{RMjcF2H zKn5Lyb_c1Oc^Re z3`om1uqdO|2jNr4Bb8QxD8J=-eXCJ(Tnk17)vL3;1|qQ1d*4H)d`h;XGxaS{o#X`d zF6t9;Ptjk(90gm3+EeY?hKK`Y)x`+WyFZ9$)Ej2;(~$1mvpg+n zvBq)nc6e!+`4e>F(6BQRNLv6J#1TKIXKWuV(b+Ixit40H8rzUPIL(~AzB!`0_#T#V zQ(vx=u3y)y_V@70L!0b?#t|qg^}FWvUlr8B)LtuNp`L&}|k30OyqOY+C5rh6*m zDmL>bAruPo7xi%F8KgkZ>)>!DoCJRs3ph}X0>`NipSK_uDF9}Yofqej}8~pZZV{rTIlubeAy;*okGqo)&nP@a^VZ%Pau|rck z)Q_MSva`}CEg(Wy^Mf}V2E);i^#z_IX!-Ww_l^6dkelaI6vY7Fo0H1I{KpZXS3_po z>)$7Ou=@zjlaJI72Ng6Ghg>GaDN;wX;ai^!?V=~v>_jtwpVDt0vrGa@qub8!zx=8Z zYV5J1>&o~EV%)IVKc9z6D18MH%y#403PzFQ3 z5JH-R-|$02O4V2MC0*9k9q2!s7>tfb5iH|j2WbzB?|uTI3LX~fn?ec(L*W|VGr&Wb zY=(tWk~=4bY||pTQTU9Tv<}w3^*6Af(=G*g+K0-Dab?Ym+;a}5lMe+VKY^|8RIrkk6yL^oF}%zXzUM99v&AFf8T73;mrMvNs9(7VcOq5R zGWCG=T#eipvXqI6_95jR-t^0)U}!DqJZ~Aq`u8hCs@i+MG|6rU4}Ca>lX#U?8u?$N<340IsNo~YZp_oH z`bb%w2@>JHEW_Yypf$-P=?`ickXxFK@BOH(`vfWq`%J$Il=cF9Vi)+2l}<37m}!2A z`$20&TR+GJ-`rR z7_d-ll4tEJR4o$cK=j?1gU53I+MHvUf-yiLWM>dJvR1N3M<-cR7oAe`}pJUPh;UDB_A4OT8FB1w!)?+ielAn#ISs!GmJ)Eq|B?NI72+|cP zHmHmMH-4aB4rD4MwYsX_m*@R%tihXA#p0o?ixwje%2odYwVZv(r^(eBuQny~_Ii^x z2)%SD`t557A*O|mEM7Dv+>`4wnTl2WT@q`nn2115!*-J?H{crR+E0H&^ug8vzu!*8 z=8zz{YjV}v^BYLzf>^_9-$tZ;jAPgRGnP36igxi@H2Bov$@*i1#ICaTf2r*>fr3s6 zWu)`!UU_1oa~5L7QersbV2HDZ*jaQVX-)lTn2=Mu1YlLLZ}cV^0US7Z5TC6QV}9Rb zLtL^ZoalrxygPDeg{QH5vY(pa!L)(1jQPTUX}-vM(EU61+IL3`MnK2XffCH^^g~ge zR)LW^DL;5KVF&4)L&F+QP?$O``zVdaRa-}3YD)5ux5-@3?!lV1O5YgXEJ-!M$;MCxq2H4F;_8)@4$rQ^O`+}0L*1CE*aI3_^biTGSjK@rs&~2=2j$Q z&X>-vgN;JM9;PReqp70Yq8KrU5{duoS;)W>beOSu4f|VOIZ-`=aY)^eX~ld%XY(6p z2a`k$+;=x<^icXVcBk3}`pXI-Z)u9deY^$1kY)V?7)0yQYaE!7TK`Mbv zF}DwOfy&e)nB9wkGscicq2loOh$8z(MHEFMD5QM5HT^N&0wMPJ%P%M)tuzh z;>ASN9p{b-Hl$76elf97zn$D%5I|HBL`7hZXFcy>R}8k=#xiua~V`+I7`J^Uj0h&6ggkeBjP3TwpgK;W>YkTQm_jnG{9&c z*lwAhzWOrpzRo|*_FHz}Y&Z#TuyXjVKi(U0;{&{t4`USQ)=iU%ThaCGocgX3lJKf} zU4a%S_tX7oeVgdIzng^`-;;a*SGZgt--*UrY&Qh5Y;XD!dsQK8RV{X+GW2|O8Zt}| zj4KM|j{58U@Zkr;kAf~PuEuNTuHEroUE4)7gY{|xqY@)(vt0NSFnHik&tMGWdoy{^ zr!l0oEdbNo7urdegrZ}%j;%)r!jlDeAfaEAC+A~o%#Sz%5>3Xd)u(6ZDAu|vQva>0 zsslxg5cMa-B=ui$k^EIXC4NNP#89;dKH=tFnOJ9>$l{#&=50TSNZrCML&W@2$zjn- zt;P5_4NAHWPgj&>5)I=K;}yN$>=G5gg&ZJXk8Gylr)|_ET{7;d3iC|K9kC`jWX!c_ z$OcWS)kPzrQ^aAEG&ff~1tlFt+RJtIo#hCKo`TDi((w$UiI_!vBlxdAk~^Kl&zoUk z(^3?A3g#W3A@}V)n8s(KZBad@Bk`e2!V~jzm*dEej5IORlB&o+W0Xq#boG=RgN|G( z;{OkuyWO|t za9lE*%PfokAG^8#E_QQ+64bQG#Dd@}Y}`HtZI3G;1o)U_p@%Zb_|13j7;ou@-(~f0 zO@h^8vqTYH^&vaFr3m(PCl(yT-m=r1#+d9(F!rEBSQG{F5jIvBY5Y!#vid!Q{fJ`c z?xEtbG1)H;TQTE(R^MJ=?Q<{%lYB!~*|vd_IIzA4<7Eo93YGupSJkOhZ{OC9Ipf?| zYSk{$X*MTcx`l{24FKv>s-MsE%MI;9ixbJ#&aRB6@W72?9Ls$0VD{oBe#2XJFv>K<$-w5o0&$hg4yw6f=7hBr8Q?RqbEW-$rS>SWth^T7`pL|`jh{>@BUUd{J*MFvwaL7-g}NH6RYWwb$I4J4u(O*;^*2EuwNja#3}23GZ^ z*y!quxLqr{-GTSgsZc$`f5KtC^S#T$$(8^C;i#xlotF6DkVS<-WAGpfiH7gLB*3A2 z4pMLd*$G__%udc<8^^%W%o$vEyu#ia$mT2!309M*Mk}QO0;!G3L=G%Rjz=B+QP{_A zoXs3wR+c$p3X<@OegyhJ#nYb#A+*?Yd5{|oZ9Wu*Y0Jb!jHcSsq!m+VHxin)Fl8k; zQ7$@1(>FI{q-1XIk0V@SGiM0hb-Tk@7Y^z5`@9x*4I#P=xQ)J#)<$hkN~DrRgJ`UO6Bv zv!nAM$Z;+cr$zfY)EhXHmw;`ZX?Npf_*1O&-WfA{?2tG{t)IZsnR ztcZipBE5gcnwwD%tLitB7K2}BDP;Fdsy80HpuuI)v#*TkS&-K2LMC~+IlRBIrWR)wpcywOCOeWpKA*yWO2EbAR0QyyE8w+*0T1<`n9kQr96LX@|bQH zjHN>!cu0t)!asW?i{m|$En-BYdhZ&AGh+X!f6*E)`xgZk-ys&QQ+)(X^&U&jz0hoq zxQb{bFb-COoH3VB0NxN*pI5i%IMkSA2~-c6aNqz6P?1j&OX)qcF&Q{ajiC9c62`e6I{&7u6&0oEYEs@?z=(L&@(#I(l81Z_Jll-Y^3Gl!buxufFZg;`24(Sp+v z?h-PKj?syB@3CF}rMA3uyTR}9haGBAF_4(%5K0)}*3ISjGt%>ZA7GBFV^fpX-)j0WsH zI3KUX6VqxF0#j)||Cy{lgPs-b(Ge4)y+$OAL(#pgq9oJe{3hHg8?y7ACSCaN0UaJf ze|pBL7w|^%wJ$n%XES*=g8%tDDVW2Xxl?j<4GD>i z5>&XDjNcaz{Jt%zMui3A5;>oig3~u89OQ5F(TsARLlq3Ei4mf?8PZe+LouI& z6yNsSuO3TzQUUg3+_U=6LPntKk=8~|5^&N5>kRxG*~HWOFMyUhNMIp31!H%nP3!B= z8+LJ_;hNQYH9v45BC5j9qlW9d^qrk0$MCRsGMUZDA#fg>zt*D5_WpQwHJACWRtF zk=%rCG0vZulMomAelGR>e(nX^QQ9-NN(UUF7SrI8_MRIHSAuwszgYY*n-Tg+PwEjT zFh(S-;>IcB9xx&3%8fa0xS%LH7dTP$UiXq`jq-LXglx9voWO}`lacW z+gA(+6Iq_;{oZ6z<_3v|ASb-XtNQ1t4rX`ghH9_vvDv?1#WKjFNRdGC+^JWPbIXsA z(9)e3one`3OBEoP>pylGIo;Av9{hSv<2 zundImnkUGpxMb4-G}n#CxI7Pbyi^ZWYU5qg#!rrG^;;g@+>0PWoNpX?QJKY)};Y9h_tRA#rMfeE;W|z zOAf%r2;q^LAtMs~u*&laOf=KvBvPsdG*dtN=IY}*hWVag60{sQL&gsdS?{`ZA&}9A zY^)pFWnBycG@F+oNyg;rMMZV@^srN}MggiYxF@5YiK29EE^&+`m5mCg{2qpyr;_b!|NLbKlUwwz9+8HN9 zh(%LJH3za$J;MD^w2OE2{Evd|wLK$L} zLw#AbJuLfJJf#76J*&Y`O2L>Icu7D>$P&uaV<&LB=L6>&+{AWaDEM{lBhl<=QdmQG z;AeI4;ir+&M@%!UQaI0i#bjn26J$D%lkjH+RPlH~^9Bp3)aQp{w40M-hcL@tiLp{UM_7oJ8j(%LA zhbBT8;rz2s?oyo=<-Z?MC+&=pTeL4?X+q`*pvwt~TenjmZ1&6HT}c|2srO zI}b=SJjeSdKRBFdAjdKFFTu_;9T-bz(Tt@IHh~Y9$FBnVuVb)>dw#UL$Xz1Xlu{MyA;~#D0K^CHv33`+VIEG` zacAwiyhSSSFc4D*!_=vzBa1IYi}I-q&y|FS5&LMzV3*Z*3=&@nQ;6&o_kPc06WAL3C!IIIu6J8YGczCHG@})lH7h^?3uc)q%#;6Pa$CPOQO|FYm`*#^YnuKdJ;iC>2AgmTF#cgM( zy%41u2A4uNK`mk7b$c5I{S~Y9z+hJ%#ToH&$@sV5|4>%HJoklsB-U$yMAJh}v4{#SVbc8`jLXBLq z3gs^tqrE2Hk5v$0$Y~c;j9tr!oH&q$$*j46(`3|NpFzZFIG|aX-JvnZ%jMoyB}Nkl zhF_TbI+kz)eVl8x^aUM<@gmS;FU_PZ4s<6jSZeM=Cu-(+j}{)+q!>}-D;xzrp>@XT zlguc408Uc}TpNhMq@=DA*F+CND0T7W*e6Tdi0pVOkVtSupKDARoS0#ZZ)hbK`XcpL z?2xDF1whH`Ign$e;h&=_^oKcSqf`&7_|!U6pD4yqEHo*xYJeZ@ja$K!ChSY2n@2Qv zqN<2@i-IEQ{0QDcUeWwATbq+>M)r_X%RB+qqRPx`<&S6FsS_~sVYu@Lv#Xl^)y-fR(z-v- z4{9e5p9&x}-wdKDycpF}age}Oask;>r0BA_;u`rc@nwvi(Pt_~+bLyNl3SmVi;eY_ zDK|P+ZPhUWt}Uup=hQ1Jch_5rngf1v15B$~DL$#l`c4C4-P1gQ{zY^{RwAlQ@l!ml zw?NgYWNdi3JMu(XzJAP7Wf0U1U+b*qz}CXmj10U$SM?`ExZcJd!R>}7u>K0QAGp02 zQYSk*L6fui02aKd;W6QevGd*b#=QFQL_X|zRktyT30`dWU#!%%Nse=;y6K^;3tdE& z24=aRgjHQ0=)Tshi+xJ*G8RD7Mv`eKV;JTL9Q83ew1BIG@wXX9z&Xv3_T)2$TamYi zdcsC#jhG`6Y2GF9rmDZwBQ;X+rSVEP-xu_@>76e-qag#JNCQfV%w^v({7)qMxKTDili}o%4Qm?(l>{xQ_4{p% zcA_CkL`KR8pl}9*M2R>?7AaNiJG4<;_A^<1v@FWqz3$kV!MY5v!AchMW*)m_e)oLd zWNT*KCJQXk64ECIEeldAp5WkUp9~a~s)_1bXkKKvnw@FUZ4`QUvHa4^T;5c>W}ylD zotK+wi`w*ahXTrvRBZ31n`mt~>wZuAN#`?o5tBEWpO{yjSeR-HPUz}tn=}Gw5)qg- z4I!<^r+0C=eKgfU$ufuPCBOmYXnG#1CL~tdzCpiCUBMxt-jM+Qqo&WoUR-d zSm(3Y<=s;NlN)BMcia4PK4oEX1Z|jff7IH!`A0L^y?`KOM{zyf9@p zP+;zUKKcIyJn`*xx|N1BzOiC_Kw>BV46K$e8%a6MWk_YuL%QhhaSO9DC@XE3S$*DKDfXe{82d4%p zd8Rv|cU%|9c;P4~kYPTSgNSV~O5pl@lrtH3HTmV$MT&ao?`#gO1Y_hbq6C8#fpYaA z(37Qc9}m0n33M>dup>`TH`$_!UUh2cZYM0z%4450VN%XSBLHb8{Hm*XP0j0rO4j2V ze}7R-c2O?8V>j@!4K}Q6=wU>d0uvmRV3VLliamQoG*P<|l?OwP<5(SVu3&KWU*dWX#HSs(9T*(vwa`Pjb{OSqD$GVee4$RlE-JsT~gXSp7*3 z+s-?-&0MEvfQER)B51N(c0JwEhp@g~$X!B{K#W);f7~*JuFeWwm|<;XGU%n)I1(bB z%3#p4qK1dcIx(v-qA!Da5rzS&$&>CSeDn=ezUU(U?T7;{^;qpkcop0gR53}l);XNFy^Az!m0R|FmCMO}hy zhANo>WZ?L-X+T@Nmlcu4x0dHnaCokD0P{pt6PJVbJ1Lq$k;oTW_rb9T?Y zXJLzw3wlQ^Ldm$=A;ZhTwF!`Rf;+)#HRnBB7Sq71DX*rz!fY+t8Lx1M6m1;V3_B`3 zxw<!3u%c?A31jJ~nR}HgP)L@Zz}bD# zPUGP$^$SS^dL?{6Zj5${b}=50%aaF&B*m#9j&{v9>JLTx5S=yZz%jr}=xKTjpo8j> z^a=XpLF(f$i#jB4GTK1+PC@`0qp~7$Mv*tup&Q}A3oV&4aARd6C`kEd~@Efup z6B-C5it#*DNN<&`&L?F8)pxOnJZDVOo9~rOAhCY`e|`X3#4#s7Ewue)bLZ`s%)Q#{ zPeApAcr%R@ey5~;g74>6v$HwJ(>H7oehPI_O-?nZ=-$rT6VLI$9x!cO1&e{m(F8%l zR@Y`KjHFJv6k-ka#0V{vIy&1VE~5#UHH}$Mf?N#{I%0?&mf4)=2xM45RTSYYOf^%C zh|_Mst%F2m>B}_kTW4Z&L`On%w=3;lKG5r6lg^ZQ_<9~<<&G)Hw6Y>Ky$lJ&Efo)`26jUsU);5Sxg03~xSe35=^C1qkns zj>H$Y@db|!F$ok$AwtEzX9~*F31uQarQ68&6m4!&0R*k- z+s=a)^=?aKx`F(bKj2;}L}`aMyZ3metUai%+w;^ihpy;{!~sE}OW=A+{wEGtE%xK3 z36TR4g5;1o;ha)8!VF0+ywudh&D+}%L|$%&f%K>@(`}czYWG7;^gF-Y`BmCak*x<`G|eX5JkZ}n=!ma@V}8Vr z6*C#CRoR1MPV@%@Wd{w+OvC!0p)iiSDKM7TFC32F;-n!A?uBvuJNlC=WUf*{8ph@f zf{nhtjP#k9=~4 z5o>iCcf$r`6Xukvv9z4CsV9g8OL! z!)GAwOj%{VV0CQl!KaxgR;>pScl zdsVi>OWV8BH{Mahp(+XXS*iq8RQuqEDzVdLd*r1=CPl;dt7NH-<+Z{zl)4S)tb*?F z>O^OWnHO?9t56OCS4;6_DAWuDc2nDD2qx4#OCW;OF=Z#atgzZc4ih>DBXwu)A+6re zLLi7cs!6GE;UM8rzn-~atn2Ii#Ww_n8tu2y1n3;*$j{yUHoWY$KY>ERdRhBAtKoMw z8j(q3frx+gVjFk6Ik!o_AF&wfo-7F6W1x3pty`GC5lCN)Jz*glO z7pE|%Vkjm*YM5AB2$@XYG~%??0%M$Gc^GUlVOatBWscfA>(1GhzxlhXxxI9kbS|b zVu+dl5~#j>28N+Kcg<`DrWxO@a790e5~KdCo|g9Xh4xZBdX>C#&=yYOu6mhgsvh?M z4X_;B8m%;bPxGlUI!;Z*8C4n^?Z#zTSgHe^b!U5T`0c}r=m&3>8K9dA=HqAJp!Wyv zz;_aYOb%7az3JjI2xaHXA>3>abd@iMOZRF-Ij}_p-~&5&=s38H4&c)b{E3Bg#itO# zY|%xgV@<(==XBq1BpT8MV#k-C65IMbP}r^3-m-y! z8FYZ>VkujAWq#31akRpSS zrFhu;Kg5pin#HZVbEazVIciyVrs@xKq8{IVr;GW6W8nQIhEbjITN5b8R6WJHwP0@S zOSh*B++j#Bk~ANaN-IuWlhr$f81oQkx`QH}cKTp~6#3N=AMCNaq9jr`iLX4-ipzP> z^LSFm4xX;B)Q~167HMxgSkke(^bXuntNUp>^rJwu)k6C}&-2j|48CTazrLnF>WBG7 z^C)G@Y@#-ciWYV-E44ZNG-a{1k z@fndFIp33JD*+MGlAr0vhKj2=6D_nH(>g zyrh>;BX|_LrdE^3c4j@sla>pi5-XK;YN1H7Phl32sb(hgl@B*^qQi%93&_Cw?LEJR zfR4iJM$^xwL3bRtpZzFlA2j-4{CWo0v3q}nPmnrjFEcW3Pch;EQ#iLeWsg4aUnKwG zLEWuvPP~SD>O4oSC!s^ck zR1VnTZ^n_-Q8Z9MsuoIGm0x#QA*DyN{AS$}!eA$)+{VE+PPv^erQGICq}*o1uii}j z?h161WP;854tyF3@7XM)LevZGalx>m{y2Mbbd7r_j7@TT3r1=(eeyVwAgpFg**qK_ zUxa8spM~PsuCIT#sxBbfd>luZhi6oUY&xUX`76-QYu5{D;Pi~uj{1LCGq2)L1pZvM zEK&RJo2xaQcNh>c_J;yjpAs5nRlTL3PpNSbu}J7ePz^Q%#IvWEMcLAyJC}Yyp?B_l z=12Pxv{)Gmhy9VB()H^4@g1?$myhuMUX$A-GvV}XABzM9^G}L|a_X1h7D7{EVz(3l zxQJzW2*_r=XrlgIHm>V8SVII`4?1$CE{$U?c7Y}uYAUzKKt8dD~rQsWt(Z86clw(UH@hFQ&G&h=p z7FitfshEzn2Dzmj09B31sV{ETW+_vT`Yfo!RSmhz%gxcPrZi2_1Y^S@vPOdI8(_|T zmqB2lh#Wb9*R@|OyUJkrbU|+h4LVtAa5WvHr!dQ>0T#R-pM1e4?*<4WnY&=H#F0Ut- zT@P)ed*0*P`U?SeUivE;P1cvmSm$J{S~o29xJFQNUKNu-6P5o>Lg?v#&vVIwH}NjN zVw7L@uKF$1%cHnBN2k_iiI7n2C~BOEgm6FXBJ>y=jVIlxZDbMy+hL0AsYaF*Fj9ERAw6fz;XSoI)2PB70KMq1Q= z#Ll(qJ9)k=#b09Lfxuz?Q~D{A<&vngem4spR6&~#B<_yby?}dw9uPg;#DW$B>nZ2q zt9&rdtkbgx(--M4B~!#b7@`es4PaMb1L=~IlVKg3hXfIJ7kWw@n8hTeRQGR@+?vde zStf!UA!4b0#jr)>0{kyL-3W~Oq_EQ}$})za@=JqRY@{x_uc%go3?LRC(%kV8U0$xP zsw1s0tN#EJ^G{L#YIPdOY+t&1D}VnJ#yNdXu>YtabNz73D08(mAjvq$Nfyl6?^X5M zqR1~d+nJKMB&nT);+cfw8hEj`{#Uo?%5+>bC_U z`U9NIy)4hOM8p^)<2^^Lt~%rRBx>bm$jzRmySe&G?xH%gADDjtLar`QOSz>!khil7 zBJK9-%DQ;y?y6fSJfag15XS6-6YHgq58jYnXjfz!h4!i^m?vEf8r+q$>`TNB=v!d3bZeGj}#~&HASXY0O=yelVr?^29x} zC#tkf`Bv{GWWKtYyV;;B`!z+FJ;v@-O7zcrARx&BO9noBsLF=5KXE742IkO1tk;## zhgHpqLU)|>+p}yf>!$MABj>Z(b>-$}U2{AqmNIw`pU<0hSC3A*Dq=62qnmX%D=kNa zGH3NGIbAL!n`~R!R5OhsM!c?Vj&x<}*yhM)aB|)>$2G?=1Fs#Vq_X6u9*%}7ba{&N z4-B8_VxwkUsKJ`NWY$GlG&HQ0rZ#`hCc90ghM=%(`^rQ^)*j&_i2=oC1a<{dhc;AJ zf0>L-gjH~O- z8k(UMe#oKH4EA3g^$m*63E?DJJW>Cf`&n9eg!F`uEOlOjcoqp5i};hu%8dH5bfLKBLZ4v5Gjn&X1B_Kc1b>uDTx zQedveaL^y>rDtN7|KQ(l9RU$b50WN^1_;s{4TmB5p~#y>+6Pzg7a6&;eex)$0zTr3 z{L>H>KbxxAS(=}_diFSKn@o^7jw|_(==9m6oUqW{ET#qkYokCKq~sgT7{nFVCmY3a zjE!#sVOUNvEk`RHk^wZsFuT)qv4p8iYk!To-VAu3UDY^5vnv?gK@9aOmoJDt0|j{U zQe_hD3Mn3tT(fH`wZh%ukTzRC8`PPJn)4~kG5)lHPliI#Y+Z9Z$l-P^L0yspd}`S7 z9l?u$GaAfHvoqPukV=8Kv}lzBlhk`m!Vv*JbH-PL_Hz7b(}oAjCrsDJz)#39o;e!L zAoQ79V|pL6i_wbhqaTwVSIIIWCqj?99>y+xc_EeV1_CZ-1TwLaFmTD75cG;i!L$jD zwl0OSCY8`Lc5RNnr;Oyyk@c(lunt?AWsfAxEo)Z62>hjFvou7B1q447bEMIGn7Dmt zGcvvb`f$CN}|Wnu9y}fY&Pr}Z3v;zjqHz*0HA5@cv$7eBhC{m zMkmL~qZlcFhCc4l9M_y2663$(w306*ST%F@an4B(fDmjz7gomc^93pDkf_I-^yc`h z;Un|ApClta9@d*GpzB8@H^$&V_0AHF6d2)W&uVW@Yv=W+rx=zD;q#B^81;Xa&@Hr4 z$8sVUtGc6>(b|Hg63&G0LzY_9uSZQ)$w$$45dhuBJ6w0%x>gs;K13R7dQrawmX+04 z_4)J737UK}YJ|-hAr(p%7n9+V%uo@@-Jw?2czsf=XGeWmixWScGI%TB_xN79#eV0w zU}Fks%Xyl&u|*o4&(kP8v8vnANh3`Wc@CC=i4B8dE5Nus#|^xU2BIn(z_t<=z8)3z zdw?GVyvtNeezIr$Nmi2$0krKkn*=XDi=*LLloh35!t4-p#bS3PS-4{oC|Uc-RB}Uh zYZx_T(y$aeKEdK&tnNC0IQg^wj$!c- z9Boc^XQyyb3NSb5M`>*WRj>%%=|bh<2}*}dN!X-K@VJlUGHKO3JLma|9a~2#)5hfN zkzhN<-LXez!{S0VFw>RIWiw1CK2c^HyB8^qw`Ddf#bu-ep0F{JqAg?TGg}Eu;|VmB zP6PwM!wPkI{{W+zQH#=|`13-B(0$~f91*k_9Mlvuc+r!#&dn;i#K$atsO(HN92^iP z#u2W?+}NLWGdXSYMR)v;oHmMz_Z5`)prmQ?M`47k3z(XInic2NF$Abh}O%T>E*9nqlA1<0(JlClY3>Yl?69tz^TGZA?;| z6_Mm~I$ThqJ(4J48cG z)ozlWAdNtCH)EJYz~gj2;1i;RpoQ`p2C-9mRAXnZamSUz?9; zubJ4k=7%e(nj_nFZG#M~2|C?68mx&*(H=98Y#K`4a}ua$HQ}No?ljCC8#t5E9TDQk z5k%%KB7#z~#N=|q#cC(t^XS_67Uv2g)(S?f8-n3&iD&reeEf0FUD+jHth#uA{ab@^ zZXdF9E{Iy`Rw-Sj-DZdc>}~s;u1M+2JZO(^k0S>aG>uD?xqv>keHPY*F;Uy;BirA=3BeYc)HmTh--2Jjis>k zP0_Dt!*Vf9+UklTnejM<-Oe8SAL55`vkxg3o?aRqLR~~Q(Z1~! z#TnT#!SecGZTBobNtM-dtpDP~hgL^DwO=4FZg)RqWRX;eD#k;rB`m>qDckUE!gz&;@!c?hbrwt*HT|w&&FBt(DCq!|`hnR;LDs{L+}W7i-hN%4?x~Qq z76|~H{#B2Mj0@mLAV1=AGMth;_%CWNqIM@qczD@T3n3>xqrVQCAr^7p@m6XMOePNz ziTfYMAgXjcqtAFX| zRk!+KTfRq>kyg!UmiSo>kBRhfN&%0m6%te^ddzC$%1&FS(ITZBox+o7-J5xggt~KA34dMI{ix- z%3<>8q&2q{_@kI!=5p$d2GlxD3i-%JgrdVkJxode-2g@B?QcoR1#_l7Qy7d)b*lE* z2g+Aod2ABPD>;RFP`dKRb5x}I?z;W@zsqZ}8bFO9Knb$Me)%429BF?x*$sLu2TH?k zH4OWUp3s3ZR0loFpw7Na2+Ym_$HFN5x%epw%RmXEnmt_c(^o?I3}StH1qGwOlLHjI z(gigc(FfVSB#(6>yEBCo4+jFQd&1+<7AMoWZ6rJ#%{ZT$nG_ia5<| zmFeLpX!*h<3!h6i5aBpd5I^-TFfwd7&Kbbn@I!q#yw9i`e}EAhN|PrKxwjM%E8^Jx zCDQlg-S!{GpLE(`I2ijsY_g!iK=GVHhu8mx)d51efjo!plm=TAyTpDW3?oMtHi=0i z{or1BOQhwc)C1JYLq_Tno$;&$LefwYbEd3+RXNT&YQ|hW$Bdg=1&99&w>Qy0|G-|1 z8KfQmD~clT4~R}rB|+eiFRYj@^1*<#lxC)sn)c&Fotm8NP58e_Y<*l{Y=UFdVe8P) z4k!}}?aeU8+7NbQmCP2V3~lE14dgV5@*%<8)0Cc4jovzH3Sp%A#48xg4a7?D1tiSw zo%oWL3c{9HB$tlcqe6gjrfB+@2Hm^i=)B$qAkhsfkT@qT1aXZ|hN|m*aAIHc1=m`r z9E9FpvA76%YkJ_S29Z>V*ontQddv<~Su@~qZq?Q`f_C_8pgOD;O*&R;Qt?@tXT^EE zGi-8)H?#RCmILaa#MzMv&HB-bAe{98X9!H2rFGU0#ZF4ms_mg#Kf-MeQ6_O{e9kx$ zfyd+w^{g@3YG?{seRYVj2_gZ|j&PPmr~yL=We3t6{h-~{3g?hE^cvq*YSb1taXqQ; zZOV@E;LP;1F8wryN@U5{!1Lbax#d}{g?mzXD(Dj4V|x&(P28QzfAIDrfmCNR;nd5l#(&UBl}K@D_cLWmF~LPk&{X3hbFnrNaRq9PsS5)~Ekh{F*iI1!_w z#>4P9icislE5Q{Fm?l?%(%+e_hF@MeKK&q>mKE*(5juY?=D)HP!Q) z#p<4%ON;)-{PQEL?$4PQu1zO`CxH6#b>hCWalk6-g_aerD2vlKN!*CBOil^q=k=^`oD#~5IKklBMNpq#ose#5mSp}LBbFkj63+YG zf*L{}03M7F9l2X4MFMMjoY5lFI8ReS!H@`uC=(#IkOXJppzqI~9en+tiuS=Q;W!0I zfmXMw>O9f4EePBxTvqdV@+rC2_O2Uo`f3a>R$_RqRb2z;9MF8YqnoK`)7UegqyG_e zkagzP96#dr6-G9h)$_cII~xJ#tY?ml{nRt{MtB{UI)*Su7WMB^+mopzq->_E_W%Vz zL^CWbt<#O#Pz%)b0?5IEZJrLEU2qzcB}p`&&zDpfsys@VoduQyb8vqbc|HfgkY8zGTw+Tr)W zy|%yFzCuI`bdf~DvWJSf0)NOr64;u0zW6a-&+*!aCe+uYB%YJDLQW5Fa50$IGI$Fw zWC$6;B?sq}AOJ~EVlhNp_1kw>|5S`}pT`%3rh(OpqVY=4oAz46pA$$EtkBF09nH5J zS9yCncIByg4L^-E?No0nW@w)j_Dc^Tp?O&ejbOPnGTOW$KPaoW_nBKfs1WRa`)uUl zMm4SOt|mpML=AfD(>@E2C$@cS2(DgxFWe5v?5KO(F;n+1h)~9*%{uYIyNExBDay0u z>Ky-L8E51=>Zf}tadpIZS~0aY%4oSR91mAGC%%&m7ibg*3?sn#wVcuw`=}u5IepF| zlz^wJUxF$Ut%8FrGJ=T33yC721 zyiekAbQcM4D)_o%&;zi+C-AA8Lbf#?H_Pb7p@YG|1KVgMSODIF{bC%N11HGav{^;S zN?%2xsQxglgcF^NNwYB9r8|ilU|i3HCNd^=sWD~Vd~rC)Sq$B8q@On>B9o(tv%LMh zhiDb;&Knswr^kYMPd%=(9jt2dVKXsh{3m8KWPaz&nGg4ee>9U<9ZHi?4^aeDiH|_3 zIT;8CU56f%SMM+y=-bs>r$-ANAOWicEhomx3;(TPNG@Ey5kH6yOPUucB$s2&#wDZ$ zk+kp*&rM(r_l$hxw@t&zvwBu2u2Y7B4E9;waqlnzUYe@z~Gjov2c;&-`2uGq2IHZzN37n&# z;Fw~GAh?3cjv6@}2mV?eqgKf>TODvu;h>9A;OHEmfv3*d8K_4Bm?u4qw3P8wr;Oy$#`SP`&nAak&Ylemb=?Z&0e~xm5OB-leyCmo0AT0U zK>=1BrdOAwE@(}}I0wYoi`UfjlVFA38^pT|OA*wV62DsjmaY$k#|rk{MYO**0;EHi z^wDq67goJyk$$FJ-+nt&y(rE4VV6ieTR@RPEC@%|9I7WUZlXbmaZFGE+i`-JI>XrO z?1QZdmW4n;2B#ZPdD4g5GJSo>Gu0K&y(KuVDm1>N=cwQA>ITOc;>qENx*`l|?BJ(C zc@?W^Ycb1M>@i67GWSte4%*lr)Lxz$;cx*Fq0Hovgct*JVFcF%)H^~5qOOh+fKvSl zsDj0;u72P}@hO4p>-Y+cbCkr{PJD6;gj*vyV9E?ieehkkeOCD(O8O( zh=!y5T=xP1FN-e=I)zh)`S4E^C0-uHrZ}_n z#hE=#(iO&#Kx?`Nu!RCA6V-omh}I)ZFsp7CN}(BXIbjM6Qfm*qLIG{B5Jfz0+$eYJ zaTJ~h&226vZl0~$>~YbJsM{TD01q-xR5YQ=s;DHNvz=6UNkqW-`8o+ zItSYFD(owmdf<`kQr!bn@OJ3fm*z*~3~Nb)+4-Xmd@A2=1D;^DV;Agar0Z~UdpW#-c2$|tAxNlHw zm=qeBQKbw-)}|gMC5`c3mR-u|qKA!)e!u=Itj4OwXPS)T4c!n462Y9_o{ttqD!L9A zC-kVH5Fa?zom58*=<3i%^|JU0tB1W+56_17mbI&D`lSaF zVc^Z9g|0LEucr)M&C?`WLB!g%FOaUCZSA+KfQVZKMbMFj^fxs zHI(X-e-{b&Cic@DrH0*ls_N`ZeHgZb4}%s#3LT-kLBrn&6E?4g6eQLi^QQXLtQv?I z$Oli~k~ct+qOi-w?R<3sRS~$zjCO`{#0jdcMc=SPy%^q}>B|TS7}Aw-tn~pgr9N0; zp%_^ktiW4QGdO+~m0FpK(?*AqdR4E@j$zK`)$bQ+&A=I8eGZ;QSVbp-SoJCllQ3te zXpg~y5{*nVrhZHAC#mOwd0;#*t;Zw)4<3>Bpy0(=iJSxw5G9QiZ}~aCu$X=Lz5^0Q z$Kr?@HYEU8LvI4P!9^Tk=59oCcv(bd^y(Az%k*I`?D`Fe>)hq4+n~0Cw{ui;#KrRD zH{>Uu1XGz^y*VY_=Qkg@;I?~^lN{8?w!l+y7S#Hs(?ZyyyaH?kY0H%U@dAJ|;%V~V z0SyhLI4-#TNSgWAH4}D5HW}!WQMW1rL!J$SDqk9IK`%+Cy|xu%8*~Z{3uyV!@2!F_xj*Mg_qgZ~rd5b{wPD-hD?|{c4dE zpzw4&OC&LGpQzE*`7`+i4oC5_v%tafjHhTmC?%nh8)%v zDqH9H{J_5bup_JvVk&a7MZhsyJk>0aj2AvqpQ`8NN!7LbEUhqqElTX}=bVZ&MUtBu z=3mb}C`(*isUCo!(Q;QtW@y6g)TriSP_J^7InU067zD@2}1T z=jxcFF@x$X>qINAO@IM?U;+lmh6yq}(y17_e{$SC$-;w3P7r)}2~>ykj8#$= z^m;l8dmY1iF#N1up#-Mn4{3k&<@&0o(&tz|!l&QKYXzW05qvb932-J2h%T8TwCNqeb|i~1r=GeXI{vSPzmB}MZ{rzO#y)fc{~g;%T?_<_k{S0RO^70lA`~4Y z;B<*DAlahH7JS`@CR?&WRE2Qdb7FwL&I`JSVjzfmSYjHB)PT2%Ie-`8GwpRg(-Y*| zuPt?`@mh(cF`HPelvS!is&~}-B5Ps#z4ahqk*PZ~0vlEy;PV!&r=Acw0HW$Esx8QspL`xyu~2w6`GY_3XcsuWBwFsGG!fNk zUsY=f213BmP(h3~QZl4I5}~1+kL2Hk9F!91R4u7jJzhWuK+c2_!=S*nXg@a(T1CtT zA0Wb;m>}bcSK8N}i49-lA-Se_EUQb}TnyW7Lz|FQWW5+-^$)?9@YGGd z?e`mF^8ViHA3<2zV*K0_KlgaYP&LYL=V1%?NE-<~_?qVNXR_5tb_vw>0w`qNyU7RP zR=6*9zonZsok7E@sPc(?wOh@YD%~82l+)qx?ZuPp>$!3$+f+AmKs|OyyS@PVp0SWVMh_;*Xq^pX9qJTkb2vl{6&)*z*$ z)YH#I^3ey2B7b7u84zT^saSLjJci;H6(&Zpc)T02zcjcj+|+&xIJvBav=k!|KqsE# z`6z&_X+kMAMqHbv$v91FDPpZKhrgevQ>`c_KOMF~Xd_O# z>8VoF_IU3Z1Mza?51h%B9Z?!sc)jaU)cnAo@a7jm{7zvfF{*5oGa>-$iBzO8%{4Q; zI}<*orcXO<3i(1)jF45xs<%vs0tU(Bn^+D0!PPtA0)o`=u^v|-?37Z_76K0k@6>QJ zDvBU5w0@|`%&X3azaU||n3nBzdW20$K^eI$C^>-#=nF4Nq_;N(rGpSXDmCp4E>bEk zZy!>q7Hw@y*C0FijuXQlZG0S(M={nDqq6fkIPi50o}bsVAj+lXRnQq8-yz%KG=k$A zEhR(N;|xgLgG>7doHWoYI4=o$9mKq3r-;->|;Xh0NVMmqihocdki~S^ui?*~TO34Xkb*#T3@60r-ESzv2@4XQ+b|MYjEsgu za3TcS->~7B61GeZmE=pI5Yy3z;4pZn?Sr<@q-GgAFhqvo_W1^|s5s2b@CYRH8d<~$ z?oSrBI<5(P_oHAlfAierivW_%Bkwy+g~i@*_?A3vwdU%wxVp*~PD2g+CLYA<{T8zo zg?oV|2{G4U3D0%f3-M8ch@Ixp3oi=8M~23Wj5(o~3QfEesAY@*lu+}hb9M0?3^ogE zc-=&ecgHy+cQ%Dqf^z)|#Z=KgU6a1x3|(7@o8hT&JyGb35EH|fF~yWAMoU3Pj-@U1 z3h|AyszF5zq+HChz%0Q9hw%2{xaKG+DD8-GK(pz1dtF$R*rdARjR4?VXM*Fkq8p;LhhCl8~r=$$*qExzXj5(d=3PWuV;9M>d z=j~oabnXb$v5V^c{rM6b1#6~(O&~RryTSV-CIM@7fl3T4UXU7HlG0eJnSup2)YUk) zN~~uvHd$MEz{<2luS{d3yZ{kJq#Z9WQ__#N>hy~(2do*|Q7DI+sK5y2!(Ms8G;uRQ zKFEtZ`TP){+qldJjty<3yMjrEJH#tgP)5vl_ZWEiH}LiZrWJ5V;GtT_tD*AJ zXLYxy8SI~<$D>__z1IbI`+3Z7_!>9cmq!E_d8Mm5C3%$X9t0CP;JR(G zIfHOvF|e9?7%WEn9eZD4hS6j|ipPJt?-IQ(N36+3c?1)5uKFp&XnQda>u;KHz4@SQ z#sVzXv4mi70Qo5Ne{N%%P?j=V7&#?Q3=B1Vm$oPbmtj&T@mb^YVon z6BAJ90qX22LCx+EK@A~DZ(jneiu?Fx_vzap1~M1iYAA{elUaf@xfzZyi-)^?=I^_M z!C86W-%r?u{1*T{Y`SzIO|BL9z&o2b@V||Pmfr9%v{c%A*yV!OgAp_E?usRxf+%`!O& zYHwgO@Ea6?s>qRmu@V0tYv3@evz(>f`BTuWug)*>ML9}HBi&^@jq9Xsm#w4kZn*&XJ-H87}u?4+Z~L zmN2Fq5*%nKqQ~{g(!OZ!V4grEDvK*nJM1Xz=bvUa)PvWWf%cQUoGDnjFr0_FYT&n*<& zQal5JMm$4KEH{sjWpR;BTg)^eWeq}AXG*Xm}|zJ3F1gnjg!&V zp|c*#L3m1pZlT~f!McJKy#-AMp~IG9s!5KUVmS-kRKJM3#nAysKbCPy3ReW3Oo?4$ zer!%3IFJ)ZoJss-Mn(e7<`FtztNorXq0B)DGKR}N`P}~kLk%Ji&5-^ zo1dg=>C$LOv}@8!toj%l+kghm$gaa^+eQyDXGjyhT;^WTMcARADJj+j+&gc5WPWM;x*N4ie`(PV#_5Ymn_v=F3T=&&La~b zp%(%f60Cbkn;CkW1=9;twr|M67agYa@$=)6mKeZTI#Sxn_k2C zNK!z<;!y%Qix5*m@!RJk8|Y?B_484qUkYnxxj<+2Y&cXH396bF-O@d%oUz491!}`; zx;(6xj%5GNSHOt1i<@Kco5L)N(S*Yvt@#?M%*`BA6eWO(J!z<)G0a0W(kZxJzd{~c zvY%0EHgTQ1=vDx2Hsu5_)aTJ+fRS6l;WvYIJb+dUzbGTE47EI7;3t&6Er7uqGI1W# zBeUQ#@E;*UbXZwI+JD?fb8Ow+X;^cwan|LP>Rsrq3*8joDJ!O*XqR$vr zrRRpXMN2Y)Ruwb83oW2c2j&snpxbV8yQkh%?Tsm5i;P?2I$o7c;0jv=cbLIa zw!|U;3u~KJpV(7-xm#s@#3<;3*ky`yY9%u6;m|m115^6dFJJ~lY;%g$m`eI)aTusZ z4ooO^B6oU7o+Uo8S+;D+VggYho%X-R5~)pt#O^9Y@4Q}C9T`e3%2h|S{ZvQ;o~j4H zC@Cy(m5oS=_{{Z!QTRfN@I$m57oCR zKioq!{EbVB%agqRXtvsHL|}{SqYD8#U(g#_hY-;zBVRgzJCl!Z$s$1T1F$XjYJ!Kz z>|N@3SsSTF;R~b~Aj-(4ql92t|1?@0);mGu zIRX|Y1UAiRp*(D~J!_n|Oo}%lWDHzn-h91CEsL4@Vy=!Z1}MZ5f)qkK>hlJ&XD=m| z_*mvSD4JKX9z5o0TYX`DG5-bz=+xEPso+Tq@Fd7#LE*9xcfHwMN-us6k*%ZU=(5>x zZL?Vpw%o$uWLQDH8|vkbY1y>Nc4&FAtAn{fbHQ8HBpfaJS9z3kBV6Bu1vB$Bg$d;?mH+tl53{v%@>C5>| z19hriV9O(;8Qbdl(GIJUF4}8_QHCxh)oGrg*b-`i`H!CNwRJ$T$w*vZq}l1}Ps6d$ zHTvM)`DlwxGi!Do&^-Q0ib1K_;tqT!bbSe5a0@Ql>bCmnE2GPuf|!RL2<0$c7AW+P z>CwD`GA5sLM7o7)oE-uP=CW?`=ez$b8qq91zd}eX)Z3~D&~Dim(f;J?%`sze-3F5A zrJg6~Q%F-Q|Xknk!VhxIwd5pawS==&`i8P|GPQ=OZcmM@PH) z7?Q^~UT%ip#8L=ih<{6}D!au*I8rjq@0<*By$GDDw@|W3HAdFHvEHq=2@pHg5Qy%t zFRk5{5B?+o@4mL)9M;{00un=|XA&{i>$$*}q+*KSTo9V%b~Iitng3%Qr0p?vxc6Ay zVF#i#y&;fN#)FQwtA2X)wV}R1b5Q+}DEbn@F-Vy6j%5z#Gre62dZ*~DnI|fg9&r5U z^E4{w9w?ILJ%lL!ovtq$OL5oeeEw@%k(ruT`3@y0P(Z^+Rz;XZKI=19@u{=X76Ile zQJz=DJsVPrB510Fpm=0@biR!QXJnG2hS=ta0%>fRB|bO~W0JLKKUqVLv;q?6yVcUj z9EFeQ)bj3LjhRp`XH+gV^9Z1!nMUfgi`8tdDKL*L*iShOW;r+BS-Zxof##U=N{E*P z$6EwjF2UM*M$&8+p_*~tNyiJ(buqEn@|po_(7>^xXB(@lU@c+F2bs_Y+*4Y;zt860 zm=%iCoAX%hso;Z7ilnas{+@W@S81)=z(N!E_rc*9ZtQ7c8FBQFnFT#A(dUatOP#y6 z-XU-TbF&(?AgSAJk6EH_Z!l49b6c`ajm2CyDmr+|VP)$k2`6X!(04k|8KMrB`i zON3U?E=~v-GamTfrTQBI!RwNZM=QUloAnDZqppmRqLQ&$?C!fZOzRRAWIkX}K>T0`wuH#k?>wWC?>Pr&5FAm#lSg?=jAux-StxSOyIX6yz+264dM-`wn>br3-TYPg>2G@*rtuDt~2VDfQ5e)jsbuZ-mmqBpx|i%*r>m0=Dg_=p$Bca~djJFXSH6RHr#zFJjYz!NX?XgH4Ur zW4dOu+2I7|Bu_c2IZVkoUGQL0R`^IfYTVZ%x4OY#YcLqqb-PEKuJMuK5r=b)fDGAw zyvq)}yL+iPH~65BZx*n=+;pP4i3hf-*p6|JZ6YxMlt30v*|zV&QSEg6p*gy{L-;l8 zLKDk7q?$5w^DE%-4!lHSSJn4%D@@s5>?7G#?{;ZI8i#B{rg*`mWIT+qt%}!M()Mg) z!ec(qxFF!**7y1SXxmp1J1cH?QmyIkYs`t!7rzPO;fY%{0B9jSE`JjXBA8izM)Au zyM&kQeDu_?^E*lmI-Hd|;f<0yx;;T+jF^F*vmYBub%zB$le54H`J{%CiJY_b2qIPr zvT1=O*zINej>|kX+kOUtQP=fm6!S$b?^?5N)^NgBE^^B>JXg;JcJY8a4e_6(7g*E> zNL6ISaj7^~H+o2(CNnAy2d3Z=^BgbBzwfAV?kKyK>-|D691YTccQHVkF8YSeVFYp} zYP>z+S5ldT?`0Z0_BG}hg+F;nk98jBeE%q*t( z3~Y3BnxNySx1^)T&TA^+g{0I>~Cftm8=FhEM8mhZu9SnC`=IFh&b{r0Qjy2iNnz*Qe8(R}@ z%(lDZuFS{vpVdpi62?HfH=#n`WCH6(`K0lKZ_y@0U*9Ndd`ReqVJaKITkWTwSUK&yUB>`pKG`ZC&|6e$>e*8?$A5Vj0ev z71K{4vK{S?8$frMK~lliscMK}iAR*00Dc>kbl%cRQWcn#3e%3x4bR2UmbQ05*=RA? z*hp`dt6_=6hu}Pb1l+tbVMhQ!O$3^U)u4k$Znn;KVw>h`cepPXT1l^Np_=&m6#UB7TA4(zcs5Klnypx z1X>t?KEHi*jL0xHG?OPUqpL@r|e zI&DB7BZlbT$j#}M$LL94*23uNJ# z+bd9K>H6W$Glw^ShJt|SYb;vN72FBD!OFhk`5HbnhEcvIbTO)eq;O$%)|H#Nf;;fs zGI$?37divYjr6UTJcLI{4ORDKXnMJT;(!_HgA-K1s21eUO2G+&4N1H^NxP6A9f#K$DnrT#+x){4j9f2iR_}Gb2Ul`8Y ziJDY!07mBP#c;IAHrKmf+l>K58r&XG^p~|!Hc!Awi(K1j#duVZGjLAE@r5khv%6IR zFCC4%wdRc7-8o|kO-7aE@PRXn`Fei6%Z8UWq5bNC+Kjs<@O3v@@}_G;17_-PF%(O+ z%fpU=jzWVifH=zRP?w&oTwsMM<81;M7%^;l`fS?*8STAaa zF0wnUVXqH(%ISDW2#G0e+d>AdG?aFXOXQ%{#J^~b9oYI3$>-q%KKosU&BP@4L-l>G zsD8QNp)$8+! z)5!-GW7?w)AgGcF|1$63m<#_rrU~<8Q%7dt4o{s_^@Qt+ew!X1$^;>+!ivxQ|bhkQdNf-Q|-2c}ip3WvbomWuAuN`*>t zx_XCs`1G;Sl$lG|p_Shp#~%2Vg0we#*g!1xe)xhq*!mmb0$$`GHuNdelV|G;ZS5YY zU$WoZ7{oLZLHTc}>({Mx*XdNI-)=={@Y*qa-pEcMiC2&3uo2k4Q81|Sc=?{l;`uHi=oo*h#*wd#9i;7;NJBJ?MRiv5jYSEAn_zF zuQbPn+otq6TVF`6PX?oE7dpMN<|4458*j1Y_?J z(tvh3pc;#c2HxvJ+NtwKx(JlmB1m=a44WwWmN%{+%aC(E5MSMhVxVN7ReFZr!VMpO z6~9AFVz-1nS|P_7FPr=m+|xX8gR)oY{kE^m4zVb`2K2zvh#u;Nz~7`Muz*>rEv2s~ z;MIMPmFZk#iLXEj%*cH>K`Y>msD#bqhnFQATn6w|#2E9J4>o9Ir9Wa{V^E|qy!QkXkeV9?NXu&u3f{x+dff*1nH^~rxzt=aX>x*&SnHk(4&ukJGP0q-*)t>-|Ct(@~ zM!XeNOh8;F0pq@bh#xu=1lZpHnnLpfF23TN+)(UMcx!luXhs1bFVK?8ru5@YV(BgL&pzWn&(k1yOz zdf|?4fzr`~gi5VP<>PZ=e57<5Lv!n57eJUb4vB#QMZ*Wz$4kju;Ux(DNkK<=*>s#( zfmo5EC>3YKQO7Z@TIn+j0`KMqsg0>-phAjzl6Jj=^l^b_Tc(IDq+L+GmNQfjFi9E4P z^R2TW%Sg_mO)j^Ie6-u?!?5)&d>U(KWHasjRoP8Khc}{QvI%eVzFi+=D?2D?{kAVN zG_um5XR{E1r{)!NqTF@$&+L@bgEiOj3`^atbI0?uD@en@Bx<$70K%}|4dXHik0gQ< z!8cIE){viv5MIRE=HO}|0*m}y>v5~yfV%l;LwT5S<8i}hmW1t8sfj0({(@J@Ax zGe2NXCN83h1?mKxKhnYb1KsDZb)WAPzL*ywe>Spc=hYr0HbxBMRV%osIf@RRc6vzG zk?N0Y%YU1KrzRE0_+h9xv5{MC#y|`H`^|_RIPH8(>ftiWOi+iy1?^`v5OD*G5c5j# z%`9F#2PU{TA%atshcz80R&+zGD6!msc}2;7G+U01-29!ZSdZc8d|+LYBotm)20hJh zB<@Z`xQ42@g>m7YVufciym^=<2!*dpUTBL|*2_0ggIA$smVb4;|6cSQ&C%|#{nJEy z;ynN1CtWk<5scPlqVKLv`3%p~;5t`Ttk`)ln`!oZ9A!u|^?BCif<(>V81oD!*xm=! zW=H~w-Hy&u!L{nS;hT<|LtEJQO!TCnoZZeG1loH7|AzRFIpr1RZH} zMD9zRNTdd+hyueJR(L5xp3wYMX@3u?*wBQ1fDPGY2h zA<;TMo-9Yfhv@)E&uPrsA9)la!A}q1^lG*DBZK&k1i-n&Q`NmaSO?E67kA~&g(eKm zw2wf5d%T23a8cdwq}oN&$Xv}c%Y4k5H!)|TPR#&h$t)pIA?;L?|JRDdBj4G5-rIe? zjZa^?+fSam3;Qm>MwlAI%JsLP294ZR5Rik0pkGrJJx3|>cJzO28#U>~C;Fy$u2c=O zFEoD;siv7ERQNV%VjG*~tusMgo8TW-un}!sL+zt+gyT#NpFYE|DA#&b_K3WNLM!r` z_U}o?Blumr#1|*?Q0Hi{G(xJ3K+lsXY|o5Z=a=23Y!rBsqc`A}*Ng!aX)tz4f^{oU z)bca|3{R2KFT808MubSx91a%0oZEqB6W;q z(Njk18F_?1M;@&TH2jot+x1PzPE+v1?ym1Qh0I8uD41@AIh%i)f(90if2ZzYorGp|6nlI-9q#7@!w7Cu_iDy!fUC%m_u4^|IPtmQkz#QD=>tK;09I_8CnQ|OTbOTwC_+1&AqZlhxBzu1CV$L` z4AiNn7E!fv4Eaf;aAuBu7Y)7l2~oCKy|g%MFeM7A7Hy0z@^a?M%VB{~p%@kUIYr9O zQRP!D(-*<_>$yJ8(Pjakn4M#5-3~@Ra*Sxr;QWm=WbA7r zZ-f{lcj`e*)yuM|uNL&-W>Vfj;*UdGCNi;!mg{5{Eu%S;1j7&?&99|`%8+OjS=Nra zCA_5RFG(8voZzG3B|?o%c@@2~!$;N!ygWF@t&8CjNg>u6NxRI$w0Y7hFC-TQ>AjK< z4kx&DSllGGz$a*BtU-T`t%!m2vXQq@yVCZbh+C064wqt1kABgNav%+gFuCm!eA$kj z@JzndSVbF`vn~u){KZQ@{aFKuR({TNt2ujT^A-iG2-86OoPfjtuY- zz?Jp3_Uc^yBpYjy6zwP(9hYg^1!t?2?3p-D2sf0mQ1RT3c%$b>&~SDa@(ka*U&K(uC=+)DX&z!k!z(G-N2&A>+qzAH@6<`z|ReKNFI5}$J zTP{*9Oyv&2uOL{a@ zD%fM3wEIdZrsOHEFqhKG}e76=dfjtJJIhnqTysmccp{p+ci9q?PFFl$|1I7llA_m%?}^v%o1zR4=}4 z1JB~i033@iJ4LbhR*QY{ts)>8U-l3mmi7$yKAwmHou(8&V3e0Gf zm4^#}Tziz2PAO50XK^KQAwa_WsRBKV$hrbb4hqR^p4i-b^S~sVfCn6f$$TO^N^~eL zq=K3~Zg7fVo@F_!E|8Br;-1^k+X=~El@U^~GzB{{K<59K@h@GKaacg87(C92R_*yF zTu>_Gq(I}bYp=>S@j1n=7d`-N_4Dkj+8N)=_`a>47C+n1QAX3<%xNxt0ZW_4O`(Ga zcjSvA&{@!Pc2A7D?nNR14}Ce;0g=V?+PwZ_(=A}3_yBEGAM5iS_Xs9-8>flx)CKea zP~xbC%d!Uu#8Rtoxwx0w-a0`p)t%9YfMBR>jt#$;kI_f>njD}zOCEidAM6dbegWK8 z`=IM9hdy`8x};XAb8?5D-h)^5%flez6l<<$ks-R7lT?fbg{apI+J)yac365gin|#L z%N+_Bs5x>jsZ~-qsOcbbgr9H%wz*Q4_+W8I&Io_@FLbTnfjSYkVLWh4_rMt+c$XQP z6v*Q~@}6zGWOP?z)J*#zgdO$NqCfRhWEau7G~D{A&IxzA6r4bh`=A4_2haiDDBRT# zXHS}cdfz1=w>TAGYQMPG6&HLKY;wWKGh?dBgZY;S8Cr5+CIGi*`Zn%5Pm;~&FUx)b z=Go~6>wrmXbi59phS)HW#5^?LSz&LoNFnrusIG*6RDC0&k#xpOo`P z)O{jrLW9us{|Q(?-UoSLX-hM;JhL1KEe56P{yJ7chr= zi%cw<8?GQ-2r+@Q zSDSw4P0&}sW(KDdwGtx6!>i1&)k+wcKatU?dL0+LiLW4qz7$kleSh_veJSq=V0C^o z3^8lJ_;DVD$4c>Z6X-b*J@F^U8biGZJ+O&%@RbptY7NOkX8@k9R<{c`y2bFm>MSwW zpE3ATzxq9oKnyt2HL%lTW%I@^aF4MCKSpe1Qu*qp?x?mKoXzK2B-b2sgz=GA ziN?GfeocSxh19*WH{B-3zb!kjD|gurqTO8L@W4AoKg5w?igM&A0Z)nsr!cl*wDJ9V zK-C#-sff$4m0{t=)uVdBb-;_IL@Xs)d)T z3i07>VuchIsb>u*5zdIudu90qykPjVhLsQj+6%$>i5*RP6*UPNIq=a!u&Q(-4$9M9dFtq%rZ<#8M7H6l5te9$g?9 zMQptQi8Rz=Bru78xpx$3d&ki0#}WsU15dCFmYA5{$erTK6SzjN$^kB)5(58Tc9C#gV9ui5ff%q?Aq&Ur_AcJeW`u7k9?3(MDP|T ztHe*0dghAxu;dAIh%a&cBOHOU%Cy+sp0!u&+Yy`TM*j)A<-y`5e9+~$(AaC=l(#qE zO{|p&=nLRL|8zMQjmTc5^Hk?7dQ5V?sYTOCGF`5ZC7`#LX{FAJsn6og!>hJ0tf)qV z`s2qTuAkk|KKdAeIC?q2Ra7OzM7Q4}(GVy4&ybeMm3R@VpD7C1tSq-X2}cV~#ylB| zbLH1@F46%*O2LymK5T1fQ2*I!I#jblm63DpEuZop-s!7YzW+r~ZOyN@)^3{I_*H8< zFnXoTotXQfd(E|f{s;}x%J;DkgammRV(48YWuZ(&ujpJqtv#9Wm}xSOFB1-T22=q@ z*~OgvHmKa#Ju^YTn{LeA#;H13~H zM?q1HHtP0=D#Nl6m`NrON|z>3vS6m$|M5`P{?$WVyo?wL+%Z48RDEl*JF)!eZ^j)W zKU;We2zkCNg586d_9AG2Ho*)hKFwff0JkAu8!XIv`og6N6qn7G=4~TAqKf@UZ z&er)Q1q_rpvCaj0$go~J1nDhdpWi1CvUcNmuq`B?2JCP#qWKFOVqS4@PulZ2TYU#_ zslU-)RDDHH_(zD3C8B*$g$H!L7Cg|Q)HyAP*VRV|Kf}tPsOpss>4WtYzh{+g5Tte( z)osROEnCvUQ{wR-@8UAp73NlY{dM6vnbBr*GPja;(ZT4**;Mn&k+zWG90OJ~LG}tr zKs2dp1&Dlo{WwkTpfVCN`y!V@WQwP*p%s3CXtD4NTPckVtjhr2VmY6_E7|@`UcCt1 zjZV$R(J^!o5h|FFnBd{d;ydD)-uLsy|3vxXW}y(ZsXxxSNcBeq61Hdi2)A1tKXfxq zTH}%8<`*o*qv;MDj-$Wgg2HcH^i9NGC-(SxJy;z{P!@eFP$k%c7$c6tqSi4Do=1;w zVifYpYFW#exm4f4kilmDf!*e~MSz&c+CF=Fgzw%!4IyT=1*9W5!A3u3)c#J^QqB+x z|HA9ar~|~cGY|lH5NQL9?L@=#x`<<(p0MsgLl%8Ux6hH0z|^H<6p@Zu{j5RTNU#x~ zs(os6Q9DiNpW~r*T!uxc!Y-A&_p-L8F{H+$NoqK#>N|qNbZ_i~E0>Hc@uMQ~q2X^8 zi3_9(z0rE-;*6q}JywmEsypM9Sl|Wm&IK`8rRYw^0IbXETS>y5r;HBa0yn0DR_XTQ zK#eBmz`eHwV)vp-X0-al{lJaKD4=CS-P=9Z9N`u(&;Wf_KNN0U*n44rlOaXfEi4a4 z6v}6)6nP1#+o)WYw{LqZSzxe31ta5=LAu&8A$aE;Yy^$Jo(jGK6Y$&M87MCZYY0@V zK@&-Y_yfNIJw@`W=~*rusGiBK<>C&R8mp!r$%k5{&!vmjiW`1Y=bi3V|4p?KC9@>Q zBt6P8S4_RlMh+)~@z{RuH&V-DL>G%IX^M;}9E3yGEvqiZ(e_NW`LvD+ z?^{`Y8Yl$fz%#gBfM>y1KH)4PXK;iCAkw#k#zf&hL-2x<;N#cIu z2UZ-Umz9SL8gDzlc+uu~&0`YE@kZr5o{c#*{pSH5bVR2GF8Yy&tQrpA*h@93A4Bl< z_RwsdGHP(Ap-zDxDEBPRzEo#oEl#4NUslZ0!H`DA~7|Iaw&H@|k+IJ@Zl$#@qL&?mqS@U>HB%o5SY=1g!0N=rw#pu!%*= z_r8Ht$e2f&EN=bJ5JHdTL{9Ull;3L~3(k6LKGB7u&af?z^8$YBZAENG8|_;c7&^lG zcJ2h}`qAb*IDPU4QBYXIdv2ug06jEQ`efs6z|j6SZ}V#4hpY%EBQ)xUog(-fPfW0 zIBu1dw+ie2n{Gn?cr{>ATRl)zH@(Q`=*j&<)t@7&eW3>EpY6wJxVd?ydix-;)oxJj zp_S@29+rbZc2t9Bl*{QmGO4Bwv;i`c!KN7W;G3M942>FS>~FDQ&QQXJC$7ONS05UL zR?A#jlN>T}kb}mpFfI~?Q+10!y$xax45X&&$S6dvm(7$Imq57~{)%K?vqvr<#FAUm zgoTt3#)2oFDISj(J`P3zd}0t}80+1eV3K?WR~=%eBFn06tX*T_JNPp__l|H$yLgTC4T6vJVe6cIPNLb=at` zB&SO@qz#_WTX;GK&tsE$`}#lYRZpW%LeyH&3qr2Q*af1`YSwcA2Oh$v~+t^tZT;`MJ(gbO?7vpj{$(e!=j9phfaJKS50YQ(W}3=<_9vX2xp&$uXtu^E+J z#?NP>jGlDB)Z!`k07n1084Pgr>yQ$7wLoMRmfx#-&ITi(0>q}Fv}qGu?EY7~?u}$m zQyd>pR660rInyi8lOoEVK}Md^!GJ!e;cRQ?B9529)u`3e;|!WXJ!c`iLg(4EqMQ#q z`pvGRv=sF$+FScu-8I**$!i?4Iin>|oq=WqyG>4|%JYo`L0wTJoem4OARICK*5RL> z(*~8ZSx{Edx6lLDH!5{7dJaTDMzWWR^p1Bqg5gdG9Zcz%K0+A($Gdu6UchCYI$kHC zU<-Sas;s&Yss_W%)aUEr@K|RsqJR0Mri0p-04q>UTF{g8M;Lo{jC_79dm6w(FtG2p z>=?0q6sX}PlXmiPJ9W;Rie3j^w1A3ioTcH1auOF3n^LgBbg7D4!U8b4zS13(0H2;q z2N+k+LeG07GrZj6fm@Q1Suha^qtDq8s?~kc2aX|ixtO;f8-Fc0Fo3HrMcnvZe#O?& zqWuHE3SWq}`kQ_e%!tQ8hob$n?ATK1R!ju}^O2(Zd7cf+NqUP@UW(za$&4qE3)ab6 zd|?p0SU`kwAykEU^@DvD1y0eAU#};#=HEmX2i*coGdJ3Nlm{C?j)W%7;xi<;i4z8E zm3vGmr~G*FN`{|39U9=z)RDohxA>)hq`KA5-jQwTLf&1-yx=lF9hBow;TyLcsrl2C zD0>V6Jgti(XU?2`eER0}@l9wRY<2Q~T*_W}vdO5?k0={{sXsZmheNfC!{dK4z&Vy3 zNMZT_V=$O~2vS%iSdg#ciVz+_dVoZo(uMG8x81;>L?ky@y?bzD{PNC?r%oNr#1>lz zB|L0nj-Q26LF-K_;IfwB)%i|)pyT7!e++F*o-Autq)C-5h#MU^Zk5f_l%DrJR9Hfn z!S-YxvNXz~Ov^YQc(;nxG^H9z!hkc;j*Qh`tdUy)-kF{l-+6ZIMiwGA6K)b2rT(&6 zpaP>w8DZ&1?08kZ&_}NzRHI-lsu;7+o$smNpr6e#73~vP>A*y?*;()yU z;Je|q30dO{i;!r)H+{cw*@LP+oL=pBk_YV#y~+~IUfgiMPga|-oJIap-q)iiU%|B zL0pS5AL#5xzDit(AchzY4MlgD9VHn-#G5rJvg!@t!ayauaDsIB5M`K zBGvfW=r6PERqvEHxRVoVk%;a3CYbaKyOb(+6DEWyh$Wza@u$NXL8fBLn3&EUZ}O+R z$=(uf%QNPj`5|D?em*~0y)m-54taM5{99(4_>5pgV`&W|f-826h&#cE#2qGf6CZ59 zdwHyqBh8O8V9@bdb$~=5VGxBgto>pKR)~4IzVIw0DI1IIh|vaC{2~V3X}E+<1Guab zUqO@OOlb(3GG1Ii=tWB^4~=z{j>@=`~2h)n;44wzP9JymMdtY+77K!RQXe zl3*&9?MGw(iwkBaP#(AUXe$v5<_Gk}h3DexiSwspIeYEA@Z+w5w^ADo%abo8j~Srz z>-~NOyab`ZWVJ5@2?tN|6#%}3XLt))!SDTO04>U2b$i%o;9Hmq$Ow?$bK5x4a9>W_ ztE3ylm3R$Q4uS@;mWz*yMZgQYObjGYL;yS9@a5`x00RW`Nv4!T@&N+Iwhxae1BB>; z%joo^2QdT|S+G!iJ#`YR*>x@ruQCnW!**&2%Yp^cG$?ajJw0-{WE->U zvzNFlFJ7iih8OP<8sMdd6v+&(ikOdBK{UbIOkWobbZDtiMI&}W%XTOS#BIHb?!e%C z)j#yr3z+{Q_1}cdAI+Hx$Xu*R)nbCo-06_HSN#z3P!;Eeo#5Qe;#Z%v+%;^b#2OD4 zfajjitFqf%N$BzxKV#XhF&}r`>h3}~6{OC^=9q;T)rg}~V(^Tc0nQ1#t!+W_Y?O~- z(-+m{*h7R9bCu7nATPgx{&2(wsCvsP=Su))Y6Y#v)eCDhm+bF$zfXKV`8b{k%(1I$)S7O0z4G%c($Kr6TQV8vm$T&r5c;0kDooPRyT<=ff-|=Sd@=4Q)KtyI?FOSGKLt zHadvB4a8dohRBjW4F@QL8G!sS0jWO*EH{2MUm;6w%>am*27MB-2bX|YB5DlUfCa)2 z9w{!I(*_P89t5!_@WsAUbTi*Eog@%k=Y0t!`{4Rl7VZ>X(WemPckrL@7nQG z^)B-dx@-n&s*j)2WeBQ6gw7s!0aIm}mf=j5f^<>3nMN{>u-m$8 zJ0jxKO_A+=QB)v|!F5bY69m8r8D;uhkF943D4?hW<{w$+sk%Dp3a#-oUlpN}hLJha zvVG5FqA=nmmxwCzbE{G20%K@26J$73Z)d>#1axQxz+rpZsEdGjM56ra+?zB8oP1+f?fe z6daQhZE+qU)C~gLv+BoMq){<7XEH1Z8-C5ML*G!M5>?VviZ_)iNe^S>AB~Zx*p#DT zacBIPaUB9Ycu90%5h0g5@Nq+Gs?=5@0wP}4v>(S~W)BgZ4AV?}vo0LGMn z%Iqgmq%Oe5spG-t-!~Z=_7g&9wb{0o^xKA8HN2&}Cva~@0$hUyCnF9{mj)mvj3Q8lX~LhG z8z&hds25hjq>hCJ&KC@gNC51NF%tnTPBD`vAyt@F6YCXJ30ws=BTTw)l8m@o zk1~z|9EO81@ z2iQsTb>$LIb9~MYhh^&MIzuaKJ@HCkH&drE$FspIVNE?W5^)#m4m9*i#C480oOH00 z{jrMG(Z=?%9|9cI(ExLJ?RW?sd@%gnRB!xl23p+#jJX4+*pP1Yy@Yk@rNwkZ?I}*rYlqPLn2>8G26F4!O9?QCmb1aZ z%(`LYf2t^9T(GPdh3pxi6o{G_06g#7(JYIE1Pnp1xJv919-~l!_ihj!4k0Sipd%^* z<{eWEa4%Lrjl$J{$fu4|VSYTt=*WEv=79(YNGWlJv9zjt3i8y>xzP$rZD>04293&e z;j%$`ncN}`M=g6I8-CM+)zmZCQ#i(8oF?KY z0??ic3V_YDO-zHTnTZ4MQV^{_*EA9iqM; zzvf^f3+lOUY6MK`HVg0(zOM2*$-J+_H&7Q`Z(s9SBOVN)P#e}|YOAO}cooGLj;No_ z6xP_thKO*zuGE{Pv(ige_d(q7zpQgnOUZq}Im5jSRki*74hbL* zuDGPdAb=Yh3oyUB?qW~lF+BMqIq=s~_XPN-rYxbN1V$GB1OLvyZ2 zwxj<^#}4yP`wmL=m%EDMaD8EN$mym5w#)_L0gJ((4z_FBs&AaeO&_WV7C7x%;3mAH zNQmkOOZTxP>Cx<`=F6t2|-|9Ee5!39%p{!0Hwj7)9>lBi1eX=mP)bX$?X&Nc4 zd}5Ys76rqQFyML72Hqq+832jV#(Rmo!?xuP2+kxt0pC=ogy38593PXRrI|6IF{X4Q z$&-akECb<2a6PA)o>BIZn_V(cdX|rvI-)J?;(9k=e<;_*#oh(RYKFd``>Tlp&SH@g z>ibl^Wm%%L@SaeMMC&<-U@Ac}%&~vPes!T>Zd$ueX^iTL50a114Jm%>^Xv11)H-V% zvQL;284``m@9J)DEedGhi7; ze#klI$MT2rqRqnOQXg$eR4KYmX?uCJ<8)FxV(v@=(Yk2@L2sn3ZNNV%{H;4DE_JuL z#yEAcKuM_0|6pzfeeye0+;cIrdf|B8Rpg+Ay9$+THLo%9p7Th*ogUJ36mF}27&O~8 z+G&nOaEv(~%_8U#GEE;l9`myu5ezNXho-9HLs=f+yE9rS3DJ=9Qs=`ToXR&4FvFpO z%4s;MLEOR==Zt|IFzsoXe1)!L0FIe1$^@LrNRY7@{0d?h_K_cmllO*GBzAbGQ8KrG z@h*fpDHv(*C~IttAE_)O<1;^%awtC6J=PCAFx!%6SS~*F7~4TOdLnj*CNzUJ-2P+t z674`w3?X`_E(mxDLf94*Y`F6C-IJPodZp8|)A)=!pw|SFbjIdi5r-bU!F*>zaP`UGv2H7)+S(*Z#34*LC zYx{5xzc6SCbLb{^3d<%b>Ed`@1_xt!YSdwra~0dsOCpjV4#psWtx=;7WrcL=`~{{57$ z#DTu4hKEf!S7Wr02802QBPpkg!^L6Nv84a$XM?UxJzgoISFuZ6>ZJ|rcw1djvU?Zh#ya*^adF2z4txhhvH;p7N)HiW9Yu+z?7K%908C2USC3ND%Bwd};Wsoc^lHb!qt)Ae2hh><9O_*X+T*mB=STjrBL{|n z2Im!`$nW-Z$jOH*lxgqFj|K&u!vRmCs8k;>I<+w${#2Rw1w5(tq$blYZ6a<>!TN7s z5a5wYl>wnCG~hPHUg!?uCM8&u6pN}<2^}C#JVYozN0*%OU2DzYZl9U>Wzi6~K>(pf z^CGsoL+2ZFi*cKvEzoco}waMpOM z`h53br;{nBro@G0P>dU%0*o;h+;pMRjr%YRuj&m>!($ncA50*DM@*MS$kK%-?jvKT zyxIJ1){#Y3@7T7Y8pgP~H|WF=b00_&6m|9kQxe<3DI8)Tj@cm93mv1`?{$Cp?UC*z zJA&ZQG8ta-dB9}TLFO^6wmNyO$e`9t69G&u=Gf@hV*^)RywI^?A)r?Ki9;nkJ*a{1 zT{<#zQ*|V^iL~U6)%lS;r6vtlsBDC%7p$hF17Kp+^Y)ARN%KVbwU=xNm#xn5e;&Qs zNW9AkGgeg)QGKe;JB{Jxs0&0r$)bvCNi>!@Y}-sbL-FZ!yeBCI)dQrSwXvYmM!HRQ z*bgbQd=D~;c(t5mK;k}6q=fUrL<2_|MW7f{w2N+47sKI=%&9Gs3Qha@4Yr1X3;$vj zvf}XgSOBP#Jh(dNRDh6-F>s3cS+vLm%QdX~-d z0GYWyyeO2bKka+bK!RB@fBUz5skM4(A72Gz{4;sesXqscm-5J4Z}#59Y!1d<+izb> z8Uqa&liL>DDz@#T!dO-m?}j$npn7w+ElhXe3wZjkZ?zG37^h7Xg9x$)3Gl>WM?yKi zp4Dc%2V@ASIS{}IxU_$m21+6)<)4vgl0TolQ|J(UQgn4Kql)$z4{7zVcfW<|mYJXZ z0%#EOdqK*e!qb)GMM1MB<|Kxqv!S-G(g%Eegli`i-k1xD*Qbu-ktW%~{8)euX4k@} zsy_l{_|Eum!*D38$NO=P=dADn{>K~i0L2-bs?i{J*5{ecz1XtbU>6@~ublKaqTtZj z?dB$2#@j6;l9Anu3}#+a9G3;KX8Na^sq5%-Q##$KR}%mw8KdSfYa*(~M`{Lo#%yYm z>Dl#?rPCD&kO;%ATz?e5BLEJ@NNiEI^?fVycOK>4PyIb4y|x@mA^5~?IetPuuQ!R9 zLCtcxtj~W@%A4ccHwPCHY4_8}8>y_>(`N$mq_tU4zoZ)JU_^DkB85trl6ZD%Ih6~uT zPay|P4lS+e7#m7-Fc(_&5YM7$_{69^7RE4^D1wn}^kNvWx)?^FZD$Z-ilKKy2%(_b zFetL7!As7hWAl%NM=2;I9zM%c(PDqxB3w=rGba-frV$QwG@;@!4PrMjPNWNPo#vl( zLR&l*QGs-LxR)U%lkmakekpo5D-9)maMl&^H5{}Vw%#;z(eMI#e(k)M-9tR`9JcOE zx@k6CM+;GGl9`1Yq8lYdCSisBj_K2~z1Dnq{UxF6v2_BRkK6%K55hHV60TFRR_|jE z2>e*=bk59DKTK+E1XV9~ji4(>q8fWGET0?Au=63JA$$aD&)P?zHVLLgorl^7H8s`v z1jTR3!%E(kDxYi*=38?fN*%%M5t*Ot+jDC_NuVdl$B7+AYziw$&Jq6bt`x~&>x~5; zdTcVX`)}q0bz1>~9vj?d&}4C}H`kdf)}hOU5{cmAzJ8kSh6?KN*Nc$dFi(48!H}2> zNo*CX8_F!tcp=A&AoA9TZ2kI(%98-5&wGmD3sTX&)`|V` z+{UC<^CgG1uMW$B4mn}2MPU# ziX1>7o%GY@`eyc<681{-k&^COibnfUr>ied;j@cq)?D>*QV)8=CDg^WIp8E(gX3@$ zKg>w3*f$Y3zHK=C!c0n%$GVwLW~I|(I|R0I`_PBAZ>ALAtjlru2UEy&ILy()0QG#z zF?%ctTY%h-!NsposS<4RqV*Cns8v|Q|A>&?rmTYxwV!9-32{{>hy%X56Fo^_vEhyi z3KDg{`t73qkuQ`n04UlDX@qPk=VfV>Q-)-_aYPt!Cp??@tV8WrA7&w z4`7NJ^hS$d_|X?e54Y?Hmor@&6!AQ*mS>iWPv(nL817uBY7E-tb1-Q5eAw->@E`|{ z-JP&)7JeU=G+@HKzI-`*-qI*#oZvd-b|`Uhk+B;{#{qI<07p&> z6zfB2vGD#50>Vl6W3KiL^osVMsmmA#0p`_51|Utr6wEHA++?yuPhK6LY^oIIFyqc6bCapjN0~bDcB1jDgH?uKK z-kFUVXq2etyBExF1>YjR<&V-I6~V4d+0W}MytTgZAMF~Ks%@9KX@7$SvWTx8e#{b~ zDet58L*hJMXk5uSUQ(m&+q<5C?ANj=1I1+2W=$z-=oq2`8aGsECToW?@l5g;ObxFK zfiKdc0HDa|36VnwM+L)=^CqZzh!5171AL%Hz-=*dAqr&LQM4L(ZaKUsFUn-As;S6D z(?6Sg6tzQUQ(T@eCvyflay2pi8gY5w>UIOW5qQ?$}9ERX&0pUVXV7 z4quyh!i!~L( zUvirp)C@kiXL5MOw&Z!l*et`F*WOA64xFCr?J@pF5!h-Vub#Ddy=Rzznk_dn)mGYIn zS!Q541V`}o7`u8WLtlcM;{6tH!nM{LzGtS`kl^G>04IBLvf>S})MJFpI3egWi!hda zhOLp@Oc^Zv><~HN%T1qn7^XcQH;kmZeF{tmw6I1PtmrGh)jueVa9x9hHF6oWE)KI! zJ`Bi1o@Ww{P8QrN=5$2vFtZgz=A3TUFO7}!$4NrFjS?Fsj+Y_wmnSbX)dVyKSJGwGp9mG6 zCn1lWl3DdZvd|n}%rxiowQL9MJ7a`^hBA5!NiwvU7&wtaK!x=lS2Ark3(4(O&`CX*s4Ch$@ScFzEWW#4rY&4zn#Ix=+=iTF{D8$4tHfqE*o%$UFs!nf%i zfp*sDPrNjXXEX=$PMgt6L@zxGbt!z;{Q!%CrA5CyzIyMA7z~>xzMHIBpfM6!n0OeWgsVe+^HK8m0?zYn-g-Tvz&HWL z9pOdbMM`gs3|O%U&McQ>{l0q(5!e+{sh;MXxG-W$&7%}XeEaH|SfXFDG{)HhrX2<&Cp z&`6tCf6fy^ADdP@+M7Q1c>;naC+GpWU5bSDjmxqt@Z^|t0o6haQNyc1$xrrcIwtgD zZ!swFl0}6{u=J79*|ii}9*^`IC&w55e;Acy$8dOg1VpMkVBx4YL^q;11&_6~rX#BQ zltPAY)Yu&ke>`VzIgvE9q)CM$93|qi?~L#^-$?(xmFl;Yw)FEX7lADo0F?oZO3)$` zZta<~X*UXARi)7+Xu%|ip3xWh7S~rglZ7>gmgzuqC?nny9k#p>TT+V9j)rf@!`&2% zR_72Ppv+$&6d6JF+wdRZ69!ovLcqih027KkFd$JSSS>93MUZ9xrjgb>3%HIre8`51 zj(VcOWv4EN0D18!gqTz`DTr2!h5+7plv97p2i^_FQK6jg2XM!==#_l^Br%0|;q@>< ztZ4U}9|0-+X0HZz>F4l&<|&d1{0XQOG&X@cJF|s)Q-;FFECjp3fKd1VUxY)0TK$9P zgThv4V2@~gwvv&!ptwLI5zLw%CN~Ja>P=|oMf-ShVg%*5jIhR0p4@p*(c@o#vVoRZ z8>|}NV0}~@SU+g1#js8Zd{|cECw@^D7(~$4Z-3%7T5qzgq~n&upDieLl8`JW=`__u z299N4zB~`ypbN!X5ep%UVrMqPn0fPUz%PearTPF3Rwv`zpPlOi>D zmGikk%QVS36F8hJ6?j7r*?_cgrW{9>GKG;hv^Z7IW1`ms-NG}`sqS6n6X97Q2@q>6 z4a1$f@^~FN0<3R9zXpAS zp zj&Q&_XsG(qz)~LN>Gljsu}qvbm`gN%IGI2tKFo;o??+0tXKKs~;c=KL4y(Td|KzA3 z{$2U-%3wQS=z5NGN&&h30L!~^6XhPgD{q}&Ec~SSyw}ih?lm$g;?pv7G5BnO# z{Vl`cd#1@e0ec>UPZ)Fzs(TF#xJU6{!+-I1&1GKM$p;s4!6RNGV1@s14;OTML|WB5`v0VP<$1&B0;pidueN1wLa38wpz8)9<>~`a=+i-m}~DHv_1FSKhEb8 z-D^I^9FO1ly??(kMsxe#^Euw2jmpEhrCHx$VK^%22+D(!6?M1`*pF7v!xLjho)~oF z3{u2DbU|NCiE%cXqMj0XWz~Tq(KT>EsQ#ndi%4wXw#b6%Zr!#Ln1H!sWQ%L?wR$-o zwV=(Upfk@8O`bu6nt`k_5qJ~b9y*Q8J4QTMVGMI7~qI@0CfNYaUY~O-jiA@8XN;t5_8O& z13zE@Y+p?abH%p{AQ`CrZKo2^%1q57=&Qc~4uWqZW$blrK{S`+R3Yd*lNbZF_Yh0< zE-{e(YH`dlP_Kf;WYzW2P{khnlQN`u_fQ?a40@8|R3zIaU1nz#6L6MbBi0lEX;GJP zR`+y?P=r`14YFHL9FvA5Ig85Z%s1?U+7E=u?uVJ0Ua6*M1R|Ofr3majVKYcT^D9&6 zWL-wPaU=_0Ln~Qz?L_N!H;_ZY*|3$-kb=$I?*g`ojEz0O39Va!jENZ>e{ZY|e=gJ! zN=vlYcmfG~pLP1n>5wq2UN!~CsUF_%k9cALiJp1kX%6({D(D{fI*jzgMgNhlYYIoE z)v;2-fx%hOKf@4ewHaPj>rlq~{S#qt%s^hyRH!%Am&2#@@$354YhtrfCyxekKKW`(K$Ty2HU?PNhmQM8Ng5-<3P+q_7dS+ zC(t9HtxSy*e*|TU>L7&Vv${OU-CyT}DNT02jXYfXdJTOovm(O?`j0zpZ7+%m9mGNE z**-R!T*vE;DRs$&XughR{Y9J^2Jfh?tt0QC2s1$%sz2ZqtZvrrc8yVG?p_Q>Ri$Yw z21W4(xM^bV;%W~tiE7>)2S3>&ki~OyWio4fx}2s{Ijm6MiP9Wa0*-@jc zfwtZ1HF4%r+1!!ov#@{uVg{1z>kk3@>W}b_Ge-7q61Ec@Y;1y!8)xwnK!Jepq=Rw8 zCAn)vC)Vzco|E(&;UrdcL9nMr9%oT~g0p_Yy#wq;u%5oUw?;AzK04fUaJlN*9z$(w zizA%q&~asU&12H$q6DO}(KK64wg2sXvJH;!@3|8ZmeH@QIe0f(4+p}~eS5k+tEVsG zUFvk2YS~r`dRsonagHCLtkr39@fCnRS+!oy!*>1XqD}Ffn<0yC^{#aA!9?@Un3?wD zu)iY<5h3EE?gLK+q?Z2c^1cSGkc`%}X}h#T~h*Kd-YzX&D5 zc#r{+=?3}BzA>{R(CaED)I{2R*@hY0|;*76M=QaO6EvzNqcGKbwLp z38%2X2V!mdN1c*tmKP<6irfvtK-UiAI`|KNI2pP9Q_?PeE(lM@~8CVdGOYS|8iJGA6DP~SES1_%h)EZDDxsO`rRPh z5;ra; z?y-m6U3A#p`#Xo-{&V-R+rJHwuu$y>4ln$dOAE8-@Y2Ga>XH5a!@$(g3~<|7uNV@A zfZ7MYpErMlWGw@Kc;KR^5)_a%W8bQ%kX2RV62R!i2{)v&CO^|Zppn@b{dY{{J@Ln* z72OUP4zt$e6|307M^}|PFL}D&KwDUn;ZjPc`r)eNt#LqtI;L5(jGm#oNCx5A+_ssD zNW|Ip7zbQICE_X;l)DO&qa(M2Eai4~!UdyPnBHt-wboS_yVk%WAdo!(1@6mKX_!FJM6(4I zd-=5doTfa9hffjb@o87Cgu=xSy$$Z2g3~-8)8C#t_V3-vH!*St6#XLchZlE$!hXQw zg^JZ~Nn&=gI)RcQL;xtEG6iy}$-NLqLq!lBS^(e`)y;v?!T*WV#4hx#Sa5w0Iu8w%9yJwW7>8v#GH}$Z zz==A1VIUnYSfrvT(%kwb`E<|iaV8=wRFKiTc{GHkM%2(Y`ID>;sLyZeaC#*tIlbz0 zb}kuku1s(JJ+1;6)Kh0l1xP+zw5(vDCOy0Oqg&@`K@S8N6=(j?S~!1GpCb!RZFri) z`cC5SzTU8C0t!jFSRE$=mR6_H(hrW!?hq#^9hZ|55V&Bgd)w`2>Rfa*8{nOcJ5+#XguD%BUXb#><5@I%lKDK8>>b$QN z)6ECt1tKhadR@3xBrkauFPW15z66nRe<$p(e6F!FqPWy($JuZg?+ETFy>Au;h4Sb_ZUd#`SgS&Al2k*vWEO0qrJl38TXe48oH%5BBA_+peL ziQ8#j{kOjrS;v4$wO;^1v`AguI&1m3dLxZASExnt8~iFfikKDvJpO+Mr?zBxZLD16 zq`}Jz8>`WguR$@4|&=^dC({ z#(u8I)zY%+>mm{yE@1#d0K2m~fqud|FqY!C*WaHfFXcU`Ke}L;pO&-GW1P6B+tKhu z$b#_VphNiFO_Yrc^vYE=E8Y%wPJ-9h^LGzXE)cob__%pvcp2~-mL&O(p9x>L&? zYTX1tIG;gdk`Ig1sQd(S2n)3rAH-T!nG!Irx}hn0Nv9twwfS^Szq+vhmq(W?_ICE< z?!-=Tc3O4Ie|2`-Xyx|$@*5%P*wSt{ro|7xaNE9)0XUyQ=s&u14U7(i{_%TXkzTCa zo|$}=*V!pqw(Y4u8vf7Q_m8qu9{HQUam+K{f7fmMN3-a~zOHAlUwrzQ5_S)dLML1D z<<=!%p8PYvJbAxg?&V7`8Wi?zWkX@A4*MM%$ERs zqWR-j{%ZojMDvj!{q^|r$M5~D8>kkC_ig>&JzrW8ef!K+SKj!VBffdRzAZepZ{xw#@zdw(!(1FG{1DV3zKVZCnrUg_HBZB@nvje!WOj##8GebaFU^9=HTT_uQ`+ z?UxBcd&Us@;hlHCtdll^J>`;5efl};fBo*Q2S5`4+w{2o$D3qZW|p z0Q1jni$^CP7#)56=mDp!Tz3ki_~z}u87PVR$G!$_MfZSrOUe(A2IZDkmy-Aws@VFh zP)tHpF4h4C{?~PgG_y5*$v|s}W}=zpP$Fn&`-aPJZ0=jOd%jsNzp<39pCc8}`;6Z6 z;Cbhj$G`l6H=J~U*AKY9&aS`Saak9Xy0nrDCB`}5P$FdVF%2S2k_tI zC1ca|mOHXbZyzEf!sUfC@W;iiiMoTfv-t14=D?7#P$gc%A&zF(=F>m7a=uyloDqH2b#ullSopcS z2t^V~x%<1ir$?xkOzJ2S>RFBwJRP0b*bvbel33_Pw>engCbw<-dU|KiLi=c=aD28n z_-=V?KjuXgVK7#T`&#?J72GS?S4zOyjnoyOhJ)%XPZj_%W;)vz>I@^d#yQI#1wv-Y z3p%q1gtlKS)17a@a-h!k4}~XV^X4J_l>3-R?rdPK)R0iU7|#!k4>=iMk(paI4|slm zgjsSH0u%G37@|G2Eg#zYY}C4J=($6Jg8!p;|0m!W9jS)OhVo1?CthM&NFx9MwN39o zYiT-e{ze6pjcRVHt$%-5@Oee6d|VET5Wl2F&L2_adhvJ)ktx>Gs987S80rEa@mG*O zu^5UBjE1zh@hI-u3RN?gjx5~D?dW(e(0PSML965PP+I7z%(}B*_kc_(Wu%!8A9hlX zIAY%3*F9Am2WmN%U%IhcDqhlcNHY}|3mLafH7miwnDH^vG|y%-#~=L^c8!W##|4*Q z7qv^ggOpYdf(V+Wb%=xg!-oq7mWlKkox@@SjYRHX>mqV9m$x2hi9FKV#?3!gE(RE5 z`lJo&@EjgDCv=av7USVMAWZvFmJKtC$oKFYlA+rjnPmbo=|=NQkiwy2=29-P z-#C$DGRE$XJf;S;rEjIL_XDh~HTCtU*d^|j|1EZjcm|CTd73~V)^spIbtTsX0UkZM z{PMiVrTo1#c8-MP<>EVDDKjH&s7xW|Twes5Edd}M9kJmqPcVe6S?^2{b{o}K$MyT) zE6Z|EK|Dg;dqUk?(swggGRpTI+#g#;X06imKOyk9sUuh<{>v6b^S$?Fzp!eV1ilx} zd*6NE{fRpjVEtOpzJDt@T_v5i_(mqy0-wDvwleVY4e1iryMIhWx9?wM6WjLRpo9o} z;%B_SXKTC<*Q~X@Drv%FE_3gas_tFT{@Rb^#0yo{neD*b=*R*2`vF2(?Y~n_*tK)* zDepgU`+-xg`H!zXW!=|qzJ33JQ=W6p1@Hd1Ti)m8?xP?2lRw%05idXft*hVo#y5VN zOQsexZ~X6+} z_S!X%|CpCEPxHUO*C%FTVSm)RWdoq?Tyx-$5FqTI0E5Rz|r! z5fA_FqYpE~9<}Sf$$9#pkDH;Cw+r*O|9Z&zzWZ+9*Ey5T{%%<4OnQ1vhjkz*Pcgb> zm&8NN$UnH_n)}L~H+xXW?Ta-Hvs*{`DKFUayN~|vWB&Q%19h=qPH$6(ezN`ef7}Wi z_20M&FcTD6d~j&%fdiQK%y^&E>d>?kk6~q@^(u2luVtBWWCdUYM;gjJ7 z?W=qCT6eo)JKp)WwZx%~6#(|z#^IKimq-nPDb;#U~c?Hh59H}?o2BRSuRe-fl-thITZ;7idm~R#Y$I^@ z_~i2iTQ`kjok<|(mbz&E2G6Xkr;$KmYxj?w;JlWTDCk^89mjlXQ?Py#HPeV>UFKqHSh78u|d ze0+?Sk)|QVU=gAS)W}O_I7rzv=<4B-2&pg9r?>zOIp8t$XEnK+^r4+f)Rq7f+#29f zmY%gv+fa!B5^F1oMS~)A5%T@=l;=Oks!Zc0nwixnBBu_K5T`u7BcfYSD&50v{Z~NG zr7@~Co3mM<^kNn<5}MT|=+YW8TUnPIJ~(nKiCEbOr?Neen**1oSeOFvd59Okc}0Qb z#)DhkiD3~JKg!cg693>ICl464XGPS%c1FF^InkGM2&cAZPd^_pV>uetH62j?*dtsN znk~A3vj9i&0iVaJpNu1Y$qhlJQ#dXDW469cQa~^7botlG`66%rmM3MFcVN^4)#+!x z;<|ar&Zd5j;Yc<$A=jWS5(RcOhDFS)NL=|i*q|rt7 z-w@xk#w`a~^O`eB%*`yYc}b_v*_smC7Mx9SDp+PwvN-``%x5DFyreT^T7fR#E%T>g z71&qemk2PoSd?oW3T0n4Vctu|d|ukogMLi^vV7?>bFe8Pl4dAz=>*as6J}Ge7dJ&d zr-5lfitR8Fi_h0(i~-GzNCXv!sH@`xK4CrvfQNV$7DBZTBTeEufTgf^8AT`8%jfebtvIMCMqDw@g0FXrkImrJye$Ys{WO!j1;=XQ1dbsD#zkWPG3`0+M(HSLUL?8jY0EhC~eR zW$jb-glw9$Si?Af^L_J!SVIR;h}=dh4#^Sp2pClF3hE|YhjGV*-^L!HS#^qkPIl7^ zk|@6EDREON%VE0zo=(wQ*k&L|cT6KoNjTQ4r+s!!mIIiktyHA$^27OejNwI{Q5@tL z+kQge;SQg^X*8%liLMDrv&ZAjqZ#hnWil)cWKX`m;6sbDg^&pV^jv4i`t1^ z_Ca_q*I;XL4Abr~xv(|cCo|~@k;QQ_(nVt%+4e|^E|@Y2f2e7IkK7l-01uaJO_j#5 z5<86Um7ZB!U6OMat*xg;NV=8s3nDlZPgutgg&A(ze~$vFL10a|m&vRlo_{mrka${d zlw!r52E?pE9{4xQ_WU96><`ixE;>iQ)*82ePdVJ8qG``X`7Fl);4n?^^v-r&;W;yv4^FOyz6kWf6SkG!~E z?$hn}O(sCdfr_bF_Op9ty$ zW^@M}VgDenlHc0_w!{G`h=1NRT)}AIS%>vJMw@y*?s4i}yKRJ z2Z5g58R1UGuIC1d4Zu!RpCwfT%%?m4D{$Pb^P| z6Ce?vDk+#q5pb?9W2<=TM_Wk$;B@R>=76G9brVwu6a`i{4wOLGK|_`6!&*c&Tp08< zT6zYTJ!=4YduI{FqZX1JTmMJ(&u$0{jNOV?FNNQqLY4wQ+i>CXvjwQ|vk4z>q-~Oq zvi)EtAxVuLaO$9YBZ}M`5SY9`#F083Z<7#B`&hYw0V_e4qR}&mhAtok6qQx4&qpgl z?XCGCWo{xN2a{l)O=u_d*E>iRR>8JdJ=xm~x{W^9yq>v9rsme31XFL8rPWiQC>IjjQ+BHO#kLRzoc^FO4t=koE}eheD#WUnUq@?(c*fRqkW7N#Q-Eo$YK}x z!v>(rw$R}(g+hG|-05}DbKQ$R85_V&r{XDr^}?;sX$sKzvE?RE@kIXG#1IDM3DV1v z-jV+^sF%zCSW0S-mOqwvtfh;MHi!`Hbj-U=*?`^fIpg-8O?8-bkR*D|Zqh8hRz^pmuFpNP?%@xmZ;g5`mz2fCQ zLH7%chY)&tQZK(4(pzLaiIIWNOE54HoM3wEA`At!s908hEJa@%GklzqE3=wZ< z^fm(L3|u2Armz|vy?`r6C#ds!Z9*3~HTXqvgr6QewWAoq;|eGS}MLB<7a!8 z3NmDp*&Me;)CZSPi6RG12WgOVG~&u<`zF|(oa_X6LyX1 zUm?T(1zCig(>>hnZ^V>ntt+)q;pRX=lZu3L2WgON*LNr$(3 z(kFRY(Ll!SYYG+zmUg*}guW6sgF;UO2gh8R`bVeo=i#g?;7c@uf>c8@7z%o*En3JD z=ozj(j&_4vE=DO0I_S;X4-QddHiB3OqrkL?YA?*j)Ie(|k3mZ`btk z5xNuUV0w`$+)1&CqPgN=SiQ;COii!NK)|{b8|-duXtz+%2E`0ihMf^r6iKi@3^@U| zb^H-mGjKFuE%x%vlyCMJ_B3Ir|Q@SR@1G%vfH*ln-+WYAsV!HtX3XgN<{~r_g8K z_`ZM4&Il6XQyl?CGi@-Jyp+~ZplL@|^uJf61W)XRu85U5c>J{b8M^@bP!lXL1{m|H zXv?tH#Nt9EC>e~j;`#7sTXzfki!gf=D%up-{N%^@2*bT!4g7%2Q< ze*#>iJL^8lm8@)FGMF(`ay@{PjD+jSI3odBZ!!Qcs!->=8jJ`UA?Wx>o&mqJgO?XD z5px2oe_-V^-~ut}EN?C?o)}^aq_-IIcqPeXFkLuM)aUtD)?@Qf9@W?$0@#|g>H+OU zs1XKn7;N&Mz#OTA6s!PnlK~b_iH;qZlBqM%e{PZEq$mIdzyQsTEw4t%x|s#dg#&1= zcuSG6m+c2I(WDXjc}4X0m4&AyL#&r{(yE!5&bRPRU7O<6b0Sp&Z?xu4e_yv4>@8K3 zndXvd#*B8Hx+hTe9VZhI3oB`3wZ4mzj%U^XU>krKh8nZO&wNLjIG}LN$W`rXhH_uE znPCNlCpRD~*>`S-Ryp^DOMQ@l%YMmYOaL&ud){b@ChZ;}uRg+gPUJ^L@ocp0Mh@_1 z_6JsuSqEyle+8(exui5!%~M6Qt7-2Gu{7PWe}@k>th@xJwC(w$*{|wZI-S$hET&;p zu$@)H4u@9kAT$e_m`WSs3EkA2&S>i9`iQ5{WN3^l*(nh;h_TxxUatZ=JYd@{A5^0m zwN~QF9`&Qm6f?@3*^qSTR!`=G!d_JXXzC{V#lnbxnc@J6FbpMm*iPEvJLwV}$JJt* z%$1EZ#t=}cV78YHj|foy)Oeszx{8%+d)u?>#o=}VnoF7hUdh6WNyf;m-c|-&ocd8P zJ?hXW7%U+%#iYr=E~AX-!kEry_Vu&Gz9mKfwwzSLz;^t9yrw8WBH_aJL$e<7wQWJq zmY1iHa2$y|SxPGMWKIj)3vGi9yIhkCWJ?r3fWb-gBXg@t2{T0@>4_{BcKX-y1g=>} z=5-#=*D?1IV5qnvgC0iLrxKmR&`<;CslM+@n*M9`s>tru<^uhx>MP+3%Do@BfE7nq zUY)EXMMPAVkc6DvsDtWtdRUy(LW-akK!8${pjlK89}|Gz#-1Z4c~O59PMC2c-p_9=6>Fkqa5k+r!TZke~t>l{;=I7VF86 z!}juk06b+1m@}oYKb@4arBHNYQZ+0s)nOPd&lLs}?vU^PaqM z)OD~8d?uEq$CsXm2ByWgb8du~Dg+fV-1NxR?7Wj+50+15eOI{wPi58`Wr%YeF4Y2; zsuSa6BoLFEA0Q^DIha#_jvVi z@MI2XvJ@8)E)31^cg^7`wG#zR5*VDzcG?=Ar?4=&^c!xYyWM zM%2+O-D5s|$FYn33g+k8iC%Dk0Gq?$ei|L&jIxcWbkF~%VPT;%@gYb07}}booHV!@v7X&s+Gpy{dP}BZa@u-y9gB2q=;;d7 zMg^|0dPcRXda?lGc5B-ER=p++H9ZDA%S@o3(y*WMuH&X)*BA>SPx>7OZ+g&BGEv+xPKhiQ?dKs8l z2fi{`SHFsrA_&$h_<^^SiF#sm%r5XY+Q*Y&`_a6URrZq^6XKxP|K%`4>^Q>GKeH|# zcAtEd7q`|R`tf%QmKDS&ilH$)LoEY5E(i^lnEuS`qrrM@uO}8>6?6>Vq7b}uy>NV;vAGqN;B~37r?DZQ`z|> z;|Kkd0!qz$C+3?c5~QIU*Twm~c5UCp`~}U|Z+|(vzu8@$?DxsNch2lqiuIRe0an>k zu&e)203$2*nL~pHnBX(a1XUmq59aiGyJ%9i!=i9(-bWNvUQmMAU|Mhxo@dQNRBx1& za9B5~0KIs?(u3+1M0b?np$#aH3A^A_NLB|Rgudw{-y%TvMEQ*_WQiCPkEtpg2GKp% z00HV^p(Wc%o1HiV=^Nl%Mx(ObXfBOnU+iFHE(2ccdW~f?`SKlwhm(xpZ^c_91~-)5`#yq3DLus?8V2$JVOM-oKdoKhkLpL zXuOe@q@OIdlZu?QIIDzBT+;7MQnEONtM8R=~ZYK8_siXTH8C#5Y&sw3H@VI z$YfR9oTiuym%8fDj7VVhk1UvcS}S0gka8Q{3mwY#-Q=`{TMHK^-n=< zj)Qmd1$B~8`a-xGXxI`P5JlX08}zOnj5Y$sZHjnX^*<(zJt18mC>$K~GaNl|pjp=} za)rJ8SQMprW)ViN<1JNGeVkYmeKQKd0*~XUhCB9=VtMUieO^hx=wQU6zG4fk|09O{ zqTKCKa-ALa0&Hsz<}44w+YJU&s`Esar0|=c#aYJ?@hvYYv}cATA8DI|`uai`myhw` z9fZs5WA!?(2>-CMi;pHQ@YtM1g+%2Y2I^FF`fn)N{UkO2P#WILalU(^>j+MGWNEc* zeDea_z%y)%G0_Z8<=9#%?qL2T{O%2Qi^<*~_kfOb%1X1ZKqH`k*wFy9DHsY5_jMl6 zsvB%{=r;kIjg*XSseW`CQv+?5Rp;sx8OHDB9nzl!9Y#MtIPaaANCSuP-QPSy{0xwO zT9y1j-=|Xu_}U%N6G~V}o;dGsdlnRpV7VbO7-O?+_s~J~W!WMv-M)YWGZ-m4`eZz0 zrLlY!$9%rJR#I2b&GC7heH2MY8^noU^?1=Hidn2SV~;8xQoGd#;t5ivatC+WqkevN8TuSE!= z1|BcO^JyMO`>4Tm5I+Z%*_`uG{lw9f)jbpT$(EUHUw-bq~gJscMP&qu!a zDh;abF7)6>3q8P-6g_y7zKFwWNIgjHgMqd$u7Y~iwImBimzMy;l~qM^W7{LT%HA%l zueGbzywKGMi3wG!K^6m;!`nTq=l?-R>32*NNkwlhVha$!k~=-;M$CzIysgLR+@TtL zm)E>}7AU-a*Ui-(5#<&Q%6T4)G>m1a>}DYIN*1FoiDxmo++wHWNQ3N{8XO<6xd?~0 zpNyhm_CZWkLOZ8`CRB;EID14063Y}J`e?TpWqSpDQL6Is(I$mQQT=VH#85yhTBMFz zFPvR=`(Uc#Db*T5kE^o``oz`QVr^WVNAQSd5(fm+&rP95_F_^GzG^Z*Mnw!`umeVS zWD2W+iaL*0UN^D5W{`9%CKZmr_rmAmUwitbxhTdW^wO>YM zK5=`cCJz&hg2)pN4i(1OtHf6*8OPT!b)1+nicCvKj8WKadp9Z}$7avt4cRat^SP*& zlOJeSzUpQg%YcOTZ~sYAis(ope-7V{QUex)P1VbH(t6!LlV{+Zt9YhQJ)Z-LIFe^4 z2Nbb@OF@S{=M@w>8pP2@KsueLg_S6Lr8 zMz{Iozo-%r2`4LMuo1^%9K`t+hAE1)!wfm%FuO5Kxvis)0p-1fAE+1;iq@mJq$81KI-1`#Q zC-M)ym^D2!hrQa%E0qMG8fv+lo5Gt+pnw}~znfp9p+)1o!o$>#d zns*$xn{H#H1}kbFa%z}oz9u`64c#c3H&>Luy@Q{-v)?{{6_6;J)mT>1|K>ql#n?7y z$MyfbgLo)R`$gwhMQ{ik7(yLaZs@uOm6g_;zyBU@nVD*TLEEUWn1;+sx7n<-+way= z8bM6iiJi^AM{&3X#o1=WG&7y%nz-jh=qYm4C zbI;ZkUP!OSg>fSCnr#PkYqaIKt2+m8-QV7xesDiL1;rKH0l1;K8JFyza@u5Vztx4lV`0GR5-yY%D9;EwF}+uQy0^^IYX`(0enQAi%M(J`F~=}aV_@{ zBU^N65pl)-e6d-F*K2Rx&*D(nZ3zn45eK}e;IVfaTqba5HOsyc%jsW~0xZXoeVS+H zT6JPit1m~K0g==EBQn7=>(;7Nba0yU+pyV)2wOCp0w=xN!j;HWHs5l7+PMVK(bY}% zaSI32A-i^k$D5f%K-yvYITYt9pa?qxGtL})Z>+3^OYC;Z&sH$vy%5e-wl-}skKP!)Y4k_c^sd$ z*G1}04@=0P?&2M$4GZab_h3=4v5DUodk<3eIn_UC9;bRD-4+N&#@k$h^ZD=4AA|8U z3g|fggpcC*lh~__U0*B?{Q@6*%ULVcAJV)Mvd3YZb;RnUuCI+7T9+M}#%NqGb?E+; z$HtXW#jh@2eicC`+8qhdoa%)ZI`%&-ddA57y!wBD~4jzdba|HV^z8dCUM?UveH*nz^K*m;K*?*(c3YTdJtmp;DIo4fMfdAa}`N zIw)TVGL>IUcVnuNT#DmTjTqVAd=g87U4H6GHZakcoM>*{0;o5`YW7xV`!!?3;_Zfb z?SHjXR12E}PSbSB)<7%hzaXw`#h?Zk@wwGYsi>)L5yfR2V4 z;RYA|`Y7T9+w)6DM{O@Ju1-Sd;hpR#^POAhkv5igZ(DAfQ@$q^I)+jRU7Y_q$FN^r zyH;Q}UohLq??_LB%T|s0YQwQw%bXqn z7k0|TXvVJ$@%SOjPvyHaVeJJh`NGqZRfqUXvQ<5~lux&t1+C!Yk^|%D^>Ty=?W7}E zN2gjXTO2Dzd>Z{>dHOi&IO=4E8KeKvTZ237Gv^_;(d07K17bgF=ga0to->G?LjyGLVi`(n%6wzjuqZ!o z%w;Mmc7)HzrDw)nW+2sZ%%aAqjE-$dz^W}wX|Fl~4-9%B5olM4Mlhk<|BNmf3Nk-~ z>WQB1hOLpydIY^j8^|vAn%DKf)vTrBYGw7zIDxp1P(f6Y`6#Y>3s+HXJnQhO?2lU5 zqDkRlAT{D|(PFR#qx~voZrzL>HN%0!(FvfnmM+l`MK7!{PnKap(sk%e{r)#~(^Eh6 z&^k}i#7svGapp-%1+pg#EA<nxff^58R&{ZS@NFqD#~k$v9bc@u;t0nP4{DxO50& z)legh4Y^>TRgTsd`LpI9KEcqd-{t|3Iai~eC>PZST{UZHP*zcMAQzcP@d*RPl?rv- z!qm`AG$HSVXOT^!(}Dyln;{(M25Pu`nlG>^ln#^Xx2?F>yoO5P;6DdKwCP0JFTLhp z!A^+<-$GMXk2=Qu#$9k%^P9Xrm%3*0k*t{4P#?xV``uVE-G{yAbVpX+Y>_g#uioS~ zS2=r+YRf}IugrB*GgP-^y@i>po`?Te#4CyN(MEnkUUTiq0iiod_>74`m(^uxaAx&7 zPC;0*`5S&Rbb-i&vsCp#_N|5}&CG!EXs2I&z^%nP&By73{gsp#yQl`_C(XEhfo5b=ijitWhHrg!x+-l#ay(TJB( zCEv|K+e}#;12J8lHdHTJtP=-B#%DZRE}T%4=Y|7hT~=*_eNzK1xUVvqozP=!$j9)O zM-rbGIXLQ<*Y)iL)n+iar&I~^BX#M4p_q8R; z`Oq&RWqS)YFtO~58{l|=MYc3zXfDBbn-`}~tF_}#n!7*V!S-xFM4{g66I^wR{9tY# zK*8VoZP~-iOvy7+0UNdNqij67jCA=Jny;9v3TR6DNj-7y#lg1o(|#-pFo@Aqbv_ie z@F=;FDl#flakOH17I4^ZA3l-*@WL2y%K-JB?CWdUX*3DgTwweR z!l;6PS2njJ!qpMc&*w(7fQ;je>*9p$M2Pp&LLw0FE-6_|0V#Ll^;ENO{DyZQDRwJa zW;jP+m5LbkXEKo!@}o`iM;#eH#Jl5%aZL7VoUYs*gVU9tweT6Jv7Js9ouN#OoRgw@ zQ&;KYfiWxUWfFR5WxeC`Y_z(1LwB^QnL1%7|qa6r5)ms z?K??0P1e4ee7|~me|)EXHmc)r(@WTQ67-sBD!CJt@LjP=AF&-&SqcW8$!x0A6aCyE_({t=9U}Um2FRHb?=;H*7)#y4gB_z2y%FZr|k@Jhw zFpVL$d>8R|2#3=myIyn&@5y?3gd=e;@~TJA*|}m#HyJ41YzNS5 zJH=-X0)AHwk7|&`%$<{|ZF5CV=!3p(V7oQFi1ifvv`s;(<{>1?AV1U0gP4BxXNEg# zoMQr22}aB#{x=H`=_wA!_z{`VT1}Hq8HX!m&D&#Ja|*AnkCO2YR0sp46E3|1ig9?3 zuXwt8#5VNC7O>JPe|-*mz`bpYw}a}r)ej1^zp!=(C`plVNHIv1UX31%=4Bq)gPpdX zjE>&XA=i%}Quu3~?6y`{)rShUgC4iQ*EOh`R57$Ga8M2sX(%;EuQ4y+4G1vPtVsZe zrAv_$&1ezmbvKp~4rCx8jr=1>Q@%xY5-93r&?ek6-#I2qps!(|@;zdSTFCE2_kpcd zYQfr_R`L+j%ZX;ilC~!lUu-G_kw*(w+4SatpZYP07F{wgnHjc612lm)q%qc=Ag2pE`|+$_uL{{@oT2nsb?qi(#qs(2X4x(Y1o1HU93ERU zs>{y)9o3(?_M_Jvd@-jMh3yw#rRPE)W5w9gB-6)|HQ1h4Y-S&g!^F_b?o<|IJL{9V=&)%N9FM=s{OGv3|3N4 z-ch||5>tFne`Aq^L(RqBv&NU%PElQCq%A^|NvM10y} zD@9|(2@F86ITVZHdi@WS#l+Gb1jvRVR_6XHmm(um!V;;i&i8DXDfke~2V`E!I-es@ zJ=JOj@!|9(X9ED@5pWlQm8-*a5SLnWARxqwjKEw>yvLw8a*N|#k>zmUN=jjkh|Rf{ z3U^S=hK+GXjnDiah(Y7gnmteZ8 zbAiW*A#-9D6lCwXSrejA%q9+r>m zi+R9cSq-k!Eu_&f7PzKmRz>r%aD4cy%+L8f)y&#(oO~=hqyLS($S>}iTb!rquhCf< z6E#+sXzVy4TwR(j*DqeKsa`yOx;8G0OYLmsFVC2&a1D>>0`1f<}}Xy`&1S1OSLy_P?XA$d*%2I_t75oUKveSS7MS+7&jO zPas?1G6Hj8s1mkk4PXhRf(%GitwddmEhI&8;w%mU+9Jt_KSFmx^@_pP-srNPsGi$! zMvq}4Ac+QNy9*19B}(a4Z{pYQyYGd&=}II61gr)3LVL_Xbs}Yr9W0&kvj6Fcd^%iX zS*+t5Efa1vy3c54he!6sh*e@zv$3<#?z+<>!ozUCOvHS);T9QY<=G*5%@29}^#Bc!gop-iwMwtSjGS+>`AL?h&JaR4NMWXD)f1t2 zg9LoUVvcV0QNulH4S9hRmKoq{K9%oa`TaeLk+;EBQqMiXh9%o{5_j|7adR#)r=hiW ze6qPWHD0al<0+eLzMOh#EqD#W?2qO7(8SZDw|XylJFC@i9xp@o9dwMyBDYPKGnxcU z>4bb@G))&F(yGBt5h-pQbPe)cSbfa$(KH&G+?DttADA**{X6b+SM(Fy(N}>24s)P} zQa{EbZ1Fw|+X$S+)Abg_8I9{*pES#QQ1_4%x}qkV*M=PF>0~-0z`h*m&q!7V$ZZKb zQNL3s{=(VQ$i~hNZqKb}lCy*P3|9{`8j$*El-{K{_!%D|UUWv$QMj>f^G(mP%@(>~ z%Pe+Fovfv-bUEiGQ-yzTSv@shJqmqqQde2Y5YV?mY92QGPUkD~=H(1DVfU(N3DquY zAuEbnj&TEz06d2@wllhGh-K%{lO?mn!xMvM>umeatZ;zP^?4Fu5fKV}@6<)}kmuJ0 z`OCrCiiDZ2q=By8xuY0n%1Z<#7^*xdxA9G!cZd35%$$NQwJIzV8NdxrBe)iyNAATT zddypJ0CBb@K9{XQ~D7GRMilQy1)U|M&YJTl%)@Fp3S^qD7| zlUaQ@B@!@zzvK92YPDpu40euG(@JD~$`G&vV^pXn%W%{~K$BrnckKyd8Wr1DdLSP4 z!4(l!f`JhsTIGKfq(Q(JRDe<#j>Kpp9+oOrSVVeo;@!Yn&yIJ!2%z}^rh+qmb{(;I zyv580$G=o>$=yq>XdZheJwh)+`AAijwOI_A0#RIvRu(l z3O{^c=#~ZlLchcrRHG!9m*}P<9PLjI&Z2VKp_(YaNnWAqqefEQ%^=Or=?2wtg27PeG7W8*H3( zF{(r`%IUFcR7A91zz_z^tB52uU&@-t655c(b(*cgaaC%uQW{RU!uRHq@66Dz292V$ zGmaoL_*fjp;7evl6jWe|Rn&hWjh6Z*Ibz%zJz^XeoN1qI_5zD`O^cCBzB4Mpc)(K> z7qhG372Nm-i4(4j%YT#BAJ~&K(TWwfb zQODQ6Dihq4>Zm?y23po!IcTmVX>h?Nh4)d%?~#~(Cs-Q8@Bec<^Tc6E%VQW|%eIu@ zD+Gp&c}Q1~Zu;4sJ`jknc?Z`1LBIOJf!%D$XB+#Z_0D`(1vF>8Eo{0qilh9Xq!-y ztWi=H`IKw6bX%=|rbb1#oMzui+(ih(Q|9UdSgp%e!?O|(kSxl?(5J@_*|u>z%H*Sr z!(N8f&fauepSFq{G~5J7coN8tMc zoOnR{;|?a^1(Y(OR0Na?p|q?YkO4>uGW}l|3;o3@)OP{ns9Ak(NGghSh4 z7`aK$g}d}sp;V&i4q{<*2FpAMyJ}sPo6@jXCx^78!*brxSlF)DHo{SDO)gX|(YMS% z>Z5`Is5nWMOJx*=H(?MFRuakC^U0%e-K!`v$3U@hRpTaj#0OAWRHj0LL%V|o457mS zk{9mI>~sSTyu{O}e4N0Z{S(x}dIna+iML7Gv7!wDi0lgV7MAr)b!|7YzT%W?y6Q2w zy36e>CM=P)e)FkoBa$G9z&c*i_MPyoPM&3XX6FmGg+*LZdvowrvGT!a8e9lgWZ$`D zVe`J%MTSKzA5i+@DRc&uPOJk3z1NTM+7;|P`GwL*2Pl&!??*o>ck3jIe0XaOT@M{x z$1R#mG2R_5rn;j;Nrp62y*Dkp(IpAwIWF5ci=u|qK09apAD(5B{G2&q!REI^kBoG@ zSb!6`geZG|oBLBlyh_lZF zbwj!qL`N#sK0>Cez`lL^4Et)uTfW`9bh7z*sF}i(^Q2S(JB(k5xbBDX+H#Bg?)%~G zdv`Mf`}TEr*Hh=8Z=MuB5DIsZ>atLiwt_QKeK<5=lI^@p`X*0J;NnL}QT>Ix!^08f zI-`m6srS;36Gx9{g&Q-1+biP!GUlTCLM%IoYdWV0$GkmlRdoS5Uih)d`ex>1WR8Gp z)>hZ@inUr?52(^l;3U?}i~{Y6=Dp#n(X52;#9nRG51kUA+F4yoBC1pX`y`lREphN8 z!6j}M3xN*~p1NEB?DtqCL|JHiU`amn3AZG6n@Seijlm>S!4wfJ2^pH zCCRZ#d1{z71z2@0NcJWTAs9V<26yNh|3}4`C@IUrITbiYTm5MPzoP>r-_R}yF7s-& z3oLm&q{urq#G!~-l{5^LE9TxjGJ3U6>%wNY_b?~BQEz!{mYwKpKZ~YmtYiAcnG0gF z!$4+Yjf-3C^A=JSE)hcq7YA&d*3*rx<`Fmr@#t4y>Z$JkMrK9?{ zG7>cDR2`OMK`U;d<)C@E2U?)o>W*$?8}TtV3ubOWZ%=R~$?XJMMz`K$5BR;%I!=$W zyZet`7)Hr3_+F)-P9o=#s7X=Cn$IHc%j#J5@#yf23!IC{%>7th<~xD~p%(x=F`tza zn6wa?f|0Nh+REbHw=*NI?aQDD@U1#g-v=@`rn6bQIol-xdA=3Uv z8RK>JrcOv8IsmAZGG#dMN^pz+gVsP^^ejpzVZ87jk^pN$QAP(hz3k24mE~HGchP@q zj!z@z&p$m4CPX!ok$s~he~vYLbUmN9rE1Q6m(<;tJF{0KkPzaC@Yo*|^_A`%+21F$S{ByoE#Ei5{cqBllJ=n1*>%w@k{(P(;t9$Rhf_n#`!F;(i$ z$)u#u7YFtSBsRMLg9UV!wGimo-$3O}fZE|&fQ_-3^-lGky#FLBZ98e(En0DTuBCU` zM`R}OD?^!`YxQ6X{AND2+I^xs&s67Ne_T?1Qu`wq{`dXx%B5a7(tMD zO`@@`Sgh9mB{^Hmk52_~@fjVFHL+LW!LCc@$fO1$$Cj7p7i~Xy>B$$5ItE%P^%YPx zLH|&6_ftyJa(UQG>#|=%U4zZWz`n?PYT}zOG6SSWNqAu6-1^w;6Zrm67=vA4O>jRm~fJAQrk%!V>H@ zErUJW+<$G(OcyS+0E|o@&A$i11fqt8Dh6kWD!5HnJzDL^^>lTip+Mal3gA|fTr{qg z&`T^JnU1rJ7M#O)R-w*@xf5^*?u;`e5Rb1z+Knk5u=l@Splmhz!+Wb(xl0n#?(^X+ z+5}XS;*$;E?WW1GD$6{F9t!2kfDxz-pbFX8TkuIOr&2n$7C!tH_rS9 zT38I{H$$9$_`N98JD<6k^s4fzw@OXl^hG0ElcFBlET;m9qkwavSG1Q`&(WP2;AV>s zHxiRLGuK6cEMNzP4F0B2x6VE^39J&`eCiaE9D0kpeBsIiGR-UVI@B8wB5QI&GZ-sG zjjBKFj%-M{<~pXvpk?$iRvfmPegRtc6ARF)-iJoP{12+PAp*^}$^~&wrvSKHg5k?g zlm?Eofy>_TPvQy=mXP6cZC(V-jnFA_OU4ol3-lNVIe>~RM$>hKddTw76zha#A)@vf ztt3pt^XXVF%BYc|)z?|MCGL6Xnk6UCS2#|_+D%lDmT&Rk5rDn!JYliYkkDu_H{ zKvUg>V3FR0RQ1-P|Aw@ng)K^9K1`&O>&mcENg4i+%ysk+vUrvZZx@#!eaTl>x+F@xPbKN5ozDrI!I|L|%QRXyy(BpU)x?GxkpwuJA*fZv- zQx{7e9z<&wRvTca1g{AO%c-KJ=};L+xuV}o^crp#qJq;-R*xu2QX7!!G>>49I+{slsaGJxmCB9vY_!l^H8UMB*?4aI?;171rpcc@b=(36BT$wW!qw}g=p^Zh5$?W15lk& z{Afa1l9~|AF=k~4&mvVo2G?tDrBJh^yOt37Z+xR7@;5{++tjj4z>6v!7-4T2ua^v+ z$1FrlMu?xB@0kSbwixf-JLP2O1L$Wof!fDd$R%|kg%gC=m!aE5 z)UBAHf(f#}PLTQs>wW^mi;dJMS0EjRWt;SVtYrg$)vq$fjU%iHV{p)2HS`qek8h4BnECWiRRk3 zq!|h`fS47q#5+GFOqw1&SP4JAp@DE`oNc*H?Oc`3AH6b$@W=cR=Jnkc)zyV1M}hMa z$Nh$5XG7^jsWt)f@ZrTIGz(24&Bm?TcSr`RaxR4dsX^PYFY;6ii@!>2`@N|8bnVnt zl(I4@5xrqamHM*NFu#@I5E+*TQHfUhLK(Ep<{k`TEWm_5#qbuuKnYemZ=`r>aYin2 zW<(_TbXqiIH7RUExbJ&uQ9gX{6z5)|nR&3g2?o6UMK}RJ=d#kCpKQdEs;9C@hwJ^) ze^z}O#Dozbt=g{JSK7 zasGnmKks=LJa^Y~p8f1+k4De_rC)sdQ=f9|+6Tvf4>|iur=Rr5jT?&-x)YPV{$Mb3 z#IkDniX&%_T6xUs2Yn>3A9~zJ^5fr{za_sRKagLOU!A`$e|`Qy{(FG`9sT&7v(7s0)E%chZhNzB>tnZU-gM%lH~jpg)_(+~N7q8- z8a#mofT2O9z!K!WV!oMu&P{raFfG_)Y4AZxFD+vZx9a|fau6Jf4m%zK;ZTs!;D*X8 zHN2=2FA9~w2Cx(7qgq}OJ^Nrj_`v-tP9?1|tiPpQVUvwSMuS_&9}TSDzL?7UN2%=& zl)p+IQKU6mAs#VcaA^fAIbAUyECen~sm<9{aG=)hzyoxnyQq3;#DGYegqgvq5H6a$pLmkq6xH|@I^(`KmPMy=zCjS{7 z_+9zTTbTroT>3;l^M0NT5kfL}_kGA?Be8>K{geC0q%=PaXFcMK_BekXVfjOxueJkL zqHdTX$Q8MPv=*|Btg16+-a?7y(FD>FZci;>hkCF;we63W3s4daLZu>r#sX|m5J1_7-Cpr)QgG+t(o;tL3cQw5iR2u zz&EUu>YP*>$5l-!_OJq@sjf4Y%}eN)9tfs`vFb@k4c>LXjxZ=tNRXx7OBq@99&*F0 zuj-JBiC6b4ZVD~=UB*=s3(F>_tZLwY`SONQmm72&kVt8@Gu z9hBCb5UvyAq^mf5Sx?IC*A=^)gK2UHH_=dxDe41p76;fuvEAaSsNNaw)aA{=ST>ti zw-+<-=4%1Rcg&BjDT67aE}oddJO5wTjDtC^zQp_kPJJ-R2@?&xD*+jY3V`HQTE`DY z;t)%|JD%S6T{91`fLWdM&V`<|{jx)F^H8i72fAdKZR>+SJgmP<3IN1v&*1G)u{44% zRQ*+H!2QNNpqDvO?9z2U+Gg^dFM`mZ97@^KXWpLs`)jetqru5K7mODznX7Ru0n|<+ z24z|XayQKl4vc%{`e$Z*JVU+F5rF_iWZaK7GXH*BRF4_X(ePu2#}?btzogR@%|DSO zRAf26rn&mqONOzHC|8$q#fQhTKCbz1buo{gax6#Nk5KrE?FTUo>SHhB$u>>`J=SGo zkKiFEd+@w4CeeH|JFTAMgWWe@lxiA3*1VXjA8}cF%GKq=V=d{iAjif-65kGH^&>92 zEP5eRLm9~qLy$Bd3&fEWs=Rs?LdX~&q_m;vp|xa#>&5=1&aOS+aqc^zjr`|88Uhxz97)>A( zt&%D4(ey#mW(O~9D;%^$9k?{cuF{DtKG5x;Iz{#oZa)7p*Hh=iZ-Rvw#xeq$vyEG* zlt6=}yzQwoM_Cg|r#w{K>_ijb5_`Gr1|oy21N>|~mhBGTk!xjVf_ED)I^I>ZJTYJ9 zpNZ_tZFG9Z3tW3JcVCEz@e!k8?H=o0+kQ?(a27w|RPz^zVQG}2Q_b2)9WNj$Zsm75 z{Epy(eCgn`$X#k~TebWA5ubCI9w~0iPGz_MSi?y32?D8RTq=IEr1GMz90kzIL$iv? zqo9@NQMu#L{|qu!)hkPYmx#PR%KR>b3Dcs3_bBKqV;=y)$WtcK?+C`aHD53;I+pK7 zpU-Bl$p_c+`Y5K@Zw7A+ndCL?C=+AC$OteO*ysllcG?d$3ZNQQA~!Y^1mkKm35}EF zXXoJHJ;B+IKrw=4ohom_34<n4X2L;0cfbmPU9H(*=Bez++2Wjj%o)UZ|K+|N3utrGc zz+@nWp$txXl#b%oOj&qw1@Mb!DWn^Pui@F^;PHIDqC}Hf|K z`51{d?8`X|I6FcP%Z z=7ZnoMGR61x0I`n@oHuSwhg<%N{wdwQ@HDYh$WO;JBy- zTfm#q1IM<;k5c0fjG4a3L$?EdVRt20f_N`Ei2Ae`P8?k$;gV4gT;MyejH%WJ01S7e z#SsJ~UdLWgk$)=w#9}?``xI1#LN1bpvGvfDQ)pfXK_`~G1+r`rqJvz_Vu4BO5vN>E3zBTp9RP`l`SP*>?7LJ zY2LvqrjoTv(02`e%yXF|2ZIy4`FN-aqK5TStCFe7ha@%{l(t1$nGWKbYTnGAE7z4s zBr-k_XxEZ%hRjiBVUgfwC*ni>*mNB};)WO^wKiLm!jJ}mJfQT|)O0mTOjLAr&U`b; zY@HHtYB|hQol!-%x_QcD9Oa;n6@486Ur%%5gd<`#G!e^mbcK`5X|?WP!i0rfjb1f> zgJRgJ8d*S>gmSu{r%h+bM+$TM?9~0{d*64q^eSyi{K75c>DP3)Yq)Zd%^&=|rSLAb zg<|KIE(v7JE2}M@sum_iO?gCSWQfk0KFZm88;e~S70?S29Cl>i!0!wUA1?wEnB&z+ zp8N$QXeM>L37M&5%X7BZFFUbZ-*)0{EG(PSx3(#@Q$a-7ZdNOvqlZL0I`D|@xu1LL zeEJR-SKE2)z%)d@(gTr7{rFSXPR3f4YQOw4XjnDi1!iYz#=+6^q@)A{x*!r55yRJ_ z10`j+W?iIOzHI8irWS4Cye;N5pS+tXV~)TB%q|rjs!4)~a|gv%G>52yS!a*ps^NAW z&6Lxr>6AFmIrtibJQA@vZkLKJz}EpTH|ktS#A*G5W>& zhOKm8(6^SS)vNOr= zs;UllAaVsV{U&$D+G3_L(e-$P?5SW%6pM@rwNt(&DgeGy(|Y(c;H#$}zY0UK&kVq; zgT;iNiBG>^Dn&91?}sQPNdy$baIncAE^13_g9(qwZ_!MWDUCroG|hr>4+Q-T?i@`D%- zkRXfWScY+8$&#roB06zI>D=HcxJZQ$f^X<0xhYb- zv?iSXS1nL4aiX?Xk-cZAsD}PoK~=kAa||~Iw1g1gQwS$Cwac7SW(+0>MCXdLmS>JB zeSgW>F$ini&dRA@XO(>&?K@BgbOP}}4)@gNzd9dqNEH>FV}pzOEnu737jv{m_UNp| zAN9ZGdCCVW0&d`BASwM=~-=SuGTfB@C6u^ARbTK#JE zt}6ZX(hqSd$@w0F-s0yM`4wE8*!DdGQ!%+5GhH%APJ7Fx#!(6J<3$F3L~uqXLs_KZ z)IN25u_TW}xRU0umg6z#N=9xFfMeD9w_*2*jC0BO;363xOk^BoBGo8jLu>{-B!zIt z%wB1To2Ax`0G(Tc@zZr+F1jAPb2#_Y07FA#GK3MTC{~0eAc_(gCP6=@2Av2d_>9?> zf~tVa2TlbcFi-XJ$uzhl(llO@rZLP7=McF~=&6`_p(eroCvRA=qG`K?OsZ&1T@YYG z)u7oV31w4I0_n*qR{Q27(OfP!B4PLP*9U_7xyKs;jtbC8y4Oeiu49+`OHOj=H z-^00Iuw1wlMOr$C&7G45X?@juV+!wq7K7Lm((ahyByCnA7}v|y|1@Y+OkM<*v|T)m zjnS)p(GdtDUAC>!MjRF{zTixSqgW7xV2ogE7VSmWdsi2l|uNWD(WFs5a%v zb_Oi1O5alNYNjJP2A9yl2@voDa`FEO@IA#Ae+ne*@lGd!%)0D2&;AJ*1!Oa^M(P8; z(!FTyI0tMA#Sj&o>XWX$x>V2fBA&1gH3kh0iX>UF4G4^= zF#lNqpiAqc=he%?GE8{lCcnr_fy33T_9APsVt;Uh+JAM2LGW83YNOf>tAphlwt)1k zXRCKkz=NGq#Rv!3*bOq0{uo^KqJ3C>n5-YUK@3X6;1@y{M5VIN&f8qEuf#Ttow3XS(l0Iu`lm?LXr6mrF!_Nj zF^+LZtzB(kQ_L6|5FgxI`uE5DW#-cWU?maaBF!yjUk66Bl*P}%#`(Gv;-~F3gA5?| zpn}2E7_qyfgo=UqUSpWxLc0Py52s-K5v(fMG4ngYfVC=_BmaOs{7R>w8I~n3-RkAc zK&!R5+sfz2kjfJn1ed5yalTg{=CSCna3WGN5+NHq)7PC$HkugArd6y`*TnEIK;j# z%bVLhsVX15;J++HxYdWw4=E_{(Kk?H{^R`TFDMZDuP`)N3f{NQo| zZOjF|S-xZDJVqzMAoKZQrO&2j4d;%-nZG?1PH1M~Oljar+9l0_Pj{+EBy2^!(|Zq1 zRCg3X1$lKBdN1Ts@a)i3dKQ&(P6ve3Hjvu;U!7{cF@ubavOrFqIge?G z?h6q@u8Bz`$p?Al?5fUd4CCQ4{6Kf1+;`Sw1$5`SJ1Udb|AAE}??y(oG(J~+5E9bM zug9EYjyc|A%sEGg-rE^is2n^e{KPA}^13=XuWs0N{r+1pNA?$Ce);lW z|Kp@(1YgBbLW&D!V<*eEn=b3Zb}~7HwT4gNX|(NsNw+tQj)}V){Ha;EW!HnBfAFDS zx^CCCov;mKLT6(k8CdLitVc*^_^0o%_^fshDYWKprW~LQX?VOJmkv)L5Zj^bVX4BS z#+TV#-oma{7dFRom8zfSjRg53^71aCQv$o*SfCto1|Nt>uvf2dKK>*gBlPkY$YL%K z*x1RPkbW=%1^;UTJXncs`M6V=`bc0d6pO=kv0SBmYhJIDU)@fdOAV0%x71dV4j{G7 zJm9gU0Y{bmBOuzqQZ8$4SZrY@u8a&@cLOUUn|kk5Gt}i8R4<>UADjloOgtIXcVYGS zC0C92{6UBRyDp~7g31`ytKOVf|HOt7$U+`yin`+5=<4lKG*=wVtb;+wV~r7moN7EL z+}Yz0R`-k1&CpP**YVzc1X$~}j4gn8{`i_&P!CDwnAwv3v_|0B;Ac?%;}o#;s&BLC zlFI4RGb(iuNEUI4^XvXZsZXfsFQ}p5?YLFPtvCIxw}>XSw}PDFZ6?l*)oFw!LQZ29 zFZ_Ta!8k*-oxnirukH!7j+=%$l4P{=oA2UkFuJ-=G2nVZqZ1-#5A=};&?lDaxfs<^>ncyurMyR#X54@1HOo# z{~^FRSju}b!7v2;O?CS_HM5T5zsDdzSRdG(N31}C0?}bH=2$&(Z4)`s?zs&SuPd4_ z6Qz#57{gQ#!$^z64j~}^ku47HbQHuY*EectgwSJ}R5^~yLB{wy3$+@O_3cHkmCU2H zkwcyad?i4D6z$K)gZC8#Fku_+^@nSt0Zbf5QPgYc&{rDnvIIriF1+NR`#up;Ltu3? z=7&d)+a9g;CmSF#2nc`pSZ74*t9~p@5Vi?{5F`+*!*iGb8N_ZF_!;$)X_;Mg&o384 zHq@E17qbQFP!eq%75jbwbU;_J+vXY+4cY2=D{t<5mB<^z0wlkLEx=~Zu+0Wmt9BU* zBihg&2Z-4VJ;8gD0i@l589zP8=>5q-fHB6319M3@;Z9U^Pwe0*5H-$Vt6eh2hdwl1 zJnx6S&ADUvAhvjvCxAgv-A?HeSG+|=;gW=4%R(6JnsyF?l3|UYr9v69 z%~qlICiimnKo{?60!o@02#j7_)hQ3f+}WMJbWyzxtTG*~)x#uLe?Av!90wkk*;)>#(-QSgFHn$zYdq*xE zpp1iBjf*!9w=u4DO9zGv0o+2p?K#1INLD?N4Lo)1zFTQNQA&0grNr?v(g{dfsE-1l zFb*ds+F?sFws2LH*kGDN*1Q7Ewa>;mhhE)WcUdZL?Z{DlPYuQChK1HAmx6(*KqvFCNFd2{w~bj5(YnC$=ovaF31Il#{@mA`qKhb zopw?z^TofzIY)oT!%1GHWt?HfO4W} zk^IDHHZ=bpajFeuRI2+>%)2pXSQ=YbdmWtz)=Z%_)tF7*V{?COQ}sT|x-~c8TxbWk zU&l!W^iBW@2F2tJYbme3SoE9}ZMNGU+Zuf6==yj|w`b}TQaSe)!*VnAG3v;%ex0eG zpxHKP*byVTadjhczKbJMr}b04u`n|e{)8W>p_yP)tgOh3fSSGiU(tj&T4In>dqsnG z9M-iNk%(Ex!X{A4mvv2{?hRjn)s4*gzB3~e$N8T;tG`AZ>B3!_8O#yogv~wdTi#7? zs|3_s&AVO`=acgN53y#U>^jzZ^AvjyD@EA3N+DiUpPAVWCa2B>#o`L}h#ZeAw57e( z0l&PbY0Y~Kf*eS}{_eWJ-}?);@%t+Jng*cJTlA8?`)R$TTauUb9ABk|$|ukzLg|_E zQvEnkgo$2#KtpV73P2$|^lcP0&luQcVryc%Ji-;DDpFTbeVQ^cD3&u)Qk#NQRDY?j z&Jr)XVOBvYS6Q4BjozJC-{Y;iaK^YFB z%GPU%xjecldI(`bh;?p}4FH^tJOx8>kX007BUjbW^xkw$+R@Av&D|JK%+e5mVHX7% zTLJM5d0~sa;~EvBDb^^Ed-NpPF8P$=exhAQNB6(zR3lKSPCOjzdcOYg>Sp{gdg*Gu zUdbCYejn@+{!<%s7aD{qN$WEQ&tRx6j*YjIFRiWu#Hd=P6BK zpgPA4Hm33w#%&4i64i;%2aExBqkg7Kur|UlKpeTi2VIKqRW!iZ&!ZmG9bXQ&xF-iF0)0W;4?;&1^B14pMx6OxL-rsv@qA)5u zgYKpM{rjFixQxjm({ixc#er>=!xk1!S1klPQxr&sD`RL7x+B5~#sOQOg^R&ctsLHHfWfxweCLkgG<> zT;M_PXA6moKmcEF>|8kbua2MfOw=V`Ght?AfJe4wqm;T0*ZW2iu&HMF#*VlB zF$8$@mMy2Y>ji3x_s9J#nvDyKj;uv1Mi(`4u=xr?WO}3?euBApbs|U|uR8dzF=n@> z3szGvn0iy{qc7J}UXpV9U3z1?zj37;Z#GE`2O@};h zZmCUep2cjqw2oO%j{ zi#~|OZ~@lm5R(WaNdN|{g)6?Dogn1Lr9_|7k8krVc`q?zwTH=Mekx4A&CeF-{wc+? z`9bwc%nu^(5`LxvWQT^6p>RMLVsaF?HL2v+31KMC=Ngj@X8DOeTZs4`&7tbt@u9R19S>gPcHQBT^}B z*{Y5YbVd$zE9Zu$QjenggK&*w^Bw|c#Ukvk7&KKLp=qlAcy}ykB4b(oKF2+XCt}ua zD-l~{qeI!32OEPqvX+O$8%ip+#X<{JAB<8#uqwN>8f!|F^K1MpW}ccF2GkY@L_*53 z&I%;qX9SEn@G+3q0gdqb_=-{Zg^)NS%Ix58X_|(#HpI5Hoq+{e=L~5)O20-vv&AZiKfRd>Rp)I5132Et0`$FdI+xnz9{) z@5TP1)~YZ;yym6Qp(%V&y?>?^&S6^s%2oZJ*LJ+5e@W1Si{(}kLB2u+9Pv9dfPCzo zM+#|`ZXC|45^{3 z8A$XBF>qoRPRU(yL^V50rHr{O{!WsP?k&tSU!XF;APi=cHszbSv+Eu;=WXx*^Bt#_ zxA-JgbTIV27+u<+_xKs+7j=@Ig2|VFxJA7(4<0nDLfq``l3Rmxiyr2yFO(w!8*gP( zTrW-nI^HvsGg=d?8weIg*>epp(fItNB-)~9TxMnPbaU-}06~%}2%jftz&r(J4bjh& zY1o8C^|>3{cWP0H&b#9u8C+v4U^p9nxrPKy^?vJ}zAmh@>?nh{U~? zpKCe0-k{kE<&HaN`yrAf)Rlq8z>%L2(%qt!ih}08JN$MxMi3RnNXZsx1L!9Qj^e3* z!%NC|0s?VYHy$$niN=mHj%zIAXhFogxtHYuyCK@S^CQp^r8n>506hSN*2b_$sQ@C6 z_4te&EaW(F_-m2vVcMeJfvfcUSt3soBW^$dPYSTT&F8(vlBFc+e_8bqAqZ+@-qk^3 z^l$}MAw{TNb5u7uR0Xz0X+R3l_mt=2KNgG3TPk)JpXHV8lEuxtV_)T9VMw_8pFE?1 zE39sg7nmgooiO^g9|}DlH27j};&rTYsD_m^Vz_O===@}~&dqJ(7H+-PZ?{DYJRQ?& zJNK63s@&-?B&$KAs{- zx5nh=edSQ7E@3JZ`W(7Sh*{y|v@9Rc%ws;;SYlj@z|+aKQ`}5Zl&}lS>(Jl;f+^}% zFpR5rW5nzp{H)ER=KZt5(HGV4p>z_{orZ2;I;J$T+MTq_8UP;_Oayj9vBNkpoC)AJ zmYLIeM4{x#~6O~q5RNSp64sv?o|J;OU0fP;u0HNwHmKESAkIsLm9na zy^IB>sn-`qGDO{nGlpcY-fTJBYLMz|Rn|3RcV^=zK8Z9mf`~u#48Tz6hbnz@~uzO4q1sHf3gxY%^mDwNpS*%dwQhR%{m#|ionzRe1|vm zuKmQjW(W;(T#p$veMVCkYUD<-k-!mOuP-Bzd+o1x&E|@;oE?56#O3;W;tD^>MS@ni z>C~BNj({5Fqa94FhYT-6!UJ|ZnbE%Mt)P6zAdo94-*(OW_j^%*EpbrGaF<672NEmx-jtO_qCv1x3 zqCTjcSX9TPvHWcRXHo)r?AZyQBRQ1KTJ$-hes#de(SNC@pU8vyP|pby_>vgzSYN<= z^I!ryB}+T`iqro!!?Q?m_*%1oKZ{Jr|A<7`vqkEpezNVIEh41KC~s{+;Bk;49P;#b zNHA&@iGyob<6$i@+mw@R$Lh$#LWa$hG2YAi+qKZ6Dr+vqDi|o4K>kKqk^XzuP%-(M zDBc7)F)D1`F+yBQoq)0?WmSHTakWJMIaNP{;}o%TP_ozm+oVVU2c#V^atVS)P9$lb zRqvsyF)(jfiYfYBSzV;2#124HW1#vdT8PYI61Ddh>~|Isw|H7g4q|y38;w;LrCB!q zmc($|B3-g2S94E+y#XY4N^mo1;+|qe`T?2~#2aMwwKU`H;G=u^jJMN!0V<91){p3z zTv%_oIsp~kH7@6xhXUXeCWkJFN^gJ0^J|3BDib)@f zX6DjTv+m%zL0jm6XQt_DX9|abgaFhiKc*8Tl>X!LuhCp+i&#J+Z>p0n}v?4Oj69G?4a zKf{s^OFQgRS%}qjZ$qU*&=ArWZVvg>e=hyVrU=Xswn^0O$Pu<-3P=X*_wX%~TJyY6hw!Wcljr-6(a?q%o;aH_*nv#JGa0j76hH@_w7Ox0a zE1L2g^}JWvrD~3(q=+!THyYRg-kpg*kLrW+#|_-$K^e^R^qKsbTW)^k94$kLil4W< zDy8!WOBbX7zGC>LW%K3Rr=sBJr!`Gj9h={9HL?N0(qkFdO)MWf%Zs zO!mhTGS^5v4dm}9_{k8Jiq0y>M@cAhB?MMG63qrDBUQcgTGl_cb)sezark4WJiWa-EL87lWw4^8XB+`qvLRU*AjJO@y4HD9`Ks5OMT&c-`Gf}gP7Y1XbFYXmj|MZXF6YQW+HLRM5CV0Ks}$H zo#8mhDsY1ARMR^-2q#DBF&YcI<_S)6M~+0LNbSQ`CN72N0IrHlp_Ez{L>Xu|8(Ts`=!{;Tp48y4&xX zq+-}pM(l0lYP?x*MyruC4|OVyLpD&0!{yqRkXw9Na6@3PoQBR|F%v{i^lG%m?dx(@ zHPOo)(AR5H{+Mv_4Jg#jKcz&5PKBxikbwPD8@*u|<6^$KQ7~Z{X@lVUGCSb0nFCZD zkVLmOEh*C})J#l+I_xJC=p#5~lunTJ;$1;9)vR4g$9k}mj2AGN)bWkv&?d zE;XchF>L3!BAp05U<@!6CnW_<@(1R0nMsdw&pZW8P51rdSF;WBZ_Jg1PQuTHU8H8F zH;lF{jEb~O0ZdFtvfYf~nenhv1Rf($eQG(*(`d=bd8mbJquFokG|68IC{5s)!Pi4|vjg=<^FgzBi)AJDJTqTAC4sM#M(KE`)~kZtzFe{fp=yxC}b?~j{RehV_{e4hPJ9=Z2fYe zfsDBhwplHP-yuPS2p$etl}u}xV$F0@RS!;$22?>aB-UrfN z-+_;M4LLB-TAlBSK1s~0SKq-v12Hhcx};&bPxPjGJ3TjK=J}6})8VSexN#dhRWlkm z_kwinu0jBALoMc)H`NQ9(-=RsKpgpGs{v)S-+F87FatMO%=h+0Z9Xb10oditqQ>>G z!!RT(QI*2DY5X~TMM^Vu*!HIA+ZIGueS*Lx20o_+0ko1t|273#hjVQBuRXXXrEJ$$ ze-{b;qp)}1CW@O79knE&(UWhqi&_M8Ac46}Q1Ch;Dg z(E9oJsYHIUfTT#43LlIK8gL|x?5SWZJf;}UZboxtfA^}cG3DBLVpKLDmhm`BmxAES zF?d-WMPlQgG<4S;=!|(N7RifjCkz_&5k^uH3lSzAoDsZU-QMY=o|BaX4L@A!VUL0< z`Xs&MqeXFz4Y*e_F5+oHI?9RIRz~qL#(9V)Wh!lMODoMXaQ@1bF^3bHXfLeab8L83 zZwsy1qtWVPok)B>WddvdFj(!IVm1sfJ((AuJ9r{UhLnj(!tBm^M@CJ<^20y$is|$NY#tbw~=DW*1}DrfB@4>d#Qs@5qUYncTtJrNJ>x zG6n=jVuKoWUwx(oAfRs~Eo0gRB8uOUZQ^A~OixhhLafx4yehayarmB;izi4Yj&G{^ zbUFBm{-V(s0}GF^rDe*`^$87)$3L+m!qtQahDEWc6OcDQbRj+$G-CX4TJMjbWCRxQ zbJ_@;_gZ}MBK!h?&>E#T@tG+7V{G)uQLd7x%@-Ks3YsviVZ*1?q^g#NvHC7X_++@k zQ6x(y^$oIX_VXM(St~fsIpHh7d@pZ^E2zrp7Or49)8n%KlhY_+h>%r@i@_|v#-sK- zDPeXC?t}c4?=d_+TnK75)JeVTGls!fRrPs}+))L4G{Qq!s^#jqyNgp4oK$xXRFDWrN9e}7X47adY0{6 zF`7FeUo#@R@w71XH60ytYcz7IOq?GMtXQ4T?n4)28A&s-59pEU3M(+F{T>xWd1{)p z>c2QxcMpyhu9k|n109QC4_-^`=~l~3>wy$WLWb@{#WGGRJ`BgJ@nXH^oKctBuxCRa zs8D{=>N@mSXUQnio$X*??WyWym6%9?&N1s>;Ef~@s5gvyY<>}u`fWtBv3wca<)>8A&hg6( zPvN?SRNLCdu^`)cOJ4}$w$EJ1oeZ!jYTC5t0IzE|d9l4IlVj@EyY*jpY0|4M|!xcDw`yVX#G&5K1)E>)w`qAxbo zxdIjqtJ&NzbzKT95zaE&#?8}+^JTtI5J@~SUqZ|@f@LNrCX&W1tc0Vv+TEzT)HW2z z>XR$}5whVB-+=I>^5uTHM&VExAsUN~0jcq9A}->L2zFKU0=C?W*x>v}vt}W1#vY6k z;}FIts1@Rbta2>wCeMYiYs2(>#Z`Jm2?UzAI%Iex5R(8?!}}tldH& zX`)?tSD$7!c`>2TDH2Q8LU+(aF+h?vM>XuI6?tC{m_)KGb{5ibkvqLslJy@C6Dr>H zs#@x66+HzNhX<*!U8dSxIPIzMv||6=Wi1Wl&8&S+oj<*cg+KR&@yEUdJcwp?9_V9X zRkH8tJW4(%+SCM5Hcj(Hj_Xa$AgCe)7_x7UC;zh|rBGpn^G?!%q^MxvCvyAP2Xk zMbLFb8WVCxbB4n5=BpWYOlV935l{euiBOXfm*_YTo|_&vAW|Xi8IbjN@?^s@Zd?)- zXqu;o&r(D%DvG^CWEI;q_D^qZhDZ`8=NZ|7E=d&+^LrF34h=;Fw_L@I?Nea}02y#cK^moLls)u!cLf$=Z@Cb3Rq0_b!IjMWWoFklrMyX9&!BNnu{FdgGShVU!Chji5% zvihG8)Mu>wrGr=vGp}+Pw~2wod6@b&PnsYrkp%k3MM1oGmhJ%pEgSWk$C}fot8Sl~ z_F@nvKExA_X0wPqdyMQ9*!`XfG$!_3gFj1mg3K3 za)VxPR0$)%SET^-6B3KeC2!$0iS?1f|HR-7|1&?1l^rxg5K}}SamjXp{hry{K59|eQ`@||ACZOq3(ZL7YR4f({1O_fZtRi~1 z#AIRfc$d!(+W(ul&u&9YF&Q_3fWRPL39nDFjTWK-Co#$=4Br9lkrZ2;2th@-^AI)g zB)6!d8Mf1^{*nYv zQ2rFOoUzI)0WIo!rnmB5Nas*;PEvD}g+)x@`3N?a8J|^8?cHb@KQOkl=g~wivO@nG z1<%flCm$V8Y6`}qABi+=dh{%W8g{JLrS=G9&jCYpYWEKv?P)eH%=l4TSaMz7=#t?u0#&nfP(Jq zCg6EEB{Jok%T-F~!oe~9V^{Y=QGxLZ1lDm#y^z32eIhGP6$F9!Q(gcgRCK`luN|s| zdCS7Kgp~%k&I3@fEOSKIdlTqhkKxalgH#q;%N(S&`sSTD#oXoZj{GekAu`QT@(vmj z6~-_b^i#x8IO`g|JF>=}Jfa|1E^L4|C`x!HA&pSzcia*N7JGgXS%Dl_g>11~v1|W} zNv0Co*Q{h@+u7;B9h=#o`I^z@dUJZ}IU8@q$AZ+Jil5SH_TP-g?Bv7fJYTmM zmkj;S{GE`$l}!iE9WXQ_w`rZ8{cw_^hcvq6gl3>*A8AUHF-UUpYbrs})T(fPvgSMr z86}5)Wd9i8M7*rf6UYawh#DyuXpCt(KHttRS59tBB>s6DdD;T#@o=tvCv5l{PHa@y zXq-;%ZQe3debq$R34#n&@V3jMBl?!;f{|0vV2p&BL`g-bL^#_R_uf=EL055uNKzyH z@N2&Mqm=M&a^Ew4y=~k}M_wF1B0JzCBfDCFf5>LpJ`oo5%vl=)ekD=7?$WCXa#pwq zWj(fPG^ueTCIF>si~(tq#8I5!2D(6BXVTEjm}d*{IYHs(_JuKE`Q8yHgG=_{1jR>H zM#%Vx?|F@aAI9i4Jls7P0Kdwf%JB*}4Nal(Q^=2R5Gz(jdN{&>t3VD!(|n7gUjLX! zU~|})S*O<^g{TVi`P(C>l=g$dg*5)zT<=sMD&z#8?xTb#_=xJ$csrufm@SO>J6VeA zL>ahq0Ey1*v7`Rh>^yA?cj?rTr}xwO+G87VJS$?{;fM9Dro*_61q+M-vKix>;D{a| z4gPxy9r4or?sAztK&#NLB@?0wIorypV``$CNDK&g_&V1r%9Sc$cHMnpptN5xV<$~KBc{{^DZqwVJKJeM?k z5Gqj>xr?USs=7m44%fpQHv8tLpN?}v4Bv$ZGU~8o8&|4c$ECkuDj4iK9SD&T8rq z`P1V{5i z^+HNjT^cO+?8Yp?glG*R{R9S0adXgEb*4KQuoD9#F!)nB_d_sH0QEmcLrE~$>u zZlft9zfebYFMW)s_1id3QOgff)`4w?u7=R+knIA|v5qrd=8}PYP9y77-(<*eUBN8G zJT4TsL2&0WgJegVSC34UlEd_nkKW*Mb&f#0m|I*-=l6)GRdYk5NNP&=F77{;u~k0= z<5*(iGEVn-tmb65`G>D%&7W|&*w}ph)0qpWAX64(%qR9IF=y@B<05t!(5KCD5^yR| z*0~Pj6~XL3!4RTzFmWoAIJ1EVfsM~Aq_r>3WtukCqgbUGj;^tp3&@XGq+KQ%q5oUI7Mi|E4Zlr z&B($Csg|HbsE#8f|Bjp=t&_)d9Y93mntlHr4E!IrgV|P8*STpF%`8MSf|TT4)V8jc z$S|ePLCrCq=P``A!n5kRIGG`mPl;4v07TpCuo_W}Fb=#-$dwhweF6>s z+GMB>-|Ci}nf=%fsGO)Cz-T%l zKa*SnluA=HF`Bv{RpO9^U)qtAlyz}&`xN_fA| zJ7#N^5iAd&_U>8gu~_79+#J9FUm6};kLEpx2XgbFf8;F(PZ?D)YPe_p{{n`s1=w9X*d0hdEt zXbLO{gu5~`A*|M6QO!RoYzF_AqTi+rPf@%aA7z?MifzdYG1QUcD0!bxvPd0AW#Groz=4k1$yqF zb#tbLVy+{gRL3@bbVF#Sd61%4_d~FXgZR6To8;?6ycRG6 z!?VEsz^boWmto=7l)b_c-(I}<;sKWq|gS+!%PZgjR9e3UckIRW;wE>;)<>E zK~=mb<7-X)h_`|=&~hL)wp}q~ydr~!DcTznWt`}r2%4!R=pISXC_7Wy#n{LG{q+ElAJGw9K>WEmWZ~T|-^w7i+LMiytbrnBVI-=+-WJ^IR+@Tv7cY69 z`YJL)Rw7idgmH`IHB)7l6*+Y?%Gp6jsf8}xGw^`;sEqSEGmw_Yw}@DUk)KAf)>xQe zMG=DVZ(D(W0yi_<{O&_#s_Y=7HCAuxBzR4QyzyqL}#-hfNSH zqMY5V2S(xbes)$Le8SsrN;`p&s?5>kcWpzH?+;Dh{Kf{97baK{IFe!z@yXGXtSF-K zj1ZJU>z!QTy6r)txP>?^gzt!eWqb$3T0_+cv=1?#O_1w6ExS!a2QG*#niv0Ar4}Az z4>!5QnF?N6piXHy&!U>N`G{?MLNl*zi6I+0V`EJ!6TBHGmiTc-x|uiE?eCsDAU5Dr zXFm<=i<~Q8&!E~5Qd~o2pNjq*oMEnRA-EtOH4Wm8Ge!gGCI$WhDD580gY)qic=(pK zJp&N=0m&9XPluRj+~_UcUknFM@n2EtxE7g(o&^tn&{^9*nw4ja=O{YmhdDYdPgfucy@YwqRcbK*N_wK?6XEd z0&pV7^W$a+3Gu6^HA`|M)_*A3FnF5phvl5aT!VPxpv%6yT2k=8rj;}C{KJm&q`UJ# zPJk8bl*|DLL-3sPH$wFY?p~{&X!NaRG(I`QFri+5zmK3Q8hrnd(;M_x@E+qpMm)H* zkcu(kOmG|{hp4e-Z z860$b#A1MNwS)gs`13YMa1O{&k*q`}WYqMXXK0P8{<-EhSN<|xYO{0GmsZHtbQUP_$%8+leeED!WHfJ;4r+sN`sld~0^ZaBTt(@aCGg zJznFH30P24YaX}76((FWhE(291u zzMj>f=G%t)==g>cWq&p#cU@Gf0VRsR4YtdK47@_#s`6ohG_PbJ2}tuj{i zmJ*p#!b}wJV{aQ)JlT_^|q% z4dw{D9G+X-%(CS;!Z;6CplMIa1h%-36ifF5Jrlt4>i?MmFy0B8iAjT7DL9CkW)WL> z@^N==OkS%yuzBYcBZntKpch8A+hon4)>m>?3)+dONVYZPii_IqGV?O#YiZ;p;m)q*6icr)z3k` zA+C7kIgE+>zR9oEk8R$6HCo=sxbI^NtL{FXi(w`CXW!GQBHu+jSFh@u-wRjof93!i z0||VMB9UE&G(Pto_A*un?!dx6=aWbHu}eAZgB!1jq2sNHN zJPC%nYRpvN0TG!cTy+wzPO49Qo6`Km`lPqp(urqe?f-rbc)0tHFkvEt%p_D#N^|gV zSUx;F(I;u=t-aBS^@%?(*A(@Mx>X1kX(x_ONS+m8aks<(e;74w5zHZvrK3N=4`D*W zv(SUoaQNwhba>b$q9GAkz@w;-tG7NAn&$$Q84;Ev;POQB`d1D45-a<1b}>gb^e7EK zPBfHc8Ogb39#}L}ok#CC%?1(2KE0AW<>}C9PcMCp*EkEMnT{X`F|ubt4qXWSCXUV| z%K7rQTiF6KFpJ#vfGrnO%^qC%brc0PF70Atj%<3V&uP)k*F<%y*AkvS?C^8yl(dgX z9IpgLd87FjH47YluH#K`CxT}NP>&8R-t>$<*|*Cu8JOe*s4k!)hUIP%(rTO{BJ1_) zI?NMG&SA*fnFStW*Z0OgX@T0%X9=}M4Mrc1TGd33WmyK^0?9Ez2F3F9t+x{6beVed z-pqqGv}FJSkcv1{*2V6&0fcr# zq-E}cfmn|91Zz*dxlMA)R6GF5mfN#5V7iu3~z=2PV^!Tj45DgI31ls#y-<7^VanB zA?t8bThm6BkgGIyq`{Id_xZj)?Pt&GK)~QX%Bih;W;0n0zL|#oFJ|!!4(k!$fk~Q8 zg3ujLK{qc4VH=1~Ykb&mSUC7EhP--YfQhwDkut11lH^0?#R=nwq8NZ_z``AmZ|YV* zAmSB^F;}oX(|p-^SmUfXsxBoVa?1<_vk6^uUad|#TCv7^kcBf2w%qJvNcUuf@Gu!S zCEVlfZ_*Iy9K$%P-tUGHtPJDvV7RDKV2b%a3k95kUXnJO5;npBjiDSuN`IZfD;cQn zHrG_!A*h+eu{gDIEPwj-+QhMu3}{&cZFHGaDUtL2Qp;Tu$5O2Y$IcD0;{ypWUOn(B zwti15m=`osWi9rmcGhAuWZ_MK;(tW!4B1BSo5Gr%VNqKTafim^+WNqd*ztjSRv-c^ z0d!ws^n%2qW>Lk^m^?!EC2u6wT3|m{ADrs--caV#`+h9rSjExQd5q_Nb!j!3^UD>ae@q%*5&AhT0V4U8v%{X}JJYj%WM#5ai>!%ON7lT9 z1&5VBGwZS<!;x}}T0=W7pHX8yQK_6_?_Vmz0zv9+7y^9D7 zLl&M+ohbwCk1`3edeW`%hiJ_z4$>`{7Mdt~ zFYiofZ8~Tz2n>Ru+UmCbMALW(gl!{WID<4`183Hmw$VRHY`cRFJu}r=)TC2tX3dR6 zlRJ5q!F>&)A>_&#n8b*e?GYi50*9PeyWo!$VMufL^GD(+DyO*27U&4{#81XuBGIm_ zNks^Ztyz24z{bUxW%9IY2i+uj0q=}(UPF$`x;8A-JJTLnLb~NF7(K8DvdHPfgSVkm zlm}w3oe1~}EacU%Plq(H4G@$lfKk~$7FL+DbqOfqS?CM6=2S!zJ4{u#E2fz%Oh$wm zrUFE)H%mB2j)@OW(z5MMI=g(UJ{akeX|RHXrb1bAk70o_C_uptM^`Ubx<-ec>O?yS zvqCtt2NlO-JT%Y1{wz#m?rd-EMDd}=CvDeLy<_vdrLUadm`W{SNlt%Equ_(9QVx$A z)Q+&A<7A{HSmTW?c78%OXnsiWa7Q-iy(#C}G7$&DGysh)(g_dK3zI-pXp39970oG; zr3<{Lkyazvgld8)mPshB{wTG=lo&wyzAKXsd#0Q`6mlwkn)EW~07mtxhl zfQv(d$_h1Q#MMi{!8Qk36r!;E?{f897R2+EGdjd&fc&!RLj;rcrfATJBfiVn#vu(# z(pOUt!ZhKLVPH0Ac4rwt~;{phJ8Le*A3;j z+}1+)j*9ago}Q4nk-JkoO-4_DhEvzBk|ae#X1%6_l}A5BfBU+l$N_mo1xwjATO?TsBPocAGb!#Jr-rPH(1! zfcZ#w(25D7^cyaS+83ydS#Wl`&1Y~V%j$G{#^9=+%g*Gy0{=KqR`Y~#FpU9v=mj>T zyjRh%i4QEeI&fB?vZE89VMpi|aZ<&brvi$$#lS996$DVS#UcFp`n)}iK;{}#EXItp z6#W*9(TRJ?C$Y^vr93ogFiJ{r=3~ceeuOd8sh%GZ5-6HQYLPc`5`ZWXIkoV<8WdCg zuW7A`l`%IM4=BCfTk^cSF9;51MAQ-Ar@9VCaA%GJphC(8cv9tv2t!dU20#+!hQy>h zM}*3vr_PA_bF~x=WYzI}73b8~F)^Lq z%K~#W4eaEB*nIfKdkjN66sjZOLF3X>OX<#%yEKftOYS_JB}K9$cayLzZqQB54_;l~ zk)Oo3@H!B~I)cnDm6%2&{9Zsk&Oa0+9YG_#lQXBLVDQSfed_E+&1s~Cbu^Bj^!~ML5p3xzxHmOP#kTJ z&fLi6gTPh2uIRmkY+lHEFjoqViCTIdp$jp`nlD+C$|n(RFE?GNK&DGl32IL)>aEk4 zn_oV6kR=1B_J%fNVYeVB)LE*e%_Gm>R%M)OuWUinhbxRwjxY-HehR2CX zH&P0g_QxNEPDe5V%F(oNPQ|>GOCBTFK8L&#o{^{7OzA=~pKU7zd7e=ADT!>oBQH&E z+X>hXOVZ|GPG{>$t&WSSg5_u#5C&3Bv1A4%c;9KFfglJ)fgJmb!44UU86J8g}H{dcRbZ`|@in zGe!AFN6BJo!fP6LU`~>n9eXM86KLVdENNkkAps&EXrH8xBVW7=vORc1-MPMvtcFU}6uor70ZZ^;A5L~6BS#&_r;8^ga(%9j0?sjH)+c_(i!2ylCLgA_4Oz@31aYV7 zw$;|n?Q9Lp6ne*m0PNeEJU;9FPak|rN){XghxS)&87BF;TuR{?s5kLt{qB2_)P1D@IonetXG? z3e1Lih=a2U%teJmcs-DiUB7{3T|%;K+i?V-vE7u!pi4a^-i@9H@@E)SgLmY#sMtn? z?1;x0fMQnxwfNd*-*CEgVrSF#$t?08yGZY5Q@ZL?#IzVmv(r+=2$a!-!UF(oXJDw2 zJ*-QFcRi3621IWVCHPtblmI~lqcFHhs4${CO3N^t15_1kcpXhniuVXK;VoRJ~V~GffmV-^A!x&Y~Bx8)w|jLm9bA*$8;wB- z5AlnrFRut1$R%J|sX9ITB2V+ZI?#zgR>+CwySF&uLENYf|J8`B`0Vhvs6JVO8sBt| z^XkdOpTfWSVh+N;lb!spmW==%Tap0xR?ZJhbD+t&HM9Dbn_U0{kF0yC zo@Ht}7Uo)Cr#+Ba{eXk<85x1Oz-$pjkX=kvs;zjhR6H*ymuReR{}d-n(1-?lq)4_A@^rf=qH=5}Z@(kVJ?DU;N9Hxr zwRI3!Nyv|{X|D)mEX3oA!$@0XK!fa(8aD}0X;w^QdBtzoox}*33F4FB3E=r3Lt*0( zhf*;V_KP4QO*`F$cD_pIJhYDer9v>Y!9XI{tYQ^cVLk|ikc^H9E?-G65K+bzV^GNA zkYTIGQ`AQUd#+-4o_E5bPoCCa3*=ANYryp?nAarquN73_=GaoF!1Dxk3ULUqD`Ty| zfJ<~A5@iGe4#Oy!JRopu4@4Vy6)~bPX+(mQ7U={kS5GA3K8^wM4u^6enP#p$9ZkWk znz%R(8&St+%B{UKMPi>c<`iO4lbfFizrh3(PuJ$LgGTni3&CpK~7db zhZ0j4biibCfbk{1p$z|GLi&iotBN- zd~8a}eh;zlGtTuUW-BC)&#oMb-VIoz( z8#U2UF|xCI8gT`r<#DY=g3tUiOlO*JW}DA_l9c-=VF+%HN;Zl$dggX#iC-zL{RO0s zD`xgJYnyd-xsh2Nx79ojd(5!<2k2Rm%se)O#*kNj=0@y%%sHr&p((&KxG0*lP@+g#SBb0e~(?}K&o#M%yB@(T!yIRR0c}dK36>@q6DC& z`pXDPc?xbg3<_V3NJKjNO&maM+%j}Cay2{ylQ3vH5`lO}oU+rL2q0z35gI`H?VLwk zmY7x7G6~h4FqS;Y^>I6aT^7?zx0hiWn-9&J-@q8GAGUet+c@z zz}#f?D+E!`HSfu*ixI>UkWPT+OsD$fbQ&C;LJZYE#fI=TOyXdek4>q39ZoN|{{37Cg!ir|GzgAZ8OAg|+UH*P2+u)u?_s;B zRh$~pit~wsCbA?CmNBRxKm{vb*ct;Eq-c|>MfHUg(LbyaJ=pWxGb+zl$mG@4;PkG{ zs5It@8Zy_Ea3=HWU6?(1XffcT`XIl0PnkryTba8OpKZP~@r4j{jP7lV_61ND0>w-c+uuAXF zoLmo3C;N`u2q(^qba?HW^AxZ>YR@jHmXU#kRn{MYuK$MaU-0UFnnMl1I8mr#9W|EkP2r zRs?N&-`V6up(!L?B2HSWu2!hWEpQ^8l^P5MSR3!;#{Bu<3GyJt1O7Qf(Mm7;FjCO_ zi3#?tsZW!u9#wuSK6 zi`_^@B4vyT5U8R;ssI?bM;HgyEv#(vLg)?bK*OJQ_Gu2&ZEfk;gABsavWVC(iqG)9 zI0riDt2#KHG9rM%uV>*@GuK%=*Fl+139$pXIkFel1&4VAxY~$Zg6U1b1?Ms5S>Lq?|7}1GLm@@%p5b(KPohR|4SdTe{YtXASNzdyes-*%_Oq0L_ z(s$-Zuhry6_E^y)8S~^8_nW*mrk>x`N7B0E=GWmQ#Cc$YPLtckm(@s#)OLrGGAXfo zZ84UtFy!5EO>$~DF=!ke$*aGHi%+H-#jiMr$;q3sPA)pA=?4xRxHK#q(5%CvcNBI>}vGl{J6+D*M~qW0fZFL+Dmc&>LD#!(b|Dx#(YArkGW( zB4gnJ5f&f#rB)q66CzWv{`5M{ofpysg=b^ty}1R4wZvB5P?E5bUlzQGUji34 zYcSsnjN)U`fEElnL{9a2$=7kL3ay==1hIV<)u*O{VPW zHiCmK-3(^|zIDsMp>ySKh2#k^Nr12O&IfnRN@bUsiq6teyq+hX%HQ8T4_)mfmM@@-RugTOh zfy+FiVVYHMG-UHTIrF#S%xVi`Mpqzsb;SJJo&k2V>NO!^>GDHLx=wY1j(&V$kP_h`gwIegyUEee zQs`~iJ~T~25&^)LmBkj@s9n=0AnfUbw#zDXZHRcSdU+9I#Fgm*g-EhBGCsqasn7-!eh5~Op6V{&qfz=G#yJ*emN>1(7VSIm4g(K|C0@grtlpQZ z0U5t{e>3*Jf@p$1-Up0chmieKbo;9JF`SvsEMge`-8CCD*X*#`~6WyhH0nDTW z_^{>Q`byFP;Xh~1`@gEHK@PX3-1ArKrsjM9U)J14ZKx{zIARRNnH!mBf)tUxq-mfr z{sTs%ljb#lhnD#&BVy5@y?ylS_O`jn1ub;}gumO#XSEkmImy{!ER!Sig5Y zPwT9dWd^q-H-_NR`w~xuHgw`Utu}16f<};F$%=R8%a|^ALECsA&7ImYWVD)Z62mQw zR-6vygeXNu1bLeyNvbql?QAHo(a`gCrz0Ov08E6MrRRenkOJu-kDEc zUeJ{0g@xkvda>Y^seHZR{2_me-Vdw=N$!l+-^AXHs-9wT+^%9g*(DM0o?H3vZ0m z%ZmJ}$g7~xGSzxjj*2rf|F?Ma;yWJbj><4`q2O}Yz0=ox_-&J$Z+{@LnTyz&=HBVc z54hQS=2NUJzvIq-zV6>n@bEc+(||x3-QJp>^o6JruW)bczJc73>u^N%Uep#e2I}`U z@B0SRMF(V3c|pY_^>M||=Ii%HX%({cQKT2||0^6&0F8DJv4mf-L$M@U5$?7^>Y}ipK~cV-jOU+-M-I^A5(+Xt%)0t+qF$=F2#MzNev zkEKJC5+Ri*e|$Z7EVB47YbGy2~-J zY%`WiM)aUlozdJAiEz*as)S?y6neuI5SJLrVfM)F2V7v_vcWzDKbP zBEws##^|D{&m2F8DPbwdAMe}4uE^P`aXS@1+hIgU%I1}KfVAq}T@n(nZ@&r$1~FZ- z_WTF=2>IL;=WT3jb4*HH+derkkU_)?2}YFwOF}I=VNi~h@D;Go6#VKqLkc+%@i4_L z;$r<0u*U<_stdDDqdTKATw4u7kP(Q?6w6#^`7krVmiClb&{Yp7^^nje7*0W^P6U~l zG~G<4rqP>_fr zYXhLD7-WTmh(yPHl~Ka{FTzGOMOhNAQpDhmn2N~IcCiGRp()+yk@v!?FpUmmhV`1i zV!>8|3`sM3nKca4^KkgXA-`R=VSYV{lCFt5`i zb$(DW3}ieQPW!^BIB@N#8rv_LR;I}Y1KuN-sbtaA4HEc329aVqqSML8sm7Qbv*My)M`dDHohjY&-Uh=G6=9j;qvoegiB8KGm2|k0_?YMe!cO~a^qy1X*C4;aW!iTG+#DEnJgQFKj3et~tEH$;6Mc0; zpOb|Ut2@_%8V*JD=dGg<-1Mvdyt2#;Y*8u)k3O-D0BpMvvS(g+3yCg6BW4H-h2 zpCp_TaWSXe&0b@AkUk6&vyet$$Hb~^ZXmK3)|DjSH7|_m7GbfFtoXe=rN)!R0;vmK z`q0{Qi=Se#T;v5)W${(!H5MO#=#QzB@2M$0ZHaTGdAXR`h*W5#G$&sur7mM~EFZPl4AS@VJW~QB-G1H>U4}mc1Cs9}1 zmJCZG4c)PY`Hk#P-9ZoXyZQ!)#}^?HQeX_QAq3uymx_ArIZVZx3-*$~rZzsk#JP9Kfy9l)XgE`h8>a4{65h9(^j*L38 zw(&V?fU%AkaTM(#=2OE|T8syo&LNKk zK4Q7q!f57c`0wl;7Zv&o#oakm&fUeKiA$u?G$>;07|xKar&Hky{OndZ6i-oX$5eMl zx_8hi*V+lI%@9E|kR8Q664~&GdOFOI^w0=GeH28zE<)8+;*CS5Jc%X;cZEBhjI4)} z?09K#4u7UEXcyVfve{2_;2w@O0ynI5eHu3_2qkac*Ir!1mAU1>nHcXw{QMrVkn0Lc zchW&Q?j4qqz=j=ohW&_|KWN`}%R>chzb#~CtfRa>!j$HtoZKAq1YC&%-7h#!0~Vh1 zoP-UCVRi@6MQ1V|%3asNP$|7m{J?!bh#{oEb8HSRDfH^)3$645~neTrtYqJs*MkG{Z)* z3nS+pDHx~+-oU<%d@I;&QGa~w=6DAahno<;URm$%?!*ZCgzw^$8uZke&$5W|F`4P2aEJx`^9 zJda*YA#n9H-^MGiPS)qq#^dOvvZW}FUP9KlM=xwVT`Cx{w)3KyXycR2XEhczn6>H#ihQX!yPC{;C80On#Byqw% z7bxGh?m3lrV9{LaHE8}@=pRex^G%|NK`k=e3dU1QzXL4pnL!%(s1IRQK zyZ{M*xkxnkA5W>&yn+y?57Exx*g|rAUKg^uB^vIe^SbQE_n7NbvY^M)K*xWEliFF% z0UIWYudQS4dGQ*w)kW$O4FhbMx-~E1%jz{mdBO||2Pnr=d}+7$STO<&9ZCb^%S?4y z`ohlBz2C~=`?}a2ULWB&SrS4W^0Hqx#Y=ptsf39u^O3sd%EI{8mhqKs<10J4!V^qK zkabCI41y-uxV`YrDIHHPosrzG>RYKGr^A>#P#j%VKg-yA0ywp=fznx~fx%NWQxqtL z)W8~arf~<3&!0d&$X8-V%MRx}?Z}_N-;hAf+;UBGFy2P1{0k&!TV7EtHFw?&TZY6G znAAmnfd)E+py~xG7-wMP1V`6uFCc00h{< zP?X~2E~mOu0i7TGSX~n4FupM=ckSnY)iZ;Gpid(LB8ol>;{h1_4I|ynMUI*oWgFSY z1M=%FOQgzjz<3d5m7LEMUb0pZE!+x#C2mjz2jKSgF-5qE919St;hVpQc#{=m{0_&( z@Qs$jLat7r5#WwH*OjhNNtH;k;V{u~A6<}EJXmpR$w4u_axi-z9kGNJ(rZ5aon(eY z0=E{Un@FT&^&e-uh}VYYTDBfXBA>5 z2uF}EM>C&1q&!udj>^*o>REyhEjBhOo=Hi+>sdoK1WwU= zRo+JFt`L|r98Q!qKq_IDU@c@CXnf{u$?U2EZA>q#u(oFHCVk;lTCSPRDg@+16TEa*@w&V9)HEs!FXxJ=84>XN&9QR&X#8oRT2VhuS+0Me1a`H zM#;OGTw0l{<%=NE+Vb(_M!FAgqjy}gIU=IE_dQVt=~w}c8N@8f=B~y_BxWms+4m35 zli&D5%Y0im%{YVf869!MjwaM1h`<})$uAb*ot7?A%;ClL>7oha1tU0FvwwfiUW0pkt2S>hQ;3Q7*~E zd_ISv2_;;Wmr7;YSlzmZz+W*XT?0%En|px*FjM_LMB{WPeCTtp-1`Uu$H1bY zn9$tCH6fLhOl%XEaSGO`bH+pQzb}3K7sxQI+TN|6+{=I+%h75*+-^ zuCq<4BHP7{tE-Qa1UL(FRC{dA78Ap+m!}dPpt0lB@hGu{UE%tc3>KI(f{>6S4~O-> zhmehNe|W63xQk8_QYU-2v%gnZ5?OOU&Ni}VOLhi4>5lC~9o4L45@KI5$V3MzlW8S* zc_8`nJbO*+tzy{!ep$?<<^IUS8K#zZ3=cuKMC%|a{v)D*4NucJN7e-dVNb=Nuo1UK z0fTByV~=py2J@fNSBIm^5tw`@PDQD8hm);&WHGE0+<>#i1J9CK9L-iQn?ZJ!hJ(&V zbg=~(Ee?xa6iKiNpI!i5$w@hQ)jgbtvx&ohjqQ}(95qGaX$(}xOMuE~V`njlj8Ltn zQQRY)GKx)Dz{j#S1dO*=FoI9Zw3fv-=#Bv(PKz{Nq84cyk=`4O0TT%d3}D4ag?lII zYuf3c3W$R!LudsRFoOy(f>-;8N^igMhh04oX%TcfFAi>PVF-g;eOpG85E_xft=UnE zd$twQTr7Gw=91iEF$v3BRD=^5=_KJ}-e|+26}xU@_XTW1+l(X&A~wE9gbEO)RZ}%H z4bh4~6hV>8M>)j6hQkKmBWJ^m)%gLDAM~Gd!hAE``yYAHO@VJH$bwThZDzJnx7CAF zuF8R38n8e-7J6ifz%28FGjbj(0U-r~sWXyWrURkus>`0mFCon>mZgVSE(NDl*LwsL zM2N(Q-6{bE!r-wfXkjHH<2}|a20>VIG6SGcnPb*Zo-^Rst`_g~{-&*#-Op0eDWDe@ zK`>%HsS9X!QyfKUsU3l3glcF?QVrZ;BO$3p-EkDHb2u8Of`d$mm*M_cGvEBUA%`;{ zH48Q%xHBooSb%Dg=mn0Wp)5kgh#_c4W@^A8u`PQ^WVjU5C_TdCaxz2dfJDMbGIhkt zB2MIs)74FKQa8rS0|;0gIc?D~iKHfnX+W$Zx&7u!()95?%DJHk18 zz0Gj_@t`iEKOrIDBbEYzCM&(k&I|Av05V73lr0oA!KXxcWIt}z{-MO$Z~U3CpAk9p zD-6HxJk6TLfDp4OL?&|})C6;y(=K@b5^ zGS-i?4F$R-Y8%uHBgB36%DlbhtY(JNH0841*B&)q)Jb8GoWTI2RFk0$Q|!mKnzZj9 zQ9XbYNPD`SBG6MXGjsu?+EGOniTCEFe>TDqE4x&4O{pEv=sd$Dz03tCnM~$ zKGr6W1$7`hU~f$7AH=@10YiHpy>fxXNPUsx#?N#G5{+z;vugirT5{75NBw$4iR+k+ ztI&J23C7DfVZtyn$7qhn5G&P!8usk9ijM`Ia;s;c=omA7M*nGkz2ZqhFiIbf6K8}q z(j!36Wo)2m{)QAF^R-9n{dF_c)+H2@ct*?iVlK6g8Q_TBeHpCd^!*`YkkAk+^$}0T za>o6M?0EE-#+s;_=sRFS@4y}CH+a{)X;_%6q%(#0A)vT^N1!brvV))^8h&8B@OLK(r+dU=-;^An7 z4Ij^8=JrCRgO=?h4gpypS3uJhk~IimC)g!$r_E7MFV|~8G9|0&lPL z@RRvpvW_9K)lNS-Dj^o;HaijZ$cCGPgl8C?&F)T?hELfW%laU#IZt+%6phhx9r^6w z_;y-#k=dwD+KX=Iko1p>NeTCHzQZ_5$X-@$l#n|qO30B|7sdOdHM;Ehj;Caq;6^}z zRnA;BL6|HP9!As}d}7ZZ&Q`+cK$e6(9qJI4s7v<2Z+@@kPW%|=-B@l1o0_j2@2k(w zH>M_h_Rdx)5}%z9%D#a&h}*63p%9wn$Aa@m%56F{UHyhKzML{Wn89(Hu4X1%#gwAPqo7W(|~~s zT+c2U(*5(5>n2ZJ^qLmN`Qy>xuCKX3^?L5w5Q2_)e zxNo|0f%TzFXG;xD3~D_GM<`C3&iNawf3d&>;|%cq<5>3MZ3SjQ8{2U(b37gd*)on< zK3NOqad-}cHsck_={PVT0R*DQxiX$;sT&$~Vv&hDZi-5>oo;zHk(QLTpA-gNbz$UuXg{Qm!0Ie_8cC92Sie&exN`P)kCMfylWKRIKnq^=fVO4#U?FQp_ep zAsuJTiW9^H8IiG~B8=`c$6>=*mYnjua03%AxO1< ze8&J5`8y5hZ92<&?<>=JUtgq#8o9u$GsbDjq`DHKr&EI^Ov$f|FUf*FW^3@&aO zX5cl*4x++ER$z~2mChgf7biN-2#9D5jxQ98Y@H2WC-s#LAsCpFpdW7^JtQ-&?A8TI zhFFQk1;hFtOkoeY`aSt(YH!^q_6jdC8bwx!$d63=1i)z~i(u*=&xy$Rj<4y0nkKg` z*-H_Vcji~$1}OgPa&*j?I_h(}Bsb&!yECOXJ! zP*(mZN;~XzsPO0MO{u9dl+E`t&;^Yc&uH8ZTHWs3ku#hbOf)*i_H?D*cZvIM0?ZaX?i@bUmJS_Td6~#vpJr2?rBF#zG#3zt zkq^;UuYzEmwljd))!Apjc?J;k5_|qOLR)jX&^#jsylsJLiWXwg_~JMcwd&3(B4pB| zRVrCS+vr?bB(LQTF0nr}bOnWu>j?^VIONH7*-Ix(=Wm$Tx_C-G?kcswL*t9pSwzQB zP0fLp?9KC}uWAxENg*J1WF|J|nLov1#AmBNnTc`;INyRRSiiZ66B&V~)7&#o#5wRt zty33OdU}>PhX|9W&$o(i02*5B?x+Ep>b-7dN8~aI6bj|-A05$2GNr(nOJ>kibr+0+ z0;L8a&SQq+-JudH-NurvbA`z`*iGrr44IXSH@iB zt-(vqU_k%S5`9!`f63rV6-=1$&ID=Qgg+x*0Tca>1UB)vw2~&yh(Zh{2R4ItVrY@|7`9YsQy}3Ol{eb|w{xZ7|W0rGx=T zAObct)NM0^5LC%L8I5f$ISJxzE8V<3b)kKOH}5>%A@phQv?jTbR1k!8Zq3g!!8@_98KcvwR@GfM5;BQ8m}z+@aa9 z9NX_Pu>y4GKMRr~3N?Y_#J{cC`}5{O?P@-aPll<~_YsJYZCIcEc+VJA>T z$f8~sTpo>>E*Bs)K*+9GJ{|Tg96P$5=NXeEx}d@Q88%K){4+TRc?2sJ+fFyR`fExuTPI4&eMOt%Z+bbQxy{y=z27V*gw>iblU0;` z)D>lZCGrC@B?}|dYvP1Qw~25X91})T0hx}<6gKtAwn`+Pbj`v;IJXq|$Foqa_HGdG zq$^$_oC%B&5`1>UA2G+QU`@LkZcVGw+K6!T%@0F!)#;24bfleCpRE$Fcf!zO%RMtnaawN;E^A!7$2g!R!1i@_3>;v~~3YGWXU*F*xkyGV*8|Z*fY*+!OVUZeavMt9jrjGf(si2-weEZ zZ~|6SW6q7;-Wb+U+V$FBh#zyo9si-+ec19ScuUHHnnaUU+$sRC5oV(1R1Hjoy3NI18hJqRpOyVt0KEf7sMx z!9OwGW+sf6v){o)iPI_kJm2iUn>4}x{jsu_7*BKOM9YU_LRg@%ZaT@$_t8z@vblu= zK#|ZTz6t!7Mn(57e2EiH;HqM=A%*XRe@?pyZAx$dKVxqLXIWJp_@0k@>sHmN?mpcV zP*M$j?zJPuKx@BlF_}!%hzTlYj1o18FB*CO|Jvu?u5QgFV%ItMoPG9Qd+qhL z*IIjTXM;?^(yl0^GhyHwj1uy1gSmn&7@Yd4pk~<}*Q+fc3)jL#gQO2>TNF-(=s3HS zc6mrym}gQGk|_ulBeH%Dq1(xPho@cS`Uqf!XdN7P5$Z~-j5Hj~-z#Msc%3XJztEyL}sO;B^n-GmWV zzBORAT1w+5N}dO)YfaIZDwISfJ|pfujpG^aNc{-@}+;6-=9q%kagEU>vCVH@i9Yp^lmhhW$`( zsE@j>AIMwA7e-LX27^bcy^eOWYbXMP*Q--QnTaAIi0-7J56PT$9Rdm5f|Vxe&P|agYYiEAl0nle%}EtIR#fEsnmjze1^5dxu01m}7ZowY7%$z`?@Aw)PVz{AIsGF6dj(0w$YN&#dWV%kbVscPa&ows* zOfD6xI1xbcIo$a3?ua4bIFt{lLfVYibJf4k~-aF|DhLjZu{9;uWDB#?P`2{!)~sh75PcCa30&ZdJQ8!%VEO>_;>Dt2NR&!$gg z7KKG32i$}9Od8@ItQG=Nn6Mq*N(d%pt=Jtb$>2HGoYB9gyp+9EX$zaMBTNTwiN(;& zzghj1j=Lwg0tEY`Lg+mm0$)FW&7)2GOi!l}?|O1O_GB9I$JBA5-d&hfcML)$MeP{hPrC?Tbb>xoH0CD0Fj+$ zw2u6Sr)#Q6rG~C4FX2Y)q)tI9mGTo%?0p#<{|fZ@KWctBHt_F3{@AR{?z){hf1AG7 z|07Qy>h0Od98E~##7A?dYo|zJ_Y+SX@0>z{S|Ww`h)ktWT=uaoMfk48Zmv8x+Y^*-7n;TYSy2&NwC+B#B7(R zUoYSno=;?TT53njA>A;Dkdriej-DZPgn7G6PPR+RhE;gTJ~QWMm;{0Ui{Vt22h^}9>i+^4H$w=Y{Kfs|~pHHN=j zrMnE1$A@9bF}G&%UhFLd;7poeg%ZWij>NNAa)pVe`ITB~4-wlUtr6ep@V)o3jiuE0Xv7W_(rp>3B8z=R%KoThWNa;=y zh^!B;xYzzurh>HUM$l3OHV=(A;&)&`<2=fQu0R&}!^CSHiYjm1{FP4-yk;-#1h}-7 zy2>~S`WIpmx|p%7a>0x_Wu#AwmWiV z!xHLhfh?+bDBPm{QC|NpOy)fn+O_G9^WUyZclg$>PIu>p{a`t~Y`fF5vvhDVDCpkE zbvUfDfE=N;P zQ_p<_wT3hh7;Qob?H9~(##5{HFa_@7CIe|{AybPOS=7VG_q@U_PCvk+6I!%gVga8G zZ8Z!OMQ5ZuWNTK-Otr-KXzY?jg-@Cda8)YOWcB~VignSg)yqKDzuhDDm7K!-y0<*+ zzA1!YRyOV@nl>@104j}YZf1ByQ}cL`EUb(+lo83o%0e7qZ*|F#r{jcnqr&zbCk^?E z@yFMv`lc%qS({D_j`^c>7E}r!M$9Gon%4Thfy65QI^xyP2-79G3-xF1?5Or@#5AIN zdHtCJVO><8FV}<0oS!KT|mC3p`o1E7##^Sx8GC5e-Ea26>qt9q z^FXF|pcUm~JyzDbWp2m?Ea^+C>NOKRkygS{=E+=%T>qgGp7>O=(hncRDTBB;1M2QwpU2Y~sl@hKV#b3WC7{ z4%0Snke+S|zrKaDVc8-sz$K`Q9`3M*Q?gYkf)4>30+R_>gO7|#U~o#1e&7Irz|B^v zR?hj2_uc*>Vu+3T1W$jYDDsZT$Q?ofxJV8vg$583k3AY=9bS-)Xez7YM2=r8C_<~7 zF(lW5lDkg;n1aH)uE`qWrTuuSi5NMgNL8?)P1zM3-l!h~rNH)~+`l_`#PfOl2^}%! zZ5%>C7o%%#)@!-w*gO%173eEE=Z+Dil)kB#GJ5Px6eJQzr`5wjb&1N5WKtPeL@BUv z->J#`&R8D`)C_Kn=sH3`wAMF~2$UgJNBfPCGQF8-)ztjrqKeH7pRa}e3upGXUh#tZW zqKDEzpk(hifhS4Xy;me~2`s*aIyU>1(TU7cxVZk5S*W2eso4SRyRkWMU~D@cBNXlR zTqmWr=vY{gs49Fc_1hr_pAQ+4z;Vfl1|+g){Z&%iVvFnW^2&5lVRWwmxCz!22kvu0 ztH3~nU3wD?kPIx{Q2l<&-BlRtzu~e`f)ktw#pW)P8pI|D8Gd*9xAS37T|P3WsQTfg z6={2#7I~0@Jtz)SCfIABb6o)j`GUtji)^y4qzOS9v9YYGE6FpyU|$4K)l9o@0ZBq> z6TvxnY{uH+jCOB5b%YQ-lSFtDa{3+s=GfKA+BHr>1QNPb5?W1o3bpXlTK!l9r12P2 zd&)ET%sBQsGLgd-shGM)D6yVoOA`O!DvM!AAQ|@(Gq@n%Eef3%S$nc+Hf%a~PH{OG6mS+PvswF$^x_m=gkNCo18byU zyZQm*x#}YuupI)2N82fACo76P+Ucsp$=_ASnY1>1YHB#QT?k{+t_7{vX6_z0ES7p*PG*Ybxxp&y~Xl06FPgCLGnfWm=0Gw1Hp8RXDounbr(aJ zRWAxPOr5dBI%F}E{$?eY-Shf)QYuybd2A(X$Q`>s$(fHs{q^tJW#&Wm7npZeHAsGx9Pu@n~*8*d;CU*r)Y==ELa` zK+yWGQ4wdG^3^@a47fLhO;^c08z80P(SPe*;E@rns01!SpyO5sLm_t_WS;7bGP>QA z?aiz1DRb+76RDW}KFz#={brK-OD}(Jb^i-*fS%)BzAuHNY=NC@e@0g$BXkb11+Y3} zAdM#W$=XFQD%oQF>fcZ*26|g|Cf705Xl8zi3ZO(6zplQU_nVrd$+$)ok zpM`goW@o0eaQ&isSKdu&J;ECNU^_}@;Z8)YEkS*%#3nbjomHYCD?oDYn4D48yOJ`7 z{1lPaaJIPz?YG{hSVW{lXleMG&`W9&M7E&<<3jQdpMWXmxwplxfgAfw*KgM&1t3x5 zwP_Q;rQ#aOaVmm7lJ_||j_G|&DoLi$cLE3@Es*%GGJ5h2$%)U^+}$3FtZS5)KdZ01@cVYe%d^i~+;}$9yxPaJ+Y+ zU>9q^E(AM$7nzNYJ)RMK2;EX?KVSicE@ZVUc&Cljy_CS+vtxR)!NKzw8^+f}*1QYZ!Wb`6LlWH@F2o3^6>bUUGhGUGHCyg0Sj)yr1VFWhanPMQ}xhsV!ph?yd zMgVEpZcN#nB8qs`G!%iRJwM~ju^5HvL{b>!X;re0ydh=){5hO)H244$BiYcsZJF*W zTYz$~*_ctE&3v2!lFasS2*w)-w7?`5yv_nL8Hk$aJ@-x0smKeF<98j_qxE zEHU#T#b$rJ{m#?mR_OWR=hIvES;)=u>OWr7* z2=BzXtce9ZCM+z(*Luou-hc1`*pqg^x5hzJuyPF7uF%mGdc7lLx^f(l&O0=GA_I(M(!)nd zbP}PBX&Op{lV@QlDfW6vnjeic5SBEv<#=(9+c86HcDlh41AVyfOYV+VJGk)CRuymD z;UU|FGJ8jA9N8-PFj27Fd01CR0iObJB;p$E4iqes7G@Bj2A0S2xUA-bV4pyvD)&%_ zU*|}gpIz&dAdcri8(1tABy+`bFdH<|br>KiK!Tei^HWX;Ll%*Uubk}4VKI^0Lb;gz zqkfoBJttow;8U|*!42)|cLqclsA}p(Y}4N^+`tK`ZNB&LftB;dJLx$S5RuflOwm-A zf?_myK)nqN@rBsrN18Z5HMtW94h2hKrY*#sP!uZ%&n>S{m)A$dQRgT-BU?B(;{{`! zHRoop2WK=(V8>u`Hhbij4Om3!MblQAir?H{PAQU4o-3gI+{I54{Ng7bCBcHpBD;or5P;a3s@_u-^9M`M zpEO2OCPhU5MRWaF$`>fwJ7&}5iX_!Dfdf_lgI!lc0H~>5qRU4soT4Z|1qrGewMlml@4v->rRBrHL%(4HvNGLf&q_X|wE%{< zC^Z@;L(wM7*^0I$NA1RzsmflCV6?7KSqvMMZ^u{wa*)MVn{=57N(eJZST_rv5(at7 zzTrY&8D5bPi-}8F(!plhW+iCC3Y;I~CbaOj?3pMFLl@i*9eJ(|i=fz5Yg;yQvBwSV zEpPeGZ+e2UkNyRZ5SHAX(Uo4Z^l0FtGjDMB54n&~$WaS1d4F&lZUyD^nau0+vzB|t z;Vhge|HQ^j#q}0tF~PaTl})jeX&FH?a14n_UO`UO#O^89R2*HrRZJFdrTwcW)JEwS z{Ig0^kTCNzR!~s+I#Ql=^Tk<=U#jFDjSy6E2Ft&JjByMTmN`7djos&&EX3h z5p;7)z!k7lh~ zB0~i=CpIUsDNA$mft7~o%~2Uy1OVpP0t4Q&c@D??i*RuQrE)QAPI^F+fI92Drld~q z32g<};ZVMmBJlYRE+<@&uf!k@`3_m&3Q3yXKRn4kQ(HVn4en_+C=FIu3;5v2*0e>|HU%X%xm_+aMJt z8XA_+r&5+D*Km2ls3p>3qlL78C!eXg_)m6B74_!W^@f zjhx16ElIdzFf?QFgg{b^rB;%Y$9amh3q7@Oe0!o@Dhc_9Hc_O+U?TkRq4Nt_+PcR^ zq2Ckz2=n>yOjR9r9y+2RjvhHZ#j^I!v_$X<;bnK*!4yFt!3X2{N%gK?%$0n7ErLVhFpwKV$1FSyf7}^idpr&$K}R$ku|{VhF|`|M9cx>` z#@M7J9L9LktHcb+1u=cD#%sd`?b(RN7p`6CG!RyOjj^B>aF$clAw1(WNz{+9L%Z6; zts7K#@SJSADULcJ&h0i6!qm>98@vzVph|@uUC{~gCw^>q&&DuA{Nh;}ubn0RqFX!5 zn^-$Lmx?z3jG{WtsP&%wpHX%`mBp<4r$InmA4cM>*>s#5LMy#w(?_5$6O&+Q`>P*og zT>Njt1m6@mh@|Cb34;DkIQ37Bvq1yDsWPOc~~E^;fww12i~mygeCQY!(c)`>T3a zbB9sM-2!)*1JHzT#Tm9ccc6wl-v(6IYUYT~;>vTOL8ulxQu}XgN9LGJnzzUaI!A%|ic{bCt$ z+Gh`eb^`*VWWP1C#-n9TL>^27OVhiqJ^ea=ym(QO_yXjiX;er5LoP~6O7lcg^%F!0 zM78mUnf9R4D0vokuA2cZobFe4&~yLUVs5r--#|ARtNz7o>ocd~Ov-_qwhZGKD3eBr zA~M(9ASULN!1ujm6JQC&6MCCTObY$-_-ylJ80Cwd?}y#4lEL56K{cKgCAy83|A};i zz+?FmnR+W*Tt(CAyNKGtqC#tIVEie2G9G9D`Z<%eEA>D$FS8euPqu1?v5EQ|##`F= zFibEz2EG?!Q^4mHJFMNJOgNkU!)R>R5K4e1hcn1^mSgW{sX6tZcNHFzfF)EnZ<4wT zLp%ThEwC?=)dhm3wiI75qt}5KfMMJWJsYcYs^EQ^wZ;Z=Y#+xg(JjzLY}USmIVNwV z*WG@!BTSMQKS{tzCnOOLo&=}0#z;6-ly)e~>_SNA0Un1J@@#M!2B|qtkaWY1l#S^Vsh(1?wB}R{aY>bYF!hoa z-dkLkcU8+2e1q|Y>qX;B!j`_*O^+Mw4*$_NgIUyIBsC>MxpaPQTP@48$5_p2=pbYm z$dG`HH9}a_KP9P?90jSvs<9v`aYPhhjWHmS|9ed!6UgmwxZHT7LuZyN|DWJAnO`{I zJFKRb;1&?)<_Cf56fhJ9JUrT}n5?XcDKTYrlTfr25u$z}oWr6RdBpEVOzX$xmgtD~ ztC$*N*Wq(ooEcI~oTIa8c`u@4_`yX z>OE-p6+Q}q|MIv~;9nJY3j8Z+6l1$cMs{3Q(MbNpb>T8noEBbirg*urdbK(zYmY>R z-`brW$+*k*wE>-ZBnWOuX_A4tonOp2F==!Z+kbizshI6|R9w9_yPQB3m+I^;%tSZO z3i(G)340^0_7GW+dXt-Y;^6V~C5v2}OBbsL#nM>VN~#;z56V2_e+K%GPiUamADtSj zTI1SON^*iGyFqUVnJ#Aa8+viN7|%4alFr`2D0Gv6vxZR+PoSS|3iEq)`hrLjVTY$F zQc={)n}nG{R9^pnkF38q(U>oEV>_6nGqgZJ#mSB~7);@K0VIE7oHAZ2Xp>=bq?p(t zgXDOjE;uI`HN19w&g$3}%PKzI%%=pc02sGGv>Q>9=*sDOp4?&B6ma( zCK>5ram9!gqA#_({J$;GtA8>i;uE0i?DmcnTDA>Oo|q;s6-QDgUkkHV~8wGh}1n-3TXHt7u)Ee{nA0iijCuDdE%Vq8=>>;K6Pl+??j~&F^F$qX93*}s4@-qU zR6)vR6sh+u@{D>HDNt4ab}Y-qseo@a|C~CO+OMpMP6BaS^TQFUz4oc}rVpB&*9Dy% z#a*y)ERoa;aW*^_(;Lgqc@n{rP4S%%pr`gbsWyhIx;iTY3{In#icvjkN0cYomSfB> zw0FNl^T^q$8<@4<>5{|Rvm(t&(Kg?{sUGJp)B^A$itva+@0%SA}KU!A5YNMNGnE{ zCzmg_8-9F9)nNl6XW1d!UCQmc(kiHmJEjnwP2}^seJoXk86UK>wt#{JX*u=_`7!dv z+O(__l@h`GL{a}T?S&MD`U3r?NSoYP{k{r|i3|bG2tll{P_Su=l~t~S0$R!Aq)LgE z->%eixJqfOy}j4!^xLwNqyPu?WXvhbCXaZ#%Cq`& zFcwtM z*HDHTG>iYkl4jN4C6b!+5UIzMCgh8om9R)Xy9AU$mnj*cd)yv;?Gd&j-Xy(tk64Yf zsXCK-N`R;0@1*ssbCA$lk{=UfQJol_oomop8hpk|zB65&-^nk0wJ4lnPHmC(2FO&?Q?{j`mOs07F3(un8nI>NvOs% z6VjJU$~I@WnTOJ<*rI+sWjah)2u|IENgE@Vtgw|LRl&Dx`E&F;h@zBc@U6uRI_AXe zmB3tAh9^Na28}#C);$~l1r9G-cu_OVZS#x>14BJy=Vjt<>%bW3-bq%XcbUvo z{UAf$K0!W44o-Qh7#e~14GHO4``|mr-n#ea$?m#UuC?^GESqfdPYP1r`Pu93u{s1d z0K$uM`U@U@d%1_=+K*-Xf%Kz2#1-IrwF^gl@%kIun=V__*;%$9ONFSD-ZBc#!eXY0 zP+{A|=XIot*$9pVg|9Fn-9{(w%E?_X-7$u-W*g=*XX-dZv4n0#<)J&TL z+zgsc@qFX)&todyY$R*)NOvsh#yFM~?J#+QCx#PAab(f>y8bDFo`8;gb3g);X4;#J zE+%12`;jP)M#2>1!k-I)H0(&?T*ByMcdH862Z?C;!VvH}3iIb#fp8EtEq+d*8?yJT zM{4;nkTaUKpJM=Gpkt3HE0>hOORBqK-b9sDk2TDMV}oMEQJ5y6N2xgp4*1sz|4v{p zE{XCtu*F4drjTE;%~ZuGJ3{V}l8ryr_=w&f?COmdY`M!WVb0+xS+Tn>JB>ep#M*9p#2)Vla0#P0o}GfC(mhp>_*MG{XFwq(EP%&l7-y}$@#`5-@s}6!h9=Cy zaE_$C|7*CeJ@gLUF|a3{{Hs6v$zPfhvFqD6=KCn}tpk+!#)!|4yrZm!h?Nw8h%u#A zRxH;_IO39urVYS8>rf8Zb9A<&={0;n*+@&4&Ng6XoeFPnOA3GH5eu`ouRK9vNTFH3559#=+?{kPkx9q^IGZ^i9GdWJcH)p? z)a!R$G?B6D@ITvrN=f-Ny7ExbcWq4rnz!V5&>gnNLjk#Jk-@N0MlNB46C%jE!B>|K7sV3zoQ0xh!?zcoK|LDIZodlCa?&r*06$N0)q($` zooJ?pX04}=u+Qsy9C#ZkmtPV)mSl~kza-((3m$iyw$h3qH5-li#9j1_!Z-3o#N|gP zw)5BRA!;<5I*g^+)Vx@2Ub0A$!}}qsb!wvl&}YMSku?ZaO@YdFEi%izPiXQ)8dRFE zLm3U90p2(Va-kg=_74u{i{`}3Qp}XwISJ}_86T=2x$A9;tmJEF<#%0 zlNgJ@PL3*QO(Aj$&^P>%=I+S%@b}I9U8w(K>HHlaO} z;rx)8{hUdX(38z7299YL`hsM>U%OTU2B*Xz$uM0Lptk|HH5XFz0j@a-5Ew-pPL_n+ zw5~oqr~>9nd{=fP+Y#IF#O8!%qnQW6s~F)wZVY_AsuwymDQcNEtrM|<4|>4eqv7>u#2T=LdMM1|B3D1Qzg+GvZHX4IHX*)&^B zlHAdp=8^KNz5Q1~+Q0W!Ie9k3LNpS*D2S|XNn=4!Dw>lAW~*l2487qNerza}L9-); zQcz~?C4&eL#-deR0WMB{hTORqh8D@DrGjZLb0|8tGGxn%lO4zAWL5M@zM1xqVjwLq z87*|v>(LY&4kLUK6{SV$h8WHUWJBx^lo)?B3yFZhjQ`}#Sf-7CCrLsjmNx2xxY61{ ziy_9|ZHpnu>>Lzy;*0sS@v<9eW|576@-$Kym*mE1g&l6TL|$S_UWmX?$YgPsO0kQ) zdl}@!OUxt*a5sIk^|lNt>0YHMFXZqdhqW}DB2i)@9o^Hp9~fyiwS|5g zJ_c<#gp~$vs+6dmw7w9~%=;-p;ZiXMZ|gMuTEx%r(ypNICIBZW{Ls`E_(xFsmk7-w z9i8U;_>OcPwWvKq7boR{9FM0|k6(_?OtR_dS$!wUiqyM!p{o26P-@a`qXpZb0W|R@ zqMuOkTzhA1o-ISvvYXl@m8`yjV^iB+Ds;436W|Kbtr6R}R9V{Z5e7cvTTVqi;- zayZS#ngXlII8{ocU1LH<~F-6``59pO&ioG#ixFJ%B|(X%l%|dgV>G|3g1F0 zb`!XRAn@jiwgS1Fe1}KjQttP*WoITwjPv++%p^0mRJ%mbl;++{e+!xj|5W(=`H;qp zCIAi|dOnLWsBa}CUB7(>5OUgtgo1Cfw%>jL`BHz3>A(gxB>=t?Az_DuCC}lfH+Y?R z#tlyGZtc`~kLCw3G+#}XKg~90S@roTX8pL{SUeKGruMP$!sE$qFM9C`P#wMbC=qq^SS^@|w`xi%IXH*TEXv~gy3YEW&Q+t^>X zzTCK>-YC6*nK|gChutyP-u*TL8bPjS=!#-_s}Ig77QBBj-Phh9O7|pNWpf)VzvC-F ztv`X2=-5iT3N7Q>1_{Y(<9>mAs*U@ad#a85>ACv&YT9qTHNmD{g1C-tq+RVGXZkqD zbmX|V@4a*KZTsu#9w!=Pb&W8(O$Msa38Rf zuXgNr`iJ6M(MC4Mac`eq^Oi)1LwBZiChddWO;=u@%#%G4=paI-x9MVP}n|tf()&o&xe2Dyvt^h=P=hIQEMi!|A zn49h6-^pV|^O3(}T7iC5ceJj%WDmqw7+oMbqkxube!QIsLW z%jt}Vge^q28FBCZxmfG!;NxN4kPuOX3GgSq2xvO80$eIz4<=_L6L(xhLt1Q)c&ZO& za)=GR0c>Z{;4=GI1U2y}Wn354Ck82Abc8`A73$DAECtV2Fp%q&dRQZ56OlNV zOkL~w0R90|uHi0u(^PsD_S~er3`djG?H@l%7g3LLFJn)7e$vBKevgsT49$vrWBeb? z7srl;vNRVb2vfTrD(9R1FA7@7o8oZ&J{Adfh(N)Au{?!7VL+mQ8G8wztE&GwN(EmP z@k|tnJWMUVNqz?A6n-Y5*zs-IujW!KzV>8eq)PD)!&2hyF08;KDU=Anj$|iyg6$px zGy>gSx(BtT@zPMHWrk@fU`XLnnCJ@`Zd#$jwwBXV`wTx})9@3fk->OiWJ&;ZP?*>9 zppLQ84&pH@omlMx;J^f3+{cn!2aRCi!X^A2T!IUkUSB>2LSfv3vGzknY{5=@AA+qN z_CEEpZy_UXiWofo!(*airn988uU9|GkVb3uQ+@Ebc64#wfxDmqjFr{Z>(4EhTRf)@ z;h`eQv%KD&++>^DH~+ctek_MrH`Vv&_?{gxu^$n-`aN#t!|x?(;L^lnMpW;CME1l- z87zcmR1qcWGet4)>bK>ZWqkEuZo70htgv(V&3pEa9lJMK9P+F9dD|nN)YnYM4sHw% zezrC+THoKRo;A@NIc2DTF19DOcYVy7Zc!kHf?0{c4RWQ^6cP=aCn0ou>F5&0mg@*0 z|1X!M@N+|LsgxnIUiHhli^s6M5wBL$e)B(*l@oaq;E*%b+FXO&Z*E8|!)|Mg^R!cSmg!Gwipdf=j&uzFCNk_JW)Tw)x_}=RxYj?{>8&uf&w%yqjDv`y(xDsk}}Wd7zhHEpN&TjCldI+ z+(F0__R5v{1NFP1X(UINjbd?1y`80SrtWcXnxMox|6`;GGP!s#PuUr1Cx`H|@xgX7 zLZ89nt80T^pvlWM5VRO@#K93pNoXIp{n*7H9pP9k^%TOw{>&xna4O7JS1!M#b(cW2 zw?S9T*Xv&ZSi8Z-YFv_m1ph@_!u=tMC9gj~45D9MgUg_OI2-2Wa^W|uW}mPL`%u4T z7avypcMxK1e!|G>CT6tz9dGz6DaLxv# zoZZI>J^-?xp@|(^nn*AAQ}cMr`h#)ixTWhItf*<9Fl)8_?5DHD+??x2@HwFG{KQzbd-r!d z*^;srG87IjpPipg5WVF+M2TH&@q)9~{T84xJq2uir{sx**IMab7M97+g zKpWmExcmCMc&7%HFL>J@4|6a6sxPBNe`}=;;KQPlxm5uB0 zcByy@s$0!1dk*(a{_OlSIo?Zpr2C8l+tDFh&SD`UVKGFIz2_PUSl8nAr|5Om6#<)j zXAn@`bYo^O(-^#$gn*}sJ&drTU$l=?3#pHm@jwA*BZy?2Ekc3}VFhEsgSr_s*9QExZbk4k}!Z z)A0!c{nd#ACAYI4U%Bb!Lid4xlXkx$_enNFcE*m*J@;j$P- zKKwHFs@3G=fBUZ>Ux#MKzk63y)fURReLD#1b_@=rZ$q-zA5IAl@(25z1*a-{4_{RymUhoxv& zN$!yv804ovf@gO%j2%2??5W8>SFg?)vxCE;SVp$OR_}jAuiB7lN92P0yFC)mkTcQ| z|E^eUvR(WGm)TY9(xsE{u}75dPaWw!uW%IuFW3p2;VJ^C0t|Y3aluJdK*RcZAcwp} z|F>|J+Bbf|)R_83byp7FfhRiZw`ty0v_~FJXRr z78J_NoXG0k)SSOssN3nTB)gSY)iW4wKyA%xr0TTgS5ZG%uysC}d4nOKMUUE&d3yc# z1W(!lirQ`odg|G6zoR>A-h=eDeSur5t<;WDh66lPtGDmGU$dYk@1lMefvO|{@6Rb! zEEmi1HDtCa@J{dC@f6|cPU)D@pov)viAc&0`tx^grx2qjS%M9AZIAub5qFWU#lT|w zq}%!<>1;o7eM>J!9{B6`&!k*is$(&RJ_M;DRUWhf2AJz*)$44Eue9*>a3Qho(aV>`2K@4b{1@Faa2&T_qev$U@hnm zQs>M1ipWv{_E$>iKDlf-Ff+5`Np#=TeNF%V`bTKtlON36-y%N&IaX)pVWyl)T6vg9T%kAC2D`&Th?I|rr z7kEIvw8h0p7o=WFY-sOhl{o(_2jY2tBk9SB`H{v*(KoSJGL54_l`6K|X+M|k12UC?!Pxpw^OZ8z3Z+gqmiy0W16oiyS6AGO>3}B-XFP- zibwg+9DTBU=za|jAEE6K*NfH9m1SYyAc7B%`bpENP_tWCZl=bkZu`R5FS;_Kp*t3~ z?YQ#W!!KV17Vh0Kc-8!KpY`)MI~k=q46#>YJl=a~cyyGKX#*ac?7mU&zEQd3|Gdio z{n17DNg4d}Avf{gj@MqX`_sSox^Mi}eLH^s?dKl4$jZpchB1H?TNQO{@uqu{R(g2aodl5`7fSzi?`oxe{J!D_x=*Mhwfuk{C8+n zGIFt@Z7X%=H|~Ak2(_g()Z~3ukGd;P5+ z;RjzI{mD?=d#@X=3{B+SDz5ebg>N1h%eX`J1g9x4OgKZW+r&xFVLgGxa>#7C+<&BZ3G zo=$qKSoXgrM`@O?#itCp73AT^yp>ExaxmQ;A}g2eB4*8q^)~2Hm)9bqaIIT8E|B;} z0mEFx&yZwAa>47r^vj(HU#v_HfGd~V)mv_hNf-6)}g#HH&}UWEet?3hrf((ls~J)m4IorcnKRJ)KB)zXe}wB&h-;>58?+n zi6{P!f;d0or9o6$V*d&a6s8&-q)d2M^*L5UDgeFpqcfvSsSf?becRyT6LQZb4jsXe zmEBkx%$FM~jUD+~D)7RO} zG=!mq%GdrQqnJ5v64dvMTL)NP2I<*|GFxTksQJm!QH%AZiC>6+gVDUT09)*zTK{cn zVHTJSB@an^1)rms`O7>UTjC@&Hp2OBBVZ>YIChQw(nNb?Z%Y%2y{vi8FIV>2Vuy>+3{afyosJH0d^X`gy5Oy}_mtYlJ`VhAKcn(v88 z1$Qjp2Rr0{8-&0WBKTt_j70%ZYjBws@xsJ9qp{~BZfF&$b6>T@O((XF9J~*8{~tel z%8CE3x$DTG`omLW(a4+XSM|C9{~Xqxea1cCZ{iZn>cY*TV^{9)>^iu4!S@d^6PPPEv%UNHN&}J~AZc&A;l+!v6n9V#?k@7U zQ$>6{1VIWm^$qkY_a|2X4?r?f`UcF>^qw(5$Hdck(x-L-m=sD?99xJ=>o4_UhnF5 zfN$OxlK@b+W)h%Kr?UFDrmFSnRzwTak1(AqmW$;8g(fIA4}wHaY%qlI&gl@njNq~% zugS461{E2K+Oc>*G!ohdAuW^W~hl2@$;b^^W50oQt@fl_TP!T!E ze${S2`UzymC>iH>u8FM4+n;$@E$xOgd3)Ex`BLVBiRxGKbV?|5uTtU5HgSnX7#xAc zwYifIiWg!e`1Y)k(E&Z6R*Xc!TU=(^rP4O=<)Jbqo%0Cjva_Pjo4oHw{C_h} z?(Nmry0dOryVu!YxN6%<4U}83@y|jeM@;WcStKn<;1hPc z4eE`lsF$|W-kha!b-WxXW`Aww_|ruLZ0%Fe4i{4_cc9n!bwp=K z*_f4Ev*`xTX{UMFMv2{$JNTfIyVd= z@<6A;Ng2m)tvtci-5&~$J3~aB#VvEVt+XV6GO2ud)EA!vT)0Pq-)R;Q*v^j4fc!&5 zJp%#@+7t}8aW;eJlX`-0AI5FQup93tC-&!awLrnK4#hGE!C;KxU_KW$C>9H3Pr?>e zDsu|{3(pRCRiuT_MI5_eCzCVkPmpLwRV|~@ggEi^+-HQoXu|Lt9P~Pw%VF;VFOU!m3POyz-4=x0D1;Oal!DejjeiBn7h2E& zU^tt1giDkmNFvj|^wJ)f_Qn{~zOdS%T)=61M~ID%6Jr?ekn+_l!igaI97}U@`8Ku6 zH*Ae*rp zHb8G9KcC`fus&RvM>N&E%qQSBycFQO{v5&eV|&Q3x+E%$f_Ve11uua}dms5!IJB`$@=%#GWqn_CFR8zID7Pk%pnD-d;`)^oe1JP8J^A zRhU^ZUTz%-{4s#>p+ljv*ov}{Ouj(Uc?zIHw_un*oVmkUUj3B6MxDKF*%ow|3-+@d zN8&F&=2DK>&(@XsSpdWz1R>N^zs<7;sLbH-%Mxu_HS0JD>*UtkW(^dHSi(q!@`?5_ zQ~SB>&)HN`5g}UUhR2Lp%?&j*3d6{Sb!pW=l&(^>c)%RZ*PH=$ZTNnWHV#HAv zWqtb;$j_+-P@E+54AGUArgyl4_H$qok@jitun=`vFdc5SCEy7FHb{JeV-hR6`_&nN zVmhckr_e53!g+Zy!6@j=kHb#ul#p>~kt*})Ymork( zK#ICUU@`#(5O9CMRqh(Zfb+c;xH^a){tioo^;3Xes<8w`8%&8&lmDp@Zs|iF)` zfQc9%2!l|NnHdRg*`B@RESafU71Ed_sr`pBY9B}j|C)7d}3xC3QfLsDBu#t zdV89U%v|Ph_Eu(DEp>Qh!>#+(qcCC&E_3^ag8;J?k5WVGFe@Q(WSh`TqJvry#i)tCiL1 zgDbPQuRJ}t&1c0*d0?f$Tu6dL;;eVHPne|Klu0`InMMVFFuuQtw4fCFz8+1lkhXwa z)aq=eU+El}&o2ajaf)my^SXkC3upZ~-tDuZmI;hmdwSG8c@Xdl7|>%D*;cU(g2qsR zC3-Yf-yL~DYMZS7K;HcX?`Wm*&w2-oq#Q?Lh4qDzG!@`QJPR<#NMamBl8t75L*Y1# zaxCY!>4szowvx0`)W3t>soSX&`#grjaK0$-K`{~MaX=4`Ua=f!3a3M0l0&532%Q-& zWRx;cf~Yi}3ji2v0fVE2U3CmR`cM-uxXX<2v|`igJx2I26GQ2QZ8(CNBvU617oyb) zsXaq@NKD9m2tsX;jQyWrDD)m*hiseugVwh zLs`;rVepsRaXtCP)LLTO0(9>UXMsVB|Oqk1yF>^Bk#45FMKBn>+D!dw`UhGzyD7acQkL|0Turk>Uc6L7p*eCrU# zXP6a3aw|fXK~Q0#n|+`20kqzCiWiw&-yi^rDF%`()4hZd9ydtV#wv`-7d)&A3c=iV zk;4hem(&X#dEPu}NT-N6${aVkM&}BWA4G(ve_@4cf)z4?(HuNikYh21@J2%v$JLC*+tu8V@Uo!7rNS$c z2|;<@Gn2S!rPzPmhXT$HL#7OQv|DVJ4hzs{Q!KlzIRhCYDd~;siJaLSw1+W))f`rW zGw|pJCWB#Jdt!8#k7zn92*Mk&DNLck7fh?6-m95U;pG9p@jb@>*K)qLo}_3!_9Tvf zVUOp?AP$~Rk8Tou4g<8!Xvbvbao#(!q@G*LW|V7F0vwG^=^HAyWeSK=#!bsSU@KXq z2)B}!XiQme$+Lh6YQagRug7ui)n8+0)u=dxuy>72!ZQG6b0l$}QyEKTmJ0I2x(_F! zo|f56>aS;pG>b6S&<~6>_^^cvTss)nQvLbbLtZf4j-ohr@%jo|gfLj5jODU|l8vU* zRwdlB{j%!Mr55gQe)Ukt7YxF9#IBC+#!-KZ1f|dfFnKfc!(r=q`X5p*zKcqb4DQTT zy$oQ-q92aQkhXpw(y#BHFhW3jA*pBeFO{GiTar9h>_reR9GItSX>x!WpQ!3^ea|c! z0|V5LIW5#g8yTAFji!+Tyaw8zW^$ALT%5r2iy&qUk)Y?a8Z&tfxD=x`Gxkl-%_V z4?{fND!m>5Uo!>arR-?Nee0;lPlBQ;h#M*d`1D_dSvTd3x0hzTq8zxH3A`>8coXUU zGFSI8BPcCxjnwz`1&%CCSt|gEx^i@|QUMOfRKez0p^Hb+v1n!0qK#C{6w^|GoAcba7 zT8%QsDDx3RkC_mI0nF2=DvY~98sfbAYA>(W=vgHW!Wx|nuDW#9ZLH2CLh?0bhWV?= zpJnW#9v)dNZbYQ}#ugr3#GX;K$G@x_q=?#Ez6n8U`~{Vz^Kc%Y+rf~l(1M7-!Nix) zAHVeHaX$BuJJ=Gm#?G|x<G2rtc zMR0}jNdwdaIAgtrIkg0!XsS7Ow|Ms~w^%siJ^-RT3G0ZoOlcn9hxW|fuu*L}uB`q~ zLIQYEfd$De2wbRa(TC_lYQtp}Ru)w&k8$aAIw=MvP?A$Rp+tzsBZ4}dmn(saTCo;j z+qrasml+;$&2P-S@QnVQTp@_kFNRRq%yaeMVsT(^r(W7L?`IX>oi{YEzSt|KCnAMe z1u%pqr&hDH#d0aJ zl6xJ4Gz7tCn;Gq9f`TO^z!v~6l|#&7=PpgmU18FYW@_R@g}DxEiNp{Dl}J4(7LU`) ztnv-hZ|pAVJ74Q2GT1)mWrMX&ia1AsKuOew1b7JL{Dv?is}}@ff)qbEOB9 zLEWrNeT9--DTT>FNFhq0E4WGWFCYhTJQ#~WIRZTt9YKChDc+10Og@?`z*)34etB#K zhIfRT*;U99J{1K6s3N8fGm?jbEM#;@G3ldmR~la6=sinFLv{74BmE@T4iVvv#3@CN z?-!hiuBN32VdiNH&Or&V{6b7ysmbwefOfFhRxLLD;tj0>$L#ddMbZwW0tr?MNE44V z$ZWAb1pdZ$ruWphLsSlD`Y+a?@~(cU#9U=97VNAGl%%+F8TrZH$p|UAlJ(nr@;&u8XK=UXjkSTs zS^jn3gK-WpqVQ62HiJg-$3!ydH#ZkKmi{Q8q(I$?)B+Tbor%gfL~R!9;~pDo1IA5UI1rG&D*nhSKafE*yK8dD^`cQe811ga7%|`!(RrAq~*xcyX`s8@}uCA@N$IB!8;JAyhlDOaQHdR zya(8rfe2hOv$H9InuP>=b@mW>9zJ znBj@1d8k$T&n=EP<9#@di#^o{jbRm~1l>)-+tCFXrHg78G1mM5ltvReq45rn%1DWs zF(W2?(BQMFRszQS3-Pj9%j zzBL~)OvxB!THbAxb}RsW0BGnB_|{W~+0SUtVkminK_4K>_JfZx&h=wqLr5zj62KD7 zhH*O;VFUzb%$C6rn$+?6#S59VunmC)v^}~Y-LDmsfIfg}kYUBd5zNw0?DIeyAIc*o z7J#78U9r8BmUx_$>y9T2v7-Be+?7)tEg8A6+G(TUN(R%N`ei9-Bsdv1;t^6Rl`kL? zyOPp0!$gz%O23GWm7#dJFnR)vu9Lt*Cx#Q`!d-TFxfJMxL%&D0zzOwVxC(9;8H zg+;k7JF_*S-4aufGoW20RL@D#AZA=3sy;K-7~3+dW~sG(qbIq-6z7{yu$j-1%XC$Y zItPE^qx26ehyHymfS_XP;gwr32vpDuv;(S(o#)$G1d%2RSw??&M)8b;eG@M{r8gK; z;=r}1RR_nc+|fTeC5_N6AnUk}3pOz5J&7OM4fy>5Yj;?zz)9~=S}5}zAL@%v0V7ip zfN`v`hU#w{UGe6T9K(XGrWFOuGqEv7?PKJ~pp)A7b3L&wKn*4Ysdgvv>?@G`$y_D9m4hM3!vo}68JWV4IwFBm2uXfO+wxX)J*yM608`4CwvF-k_n||!paa2+|wsOS( zu!q<-HYVRPN8F2E9kg3s*9^L&A@~(@OkEpMP|uzM77rbBp}ow7lE|K=oczUFD<0Ap z!Vo-Sk5}p}rEAiAv?)1oUe&_qT2U}wIqY{JI0>a!3gK8}Z zgd|WFZ2Ew-AD+O!ezSRaYH9*&Y!0%*=SEd1ZP7VsPQ_zyr7O+tSDC`Z%%i=d??PNM zTh1vSHLA|=@S*xB7$Iw!-A(9U1B|8@f(%aW!jljIUPH#8VOJ(xC}9SI=t==~tI=SE z{NjCX?U=P2*3`%ZJ0DW~Xr)9D3?o9yHn6hlGH?IKVxiUP^zIm{!@TKVGE8IAQJTAF zVh!UECg0lZ^ zFcaP202lp|ANS3~pka$?TDg$@EQ7u5pio!^1!vGBi~?)An-iIgOp2su&O_*L3=o4p zz+}8c0K<6&y}wq`b$N2uFBRYE4Qs2#7r!y#@Ji6paLaZP3J1>rAO%o1-Yr_L9O=jz z(+9lf=z9P*a)Z{Y$@o!Bsd1Y8=uN|oY6Ag@*W`_{v>>*h0?as3-M|15%rc}-R_;n@xje8dVmLaNzaD4(S0qSL9x^8^8r8#2 zw!t@?D`*N(KS`dBrnJ%`#f!9@6#D2|+{n(*eB!q7T+Sv1h$>Zm(iVJClT}UvOPq466N8Enx!sAX>Db@M@Q8GvwL3M zm5(;-QJ6-E&9D^;KH!|;Q(nrcR@875O9MM*^>4Enh9}sL+5pqdsU8P1qb8x` z!f=Zkqg-w_uXv21<2cuM^W@DBw0%rhgyn%|3xPZc1?e%|j5rL#ZbSXmA`W{5MUY^h zVeThOlnWXcoX;t-!AHtR+29hkAS5-B>N!mb&{xyV7Gtc_&1tD~n-ahQDes!oZh8PN zZEH5ovk(1;hFb#S4KH>0fmH*10`Qgt&1nJ*q)bD>8~tE}PeXF_uX`xE!lu-y3avNx zf_0--wo3L<&vV_(FJsKFPLZFO4`Ai#OX?qDTa?Z4@bPqy= zzLbWiX^rM2!y!y1#BLS_H$i%+h@ZFhlQdrKv%@^Uk9$hq@qXED$o-eg|utILl#f_B3_;Cf0BY?qe#U)?M)pBNGUMCIg?^8@ z-p@gVw5hb?C;q`MD-ph#ZPYCd;GfF2+s= zYe-L~(g?VWoboWq0DpJ0p5oZIw2FLBtQwac5QoChMIJLjdNa)_q!LmIsUqt__cwzi z15JQnSVQY{1A@Yl5}{G$YM8LQ{CRo!OxT{jS&;PIb>4he3u6vp`p9ObCXb~_e`)ed zJDG(TnOAlCmgy|as-aKYCLdT>z&O+LwTT5kj+573@o%;S$511yErmvdC*I)^)E<+I zs8t=!-|%zNpKw27>rthBZuDE~U5#~pBsT>T@k1_ABbUgm(tXO(-=$(1gTE&>n?zIH zEXpU>PK+@hUY&|vNwF=*+ik*%aKeIHYY5DQrN&ey8L_gZ#8QTd6&FlZzR+gd5+n|F z<%JK)RDlEdaO?0El zcg%$RbB)BS(UTs)1llOYKWcQw1Sg=(s~ApP?PN z?B+5nU2r4=t{V#er9_OASxV@}-tDJF-q=H-K}rqB4rf2|EYmzK4B-N!NZimRh_OUc z1(E8&fi|fQ8tR-NyLlpwt7~WYBx|3!wz)uGxIxC#Am^QF&~b>2Hik2r4eOiAnK0`- zG^J*+*3mLp{Wl)g{pi$XKnuya5#KPWNu;?O70lHiV4@L&eb{ZVp6TX$Dlfr+g!^Jy7O>4h!B^wQGGQfqvRD@7Y}zU;&3r5F z95>uB(p%!(Fy26(wKBMPGV_KV-<^Sl>mzrsEQlanK!84%EDZ9r{=fd%Z*qhc}4!ofA1na#|z;qrruCL$}j03K9*679E6L3F$0^ z%9M!awMb}=3%$@ug3M-!2XM>DEmc8P3BK?~LsYzgP_9eqWTDu(Ck}&F@3aFOID!@a zpwvZeEcGOGnXFnVlZnb$NTPQp%4eqIU$qYasjdVs1}?DMb-`g|v{qE3Ktsk43Ph-w zGlVe$EZ#NlyS%-3U?t<6by~sLQOAjZ`eS%^((j`fNCV~R9PuHSEM~Cras6c4O{Xh_ z5@9x>f-BJnVC;mQxH-o%MwUGJD36FuMsr~V(S@s!*TJM=+rlj&9VQvf173HcKm+;tdL!G8?jLhKj!yPr&Ds?NLAQg8Z(EApk1@V`E^_T zahg&iTh3{AO*suL!lmniE-y=WK)29vcuIJ#mXxGdoL+$ujd|BbG=YtAoSV; zPU`qC2cqq`!|KDH5}NVWC<>hkr^LF9n(e{%J-Q@9DT8|8zK((Ba_z9BIdZS9eJNd< zUG8v+_BNd2kOVB zn)(gHx{3${bQ;L`s{UY!zsIEigf|RNh_^I?3jo0bAu8zsfFn0TJd*9ES}+L5I6bb| zBLMKT&&PewKBLMvyjn?(^WKSq`#5cvR{jCSNv)>~+4gE|j)Sh``XF{7oxqFX;@#*F z)}JJIf~QjqUx?sQkOy0U0hM4Qd-;Tx8Zx-HMM5k-K-Peyr(3c7%78#hctqzUjbA^U zp}siMypX0FAPh|u7ZSw%rA6nk^M^%Lju3yyr7(*6Sa*0!q-5Hwp2eGPnQl#%LsS+A6u~~A8Kw($ybjV-oMs;**H3H`)Uza$vSd+XF z9>Vym-^W0UkLBv!y?ngI=rmy;7z#>Y_=v)AUJ_G?hgQ}fz`^NpGkl|;6XAu+-xxvi z?nekOMN#xw_!^PgLs+MH9c zoS>*r-Q?4zM;s&s!Hhrjv_jlKY7+Jo;?T5|yyVyZ!)hKxT>}TD`_9gfKT5cprMg%z zqUvX=gOvl=EEu8R$94{eO@iMCk$EQE{(z`_49?-?fL8zNa7d_x&lSg##vxokfS|PP>V=LO%2!e z^B+KMx*Qrk|2(J|#A)9JLN#j0|@mGSkt@RyPp@Sld|7k(%I8!h7AQmwQP( z5Duk2L{efVKxZmNzt*5(B+CVcVo{JNA=lQ$bois76|Eq4fUr?8ALoNMW(6l_zO~hF z#Lc0w4v7@KVOK$Nd?Kx)g!?^HLrE`i@YYe7KslOI`5;aHFN+Qn+A-8rcI>p%#|p$RcEf!qrHIdU`sga?hcV8`2N%TDr0_1?ArS8Hl<+@lsb zq)5&Gw>+&4>(=K`8Pp}}>s#3xgDz=^N@IL0n*ldp8!Hz9ogwP1jbF(SEfsnl%7bNX zmY9QdrhU;B)x1Ey0>^>+_b}qQfkaf#Ux?#busIyz&;~GtL}H*^tkz7-xEzT%+U6sz) zjvtr0FtqEOa#V>Qmx>rKsbh;jG(#6Kz^ymcrupko`(Ea9T7cw+10Jn>g*H$(p&di*M$m zc}|DibZ~z&fAC*&^n)I$Fy~+3vB-3L?~nt)!#3vxR8Q`c&lLD9RX>U{`qmlBqAXIh zL|s}%-UopRbD)nZ7@}h_7{nMmeHf9)Q9}_X>zpHsf!X6I1?|eFd`+|dx>&ZQ$s8r7 zhl7Y6Hg5df=B78QeJLw3N*TGk1CGa@DkMrOo>7prX&NO)za0 zLr_OBs1ukl)#hH9RsaygXf|FfXpsDJ40nQb8gYcwvhuiWW~3QOYK(E>52H@%e2>w= z53e-m4}%DJ$=&g{@e;)L_-FXVLg|>)jxNxRr1{`ovo}n2y}{P*2vJuLwg65s0+KB> zAmu!cl9o(kl_=?5$x_C~rtj-6)y$n<9CBP71Ssfu(a9xDg{GKbZAFq)A1{m9iK#ZT zH7l1Ltqwq`om+Smm9uw!ugJ36(JWrDqf<=f z95%9s9X3Y6@rv-J5B2}Zj^>v7lr;%@=B<5*^0Nlq=ikhSr11`m4vW(hP(urOen8Lg zm3tN-B*M516rTqi)wZnf1=bnXKv{cRvzUzOp7OTb3&6AlBkD_vqIw+7THG zuW3xgteP5^)UfW5Xuhz=k7)dML($o#iYc(2CVrsIRnt4## zgBh&|UKt}{8!=hR5oQ#_^I?U_%U>8He<#NnBE|(55p4%f? zeSMmPMxynra7aYTokQ0tBj=DlX7o&ID)@&?2DY@!Lx#Amz@O;|lRE;(1-;GyPC*7r zu$wL_pd1!_M)@_9cXMJ;o&b%01A01hpmCN&eV7V3sPxsPcX+PSyDZ-Q=UD?krNfmt zNC=Sx$2OprIIimS`QcLjQ*WO|`)-PVw5H=4<=roYYgb`d* z%DJXD_y-Q|T^tOQIX2*53aQ^R>#sWIBie!ot+2WX1F}T^qe;4bIl%#h+-_p(A%$51 zQxEo|tKT}CY&vU6)7PSU-=<>IB;(m779l<$XYvd=Oupkfs4QfI$D5}T8TJHnW`Q$; z|9|G*J>IUXF7%yquC>>Gti7{m-f0u)T#I}#Eqgbil(r<%?y+ssLJJfR_o^4q5tVa3 zJ=v``X-+SCOS@xBsen+W$QvW#X^|A_>j)msF_DLG1T9=tM38_*Dpsf*9u*6{-|uhC zwX;*oQSbfdHci%ij5!{^@q3Nm?>Byf@V#{hL6Z_3S(n2Pz%2^Kd3lrib~j(1;1h?_ zFE1~54-#zCPPYtJ?^=jFj?2A_<;UlXut%&h*oR4BuMgCLaZbHItdO_^w>sJW)2BE& zyfw$L5hF}6y#X#v!f2PU#RpDpa)$XU%j&h`S)k!=>l8T5=dV5yNf1+cITS$dm2^7~ zhEwweK1Di3eQ+s=zJ3ljV~Irqf#41Ad&8N$3zxBW(@trYEB3F9a-r~GyxC;vAwuI} zd=f}Mcz9UnVKVbY!6Dk`VA5PX^6>KVy(f#NzI(WtjLnf0e(?xa+2cIq$zbi`uKFL! z2o&dB7+C@)6=aUg71N3j#+&uTf-+E~J!p-vKZqX4Nw1uCA9wp^z}Y$tos{u*Qclnm zHXV3bJIl@+One7Ps468uFAX6GP(r=ro&9v<;ZYE-O_Mv2HSh9VIKe$aiG02(=)OIPjLf? zh3!TzgmIRALWOG#iYq&#xWZl#Tc6-~grX3^ut@MdgJ}{M=UN-(`A78^azAZ~#5cYKUp0Og83s%-;=+ zTLxJ-8!&%%l&egm@cfam&@inFEP)vhQ{*aSS$iK@TRgf>fl3;>gHJ1Q?cn#N7t2Vr?#$ zg^yun<7h8_U|4EXRQC`e$#jV6Ht-?uVps`TGQvnXij`{tj8kkXb=E?ehB9l+b;GF` zfPfE$4B+C#w66pSgv`vEjHpI?im-NcB6aYHZ2{?C!^E~W+G&;&PA?8ThexT1LNjg* z9A2parXWrRM0sJ?CVjwA`K*_j1r1Ls57+}Fo&*-lxLTECs=jzQa|JN=m?o!fw*Y4d z#62pNXGTOIpka{B8t@uO@R#P`=^U{H3eajXRGAsf1YyB(B&><1j!GYkV4DecdO5t@ zC;baB1o?~vv%;w#n?_jrf=kVFqa5=fw5RK#;UdIcvCG9&XK)F{Zd#6QKM?$ z_niKP*Ha*(s`_o+CSvRD1DA3@Jo<5f@~iANN4yz&}c&+2%+6_XC<891haCdgnFRGAZ*PN z4aoI{@qF~?Cb{hrgN=E8rE$dT9Uobytjo)md_}eu>{hE_MwGM>DFq#ZU7-<**bO24 zmojf<-bkD8vL4L9F9l7<_fcxR*+30Na+x3EA7xz!dzM3ZW|(-~ud|`X%^H+Dp29kS z0&@UWd%XTfIK^OAVaG5C(us%~V`GT)w!47sI$n*DtEd|>GYV5eyz{V9*_Y?kUkZMT zCcp>WNJlKPd8#HCyZ8W)D;!!1O{JNDbfS)kuVIf_X?GM9gyyj95MSF)TFid>8;@hP z!ch8ySy}?512*Rbm6k!hgLT1Mw-t;kZ;GowkA5p|VxAr_s{kF)CNvfaNm&qCd&jv*K zyRSC-D#(4~%5%0s92lG_SsY-a$QkK;XFI@#d8D(V)-7bI8x3l{U6;c(yC`*;yG5V~ zYw0+AYLdNblTW9y$@GfPvz@>_&CTQ-r@+F6@`jGvkB1(`bDb!YX_7Fu^wtiHy#Cgt z0_Cob2Zm1$CIB9BX7YS^Cc|Qe`ssUv<=N>>k&rAmcA^38EsAU z%zeBOtwO?p+l}X0&k@T`w(2>wbPUeM)_`}v-of79X)z;GTYySDJI1p&5oZOK##zmA z4CJz=o%`M|JudSeNOk(KJ4QjxYnllbAav1w5X3MG&dlyCZ!cL=ED~}jel^qL=vn%W z>rX?s4Daq62%S5HN4#|WY(+7PfLonWRD$Dl6c;Wb^5GA~!R;C@zV zMvxehm22WyMTw+-0ZJvy8T2yZ)aV{%E@!Z9iTFiwdkUk)!H5u>3aCC1QWfDte^|;! zO0H=&hc)SrO_YTkrqe`pOMc=T&HumkCFf#=MPOUG3qu96f$~PF1(T`e5uQ<)DwK|q zY@dpAM5;9BjPQvlj93RUG(TUk4}LT&1-vqt+@yLXhj}j!H|2R@(HRy>e%5gg&jK8x zXsY0?EqSASgl>uot(Mo~9`MW<_AnWiZ64)<-e$b%q~*Im*S&(8I4EpQ>b)q{q^9hagXjA@+S#|^&9!PI9ACF_sK+m{Bb#9~K2g42n=&X#Jt2hq6)36=Z;F~bwVVX#HSy32U zoxuULlUSWn`sG?ED7Kv+gw1|TUXR}#Fl2XfyLI(*4$u%!jIU|oRSh@mQk)St@^UDq~*EeK^UFo9VQ^P(#=2A7Uh zdrC|Q-V$1N3fwj=(4y&vCRyCZHQ~lUBn)a3&6Z4tz9op8PS(wtqqp7W%=}hU4}a;< zddd-Ve~QA_yL2u97QEEIl!4t2*3$8{jW2^B^Xg}VyN)-~$4p^?SrEwu)k%@z9!1N^ zj0~lEMmrX<8(or#T+4?;tY_+n67myTb_DYWVt}S>wVIm8>2gH5gPdp5FBh#(tC> zG^@V(%@93D8NtK!3z>nV{j*QolY64pM|UNkX%gK(e)?CrFUQ-y z&~5C5!VDf5aM&^A6-2N?5nK!f zoN_?qSjWj}W`NO5%#685R@d++Z>RKk&J3%zD^Dx;bARHf+1B&jCg9X$f26H4Kn~Tm z-MY_it#?}0AwX#kwF;sbacsuz-gth*Eq~{L(c6E)4qoQ2l4=3`LCV0KzB>{tb33~Of`xM+#AGGK|wE|2BIe!rdO-^&kJ}2#yo$7Fz<+3 zPJ;6zgy92n;!=zezK|a%j2$I@bS-)w8pytM%SUY5Sj)=@O3APmcBHW;D4scB^d<%h zvPLBowsvF%2=dwuYKkMe$O`5#j<)BaYV)7;WU!$Fcd?$BZBLTHs@`<7z{7cpFpTXv zD8ghEiLqA11iDaY)l>jGGK$cscKC>JJ%r_^q8bGfsnd1uM+N zTB1A!8=Nx49fZ))d+M=MelP#x^@L@VSt6ea;NJ{>Hk zOdFN+EZ`3F53m5C;0OBJi}b)a;<%l&X&`L=Oelj_c{1Z5)6rFl@!ZPc-$rZ&W45pp#vkW&P=1 zey`&&+NW0FPT$Ax%=FIF>9vy%Do5r5&0@=i#kF*ptLDPuh4JO~rt%mKV1cSEyX3oj z#Q;>I(wpalIaXbNQ9c$zoN3flr9YXa>Ym8z1d)F$rVUF{k-kx6Uz2ClF{?182P!!c zi=_jU)1C(;%l=OjI|@kfCyR58o^qg?V4)hm;AJ_qf&rc3OYzVa@~cOGm%jqEBqRQ= zUk*U9s()7Nqde7euH1I%UjMD#Rk`$Aw5tD>qm^a?!-%EI7X%7q-8F(J=$ejFUSadg z6O$1m&$p=u6L>9d?1H9;-GuM4J={3g6MIJ%|Kjbh`QR(xdjD_ypcocTU-spvEr-!j zm%rWN1ir(ExSY5??zq}={UH)j)U>H9knLLFW&KSYh4R1&&|nyWTVtTWsk+%kX%}fX zz2{bt3;qm2jPOP%rI$Juz28m=ot+58Y*QpLSe&;pt=8hwMWTcGtYvBJM{V^%4{2JA z{h?J&P^5!1DX5^WI~fU)>rEYwL#__3YJl}pm?~EqU~Nrl0?XWmSnhKt9wU<7?PB=% z=X0>M6|Izt9^FSI)Sv=C9BssBmL^2nmcH>whm=U$U}z+o#X`O_rL-be3`REekY)q2~hUIi%@F+!e8&U3oiB9X5rZk~3Wf#j^hXgya_X++3 z9B(FOT8fH8-Q-*~?7RP}k`J?VLl9O11yuTS7A84&xAVgE0>$U%grGlUSBN3;AG#Nt z_)9mMa!vXXNMM$@s+=-33Z|+0ABhKdI@=FpTPkNJPzy}+N}G^$f;$%d8{u$v#Nkwn z8*VU@baiJIHFdx$530Iz*fCGth6Bfjl>=PCs3LOW0|qdJbn&rqk;dBtYXTy~1>lM% zDQ{qZf#=RUu%-XAW!pY!5o~Bz7Bw90x7>I?*HlamgI#W(wUvviKI-vYR1~EfY-`{% zawkz zLc=3EW5DckZ^V0Z46swlpA6&7$$<6_wTX~TSCEoVdr{obO?q;`Wc_~S-9`DWG?a^k z-o^}y2s;{B7~&Z|nKwrB!2@Ly-EB{=OhwpdW5GFOptY~(Ba{140|pj%?ixC^lgV6jk?o@jM-&? zx|)NF6cM&V-y)>HO)y25g51##4G&beGDr;$X29rw8i1(4GWaLlg)XD~LK47$lBUwP zP5+rY&=d`*+gWNVT{V0*%~l!S?0p8eW5-aj=(`(9F7a>)UZ6C~3&tgo2!CgQ-&b8i z_vzJw!vOSY>OdX|D(~nsHn;MooezP{WbL&}(Sg&35y|;t95i@E9!G%wiWo=6nk#KG zzIC2fAzss2I$-blc9$4WU~CbspvA$M+3BAmOJ>D+r5dJvuU0TF*JuNai~f5g+lIr# zfU8>wDF)?44hbC^i3OU*QzKe~2}0^TgQYe|l$TMCp4M(y@7 z^l@>E$=O{XS-7CmAq95iL#t%m8D2P99-F^NfV415yAw7DP^SOy>^$@hxzQLGCMcMV zQ-Ogu_CSnUu`?UW6O70R{xu6sI-_skVExW18|%bTS<%;_ubj4G$UhM83jKS0 z9Q6m2l3kVH>(>6O4N|v!H*bcfN8D@|apP%7d}>2k$d=QHLIaldFHaGstLh&zjDTF> zh>VBFyqQ<}Ewhx46Tx}}aXHc+WUl6c6wi5^>?-1ZJbkGkMK=_WzSZsjY`^N~EZBsk zPq$)_x3RNOeur>C6`MvrvDkXg1x^8ywU|-AIA5D~dF;j;I2OvhXw>hS z0Q4Hb+*S=|Tj(F96l_14#A_DX!*mU68qCT>_`BfJ?$B^O2saCR2u~9_-e9(~(6HB1 zXk$KCaTO=W_-o{={}4ZQ88LZI+;hy2fzQKb^(@_hU*Vo&1O)!Jd;ICWzWzE@W>%sQ zdceIzYY|V}OfI53Owa^x4-aSTI6>b+B7Qa`@{-UU17x#bi)`3yQg=!Cu1ORAGNc2; zHKJ*2Mj%Tzt2JEvIHx!%dkW5`cq5XcBt#e!XOgPvG)}RVXB}nOOhSL}sCxO@M(f`( z=Q2Css`~S!I!2IWK>LnxGg>6OS&KwCy!uO#JgN;6<~4CU^?iXvt7_y@3UF8+a#a6y zH}}ZfW}UYLGU&Af)bM~qLxR8XIWo{8eomHcuo-4zh+m%^`D^JcLypFx%lFw)q9^=1 z!VM2KYgIR6h`dpQjHdXi{=g&&?;RS^NJ7OIy6ou1r~~8I**uW59KB$~6l45h2{Jk< z6VXz%7+tdiOCanT1|MIZs*T}HS)W;Q90g8@w%l3=ZT%pA9^a$Kfr85Fc2Y|vxFgCC zY|Y+=m{ab-_OUZXcjaqf+{mpQkqz|2FIm!LJV)0w1hJ<-QC5n9MPnTrPMljG= zW*%qaKxGlHHp#3`g^FynlAM_Vk;f(tND$FZ(&=kOLI}1VxaY7TL*t z4)Z#dZ=w|HUm<2EiojuS((coTf^8aqQRWac(Zk>n_}nsw2rE@^0r~;EJvQ6`hZt_m z%py32+ceqK(6Wz>H#QsOAMLSnR_{K~NJW+TLT_Je!V2C)K94@oAOv+%OxtFsEr+P$g;^3nU z@x(nqGTm%|K_JUu=I~dTDjCkSJ#B2iBYf@X6knA<4`6Hy0Or|c2QU@KRt94r4E^n& zQ-n$fqg=q)hcJrGeBADEF8EbJ=7PKbqwIvJ#OelzPOX0YLX?bdPF}LI&Orw4(1X9k zo1uI26_4G+!m}HQQYa`7H-+N#g-GEO-BtT4*qr3|{6CG11#elbpN(Si@8&OAB;6f^I^UH8xM7z?k|eb~}-E)-j*@({$E!%Bo

N^R8GU{BepUV{QP|l}aY!COi|EkJv?;Wey5tSBc2xD)lQwh{uiic#^QCX|KDat*+4v^b{rfEH$a!!i|ur6x^1$HqLctvG#^=$ zjv4bVXHAH8?=y!}97zbtV;%?t@o2{Ywr*_2cAoKLZ}dDSeo$?;Wa*`)lh^Y_pLh|F z_O8bkRg5l{A>z-Xb7Xy3SLlG;{ z4Tt|by8j&Nzo2SHY*9Da{&P0SIbedNdpkeag>cij%!q7UyNg8ESZ(ZdM5ZB{O3fnr zab`;zDFgl_)=@=6Ke!%MDQ8@W4+x^waLVk5fiWP=+@N%$7^ahN^i=8yhi2FcOFxP@ zfBJI;BS6E!-L6?;fjhLhy#Tqnb&>51%gdb`7MqtK%O>x>ak069jK>9v0=s?1YP|k@ zK}zd}^NYBQ-G@rUShTbLsB#JpMJL17RS@{_njS%3E+dGF*AR}|gPb#veH;WJV6KY( zPYki?K?$f68zDZ;{figfprm1}8u0;)i8;qKQvQB6QiibC{*Vt&^80$LfpmWl5~4S^ zrH>bfv}mqxHZmrJB&!Dvhj?}UAg?4CQBX5MxQsd&jQwPM!WLFEoW{bL*O~yBEg7Un zpa6&y8s_w|!G^^+v~gOMfc1_8*mXl6Ql*?TO$a2)7)>%D&CzfHmZSAkGKQF*VmRv^ zh(g7%imnuP72j<+5WD4^`^n40;}=x|QN_0FAscIMKwr$b5!UW-c|;3DXFR3x>@aod z`T?lJ9`(=&*(TI}5`L1?7guIS>Y0`yE9{Z}RN#aXElJN8PnOzRco7L071#ejZ0x!l zSP=t=4b8eE{DN*4Yt|d$N}C%rY6dp3xeir4CQJ}9H$sV-GMLJs>J2!>vf55mb+cv# z_xr+czSt?9;3Q*LuBT;kt=AFmo*}}nTmG!)K)Jt@DPVru8R&KiD9~c|zNXi@q5!a- zr{l#z=RGimQ_YyME%h(;Oe}f|Ul;}8NBU$3EHgmAS3a2%q#!)|83za2YR|7tLZ)Ww(B{_`z3^hYVL&=G-)lF}IA{kP)%a#xdouBBju#93dNs zs$T#9j1_wQnVgwZ)YDj{2?~`a&ZbozGEAwUYMzq49Zre%3{C|P|f4b*~qzZ9Iuuhqx3<%{`&z7QKMt&TaR=` ze+6n8*{-Ok^;0xkf}MG**wWr+3y zwIE<=3SKE0*jYvRc=BY&+^&MQn8R|gyV5TRfS&CeZ40_7oAJSOY-xfyhimfV6U3c5 znX7`ZxQ6Ya2-~Y}dnhc-1ECvpzHRi5viS`Pq0H7*0R?sP#s~apVPZNd-hV|2_R<6a z-=F~7ZCd>=>IDl7BuDWBy!_ArRwhw{7Oi_C-Cv}?g(|=bWQMvRgofV)W;pJE+ALBcV@G#09P{iFT``AhLim8WiR2@e z*#!i2@qjsuU)R~~@p{D^}wsn8hL=-%4no?^eK<7wRJoPUB zyn|=ee}U*|3UlFXOB1T8Km~wY0?j)~^{?lgjy?kCnLvUlSt2fWZ$N*Oo?GR(W5fA7 znz*aH0b|?fTVH_S%-@Bn=GuW$KkrUv_sOoQZ`-5EHFaWXbnF2%y%r<7B|9_Wc(n`xg(dQe3a#(W* z51xrw77lWV4+b+B!Xf!|t-6is$ldiZv^UDo+4C*-;qNFmmO*|I(6&%cbkwFx1$3=A z8ebjH0^j~dXGa_k znr7CHr}694h84x}aJOhgd zf+}>WRi&55R+m=5MWlx8KAMm9Gs&7dPV1wZR}ak1qn*If!Vr_2_W{l4qq=Ne`$SBFRN`~G7bKTKwI2W@8R(bs*rjg zGXh&>74iUMud0Ro2Sx#Z%jyFc-Smpj{`*MGqE3(_r4&kw8>kC*6?9j_eJTrzBkZoQ zZWc^Cst3Rt4JEYp0Dwg_&^V_qn-nRF9oi3`$B>%t+AfT*!m{r4h29$=?$qx=%oll3 zimT9svF=5*249NoT0g64x7=_=Lo|%RmHL?BJ>?S{$N@>iH0NDKg>)jnvpj^wV=&!R zQe*wUDN#0r1}}>G={ck%eXFSd9i5_Y3~s(SL!JjA74@it!u$n$Iaz>Fhr3PnFTN}y9-^D8{S*QW&M&dKBC5Z-&k5@7>oR8 zf-@Amtu(Qn7?G~#@%rttRk&MUJ|qO;$L(bvtrRnQw?8^HFAISG*bia^(!9%!$@HP{ z55`v{lS=>ncS^s*j6tz7-qKy`9810Q-|}0iBR|6G+qF2<;HbTeX3G4Yd5HHEpD&&i zT&(_){B8Ya7?{)M(qE~E!8SegKD3|Mh0RR1GDzL6zot`E1+8LE)xsDi;mGDRU4J`T zM+Z|lMpg(mG|mOoAaXv4_!|uc=f~$0Fd<;`mD1=AM`2Ge;e_cT-Eg^)5&C^v{fzeN zuab1wt};r0DScD8-$wHk%m9phdDOVDgp4>BEh7t6cMyQkAqUbs&w^>Or6Xn+GZyS7 zM9Pn?q-V4^B*F{i=zjn!!hHx4k*HDAd3PT#$DSRA!mK+!y0{ca;dZeX^<&8Tn@-iu zxe89=c#2Np?E$CeTo@JgPopECks)9gkKFOVd*A!JyI!>T?RTDh$MF=&*Fnl%Dw=fv zh-x)_ZifsJ+#GgN_ovdmv!JkSzN&v(u3IeLKYkPP3ZcA|9#|7m3O$}JV-kO0jmi6% z|Hb1U`}z0(LNCrjxaULSC8>;bu!W*>^h4eBR{kF6@5v8!>#gZnz5ZbF}g3>u2@0Hx+>LTSM1m1`2p=;njvQz*_H!eC*A0HEn9vvkuHN?%KY3kZ8fg)PM4t^Nv zIsP~{9^2C|V0WFcx1kDGE~zhyfLK~b{kkjc21*xQr=3>3I9(m01y~_}pi;PqpPe*s z2wwbXNo;llp-$SpyWn^#)fVgwY3dqm*Hb@5x(O4q#^YURX*?$NSANW?dX_#Pt&_*& zqsP-crrk7k^-_Gzo&XSluiATL8=Q#Z?fp!y#(gkd@~92ThGM3+H1(7A;M%l{LDLZ6 zxUcxh(E~=ogZsx<9;kb*w8|G~E*Mn?Ja%Af<86$Jf7*tzR!~Pf7*c9Jsk1O3i-wx? z6{)KV)o~)+{ymZBd*PJ}t7pEVm-iLdjH=j}>stl5P0{QrP;8DqUlZoY+yA(@W>BSb zq4@A+O+3ueiU5*lI>t8i?R(SHVgjv=+E~xc%Dmw2YGYxY(E<#0KsVKUGs}em9^$@S z@{u#l)>3HTV65Bbi*sCR!P=l9@cSIT4vHX-KL{&R)bgi3Oi0c0yIyzpkvkdf@~8i@ zye3m=nNEJZ!&pzGy+0+jf?V{BXIC%%?h3Si6;kW>KU7tn70n0K%w_2iJ~9zA)_nDc zRC<^z5tJVg)G6HlC|q=mJO*1%!^J?5RY)i7RwEtg@TATzQmn=F?p-y#qHAxZ!>3Pg zwR(C*cR+uQ9m)hCCaaB&5K2CC|M)e8eGv4*%wjT2PBYVyCU~L|t;aO;#Wj6Q49u&i zU9ZAIX=P=4F{W^fIL)&clJk`ns{)7|74mc%Z$TL}{z}#M(`g($)`$w^wmk}1p(l92V^J}+xs|MX6xA{_|2nGW14%Ndwt6&1r~c^}ou*C$$VRX!ZDD=H?@G){ z{})|U#B#{~d35?`aAPNAfdsLCD@zX)T%`xf&RaO!54a(2@PJ=5M9{9oSA*CqSPr4j zpqS$BQkSK3rCWDc!gTsS5KFz42xG1M zOnuTdq{6!vt3YQ#R<7GkF=EgT>~d#Oq=y+8K}vfHpSy+*mqq{SxyovvBOArbgdApX z5IPcgm2EWIHtQDzFJQ2}`t@;cmo?>7uKnkoRukr)9(`G&;X{fk<0l#vGvG1(=k1BRv^h{`tfrT}ZQ?`YVrTc6lvnF)f?L&0sW}GN7R_Mou z2+q52M5ph+h_!@%cyy`pW0Bvfq<2IXH`70y?KuOrZ3HO+ea+NO!x!it1kj z7isi{foY}H(j$7R>|f4^svFP=mh*oTFB)B4tCs2%_^v!MEMN5Qr=fL}@6Ljv^sd!t z=;0^|!dCWHv9tNOo(?S!@0Ij!{*GRNQ&q{AXPU{}>&RL!MB zRsA}^{?c;wqJ)vC=ILLlwJ$Lf^TlT<%?qBvWoXJp3k>JY-TJRPLzm1&`pP*pg=*^p zEbNF@5S+-J5h}wxctLQf2dl)kXr{2fLbHGzX0&>d2iD&|ETYO^vdG+-{r)HWt_-&4in(Z`X?yj-W&pex@p|xYwS@r6&q~Aa3G@F4h#$o zU>WK0g&>Y2h3Nu1A!Q}^lsuxBa}YjGF8l*v-^4S>oHECYF-xbvDQdh=vL7~#oRPnK z8J1g}TCBF|E@_;A)y58}>zGK1$B--9AR_Zp;yT+s1B`oHS|$Z-GqJO{aLBRU2UB%v zAe@~cGHYUId0tNNENL=$VtcgT9r>|yomUHNY(wZNRcq&na8J+L9~gHaW*)T;-9 zkTD4a$}Aa7zBfYhbqPJ2)y9xC9KxaS-`O^mZSB{Eo4i08hv)Sm`r(&ED40w6AaehX43+%>l zGu$eV;3^U&;66|5mYCZ;B?{0gHV_SvTQk5$$9||C1!j9Dc)s{S(Eq;obt3}sD!^hz z8D6yV2G!?_`;RC4K~K$n4A!}yh^Y_8H5%ROscn1X z80dB4)Z{G1Dk$@j$Odx}*3ZfQ*|!Owz|8HB%Uh^Xi2_h|@vXxzfC%vB{~?QO)=hC&c{jYKwv)MZzB_`ta( zDMgX5>`1cSV8(ePSudFr60Qe#JP!r8mp)LS#+E&n-XGfqdg;$Y z^lWFZrt))jkHtBZ3e0)bb~s`HCU;^v! zH=AT$PtBw!yO1FoyMCg{;k#)&8^r($>NHX}{I=`>f(|dBMU0OGOR`iJPMCyaHph%c z@1Lk2=^^z9nq(XSMhd{{U|eHcnR9{4oBF!?sr4U~3QDE0>_OKhy@_zh_&U7H4SW50 zF~ZMSb*Uy!MBh5#-LrM?fk#D}A9ZbYw>XTm?a`@OUDbh6plc4~ilKpFk9cMmGqDAN z>8HEoF4u*RpOk!t+&4@(4n)p&*K0T@e|joi=+sXQ(n#bV=98!PV~FnFf-L9M>n|h{ zJ$|<3A9%RdZMd{9EjJaBlW?kjL#eO@emkH|rWLlz#OFWtOR53#F1#xYXTz}bhMr8pX{RwO53vo}Ma0S62o)wT$*0-7oI13I0zDGLe*`1(|kzWzk0$oq0k3znp``D?k zg5yjkjDCTNV}Jn}C@O@nHvB)6AR(tkWQGLQU5$k?@P_NF=xfU>Z_h$q-9Y6!YlD;N ztdN7j%vc2~*sTIT+D%@BG|JLVufs^XSu>`BV6v%M${q;<^DD_!tCX1CyP3>r|PNSWtvb0>>|*VYN-0~ft_VBtWUJl$Z}(6+3ery0IZ#(7(y-y z5wwXG)^!NcRUONq757e}@5OlKJHY7oF!{;CCt>qos4wgDLYw8{Rc`5J&gDfern&U9 z`C_Od9awt{k6k{+Dk{B-NLJ|LCU@RNutLj1_zD3bXQ;A(uq%)Z3l>1g4O4#skG{zi z$B`p-OIN`vGRzuMZsHjD)Hny!VBlCL33fMIIOw=_jBOoGqq4l5*@O&06IS;) zS&$)!O)mFy<$_|HfOucktcX3D=PZ2vrSRw7GUJkAz^o=}zc?s-$i`#gw zcB9W#jTsTm770TLHQR=h^?ph&-V~`p4W@O@Bo3qmt^=fPeLMCdncJs;n!g`!e?Q#* zzK>ryv^a~j<=eer2@3B`GL`kDFc)1#+gJ??@2kb< z9W6fR9mt5a3nbzX6fP;9z~(^xNmLSMLd8mkL~{^!dVu|Azk+{17?$`R0{AK(7*WI` z&FQ;RoadL68ax1>H{|zXH;>=N6Qd2ed{4ZbtbaCkbFH+T;Zgqvx}P>A$<3glOMJc@ z>F~z-|5iIQXt)92O`%c%$49eJyDGsNhyW_i9y_QS%SV_2?XtVUsIf0 zHcjtR@=CE^y6hhery{k$yWtFsO@z_B)?>@h&2iXwnIp!6rQPlGTNlB`tvA+hE+cIa z{sT#w*ytP`DP|!;;G40FH+%xDHqq^2cKx@xu*l|E(?Kz^EyE6l`OCbeYR7W`zZz#j zCkSkSowB49!pIi2B(0sy6-K0Phmjz)4ZG&+T*wda3Y7(Zi=OA8#%YiQSDJ$4P(Z2! zOxw^^6vsU!zSR@v<&tfg{>wC7<$*mV(_!~Go6sJKXb}&w17x}@w!2m7*I598)oA5= zN=)Bv+N%96>bV|b>T=w%XNv6dCKf+9&zKfftFrzl&Pn+!Q^E2^v|NI#yKL^ivt;qW z*s_KhY!@h00R=Ic1u>2&e}GJcdeY+nh~$(#5h@glAPNM|oaVp?4549t7sw;(V&3>d zj1dHZzkn@n5SjFsS&F12z!K0nbj!7#jklE%vzdTmIswQFROt@0;~0S8uu69uom3Q^ zlH@lfBd*dr+ysIv1q5oFqi8i?zg>J7A6M!1a^b3*8~i#|0|h>2u4(GM1!rM)VNA?) zn!VnYT>69J8LNJwUmxv1$TMdDx_$pJBojmD`hQt@GBYuy zR@b}IzqZzXWUQ%xt=a?pDeq~ct7X%M0dWPIED8N7B-uf9UVw9=|EUu8)w$8R36c(r zI@jPi+g|vmFu@^%fTam`z@+(N#|p?- zu1oMoW;DjG#s~>_8u)nmwm6i{sY;}0jCs=8z3bVW*dk%74EPNkxo zn=*3vAoxcQ*(=B6$>*3QvgOcF%TiXTktG#7oE$N-UUIZf}iTa+rD4zUk5 z$p3je1*|R2xg=nGa0}$?bo~J7mgCZ+P(yaIc41}8hg(Ab2$?ty!U!_~3?#|##B5O! ztCj5`v&8-hu@8eXWKh(<7QS01FX$OmCLA!wsqaFskO5s&v^1dJzXebJx6`U|ZDCFh?YXHHPA^%J_r6<05 z3y$o%I+8B*=O~vhV2f&k4$=inhv{5euHZx5K80wtw|2y>vfi7ru8wE+c) zSE01AzI5P-&(JY;Krn9dj$-2!YCjZ4#BH~w2xVXSK3rD3^-J0m#MBgaF=kbjBy^1s zsqV9tM}iZe>oAnt9drsrtnV1}d&}==CVW=^UP;k1-KdJhnt-Vxc#nY7j`PzVt($uu zxaF+7Ze@(HM&wqX$ytpGpe6c{Gt3o=EcK=`4y@`w(OKFpiMi_(V_HyKT+Z+3{`(Fx zONaWiG3oWK6agoGwEv$}ah!T$R)X8vc>X`LJrE<~0*6foXkZpo6b8RppG9A>mH7}= zrk{3+_EdoBq5hxlhA%O~(pKkE`T%MdjH}=OVwGLH_rNVX+vyU(V%nje?tqca7kg3f z>;~MT1Fr2Uk0GVSZI-{C#ryQWAOFpd?76Ty%Dv0r*ZM0OfFkf{(^oe<>Col{)f@fz zwZb;Nh3QE8x6x2o;{4>6NJ?H5`D24Tla)oz6af<-k1GGh^v5f6Y2rBwrL1 ziy�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

-6st!tbE0 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 literal 0 HcmV?d00001 diff --git a/frontend/src/app/router.js b/frontend/src/app/router.js index 606f0b4..7d10e42 100644 --- a/frontend/src/app/router.js +++ b/frontend/src/app/router.js @@ -1,5 +1,5 @@ import { createRouter, createWebHistory } from 'vue-router' -import { useUserStore } from '@/features/auth/store/userStore' +import { useAuthUserStore } from '@/features/auth/store/authUserStore' const routes = [ { @@ -33,17 +33,17 @@ const router = createRouter({ // 路由守卫:拦截未登录用户的访问 router.beforeEach(async (to, from, next) => { - const userStore = useUserStore() + const authUserStore = useAuthUserStore() // 1. 检查内存中是否有用户信息 (乐观检查) - let isAuthenticated = !!(userStore.userInfo && userStore.userInfo.id) + let isAuthenticated = !!(authUserStore.userInfo && authUserStore.userInfo.id) // 2. 如果内存无状态,但目标页需要登录 OR 是仅游客页面(如登录页),尝试通过 Cookie 恢复会话 // (Option 1B: 即使访问登录页,也先确认是否已登录,防止误判) if (!isAuthenticated && (to.meta.requiresAuth || to.meta.guestOnly)) { try { - await userStore.fetchUserInfo() - isAuthenticated = !!(userStore.userInfo && userStore.userInfo.id) + await authUserStore.fetchUserInfo() + isAuthenticated = !!(authUserStore.userInfo && authUserStore.userInfo.id) } catch (e) { } } diff --git a/frontend/src/app/styles/main.css b/frontend/src/app/styles/main.css index ee5863d..610d91c 100644 --- a/frontend/src/app/styles/main.css +++ b/frontend/src/app/styles/main.css @@ -1165,4 +1165,11 @@ main { .upload-placeholder:hover { color: var(--el-color-primary); +} + +@media (max-width: 768px) { + /* 修复 el-dialog 在移动端固定宽溢出 */ + .el-dialog { + width: 90% !important; + } } \ No newline at end of file diff --git a/frontend/src/features/auth/composables/useOAuthCallback.js b/frontend/src/features/auth/composables/useOAuthCallback.js new file mode 100644 index 0000000..5576913 --- /dev/null +++ b/frontend/src/features/auth/composables/useOAuthCallback.js @@ -0,0 +1,124 @@ +import { ref, onMounted } from 'vue' +import { useRoute, useRouter } from 'vue-router' +import { useAuthUserStore } from '@/features/auth/store/authUserStore' +import { setIdbItem } from '@/shared/utils/idb' +import { authService } from '@/features/auth/service/authService' + +/** + * 处理 OAuth 授权重定向回来的回调逻辑 (验证、防伪造、Token 兑换) + */ +export function useOAuthCallback() { + const route = useRoute() + const router = useRouter() + const errorMsg = ref('') + const providerName = ref('身份提供商') + + onMounted(async () => { + const code = route.query.code + const state = route.query.state + const error = route.query.error + const hash = route.query.hash // Telegram 特有参数 + + // 1. 智能识别 Provider + let providerId = route.params.provider + if (!providerId) { + if (hash) providerId = 'telegram' + else providerId = localStorage.getItem('oauth_provider') || 'github' + } + + // 优化:优先从缓存读取提供商名称 + try { + const cached = localStorage.getItem('oauth_providers_cache') + if (cached) { + const providers = JSON.parse(cached) + const p = providers.find(x => x.id === providerId) + if (p) providerName.value = p.name + } else { + const res = await authService.getProviders() + const p = res.providers?.find(x => x.id === providerId) + if (p) providerName.value = p.name + } + } catch (e) { + // Ignore cache errors + } + + if (error) { + errorMsg.value = route.query.error_description || `您拒绝了 ${providerName.value} 的授权请求` + return + } + + // 2. 参数结构校验 (策略分发) + let payload = {} + + if (providerId === 'telegram') { + if (!hash) { + errorMsg.value = 'Telegram 登录缺少签名参数' + return + } + const savedState = localStorage.getItem('oauth_state') + payload = { ...route.query, state: savedState } + } else { + if (!code || !state) { + errorMsg.value = 'URL 缺少必要的授权凭证参数' + return + } + + // 防御 CSRF:必须检查 State 匹不匹配 + const savedState = localStorage.getItem('oauth_state') + if (!savedState || savedState !== state) { + errorMsg.value = '安全警告:State 校验失败,请求可能被篡改' + return + } + + const codeVerifier = localStorage.getItem('oauth_code_verifier') + payload = { code, state, codeVerifier } + } + + // 无论成功与否,用过一次立马清除防止重放 (Replay Attack) + localStorage.removeItem('oauth_state') + localStorage.removeItem('oauth_provider') + localStorage.removeItem('oauth_code_verifier') + + try { + const startTime = Date.now() + // Telegram 用户体验优化:强制展示 1.5s 的 Loading 画风 + const MIN_DISPLAY_TIME = providerId === 'telegram' ? 1500 : 0 + + // 向后端服务进行 Token 兑换 + const data = await authService.loginWithToken(providerId, payload) + + const elapsed = Date.now() - startTime + if (elapsed < MIN_DISPLAY_TIME) { + await new Promise(resolve => setTimeout(resolve, MIN_DISPLAY_TIME - elapsed)) + } + + if (data.success) { + // 持久化设备指纹标识 (用于双端加密验证) + if (data.deviceKey) { + await setIdbItem('device_salt', data.deviceKey) + } + + // 更新状态机进入应用主流程 + const authUserStore = useAuthUserStore() + await authUserStore.fetchUserInfo() + router.push('/') + } else { + errorMsg.value = data.error || '登录验证被后端拒绝' + } + } catch (err) { + console.error('OAuth Callback Error:', err) + // Error Managed by request interceptor and authError mapping + errorMsg.value = err.message || '网络请求异常,请稍后再试' + } + }) + + const goBackToLogin = () => { + router.push('/login') + } + + return { + errorMsg, + providerName, + goBackToLogin + } +} diff --git a/frontend/src/features/auth/composables/useOAuthProviders.js b/frontend/src/features/auth/composables/useOAuthProviders.js new file mode 100644 index 0000000..5b0c3b1 --- /dev/null +++ b/frontend/src/features/auth/composables/useOAuthProviders.js @@ -0,0 +1,77 @@ +import { ref, onMounted } from 'vue' +import { ElMessage } from 'element-plus' +import { authService } from '@/features/auth/service/authService' + +const CACHE_KEY = 'oauth_providers_cache' + +/** + * 处理 OAuth 提供商列表加载与授权重定向 + */ +export function useOAuthProviders() { + const loadingProvider = ref(null) + const providers = ref([]) + + onMounted(async () => { + // 1. 优先从缓存读取,实现秒开 (Offline-first / Stale-while-revalidate) + const cached = localStorage.getItem(CACHE_KEY) + if (cached) { + try { + providers.value = JSON.parse(cached) + } catch (e) { + console.warn('Invalid oauth providers cache', e) + } + } + + // 2. 后台请求接口更新数据 + try { + const data = await authService.getProviders() + if (data.success) { + providers.value = data.providers + // 只有当后端返回了有效配置时才更新缓存 + if (data.providers && data.providers.length > 0) { + localStorage.setItem(CACHE_KEY, JSON.stringify(data.providers)) + } + } + } catch (e) { + console.error('Failed to sync oauth providers:', e) + } + }) + + const handleLogin = async (providerId) => { + if (loadingProvider.value) return + loadingProvider.value = providerId + + try { + // 1. 获取授权链接及防篡改参数 + const data = await authService.getAuthorizeUrl(providerId) + + if (data.success && data.authUrl) { + // 2. 存储 state 防御 CSRF 并跳转 + localStorage.setItem('oauth_state', data.state) + localStorage.setItem('oauth_provider', providerId) + + // PKCE (Proof Key for Code Exchange) 支持 + if (data.codeVerifier) { + localStorage.setItem('oauth_code_verifier', data.codeVerifier) + } + + window.location.href = data.authUrl + } else { + ElMessage.error(data.error || '获取授权链接失败: 提供商未配置或失效') + } + } catch (error) { + // Error managed by axios request interceptor & authError + ElMessage.error(error.message || '获取授权状态遭遇网络异常') + } finally { + // The loading state mostly clears when the page navigates away, + // but we reset it here in case of errors. + loadingProvider.value = null + } + } + + return { + providers, + loadingProvider, + handleLogin + } +} diff --git a/frontend/src/features/auth/service/authService.js b/frontend/src/features/auth/service/authService.js new file mode 100644 index 0000000..d1d7962 --- /dev/null +++ b/frontend/src/features/auth/service/authService.js @@ -0,0 +1,99 @@ +import { request } from '@/shared/utils/request' +import { authError } from '@/shared/utils/errors/authError' + +/** + * @typedef {Object} OAuthProvider + * @property {string} id - 提供商标识 (如 'github', 'telegram') + * @property {string} name - 提供商显示名称 + * @property {string} [icon] - SVG 图标 + * @property {string} [color] - 品牌主色调 + */ + +/** + * @typedef {Object} AuthorizeResponse + * @property {boolean} success - 是否成功 + * @property {string} authUrl - 授权跳转链接 + * @property {string} state - 随机状态码 (CSRF防御) + * @property {string} [codeVerifier] - PKCE验证码 + * @property {string} [error] - 错误信息 + */ + +/** + * @typedef {Object} LoginResponse + * @property {boolean} success - 是否成功 + * @property {string} [deviceKey] - 设备指纹标识 (用于后续验证) + * @property {string} [error] - 错误信息 + */ + +export const authService = { + /** + * 获取系统当前支持的 OAuth 登录提供商列表 + * @returns {Promise<{success: boolean, providers: OAuthProvider[]}>} + * @throws {authError} + */ + async getProviders() { + try { + return await request('/api/oauth/providers') + } catch (error) { + throw new authError(error.message || '获取登录方式失败', error.status) + } + }, + + /** + * 获取指定提供商的授权重定向地址 + * @param {string} providerId - 提供商 ID + * @returns {Promise} + * @throws {authError} + */ + async getAuthorizeUrl(providerId) { + try { + return await request(`/api/oauth/authorize/${providerId}`) + } catch (error) { + throw new authError(error.message || '获取授权链接失败', error.status) + } + }, + + /** + * 回调阶段:使用授权码 (Code) 兑换系统 JWT + * @param {string} providerId - 提供商 ID + * @param {Object} payload - 需要验证的载荷 (如 code, state, codeVerifier, hash) + * @returns {Promise} + * @throws {authError} + */ + async loginWithToken(providerId, payload) { + try { + return await request(`/api/oauth/callback/${providerId}`, { + method: 'POST', + body: JSON.stringify(payload) // request 工作器内部使用的是 fetch,需要手动 stringify + }) + } catch (error) { + throw new authError(error.message || '登录验证失败', error.status) + } + }, + + /** + * 退出登录,注销服务端 Session/Token + * @returns {Promise<{success: boolean}>} + */ + async logout() { + try { + return await request('/api/oauth/logout', { method: 'POST' }) + } catch (error) { + console.error('Logout request failed', error) + return { success: false } + } + }, + + /** + * 获取当前登录用户信息 + * @returns {Promise<{success: boolean, userInfo?: Object}>} + */ + async fetchMe() { + try { + // 加入时间戳防缓存,silent: true 防止请求拦截器弹出 message + return await request(`/api/oauth/me?_t=${Date.now()}`, { silent: true }) + } catch (error) { + return { success: false } + } + } +} diff --git a/frontend/src/features/auth/store/userStore.js b/frontend/src/features/auth/store/authUserStore.js similarity index 69% rename from frontend/src/features/auth/store/userStore.js rename to frontend/src/features/auth/store/authUserStore.js index 803dba2..b4ab61b 100644 --- a/frontend/src/features/auth/store/userStore.js +++ b/frontend/src/features/auth/store/authUserStore.js @@ -1,10 +1,10 @@ import { defineStore } from 'pinia' import { ref } from 'vue' -import { request } from '@/shared/utils/request' +import { authService } from '@/features/auth/service/authService' import { useVaultStore } from '@/features/vault/store/vaultStore' import { removeIdbItem } from '@/shared/utils/idb' -export const useUserStore = defineStore('user', () => { +export const useAuthUserStore = defineStore('authUserInfo', () => { const getStoredUser = () => { try { return JSON.parse(localStorage.getItem('userInfo') || '{}') @@ -38,27 +38,19 @@ export const useUserStore = defineStore('user', () => { } const logout = async () => { - try { - await request('/api/oauth/logout', { method: 'POST' }) - } catch (e) { - console.error('Logout request failed', e) - } finally { - await clearUserInfo() - } + await authService.logout() + await clearUserInfo() } const fetchUserInfo = async () => { - try { - const data = await request(`/api/oauth/me?_t=${Date.now()}`, { silent: true }) - if (data.success) { - setUserInfo(data.userInfo) - return true - } - } catch (e) { + const data = await authService.fetchMe() + if (data && data.success) { + setUserInfo(data.userInfo) + return true + } else { await clearUserInfo() return false } - return false } return { diff --git a/frontend/src/features/auth/views/login.vue b/frontend/src/features/auth/views/login.vue index 5404f21..b70b40b 100644 --- a/frontend/src/features/auth/views/login.vue +++ b/frontend/src/features/auth/views/login.vue @@ -4,7 +4,7 @@

2FAuth Worker

-

您的专属云端双因素认证管家

+

A Secure 2FA Management Tool

@@ -19,8 +19,9 @@ @click="handleLogin(provider.id)" > 通过 {{ provider.name }} 授权登录 @@ -41,68 +42,27 @@ \ No newline at end of file diff --git a/frontend/src/features/auth/views/oauthCallback.vue b/frontend/src/features/auth/views/oauthCallback.vue index df486bd..a763905 100644 --- a/frontend/src/features/auth/views/oauthCallback.vue +++ b/frontend/src/features/auth/views/oauthCallback.vue @@ -27,127 +27,12 @@ \ No newline at end of file diff --git a/frontend/src/features/backup/components/backupSettings.vue b/frontend/src/features/backup/components/backupSettings.vue index 4af44de..a3a9aac 100644 --- a/frontend/src/features/backup/components/backupSettings.vue +++ b/frontend/src/features/backup/components/backupSettings.vue @@ -193,67 +193,26 @@ -const openAddDialog = () => { - isEditing.value = false - form.value = { type: 'webdav', name: '', config: { url: '', username: '', password: '', saveDir: '/', endpoint: '', bucket: '', region: 'auto', accessKeyId: '', secretAccessKey: '' }, autoBackup: false, autoBackupPassword: '', autoBackupRetain: 30 } - hasExistingAutoPwd.value = false - configUseExistingAutoPwd.value = false - showConfigDialog.value = true + \ No newline at end of file diff --git a/frontend/src/features/backup/composables/useBackupActions.js b/frontend/src/features/backup/composables/useBackupActions.js new file mode 100644 index 0000000..a91f8f9 --- /dev/null +++ b/frontend/src/features/backup/composables/useBackupActions.js @@ -0,0 +1,146 @@ +import { ref } from 'vue' +import { ElMessage, ElNotification } from 'element-plus' +import { backupService } from '@/features/backup/service/backupService' +import { dataMigrationService } from '@/features/migration/service/dataMigrationService' +import { useVaultStore } from '@/features/vault/store/vaultStore' + +export function useBackupActions(emit, fetchProviders) { + const vaultStore = useVaultStore() + + // Backup Action State + const showBackupDialog = ref(false) + const backupPassword = ref('') + const isBackingUp = ref(false) + const useAutoPassword = ref(false) + const currentActionProvider = ref(null) + + // Restore Action State + const showRestoreListDialog = ref(false) + const isLoadingFiles = ref(false) + const backupFiles = ref([]) + const showRestoreConfirmDialog = ref(false) + const restorePassword = ref('') + const selectedFile = ref(null) + const isRestoring = ref(false) + + // Backup methods + const openBackupDialog = (provider) => { + currentActionProvider.value = provider + backupPassword.value = '' + useAutoPassword.value = !!provider.auto_backup + showBackupDialog.value = true + } + + const handleBackup = async () => { + if (!useAutoPassword.value && backupPassword.value.length < 12) { + return ElMessage.warning('密码至少12位') + } + + const pwdToSend = useAutoPassword.value ? '' : backupPassword.value + + isBackingUp.value = true + try { + const res = await backupService.triggerBackup(currentActionProvider.value.id, pwdToSend) + if (res.success) { + ElNotification({ + title: '云端备份完成', + message: `
🎉 成功备份了数据
`, + dangerouslyUseHTMLString: true, + type: 'success', + duration: 5000 + }) + showBackupDialog.value = false + if (fetchProviders) await fetchProviders() + } + } catch (e) { + ElMessage.error(e.message || '备份失败') + } finally { isBackingUp.value = false } + } + + // Restore methods + const openRestoreDialog = async (provider) => { + currentActionProvider.value = provider + showRestoreListDialog.value = true + isLoadingFiles.value = true + try { + const res = await backupService.getBackupFiles(provider.id) + if (res.success) backupFiles.value = res.files + } catch (e) { + ElMessage.error(e.message || '获取备份文件失败') + } finally { isLoadingFiles.value = false } + } + + const selectRestoreFile = (file) => { + selectedFile.value = file + restorePassword.value = '' + showRestoreConfirmDialog.value = true + } + + const handleRestore = async () => { + isRestoring.value = true + try { + const downloadRes = await backupService.downloadBackupFile(currentActionProvider.value.id, selectedFile.value.filename) + + let contentToDecrypt = downloadRes.content + try { + const json = typeof contentToDecrypt === 'string' ? JSON.parse(contentToDecrypt) : contentToDecrypt + if (json && json.encrypted && json.data) { + contentToDecrypt = json.data + } + } catch (e) { } + + const vault = await dataMigrationService.parseImportData(contentToDecrypt, 'encrypted', restorePassword.value) + const saveRes = await dataMigrationService.saveImportedVault(vault) + + if (saveRes.success) { + let msgHtml = `
共处理 1 个备份文件 (${vault.length} 个基准账号)。
` + if (saveRes.count > 0) { + msgHtml += `
🎉 成功导入 ${saveRes.count} 个新账户!
` + } else { + msgHtml += `
⚠️ 恢复的账户皆已存在,无新添项。
` + } + if (saveRes.duplicates > 0) msgHtml += `
ℹ️ 自动跳过了 ${saveRes.duplicates} 个已有账户。
` + + ElNotification({ + title: '恢复数据结束', + message: msgHtml, + dangerouslyUseHTMLString: true, + type: 'success', + duration: 8000 + }) + + showRestoreConfirmDialog.value = false + showRestoreListDialog.value = false + if (saveRes.count > 0) { + vaultStore.markDirty() + emit('restore-success') + } + } + } catch (e) { + ElMessage.error(e.message || '恢复失败') + } finally { isRestoring.value = false } + } + + return { + // Backup + showBackupDialog, + backupPassword, + isBackingUp, + useAutoPassword, + currentActionProvider, + openBackupDialog, + handleBackup, + + // Restore + showRestoreListDialog, + isLoadingFiles, + backupFiles, + showRestoreConfirmDialog, + restorePassword, + selectedFile, + isRestoring, + openRestoreDialog, + selectRestoreFile, + handleRestore + } +} diff --git a/frontend/src/features/backup/composables/useBackupProviders.js b/frontend/src/features/backup/composables/useBackupProviders.js new file mode 100644 index 0000000..ebc55fd --- /dev/null +++ b/frontend/src/features/backup/composables/useBackupProviders.js @@ -0,0 +1,166 @@ +import { ref, onMounted } from 'vue' +import { ElMessage, ElMessageBox } from 'element-plus' +import { useVaultStore } from '@/features/vault/store/vaultStore' +import { backupService } from '@/features/backup/service/backupService' + +export function useBackupProviders() { + const vaultStore = useVaultStore() + + const providers = ref([]) + const isLoading = ref(false) + + // Form and Dialog State + const showConfigDialog = ref(false) + const isEditing = ref(false) + const isTesting = ref(false) + const isSaving = ref(false) + + const initialFormState = () => ({ + type: 'webdav', + name: '', + config: { url: '', username: '', password: '', saveDir: '/', endpoint: '', bucket: '', region: 'auto', accessKeyId: '', secretAccessKey: '' }, + autoBackup: false, + autoBackupPassword: '', + autoBackupRetain: 30 + }) + + const form = ref(initialFormState()) + const currentProviderId = ref(null) + const hasExistingAutoPwd = ref(false) + const configUseExistingAutoPwd = ref(false) + + // Methods + const fetchProviders = async () => { + const cachedEncrypted = await vaultStore.getEncryptedBackupProviders() + if (cachedEncrypted && Array.isArray(cachedEncrypted)) { + providers.value = cachedEncrypted + } else { + isLoading.value = true + } + + try { + const res = await backupService.getProviders() + if (res.success) { + providers.value = res.providers + await vaultStore.saveEncryptedBackupProviders(res.providers) + } + } finally { isLoading.value = false } + } + + const openAddDialog = () => { + isEditing.value = false + form.value = initialFormState() + hasExistingAutoPwd.value = false + configUseExistingAutoPwd.value = false + showConfigDialog.value = true + } + + const editProvider = (provider) => { + isEditing.value = true + currentProviderId.value = provider.id + form.value = JSON.parse(JSON.stringify({ + type: provider.type, + name: provider.name, + config: provider.config, + autoBackup: !!provider.auto_backup, + autoBackupPassword: '', + autoBackupRetain: provider.auto_backup_retain ?? 30 + })) + hasExistingAutoPwd.value = !!provider.auto_backup_password + configUseExistingAutoPwd.value = true + showConfigDialog.value = true + } + + const validateForm = () => { + if (!form.value.name) return '请输入名称' + const c = form.value.config + if (form.value.type === 'webdav') { + if (!c.url) return '请输入 WebDAV 地址' + if (!c.username) return '请输入用户名' + if (!c.password) return '请输入密码' + } else if (form.value.type === 's3') { + if (!c.endpoint) return '请输入 Endpoint' + if (!c.bucket) return '请输入 Bucket' + if (!c.accessKeyId) return '请输入 Access Key ID' + if (!c.secretAccessKey) return '请输入 Secret Access Key' + } + + if (form.value.autoBackup) { + if (isEditing.value && hasExistingAutoPwd.value && configUseExistingAutoPwd.value) { + return null + } + if (!form.value.autoBackupPassword || form.value.autoBackupPassword.length < 12) { + return '自动备份密码长度必须至少 12 位' + } + } + return null + } + + const testConnection = async () => { + const error = validateForm() + if (error) return ElMessage.warning(error) + + isTesting.value = true + try { + const res = await backupService.testConnection(form.value.type, form.value.config) + if (res.success) ElMessage.success('连接成功') + } catch (e) { + ElMessage.error(e.message || '连接失败') + } finally { isTesting.value = false } + } + + const saveProvider = async () => { + const error = validateForm() + if (error) return ElMessage.warning(error) + + if (isEditing.value && hasExistingAutoPwd.value && configUseExistingAutoPwd.value) { + form.value.autoBackupPassword = '' + } + + isSaving.value = true + try { + const res = isEditing.value + ? await backupService.updateProvider(currentProviderId.value, form.value) + : await backupService.createProvider(form.value) + if (res.success) { + ElMessage.success('保存成功') + showConfigDialog.value = false + await fetchProviders() + } + } catch (e) { + ElMessage.error(e.message || '保存失败') + } finally { isSaving.value = false } + } + + const deleteProvider = async (provider) => { + try { + await ElMessageBox.confirm('确定删除该备份源吗?', '警告', { type: 'warning' }) + await backupService.deleteProvider(provider.id) + await fetchProviders() + } catch (e) { + if (e !== 'cancel') { + ElMessage.error(e.message || '删除失败') + } + } + } + + onMounted(fetchProviders) + + return { + providers, + isLoading, + showConfigDialog, + isEditing, + isTesting, + isSaving, + form, + hasExistingAutoPwd, + configUseExistingAutoPwd, + fetchProviders, + openAddDialog, + editProvider, + testConnection, + saveProvider, + deleteProvider + } +} diff --git a/frontend/src/features/backup/service/backupService.js b/frontend/src/features/backup/service/backupService.js new file mode 100644 index 0000000..388c2f6 --- /dev/null +++ b/frontend/src/features/backup/service/backupService.js @@ -0,0 +1,158 @@ +import { request } from '@/shared/utils/request' +import { backupError } from '@/shared/utils/errors/backupError' + +/** + * @typedef {Object} BackupProviderConfig + * @property {string} url - WebDAV URL + * @property {string} username - WebDAV Username + * @property {string} password - WebDAV Password + * @property {string} saveDir - Save Directory + * @property {string} endpoint - S3 Endpoint + * @property {string} bucket - S3 Bucket + * @property {string} region - S3 Region + * @property {string} accessKeyId - S3 Access Key ID + * @property {string} secretAccessKey - S3 Secret Access Key + */ + +/** + * @typedef {Object} BackupProvider + * @property {string} [id] - Provider ID + * @property {string} name - Provider Name + * @property {string} type - Provider Type ('webdav' | 's3') + * @property {BackupProviderConfig} config - Provider Configuration + * @property {boolean} auto_backup - Auto backup enabled + * @property {string} [auto_backup_password] - Auto backup encryption password + * @property {number} [auto_backup_retain] - Number of backups to retain + */ + +export const backupService = { + /** + * 获取所有备份源配置 + * @returns {Promise<{success: boolean, providers: BackupProvider[]}>} + * @throws {backupError} + */ + async getProviders() { + try { + return await request('/api/backups/providers') + } catch (e) { + throw new backupError('Failed to fetch backup providers', 'PROVIDERS_FETCH_FAILED', e) + } + }, + + /** + * 测试备份源连接 + * @param {string} type - 'webdav' 或 's3' + * @param {BackupProviderConfig} config + * @returns {Promise<{success: boolean}>} + * @throws {backupError} + */ + async testConnection(type, config) { + try { + return await request('/api/backups/providers/test', { + method: 'POST', + body: JSON.stringify({ type, config }) + }) + } catch (e) { + throw new backupError('Failed to test connection', 'CONNECTION_TEST_FAILED', e) + } + }, + + /** + * 创建新的备份源 + * @param {BackupProvider} providerData + * @returns {Promise<{success: boolean, provider: BackupProvider}>} + * @throws {backupError} + */ + async createProvider(providerData) { + try { + return await request('/api/backups/providers', { + method: 'POST', + body: JSON.stringify(providerData) + }) + } catch (e) { + throw new backupError('Failed to create provider', 'PROVIDER_CREATE_FAILED', e) + } + }, + + /** + * 更新现有备份源 + * @param {string} id + * @param {BackupProvider} providerData + * @returns {Promise<{success: boolean}>} + * @throws {backupError} + */ + async updateProvider(id, providerData) { + try { + return await request(`/api/backups/providers/${id}`, { + method: 'PUT', + body: JSON.stringify(providerData) + }) + } catch (e) { + throw new backupError('Failed to update provider', 'PROVIDER_UPDATE_FAILED', e) + } + }, + + /** + * 删除备份源 + * @param {string} id + * @returns {Promise<{success: boolean}>} + * @throws {backupError} + */ + async deleteProvider(id) { + try { + return await request(`/api/backups/providers/${id}`, { method: 'DELETE' }) + } catch (e) { + throw new backupError('Failed to delete provider', 'PROVIDER_DELETE_FAILED', e) + } + }, + + /** + * 手动触发一次备份 + * @param {string} id + * @param {string} password - 备份加密密码 (若使用自动备份密码则为空) + * @returns {Promise<{success: boolean}>} + * @throws {backupError} + */ + async triggerBackup(id, password = '') { + try { + return await request(`/api/backups/providers/${id}/backup`, { + method: 'POST', + body: JSON.stringify({ password }) + }) + } catch (e) { + throw new backupError('Failed to trigger backup', 'BACKUP_TRIGGER_FAILED', e) + } + }, + + /** + * 获取备份历史文件列表 + * @param {string} id + * @returns {Promise<{success: boolean, files: Object[]}>} + * @throws {backupError} + */ + async getBackupFiles(id) { + try { + return await request(`/api/backups/providers/${id}/files`) + } catch (e) { + throw new backupError('Failed to fetch backup files', 'FILES_FETCH_FAILED', e) + } + }, + + /** + * 下载加密的备份文件 + * @param {string} id + * @param {string} filename + * @returns {Promise<{success: boolean, content: string|Object}>} + * @throws {backupError} + */ + async downloadBackupFile(id, filename) { + try { + return await request(`/api/backups/providers/${id}/download`, { + method: 'POST', + body: JSON.stringify({ filename }) + }) + } catch (e) { + throw new backupError('Failed to download backup file', 'FILE_DOWNLOAD_FAILED', e) + } + } +} diff --git a/frontend/src/features/backup/service/migrationService.js b/frontend/src/features/backup/service/migrationService.js deleted file mode 100644 index 57a3cc0..0000000 --- a/frontend/src/features/backup/service/migrationService.js +++ /dev/null @@ -1,171 +0,0 @@ -import { request } from '@/shared/utils/request' -import { encryptDataWithPassword, decryptDataWithPassword } from '@/shared/utils/crypto' // 现在已指向标准实现 -import { parseOtpUri } from '@/shared/utils/totp' - -export const migrationService = { - // 1. 获取所有数据 (用于导出) - async fetchAllVault() { - // 请求后端获取所有数据 (limit=9999) - const res = await request('/api/vault?limit=9999') - if (!res.success) throw new Error('无法获取账号数据') - return res.vault || [] - }, - - // 2. 处理导出逻辑 (前端加密/格式化) - async exportData(vault, type, password) { - const timestamp = new Date().toISOString() - const baseData = { version: "2.0", app: "2fauth", timestamp } - - // 格式 A: 本系统加密备份 (使用 crypto-vault AES-GCM) - if (type === 'encrypted') { - if (!password) throw new Error('加密导出需要密码') - const payload = { ...baseData, accounts: vault } - const encryptedData = await encryptDataWithPassword(payload, password) - return JSON.stringify({ - ...baseData, - encrypted: true, - data: encryptedData, - note: "This file is encrypted with your export password (AES-GCM-256 + PBKDF2)." - }, null, 2) - } - - // 格式 B: 标准 JSON - if (type === 'json') { - return JSON.stringify({ ...baseData, encrypted: false, accounts: vault }, null, 2) - } - - // 格式 C: 2FAS 兼容格式 (schemaVersion 4 标准) - if (type === '2fas') { - const services = vault.map(acc => ({ - name: acc.service, - secret: acc.secret, - otp: { - tokenType: 'TOTP', - issuer: acc.service, - account: acc.account, - digits: acc.digits, - period: acc.period, - algorithm: (acc.algorithm || 'SHA1').replace('SHA-', 'SHA'), - counter: 0, - }, - order: { position: 0 }, - })) - return JSON.stringify({ schemaVersion: 4, appOrigin: 'export', services }, null, 2) - } - - // 格式 D: OTPAuth 纯文本格式 - if (type === 'text') { - return vault.map(acc => { - const label = encodeURIComponent(`${acc.service}:${acc.account}`) - const issuer = encodeURIComponent(acc.service) - return `otpauth://totp/${label}?secret=${acc.secret}&issuer=${issuer}&digits=${acc.digits}&period=${acc.period}` - }).join('\n') - } - - throw new Error('未知的导出类型') - }, - - // 3. 处理导入逻辑 (前端解密/解析) - async parseImportData(content, type, password) { - let rawVault = [] - - // 场景 A: 加密备份 - if (type === 'encrypted') { - if (!password) throw new Error('导入加密文件需要密码') - try { - let ciphertext = content - const json = typeof content === 'string' ? tryParseJSON(content) : content - if (json && typeof json === 'object' && json.data) { - ciphertext = json.data - } - const input = typeof ciphertext === 'object' ? JSON.stringify(ciphertext) : ciphertext - const decrypted = await decryptDataWithPassword(input, password) - rawVault = decrypted.vault || decrypted.accounts || [] - } catch (e) { - console.error(e) - throw new Error('解密失败:密码错误或文件格式不兼容') - } - } - // 场景 B: 标准 JSON / 2FAuth - else if (type === 'json') { - const json = typeof content === 'string' ? JSON.parse(content) : content - // 本项目导出格式: data.accounts[] 或 data.vault[] - if (Array.isArray(json.accounts)) { - rawVault = json.accounts - } else if (Array.isArray(json.vault)) { - rawVault = json.vault - // 旧导出格式: data.data[] - } else if (Array.isArray(json.data)) { - rawVault = json.data - // 标准第三方格式: data.secrets[] (issuer + algorithm 字段) - } else if (Array.isArray(json.secrets)) { - rawVault = json.secrets.map(s => ({ - service: s.issuer || s.service || s.name || 'Unknown', - account: s.account || s.label || '', - secret: s.secret || '', - algorithm: s.algorithm || 'SHA1', - digits: s.digits || 6, - period: s.period || 30, - })) - // 简单数组 - } else if (Array.isArray(json)) { - rawVault = json - // 误选 JSON 但实际是 2FAS 格式 - } else if (json.services) { - rawVault = json.services.map(s => ({ - service: s.otp?.issuer || s.name || 'Unknown', - account: s.otp?.account || s.account || s.username || '', - secret: s.secret || '', - algorithm: s.otp?.algorithm || s.algorithm || 'SHA1', - digits: s.otp?.digits || s.digits || 6, - period: s.otp?.period || s.period || 30, - })) - } - } - // 场景 C: 2FAS (schemaVersion 4, 字段在 otp 子对象中) - else if (type === '2fas') { - const json = typeof content === 'string' ? JSON.parse(content) : content - if (Array.isArray(json.services)) { - rawVault = json.services.map(s => ({ - service: s.otp?.issuer || s.name || 'Unknown', - account: s.otp?.account || s.account || s.username || '', - secret: s.secret || '', - algorithm: (s.otp?.algorithm || s.algorithm || 'SHA1').toUpperCase(), - digits: s.otp?.digits || s.digits || 6, - period: s.otp?.period || s.period || 30, - })) - } - } - // 场景 D: OTPAuth 纯文本格式 - else if (type === 'text') { - const lines = content.split('\n') - lines.forEach(line => { - const acc = parseOtpUri(line.trim()) - if (acc) rawVault.push(acc) - }) - } - - // 过滤无效数据 - return rawVault.filter(acc => acc && acc.secret && acc.service && acc.account) - }, - - - // 4. 批量保存到后端s - async saveImportedVault(vault) { - // 调用后端批量导入接口 (需要后端支持接收纯 JSON 数组) - // 我们将复用 /api/vault/import 接口,但修改其实现以支持 'raw' 类型 - return await request('/api/vault/import', { - method: 'POST', - body: JSON.stringify({ type: 'raw', content: JSON.stringify(vault) }) - }) - } -} - -// 辅助函数:安全解析 JSON,失败返回 null -function tryParseJSON(str) { - try { - return JSON.parse(str) - } catch (e) { - return null - } -} \ No newline at end of file diff --git a/frontend/src/features/backup/views/dataExport.vue b/frontend/src/features/backup/views/dataExport.vue deleted file mode 100644 index f801a10..0000000 --- a/frontend/src/features/backup/views/dataExport.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - diff --git a/frontend/src/features/backup/views/dataImport.vue b/frontend/src/features/backup/views/dataImport.vue deleted file mode 100644 index 1da19ce..0000000 --- a/frontend/src/features/backup/views/dataImport.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/features/migration/composables/useDataExport.js b/frontend/src/features/migration/composables/useDataExport.js new file mode 100644 index 0000000..eb7b843 --- /dev/null +++ b/frontend/src/features/migration/composables/useDataExport.js @@ -0,0 +1,208 @@ +import { ref } from 'vue' +import { ElMessage } from 'element-plus' +import { dataMigrationService } from '@/features/migration/service/dataMigrationService' +import { downloadBlob } from '@/shared/utils/common' + +export function useDataExport() { + const showPasswordDialog = ref(false) + const showWarningDialog = ref(false) + const showGaDialog = ref(false) + const isExporting = ref(false) + const exportForm = ref({ password: '', confirm: '' }) + const loadingText = ref('') + + const currentType = ref('') + const currentVariant = ref('generic') + + // GA 分批导出相关 + const gaQrDataUrls = ref([]) + const gaCurrentIndex = ref(0) + + // GA 按需导出选择器相关 + const showAccountSelectDialog = ref(false) + const fullVault = ref([]) + const searchKeyword = ref('') + const selectedAccountIds = ref([]) + + const openExportDialog = (type, variant = 'generic') => { + currentType.value = type + currentVariant.value = variant + exportForm.value = { password: '', confirm: '' } + showPasswordDialog.value = true + } + + const openWarningDialog = (type, variant = 'generic') => { + currentType.value = type + currentVariant.value = variant + showWarningDialog.value = true + } + + // 计算属性:过滤后的账号列表 + const filteredVault = computed(() => { + const keyword = searchKeyword.value.toLowerCase().trim() + if (!keyword) return fullVault.value + return fullVault.value.filter(acc => + (acc.service && acc.service.toLowerCase().includes(keyword)) || + (acc.account && acc.account.toLowerCase().includes(keyword)) + ) + }) + + // 直接开启 Google Auth 导出流程(跳过明文警告弹窗) + const openGaDialogDirectly = () => { + currentType.value = 'gauth' + executeExport() + } + + // 全选/取消全选 (仅作用于当前过滤结果) + const toggleSelectAll = (val) => { + const filteredIds = filteredVault.value.map(acc => acc.id) + if (val) { + // 将不在已选列表中的过滤结果加入已选列表 + const newIds = filteredIds.filter(id => !selectedAccountIds.value.includes(id)) + selectedAccountIds.value.push(...newIds) + } else { + // 将过滤结果从已选列表中移除 + selectedAccountIds.value = selectedAccountIds.value.filter(id => !filteredIds.includes(id)) + } + } + + const executeExport = async () => { + const type = currentType.value + const variant = currentVariant.value + let password = '' + + if (type === 'encrypted') { + if (exportForm.value.password !== exportForm.value.confirm) { + return ElMessage.error('两次输入的密码不一致!') + } + if (exportForm.value.password.length < 12) { + return ElMessage.error('密码太弱!至少需要 12 个字符。') + } + password = exportForm.value.password + } + + isExporting.value = true + showPasswordDialog.value = false + showWarningDialog.value = false + + try { + loadingText.value = '正在获取账号数据...' + const vault = await dataMigrationService.fetchAllVault() + if (!vault || vault.length === 0) { + throw new Error('没有可导出的账号') + } + + loadingText.value = type === 'encrypted' ? '正在加密...' : '正在生成导出文件...' + + // 特殊处理 Google Auth (不再直接生成,而是进入选择界面) + if (type === 'gauth') { + fullVault.value = vault + // 默认全不选 (由用户的偏好修改) + selectedAccountIds.value = [] + searchKeyword.value = '' + showAccountSelectDialog.value = true + isExporting.value = false + return + } + + // 特殊处理 HTML 报告导出 + if (type === 'html') { + const htmlContent = await dataMigrationService.exportAsHtml(vault) + downloadBlob(htmlContent, `2fa-backup-report-${new Date().toISOString().split('T')[0]}.html`, 'text/html') + ElMessage.success('导出完成!请在浏览器中打开该文件。') + isExporting.value = false + return + } + + const fileContent = await dataMigrationService.exportData(vault, type, password, variant) + + let filename, mimeType + const date = new Date().toISOString().split('T')[0] + + switch (type) { + case 'text': + mimeType = 'text/plain' + filename = `2fa-export-otpauth-${date}.txt` + break + case 'csv': + mimeType = 'text/csv' + filename = `2fa-export-csv-${date}.csv` + break + case 'bwauth': + mimeType = 'application/json' + filename = `2fa-export-bwauth-${date}.json` + break + case '2fas': + mimeType = 'application/json' + filename = `2fa-export-2fas-${date}.2fas` + break + case 'generic_json': + mimeType = 'application/json' + filename = `2fa-export-generic-json-${date}.json` + break + default: + // Covers 'encrypted', 'json', 'aegis' + mimeType = 'application/json' + filename = `2fa-export-${type}-${date}.json` + break + } + + downloadBlob(fileContent, filename, mimeType) + ElMessage.success('导出成功!') + } catch (error) { + console.error('Export failed:', error) + ElMessage.error(error.message || '导出失败,请稍后重试') + } finally { + isExporting.value = false + } + } + + // 执行生成所选的 Google Auth 二维码 + const executeGaExport = async () => { + if (selectedAccountIds.value.length === 0) { + return ElMessage.warning('请至少选择一个账号') + } + + isExporting.value = true + showAccountSelectDialog.value = false + loadingText.value = '正在生成二维码...' + + try { + const selectedVault = fullVault.value.filter(acc => selectedAccountIds.value.includes(acc.id)) + showGaDialog.value = true + gaQrDataUrls.value = [] + gaCurrentIndex.value = 0 + gaQrDataUrls.value = await dataMigrationService.exportAsGaMigration(selectedVault) + } catch (error) { + console.error('GA Export failed:', error) + ElMessage.error(error.message || '生成二维码失败') + } finally { + isExporting.value = false + } + } + + return { + // State + showPasswordDialog, + showWarningDialog, + showAccountSelectDialog, + showGaDialog, + isExporting, + exportForm, + loadingText, + gaQrDataUrls, + gaCurrentIndex, + fullVault, + searchKeyword, + selectedAccountIds, + filteredVault, + + // Methods + openExportDialog, + openWarningDialog, + openGaDialogDirectly, + executeExport, + executeGaExport, + toggleSelectAll + } +} diff --git a/frontend/src/features/migration/composables/useDataImport.js b/frontend/src/features/migration/composables/useDataImport.js new file mode 100644 index 0000000..523545c --- /dev/null +++ b/frontend/src/features/migration/composables/useDataImport.js @@ -0,0 +1,291 @@ +import { ref, computed, watch } from 'vue' +import { ElMessage, ElNotification } from 'element-plus' +import { dataMigrationService } from '@/features/migration/service/dataMigrationService' +import { useVaultStore } from '@/features/vault/store/vaultStore' + +export function useDataImport(emitFn) { + const vaultStore = useVaultStore() + + // --- State --- + const currentFileContent = ref('') + const currentFile = ref(null) + const currentImportType = ref('') + const showDecryptDialog = ref(false) + const importPassword = ref('') + const importingJobs = ref(0) + const isImporting = computed(() => importingJobs.value > 0) + const isDecrypting = ref(false) + const isDialogHandled = ref(false) + + // Batch properties + const batchTotalJobs = ref(0) + const batchProcessedJobs = ref(0) + const batchAccumulatedVault = ref([]) + const batchErrors = ref([]) + const batchCurrentTaskName = ref('') + const showBatchProgress = ref(false) + const batchProgressPercent = computed(() => { + if (batchTotalJobs.value === 0) return 0 + return Math.floor((batchProcessedJobs.value / batchTotalJobs.value) * 100) + }) + + let finalizeTimer = null + + // --- Watchers --- + watch(importingJobs, (newVal) => { + if (newVal === 0 && batchTotalJobs.value > 0 && !showDecryptDialog.value) { + if (finalizeTimer) clearTimeout(finalizeTimer) + finalizeTimer = setTimeout(() => { + finishBatchImport() + }, 300) + } + }) + + // --- Core Logic --- + const initBatchTask = (taskCount) => { + if (batchTotalJobs.value === 0) { + batchAccumulatedVault.value = [] + batchErrors.value = [] + showBatchProgress.value = true + } + importingJobs.value += taskCount + batchTotalJobs.value += taskCount + } + + const resetBatchState = () => { + batchTotalJobs.value = 0 + batchProcessedJobs.value = 0 + importingJobs.value = 0 + batchAccumulatedVault.value = [] + batchErrors.value = [] + batchCurrentTaskName.value = '' + } + + const handleFileUpload = async (uploadFile) => { + const file = uploadFile.raw + if (!file) return + + if (file.size > 10 * 1024 * 1024) { + ElMessage.error(`文件 ${file.name} 太大,不能超过 10MB`) + return + } + + initBatchTask(1) + batchCurrentTaskName.value = `准备解析:${file.name}` + + if (file.type.startsWith('image/')) { + await handleImageFile(file) + } else { + handleNonImageFile(file) + } + } + + const handleImageFile = async (file) => { + try { + batchCurrentTaskName.value = `截取图中二维码:${file.name}` + const vault = await dataMigrationService.parseGaQrImageFile(file) + batchAccumulatedVault.value.push(...vault) + } catch (err) { + console.error(err) + batchErrors.value.push(`[${file.name}] 解析图片失败: ${err.message}`) + } finally { + batchProcessedJobs.value++ + importingJobs.value-- + } + } + + const handleNonImageFile = (file) => { + try { + currentFile.value = file + const reader = new FileReader() + + // 无论文件名为何,都先读取成二进制,再由 detectFileType 判断类型 + reader.onload = async (event) => { + const buffer = event.target.result + currentFileContent.value = buffer + + const detectedType = dataMigrationService.detectFileType(buffer, file.name) + currentImportType.value = detectedType + + if (detectedType === 'unknown') { + batchErrors.value.push(`[${file.name}] 无法识别该文件格式。`) + batchProcessedJobs.value++ + importingJobs.value-- + return + } + + // 如果不是 phonefactor,后续解析需要字符串内容 + let contentForParse = buffer + if (detectedType !== 'phonefactor') { + try { + contentForParse = new TextDecoder().decode(buffer) + } catch { + // fallback to array buffer if decoding fails; service handles it + } + } + + if (detectedType === 'encrypted' || detectedType === 'aegis_encrypted') { + importPassword.value = '' + isDialogHandled.value = false + showDecryptDialog.value = true + // keep job active until unblocked by decrypt action + currentFileContent.value = contentForParse + return + } + + batchCurrentTaskName.value = `构建数据:${file.name}` + try { + const vault = await dataMigrationService.parseImportData(contentForParse, detectedType) + batchAccumulatedVault.value.push(...vault) + } catch (err) { + console.error(`[${file.name}] parseImportData failed:`, err) + const detail = err && err.message ? err.message : String(err) + batchErrors.value.push(`[${file.name}] 解析失败: ${detail}`) + } finally { + batchProcessedJobs.value++ + importingJobs.value-- + } + } + + reader.onerror = () => { + batchErrors.value.push(`[${file.name}] 读取失败`) + batchProcessedJobs.value++ + importingJobs.value-- + } + + reader.readAsArrayBuffer(file) + + } catch (error) { + console.error(error) + batchErrors.value.push(`[${file.name}] 读取异常`) + batchProcessedJobs.value++ + importingJobs.value-- + } + } + + const submitEncryptedData = async () => { + if (!importPassword.value) { + return ElMessage.warning('请输入解密密码') + } + + isDecrypting.value = true + try { + batchCurrentTaskName.value = '正在使用密码解密数据...' + const vault = await dataMigrationService.parseImportData( + currentFileContent.value, + currentImportType.value, + importPassword.value + ) + isDialogHandled.value = true + showDecryptDialog.value = false + batchAccumulatedVault.value.push(...vault) + batchProcessedJobs.value++ + importingJobs.value-- + } catch (error) { + console.error(error) + ElMessage.error(`解密失败:密码错误或不支持加密标准`) + // do not decrement job, user can try again + } finally { + isDecrypting.value = false + } + } + + const handleDecryptDialogClose = () => { + if (!isDialogHandled.value) { + batchErrors.value.push(`[${currentFile.value?.name || '加密文件'}] 用户取消密码输入`) + batchProcessedJobs.value++ + importingJobs.value-- + isDialogHandled.value = true + } + } + + const finishBatchImport = async () => { + if (batchAccumulatedVault.value.length === 0) { + showBatchProgress.value = false + if (batchErrors.value.length > 0) { + ElNotification({ + title: '导入异常', + message: batchErrors.value.join('
'), + type: 'error', + dangerouslyUseHTMLString: true, + duration: 0 + }) + } else { + ElMessage.warning('没有可导入的有效账户数据') + } + resetBatchState() + return + } + + // 先在前端做简单的去重处理(大小写/空格不敏感),避免重复发送相同条目 + const normalize = (s, a) => `${(s||'').toString().trim().toLowerCase()}:${(a||'').toString().trim().toLowerCase()}`; + const seen = new Set(); + const filteredVault = []; + for (const acc of batchAccumulatedVault.value) { + const sig = normalize(acc.service, acc.account); + if (!seen.has(sig)) { + seen.add(sig); + filteredVault.push(acc); + } + } + batchAccumulatedVault.value = filteredVault; + batchCurrentTaskName.value = `合并保存中... (${batchAccumulatedVault.value.length} 个账号)` + + try { + const data = await dataMigrationService.saveImportedVault(batchAccumulatedVault.value) + showBatchProgress.value = false + + if (data.success) { + let msgHtml = `
共处理 ${batchTotalJobs.value} 个文件。
` + if (data.count > 0) { + msgHtml += `
🎉 成功导入 ${data.count} 个新账户!
` + } else { + msgHtml += `
⚠️ 导入账户皆已存在,无需添加。
` + } + + if (data.duplicates > 0) msgHtml += `
ℹ️ 自动跳过了 ${data.duplicates} 个已拥有的账户。
` + + if (batchErrors.value.length > 0) { + msgHtml += `
❌ 错误摘要:
${batchErrors.value.join('
')}
` + } + + ElNotification({ + title: '批量导入结束', + message: msgHtml, + dangerouslyUseHTMLString: true, + type: batchErrors.value.length > 0 ? 'warning' : 'success', + duration: batchErrors.value.length > 0 ? 0 : 8000 + }) + + if (data.count > 0) { + vaultStore.markDirty() + emitFn('success') + } + } else { + ElMessage.error(`后端合并保存失败,请检查网络`) + } + } catch (err) { + showBatchProgress.value = false + ElMessage.error(`最终保存异常:${err.message}`) + } finally { + resetBatchState() + } + } + + return { + // State + currentImportType, + showDecryptDialog, + importPassword, + isDecrypting, + showBatchProgress, + batchCurrentTaskName, + batchProcessedJobs, + batchTotalJobs, + batchProgressPercent, + // Handlers + handleFileUpload, + submitEncryptedData, + handleDecryptDialogClose + } +} diff --git a/frontend/src/features/migration/service/dataMigrationService.js b/frontend/src/features/migration/service/dataMigrationService.js new file mode 100644 index 0000000..97e481c --- /dev/null +++ b/frontend/src/features/migration/service/dataMigrationService.js @@ -0,0 +1,722 @@ +import { vaultService } from '@/features/vault/service/vaultService' +import { encryptDataWithPassword, decryptDataWithPassword } from '@/shared/utils/crypto' +import { parseOtpUri } from '@/shared/utils/totp' +import { tryParseJSON, base64ToBytes } from '@/shared/utils/encoding' +import { gaMigrationStrategy } from '@/shared/utils/serializers/gauthStrategy' +import { csvStrategy } from '@/shared/utils/serializers/csvStrategy' +import { aegisStrategy } from '@/shared/utils/serializers/aegisStrategy' +import { migrationError } from '@/shared/utils/errors/migrationError' +import jsQR from 'jsqr' +import initSqlJs from 'sql.js' + +/** + * 数据迁移服务核心控制器 + * 负责智能分发不同来源与格式的导入导出请求 + */ +export const dataMigrationService = { + /** + * 智能识别导入内容或文件的类型 + * @param {string|ArrayBuffer|Uint8Array} content - 文件文本内容或二进制数据 + * @param {string} filename - 文件名 + * @returns {'bwauth_csv'|'generic_csv'|'text'|'bwauth_json'|'encrypted'|'json'|'2fas'|'aegis'|'aegis_encrypted'|'phonefactor'|'unknown'} 返回类型标识 + */ + detectFileType(content, filename) { + // 如果是二进制数据,尝试用更宽容的方式判断 PhoneFactor + if (content instanceof ArrayBuffer || content instanceof Uint8Array) { + const bytes = content instanceof Uint8Array ? content : new Uint8Array(content) + // 1) 检查 SQLite 文件头 + const header = 'SQLite format 3' + let headerMatch = true + for (let i = 0; i < header.length && i < bytes.length; i++) { + if (bytes[i] !== header.charCodeAt(i)) { headerMatch = false; break } + } + if (headerMatch) return 'phonefactor' + + // 2) 快速 ASCII 搜索表/列名(容错,某些导出会保留表名字符串在文件内部) + try { + const hay = new TextDecoder('utf-8', { fatal: false }).decode(bytes) + if (hay.includes('accounts') && (hay.includes('oath_secret_key') || hay.includes('encrypted_oath_secret_key'))) return 'phonefactor' + } catch (e) { /* ignore decode errors */ } + } + + // 宽容的文件名匹配(包含 phonefactor 字样) + if (filename && filename.toLowerCase().includes('phonefactor')) { + // 如果文件名包含 phonefactor,则谨慎标记为 phonefactor(上层读取时还会再校验头/表) + return 'phonefactor' + } + + if (filename && filename.toLowerCase().endsWith('.csv')) { + const firstLine = content.split('\n')[0].toLowerCase() + if (firstLine.includes('login_totp')) return 'bwauth_csv' + return 'generic_csv' + } + + if (typeof content === 'string' && content.trim().startsWith('otpauth://')) { + return 'text' + } + + if (typeof content === 'string') { + const json = tryParseJSON(content) + if (json) { + if (Array.isArray(json.items) && json.items.length > 0 && json.items[0].login && json.items[0].login.totp) return 'bwauth_json' + if (json.encrypted === true && json.app === '2fauth') return 'encrypted' + if (json.app === '2fauth' || Array.isArray(json.accounts) || Array.isArray(json.vault) || Array.isArray(json.secrets)) return 'json' + if (json.schemaVersion && Array.isArray(json.services)) return '2fas' + if (json.version === 1 && json.db && typeof json.db === 'object' && Array.isArray(json.db.entries)) return 'aegis' // Aegis unencrypted + if (json.version === 1 && json.header && json.db && typeof json.db === 'string') return 'aegis_encrypted' + } + } + + if (filename) { + const ext = filename.toLowerCase() + if (ext.endsWith('.2fas')) return '2fas' + if (ext.endsWith('.txt')) return 'text' + } + + return 'unknown' + }, + + /** + * 1. 获取所有数据 (用于导出) + * @returns {Promise} + */ + async fetchAllVault() { + const res = await vaultService.getVault({ limit: 9999 }) + if (!res.success) throw new migrationError('无法获取账号数据', 'VAULT_FETCH_FAILED') + return res.vault || [] + }, + + /** + * 2. 处理导出逻辑 (前端加密/格式化) + * @param {Object[]} vault + * @param {string} type + * @param {string} password + * @param {string} [variant='generic'] + * @returns {Promise} 导出的文件字符串内容 + */ + async exportData(vault, type, password, variant = 'generic') { + const timestamp = new Date().toISOString() + const baseData = { version: "2.0", app: "2fauth", timestamp } + + if (type === 'encrypted') { + if (!password) throw new migrationError('加密导出需要密码', 'MISSING_PASSWORD') + const payload = { ...baseData, accounts: vault } + const encryptedData = await encryptDataWithPassword(payload, password) + return JSON.stringify({ + ...baseData, + encrypted: true, + data: encryptedData, + note: "This file is encrypted with your export password (AES-GCM-256 + PBKDF2)." + }, null, 2) + } + + if (type === 'generic_json') { + const secrets = vault.map(acc => ({ + issuer: acc.service || 'Unknown', + account: acc.account || '', + secret: acc.secret, + type: 'TOTP', + digits: acc.digits || 6, + period: acc.period || 30, + algorithm: (acc.algorithm || 'SHA1').toUpperCase().replace('SHA-', 'SHA') + })) + return JSON.stringify({ + version: "1.0", + exportDate: new Date().toISOString(), + count: secrets.length, + secrets + }, null, 2) + } + + if (type === 'json') { + return JSON.stringify({ ...baseData, encrypted: false, accounts: vault }, null, 2) + } + + if (type === '2fas') { + const services = vault.map((acc, index) => { + const algo = (acc.algorithm || 'SHA1') + .replace('SHA-1', 'SHA1') + .replace('SHA-256', 'SHA256') + .replace('SHA-512', 'SHA512') + return { + name: acc.service, + secret: acc.secret, + otp: { + source: 'manual', + account: acc.account || '', + digits: acc.digits || 6, + period: acc.period || 30, + algorithm: algo, + tokenType: 'TOTP', + counter: 0, + }, + order: { position: index }, + badge: { color: 'Default' }, + updatedAt: Date.now(), + icon: { + selected: 'Label', + label: { + text: (acc.service || '?').slice(0, 2).toUpperCase(), + backgroundColor: 'Default', + }, + iconCollection: { id: 'A5B3FB65-4EC5-43E6-8EC1-49E24CA9E7AD' }, + }, + } + }) + return JSON.stringify({ + schemaVersion: 4, + appVersionCode: 50316, + appVersionName: '5.3.16', + appOrigin: 'ios', + groups: [], + services + }) + } + + if (type === 'aegis') { + const entries = vault.map(acc => ({ + type: 'totp', + uuid: crypto.randomUUID(), + name: acc.account || acc.service, + issuer: acc.service, + info: { + secret: acc.secret, + algo: (acc.algorithm || 'SHA1').replace('SHA-', 'SHA'), + digits: acc.digits || 6, + period: acc.period || 30 + } + })) + return JSON.stringify({ + version: 1, + header: { slots: null, params: null }, + db: { version: 3, entries } + }, null, 2) + } + + if (type === 'text') { + return vault.map(acc => { + const label = encodeURIComponent(`${acc.service}:${acc.account}`) + const issuer = encodeURIComponent(acc.service) + return `otpauth://totp/${label}?secret=${acc.secret}&issuer=${issuer}&digits=${acc.digits}&period=${acc.period}` + }).join('\n') + } + + if (type === 'csv') { + if (variant === 'bitwarden') { + let csv = 'name,secret,totp,favorite,folder\n' + vault.forEach(acc => { + const name = `"${acc.service}${acc.account ? ':' + acc.account : ''}"` + const label = encodeURIComponent(`${acc.service}:${acc.account}`) + const issuer = encodeURIComponent(acc.service) + const totp = `"otpauth://totp/${label}?secret=${acc.secret}&issuer=${issuer}&digits=${acc.digits}&period=${acc.period}"` + csv += `${name},${acc.secret},${totp},0,\n` + }) + return csv + } else { + // generic csv + let csv = 'name,issuer,secret,algorithm,digits,period,type\n' + vault.forEach(acc => { + const name = `"${acc.account}"` + const issuer = `"${acc.service}"` + csv += `${name},${issuer},${acc.secret},${acc.algorithm},${acc.digits},${acc.period},TOTP\n` + }) + return csv + } + } + + if (type === 'bwauth') { + const items = vault.map(acc => { + const label = encodeURIComponent(acc.account ? `${acc.service}:${acc.account}` : acc.service) + const issuer = encodeURIComponent(acc.service) + const algo = (acc.algorithm || 'SHA1').replace('SHA-1', 'SHA1').replace('SHA-256', 'SHA256').replace('SHA-512', 'SHA512') + const totp = `otpauth://totp/${label}?secret=${acc.secret}&issuer=${issuer}&algorithm=${algo}&digits=${acc.digits || 6}&period=${acc.period || 30}` + return { + favorite: false, + id: crypto.randomUUID().toUpperCase(), + login: { totp, username: acc.account || '' }, + name: acc.service, + type: 1 + } + }) + return JSON.stringify({ encrypted: false, items }) + } + + throw new migrationError('未知的导出类型: ' + type, 'UNKNOWN_EXPORT_TYPE') + }, + + /** + * 导出为 Google Authenticator 迁移协议二维码 (分批生成图片 URI) + * @param {Object[]} vault + * @returns {Promise} QR Code Data URLs + */ + async exportAsGaMigration(vault) { + if (!vault || vault.length === 0) throw new migrationError('没有账户可以迁移', 'EMPTY_VAULT') + + const BATCH_SIZE = 10; + const batches = []; + for (let i = 0; i < vault.length; i += BATCH_SIZE) { + batches.push(vault.slice(i, i + BATCH_SIZE)); + } + + const batchId = Math.floor(Math.random() * 0x7fffffff); + const QRCode = await import('qrcode') + const qrDataUrls = []; + + function writeVarint(val, arr) { + while (val >= 0x80) { + arr.push((val & 0x7f) | 0x80) + val >>>= 7 + } + arr.push(val) + } + + function writeString(str, arr) { + const bytes = new TextEncoder().encode(str) + writeVarint(bytes.length, arr) + for (let i = 0; i < bytes.length; i++) arr.push(bytes[i]) + } + + function writeBytes(bytes, arr) { + writeVarint(bytes.length, arr) + for (let i = 0; i < bytes.length; i++) arr.push(bytes[i]) + } + + for (let bIndex = 0; bIndex < batches.length; bIndex++) { + const currentBatch = batches[bIndex]; + const payloadBytes = []; + + payloadBytes.push(16) // version = 1 + writeVarint(1, payloadBytes) + payloadBytes.push(24) // batch_size + writeVarint(batches.length, payloadBytes) + payloadBytes.push(32) // batch_index + writeVarint(bIndex, payloadBytes) + payloadBytes.push(40) // batch_id + writeVarint(batchId, payloadBytes) + + for (const acc of currentBatch) { + const otpBytes = [] + const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' + const secretStr = acc.secret.toUpperCase().replace(/=+$/, '').replace(/[^A-Z2-7]/g, '') + const sBytes = [] + let bits = 0, value = 0 + for (let i = 0; i < secretStr.length; i++) { + const val = ALPHABET.indexOf(secretStr[i]) + if (val === -1) continue + value = (value << 5) | val + bits += 5 + if (bits >= 8) { + sBytes.push((value >>> (bits - 8)) & 0xFF) + bits -= 8 + } + } + if (sBytes.length > 0) { + otpBytes.push(10) + writeBytes(sBytes, otpBytes) + } + + const name = acc.account || acc.service + if (name) { + otpBytes.push(18) + writeString(name, otpBytes) + } + + if (acc.service) { + otpBytes.push(26) + writeString(acc.service, otpBytes) + } + + let algoVal = 1 // SHA1 + if (acc.algorithm === 'SHA256') algoVal = 2 + else if (acc.algorithm === 'SHA512') algoVal = 3 + otpBytes.push(32) + writeVarint(algoVal, otpBytes) + + let digVal = 1 // SIX + if (acc.digits === 8) digVal = 2 + otpBytes.push(40) + writeVarint(digVal, otpBytes) + + otpBytes.push(48) + writeVarint(2, otpBytes) // TOTP = 2 + + payloadBytes.push(10) + writeVarint(otpBytes.length, payloadBytes) + for (let i = 0; i < otpBytes.length; i++) payloadBytes.push(otpBytes[i]) + } + + let binary = '' + for (let i = 0; i < payloadBytes.length; i++) binary += String.fromCharCode(payloadBytes[i]) + const uri = `otpauth-migration://offline?data=${encodeURIComponent(btoa(binary))}` + const dataUrl = await QRCode.toDataURL(uri, { errorCorrectionLevel: 'M', width: 480, margin: 2 }) + qrDataUrls.push(dataUrl); + } + + return qrDataUrls; + }, + + async exportAsHtml(vault) { + const QRCode = await import('qrcode') + const htmlContent = [] + + htmlContent.push(` + + + + + 2FAuth 备份报告 + + + +
+

2FAuth 二步验证账户备份

+

生成时间:${new Date().toLocaleString()}

+

⚠️ 警告:此页面包含敏感信息,请妥善保管。请使用浏览器打印功能将其保存为 PDF 或打印成纸质备份。

+ +
+
+ `) + + for (const acc of vault) { + const label = encodeURIComponent(`${acc.account}`) + const issuer = encodeURIComponent(acc.service) + const uri = `otpauth://totp/${label}?secret=${acc.secret}&issuer=${issuer}&digits=${acc.digits}&period=${acc.period}` + + try { + const qrDataUrl = await QRCode.toDataURL(uri, { errorCorrectionLevel: 'M', margin: 2 }) + htmlContent.push(` +
+
${acc.service}
+ + QR Code +
${acc.secret.replace(/(.{4})/g, '$1 ').trim()}
+
${acc.algorithm} / ${acc.digits} / ${acc.period}s
+
+ `) + } catch (e) { } + } + + htmlContent.push(` +
+ + + + `) + return htmlContent.join('\n') + }, + + /** + * 3.0 解析PhoneFactor SQLite数据库 + * @param {ArrayBuffer} dbBuffer - SQLite数据库二进制数据 + * @returns {Promise} 标准化的账户列表 + * @throws {migrationError} + */ + async parsePhoneFactor(dbBuffer) { + try { + // 初始化 sql.js:浏览器端优先从 /sql-wasm.wasm 或 CDN 加载 wasm,Node 环境从 node_modules 加载 + let SQL + try { + if (typeof window !== 'undefined') { + try { + SQL = await initSqlJs({ locateFile: file => `/sql-wasm.wasm` }) + } catch (e) { + // 如果本地 public 中不存在 wasm,回退到 CDN + SQL = await initSqlJs({ locateFile: file => `https://unpkg.com/sql.js@1.10.3/dist/${file}` }) + } + } else { + SQL = await initSqlJs({ locateFile: file => require('path').resolve('node_modules/sql.js/dist/', file) }) + } + } catch (e) { + // 最后兜底,直接初始化(可能仍然抛错) + SQL = await initSqlJs() + } + const db = new SQL.Database(new Uint8Array(dbBuffer)) + + // 检查accounts表是否存在 + const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table' AND name='accounts'") + if (tables.length === 0) { + throw new migrationError('不是有效的Microsoft Authenticator数据文件', 'INVALID_PHONEFACTOR_FILE') + } + + // 使用 prepared statement 逐行读取,避免依赖 exec 返回的 columns/values 结构不一致 + const vault = [] + let skippedEncrypted = 0 + let skippedEmpty = 0 + const base32Re = /^[A-Z2-7]+=*$/i + + try { + const stmt = db.prepare("SELECT name, username, oath_secret_key, encrypted_oath_secret_key FROM accounts WHERE account_type=0") + while (stmt.step()) { + const record = stmt.getAsObject() + const name = record.name + const username = record.username + const oath_secret_key = record.oath_secret_key + const encrypted_oath_secret_key = record.encrypted_oath_secret_key + + // 跳过条件:name 和 username 同时为空 + if ((!name || String(name).trim() === '') && (!username || String(username).trim() === '')) { + skippedEmpty++ + continue + } + + const secret = (oath_secret_key || '').toString().trim() + if (!secret) { + if (encrypted_oath_secret_key && String(encrypted_oath_secret_key).trim() !== '') { + skippedEncrypted++ + continue + } + skippedEmpty++ + continue + } + + const normalized = secret.replace(/\s+/g, '').replace(/=+$/, '') + if (!base32Re.test(normalized)) { + if (encrypted_oath_secret_key && String(encrypted_oath_secret_key).trim() !== '') { + skippedEncrypted++ + continue + } + skippedEmpty++ + continue + } + + vault.push({ + service: name || 'Unknown Service', + account: username || 'Unknown Account', + secret: secret, + algorithm: 'SHA1', + digits: 6, + period: 30 + }) + } + stmt.free() + } catch (e) { + db.close() + throw new migrationError('解析 PhoneFactor 数据库失败', 'INVALID_PHONEFACTOR_FILE', e) + } + + db.close() + if (vault.length === 0) { + if (skippedEncrypted > 0) throw new migrationError('PhoneFactor 文件仅包含加密的密钥,无法在前端导入', 'PHONEFACTOR_ONLY_ENCRYPTED') + throw new migrationError('未能从 PhoneFactor 文件中提取到可导入的 TOTP 记录', 'PHONEFACTOR_NO_IMPORTABLE_ROWS') + } + return vault + + } catch (error) { + if (error instanceof migrationError) { + console.error('parsePhoneFactor migrationError:', error) + throw error + } + // 打印详细调试信息到控制台,包含底层错误与缓冲长度 + try { + const bufLen = (dbBuffer && (dbBuffer.byteLength || dbBuffer.length)) || 0 + console.error('parsePhoneFactor failed:', { message: error && error.message, stack: error && error.stack, bufferLength: bufLen, error }) + } catch (logErr) { + console.error('parsePhoneFactor failed (logging error):', logErr) + } + const msg = error && error.message ? `${error.message}` : String(error) + throw new migrationError(`不是有效的Microsoft Authenticator数据文件: ${msg}`, 'INVALID_PHONEFACTOR_FILE', error) + } + }, + + /** + * 3. 导入逻辑:前端解密/分发解析序列化策略 + * @param {string|ArrayBuffer} content - 文件内容或二进制数据 + * @param {string} type - 探测出的类型 + * @param {string} [password] - 加密文件的密码 + * @returns {Promise} 返回标准化后的金库清单 + * @throws {migrationError} + */ + async parseImportData(content, type, password) { + let rawVault = [] + + // 处理PhoneFactor SQLite数据库 + if (type === 'phonefactor') { + return await this.parsePhoneFactor(content) + } + + if (type === 'bwauth_csv' || type === 'generic_csv') { + rawVault = csvStrategy.parseCsv(content) + content = JSON.stringify(rawVault) + type = 'raw' + } + + if (type === 'aegis_encrypted') { + const parsedAegis = tryParseJSON(content) + const decryptedDb = await aegisStrategy.decryptDatabase(parsedAegis, password) + content = JSON.stringify(decryptedDb) + type = 'aegis' + password = undefined + } else if (type === 'aegis') { + const parsedAegis = tryParseJSON(content) + content = JSON.stringify(parsedAegis.db) + } + + if (type === 'encrypted') { + if (!password) throw new migrationError('导入加密文件需要密码', 'MISSING_PASSWORD') + try { + let ciphertext = content + const json = typeof content === 'string' ? tryParseJSON(content) : content + if (json && typeof json === 'object' && json.data) ciphertext = json.data + const decrypted = await decryptDataWithPassword(ciphertext, password) + rawVault = decrypted.vault || decrypted.accounts || [] + } catch (e) { + throw new migrationError('解密失败:密码错误或文件格式不兼容', 'DECRYPTION_FAILED', e) + } + } + else if (type === 'json') { + const json = typeof content === 'string' ? JSON.parse(content) : content + if (Array.isArray(json.accounts)) rawVault = json.accounts + else if (Array.isArray(json.vault)) rawVault = json.vault + else if (Array.isArray(json.data)) rawVault = json.data + else if (json.secrets) { + rawVault = json.secrets.map(s => { + let account = s.account || s.label || ''; + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + return { + service: s.issuer || s.service || s.name || 'Unknown', + account, + secret: s.secret || '', + algorithm: s.algorithm || 'SHA1', + digits: s.digits || 6, + period: s.period || 30, + } + }) + } else if (Array.isArray(json)) rawVault = json + } + else if (type === '2fas') { + const json = typeof content === 'string' ? JSON.parse(content) : content + if (Array.isArray(json.services)) { + rawVault = json.services.map(s => { + let account = s.otp?.account || s.account || s.username || ''; + if (typeof account === 'string' && account.includes(':')) { + account = account.split(':').pop()?.trim() || account; + } + return { + service: s.otp?.issuer || s.name || 'Unknown', + account, + secret: s.secret || '', + algorithm: (s.otp?.algorithm || s.algorithm || 'SHA1').toUpperCase(), + digits: s.otp?.digits || s.digits || 6, + period: s.otp?.period || s.period || 30, + } + }) + } + } + else if (type === 'bwauth_json') { + const json = typeof content === 'string' ? JSON.parse(content) : content + if (Array.isArray(json.items)) { + json.items.forEach(item => { + if (item.login && item.login.totp) { + const accInfo = parseOtpUri(item.login.totp) + if (accInfo) { + accInfo.service = item.name || accInfo.service + accInfo.account = item.login.username || accInfo.account + rawVault.push(accInfo) + } + } + }) + } + } + else if (type === 'aegis') { + const json = typeof content === 'string' ? JSON.parse(content) : content + const entries = json.entries || (json.db && json.db.entries) || [] + rawVault = entries.map(s => ({ + service: s.issuer || s.name || 'Unknown', + account: s.name || '', + secret: s.info?.secret || '', + algorithm: s.info?.algo || 'SHA1', + digits: s.info?.digits || 6, + period: s.info?.period || 30, + })) + } + else if (type === 'text') { + const lines = content.split('\n') + lines.forEach(line => { + const acc = parseOtpUri(line.trim()) + if (acc) rawVault.push(acc) + }) + } + else if (type === 'bwauth_csv' || type === 'generic_csv') rawVault = csvStrategy.parseCsv(content) + + return rawVault.map(acc => { + if (typeof acc.account === 'string' && acc.account.includes(':')) { + acc.account = acc.account.split(':').pop()?.trim() || acc.account + } + if (!acc.account || acc.account.trim() === '') acc.account = acc.service || 'Unknown Account' + return acc + }).filter(acc => acc && acc.secret && acc.service) + }, + + /** + * 3.1 解析 GA 二维码图片 + * @param {File} file + * @returns {Promise} + */ + async parseGaQrImageFile(file) { + return new Promise((resolve, reject) => { + const img = new Image() + const url = URL.createObjectURL(file) + img.onload = () => { + URL.revokeObjectURL(url) + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d', { willReadFrequently: true }) + const scales = [1.0, 1.5, 0.5, 2.0, 0.8] + let code = null + for (const scale of scales) { + canvas.width = img.width * scale + canvas.height = img.height * scale + context.imageSmoothingEnabled = false + context.drawImage(img, 0, 0, canvas.width, canvas.height) + const imageData = context.getImageData(0, 0, canvas.width, canvas.height) + code = jsQR(imageData.data, imageData.width, imageData.height, { inversionAttempts: "attemptBoth" }) + if (code) break; + } + + if (!code) return reject(new migrationError('未能识别出二维码,请确认为完整清晰的截图。', 'QR_RECOGNITION_FAILED')) + const uri = code.data + if (!uri.startsWith('otpauth-migration://offline?data=')) return reject(new migrationError('不是有效的 Google Authenticator 迁移二维码', 'INVALID_GA_QR')) + + try { + const urlParams = new URL(uri).searchParams + const dataBase64Url = urlParams.get('data') + let base64 = dataBase64Url.replace(/-/g, '+').replace(/_/g, '/') + while (base64.length % 4) base64 += '=' + const raw = atob(base64) + const dataBytes = new Uint8Array(raw.length) + for (let i = 0; i < raw.length; i++) dataBytes[i] = raw.charCodeAt(i) + resolve(gaMigrationStrategy.decodePayload(dataBytes)) + } catch (e) { reject(new migrationError('解析 Google Authenticator 数据失败', 'GA_DECODE_FAILED', e)) } + } + img.onerror = () => { + URL.revokeObjectURL(url) + reject(new migrationError('图片读取失败,文件可能已损坏', 'IMAGE_LOAD_FAILED')) + } + img.src = url + }) + }, + + /** + * 4. 批量保存到后端 + * @param {Object[]} vault + */ + async saveImportedVault(vault) { + return await vaultService.importVault(vault) + } +} diff --git a/frontend/src/features/migration/views/dataExport.vue b/frontend/src/features/migration/views/dataExport.vue new file mode 100644 index 0000000..e4c0724 --- /dev/null +++ b/frontend/src/features/migration/views/dataExport.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/frontend/src/features/migration/views/dataImport.vue b/frontend/src/features/migration/views/dataImport.vue new file mode 100644 index 0000000..9b4735d --- /dev/null +++ b/frontend/src/features/migration/views/dataImport.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/frontend/src/features/migration/views/dataMigration.vue b/frontend/src/features/migration/views/dataMigration.vue new file mode 100644 index 0000000..366cea5 --- /dev/null +++ b/frontend/src/features/migration/views/dataMigration.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/frontend/src/features/tools/components/timeSync.vue b/frontend/src/features/tools/components/timeSync.vue index 8656447..6bb93c4 100644 --- a/frontend/src/features/tools/components/timeSync.vue +++ b/frontend/src/features/tools/components/timeSync.vue @@ -38,54 +38,33 @@ \ No newline at end of file diff --git a/frontend/src/features/tools/components/totpSecret.vue b/frontend/src/features/tools/components/totpSecret.vue index e4a8bd4..c175eb2 100644 --- a/frontend/src/features/tools/components/totpSecret.vue +++ b/frontend/src/features/tools/components/totpSecret.vue @@ -154,203 +154,39 @@ \ No newline at end of file diff --git a/frontend/src/features/tools/composables/useTimeSync.js b/frontend/src/features/tools/composables/useTimeSync.js new file mode 100644 index 0000000..2c0b86a --- /dev/null +++ b/frontend/src/features/tools/composables/useTimeSync.js @@ -0,0 +1,65 @@ +import { ref, computed, onMounted, onUnmounted } from 'vue' +import { toolService } from '@/features/tools/service/toolService' + +/** + * 时间校准逻辑提取 + * + * @returns {Object} 包含校准状态与方法的响应式对象 + */ +export function useTimeSync() { + const localTime = ref(Date.now()) + const offset = ref(null) + const rtt = ref(null) + const isSyncing = ref(false) + let clockTimer = null + + const serverTime = computed(() => localTime.value + (offset.value || 0)) + + const syncStatus = computed(() => { + if (offset.value === null) return null + const abs = Math.abs(offset.value) + if (abs < 2000) return { title: '时间同步正常', type: 'success', desc: '本地时间与服务器误差极小,不影响 2FA 验证。' } + if (abs < 30000) return { title: '存在微小偏差', type: 'warning', desc: '建议校准本地时间,但通常仍可使用。' } + return { title: '时间偏差过大', type: 'error', desc: '严重偏差!2FA 验证码将失效,请务必校准设备时间。' } + }) + + const syncTime = async () => { + isSyncing.value = true + const start = Date.now() + try { + const res = await toolService.getServerTime() + const end = Date.now() + if (res.success) { + const serverTs = res.time + rtt.value = end - start + // 假设往返时间是对称的,服务器返回时间为收到请求时的 serverTs + 单程网络延迟 + const estimatedServerTime = serverTs + (rtt.value / 2) + offset.value = Math.round(estimatedServerTime - end) + return { success: true, offset: offset.value } + } + return { success: false, error: new Error('返回结构异常') } + } catch (error) { + return { success: false, error } + } finally { + isSyncing.value = false + } + } + + onMounted(() => { + clockTimer = setInterval(() => { localTime.value = Date.now() }, 1000) + }) + + onUnmounted(() => { + if (clockTimer) clearInterval(clockTimer) + }) + + return { + localTime, + serverTime, + offset, + rtt, + isSyncing, + syncStatus, + syncTime + } +} diff --git a/frontend/src/features/tools/composables/useTotpToolbox.js b/frontend/src/features/tools/composables/useTotpToolbox.js new file mode 100644 index 0000000..3dfe484 --- /dev/null +++ b/frontend/src/features/tools/composables/useTotpToolbox.js @@ -0,0 +1,159 @@ +import { ref, onMounted, onUnmounted } from 'vue' +import { base32ToBytes, bytesToBase32, hexToBytes, bytesToHex, asciiToBytes, bytesToAscii, generateTOTP, parseOtpUri } from '@/shared/utils/totp' + +/** + * 提取 TOTP 工具箱的状态机与计算逻辑 + * + * 架构说明 (Architecture Notes): + * 1. 状态内聚: 将 Base32, Hex, ASCII 相互转换的逻辑和时间便宜量计算封入本 Hook。 + * 2. 分离视图: 使得 Vue 组件单纯负责数据绑定,不再关心 bytes 到 string 的转换细节和 setInterval 时序。 + * + * @returns 包含状态与操作方法的响应式对象 + */ +export function useTotpToolbox() { + const activeTab = ref('base32') + const secretBase32 = ref('') + const secretHex = ref('') + const secretAscii = ref('') + + // Metadata & Settings + const issuer = ref('2FAuth-Tool') + const account = ref('TestUser') + const algorithm = ref('SHA-1') + const digits = ref(6) + const period = ref(30) + const timeOffset = ref(0) + + const currentUri = ref('') + const currentCode = ref('') + const remaining = ref(30) + let timer = null + + // --- 同步输入联动 --- + const updateAll = async (sourceType) => { + try { + // 1. 同步各类输入制式 + if (sourceType === 'base32') { + const bytes = base32ToBytes(secretBase32.value) + secretHex.value = bytesToHex(bytes) + secretAscii.value = bytesToAscii(bytes) + } else if (sourceType === 'hex') { + const bytes = hexToBytes(secretHex.value) + if (bytes.length > 0) secretBase32.value = bytesToBase32(bytes) + secretAscii.value = bytesToAscii(bytes) + } else if (sourceType === 'ascii') { + const bytes = asciiToBytes(secretAscii.value) + secretBase32.value = bytesToBase32(bytes) + secretHex.value = bytesToHex(bytes) + } + + // 2. URI 字符串拼接 + if (secretBase32.value) { + const label = encodeURIComponent(`${issuer.value}:${account.value}`) + const algoParam = algorithm.value.replace('-', '') // SHA-1 -> SHA1 + currentUri.value = `otpauth://totp/${label}?secret=${secretBase32.value}&issuer=${encodeURIComponent(issuer.value)}&algorithm=${algoParam}&period=${period.value}&digits=${digits.value}` + } else { + currentUri.value = '' + currentCode.value = '' + } + + // 3. 立即重算一次 TOTP + calcTotp() + } catch (e) { + console.error(e) + // 打字过程中的解码失败不做打断处理 + } + } + + const handleBase32Input = () => updateAll('base32') + const handleHexInput = () => updateAll('hex') + const handleAsciiInput = () => updateAll('ascii') + const updateUri = () => updateAll('settings') + + // --- 随机生成 --- + const refreshBase32 = () => { + const array = new Uint8Array(20) + window.crypto.getRandomValues(array) + secretBase32.value = bytesToBase32(array) + updateAll('base32') + } + + const refreshHex = () => { + const array = new Uint8Array(20) + window.crypto.getRandomValues(array) + secretHex.value = bytesToHex(array) + updateAll('hex') + } + + const refreshAscii = () => { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()' + let result = '' + const array = new Uint32Array(20) + window.crypto.getRandomValues(array) + for (let i = 0; i < 20; i++) result += chars[array[i] % chars.length] + secretAscii.value = result + updateAll('ascii') + } + + // --- TOTP 主力计算核心 --- + const calcTotp = async () => { + if (!secretBase32.value) return + + const p = period.value + // 加入时空穿梭偏移量 + const now = (Date.now() / 1000) + timeOffset.value + remaining.value = Math.ceil(p - (now % p)) + + try { + const periodOffset = Math.floor(timeOffset.value / p) + currentCode.value = await generateTOTP(secretBase32.value, p, digits.value, algorithm.value, periodOffset) + } catch (e) { + currentCode.value = 'ERROR' + } + } + + // --- 时间调节器 (Time Travel) --- + const adjustTime = (delta, reset = false) => { + if (reset) timeOffset.value = 0 + else timeOffset.value += delta + calcTotp() + } + + // --- 扫码解析注入 --- + const handleParsedUri = (uri) => { + const parsed = parseOtpUri(uri) + if (parsed) { + if (parsed.secret) { + secretBase32.value = parsed.secret + updateAll('base32') + } + if (parsed.service) issuer.value = parsed.service + if (parsed.account) account.value = parsed.account + if (parsed.digits) digits.value = parsed.digits + if (parsed.period) period.value = parsed.period + if (parsed.algorithm) algorithm.value = parsed.algorithm + + updateAll('settings') + return true + } + return false + } + + onMounted(() => { + // 初始装载随机码 + refreshBase32() + timer = setInterval(calcTotp, 1000) + }) + + onUnmounted(() => { if (timer) clearInterval(timer) }) + + return { + activeTab, + secretBase32, secretHex, secretAscii, + issuer, account, algorithm, digits, period, timeOffset, + currentUri, currentCode, remaining, + handleBase32Input, handleHexInput, handleAsciiInput, updateUri, + refreshBase32, refreshHex, refreshAscii, + adjustTime, handleParsedUri + } +} diff --git a/frontend/src/features/tools/composables/useTotpToolboxActions.js b/frontend/src/features/tools/composables/useTotpToolboxActions.js new file mode 100644 index 0000000..3d89a22 --- /dev/null +++ b/frontend/src/features/tools/composables/useTotpToolboxActions.js @@ -0,0 +1,74 @@ +import { ref, watch } from 'vue' +import { ElMessage } from 'element-plus' +import QRCode from 'qrcode' +import { vaultService } from '@/features/vault/service/vaultService' + +/** + * TOTP 工具箱外部协同调度逻辑 + * + * 架构说明: + * 专门处理工具箱产生的与外部 API / 库的桥接:如触发二维码生成库 QRCode,与后端 Vault 保存 API 进行联调。 + * 这保证了 useTotpToolbox.js 作为纯状态机,不涉及第三方 UI 或非标准 API 边界效应。 + */ +export function useTotpToolboxActions(toolboxState, queryClient) { + const isSaving = ref(false) + const showScanner = ref(false) + const qrCodeUrl = ref('') + + // 监听 currentUri 自动重绘二维码 + watch(() => toolboxState.currentUri.value, async (newUri) => { + if (newUri) { + try { + qrCodeUrl.value = await QRCode.toDataURL(newUri, { width: 200, margin: 1 }) + } catch (e) { + qrCodeUrl.value = '' + } + } else { + qrCodeUrl.value = '' + } + }) + + const handleScanSuccess = (uri) => { + showScanner.value = false + const success = toolboxState.handleParsedUri(uri) + if (success) { + ElMessage.success('二维码解析成功') + } else { + ElMessage.warning('无效的 OTP URI') + } + } + + const saveToVault = async () => { + if (!toolboxState.secretBase32.value) return ElMessage.warning('密钥不能为空') + if (!toolboxState.issuer.value || !toolboxState.account.value) return ElMessage.warning('请填写服务商和账号') + + isSaving.value = true + try { + const res = await vaultService.createAccount({ + service: toolboxState.issuer.value, + account: toolboxState.account.value, + secret: toolboxState.secretBase32.value, + digits: toolboxState.digits.value, + period: toolboxState.period.value, + category: '工具箱添加' + }) + if (res.success) { + ElMessage.success('已保存到我的账户') + // 刷新账号列表缓存 + queryClient.invalidateQueries(['vault']) + } + } catch (e) { + // Error managed by axios request interceptor & vaultService wrapping + } finally { + isSaving.value = false + } + } + + return { + isSaving, + showScanner, + qrCodeUrl, + handleScanSuccess, + saveToVault + } +} diff --git a/frontend/src/features/tools/service/toolService.js b/frontend/src/features/tools/service/toolService.js new file mode 100644 index 0000000..8cf2ab5 --- /dev/null +++ b/frontend/src/features/tools/service/toolService.js @@ -0,0 +1,23 @@ +import { request } from '@/shared/utils/request' +import { toolsError } from '@/shared/utils/errors/toolsError' + +/** + * @typedef {Object} ServerTimeResponse + * @property {boolean} success - 请求是否成功 + * @property {number} time - 服务器时间戳 (毫秒) + */ + +export const toolService = { + /** + * 获取服务器当前时间 + * @returns {Promise} + * @throws {toolsError} + */ + async getServerTime() { + try { + return await request('/api/tools/server-time') + } catch (error) { + throw new toolsError(error.message || '获取服务器时间失败', error.status) + } + } +} diff --git a/frontend/src/features/vault/components/addVaultManual.vue b/frontend/src/features/vault/components/addVaultManual.vue index bb0bba9..79e013b 100644 --- a/frontend/src/features/vault/components/addVaultManual.vue +++ b/frontend/src/features/vault/components/addVaultManual.vue @@ -60,9 +60,9 @@ import { ref } from 'vue' import { ElMessage } from 'element-plus' import { Refresh } from '@element-plus/icons-vue' -import { request } from '@/shared/utils/request' import { bytesToBase32 } from '@/shared/utils/totp' import { useVaultStore } from '@/features/vault/store/vaultStore' +import { vaultService } from '@/features/vault/service/vaultService' const emit = defineEmits(['success']) @@ -106,10 +106,7 @@ const submitAddVault = async () => { if (valid) { submitting.value = true try { - const data = await request('/api/vault', { - method: 'POST', - body: JSON.stringify(newVault.value) - }) + const data = await vaultService.createAccount(newVault.value) if (data.success) { ElMessage.success('账号添加成功!') newVault.value = { service: '', account: '', secret: '', category: '', digits: 6, period: 30, algorithm: 'SHA1' } diff --git a/frontend/src/features/vault/components/addVaultScan.vue b/frontend/src/features/vault/components/addVaultScan.vue index c16c7cb..fc74ec0 100644 --- a/frontend/src/features/vault/components/addVaultScan.vue +++ b/frontend/src/features/vault/components/addVaultScan.vue @@ -15,9 +15,9 @@ + diff --git a/frontend/src/features/vault/composables/useTotpTimer.js b/frontend/src/features/vault/composables/useTotpTimer.js new file mode 100644 index 0000000..5bbd0c3 --- /dev/null +++ b/frontend/src/features/vault/composables/useTotpTimer.js @@ -0,0 +1,96 @@ +import { onMounted, onUnmounted, triggerRef } from 'vue' +import { generateTOTP } from '@/shared/utils/totp' + +/** + * 管理所有保险箱账号的 TOTP 验证码与倒计时刷新 + * + * 架构说明 (Architecture Notes): + * 1. 性能优化 (Parallel Computation): 循环列表触发 HMAC-SHA-1 等 Hash 计算是昂贵的 CPU 任务。 + * 因此,遍历 Vault 时摒弃串行 `await`,采取 `Promise.all` 全并发模式,榨干宏任务的吞吐量, + * 以实现成百上千条账号依然不阻塞验证码更新的渲染节奏。 + * 2. 批量渲染 (Reactivity Batches): 受益于 Vue 的依赖收集,将 `vault` 定义为 `shallowRef`, + * 在批量计算结束后调用唯一一次 `triggerRef(vault)`,从而使得深层的 1000 次元素级属性修改合并成了 + * Vue 的一次虚拟 DOM 树 diff 与重绘。 + * 3. 异步分流: 将 5 秒即将变色的逻辑与下次新 Code 的提前量生成机制解耦,确保证预计算。 + * + * @param {import('vue').ShallowRef} vault - 当前账号列表的 shallowRef + * @returns Composable lifecycle bindings (auto-mounted via onMounted/onUnmounted) + */ +export function useTotpTimer(vault) { + let globalTimer = null + + /** + * 并发计算所有账号的 TOTP 验证码与剩余时间 + * @param {Object[]} [targetList] - 可选,传入用于首次渲染前的预计算 + */ + const updateVaultStatus = async (targetList) => { + const list = Array.isArray(targetList) ? targetList : vault.value + if (!list || list.length === 0) return + + const now = Date.now() / 1000 + + // 使用 Promise.all 并行处理所有账号的计算,避免串行 await 导致验证码生成延迟 + await Promise.all(list.map(async (acc) => { + const period = acc.period || 30 + const remaining = Math.ceil(period - (now % period)) + acc.remaining = remaining + acc.percentage = (remaining / period) * 100 + + // 颜色逻辑 + if (remaining > 10) acc.color = '#67C23A' + else if (remaining > 5) acc.color = '#E6A23C' + else acc.color = '#F56C6C' + + // 计算当前验证码(epoch 变化时或首次计算) + const currentEpoch = Math.floor(now / period) + const algorithm = acc.algorithm + ? acc.algorithm.replace('SHA', 'SHA-').replace('SHA--', 'SHA-') + : 'SHA-1' + + if (acc.lastEpoch !== currentEpoch || !acc.currentCode || acc.currentCode === '------') { + acc.currentCode = await generateTOTP(acc.secret, period, acc.digits, algorithm) + acc.lastEpoch = currentEpoch + } + + // 剩余 5 秒时预计算下一段验证码 + if (remaining <= 5) { + if (!acc.nextCode || acc.lastNextEpoch !== currentEpoch + 1) { + acc.nextCode = await generateTOTP(acc.secret, period, acc.digits, algorithm, 1) + acc.lastNextEpoch = currentEpoch + 1 + } + } else { + acc.nextCode = null + } + })) + + // shallowRef 需要手动通知,合并所有深层属性变更为一次 UI 重绘 + // 渲染来源分流 (Trigger Control): + // 1. 无 targetList 传参时(由内部 1 秒定时器调用):因为仅原地修改属性,没改变浅引用,需手动 triggerRef 才能重绘 UI。 + // 2. 有 targetList 传参时(由外部 useVaultList 初筛调用):因为外边马上就要走 `vault.value = merged` 浅引用赋值逻辑, + // 所以这里绝对静默,不可调用 triggerRef,否则将打破单次重绘策略并造成 "------" 闪屏重演。 + if (!Array.isArray(targetList)) { + triggerRef(vault) + } + } + + const startTimer = () => { + updateVaultStatus() // 立即计算一次 + globalTimer = setInterval(() => updateVaultStatus(), 1000) + } + + const stopTimer = () => { + if (globalTimer) { + clearInterval(globalTimer) + globalTimer = null + } + } + + onMounted(startTimer) + onUnmounted(stopTimer) + + return { + updateVaultStatus, + startTimer, + stopTimer + } +} diff --git a/frontend/src/features/vault/composables/useVaultActions.js b/frontend/src/features/vault/composables/useVaultActions.js new file mode 100644 index 0000000..2c57820 --- /dev/null +++ b/frontend/src/features/vault/composables/useVaultActions.js @@ -0,0 +1,191 @@ +import { ref } from 'vue' +import { ElMessage, ElMessageBox } from 'element-plus' +import QRCode from 'qrcode' +import { useVaultStore } from '@/features/vault/store/vaultStore' +import { vaultService } from '@/features/vault/service/vaultService' +import { copyToClipboard } from '@/shared/utils/common' + +/** + * 管理账号的增删改查与二维码展示等弹窗行为 + * @param {Function} fetchVault - 操作成功后用于刷新列表的回调 + * @param {import('vue').ShallowRef} vault - 当前账号列表(用于全选) + * @returns Composable state and actions + */ +export function useVaultActions(fetchVault, vault) { + const vaultStore = useVaultStore() + + // --- 批量操作 --- + const selectedIds = ref([]) + const isBulkDeleting = ref(false) + + // --- 编辑弹窗 --- + const showEditDialog = ref(false) + const isEditing = ref(false) + const editVaultData = ref({ id: '', service: '', account: '', category: '' }) + + // --- 二维码弹窗 --- + const showQrDialog = ref(false) + const currentQrItem = ref(null) + const showSecret = ref(false) + const qrCodeUrl = ref('') + + // --- 批量删除 --- + const handleBulkDelete = async () => { + if (!selectedIds.value.length) return + try { + await ElMessageBox.confirm( + `确定要删除选中的 ${selectedIds.value.length} 个账号吗?此操作不可恢复。`, + '批量删除', + { type: 'warning', confirmButtonText: '确认删除', cancelButtonText: '取消' } + ) + isBulkDeleting.value = true + await vaultService.batchDelete(selectedIds.value) + ElMessage.success(`已成功删除 ${selectedIds.value.length} 个账号`) + selectedIds.value = [] + vaultStore.markDirty() + fetchVault() + } catch (e) { + if (e !== 'cancel') console.error(e) + } finally { + isBulkDeleting.value = false + } + } + + const toggleSelection = (id) => { + const idx = selectedIds.value.indexOf(id) + if (idx > -1) { + selectedIds.value.splice(idx, 1) + } else { + selectedIds.value.push(id) + } + } + + // Bug Fix: 全选已加载账号(直接访问 vault ref,无需跨 composable 传参) + const selectAllLoaded = () => { + if (vault?.value) { + selectedIds.value = vault.value.map(acc => acc.id) + } + } + + // --- 复制 TOTP 代码 --- + const copyCode = async (vaultItem) => { + if (!vaultItem.currentCode || vaultItem.currentCode === '------') { + return ElMessage.warning('验证码尚未生成,请稍候') + } + await copyToClipboard(vaultItem.currentCode, '验证码已复制') + } + + // --- 编辑账号 --- + const openEditDialog = (vaultItem) => { + editVaultData.value = { + id: vaultItem.id, + service: vaultItem.service, + account: vaultItem.account, + category: vaultItem.category || '' + } + showEditDialog.value = true + } + + const submitEditVault = async () => { + isEditing.value = true + try { + const { id, ...updateData } = editVaultData.value + const res = await vaultService.updateAccount(id, updateData) + if (res.success) { + ElMessage.success('账号信息已更新') + showEditDialog.value = false + vaultStore.markDirty() + fetchVault() + } + } catch (e) { + // Error is shown by request utility or vaultError handler + } finally { + isEditing.value = false + } + } + + // --- 删除单个账号 --- + const deleteVault = async (vaultItem) => { + try { + await ElMessageBox.confirm(`确定要删除 ${vaultItem.service} 吗?`, '删除确认', { + type: 'warning', + confirmButtonText: '确认删除', + cancelButtonText: '取消' + }) + await vaultService.deleteAccount(vaultItem.id) + ElMessage.success('账号已删除') + vaultStore.markDirty() + fetchVault() + } catch (e) { + if (e !== 'cancel') console.error(e) + } + } + + // --- 二维码导出 --- + const openQrDialog = async (vaultItem) => { + currentQrItem.value = vaultItem + showSecret.value = false + showQrDialog.value = true + + const algorithm = vaultItem.algorithm + ? vaultItem.algorithm.replace('SHA', 'SHA-').replace('SHA--', 'SHA-') + : 'SHA-1' + const uri = `otpauth://totp/${encodeURIComponent(vaultItem.service)}:${encodeURIComponent(vaultItem.account)}?secret=${vaultItem.secret}&issuer=${encodeURIComponent(vaultItem.service)}&algorithm=${algorithm}&digits=${vaultItem.digits || 6}&period=${vaultItem.period || 30}` + qrCodeUrl.value = await QRCode.toDataURL(uri, { width: 240, margin: 1 }) + } + + const copySecret = () => { + if (currentQrItem.value) { + copyToClipboard(currentQrItem.value.secret) + ElMessage.success('密钥已复制到剪贴板') + } + } + + const copyOtpUrl = () => { + if (currentQrItem.value) { + const item = currentQrItem.value + const algorithm = item.algorithm + ? item.algorithm.replace('SHA', 'SHA-').replace('SHA--', 'SHA-') + : 'SHA-1' + const uri = `otpauth://totp/${encodeURIComponent(item.service)}:${encodeURIComponent(item.account)}?secret=${item.secret}&issuer=${encodeURIComponent(item.service)}&algorithm=${algorithm}&digits=${item.digits || 6}&period=${item.period || 30}` + copyToClipboard(uri) + ElMessage.success('OTP URI 已复制') + } + } + + const formatSecret = (secret) => { + return (secret || '').match(/.{1,4}/g)?.join(' ') || secret + } + + // --- 统一命令分发 --- + const handleCommand = (cmd, vaultItem) => { + if (cmd === 'edit') openEditDialog(vaultItem) + else if (cmd === 'qr') openQrDialog(vaultItem) + else if (cmd === 'delete') deleteVault(vaultItem) + } + + return { + selectedIds, + isBulkDeleting, + showEditDialog, + isEditing, + editVaultData, + showQrDialog, + currentQrItem, + showSecret, + qrCodeUrl, + + toggleSelection, + selectAllLoaded, + handleBulkDelete, + copyCode, + openEditDialog, + submitEditVault, + deleteVault, + openQrDialog, + copySecret, + copyOtpUrl, + formatSecret, + handleCommand, + } +} diff --git a/frontend/src/features/vault/composables/useVaultList.js b/frontend/src/features/vault/composables/useVaultList.js new file mode 100644 index 0000000..f2c61f1 --- /dev/null +++ b/frontend/src/features/vault/composables/useVaultList.js @@ -0,0 +1,144 @@ +import { ref, shallowRef, computed, watch, triggerRef } from 'vue' +import { useInfiniteQuery, useQueryClient } from '@tanstack/vue-query' +import { useVaultStore } from '@/features/vault/store/vaultStore' +import { vaultService } from '@/features/vault/service/vaultService' + +/** + * 管理金库账号的分页列表数据获取与搜索 + * + * 架构说明 (Architecture Notes): + * 1. 渲染时序防闪烁: 采用「两级渲染策略」。针对已有账号(已包含计算好的 TOTP 验证码)直接复用; + * 针对新加载分页的新账号,先触发 `afterLoadRef` 在后台预计算验证码,完成之后再赋值给 `vault.value`。 + * 这种先计算后一次性赋值的浅引用 (shallowRef) 机制,避免了验证码变为 "------" 然后闪换的情况。 + * 2. 缓存秒开机制: `staleTime` 设置为 60s。当用户从外部组件切回主页时,若在 60s 内, + * 直接利用 Vue Query 的现有缓存(保留已有账号的 TOTP `currentCode` 和动态倒计时 `remaining`), + * 消除 Loading 空白期的出现。也不会触发多余的重复分页加载以及昂贵的 PBKDF2 (`vaultStore.saveData`)加解密迭代开销。 + * 3. 并发解耦: 本 Composable `useVaultList` 独立负责 Vue Query 分页和本地缓存维护(`vaultStore.saveData`)。 + * 对于后续验证码计算的具体逻辑,委托给外部通过参数 `afterLoadRef` 回调。 + * + * @param {import('vue').Ref} afterLoadRef - 可选的 ref,指向数据合并后的异步回调(如 updateVaultStatus) + * @returns Composable state and actions + */ +export function useVaultList(afterLoadRef = null) { + const vaultStore = useVaultStore() + const queryClient = useQueryClient() + + const vault = shallowRef([]) + const searchQuery = ref('') + const pageSize = ref(12) + + // --- Vue Query 分页逻辑 --- + const fetchVaultPage = async ({ pageParam = 1 }) => { + if (!vaultStore.isUnlocked) return { vault: [], pagination: { totalPages: 0 } } + return await vaultService.getVault({ + page: pageParam, + limit: pageSize.value, + search: searchQuery.value + }) + } + + const { + data, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + isLoading, + isFetching, + isError, + refetch + } = useInfiniteQuery({ + queryKey: ['vault', searchQuery], + queryFn: fetchVaultPage, + getNextPageParam: (lastPage) => { + if (!lastPage || !lastPage.pagination) return undefined + const { page, totalPages } = lastPage.pagination + return page < totalPages ? page + 1 : undefined + }, + enabled: computed(() => vaultStore.isUnlocked), + // 60 秒内切换回来直接用缓存,不触发逐页重拉(避免多次 PBKDF2 saveData 开销) + // invalidateQueries / resetQueries 调用时会忽略 staleTime,强制立即刷新 + staleTime: 60 * 1000, + }) + + // 监听数据变化,同步到本地 vault 引用 + watch(data, async (newData) => { + if (!newData) return + + // 智能合并:保留已有账号的 TOTP 实时状态,新增账号初始化响应式属性 + const flatVault = newData.pages.flatMap(p => p.vault || []) + const merged = flatVault.map(newAcc => { + const existing = vault.value.find(a => a.id === newAcc.id) + if (existing) { + return { ...existing, ...newAcc } // 保留 currentCode / remaining 等动态字段 + } + return { + ...newAcc, + currentCode: '------', + nextCode: null, + remaining: 30, + percentage: 0, + color: '' + } + }) + + // 两级渲染策略,兼顾「无 ------ 闪烁」与「切换回来秒开」: + // 1. 找出真正的新增项(已有项 currentCode 有值,直接复用,无需重算) + const newItems = merged.filter(acc => !acc.currentCode || acc.currentCode === '------') + + if (newItems.length > 0) { + // 2. 只为新增项预计算 TOTP(通常 12 条/页,耗时极短),避免显示 "------" + // updateVaultStatus(newItems) 仅修改 newItems 元素属性,不调用 triggerRef + const cb = afterLoadRef?.value ?? afterLoadRef + if (typeof cb === 'function') { + await cb(newItems) + } + } + + // 3. 一次赋值完成渲染:已有项复用原有验证码,新增项验证码已预计算完毕 + // shallowRef .value = 新引用会自动通知 Vue,无需额外 triggerRef + vault.value = merged + + // 无搜索词时保存全量缓存(使用正确的 vaultStore API) + if (!searchQuery.value && vaultStore.isUnlocked) { + try { + await vaultStore.saveData({ vault: merged }) + vaultStore.clearDirty() + } catch (e) { + // 缓存写入失败静默处理 + } + } + }, { deep: false }) + + // 公开的 fetchVault 方法(用于父组件通过 ref 手工刷新) + // 使用 invalidateQueries 而非 resetQueries:保留缓存仅标记为过期, + // 切换回账号列表时可立即从缓存显示,后台静默刷新,无需重新拉取所有分页。 + const fetchVault = () => { + queryClient.invalidateQueries({ queryKey: ['vault'] }) + } + + // 无限滚动加载 + const isLoadMoreDisabled = computed(() => + !hasNextPage.value || isFetchingNextPage.value || !vaultStore.isUnlocked || isError.value + ) + + const handleLoadMore = () => { + if (!isLoadMoreDisabled.value) { + fetchNextPage() + } + } + + return { + vault, + searchQuery, + pageSize, + isLoading, + isFetching, + isFetchingNextPage, + hasNextPage, + isError, + isLoadMoreDisabled, + fetchVault, + handleLoadMore, + refetch + } +} diff --git a/frontend/src/features/vault/service/vaultService.js b/frontend/src/features/vault/service/vaultService.js new file mode 100644 index 0000000..5e53661 --- /dev/null +++ b/frontend/src/features/vault/service/vaultService.js @@ -0,0 +1,150 @@ +import { request } from '@/shared/utils/request' +import { vaultError } from '@/shared/utils/errors/vaultError' + +/** + * @typedef {Object} VaultAccount + * @property {string} [id] - Account ID + * @property {string} service - Service name (e.g. "Google") + * @property {string} account - Account identifier (e.g. email) + * @property {string} secret - Base32-encoded TOTP secret + * @property {string} [category] - Optional category label + * @property {6|8} [digits] - OTP digit count (default: 6) + * @property {30|60} [period] - TOTP period in seconds (default: 30) + * @property {'SHA1'|'SHA256'|'SHA512'} [algorithm] - HMAC algorithm (default: 'SHA1') + */ + +/** + * @typedef {Object} VaultPagination + * @property {number} page - Current page number + * @property {number} totalPages - Total number of pages + * @property {number} total - Total item count + */ + +/** + * @typedef {Object} VaultListResponse + * @property {boolean} success + * @property {VaultAccount[]} vault - List of accounts for THIS page + * @property {VaultPagination} pagination + */ + +export const vaultService = { + /** + * 分页获取账号列表 + * @param {{ page?: number, limit?: number, search?: string }} params + * @returns {Promise} + * @throws {vaultError} + */ + async getVault(params = {}) { + try { + const query = new URLSearchParams(params).toString() + return await request(`/api/vault?${query}`) + } catch (e) { + throw new vaultError('Failed to fetch vault list', 'VAULT_FETCH_FAILED', e) + } + }, + + /** + * 创建新账号 + * @param {VaultAccount} vaultData + * @returns {Promise<{success: boolean, id: string}>} + * @throws {vaultError} + */ + async createAccount(vaultData) { + try { + return await request('/api/vault', { + method: 'POST', + body: JSON.stringify(vaultData) + }) + } catch (e) { + throw new vaultError('Failed to create account', 'ACCOUNT_CREATE_FAILED', e) + } + }, + + /** + * 更新账号信息 + * @param {string} id + * @param {Partial} updateData + * @returns {Promise<{success: boolean}>} + * @throws {vaultError} + */ + async updateAccount(id, updateData) { + try { + return await request(`/api/vault/${id}`, { + method: 'PUT', + body: JSON.stringify(updateData) + }) + } catch (e) { + throw new vaultError('Failed to update account', 'ACCOUNT_UPDATE_FAILED', e) + } + }, + + /** + * 删除单个账号 + * @param {string} id + * @returns {Promise<{success: boolean}>} + * @throws {vaultError} + */ + async deleteAccount(id) { + try { + return await request(`/api/vault/${id}`, { method: 'DELETE' }) + } catch (e) { + throw new vaultError('Failed to delete account', 'ACCOUNT_DELETE_FAILED', e) + } + }, + + /** + * 批量删除账号 + * @param {string[]} ids + * @returns {Promise<{success: boolean, deleted: number}>} + * @throws {vaultError} + */ + async batchDelete(ids) { + try { + return await request('/api/vault/batch-delete', { + method: 'POST', + body: JSON.stringify({ ids }) + }) + } catch (e) { + throw new vaultError('Failed to batch delete accounts', 'ACCOUNTS_BATCH_DELETE_FAILED', e) + } + }, + + /** + * 通过 URI 添加账号 + * @param {string} uri - otpauth://totp/... URI string + * @param {string} [category='扫码添加'] + * @returns {Promise<{success: boolean, id: string}>} + * @throws {vaultError} + */ + async addFromUri(uri, category = '扫码添加') { + try { + return await request('/api/vault/add-from-uri', { + method: 'POST', + body: JSON.stringify({ uri, category }) + }) + } catch (e) { + throw new vaultError('Failed to add account from URI', 'ACCOUNT_ADD_URI_FAILED', e) + } + }, + + /** + * 导入账号数据 + * @param {VaultAccount[]|string} vault - 账号数组或加密字符串 + * @param {'raw'|'encrypted'} [type='raw'] + * @returns {Promise<{success: boolean, count: number}>} + * @throws {vaultError} + */ + async importVault(vault, type = 'raw') { + try { + return await request('/api/vault/import', { + method: 'POST', + body: JSON.stringify({ + type, + content: typeof vault === 'string' ? vault : JSON.stringify(vault) + }) + }) + } catch (e) { + throw new vaultError('Failed to import vault data', 'VAULT_IMPORT_FAILED', e) + } + } +} diff --git a/frontend/src/features/vault/views/home.vue b/frontend/src/features/vault/views/home.vue index 08b61ab..2ae7050 100644 --- a/frontend/src/features/vault/views/home.vue +++ b/frontend/src/features/vault/views/home.vue @@ -54,8 +54,8 @@ const layoutStore = useLayoutStore() const VaultList = defineAsyncComponent(() => import('@/features/vault/components/vaultList.vue')) const AddVaultScan = defineAsyncComponent(() => import('@/features/vault/components/addVaultScan.vue')) const AddVaultManual= defineAsyncComponent(() => import('@/features/vault/components/addVaultManual.vue')) -const DataExport = defineAsyncComponent(() => import('@/features/backup/views/dataExport.vue')) -const DataImport = defineAsyncComponent(() => import('@/features/backup/views/dataImport.vue')) +const DataExport = defineAsyncComponent(() => import('@/features/migration/views/dataExport.vue')) +const DataImport = defineAsyncComponent(() => import('@/features/migration/views/dataImport.vue')) const DataBackup = defineAsyncComponent(() => import('@/features/backup/views/dataBackup.vue')) const UtilityTools = defineAsyncComponent(() => import('@/features/tools/views/utilityTools.vue')) diff --git a/frontend/src/main.js b/frontend/src/main.js index 17cab6b..309ad64 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -24,9 +24,26 @@ themeStore.initTheme() // PWA Service Worker 注册 registerSW({ onOfflineReady() { - ElMessage.success({ - message: '应用已缓存,支持离线访问', - duration: 3000 + import('element-plus').then(({ ElNotification }) => { + ElNotification({ + title: '更新可用', + message: ` +
+ 🎉 Cloudflare Worker 新部署已就绪! +
+
+ +
+ `, + dangerouslyUseHTMLString: true, + type: 'success', + duration: 0 + }) }) }, }) diff --git a/frontend/src/shared/components/icons/icon2FAS.vue b/frontend/src/shared/components/icons/icon2FAS.vue new file mode 100644 index 0000000..96ce787 --- /dev/null +++ b/frontend/src/shared/components/icons/icon2FAS.vue @@ -0,0 +1,11 @@ + + diff --git a/frontend/src/shared/components/icons/iconAegis.vue b/frontend/src/shared/components/icons/iconAegis.vue new file mode 100644 index 0000000..8f5abe2 --- /dev/null +++ b/frontend/src/shared/components/icons/iconAegis.vue @@ -0,0 +1,8 @@ + + diff --git a/frontend/src/shared/components/icons/iconBitwarden.vue b/frontend/src/shared/components/icons/iconBitwarden.vue new file mode 100644 index 0000000..e374a90 --- /dev/null +++ b/frontend/src/shared/components/icons/iconBitwarden.vue @@ -0,0 +1,8 @@ + + diff --git a/frontend/src/shared/components/icons/iconCloudflare.vue b/frontend/src/shared/components/icons/iconCloudflare.vue new file mode 100644 index 0000000..95928ce --- /dev/null +++ b/frontend/src/shared/components/icons/iconCloudflare.vue @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/frontend/src/shared/components/icons/iconGitee.vue b/frontend/src/shared/components/icons/iconGitee.vue new file mode 100644 index 0000000..1144b1a --- /dev/null +++ b/frontend/src/shared/components/icons/iconGitee.vue @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/frontend/src/shared/components/icons/iconGithub.vue b/frontend/src/shared/components/icons/iconGithub.vue new file mode 100644 index 0000000..98c44d2 --- /dev/null +++ b/frontend/src/shared/components/icons/iconGithub.vue @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/frontend/src/shared/components/icons/iconGoogle.vue b/frontend/src/shared/components/icons/iconGoogle.vue new file mode 100644 index 0000000..4bd2b7a --- /dev/null +++ b/frontend/src/shared/components/icons/iconGoogle.vue @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/frontend/src/shared/components/icons/iconGoogleAuth.vue b/frontend/src/shared/components/icons/iconGoogleAuth.vue new file mode 100644 index 0000000..fb002cc --- /dev/null +++ b/frontend/src/shared/components/icons/iconGoogleAuth.vue @@ -0,0 +1,8 @@ + + diff --git a/frontend/src/shared/components/icons/iconMicrosoftAuth.vue b/frontend/src/shared/components/icons/iconMicrosoftAuth.vue new file mode 100644 index 0000000..2c8c9ab --- /dev/null +++ b/frontend/src/shared/components/icons/iconMicrosoftAuth.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/frontend/src/shared/components/icons/iconNodeloc.vue b/frontend/src/shared/components/icons/iconNodeloc.vue new file mode 100644 index 0000000..4bccf50 --- /dev/null +++ b/frontend/src/shared/components/icons/iconNodeloc.vue @@ -0,0 +1,21 @@ + + diff --git a/frontend/src/shared/components/icons/iconTelegram.vue b/frontend/src/shared/components/icons/iconTelegram.vue new file mode 100644 index 0000000..36ddba8 --- /dev/null +++ b/frontend/src/shared/components/icons/iconTelegram.vue @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/frontend/src/shared/components/theFooter.vue b/frontend/src/shared/components/theFooter.vue index 40ff2d2..ee24a41 100644 --- a/frontend/src/shared/components/theFooter.vue +++ b/frontend/src/shared/components/theFooter.vue @@ -5,7 +5,7 @@ ©{{ new Date().getFullYear() }} 2FAuth Worker | - Serverless 2FA Manager + A Secure 2FA Management Tool | diff --git a/frontend/src/shared/components/theHeader.vue b/frontend/src/shared/components/theHeader.vue index 4db49e7..841d42f 100644 --- a/frontend/src/shared/components/theHeader.vue +++ b/frontend/src/shared/components/theHeader.vue @@ -1,7 +1,7 @@