From 16ed23db5a7cd5325a1a7fd4c91f938eb53331ad Mon Sep 17 00:00:00 2001 From: y3drk Date: Thu, 18 Jun 2026 17:17:45 +0200 Subject: [PATCH 1/4] Action Item 1 --- ensawards.org/astro.config.mjs | 69 ++++++++++++++++++ ...e-ensv2-test-name-address-fail-example.png | Bin ...st-name-address-not-applicable-example.gif | Bin ...e-ensv2-test-name-address-pass-example.gif | Bin .../ensv2-ready-resolution/index.ts | 4 +- .../technicalDetails.tsx | 0 .../index.ts | 15 ++-- 7 files changed, 78 insertions(+), 10 deletions(-) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png (100%) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif (100%) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif (100%) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/ensv2-ready-resolution/index.ts (93%) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/ensv2-ready-resolution/technicalDetails.tsx (100%) rename ensawards.org/data/ens-best-practices/{ensv2-readiness => ens-resolution}/index.ts (50%) diff --git a/ensawards.org/astro.config.mjs b/ensawards.org/astro.config.mjs index 4514d95c..1a509a4f 100644 --- a/ensawards.org/astro.config.mjs +++ b/ensawards.org/astro.config.mjs @@ -45,6 +45,75 @@ export default defineConfig({ "/ens-best-practices/contract-naming": "/ens-best-practices", "/leaderboards/defi": "/leaderboards/defi-protocol", + + // The `ensv2-readiness` best practice category was renamed to `resolution`. + "/ens-best-practices/ensv2-readiness/ensv2-ready-resolution": + "/ens-best-practices/resolution/ensv2-ready-resolution", + + "/app/1inch-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/1inch-defi/resolution/ensv2-ready-resolution", + "/app/aave-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/aave-defi/resolution/ensv2-ready-resolution", + "/app/ambire-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/ambire-wallet/resolution/ensv2-ready-resolution", + "/app/binance-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-exchange/resolution/ensv2-ready-resolution", + "/app/binance-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-wallet/resolution/ensv2-ready-resolution", + "/app/blockscout-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/blockscout-explorer/resolution/ensv2-ready-resolution", + "/app/coinbase-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-exchange/resolution/ensv2-ready-resolution", + "/app/coinbase-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-wallet/resolution/ensv2-ready-resolution", + "/app/cryptocom-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-exchange/resolution/ensv2-ready-resolution", + "/app/cryptocom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-wallet/resolution/ensv2-ready-resolution", + "/app/etherscan-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/etherscan-explorer/resolution/ensv2-ready-resolution", + "/app/frame-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/frame-wallet/resolution/ensv2-ready-resolution", + "/app/gemini-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/gemini-wallet/resolution/ensv2-ready-resolution", + "/app/kraken-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-exchange/resolution/ensv2-ready-resolution", + "/app/kraken-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-wallet/resolution/ensv2-ready-resolution", + "/app/lido-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/lido-defi/resolution/ensv2-ready-resolution", + "/app/metamask-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/metamask-wallet/resolution/ensv2-ready-resolution", + "/app/okx-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-exchange/resolution/ensv2-ready-resolution", + "/app/okx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-wallet/resolution/ensv2-ready-resolution", + "/app/phantom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/phantom-wallet/resolution/ensv2-ready-resolution", + "/app/rabby-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rabby-wallet/resolution/ensv2-ready-resolution", + "/app/rainbow-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rainbow-wallet/resolution/ensv2-ready-resolution", + "/app/readyx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/readyx-wallet/resolution/ensv2-ready-resolution", + "/app/robinhood-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-exchange/resolution/ensv2-ready-resolution", + "/app/robinhood-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-wallet/resolution/ensv2-ready-resolution", + "/app/safe-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/safe-wallet/resolution/ensv2-ready-resolution", + "/app/status-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/status-wallet/resolution/ensv2-ready-resolution", + "/app/trust-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/trust-wallet/resolution/ensv2-ready-resolution", + "/app/uniswap-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/uniswap-defi/resolution/ensv2-ready-resolution", + "/app/walletchan-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/walletchan-wallet/resolution/ensv2-ready-resolution", + "/app/worldapp-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/worldapp-wallet/resolution/ensv2-ready-resolution", + "/app/zerion-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/zerion-wallet/resolution/ensv2-ready-resolution", }, adapter: vercel(), diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png rename to ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif rename to ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif rename to ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/index.ts similarity index 93% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts rename to ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/index.ts index 73b7c44a..cf185371 100644 --- a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts +++ b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/index.ts @@ -8,7 +8,7 @@ import { type BestPracticeApp, BestPracticeTypes } from "data/ens-best-practices import { parseTimestamp } from "@ensnode/ensnode-sdk"; -import ENSv2ReadinessCategory from "../index.ts"; +import ENSResolutionCategory from "../index.ts"; import technicalDetails from "./technicalDetails.tsx"; const ensv2ReadyResolution: BestPracticeApp = { @@ -17,7 +17,7 @@ const ensv2ReadyResolution: BestPracticeApp = { bestPracticeSlug: "ensv2-ready-resolution", name: "Correctly Resolve All Names For ENSv2", description: "Make sure your app keeps resolving ENS names correctly once ENSv2 launches.", - category: ENSv2ReadinessCategory, + category: ENSResolutionCategory, appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi, AppTypes.Exchange], technicalDetails: technicalDetails, contributions: [ diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/technicalDetails.tsx rename to ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/index.ts b/ensawards.org/data/ens-best-practices/ens-resolution/index.ts similarity index 50% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/index.ts rename to ensawards.org/data/ens-best-practices/ens-resolution/index.ts index b5029557..3ffa4d1a 100644 --- a/ensawards.org/data/ens-best-practices/ensv2-readiness/index.ts +++ b/ensawards.org/data/ens-best-practices/ens-resolution/index.ts @@ -5,16 +5,15 @@ import { defineBestPracticeCategory } from "../registry.ts"; import type { BestPracticeCategory } from "../types.ts"; import { CategoryStatuses } from "../types.ts"; -const ENSv2ReadinessCategory: BestPracticeCategory = { - id: "ensv2-readiness", - categorySlug: "ensv2-readiness", - name: "ENSv2 Readiness", - description: - "Be ready for ENSv2 — keep resolving and reading ENS data correctly through the upgrade and beyond.", +const ENSResolutionCategory: BestPracticeCategory = { + id: "resolution", + categorySlug: "resolution", + name: "ENS Resolution", + description: "Correctly resolve the profiles of ENS names.", status: CategoryStatuses.Active, order: 0, }; -defineBestPracticeCategory(ENSv2ReadinessCategory); +defineBestPracticeCategory(ENSResolutionCategory); -export default ENSv2ReadinessCategory; +export default ENSResolutionCategory; From 189b60c798bdb337c5ba09519276f3db5f75ed90 Mon Sep 17 00:00:00 2001 From: y3drk Date: Thu, 18 Jun 2026 19:40:10 +0200 Subject: [PATCH 2/4] Action Item 2 --- CONTRIBUTING.md | 2 +- .../data/apps/1inch-defi/benchmarks/index.tsx | 10 + .../data/apps/aave-defi/benchmarks/index.tsx | 10 + .../apps/ambire-wallet/benchmarks/index.tsx | 10 + .../binance-exchange/benchmarks/index.tsx | 10 + .../apps/binance-wallet/benchmarks/index.tsx | 10 + .../blockscout-explorer/benchmarks/index.tsx | 10 + .../coinbase-exchange/benchmarks/index.tsx | 10 + .../apps/coinbase-wallet/benchmarks/index.tsx | 10 + .../cryptocom-exchange/benchmarks/index.tsx | 10 + .../cryptocom-wallet/benchmarks/index.tsx | 10 + .../etherscan-explorer/benchmarks/index.tsx | 10 + .../apps/frame-wallet/benchmarks/index.tsx | 10 + .../apps/gemini-wallet/benchmarks/index.tsx | 10 + .../apps/kraken-exchange/benchmarks/index.tsx | 10 + .../apps/kraken-wallet/benchmarks/index.tsx | 10 + .../data/apps/lido-defi/benchmarks/index.tsx | 10 + .../apps/metamask-wallet/benchmarks/index.tsx | 10 + .../apps/okx-exchange/benchmarks/index.tsx | 10 + .../data/apps/okx-wallet/benchmarks/index.tsx | 10 + .../apps/phantom-wallet/benchmarks/index.tsx | 10 + .../apps/rabby-wallet/benchmarks/index.tsx | 10 + .../apps/rainbow-wallet/benchmarks/index.tsx | 10 + .../apps/readyx-wallet/benchmarks/index.tsx | 10 + .../robinhood-exchange/benchmarks/index.tsx | 10 + .../robinhood-wallet/benchmarks/index.tsx | 10 + .../apps/safe-wallet/benchmarks/index.tsx | 10 + .../apps/status-wallet/benchmarks/index.tsx | 10 + .../apps/trust-wallet/benchmarks/index.tsx | 10 + .../apps/uniswap-defi/benchmarks/index.tsx | 10 + .../walletchan-wallet/benchmarks/index.tsx | 10 + .../apps/worldapp-wallet/benchmarks/index.tsx | 10 + .../apps/zerion-wallet/benchmarks/index.tsx | 10 + .../technicalDetails.tsx | 4 +- .../technicalDetails.tsx | 4 +- .../technicalDetails.tsx | 4 +- .../acceptance-test-example-placeholder.png | Bin 0 -> 149272 bytes .../ens-resolution/deposit-addresses/index.ts | 32 + .../deposit-addresses/technicalDetails.tsx | 867 ++++++++++++++++++ .../technicalDetails.tsx | 33 +- .../data/ens-best-practices/styles.ts | 3 + .../data/ens-best-practices/types.ts | 2 +- ensawards.org/data/shared/test-utils.tsx | 2 +- .../technicalDetails/benchmark/index.astro | 4 +- .../technicalDetails/bestPractice/index.tsx | 4 +- .../molecules/technicalDetails/shared.tsx | 4 +- 46 files changed, 1250 insertions(+), 35 deletions(-) create mode 100644 ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/images/acceptance-test-example-placeholder.png create mode 100644 ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts create mode 100644 ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c52b28d..a1a3ca93 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -228,7 +228,7 @@ For reference see [ensawards.org/data/ens-best-practices/contract-naming/name-yo [ensawards.org/data/ens-best-practices/types.ts](ensawards.org/data/ens-best-practices/types.ts) file. ```typescript export interface BestPracticeTechnicalDetails { - useCaseSummary: JSX.Element; + ensBestPracticeOverview: JSX.Element; benefitFromUsingEns: JSX.Element; /** Title for the benefit card. Defaults to "Benefit from using ENS" when omitted. */ benefitFromUsingEnsTitle?: string; diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx index f4cdf5c0..b8ec35c2 100644 --- a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx @@ -55,6 +55,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(OneInchDeFi, benchmarks); diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx index aad7f05e..1ba34940 100644 --- a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx @@ -76,6 +76,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(AaveDeFi, benchmarks); diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx index 7a2c6b20..eeea40d3 100644 --- a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx @@ -67,6 +67,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(AmbireWallet, benchmarks); diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx index 9ce7bff5..8b90ab5f 100644 --- a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx @@ -60,6 +60,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(BinanceExchange, benchmarks); diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx index b8b031e0..abfaf9d7 100644 --- a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(BinanceWallet, benchmarks); diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx index cb6770de..973ac6d4 100644 --- a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(BlockscoutExplorer, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx index 92b1d021..4f16dae2 100644 --- a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx @@ -37,6 +37,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CoinbaseExchange, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx index 66d1ced8..59ac3814 100644 --- a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(CoinbaseWallet, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx index acab9f2a..461ec378 100644 --- a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CryptoComExchange, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx index 305c5e96..f60fd51b 100644 --- a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CryptoComWallet, benchmarks); diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx index 4bcc9896..11620512 100644 --- a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(EtherscanExplorer, benchmarks); diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx index 8ba257fc..7ec849fd 100644 --- a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(FrameWallet, benchmarks); diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx index 91bdc14d..2c14828b 100644 --- a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(GeminiWallet, benchmarks); diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx index 7c0e6b24..24c3132f 100644 --- a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(KrakenExchange, benchmarks); diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx index 2411029e..d22ce50b 100644 --- a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(KrakenWallet, benchmarks); diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx index 0de5a9fd..c55d46a6 100644 --- a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx @@ -56,6 +56,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(LidoDeFi, benchmarks); diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx index 61d652f7..44cdea75 100644 --- a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx @@ -74,6 +74,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(MetaMaskWallet, benchmarks); diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx index a6091eb8..a6b75985 100644 --- a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(OKXExchange, benchmarks); diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx index ee54ee01..e54d4915 100644 --- a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(OKXWallet, benchmarks); diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx index ec4ad451..7f57dd5a 100644 --- a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(PhantomWallet, benchmarks); diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx index 17ddf6ca..6153a36c 100644 --- a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RabbyWallet, benchmarks); diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx index 7ae5f55c..34f54534 100644 --- a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RainbowWallet, benchmarks); diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx index 57e3fa58..72d62ffc 100644 --- a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ReadyXWallet, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx index 4bb2de11..6d97372f 100644 --- a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx @@ -51,6 +51,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(RobinhoodExchange, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx index ed9df402..1f8991b5 100644 --- a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(RobinhoodWallet, benchmarks); diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx index 2b625b4d..c4207f1e 100644 --- a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(SafeWallet, benchmarks); diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx index 4c401951..f0cbcd50 100644 --- a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(StatusWallet, benchmarks); diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx index 93221171..7a63f9f3 100644 --- a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(TrustWallet, benchmarks); diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx index fa6684af..b915e5b8 100644 --- a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(UniswapDeFi, benchmarks); diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx index f7d1aca2..ab2a63f5 100644 --- a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx @@ -83,6 +83,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WalletChanWallet, benchmarks); diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx index 0534606b..3e4cb542 100644 --- a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx @@ -61,6 +61,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WorldWallet, benchmarks); diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx index 8185f4e4..76066fee 100644 --- a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ZerionWallet, benchmarks); diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx index e8f4164e..e0a9bb59 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx @@ -102,7 +102,7 @@ const benefitFromUsingEns = (

); -const useCaseSummary = ( +const ensBestPracticeOverview = (

ENSIP-19 enables primary names to be set on any chain. Contracts deployed to an L2 chain benefit from this, as the contract can then configure its name directly on the chain it is deployed to @@ -150,7 +150,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx index e75aad28..4ed1ac98 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx @@ -99,7 +99,7 @@ const benefitFromUsingEns = (

); -const useCaseSummary = ( +const ensBestPracticeOverview = (

If a contract has an ENS name, you can use its ENS profile to power additional UX improvements such as avatars, metadata, audit information, and more. More information can be found at the{" "} @@ -151,7 +151,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx index b00a0a5b..d1fc3c05 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx @@ -15,7 +15,7 @@ import enscribelookupAcceptanceTestImage from "./images/enscribe-lookup-example. // TODO: The content isn't fully curated for now. -const useCaseSummary = ( +const ensBestPracticeOverview = (

Contracts should be{" "} i5hpbN?vUR46|_d3GC$UU5!;0E8c50JVWneB7K+xA+Re;3sHwmlfMPvw2pYurMIFcTv3H z3!BgDaeUk5^|DZ7=qS$jf%Mw<(adQ7y31O=c4pN`m~NekYSxXW8OM3H@C)NheKK| zlkR05So|0)!13BrqPLpmfL(%rtJJ=q#{s<{@N!b!+#{5my2g+LQM^tk3+N0qMar%5 z@ykhi$rn%eYikvHkjr(!c|d1hkPbRQEy7G437#aE4jE#sk!L_*VPwLYC%@&U{;!m9kByN zTLO@szOd7=De+2*vNuXc-<9%P=GC$zYmzcRa?8j>iAR+}fDJNQP5HCQC_JXhvk z=fo+8i=mp(ty0{u08^fMVTE}jCCLz0`4%YLEtnLHxvK@08lW3x1H*8in566ac;LmI zmYt2`)_KmvOuY*7EMbt>WzJ|PQet_LA{%I^oWM0JRcII>ZKX+Mw?xi#N&>OH;`|dp zwLN&%ua@~L-Uy0&AEJ28d9V)K6s(Efrw>=;w4d*%F7^ua+Jhi zB0_jvz};_aA}G+YWJZ#tt>^vY9|kiKA~-jX}h6z;vk9I#!_>5&nyBzRaYAB3u- zUfN|gOaSQX8Qt+njlST3mAN%@BNeizW5ya4Nu}vzPNiE8#qliaNrl;Yb##^1Dw=%{ zDu7jUUxWF6DHG+a@pS)L8J+UtANyP2mQt+`31f%X<1WRdn)QQOK1^GcoXHJ$ggXc3StbhCyAq6r*Z6luVg8_qJ8Dv--uyDiv=*Jx8u@SpgGM z2ii)YNAvx|)`@?|dsy0@Wn`4tlt~z=!dn_eB1fndl(s@Rhg-4@W2$DLiIEVH=f~#? zBQ;A?*URrUNu8L-T_kw4z|g{;5tX{Ewa}wnpfpRnaP1Us16wxqTKGT@+C52@)%`ZC zEmJzkM_m69F&6X6yt`9P(1Qloxj@?5o?)pad^GXxnx;128L_VC~4_grY4s}R|>-ToNgQ-4je?a+N$@)CW8!Z&X-IgiP zW_2+Q6rk(eZZ>W1113lt3xC=yZ1OP*8Da_Gf58h7J|PwT`c#;who+*kM#?3~x82p? zvM#r>o8TCZMEKiAUa+6rjZD&hiMQkDdFa%3rl|qH1p`|g3?^*NUIIG`FFJ^ zsLr87@D=#Zb7!NnlaZHOlSjlj1J;hngG_nuh7N)LC$}z5ykyBG^zA;`lB9k4$A^oW z&D`3zSzBRin5i&t_8@XvjU1f{u{NM6Zq}(7)|1~nPdD%0)gls)GUUR*;F4)ab3JX` z!|8bTB#yYeDKFBgi$gSn2gAei-*FDBLw1C8Lf8hrIM1yN-KIfnfQXCwdE08R zDp-LE$=<{ zUrNd=4VjoU25pyOoN0PoL7cnPswitfEOlCvIJ^x83u(0byI$!Sc&*~;-1SzO!~GJ8 z{|ycfU9NkU)(uX;59IPVNXf6Obw-+^&^Z5PcTx}G1xlMtfVKqkeU7pVxu8 zV)WU~2pquNzf}MEOBeud&`HS)$AvMSb1Q(c&^X7~biaEoG~7`#a#{Di5BF}cZUN&E zNfyX0@&y6;^6Z#9{dJVmq@+oB(MDMq7+Emh>KooY$K&0}db8Xf{h(JntAwQ2U^ZN5 zLU;ns0Frhqkndvx6iQz<&bbervWf=J)}g34#JX8Rjp0(vj~f(Yl7oYT2Osv6v~za> zpU)G-!-nv~C?g(NVk~7~%buzV=8Rl|iMc?E#&0gdeaAK;x&+>L1tKo}BA&*M z6#glyM_)3+QMHArz8ad?;5P3Jijg{bIN}SEklaazI~y2Y3HhU+$sEz?d^nK6Wqgw0 za?N}_zV9bh{rwjiQ|L6XBVGYhbb!{JCyO38ib5M4l8ut(S2d2f2J{8oHbl*8svj4Y->BXSD%tXOxxA+@Cw%2-+=KuUNpW$%h7!i& zV@whHRsb(7Cs1!ai^0Pm@BRmO5TIkDM~YA|QOF8gtjz{qX)&){c%H?ftvZdA;YO9U zTWVLtDx+@A+<9U~+GFv7Ol9<^VJ#F&xMn(0_4TZL-P_n|{S2imQM%FXb2w7zA29z; zTcxoo@GeC9g&Q9Sj5xs_H3#_w&k5LeBZ(K=)3?&x-0N+F_)UHeenLgOH|z9shyDdM z1iYtY&=gr!u)i#)*H8vYmfTyjj;+wIfy9s zaZ|JRRupm1fpb6PAmZm!7l&OfUqH5jA!So4WVkf z;@siGG>sIAN(dmW&)oC7_Cs~Aljr57OR7+NE*{HkuxI6$Uq}QzuTsupo{uN%&U9k; zs*b;n1EbeJ<8REUfh%UMrNa2I9|5>CnGkTX*R+{aOw1V)?I#p@;(M85hMkx4d;Y*q zJSh8BHJ=xDX&F)j$;O+sK~VI8%j-U~u#>0wfd11}T#CV!#~qwMF6+0*Tk(LTFhHwD zH7i`DKi!QEwxtT%dH4vmUl!nfz`%DgT$lps1}@GIsOL>?N9_K!QHysY$LTcAfiCB< zc>4;nt!otmx+Y|H@UmtW6Q_k`!{BZkQJT*8^^f-1`)K`W=l4SkOco*|^7?{Fpr4gx zu3#JX2AS0wKCXlY<|@VN&C>R=!N9#>+{K^qReiIqSfN8XstO3I{Py%-4o=msA1Lxj zt{HDJ0^mL1wmE)l$-%S>X;A1X3v|rzlQ1a(eK39nNL&R22S+Mdv-LZv7=cHNOaDrl zbyLJTb4xJ!y3P-Q)A+I^*uCM5mqDN4D#FOnT45U>A7de>Nkhwoks!YO!Z5D!I!A@} z{qJk;ZkH+bLHv1jqw1QvVYS9DwsAE0@#_}Kg_Pl|am)@z3zS(&(>j5<%fQ?$l)JFo|Hl!zWIpy0uO zf`uzhNm7Xh{hX4F@vc{v#}-z`2pq&)xXRmZ%#kML8)=o&{b8Sc@P~npG&rOV%JU*S zB`NUFw@bFSU;5YkSwiE6ZJ`R>{R4ql_*XZPC5#aVG!+^%f5trnTtFI0s!iU*~YKEJ#aTTXL$(W9+;^Lu2j^T25^(gQcsOaO>Aoc-DKyTM1UA zF&epb4G}*(*-jcd$4^5tnw)0^fRg|8^_D*O^QR+_6tg$&+CD}`8HaAG!qAhmv89s`U+W_w=P5URz$bXa2HsUs$ zj0a8vLi=}fAFW;%hIZ}xE*@rwVVgrgJr49SzaCA!in|G3Y4J{YkT+tMATjr53A2U# zPd$1l;8+E~^66z3FXX7iUD<`Xau-1fvm_6iLeC{-Es7pqW2c6~uo)R$zl2-}I(1h2 zW-C;uW#_QmHucC7P9@><>{T?R0vWoaKBXJ3m6vd-Z4 zwXx0Atw&J%7lmsFG`EJ41Ix>io?5b~Y;uDb?ROAr_Eo1wf7ng^&2!yOE-DN}2Cvs; z#m<{Wh9+B-8%grk^uKWmlszFTweE@D_P$rx_D$+n2HZya4GNPb)yshM1^t@|Gg;Nf z5?;B8`ua#D>(XN3=Y%64YXq!VaSOrr)%#RpO*ZWKc_zs2d{@?f)?0h`H#N$~(Iwue zk4563d;xp<%pD3}QiIs>ycubwh)c^KzgB#=AnGEtQ`Fg)VH3*fhnbXOh#Yyd4kF@A zoz928^E}L-NbsB}+|p2`tKtP(l++e-#u+$eNRi;D&G63bkp`5f!_o)EO&-Lzw_sv% z{bE67LAOnSw<=eBJIFpV5mbP$VasmvR{;d4NOark-al$L9RfBsHIdj*X6uzHx06}3 z>xsMSJwLF=!Zb+Cv+#*mE*cS;C1?Vo;6D13txhCWv#G&%aM&92*&j)NQX;SJj>e}q zUOK#pG3a!tk`;5Vrc1CUFl9Eo{tUpF%rHmn4=>?#vU3AscvTC;cXlHZrxMFq9!<2L>l3-}?0b9Yy6{Lh(BTeS zTVu_P!9dr);SS4`k$kiL0*eVC@HUNfu|x)TJm@LwnbEZGX`gJv6B2|HxI17^H%t&h z4~T}SIP*e(12_sYX*y@ji%4sjy56fCt! z`$I9ps;Xcvo8FjWVG9&S$O9z8!q!(EcLHn+>V~rcTB%I-ETzrNBy_@2_=3==!?EJJ z&fryDmlO+&^b~s?0Jm`$ai%<}1esn-O;K-nYKw>acg&sAW4#_5PTkP;%eEA>1esm( zbE3h*CKqO4=RSd&TGDP}>{kC_N_ME@v;g{5=N-n;RAzu}*9USm8_1lzYKRaKu9lWh z6d^ALF5-El9=}W}!Qf4gXlz6fQm3a&vB~Ca=w}Sp4eSPx(_@Y!5b}OdG?rgDNCH!4 zD#9;o!OP!^S?Tu>dgRkp6C#SZf`=x)HcQR zzzpq%>Xp_nxZonk#;@N-a;|3rU3WVi6^08CH)G?w--#fmcrTh#)ZAA&Qp1?14L{j# zZSm}{yA~k+sBE5vaBjIlcE8`&n3qsnh;iCj#;Ig2B2XEHQ z=7MrP+^gEJ9{$SJ-xe4do$M#@ya;@|d=+HYwOLWCn0$aJ3Xk}kP}j_wQO3r;5EtM{ zOZ}m~;_`+cCKWXJ8pLF^+qN$zKPlq%_M!OPjaxlr>-!!Y&9NG=(D-?>+AiqvfFD#W zz51~Y>KV^d2NG|9>LrlQ95y^tS%@2Ntd(*cM^pD!<6S$BunuU)cM+#w6lM5I!_@ER zKGuz@?)qf#E|XRXe!D*vCo57(6{&z)N#<|Pg-m|9yoM7K?`M0jH{hU46eKK7pYIki z>vs5ux1y8h1*cnNA*>=3cs1<92cNt;vL-~6*7wMZ*l&WFEpIc$L3J^U>v`448^d$- z6VKx$kF7-eXU=vg=e7szw%1)H(NJ~ACxw956})A+gWWVfCtzg@GCl#f$27w_XnwlI zZ>>I+rBqw7HxS4<3Das`GgrKApr)?A^Ut;mH6M~*`! z+467eZJ=&#%>&PCrIzbuAaQ=3y-BR*FnK+lwJuAmyKr?NP%twPsO1nI*wWvDtaL*5 zAC_Z!lkBmP5FEP$W&C)Id+w?z^{E#0Z2T(@0Q2sb%D3I_!eVy#nQ+5ZYQ7!m3`yYi zQ-SO9r;hvJUneg{WK_zwr;|X|X+AJ}5TmXnb;fVe?~r6n^Q z@#^Pqwt~I#U#^@XaH}w1>#nYJ3^}nf>DZcb7js(2nZeooZ*gb7xIV9!v;@%OE(1(+ z7K5a-RE@H}`*J9bRb8(rd{3G8IlBTk#aG=yo2xtp1IE;7)jlMwy!9twqanlXroVxx5c1|C2nw2#AfyGUi=cBMX;F8}#>bBZP26&7WU-(yNuqKn zOg$%Nd2anEXjDqTSW@YN)`0mKr(dm+q-rR0h+a#Q9R$yDrlZ~I-;@Lx9bp*gti))W zgYy-uoX+d>#8|`S%_j_dIn_1?so#V|IEo$$46$Ip5jLR!>E+!|pOALL^qdJO4tUzy zWXz34&p+8(izg>kS5abiTZ;+%2f|U2h*a#)Zz$u>?9pgw%dcnOYzw;b2#h2?Ncoa^ zacb~A?*UkRHHNN)E;%YTi) z=uje4R&!dVxj0#OF}d_&im*2!Re@?-&Kyo)vb=0<#8(Dh;UQjsmK4`&2vZ*4neBGE z>Ps3q#x1PN(CO%qn}X^vP#UuBczk_4l}5wN8qkKza}Wls1H0k9J)Z^wf=&8>tjW2r z(y<;>nWt{2i_O=^w%vvJROn0I*PdrZO~%8zt|IpKoYw7|2rXZiyw_|0Y?ZuAkk(Hw z~MHNEHCOXp(B>Z(^GLxRijg}gHc64R) zCP9wRJwnr(DWx19r^K2f&8~5$Uo?(MOyTuO;1l4PQy=gZh(P`zha$^g3hNxz%Zh*> z4&Y-SDT^3K7rGMgE;U*~9L{k=sp@>C!E@{JKUwr-LSB4PyTZ4~uYjgJ(&%e#$%kn> z>MLjCW!ftytX-Uumj>U0&hfdSA5zE+coKMqnoYegI&N#T+rsO3-=C z{FB(d@Zc3q%^y<>OWE5{29n{dAupc7tk1*)#iP#&R`cx3fxM}2))m-bH4E-(`&6YRVeW0v$K6au0OU{@~V?ztx8Fj z^k_OG7E|8?{y5V;!cN;rk~H`MtfI@7&yDo`dNRfBs^4{1ZJR22IOrw3qNk1^!zKb7 zyY~m8%k#0lB!0lw2Zw|zRYdz$7kd5Cgt)LU@|3_n+1Y$Yn8bPrOT7tKkni(q^8!UD z(Hz-jTYoYY4V93+GV-PGv&DkiAEVm^3qxLDK;7N#^?iXWF&;uyGU%e2(G@Cd4_teO zDL_Iv5A{DF@lBtl?{L!6#!h`^-c33@?ILlPvl3dcq=}F%1mFTYu#F@?BHSI#00$#E zrKD+rt%V^$M$mZ^_SOrC+n(6f9XANTt_uYc(v018LZ7~vcDVj&K`;L+ADnQ~Se~eb z#API?meTzNv}IjHA~h{i@^gG_A73G=7r6HRkWA~-+kZ}60}Xin`!|imavP&9(xA*c zB!le!{Rp3g$cb5{!1I{4SDt5!GiAwg%RXgp%QMT#Q;A$p3+TrcXHOmX$;s#QNJZt; zoY;)2PQ2z#H}GutGvxQ%kK=13cYvEkPow#);em=-#<>f~MRY;G6V+j%{c^^>mMaaJ=d zd37y!kbx?gJgq(j-}bb?6A9nTfKjUKHfcPS=|rk<&~iBV-SKX8^Y)-{D1r3fwMDvl z4^a40F_8xDsLTqy-Ka^sM9VX$(WajLhr$mSK7!^}tABSU>`7Tl;}}yz#E=)U7tO0U zlsR^EIOZXv|L&TJTl>0_AL+}@up4Yv_ zIYz@5O~_Yjz+^<$B01(sDhCRA_}7iQCzG% z=Vnyc`M(uFyN&%U`LCVTV!~l}Og(9`C(hZ(%a;AA{9b!*?jn;!vXe3+t>RvqVn!uD z&r2U6xH2F78&=CQS|usV)hklp-ahcV_zcvZZQtnL4tJB2#d_XspLb;J@mAe1Muu`P zd-xDwCws?&w0staDjBEroLasqHRCxwK0@B#R?z;(4P1Snn_#F@=ZV?jouK_#)OyTb z11jC4B3xUtN9b8L;*9GigiH|Qf9xa}+=_V|zx%D2 z*Ubf@+ug%5v-g^@*XN?*^YsTOv*!?-*YizEA7O576;5^63&tllJ4U!$(wTIFy!4Hm zSkUl>=QN<@dN1iLf)py2t4%z&1KV__nqGZ?i*IfI~QS9cRvQ0vuc;f zC$K7$d4H6+u)4*^?fR7f|mp# zXTcqLWs>zpw9N2Bu3W{du!Yd3v>^_E-J|4bZpH?T9}ngJZOtwU6WtqRpuUVWC;1VI zJs~KL*)zZK&=}eKV&zphXL5{@*JMeIoaR>U%b~b$jM;zb;NoodzyNmn?k>Z$q88l| zkli<0@wXKRT)Y!0CIrdCLdZv1ae##RjL0&qBRNj{2&Hv(J$9glRBFy4aHMklG#(jm zEgrVY7Vnrv#Duc6i#zNThh$*6E*|Mel|0v<%7{r17Hm<+{Wjokc~t@QT_jianY= zY4D_!7d-OeV`+m`getk4T)NNT&ZkiejktZAy3HPPiM*_fR+h{lFJJ@U@ zhyGc7hp-M7?(jLORP=heKwqFzgv@K$A#+T%Y?-E>aI=#sZGV(xy4*l+&1VnJ30evQ z5}Cg!JGv_&5z9~aQUp_Qhf*IqJQYkYEpH2LW?;yTRzi9Nop?v4W?okkoO?&qB*KQ6 zjzgWp-w#H!{k?Zo>`&l@l>o2Dz`lL_o~wEi_pk$&6$yI3j!J}sG(X^t_e@{-ouHM! zM$b@7Ug{!BLws4$cbE|?#u;3PG3}sjQxEwsX)^O-CQIjqR_%VVO>7j&^Ti*2+B$#q2aVK8vyrHG5 z_aEwPzYN_^TZ-A>ka z{(H5Q<*LPi;dm8khs~fP~GSM+{FsI7D0R-3mO|8O@plYuwIl9@VFK|+DI~DMOCxI{6>0CVuVJD(%Oz~Eb}))& z@xlod?NAS~%KIk!fFhhK=7zq|R-naT2*LpL+{{@XY&`qkGc~-0QZ|l1jE3c$&Z z{vx)r@%NUNi8+2|_k*{^w2j5_%qKyEAf%Haw&qx?vs%b(F9-gg_KHJU>i#IHL@Duj zGH?!L#Eelg4g6gx);jOc`_mH|ivgPNnjQs-BwFK;ZVgB4RmZ$9YOJn+Z@vcLe)UW4 z_$PX0xBJixOipuCEnmWV*FQa+K0xUKi*>%dWlx!3y{yUMLC-GK$V3?4mhAGRKr6qp zxgw7>wl6PT=jQgr)e^duEH&v}>X6Eqr6S0$qNu;|JC7zSYc};2EIe(5ILTxhUw`48 zYHTG451J z%8(zKQeukqS7OnJ?|Shc8clFU)V{n0Q6^c-bIH|}EHx1(6(e;Fs=MayrV!%~e{k8&?GXNRMUJ?-rkx2KS?fBtM#5mof5~D^c;gNZd2S-HR_B@`Q_K1E$KU1^6M!GXO@ts8LxxC5Y(;W-)(*W6FUp@YdXeTvYpJt*3GwSFqKQOmk((r z)DM+|BAsNe@LsVcLeuAV50eH80~qskP9qMgxM#f05WSk`V}-t9-UwX1p*h9qAza|C zyKy>p19-+28#|k_K3d@BQP4NHRFk^IJ)VL2!X{KvO|M`2(VwTZmX-ur`p+B~`2g|l z=Oit}a}P^EBEU7>NnNO6y3Jx6d`$E3@IuLAy=d{ibUQIY&-(fs8WmMVfq}zl({~MB z@)=9HW(XiKtBY3yK-a?e`}d<=jQu--mD|`+QR$+fu};8&wmuJ0t3`PqI(H?)ma788 z9}57sbY;tMmbinneP0=~RwC0$@U@56id8pQi9(TF#&pcNObYy^ktXuzcg|{PQ2Z{k zgvS-!CTytT13+Y3_)}ezOCZhu7joUO1}E@4fPeemPuHciG%t9gm&y1?!cnS5Pbp&W4=1N72d>64my)C}Ok?C>teGAHLVfLu08{~wq; z3r;teLGX~4qSOl^o%#KCpOk%8bY??K=D0T?=KGmVJO*^*_p>Ld<1owEmCj!=U1k`G zt#pH0j+1(cklnij5$$%z2k0{B%JCcQ2whjyj}k1>RR9Ez0ai0y3uZd&EKmzpgs}=S zvY;B2X`1fIDyhr#5DCs~Ghn^L?aW4tVN5PG>DJklq`u*p6W~v77|@JFn4P6xg;*gP zR#Bf07Kd7TNXCVP+45b+!Pz<+*VGmFEY-*~ahNGi-Z;+}q(pv&xqd9%d<>!3a$5uE zw78CL&q$t87+^vS8B7gF9g)W+RF5p}US4^*F8i;|-96Hj&fLKW7>Jtv2Uxr28Os2ln2 zh>*zB?&Z#b6$`~m3K0qL_y!Ol-%$)zBge8gZu7COrjAECYUFQ(pnkT@N3Xro(RK;SZLkIc<%&p$UgRIo3sH7kp))GsK*6Nbi!o#E=K6 z5pMR(BD(M=;NZE*Z2;Tq2$Y#ZrP zvW5^QQJKiLB@T0b#(yrS6uXCC*w}|Ps&rTV8x+WkYeACo9WvnmEo+Uv}1}PmC{TGi^snr=uBvJ8BeN*_pGSbBSRkF1qX7wOuDh*Cw)2fAwEFR-fC>2UKt(CX

JS%27!~CMd4sMdz?ua#3ShJjzor0fJ&Gq`CVWsr zgnFTIWrm+JATb2Oeq@GA#sM@ZC5a(jIBM=rD#*`5y+_c|KbE3RdG;i4X(Y6Qj#obM zq%eIo2vsVBlJ0=bG2FYKtmE86>pXV;!{QCeI?nkwaQ?N#?Twty!NMd~2d80?clR{v zY-6YgCkwHXo>@L|#buGy=+22@=DkIPy}8yaB!f zDJ{}(8uX2;;dnus=RX_jL zIS|Gi^=y0hl=~h6+I^_qY*=t**)9hpRqL*mjG#Dp<$aBvED3mRj%Sg=o3k)3&ZNp) z@Z)qSAp6ey<3;2P@WHppvbl?JhOex8mLU_I2PZz99lxN^7rjWDaGG!xtV{d(AGQGt zI+R;4`>q|VJg~|cn0k!S8|=DB2)`v+7*m@4qvu{8J@Fylfg0$CEEcj=0AaGoGq+R- zT;xdS?n<;>*-w5xYg0ZUzh6uCPS9X~tBtNnY_=|@ zDD*oaz3CSdz9xHt&4b+f&KY(gRwdxayoq_`x(R{)IF@)Lr>-VJCW7s&*LTvvgIRI3 zb`DHawxr&WD1pPHgo~dEF7=}q`P@3&FkMC!3vq~&gCyK(C;27sp=DHS>(5Z2 zcAy`re~4+%#hkcGK#X=7yp3tw{i??#a5;FXov$KJtL^mJ#HO33s8q$9ePwPC?^%14afYYe zs6l%X2YaaXLh(R^UCsPWzKhV#g19WsOUVhQfC>Ua8*i#&PV&?O*-x4LAb0D%fVRYHc2|c zw2?rWEDX}EHzL=|QVCO$q`T;x(w1`^3-5zPy@Q>&*K4O*mYB%_#owU#)L(GGwRWuH12~7ZB{3SYUNgYMH90~d7IoaJ=Dbgq1 z8#1adY~K~w5tf#eyiERXHjVX{CIJT9>W+hFiMbC3_USd7v4W!M&HVm-Wdd^P8rooHn*Zb3+YI?Af{wMgkkJ!?TC3X)h&q=6XxpBF94jIl{&7R=LNB5v~LC{1-2T{G4)h4B9T1jKES(e3ZqKH%CFAL~v`}rVI!OhE9Z+POllQG z?qy#ZttH_k>q;1?@Dr3j>UI_N<~Rp|ONSuHLTL`gS+u}Rov?PEl^BAzn^9ofSM@yS z9nW{Zr@!W{RHv!e@{I^CQOR{NB(9oPqRg7fBC*s99@~ak2C*_WcHU$?2-`{D7Z2Jp zy&*{s6t0#!QTw!asFb;!BpLO%EOybEzIA|qI;tS^RIJEECn}YYNsjfW<6jf;OoiJx zWvJ=Gk>?iewf+Iq5ThEed6m)_c}TjwF~X*48{4_K)=2q8lVTPdvG4CY8i&$%{Q`mC zr2APqp48FULKd(+27H!|@74io_$pp#o9nu-8pl$V0d7ojZ$?-3*&FTp>?#;b8wHgk zpksQ$Blg6)-Kl%opJmKA5YzJ<8q1z?NI;)nnqhnD(X^hU!GUsX2<+Uk6}5XhLvp^K zaRyfO=XiFZaGI6PC%PE#q*l|PLxC!ei z3(6S%Xf6UOpB}(AoIX3p2des;1dE$D#vYci2FOM1YR|{@5 z%L&M&0CFQ>PC=6R`tXfv?zj!f-*$#wp(cLvxvwS>lrC~| zsYECh$HV$z=GIwC%<3UelPu_l2{HJ}<03PSCYR#zDZ`2u?XoKHNWOJBRGV?~=#+oh zj|Znl8H3H!aTHk_#_6`Yg^E*ZalhqpISNl`{%g{e4gA&^G~R-Ja_Ghgur^Oo1C3b4 z77|lzz^gf0ooO=$>Eq(^cw`RZ^>{Vtqact}aD_eU_rZ~%F0ZsOBr?Vd!IH3CUaR!* z?_%}bWhHIRPz`~>UOF8Ah;&rs*|%KZQ;8aPTqN7lTu*I(sRn4kZ=_wVL-X)SNoQ;1 z&*-(<8lWH^rz--24G*Tbu3jNt{k7g{^RxR9n~M8g4VZlEupzaZ2>HPII}(cC3b-v5 zroPKIX6W))0G$~!exTwSkRnBB*;S$7?XuA7&9xTw_XGHkQ8f7eWWn(s?ds)ZA+3ej zTZoJ>j=Hv7Yz=d!m#jagfTyup1Uw4lMmcmj)u0JGKyrPmvogj@gPL~gW5<$&N4c;~ z=+8wJEBJy&5Mf|^>A{$z!NW3ua}8!fd$=F+zm^er&~M-%dEE*pSMC@wy3xh0Oop0X z!@D^6WdcE6kBg?D=yP@~i(V#;Bie z*MO7C7$cGRMe^Q>gQB)kx%HD-oMgGd4CStw=a z?x8b>1a&1PB~8L_a^2(SWer#T!np@zS)d*qgAB>e%r3Dy6FJ={oUof#n>-o29DI9i zOEP+PmAnJ^+RBm481Xswsg+Fus=l5+aq}rv+Yg&mekahfVnM&K^>(UQf=d z>}$lT8{3$KjmoeCl;2g&(6I%C_8c+^)5OcO@c7smuFk`3fZt~|MiYjFZO273jO#>y zmzm~uWbI5_vD7z`gJ4l?J<#C$FY)TYCNk$Bg`sau}&XKR0+HU=vnce8Z^FZ9F`C2~JQ!d2{>E^vE=^`rU#v6y?_c(L(?{{(_hTOigGi>!7G>H5@D!ELYAGLIOB z`iD&13aw!tGal##Mg=gtG7WiRi6Y+ahrckKh6OLV43P=K=&*zH%Ii_P9@0ho_b4F8 zaPUWN5*%a`5m(hxw4$qH+mT_5#gZT%c^#|smd04*Ybs!qm5ih1{w%PN$JKgkr5>d= zCDQ{CwXto=O(d(v?x|NOXvvX%y4j2HPQ z%<)0{SD!e)mVod03yeOaE5_#+{IGNM`VJ(Xgc=7T|EyRPBrzX{e7_Y<+(Y}3Crn2oB`4QW3;wpT;k^M~q13nH$O?E3VGYf5UG?OL#ox!LRt zdT;Ecg&yhf3cR?#Wj{ky5`Lf162ucu7o?$AZ#;ZLrSURLxs7cM5ea4Ly5{QG+&_3$ zLy;o>$}szkJhaH05{j{S3Pe-vkcL+DBd8*y40PJ&=xC-7`;0)XNWWq_6oqA_BqLOW zlG??JfNGe+eSFFMnpq)99vli(=mA6Jw&L4e*1Vh7k1z=mB|Vpa6mt|Dn*95Y7Ob|N zvep`f{k!+MRaJ1}gWgE7A!7I{O6G{_v`da*G1C;I0rSLJCUoTHfmquNvt^bd@CRLS z^%Rte1n2Fr+WUvvZwEgj%l-C4KZ4Q)n?(p!49A(FnMs;g#Q>!l=wkgQu|~5`VibCO zVA(_e3)ny>zdP_9jwOn_2?pU$+K2hGn~F*jwPoXx0u043cuADzB|_}M*U|sMqwhy5 zdkePeR)DPoA7OmW2r$bYLWJ3Cm=@N8q_oR&p>0@wI@ejdsK>HCYc{MEC6W)x8Sg}P zvt?LHSY%UVY0Gpxv&t~d4)lz2+lB#?JJ~Xq8LcJ^GNOV-UNtjrFVZFtVqfzwFXwZ% z6kSOQgq!0!Ux(P4PfsP$P+Nh9`U-?Y4XCc1hiEiNb-^Xxi(sf3jdfMDzM2LO%O3d{ zShjV`imYE=`746u9jBx1|I51n3S$||SN3?UsJfkQgn|t;+u&(c<~yl;-ri1~TRa&P z3a$V(5So_6gAYHB=ElYJ-QMQ7YB;1|K@nYr^%_g^AlbZehwmivx%c22^I|UU+0!_&Tw#?1P zPFWw&=`_;0=i}ITZ=|$llb~oO*;QDZ5S^+`+QeF<)mo7m#!EL7GNkQmGt36kw!A=_ z9+#80Scx2L87pE*>nOHXf~_O13R^b6!ra5w_FU5e9L(eCDYUgG#=4DYB!oWw`eNko zzoDwC8jBZ~W5%qxIOVi6QC&5kR67^;+;ev{H8tSA`|m?TV-=~?Eu zaJgumW=?5aXuIB>Rt3d6O_DX6-7eNS>@HJLZ+%87ns(vix@et^NSBP5(iT=ZtTs4l zyY|OPZwCm%X6I`VhTdr1w%sx9R1TNr5Z9}xuf^&(p5 zY;*6eG9b$5`{EJL$1ty5mhTqlE3etndT-1d7Kt>XU%&qFc%1Z|=FjRY@#R;a;mS+T z$Cz=GP+wmTx7$bWi+oN_^Iqt3x=da-mCK(L-4h4hKfaFk_gtatK@nYr^%_e!tsAmY zW1`X&b74TS-nN!g+g?8txc|C$NPV4!A8t7kn6UuEj~s$O2J}KjM8o&z_rt#j7g8hZ zgW-0ed@3+`pL)#10@8fn!p}Gj{}9=ofJg8!X}dmBZ@0l>45RO(N$+(KlP)4n_-M?* zha30AkX?o$74e`YMT!J9utnYg4$pstPNolrI))-F;;vdJ*pBF`_IJ&~im;#~Z7yIv zg7)SMR;*lPtj`21wegfxWutNV*UCz0skA9!*Q*Kp<5)sVtGTj#^OQ9CJsRaKZqg<< zsY_*-H;*SJ(Ge;z?`KDw7{2;CT8EfcB@=OMv)%Uicii9DZRZ`4<@XRl(J**mKfL(t zV|ekE*HKeBAA9YwH<1zzM;>;FFl%7Nx2ke3-D63XxGW}DDN=^3D&`VFUO*~e4LrU; z`gkt4TbMqGeXHgYSqi~P>Z2f2bd%g}FOjDz+IJp(=F(JnoQ~-*$t4k2ms{*xUA+)> zHH+Z(`j#9-P&s^@79!;})$`?XXf}t*W13XM5al*DG>B_+d;N$-!{U0v;gBGWx>=iC zbj%t$pPK3g;@FxnPNQc`6{)VKf{s%w%{z2SMETqs>MDh*+E`yBRB~Td7Mkj+QBC*7 zVRzE`(Yl6ex=-_H#*0WL6HY^(Qz}XKuW}B3=8>`<64%U;Ml?EJHJxj)r3o&&r`6T+ z{`39jb84dUo_OY2jQH_Oyz<)XL^>0n({Y;` zYT@%|p}wwy?#*05<_+;|Jm}ZAFD8y3g{e~~A`xq*?ecN^ZTF(Kz6tl-eJ6Z@JQ_$w z1wrO}Rm0Dzx(r@AUokMCV>D2?{P72}QCqWETt_h2C`hkrYP&8J(N*Y@V4@odC2;;Q zVh8ce6+l($AT$oh#VZe;fH9>k-T6h9w83Rnc=D{?7)z|7d-Y7rulfd)|NRxskA8`5 zpVjccqvPm{EpQAG*+wkFaD=cq3h+C&#QP}0wb&Xb<2!7He{m6};N`-ha1Ah!4N@=I zHj}!9AgK%8J#PGHl+nq|!ja+bL|R&?leVT~+cS44tYMhqdWU8U>9o2)hb93c-fqS= z4!bmgU~>#6v|OSs!z{s4YFTt*a}5Kn$Bo8XhdsRB;WpJ;v(-)sA}$Fpuh-4(Qc1a< zCJ-bkS_dUvYbv_AxdCs#^@>;)3`ell);plEushy*{}Zw7tkX|MpT7Ol>S=9lElNtd zVdNiU#HV-f?nGF_LJh4UQg`UV`(f1Be=&B#B;0Y=y{KM1M+|=LHYchUvr2q2Mvwa! z<0nnSS!bSxhK33{4<`~dTF{dr-2cFXm@sK7{u=WyPB{5EI$k*fM3h>Z>(IAvH+=KM zZ%vPe#NT5lpsIW}PCfl}I_?add(IhxsQQWQH8<6v|G+-@{Ocbu?%zrH>6bsS`DUBa zJ!>N3T7&mL{s{Lz_z;n~azO-xEwvc&+n>1O?)!vm{ttcH)sb{&!YqmDX6obx~9C*#a>&mnR=4<4@UARKo1VRUaIuxk!+%`T5k z-2anKIR$_GJx<)?tFF2NLAozaBE;cftyq5bbvMxUmlIij1Hb+`4ub~uBPG9@%825c zYpxdMX9xVa=YfZilk3NV1@rLd-(&FSZ@|Emx(Apa&us8 zGmuZL!NbO&Ng28wX;Fg)Nu4aLy(HvMawh^dGWM)D9Pz7l+SP-uIb<}t*5nadYgn*kQVz`04Y6TOMayO8Ot{#N zw`avxG#LhDVi8Ma)-#rww!D54G=IL6uB%cmFU`KFsAub@;s{5UC+wbj+6B-${3@=R>C`QY@nKmYa@_TGJG zoOj8Uc1ZiHyC6Q=uGl%Jd4=70kZ#ehvV!qbmFNcTA@O)}_(IPT=r zamq<2;Nbu5k0~?eVDpU!;+_W|#|>9s+U6LscmkVkzBQ8ZX3U?zK$yGCoIMX4)A?Gs z>iQe;>{HK)0fWu9dc9wH79tdGA|a+}soU&5_-x#E)QhMK(z`-^Rxv%UT`q>ge}w8n z71moUX|~WxX5>J_5YBmNwnBZ+9ly>%MNNC&4~m(Ua=pMTsB>(qtl`Wox@QfQz>ja z@KI*FYX^GT0jy)H+e&g}_%E4~*JhGa5qZ~K4oO~Nnm%NZ);JHqY^{+J#PKxFs)sfy zeZ{^e$z`Qh9N9`G%w~?JsYRS-FX9o?2Gl%HV;xj<*)Ec&z4LNg3C)7}tV{;z+9Sv< z?18O^4kZ%Xos`BVx+X~q1`uI;@X@Dn)2(-l-*&pWhaYhmw%KOuG|4^hqRX-4F2m>^ z>loOtFYdhOK@8n$NSfrHe$GYMeb0Tw_rU}ElgfJ1a8zxVjD9jER#~gbsVv!(@Kkhj3`%fyzdiHDwJZ;)E9C_?1qE2-0Rt&G( zi9Po_lAv;tKaiB?uy7&_1)Ffdfd{5Z?zK1Gij6lLA_!;C z(qdeH!~ap+SR>2#dGXg@e_^}rcS0g5rzW0!@)11q*h9GDn(Ks#L5j%xp+_Ez58i$~ z9i@X+{er@hG|7GZsb}dK_D6kVGu$pG-g^5DQrcs(?$N(^B!Xdk9Z2UF7RydK;Y1>y z4Z@T~q3b~rU4PoLc09>QN8_h+|A$HQf5V5@ zd(kkuH~Q$?0y{j1uTPEQ(PPd+LDi!;wf0RaEEm3@4{sb6A{BQ5>d`<-?o1-NV^E21 z_yniZ3l*itxDJ(@=OC^X;N#)~jGDV8f~n`x5`7&b8{fp)xWGKaB%COME8>E}x&tdo zn-vW~By2FWv{`{}w5qL!sho0x7Tt6r<9b(5vpc~c((#t8__v}&`X3L#gddJcR(U1! z7ACwL){NuiCQb8l&0JWe48QnW8& zzkVk*@)xme*IjnOX=h&~zSq{);q{lE!5_bl!~`OvjN^_uj((32-)Y&=Me)}E7_SR$UCg5lr) zfM0+A6R*DdYTBVHJBu45Gx-Nv;{;!N*;SZL%JLD19hSZohaYteZn)+$-2LEF=-;nD zCQhD)U3S>sym>ki=4O2P?GNJTu}2;ax5tZ}carPhdha6yvRW18d+&J|pMLl@YU&!q z@5i2e9wUDElGN^n;&(9Af~{yEz=+cb>-E=O!Kg7~h;&L4dD5xpkWw9z>k}zldhvyL z>y76zZv1$$tVgc_BD7aSeVzCn3dgWu-dtqo=1CJABB93|dxBWk5(?3v;Q`E^eq0vUF5+D>U*bC2Z?pPWNz?ZhcHC(vG&WQT=cs738Plgv z!MM@CVelrKWz2YRrbjysCcSBroS>13k28$`(lN~>mWhOXulVvkF1PvJNH2>grK0K2 z%EscddDw2}eS}iW>gkr755kMjKZUC53K$tv*%QY9gYn}h;M0#k#Iw)8gyT;*nd*TZ zv1mjP+THis2V+N#5G2({>g4#bqa}F~=hpFq2ocd_vxm$m4s}FIKmXzz+;Q`jIPK)) zu()C|Di$x2!!m8rO=a0;nk=NO z0Mr?mYd1|n#GMfL!A@C~z)@o7&l9Be&z@(hpEe%FVp&(J1t7j*@=6!k5?_J!UlE^7tUs z3_1FMWpn0A1b7?8)>>U2DYoqLpjmg#k4F*|29DrhBcSqir>GZU;kj=Fn3Ot zY{%dR-3e=QIYs0+>D1A-fmOB&YZa!wtez&eRF6zsTMKF0W!l?Xgw;}fx$ozGHDzSP zwl!pZOr%Wbu}m>jlV%C2M5}6RWk-XV7np5qdG^&|atJ}76H@I>#x)|2GH$PC(mCcM zZH;2q9q^PoCxn!`zm0wO*&Blg z_7Nizo=$IWsKo!>daKxP(c(%B9?%z0Q+al41k^4lwDs$;#~!5z6~j}{NcE8k0;i%6nB-DTp|O)73xl;6uU&`=(p2 z70VVbnvc4gs&pN25~1FF)6Iy)$_NzZ{#_Dybr6qk2 z?3PWNc?~w@2+^gXo~}ZdL`rn`DJ(39>`}Pg56kbYijgoYv!&5rk6wrW_3w%LK7S#P z!vJ;n;FLG^#@xdy@n-xN+W+~I;VqIjrtY8+E^ui&BA4SvMaY3A3eD-ln8b1nK zZ#hJq@`H~&E}XDF7p1f9rWO(5BVt;OGe|0UKhAQDzv zRe^^denR|yiwI?irrF1h{sRLC^dpkzH0uc|r#VG<@PYfqcD=fH6R}=L{`6g1c}{Yg z+KlVxD`NGMosro_^~B?j63fR=oQ4Ubf5!MpasY7G?KcZ``iLWs5Ou)o^N^Y!h1Z{p zC!c;=+_%j(8Ys4X=%M>b%`HV;_2Tq#!jZ6uf9rHfGHJ701lJ^{CB<~lKE}*B^NEOh zuwdS7gn~ibfA{~Pu%M90bd*S@Nkr+MClXR6wN!LV8lFCLf%x06S9cK|!{?@XEPsFo zEZy+l+ppuF@&AhT@4fjl7MGXPfK5YFFoIiey#=M+OU1g{`bM04&e6K?(?aqoJC5u zJAF^$aXHoJ@p#PZ(nNjK+C;Zj=qgY|SD{Nn*jbX&@zYd?h@C4!jB#yeQ!qy4wy^SbMIiHz*GPe7II-o;FA~9ezcC%fJH?|x=>MOAM^cnc{t~c@K zH@^^9F2_VVz(=0#@NM7>BCZ?ZV;qMGz5YN&@k}~E4qCn8ERt(Yxw$dYxd?{KPfDLs zan~g>l|-wv zp(agjl2I9>w>6)tE_GQEKTPhMurlGA3a+sFwCsvaxmWTL^PuZs@67~_2}iIwg6=(f z;GPE`!L(TmuyAn|e)#!!?7ruIxbgZMP+Zy{FTeI0$}4Jd>1CG^>GF%1v3Ec42<9)U z#1oG`fS!Ff#x`4RNh;v2L{6))xUv>+zyAsP_8BN*&gK`CVy7Lp#)FSOiFpevP)6$? zq3;6+4niQi2%mrYK8EeRKYkkdmvB(3s%a!;^I2@V@kZ$0a}fUT=9_TH5l3U(#OY{k zY{6fn|HVOv9gasIeFFYKzIX;~C;Q{@Z*j~Cr(!CRzVCh>>?U&rsF>)rt!HhG_?fr%a7j^DfFSTvK*g%^*u)X{x|;o^=Bf-*?8dL zCoy-yV!ZO)lkf)eaP8ICiR--e*1M2b&;wfz8H!tOyA$&kRiLV_5$}KW1qKe<7|}=y z-+ntBvxo@ab>G9NZ>XhvR)~A=e*_iPjX3|@Q|TEEzy;@=ikIK`fC%#fTz2_Y!VDrD zi69aVlFHi`+ikNg?tADl%$Z+~#dIAnzWf^c_hb9sRN9d^;P+yqjfdd-Uw+4=sdI7M zNvGna=bxuRL;)uLJ07Q>bv~xfn1|2l+J=Aq1)h5Pc~sWW%-dy`Bal^y(@!}Wr=D>R zrqDJuwGH_0CpLWpqhUFH1bb;{oM$R`f~&dOZ(yFmtRFiRUOX1;5>MUOef>f zb|!ENT>&b*SSLb-7hAK)%tj@DvqUQ!DJCgiTMFBjw&3ggi50LPhNa@h%n!#kjSM2z z(2P;}2cv2COR=E(A7sCA9K5+cluV~>%4VW2X~$c~^~M47hGYBhzCdYsph&ICs_Yvm zB&s`%rbJ6|dF_`Ng*}N&=i{-HUczT5o`ZdU8-gG1V~_1-^Puc7!FGwvx&ycZ_u=Jk zV_-zGNHt7f2{pEkHrJ|V*8Uq-HoRD*4j6Vf4NrPN5>gTORHpH@nYOt||DT}=)il#a zHx^^kBZ)4*%;CNuH&JupG#-^2@}S zXN-mFOXN72l*vZ~^`#9xG@&r!E*jshW8uXz!I$oI+0ocgL)R07lhng_G=lu%UeXbd zE{;tDS{ke2^7v_5JCE*#K?J#xW6G=^k*Mc>3ArvGY#bV3UmoiR-)n zp(k+bEjJ*GNGLzLhWbj;x8xV~5cjc}?oB)vLQX+9xNI&W#eKK=Mjzs5s$RMPXyD&S;j~)uB$Dl!CQjvQ5LeZ zb455X&5SY3w$J>G`8qYojBa`P#b{}1#AR1rjr;HVKO{M!PDu&E!5H25pis#S>ur)FYlX;K3?i6Q3VH`vPjO z`FY1v351&K#6ZADpOjE_S1(j}u{93|6cpB1EYS~ZZNBjg-N@Mmh}W0F#RQj$hakA- zCptiGY|FuR71Qwg)EVft)gb({{}1T<{b6wBBvIeZj(sM-g#%x#$GpK+SPlfgksogvpP83vZ-924GWsi5qYbE+xVv z+==i-&)=Yhim4ISGtNIPS?zoY;;>~AuUgPi-2k}b*&-EuU%u41Dl!AOxgvfk{lXOONS5R!i3$fX)DR=xLlr% z76~G3a$koT%>kyJu+)Or?Rvz7J`qolB9{+05iY)O>`cTCUaWXBd0{)(ZloH<;$gaX zlBfozd@)mGJ1YB~E@H`*>mBq~nFEb7)v zJb^foc$;~w>WVVVnmGfTZMre$%$|=tB3^tAoGDI_Lz^a!olV!`ak|C1=rrrot;axd zoTkPa9CYA5=vG`Pj{V+8pW^y!E~DcPGVg~Z@j^9ENFtw=olj)8o4DpA)$c66-?R;9 zh~xEalHjEQPA-v8uIvdS*nAF5Dw!~s(!Jq(noLRZ%1I{j@`^+XXC61iX~2-1R|2QQ zP0uNkCbyLLKO&S->{^Ax#x@^KYVrI!n_bAy@!g z%#Jg@coeA-y-1%;p}w*a-KSII+m~cuePb%D8+P^nfHLfhDoCdW(v7eWDlv@|+7=?W zld%~pNQph(co##^9k=vz!}i_)ydQZK6Fk6mQBstMX~%I9k>q?T>u=0$Nh06THk(#! zL{){g0cme*Gi@kk@&~)kN&sP#4qr@4bxB=y%@6_XtppIl>D(coAob-UqZtpZQl=uS zo7v19X8h!6OanW@vm+XtZrg={uqM3Wt*XGbyERn?saTp&aUBjrIJG&c?z99AQqN>) zGm(74OaUxX6l0yVT37;_Nk*B_iQi0a?e;e7qp^@loJ=L0F49sTt$i3w+@$}WmR^@$ zZ?rvzbzD&@ks-EyO_&nAcv=}#DSSS0B8g(LVL3D{3F&ATHm|`!WyZ{S$nyM{z!j3p zxb@as6Cvw^in2ur5CLp+p4L4ff*CQ1t4&0s2+1_Vr2O{p-w)evvn>`9Ib5`0J`Du= zx49ols!)87H1is`Z4|^_YrTIK$;~`24-Q)IpWR$%6Zg#u|7IcDW`8*#=xDp8-G4q; zAF0(7CX7dqo_$1GY#hTT^HV6H<$Dpy-H1r;D+T?`m#z@^WPbp+mM7J{wpRj$wFjA+*Nj|X zI-%*NJuKVA=%&J&GDUdJw4>EbR>?erNvkBAx{TbwsEBx zvPjFajiSViImUu40CczXlh-moGVh6S&~W44P*t1Fn4YRkyo9R z)M8R4V;z&rmH2Hf>*)Gd=Ke1W?eBkzT28+|hpN6y*#0t@059tqw3)qIsXCyo&^=J- zT2Mq+p-Us+(ed?^95l{_8K5+a<}izhX^=7#rSC*Q5hgh;PU=jvQ~phn{2I>&>WLk< z@NXL)-FhDCcBsT>Ln`2fQ_!Fm`g<&7odXxp z+L1(tk8WCo-*6JcX4%zhV(MRp4Ks+GXfjv^El(zN(+=N^ zg20*3*lA2R%@iDRh4AKPVw$q0$*6EZGwpiCeuf!i)eOrJr|rFNX%4~cScKAoB()r2 ziS2(g`(`W5t7Wo~&Zfq^JgKR1(<-acW*;B*Vy()RDTFwaOP5T+^j|3b5bsX;O> zGLH!b7Hf~Nt!nks*j$HBomE(2Dxrv{LMKBJU4@x*FIqEtNF8?hiH@QFi~M7@qb;J?g+6>%5!&MvnzkHH#P`Yq7o1_I zwB>Ab6|GZ^3Tp`l+Z)`2DoIIbgp-+Wn&mX>=~%pyIGd&lrfD~uFzDv7 z6mR%%5ciZws!-KQf?t^dDR0ZpakZ86(A-4xJq~*ZWLHbar2Q|j%sXthwbNc0W?RKJ z=j>o*tODhgGZ!{Raurq!RFA5#-eN`CM2=+O^V#wG-`SWvyM+iV5!s|enk&TJlH^86 z$u&3{KQjogB)W|(ozZ4>A^aYF9H+h(l5u$LVdN$+!_{w{(qxNo0Z) zRfkK5-O14wbQ+AvsZ!Q(h0P~v=Fq*#ozTS-#QA;eO;Wr-_EwVtxfFIwaDDy$sD zdrbr6y6S}phZ;o$gG`%T!*nKWO$K7L*_R1uDAobDqBHeZ9#RR3hOtPXh4^&(orHV#kn5r{TdP4oEgLv@`>bnB%zJc-vljhVr7?T zXp;7?AO>o6AoV)8u+<0BEGy4HQ-qoMyPbt^xNx_&7qLW}I;1 z83=_V;^y)r^!c*T60Aq4r4He6GraU$H?xN5^bj~>*N!`Gk7JHH1lL`AHHL1rt%%Ce z(o_ql-6iUjU9$_vEGCLh+FtBO6``f2Rzxu1=ne6B1o1>zkZcjYjQ)l~4TwZq1hGt$ zTUy84^Z5noocN=O>u`!NS`Ip9kjizry@*BQ!YRvcbBbfJvlef|b(6_BUlT`8-~nAT zt!F1Tk1s&i*&xWf*B21y%IAIk&9{hU=bnEa{pApfHnEQHPdL& zR9HJuL|0+`M!Oo^(X>BL1xIPaxSoSupC<_{k0h}$5!|p-+T}*s8O>CBn|+dN#uLa- z4#s5cCVmpdg=ohYZUsC>pGxAh&p!z5gR61>x%UCXY2EJh=|>+xCB33H031JFgLo&wE5G=b|q~$mf z@0IOtnV?ejV&{BzFtf;UYuR!KX|F4fz!4kdCc5};DQ~ilNOf2^;OjC*F7pM;&eyWV z)peMm$=a%CQW=KAN`m9LdOdcWdh+pNYW~6t&!KiCB4%I`@i3a3s&MkDXW)jLZo}?- z?1jaPW{9k9(iu@RmD3D|DOy%kRDyFaxPMC&baVKHtU3ViAT5r}nL&T`9t67BN!dzT- z^>w)TvTIOSn1|ZhGWfh%)aEqfx|?oCQ^R6xyy>RccDwDVJ*&o**WS!mD~PS#>7)Ud zj;pS}h0ddr2z4Ee0%)@afo{obLJrWgVbBM^>>6i|jbi#2W#_-u^o&m4d zNwW<>5o5QZt_+7CaV)OA`Bv<(!w#sdm~WD9l^921%|nG3Q&_K&IqlcFWXY|B1sSO( zf6XYsEuYuo&Yk-JwcIPYq^g@D!rMqBw~l`Mb*b=@TAM}x>gd}dE}@8)Rc8U0{3?hp z%IMRB)LSYF?+gUG&t`iDU>o{;<;Hm**w7s^8QbF?7dC+l^CJ$pg(v<}2uM3SV}&&j z5ki;9EC*^ANg8Y%#!H$6SfRUgQ*{+2SBy>AURRP`4*g{}4SM-^ILJvDv~*Z8TiV!H zGacE87)K4-#+J6bWwI2B$XL+qfF=klEJ7=GO{=#;MCQR5sxe0>? z_Q#i>ejxVQWV0<%RaJvcHXnkwUVC1Y+_P67dj6!)#$u?hD#LyEKa6XyzBGMKk34WY z9(wFqTyw>Rc>QSQ9^??Qk2K5za4^zGAI+@B$vZ;HCwDioFU zKu&HBrcN${%h^gVX3U<4ZMWG5et*79=wVYDo5Grds%;AEHH;<5Vp}Dp6`FAR$~q&V zI7Y5bS_6ph)|0aOW|0)aVMu2jn~aK(j&`6+!SvxfXW5x+LYgnO0iVD5dJIFgO;i!{NnQXP=9PrWRpu zJ7?Z}oO;^n;EaVIz5SXXxsxVN!RhB*C^Cl)9MBIhz5J5M{AFtwU)SUDV84BK#r+RF zly03q|Kc<;%b9q~;)%)l%nAI^|?iNf+bTV~!HPYijFAt!)rV z5E98KcG-3JG|ByH_)oaz+H1u3t1rI*y?PH|g97n;r|q^Rh1P}de)t8`r%aN|w%-bF zUk-}8b;A~0ZYh>k6Y=iZv%C1d>keDev8plrho8jnetmo4YEq3)Jn3GYN{3p^9%)rH3`*?Dy-M&kkT%N z9de(+p>(tT#kh0)eEjdXFNh6vGsBEg<6A?7w}`fAVV5xvy&NAPYIoyIznA^eaPNmz zr210hKa@1uTw1U>gdMIZn9Um4_tP?W?vDM6QVZ4l0S576Gj7u|tSVW`kq-|^>Av2n_5?V8ks%dUur2)1g zCkXpmkqu9>UF%U>q?Spp&!>rK3^EaffoMe9;9BMj23nI(NK*$h>{Lt_CKL{bO%Pr+ zL9lY*G_Zw5-SNez?_*(Eg;+NFpK*Ba-S@EPKKl?E%@xbeA@%i*mtVvyZ@evjA92Lt zVmjZ$FM0;}nH+KCF}UIS>u~P_kBMdZIoSyKeQ9SlPPZ$fWu)y`HPqGBV&w0m#jisT zK3M!c^NcgZ-_O4Inr0pn2nE9kH8+wHe1TZr+!DeuM;(DDpLiCx+;%r+&s{_$wJM!> zp|-vW`GrL|=IEpG?)&eFWmy3~hHSAhHr-@Xk&>8AYQFwd+dYUT$%R%e+M0kFF*SNFTVPg_`Um1 z+ld&!x~9w*6xJ*h(N$RQ(eZ45M@9`cAps|dTx16dF)|p$fccN3E)^ygLyR?#8sLQ- z3D-$VF2_r#z%!kUMvvKk@{swQl0`N^^B$|eOa zx3sS%p)O52E$1<7KmG_ZYKHof{Kaw%(~*c6F!ei{N{Vw5{`&C zxr@rm&HZ483tRGrFI=>M>Wd#!rcM*TZE{qSemIeENQCH$i-#^(ab0`-smI0d%{Cp3 zl5RcGy<4&PeeXSYBP*|1+HO-Bd3lmtwge+ow_@nke-qqw$1T`m$i`H5Fnvzdqyo1z zHIQ1{A7e-VjoEYNi{-<1-y3I~eV+I}amoxdkuq(!%WJKwYoznB!{PE`)^vIP#YM%U z;bl_}2CKx3($enfYi@34$F&?xnJATG7tL(>e10T3REVmR3TqIG=qjxD=xAz|8|Ede zw{!p#39j@cO`-V^ie{s5_7k|n{*;Wu;AWzmhl%(KJLEg@G%=Kk_7?0!hJW=nf}xNg&`&(`oM^uml~-Zmf_X%` zeL^8+wRZXpsjPM@&O@(W{V;p_Sd1Do0b$yAqfLfV-HVI$98H3We3Z`9Zg=9D7hV<1 zk3Z>n?7s8%;`?p4-7b!kN+!f_HaqA)a1%P76MO8rmsmFTpHbq4aF|N5m(*#-gt7mm zuX+Ci4ne4;1}B_!viRN9*oc;vW>Ssas%=wPqfkUwVZDdYLYJt?R#XF{!{stFm5wNp zjJ)jbxUZ!GUdIi%KKUjhj=5;^&d2C_1Lbg_FvX^~ns6*TC>+OD!(C{3?i@UI`$f2I z_!c;%Xh-bSxGPTI>nz-r>%?14UOej0K`tq4t#M4Xr4SCojI_{BeYUB-U~RxMQP514 z)#21hwK9b2s_W8-mgu9*na0cLAIG(2u8$P8J^5C1UAEjiA^)? zaMR~x#?^JZH8TVmM`AEUjA%Y3Cc=ivt}GLY)_s+9_FuqGh^bT@!C+AQKIDJPg24Rd=@?x0UtIZWGR79PaDc=U)-q9DBq;;_nkrJWlFx7MhzHMI9ahJbTZsC%xO^e9vZUhcBErrCGPdpQ-g5xneD!%jy0_eH zWAyFQ3*l%CKYsr;T}QUa?8b=26PP`75-Kao;WTZEUwwrMvK`emHRAXF`|cwK0Tpzt zUq=2Rmc8)IBUrGg9J}tgmH2({1CNlRo1?^Bg*6UEbQQV`mL!szsq7jZZ>!1dRw-)G zUCsb}_7XgmH3Ql9+p(8Fh#n<*_@dB`lqUukmGxP`f%|CQ`lSVNWM4G{m)tWPw{O{k zuYStL)ay&|*ZYMSK05~G`K_uYGsOb2b^-S^(7 z^YD`5ZxiiGsJV#-WPS|UY6pz}cQV{gHv)ky{4;JMHraeDQkmlz{+)Crd+EhziR}7m zpcF?q97JtR72bI3?R44S4F8_i=~Oo(>2_%*o!_Nb+#u?1FdW8J*WQ31fA|6Uh23z` zMVDa4%vp3Vk{CN?3{6ZqvCm$6;=@nAKsXXd_wJ>rAp(5K<=5h=#~*_~kS${NDk!W; zDECK&u7mU(Zrg=Sb`6dh)js2x_`gj=V_E%hB)%!GvY|t;|O_d@H#mbl$^j82?jJ%tzD{;+cC*ikrvh-L_`Ib z#$lAHUYJQEZ1P#ALm$wyOD3fvD{Wv~ZD&QwT`K~EhKy`ft+@cd{(hw#x5({=nVg>SK|fMD{W$YiE+KU{LiI2YyY0RQ z_TG0-8S{?1>j{&lqI}VOBG`S2j7xI_8^@rdwxptLF}B`n3lx=f7iw^QO*L|Ii;$IF zh)+NHh>r0cEo(wSVWEh1>-IWu?Txo#OEb~}#FOp@kSdVJ1-wCO-;xn^3KU3PB`uux)v|;a|^L}aT(2Mcu`o~ zgYHXQrTJA@<4{Cbp-Umdzaw+0Np|(6>|;u3oI9TWMw2oNR?2X~Pt3vQh{I)fARvSY z9YG%{K14L^8mS^;nG0@BCKj+xKu#Gijj=9+)ArWr4ltuND5Cox!S?)gzl%%z3zgQ*>BFfFNsxNZ zq}IhYvh=T@xEErPFg>Sa>u`qK5_$;!oDyN)5+xl458i)6MnR#5#}dGNXewB99%HxuC_k2o6l-+gPkgeRYU2@B>gA~MeoZwVr()na)l z%(>4s*^4Elf~Ti>t+~CXndXTikFsMyi(E%mO7J zs$rTsFahO+5qipuz@b_3dCfYdL#VaF{DDm!lG3YQIG531Cbxlr4Uvd06krYtz>aL3 zBqAM3Oq0%UtVFvV8dPll{|;8|If?&(u9xy>O?$)i6-eNOX_Sa96}^SMAq)dR$Fh66Hh!Aiz}+|%1h6SW${>;%3jiW zRXQNjKs?l(E<1f3`tWjVnVY5+o_gX*Fa;>>UW{+P8jipJ{(}_RQlS(V75BkamtTT; zb7tc8*Iy+v-Une(u4b0edW}qAlku2&Z(19$NF->6z0-u*kAlM5f+D&KT@y=*Zm={n zhBmutlICb;O4anVwJH2^5PvH)ltoY^zsNLGSP7DA9axdvbpmqA-zLmYtl0LcRI53H zX2!zhb#`IPOX`104ve@?a5`3LgKHC}43gZmnkl5CG?+Y?%@`a`Gjke;1xpX0w6u+P zBE=r=l1vM=m~DCKH%Dn;^_iFPdGT+DT`J8YJX+FF)oK+Xh#ERFF|sZ9-nLONwWTDA zVWOP5oXQo$WLmUnK^gA6<39ccUsfRz%H^w~OUpWzxtvWb3W|E0PG$01^7FgXa;Y>k zvG@A21sP^@3d2ZXY4OQ5D^yws%awwwur5FivlO}}ma2|g4r+|0&*^HW!mC*-FFUTm zmL?#YX3J1EwB>YoR@{Z9JDw@K+;s=iS4JwNmMIJmb}SPFULZ^nm=MI6T*`+hoysI} z4F?TDaydGJVVX9i!|1|F972R6E=e#eu(0fb&1ej)rQojIx!A?= zEY@TgONJ6#olqv4D+`%{48jgpPgI>_LnQ9s#dou9bE?g@CmWkJ+1AF*wb`z1x6PPr z+qP|EYtucy|Fe5uK{ZzwzUQ3Ju@Xo|q(q_0vflF>^sIXo%uIk;-fQSNOQ)^r%e26v z9@G{HMXib~OW+D63~|@9uheYMyKuXZ(B&NC9RahIP{5{>&hqI+%1YVG-oa&Jz#_e9{UgYQ704+7GzkE_y-i(O_vx0b5ge z$MlGIf%H>~MH{eLsTEZ*mc<|kodPq49IWxSWhL)C!mB3P#y$#%xf~bEQ1Rot9k>Wk^v_(x9IF9ZVmM$+auw!aO2z22nh^zXKMb}RpqU^0b+zZn7w=8_raM#k8dER0})uNorook$ zxFh07Ngf)ZrIeNlcbc4aOo}FXY0HU;X?T4+cLf4UE0qfBdi=G z<49j~xM!L~s-mYx8H$O@;KDJ%if&J(Hd$|>END0TEiS4K^z-3A5F`$d*neNFdcs^Y ziQT-Et;Q!ub#c@>UXPY_F5JTukcZz&Z=E*hT(PUn*x9$9pRv3$4i2a+9j{2h-ii4U zUqy9*L!X}}i|;;IrY(9wHd_)#Sw=nm%wPBV->W5^VSe=ag9DElQlL|7BM2v}O5pt$Cj<{%57oA3DFt1kaFeC;e*p8*_s`d_Qr<07|P z?~Y$gfm%GN7r|5cv>9;Z3IGBO>>bFx7s!eEib*YP(yy{L$9+QoaCiOdMKk6diCo zS}V8}B!6Jfoge?3<|^&4#hQFbsBWp^VM&%gMs2;^>J}YM9@u6-IFwv#P-NG*w)YKGF$me>*CPu**<`f4YdlBTp#m2tm?Q-_I?yCz;_V8F4Z7fAG9@>F0sa zv5~Uys|yZ~Kp*QwF(Ce9oua*)YtB!XV0S#uWxpQjDFB0PDGD;+!l7kTw+>TFBFen% zD{XjYQhHywg)2mmFvKw4h}j_KL}dE#L}J8OqHh_uzPPV??zp7{V~r2pHYYYx;vHa% zdkKsqV12<%h0ti>AjR#tS_JF5O)zI{-oKS(cghBrX9BT;DtivJjb!$1$OdDciMImo znBV`sutL1=M7X#X$409WkyjE19&Z!$`ds?wUhmIGQMJ7V6p$VtRLiN1(BJX=Ig4Mn z*O8}&>gD#L5>j`=(v5naZuZz5&*{fAIkB1CCbGLQH0a`_R)SZacF&w(ZYoRlAUg3A zM)cv-U}&IpL0M6jtUDg27`mlWerUR}FE(x}GTUW-7u&Z}CUIx#84T(8-0uw7Ly4^h z@ytydat6PZPaX3EI#ksR!%CBf=3EZ9j}ocXzOo~e2fThRQp%3e6bcSsb$u1MrPJe; zz{p?Wd>?2d4~V&ya=Shyb}}Qn@LePIn&svxkeR|7&liMVy8sJccK#I+g3OnfUD7+) z-B!DnU5Xtr?aPL0=yD)w_V~>X@Ewcqbcaq%jl1ZX9pis(c8I%`#7XWg8)QTnnmg5M zzuD~$HCuu?0y!xilFiDS_{2QI@_`(0cVp87h{6t7}v%n zPymV=B!-q?Q;R&@uUeMR?|kPx;w%=La7q|v+0Ia$960)te7PrZLmL)w_Sm)#LYVk! z*yi_eRE;i~63gG~FFg1PiN@P`)9Tfch`~%&z*&TBcP``z3v+lt8^>&NN=7CD@{qsa z|2AWt|2AWZZRIp2%yu&LcfvcmLuMUWjYAQkyH`fS~U;d|5JBIuj9zoL7) z3e_~Jqw)Ag-Z_y*PD0L09|b=U4h|*5O}qRbar!Cn;tM{$$4Wuw*3VSyN-k=7PlmIV zbgs~jR1Pa8PPRQ&ZK!?t`TnwVZ_oD(y<~lly_6qo_`Dmgf{<=g7#R{zHZ*~KRjOfO zDf_vdzKFVpO8T>YGxWY7c+y}4;^of z2R{4y7I}(lZHR%f4K$p<3?4|BsCk|yO~^f%lx;Gyip?|zV(b7RZp}1Gfv4Rr*upuwCX6tw3A;kA1%6el)WluA@qZDnDxT zzU|PyN{^oT|J|Sq_8s0~2+K&h=xf7Rtm{5bwo zwsB+4@RmBOALW*}YWliykV>)LpU{ugy9SY@au;tq>042uXn5v}GC<$n{*&XmCe4(N z8vrpSUMy8Ysw6auXgKN`YJn<&Q~NWT$m>00&BUhfl^jhI9-=@o%tqVu-O-$)SEG&> zWVQ?%KUVYJ--+nI5=+xxjh+=AWk#+&j>yVbiC6|lmcF65 z_%o^yJ1Qe)og&2>6Kk9%?_Q+lf?2#aWD)D=wdN0CiX+6#U|WncK7V-g*JGwecs{-q1D;<()OK ztQ}8OiEx4eMC_lcJD)g|`QJ#?g^ej5?qu3uCiRzHhX*<8GIf)(LVO5f8~At{t+VD1mx?id~|j`gF?xmY#+ZiGzr6@0#xEA_U+Bi7Qr>*01fmz zk9JDXsx#3t&X6MDlWCSQVwtm9!50?;lKCX zatr{qekew{CJW0fq{pGuxhx9?m~+~h%#aQr`)$=9RlP{!g@J`eUgO6zTn7_#yOP(> z#rbLxXFa(1dEt2-FOe5~#e&Iv(N%}|INK3UBKTWZ9cP{-F6X6B+qp~qPJ!L={G7!< zu6Vbcsg?QfB-TCWPueGkgB{Omyej9WtWfLS5B4wMSV2L zg_@k=vE`#jM$J$odVSph#Aw4w+H9a)Y=XqYX(8SBmquA-&qY4cdk* ziwj!JgN1U~&VMg>cV`t?25_}E>C^sRtRY9^X(jBQb?>PN%g{XVr+6~rd8UyJh>;9k zVC}SLfFK5TY_~(!Ziroieq5OB+chOswvmglq7k1@pIvpkEDdecl;}6|uL}(sY#@#z zz}bWl<`3inXa2uC0|rk+p`Utstnl9r@)q5d3}HJWGT(iX_Q%Je3?3V% z(^Gw5WR;0qou{lo{WQ$1lxn)otjLr*@3zEvp| zu30Rkb7ua5HqU5EyRhWWcBi@bHS9f1Lv+^rhU?jwv<*-^;^C13XP1FN;YVh)>A!^u zEQdvmj%j8Y#|gOzF@rBWzP-rm;8(T{pErVHRQ_8V0-=^A?sB=|veefnu!RJ8BXJ{a z!F;c!6&9Bos_Qb|9@VVi-7uc{lme^jfMAr`FS-V^>7A@UI~Rh)JgdOuii6oUhEOff z!kB2h6seI&rURfZzDGM6EKFcond|4$H12LC3+MU> zEUM@OWUJ{GTr74cES}yVF+9>O7Sjoyc~)t;CUtSyZ2hc+{H^RN!Ki<$9PVeE*^%Cv z6~;e}C6>!aaux7bF@i>1ZpNhsNzpg@vT_tY%5M zqe)rYT8pX4v3~0mNIYtlzdzkTUsy<;j*`N~c@X0+onY#3-4OZ08*#ZNq&|)u_RBz9 zBPeM$px2Ubd6pul1gpOlN;gc?G6O-yAXM4Twt`k_T5c+030D@j^^KEf!3k4adui!R z=&${*ns%FYrtN)n@r0zDvN7S#cgKxsM${*y%=#i(j|Mq9)=oMh1rtuiWLT<9PbK;i zrnI`!Ad6@_-rOM)Wt+HeWg9am~m8W9pNWiKUhdTtwISZ!zRk|fhql~3_Y=7SZXlM_5E(@ql`j^ z*)AT^Em2e`q^e3CW{lUINF$w5<-WTVhatyEl#7!R%D1>!wqqPXMHB@S)t`!#lp#~N zgt56N2f=4s*1u|pdO`V?45=yFngw6@85;e|V}9JL%z${3-+t|G0tJ$KLxXb%4cr|? zLZW1$J{vbuFtv~r^Da}RC>Z6*bPaqvWpMFtS8BR^!;F>Lp$Mxlp-GqZiJ9z^hG`M) zEwuOAyQ7e>%cvNVvt?Mb1SBJJ&TC@vuSoSu=Eo=hx|^3XoSa}xd+f`3j(I%rIA7K> zSXW3;=}bqXvhvG0R3*?|3ETbmYX$*xf$9e3>3zt0T6Mj$+WF8dSZlUY^n#W2849S` z&&9U^O=iuv(Q^GnarqUml9Q{I_3}HPqYRDKa)Er)$3xcsyEdEn{?I5)av5I*N$2a- z$@FZ0Dy~7gf}@?3k_i>l$d|R*+EU0@hAo&;bYj}k$B=5IOzwAR;=*~jta@5^%A;*Eqf5*Wr zhWIr<8oi?HFsWcMk5bkq8^B!ywVuTL-dz1Wd)A!jYoo({>3a&~1)LaVr1xuf!e&D= z%l@WOkwz+#ZWUldGkcZ+?xm@ZNs;5zMV%0W&n)7#AmgPBDCXjPsA7nf!@>?BjMH?a z%NdRY_nU&}QipcczOjz)arS`Y%$Sed(!Ur|8CFFafk_Mpa26#l9w1hmkdE$5VO@se#F%-C zoVg-Um2I|Q(0ts`=F7HoJ&Otwu_4jAO9~q2V?iHJ>Nlr4KaeCq>KdN@G^ELvfY64fP|2 zHd4K9Yn3CQ`ndHEL)@5PzG83GhqH2)!S@f>^8;q%O@3y#=fGtzsrX`(tWNnZg=-Tz+OT|hfPDlboC_6Vr~zwjsdhx$CDw54p-HbbR?n9mv7J5ha zOYWBpFLT=Tv3MXhhXb38qioS^BHl7dWE2x)N16m9$+!WJ%@^}Lx;1#WcB8m;48-DY zer>L7np1np^?^HICfr#{J3V-M-_8;kT6G*0Rb3a|k&WKM}{D&8p1+ zNH;@&*+~jKOIqT<0GiZiQnx^WpJ09(kaEBIJUpnVHftY+N3PLSqdNK+h0@oM!OUMu z+Xs$OJ-mQ%YRUr>;^}fnL_jhbFW;P5U*0wxe3jdWakPyoo*|P zV8b^Fw&hG!KTNA>W;wS2Wl;e6R)aL84YuDQfAt7#Gu*Tfy+ef8jt3n!Tzxqmhb(C3 z9)d*ERM>fONa)CCx3x-Y7{$$HLm6KKzGW1TU38L_A zWU-ZgM=pn@!pTQboAK1NG`F878{|mys-LP&V=d3INPRFK)z7@EP4jX$ejj5`Ypmj& z^zujvLtA9E+jlgXFnFmQJxvj?7YpOl<^6BA?t}VhKQ+PJ|0`_nW+2_z^xt?(^X2K7 z6v?`CBxmZ%n*Eit07kU5>Q^Iinm!iOdmsOAg=w(;KH_*8*RoSvCNDT|o6h+}D zI*wj=wQhHR+%SgD4CVU(+~P_!QIRrK*0v=WN57)?4tg&hW;?4ELs2aW*px+j5Xo#A zk1!c-DFll@K@5RJblr@G`$i7M%=K`&T2MH_-kk~eGSQU|jrQ_wZS7e?oGZgzPH;~d2exPNQsciD zBM1I2ZS##&qj%$_%F$cg4%Xan%xC(#3i?e&Q%xGDV5*k0FDaUZV545Ph=rUW`<`}& zW$!v>m+K(-?Oo)_@VOJ9#j~Hfl>acvB%Lf}Y`DJj3NHR$ljuj!{E6H3kg=J|1*$f3 z_OLTpuB3gOice7Q>wwTXk3Fy7`#?Hm!iok^%!`U3|0V`=gU+**yn1AC%7n}NZAJ$H zEj@gUr46C$U4%&E*!%Z;W~9DT7vaiha?G2en5Rzr@{ysO5dTNg@T-7V#Olr)xWrVj zwb<9RGH#eV9{s~lTGCublozHJftLIs>^n+Xz-2Ziq>PkX0j;l<-i?_w+DZB?LKXm> zM4%QnPm>>0B0OyEYx8sN1b)RH@8Vf7eH|)WzMBw>plOj5MU4fZNG}Y0YqZjkFJ3%@)mggDnGZI9Do!;)$;6&2 zwa&t7Y+sAU=ewN5XHalLCcO40P~TTt<|Q;OxPQZXHpl_HSb;PFd4AiXL9*QAFT zO=z5DpUWW)fck)fiow=}$uN)dHv^D*mOu7GkEfO6E}!;c zRJ2_*HW3)f2I%)A(=sp^d(`IZkLq>ko$nE7RLwXc&}!sqd^zB2m7n=fS5Elf?gC!~ z_kjAf`6?)4zzL8%)&2x`dxxB$uL=zHtkp4Et%L+Rd_viDubWBenHjLg@R`3zf!d8>}|)^?a!dL~0TskC1%1S;gM&CLtpB*+k63m7qjG8pa`ft1PNLL8WJ_qIG2n zayvQe@0xfv1(UB@^bI#S!HLa$CR|zks!5)$TeHdcx4E$*<;)*xhtlfi8q1z*%r{FJ zhy=VY0@ClV9Tf41R0v0g?yv#R7f$DGAL50hu+{?nrmF|?0E{0%Im61ZrR-ShI6f!~ z+^>A6&Db}0@uI)L&2*R%^oNuA$s$D)qqu8vvV7K?Ex*e2{8ZN5R}HOgD}qH6pySta z4=W-3Yk&pY_q)liPj!c>1x{T7-Uki51>i@D-1dF1Hk1#1Jq(PvPvjD>26w7;<;%g@aUy;4TW%m?Bb@1;p@9e8MWU6@FOu*U@Yw zAosgPL=)MUJ#V~=Teds~I6vP;;tXLR?C(5i8})Dcp8r^>JKWwKW9=C-_KST68sq}; zk~9a!;YsCbdK7>IL27~VQdfB!H*eSE3CSAYW%)uuz8~nm=xfwU>c#;#3^+KC)^3i9 z!BmMDWsG*t|1zzzYm^-_`2Ddqy$@MhJ^7E`#x)NemFy)QnpSrB|hzV4JMDLVSq-y?eWK8Wj_nuYb1RD`_LrV>_34SSKreaQ15^rP1`|0U#k+Y9trChB#nls!K&a7TYwsa*mIXhm^sRI}OyouZsVq}@A zlPP^7Y5!m=XwUUoZ1KLT)K=4+&o27CM^&Ni7=*tf0#DX{6zBfUzSSARxZG<>6#Z3F z7_S=bA3*MUcMC&kV{6;(x#pxadbxD_G(Vi{IjDO-A@{>MIwn5*Gk~(?o0RungLY!B z_V*#OcJ$|OEqpu6k_SFt?w++byBo9(!grH8Av=TA7pJDYH#Pkho&LwKI&EN%MBT?4 zd(Ja}2bcI5w2|lp+41$Wo@7Lea8g3+1(~(-2#bZiL5621UdzJlPEQ4!S^K2a3*n)J zmiGnK02q)Y;(SGfM0kD6?p}%n0VE3Xqp_x+I3M5UOxQED$Eqf4=uiXG1p_9mRS>u^ zCH2G$7`tUhaJJL#YCsxV;%CSykk{X)IJRdjI}UET>3@2ca@%E;sLV(7>FVk|Pepjg z-M{GNfC$4V5}JYgs=+dXnxK_BtE8-dB%N`Bez7nmq zvlHuu9E=|Db};1r+w&4OeRsoaldg6r`WG<0~&E{V4^OVCS zL{29ekuWt#&gP4ms3%IDIu!EPVFQalSclC`92?*?Wf)3DN|M>mG-^?x#4Je=DRXAK ztGz+Gq$3@In>_Y@IyDn`k5I9ep{`aA*T*Bm5M!X2L$=BrU;Un!VfXpgcW9^L*~pso zZQ^P9T)`NS1F@ql*5cCt?lY?vBWy$)1$#KZlag_|6Pyyhj|b}js~5pZU+=zAOm$!wo@BK z;eTQFTmdQAz8Vm;j{v+O|9v$}mx56atgY8VIWGTBoLl{u-KUG_nVARv_Sw0Nq4Hw5 zAVeR-)mcsTet-98hxAey_|7pmUtPAT>8SqrG2rHWdSV6H8;lj#R>@q}O9|c&j)q4k z>1KP*;es=pk3)5Alrf1*tBk%M8T&vBx26AhgV127EA`pWd73DuHHwu6A!Oz5E04X* z;{5KKArfju3iWYQoJE##GKJ804na0?BEu{j&T`~Am`MRVTlVcKfCQ1U8r?BY2rk*Y z4&fN^K(@9Nm7zm~T6n88likZ9i^PxpreXK&wCIL4**GioQ$+A#-2BxZhD8>*WkJc* zuC&9zVcERrz&dv6>?VV7eRrLqx(KHmZx#lh>hq6{gU}`7?;&pZj7UGH!@3*qqs&PX zWkXke0=6z{(YJ&0p1*=NLjJp}39>O*+msE}sfb2FHUrF$*Eixu+Jm&>*J71t{J-lS zRz7Qk;Q)|K%M2hJbY3EQyN<%F*L1e9AwReQalzLzRGcbIfwepFT%ykJN?WLzR;4KJrW4m zH5a#sbKnYa)c`|>jsbHeZl8n_%Cy5-Obx9?hr!d{-8M2Ei9Mx=T1=pk=!a?p}=MY;wk40QI zun=Z-*@BD?&ukz=iHJ`qGfhN=5eu48sexR!d28e8VJY$HAf5dB<*Li{c)FmZ z+AyYWstv>J{T*5(%KWNks7j*Y?IzuL?x^v@sBH(Jo_92r{bO#blYoxQP4=I6;QK>U zK6l*7eCE1 zV8=yrb>fu6!|4alEm zgJzIqQ8AQL;gg!WW3s*WXOW@B<+fKtg`abjw$&^udBqT0q~Pr>5|9c%&efEjR=XfN z_{@{z53)FoD64VC(QzwRcoRn}V}-tI5i-&lsr`Jk)e+uq&&#FQ$LA2|_Z7N6Wzx%l zm#h5E@NfHJ_{Kpszhw%3HVX!Pc)Dc1Ux0O+lNtv0Tc*$dvo%;emp}k zKiCV7p2R*o2N16K&BYGTVXKHd(>JbJGUoU%w%E*tLqhE+q96CzRc-&&NnED`mc6gV zYA&nvtMT*ixm8NpQVqbCCM%tQ37^lNT8iCA zo=DmHm~Y)NSte3?2@f*7R&1zqIo}((`$BD~IP(oA6Y+s4>(&SXO~!-sw7sKW*o)r| zZhxzl!ksbDxu>I8Su!+Njxd-Mq3}eeVAm`dTDF1!Z9IfYF-_5!C+Fs4VO%4)@{a1u zrB;c(sWftWF!CDIoM9|zGt!ZXg+VzvLR?()$QIgs<$ns5sv*?y|K1+ykurVs3>Wdy zlcLCyjhmmnHhjBuCaEtNt2+=od>;DFsyoC(n-ON5b(XvH+zuI|AwYXmh$t)}7vC9)6~cenj1A#0rZrZ|eEZ6br@b(L zxd(BGJPZOt9nb4RILZltxN zHZ1WcEpsBpQ3TZ087wrQAf$9l0Hp5*KTb8mY6-T0TO;F7UjjF`Ts(XFA^vC=<-FM{ z9Z~weR=OP3^7F(APwqxipvf>HuC?m3|026}_$cG5O(YjozR{XLPymezqjaIikFa zbu&Q&6?^a7NhD~M`^|cz00g$cFPM~HCl>$@Rs1W8`_#$@7JV1D2(*kuHdw%r-1+`` z=0pf731V4s6<2LHnk$#BL!`=;B^aJ!#VZ(CHArSDhJ-GqpX&S&V3UVOCX}-U=qpH; z&wo~V&TvRJc6hG}rR?A1nsd#-+zTs2aPrd178W&F(k25nrDefMQef9F2t|f07(;et zGUA?}ql6jMjJ;p1W9o8i469f)eJ0c|xibwXPU@rI*5WOgV6{scT+|&6U4Rm3Whz;G z_*&mvSZeNa+(i`R+6*KG$_eveY(;(v=)qIkr5t`L?yP6D)O@d*f7wCbkD>vPdZ1?7 zviSZKJjorsg$3q*-D3+w#r5>TglJbKQ*zTUEO)M~N(%=-$pUBWjv*xlW~ZwjtG&kG zMnJ;^BVHn6d?&bbS9Y9tYRKTT*9TdPk6&Fpm&|b@V5cer8s(k?@~mcxVY^% zaxLeTXMlu!o$Qv~9>XyklrHSGcYClio!ojd8E%2AD=;K9=_S zXKcS2o$0K;$`SgDW23ROqYh13%#PQ5<9`5;F~=t=5>Wk$=o@M5QicQ@OSA=Y34_h` zp()c99;+~k3cuwT>2?XY#iSG*a`+i_A@~=`RzW;0d6f6Cuhv!75%ugzftr0Cj$;26 z+mW54Y}bE_%K5kBNf+jpKC#&2oE1g=wli*VOP6T;kC@jKK&nSv9xc@5q!XTWzP}I=3WwmO-PxR@&%_+E>qKq7jxt_*s0eFjH)ma6Ew~IaQ;0 z4TTh-_?QGt;%Ba&sLxL|&!nWLsecUMs3XGEOP4I^>=o*@1QcJ(4x~-cpBLrwkQ=XF z%HKt~&f|Ii^rZm3#l~*Hmqt{2pi?G~7&+d}O7}tV)Id;#gy1iIQQHpBUNg(Z@nL@lw@L zm(dnarbD51>?-u*e)LS*s^^>cj_hmmm9!K(@CL>sVdEC7if%Y6(bq+38uahk6HE2b zbcA!+ZBNebIR8nd6oGFVi!@Acepwq7AxCn71)TdoA}e@~(*) zx6&DjGYC~Ndss>XGLLTCy7b!ZW01!G?pgb8Z^h$!ug)%}id5bE4~~#bb&w>b@xt|R z&>hkbJ_h-*#X+RsIga$aC>(zOQ9osqbgOx*VB?k@#W2At9JciYNluJq;H*hSm;I4r zOtxs7gFCUa#O_a7s*xYN*ZI<5NzW#^>RV@qzh)DC9>|b6sGR{(;4s$ief@V?hmKQi z>rjoV^_TzYt-0-o(J-_+qH0MrHo#S_c_!6lHwZL`=6Rxj4*=*M7Q zM%=iKm>nN1OPG_KTaS-|V09Y~&*sNzaNA?L>M8@QP~D$fz`BV=E3>QsnN-!Ql3rI( zi9jujL@c)eW~GMj833s4$hrLLDk^O!wB%ufB^{IcpoJSl8lLuzba)x>43DE4n$ero zRJ4K^JZTno`qg%$N;`9V7(XrZJ4NON2dDlNC2ex%k38MLR#F=k`E!Ro=fDUo9Mxu0GhYYpC{V}4|eE~JZhvR71=)A&gSODA3?bB?ONantI`Ku%#t~L#Wh~fM!*i zVv{HKgVB5*6;Q7=52LWsfQ-(wDwCmLt$xCtyP#8wOF1CRus9A7B2z%Z)lLB!$#6-G z@ty0S*x@oThgX=88>rtg*q-p}tDD35?p?*+Gb}`G-@;O>Ia1f!d5w5T{82^{+!U3L z?}5Y|Vh0Y8VNVR|omm{a&K&*TADlIrj3{!{9o*4hJ3slSp`0E6K6nMu32fA3?l|bS z9Iyq61g5c7mz0+EgZ&@-1et>k+y85Ysw~I0c;x44=>w&A4R9-Pr{+%T_;btp$Iy9y*~s$*U=vP~sK*|>g;p{Z-j2q^LlpzGd%y2me4~b?hCFYlOe>}>CB9)e<@Whk;CoDnrj2z zHwRWVeT(|r6HCTGqfNTu$`SU?IE3OCTYl1M9Itq>1y975l<0h_rbC{wR!uNZ=TzvQ4!C)yQ_IL#7&E)}UgtXm zLpyIuX>Y%IZQ>VvwrQs9ZL2ZZtkg$mGGNPwqg76s^@{Ujx0+PEvG;jASNP&*@QiL> zGF)+tWQQt0b74B1LxeZ%-Q(V)wa?MTiI~s)8J~Mu`QNp1d|K#MUczSqZl+B4MfE$T zubAcNX}2pg;_BgPamJ^OXYQmo_uP?Pexz}ss(pnLO*oKn_g4c_u`ZilIO55hh}~#`blw|EeV!*i_r5fe23KyLw@Id+Z{0hUyz! zRl+!wj;6b8WpE0b7v^DaQ@2%`a)Tg@E4*)?7oGX52SmPF6)bL2)K09}Bw$9X`@71& zAUBOg-LZ6{VAH(@S>^e%`!nIkGU2i2#s3xcgMVoFT2fg$@a-s90mdB-lDT&7k;4Do z*@@=S!2R@8H^pYP2sF2Vot|9}t(z1@H+v_PJhOF~d@k+*E%j4Gz*C3ttU?K1a43@O z<+V9Vy1Ail`u=5}U-&T@=|O^trr~*Jh+LWw)2R~< zVpeE?|8wlgv$#7v0rpAoJfe`L_Lx+(w<9jOQxs6m%I-a+1>wLanc^QdqJoI=cw4TW zGDC=7_*~u2e=VsvzfQ*OO8~UX3s6DcCrFtz=(Ge6p2RrK zZmBBYbxv8<-bVS_lTe5cCqSt>tAA}zPFw<%E8cxNj7tAy0kDYJWtoGy(J*gW$@&i` zE9dsuL}>AH;>#BkHB9=3t%AIK_@@<*tWF@sXE6ws#Emqwhg5#?x`wg+yL?yU8rS!G z@uu;HO?|J=(U2}p*7^B`-G`=4h^LfP(flv9ee24h_jacso7JZM{F3Hwo}g0?1hc^A zdCr&P{>tvXH_>#{t57}XLgKyOxps3myv1f-7wht|;RWFukSWLnL;|T0WcDYJ!-Dy) ze@Z$p7ku<_FB!%&H!fop=lco0Ltv?xF2p>fLZ4Pv0_>aif*{fpP+6HwSa5@jb*A9w zPq63DNJsph*%3-B3;CJ(T(rQrIGOm8K9FG1^zTrfiP2@FVTt>wa5eq4NKrayFTd0< zmxGmIG@6n=52~IUG0p}`x6>BRzG9|W5)PYDS6Wp$n8gcD=Z^vpKGz5wpNGO!k$PHb zzaKXUM79vVg!^`u3e;0E6FMwE`zf0t5RT@vT_EYM9i3tHOwV^{fST7@a)}cRDvi4L zd#D~seS`8`KH(Bb$-{-Pkc6emzI&OWdm;Z2WZ6M16*jBPH9}ML7Nilp=B}qW`zO&r zM25HYklVu(=2+lTxc>9dMH28Y7Spp30T9o&ocJ1kpw2bFVI% z1|5%t=HrwQSJ+{%dc+*V-p*Fa6pVP(kV4U@Sf8sLL9yU73y@8*s4~fruOHgsj;Fc^ z4$H{U(XT6ZzjS9c7@_)>n_#wADHl1xoWL_Bm{YnJhV1ZbR7WJR!h|mAvC%^(Sq=X( z@ECFZIdExb#3~27t6e5WzHN{o-B2W`zh4k2*|qGI86_<9ZX-+XNU7_06-h7?&+ zv9#KNO8sYOIKx_w!15HBX&{X_Bjp>bM%`+cyUfTj+@CAIg&%zG zB}A4xz;z3MtD|$+Ba227Yjc`x@2#RMgL!#G<(ipCQXn z;eUwC7OH>0xrP*Hd8kJuUC*xH(^+YoY@T`Woyk(Ql__MOm) zXM5|TJT(6iJt9(!PoNnsn!*bzO|P2I(Vj#6XuF#iKlS(P1CfEt4>{M$BhW%Q+@0VO zqxvHH8hOUGIwxSGogn0{*BWUhlC4;vJ+8rGFo6RLn6Vo?EI)@I`TAgFl^2=T{X+m- zRZHFQQj2Hu5cUy8qVL7Gok!e=nPV&wPtWuL80>Ijk+a-Wi#w`#EaOxy=X!Bch!F*p zctxc>`@wgFm;4(5 zlqoWf9F&R1Z}zAPXtAfKD1x7Zp;?7LLJ44Uyawe6xF3zjGeis>DLLv-dNX4tWJx$C zvt`j84Le9^3ip2s6DpK9+M|6ok9nTZ#U!Iw%-|s2`nVN*T>0y~9=J5|^xVYWe0Y1u zW;H3~cYm^E`XZ)wm8+Clf0()JJ*+ zy01WaIR`r$T(2V|=90j2BzR0UtQ)_K(EgcG3JzSuGr=(ypuHNbeJ#WF9X92P)rqgS2Xfn9s%lyuB|p}NM^1JF;Hbi!l32qnwQ^uJ$@L_|5hW&0t-i1f=PIHq z{$RHPz63s2K`F+Wp5A)?{8({HLt7^=!V>?dp%Tg|nT~le;prysThfChO1G z&%|_vk%O9A2nVl+s&V#ebWqZayFni8h6!oE{w;%rj>vzGMLH(;9rI+^i)$IAIFC<}OrBp)A>y9n)Xc5?G z#aQYP*lX0X)6@poWCx1Rz%eW3aHO-c5|!_eyG{_1R_GBc|Cl9j?|sNKUPR}a$bYRS`^9pTF9$PFBdS={dx!`{Ye#h7d@ z_bC|f%>@!VUn9tr5aqRq&j(wLb^dV17E}&&d%SRMr)ID2?AkS&ER2_Nvi~rMhyDxy z-tJFmYil#ILHOIJa8bTO*-)KxHfQ5YxHQz#{{gQ+P`^(dSBs~w_bbraf>pa8*1mi{ zYJn@x3geRtmS9S6V(l{IT$ z?vpeDx%P|@X5LhZmL@xaT>|Yr)#Gn8!;G}R8W4+N?T`p`Zcwk=2g1bSWahSI6U*)v zXEJe2Gi(Gx{ib7?k`fr2VqmQsDgc-pSF)hF{MIqVs+#lk*g-B_G%s7_^k-+L8u%~HDPuYC@%2X%W%diC*Z#O zAHettn=OviKm~(KmKt67S5fAI$~ZQf8u#+ zQx~3j_C+kKtisISe!wT6ev04z_!G6&%Q0-k#=_Q?l?}x%JMV%Szy5&}jz1ZfUU4P8 zXPfXgfok36!0D%*nyAa8kNgMa{RWy0eA?2MwsmQmkq-2?+SaM%XmkqDp#RocfUnRb z2aPryczK31=0^~s zfT!|wNqmx!)&DEn6m@yUD^xA$XE{-7>)+7Qz=R*9| zdZ>QoV4ZiPhC2_b#XruVezgp1v|lZn3v6&jISS~0w1@58`_(Ge!!n%?s;^txDU4TF zd-Q~bD9#=vU_M6Rz34~+pP4Phh_dsXL-e=~hbbQ*KpLTCbWZ&%PHSLL8KeEIxUYsR zpED>8$AWbKoe4*@c-#c5X1m4WQP?zl$0SA~rWgWbd4n*(nu@?+y=xfYs<^EV0oNU| za}A~MH8ZMNvItv79Cgn-5ouS?Wob5W{A1%WyJ||0?cvMFg`1Y#yABPBL?1>}&dm%c z$C6bsX?r#sG31rDIXG_Fjo2l4vCNH?KJG|z;L}lC+XR20 z9)kvMfcExQG&R;@zOvGjio3m87vZls)|Jj6U)u7)U2!=BKjcx=(~4xA=1N7hlDFNtNZV>!n$cZN>oI=r z-ymHuQhJs!PeemSK*yn*HskEmX(*|{nkx_Y6nZYp2LfMSQb|mr6K;ngORQZlBHGH8 zxNcA2ke4dC9>;9jfIBZEkh=tHwjQ)p-oKof-P@Lc#y@za9$jV*tH30t9?J{~rPW3N zW71x=IO0%4qz7xX9(2A}y8jNIIOESNV7O>H4O`OJ&hdaJE5c<6>{ zkejx&^$|-)U06ly6Ys7ROXNH_dx$;E%FyxB4ebgXuIXtEUz6yVt#<-0`?&`9f0GA? zi!T!Eez6prR>qhe%JIa}PJrUc%lwLwUeooE*j>aR(k%JL{pxW22ZeBF5Qs2hD!=`z zT8cgq;e-IhtQBWOG4Y(R$R^fGJ?Omq?r-4aU+eM0PuZ}$h(%7sed{Qgwe;ST$(|`x z96XWn+M>wMjp6C*+Se?|wan^Qy8-7;t-+Ji3J8Q)rRu5$!CFUcteK4qi$_3GGbE+1 zgBVl+jk=nQ@n?tKB@+SG%(9fnZr3})eM!=Zm@vv*=m-Hcm(44mV+O~4c9@~URLWk( z9EXTGcS|@i!|2clGx%jt8;SLzxAZvH&J?Z6v~SNn82V#B*JNT`oqH z>Rb{ZidxUdxN!K>7!uk6<<*1H;`U>4(O2+C8c}8+Vd|JWKTuq5Zto~NkZDT$t3tM^ z-~E1nM_ceD+3%On$*UXuTyuCbt31}RL4VNvu9Ad=f*~{9n{ou~n&^QY%feyhKF7&F zf^@Cy+&sMV&U<+Nxn~K4yD^9uVe33;OIzC3y`>r5Rj`!;xoZ&!8(L}|sKo3f_OQ0u zhF8z1Qaa8Rp3MB?9$?4HkAl2^HE{b`5pcpwmtAFfN_Bo?MfK>q-HbiDwAzM`E~@H? zD!;nc+r8lW)&p0a9zn4$47V+6?%qAjRj-#wsb{4Lhuc6yV;tX4s#99lztS%(aF^;F zd_U+C51btURRI|si6M^eJNI&ZVc&ZIxwK-B+6Eh5I=w-quIj0587uf(QT@eB3Ape4 zFmwVEZhK6Yj8k53Et`Y_Q`#e%umnV}%Rq}8DjE$dNq|jH#J-hyxF*1jgk!?M3L{Go z7Bhf0o!NF~hvTB*bvb-AG41F$yd2JQ19pNltX>$0xdduPcmOA-Pz(V-V7pVD^AdQCm0_nbB;NY9pwvEN{lt zmW&&F`fPnqg)viY@9ld}I5qh^0^;c&=j0S&(4bK$DH%k7I+zBzX-iulvNWT+ie|;E z?0E;Qy=xoYxemiza(5D&G`6G-n@qrpSx_Eh8GO*V=_fqd8dRaUoa|7{PFsN$9B+b~ z2ac@8vCozuJ4-phXvrc<3p{nvRVF}H*HhBS9*t|r(j&+(1U9E7dGY4gR!|Ohj^ zBuk{r{#>6Xq-4MoMr7-w$Jb$>`%96Tt@Nmtw#uqUs#w9j)q}O3ZGH_0Z`_KK4X}DT zX$wFywxN4tv_OS~i=z9vXqzhsxaGiFT>4f4>_i+ogq=>R2hejuiEizqDIF$#a%eGZ zGuV$Y+ah(p;s^w^?e+ILF+`X6#DF-L4JZKi7>5pFW-rEF=>8+?amsTAw4|)bN`=-% zoVy}+`mdVI{{&%jwl1Ga6k%RZXV%u7by$q8E*jdXfMIrcVo3wcl)#)7i^F}fCqGLP zxbVWz>RKYbwH3u7S#QhxI2;}ofg!GG!9co_cauXNHPgN#^v-11F51vux{5O zKv?Sw=+-pTRgRczU9rw_7o1_Y`5UpRTC`Vi$ZcX}saqLKPNcCaWt2OxqIZ0^Ybm|8 zV$$Q?R)v%kp<;=(RF1DOQf~h%mb~!6?IzFBU${n3^XwIuqoZ!ROb%mfysl|W+lnmB z=&quzOX)&)_K*w1nRnu-u8ZUG6Izuwe@}PSVsVRsFTSOv`;#5;otA@=^D^K%DGw7a zvSIc@`rUGm?#cK)MVC61mdtg--T?x;7EnuZ8l$HZ#)TcOYjfZZ0&FV;MSLj&*sZim z`ST0{S-e{5OR6J%-uYq|f)-=lleGc65{S$4>hRbVNHtPKV(8ZPJ+zNF1k%!XOPh|H z4r*6mePzu$C*wNyVax{R%menm%!ZQFv(U`<)|uisE-L+Y`uT^*STVYl*I0{Vr6g$};KI61E>mJ~ruMMW%!+|0v%V}JU=YEc z^>H&=L|hy~9Ub7D;||kjaYW-iM3! zrDL|JLO4jvqy`TRDGo?tJq<0@IXhTsn@$5Fy#){06Ds^vPlGhK1A*}u-zI>1s!nyu zLC&deOyLAb9F(&^aKVEPOj+#1?i203*M+r}1egyPTZ8t1MHQw1S4Nk5#8TIThfAL= zf?-8rj2sJfKUM@btaCF^C-$?IaOHh3YVaQFz{qQT_++*n4a5+8Gkd8AZFdn9zU{C! zw1v$?0>+A${!@oUi<@ktE)tAQHbm-v#SM@hle-53ta49EIekLs$#yT{Y(~aud z3b@^NTz>WCIP~yCQB$*=z6h1L(1j$_*6(d zvmKh68f79@Qd){rPCo^8^>tEzZf8kZZ77D7&&#V0F1M?rooG9skNa9U#Ey9-*m%=T zsVuaBPwD&~7p}bOO4QJIKChGRA4l!5 zR%f_9bSa;wLz}Lt@~UefZE0I=O9S2Y#8Re|6=TuM@10`TI=Cj z%KaE`$$Ki+Q^6F7Xbm|qwx1uG6TO3MCdCL0p7@*>|31n<^LtHr;nX0;-$`s6fx&lQ z1@8Tn2BmltzFv@p=U*||#GdLw#Ot}+N6<##+NoO?PQgxFK@C#qSuN&>$E*5)1Ec#B zGIV3b#$zV|)F{>YOti{Wn4P~ ztx-hL17HUd(F;;XV^FgZPC}s@5gahO5n48S>{lv@fs(&47_MIeoOhjuBQMo)#3eSI zbe4{%zq8|~3MWpy$c{;macord48C|f{l4?aFadUVVz;iKeXYgT<@+3sSQkym3pipz z;@Tzvm5C;6X=7n=qLKvJ@>2{s-ZGlB*%dI=9WrSUMmMSAB8gF#AqF=r;jDPF$&mv1 z$!69#7FT6qM>hdgri_L`N+cXrI$=Pt02)e`Kv*WUQ_ z%dZd&v|-%1tuSrI3}T)Qw6(Wm;ey|>WZ@rZXlN2=u8L&~2rSm3p|Muj-^Gh&p{=zB zH{N_LGBfhfLQ5M<7thC{MRVW}5X)<~*mKr32QhT$KwNgkm1wA4MCYCrhcqgQZL6Qu*h| z?@Q?44?p=Y0&Oh(1$?N~8TBVe=pC_}Od`0T1YDdUx< zWO6(2Ai#QhqUFHJH`$}A^41$WN0?}6IeYb6S`Do`8){h(_am8I zZwYxYgqZ1+y5Qt`!2F%+GyF0KUY_nlmXnv8@Yln<2Mh9#OCIYGI7m|x?*;F zG9r$4pb1z!8imjGcV~;B?&VNUUzQw{HM$HsttPNEmz<1&fxeR{Xo;h%DL|~cPMkoS zFLA6&JYfhZW+yS0E^zb(*4Z*!%&}(KVJ#91no=N3*QxHGT4>M_h_oc43B+w-grn`U zRL+SRBqgvZ7gAZt47CJrTQ{VxNDc@XF+iJm?R7Zi#1nA$9sk6sCmx57KmIQ^+Gr5Q zjv0k7znzB9zWxC_@45>Cx;c32*_ZL~qyNEC#~z1WcG(d>PX8S@+;RsNE?h{H>Nd$d zHu>X^@Yz>Wu*oJHqq#mQ9w|pxAojb8K%RXWEqTr=r9eEr=|c=)l02?Wo>L5J;wd;k3)KBBU4 z$g}5Pd(T1q4siS=#!#6+7ko`Cc#2t748)YR0xb~*I(A2OTh4}@< z8ZX0D6R)E7_zh1!^DIp&sxV^1!Fc%bXYt4r596!vzD8MD5lu>#I6>^xURR~bu+%7_A4HJ;z`t0Ey6L!pNMNGU60q^dY9Vj6S?jgXPqZO zU|)RoW%yg_P+U}uW@5g_PuQBS_aj~73yc^!ik_o3yz~A?m~_ka_;JQ`Y_r`~m^b@Z zTz2_obgnP(=DY9EbKp;~>uF2ds#+T8t}kYE{$f4wP8)~FF>uJ3kN|`pM>JX%|6&Gz zXvP^F)0KcCGrStHwo?~))RI3lcU8ax#~G+-@}ip4$oCecpT^*vA|TgCOIKRlETRf; zv~s3(Fm>!D9=D@BGqzG`Ujxh%)4(r;R~%+^1Y)u1UpFzIMCyRWxq}8!)p}#Pp?>pb zLBL3?lMZcV;XwzI7ga+{Ls=nul}j)vJotJC249qm_kXwJ_v`#!TS495-i$Em$o@P5u+wti>Ovc{U)c>>wv1xW4dW`+@(NDJQoL9T z(CClhqYK;c$gKvRyV}6>6XST~asv-uX5h&?;<#Yvc6>k2u|oMmemOOfJIWbtIyU}o zyrfDHz>ZIybc9;R1c)U8yyPo)o|#vPx2l<}Ei<&SL~$+fE5Mm2bT&`B~q>m4}a;Da!HgAw%12a=r64ACqP8#WA& zJ@NqV`PV&o;@KCFlb1owqhr&Jh9Wa78^@h+k|h4vZMU6p{<&vj_UzfXdg2YlHdaY; ziDzDX17CdhC8kfGhWj754;P$wF3vdhc#Pa|jA*xYONVQy>-{iwDke{U3$MQX3Ow#? z+;ZDp#E34G2}n^<5jNj)bNU>@7F%qJn{J$hS6+Srx7~IJUU>E~Xf_8fz4!tgb==9= zcAIh7eC%kEq+NHzO$40VF?!>%IOT+6k&}~&Ew|hP|Ged9y#D%|xc2(1QB;zJ`3n|f zvyC>Ob{&e{cHI$o5TIvv{I1(?!3HBXLP>ERcHMJ7?6dCy7`OQtVuIVLt^Y&y2w+QM z*KfJ$MofP116+3HL<|``9KZZF6I+ZOfg!_(>fW3c6B zqa_UAGiEE%I;W#q zq-}L94RqI#t@Yl{U6J%_6t_Ry*6ZWvSPMtn73NY^7Y1u<6PM25lu9l9?5UtDFAVG9J& zd(;K%%7Qg?bmVGERlb!ilZFfxO{$j*(!9bIg@^vyB3|6|t{tzwN(}o#AnzCtF58Vj z;Wbel{jeQ(9@M5HO04k0tUH8+n(MT2m6rXieg#SOoUtMqN#`obUy$3p9^zQm>90wh zok8@9OxIWZOsy4ihr3_cWKk0lDwL3r6AwrX-Dq5aOS7x0vg*R#@&R$`N8wPb(h?`t zfys3aH74QY;N z^3ewb`qi;N{_r(E`|p>M1uZwP42K-BFRs7-TDQpugksur_S96D}+IGEMdHDKPnne=@jy*u2r+`k-~ZMHd{d*v;92P-cL?gxDD+nI&6#U4;z#JUb0I#@=IiX}_1c)=pfnEr#5r@o;Q6DDkr=U#r3CYkh3*R_OB zh{1i3%DctpTjI5sUqXnO`ZwNq9pkp$UQ$s{`Sx3yB-G;N=by#cO*SKTJRrw}SYpEt zZNxU0loXiQby!D6?kH#4kThm8^VC^-FQtrB~rYV(u@!Vj?Ok z7D~M8G|)}k>R1}+t^w=x?5%}CWyN|#4J#9MhXHA0yD51f0CVkr0sLbRS`v!7aP7;K}O^v_9I3$>%moS&x5AhwpS3uG}Mn+b<8JVLGs= z-i?DeWLz6o%Cw~aqub|IFjI5ALN?Gmz4%3$zB*kUwi0Fl@s+*hE7Pym5`fb=vVvwL z5<>`9WT!MkH?xskO*z2>!!mS_jgSg=WrxqW?oY=1?zfzZM##2A6r*AS4A9%(o%mA z@4oXEExA8VAk>C2V>iL;Z@fYvE`~{yuEOc39EUHy{8Cc*a#eXBug@o%&Fst!Vll^K zr=7P&US6TFkY}9z4;+5jLAdssD{=2Vx6`tG9d_Am7x)Rp@q~lxJ9JPv#%#O=F}6En zc}*?$Kj;Yb>sNwf4&NVcU$)7r+a(GBo5$^xNr*4QhmR&t#-!`76X}A(Wy3*-9EM$Y zo`BCk{}{LY^A0rBF2PQ_?Iuho$3reJFO$%SEd;jjzT*y@NzCsD@4bVf;zEgU%o<{L zBxIoK_BiE+IthH+X*rIWc(2!kegpbr_N+gVm6eMVjyf1WeE$Re?v?UoWM;^c6-Q=f z;LCl-<8g~~*ntNfMBum)XPt69yqVeZ8|#V-i}GY&)`xSQ=FFNyZL}MFJ}>q=a6kO^ z+wTPU?eKWL(w}`98K|zV#Ff|FAQ3B0IsQnv+#ZP-BJCvM@uG6wDc^jBqfa;vIk`DF z?C`_!!*}0NKMWB-9*=xuWNvShn#ad1={?<~j&C++%0puw5bPNe|is*mHXb^ZU(@kR`-Xw12Nm zBJ~~)85$MRN$cV`v@)&Hc^`?DX`VNwnIN}n3GkK3Fe3Qw2cT{#4OCu%`!Jo8!69V1 zodj^Ms3@Ar=xP?=&^mrtDeDX+ctDeIXT3dL{9CP3hU~Bn@C329fsf+YX{3fGzadhR z+g_lh)^b0x2VkXQ(DFHh5r{+5U+s&$bQ(46l52fMCu2ggvPmuN_qy*Y6pDyWDMP1i zE8VaDn#D8%6%o~=1zei5rI@bL05jl?#Dn5|2GdL33X!EG16h*x)=KFMQ`5_jEjyL5 z7rlvcMPCa`5@BZNVsNNw9a0S|F@;2Ch^dtmb{b;f?4)I175Yp~Fc`owz?9g&f2Z1` z2jk24>puurGCTLdN0|K4$GG=_`*9pC(=#i1-SxMM{f#c>4M0u-O({;fEi8rltI5S{nZbZ@>2;CQiBq`|fifChRx?6R(|wy6PnYl$dFJ zg;>!`FTWaRopUzMKK)#LF!^l)a&`FR%O8jx{+Q0)E@8LW;ff!e<&~9KOzdt;OB=#5 zJDz{~G5kbq^S0ZK$BY?2;)}0-#DpDo#i=KpNT75OZoTCeVu_ccfBzx4@w%JQOfS`M zzW)u!9)B#(JnKAMc-iGxyl|#Ct2H;aVd0`B!mKV_xD;^$a!n1@m^pg^I2-gc&pd~R z9(@u|Kk+cW{`y-?ojwN#9(({T<-de>e*kml%priBjpn8%EF=b&Usl!CHK?wy$7`>= zf|Ak!cWop)z@K)fJaZ zdgD2B=ZOTYp}v9G+BmMe=28Oa#d!7Yk1%!W4^+;2G!fgnaQ=LFGV^KTkxk`&8bAFw z4PSltlT5g-zvdDY6z1ah-~Ysek3K_fGLY`u1$3QEy!6sb`1eCkpq^gR)isR>2K+ec z$U})Ce-_u?I0+{leH`7>CSs`w_^WcIVLiDnZ^I3OhCR9yikiGoWXN*C`;EfiS;RIAyS1 zS23!&=nlG8U7!jD-Vy>cQ3)l+SHz3k2HaM1{ozh`r1q zwyqj2jn(kw6r!!M2E#^fiutpDMQPb!0jt;f(|VJ;R9eWhE+hGDurhoel94U!8mMvLG z_ai7X?5wN;DqjNz4cS1n+kSs5f#MpfQ-4%dEyj?c8%Y_PsFM%gU=)@voR0tv9>b~b zOBT%&)|%rb4<5qKX3GSSmh~Sjb*fx48^cCyO6PAz4V{aRnKNq!98MLXgzrZVwdEoL z*$#&n1w}=4jtUIfU?Wrzn;P)b>Jjy;Awx$J(61K>hFqt%0{-@Pl$H;|;st-uM2Q(_ z54ByMFudHa%E|@`i|ll{uyoNPs#`nk9D7&3ee{B11+;+N5W8%tZT)P?sOFmRYD z-RZl=lj8RFRtd=_4y$Iu9<2)jz!TPXe=`E@%{`uLmkmzE^@ltvL<7t4iZ)`YA=0** zmR<)~N$acA0ghHsk`ciCY8J~zdXN*C+X!1sy)lA;7r3w^Es=jRiNI7If!tEaajgr1 zaTn8oO2GO3YYbr=do;cdv8W&a!P%nhG!y56d(|2#c_7u93!~+|PiJP}8b&}p5qI?9 z@4G*6`P?XO|HO-%_iw{CyQuA-oFBke|IEg%|7}Ak>ccB1w?HzluE?2+o`Q_G15iR|cIXm5tu%`;4dJKIg_w1O#aqCy*Oixs=XqL=?`g zWKcxMYGxc(D4?OO6z9;f50i*l&M+1?aKDQ7+^=Xt^4c{qEF)GuK#b4^m$xE=S0Np$ zJRLN@`tETU(r0@#-p@@F#%au;y3ihuLi;l6zmR`7^t|p!oV61$*jd*`YcD#rN+!2 zJ7wvckBJhv^lCY14>pTd(PPh+)e3e@bHp=g2{@)=|Jod#+nm!Auf^tD8ObE~Jh@IOyBO{9d9vz#PPx}_g zHlHs`w6bMogOnDV{>#rRP-=HN*SnKH#2atDP0a2F@||B}{fODs&EyK)4|4PJq|RJd zuO|}&2WLy21`HfQ%x(ZaZ>E6gKwCR8vi<1TfdmMHC@UYRPX%9_&`VAN< zA;=;ksfnSK>LwxcSdK7swA9fpWgnxQHlq=FdiXciF}vJe3>v&4fj|P?rTt;~Oz=JI z`}X&&>85SfEe&*6!um4jO~Wf9niHSR$wREUl9&qgjAsZi4WM_&vim|9elg*RW1N^U zJdUyDHheKBj6W(p7?dAJ#RIJnoV22Nr}Pf`dM>d#&ZxM^tf~$sIh``UG#La-cBs@EvLk!LRXz?0&@Cii*Z2xgUy&i;CtM#78DMKVhwwH|CoUNUtf8^Qn+wb zTV=qWY&<@cWJK`eVy=h3XMmXUU@A&~_NEVD;=36*dD}LXM1oo26*Vqjhsyu2&okik zIi+9x6=M(;Cbas=%sfP!mP>Mw9`6U0uU{F2k!DA@kABtAzl;XcKa?30Z^Jx> z0I`Fisz*SNO?L@+u(Cu6YaEQg;c_I>+440wQGm*}rb!4gr_HORH>MPUujg{JOu?lb z-oz12IeWQ0P66XV2G^Q1q0{EyIVnTjuw%_9nKhehB_9<@lgm_gQuq^<`j~-X*xaHV z{1~hzerMnqwNk((A7g@5aO4>s?#xUAQ!$mvD+R+Wdf{kyuq0XU%yV{Zgb9#i<~1a$ zapGr5G~w}zK37ZBE!rutOU%6IQf$6?ro*Ayt|hiv*Wv%Vwo%7-m`+&i2pKWk#gOoO z3?ie^&dd20fb3irty8-t+9@7Ss=umFq>DU25fbr4eN;b>cC?75qz`;eW|X658LjrU zqL_5FiP5FZCXh8HJXU$T_LshI=`3!2)zUz>7h4}h9sEKF(F?OR7{?F40NZSVo|m~z zP*Pq@ySxcJ@k$t<&jc-F#<6if19u+c$L@PUfx{JnD}D*nyXwVhIq+ubtGTSydFbWw zEI>t| zJ(h1}j3t?E5gRQD+VT5$z-Z1^x1z9M$wuw|z!6~_{bUTc9A~Kdtqjm3AR4X!ep}{6 zeoh3f3OUe8X=h9g5KwsIXjga!kJ5cH@`g|Xme$QS_wO*x23iQ*h@*OnwJQaV}P z1PwM_&EgUQBSSak1crcIGmwMq6SwraG_}y;PDv-r&`LM8!OR465()<~ydsOB*LFDG zOl^||CU9B8z&c*1?lR>P9hzT<&8e1A@xN(YF9rHye`_7%Yd{D8zhf#3n%(YLp^W8! z*)%Q9>GoAi1Kst`6gSgp?nq0)nb|g6@Ny2O?$)G0L~l$ihkqh4aq|B3cPLcI0%q(O zteEU*ui%P*CqVi3WEFQ-OBugwWtPf2TZks_1;mEl@_sgsJc#Pig5KX8U3I)N>Y-PF z+|7su{b~xGs-2cG?OK;84XgLsVh?Pu&%m|sWZ{kRREg!Qa4OpUsNI3Rwv8c≫d^ z3|s4dJpPg{l7qUSoj{L~_;Ka*(neA&Qe_bWcLjMdoc34_zJI()5{mTLFU(2Q5qldr zWcL_YT9=eSD$yO>SwZMb=A=rd!TS*_{OoH~Z7PRTLe~BDezhtl;FD!IK0=VR!oa#* zX+E1u3v2;M!_IOJn<=X>oxxaZFX6*kv%>oU|-V zfYzzYBdMFw7&!YCOC4YyALSWllvraIvv17O#l$I1&Tlc$=Bh;61tV>Lhou4D`az8S zf3#EYkVqFfELm6?kSiBdEa)X~lps6DmIQKF)jHod#ZGFNx;Ptueh-m& ztf(9ecI{MtAGNF3Vg5Ng{?)n9^_18|)?9&$s2&Ab$xeaR&ubUt!aTcSQ*0~)Tg_(D zG=^q6n5Z)7Nm=ydIM(M96B~<%RK$a*(t9g*H3l=pt_p)^9%dvZ!{Fo*ypx@E8geZo zaZEDv%}gSP-(qJmT~|xW9J(sGJ*_ypM&bl%OIzC3wxw}y-?cQ*T@P$!G8=`7@#$9( z#9nuo^qyX|+sV89yCUO(x(K-7J}>G5HiY7~E-a|Aas?Laz8^0ImlVXY_dO+R_swC} z^O?C3!83d9d@JCj^ z7O5;kpsQbgI}W}#NA;_f@n_>Q#d`SbNwdtylmeIi$BSkH!tF6TY^&X`{(>2%mR2)w z05hYUDG4OPY9^9M2WzOzW(;;?wvaHqvRI-y5~oi9P$PMQq*ANOa=50n zwN_>{E0(X)>8i*L(Rf%Ttq{=Lu_$Lncj%~#1}hYFdJs-q+Sac9?+S$0e@g@1^~Ji4 zRNYy`c3RG?CC2RR+dTr}u%_iwTn55BKhaYEzdy@HZe}z^0)W59y7AcGMj$b6rzP;4 zXgz)a)_gtqd{mF0rvewhS%~~RCa6=Cc_l-nrK+z}oVjeMXwq@n-E=?7vF80M__Bnf zKb#Ca^?i;wN~NsFDm~_1`W5{(MIBhs;Kl{Fxde=^an!`;qkAypYv7LmW+N}BC%U)u zh1VAD6|F4Y`#8tb4KZG1&4sRyUQhIV!40?VA+98hm-EVkASD@KfzeD z0=2AbH^Qd3x~jO+n8pwYH^XkX%X7>LD0DNXvw&HL-ie*n2{=o9UUSl5fm=S#VuINi z19PlhIMT#!+S0c6Ej^v=tCj}3>x*@}Q{9IyUQp%42@g-n#cQw90mWEzAkoxME?o+2 zeQQ4y<;Q3Mx2NbpmS@f;CqUJ`XXh^|in@H}ykt zK?H3ft;h1MtaXjID>7%=WcS($yyfGurwDZn!kPoSCRktiC$RUuWhg2LizohHw-on- zHf3eTasQM8Jo}t&%}%1sdMug`YE9DT_otN(3uhv!yU@h*D7`L$~v9eAjG0-jc zm041bfy;6MvrKU_HK}H5axJfT#oDsS!K1)1pd<=FB1@VmcnJ`@>{$Ymt$4ev^KA{) za7-0pcV(OD;3llH>F6d&BJ}QJXUUotj;~bsufN0ArGC+B=l>;J<8w_T_2;y$nx&hr zZ(17Yt}oW*3F^tgh#^8=b_|C zS9{dcsyK;VEf}*A(;CB_1QM^j#SQesUnPqbs44^&FCn7%oN{FQLh#ddY$+;|GN<|~ zUt6(!B?LlGd#(g8Jxk~8kH3B|_^$-`Z8|V|Vj1#tqXzV`#v);nA!w$Qfd~I+ zBqWS!ygedpZ7|lT7+RuCBQd{nTr(@CCtR@Ol7=;&5a*gv7R*?}R+o;)Vy5Go34paY zay%uH5}2LM!o(m)LK62%;`ws?T>-yIZNTye2{#onB>k_`X-0@x$6%M+GZGG`e5N{F zCJjlzp(S-SJC)Svc1}oN3HQ+M9mlB^iBLFb_8-+|)-guXx%v8C+sitK^>63T z>OC3`sq-cO_P=QV%h65NcS{4^9&EK|wQFtg?YhP2@$%s~d&|dh@^gha@~TXw5zXxN zu>WU2I z)Ro<(d@EBA!>k7_yHB31VbDMNBR?yM0PH<1^|RT!pGP34BtFvFq$AK4{{VF5ruvMuC-wy)oFTJi|#1&=8%a0-y(^OclRJMv4(N^2chy@Yd zFkwa<(O6Kn+Z`@>FE~6N0-sU1v}}Wg} z5C9Fc=UCO#)Jg#V5REHQGw;VB#O|;qWD1c;tW%Mb&E;mWYsN?A-PUoeeNJG&2^p+x zZI;}FP2p7zJLf<{LzQIb;w*F$ci05A+_!n+ph;X|n`8)UtglH(LwdX}G2a=PSr{~A zFoq2uE-XDe^64h~uFkE?A74;0=~@bgeC?RY$xDI-ug@!!9gZFA_4?p;yQLp;Nw_?$ z#jdHTkgQu?uUC>Yz_3Elsc12pH3^{l@OOTeva@nzqSVuPCJ7)2WS5qdqOqY#G;n;c zBxba^f?%hc#IbFcS1ywK#O-APVYN!3n=2Mt;y0UF25#D%?3_fFKmpSRdVbE=V@pRk z>ARK&x;@y+vPFMu-|oihrj8EB;p#&KcC)h$y!ERO{ZA~yyZ?n+a%OO1M+yp{(+LzX zru`Q!1GYXh2m3!#Ld;+^PV)$^j2N}nfUk%c&k`UZKb?*lEk&D_fpo zvyrG$5B2EzeuN2(W@P~%&-9}7*b+>(?niRJ>gk!_Yh|c}FX>7+OS6)Owsu}I=Z3y{eXliT{VAtB#OyD+zn(8X- zw)*QAe)ScS(z?2;UgAmD*3}~`+lMpHIUlvP%Ml0$Bne6=6y#iz#2SYXX!oP7r49Z- zJF&ww`KB_owzr_TxBw@gc`BAJo+Ev+uD($sl+-shs$>;u4m53lgQer>_F${>j{Cd7 zuJXoC-qJnxsb&0Hi^g?g3RIM;10U^=qUXc7b-!xtI2stV0Tc+dyy0!;9|5vpCGf>} zz@_ix;rFF((k7M9O=aZ-3I{%3j*=H6xOVRv>_zvZ z-!LfVJ#PL9>sz`lG=)_EA~Y;_DPjm^fa* z+6E&A)(*aygotoAK^j?_uk0wW4e zFmciiB58Q_g%=Q{I-h;sIasu43F>OCn zE`#6ir+Zf`q4GA{VoQ`wejlfubq;R7X(Dd^=f7~}#h2pBYbWB-hwsCA7hDd1TRU#Q z`8u5QkBi~+W#H5Qeu^cF7vrEqjz)e-5drB+j2JbXe)Hjx2OoyVlbm!VZE0IOmIk`( zks18H>gLQOkQPYgzN4x1lYTldFDoR87|(pQ6rtyI3@QvE!x_PtvM{_(Lk9Kf6)rS~ z9H?lp6PO{8oDnCsEe3y>*w1)Oz-a10(?|(&d)DQ4-&LXbRH-{VPQ**+S=pRD4Y=gZ zQk?sehW^BAdI>m=E)OBg6PM_wGb$Wt^xIL@>?BZYqouwWv7d3YMr`1)`Wzp%r?REg zK5HE;XtyGF!RCCtVMLL-%9_;C&xsiFW2mL_ocme{PJ6+IK?QUl>=A6zKMao}F0qOK zsBxmP&4wlQE@_C&j3^3oqwrImY;jGocj&1e-D!KR$2xbPtnu-N5kpGQt|_N0&SIC7 zNi09L=XtMDzoL2!DGE@3ieR(y2myLSqH_FE z#x0g&`C%;+yunC2yjq5NFPR=SO!iy#f5Qa1F=Dbb-ARy^n*c_&mgF}i%)v|qzj$uuC*l2;na3iV{ z(4z?tbVGo))iBH?^YSsrL0*?g*SbwHsjFR<-fx_E1@3?3S>zX%p^X^Hipu2#ej5b1 zR#z{hx&ZA!62G=%*37xc$Z%t$(Ho(a0Pk0ye~DjynTiumI0YYn{64XnZD=G`FfS*s zhiqI-$-1Z=132=ylZj2PlXeb=gIK=23PXks6|mLV&?xtLt8KPH#gc{M7&wi};qv&_ zewHsoNnE@h52k$mEyiuPgUATJ{NhVm#VW$Mtv1Ju88fiSrUmFnV1L@QY53@acd+N4 z`w_VP9zRd}4#%H#IyM}&Azpp)C2F%jh{3*;Ud49YblpUFd>$No+)1YPyXP`+pR+ri z1YWNvHunZBTecJ{?A7jD}JK*lyZbtup12KE%bOF@cjo+C-bUh9|>PWo* z&g(es%nNbdl^4=PVKjEyX=jmR+;itG1ky`zdWgT~6Te7|6-Xz8?VgpBtjke zGISI;L&UNXC=6>7kUmUomR)DyX6pec^^$o@>t%B{Tx%qO#1u@V33#oTqISXz`92=Z zX<3uH@!P+H)&r|n5BbT~73>=3{fKlsP=O&u z%SU6}zHz!A8nLsi=ZvE!;>OFx?2VFD|TS3^s|ZVC%6C$@NGv>FBK< zda8OTCNot%lrE5#)y-q(UhK92HQ>+1r>sbh|xL50}e{UuXP+QKLuW&?62d5H$<^ z2e6)YL*&pBQgajMBBys2fiM@H$K`UtPUmnqTo^cTfapcdM04Hy5Wh>{M^;WgZk{v= zO^vj2a@a8_B(}D?vJydBelH^+mzkA=D*DcVo7?TnFTTKKS6qSVKm9D4*Jy0*GvY1+ zdvj*}hHbXp4i1+GA5DG}aGgYRgGNSf|T+-tWKt z2AgfQCGzrfiJ4sjC$-bI6Lt`=DU-9_o)=B^>8$K*ESx_Jv;O=OyX~AzJ~ z)tEbXo@j`RiVNs^x%lDRud(kz2jgG2--JoG{1YF(`v&T2tFXnm@xtZEMYJ*OMV_Ys8|od_HS3 z;PhHA-Y{PJ;nrS{@%nOB4N<3JLt!qXrcA|a0W38l2q{eeGAkIRmyE|{fWv{hT}mz0 z7PAQmvvbxZLk-fsr;yd4_2htt71(Oj!>T`nEPhG)V|Ga$>~`_MX-GY|l5G)Yztnym z^*}ELNl_1zs9v3Su$FXQq^P4gw-ASo7_oqDQC({7aq)nzL3~ZXv5~1BF$E5-nNH7M z)J6i7b-U(j0Um7y_oJgMHUYi5M1Nq|?sdnd9{k6@wet43`fPzaOc5_!vHdr>02%HaB`65fJs3qbaL3IWnvP25Jxh32>$>UvuZcu~w?$)NiNavF zIaTBY({tXE7_&o>b&P{Rp3OW5YZeU=J+M=oT^KLkmy=fTciu58<$%-C&%>fdw@ z-p;y6otS3^+6*EYR7$urM+oh|&^ks)HFhTTt2cjs0`+Z6du$IUG0%2~v-=N;CR8(2 z_QH2KoV{yV4F=yfw6*xLaM1!Z5pb)ns-We019RuhB49L>0BsxId*>};Zi5&+bO2s^ z`9)$d2gs85lEuqVTUUp=s(Sjpg_g#{`1RKrC@n2T4S}X;goRnDBET4uQn`iBUEkb@ z!lHioW%_Rtx^Te2e)#Q|-|;hn*|L7+@OizMI`uomqY-Se<>vV8zaL@gqGeQW`&wl? zq%W{DSU7_Ac0d07^EYB;|CH}s*Dt^P0$UJ(t*Tgrg$tJw6J3iTg9l;SkJHdXzc(~A zQ<)8X{@KSUD=intyALK$rg}}osEtOVvSKM_&YX|dwic?lJ@pg7tTOdme_Mpk*MMJU z{79^~hM#}@5zA=;!0qwl_utaB81Sy}o=b z(AC2d`AWRF1b@a-7t}}*sMTU@tyHYCkCf9$yezGIW`(m^v9p8GqrO<86Rcz(=zc#m zp-7EXAki=q%Zc(b)Koc*#5N>pEfvtzOux~d2L+SKO&KZ;D-8})_bbC(G3b60D++*# zT@wJlqhDzqbyA;JP!#2Tr}d=wUc~{CJ?-o3mYU3TYJ2pAg(%J*Br=OwD?O8kMxbXK za`|{TA{Vwf?Fpt`Slk#d#RG}(ZJJp#kqd<7xzNo0BqS6zeNS!n*O0$9E z9~+O^Ra1Iw4_`*Eq!{ixG+0f@?->5cC5&Q5uS@(A=athuRC?hk)w7MwMv4B#0ws?{T`T@xlgEYFE9(G6lMGat37 zgC;92EzRP+z|3?o7^J^;cH$`dVbc6N^3gGTzD z%bu54C{mQn%xqePh#*Ag@MdJ9mFnW9bG0@#Q{QnW`i|N46BB>SbWS22`N3%^a?842-xmiq-`}VEnVor`ug*g zN*^lQW!bzt*kwQ!HzFp0QqC>>Qi+?oK*MA_)zU13jJSzqQ@$QeAd-5JSy?cmDNNHH zTxq6rn)!nvtdL!t)i~@8FMld*t|vf(^-{F{wZOcvYFdY`vU^c22DJN9|EesJr&{`# zb{4$UaUxlwX3ZuqeY3L@CnSh>)HOM5Pe(W=o65MQ+a%PL-R=?=u%kX}2IN9rD#heO zGi4=76_k3|X#fq&{bMh8&2k(xy#lRo7Kpd*hgD9st*b1;s>ka0tG{Z7)nT{@>51sA5MZO;-%A3mySZY!0VdA+eG}@L(^ju&%Zl zaU`6}H1ipivulO`7nT%7f>C0_T=L{{I57*9GUIErB^|rQ(+aMdNmCNY^srYf6~*K6 z5(^n6z~mF%uGg2LT2vkvUBFg^p7E^A9P#K^@1~CDfk7KH-kDjsNvkHQugmSq=Qqry zaej9&fVH|2|DKVRCD(`xFm?!N3vmtch|AW79etGc_PCy6TS|!lsPm3 ziPQThLdeVQbw~>AENU;FbUEmqltqA>+c@C&tNUs;pf5uKb3Ma@uogiE0c5*GG*O_Q zfnSib0dmXJXNOIb->j^g65fmfabF*k{}*WK|501V3a<6v*6G97!!$)X_jCpe;jkZh zIT_e_&pol{K6}&4BrXmv@?tfCq`(a8Ma%IfZCx*5B+lOx>R6p6@}A<-TH({UOwElo z7&NFKjym>OVghtoB4U?w<|{0Mo6Cf5$i1Z ze(-TtmNTxi(ZT1K>~>f78!(B|zs)qmFoBioKZzom>@-UbqLGNyB^EUqdnu=>v!!}+ zh$mehDV6OkZmy&xn*zCNHNr4Qb={2bDv=m;3k*XhHvAiBRO5_iPHI=WJh8*-yq3~?oIJt^Vx3!JaU$uv`s+H;(a@p0?U?j+Ki|rAY;A?#J60U5H|DwudDXow zI&asK{*w1m)35I5T9tZO`xYFPF)MjGo z;#r9Ln=oi#5e5$^Kzma)DwfWJng{ofzvGgt zUze0Y7Zh{Mp3*z+wl7XP{U3P!g@^F|H*>MWX8jRrYas05fgbfEX4qkmhD2X%#Qku( zy=bF4c|0y!mTN{?St)9(m!q(_zhvss^%UOxCd0hCa0J^Aa}$ z(YU6Z%-CC;87zJP4PmC#M3EU>W}`Tx8aPd`I7FFRUk0u=6WGSBNDM|ovztu3D(4&p zX{^v?%mT}GY$gzltNobGWg^aIS74XfU+X!Fgz0x5?axU@+OXc(%1Mq^?R;##owK)V zraHc-ZGWZQJ>jID`oG9CIGKpUZe}0DUpAJ9@LyeB6>@V6WgBNrYi_B=^?QDSEsC~* z#;X|A$HFw3dw%9Uc=h{haOO=HOeEjjbj=U1P9g4)U@SX#MMvNk>W;)ghJ&#m#u ziyz^hn=i*d?|%yW?zjo=q<>#~=~>L0IZMJIX$g8T1sKuR3>ZlTcKNzNe+x=VO9i}6 z{r-FGvCUBA&fpYPqQL~i$QkGyHgRy2 z@LgucDqb03@amv@6NkF}K$f}h zP9x-63N!?0!bM=WI1`)M`lCIo1=`KaVJxRYRMDSf6Kc2_*lc&8Ze%5jkF>$jFI&7W zt(eh$+twlLm9}0jEnWB@v7VQ9jl{p~46xq;hvC2@PCzu!MlVZZ89kZi@eZ`NwV|e} z3jO*IL~+?L%>HvaT;hG*b-^sjbga>3<;1znV)K%1UQs_h|KtOB;I12R@53+R@fY5g za61vI!w$Rek5HfqTW&Rh4vt~jvSs+ac3YH3}L~dML6z|ow3s{dm=Zd zKnBrn&9erX!%hxGN$+N6WV5o1alkH{W8~;9@b(8^VV6A)#Gd;fMZm>{cRqL@=U;R! zc-5bib1*}?&DP_v`(6j5p`j7~IO7PFe%WU0esXJhy_Z|HT6IZrZ+QS`N0|E7fN1yf z3i{#OZ$87HzfQx|H~tGJAGIf*dh9;zf9MIw&dJ4p?ztT&5o>+ztq?8H@*F#~o2}t~wbI6IXj7{p?OGe`B7Mn@+o`c($BKhgNG^>hb*3598ERj>Gchi%{U| zkAHt~CYs03!U0csP`-nXP2Y!47+Aq1lgJpzjssC=*gyFJU7t47ucoM^gaF9>m~`bi7&K%A1`itnuc?J9 zDJmv5z`%=7{u{U5_Y`LT@hzI0+v%kq>5(DO))M0;0LSc^9Q?dy`2tM5=>d4X4ji`6 z)-;GL$1c0?hiOy4z!~RWiYqQU1CwsQA5TB}AkMmQ5{>u~gxed$p@Kcca`TEss=)Cj znMLbVXg#Uj)@UU<*8`>(cw1Woo_O&C{BzO;*njUGaPrxgNYfj*;bNI-ysH&KY2cCEX zk@|(X3ld93I!NvW@O=qZ@STG9 zTi-eB8P8knP|qQ6V{EJG2C_4iH#@VCipkZ5O=hP|mL>322y@A~IEJofo!7iyENL*T zI;~^lNp-zef$`PeP0Nv;?L|#Z1sZ7y zo!L_tfl;1>S1n&89{ei;yWBc{KSv~Rp@|sE05P=_CX7cFtz@ZCaq2#?FT%pPzu~R- z-ou=^v*{X(RaQCzsGPy=;6o24;MaoI_Ezk%*Irnc>_Jic%-+UeNm3Qxp={!8(nc@6Nj4W>TO#+)x! z+BD_-#?1PBD*KbqJTH@k8?L_=`7|zYf6LCu#Ya`Wc=bv*7-f16=xuY&b%d?l^yVCmcQbYLD#Y5`2+S@aG&>J? zq!O`l3lZ^u1lyN;A+isl+y*KW0pzXs1ahe^tkF#>YTDAa%9aMYJ=l7yE9W-Og0wBz={mDk;gSKs}X7_M2E`W^MJf1HAc zpLzp3?Qsa6ed>N;eD~b%VBGuY>$v99lMx8CW9AS4B~Y;t+@X{+m)TL1CkE@vxF`-Q zF0Ps3PUqwn9$H?GC7kgfX?R1h!t|+dR$5YY56j6(6X}4pT^=F%$&xe}5+hl+#}kY% zZ;r4NnGrX`Kk>4@>6B(V%5fLwkXaJ7!+@mv4hH!*L$uK%ZIrMo>;7HF*AHn8C^gD( zR_iTzG5>VL^cXiVic1FIh38+!p$G1R{sV{O@h2WdEF8rAxpV3BlQ{N-;|KuHA^^G+ zS5CYJci(#-mM;3;WOjSF9t>e9YipKa>eQ(?_a7Hwmz{UV8?QZwjGQcaA24v{rTP|{ zWS)4^i5S1lIFywXWB7;->G_JvO$t$8ed5vkvGXpwZ>oqz6TtHqWnz!`qQt-%gyig*^E>F&$H(vLY-_> zXeSH}Y>1)3u^1j0iw)a1LlFicJC-5Y?^OKhIO3WY+qIvH+4uvc@gX>-_Fq^+pMwZt z`?iaSG_4n)zA`4sPRtb|mX2()>DD;pfV~pGKljm^XJGPCa^00>T4u%t7Ok zlUGhJX}1PXk_?v}`QP5*mpVqHZgL?f0ks{n7m z`7+*p>jg=r>G9?vE2jk4U3vyF)-KWIa_ZA-Eve?OC>~?X4m`90Kw0FBrg4f0VW%RO9v-`fEmM?|05s~ zinhZ+?O=t-6BV}Tn$?WZ`p)rL9mLXyA_2G^9%0^tVLz>=_*9rU4xbdUtHE4T4rP38 zEAj#-SMYfBL^v`Swhq>t{z8GcXrg^S6_5*(5m-I^yy~m3K4 z`AQs6e>ZL#yc-I252pY810H+oIehuq#~3)U9|jH?NfV*D_~gHzVd7O+&@-Eh{^k9! z`KFuTx0$o?(I;PEryX}h|9(ReOA&*d?+>${rDa2~;mD1M1zw7O-S+?%E?SJ5$|baV z(k3r=PK?0M+!K#KDl1%z7R;8owJZ%{i9#q8!~+jKfoGn60v=+O|9SU)0*-lN!s&+{ z4mEu4xXYgSeda7Y{nQgU^SsOG9s2_P=EG*2Zz0JPva|Dgj5W;nCd|(YeSRo&cag2c z%(#oJ+s(}^#d*u$hxH~g;&#-ziTTzRV^+=|*uC)xe3btbM%Ir(EA2BQ_8_gE6iDbV zZ6zWVNH4J>e$er)?d^E><#({{RvTl%qNVuYqt9tlkS*hhjoR#pmo&`z!-cmFZ9?65 z5u9CBND~$tevd6c|BxMp`95s@Nef0Sufy!v7`(OL2e`RzF>uNm2xu|5hL1*go3U`+ z{0K1ZbGm97jKUGXpR{^W_7DumIB0c0&^fE5Orf}4tx{O`HYqe=+S0bNmIk{2qo!H^ zGv5#lvNE!1nb=+^gCGOgNGOcl+!E-VoraJ~ga+bwUwslY|NI^Kh5czD2$&h5u+B`? zLsOuss6T-s2Q6h%*=Z@#?e@{qcNVcMF)HssVh1_4s2fgN^5wd*bI+$AydleYg{4Cg zC#EQ7#Idg89ZH5PDvi&V4LfV%;)bMxjfPoXQ7ZZ7ok5NTr6Z393?8ftiUvrgr2K+1 z2|30>%(xZfcwN*X@rl5nZl|Tq0TNF)8VCv_V`F zoLRGQ&g!JOZC1SC)070*vG0_{jjD1NAe2 zQ5w;R1pXIEg6>f4KHYb>-K&_+Xo%X(W3qLY%t1*VBGHKSUDob$2^6ENCQU3|U@fk$ zSuzMi$}HR$O_m~YjV5-A2V1v3JQ~`=ORzm|z(Rc<-0>o88QmH$xUWN|(LkhbKlCHO zdd`_=qM@M{|9SLDVyZ(JG@zV-;$}2Ch+@kvw!)1!T#r+}{aQl0U3|&q1RnE+jqJ(z zIdgeDsH&*ORo70!iN_y>0fRQckf9sV^89bI&()J|$GFYL;Oi;hVH3Irx9#>j?t=H; zdXJdi3Y3(U;rQc@#NBt_i_EM{oOHtRxS7ha@n&1%t1mvouYb-)V?zUhy8>)GZfj)c zal_ z5Paayc>S>_uppcD4I#MRd>5gE_eX!sfH8gy?K7Gv;@jXVI*qPcOMm?V=TZcQyaa7% zKHLjlM`XK+a5JmRi-}?2{duLx&ef9McSfHjpwe-4`>v&>3#(y&$5Qc{Hl^J)WLc2Y z4@&A%n;KkW;^E9oSS~E1fgyufN0~9NW00F{Dh+BJQDRvHbl6mCRS7z7Q$f!q35H~z z3W~;&^`UmRS7PW!!y&b#yRKi7hH|QjhC-6Ql!2bCGI9!CF1OT6IXOwzD+2GjO)Zzl zBM~*Y_mLMpv!2Yh^F6W3&1H>7If+D6STQ>>TXq6+9HPkXaG|Buk6=`jrQ<&N2r+PE z#?%CyN>{6y@o~+5$WaoEkbqn^*4gqi#dJ5zVjT8F3Kpri<$&gNnAz>1G`JjTf72EiG8>zjtjr8mK28?4&NrZR!G`TeM^twB>`y&QS|xff#6_1B`ht_epS zbv!2Qvb-%$hTg*xaGG<)&+;osK%dRkV=?!NOb?03LHXl|-Qs@KFFTZ50i#y`jGJkJ) zM+PzT!yu+V8bQt=FPY;%np?F|Mlx%Nh6S4;&qDnY0<2fKO<>^tcqXeXT{ zWyfjfKoBfJdU3-$fwsQ4JzO*?j%;-$+;0+c=5TmK@J^mg%z1>~A<3(&eR$wiPLpZt zi4E0I+cccy?(j+mgrgT)0Hv$4jP6Ns>Bnvxm_E6Z|(U>qK=>F8z-^vv8wxjmzb zU$&Xfhta4e(HHn%6%9hkOgPt+)4uLwi^Zs(A+HAqF1}KL?Y~O4#b6Lfi>lbK@n}q( z!hZa5I)3~0cbeqcu zryaJ%h3B4)^DnvrZ@>Af^y$;iz5rFrt8w||*WkhX?;)1ghXW2G_EPs?dBq|ecii#V zcc1;J{5mFo_!0KrcVFzX({3m$ADlX}h?tHXTG6?`_$usKeGL2v5YKtCIO-`^2nVhn zvJJ|O0)z>S>b5BQw{C?o@zEIEwju2i!Tycc%A|{?SU9x(K1>R3h5oLg9UAjqOs+v~ z-xdrYnf4>Lir%~I~F4gAR1j}BQz z_v@Q2L}tTEAd~?!zXbOE&rl2;%HjKB9ibF0t$QD(b<><~-!#ogi(PuOt}T-aXC&_v zpy&6kvx#9TP#xYd+Hm0gndr^(iv|iSmbSE|ZOt3U8?CQf3Zs{0?nh5ph~n%)vcw;2 z1qu(3LCYp49V(O+M>~kd7{EG(^-`d-Lo1k^$;==&I2iK7L#qgJk;$mzt@yY8U@L)7 zFR|S!d!cd$Qfw?CSU5N?ucYx+A;WB@E}qNA;l!+rXPOy{mtP(1kS5?3EUD1syXof! zN49|lPdE@|l9b97DeJ%!DppIER+|vm~~(zqJuH)fM6>HDK^a0j-sli=|$i^o6g> z0H~+AAKxd|&@NdrPrYANbBS(OVkAR34)Tf$Yv0*va?yf6F<{6@0?=VBuUvrsgGQph zrUGrPEpnag>_QZkmZGt~k(lRYa=!e+5-M|!WCC0?pN=26frKbqx_FMPG7TO)idg+n zuM=&KM;nYSMWZ`tt~jZ}aV{ z=Y$J!*w{MUd_Wrp^;fwh>SJYcOKbTP@jxFS0LBR>bemNdO&r%4%`M5F=h4Ctzo+7O6U!EG;0DZNQd9;}$du-Xg>Ev`)(O_O-VtFl5P z_rb8PW2C&coZpmCsDuo<+&77*YqzO{5z$xzWC<&;sZ`Jwim}-`QaTIJ(bY=8%9K^K z)bWmewNC9~c@|q0QVBy+u9NdML#sBV^NLs83`oWiC*o#g5Bb0OnV*H`mZfMn{P1}O zA*uxsYO6*;W;v~9WTUaM8g0$>=wDn+;53fqb+yPZ?guYTV44Ypw@}**^tZuDXPfKw z!X463WQ(CWXhU;@1Nj+#;o; z6;IB}=47`kFx(!9OO`DLuz>(aQqUxtf?|7BCNl+8b+ojF===_0b)8NngYZz9l$KtX zaAOY6LL5_?Trm^m@;O+eYsAcuXKR80>j9ju{NXWpY(+gTIa@J@)fZDc8Z}IR2vq?F zU`BM+Wk}qSP>OIfNC~XJt+5#nB#E{y+#iX5I(ZqFWN9C{1oM2-Ie>)P#{2G0a--FzMf+NDvuW zxya1Um&pKZ21*Cy3acKbKQ943FWomk0b*9Rmqaz$CrFbYkK2H+JWeYS9<&%G1obb&#iaiB-mWIxfSLq6pYGtHU>)!YI*6Fb;}H1WxGiTidHqQw()s=ZkNO-&G5O< z+UiGkmPf#?)2*Q`5Q1(vU^9U%kFA_v#OYF@$)fz(qvQ^{%~&I2uY@a%buVH+*-qZ2xQZm1$uPxC#2zV-g21_oWcf_ydj%CU}bj_hYu%293 z4!#QGDQ8saAIuV)=d{>i1va$AcUw|LM5E48M+{p>Qk9fx8PR8r+m0gubxdwLCT?k4 zx0VLFX-iw$(w1b*Qi)u_rlbjxNE{A!)FD>N=F}5Q_yRJavXa@Iy2(DWZk8C}cq=Xc zXPW7Mjl{l|vl*Mj%XKQiU_~zDXbdVW12M)QkIwRInsjsM(1aV181vci2?&$ zj$UPrr;@dsuNP6*T@#>4OTx>{@-dqk=e1?TVFoor+SY&5tvJ#0&5$(GBIS_iAG!+9 zh>pHsNs1LD)e?Py|Ic%*xY@5+OROjQP+auH@|(HMu6IN&koAxrI&EL=Woi{5F6q&g zlxgJ>cBJj^u{6+4TiVi=wj^Vg%HdM_P-dxIE|rDL;Z(uvSre-?wq_ItXU8%=58yFG z;Id_zx?n@(1OdNcvb&~+6P6>8CJtpRXJALNXqeevC1r3p6$)@V)tO;}0$+wheKsWu zTpq*RFDB=LqI2U)-?yg0L9*U87zhwk?M);dNZa~vTGA)g#XB6q>;zcFfl|{uCO#?7 zATDDXVC!;X^NErF+qxdy%Z!YH_R5A#`@2oRIW<&UYwJ2?`P0_3rQ_(PEp2H_Tau~J zVrIBKb8NK++Gx};Q~eqVO(ug?P81OgajerQfdIQoAR!4L3;~}WuOdV+d=BC<}2*!)eMFTyz}{JQ`z%C0SuM*4W@{tt4CL z<2K=R(6Ka|`~SkUM0h=mzwLQdeof&$E9yzS4?Ap&o}3ddaUArno@Z%dw@+9a==NY~ zN3^u1?f<9oFcmc-0%V1iB6QgrXo1J=5XUkFPIYlevYdsO_2u6ULl;16f#6t7#k-Bg z*#RwTdSJ6xKe3@fb{Hd&Yy=REC>G3!>mq4jkjwG}(Lh3hOv@3D8DC~?1uxSHIYXMH z*>$TV67f(R4l};5?&y$Otl1Xo_|)3mDD9E9w5^V*2nA}z!rrAHS&4%BuFzGJ=pZdE zjS^l=ZRr5J>pVeG+QiatryeZ51d+D1{r@x`S2>Iqd%?S$HeyO6$jQi-Y;_DY*=dY{ zEXTs-eUqK#`7>{`Nwzx``xa1xpT}cL4g`4W@MUluSCtOf;WEV8Ef{SjAgd=F%glq5 z>SpQK zCAD>|4||(+F)MpwQ)68cGiG!weWb0=So)6q517*WCH*1INT)4rt7GCAV^_d55N$`3 zzm9;XgTQVyk)4cF^jh&e`Lp$`vC|ssa&;A5Ol{W;Gj*^;N;P%0nn)WAlQC9taW%M! z5zg>t5z`x0vIW3QNCAnl%ch%YuI;>CoPAWt2Ai%t-CbUm6U5=!JwD3lr?hdUXuY&^8{&IRkH#+^mWr@Vrip^Zww6ta^n)d&Uzk_Ry)!UL7%a- zGunD;rk{(_FxhM-tJD$JgxROKrSVHoXVR9omA1G9LWsld@DPCG^rLZ+2Ux-16@XP? z!tCZ7R5^huXETnRAd8na(+^!Yb+Sf>TMtZT*k;@ zCWPARXvvb}_c=LACykb2*t|Yyu1wJk#uNMZ{NNcXkf-dZncq2fB5MHoffe@2+&4LZ zyJdQc>8oOvjl?lMUR$LSO1~8T2h1>$pw7_;j960YPMD5SR+z2C)|8=y;$8cV*$1to z^tDKrh?AI^d?7b02a%`>86Gn#q5wgiZ@S>v0gV$8;(90JS`wnv=HtmFZj zso~REkEo6{;vJF)yIm89HAxA~@p)Ye@bW&KxS~ThtaO0PBJ+9TjCf5@_XlVbZj%aT&ssRNHW7Py2py`rTkV~C5P5aZintOq3-2M z*(X+T4kPKPj`MbI19g?Ice3OEU5}Gh8O~s*+Y*}G#1)f3Zkk-`Tb2g8>xs$ZV~$oV zevgG3;Pr=5U$z_K<9A0ib2NW1Y(Cb@)CGVkp#ye<LnE# zSshN7yu@N0A2UXb7O^s%@0>q-2sj%OBhW^Je49MzUd}NJwQLg#1!T6XCB4{rdB;H` zH3JmRnI4NoI)Dy3UL&06o`cWFV^K92Al2(NZR>?mKXN+VsIFRo((+-n3?Bd_#Fm5l zms7m-+3a?way+5FBl~n=Kit%}2-ZnDQAx8J=kQz}ITxq(4Fvt&j#(pSj)_dFay(p3 zizS{HW=AFRfv)tqs_$zO?ZE9Z636p#5-yB0K$%e&>^7}ad0C3sA%#F9b*}|v81!2D zUQQ~(*A4{@x{lHXHaEqQnWMs>3Fe6@IfbDfaft)W;5TME`K)OZ@XhZdi7a971a=jR ztw4a0{NhUd4go!Y(G4DT0Gnj^nEW~EES=a0Bk7aY<$Ds)Gj$wlpSZbOD!|yK(X5G? zkwiEo%9emP=pIivsr=^bz^Z%lap%mQd`t|f30z=%;B(V*K* zz@!}^0xVg%Zj_c4$Z_?x6>!*{regsQ+IBS5SE7Hv5)2tK5X}u0!YoVLOm^}iAj7O( zhyY7rVHPqoT?8QPQWl59X$GZV3nO&e)|#<*w8P;-ZS7*b``;;8UNKMl1TS&7wbY=n zAcFv2gcwE#F@9ATHF`9>K0Df58^rNTfk+#g8f%bWkco}Pj7DAcV$s2}6ekpDz{VSI z3}2=WzrRHQ?;1&On{4J-83`L^ofH6##nivthdEk;%gr%l6-(=Ko8X1hsG3n07+*5j zWq`^oFp-=B4&&xEcpqy&F_UHDd8Im5Nhl&=n9mIZedV3bnbTX*M8HWdTazBb*yl~Mx=@Y|3IXed5c@AQ`d4Bh@+nQeNC@2P&%QXJp?7^J+8*2{T% zx~7@-x!3EjsJwa)*IwB&>MQv<`9A2qlu=uSy7W|jy@zt@J(jEYbM;h?p31)}_fhN8 zE?xh+n;etGKc{r(?ug9 zO!kHgPOK|zG$N1M7%ih_qU51N5pJ6T!VShxs*+zNd5)l>`~IE2nkEVC_!O~-DCyu$vds#qZUru@PIXbraF+Ux&~ciwp( z&p-Vrv3?#J+yihr+{9QF5i1tPs^+#&+uv^t#GJGu5RJ9rt0}XPLreajPx%E0?6adx zYJT}+A+F1HWq`2(=mVG`ZQU(B|LDQ`44G(xT#W`a2Z7w$pl zT2bUJ!S;{}p~N7Vn6*qQN>Eyw zjUoL8;UAaWg2tw5VS7(L;{psFJPZT-=VQYW<@n{7-*MCJ_n~6R96a#I%b4-oa%{5s z<^*IT`0#^wF=N_yIQsaraqjt-;r;ig;p*$}B&M&HfQ%by>-)wsmHN76xb)(iP~A|E z(W46S(GfqDdZGMBmSrEscbPC;92X+}h8ryHbJwEv0W9nyh$jHnV z!1&yAk73k?BQRmyMiTAd$m32Y#=ihpTzeb#*<}k{aPHYS_=r?i5f>*;2l|x!0(nQ?bPOvh}M=P zDoC_20oA6K(Udc|-O8~{)?CaL8P@SK*bYY95s5{`Ax#oa(DkG20nQO2M00PLj1$(H zNpp0PL#c{0!>j)E#9!Ldwmup&wjKT0mb7|dc6!}>28{INp|4t+(e1(d0;6k~@*>Ve zW3*JEVW&F~8!;ZJsT3!fnrr&gJ{pdHr;bKMdiYu+;uZ7B!UjxRo`sLkEWvlPGO_Ig zbLnJ@(QwKuD7<|nVzlgOL`~`{sg8;aj>{9v;fh#8nUR%^OD;SclRx+Xr=9i>JoUum zxa#tAu=V(zi9KT0$wlmu4^O}F5)M4z0Ni)?L>jn**mw7X@z8_M!9@&lc1|&lICMWc zcMNa6`x%YDHk@$c!I(DnTND)*;N(+IMVJQc(IW@o*kjMc(MRu#$?txE_uhH|f6kmK zn$NWLZR5;9%+UYqo*OV@#!M_-P7|c7uf&_Ly@1TDd;))QVJ3OMEw|kbuf6aNfw)X8 zSTKv0+C9|Q?1&J1@2APz^cf3q-g%efwb!4)@L?OFq-X@@&VCA2RSQws7^HLAu;H*m zxLjTV*lW~yg@YMV29H{tUXZ+G$q6A?XRe9!~?ysEO z3oV$)leW19`U zm~ja)zKtO|X(MV6eGaz9WhyQakmO0sOREm$G!_k^y}gxIL=9wQ`0)Ghzrg2p;;6&- z!?!wau{gr@o$K3Y7iS@uv`IsjFbHNrGG34knIT!Fzu2Ots*z~54jfkQ{3-+-YQ zI%p)Wxa2(i^3!+tWo89-*=29kRMijwVropsci(@DuRi}T7FE__>?T_w5Nu5^2dxLj z;iW>scIqz~C@amv&f9N=3ogC@mt1j!^x;S(n7EIj_B!+*R7PxQMA%Q8q|=R|rKt|t z*~J*Y&1m!=JPK!@bsfH$`VIZoOcSmw0>NzV|ms4Qic1~)`tot?*Qj+mL^x1;-dJnDHi662;t0cjH1!Sbf( zbA`h(GqM7Ijwe2If(Sj~u%_bn+Jw1P<*?g2SSBg~O(Ooraailh?shdJ{g?h*5C6KG zX0o_xkh^|Z8tC?5>s%IUK3_JXXKb{rTfh5_G~yAEq(N`)#e*=bGJwr)pAUHXiF0D> zktNt-n1)M771L2fySc3D3Ro2IkM5hx+1b=M$0?_rk3VNuqO@N>ghDzR8|#F{ zWq|0gL*lF6efy0#?zjVK@|1yzH{OXKfBIR{>7ISwKSaXt&WGRQ`KSI&y@Pk0?;GtM zqp@u^wr!_rY$p>tO&T}0Z6}Qz+nm_8ZR5=Mx6ZrH`yb4#xu1EidtZBhc5o!Kz_+*a zEGBypcYgSxt8s-~m?BhxdR(Hq1hyf8NR0zoz>E_JH2! zi)Ps2np_rpjvOB=wyu{K6z}ItX`ZV}3b<+P?bNNq?a6kMfq#QQ7WeuK7Ry738SQ@) zA1++(D{ds~E?@oE=H`2|^whI2xr4wdp@5~WPl#OQ^bn982O3C^vvXF{B?58{rk(9$ z##tw2DFL^--)|Fxc;rntx*VKNHKCy)9VgU}_LjCv_vVy^`zHA>g3GsjqC5Vu%`Y(Y zC6)WZ9oqqH`(~txLeu5{UY|AO)=m+x^_>BG;)jW2he~URx&$~mTrR=Ak4s)ai{A&VaVQ*$kOk@!Tbc6ayfQAp^AjI+EEv1bEFNJoLKSh1( zr#lvOz!nC?PrH!WwUEXjWX*9iUdB)^`jx;0UR=6QCLY1s6eBM|Vl1bi?mH*sP$hZ> zr)Tesfh%*=@u{j}$fjy@UOTA?BqgyGh>|aOR zcuh7W<}xK|snZ$l`G+-Ah4k~9vmN^V9xgu16Wu7d^P41 zqUlzck8(=xk`;mt^lfP7gp)tG^$70;Voc2swaIB)yR~#Q%xA|Ag;+y0FhN0r$BQMU zAd!Iyq*fc!zUuYM#AclZIte?XHsZlGm>ge|r3t!VZ)^#~_b*#{**%bBVxq)Rej_Ai zz_-U4uIT9V{RXzgL{`#-n6VKak}+7&{qQ4q=Xuh5^R?}pv08sVOLl4ZeKHm=uM^zA z*S6x$$Nc}hg`~^E5$uOl4)2f0kmqrJ(M9rLR}ZVzQadps(s*Pw`T1doD0YD^tz)tx zXIkbGd6yx|P*X^un!litfG95hvx!|b$4JWBs4t^Xc-fXN2FJk#V+2V)0ZxCCQDn_E zY0rjjBqozILp)}s!|C0(n`q|uNROV}-SpncO78y$<)6Jvs~g+-NXXOz_oTlSTb+IE zHX+gm!_d`0yS`0Zxpa`q>ueqN`F}gHJ=^gA-%3oX86~rpPYPA&4KOdgW=7;XLJGV2 zQutFA8g!!0;l$!9HY+BuV2l))3O>hNWW0V9St}<%$T^WDB zT6pM52;KbSZ|3W|fQgk0WgD17Ec%_!Pa({FqaSUVOR3P7?qm-MxMK4t9=W^!@)PnX zmEN$E5tF-65uN_P2lnX4QEL?+lJ>`cgRlu6ZPY-aTnWri(`#0iXZe@F@uyB#Pf~N+ zuf86B07E|e09foS32mzr@r^(cF?C*zT$r8&PpEVRox#!O1BhedKaN=az-%Z@xZ*n5 zCp8tKTY8j`8;z@{q@TkZUfvT^i0q`VszS;`lRY#Q#e_FZ$VFwxQu~N4#iym0EaQLm zT{+`|Lw2Exa99T-vQ!8h$Z)*X^1{q~zC3>QUjLwdwk#-n7L|n65EE&2Oa}88eq_QX zf?O4{a=L%L{kLEfu(9%%;-tPxULXApcf&gXBk| zUD>1B)vm(#5Q%GkvsvH8Ry)~?)D|Yb)xlNf z7hkQl`=UGD#F@>@06id|lqv={wZF&v-cy#n6qfPPf@?xpm)(C`)rW8pu~v_@q}F8r z*2pqX&_eKEM|FAOafs*heFH>R?TUzA1N&R`LEiJHXIVwe*p-56_|Oy{`xbL(c ztmE0}5l3&^D*`78>^zITA3LRAb41PzMHK)G+)$!P`Fxk8-yUCrW(>?#z~lz z*IYN7#M!t`@VHEom2U3%DLYfCW?j;vyORcj`~7z%Y;+BueiIoUozQ#uuCE=D(z_e~ zzKP-7>u6aB$}VPYa=ZDhWlbrWI^oJgqak3*5Yp**%DQw>+scX-E{m<{Nwwzh;cqH&#&t5K>m+Ob9TQooz&_h*`^%ddMZ2a z%DYn9?%#_%sd=kgGC4?q?5(2mRgRa}jn&N`j2UH-oZnfRwcR+ctW6fk?OlVKT_~CC ziD9vhT6OiI^xW+cU^OOp!@H9BDh<|Ies_G0eu%U0>6UhAc7$ut@Kze;RVn`SIprvq z58{32&la9*n*A?Tpk;{aiVFd;Cu>9D^t;71DoLS?E)YSP|7oiQtX)8k!J#aCc@<2@ zfiT)-_^JP4iuuRfY!(B4CFgtt-}nimU!~vX72sE&;2@FR{?OnHcI+uziu*$?_swK#wRGOR(k%xR! z9?CTz44xE4;3j-!5HsKAX}h5nzIDRtFi3?XwFiDw5KE~88pDh|F7 ziLq^tERVM&F+Hzqqg7rw2QOSElOQoW@J4rx1y=jGj4AJH8-yyn_B_t!@9Wkko!B9xRZ03Oe=1CGYptk7v25t`2F<69<``t>UCEvadN6I^{B z_5$kAw#xW;-XU?=AlzpSKRG-L*QPBnBuxH*nE$+%6RnVhU4@Kat#M$#K8v5w(EQ_= zE;(1(?hg+Mne4`S1tAexyaji44@-?gtt$R>erxfil{x~E`uqW|k_cH;{5MTTXSft9 z7JzviJt2V>VAtVM(9bM0 z>Qttr^knGNe#t3!L{P!&7i^@8;jeZ9&_J11k+28^w>mQg9r+5Q@6-=AGxOV{b#^MM z(DRJsm1hI#Uv?r)jOLe}>SU<<0rf;{f{mz44yoabexN>(K;50;2snG6TwDW^s=B7Z z>jBY^>m&5vudCXp+aVW6zl?ycv!q0_0-0^m{o~pX++~WS$@~TMgn|8mPUh7g4 zUi^QQVM%dB>Hpe-orqq5fBf57jQ0VHR0O`RL|@?)wd^Qv%i>H4gN&b~wQ8KLs^S#R z@N)eS84+RTWxC;P%kdi#)O#A-w)*X*s-Xd@5Rj?Fpra~Y-vG^z{ct4=mg&&Ncxs(e ze1POLLvtGrFM&&CLXafi1AM;8Ujm0}-g8FHIhZ7bpwU zmN1F)_Y3H5;{HcPI15?uMz0o=%w(uf9V|PbaxwoSQoKu7aHT(g@K`wIdux`Q*IAJt zMTtERcDg1QFM)_!=b4&fU&b8cf_<0h=L{t zSySsOtJk%)y1^9Pon0Uex(JaH!>zL(*9~?9I>oP>WQ^V!f;21hyfJyMj;bobF#77w zul@+{xS)@A343AEd0^pOozbMp_!>77tC9>x@%L3pSv$6G6aRe5|FVknUt zq8-9^Qaw`-7zC(er3p((;DBMp{k^<2zo3I!*_DsTO#6xTkK*7>higE)B4A9H)_hCi+t;o+|;-L#9f}2<-ym^x=i{h)&9$d%XvxP{Imu zj$+p~s;W%s3VbcW4cqZ-!H(M|cjO!RGk^&;hP8EWEwIKMv) zu5pDE1Gl23wL^LR9&5Ar!ngc#!!JKJ9F%ddPjfH;vz`5GkN#~!L=&3l) zwWC>*2mXG^#aAx;axr|))L!8NreJ>b_CnIVj_DT2O>qIFw#gmXH^VG^KO;B}9|L#R z<9VJ5PSeMdzCa={e!o`Gp)Zav9SOeMvg-@3#}5$uJ&>^r`p?{H+3O)BywgFlUITd9 z3%7K&kTkX#?t|$hIB%Y~=7GB41@89yAxJ}FaU;jf%DulDv(Hir$~h@ysG=^C2m zP0#F_hC!Txm>S{SsMEi4wygHj5LpjAmr3k5>vK~*XLn?{aJ$*uhW)9zex!lh4j_b8 z`?MjKNsKPED5@WngH;2=5d#d0}q!(2hslV$%jT8vJA?uT01wDhq4WU#ts*TO~(+rJ`VEfP2wmXmKf&pZY@5?%iN?#|^I4P$-DK$rzd0?}wh$gU(~bTy2`5YZ8EmC~uAjn?M#+n- zd?yWy#e~iYUM8P7g2MWip?fDIgROAUffn0$@koxXT(bcBy=z8IMW_6S_mVw!Sw7?& z?&IbyL4Ch(1y-XZC&ItORt1sG1Ur}m0(zm`1LC>g1E!9oZyrEBe~uG?82X^nE`x}Y z;0s)~>EIEc!rG@2yyd-7bB~>Rd{SnDGOe)j@6COe-;-cf)0qNOl_)&j+^~@Jm_V)v zTG|n5eSJ=(6eSKWuD;<>DnQu;GsCd-Rd)agBRrITWGEY09jHY?1VYKM82FuN<9Sn{ zA=mATaS(z;f$Ruw179rdR%kKL@3D(5{=I&H%3EdcV+Icb;RKYW#l&Gacr%3^Lz@0@v;J-yZR1e>gOyXJwrv(iv6MqT7no;IFKI43Qzwth3GGk8 ziq)n($0vsUy~q0ZfcRkVLyH}`er>v~9fL&((cXP$$Sla|5s!<={@loZR#9$-4vJcM z%wg7_H>8VXPkwjul{|{#G$Dd)riSE`)^Oy}T%-}QvwGX&%+ceM+#1MTh@_b4ye9%V z+JpcW^Mqw&w{mgao=g}3RjToL9qu49NpZcbK{2ezWk zo5tya&#JCu?5=&5nVl^T*^voz#FAZs%Q%6=^BTl{-N%lyv&mmW^Y~0^4VlT%3$tp& z3b=-G^c2);a{YdLdmEQ(7&TU0@3<~&N#5OKIax5*RIMmU8rDaUuf)S2@r;bjz-$Z2 zJENll6TXZ1{n~0g^T0$)>r5F$9U)#XM1zJS6;`w|PSXk?q(o2vb82`% zvvApDjR@~W1uMM*>2lX0j9%d!jX3piMZJ)X76us1Nn46LEy%?Z67Et?w0IZa)Ma{d zZ6dhLmm8hV5eHSoRY3ka!!GZCqTJhhj}oN(21aW=G=9o;{@V|Mwev7fJaFwi{etJL z8T%kAMc6;Z+fVEy5w?(Vj)HHLQuBJCn3Cvw^m)Ef8q5;h=~>0i+I=qTO^H{n*^IaM z!;6`1_g?h~>Gtbr=#|M@&dS<;N-A?{JBDLACCE z75N^B+=sJX6TQ>#&WA$Qpg;;)iz;;z#lLf29ZZQN&VA^_Sla$hFzdCL!^jo1Z=csr zFh@;u<8zB=yrz?0H?y|m+O(G+IB0NbGrH>--{w1yC^tU_vUNKqv5$+Qi^54)(>E>l z<`0);TAHs?F4B_p?ESS!2?vhMLck`sSxzQ(kj4Xj zqRSoyalMnl87na|APY6WDp~*sp7_d)PW|_UF_{?Tj3zgW6U-jL<2pbkrD8k5SfI~W*B+VO@B!&7 z{)2|JV>5bT3(vLz#LaghFCJ3kt0ms|`uY`q%RQX@!%cx<#~2NT`TkS3lpe$WR|wC5 z6Gs?s73|S|vP`AeWXceqv2o4?v6-0#%_z(4B2Ls*Lm-%5*rnAtT43s{31wi9HDndr z{vi&4Znv};%QigwsI$Sf z%Cweqqaj;{z@IR6S@-!A>kVV>Lkf)b%?j_Q)P?kjY$VEWwI=?Dq3{#T!u@*4UC8`R zPS~8Aha+q(54o<)*7HJsRM55YP_8f80|^u{)Bo6}avSi~doPOnQN z$aaP+qd16_OBf_?o6b83p{t`O$p(oUytA(^N*@c+vY#G2>f?;3)PY+K(WWkkSjjZA zTvG5@a2|O$GQP&bc!=iRT8LKoWe#{-(P6})g)At@F$e_lYR1=?n6pP=_aeWHK>*jX zbkFdf%q6n7p}xv1w|<+uZ`b>>$Y)d8!FU5n14gK{t_L`9j^>On8H*M`3=?zB+4+H4 zh<{N>n5gRds|g$}dKR>-w2otD$bl*w149sh@DPU7F`?b9O&603-&WR%&V6QSXJ^nvugGn^Y3i1{j9jRjfA z`q4}7rkLhA2h(HUPs*LShg9Fc)k{%Z)`mAJD{MMaW884W$8WCA9wbN&HvY6e-qOqJ z)%tZkz+E+^46;oxW)=t7qb#yMR|3UI>0@ zr~Q{@?qi2DW3`yTCGp{SI4!y3=xrE}rJ`{y{=rQs5F0aUQg_h^Nuw#hPW)>zwnEW9 zT4tZ?hg3_YN7%k7A;;_OA~QPrI{)#s~RJGpAJoJ-Ibp-am}LW}!?<$EcCo4?pn|3EdgdXt=S}&70S- zRDt_urCC6kkpjPC6av*|+V;$xDGKdKt;P^p&=YO{8e%tU!R%A)|@MA<1H zc+WJGHS~)MXA2lBOON*u`+zeI3C%vx`dE)i7 zil3EKQ}Xj?X%7_)NVV+;mA z&6UMc)O1KAP2c5qLPSGf4%`-eos0eT&j~I~j0;y{@DP6Of)M;d@mTC&DGJPx4rwaG zCIr^aU=6vwVlCQlkCYrbC8}RfYyJT;nrkYd{&l5Z1I<8<#7nv~&FRe&aJ8;0s5M471d-q*OcUNu-h*(qdsZSC6 zYMm1VG)z{We?$`xXv-_NvFg!=oP_vuSEv1{L_4({6z3Ue-4O=cSc(E_=TmfdYsmsw z-J8BQ=>lJJyj~Rb+#eox?_KVS=vkcyVE&`haN&1?+jo61oww{ErwRKZ|E-{}-ST}a zXra`+Tr0QC3ZaVpl#q9!pf>nLwYru$qqXJ#-a&Zow@sGD?*$XXclZO5gclbJOa8d4 zs%qZrzevO%?dO z%hVk6Lqt+#TNpWWaT!~}-U5cOsikOd!LBlzld_9RA-Y;ZrM|=KFU(O>CL`PBFWV?A*R$ zi}}dwY2)eo6hV2{9}>CGUDqz^PlEHh%N5AzS_)rQUNLNrlO1T4suu;1(KM*4Ea0EA z=x$ag6?A^iJ|&`UMaJeWr007AJu)%Tf9BBfhYa#w=8~wAe4jPu0RaS*&ysZFwLT$QZsk!9qbGk<6ue zpZ%k4G7B-8Ly~YpLAf3=H%F$(sJT8doy=eTU(pICfeo3?=8$u+Bc(rJUCy~+A90-g z%z~B;%e0BYEFRi|s*5Sq!NnSYGJtW@#Momy)9ZBbR!WJeLP?2s*0)=kOOzlT94l*< z7CNLC8wixz{oE4n2kK_~Z(Te*7k0ul>aNQ~t4qA0p6Qkpwy}`gHXEOER_-ddUE+Jc z^}E`(A80{|qbX$HQu#i=Xs)}ibuK&JW2bTZp>g5yqeF(+(sr-GQ>H!;_>cY7v1PGE zMdrWd@qRv88dzSP@#|rMf{>GQLa6K2jan1E{Mh)l5%svp_sqsNTQT{cBI*w!ZT&W5 zi_y+gKXZz`%(OeR%>o_1MgBSUe@3>VzOz^?w3jblDQ%oKXrMr;yI6&Dd6SWc{>s~XN^zv|x z(e_pQ2}s#GFm5|Ssykt7uA#~E(70wXi;Q1Ri+&XODDk{-kcW#OYZ}A=nS}_F<&Qu{ z+MiC?EMEv0mamu^Hl&EIohTWv(nFAG^i{T+D69#HItqBmeIrM7I} zyY#AC+I$;3`V#OUiI9(QJdcOnjZJrn&s2>%7+8;J(hP28*&}h$Eu%$dnj8VBcGo59 ztRtGbp9x>}Inm?Vnp2)}$%eXr_zi9azFt;8RY^LsjofJu zLnZX@7YRbV;BNjG+)j!$d`NY8t07~c3ALh)l08+E<9NibQ7}fKizT2$LlfMBi)qRK zQ|TbB2{}xbNiyo2R!7h`-r^hpK&nPhoB#3s1O5B_nM-b;d=>ML-q4X>&$c6;W=!Og za$G(6P=W@q*yH+?N3LjlZ+8vl&pSt3ajDrz6gO@k)BtHYv+5vY$FmdpYV%OC$fI{fs)&d0smrUDw~=|Q>& zN$r106pMce)QHjeAC(M}=Qmv{$tc2&dtd0^$aua`Ze_d zD42Q%exve$HFHW385=@qrl(J7xOpVThR1s$rrTR*FqI z)+&R&P`858(D*Sz#EBX@wCpuH*M8%+J8g7z1hB&Yxy{?8m3ZcsAxZHaDf#LEEv|UT zrZmI_tDJ~%#o{RMPYOn%*P0rp=8PG+ArWEZkcyhxAHPjcexdh$NN?@~{-|XD{dwb? zJxKpjoSt45BmL!~uxzY5p2bUmW@0QIMHv1g4{49)Tx`1;o2t0Kc4`w=778Yl5kb?? zlh?rSLw!8=jmCRmo6oAGZgiOyR0rn4pwj`DoV-BGbh*T9@Cy_XY^pS2oarnhPd80-jsP^T6($IyuKtuC)-e$~e0<(^aG+!v zmY>z9R?Cu{xDfZsQ~x=xQw|Vx6;dLaa8g~eu&mn`N-5!@-sy;w+008|1)wW036S6D zogDV2*or2gxz0yvZNk+>IkEryldd1lUStJQ%3Ue_ZRewgfe+2;@U#*xHuk2&+{qeR zbuIR#&{5G6`!E|#_PKP%Zsp1z0tRM;AK$N~A;EQ+$(*HL)nrnc(y!yBKlWZpSe_5? zp%C=Ky_n#6i-gTgH#?|kX&C~$8?n+?ptWlAAcCO}K$rplm%G#%39`WI#9%7GQ_Sdg z#thi3rf9_}>?~nOFa&@TcBaa>;bH`e`Ssc?Fj@Xo|E3jGxCYe719kJ+%Dh*mR~KsM z&9&qDi3su06TWPFtrZiG@;LAY!eN^xL~1xm07t@|@4pSD;kAqKUM9P<(C^m=5OdS7zn>;Rm{V!(bOQ)f@Dm&L7u&e4!%TVSUm1wc{%9U2o1YEnBkE?`c!$cHn<2qi(Ugz9!Ub{iFv_n4^ zBYE7?U|xPgb9t14-@HfJ<6$wzfC!?K8D=nd>&zbHSjAE(s*ut=2$a%Uc~>2VJm{iP zkH&o2MDu+Ek8%XFe!kr#kT7c(2BWKK~<|d?p6yLsQbq1_eI0!nE&#D^GqGlB-W@=D!8?c zJW+M$0U2mvjB5CKjo@2s-cxywsONE_xcrqTJ|iP?u(Wk#)PC`+=Qe^D%Hw0+({+Yz zQG+qBdl20$8>rjvP3B`L1L+n9v%@uNF~7Nph*Rh4#wl;5J)@i}SXQn_ikF>n`gdBZ znQ#Gk1SHke?LYNY3-1%|#}#s-4$1ix49Wf?3K3F4sR0Iv#LOib z77K+|(@>4g@O4#45dKam%*k0cls_+YW8v2w^Nn)<>0u>yp4pBB&S>1?F(63P@zh>m1+ z?M%(`Jq~?QlO!%6?3BwE1+HEKC?_6Wjnh9+!PJ}m^@^h345hB_wro87!RqCU^|<5d$APTwY1%@>{}GjO|-HiByhKT^t_#TrK0xJU+|F!lT*=G&ts?fKgy}!<{MAb zmbvDu01C^)@3n=j2f%V3qbWtlsf(|^@KOVbZ5C4C zuFWc=WxX+gfR2R+=MNwi4rSg*=# z1t%6}Q2JIL>LWH)b9cDhxrP%-)GWs_L3=-$glHU0qiZ1cLm;{>V7TZRS)?6}{8v&T zU~3N-9amAADBZg`5O#JIBwW@Z95u}<5>kGdKbl_?Ai~TnE;dPRZe=Gvy1v*Eq0{(; zG{`bf7uykOd2W0O=CivhHO>UVtO$N!Q@F>m(_e{BYN zUA3dsTYM@2|27EFeV24=bd|BSCkEo$>WI~^B_mbT)C@WeXGIwvYM5>o@U=-{vRh8| z5;%0oA)Yz+5x|Veh3=H-+7GfT3(F$r5N&xsKq~R<$awQ#NPEA$U=Fy!#t7KLcHFMg zH*oNvqX>DRz&z3Su6*&Jz!G}kh9KjG!>=jCfyxmVN(!hpefyL^=Jv;yv&r`B7eC>F zs$c6t6Wm*vsfL2_)w=1vqSdh2G(FmC0;s>%eW{vOy)jOO71JJ$NIc%6k8V!qzIxAj zUACR+r2i>4ufj76yfLj`A~NVnFmzo~v`W~KR@{>?^J1SirLs; zTz0vjkG-M{%#K;;dCau(>=gyZXRBtxVKtU0P+6ejuo}w{xzi6M!y9P-&HKd@SjXx$ zmY3K|%UphU6Rmgw7b4czWc?$Yc;3ab7$T%q%rxzYGoj(Sa#%A8^hrdj+mIo3+QBR< z2ITsTSi8qxb$*-3;?77XT_HkfC+y#Nlqm}IH4Gg{>sKLEO=are!(*I_&0oJ320vtjWaOOy(GDZ>0m=A`wo4(vJ80Ipx}; z7+vG$?B?EGNd#0fFjd3)AHGv#BRz@An^Db%Ug*9$)*Dt&AJAZWJ_{eqCg)sQwPvjA zO0X#mHbaRh8^M83!iWouDjm0DrD+ddf~+d6Iz!O~`E{a`M^Dm}M*Q7~TOLQA9q+fQ z0PAnNXUbcH>%sDI@%nUN->e?Qa=8s|?QCqQLi}h$P?!d)`J?&|QuQMcsymWlcuPmL zDy8Y>b)xh8VMqy)zvbQWC4~q`yh-$Pkljf-E(tRa*|*z=G}Cm)QXum~HoxB)zkjYV z3EZvomsM#OWOXm*S)qfACWaws{DaO+KTt3SF$pzKZLKX=TB8by0U5>Z z3vt;8`FG3E4Qz1OjyCM7uhyrA@@+ibIXv?@o&!-L^ZnXrq6#_%)@1{ z4_gzzmiKv7Q@g9tV75w&m3`5p0a#{#&NTNETuap*)x|LW+i!9LYiqiFZ=xlZrxS=%3@Wy>MX5wJrJfmL zfb?KOD+|MSc)m-|+Z&y~&Xq7dO1i5Fj7Y9twF`K{OUHWvYj9owYT#OBC7}dTv1#1S zl93~7DUJ)I`<9LHdDC9dfc$ab)7D@CbUhWMszM~a5kqMd5Ev0yLO`8Ke#8#mIB_ER z_4xs4^#J7-w?wahcNX++m;kd6{&L~#xwza0HICd`KOdA{<@1ZR?8V$U4R5687gNbx zV23W*rE(0A`0?T4#n8qGxpTjN9$8+)LISM*4qdiih3h{G1>uUIuqu(^_hgTZjiW90 zU#LMwr3!g%SUf4rft>{pnuywVPQ*N$J~|^3wSrp{xXv?V(%eE=tPm3JEnM_|JZ*-X z#%_@GOULx7FKtFLmntL*`M!_Rz~g#6kES|(LgN&cxq_~SHryZ<9g+D#@jQ(;?RUnZ zX|%xj_+*+H!rBnd;beX@LrsWbaOcYimdr1-^Rz+^$9Cx_|oVl7$@Zst%$oSMSm{SR@Ri{;1h$ z6?-NeOLdIh<*~!2m?*dBi3vuJ$6(FtkE!n6rE~QW9aIR61h5a(~yjhTF%cMWBl*O%4j8$u3hK%&9`F&25lbQG>y&B zH>|HSlqMk8XCwk?WMnKv_Yp(@nEQqs&HAseK((gg+T~yT$pI^#T~XD)+%NaEIv0Qy zj;|}FJ99N%!!)@*;UYFaG}>DP6crzq-C~JuR=DTj%BB)Bd)HomzcbWM^<8>hlHG({ zxa;@0XLjq0v_X%lcN~`8Gv=VO5$^k4P*+V2H#9eAx;4t`HxmiRfL)SD<<>&R!(A1c zoS2kL+vv8hqf9_;bdZ;&+f~ObNJ?*AK1I$snyNC!2%kW$zts4dj_$UGAAd(QXw7OX z_h}-GZ*}r`_)};L!VUK3yj?09H4}XR-}XXJy2pb2@$9>{&IJJVy!$KLQ|=jhL00@r z^3(zICo5JgGnZC9nN14~AZya#V)YL;Cr$XRLb&| znV1|75-!8FpnkVHago#h0R9&A)pi_!albuH%dQV?!ExxgWjU|5&GOrM;CUQyQTZ`X zQkvz;5Q0eTznkFfeLKj(pxu@P6ND=CzWd7rNvC!%=myF;cc3VfxMw1fNz%&&qwB@K zjb-Sn^MU-+=gaT9KWcD<(*3bwN@(Z+CtGxBq{ldvI5>6dJptwnx9j~BR*m5mLlhs- z^}6%x`&`3SS3k=A%87Ha*U4|A4#eza^)T40cC;m>HtbyQXJl$cJ_6>>YeZ*+2rDeI zpsDUxNow_EEcv=&Az0Jf;jMgc5n)32X(b4QN8xQ2Ow5$sHlT7piQnX4Z1?z3f2?ry z=vBubc4hvI*VmtXhnkp}N!!zqzeLj++G=p{7F{&yp%SskT)s}(q(Mh zsyT<%XtGUkpxsEmtPf15{F${)Es%-dcqGoZ%m#p(H#B5-=Gt<6aXLJhsvk|%w1(dO z@yZ{=e}W6Kf&k@VG0p$F=1{Ura+DSA`wx)OF}4;bUb1&rE{JmxeB2%*XzTd#={klM!wS527Aaox2Y+ySov{{fBX86u1s?>y2IBYAk zc6wYR`g+jycK)3nZ5(l}?2cEPO`4vG(73d*G5u1K9(nnfVT+*syc)B#v5Js4UOKKo z8K$|pxvL>46RncDyQu5XpQ7s!KB!jhGATsD#Mf0_jh$)V_PuG{SyhcemojF8f@?kQ z6m6hsEk@jJ!Fi?w7JmP-bIO1=-(_i@V_L##Y62#6=zqwWB8~a zC)X$7W)H?>xGL1>Oc559U`CEP%{q!$TZ(xUHAc`xb3BthHfCx_h(9*}?yc6<3N)k^ zk+`q^#?8q1Xiz&G-hoxj!`UL;$9nAVM|sB}xPRIiPXrYh2*8CL4k%$r?X1tm4ywRj z1p(GWfJ_1zTF1)e{#@tvz!F+Uk{Eer0W62ESB{RZEROtkVqE3{>9FYUw8TNm)ZLK* z;#>n$!b;Na_VE%cBct?#UG4T_kmfKOb9&yw2lR+nxdD5~YtVSYNum(~wlh^COCS6j-lJ zPwZDD96+pYS$|V@qZ*wAoF&zPaXSrf{qMJYeQk1?Cn6RaFio5G0@eAyX8i*w!gmn1 z^FW0m_ql$3cQqZLBp)A`u0y-vrl%hpYcueAS{!9tI94DCJP>v-8)dV%7nUew?dmgC z!r01I>ks#)FG;3t7xberKzQ9}DO;<>$fDG@$9Q-QDDSxLG;F-xZ*zv< z{Cf7m#KJ-YcSMU3zQpC=T%>WQBx_ggY_6A1R zEwoHrubw$<2PG;ENEJ%|T*)08EzJhKE7HOU96F%~izPkoHlE;;R&U;c%ov%SNFj(s z3~U9A6$HWIr(%eU7ulwFG1%TGElE`f!HyZskM_S5jehL5&ksA0dTB z-ngA2p&9a4$ly5wBbex6@x}DNUodB`=!(#O$mB)>L;jk9GoknpOM%cS#?c$ZLPs!A z9&&&b;v!KprSoeevjgmcGTSg2LJ);?+UOYV>bDRVEZKIE2;rn4t8B-<#&ff4z7{NHQUU*V zC}c|-rN$ahkJqU#g}CY#VDYHYvH%v@0oE=^b7bQs%ZpI;2#onVW+Lme_@$PE)J`7i zv+%0G6SYb^mb~=XTN5}Vmq+B@a%DUm*AF|*z{kYF9{GzUUBh$p zyvOo3WjO8EV?^k)AJB5Wez&uayRKGvdWsLCkbtq5e1)78o1`Ktj-!J(JL7Z8eV_+ffgVdqO?}DadD__Hxc6&2F;)nzTw13iu4w_} zkJpEOd+W9TY0KIV@wcRj4n5yoXnP%ji5pf9T7wb3zi&|9X+UMz_!-8OGPRvAk{U7= z&lNm-pvLJTdZqaX3u%m)?YlDq%*SblhMWQn2M0nbZUINxz_AMtW}J`q9X34l{$Pds z0s#K6KIpCoh2G6ZNx{V&9R9?Yz4R?;>IlsUGrAhfVZWhDUlsV_eu6WKh6d$5`oWc5 z3nv>=W>|MGl89U8I>p=IFROVgwC=!Aq9nrpF`P(xX^KvPWz)-nb;gCwnO&4t<(3wY zel7#1hn1ZlIM}!k%fM_t3iefTcANyR_#qG6U`oT65Et`5`K=IO6}@+ViVnN9!=Va& zMl`9jNXwjluukWirp~pQu8zOkCKeTjE25Za9+d2zV09~4n{-$SUVTr-sg^FV+gceHd4kqMrMFf7VU?B4{ z@gw=YwQ(V~AmJykriKPr)g$!2SXObO@IDsiG-ZMQyXbiW2+@#BJ9MjEx1(#HiK7$qXjnq@L_aVR4m7Fy;hHP7k_T8)1uM&$u(*b~ z3SxQk8(IPkv)q6+jW8Kt%|xcUDJ_V{Ri;4!7uKZJlpH8<$_`O1YlsOjX=^nIm~^xe zmxrS=xZFykE6g_(gWKM!BoPUxEM1jLMKsV7QB~H3F)-tly62pE7A=W?fPMDa7X<`_ zs)?<*887h=-_f%Qh$v=+s%mTT%WuEp+Uu^z%s+p}u;Clv>o2|{ zkm<(j?|h8icG?leMa6jR(Z}%I3(uopd6`HY7B8v55l0`7iC0|?pD&95wI+_ed@FOa zGbR2r&pudt%Z_$U1X$ny@2A*x!q%Af>nvP)<+TK=x5oMB{zE{p+r`liR2IP8+$<;w zn}!@ZS7pT#Y_Q>ITz1t&3>r94n9%7zPsdi;b`4Z~}%oQ*55xdyMj z^&vLdbQ5BTPo_TOmDN7(=S_9Xr+)6y!?{-+A|4y!PrVlDY2X7hi(Mm78ASOWSIhW~6De zm9|tZl|113n}D~@0(^z$%B0bT1Mkm7ZYLo}O?5`*BS7j#@$Sc?_VX_nqXFKwqpb5Q9>nPF>_jAts8Pn-thHWP^G z@OXVPs0Zmdj-l!Dc!hNi)60)%@O*B!$7j}u!z;C`>{xUHCk;AL4nJi!Jpaze2Z=pk zJuz?N*uhSx2Wjhr#-7=2#Ms(Bh`M>=V+a6qw9|cOPj8-T5txa4b=cd9U5kbg^_feP z90#>ED1%)j(}_5Bd$&J~NQM(U-s^M@!(&^iWlT;jTwk};j53ni9z9_pin9kvUkx<^ zV=pw2TdthUSQo3OI(M&(0R#UOPWZ6mcL^JWNgAV`^~lJnnnC2ORC7t%cg6 z0o(7i2WqOSFk||67%*TYmRBysR{z)DRRCB~b>VMb$G+`emZdu+1rZPx6}uHXu)DFl z#m4Sd?8YusP(r$Ef$e(T^Ph8P=DoMeE~0`gzjO4l?@ipfGjrp+->H#%2teDb??9|s zvx0zVXW@v&rc)cs*JAjtW3gcVZ|F(;%h#_%V|_J7j2t5z&SwAi3r;=rOpF~n4yT=X zIdATbzJ zqB_)6RnWd{`c4e*@&y>b-$8ieq7H5fQ#6xI^BW+!5P51Cn+sI99-ZWe?53fLTW5ktI=z_i~RM9!J`6N(E9v2gxE0tF2 zw3HbQ_}D(40R9GgZhmhaCLDMKe*W=mB1B|l=HwtJD+`sC6$J2Y1fsLBY{>$2B|tCH z%Wm=p6zz<`ARNKG#L_bG4Tf0j=fmi+dtuJ+vxsS3joa^g2re3zAG&{vU~(&HA(N4o zN$<#wvd&%TJ(r`9>dxjB{Je(mx+^?%-%A$#ft=g|Vxdd1ZtXh3s29?G@v{pC8nN$$ z!|~g!A5q`Xg#3aIv`C2T0L|*w32U%C^qwM`=1Nl1pSN7>GmGu>H_?3B)MiQ9%VBodnJkR_qK<;a(Wp?Klo_py9 z9C!5LShR#DiH;@2I5^O~XFod6C?-O7NYltMW{aBKjqrQCVnSuW%zIc3>+uB8p|k)U zI+Wn2AHNf}ki3F6QirXt--J=4$Iu{NgSBhc!0vWCxa#}ce@?<{)-~C4*UXX(N#Cu2Ge^{WG#y# zmPYT;7enoyq(#VQx>SN?UL08q{iqp2tkQS`vK|fz^k;4eqWT=_H+6AjzeS55rx6Xu z*pU841Xe1)c6STxb0e^8nt?6IUj@3sdSK{ez>zB_`k?@t2F0#cbX8f&fEHt?F>6vg z0rf9;DG{dHpoAh546H$QW@D!`x=p*2%_Af=nuA&f^>3r3*zq=xnkJ{1O30#5$74!N zUBN0F6dN=)r4-tGh|L1<5($cLZUq9BI}Ye-kH<#iRbxY~P?bB0uJ+RyVJD{3<8Bfv zYme6>7{*X2AdX@4C7azYzypU@WYEM+ui0!R&`kZFkUcMq2M^f=4fTy!y?UkCr$n$& zLMi$KbPZaF3$rc`uo#O8vl@usk{I8Z-BreGz7J+jl`SxS_TZj>1UHXoRkBF({$Um`LF3 z@L0xnupGOW!FFSPov>Twx@z?nPRObayvb-$v+hL&=@2IHXR;WDIR+okVcJC4F!jN+ zH9KF&LeIahrV82FIZ6mO8G_VMLYXP-J3livl@KNck`gM64Hq~xCHHGBRxShhCVH0{ znK>fH?(rv{3|B@v9-eX!3JN=_W)V~uimVAk|(q4Kh|Wcf0CLBPk)q*nUb%nMrvt=CXS9 z?utVWKL#!uye6G}F&gVOiNUA7ej`pj<2;cDc*4Plq2De8(bQOttFF5p4NXlr^Sleh zB+;>BA;#>rpYTLZ&&(w-U4aWPyN<4Fz~1{#K)-%#MUS zIOfDjNGG71ms<*l-6k?;?KWm_3>>^G0ptu3bMsglQ2l{=Vr$$u>bR5XenP5Up1xjd z55jhmp~eQ({YrgTG240 z7qPpIsD8W*7)-~EaH4)nM>L$C4ea8A`j$X$WW+hVj1@6>v13KpT$8qlV<9up;h43;{-1y& zgS7ztWoI*XGGy&fTy@g5MYU)6@x+sw9GQHs{W@Rf5!6Vi$!L#q-l#m06+_s z6^TRypcT<)cnpnesR@*YzxKE_TUrK{aamRu90qZ1j_b{3*z8tfqi19Kr=JizoT-dE ztl6S^G9$`hF%$|4kgJrbynBPmDE^w+7G22~%FzY%nO-6@b=Y6cH;F z^D$+im(T=q87by(3|@JW!%1FpatiRqYp)W>eGtW^U6eS%F{SQo=gZ~t^(+P@wlKdJ zUa;^zN9lUny(oPyE*2h&wlIJ+mrLA_u;p*(goa{fq|Za`QFNf&jzzQ2V+Mj*4|NU$ zpgE{Wv`P+}7d-+m1rzxSq4^=0Sgh)F(!*p{s9Y<%#}t9bjh=P_`=0Q4ZncoC`be*5JIEcjy% z1`Hl1JgeOVd^>mPgXN1Cps1uH*cOdFi@%!wDMs!-M%)XlJdH_ZIy8xbRN*36$o;){86W{~>o7n;aiq&5p6nc5pEvXYz8OJL%v3)JPWv5Pf(TSdaZ3c7p>EIg0HeocW9=c@dzW6FA6GQTBfnoZK;1-JEytNK=RrQsIsy$Y0;c1z|@w`{j1L) z34oLL$=7q*UC1OdAeIutS&O=%eQ!%-pw)KMyd3-^ky^PXTGX-4bGPy#C7vxH7AF}Q zIW*pL1eHj$auVf9&Fi7ntJ%G`{Hs2Tc8+foq9pg&S!(;=5*_INL)jigVr!EjPndPJ zHDX1ttsBL>CqV#AwjZ1F@KZSP_!H5q&maUN0Y!xj&1AuV2&vD!1Vjyn)WF*YRn20g z)pMq>z2ee2!w@@YFeJ7JkL0j8mKlU-JPIc<0}ZttPtqiuDcI42L+fxIXZ$c7=UsX= zYDrDDe%)G3I_ENs-E+KnR(yV4Z7sh0>JuDr@Db?Jqqp$3S8Tx~9DMjhVr?fOEzL>4 z%_8#!FNSD0q82Mj4Qg;9UQUaV9L~5D zq?Zrj#qA$aNVKMmj9)!S-z34cwjNbKj(~J+C2VeLo5jTZ5Yvy!FzVhP2;0T;VVL6~ zCfE#oT8GfReNlNz9xV0S9_VULVit=*$#iBiG&fB^G7}j~TmzS?{cR*H2~Zpk$qDm= z)OfhfCwVCmdW;!hlPPJU!1lqiluRouOdues4t_F-yc8m`tCGml)(A@^IUD~!NGx>TLsIu)( zeM1e*q>htRyD27nA_N|~_w0{buD=$6P@I5hJh8Im$x^82XeO+#-Xv79+67eKY=se} z!MnO@12L`L2|zkfSWt|50++0ywa zEa`%!#N<|0ZbX29azcf;dt6k*d?jRiH_6#v`U0Yz$4{wy|{|n69M9S8P@Ns zVSA6t>25?iJ2w9AC8n3qT`&Ua&3e>P|vn44&Q;BfEqJi2_Fs@GM$%G9Y zZO^EN5MwaPAXJzSa54!C5;1QLCT${2mZ^YX&AfrYu~~H_GYTIf0?TT|6=5eSCBlz! z`rmk5IhM~ho76gsf}yIL75m)e6?D->m+dKvjkh+Z>eAjs4==WjBms7}RXbO8q>`}R zii!=)Fa^ARR7W=J6;J~R^3YS5zKYZuU{ zV>&b=I~N~+@F`9^;|%P({~>tytycuFo^Hrm6}jopuf}!|C|(+b>XCTaI0Z?t-(ayr#xRy!70&1Q;4nTvUe1 zH{OGd>(}AiuRlXhZm|e4!wzhdZ@33`yB)8-_!L$UNDlY{2nQnyBTayw(@z>rPND8~ z6X=br5gBx8AHvK|dc6ttH&(&BVLULi39j>2!gE7!RB!S?`i2%XUJ2RrgYesoXgZ__ z7?KVYIpMy&3+zJ|!g}~hgnk%F=rRh|UaKI-9Pqu+6Sjlr!-DLr9>Lw zpdV`JFjZG0DIv{bDJBR;)nYQPGRUHQb)RAq&|Dj2l(s*Up#y1MbW!?2B5{i@?N0Ql z3x7fW>`4WhwoTLpaV=r|1g#**DN)}wCk0n#27y8+v05g?q?m9t6CIA(USiK;p%@xH z^#~KtH5jcaa6m~VoR}3230zG;vR*Jx?D1;1yHH!b0Xcac1nU~6*_d-JIh`3Ij<36^ zT2a4B7Ln&XDsx7xTH!QeAc`u@nFX)6PJ~J03EP#P4T&hQrurJ;aT|%mkd>1!ylF)= zh=xjG!z(hXIkJVLiN{k%V89~oGaie;97#c}%Jovc zApkX!0x_Bm^}?)xgPgMmvWfJi3@X_e&gW6}c zNC*7gZkG~vx{9Z}61s_>g+X0ma=0+bq=j-)jx8uu7+o$$bRA}S4N4@4MAG1tzN@jr z!gPYcwjpslJ6u|G!uq$atI5tvw#jI&692Pjxvih|_I!6cs$FakQ8X($rQ04w2fBYz z{uJzP%XZFXC9+5v)C3aA3$SAvOFSAzAk6HTPjy~V5-@PQMMc^Gxl$73CN3vHWHfP| zNI0Cp5)61#g(q#ctxcwBRRF5o!ki!y4l4E1!kjU{jYXklx>C+n(py4}8LDkp>XH=A z(^RJ}^Ov#J1C1G&6SL{2cONh1u3xq`{8j1>%mwaleTk``JBL?qRY zR|U2PZIPflkP-bGjw;$2SyEE3$|?xvgJN;@{?$jIG0hT^Y_4(JnlJxt(H!h}q3~~7 z83}U_gOmVM@%YZCyi}f@AyIcNE^oYzXZdIQQ-$XVc`KfY;8kQPC8~t9&B8evwz3X8 zgBWyYw00}HGuq#fe{--F`5Z*w;fc+Rq@pq@oF0;clyiJa&dy>;fXY;zNh=_?&HG61 z_|w6%l>=IC+nQriudUnM{-4O!zDBi~roQ*h+fZ9Sw!OsF0Hh3X{eF)78Bc&UVH%)1 zbQ)9#G%f3y-WM$_i-|W za5%KZXjJ#hEy~mWa(s05o8X1lmYxTjA%%ls_=A2C`!+~w46z8+jBsRS@fKtw zbG1FAjcd02YZP^8QZo-W-@h}8oEqOxmv$vO(EXdzW_#Wa9aS=>6fT0Ao07jUxzE=mBCxQTQ%-IUoDRD%y=r8$tfoda9dcBp z`)zD&K!^a9-DyKkPL4=S)0QJ5gIvDOX_HRJC0AaF8*jN4jx;BMz(#mHjbf3(b!%#@ z7v(Z*%4RcsO}D#20f0MrrN9e=>WXSyd(#cDTFk`ohedkgi?6s0RTUK?6>lTeUt!DR z=-#~>8VS%(I_oS{Zdy+ZFE6!SPR`*M_sJ>KIa3*@s9m>iDK5P9GO=Lbdv8nlc@5ol z7={ho73K0Osc$V25aq zr5#ty-26U2%GWQ&xffmt$z&8x#%#{!^EFak8-$<6PAB@D+HOS$y8l301&iCMu`3fI z64;faF(d(R8|R2)4B{_Zc!ukui!PfB14yqgF5=*_>R(~iq=b_hi?FRFu*;S_F;2y6 zO7daB~>@?XQw&4Q&peG*)dI00c%`PwTZa5YPhnPoU~k0QvRweuwn>^a6l=S z@c{2*U~Muaqdl}2Eh^sw$M5b?QjBz08itJ+fg_GS8eO_}M^#lV#_l-|M;?7Fv6j_1 z`q+s$?xYh55LIFSgAT%>haW}&w-F^Bim>a*k(hY=@xlrAfCCQ138$Paz-U|;nY4Cc zqlg9Gy?b{&{>X#4?ZzvyseB_wjU9u74?jdu@eOqi*pJGZaKHh?_|}Nj|8g|_DsJ%Oz(~5$ELhQZwUR3|p^jr=>$I?=&UlT^sGvWHy*VobW*$tDO zc1M0*9u7YAa15huRh1PeE-t}|r<{V$T{?>-Jw5yO#PKJcfxNt2n5mr4VllJZ=-qMDvB%QuQ&bf@6TvG% z+R1AC-w_??Zfn_|?OeiU$s`mo+xjP=6ILDDB!doeb1UQu9$H*jcWNxTKU!03m+T zH8^2}Q4LdOwW#rQwf*$rq=C}rik%%Gd~uUtaPtZZaM<7g8&I)f13kNRtXZ`NM;&tnTp5`-=Yn%F{qxT->Fje+T3Ui*C!UB|Gk>IZp8luI zsU*j!4Ttf{i!T${J(n2ZD5^HD#wAx=icmO6&u~8s7&IJf)~vyT`EyZB3z}X8b|)OL zKSu1fEA||}C%yL~TErZOFQu*!Czo(B0Ou9oxA!=^-^7?$(@V(gCh6x@?UIfT=owvKc@s zsi#e3!uias_*WYYYP194w8lUbg-R$K zCXk$gfIoo6ix*=fG0j$s6_uOHv10iO9B}Yqm@{V{dJy3C5)cphn^0R@k7bMJiwHcN z(Q-8bac1#t7Bjl{>_Ok_F@N4~_?Fs3@4kJ|qi0WeJs#0!b_P-0Xmmcey^0QWcS4cc zuz44`wp;WxDaG7D7hQDub76K=$#|w@A>&RZ8I?|_Ie!U&l{$LLimF#Q)~GfILXjC) zKEj@s05Jzji3F5WQf+BX+F~@O9K%r_jA|qY4cJ=LP=JZ7XR0F`GryVxnyl7^Dg6Pw9kH^%99 z!7RH)L~bZ2hLcSmGD(#ljYT#a-jv@Qse-^CM}dhOL{gg1KK>kbhf}E0ZFUE~`}SMp zWM`vG_s#?YYcOi}T?LEGHo+cGP}rL8Fj2|DU?2hu-S=0-hO(paoZsgm-Ib0nKl@Oa zadhj^O(gcIsN962k|OjQI20bYTRdZ)57w+)ERy-$eCHGbydk{*&TF&?vg77EIJ0C> zXcZv0&YK7`8)`%0P!JA>17CdpDHbkT1cyDFp5-URz?P!8xLB~fYuBy8`Ik(lMa*}| z&(Fu_AH65yo-bOsfIxBufm<_fzxPr6@Xgosd}U#)%fhMMFFXHyV$=`B&=F(MgYJjx z;`8~b5189rrM0&yO-g+9$+kU;o-pDcO6t=S2_w!0oVhBq@(&V5Z1I}>Ph1H>By5?K zxkE%=U_B{sS28at)RbxB)GE+?#nCa!Z1VYMRq1@5zan+Ly zhPW_?5a8I%2_vK(nlOUHT?GiZuqgnCFSHWaV2a^pjq%cVH}V#f*JgHbqk`30-%Zfrt&W;z1FAT4anXl!aA<~bYn z#Ejyvd78RnZx(exO>B5Ov$E z5~J1Jy>L1m@VY(JCM}4@!y-WthlX@G?4-3Y!%xR>+hFHDetuR`FE9h|qITu= zHz1qp5{iUH+wr&?;jlUAJ$a$54h}z~PtlWs@$gh_KY8iIQ2mgce?w6Z@3t0;yq!QX_^)ZEoA< z^;DX%P`9(wnaPv{yGAJqJ~_rMX~h*Sij=HB@3+|{VTz#nifUoQp#Bw(ZAc-jH1h`S zkNQ9i>NyN@#r4bz!^?n^zw`cRT&r)=5e>~^5$yOCF0-&!8k^KcAZ#?4rL>T`TLUpl zNJPcH*=Dz>$vOCJB{Q8iu5i?VL^)fyHxX|+#$ec<07=YLhW@`Zh>DLqY4 z>vjj%B~7rHu8a(Yjo-l_itE4;JM6?hbDdr3F7exD5e*O7oIHo_Avd>3>`%`~Qx_n1 zVcRRfCjHIL%NL80y!>2Y*PKV^aTqt3HRDfX*mC@92C~}oOe4U}=cEx(=4_od*woh` zi@NYDV;f<1K;-u;?2I`{P-eF1Q~CLY1e_xxyjg?*p`Ac3pXYR@(L&55SYS52up2W( z-Q%hT!(z3F#Z817yh&B7#MG4+gK%*du~;)g=ihe7lyuXDb}Ks2{fF{zbta9)$%BfuYp{ID96a~vy(r(b9@)7i3d^eo5tmxg z$caIfkD=e?RvMCdp)FDXm zKz-hT#-L2>rx~%vI>eos1hfsvNrOlqZ!i+zj#R-A_6l3xn8600xe#%Kg`P`X^b6Lo z{9B1i1Stev+N0<|cN@s|>_oC^x2Fs?1PF-AsjXR$iN~FZ$@kw6Q?3neKj3GRCr&Ws zw48nV1aN!$lIZ#=Fryo?*7^xa4x z%w$s1_X<+h#M$7KFkmL5vdyH1D3eoxs|rAv^);#^Fq=7WpVV$8)qz{vrkehWNDkth zxDw{f*y8@hb}0#Z+oQA$$F`;I(pH@Jcdp&q@AhcowYBx#tnR8aM{9Wu{_=fF+Je<6 zRPQ{-Gus=D#>Ko;(Xa&jbh!j0N)AG{s{~6o{EF!tU&5xwpAo9_W8Wi=NAYflptzs} zYgR2p`S;T>DJ;NQP8&{3>w=CE2P!=tJZW5q$A~yF*12$U&lNa!uP6o%1=g-E z$NOIxaqrBYD98&TJL1KX&bK3!z9&`C0;6v(I&QoXc3(NX){eBejO~zYe7dwh(ShzZ zl$OlJHjxy@!|Jf1zH%L2`)mgKj^7ov^|YfV<=X0B&J^sU33nxZ@3_Zse7k%Nj@f-I z=FR_&R7i^INRB6&Bv#>tf*#y_#}u4->aobn&7_sLU8uZ%neh#7xbO^af+mk&1dJcpy%Zga9Vja9hTX^QiFc=ch%aXR zjzVgK*IYgc%a<<1Z?hNTtDoiy@A;RWc^EIh@HDBM)3>P^gD_E0ZQ26?84i0gS%iph z8&iR=oMdbzl~rXFYS7FJv?i};S(9K*PDXNI5FAgKA_0z+XjXhpua`reDU}kbg5@Mw zmXgIKnPGJ!gWqQNg!Us`7c)JuXd6ttNCS-)G28yp^%5L8l#pXmE7y}!j#XI96qDyx zSvpy@LuuLcwDOvt-@FvXRKxI>O(U8)7OTZ=sR$FR^nGDSRud=J``e=36E99#%g50c zLSa9$v$7F31>vV_ynJL8GLeMuNV5T}7I(&)T@Ht<@>&$HcnCgQ7kbWr&Hv?}h_K7mr@D42 zdent>EQ;L`#AwDgN;MU0@b-6e(0wd{+-mArvE&fmn(+1r4HE0zzz4Iw$LLY}qM@NO zF`&zFl`)3G6otbvQU@Dx#IdIf2c9#|o-9(A3LgQw*o>Krv2Ifn4mtQ3bnDp@r=5N( zo`3Nr!Srt0Q~|dqOaqk*i&oZP(X#chTH}bYSM<)9R2iXcGjR4D3m-RtD2kwcr~!r$~~cd2-nRT zl~5gPKvYugE9s_#1e!!fEpQe(D;n!-lXlr?3EHFSELB2t9eXl%7yi^WC@k$QvzA>mM`37d0q0X0?SG32=_2H|M-XJD828i_TvZg9i4(GP2d`q@Mu`faK7A#RkK9nYD_ zEWRjwjrAx$z6+{K4X|(W{p~0cTt|-7z<(R4%mD*?;h{&SVAaYcuv^mLb5vv5rloLp zp@l?I08N_+{Dvc_^!jn?h{>?L?8EdICu7B;dTgq#!qVAm@XLLtB3m}WGv!X;htKJ= zggSv0n6m~Ta-~~ZCJvcfif{u}V38H!ks-*TOn`RhcLRQZ*)8mO7QPfk<>PUzd_YF^ z+i`R+20R(Jqq^i+*dkT`s*SFa0vNiqL(ze5JC%gV0u7oRMy9s998+KV7-hQ-fV)8% z(6XFLu=v(GGoPC7P~vGa!@HywczXJKDC=0N81`$C9<+0LFtcajnU_AprI$_?hK8q~ zJ_*mi@)6>a9S0wFJYIhBMI5;QUU>PHCuzWI!0MH2asPvlBOLT%zwvuexp7RN{wr>| z_8Q!9-Ie(M2U15jR*N`{y8QPV_$Bdn0)FgRgPBdw*EG3=JG?UmwX0ntrTYWg{9|qH5Ey07jJr+-z zF9IU&OYaCTz}(@s3P#m zKvZipoTY2Sy7d^l=bqSo)UIfvfwgMW24c}Ic$OCMIoX-0s;L&<^r^yWc-OC4ildG_ zj_O@T45wSM&!jrm6OhYDPs8I+K7rD*4rpws!-no7L3{yUD49Ci+2f$JnNW`3Dra02*!J5%_RKK$q zVylyoNq=R^l1pebhblB~7G&R)Vxo4lo(T5+5(R=QV>gp<#SbE}x zMJJ-*00V}c>_E4p45(ZhK)9OTchHZ*n$dW9>g#y&>B+eAimUL&=Tp(>9D_}--;AdU zcSZc#(}DX=BCz{Db^OtYe(*3oI)FYE%h!!@Q&r^ zUKoRy)Rz%jK;^m&SpHxP)*_&x^CP5n@o~Uw{F@>t{?Vm9i4JtztEiJ)JRTLXAp7*{ zh4B;jCq`DWpF@ic9X<$ez4kobn)a#)c{X;B-7$aOToe_R;E%b#V$h%gN~~UCa$*#0Zf$i1 zPMvfno_ur)-g@gbVs9&jTHo8`6RC>l&-+zqAZE_^9)pGs!YQYnjlD?=H~sSu5%AXG z%Bv>hxT6oH_7o6NaoQ4I2pFhL@0neIdQz<|TL-MIpid>K>8gMQtAV~{SUb!BV}Knr zh!m;zVB;;_5xaXFK+G=+N`RF#U=Qn##_#tPT8Y2XUwAgwVsc!u0ksMA!UASN|ROV?1n?pTqXSF0jqM3CQfG z#`q&bx8ig(gw2RhEqzg_lb;cfPoghjJN#*#l0mESH|&!CqDY!;iO%Y_JJEq|dll8R z)l8~2cT*KEp8P1Pg381gpuXGfEa3f*fKy5HbLJzY&LLLGoD$lF{vSDde{pWQ(}+Lj%p$hA4iir}6K9=w30AE3lG?BwHUcBM z{5Qoytenr+M3es<^zS>I0BnDhuUjYf?R&tH$j>dr`)|L7V91LD4my%RV+8vicoe38 z@e|F_9dPCur{R;2-$$pey)fg~h3M3!2QIt(M$DPBlvK_^1VVvrZlkM2SU>`#s?(RU zm{c=-@qTBzlwe*p8`(%KnFvB70=4 zfx8UGAqO9V!n_=~((~xy#zi{aicPEV6D{P=Jogd-DnkTx@4EM1Joo$y*lX-aJoD^} zcMf4B0A!FyPrlw7}YVsA-PG@1<=v^`G zy-#q%wO5IkQ(aR>EOrcCy7tEHw_b}8yY8mc-ym(-9D|Qxp1@3vVHu6rb)=?iBo?@d zJ^^Alf*wdwWtGL&v5_nXGG8JPJeL@d4fTMRn2}5x{J)<|pEZbi`~tXcy{LA}R8NPK z4aPY(u>u}9Y^p(Ceu2_Rn~WHKW(@njl1BYP#!F*7C>&@(_i+~3%yvBb*he_*;PI&2 zNLs+hY2wO@;)^5hLgu=8@V);wq*vZT{Pg`0iPL>Oel|=uJ*ZrM!w-o6axna7&@~o6 z0QeUpzH3l)n97y)IPqZvCO_-MNkjr~s8deqLX0lL)W=MF6C+*=t#@p1GX`POq@&z+ zDY`RSJCsC!l$4F2YMMIa*{jSJHT&j0@X*B=o$T|-R7H@NlgM~P8c zh7UgZ7|~!Y-g@N;JpS~1@RKU~zDHgV2EM0FIt5eic^ql!>3I3o&*)+ij2zJyue|XE zfshdP+h-^;vxMg^w7Pxh+Ow?zx@+F{p5YzdHb~lC~UapmaFmni=ScxX(aaFXBhGe zJ1fELw=q?tWb9R)ic)}N!g({sQA()K*ptjFkdhLYCgNX1Tx2Xozm|G<~n%vC!DdDiD+Vt+|phuSa5LTX)15E5gDySx6 z8;R9z^dakzpWsjTA}cc=haNEzvuA#f6|2@@+O)Tb!L7l`r=E#Pw9t9`?P>Vwr=PHL z#R{Bx);Son=L7^iZe&rL;wUn$NhA_RPF^7%oB9|rwLW5om*Iw6?xANMBA{oXv5mC} zZ{xX_r-`g%vV0FMTB5k*;*0U+=O1IYQDcbJ%_BhV!=NF<@$7TY!RPhhu)~hRC!c$&>V4me zi8UsGYaw!B-UjM`G-(`2&wg$-Ei(GRArk`{-#WynC?%A(!}iLYC}jES6KRL@ z^7BziV7Iui1U{Pqf%S!0{6rXiPqxCnAO_Dur5f&XTF@Mvi4Mg@*yFknvEj1kkT>-e z)LeQJzLp=rP82PK40{2rFdB`|zOord~U zAuSr-JCd|IM$TgANG$$do@&h1*lN$fZ8u&;;G_s|zwwM%&D#l>9Jucgkwr)ZFQ-Xn<VZ zG_;7cpvA;(%hpc|DJFKyNv2mjyfxe49qkDob(!IqMe6_E-$vlh!Guuqk#XWTkX;#K zjLW9?J!jTWs3KPP@u!}F#iFbzdi3gx-)8@T^=sE-+MBP5MfyAMzJvAa*WsQ!ZvNBj zhKTKVI5@OjJ#M;f3hut`T9kI|E6iqMu`muj=m26`tFZsizrboSoJ;QjZ-OE15QOD{Sf58Z#C0LgwL z16pg#0svd-c|@sEIShzMAyinyh!b-Wx3dkZ4YE;A*q;dpN8#Hci#T}<067J+mc#O#z&Erv@YQ$dI%y<&45I}QrvO6~hBsd3 zH%}i9DHK9|)ylbOdV8^m{TGz9KbekkJt ztGCuj@O1!ASz=MxT(%f!F|KjB&I|{PCX3oBm8m*Tx*!G_JUj9j$t)au2)op6tg_9@ zE>hJq5PDf7A?}Q<0>OM`64>QE>|BzORj35>Y418!UH&zR5c9zGGnvWA%u|yG z$RgFJDkP$I_GJAV*)Hk)d&p+CA*n+O%Y-&rpDccnpi?j36^@B404rZ z338ipayO5siXAF3s&i4j0riCH14BE*b=W5;2)YokE8)Ika!h2+<5aQfX=$jdZNRrb z{7T?(Uz8LV;@Owp!0mV3O#rhW)~sG7>~A@CcUw0mLNSsSZ1t+esBfqfDS*#C>lEC4 z!&S)5Er6$~4qdwSMejZXP+HmngNF>p{rBCCTW-Dq{RRxh!&C0Wxo4k&Ze2T}SI>b6 z`eQim=pzLokdF7T@W^@+V^m zFO-oxI0OBsRznWQaK|L|crA9c9(nsW%`5-}stt5vBtHu2pfc9I`H z>LcmX_eT0S0?0q_OE(Ka^1QQrKOFgRDek|)jWdSOq!>5is};aLR~y9sg1HkAve7-q z!jPnYN1G@^31Fv7`x71LwlfjoC7HFQ)oE?xMs&;?g9Ds*VeK`HWh2NfpjB@ly8?9i z?PWn({4&!tj6T%oX(5~(Gg^#iJo!4(%!wTG8fC@mSTP=`v!pRK7^sxA0Q^7$zdSN% zvuG<($R#x2wyi@y>9X?*w}nV63~cJ})bAX!i2-iH|8>!^R!)Vc!5 zQs1yxl6_M3VD0$i!}rm>$3Vf@wgwP+vOnXP9Qg;yeE-mXWUXn~Ie4jTAw>yaYr#ym}UVIg-LSvJguG^K) z-wz*s^Z~szGcmn(L0a_e(-$2(^}(YLKZcbnR^sQMXCgNz8^KW9<~LD?8D-zl$iK^b z#QqaGLFI7J4UuV&8kNZxK|C*A3D83yV<3j;gc86*3Lp z6GCGHxciUeaPh)1sEX~6P9qM5FItCV48Ndn*Y23}(6#vBt(S4K$aKU&w^F^T0dLUV zd=oO@DYm&|aJz^=Za4Z%!1uKmB%Js58bY;8aOwTMaj6;tQ>;9*BFOu7G@OBr@LP+7 z_VeGGg@k=QbZL(w$vZls_y3Uu8iDs{f$GfDoKCzr^ikIq&&kOz6N4vUc&xh_p9~hm5S&@c81TnB`iI7|Q)pa&VU=1S zO}ZI0v3^g4Kx0e^g=BVnuy@}=V$2FiJse7`cqIdx#UoGso+_ygMryIGt>3BVN?Y-} zWuuf@9NSj;y0mXeO{CEBy{E2|62}=d)xVq)TXpN-yMgFfjtRY`RKZW5yaojsodn1X z)B&S!0$hX@f}|y}*%c5P*Rq&ND&SQsp+!Luq%-#)J}xCMZZs;vY?eh>u|y;VS&5yS8ks?i0NMgI!63_tbtq?O`|5U5@N80;=^`2* zPI_i{EUTQ+=JRl-WeF3cmQ#cF2-#LsXw-=*<)|0&t%#G&3uLbxfGc1?)M-tCT&2DW za~KQ-h3OQVJF%^)yRlKkVRkrNB1!@$tYJwbEmJuB=eF5=%`mCmW5PIEd4619E=Mav zxgXM-5e;u8mR4I}1^qtQ(_CuW+veG|6ipk1ISnto*fc@WIzYtXjS{d7h5W)KK~f0? zHkDv7#wvD$!33|jQPf3gPk%lI8$>3ucuK=p(o(S2tyyefTJ4zYIGRID+`kMh1qW%{ zsII0A7sA%RX3oNn$KoFNd}>5S2HfB_8W9nJBx(;0-YOIp48Tz9@#qjK#P9YWFn8mt z!hSs5D8rSNiDOSblNj+ll&@Qf&tH2IjX|nkQ8tRhL0qx12IHuf^Qg8r7vy8LgYIRM z8HLU$E*Y~CJ*Yp{Qs2Dg`vRXMoWq!A)TJ>XjjU z*2RW+wphgCS6c9XOh9)4f!VNx>rFI)1b(c6CaZbQ+YyQHKkT5j5e#iqs`$E-@^oiSS(h% zx^L@jvxVxP=yC&%FWS)zdM$Q`0BNZXvIc`vc3jZ%lF0su!~&~%xry@(obbUY#vvZF zc$^Z>aR#-n3^Y{`YBZPyORs?5hycNIA|B+{JimC0#x5tocB=5Rjc40cHG0bVQ2JGb z!QWqfnd&0SWHbw>v}h!#fOCT+o`nnx^0GVAoKlU?>n9^b>OrT`jx0x!INp_~G}I^V zzg^V`O2{uNLxzJoGWGM2!HJ8?Y&0fNEh8orQhU#)T{00yQ5yHJnBJ8cImGFDd3i?U z=E(#mO)%y3MWp5rbf`E^7~h308HlHMp}8SM#IJIb|0bKOJ*vO764&Kl5uIsoXTtVm zezy5tXrnlrN;EarAR|44)T%L|77Y3uQCOIdP{5F4j zc{E5xl~|&_FqNMxz;&DkN2}G0bf*JecM}a}8R*uvBk~Kf(X&Sv0_bLB5gWmieqC)1 zN=r+q{9f>RYOvko#_00TgJ_>4ms5mH!D5)eY)Rrqp7=@j>VSAY{#5EgvBn)vGzp%TfNkE~`<^#w4~$kk%3sU{qso1=v+bXD!CRcDu1?k|I*RCE46m23ecx zx5Z;>tq2Bc@xRdZ;@ENw*OsA~6jn@X^Y_*WmuXPX)6Q*;<7;*uNLw8xrsa8CIzRRP zwx{_`T(x^|`H9Pa&xplH^)_DF3$=4d>POh4Hg=|OOfj=qj{!4 z*j@{pduq%4J-4tFS$QSMDku@`vc!`THS!phkrg*1H(*6>j2Lx#L(EJIHk}5D+*|{4 z2;k=D5Xr&h2QTDEH4@_p8rBTN=z7t#&h$N3EF#QQM@cLgQx-DY)7(jwn5->yT3ky9 zy*pfVpxaJFR#l=5_%bcID02`1%n74rnT&aN1n}V{Q4F~UIOG=-x*g_3qdS5Q)iE6I z^5Mq;G1U7Nbtr#KE@0Y$RA?qKytFD_z8?W#wvJ#27@v$Uzj&7bwNn{v6=OaDa`&BZ z2+la~eDvA!F(p=9aLF~Ot67JOF1w0= za|ZS~@G$i3*%Jc>4Z~jh9*FGRBAj&USt2tQpD)QlTz1uUq#Cse^<74~1(#fT9T<(f z8yhfwzXNgVS?ALAnvj=Uj85Hq;h5u2Lr#9NP=TE|>0C55l;gBB&%waK!;qGqg`4hp zh=8*femY+l(Eff-gaI{~SVWROxm zEzV_-D>A`C1;J1mHAAAi2~qmHdYYt|8?dQD0syPg6|CkIHNVXE!fHI-gqeq&K)9)< z^9e(bZO}DZaqJ1-x z3g4)LVlx3`gSt;*GYE-+vr&|7Cg$Cuo^K`woaYF$0M=%~CX4MxWjk-P7%bv?{M#t5 zr7SRnp@!7FYsUW-GDH?mvWdl~J}0#s(SdGz5!HT{L&8v(7tRKuwd|2>z{&H{G43HF z{lSECKpmNH}5T9>5#B0_8!a{K72Y)kmkI zx~^WCgbfCD_LW75r#ZjR!YA)f6R9)V#%#)+Hz%HN<5c9s}e?t(_NOAZy-Q@FlwsSV&4M~ zNBO$-BE_UD%^?P@xwC&q&pv}NXWlG)_r>QTX#D3Ny-lpL4<2`;@Y?TC))BA1@C1JN z?rXgM%5x|xCUsRf0$tj#L=gY|2YYoyKS`Both%j|=n*omH)Ho+DAsscFGdN+r ztOmJPuK+%FBi7Ffc-bL^kY;%d;iq~bbJSee=)YL}?=e(=CTz>9F`}9?i|8gXmE~<= z5+rGhR9;NRl;{i^%NviUgba(PfKUbwCRs4NBGs^Jf2(CcOO;f6bV=QiG}V+;>kp;E z29*g@>ZMM(+hCM$UL&PIHZ2Norx0(tv|r)w!JyKp0$v8H;=39RTG?h&K(0XnpaRSa zn;mVRr0z4QAt;T4ITq(YF`eVT3Q$(AX_TadJ-61sOzM8Y+KY3fR!mK{fBWQXumhwb zDXUFg+J)#gy6s6A>{?9-pcZw(APi~1*Jt^VXEVdu$AI3K%2>BrLPl3QG(f7Nyf`Xc zei&tTYOsoEGf_4B5^GR4sIk;}T1v|Rmdsp;JFmY`1lkV<{36VZ#`tiac8}Ks#duyq zAgG4C5r-)De{6%xV6)$VU67lTi~9Onao)OhD=~1$Z~~}(@bHv-ux`y7VqMQeb!DXh zxEy;o7?A~F-ne1C$Zk|x)=h+tTD5YyIHqUs0kGLDB0Sl!;k#nRvV}0avV`rM(P$H( zobBsuRx9f3YDGQSYkI-F-$ndht7h}2OZyaRYZ>(sc)d07E*c5zKFeUY=LiNeeN!BP zZb}F{i562i^L?oAOKOS91<2_&8-bim_-ApZlXT!U4;o+F1^BWNc~93Nnr_^tKudG( zibZAN$R)rd^(j(n2q$(~b#E6eZCoXlQ^2d1iaT|#6YEL!c$0b!Hc`-QZ>3Z-1T9iR zO1xZ6;<8qjq(*2E2w6<>T2>~->{D*0s+G4fqpO)?@c7~P`H+>BP5m~e&+Y#~Nqyx4 zc&2b?Mzuj`{WDboBBieQpqSRBmeZCP)Ph=T(`}s=k8j_3LDYo+Hz&u@J3;#tozZPi zLcKi_3L;EU_p=qx!v!lW9is5(MzCs;7u8=GaO#f^d~iVsweyIk9Yr9QJ(W4;ib@2v zbTnWB%0(d8w|XOv96bQp1sxIOw5h^=P+5U1jE^k5ciF_iC_IHBoWl&N8j3?8`Mq^G z;+PXL?X?&1(sPetw^3t7-uQ0ayJ6hk`{U93?}EeOKv`KAJn`^Dc;<;I!dZe%7ucDM z9T<#skF$UO1!rGy8D{?SlcKVvW5$fz6KmG2hR^Fp_nv)37$HeAD_}#NW}U8dG&Izq zq(d1xcj<|$iZwX*qH9rDTr7aQF6~o}WuYP62TN**gKbz}i&;v<%%!y# zJ9Q_+i^)kxGZot^PG>1jW*YO#Q5H;+0&GRH3DM6K23I(eap)~Iu~n3SuP>;UY1n*n z) zvm3DBBQIv(97oz2yP z40^Eleg`8!%+94(-;AGs_y)_DEyBc;PA9Nx#pfTrM{G}A*e)@U4hBP5y<#y|uUv&y zD;8ns@KMBU$!KbFY`xj!6mm?#qNKCrAv_BE8%oj!Yz+$3rX=1vh0A6b2(zyAMAMA(5qgFr)Ss`x< zBg(D$k^aB}Km0R?!av=Ew5t{&_}s3rojM;5Qx58%Dga)sN4Cd_Ncy%nSQ z#l=Sv#mUYn;%o1iXwhs}>?4vTeH)nyQ3DX+K%w?bBsfwd;#yQvE@WUn{uSX$bPTDU_5R_o_92RNA zyp_21!qYJG_n(oQS0?OhHFE_?Gel%jnJK6aCM*`SS)gx^w*eXHx$qJj$C<5o=J&dZ z5tc$CY)?jJfk=%h5k%p7JJWIqj1q8ds1@m5IsBI+EnP9vmsr*5M|wsE>T0Wylb4Ui zdN*7y2LW9#mE{tk!0YzG?y!jz#a?1~(}~Gt^^-5q1Xo%X!eIhIUJe!?q`}34bgDxv zs@n>-XJHU#_Qc?eg%LLzU}n>ROgk*K0fh5xFmsqucL>n}J4{tUcr8k2u*VFD=aOcl z(vNtSQ^fK#dV->%N3twT0&h|NY8+iZtsTeR4x|-vln}t(7)L>YL8PBGq<~n>{#J{O zAi_DR#~4za&Q$A%gegPwJS)vZS0zG_B|t3%KxR?OO~w+|P_{u0afTEUS1U(jVYgKr zU9D`WAf4msYQo;;oF3O|vkMK4@bm|C$g9gXljeOVWjp@8cBX{WRP5k+k>?Bg5cGIe zkgG^r@pCoN;}#d^XRGGn!M3F?E(keAs7 zQ}4e8kJ4w*puxz=EyCbk#$)}4#i*;R#;PU1W5t@a$jT`|R(7#)E=z!1q!<<&Q&ycE z%hIgGrBx=sd00WngLDu zZA>v+FiI(L!_$^OjyTI#nlnv_cWsb_?XC`Y zb=elu))4>iwJupOxST+Q!=t&~jY{^$W*}D$s4a^rTyOd9M0B9roqPj zlY?%{9xOM_Bql5l3;maF&qIjRB~Dki=vZskR$%#xb(sFy`=t7G(nOOk*iZ(zGO2l@ zQZ(V@qFlt7n6)=ot;ntaPGNW0);20PXHc23Wzn`VAWdeo+Cq1ixwE~^P> zdEptSKH1b*C%&6(W_k`*Y}*>>qRS2vnQiDjh=rp{DspzcGo*lA%^+8sW}!=a5gq8Z zBT3r%DX{=KyO=DP9|Me}!ZjusUz568R8EM5gJKfQ&Mg(}X_P3a7%^i8)muh&S5cT; zHJlg>_(wK;Edge0fOC6;P#xs%e6qFgY)8G@gne#IVPxZ4*gv3I{9B&iSaZ+)uqA`4 zfN>;Z@oK*n(+9cPaa)VoW$pY#UzS^cMk$PP^LV=3PEx@+Bo*wc%&r2&l?gxW4-W#3AY$kJEDaEGb9gH z4?wdyRqKvYD+-NN5ssmfs(sP4GIG*EM=Pu4b+&i^*2XFImjJhl9dr^ja3KG-B{_aI z|IL4S{7Uug(+q>vG6SYUgk-H5runxKMkl=FFzW<5j}qstZ}wtiho6X%Sb~C_|%D*-ls3 zDW`O1jcILZx4YfCJKt<9c@;@DiPB6Nwk%Q`zf*x?>b};tw*^GD^xM$Nb_3e3M{8wl z%{eWPN&Vf{Js7rdzTr=<-P*RTy|#oue;;V&{MOFh(mRp<OSjS;N#i$ZeOR1KoBisgte3oJdKgCa%6VjwcvPt|qrQwMaU^)kT-Bl9c%` zwaWuwiK{9%1G~xvB@x#87hSe2DSahX4JlHMf)hI^0F=8P+wyWU6*-ARp_vsK zT68)key&0TC+%&~!kj^6d{vMePi1G5gl^(mnxkC8epmwj)U0tEiU7MR_)h{}x!Hr$ z3MVZbn03|S-I@$ZFl*Qfw3)CL6x67~eR5X9M3_Df(I@P9725=n^=u2KN^&dP z4gdBmtfxKI<^NeE)p9|Xoknz^yOW7vOHx2CCsPoK8{!dmO{3p2kv)n(aw655V&?E? z(=P9ikzSUw9P!^~Hh;`!amFL)qRZbE2^Oww*?qWZHwBuBK>DnX`9RZGuxoa~v;8ZV`mYU{IoqsO+Y~Y|4r$K--OY zn~4^;RuDI)q?4I2MO94;IOVp*$Wc)MPXtIaE9rX;hGe!gKF;lz;IJiG-)2c7&{7j4 zCmhaB;c%rPBP~+^ftajhA!AS~?D+@;*h~(QZZ{NGG8J*ET!Wf}JJs$`D?b(s z!)Z5R;IQ44Jl=HdtQlXUq23Fl*+A-AGx`o5j%5qx(8*R2?o644>AFUP!ZfQhvLpbt zGUIX#U?ZI?GN(yWvnYj0wXGx=Is>Oyq~ka+nk?x6`Ts?f2m&#rxh%Nv!D%@2)I*S4 z&`AJazo!a&?71I)`r$iRtWIU2Mr|P!Y{W@tUWz62XW{#=ze0XNK6V>7fq-OOl(%}x zJgi-}5mu&Fw?iv2s&koUdMfO4Rp&618VSLy_91T1PLpDOV3an$cc(3B<{$%`C5hN9 z9GLn&k#<?^4ubY)rT{~|=1Q88w2>BiIAZ_SZUPPniA^}A|W#@3gR)3P^QoB}OR* zEv}HoV#B&MD^XZfBET;xdBvn`HXD(jUxfOGI)nlNnmm<^F3p^57+Cmyxb2Q-aKdp% z;E(xh(V;XOV|O2dJEq)-MSsl4OV2-rPu_nIM;>_uzWM4?n9O!$=M)LBQdeCr>X(^S zh!c29|&M8FYrd7z!EkRxFMq;l_0&Lrz z83_74;=Xh8OQ}3!t_}Jqva<>=V7Td~XE-q9*9EAmX~67x%dp#sLD+5g(Rk< zS=J#BHd~sYM}yu5tXW@+mtJ}s=bn85o_g{zy!PTFIAp)W5D3cDE{f2nS4Z^gT>xis z7eqoKZ0k&F1{Ik$1%NCE-A5P#@d~gD)iyUJ{;lFXrkNGUEy~g+Ttzgy-qcvTiEUEK z-*|HXyu;brHbk>T5w}8Pl8F`{Hqta1hz~ayq?BkB&Hw%#*%oE|o3btHxh?Oxy}W~# z=eGCvsr63=xiLg(z6_AoG@M9^A|fCeckE(Qm$pSm5ba%5RiG?K5u=WktAX5jOi@?L zN@le6tC!)@E3TyD!?2oc%A^Rz>>x_2;q06oG5N%0(y?lMNvf?c{b#dU@yct{Fm7~r zbnlddg5naKe&RW}=blH9TUdnh@#_fq(~BUUfI#eB&()?N^L<-v1Q+ z`t`-wJrBY@`|X3cuhDdo1>LFS-GhvIH z(yZfh%4Dw|)AF|3FUVCiHykV2m5~Xj(?!g-5@(bbI&51Vk8S?`i{ISA=Rpm{ntg6DoWef4p*Z@;qtUZx5f0pI4;*#;ndsiJ14a%XE(VR! zyAFhd*q;%*?S*t_4zYKqkP72JIB5==bi z2&`FGhqbGhVD|5`anBvsW5fD2u$t9IXkfckGrXQ4UVY^$EM4WsowweJgAUvSnYl%< zTI?7+Y&VSDbtGPVb}F&N*(vF+x1ER-zG{=RFkvGpzqOCrB^4W4gAyK0`K{RI#$u94 z6rqWhv_V8qP$MgFmb7NJw%Ql7I-P<3V~3usoLtmYSHdXAg)MKY_h_0k z9bbRo4BLBagifm~$|5?s`-=)MNdcrNV)yzOi1E7w|{Lov_pW&p&^Pg$w7P zt|5f^b7o@sS_almXoH6yvS{ZNb}9>o{OH$f2ug}v=-#s*KL7k%G6w-MZuvsI}sO2cN`QXP=DBtRnb)-t7W(HD43W zR6vq6GX*8#gZ5Y0@2c@~CCCZz8&e6MQ~;_?lp-^lW`nE#6BQZLG$L2g!Z3z3ssLFt zXVA(JrVVI*jelE|WHpj-P&HBIooN}{H4=s{y0kZmtEQ6^bACZoEl0tX#@B*yGEJi(&8`T9%Pv~dNjCR1|qgc5p; z!#i26RwaUhR+>7AvgtyHqC9l#-XFt zg1F|g(=g@ktI@arKmsl?*a%=tq~3Y=-M3(l`>^+@o>;VK5wfy#(O6%J2?rg9LykBR z1qC)bK1cwYKzv3nP4-6Et;*UfJtK`6JT2vtE<39T(;3nxjN4;>{IPH?di3anyu2)| zTQN^KDltxVPBS4z6GFbK6hBo_DNxbGSgkS?z$VXVM960CdK(I$p*z?w>bsS z)xfTBrZJlE!3VD+OeFt}cie*uFFqe-ojc;<3(i1MNj{28JK>}0KVs#o6$l3Wc;~a9 z=tL8C8#x?P9(^1aUvdRbKk*nu{BC^v(>LOpKm9NrQ=goQnSZPxLN>1ktzw)2DxiRZC_g8V=#ZuYVME`u?lWG5fcfiVvR7=I*p23&tZGci(Y2 z?zro2yzu-h=-ay+mMvd_NF<7IID${Vm@ba%)3+x^j2uY|s2_0dMVI5VZ+^wDWA;Sv zUY!MNy4QsLaqO{2A|tz4L=oB6wz%zN3<|renJsWVn}-5yE{XWJ zYCjfba5NHj+7hKHeYjcZFsbcw{&h*U>!$^{owPi9dU0L;%OWBV(G159;fe_ZTFDNm z%Z?OD){UvQnFJbv_s$^|f1bv~cyZ{Xt}ULElV3)iBGzo177>9}A#s|}EyQf)a!fK#{I&ls!w~QVi83-NwsTPI2&2(B>T9YM z=15KP!Yr-V+kkM;3w8QN7O96LbbW7AH8Qh{1RHC2WRRNDh1%*3$jHotL_oT+cB80p zMrN)EOV-#}O{`ssV5{8jS`l?YGMJE^Q_Qs!PHg;}fqQmd5gO`hV71%eq_XR4H=wvf zcVeVh34qU$95@<-E<3Mq+vG{0siBHk{R{-c68qzeSkMM)KlL@6P~5Q_sy40>%w|DR zCwQ7_;qx|%_L*ByD%wgzeKnkJMQTVo zszGks5iOM!-Wo!i&-?mzz_SS=n^RE+aMCloV_D^lHqUXUWx-}oYt_y+Rnx@&=NVZ! zXqCR!MVJ4SNFpjyV||_QGZ0%euhka9elk9P6V1&{ZI-rIk4d=ch^J9U(=of$r7m}E$%|^3&gho9{A{v9;?t+cjUd_~jJE@rfFxx|l@L}170vvO; zDh9qvehOLLuf*@=(lRn~h4UNlW7|Eu!zCCi#l9Gc@)WOZIzKZwsF|c@{x%!e-*h)}^9zKHq*AIZZ0ro$Oqv=Hn?DxO>fEz#eiEI=9f*0)-3i%UML?F6h4ws5xcvq6{%jh4dgCEX zn6M9e^zM&4@3;fU9C--b9uFo?JP932JK%^T4#2FRe}L2J6qAVNm=+cGxv_-VLaL;y zV4H1gWxFydt2Twr3TZwQx7yEB&eO`-VIDTRY;)l^$yx^1Hf+{5S~=DrX<7Y}zhxCg zCib^%XWLO)!@sj5a3NL$3 z3J?_^N19zp{cAKJ=<^GQIIGnn(kvR(w7?ARS&W=!n8Pl`;v(}Ke`h;oHvTsl6)&N< zV6>Hb>9XTQ7D3gCrE3hs>@Xv0mJ{};CRQ%+JLI1x148ubtWgPJYFieU6(IqK=q381 zN{e+GMM`OdpB83mRAvk?N2rZi44bp7+p7NRJS9Sf$w;L2)tt^W5n;zvaI0-jm>#IY z;M~x{SWg4PTLQIP!eu+6b<6+gqSS9mBb5=^glbn2R`po`WOk;9qfS3D53HM>MxWJJ zqruh{QD)G$a6OT7Jf@@>ZYw#g_B`!2yBLQ;p>V5Um(MpOxMZDv(?ys6N717$v@@~U zosdFJIN++MG5g`GvB!aj0@x(JP z;o*lKz(*gvh3~)m6npM57DI*%LyumA;PEC6-r3BMoqz&?09p>{?2P8|G@z&`AG?hj z39q}MnTIw19zJq7N;`C*h|Tg*14rN!vf zr3@WPieWOwQD0kuZr!_J*oa|pH&zQ%33q)p1`i#AuHCz$p}tbY4Cd6r7PA?hJ9R|Y zu4PDbT9J|AK$otaQBY7sWpt(qEQI{LA_DF)`b3aMz}d{1)O45E9VWu@ENXgs`tr2btf~d4M9}*lhANc5gN@w*g_^m8$+l)JqNXi z(gLbJ2%kBOniKL6Z-~K2@405Eli+X!+sjy2Xc<%xYm|_1C`$#oscbCU;L2^98A#1( zUdWp#e8A=)x4r2$nv>Zgh%UBP804l!)}tYNB5HRbkn89UG!V$8?vEP!L|h1UxD<1T zu7)*ME0Srnbc7S0?X-BRs@#C}YnNlwrqu`#A;A4Tag6$GHBA8f5_mjysH?3Mi)^jT z1VpCaHUh#G73)w%9}|r?ij$q(yiE1jR=2l!Q*CY6zJn$TSutP;1bhj*S+R$%%Mlm)_UVTM4mnCNrKg{DK9#|V z9V9e0*5MTTZM8bE*M9qB*szgkYS@U&Cf_77rk!)qWGW+ol8yy9YT~JgggiL+qAO@3 zYDBjly^))fgQJc=5m{N;7`?~d7%*rU!USYbJL?kE*R01G=Uze+mKnWz^~U}O9fA7l zjqnBB*n7VTbnGA$7MCI;D@$Zv>e;&wCZ2da0pM;T{p-Y&PNW-%!bkP**}FIT59mYe zO$d50ksTupJetBy2z}F^fQ$$6_qwC5n-yke_CqnqJqh3pHvb|O*!y7{E(-X0RE7$^V}{XDfvl6b~BOU zQ(s5+)GM9M;;Z-VUL3@wbHeR%^To?zF+E z==TV~$|M4}T}J?~TrcDPE9iHovJLhUEF17M9KPj5{aaE>QGkO#=)u${p2EzTKjV|n zKf}n8BT%t%Esa-Z@lfnGhe&g7v)bWsIN)*DVb!V?n7?p7Hk7ZV@h4ZX!JJ{w?nr~3 zj$ONYDIR+0K|J^3^Qfq-M7k?ooX^@M9xK`Dm&>)2hRR}9;)-)!_!!>qa5#lOh0r$9 zIaZ5J9P6MD+aBxVkS_X~XUB_fy3me9qzI*65ivOsuB*j8_uYzMFo-2fmtoY1!Px)C zSCCy9K|O}x%TbTxcwaUA1}lNdei%P~JPq2*@Z-|X_ zG`a;-D|R<_SSo`$)<6=A|5 zM-VXfVD8-6`1R*+gu`3EenZinfa)jjzmJ9Ue?^bp15nbTBi?`eHKb=`VaTq#VfnI! z*#F=o@!QN_kdu>#&pv(+E?1_=EE5a`;dXoQ^N-)am5~phuU4?cbu|^(uznpe(;n2; z*3yKv5yd4P@XoZCh=sP$aXyrlb)sWK$fk*`k{BO-WZ7{N^+zBNBIM$aBKygea1&;U zJWzn>J_{k|Wh3uZH^QC@G<`7w&Wks|6OO~R$3n#FeemB@3|}6BmO%t^z9iPLA89zA zs6_B$0=6Bj!0%xMpXvj{&>vxybA_!r%l5#1A`G9F%2!fM5PbC8Wm361mEu$~rYQ`t zfWs<#D@+(P69_dzf+TBBY02wo(H6G8Udg}zDu&X~_+LGZo|7wBfmK6)2Wah$T434~ z8AlG~wB!;2Ng0>yD`Vg14fx^}+F#fWHASZ(z423orA!fek-=#w_s#*Z6|bI-pBZ@&4ih}cr;tEWYWiN=B`I+pbm5B{lVp2xuCYzz_KN?U~}Za zM=YX@UDlbMc-FTMz?RxUt{7B(G9I}3$YMa4#{LqNQ@NZ5#y(vAY? zt|M02XpF0i8awif3#qLbv3AW8;gH1k<`yCba&n7BykVW)(?ypZCpx3sPDI$Tib>Oi zNZoquR+^4cyYG%yr@fCO4xNCxinK6Vs6i zN177`lL5;XFTlhTPNqr4OrSRhHC3C$HI6#=B)XSPqK+I^s;qN2>^f=>6cu$8^|V@z z0(9`i#rMYmy&o~eeFh9dPJX^nSL&0>juSZ;L#U$z*cgJLmX4n@d7vk z)uIG8sj98sgln$7R)E}3KK&9Mii^;-dk?{uUQgRO_V)ef>-&i5-mu6jiARZchM1Qj$#65<8lVv>>a> zSj`?zVNZMX?hB{Gg}mGX)YVoa8g$b{Qj5%t9GYlc=+?cL0GDf4Ey1wi!wH;6u*;C) z#Fos#hK(CBc<3Nl%rSKB){U5y3X~B0T3Xr(OP4I92_--vwjP@{ti$?sYY6nF6EJln zN_E?`VFOk!Uy7{UT-6>9NYBi|Z@3LkYKM;<}xcXHv7KM8gkaL-Y!|$VYOqzP4sVf0o<>B#yIzo%~Lk~Ml z?7HoayV0RjZ`9ZMFyVkBaokC#p-0a?c=g3+5e^3Mz#~)9rBes|N?IeQ%Z|Ridtle0 z1Cd|Y0U2p_+;+<~ShVmD@nA1JcM@_7I*{foLfW7V?9#snF|w;Lux~Fs@$@qoGJF^& z9(5>gz3nzU{`3o&Fn$~+9(N?BKJf$w4d{)_uDBi#JopeUzwAPkb|}EKcR#}JBZlG9 z%O~Tf8NcA^#~!Bfa5w@%A9T@0mmMcM&}}Co8MMhSj_jNwTz2`D_+x1u4m)5UyzYC zpg(CnC~5W!q7`Ij<>RCGr=fT6{y68NEAZ(@ACPJ>ic`-Z1T#iGJn22Yl-jA#tCCt$370WPw!htyd z(rd8Cp8Lb^_aR32Rb5Gd-DnXYpn|})*=!YwDcBj#-P9m#<8;|E!cjXis_FSp-iXlb zu|T$r?7LSXa$zR~$E73C-AZh45IJi}Yv2o^>EJAYw;h;+@OOhCSzRz4xdzcM1|#-( zA2<$JO01v-kz0DfasF~-d`E!y6r%oKuS1T#7FaL!J6m%#21H9(O4 zX8G9=0~(hdoI5Xp^bP8R2uC8qu`Dg!g^e`kl&@WlqmDU7?0fjJr*O>`mtg+FrO408 z5IQS@0&2hVr!1rH&g2$eD zjX>={j2$&x98-{+hws1pNqoQbqI1xrdpAtJ;VxRpFTftV4;NV{4?pw(^zPAB95eB_ zV`*_;quc80qRS2x-A1>)2+xNx2pcnYva&idanylB@y*viU}O3q9De=dh=x2ksjC<6 z-=^V|D^EjaerGY!+c?sI$~u|fSlY8v>*6-`p5X<(@$tJjv_m|P)sT> zJTsNbw!mUD5eP5Cd+)qSOsti_s9j9-Mw1f{-ghfZR39s`uUXl}G+}MPL-*bx%qB9k za|KhIo{^8=X3oTnAHEc|HCwDA;~LxFz5K#61cnO)qAyxpSO^JM-+BP zx*mC92Z_)P5PO^VY7OGgvig}Cb#V@|@7N#!jKN`re8f6L3)98>&i;(h&3koT6X^>K4FDT_05}s(-ezJp197O0Zs}lwFvr$fp zD8{YNO$Q!1-hfF50?#~3+i0Cr`C5zsqyf&0B=}d;w(x4wFL?>*=lx@wm!2l;eU+uE4pIj>D7(AH}!d|A5D*K8&2aJUsj2Yq)~0m7kY`Q%^h&N0YW~ z_OIW-!oy|7EDCszf#oo_=pFd~SmXi(|ByVId&FS)4+#0OH}eaI}yN zCgGKw8W=}_+(g#0#HB@;uI$_rWrAQc3aSHxT4qD6RstY4Nt_*5L8Qx-otQ+~){Vb& z3SX$f@j2U3dU{4ePpd_L$Vps7A_gQZqB&SZ>R}{M1V^7pOH1R6sAoX{BevbmBxabM zRCrrfZk{-YLAJwbQ=NTukh>#A;`ql-0->ymX0R8E!a(3xaq6ONd9*O2wk6(Gni-Ny z%?%Hw{mXW0l#Vpzy|NP}Z_Bk4ri}@^Z2m4}JAhnG5+F3uYUKn=n`(NX*w`lH>l)Pc zqZVGupe2lGQGU{KE!hXRm+UAqQH%jJ9_9LeKzV@F_YNl>eGNEwl#HiO21T6%ccfj^ zZDZSZ$F^;!(;c(obZpy3$LiR&ZQHhO-Fm;P`UO=rYSeko-fPWy#rrd0QncqU7K2n5 zS-((@V%~0l*DmZp6we;61i2vww)22>^HzXNadwodk{}VV(;z9M0xB;at>k%3?)5&o z4B&5l`EX?RSfF-dpc|^g{G+U{P4_cZn*r-KMS{h8&rqT^v8E0=KxMVra?znJJCF3m zXNVr-=s4^e$afjIMUO?>UPcZ4c$il*xVCTKzoWD1+cTkKrgY`DNc>2Bx_WQf$z-z! z9#cK14MyzIo5)-0AtrKab9q}xy1;SZa2PNv7#{|!w3M(i9KQMpzk_=ddb9t$9gnAM z7~ueOP-m3Z+cO2I1M#~RCNSjrn`*Zz-)r7r<%0<75Pc@U1<3i^7ce3%qg`erYwR_P zB$HcLfPn$R9!tI|D=%;DNv2>&S6|z)+B$c1*!a7Nkx%busuIs(^HLL9=;$Ppy0z+| z5S>eVI2LSfqee+7jgJHtg{jkzL5t}7WNKK1e?vSLK3#4|_CM+(a&aXxYiwS+(R~;d zj_41nxv>|)^&wCjPaN}tHe(>CuIR{xpM54h(ax}DHjn3EXB$u2E>zfyp7S9UHR!GK z8|)G&=*D=T2MAp^LwY~ocTyV5Z)S|9_vVqer9=#A-VksiN|BXBWb9#qJYCF8$En~4 zesZ_-OIH<5&2YrS!)TN?eU$yHo_!_3aJw7s3e9FvVxI>Z{wqqa`%9&k+qH4# zKU;teuYE*ulob^noro`Q&z(52*ue#2Z2SQX>LnFqCt`Kf6o}?K}=4@HI)=I(poEyVYwsolz*6z zycZe=9Ubn*A^1kg^nxTMBV<^dJ$2IjAdxsr{L~CJID$)xKsR;J%dBL$^JqAcF1P+@ z1MPXGb_xD%Yj+HFAODwH5C&ZL>|cY;MgDzh&P3?5`c<-SO5=%cp#EA#kt{u+rp)Pp zu$2nuw}@Z?Tft<+Hr$l_*>rfF{OSBh(nj$3oDXDL(!^U^94%Hx3KD65f18%+^s7p`)k&E~mB-+}186U-_W|CeoCs5F)D^S@=K zO_Um7Z(-=@nU3!CFJ1W(IYv~kc>=Ki6c{z3gBlP|H~bD@A*VM5m*wHdvEEk>x8nY} zQH#!5p$Qqe7@(NtY4F*W1cNrNqqT&HnK3rFaw6-hqFstQRTV5@(g#rp*yjxr6CuNf zQ&v|e7yWVf9DPWK3L`FFB$Yx3zPkGQi;6s{5lfI5)X7L^fk}WobPD<0=<>VOPKjmy z-L-v_Oe+rNoF?rbw?e+AlQK(ml+Jx*!dGPnyjP`+Lu1l0C}f!;}c89johU zkPMM3gR#?`y}T*1BgRl6gy8-?T+AdVwJmM#5G0eV!IiUHx8QHkz+ZyNxQ0GL7c<&x zEV>^ijtnk;CnxE!Dp>grl3gyyVvwN%`aZ^tStB^niosW9V$8LTO)+P9B%R|i=KnLV z{qLm{#%P?e(#l^E2-L8_8cnt5fsHlRO#@aZ915c|)7zmRS^dirDV&9^YT`DgEQxRq z?)3&1zt=qmEg0N6eWM3WI4tDqZm`tgt<&jov}!j$wcnauKpLVTTr%iQm?fA0eJc^} z)MNJ;Zeh;4am=1Lny1Q%HRdPYu*9tiAFZh#j6fv>nI18vm%@b7S|$G?&vv4Wk~sVe z2}MjtHPN_t<_REKpR<==PwuF47%VxPS^9WsYWmMb#wQEx80h`@0TB<T*lHPY z8?R+(%}Hzwd9?UHACRF;#@_&Rb##J+s>$Mg&{hnHP5)cNp-!G-hs6MMIU_`a;${i?$h*+DV1zsxrdDvuji{=ulu? zU!9g9Cz^5G+*n=t=k!Gl7}@^M9kO1^Zsf;44lWik#^x-joVAed+u%LQ`rm~_2wU@a z9L~awAp@?4v`jx~u2MK1O+c`tRv)AS+U_WO+y+|LCoaxfkwGaT2$P|Q2{X(*SYQQf z!A~eeUBx#-6++e9=7Z{i$>c?GHY=>AN^#F-g6))R6&oWHQZm;Y$2d;cUkhi8YhAv2 zLOiz@%}o~z`$4dqE_w{3(!4Bm*Q)vqCv}(Np+bD|(rZEte&uNSBKGp=#5@v(W(&Ab zK+h0eUN8(gk{OLDd;~QmY+r};BQ;yeMO7aJT}iUFCr@6Ii;rV}UV$`2mu+R>>J(Wz zkJMq& zKO4nS%!YzgL2PpdRN7ANe3`(8$IRoG)T4{b2f1u%D*(Ea{4y5-*xR_&ny?3}CvKB^ zOT;(1a?4XK-|@pJdDlpxVg%E*zFozJM# zgCfs`y*%Xp=I|-Gg3w#kSBckjgK_Jo&S7;k6`kqg9*=aC`jPlHooQXw7>Z6ZaWs*T z&?$qnl;Tb(wDo{~5055JcFq?2RgUF3utGRRGpzvoqY=_J8aZE~{ zSNV9iB1-#AH>QRhY*^>TLzqx-h=)zLo!a6P?s^UR^vN-AhcvHiuWc{>obgNYsx^>X z+nC`hw%)b|%C_h$MGAoVo_!1(Cu$4FYym!3s4{wOALc)iY^ZJOXe53Z&r4Ke4I^f8 z`miAcQAE0dFb3ZIAGk76|Q_JyCjnP0r3m67FAA8rwg#aJxfol&}YQN1j52^Yrpm`G)M{E8lO$L z6)V#qa(j#vCrRr`%Ak@;JG>n`?x?&38!Lo>$MckaQx;WE=Du@_zT)}r9%y1O;bHNa z6^&Spg;)^(iG;Z;7>R(D7JKr=f!MsgDF~wZns~o0+j`&r-|Bk)%G_a#Bs8%x5N~$;gl$j%9Og1HwyNZVJ9xjDIuDiY&vwhBZ zz(UnN?%oNa)|_GFAppx2n)1ty^QrPiHN7!*)DZ^M;(k@xXWCRC%;5Ys>z>#3*t|~E z{p+?Jej#gk2M3sN2I?YKEu$3VC&>Q_jF8LpagxrL&_*bF@VN3?8tBd}X~P?J=`zn) z>);@%4=-%-$JKXQQ}lb+ILdcz%zHSN^$RUSd^f?}sdAhXa|vzkXK~9;2bec(g(io@yB`%(+uS z)i`xmJrLC5l$Ms{c|M1?wXohpCSKZeh5g#?;AYmYLxEx6o2AO`k$NBk(!*3=It2^A zRg1Nyrl(Dh-EOcfu}u~fll#m`h4JBMHOO*}hHcFA?#jxSB3zAKjb|I{(Q-pDT4&OQG>bu-7+5G; z70Ha{ILLYcka&aMZzXm{QT4VUTLhQ+T{#2>jxi6vcno$ae_4rb~{|HW!FkPe?No+gDJmC@mik<`bh z&!!!hc)3iHIc7|OE>c3GrVvY6sBuYaI9f2d<~n|Eg=}GKiumEy2jNiFazo$oxRe2$ zL$qAbPM5K5 zeQ!9A=yhT)F8C|->fuuK?7{u};4*=@daz$UH>061CQn{Y*IS68g!a@vS)Cx=lNqra z1XN>VvbP8KOonUF#JgFsf`i%nPd%BC>+-E#Hn+&3F>Ee~Ex%k(gTs(c=Qwjs^h7{C2S zE+wqz&&yaLv@qK~psJNI&$#33i4VeM*?j>Gof0+mV z<`KD@go`Uh*qVUY>kV`3`^6Cfmp4q~GK^V;$72sQmBWk_^mz4wUoI{uClFiDTY>rP z9;V^8EYh8N7>7L=Fdt4dA^+Z^Bg}iRh`?G&KRc`ttfv&3euF&!3?)-Xh zjIL_v<43vuxvpxB!=WewF;BvoAUd1rx`0p$)*nx<{vhMN(PD=8lkNGm?tXN87)`t2)h3=o?;QRHF+1GlB}K*2QZBojG8Zr zwy*pH2X|Lml+Ioavvw^^lbhVTn%r;FvazFsAGl}_)u^bEF1FxIAM_E7S#+FW9(RE7 zybzRy$T$w`Q3Dek!r&;(GyS!w?IaLcR5Wi=jO7!``BO>VO2^;UCo>QS6m1I4gc3ws zzZn*o(L`TKlIZct?JI&*1Gm23s^>#mF%tqDnPo(Or0JSTx z^zm=%OFne=j)MV;2?_VbO=GIPRi?E6_O=E{>pWJL)YwqlE^N2d-{ro^;Ts)Y^q}J- zQs$rTL@D{WfUKN{-dZVQ5hD>OEGDghUT{xzPqQIds+l~6@OITq6c18zdfC|owE zV_iE?FF~#lgcF6HO0ethd){b~Xzud{^x0BXTt&e{j0+wY1VJ*F$J*j-33@b%=c+9G z4;HEXx;C(^(n{YiGs3LKFXfb2qUY_X?U1eUd%#M>EWaizG%an zD?8JJiO78q5-i5&;Yy1ZWD7V-K`NdMNJv2Qp*@)|hK}Ji2E$^=4Bd~(32STfa5`Ut z3?=R$7Igat-*CVFWPci}@mghVyJB>zPD*9oB?0qJG5TC<#M$WPI{RZe@X7x+u>U|G zJ9L<$6V<%^4g;#6FYRj8RIm?h4)qZ>Z!4NS57a9O1i1>nWP)7r;++H0LOFqU?EXu@ zcfY^sy44F`-4P6Zii>MOFZlj2UrKuSk{uaZv=LoTrO;=Rk`p_n`@a8%Z`&8t`P|3$ zkh$e`%n%=5Zx&nCa+#b_YkZ5BD?(3u6|jEYLbyL1J%qTd6J4C`o{kmI8iIi52Rw1$ zhJhB?BEc^RAQ^+iv>fE%@!ao6_K(b^6EUfv(Vw;3$^y$C^(2QzP=tF&BE zzV4Sk_E<1Q)@Y=_4IEoj{8J@eK~Y1LeH-&C#%k)VAZy$^ z*8fzT$O84H*NP-!C-vaxaQob>X8AL;e6sAxT+2o3Ki9EE31n8dr%GDQ#TRGB;C3_q zYia@&lZ@)!SiNTkRCm?_BzXLTMSs3RC8j|%=N9k=vy3Q!sq+}Vmsa%tqNbCPd1{uJ zNelunee#5#1V-pzs4A@5oqpxNM@Shde?A1&oXVJ(2pmnn0;Sy8Q0V`>K1z>+?-NHr zWg<6oOh3f;C2-)sHT(oWp?8nYt0jM%Kz?b|0fh#xwFYW=m^d?~f0*!u#_Tr{m-A~{ zVAy=pLHSB&%FE7c47TVCc;qWF<8F||inNTiLMu8Y*lv;kk@9TD$m^~Ys*>=jS7RRn=l_j*RUS=qx zT0zWS1(X3y=VZPanaJmZ<-ph^S3Sq4<>8}#5Qo?H*5Lpfi(G&%F?HJ`Q^e2v8~mxi z{kjVt{*jLohc_8>KX6ZqBOZ@+x#zLmfU51HH$6pak_H(-+I=aox647Qwxg zgmmR^fO`Bbb&!k{qCn`YqZuhmM4nu;O-ac{*q^FyQ1Gywmy7*rnAG$WO%8)4CZWg+ zM?^$t9DZXGAlaIMb=v!R(#gHf|ftGvvDM0F2oCjz-4GzbW6XoRguNGTwoN7cD+VDY8cJ9|>SKx)!Lp-aMliW6zo+5sMhq&i!pimDwfxvLo1XHn4axI_|7 z@G*OyA7p_GPmXgDZ@$rSdE!{iGkr^pKDFoxn>Lu+O8lqX2M5Nx3GmbYbONgKvKKW6 zvePKuJl?!6_`Dz~Iv$|BPG^j3hJx+}G?cF|zUZ((Eb+Cl=|9`TD^?0F#(ppyaEFJaDfzZx7!t?C&ol#5fW zU`hm^h$$+hnbL5vtVS3xwxq78^L<)Pv0L731}tw50bas(-M)gUcJqQim4v>epIyLY zW%*$1BVOULNd?Hk)!O&ui@7uH#}3)&jB#KdLRefTY;c&}xU1UjS$)3Tp`KPUut~`@=xM^uTX%!3EUUxDf1YcS+_9O{Zu(ZrZcqXIfz+ z8^)?MFT^Rqd*g{W>zJBIChDswBQ7eHRX_DScu3hS;rW#LjS*WYpmK zQttU$M=euRO0`Oj2(PnlWFb2tJ?~c&G8P?C$HXHixMQvXpibxV&;cQ*ILum=@uBF>}lvSR0A43c0 zdB_JHX{h7XaUfvu&tANsoL)9Jl2H^mFpH6h zJhq76TM-ApV8Snpi|J-s9soblmXdQ)rDuT&Q)We?5+x;;yyPT!-h4#KtkQ|U&em+y zl|srBp+gS6=!RzG{}u<((*mCeiFY@-axj~smUX>BU5M+ckhnjj@q*~NFaFiGTt1c8 zoZsj&TgHOh5AhVw@4TZ>0EQHW9#M>s&GsL$i}p&4hW5g#h$OZJ1LJZwVFNu}2JNW` z!$XPN2#I|^ppxlzgQ>E8U%9ko8a@)xrWPj3?n~1Y zEjx_^NOdttAeI)Gu%XvFX`f*Jq*A6i%x6i4qOq{GS%KRrgz&Qu8Xdvic#;y(uS_Ez3-wDgq#fwKqYL{-#1u}5(RN{ zkRQ8K5dAP7(xZ79w zAZYCe<#m#y>4-H8MjzJpCb`xfmMz2Q*!5<@yPe#1C}r#P@lM-QQZ|)Kg}Dva`4B#f3kV^VSc*DvTT~+!EA?WK)B@pHqAR-DnMc*B9>)V(&hWE@3Y{Z7Z`DGV4qml|YaKluR_x`JK zhtPY%s8NI9y5&N(<@PSH;k}I!wf#pwil8yW!1@wm3!6zVq`ayHuDauua}LHT+i|HC zV#v{c`0{xNr~}D+kKW_*&=ZUe?WqTi#9|l>dHlnC+92b0w|Z>f&(ORZ4_!R-AtHZH z05&68?>4k?MXo{~Be*9mPb%DTob742SBq}JUjq<(rNnS0x$%AC;l8UOKlOlYIj`~z zj~0Z{ge-_1lsR`7P zEf`KFlY}fvF$=7P`O@0F8Dn6QQW?vedq-1-FW4rzop)B(WXXsFtBF>B|zLz)P@ANVAtzz zv)k8g=*??NP9pE`ye4Y&ky0_ero@$RX2FjasgBPpI=9QgV!OUlGoyDe1fZ{Q%FP|(f z8?>2Yd}i`nuH?D89$NW)L+Ytl2`|+Zr#O|FzKAhNVq2pR#BTj>yJfG+frwID2=JE| z9u+}YUs{=CE5{+>@HP@_y!q?uxnW*XDQPi0)zA|j&fU(Bz#9&G=+eu%^1*x$KL(@0 zK(5B3TGI)fOGlm;x8A8J$Hgv|CzGVCh*e3cs%F7F4jw@iX7Q@viv0R*C0@)ZAl?ug zpmj=tQ)m=iP z(E$_=Zd_d8mB+4yv3fgHi#K`oYoh}xTv_LLQU(NyGcTJmFv=x=%M0)%gn&^X1BeaR z={Ze!_&Ab9;VzT!+^c9u&E94OsTs~g#kBP>ElD~vqcKnP4n3Ab%qS``3A-pZF@x@$ zAY54MC@*N%s+R0_3itD-_RdsI%llxtL+-G{0G8)-`7 z!W}dg(a7$T5wB!|jg4)v=1Dxa*BBQIEWS(C!oWcWmaMeE{UB^t)z+Zf;;X+sU%q=s zniDvlZ9KJHA;lPt2rA=hVHDnDiUb2B>w> zR8+yjxxiSs$}k85=0rGZw3v7;#?X}w{F{5F?LLL9IO}1X4iB_9qz%kK7u*oTK##pR z@|a=5=FO06pEm`!T(#SMAjnd-X6yg3$}HQCM}Xb9S2y&$|I^F@q1&-NS!@umHB$jquKAB7gLl9KZFe z^oXB7ceB0EW&?KHz3!3#eP-)QNbKDV5|LT>DIDmKJh-Mxj#zBc8K4_S!3O05GfkNH z3)#38EoBLeG^e6QaxgA$R~IW1^vRmCyiRIXS+JS4(Tt&CdnrA&Hn>*y+-2tM5v+jc z*Ht!YBhO`4C^ZPc>JZyxQg}rs7%u~54-{X6%hi$`h+c56`qcTBV@;Ujcy3kOURY{T(5R&0e14xI}m6hiElA|>l?cC?VGbq0h-r4JVBA`8w-Fmjq)u)v1hm=}hQd60h3b^)sx131lWkrq( z(|P*hNLUlvt)PZwd9XwgY3UOCqFKX;0MiTrxiq3$a3w*=k0-}^RmEg5H=Z-`WR{3j zD~z7M`BWb)w%Ir*Ii9zehS(kFBefd*zF1EL?bu!4COnccE0{tb+}PMzo(Q$b7To6> z@b*vcDZ6RKMCkFjV_a4}o#0o#7JoW-}D1J)SvU;Wa{j>f3J+kG~sRcHih& zvKCZxe7_hNJ8z83p3*ehO<@tOM1HDzOIr#c3w~ZWT2-tR6r8gIFXvfpAD(^vU9-X$ z$_gBJaFI1ugOc+6ZzNuyi(Dh4G@{<#kb++);6Lvfv2S_UbU7_U6$v~qd=`p|c2}2$ zhIahDOA%LCUL)>-7XW0y(_UlCSIB4ql#c>P(1}aU?ot9|*xz+&)&@MgLtXnvSK91F z(Ma5%6E4j%Ks9X-|wy)kO;^IB%> zkwEu1p(91a1C1r{J0B({&6o^}!U2_&QJV8*P|6&dA=%XQt6(R=sioeHmzTAoAaeUt zK0b(OY=RBHzWMpY2eZ8C1rPOnDK9)ATOku)!sZDbYSEpw;Lz)*or+_J(4YB%RFGGJ zW@)7E(WD%Cm_S=r`3QY3F7@6-V&%o?}Tp!k=+7N$#IHq5r?10N4(g83D6n zjC0O5zS@z5z0S!CTm=OfsptTIlVWt!Fz&yp{YeTJO5)-hJI~f=r9YR$IVsoh%mnLJ zl(pOaL8Qb>mMS^b(xkqf0PpQZ@D{;!U@nJ8MKD^%LBDR+6IK;2hLd}3EZwaIyM=JG znoad=k&EDgtJ`lztE=H7B3LzTE?sl3|Co@<6oFXNi7N=Jp*97Ke-!wi^`V#fuEErE zK;5NjD1O2Nwm*BiCUAVY3+ku+#D%ekj>>&w*iZgq;)_GgYiUVcMNSkPU^}6qJOBNq zfFuP494ra|CCY-OyS$OyVYMY_MN!sABqp$!N%Lt{9_v_+rFQ*g{M)c<6eN|3nV zFPFw_v=9dY23qIf;GR0z?RB^@gl+V~4XiOF5y>Kdo2uo`QJL@7bC5jegpK|SMp4DC zOh}#pz*CJ%hj7Rm`f0OS&j?>7ix-msgJs94n$g9T|3^3^V+_c{t!LB-M<;A;X`DCz zw=$G%(L)Q+J~so;Y8Ts^;X&pv&Ez(RIYQ>D28V^huP$`6fK#AmxADgU)Ex9)XWv_Sz31c=If5&*(D`X zBEUj%28SyQgeb6JDw;TJbL}Y*EiW~?Le18;Ft$-hTq9qq{&&3VR+>Bmdm*61E@!<>imQR7d8)>fO*;(RV|ur6Pu2VuBuX@fZ7x zWA&(oAUB!N!E^std3h|nplD)@j6hYml$)8uJ8{GET1{i`Xqfhh;7$1^2h&21@4!?A zzM#O_DnUj8k-I%>T}AGRbJ0trzCVd$9@223-5vL*taFC7tzq5FoR^{58ChvHkU$57 zA#iAKp3P2sDk>c=j6 z>H&@wvLFo)MU}UQvKxG{H;9AjCv=eQq4FNH;O=>T5(e7@wT@{>?j{ zgw)Xp94FEW15K$G;S@b86lHeaF-I7C6=uzxCz<b{#z0dE@q%qvEY{KWPI|@*BP|{M_Ao!DYl;EX7Ogu_7euz87 zEvAvnZoz(aY~)C`BXOz5X_d}gt+Ta8G)TM`<}LWNkUcwgLRAm!QL9G42+O)_4+*N) z@cggn{#Zd!LOy3d=`|IqazQKVWch@Im*u zW;4KVgEVTB9<}EhIrnSE2}eM7i8jq*_6+0-&^NA3a6DmzOKwqG=zbDI95y%oPr~w$ApH~S5aC;Ygh-aZpr)Y z?`aZODGP@ns*X2{>$y3z@9DFS#^(q1EB?j_>(_xV_*)n!Ym;|OV2K7Db&Am*l^?2* zxldD!Ufl^CtXc>$N(j&2(*_hM9i5woCvnAtM7WkUd$cSp5PJ6OB4@y#3QM5T)5-XP z2(Wp$n$HlvVkxPhA9lyqj}954opoQ;TRF1(mzxVZOyCQq@Fk+-boi*z?(*Yl{ag8g zm|4SZ!m-Dud@&5)rWN~qsj9bx#dH5;KL%R`OOg8(V_|7=ZzewmbzR^}YxC<#h-9O0 z!X7sI6vFBF$&bGf1~CmZ^#^TUQ@g6iK4k2;yS z)7nkWF++`KGcBUZ!T>>q-S?|H$aGDQtaOx=Tkl~>Uf(*6rlF~lBQf~2 zXHftV&!Lc>#vdcm@%;wtJo>k=5kl=2BH};F=pGbx*9||faz4MBgVu48H`7N`3YspH zr{xEV)P6qGz%vCtP(6d2%T#>J{|(MSvt1!6Oh@`LE{_PE?4dy7T-(f}kxWw9aXK0M z?u)|UQ^R6D*Swt=D=Ow zdkWJ%MQv+5JJNjtqN(f(DN=)g)d5V$+n(ynYpAXGL-59h70zi}rs-{@l8`Xp!jbD6a6DjV&{vwQQb6L`9t{#O`cbK$)-}b8o)^kf3MxYozu0( zDksgM|I$w4YNknbm*~V>375)|F7Co=9S`{F>u63{JsoKvEpyNV3o&7N#PTD#2_kZk za)>^rZTHa)Q#F+{n@|jiGsa;>;Y3-BL~!FsK2Jw(Z#VqB#G>Gp7s!WP{bquvnw54e zBqx9kGwYL~pJTfuBaLvA#42|)^_u1o$Duw5lzCw2g2wXUG;RDMvqTnPD`Kn2ER|YR zZus%R%}vqh&;FxV8RSCSs!5XE#ykqP1QIJ zQ%MpE-B3qvsk0D$j4YV4T?}&eP37i#o{Zjh0W%vf=^5WLCv!1GO-q57Y6;e}7tP%H z%#z1ZZjK@+RgZxfIhP03OF#!uR$rIIJGhJ}O9rnE z6=QFi^ONx8X7Zr8=x3pl?=vIr3Wdq~ex)MbP0zR*%znR6LjM~ZvD=#rrCUz8$Z;t9 zp-Nj8FI=~3g_X9%*zzHn={ft`?RB*{K20|@Y~tVeck_TbY0@?cIk~ho1$vok3aE-U zLE*h<*lOMl6CvpMz+%_~nTx9eiUlQhlnpQQwqIr`ouMZsj8lF9(Ic6lHFX&yO-NyU zexQ|S!!XXozdE)xvp)yZlsuCQxrNbJ+wm^o4&Mhv2$HZ0h|w({Wq)>yy7ii4h5usf zb>r{a;RwbeJJ9=`jp1F?Zwulyu2+?mR$*B<=0m)FK=|-z$*JZO$19W5(s2T2c64j5 zgKlqLHX!1(eNi&w%iHqMQgodO+a51MZ8qOwinY3%{l^N=+dIklw73rnAv?5?%1On^~#hG3tEVyqn+)z z7UO|1tQPz~cC&?vyA9gAw+pkK60kvUsQI4d)#_-M>@Rf>2}AnyGt1k*yJmB`Ls%-ZYU2AL!JoY4f1{XD!-o_lzm3n zP_OEVE9)2RA>yHo{k^rnv?QR$1T)J<0GI0_Ln16v6tcHGlePw@9BjIb7=T43$Y9_{FN=NqXVag1S zh~(P=o&`gGx*@ra$5l=~e}!!*O{X)%jbivPV}-o9-X4gBCv5RpIyvkLTW@Z>oBNdl z^V5W*R`a+zzazqG>?=47$`-~Ln4pkrn<=%J7YjXizfDo1Jefikc0x;&DW_RX%-P*h z+PnB}P>b;=MLOd(bg6O=2($<~RpI5wBqsL{N7xF;>$0%qf8r~eXtzx#A6w2j5Gj3r zs*BjR0~`|Zu9hVHJlM`G|IBnsxn_E;ofiBn!^X>6*7G1r(Q_5xL?!ur2z;K69g4&O zt%8J4-UBLuP%4g&bG-cK=3;<0B8m%6=&rXjcnnOeT-O}I)Z2M^aeyI?u~_-^y7|uE zP9OSop&VfY^k@mBO#9hFFchEn$KxAzj@^-PD%d7qTUAfuT5of8YRo z6o9*WIIb3UF7Uiy1az=A`#e z4b5@!@s0CTM20T9zza}L9+T)=yfl>Nimpj-gpmW@ZsPIW5`g-mQsomLdwXA_dGYW| ze6yOl8Agpq)}a4i*Tb)AyfA8b;*NJtk7webd&aaVpe<8opiRJJjsouj97xe)68wHa zH#R;Br-u8Tgl|8Z#AUGaFW2q3(gMK8S2_7|OIM-UNT9Cg3q5r0$()_-k)tf9W>w}l zd`?N(3_(eF@O2!7t$Kvh*imSxalU^es0HE51V%>n^SvsT?8zKgl=vyoAIl>oaf!Ui z9K&29M6kQkobIGa(Qul8bN^T(d)NiICCtXtk#Eym45a& zZ|}xrR7-4cb)K}~z8ntc0O3Ve%#AkKh>Ep;u#A?kjD`U#VVkwbdY#0Rq(JfKoGU3s)2nM;=cH_Gf=GnHn2s{~j%R9NrLu@yZdM?uj)SPtH}^ zCWW|wud#eZ1A-6wLJ;x8YOV7id$b{V`F2Z(iwusKx(!}#c2^v)JMHEhQ})lRi}uZF z^UbF9TE5EQYdjV$wJ0>2y}b2sP-b)`cixJLyC~zl1eYo_B&TiIJ40zb6fs98$NM^3 z?{5Z=a||Bq3Qt4}q;2$2Q3=#MlG}Heakt^vn%04|%TzBm-ehNrxq;APbEF%0@Kmo) zj)tBWxbBIU7aqd(tXNVy6j4NzfyOSsexy{9m=lw`X6b3dM9pg;+{oc6MMxAU63v zGI$+vg~ZWS{Rta1uF+B7g#+omoED1nH)LyZwJ`m5xCW6mpB1bHWG3^xS1QL7vayg# zp!wBPbD@>e{PomnyG$G#kw`inB2=PG6sc9lXit$`3S%nUIW|TzhS7)MJ4*jrnBXUr z0no0Ef}SQq(xSBzx_03LrfS-Y=0Gh5Z+*VmP3+H=AuTw6#s?S%hcHJNA1-I&4_?;y z$@aVO_?axyX5$EqNkY0W+(Mv@qO5(E#4z*xm9M^prhu-fkMIF!9; z-v-4I@IWyAxM2W@TU`jc5CghB!*4sSnM)x;j)J9C>`A*`9>nY?V@yoM&41N zokGyh!O%J&OuK_%W3}h(A{g+WXKJqyaGOd{b6Ze{#LX$l6IM(A#kG4`;Bf;fn|X>> zVxx&L#pfm<=XRzfESHY*zwltPoH8e~lci6~OsebF=LT*+c6*b4|Fo#O7_e{qkP2Ry z8)DBGX);rE43l=NK@B{Y4;1f4M1lm7!Af_U*NMBt8X>SvBLvJ7Ij<8)e-WZ_oQ!2hbN@R6&4_=q zm3gdu%wT)(7CETs*N`M3zK2RnYnmuyPq7a4!z`M{X=&>QHWsv1kz*|>Sm}uwfggQ5 z@d5SPkg>yoN`fECD-%bD*t?g_dSan5S<1DwXyYkN`Htnv+Nx4#*UX?lk-t)#L0*G- zO3KPqG}JXM2c7(rS0KhLr4xT$-zK(og3zT@qpXj&J@iZuz%c2xU=Z@9%z_Ew>!bBN zzI#I;xDFQ=w61B?hJ!R(wDZYYh>*UxbFnYw=Pm^X!(-3XYsmqPmcYT#&HHsdv&(en zO~31Qq}i|Ey0GPg{_egL{>8J<&C7w3U}xJt?+h-utPnzQ_YUEh z+az13cY~3qo|tMC8er92)TvLMPn+1)9XG5Dlp6ug)s>~8Oeh%e(bwH+NRgBN3ixz0 zzA650d$YsAr7-I_*B31CZuCG_v<5)%mvb=#!e`RHXu}Cyqo!I)X75V=bnib(rUt_) zuYdb?CwE*Dc_NmGPOFq?=3rYwp*?@9)~fc22v|A1Bae-bT?>*cO7vSr#7zB0yZ6b! z6Vu)zWFqoeD9L5PJz~OnVJ~6OQ8<5w+NbW{sF=avhqJKJ*q9WB1tFliP$K#Mr6dHO>S`zeg0|!5i<7H zKd0U}1_ifUGRC4LJCvMDqE=j>?`McLtC zIalE^n6>kZ4_gcW_`f8LRq&bd6|`-{_`++loO_P3nhqoOOVPA_?%kKDv9>|=jWSFw xXFoAEJPz&~NPbWVM{I0t^_;-xj&J|{21N_WKGdo@-U9)?WF!>Dt3(X~{ueJn&gcLD literal 0 HcmV?d00001 diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts b/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts new file mode 100644 index 00000000..4d45c1a0 --- /dev/null +++ b/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts @@ -0,0 +1,32 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md for additional advice +// on adding and modifying best practices + +import { AppTypes } from "data/apps/types.ts"; +import contributors from "data/contributors/index.ts"; +import { defineBestPractice } from "data/ens-best-practices/registry.ts"; +import { type BestPracticeApp, BestPracticeTypes } from "data/ens-best-practices/types.ts"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import ENSResolutionCategory from "../index.ts"; +import technicalDetails from "./technicalDetails.tsx"; + +const depositAddresses: BestPracticeApp = { + type: BestPracticeTypes.App, + id: "deposit-addresses", + bestPracticeSlug: "deposit-addresses", + name: "Correctly Resolve Deposit Addresses", + description: + "Ensure your app correctly resolves which address and chain a deposit to an ENS name should be sent to.", + category: ENSResolutionCategory, + appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi, AppTypes.Exchange], + technicalDetails: technicalDetails, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-18T15:20:00.000Z") }, + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T14:19:00.000Z") }, + ], +}; + +defineBestPractice(depositAddresses); + +export default depositAddresses; diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx new file mode 100644 index 00000000..c9e86f77 --- /dev/null +++ b/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx @@ -0,0 +1,867 @@ +import type { + AcceptanceTest, + AcceptanceTestBenchmarkFail, + AcceptanceTestBenchmarkNotApplicable, + AcceptanceTestBenchmarkPass, +} from "data/acceptance-tests/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsCodeStyles, + bestPracticeTechnicalDetailsLinkStyles, +} from "data/ens-best-practices/styles"; +import type { BestPracticeTechnicalDetails } from "data/ens-best-practices/types"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import acceptanceTestExampleImagePlaceholder from "./images/acceptance-test-example-placeholder.png"; + +const ensBestPracticeOverview = ( +

+); + +const benefitFromUsingEnsTitle = "Why this matters"; +const benefitFromUsingEns = ( +

+ Apps that fail to correctly implement ENS resolution fail their users and erode trust in + important ways. Failure to integrate ENS at all damages the user experience of the app and + exposes users to key risks such as{" "} + + address poisoning attacks + + . If ENS resolution is integrated, but not according to all ENS best practices, then it can + cause big issues. For example, deposits may silently be sent to the wrong address and be + irrecoverably lost. Or only a subset of ENS names might be properly supported which damages the + network effects and market distribution of ENS. +

+); + +const implementationRecommendations = ( +
+

There are a few ways to make sure your app's ENS resolution follows all best practices.

+
+

+ 1. Take full responsibility yourself. +

+

+ One option is to take the full responsibility for implementing all of these details correctly + yourself and continuously and rigorously testing your app for continued compliance. +

+
+

+ 2. Use the ENS Omnigraph API (recommended). +

+

+ Another, more highly recommended option is to simply perform your ENS resolutions through the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ). +

+

+ Fetch your ENS data through the ENS Omnigraph API and everything just works. It's a single + typed GraphQL API over both ENSv1 and ENSv2 for every chain and offchain names too. It also + handles the indexed ENS data your app reads (e.g. the names an address owns, profiles, + histories, etc.), with resolutions accelerated by{" "} + + Protocol Acceleration + + . Drop it in with{" "} + + enssdk + {" "} + (TypeScript) or{" "} + + enskit + {" "} + (React). +

+
+); + +const acceptanceTest1ReferenceSpan = ( + Acceptance Test 1 +); + +const acceptanceTest5ReferenceSpan = ( + Acceptance Test 5 +); + +const notApplicableReferenceSpan = ( + Not Applicable +); + +const vitalikEnsNameSpan = ( + vitalik.eth +); + +const vitalikAddressSpan = ( + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + +); + +const acceptanceTest1 = { + acceptanceTestSlug: "correctly-resolve-direct-onchain-subname-address", + description: ( +
+

+ The baseline test for supporting ENS resolution of deposit addresses is to test with an + onchain direct subname of .eth (such as {vitalikEnsNameSpan}) where the name is input in + fully normalized form and the context for resolving the deposit address is on the Ethereum + Mainnet chain. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it resolves the Ethereum Mainnet address of + {vitalikEnsNameSpan} to {vitalikAddressSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept ENS names at all as input or fails to + correctly resolve the Ethereum Mainnet address of {vitalikEnsNameSpan} to anything other + than the correct value ({vitalikAddressSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +const ethereumUnnormalizedEnsNameSpan = ( + Ξthereum.eth +); + +const ethereumNormalizedEnsNameSpan = ( + ξthereum.eth +); + +const ethereumAddressSpan = ( + + 0x31C09F0616532F7a6f33d9ee4e1F45Ea529481af + +); + +const acceptanceTest2 = { + acceptanceTestSlug: "correctly-resolve-names-requiring-normalization", + description: ( +
+

+ This variation of the baseline test changes the input name to{" "} + {ethereumUnnormalizedEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of ENS name normalization and input + validation rules. This name is valid for input as an ENS name. It is not ENS normalized but + it is ENS normalizable. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly normalizes the input name from{" "} + {ethereumUnnormalizedEnsNameSpan} to {ethereumNormalizedEnsNameSpan} and then resolves the + Ethereum Mainnet address of {ethereumNormalizedEnsNameSpan} to {ethereumAddressSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept normalizable ENS names such as{" "} + {ethereumUnnormalizedEnsNameSpan} as input or fails to correctly normalize this input to{" "} + {ethereumNormalizedEnsNameSpan} or fails to correctly resolve this input to anything other + than the correct value ({ethereumAddressSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all and therefore we classify this acceptance test as{" "} + {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const jesseBaseEnsNameSpan = ( + jesse.base.eth +); + +const jesseBaseAddressSpan = ( + + 0x2211d1D0020DAEA8039E46Cf1367962070d77DA9 + +); + +const acceptanceTest3 = { + acceptanceTestSlug: "correctly-implement-ccip-read-for-eth-subnames", + description: ( +
+

+ This variation of the baseline test changes the input name to {jesseBaseEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of CCIP-read for a subname nested + beneath .eth. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {jesseBaseEnsNameSpan} to {jesseBaseAddressSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {jesseBaseEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {jesseBaseAddressSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all and therefore we classify this acceptance test as{" "} + {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const dperriComEnsNameSpan = ( + dperri.com +); + +const dperriComAddressSpan = ( + + 0x0b08dA7068b73A579Bd5E8a8290ff8afd37bc32A + +); + +const acceptanceTest4 = { + acceptanceTestSlug: "correctly-implement-ccip-read-for-offchain-dns-names", + description: ( +
+

+ This variation of the baseline test changes the input name to {dperriComEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of CCIP-read for DNS names that have + not been imported onchain but are still valid ENS names. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {dperriComEnsNameSpan} to {dperriComAddressSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {dperriComEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {dperriComAddressSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all and therefore we classify this acceptance test as{" "} + {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const lightkeeperEnsNameSpan = ( + lightkeeper.eth +); + +const lightkeeperAddressSpan = ( + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + +); + +const acceptanceTest5 = { + acceptanceTestSlug: "correctly-resolve-names-for-different-evm-chains", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {lightkeeperEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to another EVM chain (the Base chain that's operated by Coinbase). +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of different EVM chains. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly resolves the Base chain address of{" "} + {lightkeeperEnsNameSpan} to {lightkeeperAddressSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it fails to correctly resolve this input to anything other + than the correct value ({lightkeeperAddressSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all and therefore we classify this acceptance test as{" "} + {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const gregskrilEnsNameSpan = ( + gregskril.eth +); + +const gregskrilAddressBitcoinSpan = ( + 3NnpwUMGdGKuYaPDQagNXAgVXz9HdnJDNS +); + +const acceptanceTest6 = { + acceptanceTestSlug: "correctly-resolve-names-for-bitcoin", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Bitcoin. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Bitcoin. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly resolves the Bitcoin address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressBitcoinSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Bitcoin or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressBitcoinSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all or app doesn't have context of non-EVM chain Bitcoin, we classify + this acceptance test as {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const gregskrilAddressSolanaSpan = ( + + 2JQANQn1kccapb7GT8XScf9qBy59uMo9vh9WwVQhwStJ + +); + +const acceptanceTest7 = { + acceptanceTestSlug: "correctly-resolve-names-for-solana", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Solana. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Solana. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test when it correctly resolves the Solana address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressSolanaSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Solana or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressSolanaSpan}). +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS + resolution at all or app doesn't have context of non-EVM chain Solana, we classify + this acceptance test as {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const zissouEnsNameSpan = ( + zissou.eth +); + +const zissouAddressSpan = ( + + (invalid address) + +); + +const acceptanceTest8 = { + acceptanceTestSlug: "correctly-handle-resolution-for-chains-with-invalid-address-formatting", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {zissouEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet to + the EVM chain Base. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name on + an EVM chain that is not formatted as a valid EVM address (not a 20-byte hex value), instead + resolving to {zissouAddressSpan}. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + // TODO: Insert true example of an app passing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app passes this test so long as it gracefully handles the resolved address being an + invalid EVM address. Here we define gracefully as not breaking the overall user + experience. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + // TODO: Insert true example of an app failing this acceptance test when performing the benchmarks + notes: ( +
+

+ An app fails this test if the resolution of an invalid EVM address is not handled + gracefully and breaks the overall user experience. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, + exampleNotApplicable: { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ If an app fails {acceptanceTest1ReferenceSpan} or {acceptanceTest5ReferenceSpan} then it + doesn't appear to support ENS resolution on Base at all and therefore we classify + this acceptance test as {notApplicableReferenceSpan}. +

+ Placeholder +
+ ), + } as const satisfies AcceptanceTestBenchmarkNotApplicable, +} as const satisfies AcceptanceTest; + +const technicalDetails = { + ensBestPracticeOverview, + benefitFromUsingEnsTitle, + benefitFromUsingEns, + implementationRecommendations, + acceptanceTests: [ + acceptanceTest1, + acceptanceTest2, + acceptanceTest3, + acceptanceTest4, + acceptanceTest5, + acceptanceTest6, + acceptanceTest7, + acceptanceTest8, + ], +} as const satisfies BestPracticeTechnicalDetails; + +export default technicalDetails; diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx index 1033ff22..27a51b32 100644 --- a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx @@ -8,6 +8,7 @@ import { BenchmarkResults } from "data/benchmarks/types"; import contributors from "data/contributors"; import { acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsCodeStyles, bestPracticeTechnicalDetailsLinkStyles, } from "data/ens-best-practices/styles"; import type { BestPracticeTechnicalDetails } from "data/ens-best-practices/types"; @@ -20,7 +21,7 @@ import correctlyResolveEnsv2TestNameAddressExampleFailImage from "./images/corre import correctlyResolveEnsv2TestNameAddressExampleNotApplicableImage from "./images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif"; import correctlyResolveEnsv2TestNameAddressExamplePassImage from "./images/correctly-resolve-ensv2-test-name-address-pass-example.gif"; -const useCaseSummary = ( +const ensBestPracticeOverview = (

ENS is upgrading to{" "} @@ -163,7 +164,7 @@ const implementationRecommendations = ( If your app makes its own low-level RPC calls instead of using the Omnigraph or a helper library like viem, point your resolution RPC calls at ENS's new stable Universal Resolver proxy ( - + 0xeeeeeeee14d718c2b47d9923deab1335e144eeee ) rather than hardcoding a specific Universal Resolver implementation. Because ENS controls @@ -189,11 +190,9 @@ const acceptanceTest1 = {

To check whether an app has ENSv2 ready resolution, resolve the name{" "} - - ur.integration-tests.eth - {" "} - and verify it resolves to the correct address,{" "} - + ur.integration-tests.eth and + verify it resolves to the correct address,{" "} + 0x2222222222222222222222222222222222222222 . @@ -213,11 +212,9 @@ const acceptanceTest1 = { Rabby Wallet {" "} resolves the name{" "} - - ur.integration-tests.eth - {" "} + ur.integration-tests.eth{" "} to the correct address: - + 0x2222222222222222222222222222222222222222 . @@ -239,11 +236,9 @@ const acceptanceTest1 = {

An app that is NOT ENSv2 ready resolves the name{" "} - - ur.integration-tests.eth - {" "} + ur.integration-tests.eth{" "} to an invalid address such as:{" "} - + 0x1111111111111111111111111111111111111111 . @@ -272,10 +267,8 @@ const acceptanceTest1 = {

Therefore, any app that currently doesn’t support ENS resolution at all is classified as - - Not Applicable - {" "} - for this best practice. + Not Applicable for this + best practice.

Binance Wallet doesn't currently support ENS resolution at allMock use case summary

, + ensBestPracticeOverview:

Mock use case summary

, implementationRecommendations:

Mock implementation recommendations

, benefitFromUsingEns:

Mock benefit from using ENS

, acceptanceTests: [ diff --git a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro index 49da85fb..59f00ae4 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro +++ b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro @@ -8,7 +8,7 @@ import { technicalSectionContainerStyles, technicalSectionHeaderStyles, ImplementationRecommendations, - UseCaseSummary, + EnsBestPracticeOverview, AcceptanceTestDetailsContainer, } from "../shared"; import { cn } from "@/utils/tailwindClassConcatenation"; @@ -42,7 +42,7 @@ const sortedAcceptanceTestBenchmarks = [...Object.entries(acceptanceTestBenchmar

ENS best practice benchmark report

- +
{ diff --git a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx index 833ea6fb..bce29391 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx +++ b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx @@ -7,10 +7,10 @@ import { cn } from "@/utils/tailwindClassConcatenation"; import { AcceptanceTestDetailsContainer, BenefitFromUsingEns, + EnsBestPracticeOverview, ImplementationRecommendations, technicalSectionContainerStyles, technicalSectionHeaderStyles, - UseCaseSummary, } from "../shared"; export interface BestPracticeTechnicalDetailsProps { @@ -29,7 +29,7 @@ export const BestPracticeTechnicalDetails = ({

ENS best practice overview

- +
{sortedAcceptanceTests.map((acceptanceTest, index) => ( diff --git a/ensawards.org/src/components/molecules/technicalDetails/shared.tsx b/ensawards.org/src/components/molecules/technicalDetails/shared.tsx index fd467cea..94d5a575 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/shared.tsx +++ b/ensawards.org/src/components/molecules/technicalDetails/shared.tsx @@ -33,8 +33,8 @@ export const ImplementationRecommendations = ({ bestPractice }: { bestPractice:
); -export const UseCaseSummary = ({ bestPractice }: { bestPractice: BestPractice }) => ( - <>{bestPractice.technicalDetails.useCaseSummary} +export const EnsBestPracticeOverview = ({ bestPractice }: { bestPractice: BestPractice }) => ( + <>{bestPractice.technicalDetails.ensBestPracticeOverview} ); export interface AcceptanceTestDetailsProps { From c1d7bd2d51a208adb5366350ec61eea219e47db8 Mon Sep 17 00:00:00 2001 From: y3drk Date: Fri, 19 Jun 2026 09:17:02 +0200 Subject: [PATCH 3/4] Apply 06/18/26 GitHub review feedback & AI agents' suggestions, pt.1 --- CONTRIBUTING.md | 3 + ensawards.org/data/acceptance-tests/types.ts | 3 + .../acceptance-test-example-placeholder.png | Bin .../deposit-addresses/index.ts | 0 .../deposit-addresses/technicalDetails.tsx | 176 ++---------------- ...e-ensv2-test-name-address-fail-example.png | Bin ...st-name-address-not-applicable-example.gif | Bin ...e-ensv2-test-name-address-pass-example.gif | Bin .../ensv2-ready-resolution/index.ts | 0 .../technicalDetails.tsx | 0 .../{ens-resolution => resolution}/index.ts | 0 .../technicalDetails/benchmark/index.astro | 29 ++- .../technicalDetails/bestPractice/index.tsx | 14 +- 13 files changed, 59 insertions(+), 166 deletions(-) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/deposit-addresses/images/acceptance-test-example-placeholder.png (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/deposit-addresses/index.ts (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/deposit-addresses/technicalDetails.tsx (80%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/ensv2-ready-resolution/index.ts (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/ensv2-ready-resolution/technicalDetails.tsx (100%) rename ensawards.org/data/ens-best-practices/{ens-resolution => resolution}/index.ts (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a1a3ca93..05309dc0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -309,6 +309,9 @@ For reference, see [ensawards.org/data/ens-best-practices/contract-naming/name-y examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: NotApplicableAcceptanceTestBenchmark; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by name). */ + order?: number; } ``` 4. In your PR describe your reasoning for adding it. diff --git a/ensawards.org/data/acceptance-tests/types.ts b/ensawards.org/data/acceptance-tests/types.ts index 96256a02..5fe356a8 100644 --- a/ensawards.org/data/acceptance-tests/types.ts +++ b/ensawards.org/data/acceptance-tests/types.ts @@ -47,6 +47,9 @@ export interface AcceptanceTest { examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: AcceptanceTestBenchmarkNotApplicable; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by name). */ + order?: number; } /** diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/images/acceptance-test-example-placeholder.png b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/images/acceptance-test-example-placeholder.png similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/images/acceptance-test-example-placeholder.png rename to ensawards.org/data/ens-best-practices/resolution/deposit-addresses/images/acceptance-test-example-placeholder.png diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/index.ts similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/index.ts rename to ensawards.org/data/ens-best-practices/resolution/deposit-addresses/index.ts diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx similarity index 80% rename from ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx rename to ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx index c9e86f77..20c26849 100644 --- a/ensawards.org/data/ens-best-practices/ens-resolution/deposit-addresses/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx @@ -1,7 +1,6 @@ import type { AcceptanceTest, AcceptanceTestBenchmarkFail, - AcceptanceTestBenchmarkNotApplicable, AcceptanceTestBenchmarkPass, } from "data/acceptance-tests/types"; import { BenchmarkResults } from "data/benchmarks/types"; @@ -22,10 +21,10 @@ import acceptanceTestExampleImagePlaceholder from "./images/acceptance-test-exam const ensBestPracticeOverview = (

- When an app needs their users to identify a particular address on a particular chain where an + When an app needs its users to identify a particular address on a particular chain where an action should be taken (such as a transfer or deposit), ENS offers the possibility of a better user experience. Instead of forcing users to enter a long string of hexadecimal digits, with - ENS users can have the option of entering a simple name such as{" "} + ENS, users can have the option of entering a simple name such as{" "} vitalik.eth. ENS can then be used to translate this input name into the relevant deposit address, such as @@ -79,10 +78,13 @@ const benefitFromUsingEns = ( > address poisoning attacks - . If ENS resolution is integrated, but not according to all ENS best practices, then it can - cause big issues. For example, deposits may silently be sent to the wrong address and be - irrecoverably lost. Or only a subset of ENS names might be properly supported which damages the - network effects and market distribution of ENS. + . +
+
+ If ENS resolution is integrated, but not according to all ENS best practices, then it can cause + big issues. For example, deposits may silently be sent to the wrong address and be irrecoverably + lost. Or only a subset of ENS names might be properly supported which damages the network + effects and market distribution of ENS.

); @@ -158,18 +160,6 @@ const implementationRecommendations = (
); -const acceptanceTest1ReferenceSpan = ( - Acceptance Test 1 -); - -const acceptanceTest5ReferenceSpan = ( - Acceptance Test 5 -); - -const notApplicableReferenceSpan = ( - Not Applicable -); - const vitalikEnsNameSpan = ( vitalik.eth ); @@ -181,6 +171,7 @@ const vitalikAddressSpan = ( ); const acceptanceTest1 = { + order: 0, acceptanceTestSlug: "correctly-resolve-direct-onchain-subname-address", description: (
@@ -250,6 +241,7 @@ const ethereumAddressSpan = ( ); const acceptanceTest2 = { + order: 1, acceptanceTestSlug: "correctly-resolve-names-requiring-normalization", description: (
@@ -307,26 +299,6 @@ const acceptanceTest2 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all and therefore we classify this acceptance test as{" "} - {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const jesseBaseEnsNameSpan = ( @@ -340,6 +312,7 @@ const jesseBaseAddressSpan = ( ); const acceptanceTest3 = { + order: 2, acceptanceTestSlug: "correctly-implement-ccip-read-for-eth-subnames", description: (
@@ -393,26 +366,6 @@ const acceptanceTest3 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all and therefore we classify this acceptance test as{" "} - {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const dperriComEnsNameSpan = ( @@ -426,6 +379,7 @@ const dperriComAddressSpan = ( ); const acceptanceTest4 = { + order: 3, acceptanceTestSlug: "correctly-implement-ccip-read-for-offchain-dns-names", description: (
@@ -479,26 +433,6 @@ const acceptanceTest4 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all and therefore we classify this acceptance test as{" "} - {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const lightkeeperEnsNameSpan = ( @@ -512,6 +446,7 @@ const lightkeeperAddressSpan = ( ); const acceptanceTest5 = { + order: 4, acceptanceTestSlug: "correctly-resolve-names-for-different-evm-chains", description: (
@@ -566,26 +501,6 @@ const acceptanceTest5 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all and therefore we classify this acceptance test as{" "} - {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const gregskrilEnsNameSpan = ( @@ -597,6 +512,7 @@ const gregskrilAddressBitcoinSpan = ( ); const acceptanceTest6 = { + order: 5, acceptanceTestSlug: "correctly-resolve-names-for-bitcoin", description: (
@@ -652,26 +568,6 @@ const acceptanceTest6 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all or app doesn't have context of non-EVM chain Bitcoin, we classify - this acceptance test as {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const gregskrilAddressSolanaSpan = ( @@ -681,6 +577,7 @@ const gregskrilAddressSolanaSpan = ( ); const acceptanceTest7 = { + order: 6, acceptanceTestSlug: "correctly-resolve-names-for-solana", description: (
@@ -736,26 +633,6 @@ const acceptanceTest7 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} then it doesn't appear to support ENS - resolution at all or app doesn't have context of non-EVM chain Solana, we classify - this acceptance test as {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const zissouEnsNameSpan = ( @@ -769,6 +646,7 @@ const zissouAddressSpan = ( ); const acceptanceTest8 = { + order: 7, acceptanceTestSlug: "correctly-handle-resolution-for-chains-with-invalid-address-formatting", description: (
@@ -825,26 +703,6 @@ const acceptanceTest8 = {
), } as const satisfies AcceptanceTestBenchmarkFail, - exampleNotApplicable: { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, - ], - notes: ( -
-

- If an app fails {acceptanceTest1ReferenceSpan} or {acceptanceTest5ReferenceSpan} then it - doesn't appear to support ENS resolution on Base at all and therefore we classify - this acceptance test as {notApplicableReferenceSpan}. -

- Placeholder -
- ), - } as const satisfies AcceptanceTestBenchmarkNotApplicable, } as const satisfies AcceptanceTest; const technicalDetails = { diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/index.ts b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/index.ts similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/index.ts rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/index.ts diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/technicalDetails.tsx similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/ensv2-ready-resolution/technicalDetails.tsx rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/technicalDetails.tsx diff --git a/ensawards.org/data/ens-best-practices/ens-resolution/index.ts b/ensawards.org/data/ens-best-practices/resolution/index.ts similarity index 100% rename from ensawards.org/data/ens-best-practices/ens-resolution/index.ts rename to ensawards.org/data/ens-best-practices/resolution/index.ts diff --git a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro index 59f00ae4..c5c27192 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro +++ b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro @@ -19,6 +19,7 @@ import { AcceptanceTestResultFooter, AcceptanceTestResultFooterLoading, } from "./acceptanceTestResultDetails.tsx"; +import { getAcceptanceTestBySlug } from "data/acceptance-tests/utils"; interface BenchmarkTechnicalDetailsProps { bestPractice: BestPractice; @@ -29,10 +30,32 @@ interface BenchmarkTechnicalDetailsProps { const { bestPractice, acceptanceTestBenchmarks, benchmarkedApp }: BenchmarkTechnicalDetailsProps = Astro.props; -// Sort acceptance tests by slug (alphabetically) to ensure consistent display order across best practice details and benchmark details pages. +// Sort acceptance tests by order (ascending) to ensure consistent display order +// across best practice details and benchmark details pages. +// The tiebreaker is the alphabetical order of the acceptance test slug. const sortedAcceptanceTestBenchmarks = [...Object.entries(acceptanceTestBenchmarks)].sort( - ([aAcceptanceTestSlug, _a], [bAcceptanceTestSlug, _b]) => - aAcceptanceTestSlug.localeCompare(bAcceptanceTestSlug), + ([aAcceptanceTestSlug, _a], [bAcceptanceTestSlug, _b]) => { + const aAcceptanceTest = getAcceptanceTestBySlug(aAcceptanceTestSlug); + const bAcceptanceTest = getAcceptanceTestBySlug(bAcceptanceTestSlug); + + if (!aAcceptanceTest) { + throw new Error( + `Invariant(AcceptanceTestSlug): Acceptance test with slug="${aAcceptanceTestSlug}" is not defined.`, + ); + } + + if (!bAcceptanceTest) { + throw new Error( + `Invariant(AcceptanceTestSlug): Acceptance test with slug="${bAcceptanceTestSlug}" is not defined.`, + ); + } + + const aOrder = aAcceptanceTest.order ?? Number.POSITIVE_INFINITY; + const bOrder = bAcceptanceTest.order ?? Number.POSITIVE_INFINITY; + if (aOrder !== bOrder) return aOrder - bOrder; + + return aAcceptanceTestSlug.localeCompare(bAcceptanceTestSlug); + }, ); --- diff --git a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx index bce29391..d56041aa 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx +++ b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx @@ -20,10 +20,16 @@ export interface BestPracticeTechnicalDetailsProps { export const BestPracticeTechnicalDetails = ({ bestPractice, }: BestPracticeTechnicalDetailsProps) => { - // Sort acceptance tests by slug (alphabetically) to ensure consistent display order across best practice details and benchmark details pages. - const sortedAcceptanceTests = [...bestPractice.technicalDetails.acceptanceTests].sort((a, b) => - a.acceptanceTestSlug.localeCompare(b.acceptanceTestSlug), - ); + // Sort acceptance tests by order (ascending) to ensure consistent display order + // across best practice details and benchmark details pages. + // The tiebreaker is the alphabetical order of the acceptance test slug. + const sortedAcceptanceTests = [...bestPractice.technicalDetails.acceptanceTests].sort((a, b) => { + const aOrder = a.order ?? Number.POSITIVE_INFINITY; + const bOrder = b.order ?? Number.POSITIVE_INFINITY; + if (aOrder !== bOrder) return aOrder - bOrder; + + return a.acceptanceTestSlug.localeCompare(b.acceptanceTestSlug); + }); return (
From 90cf0d1551afb7d94fdd9bbbd2ed71d38aa8c9a1 Mon Sep 17 00:00:00 2001 From: y3drk Date: Fri, 19 Jun 2026 15:18:14 +0200 Subject: [PATCH 4/4] Apply AI agents' suggestions, pt.2 --- CONTRIBUTING.md | 2 +- ensawards.org/data/acceptance-tests/types.ts | 2 +- .../resolution/deposit-addresses/technicalDetails.tsx | 7 ++++--- ensawards.org/data/ens-best-practices/styles.ts | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 05309dc0..7bc77928 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -310,7 +310,7 @@ For reference, see [ensawards.org/data/ens-best-practices/contract-naming/name-y exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: NotApplicableAcceptanceTestBenchmark; - /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by name). */ + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ order?: number; } ``` diff --git a/ensawards.org/data/acceptance-tests/types.ts b/ensawards.org/data/acceptance-tests/types.ts index 5fe356a8..16eb1653 100644 --- a/ensawards.org/data/acceptance-tests/types.ts +++ b/ensawards.org/data/acceptance-tests/types.ts @@ -48,7 +48,7 @@ export interface AcceptanceTest { exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: AcceptanceTestBenchmarkNotApplicable; - /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by name). */ + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ order?: number; } diff --git a/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx index 20c26849..4e4c33c4 100644 --- a/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx @@ -39,7 +39,7 @@ const ensBestPracticeOverview = (

The simplest way to get this right—and to continuously and automatically stay up to date with - all ENS best practices even as ENS keeps evolving— is to use the{" "} + all ENS best practices even as ENS keeps evolving—is to use the{" "}

- An app fails this test when it fails to correctly resolve this input to anything other - than the correct value ({lightkeeperAddressSpan}). + An app fails this test when it does not accept ENS names such as {lightkeeperEnsNameSpan}{" "} + as input or fails to correctly resolve this input to anything other than the correct value + ({lightkeeperAddressSpan}).

+

+ When an app needs their users to identify a particular address on a particular chain where an + action should be taken (such as a transfer or deposit), ENS offers the possibility of a better + user experience. Instead of forcing users to enter a long string of hexadecimal digits, with + ENS users can have the option of entering a simple name such as{" "} + vitalik.eth. ENS can then be + used to translate this input name into the relevant deposit address, such as + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + + . This process of determining the deposit address for a name is an example of what is called + "resolution". +

+

+ This best practice checks that your app correctly resolves ENS names to the correct address + and chain for different contexts. +

+

+ The simplest way to get this right—and to continuously and automatically stay up to date with + all ENS best practices even as ENS keeps evolving— is to use the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ) which handles the implementation details of ENS resolution for you. The implementation + recommendations below cover how your engineering team can adopt it, or other supported + options. +

+