diff --git a/bun.lock b/bun.lock index 15510832..3fa595da 100644 --- a/bun.lock +++ b/bun.lock @@ -28,7 +28,7 @@ "@codemirror/view": "^6.41.1", "@lezer/highlight": "^1.2.3", "@lezer/markdown": "^1.6.3", - "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-progressive.4.tgz", + "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-sustainable.3.tgz", "bs58check": "^3.0.1", "idb": "^8.0.3", "js-yaml": "^4.1.1", @@ -810,7 +810,7 @@ "ast-v8-to-istanbul": ["ast-v8-to-istanbul@1.0.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^10.0.0" } }, "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA=="], - "automerge-atproto": ["automerge-atproto@vendor/automerge-atproto-0.0.0-progressive.4.tgz", { "dependencies": { "@atcute/car": "6.0.2", "@atcute/cbor": "2.3.6", "@atcute/client": "5.1.1", "@atcute/crypto": "2.4.4", "@atcute/lexicons": "2.0.3", "@atcute/multibase": "1.2.5", "@atcute/repo": "1.0.2", "@automerge/automerge": "^3.3.2", "@noble/curves": "1.9.7", "@noble/secp256k1": "3.1.0" }, "optionalDependencies": { "@number0/iroh": "^1.1.0" } }], + "automerge-atproto": ["automerge-atproto@vendor/automerge-atproto-0.0.0-sustainable.3.tgz", { "dependencies": { "@atcute/car": "6.0.2", "@atcute/cbor": "2.3.6", "@atcute/client": "5.1.1", "@atcute/crypto": "2.4.4", "@atcute/lexicons": "2.0.3", "@atcute/multibase": "1.2.5", "@atcute/repo": "1.0.2", "@automerge/automerge": "^3.3.2", "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@noble/secp256k1": "3.1.0" }, "optionalDependencies": { "@number0/iroh": "^1.1.0" } }], "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], diff --git a/docs/README.md b/docs/README.md index 25e7f855..ff2d3852 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,6 +11,7 @@ the implemented ownership boundaries and points to the code that owns them. | What is the application and what owns its state? | [Architecture](architecture.md) | | What is the product's design direction? | [Product](../PRODUCT.md); currently focused on Types & Records interaction | | What should ATProto startup/login/onboarding/logout do? | [Local-first lifecycle](plans/atproto-local-first-lifecycle.md); user-aligned correction in progress | +| What is the current transport implementation and what was tested? | [Sustainable inline sync plan](plans/2026-10-11-sustainable-inline-sync.md) and [implementation evidence](verification/2026-10-11-sustainable-inline-sync.md); feature branch, not deployed | | What is proposed for worker-owned editing, adoption and large backup import? | [Worker-owned documents plan](plans/2026-10-07-worker-owned-documents.md); draft, not yet implemented | | How do external plugins work? | `src/plugin/obsidian-compat/` and `src/plugin/reams/`; `npm run obsidian:contract` checks upstream API shape. The [plugin author guide](PLUGIN-AUTHOR-GUIDE.md) provides examples, with some historical implementation descriptions. | | How do I deploy or operate a release? | `playbooks/`; use the playbook for the selected edition/deployment | diff --git a/docs/plans/2026-10-10-automerge-namespace-migration.md b/docs/plans/2026-10-10-automerge-namespace-migration.md new file mode 100644 index 00000000..6a44891e --- /dev/null +++ b/docs/plans/2026-10-10-automerge-namespace-migration.md @@ -0,0 +1,160 @@ +# Automerge namespace and bytes cutover + +For release ordering and existing-client behavior, use +[HappyView/client cutover](2026-10-11-happyview-client-cutover.md). Batch-size and +publication-policy tuning alone require no migration of current-format records. + +## Current schema + +Use the domain-owned NSIDs: + +- `ink.reams.automerge.document` — original founding change. +- `ink.reams.automerge.operation` — native change batches and tombstones. + +The initial Lexicon revision is 1. No `profile` or `3-inline` field is written: +the `$type` NSID identifies the bytes schema. AMCH v1 retains its binary framing +version; it is independent of a redundant record-format tag. + +```json +{ + "$type": "ink.reams.automerge.operation", + "documentId": "abcdefghijklmnopqrstuvwxyz", + "kind": "batch", + "changes": { "$bytes": "" }, + "changeCount": 2, + "changeBytes": 12345 +} +``` + +Base64 is only the JSON representation of the standard `bytes` field. The +canonical CBOR payload is binary. Records do not contain part/blob manifests. +The SDK has one current reader/writer, not a namespace or encoding selector. + +## What migration changes + +The finite Node planner in the SDK, `scripts/repack-legacy-records.mjs`, reads +archived `xyz.sealight.automerge.document/operation` records. It supports the +old `/2-inline` string envelopes and the pre-rename `/3-inline` byte experiment. +It emits new NSIDs and standard bytes, without a wire profile tag. + +It repackages the **original native change bytes**. Document IDs, founding +hash/creator, each author's native history, heads/dependencies, and accepted +tombstones are independently checked using the current decoder. Unresolved +source classification blocks conversion unless an explicit, identity-bound malformed-source +disposition applies; valid native history cannot be discarded that way. A valid +native change exceeding the target capacity aborts conversion without a plan. + +Missing dependencies or founding records are preserved as incomplete histories in +the verification report; they are not automatically refused as malformed source. +Their production disposition requires inspection before activation. + +Storage record URIs, content-batch rkeys, and record CIDs change. Native document +identities/hashes do not. The public `ink.reams.vaultAuthority` pointer is not +rewritten. Unrelated record values and permissions remain intact. + +## One-time database operator + +The isolated worktree `.worktrees/happyview-automerge-migration` is based on +upstream HappyView v2.14.2. It adds only the finite CLI and its accounting helper; +it does not patch server routes/auth. The post-cutover server is the unmodified +upstream provider from `.worktrees/happyview-polyfill-baseline`. + +`repack_automerge_records` provides: + +1. **Archive:** consistent read-only capture of the selected space, all actual + space-row fields, records, repo states, oplog, outgoing and relevant incoming + refs. It does not run database schema migrations. Files are exclusive/private. +2. **Plan:** the Node tool re-derives native history and the replacement records. +3. **Dry-run:** the operator invokes that trusted verifier once, consumes its + captured stdout, locks/rereads the complete source and rolls back exactly. +4. **Activate:** one transaction deletes the retired Automerge rows/refs, + installs new records with canonical CIDs, rebuilds each author's complete + LtHash and upstream v2.14.2 commit metadata, and resets the finite oplog under + a strictly newer revision. It records source/plan/codec/poststate digests. +5. **Retry:** the same original archive/plan no-ops only when the activated + poststate still matches. Subsequent data or authority/policy changes cause + refusal; there is no restore-over-new-writes path. + +Scope is **unsigned historical HappyView data**. Existing signatures, committed +hash/IKM/MAC, native host mode, or sync state are refused. The previous production +read-only observation found zero repo-state rows; that is historical evidence, +not a substitute for the tool's fresh stopped-writer source checks. It never +fabricates an author's asymmetric signature or rewrites a native PDS repo. + +Surviving indexed references to a retired record URI block activation rather than +silently changing unrelated content. If both historical refs-table variants +exist, the tool refuses ambiguity. Historical-schema archive support does not +imply activation support; required target-schema columns are preflighted. + +## Old clients and write permissions + +Upstream HappyView already enforces `config.allowedCollections`. The migration +uses it to reject future old-namespace writes without a permanent server fork. + +- With a nonempty restrictive list, permissions are remapped **one-for-one**: + old document permission becomes new document permission; old operation + permission becomes new operation permission. Absent rights stay absent. +- Unrelated listed permissions are preserved. Stored data never creates a new + write grant under a restrictive policy. +- For an unrestricted/empty configuration, moving to a finite allowlist changes + future write behavior. The operator must explicitly select + `--restrict-unlisted-collections`; the choice is recorded and checked on retry. + +Old clients must update to publish to the new collections. Their local native +history and pending edits are not reset. The new SDK opens the same schema-3 +partition, retires only known experimental publication-job metadata and reseals +retained native intent. Runtime readers do not retain the legacy wire codec. + +## Commands (preparation only; production not executed) + +Build the finite operator from its own worktree/target directory. A shared Cargo +target between stock server and operator worktrees produced a stale library +artifact during verification; separate targets avoid that collision. + +```sh +# In .worktrees/happyview-automerge-migration +nix develop /home/anish/usr/automerge-atproto --command \ + cargo build --bin repack_automerge_records + +# With writers stopped and a database backup retained; provide DATABASE_URL. +target/debug/repack_automerge_records archive + +# In the SDK worktree, after npm run build: +node scripts/repack-legacy-records.mjs \ + --source --output + +# Set AUTOMERGE_ATPROTO_REPACK_PLANNER to the absolute trusted script path. +target/debug/repack_automerge_records activate \ + --offline --dry-run +target/debug/repack_automerge_records activate \ + --offline +``` + +Add the restriction flag to both activation commands only when the source policy +requires that explicit decision. Register/publish the new lexicons and update +any space-type collection declarations as part of deployment. Validate a fresh +reader and resumed queued edits before reopening ordinary writes. A rollback +from the database backup belongs before accepting post-cutover writes. + +## Verification and review + +- SDK default suite: 174 passing tests after namespace/no-tag changes. +- Current-record/converter suite: 34 passing tests; source above target capacity + cannot be mislabeled as malformed and discarded. +- Main-thread codec campaign: 100 cases passed, plus boundary check. +- Corrected operator accounting: 19 passing binary unit tests; actual temporary + PostgreSQL 15 activation test passed on the main thread. +- Actual CLI + real SQLite HappyView/PDS/OAuth + new SDK: two authors, two + documents, four byte-exact native changes, owner tombstone and unrelated data + preserved; public PDS root pointer's value/CID unchanged; dry-run rollback, + unchanged retry, old-write refusal, new-write success and diverged retry tested. +- New NSIDs/no wire tag: largest document IndexedDB-emulation reopen passed; + full archive transport/history reconstruction passed (113 docs, 33,052 native + changes, 336 records, four passes, about 129 seconds). Full run uses memory + local storage; whole-backup Chromium/IndexedDB durability remains separate. +- Adversary reviews found real SQL adaptation, reference-locking, and permission + expansion bugs. They were fixed and re-reviewed. Final approval is for finite, + unsigned, offline operator **local testing**, not production execution. + +No production migration, deployment or merge has been performed. The finite +operator and current client implementation are tracked on their feature branches. diff --git a/docs/plans/2026-10-11-happyview-client-cutover.md b/docs/plans/2026-10-11-happyview-client-cutover.md new file mode 100644 index 00000000..e1eb28aa --- /dev/null +++ b/docs/plans/2026-10-11-happyview-client-cutover.md @@ -0,0 +1,104 @@ +# HappyView cutover and existing Reams clients + +Operational plan, not executed. The finite operator is limited to unsigned +historical HappyView polyfill data. See [namespace migration](2026-10-10-automerge-namespace-migration.md) +and [sustainable sync verification](../verification/2026-10-11-sustainable-inline-sync.md). + +## Two different changes + +Increasing batch preference and configuring a five-minute publication age do not +change native changes or the current `ink.reams.automerge.*` bytes schema. Existing +current-format records remain readable as-is; they need no repacking/migration. + +The one-time cutover is for deployed `xyz.sealight.automerge.document/operation` +records, including the older string-encoded profile. It changes transport record +collections, envelopes, content keys and CIDs. It preserves original native bytes, +document IDs, founding hashes/creators, author namespaces, dependencies, heads, +tombstones and hierarchy links. The public `ink.reams.vaultAuthority` root pointer's +value/CID and the structured space identity stay unchanged. + +## Release sequence + +1. **Prepare pinned artifacts.** Build the current Reams/SDK and finite migration + operator; publish/register the new lexicons and check collection declarations. + Keep the operator's Cargo target separate from the stock provider target. +2. **Close remote ingress.** Stop serving affected space reads/writes and drain + accepted requests. Keep provider background writers stopped too. Local Reams + editing remains device-local; do not force logout or remove browser data. +3. **Capture and preflight.** Retain a database backup plus exclusive/private + per-space archives of records, repo state, oplog, refs and policy. Inspect the + *fresh* stopped state; historical production observations are insufficient. + Existing signed/hash/IKM/MAC state, native host/sync state, ambiguous schemas, + surviving references into retired transport URIs or occupied destination + namespaces cause refusal. A refusal needs a separately supported migration + decision, not deletion of the rejected state to make this operator proceed. +4. **Plan and dry-run.** Decode/classify every source and independently verify the + replacement. Valid oversized history and unresolved source classification block + conversion. Missing dependencies/founders are preserved and reported as + incomplete, not automatically refused; inspect and resolve that report before + production activation. Run the complete transaction in dry-run mode and verify rollback. +5. **Activate while closed.** Apply each frozen plan atomically, including canonical + CIDs, refs, provider LtHash/repo commit accounting and a newer revision/oplog + baseline. This is an explicitly chosen early operator exception, not + author-authenticated rewriting of independently hosted PDS repositories. +6. **Fence old writes.** Upstream `config.allowedCollections` must exclude both old + collections and grant the required new collections. Restrictive policies map + rights one-for-one and preserve unrelated listed permissions. Unrestricted + policies require `--restrict-unlisted-collections`; inspect the finite list. + Stored unrelated rows do not implicitly grant future write access. +7. **Verify clients before ordinary reopening.** Use the updated app from a fresh + browser and an existing same-profile browser with durable pending edits. Check + original identity, exact captured history, dependencies, tombstones and eventual + acknowledged outbox drain. Exercise ordinary and explicit publication plus + old-write refusal inside the isolated maintenance boundary, never by reopening + unfenced old ingress temporarily. +8. **Reopen the stock provider and publish the app update.** Keep endpoint, space + identity, account partition/storage name and OAuth client/signing configuration + stable unless a separate explicit release decision changes them. Retain backups + and archives and monitor typed refusal/pending errors. + +Restore the pre-cutover backup only before any post-cutover write is accepted, +including verification publications inside maintenance. Once real pending edits +have been acknowledged, keep maintenance closed and recover forward; ordinary +reopening is not the rollback cutoff. Idempotent +operator retry is permitted only while the recorded poststate still matches; it +refuses restoring a frozen plan over newer data/policy. There is no cross-space +atomicity claim: keep maintenance closed until every selected space has been +activated and checked. Restore only before the write-acceptance cutoff above. + +## Connection behavior + +| Client | During maintenance | After cutover | +| --- | --- | --- | +| Old build, local account cached | Local saves/outbox remain; remote sync unavailable | Old-namespace writes refused; old remote bodies no longer readable through its decoder. Update needed for sync. | +| Updated existing profile | Same schema-3 local account partition | Retained native intent resealed for current namespace; obsolete job plans retired, not source history. Original IDs/root links stay valid. | +| Updated fresh profile | No remote opening while maintenance is closed | Unchanged public authority pointer/current collections recover original documents/history. | + +There is no planned account/space recreation, root-pointer replacement, credential +revocation or user export/reimport. Namespace migration itself does not require +reauthentication when endpoint/OAuth configuration and session remain valid. +Independent token expiry/rejection can still require normal reauthorization. + +Do not require old clients to publish before installing the update: their old +write namespace is fenced. The app-update barrier is **local durability**; destructive +logout requires publication. Updating must retain pending work. Failed publication +must not trigger a storage wipe or anonymous-workspace fallback. + +`allowedCollections` is a storage write fence, not a client-version handshake. +An old build may show a generic sync error rather than a polished update-required +message. It is not automatically migrated/reconnected by the provider. The new +runtime has no permanent legacy reader/writer. + +## Evidence versus remaining release gates + +Local CLI/provider tests prove two-author native preservation, creator tombstone, +unchanged public root pointer/CID, dry-run rollback, unchanged retry, old raw writes +refused, new writes accepted and diverged retry refused. SDK tests separately prove +schema-3 native outbox preservation, old-job retirement and current publication. +Current Reams multi-profile/fresh-reader sync has also passed. + +An actual deployed old browser saving offline, reloading, installing the update in +the **same profile**, then draining its native outbox remains a release gate. So +do fresh production schema/signing-state preflight and the chosen collection +policy. Neither is replaced by passing synthetic old-write or fresh-client tests. +No production cutover is authorized/executed here. diff --git a/docs/plans/2026-10-11-sustainable-inline-sync.md b/docs/plans/2026-10-11-sustainable-inline-sync.md new file mode 100644 index 00000000..52e6f2f2 --- /dev/null +++ b/docs/plans/2026-10-11-sustainable-inline-sync.md @@ -0,0 +1,125 @@ +# Sustainable inline sync implementation + +Status: implemented on the feature branches; [verification](../verification/2026-10-11-sustainable-inline-sync.md). +User approved the measured inline-batch +direction and explicitly deferred remote document/record compaction. + +## Outcome + +Preserve immediate local editing/durability while accumulating small changes into +fewer immutable remote records. Publication must make progress when a space's +inventory exceeds one bounded pass, including when Reams recreates the SDK worker +runtime between requests. Routine catch-up should not enumerate lifetime records. + +Work proceeds on new `feature/sustainable-inline-sync` branches in the existing +SDK and Reams integration worktrees. The uncommitted validated inline foundation +and regression/fuzz harness are retained; no automatic commit, merge or release. + +## Contracts + +- Keep `ink.reams.automerge.document` / `.operation`, standard Lexicon bytes, + AMCH v1, original native history/IDs/founder/creator tombstones and exact CID + acknowledgement. No profile field or transport selector on wire records. +- Set preferred batch frame bytes to 1,047,552 (1 MiB minus envelope allowance). + Verify actual canonical record and JSON request sizes. Retain max 256 changes + and the existing unsupported-native-change behavior. +- Ordinary publication uses a configurable five-minute **oldest pending** age, independent of + local persistence. Later edits never postpone it. Byte/count saturation can + publish earlier; explicit publication barriers bypass ordinary delay. +- Keep sealed membership immutable through retries and acknowledge exact captured + work only. Local writes and later edits remain usable during remote work. +- Reams worker ordinary sync must use the ordinary publication policy, not force + a barrier every time it polls. Adoption/logout use explicit publication barriers. + +## Incremental, resumable discovery + +Use the supported upstream `listRepos` revision and `listRepoOps` metadata API. +HappyView v2.14.2 supplies ordered `(rev, idx)` operations and an `excludeValues` +query option. DTO operations use `author_did`, `rev`, `idx`, `collection`, `rkey`, +`action`, nullable `cid`/`prev`; repository `rev` and terminal response cursors are +nullable. There is no `since` query. Scope the adapter to verified DTO/cursor semantics. + +A disposable reader/account/space-partitioned inventory persists metadata and +continuations separately from canonical schema-3 history/outbox. Cold bootstrap +records its starting repository revision before listing the two collections; then +replays operations since that boundary so concurrent writes are not skipped. +Warm observation checks fresh repository revisions and reads only new operations. +New repositories bootstrap independently; removed repositories lose derived +evidence. Invalid/expired cursors reset only the affected derived inventory. + +Metadata pages and cursor advancement commit atomically. A pass limit returns +typed pending work with its continuation retained; the next worker/runtime resumes. +No incomplete inventory authorizes absent-founder publication. Body failures keep +their inventory entries available for retry; metadata progress never acknowledges +native intent. Independent verification uses a fresh, uncached inventory path. + +Persist consumed `(rev, idx)` separately from the next-page cursor: terminal pages +have no continuation. Never advance from the response commit, which can describe +operations written after its page query. Complete a captured repository revision; +empty/nonadvancing/malformed pages cannot silently declare later coverage. Validate +persisted phases/cursors locally because the provider can accept malformed cursors. +Use reader/space Web Lock serialization and generation fencing for updates. Keep +a durable changed-document/retry workset, clearing a captured token only after +canonical application and local persistence; unchanged revisions must still retry +failed bodies. Nonrevisioned repositories require explicit bounded full rescan. + +Oldest age is persisted with native outbox intent; old rows without age are already +eligible. Reams ordinary worker requests call an explicit `flushPending` method, +not the publication barrier. Five minutes is the default eligibility threshold, with +execution bounded by Reams' existing polling/suspension behavior. The 15-second +poll is not a five-minute remote visibility promise. Adoption/logout retain `flush`. +The library factory option is `publicationDelayMs`; Reams defaults to 300,000 ms +and propagates `VITE_ATPROTO_PUBLICATION_DELAY_MS` consistently to its factory and +workers. Byte/count saturation still preempts age; explicit barriers stay immediate. + +Both recovery and publication use this one discovery mechanism rather than two +independent scans. Preserve existing record/page bounds, contribution acceptance, +creator conflicts, tombstone ownership, exact native validation and cancellation. +Provider refusal/cache failure cannot delete canonical work. A cold persistent +inventory beyond one pass must progress; a warm unchanged space must need no +listRecords calls. + +## Implementation slices + +1. Carry the current inline foundation/tests forward and replace stale package + test entrypoints with current-format lanes. Keep measured evidence as research. +2. Near-limit packing and oldest-age scheduling, with real timer-boundary tests and + generated arrivals checked against the retained independent oracle. +3. One derived inventory implementation: page persistence, bootstrap catch-up, + revision/delta refresh, invalidation, bounded resumption across runtime reopen; + integrate it into recovery and publication without changing acknowledgement. +4. Package the SDK artifact and integrate the ordinary/barrier distinction into + Reams. Run SDK/unit/fuzz, actual browser persistence and real-provider progress, + lost-response/fresh-reader/large-change checks. Include an original failed + 25,600-record inventory case that now completes across bounded passes. +5. Fresh adversary review focused on correctness, race/failure semantics and scope; + resolve findings, then update implementation evidence and known limits. + +## Required evidence + +- Small edits/local flushes pack until oldest-age deadline; continuous edits do not + slide it. Saturation, explicit barrier, restart and close retain exact intent. +- Native batching/property tests preserve every byte/hash, founder and heads at + record/count boundaries. Existing crash/late-edit/concurrent-tab/isolation corpus + remains in the default or explicit regression commands. +- Initial metadata bootstrap interrupted at every page boundary resumes correctly; + concurrent operations at its boundary replay; changed/deleted records and new + repos refresh without accepting stale absence evidence. Cursor corruption, + transport/auth errors and cancellation never skip accepted work. +- Warm sync/new edit scales with repository count/new operations, not lifetime + list pages. Original large inventory no longer causes repeated zero-write passes. +- Persistent IndexedDB + real provider prove reopening between passes, rather than + claiming memory-only continuation matches the Reams worker lifecycle. +- Migration stays an explicit operator/local-development gate under the existing + namespace migration contract. No production conversion or native-PDS handoff is + executed by this work. Independent fresh readback remains mandatory for conversion. + +## Bounds and later work + +No remote repacking, snapshot bootstrap/retirement, native history rewriting, +higher-count schema change, idle/adaptive policy or new permissioned blob route. +The 64 MiB per-document recovery bound and explicit unsupported singleton limit +remain documented capabilities. Actual human/device latency tuning and future +record compaction can be considered after this simpler path is verified. + +Research basis: SDK `docs/testing/growth-pareto-report.md` and raw artifacts. diff --git a/docs/verification/2026-10-11-sustainable-inline-sync.md b/docs/verification/2026-10-11-sustainable-inline-sync.md new file mode 100644 index 00000000..87b2e8d6 --- /dev/null +++ b/docs/verification/2026-10-11-sustainable-inline-sync.md @@ -0,0 +1,205 @@ +# Sustainable inline sync: implementation evidence + +Implemented locally on `feature/sustainable-inline-sync` in both repositories. +Implementation is tracked on the feature branches. No merge, release, production +conversion or deployment was performed. + +## Plan and code ownership + +- [Implementation plan](../plans/2026-10-11-sustainable-inline-sync.md). +- SDK worktree: `/home/anish/usr/try-reams/.worktrees/automerge-uniform-batch-sync`. +- Reams worktree: `/home/anish/usr/try-reams/.worktrees/uniform-batch-sync`. +- SDK maintained contract: `docs/sustainable-inline-sync.md`. +- SDK source commit: `c211e515970c405023168df0a5b089898cc3138f`. +- Finite HappyView operator commit: `0e6e9c1788222b8d85ecbedc7a271913cf268f92` + on `fix/automerge-offline-migration`; serving provider remains unmodified v2.14.2. +- Research baseline/frontier: SDK `docs/testing/growth-pareto-report.md`. + +The fresh branches retain the validated uncommitted inline foundation and its +regression/fuzz corpus. They use the existing worktree directories; their names +have not been renamed. Historical experimental files/artifacts remain available, +but current package verification commands use current inline-format cases. + +## Implemented behavior + +1. Prefer **1,047,552 framed bytes**, retain **256 native changes** per batch, + original founding identity and creator-authorized tombstones. Record and HTTP + request limits are separately checked. No change fragmentation or wire profile. +2. Ordinary publication has one configurable **five-minute oldest-pending eligibility threshold**. + Native enqueue times persist in the schema-3 outbox, merging to the earliest + timestamp even when identical hashes commit in reverse order from different + runtimes. Later edits/local flushes do not slide that age. +3. `flushPending()` is the ordinary SDK/worker path. `flush()` remains an explicit + captured publication barrier and bypasses age. Reams adoption/logout retain it. + Existing 15-second polling and browser suspension mean five minutes is not a + remote-visibility SLA. +4. A separate derived inventory checkpoints cold enumeration and operation replay. + Fresh repository revisions drive metadata-only deltas, with persisted consumed + `(rev, idx)` independent of response commits or terminal cursors. Captured + targets do not follow a moving operation tail. +5. Incomplete inventory yields typed pending work and resumes across worker/runtime + recreation. Dirty document tokens retain failed body work. Each recovery result + owns its acknowledgement tokens; clearing occurs only after canonical local + persistence and an exact token comparison. +6. Invalid cursors reset only their affected repository. Unchanged warm recovery + avoids lifetime record/body scans; local loading/checksumming of the bounded + metadata journal is still proportional to its retained inventory. + +## Real provider progress proof + +Clean upstream HappyView **v2.14.2**, commit +`4142df1f697180ad307c4298dc28e01c5aa615bf`, actual local PLC/PDS, ordinary-PDS +OAuth/DPoP. SQLite provider; no provider patches/custom acknowledgements. + +The original 25,600-record preparation starvation now drains through recreated +SDK factories/runtimes and persisted fake-IndexedDB state: + +| Pass | Requests | Record writes | Remaining pending documents | +| --- | ---: | ---: | ---: | +| First discovery segment | 129 | 0 | 1 | +| Second discovery segment | 129 | 0 | 1 | +| Complete discovery + verified publication | 8 | 2 | **0** | + +Edits added between passes survive. Independent fresh provider reconstruction +checks exact native hashes/heads and no missing dependencies. Subsequent publication +uses **five requests**, with one listRepos and no full listRecords scan. A separate +unchanged recovery uses **one listRepos**, zero record-body GETs. + +This persistence test uses Node fake-IndexedDB, not Chromium. The real browser +lanes below supply their separate evidence. Cases use isolated processes/stacks +because SDK OAuth configuration is process-global and the pinned provider can +fail second-space credential issuance under one authority with a signing-key +uniqueness error. No provider fork/workaround was introduced into runtime code. + +## Checks completed + +| Gate | Result | +| --- | --- | +| SDK typecheck/build/default suite | **193 passed**, including configurable-delay follow-up | +| Sustainable regression suite | **37 passed**, including configurable-delay follow-up | +| Native codec generated campaign | **100 cases**, seed 335521 | +| Ordinary-age/flush/reopen generated campaign | **100 cases**, seed 335521 | +| Inventory mutation/delete/reopen generated campaign | **100 cases**, seed 335521 | +| Current record/founder/finite conversion planner suite | **35 passed** | +| Finite namespace conversion + actual CLI/provider/new reader | Passed two authors/two documents/four original changes; root-pointer CID unchanged, dry-run rollback, old-write refusal, idempotent retry and post-cutover divergence refusal | +| Real provider persistent progress + warm recovery | **2 passed**, counters above | +| Retained generated real-service campaign | Seeds **335521, 335522, 335523**, 15 generated operations each; two writers, lost response, transient missing batch body, late edit and restart | +| Retained provider performance fixtures | **4 passed**: small burst, 24 documents, 96 KiB and 900 KiB payloads; warm/reopened body GET count zero | +| Near-ceiling pass-budget/late-edit boundary | Passed exact sealed-job retry and complete acknowledgement | +| SDK real Chromium local-first conformance | Passed restart, concurrent writers, tombstones, failed publication retention, adoption/replay | +| Largest actual native change, real provider + reopen + fresh reader | **884,815 bytes**, two native changes/two records; exact original bytes/heads and lost response recovery | +| Reams typecheck + account/sync/worker tests | **93 passed** | +| OAuth broker/authority/metadata checks | 44 passed on host; the one host-skipped TLS fixture separately passed under Nix (3 metadata checks, no skips) | +| Reams real Chromium background-sync/fresh-reader lane | Passed, details below | + +The generated suites retain fast-check shrinking/replay controls. Their environment +variables are `UNIFORM_FUZZ_SEED/PATH/CASES`, `PUBLICATION_AGE_SEED/PATH/CASES`, and +`INVENTORY_FUZZ_SEED/PATH/CASES`; see each test for its precise names. + +### Actual Reams surface + +Two independent running browser profiles on one real account demonstrated: + +- Same space/root, sidebar discovery, open-editor update and reverse edit through + ordinary background polling, without forcing publication/sync or logging in again. +- Independent Classic imports on both devices, identical IDs/content on both sides. +- A linked large-image history recovered byte-exact with original changes and an + empty publication outbox. +- Independent mounted-peer and fresh-third-browser readback: **39 documents / 265 + captured native history changes**, no missing dependencies, every captured head + present and exact materialized state at the captured frontier. + +The full 113-document archive was not part of this Reams browser run. Its supplied +backup option was absent; do not describe this as whole-archive browser durability. +The explicit readback phase uses a publication barrier; the prior ordinary two- +device editing/import phase remains independent of that barrier. + +### Integration friction resolved + +The first full-app attempt failed **before sync** with `invalid_token_scope`. +The live named `wiki.lichen.permissions` grant contains five collections; Reams +was requiring a sixth, retired `wiki.lichen.memberRequest` collection that it has +no writer for. The minimum capability list now matches the current grant; all +remaining capability checks and broker matching stay strict. No broader OAuth +behavior was changed and temporary diagnostics were removed. + +The fresh-reader harness also started its popup timer before the sign-in button +was prepared. It now waits for enabled state and handles popup/reload rejection, +so test preparation is not misreported as sync failure. + +## Adversarial review + +The plan review caught provider DTO/cursor and worker-lifecycle constraints before +implementation. Code review identified four real bugs, all fixed with regressions: + +- Overlapping recovery could clear another result's newer dirty token. +- A moving operation tail could prevent captured-target completion. +- Newer local age could override the oldest durable age for an identical hash. +- A bad cursor in one repository could erase every repository's progress. + +A follow-up found the reverse-commit-order age case, also fixed in both storage +implementations and verified after both runtimes close/reopen. Final focused +review: **approve, no concrete changes required** in that scope. It also accepted +the narrow Lichen compatibility repair. Later aggregate-page-bound preservation +has its own passing negative regression. + +## Artifact and reproduction + +Reams pins `vendor/automerge-atproto-0.0.0-sustainable.3.tgz`. +SHA-256: `c25e6bf95bc41f18e3c840851a495186c4dfe1ddecbfd8d8e1d467565a1363b1`. + +SDK: + +```sh +npm test +npm run test:sustainable-sync +npm run test:current-records +nix develop /home/anish/usr/automerge-atproto --command env \ + AUTOMERGE_ATPROTO_SERVICE_ROOT=/home/anish/usr/automerge-atproto \ + CARGO_TARGET_DIR=/home/anish/usr/try-reams/.worktrees/happyview-blob-sync/target \ + HAPPYVIEW_SOURCE=/home/anish/usr/try-reams/.worktrees/happyview-polyfill-baseline \ + npm run test:sustainable-sync:provider +``` + +Reams browser lane (from its worktree): + +```sh +nix develop /home/anish/usr/automerge-atproto --command sh -c ' + RUN_BROWSER_TESTS=1 PLAYWRIGHT_CHROMIUM_BIN="$(command -v chromium)" \ + AUTOMERGE_ATPROTO_ROOT=/home/anish/usr/try-reams/.worktrees/automerge-uniform-batch-sync \ + AUTOMERGE_ATPROTO_SERVICE_ROOT=/home/anish/usr/automerge-atproto \ + CARGO_TARGET_DIR=/home/anish/usr/try-reams/.worktrees/happyview-blob-sync/target \ + HAPPYVIEW_SOURCE=/home/anish/usr/try-reams/.worktrees/happyview-polyfill-baseline \ + npm run test:atproto-background-sync' +``` + +## Remaining explicit limits + +Remote compaction/history retirement is deferred by user direction. The 64 MiB +per-document staged-history bound, unsupported singleton bound, and 100,000-record/ +4,096-page inventory bounds remain capabilities, not transient sync failures. +Actual cadence/device tuning, native-PDS migration interoperability and production +namespace-cutover activation retain their separate scopes. Existing finite source +conversion tests are preserved; no production data conversion was executed here. + +## Follow-up: configurable five-minute packing age + +User direction supersedes the original five-second writer preference. The library +now defaults `publicationDelayMs` to 300,000 and accepts validated overrides, +including zero. Configuration reaches both memory/IndexedDB space runtimes. +Reams propagates the same policy to foreground and worker factories, with optional +`VITE_ATPROTO_PUBLICATION_DELAY_MS` build-time override. Local durability, +count/byte saturation, sealed retries and explicit barriers retain their behavior. + +The UI convergence fixture uses an explicit five-second test policy to avoid a +multi-minute wait per interaction. Five-minute automatic scheduling/reopen tests +use fake clocks, and generated age cases span zero through ten-minute settings. +This distinction is intentional; earlier five-second measurement data remain +historical evidence rather than a claim about five-minute live visibility. + +Follow-up verification passed: 193 default SDK tests; 37 sustainable checks, +including 100 generated age cases with configurable delays; 93 Reams checks; +real-provider factory zero-delay propagation; SDK Chromium conformance; and the +full Reams two-profile/fresh-reader lane with its explicit short test policy. +The focused adversary approved validation, propagation and timer semantics without +requesting changes. Runtime configuration requires no document/record migration. diff --git a/package-lock.json b/package-lock.json index 901258fc..9910b466 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "@codemirror/view": "^6.41.1", "@lezer/highlight": "^1.2.3", "@lezer/markdown": "^1.6.3", - "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-progressive.8.tgz", + "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-sustainable.3.tgz", "bs58check": "^3.0.1", "idb": "^8.0.3", "js-yaml": "^4.1.1", @@ -5626,9 +5626,9 @@ "license": "MIT" }, "node_modules/automerge-atproto": { - "version": "0.0.0-progressive.8", - "resolved": "file:vendor/automerge-atproto-0.0.0-progressive.8.tgz", - "integrity": "sha512-QodxfH3SjZpJmbQubeXeddM0U9jNbthZUFXbMnPk1z5NRSd6PCEzTEJJOQhX+7Kbk0talF2ovgPz6tNkvxh7GQ==", + "version": "0.0.0-sustainable.3", + "resolved": "file:vendor/automerge-atproto-0.0.0-sustainable.3.tgz", + "integrity": "sha512-sXV5GiM32kCuQ5W8lvHkUmWqwS99QWEN9FFyHJoh2os6s01b0J8ELFrKPR4NYphBv2aIQ65dggBuvbu3izcRZg==", "dependencies": { "@atcute/car": "6.0.2", "@atcute/cbor": "2.3.6", @@ -5639,6 +5639,7 @@ "@atcute/repo": "1.0.2", "@automerge/automerge": "^3.3.2", "@noble/curves": "1.9.7", + "@noble/hashes": "1.8.0", "@noble/secp256k1": "3.1.0" }, "optionalDependencies": { diff --git a/package.json b/package.json index 204847c8..750ffe41 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "test:atproto-adoption": "node scripts/require-browser-test-env.mjs && node scripts/require-automerge-atproto-root.mjs && vitest run --config vitest.config.invariants.ts --maxWorkers=1 tests/integration/atproto-migration/e2e/note-adoption-*.test.ts", "test:atproto-vault-state": "node scripts/require-browser-test-env.mjs && node scripts/require-automerge-atproto-root.mjs && vitest run --config vitest.config.invariants.ts --maxWorkers=1 tests/integration/atproto-migration/e2e/vault-state-happyview-e2e.test.ts", "test:atproto-discovery-e2e": "node scripts/require-browser-test-env.mjs && node scripts/require-automerge-atproto-root.mjs && REAMS_EDITION=atproto vitest run --config vitest.config.invariants.ts --maxWorkers=1 tests/integration/atproto-migration/e2e/pds-discovery-runtime-e2e.test.ts", + "test:atproto-background-sync": "node scripts/require-browser-test-env.mjs && node scripts/require-automerge-atproto-root.mjs c211e515970c405023168df0a5b089898cc3138f && RUN_CONFIDENTIAL_REAMS_BROWSER=1 RUN_BACKGROUND_SYNC_BROWSER=1 RUN_SYNC_LARGE_CHANGE=1 node --test scripts/spikes/confidential-reams-browser.test.mjs", "test:atproto-logout": "node scripts/require-browser-test-env.mjs && node scripts/require-automerge-atproto-root.mjs && REAMS_EDITION=atproto vitest run --config vitest.config.invariants.ts --maxWorkers=1 tests/integration/atproto-migration/e2e/logout-happyview-e2e.test.ts", "bases:oracle:build": "tsc --noEmit -p tests/bases-oracle/plugin/tsconfig.json && vite build --config tests/bases-oracle/plugin/vite.config.ts", "bases:oracle:prepare": "node scripts/bases-oracle.mjs prepare", @@ -93,7 +94,7 @@ "@codemirror/view": "^6.41.1", "@lezer/highlight": "^1.2.3", "@lezer/markdown": "^1.6.3", - "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-progressive.8.tgz", + "automerge-atproto": "file:vendor/automerge-atproto-0.0.0-sustainable.3.tgz", "bs58check": "^3.0.1", "idb": "^8.0.3", "js-yaml": "^4.1.1", diff --git a/problems.md b/problems.md index 5fa6d1f2..4479ef23 100644 --- a/problems.md +++ b/problems.md @@ -37,6 +37,10 @@ status or implementation plan here. The real mobile archive has a 2.3 MB encoded document with 7.2 million operations and about 1.5 GB native residency; removing copy/replay overhead does not remove that underlying cost. See `docs/verification/2026-10-08-mobile-archive-import.md`. + Incremental remote discovery now avoids lifetime network scans, but the derived + inventory still loads/checksums its whole bounded journal. Use indexed metadata + reads and measure local cost separately from native residency before widening + the 100,000-record / 64 MiB staged-history envelope; remote compaction is deferred. - **Browser dependency provenance / `vite.config.ts`** — the shared ATProto optimizer cache retained an older SDK after local tarball updates, invalidating SDK-specific browser performance comparisons. Import campaigns now use per-run @@ -53,18 +57,27 @@ status or implementation plan here. checkpoints and use the fast production-worker IPC lane during iteration. An in-flight pre-expiry poll and boot's initial idle display also raced session assertions; wait for causal worker results/durable credentials, not status copy. -- **Cross-repository adversary reviews** — the review agent could read Reams but - was denied the companion SDK checkout, requiring pasted implementation handoffs. - Give the reviewer explicit read-only access to the named SDK checkout, or run - its review from that repository, so source and tests can be inspected directly. + The background/fresh-reader journey also repeats about 155 seconds after a late + fixture failure; keep popup preparation and ordinary-policy overrides explicit. - **`src/server/oauth-broker.mjs` refresh recovery** — an unanswered refresh can rotate tokens without a durable browser acknowledgement, leaving its grant reserved and requiring reauthorization. Investigate a recoverable refresh-result contract with the provider while preserving DPoP replay and account fencing. -- **Automerge-atproto recovery/readback** — the successful lifecycle campaign - made 1,219 `getRecord` requests; wanted-document filtering happens after body - fetches and adoption repeats recovery. Filter requested IDs before fetching - bodies, then reuse validated discovery/cursors in the SDK. +- **`src/auth/integration-oauth-scopes.mjs` / live permission-set fixtures** — an + obsolete, unused Lichen member-request capability caused `invalid_token_scope` + before sync. The capability list is corrected, but fixtures resolve live upstream + lexicons. Pin resolved definitions/CIDs for deterministic campaigns and add an + upstream capability-contract check so drift is identified independently of login. +- **Namespace migration / installed Reams clients** — the finite CLI proves source + conversion and raw old-write refusal, not an untouched deployed browser's + save/reload/in-place update with offline pending work. Add that same-profile + release gate before activation; retain native outboxes and make update-required + sync refusal distinct from authentication failure. See + `docs/plans/2026-10-11-happyview-client-cutover.md`. +- **HappyView local service/operator builds** — sharing a Cargo target between + stock provider and operator checkouts previously reused a stale library artifact; + separate targets are now documented. Add a launcher provenance check for selected + source revision/binary and distinguish the finite operator from the served provider. - **Legacy signed-out archive browser lane** — the local HappyView fixture stages an archive but stalls at the prepared-login Sign in button, including before cleanup. diff --git a/scripts/README.md b/scripts/README.md index 67a1ce75..46adee17 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -2,6 +2,44 @@ Standalone scripts that don't fit elsewhere in the build. Each script's own header documents inputs, outputs, exit codes, and failure modes. +## Disposable local ATProto / HappyView polyfill + +The worktree pins the inline-bytes SDK artifact `0.0.0-sustainable.3`, using the +`ink.reams.automerge` lexicon family with no wire profile tag. Library +publication and independent fresh-reader reconstruction have passed against +unmodified HappyView v2.14.2 with an ordinary PDS account. Whole-backup browser +durability is still a separate gate; this launcher is for local development. + +From the Reams worktree, start the services with the SDK and provider +checkouts explicitly selected. Use the SDK's service shell, which includes +`sqlite3` and `pds`: + +```bash +nix develop /home/anish/usr/automerge-atproto --command env \ + AUTOMERGE_ATPROTO_ROOT=/home/anish/usr/try-reams/.worktrees/automerge-uniform-batch-sync \ + CARGO_TARGET_DIR=/home/anish/usr/try-reams/.worktrees/happyview-blob-sync/target \ + HAPPYVIEW_SOURCE=/home/anish/usr/try-reams/.worktrees/happyview-polyfill-baseline \ + npm run dev:atproto-local +``` + +The launcher starts disposable local PLC, PDS, HappyView, and Reams/Vite +services, prints the generated test-account login, and streams service output. +Use only the generated account: its password is intentionally printed for +interactive testing, and its PDS data is removed when the launcher exits. +`KEEP_ATPROTO_DATA=1` preserves that disposable data for debugging. The stack +binds services to loopback; use the printed SSH forwarding command if the +browser runs on another machine. + +Run the largest real document's library durability/transport test from the SDK worktree: + +```bash +nix develop /home/anish/usr/automerge-atproto --command env \ + AUTOMERGE_ATPROTO_SERVICE_ROOT=/home/anish/usr/automerge-atproto \ + CARGO_TARGET_DIR=/home/anish/usr/try-reams/.worktrees/happyview-blob-sync/target \ + HAPPYVIEW_SOURCE=/home/anish/usr/try-reams/.worktrees/happyview-polyfill-baseline \ + npm run test:inline-largest +``` + ## check-mutation-baseline.mjs Deterministic regression check for the audit-flow mutation gate. Reads a `floor-map.json` baseline + a Stryker JSON report and verifies neither floor compliance nor absolute survivor counts have regressed. diff --git a/scripts/require-automerge-atproto-root.mjs b/scripts/require-automerge-atproto-root.mjs index 4f56d33f..43a2848d 100644 --- a/scripts/require-automerge-atproto-root.mjs +++ b/scripts/require-automerge-atproto-root.mjs @@ -4,7 +4,8 @@ import { join } from 'node:path' import { promisify } from 'node:util' const execFileAsync = promisify(execFile) -const EXPECTED_COMMIT = '1419c96763b953607b808ab197b0722c6782125d' +const EXPECTED_COMMIT = process.argv[2] ?? '1419c96763b953607b808ab197b0722c6782125d' +if (!/^[0-9a-f]{40}$/.test(EXPECTED_COMMIT)) throw new Error('Expected a full automerge-atproto commit SHA.') const root = process.env.AUTOMERGE_ATPROTO_ROOT if (!root) { diff --git a/scripts/spikes/background-sidebar-sync.mjs b/scripts/spikes/background-sidebar-sync.mjs new file mode 100644 index 00000000..0e175f5e --- /dev/null +++ b/scripts/spikes/background-sidebar-sync.mjs @@ -0,0 +1,163 @@ +import assert from 'node:assert/strict' +import { createHash } from 'node:crypto' +import { chromium } from 'playwright' +import { from, save, getAllChanges, decodeChange, change, clone } from '@automerge/automerge' + +// Real built application, isolated browser profiles, real OAuth/PDS/HappyView. +// Only assertions poll: all transport is the application's ordinary scheduler. +export async function verifyBackgroundSidebarSync({ page, origin, account, launchOptions, approvePdsPopup, backupPath }) { + const browser = await chromium.launch(launchOptions) + const other = await browser.newPage({ ignoreHTTPSErrors: true }) + const errors = [] + for (const [label, target] of [['first', page], ['second', other]]) { + target.on('pageerror', error => errors.push(`${label}: ${error.message}`)) + target.on('console', message => { if (message.type() === 'error') errors.push(`${label}: ${message.text()}`) }) + } + const identity = target => target.evaluate(() => ({ root: window.__reamsApp.vault.rootUrl, + space: JSON.parse(localStorage.getItem(`reams:atproto-vault:${JSON.parse(localStorage.getItem('reams:atproto:identity')).did}`)).uri })) + const inspect = (target, path) => target.evaluate(async path => { + const app = window.__reamsApp + const file = app?.vault.getFileByPath(path) + return file ? { url: app.vault.getUrlForPath(path), text: await app.vault.read(file) } : null + }, path) + const assertSidebar = async (target, name) => { + await target.getByRole('tab', { name: 'Files', exact: true }).click() + await target.getByRole('treeitem', { name: new RegExp(name.replaceAll('.', '\\.')) }).waitFor({ state: 'visible', timeout: 60_000 }) + } + const waitForText = async (target, path, text) => { + const deadline = Date.now() + 60_000 + while (Date.now() < deadline) { + if ((await inspect(target, path).catch(() => null))?.text === text) return + await new Promise(resolve => setTimeout(resolve, 250)) + } + throw new Error(`Background sync did not deliver ${path} with expected contents`) + } + const archiveRoot = from({ '@patchwork': { type: 'folder' }, docs: [] }) + const importBackup = async (target, name, oversized = false) => { + let imageEvidence + const docs = { + root: change(clone(archiveRoot), draft => { draft.docs.push({ name: `${name}.md`, type: 'file', url: `automerge:${name}` }) }), + [name]: from({ '@patchwork': { type: 'file' }, name: `${name}.md`, contentType: 'public.markdown', content: `Imported on ${name}` }), + } + if (oversized) { + // An incompressible binary change reproduces the real archive's images. + // IndexedDB loads documents in key order. Put this blocker before the + // mounted root, reproducing production's unpublished final root links. + const nativeId = id => { + let bits = 0, value = 0, result = '' + for (const byte of createHash('sha256').update(`reams-legacy-import\0v1\0automerge:${id}`).digest()) { + value = (value << 8) | byte; bits += 8 + while (bits >= 5) { bits -= 5; result += 'abcdefghijklmnopqrstuvwxyz234567'[(value >>> bits) & 31] } + } + return result.slice(0, 26) + } + const mountedRoot = (await identity(target)).root.replace(/^automerge:/, '') + let imageId = 'image', candidate = 0 + while (nativeId(imageId) >= mountedRoot || nativeId(imageId) >= nativeId(name)) imageId = `image-${++candidate}` + const initial = from({ '@patchwork': { type: 'file' }, name: 'large.png', contentType: 'public.png', content: new Uint8Array() }) + const content = new Uint8Array(96 * 1024) + for (let offset = 0; offset < content.length; offset += 32) { + content.set(createHash('sha256').update(`reams-large-change-regression-v1:${offset}`).digest(), offset) + } + docs[imageId] = change(initial, draft => { draft.content = content }) + assert(getAllChanges(docs[imageId]).some(bytes => bytes.length > 65536)) + docs.root = change(docs.root, draft => { draft.docs.push({ name: 'large.png', type: 'file', url: `automerge:${imageId}` }) }) + imageEvidence = { + url: `automerge:${nativeId(imageId)}`, + digest: createHash('sha256').update(docs[imageId].content).digest('hex'), + changeHashes: getAllChanges(docs[imageId]).map(bytes => decodeChange(bytes).hash), + } + console.log('Oversized publication fixture:', { imageId: nativeId(imageId), mountedRoot }) + } + const records = Object.entries(docs).map(([id, doc]) => { + const bytes = save(doc) + return { key: [id, 'snapshot', decodeChange(getAllChanges(doc)[0]).hash], binary: Buffer.from(bytes).toString('base64'), byteLength: bytes.length } + }) + const buffer = Buffer.from(JSON.stringify({ format: 'reams-legacy-automerge-indexeddb', version: 1, + createdAt: '2026-10-08T00:00:00Z', records, localStorage: { 'reams:vault-root-url': 'automerge:root' } })) + await target.goto(`${origin}/import`) + await target.getByLabel('Classic backup JSON').setInputFiles({ name: `${name}.json`, mimeType: 'application/json', buffer }) + await target.getByRole('button', { name: 'Start import' }).click() + await target.getByText(`Import complete · ${oversized ? 3 : 2} documents, 1 folders`).waitFor({ timeout: 60_000 }) + await target.getByRole('button', { name: 'Open editor' }).click() + await target.locator('.cm-editor').waitFor({ timeout: 60_000 }) + await assertSidebar(target, `${name}.md`) + return imageEvidence + } + try { + await page.getByRole('button', { name: 'Close account card' }).click() + await other.goto(origin) + await other.getByRole('button', { name: 'Open ATProto account' }).click() + await other.getByRole('combobox', { name: 'Handle' }).fill(account.did) + await other.getByRole('button', { name: 'Sign in', exact: true }).waitFor() + const popupPromise = other.waitForEvent('popup') + await other.getByRole('button', { name: 'Sign in', exact: true }).click() + const reloaded = other.waitForEvent('load', { timeout: 60_000 }) + await approvePdsPopup(await popupPromise, account, /Lichen Wiki/i) + await reloaded + await other.locator('.cm-editor').waitFor({ timeout: 60_000 }) + assert.deepEqual(await identity(other), await identity(page)) + + await page.locator('[title="New file"]').first().click() + const dialog = page.getByRole('dialog', { name: 'New' }) + await dialog.getByPlaceholder('my-note or folder/my-note').fill('Live sync.md') + await dialog.getByRole('button', { name: 'Create', exact: true }).click() + await assertSidebar(other, 'Live sync.md') + await other.getByRole('treeitem', { name: /Live sync\.md/ }).click() + await other.locator('.cm-content').waitFor() + await page.evaluate(async () => { const app = window.__reamsApp; await app.vault.modify(app.vault.getFileByPath('Live sync.md'), 'Edited on the first running device') }) + await waitForText(other, 'Live sync.md', 'Edited on the first running device') + await other.waitForFunction(() => [...document.querySelectorAll('.cm-content')].some(editor => editor.textContent.includes('Edited on the first running device')), undefined, { timeout: 30_000 }) + await other.evaluate(async () => { const app = window.__reamsApp; await app.vault.modify(app.vault.getFileByPath('Live sync.md'), 'Edited on the second running device') }) + await waitForText(page, 'Live sync.md', 'Edited on the second running device') + console.log('PASS: same space/root, new sidebar item, open-editor update and reverse edit through background polling.') + + await importBackup(page, 'desktop') + await assertSidebar(other, 'desktop.md') + await waitForText(other, 'desktop.md', 'Imported on desktop') + await importBackup(other, 'mobile') + await assertSidebar(page, 'mobile.md') + await waitForText(page, 'mobile.md', 'Imported on mobile') + for (const path of ['desktop.md', 'mobile.md', 'Live sync.md']) assert.deepEqual(await inspect(page, path), await inspect(other, path)) + console.log('PASS: separate imports on two devices appear in both live sidebars with identical document IDs and contents, without explicit publish/sync/relogin.') + + if (process.env.RUN_SYNC_LARGE_CHANGE === '1') { + const image = await importBackup(page, 'oversized', true) + await assertSidebar(other, 'oversized.md') + await waitForText(other, 'oversized.md', 'Imported on oversized') + await assertSidebar(other, 'large.png') + const recovered = await other.evaluate(async url => { + const app = window.__reamsApp + const bytes = await app.vault.readBinary(app.vault.getFileByPath('large.png')) + const handle = await app.reamsDocumentManager.repo.find(url) + return { bytes: [...new Uint8Array(bytes)], hashes: handle.history().map(entry => entry.change.hash) } + }, image.url) + assert.equal(createHash('sha256').update(Buffer.from(recovered.bytes)).digest('hex'), image.digest) + for (const hash of image.changeHashes) assert(recovered.hashes.includes(hash), `Original change ${hash} must survive publication`) + const deadline = Date.now() + 60_000 + while (Date.now() < deadline && await page.evaluate(() => window.__reamsApp.reamsDocumentManager.repo.runtime.getStatus().pendingDocuments) !== 0) { + await new Promise(resolve => setTimeout(resolve, 250)) + } + assert.equal(await page.evaluate(() => window.__reamsApp.reamsDocumentManager.repo.runtime.getStatus().pendingDocuments), 0) + console.log('PASS: linked oversized image recovered byte-for-byte with original history and no pending publications.') + const { verifyIndependentBackgroundReadback } = await import('./background-sync-readback.mjs') + await verifyIndependentBackgroundReadback({ page, other, origin, account, launchOptions, approvePdsPopup, backupPath }) + } + } catch (error) { + for (const [label, target] of [['first', page], ['second', other]]) { + console.error(label, await target.evaluate(() => ({ + pending: window.__reamsApp?.reamsDocumentManager.repo.runtime.getStatus().pendingDocuments, + files: window.__reamsApp?.vault.getFiles().map(file => file.path), + activeFile: window.__reamsApp?.workspace.getActiveFile()?.path, + editorTexts: [...document.querySelectorAll('.cm-content')].map(editor => editor.textContent), + error: document.querySelector('.atproto-account-error')?.textContent, + alerts: [...document.querySelectorAll('[role=alert]')].map(alert => alert.textContent), + })).catch(() => null)) + const accountButton = target.getByRole('button', { name: 'Open ATProto account' }) + if (await accountButton.isVisible().catch(() => false)) await accountButton.click() + console.error(label, await target.locator('.atproto-account-card').innerText().catch(() => '(no account card)')) + } + console.error(errors) + throw error + } finally { await browser.close() } +} diff --git a/scripts/spikes/background-sync-readback.mjs b/scripts/spikes/background-sync-readback.mjs new file mode 100644 index 00000000..e8e361dc --- /dev/null +++ b/scripts/spikes/background-sync-readback.mjs @@ -0,0 +1,97 @@ +import assert from 'node:assert/strict' +import * as A from '@automerge/automerge' +import { chromium } from 'playwright' + +/** Independent browser/cache evidence; exports contain document bytes, never OAuth state. */ +async function snapshots(page, urls) { + return page.evaluate(async selected => { + const repo = window.__reamsApp.reamsDocumentManager.repo + const output = [] + for (const url of selected ?? repo.list()) { + if (await repo.isDeleted(url)) continue + await repo.load(url) + const bytes = await repo.export(url) + let binary = '' + for (let offset = 0; offset < bytes.length; offset += 8192) binary += String.fromCharCode(...bytes.subarray(offset, offset + 8192)) + output.push({ url, bytes: btoa(binary) }) + } + return output + }, urls ?? null) +} + +export async function verifyIndependentBackgroundReadback({ page, other, origin, account, launchOptions, approvePdsPopup, backupPath }) { + const started = performance.now() + const phase = label => console.log(JSON.stringify({ syncReadbackPhase: label, elapsedMs: Math.round(performance.now() - started) })) + const requests = { writes: 0, recordGets: 0, lists: 0 } + page.context().on('request', request => { + const url = request.url() + if (url.includes('/com.atproto.space.applyWrites')) requests.writes++ + if (url.includes('/com.atproto.space.getRecord')) requests.recordGets++ + if (url.includes('/com.atproto.space.list')) requests.lists++ + }) + if (backupPath) { + phase('opening-real-import') + await page.goto(`${origin}/import`, { waitUntil: 'domcontentloaded', timeout: 30_000 }) + phase('selecting-real-archive') + await page.getByLabel('Classic backup JSON').setInputFiles(backupPath) + await page.getByRole('button', { name: 'Start import' }).click() + await page.getByText(/Import complete · \d+ documents, \d+ folders/).waitFor({ timeout: 180_000 }) + phase('real-import-locally-complete') + await page.getByRole('button', { name: 'Open editor' }).click() + await page.locator('.cm-editor').waitFor({ timeout: 120_000 }) + } + phase('capturing-local-frontiers') + await page.evaluate(async () => { await window.__reamsApp.reamsDocumentManager.repo.flushLocal() }) + const expected = await snapshots(page) + phase(`captured-${expected.length}-documents`) + let pending + for (let pass = 0; pass < 30; pass++) { + phase(`publication-pass-${pass}`) + // This phase proves a captured publication barrier, not ordinary packing age. + const result = await page.evaluate(async () => { try { const repo = window.__reamsApp.reamsDocumentManager.repo; await repo.syncNow(); await repo.flush(); return { ok: true } } catch (error) { if (!['PUBLICATION_PENDING', 'DOCUMENT_DEFERRED'].includes(error.code)) throw error; return { ok: false, code: error.code, message: error.message } } }) + console.log(JSON.stringify({ publicationResult: result, requests })) + pending = await page.evaluate(() => window.__reamsApp.reamsDocumentManager.repo.runtime.getStatus().pendingDocuments) + if (pending === 0) break + console.log(JSON.stringify({ publicationPass: pass, pendingDocuments: pending })) + } + assert.equal(pending, 0, 'available archive must become remotely durable, not merely locally imported') + await other.evaluate(async () => { await window.__reamsApp.reamsDocumentManager.repo.syncNow() }) + phase('mounted-peer-caught-up') + const fresh = await chromium.launch(launchOptions) + try { + const target = await fresh.newPage({ ignoreHTTPSErrors: true }) + await target.goto(origin) + phase('fresh-browser-signing-in') + await target.getByRole('button', { name: 'Open ATProto account' }).click() + await target.getByRole('combobox', { name: 'Handle' }).fill(account.did) + await target.waitForFunction(() => [...document.querySelectorAll('button')].some(button => button.textContent?.trim() === 'Sign in' && !button.disabled), undefined, { timeout: 60_000 }) + const popup = target.waitForEvent('popup', { timeout: 60_000 }) + void popup.catch(() => {}) + await target.getByRole('button', { name: 'Sign in', exact: true }).click() + const reload = target.waitForEvent('load', { timeout: 120_000 }) + void reload.catch(() => {}) + await approvePdsPopup(await popup.catch(async cause => { + throw new Error(`Fresh-reader popup failed: ${await target.locator('.atproto-account-card').innerText().catch(() => '(card absent)')}; ${cause.message}`) + }), account, /Lichen Wiki/i) + await reload + await target.locator('.cm-editor').waitFor({ timeout: 120_000 }) + await target.evaluate(async () => { await window.__reamsApp.reamsDocumentManager.repo.syncNow() }) + phase('fresh-browser-caught-up') + for (const [label, browser] of [['already-mounted', other], ['fresh-browser', target]]) { + const recovered = new Map((await snapshots(browser, expected.map(entry => entry.url))).map(entry => [entry.url, entry.bytes])) + let hashes = 0 + for (const original of expected) { + const source = A.load(new Uint8Array(Buffer.from(original.bytes, 'base64'))) + const remote = A.load(new Uint8Array(Buffer.from(recovered.get(original.url), 'base64'))) + try { + assert.equal(A.getMissingDeps(remote, []).length, 0) + const heads = A.getHeads(source) + assert(heads.every(head => A.getBackend(remote).getChangeByHash(head)), `${label} lost captured history of ${original.url}`) + assert.deepEqual(A.view(remote, heads), source) + hashes += A.getChangesMetaSince(source, []).length + } finally { A.free(source); A.free(remote) } + } + console.log(JSON.stringify({ readback: label, documents: expected.length, capturedHistoryChanges: hashes, actualArchive: !!backupPath, elapsedMs: Math.round(performance.now() - started) })) + } + } finally { await fresh.close() } +} diff --git a/scripts/spikes/confidential-reams-browser.test.mjs b/scripts/spikes/confidential-reams-browser.test.mjs index 55864cac..61539fe8 100644 --- a/scripts/spikes/confidential-reams-browser.test.mjs +++ b/scripts/spikes/confidential-reams-browser.test.mjs @@ -25,14 +25,15 @@ const repeatLogin = process.env.RUN_REPEAT_LOGIN_BROWSER === '1' const deletionOnly = process.env.RUN_DELETION_BROWSER === '1' const importOnly = process.env.RUN_BACKUP_IMPORT_BROWSER === '1' const sessionOnly = process.env.RUN_SESSION_RECOVERY_BROWSER === '1' -const loginOnly = process.env.RUN_LOGIN_UX_BROWSER === '1' || startupBenchmark || repeatLogin || deletionOnly || importOnly || sessionOnly +const backgroundSyncOnly = process.env.RUN_BACKGROUND_SYNC_BROWSER === '1' +const loginOnly = process.env.RUN_LOGIN_UX_BROWSER === '1' || startupBenchmark || repeatLogin || deletionOnly || importOnly || sessionOnly || backgroundSyncOnly const baseScope = 'atproto repo:ink.reams.vaultAuthority blob:application/vnd.sealight.automerge.amch' const lichenScope = LICHEN_OAUTH_SCOPE const userinputScope = USERINPUT_OAUTH_SCOPE const loginScope = [...new Set(`${baseScope} ${lichenScope} ${userinputScope}`.split(' '))].join(' ') -test(sessionOnly ? 'real PDS sessions survive transient refresh failure and reload without interactive login' : importOnly ? 'signed-in Classic backups merge through the UI and recover from the real PDS' : deletionOnly ? 'real PDS deletion survives pending adoption, publication and independent recovery' : repeatLogin ? 'real PDS repeat login preserves existing vault and converges starter files' : loginOnly ? 'named consent, in-card preparation, profile photo and shared welcome ID survive fresh-profile login' : 'one Reams login writes Lichen and Userinput records to the real PDS and survives restart', { - skip: !run || !root || (!lichenSource && !loginOnly && !progressiveBenchmark), timeout: startupBenchmark ? 600_000 : progressiveBenchmark ? 420_000 : 240_000, +test(backgroundSyncOnly ? 'two running Reams sidebars converge through ordinary background sync over a real PDS' : sessionOnly ? 'real PDS sessions survive transient refresh failure and reload without interactive login' : importOnly ? 'signed-in Classic backups merge through the UI and recover from the real PDS' : deletionOnly ? 'real PDS deletion survives pending adoption, publication and independent recovery' : repeatLogin ? 'real PDS repeat login preserves existing vault and converges starter files' : loginOnly ? 'named consent, in-card preparation, profile photo and shared welcome ID survive fresh-profile login' : 'one Reams login writes Lichen and Userinput records to the real PDS and survives restart', { + skip: !run || !root || (!lichenSource && !loginOnly && !progressiveBenchmark), timeout: startupBenchmark || backgroundSyncOnly ? 900_000 : progressiveBenchmark ? 420_000 : 240_000, }, async () => { const { startHappyViewStack, createPdsAccount, seedHappyViewAdminApiKey, seedHappyViewOAuthClient } = await import(pathToFileURL(join(root, 'test/happyview/happyview-harness.mjs')).href) @@ -104,6 +105,8 @@ test(sessionOnly ? 'real PDS sessions survive transient refresh failure and relo const env = { ...process.env, REAMS_EDITION: 'atproto', + // Short explicit policy for bounded UI convergence tests; app default is 5 min. + ...(backgroundSyncOnly ? { VITE_ATPROTO_PUBLICATION_DELAY_MS: process.env.VITE_ATPROTO_PUBLICATION_DELAY_MS ?? '5000' } : {}), VITE_ATPROTO_CONFIDENTIAL_OAUTH: '1', VITE_ATPROTO_OAUTH_CALLBACK_URL: redirectUri, VITE_ATPROTO_OAUTH_SCOPE: loginScope, @@ -154,10 +157,16 @@ test(sessionOnly ? 'real PDS sessions survive transient refresh failure and relo context = await chromium.launchPersistentContext(profileDir, { ...launchOptions, ...(progressiveBenchmark ? { serviceWorkers: 'block' } : {}) }) const page = await context.newPage() const loginTrace = [] - if (progressiveBenchmark || repeatLogin) { + if (progressiveBenchmark || repeatLogin || backgroundSyncOnly) { page.on('request', request => { const url = new URL(request.url()); if (url.pathname.startsWith('/xrpc/') || url.pathname.startsWith('/oauth/')) loginTrace.push(`request ${url.pathname}`) }) page.on('response', response => { const url = new URL(response.url()); if (url.pathname.startsWith('/xrpc/') || url.pathname.startsWith('/oauth/')) loginTrace.push(`response ${response.status()} ${url.pathname}`) }) page.on('pageerror', error => loginTrace.push(`pageerror ${error.message}`)) + page.on('response', response => { + const path = new URL(response.url()).pathname + if (path.startsWith('/oauth/broker/') && response.status() >= 400) { + void response.json().then(body => loginTrace.push(`broker ${response.status()} ${path}: ${String(body.error ?? 'unknown')}`)).catch(() => {}) + } + }) } if (loginOnly && !startupBenchmark) { let navigations = 0 @@ -197,7 +206,8 @@ test(sessionOnly ? 'real PDS sessions survive transient refresh failure and relo await input.fill(account.did) await page.getByRole('button', { name: 'Sign in', exact: true }).waitFor({ state: 'visible' }) await waitForCondition(() => page.getByRole('button', { name: 'Sign in', exact: true }).isEnabled(), 30_000) - const popupPromise = page.waitForEvent('popup', { timeout: 12_000 }) + const popupPromise = page.waitForEvent('popup', { timeout: 30_000 }) + void popupPromise.catch(() => {}) await page.getByRole('button', { name: 'Sign in', exact: true }).click() const popup = await popupPromise.catch(async error => { const card = await page.locator('.atproto-account-card').innerText().catch(() => '(account card not present)') @@ -223,6 +233,12 @@ test(sessionOnly ? 'real PDS sessions survive transient refresh failure and relo }) await waitForCondition(() => page.evaluate(did => window.__reamsApp?.storageScope === `atproto:${did}`, account.did), 8_000) assert.equal((await page.locator('.atproto-account-card').innerText()).includes(account.did), false) + if (backgroundSyncOnly) { + releasePublication() + const { verifyBackgroundSidebarSync } = await import('./background-sidebar-sync.mjs') + await verifyBackgroundSidebarSync({ page, origin, account, launchOptions, approvePdsPopup, backupPath: process.env.REAMS_SYNC_BACKUP }) + return + } if (progressiveBenchmark) { const { runProgressiveAppBenchmark } = await import('./progressive-app-benchmark.mjs') await runProgressiveAppBenchmark({ page, context, stack, dir, env, launchOptions, switchBuild: async dist => { diff --git a/scripts/start-local-happyview.mjs b/scripts/start-local-happyview.mjs index b6ddf9c3..32147a40 100644 --- a/scripts/start-local-happyview.mjs +++ b/scripts/start-local-happyview.mjs @@ -5,15 +5,18 @@ import { pathToFileURL } from 'node:url' const root = process.env.AUTOMERGE_ATPROTO_ROOT if (!root) throw new Error('Set AUTOMERGE_ATPROTO_ROOT to the automerge-atproto checkout.') +const happyviewSource = process.env.HAPPYVIEW_SOURCE +if (!happyviewSource) throw new Error('Set HAPPYVIEW_SOURCE to the tested upstream HappyView v2.14.2 checkout.') const harness = await import(pathToFileURL(join(root, 'test/happyview/happyview-harness.mjs')).href) const port = Number(process.env.REAMS_DEV_PORT ?? 7003) const plcPort = Number(process.env.ATPROTO_PLC_PORT ?? 2582) const pdsPort = Number(process.env.ATPROTO_PDS_PORT ?? 2583) const happyviewPort = Number(process.env.HAPPYVIEW_PORT ?? 3001) -const scope = 'atproto repo:* blob:application/vnd.sealight.automerge.amch' +const scope = 'atproto repo:* blob:*' const stack = await harness.startHappyViewStack({ - workspace: root, + workspace: process.env.AUTOMERGE_ATPROTO_SERVICE_ROOT ?? '/home/anish/usr/automerge-atproto', + happyviewSource, plcPort, pdsPort, happyviewPort, @@ -33,7 +36,10 @@ try { const callbackUrl = `http://127.0.0.1:${port}/oauth-callback.html` const client = await harness.seedHappyViewOAuthClient(stack, account.did, { redirectUri: callbackUrl, scope }) - console.log(`\nLocal ATProto account\n App: http://127.0.0.1:${port}\n Handle: ${account.handle}\n Password: ${account.password}\n DID: ${account.did}\n\nForward all browser-visible loopback endpoints:\n ssh -N -L ${port}:127.0.0.1:${port} -L ${happyviewPort}:127.0.0.1:${happyviewPort} -L ${plcPort}:127.0.0.1:${plcPort} -L ${pdsPort}:127.0.0.1:${pdsPort} @\n`) + const dataRetention = process.env.KEEP_ATPROTO_DATA === '1' + ? `KEEP_ATPROTO_DATA=1 is set: the local PDS data remains on disk at ${stack.dataDir} after exit.` + : 'The account and its PDS data are deleted when this process exits.' + console.log(`\nDISPOSABLE LOCAL TEST ACCOUNT — credentials below are printed for interactive testing only. ${dataRetention} Never use a real account or reuse this password.\n\nLocal ATProto account\n App: http://127.0.0.1:${port}\n Handle: ${account.handle}\n Password: ${account.password}\n DID: ${account.did}\n\nForward all browser-visible loopback endpoints:\n ssh -N -L ${port}:127.0.0.1:${port} -L ${happyviewPort}:127.0.0.1:${happyviewPort} -L ${plcPort}:127.0.0.1:${plcPort} -L ${pdsPort}:127.0.0.1:${pdsPort} @\n`) const vite = spawn(process.execPath, [join(process.cwd(), 'node_modules/vite/bin/vite.js'), '--host', '127.0.0.1'], { env: { diff --git a/src/atproto/AtprotoAccountCard.tsx b/src/atproto/AtprotoAccountCard.tsx index b09cc259..8bb3c58e 100644 --- a/src/atproto/AtprotoAccountCard.tsx +++ b/src/atproto/AtprotoAccountCard.tsx @@ -330,11 +330,11 @@ export function AtprotoAccountCard({ isOpen, onClose }: AtprotoAccountCardProps) ) : !needsLogin ? (
-
{syncState === 'reauth-required' ? 'Sync needs authorization. Your notes are saved on this device.' : syncState === 'offline' ? 'Offline. Your notes are saved on this device.' : 'Your notes are saved locally and sync in the background'}
+
{syncState === 'reauth-required' ? 'Sync needs authorization. Your notes are saved on this device.' : syncState === 'offline' ? 'Offline. Your notes are saved on this device.' : syncState === 'error' ? 'Some changes could not be published. Your notes are saved on this device.' : 'Your notes are saved locally and sync in the background'}
{accountError && {accountError}} {transferPending &&
{accountError ? 'Pre-login notes are waiting to sync.' : 'Saving your pre-login notes. You can keep using your vault.'}
} {syncState === 'reauth-required' && Reconnect account} - {syncState !== 'reauth-required' && (syncState === 'offline' || accountError) &&
+ {syncState !== 'reauth-required' && (syncState === 'offline' || syncState === 'error' || accountError) &&
{ void handleRetryConnection() }}>{transferPending ? 'Retry note transfer' : 'Retry connection'}
} {vaultCandidates && vaultCandidates.length > 0 && ( diff --git a/src/atproto/__tests__/account-sync-worker.test.ts b/src/atproto/__tests__/account-sync-worker.test.ts new file mode 100644 index 00000000..01b1fe36 --- /dev/null +++ b/src/atproto/__tests__/account-sync-worker.test.ts @@ -0,0 +1,52 @@ +import { expect, it, vi } from 'vitest' +import { syncAndFlush } from '../account-sync-protocol' + +it('does not hide deferred recovery behind an empty failure array', async () => { + await expect(syncAndFlush({ sync: async () => ({ documentsDeferred: 1, documentFailures: [] }), flushPending: async () => {} })) + .rejects.toMatchObject({ code: 'DOCUMENT_DEFERRED' }) +}) + +it('preserves protocol refusal and secondary flush diagnostics', async () => { + const refusal = Object.assign(new Error('Update required.'), { code: 'CLIENT_UPDATE_REQUIRED' }) + const secondary = new Error('Flush failed.') + await expect(syncAndFlush({ sync: async () => { throw refusal }, flushPending: async () => { throw secondary } })) + .rejects.toMatchObject({ code: refusal.code, cause: refusal, errors: [refusal, secondary] }) +}) + +it('flushes local durability before surfacing document-scoped deferred publication', async () => { + const sync = vi.fn(async () => ({ documentsDeferred: 1 })) + const flush = vi.fn(async () => ({})) + await expect(syncAndFlush({ sync, flushPending: flush })).rejects.toMatchObject({ code: 'DOCUMENT_DEFERRED' }) + expect(sync).toHaveBeenCalledOnce() + expect(flush).toHaveBeenCalledOnce() +}) + +it('flushes local durability before propagating typed publication and authorization errors', async () => { + const flush = vi.fn(async () => ({})) + const blocked = Object.assign(new Error('One document is blocked.'), { code: 'PUBLICATION_FAILED' }) + await expect(syncAndFlush({ sync: vi.fn().mockRejectedValue(blocked), flushPending: flush })).rejects.toBe(blocked) + expect(flush).toHaveBeenCalledOnce() + + flush.mockClear() + const auth = Object.assign(new Error('Reauthorization required.'), { code: 'AUTHENTICATION_REQUIRED' }) + await expect(syncAndFlush({ sync: vi.fn().mockRejectedValue(auth), flushPending: flush })).rejects.toBe(auth) + expect(flush).toHaveBeenCalledOnce() +}) + +it('flushes local durability before propagating a typed current-protocol refusal', async () => { + const refusal = Object.assign(new Error('Update required.'), { code: 'CLIENT_UPDATE_REQUIRED' }) + const localWorkspace = { body: 'locally saved note' } + const credentials = { session: 'remembered-session' } + const flush = vi.fn(async () => ({})) + await expect(syncAndFlush({ sync: vi.fn().mockRejectedValue(refusal), flushPending: flush })).rejects.toBe(refusal) + expect(flush).toHaveBeenCalledOnce() + expect(localWorkspace.body).toBe('locally saved note') + expect(credentials.session).toBe('remembered-session') +}) + +it('ordinary worker sync uses eligible publication rather than the explicit barrier', async () => { + const flush = vi.fn(async () => ({})), flushPending = vi.fn(async () => ({ pendingChanges: 1 })) + await syncAndFlush({ sync: async () => ({}), flushPending, ...{ flush } }) + expect(flushPending).toHaveBeenCalledOnce() + expect(flush).not.toHaveBeenCalled() +}) diff --git a/src/atproto/__tests__/account-sync.test.ts b/src/atproto/__tests__/account-sync.test.ts index 0c01b9f8..20946849 100644 --- a/src/atproto/__tests__/account-sync.test.ts +++ b/src/atproto/__tests__/account-sync.test.ts @@ -47,6 +47,8 @@ it('takes the latest credential snapshot after another tab finishes a sync opera } const snapshots = workers.flatMap(worker => worker.requests).map(request => request.storage[key]) expect(snapshots).toEqual(['old-session', 'refreshed-session']) + expect(workers.flatMap(worker => worker.requests).every(request => !('publicationProfile' in request.config))).toBe(true) + expect(workers.flatMap(worker => worker.requests).every(request => request.config.publicationDelayMs === 300_000)).toBe(true) }) it.each(['session-write', 'marker-write', 'inspection'])('settles worker requests and releases the credential lock after %s failure', async failure => { diff --git a/src/atproto/__tests__/account.test.ts b/src/atproto/__tests__/account.test.ts index 0347a9e6..300dbf54 100644 --- a/src/atproto/__tests__/account.test.ts +++ b/src/atproto/__tests__/account.test.ts @@ -109,6 +109,31 @@ describe('ATProto account', () => { }) }) + it('ignores obsolete publication profile deployment configuration', () => { + expect(oauthConfig({ VITE_ATPROTO_PUBLICATION_PROFILE: 'v2-inline' })).toEqual(oauthConfig({})) + expect(oauthConfig({ VITE_ATPROTO_PUBLICATION_PROFILE: 'v3-chunks' })).toEqual(oauthConfig({})) + }) + + it('defaults publication packing age to five minutes and accepts an explicit override', () => { + expect(oauthConfig({}).publicationDelayMs).toBe(300_000) + expect(oauthConfig({ VITE_ATPROTO_PUBLICATION_DELAY_MS: '5000' }).publicationDelayMs).toBe(5_000) + expect(oauthConfig({ VITE_ATPROTO_PUBLICATION_DELAY_MS: '0' }).publicationDelayMs).toBe(0) + for (const value of ['', '-1', '1.5', 'Infinity', '2147483648']) { + expect(() => oauthConfig({ VITE_ATPROTO_PUBLICATION_DELAY_MS: value })).toThrow('VITE_ATPROTO_PUBLICATION_DELAY_MS') + } + }) + + it.each(['PUBLICATION_FAILED', 'PAYLOAD_UNSUPPORTED', 'INVALID_REMOTE_RECORD', 'REMOTE_CONFLICT', 'DOCUMENT_DEFERRED'])( + 'classifies %s as a saved-local publication error while preserving global authorization errors', code => { + const account = { did: 'did:plc:alice' } + reportLocalAccount(account, VAULT_A) + reportAccountSyncError(account, VAULT_A, Object.assign(new Error('Some changes could not be published.'), { code })) + expect(getAccountSnapshot()).toMatchObject({ syncState: 'error', phase: 'signed-in', error: 'Some changes could not be published.' }) + reportAccountSyncError(account, VAULT_A, Object.assign(new Error('Reauthorization needed.'), { code: 'AUTHENTICATION_REQUIRED' })) + expect(getAccountSnapshot().syncState).toBe('reauth-required') + }, + ) + it('imports into the mounted account root without authentication, rediscovery or workspace teardown', async () => { rememberAccountIdentity({ did: 'did:plc:alice' }) repoMocks.repo.runtime.space = { writerDid: 'did:plc:alice' } diff --git a/src/atproto/account-sync-protocol.ts b/src/atproto/account-sync-protocol.ts index fca4531e..1ad8c8ed 100644 --- a/src/atproto/account-sync-protocol.ts +++ b/src/atproto/account-sync-protocol.ts @@ -3,6 +3,32 @@ import type { oauthConfig } from './account' export type SyncConfig = ReturnType & { storageName: string; plcDirectory?: string } export type SyncOperation = 'sync' | 'publish' | 'load' | 'transfer' + +export async function syncAndFlush(space: { + sync(): Promise<{ documentsDeferred?: number; documentFailures?: readonly unknown[] }> + flushPending(): Promise +}): Promise { + let syncError: unknown + try { + const result = await space.sync() + const deferred = Math.max(result.documentFailures?.length ?? 0, result.documentsDeferred ?? 0) + if (deferred > 0) syncError = Object.assign(new Error(`${deferred} document(s) could not finish remote recovery. Your local workspace remains available.`), { code: 'DOCUMENT_DEFERRED' }) + } catch (cause) { + syncError = cause + } + try { + await space.flushPending() + } catch (flushError) { + if (!syncError) throw flushError + throw Object.assign(new Error(syncError instanceof Error ? syncError.message : String(syncError)), { + errors: [syncError, flushError], + code: typeof syncError === 'object' && syncError !== null && 'code' in syncError ? syncError.code : undefined, + cause: syncError, + }) + } + if (syncError) throw syncError +} + export interface SyncRequest { id: number operation: SyncOperation diff --git a/src/atproto/account-sync-worker.ts b/src/atproto/account-sync-worker.ts index fbda17f0..8d0694f1 100644 --- a/src/atproto/account-sync-worker.ts +++ b/src/atproto/account-sync-worker.ts @@ -1,6 +1,6 @@ import { createAutomergeAtproto, type AutomergeAtprotoOptions } from 'automerge-atproto' import { createIdentityResolver } from './identity-resolver' -import type { BrokerReply, SyncMessage, SyncRequest } from './account-sync-protocol' +import { syncAndFlush, type BrokerReply, type SyncMessage, type SyncRequest } from './account-sync-protocol' import { Repo } from './automerge-repo-compat' import { transferAndRetireNotes } from './note-transfer-retirement' @@ -35,7 +35,7 @@ async function run(request: SyncRequest): Promise { if (configurationSignature && configurationSignature !== signature) throw new Error('The sync worker configuration changed; reopen sync with the current configuration.') if (!configuredOptions) { configurationSignature = signature - configuredOptions = { storageName: config.storageName, scope: config.scope, provider: config.provider, oauth: { + const options = { storageName: config.storageName, scope: config.scope, provider: config.provider, publicationDelayMs: config.publicationDelayMs, oauth: { metadata: { client_id: config.clientId, redirect_uri: config.callbackUrl }, identityResolver: createIdentityResolver({ plcDirectory: config.plcDirectory }), ...(config.confidential ? { brokerTransport: async input => { @@ -46,7 +46,8 @@ async function run(request: SyncRequest): Promise { headers: [...new Headers(input.init.headers)], body: String(input.init.body) }) return response } } : {}), - } } + } } satisfies AutomergeAtprotoOptions + configuredOptions = options } runtime = await createAutomergeAtproto(configuredOptions) const account = await runtime.restore({ did: request.did }) @@ -70,8 +71,7 @@ async function run(request: SyncRequest): Promise { } else if (request.operation === 'publish') { await space.flush() } else { - await space.sync() - await space.flush() + await syncAndFlush(space) } } catch (cause) { error = { message: cause instanceof Error ? cause.message : String(cause), diff --git a/src/atproto/account-sync.ts b/src/atproto/account-sync.ts index c8527202..1aa6bcc6 100644 --- a/src/atproto/account-sync.ts +++ b/src/atproto/account-sync.ts @@ -81,9 +81,10 @@ export function createAccountSync(account: ActiveAccount, vault: SpaceDescriptor if (!current() || worker !== target) throw new Error('Sync was closed before starting the request.') const requestId = ++id const result = new Promise((resolve, reject) => { pending.set(requestId, { resolve, reject }) }) + const config = oauthConfig() const message: SyncRequest = { id: requestId, operation, did: account.did, vault, storage: snapshot(), rootUrl: localStorage.getItem(ATPROTO_VAULT_ROOT_URL_KEY) ?? undefined, sourceRootHint: localStorage.getItem(ATPROTO_UNCLAIMED_ROOT_URL_KEY) ?? undefined, - config: { ...oauthConfig(), storageName: ATPROTO_STORAGE_NAME, plcDirectory: import.meta.env.VITE_ATPROTO_PLC_DIRECTORY_URL }, ...(documentId ? { documentId } : {}) } + config: { ...config, storageName: ATPROTO_STORAGE_NAME, plcDirectory: import.meta.env.VITE_ATPROTO_PLC_DIRECTORY_URL }, ...(documentId ? { documentId } : {}) } target.postMessage(message) return result } catch (cause) { return Promise.reject(cause) } diff --git a/src/atproto/account.ts b/src/atproto/account.ts index b2948bb8..4b4ab64e 100644 --- a/src/atproto/account.ts +++ b/src/atproto/account.ts @@ -36,7 +36,7 @@ export interface AccountSnapshot { readonly repoMode?: 'local' | 'remote' readonly vaultCandidates?: readonly SpaceDescriptor[] readonly transferPending?: boolean - readonly syncState?: 'idle' | 'offline' | 'reauth-required' + readonly syncState?: 'idle' | 'offline' | 'error' | 'reauth-required' readonly vaultChoiceId?: string } @@ -54,10 +54,16 @@ export function oauthConfig(env: Record = import.met scope: string clientId: string confidential: boolean + publicationDelayMs: number provider: { endpoint: string; clientKey: string } } { const callbackUrl = env.VITE_ATPROTO_OAUTH_CALLBACK_URL || DEFAULT_CALLBACK const scope = accountLoginScope(env.VITE_ATPROTO_OAUTH_SCOPE || undefined) + const rawDelay = env.VITE_ATPROTO_PUBLICATION_DELAY_MS + const publicationDelayMs = rawDelay === undefined ? 5 * 60 * 1_000 : Number(rawDelay) + if ((rawDelay !== undefined && !/^\d+$/.test(rawDelay)) || !Number.isSafeInteger(publicationDelayMs) || publicationDelayMs < 0 || publicationDelayMs > 2_147_483_647) { + throw new Error('VITE_ATPROTO_PUBLICATION_DELAY_MS must be an integer from 0 through 2147483647') + } const clientId = env.VITE_ATPROTO_CONFIDENTIAL_OAUTH === '1' ? `${typeof window === 'undefined' ? new URL(callbackUrl).origin : window.location.origin}/oauth-client-metadata.json` : env.VITE_ATPROTO_OAUTH_CLIENT_ID @@ -70,6 +76,7 @@ export function oauthConfig(env: Record = import.met scope, clientId: clientId ?? `http://localhost?redirect_uri=${encodeURIComponent(callbackUrl)}&scope=${encodeURIComponent(scope)}`, confidential: Boolean(clientId), + publicationDelayMs, provider: { endpoint: env.VITE_HAPPYVIEW_URL || DEFAULT_PROVIDER, clientKey: env.VITE_HAPPYVIEW_CLIENT_KEY || DEFAULT_CLIENT_KEY, @@ -162,8 +169,11 @@ function requiresAccountAuthorization(error: unknown): boolean { export function reportAccountSyncError(account: ActiveAccount, vault: SpaceDescriptor, error: unknown): void { const auth = requiresAccountAuthorization(error) + const code = error && typeof error === 'object' && 'code' in error ? String(error.code) : '' + if (code === 'PUBLICATION_PENDING') { reportLocalAccount(account, vault); return } + const publicationFailure = ['PUBLICATION_FAILED', 'PAYLOAD_UNSUPPORTED', 'INVALID_REMOTE_RECORD', 'REMOTE_CONFLICT', 'DOCUMENT_DEFERRED'].includes(code) const reason = error instanceof Error ? error.message : String(error) - publish({ phase: 'signed-in', account, vault, repoMode: 'remote', syncState: auth ? 'reauth-required' : 'offline', + publish({ phase: 'signed-in', account, vault, repoMode: 'remote', syncState: auth ? 'reauth-required' : publicationFailure ? 'error' : 'offline', error: reason }) } @@ -204,7 +214,7 @@ export function getAccountRuntime(): Promise { if (!runtimePromise) { runtimePromise = runtimeFactory ? runtimeFactory() : (async () => { const config = oauthConfig() - const native = await createAutomergeAtproto({ + const options = { oauth: { metadata: { client_id: config.clientId, redirect_uri: config.callbackUrl }, identityResolver: createIdentityResolver({ plcDirectory: import.meta.env.VITE_ATPROTO_PLC_DIRECTORY_URL }), @@ -212,8 +222,10 @@ export function getAccountRuntime(): Promise { }, scope: config.scope, storageName: ATPROTO_STORAGE_NAME, + publicationDelayMs: config.publicationDelayMs, provider: config.provider, - }) + } satisfies Parameters[0] + const native = await createAutomergeAtproto(options) const remote = (operation: () => Promise) => withAccountSyncLock(async () => { const remembered = readCachedAccountIdentity() if (!native.getAccount() && remembered) await native.restore({ did: remembered.did }) diff --git a/src/auth/integration-oauth-scopes.mjs b/src/auth/integration-oauth-scopes.mjs index 56f064aa..2f43d447 100644 --- a/src/auth/integration-oauth-scopes.mjs +++ b/src/auth/integration-oauth-scopes.mjs @@ -1,6 +1,7 @@ export const LICHEN_OAUTH_SCOPE = 'atproto include:wiki.lichen.permissions' export const USERINPUT_OAUTH_SCOPE = 'atproto include:app.userinput.authFull' -export const LICHEN_PERMISSION_COLLECTIONS = ['wiki.lichen.wiki', 'wiki.lichen.note', 'wiki.lichen.noteRevision', 'wiki.lichen.noteSnapshot', 'wiki.lichen.membership', 'wiki.lichen.memberRequest'] +// Current wiki.lichen.permissions grant; Reams has no memberRequest writer. +export const LICHEN_PERMISSION_COLLECTIONS = ['wiki.lichen.wiki', 'wiki.lichen.note', 'wiki.lichen.noteRevision', 'wiki.lichen.noteSnapshot', 'wiki.lichen.membership'] /** The browser, build manifest and server share this one consent definition. */ export function accountLoginScope(base = 'atproto') { diff --git a/vendor/automerge-atproto-0.0.0-sustainable.3.tgz b/vendor/automerge-atproto-0.0.0-sustainable.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..acdeebdcb3ca18cc9f50a16e2171d2234228e478 GIT binary patch literal 159269 zcmb2|=3oE;rvGpDzKxRhoTRa5f34`#&34Ks#aM6To$rx2bI@V?%wuh=cQ)_lY35$p zAjRz&t$K5r+nHe&5sw4;qO3E)@@>_GK&-Cg@ z!#KT7uRZN0(+?jkx+LBAp?~S;oC~Mfrhkm@uHX53|J12d!}a6c7CzV3UcEkU?HZT= zpC0WF*Ixa@d`ols>ivKD{{7b9e_+3-p3u;z<{z}!)t32n@k3UI*=~D1=gs+k*&}z!iy8~bFO&YL_07|>_uAjr_R}Ki zO}^J;^F3GlD#ZDUx2iNeGL4*55~A?P|L1pCqnG_}+5aY*zx?lF5g)!;++ol1!zX{# z{1C0)39zu9_cK24tK+2CWl%9As# z*=^aT6q8r?O$3)RS~1%kU+h_U^!@ca*I5p1PJfp9QB}Hpy;7EpdhDE4chwzdiez4S z!IX78bMfOnhw7hycyu}HLHCyFz07YnbKhiXITQABZ`;*{9E<7{-Y)yT%6E$B=d`;w zG-^4mS8p}5KOaG|p)sIz)te@1*(fCpL2LDpGJwIo9U~Lt6_*Ra$ zQP{kHrf>Tat+y>sxwBD2qE2{anNoM&?QeBc&94bB={xqc;6}E~WmgZU1WmOs_h)`K zTa&o%UZC5`1>28@9p5SQerub5d8Pc51Y4HLpJQXya?X>1*%1U%RyS z^oQ)LXJy^;YHvr##8p2z{yOVTR>J3p;#&o_n9t&!Xp_sch{JHl5zqVC;+Hmwoh;pz za(-i5V&#eL`@8Bs&t_P4wx#(puR~ZXtGv&Yluxr?cn7&OKeRYi_3~>*M^R_LaQ3SB zPY)k_5})z<(C^hOH*B|yfBo+LZhidAHP7y+Tq)1!cHQ*%-Oj5nS!*8s__S;1iAbgU zI+~n?EA7|V1=$!H)oi#UIVEpi$a&wBJ4@RuJQC*jpGZhru%nNW`@iYQPnDk88-t^d z%`iPEwZ!VP_UVMr%}kShy7R1pS6$Ir)z%yO_Jw}9q(+W!^c(F>^DlFVoRoA*;(dEZ zQq3%>gI&0M~;-+M)IL(FnHleQ5KpofUBeK-7W>P^ zpfqKHktl?ae&jCzhAcH)3t{Gf9E`#o-$=d z^rKBb1-C^RuDEWpFn*VGx7_M$X5vxnpE@^rmCs+f^w!bbsUiQex6EDtg~j?_%iT0H znYl(8dC6`b%Ufi(PjzxqZxH5pYdz-2u{JMyZ_~SE-wfI8UdQ-0XOU+crZk>oOku8n z`BVSopD9yoJ!`{FlpHqvGJUZu#ppory`1Fa`6AhmSaW>B1l5{1_zKER=v^cG^yC8b zJ$6FPkKT(+HEI>R#dLDnJ}qX|+qZR$W2Q74oV+i?r^meBHNtW7(s?J=KHQlk-@PpN zx8}_Qw`!J@EDC+E8$J6$;tJ>U_ks@Yo%`>^jDV{f(s)vD|4>Wbp-~an%Je(&$DdU% z=CekwXIK5l+Mu6(zWdBFC(X5&s(0|Gel{~=D@qqJ6bYR<*-f}0C$du3N#)aeC1>&5 z`eFyZH9!1rcf(OyRhLPf139`eY!CB&zHbsYyA_PkC(_F-v7AHYKKhxRzKF+ z|H2R6Je#+AN%h?@Sv$dEZL4LO$@%F=ezaD6xP@t%U zXOqGIo(KF3emXYx6rbGn{aD$JFV#ORT8tgelpadTzc+XoL+uP&PZbfP_l`ui7Y>L{Nu>#f*1KQ{d_lUY&nTS0k=_h$7s?mBHufBO3L z)iRdDS$|w7GS+-v9c_PcPn{d-mQvt={~8u7uC0m)G?+{8IX~?~RLp-d)FK2B#+9{$Mfh75|SLUcX{( z?p(^Skx~EKF{L2JGvehtb&>s>&PV1m<+r@sk^Jou!_VG*LRSPnW`5qFYI9<_f?dh! z&!!n%i6>v}%9-|AK=p9Mj7|H@I#wN+d^K$GN#pom#kJe`LO$yh?b`bB^ycN~`%XN2 zIN{0WpmsMV!~0V_mbG+Sa=IluewSS$BF^~D=A62?l4IQow#WB#pH&tmGn78rdtP$O zqiwfOTKwd!Gkf@1;@^Lzvr9Dt?pxpK`oer~&YC%k-m|}}`BCg^A7|PhzV`U}vyY!& zdo2F!V|TFa1^+$gOIJ_7;T6%AwB%_7c?Te3T3#M$Saa?9~n&K94sUTbCSli(Lx zOLlw-n%{ZqqfpYqiWfb3Pfi_sw){))BjNfDf|1*mrIseI6OLWVDbu2%lXBqRdiRW` zyeT`B4G(7fE|p?g5*orJvh~qimi-Z1qUYSY}J%woDa+@X}jb6RX9cPV6DIRG3))ZC-r~auT_luoYG%fHhbcR zHyh8j)MvgwB5BPZ*s%N53C*F3{MT5#uV+qNKa%5w3W z;qH3^&T#v^zCO`*X{3^CM`43P%!GG}pC;I5DQlSD_`x8hKY8<`$K?rkLXVtts*gN& z=;M2>_@8&BCvsKA#>`n2;dU^a|A%{p;M-1{4@r*}^lBxP?^~pqnxmb-Y9wT_;@Dx0 zpEfM}ctR#TTcDpX|3&QCXHz|%%u{e>undrw-j}iT`OPjXql-yJ^DbDs8m2CZxL`bA z`tA<%*+q4aGwth_hpqQwS+qL)U!b!3f#Z&0$FuXaXZ7!CJyyIbtI~VP%Q8__@nnnJ zzdPMFoj<)uwXuY255L{A_p@A2@0U{TbW4lLHA>dLvi_jYxBK7bC;xA*?fEw8sf(oL zv`L0HS>C5}ui5)16> zWZks(ANzCMF1>x}mgIdiJ4cu0+-;lI|EV`l1zEj$4ax3^Q&EcE-P~ojCW9V|5>1I~)BAT{0-+cYF zrQuz-$$5u6|8G{;lx*0!wYaQc$N#_Y?wy-?;?vs~_df?tzma&`t!LX*@f*j3rn`ME zXj%5J{N-1J{XZAPq-{Ie$n>_p5J)LJ$_m+TeE&q+D_oSEJc>3Hs{J`b5rE=|yOFk^u@&CDb?UL%LkG}H$J8(SZ z=(EjNzWiW~(Si_f99Y_i(bXUJkp)T{eyP zL5$z@6KbL}6cww>KS+vINE|3zcCTVSlPb^e`Ing=8*HEZZSw4Lv&tLyN){{riHtMe zC3;(G5$o@oCSLv(bN9MkJ6)i^WCHWeob2h!uZy3yZ<+FysakK#?W&&zA$4-9t-qgf zOkjGx@N1&{iWj`c-bp$8h|Kji;_7W8_xt{GzWQ5J^1aT!OklFweL_#&vUkOoq`Ld^aeV5J=U&`U z9oq4i<%#zm8FAyNCZE$1ms$S5s=1l+a`{Q~?X9^6)jH=d+*$Ikk8{qa$v>pd*@QGc zm@2q6-|giGB`))xpB9$Qd;R}Ssgb=m^_^F%47=INp4v9O^5&0c6Dl42 z{vB8t_@`}S0k52g;$_KIFH2RbAKBiM=w!L@Z)zZter}W!g2)+Eu@8#Anj~BR^zL@sYqHNhj=Y31xO?c|B!IICy zbA9Q=u*lycJDqd5btb>v$1b;F_uUM4-buk%9ZD8Yb78h{zV!Oy54A@-)hbubJrrZC zmwR`Og_qugKhJePDW0EI{AST^r&n)|yym?3{ef%3lsSjz&Fs1S;_b(ej-OYEHXf6% zJ$Wqrz=jF@7v;Qvxw3HmWew1u>(<*~8z6YJPie5EW#{hg zKhyHr4egz(qZ%CxFIv_xE9I-`FuYgYBCK`GtKgvE<(&PKoM&!UFzGou=iKxX`7L78 zLu6*}I=kdr^BV5vbXSY48}V`KKbME>o@mJP{zc^FwAgRz(_bo_4UJK+Wqa^vfjrwj zXW@eF_BtniU*mE)@Z2cBn!)b$j(l(PoO^DCGS(g$w~g~Zi@n)#XZhNdTY}Zjtt>YV zd}Q|8w1%}XN;7{JrTEHw*v`c!{54gsqPpAD z-7CUE_vQ-6=bG*uE9*pDNHN?byn9M~+k1GvE64$+S=JDwbSbv-T^u;LR(&x2FWA zCs!0_XUk8hDckWmU%rfA^0-EQ69b>tY^HmYy5DqL?Oa*-r1^rC#zG;7^r^Sv`7HNU zTqw=|IZN)5JomAEAD?8bnDj#?Xveb!j~6J+a><{3@devo(=STyQN~|V1C7ou{Oac; z*(-E+mEEcc26?v7_=&PCb{p0zRYbqz=++2`Y<$sHHd)_OElE-9&j-(2DK?jv6MRRns5wwpY-aQBxefo1OSkuK3O4oFyz=?skGEwX*hkMkzWew4^JV}3I$WL*z_;wC zzRAfpt?{u$5y z99wGg_Whn7udD^P*~9AOe?QK$xSBZmOUtR*y31CVO3zs3xMHC-=L1&X>^HoZJ9A&H za=8DPYim~C)vUa)S&5?Ac6a=>!<%1J$1ObcSAscnlHD%J`TU+H~N~(~y9b)1H_-_^8#-$hyY$ zzy^1@^GD-9&X?fX_vGe`fN;Z>-3(rNnTv0(f2r%u^WpoiIi81N*mGRA2jB49F1Y`# zi)g%W^tLyF^HP82th1RS9?vxMZqMh+K2byITeF|t;&EFz>-xKA4+_IKPJekLdzr=O zu(!{o7UvwFZKlna+j8=_L)e$_o;cn)QVeW2gL&n8L=hbzU>n=OB;%IoB1({8@}@FpgJF>um4M!qW7;wcZVa&o;nk-U6q z%fT~k4@G=)KmYYi{+Vs}O0T^A`o^MjF8ljt#ERco$+$@-bzB>4A;vt#C(+WSG zUUFZ)PBVDrZn=`u$=|O(yO6SAX4etxJCj+nVtS7+UbMMKFK?raVDGiqFa7!Up=KFV zuXSE$Rukv{{KjaqOzgtSi66T&`TSlog?^RzEj>X^ckY4i)%(u}oy&D8c{|zQn$o7V zpC88Nq=~JV5|^7j>3QY_58Hm8SBLj^96dbqNKUhR?!61_MwJmP2JHI0ilNyuC#;iy zvKG&aW{h+>x?ydpqwnF!M`;bqe_dL?sr!oLEV08ord<`>?&V|U|NHR4R7XXV4F}g< zh|px~u&Vn1V8ela|GZo=gQxRZPq5ux{qlI3=O*^JO&nEUoHi_9w4aG(LjV44teVSw znYOy@Iht8|>()cI&lZZ$PTiEuP853R${1QaO}PKAG?Vk%O+2Bm=3R^Qo}YK5_RaI$ z6Y*~hZ)=n=KmBAXf05;#`C?Q#>f#v%dIq+0<91u$J~(T; zSp2&iHdeACGv05!+86XBd9G!Jp-!bh*sNXd>HmzRe70BSB{Ffwtar{YIPlLWU~=f3 zs;(_aNh2r!ISQG1;!qi@?`<+?zn>GKzlR4GftH0!Z zu6V5*zwi4dZZ2uL+w&MaekrRANNh_PFSD5ZNn}8=bP8D z?c<0J6W`Q%HE#RWNQ*TQ>pyfV<;|1HTrp$zb2p>UD=On(ywnUBdvntN(+ti%O%JD+E@`vNV#!tvpMAA#%h8i(7p+sU{3()gS%~A}QG@x8 zzG2GBUn4$>Tk$zB2|B|N_-@nBAAg_xlG!23Zu*Ar*h^KP6TjLRHvj(NyycaBRc~PE z+TW9m*Ri{$G5Pjf^euA?l2e_&(tpA=q5Ez<8~d8=PZnP(TxQIB$%e6WTZoLtv-la& z3vMpi|FWSxGwdRJK1Wul>$0^!lwKcR^Y)w$S5c)!!u+V2Od_V&rIsJ`efT<9KZDP8Z{Oe-~KLFM4rx!!kFMb=ryN=G~NN&k5mV7pfJTVQjkx&t_&;BN8~mI5M}m1@Pukv_t1l||SDevXvyb^r+grxyr$1iE z<||e=h@R{C=(GER=Q5-AD#pi(yT5+DaO4zw(i*3;{q5JEZ`jgYl2*;vq*At1Zo#If zPhT82k#%+b&c%0PsrZ$7CpcTaC_S2`9CV4R`7ZZVtJSl4+M0QO_1Ve1JJx7@VNG&x zZ_@6h!l%8CT1ETb?lheq8vky=Vw3p8^-~K=YBu*u8Dz^`%MP>d@_)gaYwPBlersNB zsLA`kx96_4`2W^sQf%c)m2K>nhH5T`X{U;+rY;kfm+Fx;*!%K~ieG=8)#PVurHf_- zp9`GNBYIOa{MR;jzRO*?T8kc4Y2^AokhwT_^~H!|Z&;KfZ8>f+%IlqU6Q0xW=KJ%o zfAhoXjZ-_8C@)!O;S+o!Svf4zitEzaSuVZm%XNcVmK1!-URNU|&QN?Srs^M;$>C2E zjwt^!w|{hE%Eq+Wldiu=7E*KzXAFsIIOk~Vl`b=*pY_BwTifnee|J>OoSN(F`D4ItxnI?CJ#2rnlm|K+Q_U5DE->X#-EOAd{ ze#cL~anJKd2y>-|VyLKm?&kwm{-v2;7pZRDwpF=n>BB=e&up<>vnRy2D)!|r>2I%Q zKiyFg-hVK2rYvi9`s6u4w(oogt%=RkTB{SMJ6z}akvhqRIoU2o{ zx|gLX_&G^UxpQS@(9^qL5|+3AlANv8XUO=ZtjrZFPrTTCcY*2rgRxfw115(nKAU)?%KMe%zg0;l zSI;b)#+qo?&b=VSD(HgcsdF)&e!=l~Z1}G3-PG&8wlZyV-)~oUO{e(shU_q&(8}`V z20C{wCBn`-Nz4m-b>d7+SuW??pNB0~n^!;J+xjkS)5Y)XnrXbPm*a$=aO`_rax8qs zalVZzYmPpg^id+%?&!sjp__w}=R z$yB?i_X{m@u-~QNDQmZ2qe5Fq&X@SRHx}?r`1yk?X4sDj&XL% zGO;Y3{pM<2wu{QYyR*~-R$glCi+{9^i(m6~SIVbb@xOQvny%jbkS`}`#fu{*D_?Wm zIKn4+!y$uZ&)$O*UGH2G+b9)VZl-vC$|d>J(=&34GSAv=3!HPH#v zlvjLWuSr`L!07JqYTk1WMeSW2)AKzyem;8ouH5I#v&%xN7oF*nQw_~Kz?Ipj zO8;yvU3jo<)v`Mq%6eqmeJ7{17M8JyU3~dHcxCLV^=BrRO_{v)(yfyr_d?s|ZOfXW zaZq;kl(`#zHg~StYFoDJ&y#D7XKV~UMD#LDd+GjKtE>I>w8=fMvi&_BbQ%g3EA z*t>E~FvIKtEf#e$JZ$CO)c(t zll`aVj=5a;^BXzu<|hjtlDNF#{~W1P-{gbUOg;bIt+J@vzVT9D!J<{0%u`$EZrk_w zQSv39bw?s(55Lg%O?t`kR676Er3ZFl&+h%)>3ZHPA=X*d>*YrAU+=ehZ5M&)N7on5^0u0qF6#fbs+Q-rczYbv zgU^ZmKkg{_PV7|?nIUDSEfx7puFW;MF1XJuB$nxF!|hes2b|tLwGP}{@ngc1OQy98 zbj;@_UJto^E5WjTjxcW}<9owpZp9WsO01tR=ZQ{gx#lUfD$CW?Kk(6(jD&Tk<<|7< zEHmG&6yFjLn%-ZYlB%<1rl4m1oF~&?M$9~ZIfms;<=bASgvp#ouP@7*vLcLAxHu!b zC_mt!Na+1*OTWaft)C{$c=EAmx#14gXT}?%tr8sfePmi-B*?Nmv2_2c%^TltO)kxt zr+-CL)O&mHT<^n<|J(L_-eF+2$*pJAl|OvEb5hM(uG`mGeanBc>42|V>^#nuKV>!? zzR}RTY2lAUHEyn_kEqz4k9~0X$U@J}VfG>GU23!Lgk`(kQ@z4A@$)7BXb{Rdt<*Y3~tKeDKWl!T37cRZcJiB_?@#2@SZC4=z7HzCD(vbGe%yENtKWGxo){@7wM6 z+^(#z*|vA{_Tn?=iYvNaGoMxPayTs;Z|fZU(8B)Y{fCDt%nO zEkbCoqSjJ|EsuiDq!u3Sv{{(F>)B_PQU{^RK>ejx;yDaJ zwaX{`atLW;IGq`+B+%EBcV<`jhdmBiS0Wu0Vvjsm*v+Tz`d{r)vB%@j#YPG1JnbBw z>~>Zvn6G@``m3t2oPc%D&!0Ru{cA}2o_}5$ec83IPW(UhBlK#enVvww;{KKkej!^o zd_5A{Cwlh%s%wc>&tL6%rp;J7S6BaHT_2pZpGOCg?xk{EI zIgd=2cZB`UX0`RznHIIltU5pP`JPvf*|Og`TR6{5t`J{0kL{|=l#fHu(8? zr>(IJbea8q&4h=G`))c%J128RP!tqX-SNSJDdoZrKx%AGI#l1_{`pf+>{eMt6 z>i2QeM{XVccaKY*J#4kkL&!ELAky4b)O z@{TX-wAh?)t=;8v{m8MO-)>eucAJ}FS^6|U?&z-XhGJ@7&lidbn_63BZd)_$t-I*2 z#-iuO<+3a0?=$?o{Wfd#&FxB`kMx}Ii=JOvD>TE(ZPJQ_{n7SqEu2~sZb5u*8~;rE zy0~HaeU2?N7QS4WY&FUJssE|R+2Wu4JT$oloWz-Berqb28*KQxttv2BBx8-h%yVZr zW|nCjPS(8gOkt*oNREs52a78z69N|4Yx+1b%DM$THrBHHN2s*RS~ZR-d*3t!#vB=_>1xG357{#FGU;c|4p28BBpe8 zz~#a!U(eoVjY8Ga0JT|p=#TGvqqZbC6`W7oLs(z?C+i_s2f740Z zIh9wQH7{6Qw0lwU-syc>POEmfUtZ15N*X}CM?s}-QoJCz^e$55#z6t+We!o4Du=niIm7hPp`&xSIw2;X0boqyl z?n_TCN!@z$n9ib<1=pM2N&Lyv4oI(kCosdJZ|C%a51fe)d;R9Qajbq^Y7xt>RU*jY zq4~MOJ=A!8m&TK1igZ{dL~84^>Ump41ukR9UV#W@Y{N z(}zb*cN*I#fBg9&`^B$I{VB&vG)`7tbKjo6pe|&K@}2J)I?8W_4)+V|?yQ%5Hh-1% zUmKRS;YWEUuW(E@i8i$CUs-f^YFz2%E)A7wmkN`2xVU?icWw<^GXLDVw4k?la@-@@ zwc{)mFEbsNF+M(Hhm=0YJ53+;sq>DTy2_ng{nt%%vu$nLYLkvrwR&^nzntTI{X@v1 zH1BuTes8xoGJ5ZCgoP&_n5QkiNX~WjiSPyXB75@B1(&EZ@O1=k-7tMpVD4Owl9t04 zjIKV{OuuBaajDv?zgwJE26`BIX3yH{#Hg5Md|vp12=}l2$-kc8(fTo6`q#4gLHGFo z2tO2fulXxdYs-c|(Nk$z z^jo)LE7Q~scNQKEm=^DLCNneHK4#tN->MNY8=CwtIqTorJ>|ng{rZ_wcE&{=SN*T< z5WM#E|D!Vw4~-mERdmDDPaL}9oF=K{p`sGp|SI8b z+NkDr+NxXawe+5(B+Zn*$rsn@S$I!>hn@PZ(klh`SDTC4-4!{cp8MlWV8D3?%iRyG zl0|P98Q9ZR-3#bXluut$A2O=$?TZm&dB;i zcuJ35nEQvTK1aMFQwxJ!1wCd9&Gf3gyVk|(&koV+sr|ygrg&eI6}5IQ*{e56H9a6; zk*c#(^&D3>li;e#KN(kje%XnIzCK}XQg?UN!f5lzkn8VW3VykmEc*oCa$k%-`dEZGk&bgmlKkdvj`evS$$Z-El`q^~j0Ffyh*E-(foAQ=Rh_kX_OIEf* z%!24_`;6{2zS8Dv{h$6%R8YJ==W_kQPjSLuza~y?TVEWtlb6|RUEZei+qMfx{>}}! z!xtHMI_w(19K*UL(fOKd|8Be5buoVbO5H=D>a+TpL=>G)eDM7dn!9YuLf%ZL*`7=< z3{M{M3Of5G@UD}mxam}ds-Fc*0+Zh;PMaaNtyO2q-OfcDb`+`0-}B#onk#;N^_^60 zsgHT_m!s5k&#?b6->-Q+XQundO;wL0FKi9lxnsx0|4yzGxpI^D=Sv1gnlIg@x%BOv zymPz{19CqcT#_QERNyqb)NaSOZ`;kjpX=-U&Tn3S!}7P>6YjQEChH2f%c%aekPcq; zKO=lI+rg5>i!>(sUU9#3Wz*N2;YMN$xAQK&BC6t5b@-yihSa9g4H{jG{3~xh*ZKB= zaoStiIhU$`y9fOUwcw5WE_`#EdhE%2TkjUl;k|NfwNZ>$Z_w((xtSAkF1!+Mc7AYE zJ!FmO)0)>mH4C11P3hQmxK|>hK>cN$>FKn?RsnTOUPaW~+^Uz~yikAlj?8%xpC1H; zuobig{}>ba&t7d*|p1#Y%%ef zg$oa>792jYO|WNKpL0{--|snVC+-%pZ>>@&ukwwsvJPIidXk^K)@$729cd7iBSM=cIT?mal$LVMw!(^9EoJM>pIKieFasKN04THCIUJ8vWHPHP*i zb1YgO^uTz7?1tmNYA$R|TmR-`f$&MeonijRw-h%yFt7h+!1?@WbX;GZ(6yAQ%QTNn zoW@e&8IU5eZqAyL3tpvt0sG%fT+P4R;?@&`=0z8Fs=e@I>~p^%dDLRzxl3_woe_`R zuL_#G7QXmt`Qq)t-HT>DzCK%bhjBWGncKD2Lub^jSJbOcDs$g`TTWMd`PHn*t2WJ1 zQCqq9-;`JRcandjf)KAApRnTYX6uN8&MijzXZLK|;Ffew_IRM=);itkrq5<&Rn6@+ zU#h>d-hof{@fKmzl*48Q@vkjjmS@PX%K65^cWkfT?rOhFGc8eX7BpneQ2t``&0?7d1Hd z$t~(fhD-a>-DkJ=xwL+g(K6MJSG#s#_sk=&=U!1dx>0MxSW6Bow-$vRt?@AnXu1$)ckdh`4|MuE7$145}8@==+zm|Bh7Nt&T=Fk5& zCGu6m^S|HT{g(fr^>T7_Tb8j4`ZfCD;srr0cZ%n^ExjC)l0q>E2;u4I?|G5gUOi1c8y}Ijp z$S2QijUBW8&N+5|t?q=}{_}k0|K2v6Rr4vG|C9-u^={nV?JiVXVZV55QMT=)nX|1b zCF-P4-(EJ?Flg%eCoXA>I$@TgKQG6eS$<;HYgsR8yNpO@E$s=OKe7b%@**;7swDWr zp1T}Zd;O`QuK4PErxT_8@+-xse&hyAv@MavR~pzFe>dfHj`7yi_oSdz2G>s`Cq z1G$_Z?<8*68NModb70G^ps$r#AC_C~@!Pj=p;U3{Gam*eqZ`>e^=IAhrV4mGO0hZB z{#cRK_js1Tlf_T2hPZu-S}-BoUhk61`#4#Z%A&K4zP)pHuh2R4a>Go)KNGFyE$r}| z?V$CiI>dqP`FTc?H9jI$^ZRocAQ#2@4wxbuHtld|9>x;Zq2irz&hEpzh_(K z`+iorS2iiZy}2Bl(muYMcYBYM3(K@C4(DgH-BT`5zpoO%WB0$QpH?ZaTD0JmK-aPg z?b=(i#oeple0q`^FsWe)&!$?J{u?hhZrOPI+Qx-*WW3ouZ(H_#sSS%RR{xT}^l?VG zZ10uWc%`Gw2OmqUUM?k(?%Spylb*MA-Xibi9kLIlgDtMiDgG2UX+d+|^4kpSn)aM; zI%9j_>epR!9&i85!hdStma59*nw2}Imu0Z-oxI!BT5WmJ1BVNd7rZkpHmGM!Zi_tC zzKnZ1L(I|DuAx_DRGaUwsSL2zKf3aKlSRel2-8LZ*^eow;-@_eUi)(cgZPK-ix@xX zR571fCP9_|`k!U?um!Ybs@HIZ%y0b@*<+{l^PTJEc^{hR7K>$^(kR-`d?$(d`Q+Du zpWpMYTwE%$?%Kt9{+g9yYp-2byOPc)b6RgVhd0}*+RcX&^x_=3g?rW-f8Hl1RJ$W| zgJX1x}@BK0pW_s(bAZHLypH86iZZ+5l*nS;D(weFXDEq%}5yIyXR zpkHTiDk(C#c-pl47uB-1rJ0$y&0clve$Qg5Z|oU2S6-Z%aS%5V+8qUpD3tNUelafeMY%@r0qPUxvC zTuQu|x73-lYKh44aKBkSg~1gKxhK_4WWv8pcweCsbm6M`3$q}G+PC?KrcbhV-EZnO zd#^(2vM=Sk-QSz_Z@;&wvv1cG;RLyJb#1LD>vXj4S{BD{-@56Uuj!3`(G)YAM$h7{ zx1(A2#jRf1d+XAc$z>($te)Lw$@rLDwfJ5_$c{>p*HK?D?)-PVXt&<#crAA3lEMk; z*Co&WQU7AQ>do12YW_)~RqrP(7TaO>y7H&tGy6Wq#RsJ>k``3Bve*V~y zmOVM5>3rk9B{4_Tv#tu2-!NVMuyVn}owox7t+s7Zo`3Ewy9Mj7vw@+$t7IJ4869~Q z>YDQFSm_vW;?tmNor7Z&YR?6ucP_X7%Ud z%LV3AeF0gItTTTUHcWjWvhPt~A7{)Z`?{Y;EDqZin5vjxJjQP=(R{4!*{1?7<(Pjb zHU|YuU0Wvc{p5Wc>FuVsmhl;}A9kGH>zy<|^h3PXkLfEqle|wT{gB?XnDcg1xK{2# z?bUq2e^U#tKJ&cwZHe`woL?tOqZim^l^vh)a?tYf{Bu?qBdFG_$ zFVqqmE|{GD)Od^I;nR=b`uFFHJYHUTszu8n(@^KBc`?Uav%f_axvR=oO)&J|Br?Z+ z!L7KL6~A7z6c#D|4&Yxn%l)CAPi58R^T{mx^;UPyUQzKc+rjXRyX}P=pR*g}mNc(B zd7J01*`3gj4Yftxxy$6|E-he+=Xq$hG;Nxy!Upb*D-R#tZ&@udSBLk1YEH(wIYr0v z1rP6j{mkd#>P0-Qt5$YSWO%W7HD6qx$%a3dVlBNnrz-cXx+PPrAkeUM{*9m|Ss|;w z+@0dN+jq{*ee+}HFRz>zh-fz+ilvj^0dU3bnRa|SNYhyVbi?1 zB0)?%(*7^!**Qxl7hhZ0eE9GC^6zEmpgRNdgV!~<-hXXW%C+X2vtrO&KdEE4JKk-% zFgu+2a-YnHO-b{G4=Hy%KdczFQK0l)w06!JcaPO<^DPW`E7fFmyL|0gg(j{He!{aEqE}Qh3`*~x8;-TA}5!62Nf{J>1j)6pIV_Gaza{G?TdkmQ|5Y}o;?o} zwB**_c{E{e$2CvC&mVc&tqo&pvb#c( zB;POV>Wcik!bNwIgx*bxkoMlTfN4kKw_k}>a~}z|_oeTe-K4Z*$rrh-l}|hL9tcLR z)1I*Mp5CO_Jga|S{8%(`=}x9Lp38R= zjp5Ut#vTrvwWcEe#dVJ_uM8)0cD(Z4>mK!8mD_bw>LIg}&J#kXCWgwKZs7EiHq_bN z9Q%glaJWp6yT^1_PBj%MGr_gO=ylpd2h(C8SwdU;CUT*eoRZYI3p zI<(H$^2v#3$FE;xnrE`^*yBLrfps}7ukcggmWx@8K$2)p!fNUQk&V)`I|n5Zr*q&qfum0 zTmu8suGU|svHxBen4fn|*7MSCObsgL+fZ?7gFT~JlU>f)#bPu2LR8hXpKOu+dtK$| z8Iy?p#{PPNA2VClEOd#=TFPH_wEa$SMcUdmpP2Vbi6uv=O}f4!x+cYQYToJ<8-M-T z{*mj?{j9?`&841JTD@AlW%r-wPt{L1%wXdzxodZ=Q)IsAz9oVl_A7rB%?;s-?5Lfd zwB9A`f?ITZ@8kR5O7~=#n1$&d?ECd1i>V|qsWfU=+Q+7U74pT`r(Rzs`u3vCR%^fY zv$;xkNv%3FQ=u}>EC1|Qj}!G7j4SB>7xl0+?CiP^ zY1jK~=I{Qc$(FB|y)86hwu1Ag6{p^xStGP-qyMkJucQyHDl}BQ@q9~`;@=6kT6gO& z4m@acTif)BnS`$WQMm>oyX98R3?IV;j8yl%db#QQ+xt^(CxnN8mTxpav)?jJ_-xXW ze>*1Ccn3|GCECc)#c}LR$4-NT%8Ngq-lXV|I{)p|E$6r=9C_#Z;*7)V=lOMqpYIXP z2<9?c#O4(B?cut+)=hRxr|F)Jl9{loJm6uFoXwhO?ZDI8>JKYs-n+H#@g%Pbh0{HJ z0ZWdv#`FpB)k&`29jJRV;abIWUO_g=O!?2;2mh))IKE|@{G;&D->ZF+ZfSQ~Ges@t zj&S$cD1PZrWV5sHir#IGo{@gy^D8d%zhAR+_bjQCLMEo#e5ZwV*K5voTq0Z+);){6 zYlgwANgo&g++nuA=j0QmNZ(b{vKRZEnsG3_BV|dwqOywk=Ob(Ke6vn0nA5fR-1Xwn z<0i6kQypSne2SkXJ$LHxRYPpN1#4Op}Tv)}q_Gk8`nx%{F3j~=9Sp(irTwidWpKafQ$?hwj{YkW6 z`|F0h`MtI)hrJds8QuDGyxYpyr~TW_yRt#7kAMA1tlKIs}kL)JaEw!o_^Lgf0 zpd8g}_3Q5DjMBIJCw>SMJDECL$t&vnw8wMKJ)8dAqkG-dXIpM8<~Np6KEZcKe1Fny zM=K47#+~=eR(-4p)th_g(|&V7^DwFJ%VOU=Ug#Mn-u1(M!SVW4{N>^Db$_jzp3J)= z9hY`RO>|FRQG#5&t?xl?R^#=BvwqL=uAK12z`M3(`QsZaR<61y#?HXHLphK4%W`+U z2Gd{%t;>O;sd9%3d>JOmmQBr!>a#GtEtKn<<^1xN)`9itbN-Xk|n z#34Pp+IseTdzlFp#Xl}TyLWT<;z=q+bMMSqF3(n>x%r&2vF@4O6;1zNPwOe>XzAtR zlD^WPE$MOmtYKA7Oue+-`4m=E5Gbb`&DII z^|9t0&ns*9-|~Fh%g%i(yZ=^>d1>C;H#x>D``Vo!h%`&j4O`=~d+C?!X@B>yJXSng zuczoE@qhD)bR(Nfv8kI2w(G20xo-c$X@cxGmh~_C*~445T&VlKU*=oI{0XZrY>R8( z=IZlLlzC0PORNty+6&*8Ur>wof{gePfkwySIjM&YhE6 z{nf=HLsC*Sy5p3RZFiRLI&{UcEXE*S>%#(hwhe#gH^lF5-tAYQQIzxT_t{Az8YS;y z0%lC!ctNR-b!+AFgpa!Zw)L$sa#rnKr;2|anV3@N_H)Q8yxnB zt`m52<MRV%| zSZ{E9-Mt_8MVnJ3@oNF&w%-ecemB2NTDr z0uPqVIgzZ-R_fqx-pTZ@TEMP=^YF|?&jKC3{0wA1lFZ#v&0`v`cZPNMtZ9#x|HRxX z3vlWGq~UeR@psxxkE4aAJi8qu6@72qTIOdxHSxi!L$6P8`Yw~Xe@&!2sgCJx?iqY5%jlW?RXx?f*OVLT7v5503c%IrFuo$;{=E zuUEcqdFtqG7*oz5?r1AoG2L%IlR|yp-t@KUTa{lMY~0fc@M=f>&t>vYea zsjLnDzw7y)vNZ1JUilSk1>g9JIxmjjJLk#YH1qwEz3nI7@V(?d`OtZy`^|(uyU*JA z=gnGuexu4}J^`!feJzIzS0>s!)j32yikUhm+`Mp_E$=~>W~s*P8@p;g`BY{fo$(;&wbse) z0ya5slHS+Y_{{n<(RKA}m(^xp|NV@dx#<5MpY!LW6t#?RHoehtoTK3JiHY?Sqowx2 zsihCBFRguiRVn#T+u#yvBKVZ=87}w^|I-*Tis{uulccIcP?|+ zO-GfdQ=V&8dUrag$Y0&^bP1tH{QnHd?-Kvj?{}iuifK%!m_2Vn+U}u@3g6w znATpo>s{UXb%wPvMjzPLBr-Qo;MvOfq9H5h+1j^@eJeWctD}W49I^WKVCJ@)F}M2s zq%7th%RD_l(a3GCE)T=L{Ap~57R3KpxkG@@X%H6`?>9Z}mAw9gqwnkH&zW!Kf93w_^RJioUYI+d`MwT+p77o5 z@>Flee}5A_1Ws^y?bGN?;a~ab=Gg1Y0+G}kMvL5 z7ou%!|97r-<3ju2M<*z3*q0g5wBS;3O4o+QJ?qAdSSt}O(IP%wn?Or0-cqvXCx{q3QKe1 z=BH1e{BTJ?$;FV0;>^aNk6v66bKVH*T;w>f>8_%*=UM?%mxW9wC`((}xBBKIv{r}{5Cq$%^3sD_zn z)LMU!9}BM9_5KJuciXAYH!zvsF=yA#%vZXddTDdcdPv7HS8XcdVoGZ+YBJgIWa2qa zA)X{-OKt(jkl!&YD0voWqXKlMl;($Nl@2 zPDH%Al$Ck7+-k+&Gk(g)zeSkHE_RKGOvn$vwLWb5E8lEq>CALflWEcUPr_c$`}b0- zf7h`bgXv4V0v|XY{+_vR-t*)YQy8brFZbfLl+XD2L2virFstG=n?E+s&m2v5igob~ z;e6(>Vzs*0gS*}io4%xW7KDhT@883DAvGj#O~1nW(%6^6>wNh66HH>VpRTY!Ug&Z$ z>D0FV|G%Du?d1&9&<~!wX2>Z9srGvY$9A5)XElp&ZP%VvbF0{TBF!&vu;%?5ynE%`rt`n%h4xu3-Q}in zP5G9|Yvb)3WEMQRxXOk@@$RwUFg_i}pVBLIp7sjP;}l(xF?G?QrX3e=F}|$0r=u0p zuH`d9euY$vS+DN8OU&(Bch+=0jf-9JcFEVo936!Mwt^>Fe#R38*ltdLb@id|x(d~o zXZv{;c(V#`c(Lm6i=a2EHOWj2QP=FRoEN@OrZ6!`P`y7cG;xZ=I<-;nugJ^HF)` zFSa-+x|@wSDd#WsC!uUEU<0M#?v!eWGf`B zuAce5Zd-P2%{na{0*&7AHo71z&?2{Qq26 z+UMu?|I_~~`vo_|F1Ytp&cpWfCh=*z!zUkHzGeFomxcSqzDqHeJy<R{? z`dmK_cD5Dhpeu*nQ?I^{+tZY;y`P0i?ZqYb1$VZ~&pP9^qNzN%jGmieRidE2n5DS!07@t5)4++(ntzgECe{nppXX_u0Hv<`mp z&-~=sb1BH3iF^61nm68a4CeVw%q!_M*SX@Qx#N9**>>M=73ZFxTXEo@+5OzTy<8WJ z)=f4maIcv?d2`V()0cg}71r@zvEjb|ZkaigCL6KdKh(S>oy+O&!?39}3m>i7P`fDY=UT1HDrXDs zmN_OLWtxB7zhrIKg=NUq6`S-s_o*K$E0&XtpX z$Y|VARJ-upd%x}8+J9cw=^h)KK0TVcTGMlRW9hu=D6W*;y_;R@XNGOKGktw$_LmSn z(X%tZo&CN;mg}XQZEZ$ofV_dkk$4M(7iUtIg_U~S+3h?#rzoj7?ep}XQN|jvTkg4~ z{qUROIdN;B?c0o~Rkl@^4p@b9=*h}{d%8wqx{gWF!&OE}E4j@gZmfvmf8TdaHjwlG z+fNS@|J|9i>*}Y;d|?NE{t;2RJtrdO;XB^b;rf#rt+Upjcwd&%_;Bx%^i_#cw7qeE=N7!%$Ot>5xf5! zmr?k%bzjzTR9rP)5$0R?v-a(oj``biR%?jf61gl>ex)5=z5H3e4d>Q% zNtxGpZlz^&9kj4Ea^Su=&N;z0u>%8(%$M7UirZ+qcY; zb=429Kd(J=#=94lpQ@tPm3p+U_n(^b)Y|K`)x?IcergMEYKKnvV|9&n!`!4L#(qBg za=t!c5p-V>{`%vawW{~0e4EN3ws~*1^0N2k`X}B@eZ`=1^_9(DhKJL=*3armx8Sdy z8q;=H=(N6V@M@Xpw`(hJ#oYRJ>b7!S^)vH@fjLPtW^)>Df9~)2YQIGDB*l_s&f+N| z-k&cC#Xg+MfXVZKgy=sov%ceD_Ex!BUh=+Qi%;)3Fm$J>cX_L{VeS7x5`^HE9u6k1+ z@m$w>dG)`g7X|z-R^MdEep|1teSdA;^V|R9Z0ooF^8bBb|6~5om%-a~RK>$)2I)yg zbu8DPr59rR((Lafr==_FbX=_rZ!Wud_|c1(o3hoISa)!L*PGQsh zrF>@JeU5%^i&!Vho$9A~eOl<-S*PtUJIbtR^zDlL@PKWn-*|n%=&q(HRZqGBz*o+@myf-^?icg zGgsfwk$bzRqHf#H@(*R7&z>{9wR7@ky*F=9uYR+B{;%uJ4`1y6lw|Ys&(qgu&!3Oq z^XJ{w{NBBH`h3l=z7gk}#pUpZ-Qg#**2(o*5u%gc@7If;J59fFtEbwnyVqQ$=kM?O zbyz?19_u!*JztL&PuahrY1Q*-HlMFa{O{yA=60xAX1(As^EY4H&E&qt?@X;JUDVdA z7@TY*%P_+-ZbsROhl~*`-%Dgva{Do7O!4tFlR8|ux9-6=ZON0LdRKI;Pit<7wu$L) zYfZYjWbv%V5YFWi?!N*T-m9}eJAK0B?@A}xFB|LitV&Tkb#qd`bZPE`PaDem7cIZ2 z>hbM5XWL;iZn#tdNc-k{xQIag9T_pR{N{wY6x z9+qEpf9sT{LtuXEr3E)@6vaH#aYu*5?Be)G8; z4C~|fFUyaGT_42Ft{@N66Nt$50Ie$jX=iM2dzsuPKZatOLk`=sj`J4DOGSW+@4tQb*Zp>gn>e$b z_2IA|EGgfXHf%bOlWO}|pV-{y1Mzq}4LTDTOfRypy|HOK0ZDwTJozUxzZR!SPFL@GSV_FQS|5Ro;FbLH7e zbB24*vTi$UOKH55H8npscEMua^cyJ!mu)6)yd8Hr_zaKo`)j98nyC2R3#_-`J2N$_ z;}X}D+Wy=m&E@Y>cKTe~5-F&0eb(oepZO)dxf*T&E z?YK7O-vH=#L7?=0-NNk_fb2PzwriOX`(jzOJqBFOI8Sjfq`X;Zv@SqYC+sW<+ zd=Fb+Ps&&`rS{p88^TAX+$cSAyGvMymDOH%?Su{2XX)AR4E5(=*dqJb+1Tcv6GOoWznjf1?+5&fPJMYnF)ca+mX`)vt2T5VaS$&E=+e zK2&d6NMJOkxaahyF5sTok8A0E zm!cwGH^1E+yEpIF(b@vW=N~MX7R}+wIG^(6-nIbKw0DgU4nBPAP~37Odg6<;)p`G~ z%IfT|I~CER#bftOnd|aCz4?D-YOdcr7MMSyh=t*&=R}FOZX#)7vL`=HTcP41TydvX z%{@r9c+&qx+cqDbWZKItCs!ePs^--}_CGgG)<;gb6qPmm`NEf6yDu-&4(Fd_zTnB! zY2G-S(Z&}x*%U7fR9{h0qq2(pR+CnGUIro+(oncy(x#5MyWf=xx z;aABuG2acVr%Y16r?7Ul;UPbcmi{D{i6=}>mTif;TwOYE+0CO)JsJ)lF0NZSmvj1# zs6AW!{%)+_zIeWd_Y@tqnCrTt;vRpu%~7~*bYjc0+pXe?3T+DITHQRGr`^Bh-q1EH zIsU#^qtBnri>32JXS-@2oMkLgyUllJO0I?B>Yl%|jZbdLd1sdDd;e=!?Jk4!Uc2VA z9oGN5CEaVKj=uZtmk~_TH$I9m?=oN&&*p8OGWm5$`;T}A{^Z?@TGknu`m6r;y(&M` zW!;9J>B*i;KbUNE+i2-h67o#hZ)vIodmqoGXHWDCe_okf^7*{qhpy?fS6{yI=^o2H zkv~1Pr|)a!m*3?!Ncp<`(Zwh6M<%RrmwwjlXK{r~e}?%tm>aJp(%Mxs^vsca7cjha&)xr|~_lDl^nJ-!}u zppQLc-d1H}-G93>XDxbfyW&BS=2pg43F=V?t(pHF^YvV|_u1KnZ%Y}xi?lhLQ&&u# z_QdghNUibLL-&5{=u^>R+}CEyp2RzQ$(pqfKOR)z-%}KG|8e&ke(41#J9FY*uVy@x zFG#-n^Gx^o^T1BA#-0wQB}=Zqe$nzzNh!B@ zqokKh{G45~E3Nn1Pm;LQqFK>Y{^JtAbk_PD{k4;8-8ygACG7m5ad4W}JJH!EP3P>n zxNm|(`nLkb`(@j5S{~hY;kbAE{;fOK)>ilI@BCqW|Gn(HMe5CU8Qb=9T7F#NAU5UH ziPDWbPPz4UXm3x`)Z<@QW}31?rt3$ZZM+9_9tF<_`A)^=-jCv&7WM?e`qxI#3zpx z3aXF$j}|--lG5G$RmeT(ZsJwec$?#KZKbkY`_#iq6cqi8!sm1JIL6+cdHBrobG%cY zUUfcF;`nA^=&kS#A2Y76jnp$P2svW4uE~$@4)dRw8!w|znxqtO4PrKX_F%_>;sjBT z>lJTv)=i7vJ^e@F=OtGzXDYl_jgPv(xSmf{>eZt8Jrh+U7q?!&({19@xlmDA_}tpc znYNyXukARu>7VBo!6O%wSy$e7JiYsfOfjE1(^8fe^B~FFC+;V5Uw-^0+b#V0FOjw!Q#s5JDI!po&U)nII}~0bL8W#?~3+ZE6Mt7egB6^dxmaMlzNa}s#@LA zmi4!mFIagujr-7n>F)}n@^^2Nd}_$J_lWO|S98wqIr(Ry?X(E@o59*87azXpmR<2> zuN6~P+Pd<8-_CuvZr2Jf(yY5F^m0|2-sGb1DW6?R3va1~i#<2_{!KD%+e4q%jPnmJ zn=@(cwI0E*)4nIa;H}*F?&_@B(QT56R}+&r#ces;ShRlgp_93cHDCH}Y5oe#*c;r+ zQ{kr^`c3q)#Urhm`;zK~>WZZve$chLTJ!s$=CA1)46oh_M$HZUlBE7;{nnn{&t{pX z)}$&0yjd-{)Q<?cyBSu7G=h6M4 zf-iq4|E!oP)j0PAQ|O(2Yb5lq%hazf75A#oEJ|D#xinRydC6PG1>z^XoI4qrg2LVG zD;xd&{?xpG(Y#b>U-{V>+UZBxi|Z6Ti(8P+y0TdXx;wk>fIF*brv`7 z+1xAKW$~;3dvyAHv-11$@AurV+3(sJSbqOM%i8b!|CyuYa&w~uqJFk=I7htN{xEsV z6NbXqPj+v~DwW;LyynWQLq~$+n2VNwjk_IE!}EKlrsO?6{!50tbpO3&D)##0yC?hq zv#PijTWyVh*FL^%n7MYs^iSp5+EX(bwGIXRn<@Pu`sn`)nO_A2_je!pziwYuWY_=5 zzq+lL{uuvze*5_U;v`QVby+dbdd}<4PhHaX)!Uu?l`QmMeR{ZHN5qnAHC_L{ZeMM< zywNGQPgKUIcZFZq3!A4VM{2h99BEDF?BwB1$=H1>#L?AizQl`^%0q!OC)-^06k=ZK zcDwYV`@#pxcSV_Wv$9@rTb<;3FI`rB!r9CBzAY}wnVRu<+y76@GOnC^UR3gWm=x^4GH=tV&CzpG zZ!;=bdU(}UKA6j#`yw$kKBMhm(2Ln~WdAt4td!tq3z5#Umsug7Z*EnFGJ2lGx_V4<{HKR`R z|L4`y@Bf|r|Nq@b_7g80&o}(VvbN%;#OpP;EH@L^A$ zC;pN1HibV8yR^5-er4L$M$TecZ?C6I^|o=8I`#M;|2XAW!nT-37`TYCccF12g`{t2Z@jzy2bNLxdb+<`x z6<(<|KU8oQ_4}<~^e@d_{m3G*ja@u?Gc!)Zq5 z;|~?#Pq*1w&(^qCUAD|Q`25Vr?-=i#(20%izWuC2zwY{JNky|YT(@3`bo^q{_#xtc zEPqx=+sxg;yKdk6cdb9~%d5}teO|1Z&MQ#(T&~6a%9US@KC8NzQm7 z`&Y6&%@-rq#lK95mNT=T#u8z)FmuNR$;0|9*xsZ}SQI@&g5my? zf|wG=p8G-hcV^|BJ9?YH{<=QZ+<8>Ij!w{>-!F&UknwQl8HUN7B9b+O=#8D zyOz_T$!z?hMvVPKQK(XtsIYka@|fLD`l9!4==p>=>-Ht{KF+)m9=EqVslwY>mgo4* zqrIKc;l|9m`G5MJUo!bH^#hBC`n-%LMXhAL;~D*4ySi?2$R54+_*ti4fb-3j-Ht|D z>)IY4IvsU3J?62*o@wjG0 zNzl!0bG9z8s&6Q&nR{@`q`Li;LLI?R68N$Y8P4AO(ZO@}wL8%@ZYI)V>W=eQ`M$U@ zH+c2cxEh7#>-jblqBiH-^jtW6*WGfhUet>G7lo%KiyGv`To35`ihS69!L>4)&8YjM z?zXAluD7;uo}TsdTfu}|GdM1-WqW(}?6y9ai;t$(oenqq)Lo-}mH&B@zpYI!EBoY` z*3Pld4xc<>lew#M#@+Xl(Oc&i3qRd?#3EZ#orBr zanf9mS5trMIzKt6u&wE1klmCw&B3Cv3`W1tT@Rdf7o z&sj9NXRE)eS>nasy&VtVtauf6)yweTYFC+DCbeH1xE2Ju_%A&gT=eU~DNTz9)3qbq ztrk3*m2jmtGEe&Pi@<~4ZFRz>jtZ(t4=;#Cz7OKO^mB2;p@|CX`d&Azj9I8H+4;?D zlbNH2!14EOHPKg-k9;Ue`>>=?YW>|SW-15&o;t^}jpNxT#`D4_-su0^aFOdLcO(ZF zUl)sVrea!t)z<2$sf=^mcDKzi`ssOoV?j__+J&>hiCnK!w@JV2nfv*4?4fH`LDxRt z3)*gfWN&7OUzz3$wHePJTcvJxHG1&Lr{3mJkMiHw7FSkot1<6-;Xm8`{i5P87d(r! zFF*LvHG}sHL$1%G;~vW+Wu6^e7dSD+E>*~A(Kg?ua}D;$bvQjTyd38?)uloF-ikFn z=8wJ#zLI*cXVA*!(eotJ?pRdJmM7OE_xpFQO4vD5anjBsQ|2A9{?H||$dzhn2K^~(jTwMqdq-&Fl9ZZTzZnq6`^t=Oi8@wN@K)zO!X(`=8aZ!DC| zaMxZakm6-lSr`~#H*M-xtGS(3OK$CAaT3)}KXB5%U25CX|6Fof&GymyjyC>ztSs_o zFO)j17FZq&GnkTQ5|LYU_o?`cJjPkaKb*Gi>$(x7YI{Un`_+WrZ96@fI)W^JZdyJ+ zS^nn^(>Y(Nwh?s=@ja9QBG1lzfd##a*N{@69A zBGhA@9cy#^gL99kO_Sv1TQEUZFFFkfSY&X}dF7Z>M{?88C zAI|+5^VY>TUTnQ}@Sew8S2{g=^Fya|=I0-culaaR-Bo#;+jn*PEAyXq3&Nv!M@=~R zVKbkrph!8>t&Ylvjw%kxvnN~+6zUYsOXL-J*U0nn(FcvEB{|!)?_E!2`Zk$=N{&bB z&EVbb>!(~5m|DfC`lt4{_mPC1>kH-?+;g60dh!pa`(4G-y0fjk(;fb}GwaTJQ)Cft zDbF0GAE@Zz5w?9vz3#KwH{!JSnJ+)p{i@?|QlE&LjtZ{}n=I31hQfGXl~>;`et+v^ z$!z=Sat_PKgr10qeNXJ#bW$e?aEqSZ7r6LuklH@UYrS5DA-=!d_2!)05WZ|((xvZ0 zJskps`7VOS4g+C@9MWp9JRJw(XC~UaPFDbTeLRFDAcq& z?KbP`Upro}+mI3%V%;;B_u$M*5BBL9&e`*Q%g@i~(N9Xwxth`zWVL#(gj@A0=>u}@ zjH_Q>KW`>naB)4uYT;csKWw`FrEPIxfb_SgIg2WUwyfUn*2+3%|BT$71uMU}b3I^= zOZVCRHe=&Dx5{6Z(v!ps&z>?{EBHDn)%M!mM32?(wJL^F7Ovi`%lR%cX>NH^`Bt5W zEFyoTy~38v4m90Vsp7wfD^H{J%9&&Lj!#M1qF3zu;*sga<9nBV%QI5AI$w*ili|QD zH{SY{#~LHQUS!!^&Xil4Q?&U~@9u@BOOI}RlyJ%;boz!Bf)yvOu3vTOuEi|fm#?ah zA8m9hDg9Hq@9$#0-EU^iJ~*#cLg&oOM6rX?*#g&QM73`471;W+!N>M;gwUfiUXP8N zr6V>?oEMz!)~EjS*}fMOe(3DHIz!y{ZPbMi^8*-}uUPid7B(6ExQP!InthzRX;Ii_ z!TxVCB_H+juXafpvCLE0^VCDMI_GXf)Ye(8>22Hs$HRP6V@-a}mV44V_tMcNii%t1 z{EDY8Ptg#KlKy_f@t2ZT#f_gC|2-5+=iLc=I)NifYA%mwsCM72#a|b0S1pkU6A9j4^387df3-{h zj+*B5nnx|Y=uvfJ#%)2Rg1fr4Iv%QVd)D3MPLKN}b!OMM{oj>V=^X6{XqP{9;(O%k zE%8hGpG~f>*r??yJ^yG&%;HVQLoAu@xTYPPopG{e;fgAQEjE{b{$T1`TEsdnIKuU} z$ESt!LjBIjtnbw<=!r0$z4YR?oa%E6Dywv@!sjiq5R;mf?<5 z^U?DD#houUuH0nvI(5V5rr4jF_nbUe=KL3}o~m_YNsUPI2AlMMoAw1B6PxhVM#AT} zwt05&(W`Iw$mkr|TP3Vl_%cs!>gP*2r;o*mZ&uttYd5#r<~+%FN;4w-!iuBBEdNgU zw{G1_8BX!ncJA^M>x`PtFIBd;Ug5hdtn0$7!$DPBKDGYtpK$6*Mw^1X_Nk+et6J9O z>&RqwFPLY%^UISNn$HfhD0L^OzLg1B<5M?p%8NPP0_TE@dH+_(HJL>+KD_Q0vCMU4 zm*dJ{`Ipr!ZbFmJX)@TaTd*{L*OJMMeVsF#KisRSuwC>z);&Y$+-HaERa^eAjtZUs zVF&t=3&mdC*A^7Ihs;fv2n;RO;|$xs*7B~7>UHL{x3jYq=TC0m5O`GE|9$1f(}i)* zf*$sDTol`x_2ka`gvIX`w;w#KaDs9Q~ zmk-)LGkv$Pw3wV+WG-3gHqqg{$lTtUIa`f|T*Li~c5+EXf8<^8J9c8~x2 z8$x*cOm(&MmsliRsZqVW`iH@Z#h*_)98V3u9=g}Lrpoit=cdcdmkqautX}T3_ehuR zIlhp(qSfM6w>Fl%>(4cgv7NW;Z{kF=*VDT%g|XB&hWKpwvT4HeT~_P0_Vb?boFTI< z{%W#imt72RR#a>M%E=%19y(upO=GE7{bl#dT`WQmQ(R4NDxV3v_Nv{?YexSYK9&tX zh3snGQ>9~x@5 zZWNsvAl~izUHS2I!P^EM5&V&wYkx{+p5FLunQ#&NlRdrb(~tQk@1FK_PlVKFkKe1# ztev!bLzA!O&wYv;nYHJ7q%uvs^nKdnl|I7VGkyiu9Sq?1_1MZNCi>oK-n5htRXr&^ zk4BIoCRvbOC=63uZfsOk0Z`T+}1h04%f9Y!aT`4cuxhIxsMjFp6DM+&W z)Tk*twX*%o+i<59CsyPdn%b`{Gtg?jb=~99GW)qX)oC^Bm12G_ICS^^tlSxa0{%Z; zcZ5$(@|YaH=dJjz(}gn3GM!=Z00CuNm&ZlAr^)Kg7i`ldN^Hmr*FQ4x!6 zwgR29AJcv{dp3H)Aj_P?EcgH!&%=Eq-_GwN;V=+cXlsA z<4G!IYYyd|U)|f?rR|aJXQqAX(O1Ru23!~T?jJlOzN2Q+*2zY_yO>NJQxC4v|N3S4i%d=qD*JIp#D?(WRJzVlXUt{+9$6Ft8yjgfAATjV)qmXgv z^J$-06WohpQjV{567mYY^y#!sXDic}*x0b+zxr0|Zjq~#m+>fgYhQk-`8~_^`samb*z>RE-}ia7=+x5-+X6H9YuZO>sJ>!;>TuLl+GmTj*sI8- zYj+-*`%U$z`y%EY`tg_$xA2R73NrP6JM*UAW?b3%NTil8m>{H&czKwZZm87%7Zf>NA_tva+?R&Qfo0jam;%1T?p0c&1F?(9X z%vRrdQs?ZM}9GQNK@1?2KJ=gEv1tO2X#X!!^83=Q+5I zzKGmcDBx1Rs_TD^A!z5mCe}S-{>OtF-5jQr`RZ-Fw(ivJ9@hMnCBfPJtNY|{bCsPw z=(FzFIII{9{VpoOL-%FhlT5DzMafp z_Gg=94_ut_KmOajt*d*Lqb2O-|JAjv088yW3-3h`%f*Jt+lg- z)wk5H`B#@FTem-?Hb0}C*)!wh)SrLNzjulF*2y|2Hhhm@yin`4@6`Llcbkh;Q{-OQ zUoZ+d^DK3W%hj!hij)qJhj^3+o|XT0pO`LL#-aeeXP7uUBa2UnDI zeg10`ZWFrqW5R^ClYcut&lJ9Td~@Q29}32T^U`P9ZI5@I8XY_Lw*IvzR<~jzK0XlY zZ_lxhb=QhwH(4^-{pqu-YaDkRaS_Z9y5YUzn9Ekbkh$e=+{NGUNU|Mz_9N-=za=3S zTKl|o&vm{J@-MmdaLxjS7@?z&nIul>Ep%Njmf90?tbfaVe%5~vdS~(4sa=Slc8AAJ z>+0KGLK8RmvUH1A(6~W)O9ABN*sC+aL?>z`35sFt9g#| zv_0~c8b>uAv)(Hh?ANMuW%uOTQ!2@-mm+q|o4DBaV%F5<6Oa2GylwhY+xTC}%3E7f zn@l644IdV7i?^%ZkobvP?DmDv#lcpVnRE8-;9BuNv{vMo=pEq|GUqOTl6O4ck{SN6 zIcL?=@C9nRjot-8kC+6?W>tJq{rQ6X(jJ+@`yc9-$j(W6edU^HxrlpMJxt zS$D}s;~$?6Uh{jWoAa(Fs##((qe}C#vvVB1_c2@SRIZGPbA6Vdb+CGoUCvB1<0X^h z#ZUDffAz0aS9SZnd9|rK^OkPD6H^pz5{AbOT+^eq*wp(8bKA(H{ z${N=EGfL+C`Z>zE>)+4)<527Gmn^^ws~st!?nGKDK0Dw1g>e?6J??1lP?lj&l*OMdzv}f*Ac_tlyO-B2t;ri8bpY~Kv(AA5W@XoQ!k~!<> zSB|x7YyY3EEvN`va4Y|*)!W3n)9)33z9g*A zES?+sC}hH^Q)lWL|GxB13+8^Z=J=NAHwlMt++Jg9v05=?O8Z^|Gsi=#H7!&W^McPg zTjz_`<@|ZV_J?ub)>9tR8yd@sLS`L4n!xaC{;k6ajdh1kE}vNaTS~6_U`?99`J52z z$5x!hMVvw$TD6N-ab9=3C$aVHjPG1GE!VZCZGQ0Z(#26bJ>wlM8^(S%q0TV*^bih#F zQ%|Evje(1eefy8N5cchrSKd#4U9;%Vsba^J>f|*6?6tfbgV=7hvaYb(vcN0k-X+${ z)1R++cei?j>l1?m8vBA+f3`)m%S14~c>QW@jY7;OX_=fBZMySlfET+dkluDOc;mRc)Je z76mc|u9;u6d_|+ogqLr3F?_!JLTd7XuSI%U9rin`w5 zWb1M|(^?#ItKn7ERFlZ0H~Mc~%{8rC5*!R$&MaCW=>4E(Q}uL9;gZf-RjZ}SXV_@0 zyC8K(WA4c-Kd#JYxxuGf*O{KWL2cUF)%hI0e_CIPsr@}Pt42shSEe|7ku#T1u-INP zo5Sa3Up#m1pXqJ#QY%snPJYs*)s_)zA9M1gJO{dK3+2U z%FgcXbHvZ;H=Q<{?Gw8v^CZ8*d|R1WN9X5Q9Poa#QQ}3Id5%!yB<|RfW4G;Z+`DCO zZ)a(7>lY`BVWHsLD>+m9-ZN|HMwr|SdB5+b&94XLoy_xl<|(bWO`a=SdsenJwe^dB zRQJtih5?B$D_A!^|FmyHZ^B=mD3KSSgl*_%4uU` z^FWh{d4|G)U-I&z3lz6xx^i?#>+NUb-xW3aRHM|}cSmKntIBq&@Hx&s?|HaGr=gRT zXXA?!{kLCxSIX(^x#@N%ple-W@m!E*WO;YUEp7jP@Al{NzF z=dD?G-~IE&-_y8G*W7Qo7g6iB?pVpPMQhD(+ZVrO4m;B^-MmsMZ=BemEM({doh2_#Uo2(qi(m&J0n|= z_#!eDQ0J_C52aRpN}%FSQDe_nj|ZS&%}pRfP7aD02^(a%Gt%Ac>+zs}@aZ*!|^^XjN7 z`SS;lduuoH$LG)OxS98V&)0A2e?k__y4)2tCr9@0mg=P5gr1#pEw}#No4t2(@|j(Q z!u3u*wZ5J@bI;FywO5P%{aN1I2IttV8(sAd%Rc$>xpwu9p`GOic6V4mobkHqPLJM)u%3%T*PKjzw<+4@PrITYRhM>UlFZ#U z&kNc;sbT8ZOE>oDGv#y%&QZ~o3tK3s;$nLI=xGU#|Ml^0K9RHUY%*6jvGO(#`1os8 zy!o@F^Nt^ud0slJ+URJkoKst6ylndmQJ$i0d z&Lk-*&PlGePG7%lk*_;>=%{I*<+`6|E|oWJUyu{sQ6yz%8ZBBVFKNe|`wC%DcXvG34Q%SCJ_YpmFxL=cTy2 zss}$`EK>dz7BhF<;)mToH|Lwb6QAYX^}JC}da3YrYd0q88@E*i`2yoR|3u|1t}Nd5 z``4di-TBXE2l~Ej{pjT!^XlgG-meA~7bPAoShDe-!47xU-~)aSrfw>{W|s9LvPZfx zzAAZ2!)p5%ucb-@{DqIMyDu#LRo3b3?l+I?vjl_o?Xq&=c-LDHd-BMA_xlCcs){eU zym8!_F`?D$tMYuq?)S0pCx1OLe_G{a0hcd1PgE73NY$0MIo5qJkLmu9pKX%BKL6-e zw`_^>es`y&75bgBkpdA1)i+!-I9BEyTUd~kbVu^XX5(LpuQgXPnVqS-#=YM7IP8MucQ2l6RO!83_G&}*w_b-|cBh%6F4y@lGZ58!m%^PI?OS6R7u2=A`{L{`UqdRd zZGEy1MU(M~U|NqMW`q01jmUmkoa7#Q(vrIH|Lb@mfSJyL-(tmOy4;&{J;$}jTs5}wF_Dq=YNdOR?_PcXpp4k`Y2jhlqS;&bzgDof}7`}S~|y~Mx#Y5m9K z^X>2cjhj68Vn+S#>fOaTOC&8!WlwMTC-`R~&wAkx$uF)Rc#&DV|2O~d&;1wV7KvV{ z?b`e5U?pz@Z+*u5k{_%x26p=-O5SfMpT2%kc7pxijI4z|ZKs}eyimP6_Yq^-4g1<3 zB_{Lv7yfVjp&aqObI0tTb_bVaFR5tS6SV2wlCws>I`?af1J%4;PrqALUGUq9C&9vV z>tfejp5>=*9qBuK{}-=*dC~K#+=DKoz{@>2XN3)|^xUv;hQknlOyw6xL z^^3y4yr@2gCD*o@WUX&vS2;2{!Of)J{K;NDz9|;|jvKq$b;5KqM5Y+IM9BSJG+8$w z(#y`R%OLH8`qS14US9qk6VCg-U21pxh-}@zH_sTh*l#^I`=jBL?-f^0GCnU~rzU9S zvh34WW!GGZrl~c}8-wMp=UlL#v;5|+#B~w-HYn9Ol{ecPu_{?PXFJ^JojXA}ds9|f z#Uusps~TeU9qUcIGkv4#8QIr7XpSsvJ<$K}_n8m3qa8aubIp6|I!$IC;1y73KO$Et zbu4n-M48NxyG@0Rm7g463u zF-Hr3sF}QEn)UgmnVAd!hEC75I^M-!1h+7=|Bk=(WLw{}uiYP?rcN?d*dt;kkaWiB z^3Q8#^$)@YdQSDuy4c0bkrCh&%>95NekO}pd*H8qQ!|g0OzBKCFgbQ0VXc*!(Y^w$ zbxr{$nXL|C{CfIFoqE~Vv^T7XRouzJ?#FrY%?#Xg%r{xQW!!1n#&>tx zyQv-(2KzcVA4{=v{pw%&K+kQ#e24km9*#O}%Bi-U51y?nu3FfinZx=_a%TIH)t6h1 zeJ3?O&YN=CWR{D_>qwUq%NMU-?0Q4zSi=wfi(IQGK6voxy_(3D5dI_gou+su8`Ztk zoVU?<^Kv7XmFdS@xzx6`04e&-6fIGzB-C85y ztL~;Q<+1+G?!|A!7X3d|&Hr9K`th>Fs~gJ8r}ch67VvUy!pWo4(^AZg*<+#$cb8nt z&z*2_azrh+%iq9%_g}ty zIB=c0dY<5k={uFm|IXv$*z2anu4vrEa>f6ry2pvHw>}*T+OucFhFu%BZP-(?aoevV z$3MGwY;aigP(7f3=G)##vvUWcY)<4o3Y2cTY5bA%0egiNzx|Rj1OD}M_?%^9rp~^q z!FtUhD{8lRhv7bb&idIcN)Ne@`1B`Uc@*aS+sY?dNP4QI-p$Dhr%oLB^`&#Iu+~x^ zR!zVA;)>I}RBvT)wj5QJxPNH#tIg`?rZbI1(pBnP32ntZt3>S6)6@6%NyGtRjACL#MhT5 zqawxa-P?BVe=W;({ur`)5E94H>Z?|*#$=VRqfD_*V74mTqVpVZ^XJMcK6+-SFav@?;OX* zb3j%7t3QL#Ezj-!Y%w05x4+jEUtFXAV?Fn6?$Fvp^)=je=V}#q@9|sz?N`cl^QK(3 z#}@^<>#kTBz5gbqcgm_ZSIFk-B$MaMQ(~UAU95LoegCU;dXh}m_IG|6b<9x_o!;Ho z9tA|!{Ir>nA6Sqmf9>zjz41p(>>jb-_`m0gZ&BSnHG^$p7Lq;(IhWjKjG42oyJ<<9 z*88dRzj-ZFQJWE*@a>>#z_&As-;9zAMY+~bx>$LcH+jMhi(ZE(=`UBWUQyQb<)E&! za?$RsAD`vo@OX&Ww6oS2s7V?-ln# zk%Ydej;w1E8mSz+t8Oe4%k*K_363FyQX(XOuznau3A@o zhyS#`Tls0u zCu{2q&Z(OxOTS+Kbf?erm}$p1>1>zHmjBV%qRSI)@A^|mR@FTH#gm$>1c@1}v(!#G zZax;dAYiHRu8RvZcqg$qaw^1i{O6yt?90O~tAd_HP6$#ptp50-H~imuzgSrnzehKE z+nsyjuix?C^7q#R59{12cHZ<7;s0z8AD5jhb!=uQx%+oX}Bi;wGZ*_H*Hyre6Ymxg@d{xj(# z!w+56(^n;VjxH7}P5lv=-M{(y$^U(im*vL+R>BFZ>Qz{>vc%+yTzBg!-9vjQmu7ppg*iKFn+_LF*)Y2z0mjb&)Sv&Wd z9k2ZO=*+i@KfIegPx!M)t&j5L*mZY`_l_5C^_|nio3F8RG^k`ZF?-$Z-B=@M9bva5 z{fO1g-03H-2Kg!))eCJEcvC@k7GpCh`YwK-kdeHf7&B@RPF-03G-<}Ir2VY*SnfYC<+8?u9XB*0?`J*yWsvh=lexg=wbR#{&g!2gH8ou4M)RYuMi1ThF>$9fvT z-}zko(a)xZri=F(zTe=Q|KjKBNIlVN^;~OXh1GjLiu0UY&(K*|(tEh9O#5Y=KbMf< z^-0-Y#XsyD3U{17b;Y$opux$W=@ZA@tuv?3o*P~;E#`!gM!bq!8uvr$J#Tu56qvW?y8pOsJ8md^HrzMNw_s!O9_5^bf%Gzm*01`TZX4N&p5oQ zoBZwd##z5xFHLk?dBnly;Bw7OY5gPe|9-Y^FaD7iYkN8TXzMEX)Go(ag;R@5_8(bg z=r+SlEc@iUS4N&&`4(KAQM8aN%+`UyZ>c<;{W=T_n(hf{|o={KRzNN zDz4=3|LO61|6cz8ANud}=M67pR6GLa*r-ehdiwO|t5-pnt5$EC&=KvucVkiihxXI= z&FA}GJ8a^Rcz6Et|MA8D9)EmMRmbrEe~5eiub=fhH*EWM$@af@cD8r@y#MPz&OfuV zVy5cPuZ=$OQ*VccsZ4xvv{Ftshx5;kV;r(4RTES1#9W(us(972!}}YB!}eeBR{oy7 zBju#12)FQ^JBemLW|U2Slk!0^@UsEeFW#Sj1?vRotP={`RG6;vBYEEZw^4JS>DKkl zT+l1J;(L{50w2%Q&rjY*g~j>XI28Z+SiRk!?YMJQi@$ELN^8NQ@Z0|$cx~vh{qcW( za0l0Mt)q1xr=}A1>8;?>duO7Ij<0=n<1*(8o8(Q-|5!GpOjx>q^6H35 zwMRD1yi%K;5$eavHe(9ImBXSUz0FcmhYt$aaP2X?sITk#I7#gL?q+E|xA-`&$~|8i z!hLVdPRLE2^YxVp-_gG7*~jhk&pIC3vFz23hiCXE@@*?#|N2M5tP7J@NQM=!u)AV) zRk-u>h8qd}zI*xHB@@s1d|6%BId{u#!J4nteq!IR-{wDRn%`S;;D)v9|E(NP-rsxs z_J_5x&kCmFZOlxZH)pOwd(ku7 zU#e_6)5jjSN7MgWo&8)mX{%_^_7{zJInF2EZtJrz%uYTu*=%-&aOm&LZqvP9FI{ka zrA1owVzU`R2MXV9yT{;r+38E}7PkM}HQp)wmbME?+G2LGZCc%r$2fT;xd& zb9Xs9XV-Ct3A=dtJ2~Guc5VJTscYh+t$M3@UHV@iy?(W=;jI13dB@dCEuXuretv0c z+une`SAH*={n}C7={SF%f0pliTla&!n`U2sw7zNwkD=@GdCc#k+C$F;-q5*!+Ln>=1wJ)%`sCIWhhDdMuZ|yQj42Y494neKJ%1LezU#wI7{tSoXQZ zv0buo{wb+(q3GR3#hK@CzQ0pzmg%#qNed?axv7_Xrzhm!1+#0G0_H)2u1Pv~ zX7{yBOWqz`d3F7_C4FXBt-0sCO?X&(Zq~d0WOth`SJR#oEFXiPy<_wFUh?B><_1w) zd7k8p2hV%FUs%7H%S}1spTns`t1d6TYtF8|`}zBOd4D%;-M;^8RlRu3OWjXQc5~!c zKDuD>I{B#l%fm9Vd9o`fzj)TDGrRh5d%2!T!)Ku*A&-EqzhE?S6!NQXjfFRRNT318yi)(F6%bmm-z19 z>&NeRIO~MJK18E)qO4!@9YIWot{; zu_Q5H*(U`T1Gd9$kg)8}`$C+~f$t07&# z@Avn^dzF1;qMR2V(2|{pLpPA^=1kwb0EdNxDTc*BS*vMM_#vI=om^8T9s@~Xrq*HeyXXRTCJtLfP298F4f)Qet8HbLH;!+D=QCiL|D0FH&+`dGycUr%R?@$g|t};gHG< zk<}8>o%Mfb@a6?X$GDg9t(2Q^At+naUDGlBXn@!ppLHugr@jBdo5FQvi?g4a{N(JA z2Y$0a{F`KHL> zZ#gL|n^an#NT=WI&FSHsoF^P;y8qvuOY&S#KFp5Lsr{l96>Sk85m8`xEGDhH*KUhD z>%YSO2!$s+TpkR&{>;cNa+)4}oU3(BZ*mu>1*2WLJx}Oeo}S|zjpt)^ayTQnuRZsh znzQJMc&J*(tGIkGRxg|F&Xa2YxUy&G{+j>%U(Kw4FkD@$#oqth z9Fo|2#9QpZx7OgvZku)F8Ji3ims6sa08))(hTwyMAVey;WP+g~R6p^xlm~TqO;3p`X7x5cZ`kS=JZTt+s}iGpV(;@aRhfBl4@M^jpI|% z&uUZ6RquJa)#X3gT*67Nti1odj-m)B9KIi)JIScQEf0$Hk$#v7BzKMSL0a(&poe$IiH4eQT5NV7OG zdGZ%E$sWbqj#gP8PoMQYd%sfFp)UQx#z}Vn(|@_n|E&F3xXww;$eUT2@AvPyhYu!x zIa|wcZSr?UZ!dR)>-mPALh?1At~!?pO~~xrxBk+;t;d@R-p1wyPW-T|JY((6#*^_r zU9#(s^gEy64ZE)Ht1VNwaY;H$#MQc6wu13}2Sdb;NGHGIl24nV#<@7SD(FFpqWJC1uKn_%7k~ca zJ8y;i1k^O2|2iJAy@JoJ;nSzJ8LP{sxp&&W~IV#i_Pe-?Fe6;+n)Nw;`qXBuV|nBw*whkXKj{9NZ(ZV=*X2B zY-}Ev(?mXIZ=@IPlDX&yKSna1@S@USC!ffZ*m|wxMJjZMk_k86@ z=(r)WNqn0@0Awx^kDLJ?IqFE zYT4X$i?_^A<=S^I(#Bx-+&$lysUFX)aGTVy_@47yRZ+EX?b{ZH?6tfYySPhq=?(Es zr|P6p84PO z8+Fgc_V>5RTRr@+j^pO*<7HY@F46dHb8ncFPtKdFr6TEMXiC+E4>dOYfNQeQ0yyE$>U^Q$Fl ztwqmXy*2z3!o>W^>UnZUsghZMz$uYc?O(RslAfukxk+s6qi+6|-0#nfPw)7l^&~R% z_+*2PhE;zoJa%8!WfArNP<_5&p5!vmWu9+eJfAFVFlS|8W2)S91tH7+J?v9v6uqoo zWu3CWYOCN{J)M?S;T4B$(=SP-ojhJ*uiWWI9lat(2lqM^UbPofXFPYnUPrg_ zuKCwvk2gjiV`}l1ZS5B;5b>|spuokrYwqV)LKj7D+$xy&t+u)4Y_g?p=uF0j#jA`z zC`YIZug`DUcAfXi^ol=O8xQY(q!m+O+4SqOQq`9WD%G>Et={IK@n`jfb0^By3AeMY zt^88^pf0tD@tUM^lC6WDkL_+|y=+y-6_L6O6>j;h3MTGf7&EV{1*z{mSsA*cKZ`T* z&NJahlYAyIbLpHET)8}`Gk-(I+XK9(pYaN(h{>lP_PMCKnpaqEOY@BK2Xv=Wif4=LwUCj{6sxd};r|pU|Jvp7zNGLE9qUzgyM{!^RNagc_#eGy<&jOv z=awsMD814ADf{#ObM?mh9YMUs`>Z~#PW@A|>Dz?q+;11@&b;MaAQWPA>VKZw{oO|L z^R@guvgWeJxo1^fo4;-U#WS1A^%&Z=FK_wnEYp4ESWRN)1oxR2Ti+(W%YL$}ZNbcg z^=lWszZGoZd9Fe4Z+n$v*oX2zLL6VV#wav6dX~|VrLq@N zF06L-dB5(8;2xuz6ZPALx{e(*x_+ciXnutD#XBc7IYsmzlpH-9wcwuO!-lm&{DIGH zrY~;hG1;8QzVxDkgJ1Sympkr}bC&MiU3_@~^R&b*>2oe~S_-GHyewTlc~73>#)}+R z_Gnq0@9SQ4NVoeb$K0nEu1ecjZpztQ7SQTHH*4w-U+9ojAv1Y?XVhNtCJAx*Q*{{`~EIu#2!{GL@zt)G!EqBC= zpU;f5H+{~$M0N&$&KBDj{hJu~tTB(8bnIi!nM3jC*NX0Z{E__`uO>rLW6vwM3WL>I zLVH-49NQ90oYtORm4CyVd-jLw55}iLIod4^JF0K~)!3FN?;~Do=*Mf{!p(2JA&gO+ z`%dbFxA}84z8dSNWyRlFw?bOyQO4QcbAg8!^j~|l=GZl%&_wGz|KBMOuDpJ8jHyMwo9QOsRla?Xqq8FZo8RNw>=nMWIHDkBO@%dAZSldEENe9v zH1Y@C?0A)yZLu_S*@nk^%HNfy7i+F4toAc%EL|NPbnxw4-Ks{0%~uYV#LZrNF`>R- zcFJu-k&dg^i*o0vKhKz(s>$T;6ftv7;~TljWiy@Hcc0K|VqY&}^VFZu@eBX2V^6#! zwx>xr)*77%vGkWxxxjwvUBlta%@gDI7R655+x3oNlCJPA{-@%V+DvA-<~&S%GbKeb z?p}FtX#Q=!)~1zS>mOZIxSjJb`f=Tn`*}AE?%&&T_jt za`p-r>vE;TT=Ne+sV>;^{qnur4wKYWPk#FG#=YnFhLrcssngdg+#d()5=Lxkt_b};I z?~$#}p)Jy@dOo~-G&6Tz<_*@9PHj@jOs!itJY+fZ|8q(9yZT2v?~6a%XFuP1cYLPa z+I7DBX683e-g9YxRmg?awF^Xc9JaW6@}i|^z1=>EuOVvX1+PVe#1f`iJl}oW`gk|~G`Qwo# zPy6nFWh)dvzEke*mdbTahLz?rUdNVb#`StKrG5IwRL}GHqG{~HOdXY!#c3-NTV}f7 z?tbxjd*Cg;tK|xl+Zm@RdAGmV7n|t6)<*i&l0#Cr3(kKL>Q(D+QE&Z_d`;FinE&*V zm169y8=f4^-+p58w{;IJ0_~~~tlieg%yd$1?WBJd{I09NzYg0p_kyKg{v6{riKwqG z%3H(SfBEQ2FElXP+V^e6hkNSM6Yh&|`tkYNL53CW)1Fq9|K1d%AG+gN3rBBzzK}56 zM(Z0>dBe7Huq>%x!Fl;en4{YD*U~c!A}&i;pRN0Ss5H?1+tGy3xf5BB*Pc3-%*FYb z!~THQ#>%^zDJP#Ecq>?<-Y3f+ZJkzi-N-&wS1@|oVN=VcsqxQtT@ao+UF^j!eU|JQ zjB?kr!X$lX$fX1?a#ehOz&Ad}g~edabe)vBInv8mc)vc2?_n#PYnPD`{OH&p(I_F_ z$B(#cOww&Q{u;TzLN9MzlWn>|crV zvGeZg`%3A%Ox8Lpb^q6!$+I#Gi^?-wjVep09=jvpnPUCZ$79o~nR|TSw!K<;GsNTc z%<7rb zzDT_F(_cn{>DKvP-ShrD-ZT5jTpih>Pm*;WSEURrf6mNZ?tfw9<&|%rIWSC@ii{9Q2x&znITv zCZlB9x#RDjd2GJ!rJ2V&!?x;e;uq(q;;DPLKX_>VXv?=$g^5Shi@hSGh18dEi{}*0 zJ08xddXnw0@X2Y9e!uB+UgWtcbh?(bmf)c)!rv7$c=ly`UZ1|WP~Ig^=-N|nzpwoN zPq=4g{BpK4d%oab-1e5&hlEaUGI%~Y%zf*t`m`-OekPjFXa1MfmuuCp!xk0yzdSeh z>gxZyckTI+{`dU)i2t8IB-H<}dH?q0yNmkKzn|wX`1M{W%KG~Jz~;qwCois_v!C&+ z)SeigJ-2^Z?~Q)OzcXWnnWgil3y1USbOctPn{lm2Xao0+S$EQwa2LNa$*l?aEq^)Z z!hX*Sp;PUy{R^0TPr-flGDp)3{#ke0IduOjEUPhY4>*4%pZB@Yl%koRbJSlRJ@9GP zfdaPl;K_AetNG4)Zn*0CO;D%RjUi^%au?}WYnBA9&Mjr1Yxrm5%|l_C`m%RrSKm_H z`g+T4-(RNI9ZaS<4Ea|V*J=ywY1%Sh{8AEgMB0SCRc~M1jSldbm;YW~=KZ@XQh7{j zOxvfwJt<=Iz>9l+Y$2&Q+9jZLBMP{>-r7>tj{Ul=!T@ zIgWq->BWxw%fwRphJp*|a;Xq-gG)z;_V^QokptI2S6Uq<6ewT35+m zBWShp$3FJ?%S}8#u2bK2<1fp?DGy{jmNQ-xUfxvVoD%dYbBd<7vWEjh#m5!KPT!{0 zXcc)bXK-w5t}$s}>Gws4SEqqBQzfC^M$K&9PmhcHsus8Em29b2Fo|mN`!DY5H+S7k zso9E-dxZ1E?YVBvS-t-3+ex~7zicBZ11x7x<&^$PhM#G$737IwC7`S%O9S2z5@9V!MB7SM;8aH z-KtunUBtcN-Q7DJoO*0`j#p2A!Xf>oRK4fv%s_UJPqx3f8yDsZ$IdQGU(Z@!H`S5l zy5Y7X?Ynpvx$RbQUT{c$-v#dC6F=W{o4T1-q%MAKq8#)%^24*BieP8+0tFs7S7+VJ>YCv&}UbGEl$ zf$MVq>1H>w?W>dO70w4(*w<|cmIz5uW)uA-wodEA2;NG1SIpH zI+b6P>QM8{`~Iztj9+zA&b6Gq-qyVQlv9CByxM`nIMv9xDJedYUCDn1bYIA?U$pe| z(W%p)Yv0$MzkcnWFNei`-V+bf-r>&hzJNtWG5bKq|zOEKW>+beT?tj`#hc-k7y^jmVZa;@8<=I8OJ?iE{x zgh_B~{^g$c|LW7J7klwlKzc=0~t4*?gtmFMlHf&<7#>x`=y`GWA8Y!GU z_sdSTo{zZuB(n1B@ra#oW~wIdn)V{+j-=x8b!iOSI+s~9Z}7a4ZgDpHoBKVb5bOQx zAN=~^(5HAds*82;L2;{>J?@>)qx%krUt1UKt)$BvuWRMZ(;X$8$2K*p*@Wd>&Fo2G z-u?6?o1bO%x7E7ayRkMiEX+kAY3(gEv;87>#9 zoZYzlC-t;(hl)(t$|rtd>PfppMQP^*zb*WIVdu*}@8w}@cPw#p$yWL)AZxi{^Rfjw z%efCGO%hX`Yjpj9;M2b>)A>FYCK&$u+?18L>tMI|ytu6NhFyvm_lhfVD|&eN=&`Jx zx>-%@tk9O%hdAFh?OXNw8^^pY3GqyaTZ7_w^L{5h@!)Y%t=O6C#2dudoH=q8e|82rm zrEdx!ofFT@TjIJ{sXAmrz|=D~B9%$UH<%oGo5<=Ny-c$9`^DPi>lY_`m(A(e+OFX< zJ>O9D11Ia}4Z^p0_9=WlH)Z}@Q^QnL6 zRpuxAA1e5>-mf)RpSM}|8~4ll@G!A(F`J+HtR;u)Pu0i&v*)s8{G7i}_B;FEEyCYZ z1RKgDxiT%cDK;8fH66CkFa9-s&MU+HMq=kUYGr*rSc87=|H#4dtw#UnltZRg^Y4Fk z|EPX&%8HNrRn6UMt-KwJ=X0%F%fIwz(F4&-f5biHoTsfgWM{w1tkU<_vczfsYYP?C zjn-bTSO3T^=4LrX;@%|nsdF&nT=(MtWb^&I3<`4Eja>vFv(v=B%l6 zqP4=ZcSe`*L_Km=mO7)^JbC@MTjlIMy$|nAP~Pv;6vGhj$1Xif{l$+U_4DyF<2MG* zh|QVG=v^@Hx#jGH(^Id{oqEmqdH%0eY8x{W|AhEHd2(bwLyc5j_3IB3%zyJ9`QJX! zshIGoY|EBi*IL@!o4mT`YjfYfoNrbC=;R}&O;LX)D9w#OY$$X;sp#lZ(SPi-=kT}{ z_TSgns};|1v^}jCcKyokg)l#@5Lp`pn&YUsr5A_sZMu z+TIiD$G!`%KeKU~pm(vn=+owpEUHgsTYUa6n=5_dOFTV~u zUA{ekm@AgVd<|AQG5_kJ*Ut_{CZ$MLdVTmX*-=1w84KIgFN}Kc&m4$-{rzT0?4i34 zLLaBi;#($Gxhru0N!fs}(lf=r zdOy|<)L;(Y-Mp{jOyRDk&24K^V!t*7KXE)8{8dNL_Cfv(9wXHY?~cpOVM%_bwy61D z?w#|;#Rd9HC%*Y=8oxwZ)Wl$0hJ*R`pJkhuE-l$}vPaU}HaqbAqv$CQ=Oza%*GLWb z&Uz?pbv^r4%(S>b1HQTZ>lC=}pMJ5$vFypzUwZ3Kys2O6yh8Ps>XvJ}W~ZFHs@mBb zTz8~L!tU%feIBOYE0WGh$Ue^ti-=^HX>mkzIdeOwV~>A8VCa;}n$*OL{^`lHgKs`v zS)pj+Svo}_<_5d{-tVGQ-yL6nXhMxx+$WBx7dnPNRxXI2tMc-fXztRlQGU8y=Pnxr zOn?FP70oO+cYAST$nf zqFA1sHOFU7<=@Vb;K0KX!4=^rvEcZQ_ob(A>Kt%!;&>tdd!NI^st&mu>TdTO6Pp5Z zHkg!Dc{x5=B9O)6(da$lgoD12-!VEMxue(g}-=NZ@IeB}h z_GfSX`EvK~#_&|>iroArp?v;T+a`xaFLznz>b^7-yO!#8<~d)H*n*9BwJL&^ZLmHu zMdVG(`4u7$16FoUPg-}X+~?Pi6S}iaP0OBM^^Fbvux_5s=I!2`&wgzQNj%K6N|_@% zQRa|s@yRLkyY8-P?pb$tWzt1O$<6!nJQVbIus)dWb$zee-HD~A=UlqcS0cFO>aC;P zS)b=`N=%P4=+(XU+fi<^<7)LKy3_t=`+l~uy4=L$A0}Y?tiN3^%T+1xV|vxE9~=J! zzKm{}_oJuy;fuWvo_hpXJ-!u9T3@+4#31(1wrf3S)^TaA2#)X#ban1`kLP!t6ecFV zNl8)Bcydnk1+R#yL;l;`XrCEC%xOHkodo+R7S^PpLw6A zy1|hzOI24sJG@h1^;O}RAL|TOXSD`3vwoPAwbG*X!^!J&LbX)PT#MHgh;=>KWc7>j z#w~TGZ#j={9+CnTxotas&${FJZx;WrPkSedmhLLZKfL1Oe|xWh3DRHm z>mO=ppIhlvrnGhb48t>buLzwy>bi9W!-JzquA*Cn8gAUL-dwJ9ZU5fgyPX*#V)WP= z&i5YR)o{6gbkWfaxv;I%Ha`2f{8!TDGdEvsncY9Ft7R60_R(D~&z8Q^F8n`pOT?Uc zrnPS~C%iShoy%Odm6>VhQtwg=bN9_&`MvJbmR(i!jCx-+rR4bBCDle5yD!Y$aVPo5 zhMO5dUCWJ=Pd+*LUHVdXpK*#q2W#$>3ELao-tsT7t;HdaMyPA*c_Xr zAnUxaMKSf^&UdRaC-UZ2b8Vhjayk3_tp;O5Q>OZ)89gqyFWj7dG$i=S-3wBY=lj*t ze{C^6cZtc$dwvyL#@`v$FP1DVcPRG>-5{(u@lE1P55vvgA31^zbKbwbva0{ShDhJ# zIuDKO5$SXCql+e|UAVNl(?I{YMXiX+gktU!zQQpJmuOk=7A;*a-^whJUHCWA`Ba|k zk2}XWQVuLyFe9YuzqFXnmz@T?GN&|7a%a*twtQRH(<_wu@6Or61F}bDmcNjeYt9h+ zuhlGcL!&TLKaNF{@qxF)Q|X5DBCS~oH-2YkYj_w5vRO64o{XK772W3#^9=+%)6vQ9}Q zbAPC@M=ARqf9f$OddtrP93P@v*SHjaakCfra9B(vNICv8OX>9uO(j$AIJAGrKOK}1 z75c#IdG@YcBO{6VH;y*Usk*On;n?BC*Gm5juJ01b@yK4W`nlAC_zUspuAATf|L0Hk zYQ=x8$L1g1I{U$Y$G6EEKYm9p`}12SeQ`*P;{1ocMZaf0eQ|#7LEgRZy3bFTQnSqF z%zXU?K0O)tJljt`?^bzNZ|2lu&;4YVPqpXabIacNmKoaIjQgedvqn?Fc*ozKzDLT2 ziWWjYORfI=5ez#RE;O%j2J5-a*13C9PoFM2xsHkHx!cpyr!}h+=ib`ydnr8llkxe@ zzBfyLc1FHFap#Eqq(??Zr)-O>G-o=vhp9^LU#+?HVb7Ag@{=Z=*?a8U-@@XrVpC_H z`ES6g#_i=^_cUt4)ufxReqLYoe@6J~KQqpUe4c2#NY?pf$=i(+%9~3CF3Z?8{1xc7 z6?_p8uz#Ji?lXqutTe4+_s*kV8y9+XM*jP?bLph=*HY;pb2Asd_!0Kk{_m#iRHbo0g@r$u+wjtg}}zB%V3+V#Cddxh(f@r0*@ZeOGT# z8rQ(NHQd=*!(}URVJa4lz zY(9P3M)IX{az;;~@rEO;@47gXtj;c2ex%&@-7%e`UVph*j)=*bvK1W^oZD^lQXB+G~E_|@qLQ<6W$E5 zoi7Uvc;*(02o!1*id+xt(vjN0Fze!!%S(TiFhA;PPYa1ja1fTiBqt?c5jCMpT(+#$tXFR06wv|G1!er`(CdJo|=qyN(yDt_s{o#6P!yTHu6kbjly ztK3Z`_KJ@uq>B`-aa7ZG+x_$BX4%g_?(|f$>`hn@F~x{&XU@!*Zi~Vu#~(ke@?gu` zTZ`7L^PI@MTjqrPUm5=Pd6xgasLAm$sC{9Mo{}@A>}6zo?Uni0vn{4d{kU_9XTwrE z#&0Lq8a&9^A?b1c@w+37fAlU0v(;G?R-@%K!Bso(2Cv*|$CBL-)MJi4E)w1nE5c%( z?IF5(>-YYdua4XbnJ2i5SIOXDiL!(0d}+PzZP_-5gOBFFp7+Pe!T4Ojvyh*$Z9(ka z7c51E&d%l86i^bmSiiN{X1?ewmen7xeV=$kPpvP5^UDjy150FQ3LJV+@^2aQ*_rpG zR@h#AdWKgoQmSvqqS=Xmo$i(&xYS-Md8G4jcTW!1KH<^Pkoj7*E3bH*`>$5Do%_6H(~}8K z3{FO$rffRx_rbxyonL!68-h+~t*0(yj$r}`umU?GG-?2xF|@--8U z=j;f5Bk7sGO2k9G(K)g1Mn{M;}as1`Tj-jY58AYSs50?cVV}I zkDc(1!WHjtyYk72bZ0cibf~E%W!edPJnI&}vCp+^XZS@W&DUO^xNdxF{I}!!=N;@` zmrNx%441}p?@z6$WX{yywoub#-|NLQPyJtaq-N=E?$AA7sutCH861g^OmOkXGxBfJ-5FQ{T>xyY;_;htu@qE+gZvE0(u8G?uNX6nu1-$Gb>-;*ZChl?_ST!d+k1~-)>y$zx=sgcl|oO z%CGX_VblJf`TwW%bA6!Lr^Abz<-dO`KVN^-*6N;h#p+49TcbWpELBTc{4?f(kJ0s) zO9Qq&Ge5Jn_2%OKz%y2_;tg3{zbo5MEuMG7u4hI=K-#N@m^~LB_ zZ~T3?MeS3sE)88!%iVqYzWy2=UESjU^HefxEaY`-qNXhM-6GeO@Wp#p@3F%3z8lW6 z`*XGYJ-GIo#NjF5dqQqHO>@@f`yaw;vUKjTrmb(T$8V}(PRp+@X`14*&?EE9>pORLrpDT?IcdSZ$AYG84!YOV@_qTPya2X?4QdnItsTXtO;mp8 z@Gti1oP&{^UuXY4D4L=8T8p>w)N;N3F3OY61u@)SB<(HlsS@)n#J`lU?t%fPv7Jt8g z=d+J`@t@_#(iBdxf0`_=ufR4nR3X5vMxiq|tM$rb<(3M|dpG1gn6G^Czj5Mr^Xmtl z2bEnWoZG6xA;nY3F5Dgb&meB&<6Q^i#o9OTV3sno-m96W$jB+M?Sbhzr#_u?F2x_~ zn|^q78~a~nQ1sdJaZOYQZ{6ASwU7L&cAq@CeC@cex_<>p0) zeN4}rbzZ743G1AC7H*)BGqF5}BQot!hN;ONmal@red78Xgk631%uKKj;1}7hy*rQP z?i7RnU3n8tJkGOOuq1#p03=K4~42 z{_(uEB=U&ypKI|8_qN8^MSLt!>tC$Uv8B_}V0G2y`;*qp|I#PgT$F#Z@Y1ytC5qGU zOx;>(H@~&zn27%8K%*^3eU*~K=4t*mI&GP)W@+(;|I-}#l^j>*vP|RZim&2hioUdU z{;bl8s(Y6_b7bnuzwy_bw?lV3yLr>Iw_8!3t;@e7Fxv$Q+xj{PRf2MrSOozPAqc=0pnZ1tx$fs(gVd&k)G{M@F{jq1! z&c1?0NoB3bHl0~#%R3NyxNKsEv zdYj#n+Ef1`UVjo;wspd-ge%RNOFl$Nl<}Omia6(gYRUAf%7vkewRg?)VP115@5r84 z%_UAZtV-f{$373c?t9n2&{D_sXN7spUFl5|>^jqab##aaKZWz2#Opd$mClqfqe^KJa zyREx7WuLd4H0@5|1eY)&}*|i<(cY43_aY$Jy804_>{n9l-F0Id>aZPP* zJCIN-Eh0Ll;lVloZnk4h+%xLcL+XN(zRuaecWlD8rxuPUeeW~%J&}F#qxV?Wuh*<^ zKWK4k^ZUBaF=o7(z2#+@=+?Ut|2y@{GfxQ~Tl?bS+Un#@-1|Nrtz!HbRDV_Xh_UxR zrQIsq$|5Hye|nx+!)SM0>PRQo$9vTk@j8csKS}<5TlG@z@Y2KgJEJ>I^t_U;ZJ5{g zo$=jTnct2!%Sy#MkDF*e*4d&Qz2-^i<{NvmPqef3g^17l=$-N@%GD~y|K0}HHCdDN z)i29GQJ$XW`7O_H&lzq_u{zC_p^WYktr0ipPkTGfbp6gBMN?9WljBVCALUe=zg}13 zd2dDa-KgWsc1&etZ@wyQbXSzE$)fJB+3t%PA%eSPOqZ1|^b1s#=uk6Sm{n(Yym&ve z!0rPfv0?4$hKD7*;-;$G+B8_l{JibtWoqnu=8%p??dvbBFIGv}8ELkmyZGH#pRH092jH0IYTEB>MQ_oz-x_9rCgcb6{5*K>QJ?nWxaKn8T)EWYn$OGyS1Osv^^H&P(9W7U;&30tK$q4gISYLxusQK=81LsQ5M-B z#T&lYKSZ(B%JpM|b=WeKuJQ;C&DSgY+7~8r$#P#cUu|`L`5d#b($-yCG19B`map}T zT#^ms#N*sIzQ;zrL8ZO{d3fv|89JqtMT=q3g0jN_djsyPcVrZDIlzNX~e@O^UCgo@LJr`L#E- zRtb4!H>~|<{EN@N?xu!DNWSl)wdegCqg{R|Kfh*ho$0`rnuhdO4;Fc`^R1j!TI2RG z(w>`Xbw=y6yP;-NoQlsxx@Gv){}WjIVZL2gyZhAiEfrg4?%S*3#CRLeEbch#4hb+TH!hQDpM9z1dpxG@TMJ_@BAQR>56vV64=#@#x=mGtz{3kNi*l zvTd4n{*~K~-xhvNk^T@6a4N^mZ07a8Bl8Y?QJwheQDgS5AJ^A=#>w$3D&3nd9{=IT z@A%rFKk2`CQo3Vu_e`sa|3tIW zUU)5R%eeH&r+($O<4x_Ss<{;(a8;LI>RD0P5vX19TdFxZ{g=pd$$-OkJ)2FA3CP%L zC-6O=^k4S)-kNt#{~BdC?Cq}k%(|=WInO`Y8=f~if7rUKF3++ve?P^%%X-ENS($0K zZe8Y_WRcADAbyh0@ynt;f3t;x@0eXV=Uc{}Gy9xG(2k774aZmKt(yC!_e-~e*ThY^ z-ZS!)+2;QJp}g~x!>X$b-nU0H-1{)~il^oAzp{mEHc1y6eGa^38Fp~}8}nzUZQYy% zj^CU#=TMYaOxBuqHy3}oWSKjP*3N4r!13!m;H$cc8mUx6?ybq_3{4c zVdB^0c743Rn)}E5`5*7c>;J2M|MuU#+jl?9Z@>5E?SJRvwda@rjl1RlOi!U+(zTlV zV^;K>zaM*dtk-+Yx50G!M_(i8tu92K)j^2-(f zb!<(3CwXd&Fx&I0 z7qhSbW?z5)e$L;&f4BwZ$)Ats>}=9GFlkA-Gvn_$-FJO?=k~J(yng?`u4Knrq5bS#iKnDy z=ymIC-m<#$+O@wcYK(Pv{}oG9zW4H^^scNkAI_~if90HynTCW-&5xM0R3ZK>&eXI1 zzrXmUe>x&_a!&ERf_2+&O!Qqm^{dhYs~0S}GEB^qn5Czc^f$iBQ@$7)8FsVbNZog_ z`)b!Dj@Z?+hnmm3vsgDo`dz}C&W4$16qyyy>8+o9^YQ&q!8&YQAJRIYFB{b-l@ zGA?V)f}9`DrAHK{Rd4hh(~@%gaz{`newu~z(gW2O8rKk-(FQ3r;5&fZJ#{K?z z4qb}b-xcEJ_6E6%F^McAcDY zYDvEjZ{%8@E9{5w%rFyXY56Yf7|#>HD__aV5w$ww*Ix z{cvGEowK1ort?+)w9*qMs~3KC=rWw!G4+ayb>{V}Vkge5ed{0>v)tK!^J-45DU6aV zbHr|~(7iM5!pBv7&GylZ$IUdGeisBh{A1Mq)#~kWRRwvzeLsGRKHk&j(`fUQZ)ZST zq3bIXh21MEICB>2^e2Zm1jn98vd9;h6y_>(S|xA#b2G&d2I(1}lM^p*OlaQHI?e2( z?0ZXb-siXH1Z``LivAhzn7*i}^dHBqIZO0}A8@}5Q5E9i6kb=D-?r&>)XGIaK3R!f zs^WjCX!=BRb&=kW-xpZa+?bwy?|u0+bdS>OifKK+EEYO4rKU7hUEsFb7^BFVeW4)B zIo9MU!)eVKsUdtj4m8C_9=#lJYRQSWE4&Kj4rFWp{J6l_%dJ@Cc>wncy{{Lg`Ky^3 zl`Lw-LxS%~*uJm~`Z|N5GWX@XhYNh}94?y7v55O)eLMScbyI1sJ#i1(-#*=TR&$qD zf`iLFiTTfdeC*+qa=w&tf8Pa1b6&j@O4BxJUMt&q)9UG*4e5S!gg7fdOq90zeMftK zOodq%Q-^%;g**W!u8$0{tQU7`J!(F@@XkS#Cv&$*-^!m9|08MImuqMI{GN8mA5xqh zYd=dzEOz6K>YuqySx^6;3$l2(=TP(?Rlo1KHY)Q2hrg$Hul8oUx>j_Cr}xA|H+qgg zVrjlPd3icZrR%q;KLV5j0!%Hs^FP^3gg^4rJ7N97Pm;A{&uqg0n{_?nPYXTELys+Y zZ>`C;j*5&(P+h$4uGkIM-sqx@4L^gwE1o>zCu(r((aFgFMbhC_U0;v?0{eEFw!GQChx4HJ-5&o^#Sg=Y8L|*YE8+d*}RrHqWY| zrfM78)>6UeCwH$A_xs_aOBhz6Km2>2EbW{Mr9^uH5!X<($>^_8Y=% zoR23Qub7d-_dh9Y&c#OYKgNGoF_)+qM+<73I_OOfe7;L>*|A3^CD%fjediRf$PVDM zYmqJZIqUk5rsJ=+R%9h`otxp=;=sqd`DIbxtcKK&8lEZ&_8Ldbrd`XOGka=a`Mx;) zS*@`tn{Rw{oEsG~(dv}=@v9GOZL-dDFPUC7Deu{;)0m^`!O$GZX(F zQ=PDBMzRVg)V2$r{U6Np_w}FkpTAzNKR17G#vd-z6@^dYpG(jFrTF*b*&6O3=BuSY zRb4dStP%Vm!I0Tv_IGc}<@Pq!wi_~qZ@%AhIwU$*>+{s4o4Y483jel`waMO;*;uDP z*Yhyb-#9zv_l<{o1D-CC+oc@(E$QFw{EJ~+@1pKn6pQIh<9hXR_H2u6w?ch+m&Z1Z zR$du$vV2wL(=*p!@7g!loGVoP^@lm0(-+H}(F-s%FWJ@XI`!yN*-MHn>n0vG{k|+C zF>&24omek_^XLxE>gmxTGuSV!{pgjoJcYYNM3E_^qIABa=;DO6LI3X=XDQD*`n4v} zZ_DN7J9lg;*s$sh@cI_jrkJy>(^P#u$MdMHaC=O4qN)HpTDY zZ_IX_E16V zc4u8$UvN)$g4sWtzx59;$1mCZe=^ITi5?7P=~I_#9lu$dxk-Y_I0JKw{q0yN>BK%u(seGp4`peE4@`?S}pPch_zz|L{#hn0?73IaX=Q zUH^IV6gDhY{oSxz;Y(bsOu~<)d5($xyQ*K56*A^BJv)7P?feV-tDe?8{B8R4QNimU z5ql$Je)-w$7c^IPiegbNJr9`r>~33ybzU?^3K|J{+;6fCME%%#SiLVI~@y+zIJx0>8-Ev zyQ6GhUc0Hvs@kLyF@5^n_9ampFE%WD=d9?WGgp7z9-H`|c|U7%pFR~~C<<}8p0H}g zo9)cUg4fCWlt-@UUZACp-h_c$hbv#Qm!*phXV&#@b-2RvH1 zqFa&OuIGK|>9P{N|1RG96#rPdvg=wd=-PPCXo|$s4KkKZEz|tU%vqve{YbhZd_-ff z)A3o4=Wl;DE$n*M8^0?Va~MxIGui5J{>$xU%b5`wlf9*_@VkWY^hW)YO%GC{_wxoF z{B@|0!=d?EnYyS`Oy5neyh(v~dfhiBL|2!K{Ac2OzGRb_QCvPx>0176#}>c-*>^?9 zeNxb~wdohPUtGB3Gpq7kRhCN&CHOW4FaP^OOS-4s@`SBtRVlBg%ZeY2Y-c(StFNdM zaeiSqE049E;V$n&29^yc5=#fQT+i!hKq>$@Z z#nZQ*Wykrf6?85!++(P6%=;(9!8h-}hwTT&vr-!CD@3kU2RpC)%hsiQ^rBz>gvGLV zR;$ZAU$p+BnX00hi`D|AFQFedE>A6dUJxv|x4L@M_q6Xd)&Czz3%nUsQE(YuZ1ZluXc8uZTbC@_thE~V@*EI z)V;qZX)T%2G<9czY2gd+3wsSWasOt&9sT?Hadme0M`8B=3$yd(9UPl(CtWzm+%%iv z%iM}N>TG}Je|E7kon~tvJ)em+$&W`<>vNIl&CtmZurD;qf&Gj&cCAH9XU%2Vh4=O%{O5OJNi>~^~tE~Pn$ z+G`(6%!_L~xW@0p;`3XiBI36?noiK^SnXDO;3l8qiZ}gpSTuIFADeVdp~ZUD1J<20 z*RmTPc3-}-I$~RC&5tfK{zUIN^$*{47%0dKuUgY!)DWt0DyT>MsAkE9q@N5wU${OI zo5(46MoHUrqi8qx3FRpNlB58cnKFy#ul)N}N9 zvyL>sVtm@PIv2g>jk})Zv@fh}wft#$x%VfV@O^u>N&;xvE!vJ&)yub~Cdx!XCyE6K)wEC|zypZqXj)(5rt`Qi`GP zEDVq3u~U3(BgQS^yl?WfNQ<6xyua>>aR)tFm{MGsmT3BUhq%nQuP_9opCPD~`NPiE+K0r}5=p&u)%n@xq>Otlw`4nEc$ZCM~37ZsgoAsZyfv z{j~pT?K3#E^XlaXf78r9zTZ(QzdK;pnUz|K$r9IE`8No}tUQ})VzVSLE+>NXPU%K- zmfpHQhI^a77|ouL{>phnMd}i%K;wi0H^={}GoWGO&zuh5(ea6IwlInAJ`JZVY z+ZUFwJYs@My6Vm8>CaTSC)=~iU9>cvwYxdMCvuMtLAFK|ZYf-LF znSQ%?)-!=={xwT>b+#VZCwOx6!ml3R(;kIhG2S>SbFR@8sq(1@cg$IK*Vtp1>nh0; ze=K%Xe$UH4en3y(rzc>_`jfv{Ggp~+mE8DR&Bft*<<#wEc@o+VC9J&-OEmM3SQlA} zOW)>r-(wZ{)xciv+3Bq(_sHp;WD@L1`1oeku`L=WxjeMxmj$pjPAL6h#dj|#DB>Yk zqab%a(`&a4H#KI-8y6QGoXsD#(_-xjn*$;fl?_fwDrsNfJ(_dUeDemDHn*JJ5~o~0|u)KhA*1wE8VoJr%oxJ z`OVGKO~pxDL?@d=$;Vtbq3G_Ra*vrgo3`Xl-^Z<{`&=oopiuhLsg)9D3{O2ReIEST z#LdWY%C&AZbqq0-1q9Fe7Jzhy}yCaudlv@*>^fwys*AKWq@kq*4e&hIlw#7Tj zPvmyBT7L8|zatnUo%Q9R@`qnnE!hQgCKuJ zS0#^=WRybUK7AXlss$YUSE~}eR}0)~Tc&v;;=x4r^YW?oJb&Fe*A}jL*?vmY!QAtM z`?1uSM*`+``!K3L^`1KSiVxq>-uex*O->~=AGo%{etV+A$Eug%ac2Y`N=cd~-iFoeSL|bn;8) zrrkOh*8JAGTy(u@;pvWr5!Ze({a09$y{caI)>c8?*)HWPS5!{=a?oADMPOdl%&6{V z{FCboB6PpHo@=*k&RFRb?OOJtpDUihfmi+6rg?|SE$Y92`+9KqcI(~Np=s$1f7w@jHk{jX zD&@+hhi*B09-b*#Wo;9^{)YIv7mAByR9Ag!vGiKrGH2J!fTof~xxv?Osl5MSR^er7 znXh%>+sdXyR>wk*)RaQiUbm&yCk}Ei^?1Bx(bA;2ldU>4HcId4SSuO2Cx~~s#tXK) z2{k`M_Y3X+(C*{A$XNBoohf0=H~mdHDg&y7zaR0+_xa2d`*&+s`Tl3CG{xCB%Q5OK zz7n0aa!U8%*hw>UgeN&W^iA1T*Sk~c%@i3?zlql#c=|o@h8o^V`BB8)vw350f1;)OdAa*dFSnL_JpB0V{v(EKPPlqm{5rOd$$I)D(=BKG zbfx(h7Ui@5-SOM-U9w$Tr*X=oDxJ0$p`ot4drf#G9`#>eUBCKU)4z!NCSN{_&X7lj zXMg{1eJUU9m}4lm*-rY2mcfFn*JKlJPZzn}$F@syo9nKRxjW*v-paUJvM2EL^#Hs7 zUDe+_Q(w6uSJ~cwW^t1kK z_?Wu6i@ovv29we~JXz05{Fih*uMh}Jc**8`^aA4(Eg_Dj(&k$tzaA9$ddK+Ajth-D zIF7VWx$tGr>d-6Of_Ic~i2Gj5ox4w{-s`>Szo$EzlGT@+Zc09AYamzlQ(q~-^ssZ< zg4fmA!QB-ZCk)?-E|YG(8TqqGJhSA`Vd*nEJzq@LXp@+F{aM%`ED$#T47q#6F2kL^I3 z+i10f*#CJo*?p?#CC#?l3(w|+viB+Oif(tE-+j#I!%7YHt#3E0A62spns(ucySk3i z$J3Im%k&jZJR7otHY84HicEOXm9V)^`dX-ciml>D*RxsM^3=}H+ox(2Fs+0=WwlGx zT)_$c>i=!s*w*k(J}GQ?<>|din?IdRFjeu8`L`_qZ|U^2BFq7Hy+bMQ`m7Q`&B@;m&z7j`s_bIebu@T|)s|C5 z9ZFLqJLNuwT|D^mz?4~rDw73vzdS#0&$HB+yR{ErZD`bz)scvwJJ%s#O0edS-0*;E zsUrPvUZIB-OzU}%#^-C8`tU|2Ej7qemXowqaF2HK^5R&w;6+eT=*P`52j}>#6%20| zW$?4-%F@r9!SY^I(!PQ5;L>l^Z#NtFmegC?PkB{bF(vw>v*f9ncLTpvE#sIP|LTFZ z+I+sb4kw=Hd3-OP|TV^cmNv8nNZO3m;I(vQW z16%eAN9Vg--T&QaYhznr4ja2z;Lne3qHap_4(^@OTXbSo*z!i1l1JxlrJ5}yxhl$y z7l<4=bzWxHmkBH0*(cb1zrt{bo#lR8@auotP5Tv+d>fARZq{NC%P8L{edp$W)$%p` zH*Qzz*2y#;+}~QGm7F8&$M)CqXK9V*zv}xdWCUv8&)WI6H*$W`v!#`vUOq55lQ^wQ z`rEtwgTH6o_DF5=_P4$EpKex`pC);n@+nqaD6mfm(*`2f5q*N9z=L~qfDWy8?-L^|L)v7=5 zI|TfiVPp3Z!5Sd!?0@dzC6PX2`hfQ(rWHH?k1)8RzH(L_WH6@ zhdvgqI2JGRy)y6dz8pRs9gD>mZY7u}EcIJkd7(~re$L-5yNmY~Z}|J}?7Q2-p*(fD zOIJwk`E})rSH(+y?+s0#ncdaXieRlSV4UU~8hHtiI?bBDF@{2Rk7Ip)!vvg>+z*;hMp$?aTW zl`6ENF;qucH7dY`nn9;ioTsx?S6noo~&} zuFo(l$NCa?+wvQmAHGamy2rpzi~r&2(|1@OxNpqr{>Hwd{nh5c6@QI*0#v-MCI}88mFCOquIDBBIpV#Sg zVV>C^rdTrHS&?#yp4@5-KU zkrQQ^B%6eu=LRoSij-!E3k+&-j5H~IX=&uUhGV{w@#-yJLJIM%H+B}?_7$8ZIngo3 zD<$QWyw#g`jL)t#@PB`NzC81bbaJ2u)4N2+{QmCP)n(h{MNXy3%KphYreLOA(Yx=% z-&*O=JzoNaEp%6fP3*{A$8zLDX4fYzoo69mMP^9e_w{dLw-WF;t=4w(PJ7^_KX$x3 zqW8`Jv**VD%NYx59HjX>9mBekZCLv{!rjC6gNEa; ztWw`;YD_vD4O+6{ejyWPeVVbnljntAPHMjM$EN`gRvOMdKFcJZ;UV9zy9Cdlv=HR8>`?bM$qVz_3RLRiJuhJ{y>S1=iEXDKLn z{%5-Ii8sw^?Ym}5-kiW|Hl^f&=X6EKdZAU4*(Ze<14X*OZ(0}pbc3Tjm+mbNE79_G zlh?-O7p$JDHZ>(=XZDZr{YtyXEdsrCBvW{?FtuCBFN{E@%E=)6GszTe}sj zSMnJiV(*KdrMm1o?@vw107l!!lJ#x!XO=k#{|&ym{j2hv)c5c5{~pZ!?>^%p-!$=p z^{)!NPE5ow8ueI*}iJN{g=FY+l*`Jo@);Avd<+>G^5x8U49@(o| zpV&VIzP(U%b90Q@kyni~YM(jZYG?ZVh4V^hzt4_S`uN9y#lEM)WyT*P^7*%*?d+Uth{j&Gh$=Jz8$O!qL>mbZ1Ie*lsf^ zW1kH(w2%CDUG=47wdM>Tfjvi~BHR{Uv+$nyyCQz0%85VBt1MjS+ee>Xn|=bkS!=mTln8hbCDi zj|9K!ZsGcoA)CY2Hz}}RW5LVE`=nK$hMlxttmazSrPb-kb3jY?jNXOUvySgD&VG6! zQ);W$!e`eUT0GgLdGqu>U0g7~fn~>s{~NzQtIt(EIq$`vH~XEwz4mY3b>z`r-s?v* zn4jD|wl3?|`RzIr7;Y*APKwCkf1h73IWamVC1sxSfpxoVuNq%(J$G_)c1lW$&ixfX zl-%z=OyGCfm$a^KX4J4GC!k2!Vxlk~DcG*O4t6YheO)I8(z14cG{h&3|EbX5R`v(bbc*|$ixvDiOCDOTzE&e`n(S4V| zbw9~EZT5r0zDfTwWIXQdp72vN{!8!OLc<5V%b(r4Ad@1=qUrXhs@K@-g!HQGF4=!v z48#7*&e+FlT|dkDmGzqWn@?X}7E z!k<1@?B;yg{Xq2btQqZ#E`Q{#vRh$SW~fnSbVy6V?{L^kXX}LZ36G2lwp!ZB_$>dB z(zWvL1<~Vk7|o9GyF5IovX5;wSD}rqwcFd|#sA$d{}8NL>(rviCtsc%@4NZq|5u^Q z(wTQZ&Ut10!XbT!xsh03{O`Nx)#j@fRvbG&ci({x?v}^5>^=W;)<>muyU5=4muxS_ zt&J~i_}lpIg?W9J+q~Rq<+FuM-yK@ERl;=p48Qg)`5VILY>rLtk%>r&5jI~Z^-X74 zWrdW`JNthNPyb=o`Sjw@>pzWJ^0_Y_9glkI6I&%xZX5PwQ76OKyvzS2@|Z+cZcKaa z{Jz6;#osMk>~760E0k_@%B@=P;?R#M-(?f@xenKfL^C|!{BYme4ZGLxi(LESMVPPq zt=A608mn?9y!x7-BR}WRJ|C^ijA?&@uXM)Wkcw4ayl`3RT$yc`-mYw1{mL}2sV(dp z@2Zz?SHBF4oja@fk-T?{L15uik%(B+=y(R^q%4E8isx6&4W1a)dA{-Isojce)`s?U zeHrslQ}{x49kyum)-DCptth5uGuo~7U(Y_xk;P6tm@?WTgFJuXF`qfS_EK2ow& z>3xUrTbI($%OtIjsN8%gd0xa`qM|bR!kmA9-yht@{&~x~cZZYWch5|02>7#uFN~S6s z8SJiV$@J!FWY*rG>igmKtlKvjo9Y8rNUh-A$v^$R&5aqsypNaV3hF7w^?kioH|Iy1 z-P~&5dNqR!y^;>c=mx@)Lo4@IK zJY)W|tDEbLR(;~CiZ`Us@ob)MbZ%bH@6OO| zlfKVO%8pvl_qV^N`Torf_I_8IZW`wly(sVCzs|jP{hsF?N*C(-4FsP(W95ERIj!_q ztIMQmFI9Or&e6JfV2$b@RoRWKM(dJhvWGP$Y-M)1eRnRW7ME83FORo}?WSriExq;f z{XticyK%jCV(+6l_FQ~FG3Dkfp_N`T3vcpAJvWtGowh;zU6j4$i#}$N)IDDk3l8Zu z^&T+aU3=nU@A2DX7AM zjW>Q;NfQO$%-&{yVvfE#>lrl`gIL?bYZnYoOucvV2GiXpjUB6O8JNVn?{O4oF29mJ z#o))r#Zx0DtF^ejxNxb`Vcoha>x&;f46o^TFIzBGAY}93^|krNkNQK^nY|ld1toZ1 znsIBAq9=3ubB7%(#co|WY%=HGjr3!t;!<;dcsj)@@oqLdcvI-~ihC#8Zh5zE30|75 zC&tIJSng!;<9?gadVO8LnQQm49`w0&_`wJ6{uxGnCC|>?lGnG;y5eBm+!>M@AN%k4 z?gaapA-}qAWR zPj=q3XSVb{-j!Bwoi>yoy|_xUGsN&n-pm&bajE$RY>e3<2X{+o$sB8*E4-w;)2=YU zb!orj*}T9&g==fJN_2Bt8tbPveE4fO`5@0%=DjQnjP89g@Znu6|I#O{PI8jP=87rv zWFEKf{C{cQ&dx*I%3p}c7j&2~@V)b1^g|bhwWNd8K5;wI*+YlS^`J^=HwHL3{}&#-kKM4G(M@0 z_qZ|5@U%$4O`eIt=A}~HRHh6wb!WrK7aGSM=6@W;7y6Zg6lcO)J z4B}pyG9#ShZ$C$i+5=Cg*;Or~g=f&tWI;Le3a>!?doGXUvx8 z@t>M0d|ht)zbBfvZ?(EaEa0$YIl|@8$yzCu$2wQ+#Crz)?9Mknu}W_4&6y8U7zzU> z&fmN8yYK%U)((n$SKC=RO>!;&^-x?o>m|pRoCSI_)q^u`PBhnY$qG8VO6c|Ue!tRH z1{F!o)6$|A<=@JButJ1yj>ybM-p9oP(+}R5ckNyl>*DiV-CZ$zg4VfCiPt?hQOZ?8 z?1XaoouUu>nNt3+tf^VS`r%;zuV4Q^=HIXR?WQ}$x#N8PyPM_}jwK;Gb7PCL#aYa! z-g)%M?7GLf;_D30HQv{&ym0v3@cihi{Z;Q*UKV`+EyL76BK)DGa=vld1~t!mwTC-? zemeSVv)|`j1xfk2GJfpG1-M#%X(d1SAk(Hbb&`|EqX#<$j+@=K^S-`LkU^7~b4FiX z*-S6l@Ewn~>|d2{UmcmRd9&{I-PPgx_xI$oA9^!qcCvcA$HSfie^#MOAA7EE;##;! zx8!u?|3-_}M|ZcSZAkf(zxt;+|0SU<*B^i1yVE;Q$KiR? z!da6|1EnWD;m=;`<(hRT;O>4m)6EN($tvFa6O(80&Y=Dev*_g$dp}t2baQ$2>{Y1A z4bG>fRt>Z7%=oo;(c?So*UtX%=i%EK8#bp-4K_QwN~q&xP{^s&w&zt@uYcId_L|O| zKI2nU@h#q?8>R-W`20>;piRV`(Y^AtY(_n^{jcw*<@J#Yp|r>QMOuDk)I-)xVD7(SJUko4H9wB znA}S)I%)jOp7m*`?F1hO7sUfD54ak(?XY{I_@2Lfzs`Y`DNlO-=!l;!sr!EJOxzTW z{dw*Qd#e&S6j~+M=RSVh%lvlrYF0Nd3HJrYANINk96c(%xoG_pCpF9KM|=Ow;61rO zNyxw6-+iX=HkS{Z&wk+9Ue>tau<_Y0i<>+-N4HC^#5I^C=;U28F)ZSKx!r)3$+>)oeJG_&xC$SxW4YuKfhJ0 znRvfm?bx{F)uubEVp2Gj0vO^ZJA87!s-^n;)gpzZ-k#5jwwj*(@{v8`(T+P)H@DvH z(Yv?PNBh=9vAZX@dS`83aZu^|t@(1<_s>^K{qbemyK}};!TpO?|CD;POP3p zc!8X@Pw|)Mp4Q%!Q=$0F{n)&HQ5R01^O8Fl(Cxf9F<3up!`mhErheRd#=vgER>2dE z44jd7r+k(vdk}Pd@j;eJW-oZFHyJZ-zFKf9`_0#>GMA%U5{kGj7M+`?nmqS*YxjeP z3(bx-u9kT=v9h=_f$8$*i%#Wx*82xY-|LK9a`)~_t=^1lPg*=!m^;pGljl`4c~Z*wSTEy_ zcFd}&d$_)?%FWKcoM@K5;p!L9yY}XWo4A4Mzda9pY0>1^T zg^RF=H-*M6FFo|V*mSyMS6NGP9gFO$(55qMo?0c?IaPg;kj;MbUi8k@fM<(h@{ND4 z^H{ekXV>ce|ID5L>HmFw>gE1TKli^|QT{#O{pWs#iD%<~?ypPvr(b({4dZ9#4;);x zn10Uv{w-_j-+x=`GS*EI{-gP4uc?HS!RGo8F@`?>H!OUymcJq)VaY-D*?;r=uYZWy zeQNu!8|wo3-`MW5~uyTtv!JvFANeyWFuS+bPTvi9xjr^ODj+m`<@>iu>5*|Yro*ZF3*)LNFdUDW+m zS-kllQ<2fx89}_0e9C-`F3QRro#rR)<+d?pQ}4GjF(1Fcu#uuEbVd;>uUH zQ2XB#^8V3%cH6LxoI2G{S?`4X-|+kC&z2hBCHGk$uW;J5Hg{!oZY{G;`|DR(yH}pO zxK`iYdhy|(mL_-fS#r+u-J}AJ+u`uqTXt>9*EN4{pN@~;a$lsT zJ5K-N^ke@b>u>A*xWlayDC@t z-oUQVp(|mmyFT-E?%%h&*B%mWnV|4v+H;lJee)bEmwXJX-()Q(<1ZNFnm@_FcqS{S z+JviB#p^fhcH#HQ-^Q1HvpGiN;a*9Bn=M5jEOaa!Z^wlQ$X!g)UI2k%8^YpNsYE z*5Auod3IOo%6dJIy;(0~Vtiw^XBDU)cc1y?%8F{9$OVGt&v`l6PY3gwL^-SP?EKt& zwv20a;asnREtRnkZ#^pf(xozYTWgG3@ebQpdZC+(cYj@VujCDj)BaoQ*nD5_O6&IL z5URLdwOm5?SPa9vG_|95pG;==obl|p^wx=o<2^S2E6bX{i+w@xrT!Dom>QBdGX#A~ z=Qv|`v+?Ksm$wa)Cx}c@2xLBcG(cVTLPULOz*L@ZYnYBUaQG-bXPB~R>Z}v3ou^|M zq$Y%(c-Z_vIBP=k+PqmSqLorqEuKS%4g_m9lvnlHA_aIN7uX-3CXBaztf)I z%lvY%&}^1a{(nQ=J?ZHW+bb2>8}z)sM|&;Kb8S?(zj4Lty&AiJ-sA0!@0Q-FK6iqB zeAh3RD9zm*eVNy^p7>|#mh`{*!oYhr{AdmL{p@wQhkQKRR#i^CYTBNmUv%x<^B=J@ zmu{HR{bci%DYZ5mzivG8MSgXQ>F#-NG&(1LJ>0AKM18N_5$=cAYNdYtwz|htbJ@x7 z!u1tt$DO+#xfY!N`^NEVC7)VCou8zT>)MuCg_(*Mc3T>2itIb!^lL}svsXONl~=g` zNfW9SKC{w5Y46#FDKEA(GB!PO{hQ<3UV7q($?*lg zC%$Caep(|OypR8Dy279Q|JVM7r@ww1rs00Jt4io1gM`Dn9mndDUMyJ<85#a}-WKQHVqo;1hya7o_1Cvo5QYHsh( ze82Hi%K^8~9}X1e^sUHG(o$NXe&g=3MJw{ezi}4b6U-u!aUKYx)IVk$i?LL01wQf04n_h(-UX0L9(oqD6~La1JvtR~a(sZ+|m1wuqq z1Rm(lP-ULUYINb#4DH=n0{yP)k$+kEy+TeL6o1F8u&!>s=Vt+(FF5N@K&8xzpG-k(LnE##HnJU=?xVY8c`rv~<*NGpEZY};F}qs% zgWgUN_0`SzyBRI=4Kr#Q-nkt-EOdL% zv{K99=^H24t+$K)SQ{67+0Hh?Mv6yv*O5iKY&In~&lP{z!pdSPGxx0Wm#l3Lm%{bm zKHU1^1k;QuGnKv^m~kdtm}5oR;a9bhdkdGY&stq%NQvtE2LaliJ_yPiRpHcvnMYxDg# zODp!?t6b(-n3L1j_}={=dv9TV#Lb7{*X})Du;y^}waY6{6qmP6tPyd4B>3k4w_c@( zA^LV{)@jp^`To5BKW^dTQ%9I$Gc98p{4KhKZKk#}1jxG_tbST(_F~7Ehdj<_7G2*J zEa_ovtEll(KHRVnNkb zR-Wr?>$hB%_vd3fZWh4ZtZ(qN`=0fuOJC2M8gR^&R-f5%S-EZc4biD_T-n+tt*<-k z)GmnpQ#3C%zC6XvhRe=Z*n8G8nIQ2Xhp%0)MbbnIJr%ZWmt2;*;b+vzrgNU_R+O#1 zqA@>bZ_UOPpU)+9G*&L{WqzYNhdo@H$#t(r()}IfvGtdhZ;!7MiCj2&CUc*ad0^r1 z11*j-H{a^GI!nqVrAV&1T5MWqU+mIPcf5A@_jDzBy>>jg=34I=v1QC+zg%a3n63!kJyllzbF@EnGwkNeb{y61)Sk2$gR;eY{`x*1ynipI@7xFi+DtHs) zwxqPZDpNTZIlR)EwnyJEC(QF_$(ko&a$l3qcgdH?Jt^@Dab#L%xcY%`MWePeCa zCk66z`>yc1@<+~D)4BCYRC>(oN#3V4qRPI#5j9|&Wy8B_&TqqbU#stNS02SYzo*o( z>!GyV)aP7jxBfHaYTcN*((6wfyOLI-)!+R&MNIA@>F<4Ss&aXrI&;%o+DmnY+J%bN ze`@AC+!kFhKl)G~|-Hj^> zT=VVtkH5>pSUWi$*Q>2m66-ja@jsY1%BQgUhCs4p)%7(uju{NYwK%-JKv%`jV9 zW0I2p+MWbYt0!v0>&3Pub!P;aZoM&4;zf|-H_nZ|sh&%vSoGsqCSSCd^4Wffv(u=2 z){$%dXV0hx`N_`WW&SQMVRYN=;@j}Bb+@9P`L0$qS($W;@Af+XWls**9se8bBf{+X zd74ztZk;>5> zK500)%?LOfny;d>_*cRF??SF$ROP4K)XQKBG#9ZJ$aCx2cX?4kLV^0cBSj7Q?UsDM zm5sIDtIn0;ZdXqHr@ig_`|0*ANBOR9P5*vckAd;%9qxbTHkMgY9~gr>C7#O^Ee=X` ze!Vf|kP}yASe~}%*-gKyB(4e1T6~d>5Z4mHVaKm|_tE!W`Cz;MUc+%(FHSr$_ z`X!-LIM{Y4PJ7?AuWaJO6GD#L3U4YUyg0P)PxA?Wm8a9}PdXXxIik4!{nYGkD}jA0 zQ&(+ujXIL&&++1|+&bMyMkU`~S-<*s>-|!*&E1FhNw&=X^Y^{zMi+tAbM;(5XT~d6 zCLOx<$TxX=_RYN--bNnxo3ro6nay3HkS6x-U}J{Tq;K+y{)#WB_?>2r*R|T|Hyb9`h{OqHB|S%8IP*7}n)P2X@T8am%-idF#)PMxWM(u-n!lPxk!}@Vzmk>Thzn zb@MxY?yRbN8)iJaq35}6vPy^9EBUuaR;dU{Tdas zdgZWtW!l;67BvUBZ#v1@`A-*`WA7|>{(O>L%ruGabnR(hu4x_m;Sl=BGCJA&Z+hQT zS+ku*^4WU>&MY-)KjgHjlSS9oi)nlNaj%*=Yt|Odn3=rxm6FZu-RpPNt^9S^{8%FI zK6be|_oORlcuf4TP|x)CVMeD{!q;m`*Ghh|yK+LKw0oCv+8oXFqb57sQ{r8|^5hDB z3vbDGHT4%hHDlB5r(U<+rev!B^!ar3d4bE?m3zZD%Oh4Ukx>0$mF`w)TsKMPjj#2c zGqH-Q^YsLp_8PcOogx_6zb;KNPABe{>qDN{kmsutUa&0qTgk;CvVr6E9Z`NC@ynAq zj3%$}jZJD2y{dKQ`0|J&ye`4pYG&mxS=iZf`IwW?Ucc@Y-K@UnWPT#xAwExl`B5d%}Xd>@!(SPk&^R{q$zh zjKr%+#rw8QdANPUfMRgPNpw{qtu1H=WC7J=1;L7w_xrQIi{1KD{yO&9Fq`s3L4Lh<3V!%Ge{?`r}!D0_J*}hd!v79GrDR^xUJC zWWM=(^!pZ=daP$uvXkswlp$&~`SiI3r_a6QpX+n?`ROxB8eKawXX`6{yV7<(e5zQ@ zBDY<~o3H#mBrDANy?3ftiAt;M{a}sb{Oc-SrG2tXGI=GPc;r*K)XRct`ZC8Jv#(~K zW~sJuudwJHKf;-Q(7pPZ6oV@8+pV1~H5yBM7=Wu1M(3gr0r_`BWu6SUr zHrrUFVviG}L}8+>*wzZWRRJpkqcbb#Zd`NZ)%E#PGZ_!e4E-wgdqddEcZ{#==e$ly zn!oAdvKXcXdv{!lQhnhtuc&_xlSBKu*p>D-Zwe(ZJM!SX>1T`E9}DG|MSYzA_}!PT zyVG_G#hnVDBzAODu8Ujhd!H{}Ut^-|WCEL*uXPD2Z4xTD9(!^2ORr*)467`b7a6K8 zf2JL4UK^h6r##`5?GaJ;s9uZx=6jxe%KE(`Z*vVp_P?Zqa~e!eY2JLaNUyQ;;NRj$ zg1)xS-`Wnj?_@WlE3FH@tIFYq{>$ zj#;l4_@6v^>ZDdm+Q0NJot=MbrMjmhmlKwcI#{&RO;s zB3b`kF5CEB;$bFllkQvh_yc@B%EtvlCtu%x)VpA!cOm0RlViurx2^1#H*))%lIwfk zU-pT}Y4I~XH|K@?e`NgM{DY)Z;53^}Jug@`|NgskDRa}y=bkHUgg4C>FYMc!xK88Z zVVYcGX2D%-T4+yp-+eoD;Y2oXE1cmHqkEu37pn zyWVC`TH;mkdjE_E^?Nq72DK&?cKrXU{-o$w1|WUR=TETMI5*v#!4ww?b^yztXM0vbVRt3v+&L z@$^~9^8-BTB6lNmIM=VZGTkuln#KJ|j{+A*UDP$7Ym}V!d%~X;F6nEw2j1XK`*3>O zxzl21RafTsvG4Y~Y$G3h?!%K8Pd91_?CNc?{Gn32-16Vuv`=}trYm`$zx!%?`=MU( zqT^n@I~%X>P+ql6QfrJa{E%V=H3r^3bYMvoU?Y042! zi|LsolK6N>^3{hzl_w$t9W)$xd^RS_*z>LIzO&9(eP?#T1%v5ZpJ*?aa-HRLrm${9 z+trZ83t7*to4R%D@m;&VpO$w~5$jjzKf201C?xTh;=-NkHrA0-#IDUh^1@#@#Nc3| z;fzOe3%pm_zq=#e5SkbDL$Sk#YvDwlTV8DCt=x8d*h*X9`9C~=@nlKdts5WNInRnH z-Irax*)cGVJFRBlE{>Zgp9Q~h>b_8DBR4;Y>9T0PP_@Oe%k{svKYjYtAl{8tJt|84 z*83C(jo98lI=eN3yYC#|xcbYPB{wzCUN$t0_^q^VlF*8I#yvZ2WX#v=-jQ{6_?Nhh zYft0iyS8i27CiXTTH4JQUl{&uP288i?Ms?o*G5@Q-I$tm_LoZRfmG3n$7cOIBi;0L z<%*{&uhPCp^qxum%UlsVc{l6gC1E`_ci%HkwMg8}&lov1Z(Wl8)2W*eesRdHTT!#X z<@3Zz&1%P$Wn~-%K4=L%TWU3brbD!?iHngJ1%tF_Je+Y@PU<^LdGM3fRcaqP> z+E;zs(RyaBcJ<+bMR2yuhnFgsyKg40JrotS#gn&!|5Q%Ti#ey?^)C9^Ww1>6 zl>XHQhoHh*d;4{F_I*BoB_!(R&X)qghq+o$YWEe29}Z7q2v=9Syqd`|B8~r1^_tZR z0)_W(FRN0r_PUwSfR8{Shen~zhB>*uW|QJ z`t^mZtbX-hgK2B8QfQITm37&5(e;}z*8Pr7{+(OB`pyy__w+2M8nw+G1~Jb}3Q|Rw zZQ|!Re42OkV9M&<*WYWrEW3a3`|grVj<*McSNzS%v;Fh4-u77DT37ur20_j=9i}Pg zR&boyDz4$r%YEqFgMV6gynOSDdjc*8s6Vh>YK>*!U2+HXW1I>T9*Go6U)bq; z*C%n^;lII8H<;%!UTYMX%D|uMRkCRH->Nq?4|cw6%*(m7=iSde>itq*WR%W%zS}+D zLpDd)fUS|UFKOArYrCz_mPf48{lmm+zPh2a>(?xoWmo4e;}%(6)}k-O19}UTF#2@1-cKF^s?s0WPcIa7_a!|hxS=UhqeA) z9a3uRf)?qk&YiS)+f%84XG~}J&j@Dx^>|uVr0=&mVIo;UaX(YG%wtV*U9%{uD{w8x!wG z*v`q-ubA`q(Zm`M6O2ZV5ZLf_c1e_rB`kdizh!TBh+Phn<0o!h5a0(BLCB zm$OcHOHcpgbdA-&ZB{}x=lR`7{gq3n&RTso^Xd}wT7i9zr~dqXAGkc7;i#xViEvJ1 z^9wh<#=01hSFVLCZ-h_ab3J#$a&v!C<9dYviN>+n=d> zdDz5?4KcZAnjZgZHCnQ;WTA#@@&=y3F1I4>&Np0J?#wc-i~OTnw^V^!csrAr&ZHw} zPy6|uRnqm=T`{HHQ`(}}NYDCW+M7jxJ-%%A^vmCRp!M_?mNgc&M}=ndXj-IB_m-2{ z-RkaoE8?i?v-j%4>*J1pd1@}Stj6s8=99}(4y--i`di;U}FZ8VP~2+!~GbSmEZ4uxmq^E$MV&jt7=Izb*HzlzhQqmdq=nE z7Q5f_^Q{&ZZ~U*heiGAzNn4s8wr`wYm#?xWx~?qA?dhLN=g_HBR2cNH#w0(wqFT{) zvT3(ol8}ox=iizN@r)@`uf>o%}rJ7Sf;FZyf-b}>J-Dv{iY__{!;VV zF7YeQJGWuU-rZMxoHV>1t2Hc=cN$241g&yG+$G#;PZT0(LIeD^$&gw0}>}#K_UaXcP6I)gK%#n@DQeu<$ zj&B>6&+LiN6;N6F%l4qfx;6J}wCWvYc$aDKF0zpLw)VME;_E11jqq2qGs9!w3ZybG zPnX+dSf|W$FT>PDj`p<5zZ5`IQlF;743a4I3{>4}FwUUqqE%ql#xf92=Zt2lRNPU?S^mQlu6 zzkOxcdYQj-)ynMRZpqHRZ*o#y?+9mve1BgQUqt4#lLcr0HVAI!;avAJlAV_``ra4y zzaKS~?mcyzZC`ci;1Z{_rY5^Ob)UvZdstr{d-#iSc81Z6Ge%{fJI{V!csy6`-wen6 zE%95nTTPcXv6nw=aN>(W%Lo1)k@wfd?fvb!Z~ep9T6^u5{5HI1a=HEcY57$v7-j~Z z({NmRb4g=s&8ag959g&ut-cg-r*-q}1CP&b53jiw%U3_^4x`)R%v18s(mG1Exkl#` zm}W5E;#whM`}o1iMbf=p6_*z&#icUaz0a{_XFs-6a$B5IYqn=mA!lqcpZvA}z1{~` z6SYo+br_!%JIgdDaEER1O1T}+vXssQo(-977y0#fNy^&)ms{i4&+w@JpS3LEUu4pc z&w*cF>}Z?bHPt(H#TBgu21>!3q+Fx!UHN;<>X)B;@P$N{eHVVL`4oJ}wKAyt+p7M5 zSE8b8nTxF0Zr8|UMhDra7<&Btpcl6E>Tg>&ryKWUtU2JFZ{MG!& zb_+hrIvg_>3B1~8@h2%DcGvFx^LZ3l4r?9~7OlS~E{Py3KycRrAS--z$m?W-T+{X;D+H(0$6(Qrp|;*+Pfa z5xf4*F8l3}x^S^&=cOO|Qpyun%vsI*eE;1UwknzFpHrM?=)cA%^jJT@tZ1;ibZH$JHBj;+#LXZxGPhcw&?M>o8`48 zByWgX?a~t7_FVANyv~nxC;G#9F6&1WpWc@dQut4}WR}gJOD>=JW^LOeoND%9?}E>Z zA8xUh*rh$?+M5-hAF34|*<2bfK6esB2}`g3hHX~8PWz^M?ytV_K688g8lE5SAJtzm zt50#>^yClQ@-t$WCJWC#;wyeY)?Z*wZNQ%u)-rFtst0dwdM4vCdChDQKgVNBU;qCz z|B#>LvYj2zEEDoy$;|LKKOL%K{@AxS-7NILQP)**izns0`unLp$TU#&yl=?I5O3b7 zpyUU=t0U`gSN?po{cF|pNNJO$#j`xNv{$4Wtkh_%GJ5g#?@M=o_ImDFr=Khkc-(wV zY~j*2%azX#>)f$iv}>ltYm? zSvwx#-BMJ4w`-yfEBh;#9mg9YC|EV;hjCAMbM6#Lb>%rARI z`k69}RWq z4fS6B?Y^9HUPRrCU*IR`0A6d)^fP`71bF@3e0sn$vW5Ifq>?toSC9Wt;G6&P44{0@a%5% z>Y6)2XKqxRGW5MmsZuvjG02z+U z>yI(;8vI@KH}%TG4b0mX*PY)j=lkpc=hY{oES)zu`Tw}>%fxf%Ps7I9_ROMec@GOd z+J{U%b60+qQu5sY!9E+sCnwnZmWpq7s6IJCp6UFS2d!bnvz4#gpU<3lb?VtuKZ+LS zv>K+l&fWj#XRyr1ugW(o4G%mhfADnaoH_elXE2{TvOVm@c3VMruY-Gjh%+@gMdp;=?zEXQ<3=~nk{Jn`v@Y`3 zhAS=cZ|p7F_vfihV2NfMzsije(`A8L@-8yIqL&+bzaE$#5%0*y@mz&L@uZ;ssmdpw z4f|C}E4K=4uMu1Fpu4D2Ct^xKr;XUX^TpR<#IClKPusJdH{Iw>c>dYFlNTQITKp$7 zh3UhIGpF|jOp`8A7gqH$D_u8zg3=n!KPi`N?*u4`>}+*knsedpFOCeMW)jl6=XGkA&%7ausQxQ6k|ijN`(U+vi#RsHzj2C=BK zf`9Zc%%A)~Yk5&;&zY`oN%Qt?30WE5cYN{X#wgpX3~qf*Uc5?w4%}EDdz;5UVok}n zc82}@3cne4oPTY_Bv5yRVYA22$(j3aH)qc4^D8r4F(oJR^`%`YN1J&x;)K@g9&`O# zGEceK>Bw|vqup9fk$gLS>NkreGaWtsO8IZ{=e^qwfAUxPr<19a%d*G!XlItkk`uN! z-fft{&Yba^+vmwVD@)Nx2O(CU^9wjuX6L%)O@5bYXE>eroj&W`G`G-;k7xhSGsp^W z@Y!s5E;VKo*MhYidQp{6Ha{(@NISh$;f#?)Ea!<$LJcX#4gE_`#j%$2s4RQWWWDW= z?Zcy82}kuLl)o%r$M)arqwIrFtCxlP$6}9j7fZS&-O0Wvkhp}2e|pfN4zY;nIer#- zR+8&nqR)9Q@|+;EaP5|zEhp_SavhyImAyxOkxOKYX@C{q+OO}f1f|M|@7eY&BY?~K zQ$=!RzzvUSywOi5H|`Z)ajs5XJ9tXWN3Zy)T5&}O7$lAund<#Ge!QLe>m951uvZMf zc|T-J`gQfCIM|!_B#?uJ!GjU;0g{W5(-b6)`nkr}N*F{;2mnET1Xm>o;N5 z9^no48}$q~s+PPglCmmtXs<|kYOu`a@*G>mSgDXkp@dInI=Snl!eA@1LTOJj*yL9qSi{N5m@r<=jo3&oXF5TO> z<^9fsBHVKxZ%N)gEnRpk7HHtmc1q<1H_$R>QWZoSa; zXwl<;kfomvT+HXlz z|251Le!Iu;#nM70#r4H2*bi4^$-1;iAKr1wb?w3FWzIQ!*Y2;~E}GNP{UzdVK++Kl zGX{%;{~p|XF8V&?wAc>2y@t+#N92N*M`t88ZNJxX?8xdg&NI6|c3syB3XKm~X)tl+ zYuoakzYA)c4_SMJ`uHpED!KUUUUI9EO|Y1UlIGMuf)?9$`}|am4L&kE{+78{=eO5k z_f21{Y;;=p=pf6MC5s<2?6I0tbvkW|vA8f#KyS&Ca}(<}eqxJt(Ar?L*z5WegRAqD z3N#zkwpgFmtJqbt_E*lwS&ClH54@C07Oh|Jz4VC1yCd)3tjfs$QWdwm*6MKZ*P9&Q z1LrK`T3DayyyHt?zCpa&`-5JocK2OfrnS1b@3ERKW1Prv-B`K$p+sut+D%`-J)QlF z%_HS?{;lZQM_Ahrmfp(lmfW~9;p?%Zyy;hFGCqDcx1k_?+djh!zoQytKJfQ1BF+0%1 znC;>{F3*T7Jpmye9F?A>6P4#{2RrC`-T3rt1NZO4v1h8YvJZHyD9~LveOmJGevhRQ z3@m)%oQZG5OBlCIzw`4;^TB;Q&-_BRw{Xwcb^e+DCe0;pB$Q?^$vhkpch8#dMMo9u zWL0UW;D~bJmy6!2N8NmWy^lwAhUfMAS&<4I;U*iq9{!mwGh>D|+b7WgFIARlGE=1f z{eH^Nc)4``+R$~yDTz{V6HF{p`r0y!S2kSMdbZ8!3y-nGT>og>_4iJ^k~`#M;>fgO z9-IBPaK*y+QGbfrWNJCT{IK|z;&$X4(~@r;nGb%nlvicP`zjf=H2Jb{TfVCm@#(e7JB1dx(L>ZMTp6-}`dQ zv&?H}O~{ban!003%G-PIcifErezU7GdRdRQ55tUnwg<~Q-#nOZU3PMZ-M_c9bAKm! znr`~CJ^#qU-^m+huuf_@oc`DC_y=wtQ#o~+%jY^3CTQh72|pWI{*CQ<*26{r>Q#(0 zq#|5)A9`}VagqJs#H}&fjK|il=6RpEOYZeu`8Q2hb_rgI3{_07-F0wn_}68-`nQ`W z{B;ojvTxsq_wNo}f7}9nZ95>JK6L{UBIqu{ChiIr9L>w zvj5Jd+XZ$SJ8npSS@qQ0f4|K4bPct_enZaDTbn!LU(h?ud-Q2gh!Z;$=-RXP!HBtGX z*#nog8ByEUuI80Gr(>3!H7)y*+V9)uPP4_+nt!%mxX%4aI-{rX%En#(RRxI$5}qwe z@3|xs=5Sr)$up_A>%SM?Nl)%hXsQWxF0u+szv0^Pcc=Lhr{sVW>{lFoO3t1uDR&qHA8d5}c)02Fu7j?sKYc>Nd#^jZe){>FPZZ*qkh?b5M6zEe$~6mL)pP=HDxq)%Fp=fJhyyb8n$gy+a z#qP|qwV3g=>-YQr6aHs<)NbXs(w|ovx1~OMz5RQe+hOL{ZC!s)-Fft=>Q>HWi|<~1 zcqyS`#gE5Kzp^!(0?u5nm0_OuTWZ=GpB)A-UY<9}|GD&U+Un1rTFsW+di`6_qL1z0 zqc3NtSshfn^!oYN`oG`y{QdKE_S^ec0)H&Ke6J~M`ujV=TsHap*KU86|9Zdaw);st z>%;yvrk<@2%Ri9nYkuRxDd~cm$Jdogzy1%+o&0=P^5u6WOzE@3V^%ZvvoA2dV7f4E z=QI9C^9mDH-d@pizx#RHUmZE2efJ-UE^#m07{#f#>cEVW^5=mPf6{iRO-cJuU@GzB zP_os>j2j2_9SiqK?crL*5yhI^mLFPp{^HE(j1kjcTs`vQtd{?_xP1{~s8A_VUG>@c-I9 zKX=y>@w>`4OuP5~+hO|R>YDy@7ax2Gke#|}q1lStQ zmwa4%?a+4%1-lQ7!L?5IsjFv2^Zjn%@B4lCeA;Y_c(yfFf%X3{`+vE~H{0xgTNn@P zi~Oi_TbJ)zcR9H1{PUZu3l5%OxZ70q)AnHTwY%<}p_~$e5@&AMi0K~_UAA+TWPkLZ z>D3Ajk1lB%cIH0+{_3aFLbV?+MfE;-J8SQr{z}2>&EuRG_mk%s)fm61EnshY_v7S5 z_GKp1b=99pT|Smkv*c!`fbfH=ElFY1N-mb2->39T@pkC%Q{U&FxVr8CHUU||o@1t+ z%D2C6eS4`&BVbyc@7r&$&fJqeaP^45{C_K-Wg3(`wP%01t4w)@$L_#C#RV)ME=X^a z`=rs~!+q0Y!|d%{*SEG8)JthkyMBECGfBrEtSj5R)VpIGc$C#7ivB#UuxgSi2==($ zAv<&a?OSW~@9g}aa4ye$G6QcN1Mh))@#TwkbISjHYku{paQk-Fs4YLOU(MRICQqI1 z6600Y)#lUweeCbz6^d|ppQLIi->=3Iu{QOImo(2UyBQKWMGsc-*)cV2>0kBt;F3+v zY`^a%J(c$^Yu~J4r@<@zm)Gc#+Ld|tUi$6liM{>OufsCjxn_^8M8ox(_4W7OZ)YEf+Q!Ul_0@?P5 zPW!iT`GsE*2X#tC=g;)HB6E|aId6{Mj;TLdqw}8kGFmKtcj3phP9^S$366%FFVF7M z@op)*X`o_yeO3L5KOG6eJF0Ka^gHf-!}-DqX31l{ym2)?&Fn8${rgvbS@kscMPspF zTq}bLcLq+_{{H$L(KB|Q$F{WEbrh8;%zpVqM`@j7eme7kmmXzXIQ#y#&El3y)1$tLH?u?rC++>=!TRukrRC;{moir= zG1ZhhaSF`xni#K@D*DOrZ8G-?yAu~=exK6Y!?~2TQJdpV`I{T=4}$sLW_Gi*#;cqY zX|YXcKPA0ndeh?86MfI7g*(;spNsQYuPD!Ges;3LNa}ofRPXY? z`uP`*@K3tDCw`^J{O;V9L6axnjg_s-HU1^FQ*QN<1hd#H4A--sb?6^u7QG+wYw9F{ z7fjdE75$c<*&%(VwO{ZvS5b`6KU1-7YF!Rf*WL5j`SJsE;CH>60zrY^XZkIQg@#u* zFR{2&%rIQ>TE6d zzcTSPmL^wjbc;;d`b%d1tLghnf28WUd{B>R-XOE{#ew{ywHMca&1|2)VwU|6i;x7Z z(2MfTta^tM?z?~Ytm}Rf?q2j;+59knRo}7~v%YUOm40-7_LVG-CI-9E`UCZ~8rSze zb?3j}?dba<;fLg|5|hZ1JEzu)_e4~^e`i^u_hV|9`Gzm|-%l5pD;57{S5sZ^{!za7 z5kJWW%c`BnbOicTulT&?i)Ja``|hyj7vooKI&0rKNcafd&+$Ah#Pp{=^UwE^#`#zI zY9?q1EjT=@v}oOngH|UmKRGyIE%UMq_5BCtyh(}V`dYmF?fJY_g1YndH^{k8tNRrE z{K8k;+{ebHzl!%2Ze%E|kzYMsu2XS}B>N-Iy*cI=T{b1$7vS2jalP_2_k%;B%d+lgJfVqOyB0jXl(jZ$!67b_&{sd|c;@nlvfkgxuC3w}5i~zD(l+3y#Z18((HV=6 z@GO!)u}W&Cd)GX3r-hD2v%f4C<2uU~^(45K({NGy_q8)FH?fpRY6rzPo60-!IKRBg zeydR?+2~i2vel!rTSOR*Hp<=cIJDiD^^Do&yBFV#5P>Y;S%rp@`#E)!vo`OFwRS_{gz! zl2yR^)lI@v|DQPUu5JEA-Q;`cTkpx=Gd`1XpzOjl$B5F8`}#X9ORuk9wk|)+d)KVU zn^#iQo}bNeHY+xG=Vg%>vgb|2;SXmX&wE-md*`91YrgKYd(Rc{hOJ2Yc&KLf?oU&9 zJ)64g)<@4x*Xy6NmYFQ9s$cT=L5{KTc8jp(xBgUrk2F}mf8$M`c^sPG-doz2aa8?n zw07mJHhKG1rBb%m{rvL%|J?uXKU05oN`Kq+yKdM1zy5Z2H~;&B|LZ}mq2H(fzjpt_ zf8&Jigz~(#A$hK=PDL*W+gHl9@#A8}DG_lY|ML@>CNDFydLVrFYHHu{=3v!;JD(V` zwm@4H?-nRIH$YO$=#`7Z?+F3p`g`CuZy-5kF%ZSLcu zU*}&e$luUE``DHRYK!Xc$UZ*Me%$@R{+NsRXMQ)}*<F zai{w4;&&U|Uzc57SZ|RlAm39}8!B8A-B>@Tefj5;%Daa_f}gl9Esj}+JLd4Xan~NgNv(LQq{fkLf#}DWZAX)zaLw`_q
    2@AH0`QlOp0McVf?iitX%cwyl1VbmzYO>&!VKHJh#FeAT#D+_IW4Hl@_MYC+4j zI~t+4|9)I4wT#(m+G$Oxc!tu;O`MDMXWTn&D4l7`E@q~5)o}j=ZiQBqK7r_W5z{9p0u$Gf5pP3*6*YVjr)rJJBVD3{*$p` z{nd9TEffM&V}88P}D9>%@Ov*sZfO|J2(5U1zl?rf^2T-*)eswf-yK18;BFT|84<5?3#o z=iu?jD*sabUD-!}L$-J)Pkk@?()aGg^J=qprRXw*WqUb(<$ji*Q_T46(A@7e)r?^)v7sb_|_>$9W7azc_H4~cSiGNsV|*YZ|b#~ zY-eh1dYANGUPn*=-bUG?_hoKBKAn4X_bB^CZ<|LCzWzOWyLk>B>?%%h)qJO{L zoB8}@XXW-SzP0Z(_X_SiB@Ew6GzzOfo_kaq$0TC-EA>L@YS!4IddG$T_pLtmz?;{- z>-m9?m8-T++Ac1yYnPH=`pWI^xB1t*@0$Fw>GFzIs!FS$tZ({p_wUj6v}t)U zcYd7yCVce&^C@x*GWIVq)yw`Lxv%|2AJf`Txgjb9bAXoWB#bQ&sQZ z+FQD7pH>@7t$bT@`fu2qr+?QTJ*xWkzxw05d!FSKy>{k3>-%Biug@N{>#welF8#Xy z*5|6fJO8C`kGsD%_sZl`xm$B*Iut*n|uBB z?bUOuKCgSZO6&5K^|x0ok>jjeeoE(}k^k$j%YW(Xbj-iew0w(#*O@Sugv;C z51ORpPkB#Xruj!(?{nz8$be_tVvY$XSG6#*-eKkXu{BhB&GpyKrC-ZGU#@!losB0p zKPWWtzlkr;tJ3$u!AqJOSmr6cJ=HC>#!gJe{I18DUn}=peMq~dkiUWT_p>?sHYUqB z{-52x#p*Wm-&ZsCZF=LnU&?#^JCnllEhn^hAN&%&{EPPK*tn$NAoh55_OG{c4)54@ zZq=iWZ~gWNz4f26@aOdi)k`Jr{@0f5b5;i zoHc&Up8x$-UmH%>^UK-&;Qs&8U*&)8FUCvv?Pr(j-(dLt@y(O1mLDcgEjeS~#`<$@ zr?gPLRo>!yHki`zDg{$?GHQ>ML?QzW?}zUp3`jskO9GHb0pi`hWfE^{>yy zRmEK5R$jSke@%al_=hE-Q~l1)Jec)i@3d9l4oUy}^0&Y!!kgb!_Gw!#o4Tc+rP*u$ z&vJ8a{x9p5F?BlmdfVh%qWXOCnvCr366K5C&&_zyx}W*R(#@xT>P<>5N`1Gx+G*Dr z=lHby@~3~i+Htfmv-IE3$Zf{`uK#_la>6yFl0Q7!ad734J(=}~ct2M&m-i?&{n~%G z@%xdjT+yd%IPUk{l>E1|@ycZZ&g1snoicWk?(=^ft>Jxq#PhrBpOZbYH@`7AHz^dG z{AX>QcW8C^FJ3OW56{*f;SY1~E%;ygiqkB1%l17d&bb|s>Rfq|M}F6rjJe;%TE#2A zcAwb$=SJxM+0{=yA6SSBVWMekEGUv}GfpMXW>KPJxB zeP$J??xq*}&&aeLmfdD#?U+5|!`-)TReBpf-;9&G z)^;^H_ic&!`v-d`mIQx&KKbV7XAx~$@8VWE=iKVMy?Nr|ooiy1Eg${ZFK_v;^Y|01 zKT5vB?yv4E*Co}Sov7!-yYHv@`U~=}KkN!`dM4aHYu$rAhRMu-B2tZVDz?d(ZF>Iw zDc^$gyb~s`+jnV=`0J(D940A$|JkYFX%}`mIVxLh>$K^u5}P@;pEKB1vmvsyTYyuc zhiSpK-DhXIndP~q{FU+xtN9@{@27t6SA{FA=5q@E1PRanmEmqPqg&nW?D~5r&M%y{ zTlbLT(*ERyKN_|@zdFFY@p2ohS8n z%et*tcaO2`gjVcd)r04`&HAc4FK&IWIot20-Hx{=#wQQedEK0}nz7~+^My3g7hi?{ za_+91E)XCgxH&p|)ATy&O}fwQlkc?GKHS;=>hFa){$0oBO{`uzjklmU=(fiVP3IYP zo7-{^yk6?|%cF3vnazRO)j^A!o5C(Deo@!?vErfC&uKM}xPR5Ft*xrP^vK__Mby7H>v(sw8R2VDO5=G%XRSAV$V=5PK{uV){#@9f+E-{0Mf{&)J{|Km6Rzx_0Q z>o4OSO>5@HbN<^p@mAVmvz(2O%|0%;Jj>*;%HO9)R!?El-{OA7a83OB@2y7cTjajn z@7{Z1jr#n;pOPjIj-9#c|F7-Lk$&FQOn36x(tey@`!a1)-1$i}>J`?W-MqVeVekD9 zEB=1_`D|)raN7TP>0d$j{-;;|tlRTHU;qB!?En8a{{DZt{N~@UyROz<3A|mf=-Xk= z9ES~C7gntO7qh);i`B1!j8x@6J63O-_$#47UPJEVg)aJ z56+(Hx9&08w{4kd{PnryzqNYGzh5=i{#a0ZLFxCr*e81u18slZQdt$P_Q^Q1_3zO? zjRBLHl5+*;OQy|SvDoka=TjfHUfi;xUftl_+TS4^X)XR^WQ%4`YES(Tk^ zX5pvO*8clbXFTogEbFjODO-QmFS^yUA(Y>A)!JK|qNYEcHu3gG!RL?9->p3-?Xuzf zT&}li&sM$e{dIEVug8b7rsby}Kb4i7ymYIne3kzU-=t0h<>YsoACF$#wWa-4P?7v6 zk)%~6&lk>gj=ysKoR0bWi)Bi^<@-CI3tv0v=J`6q@2TiiliYjdx)&6#^=fZ<-}>KW zQyq)>>s^HzRk<=8_c_j4oxQM1;qD20(|_(Y?C;_Xx&w~tzm!_hUl;u`>_*dvlk+O( zetyNgZQ@PUQ=1ip4_%zM%_IL$8uuSA{q31cy)zZAOnvnz`-%FQ14-YX?BAiExk>f+ z(ah#6Q*UfIGU*0aq)pNH`fe@(HB&yNd%k|6uTtLsu-yI9XzjGQcb2wQIR9Vt@9&`( zpX<7L4jTL@8VPa4 zo+&k|WmawE31Iqp#q0gbJC;@Vbe7MZ{G@Gz+55ab=frOmO<^of*r3O3^glQHpZ3oq zztaA`RE}ii5SMJ6Z2Zrn@7C0F8*dzaIML@{m8jFY>Nm6cTo?R_oM^Jhi6DEI%uwJW*xk20rsA?jYGelU+Veab9}6?fBFBv$KUxo{-s`R%+%5f;f+e%vA%M~*V_gU_cw6wj6FcAT;Mo7E=MJ#{;tW>q9SQFwK>dwxwI|Gpjm59Vn8Nr|+L z_%`3>%Y2_R>OODf`PSHeUB~_1?9oJl<5`~?9x_Sr`&x&8j~BT6uydbR!)ukTJGUJ5 zs5+T{h26pXVY^?~G;JQeqnCp+1ZD0ku&i=mT)}bcK`CcO^YUx!FIRN_xK!6TtMT&o zt%|i-Qx9$WaB<1O8-2=e+E`MKUFR@zJ|fq7V%`tAGihO`8O=rbxBGDW9L$TZkl31F z8ruJa^Jscp(5Il7H;siiW(oQ&=3()ixm4G{;n&8hzXyY6z3B|!vj1YElI<$Kx7@Pt z*|ZieU@=duU6~&@OH25#zHL9JoI#(K_m>x20=ed>MzW^+oV@ti(^u&igAM=NDcjX5 zKhC*(`_HFe8tn|t8N1?49M~cig~}z5y_p*Fa^duYU7EJGne!g~WDU|W6jC`an6|rI zXPHcs|4g=(EDBqX&EzYdk*34tqaJvFi$s!1uh6~=)>6IuRQeST3i!|7TK(GVTEy|2 zapF6Z18NKUBvjd&89r5nte#x9*V57Y^_EzhMMhh~*g{`=onf2C;Cr%!v*)zcaiJu+ zNsErpPglq}_-CD2QQC*6g|jt)l{|E>@`f1D}wcxLg} z?_aBm8&bYz#xe+J3H9Il6Zq?j?5lm#c0?|^w!m1Ok-_lZd);M*5tG-Kt~?rOw&dUG zMX7h{rL}}S&P)qDUE!SbVWH4ISBd%mXUsbN_xZHxKhMi=bzu?guQ`_0@x11iP;JZJ zl!x}`zUa&oEj`~|QyqCW?$P()0~&K#XL&A8lZ_h-!BxBr1<)TQfp76ZYQ%NPu4`Y$`!j7p6e05b7%SM zD&2yz8kQ-~gs(&$W4NU>+2lyquiM2XlRvwyad6ImJLy=&tAc|yYtJS~)~ppeG~c{k zC93Mmv$j_)$v-r=u2ta{s{HCxKIz+4`S#RnX$E<7^3N<GuFRX#!*#b_9DckcX@bSw{%<#&&;47p`n!cvRZhw2U;$34qTEAC zw|=x7v%ARu=ktBnx9O8J>~F{LA7ZmzVmGlwZR3XLA0mEe>-yxg|C{w?fu>n;x$(uG zmpk(>akKn*sJN74J74F&xtIP`%8FXg`TIPlwQb8OZOeV$bNtBwoA2(^fsJ4 zwen2!`@200#ZOsP9-dGn`NwIWO!JDxNt;bJ{(JV&Q7%6D%d9IrVS1(QS6^8xh8|d@ z6=)ITR;aM1K*_|v+RRowTr+;Zz>f4khL&eq)8zR2-DIRp&$b*%8Xf*NT^G>{6UI%smtM{;F9x^7dOUGWep;{`-61|_l`B|R%p$&bzj;%~qkDSBYv_s5YZ-wWryWdVK&bXN_9hvsa*GHoCv9B)U zC&>?MD&D==Iw`5e;>XLp!$JEc~_XJH*-NkwB|F_^pu?lMHE&|J#j<;>hJJ=~!@K;^w{H8zuzqfI+J3KvZwqg#` zOf3Qbh=ir-m4}wh;5=YHFIah2+3d~Na*s#NEOAqntP&8|_&BiHWva)WhbtSG{!Q@{ z&EK(%t8o3>qLQy0j`F)y>^dA;bW&K*OaAnV32)Y&JYXUzS{356o^$fP6X$6GLm$=e@u4nF>-`NE+0T-uCzLDwcPH~OE~mB-ZKd*@ks3xmFeVz}7ei7w|Ry426o zxXZWEaNZZY2{vNiO&JV@Ic+|l3=(b?aMyV3tJk1%-s9z(f{qi*1()_q@h!GE8TPe; z_fb*X#g`p+*PdKbTNyhk$cA5mSEamr^>wF}Kd0zSIySFz!;i?xk4{B|$#V+!hpOJ4 zzOb0zoa>x`jpeyCJIgaIRhPc?wW%F%tWV{y{`+df!AirT7j8#tkBTVgEZe)SOEY8X z{44*AFKIf|#B9ue!NVE2i*JtUBy-l!Uc0pBOblVYabR!T>+rfrhAm1;&inVJ&(nNi zZ_9Z9^ZwMt+bws0vhr$Y+r23eOSyJ#t!wvd?z>Zhi#~N}{z#kkHh4?+M1yOcx0L$w zYLw)T3Ndqa+R#^3E_3hc zRoZ@XiaYsQ(0}sflXJ_z&kCFAA91m^Q}pW5(4>$fI&z+!+0t|MPjN+D`tgWsdX!D{ zhi%R0K038b-+Xgv(S8q;4hOz%f1eoL7P{@8W4tk)r(}AmsZ3I|jM8M$NuOVsD>Hk4 zvGr$K;?0?tAZmU@E-_P|Z|^bfq<;*X%TGS`2;cSgNvfKj>e;9J>JED7tv9*Ka4%51 zwtelFpTT)|KVOM1c>Huzu8f$FAY<`S-Gc^6o>II2zUaL1_6k!$Xy}~2!zvbTb{}>6 zYL-ei8Kw&GntV|;sNz_Et|(hVU+MYKm>Qg>& z)a;n|RPm7FkIcF9P4iTr^=)52F}C{J!s+=Sd@bnZ1C?e*Hl^Gxim->K%_rpc2u zt=AVN8T}1exGf-R%KGyyXSdY(My>nfQ<47HyHEaV@8*7~t@h_H$w@X{N|8uil-L); zY88E|#Po(n{sLt!^@vZ=)8=%<#ngV#T{ZcI_Od+*rADo7_0_4ZY^%M3G92Qkn;r4q zc9MO@l~2=lnzl{!IKjC{dQrLyxVm*<2;txVCd zYmPPFzptLZgoFiOZga2w^yfBr#hUMN6BUYz()vGtK3UW8$>8@SM|J+k``_kn+VpwO z`b+lRdrmMPiq4uY@ZCxG==IZ=6N)~1Ur3!a=j4!Yhw2~ zy`SWF-?&QeRN(v7r!O!1Vm5Q9OYf(L!E$+LqUD?iRT>8vsRv60m&rqi2S<5R4o zx%7C?MjR8RRX5~j0QR|D-F9us#9JG(mu9IeRXbPXe^nvFz%k$Sf%IrrX&Zls(r5$i!dYkmZ zYWBk(wSPk4Z|#?VpX4{^;Ezk*6Ccco>aSXL>_+S)x1S1L*N+_%p3VAk`lY`OC#8hE zK5gsw`_Pqrsdlx@6eEFO=^^zGLb~FkV_fIFS$leMtyI;YwltB8QKvTXt7^{Px!RjS z&a=>7bX^J zvQgoz>z7ZqN>uefXiPaI&=Vj1BKfMwHqpCh`Z=ygi!(Q~2sPBiG zcd<&HDG9k3!FajrcF;NDh!6Gg%;6~;G8Jv*TzdL8x*fBNkc!)_eb@E!W_~S=DNoyj zmM>+UZX(ok`_5&*&3Q?^%rmBVOfg(6l>hRJV7^~wK3kvv!;e|zpX-!+syG=#F54aC zUu^mPkQ{SjYTntkujjPCRj}#m>MQYP4eXJ+mUQ9E@5dLd%s;(f-2aFr&urI;Exz@= zPYXPr-FwG+KI!|N-MTxubNZTpUp%=?|K|#47N)k}BJZ-Kr@ZmkJ~d-f*YgiXUd)19 zC%STnH@xa$&EaEu_FH#pzf@-b>68sKj(k&%=ljq9`QL;Ol@i(?{;hkRnVMF?-BHsW zDY9%yb|hb#O&V(5hp*HZ2!-^)?)uw9K7jd zmu_ucIO*gsCK>0SpN_6eBY5PlMbBvw%%q90f z$5h0+cul(I!&EXQAZF6;_-%R~JT6S76S^wYrm>Xncqgkgwfgx)jaiO8E@dD8-`o-) z`z7Z0^cBe+-zIMfTz^O_Lf_0ab(KVsA#*CfdCyJn&9Arl7WFNf!Ta;tM!Q}U8)0kH z8S4z<@A8>1VHfJsnBvX6*YrM#>iTt0 zX@BucH-Eo#x%!hm+Fx|YEc!nGPyA`Q6H~9Qm(@BLezrOC?xPD9a=~WMk zj5(&Ixchs&vW>Kz^d&gGDIu=-eQx=u#{YBGqc2%5o3h>ee8rc!^R4wu3|s>~<^J1p z`m@$?-4*Mu9aekv_g$u2;HL$l>+LfPT~FRM+kbn)yFdd6v-=-oJ2x4pv*dR79BBW- zvC4MS(}`>*$~&Cbv_8HrncK8~$qB8?OHT3m9tmveaXB6&8e~xX#Pp%|XZdMsa&D}f zyM>|KJ6nd0+5 z2Cw7(cTrq^<2k{|QUX>tma@}gU5 z@5=54zb#tKX>;hmiBY%xwRP@Q6NOIxDB5qdHTXpB`S?I%DdzCRGnevNed59-<_r8h z^e#K4A%IhkE5IsrJ#WjTB-O}&hTqOuPyb=M;Ms+kOR|;;QjwnSdtO#LE1h0z^k~_y zC%Lxu+|!HJdcIk8$5uaz|H|&ucAL+zbt>g3Z+gEWWM9Dj{aMT#T3>WOQcr&@@$%@u zMdvQ->*|_sz4Tg>*RJ=lVt*L-{W<4t9{!npwzlJI!MzQO4X@Qrw)yKLt)r6k=^bD1 z9QCK^4riW)|8$oYY-4(@Q5-u#>00`yIh*v zSAP50c5B}E9siRH7Jn7ic$;-hM?#vvz3il9^%s@5UK7u}J#g-H!C|@Wi+Q!ruHSNV z(`=V#e@YtmuYUP&?&8j)pCXFh_kOu&&1AdJaKV!n|An46 z?pbDH+^}QW<@E5>b@eZ<$)EK(@jK zH|MR|zmu>7~;`JdU&Nqb+~@5_8_%sqXjWs6!P?2>OG#O`Hgm0Q+7 zd7y6jbW?;H=YNF|#rxA7B_&sX?_n)JX8XRd<&ynl#|o1uS?8AEBPs5hO;@!0J~D0e z)LV73f~^Tp~FVi94xf9+@4_wX*)a@~!$-@GoUI_`Ti@IuyR+eQ1rgo;nLbt=Dk za-!O!?TX-zzRq($L&7G=>}O4#;=5w%m+;%y-(~1rJ6!a*na%P@MNmiXe37PxTV8Rm z6yNQBCN<^vC6Ac>`z{?-C}8VQ~AToCE+HUJtQraC{3Ug}l)u!;yy@Pe+ow7; zt*gytjqLZ?{&8+xADPm4C;Y$sko$~CY4+av5%<4K+wr?c3Y?Y~+7Zp9>V4y0d8AIB zt?=<#d`EoTH!e%QWX>X<*M54FBxjQ6h5Ke|i@w%{PpoRn73OT&e&nc|Kpo$$M{HWt zdOi0?JX;WQx}@;)QptXgRSJ`D96OV6s;|n^T+>Co!0w33gVk#oFMlvLZCGxp72xF% zsKJ!i`lK)Y?#Ze-QtEg9v&(**D~ z5B8B0a zqd9lQnVikrG{URqy$OAg)A#CHX4ogO`)#{7zCJu{PO>4_Y_-ZtzFCj%dY%^4s7*5{ zV4k5NGjIB7-FH4Jo7>C1Lv4GLghXs=?wBl}HKEIL?Iy<31A7frV97j& zsh`*NoH{vGLuRG_yEHS`XJ%F&o<1EPpL;YO4zT9fWxsfh%S*NE>pXUBKbdmtR+)C{ zC+`En9v}V-Nlz*8Q1N@&yX(> z86;P{VS89U>Dr+p%~J~`Hf>;6%n&iKS)4jy-Sof}{y(lN-xQhYr4Vq*SoH?KT2K?` zzc+EuE-I|p)Df85`9R|OqY~vaQF{XmeB8w%G(%IF)VAam-cwz?VvFt!`2aoB*d?-O z`y1v@S9L#7D%x*Vc%IRXr$2rDx?B4oiUjAsvE2EroU*Pe~V+-`#x;Fn| zd-(KInR0F1%hOBM)#ERkzMJfR#QW@XuAF^OYsF>G%N^@WpZD+6iWJXw{!GSN)_;?x z#=N-TwR6k7-N#R9{CIt3t?i*_lP|oR;mpH)be5vDt*OxZ%hD}7Iu9?DGpTgx+mLd( z;^dpcU3U^R4c@y+w*P%K?cLPStn?i&vv1$3&G&UZuwefA8y{8{%+<_p)T=jH^1JRw z%ej)ao!4v&gwrt^QS8AF@F15;od!+CyItogKjR> z`M-2sfM8R=iNcwQ?yn5)`l)6Y8>a}_-a4`P*?uNXj-z(TYSRyKFV)@`@13=Ns>_{# zKagInENy(RVyWo>AxhTaT*re*wmr{-I>~fPr0^e{N3vQDL zt-a^x8Eg1y(*3#nzOx(-=8!+L&Wm%U_Di)%>^@4J3*Xy6w-#KzxIAXt^`*{d{vX{Y zF?s3DD6g2=u_~&27%b1ZcHNz5V=$wzuhg^aH|OD7N2`rL`vx>!T72Cl;E;fE{!xty z%^Qqv`cFO^JV|ixF#);zj8#9kPn)&AS0mYSn@_IMq=YlSCI}=f(RspuJJ7C}OhmktWX>`E)8w&^>wfOah5UzowS9jakd9{8{$;RbZGv})>dm#ey6Nurlvy3dXZ6mW z{<8Jt#*=Sn%NZ_OqBF1D`FpR*ojYz^yvrl)+;@KamBpzky0t7>-B&qXsJCZJ^u{B6 zZkc|DUd3I4GX*SPS8Q~9vt{Owe??r|mZrHi*6cs1`#!H?;`$k#EB*>f*InVbBIw?` zfc?%=<9c=X?gf3FKKjN(FzLk7PBQ)tJYgKgzCh@Qc+wzDb>n6T?f=xGUcl z?@_-XV9+u9%#^IJ3k~;|wHy(5yt+3*;mk6vOdhKptY>>}G8ovGpUEg){&e5|%ZFZ0 z5L8f^oV{s|fk>ENuTGo$+XYYcg;qD8|9?~D)t}|!&F_PGH%Myl77Y4c`TxrEttsbq zL~l)5Q>WD&SiSX|7|)X(Gu=!&YddE>+V(Et$2-%|$v&%e7zNcoFER88TUI!wfpzH_ zlUMz_FXn7gjsLc%dM9J@k1gkvEhh_4c(WxX)AQI$&pCVh5*wF2e;>u-X!gJ}{ofsB z4k0nAoy~sHK|;mLuKD(Pc+F66bYzQBG*eQ&`1A(v-p8#vX2$=#^imTx$=gq|Pg9WF z*C7&g*YTvLq}GG{A3^J+*@`p*t%G-NICo@orQg;9&n2nT+ueUk zmRqT=e5`L@-lumz-1ce&d{5M^>zi5pL$7OjV43=~*{!Yf_M2P~n?GBoNL^rc?x}`7 zi>_^&_44veq3-fMJ=Z!994Pq6Hc`EbU72<7W2Mt9mw6_8d42pgDJhVNb%M;<&rc%+ zm)+q>dv$s89Us?~eb#aRKE2VM@XBmaYf@g{r6nHWy3al+-c@D#^hYW-LL;L$>-Fhf zhKEfB&iKZEPL%jQf7%K8l9hYEW=^gyKcU5Ql55V1jL?)xpDsTWeP7mf?4pRF?auzx zZO{EpBA-kD*)Xy6?Yp>ZTPn4zBzAvv_*>CnFE{IPjGJ5eB$tOr>;wGeHgw9DRhT*d zzV7L~rFJ9h$>n)dp78viCOP{-$t|4+b0)W0a;K-xb^W<6LNNcCkJ!Wqj%oQE&mEGg z)_5G~ez(tyx%)zbR{5cAmglEEw3(5*?J@Hf<0Z!#-o>XU`kP!b5nevOrKO(TY0Jms zvD>&MmR2#I@DE%vd5yA}&|)pK4Bybh(=7h>XsAs1kg{g8NWH>R%hUc+r(dt)pRWFB zU+P?4#t8krse%@zAzPn`w9I;ZH%~}&o?*Aco5k$;Mvt@aUS69&H7a(#)WH%>kvBOx z9+#Ng1Ak_VX(}ycop8ZaHG3tCdC;SoQ|58iHT~SF`>N+f=i4cJ{hf}kTVw0Prlp$v zVdnH~n}F4p1~zI8E%mwiKVfA6xZFo9X;sx68JZqczQs=iQRc z()UiQyfy2rqpFHUMD;f#YfdTIPG5tX$!97LsH=2%?cIBBvrqG}#Rpd&Wj_3rWtKsI zaBO{kzm@ipQm5U|+u{ZV zS^qiuTN<9ZVqaFi@v(h|>aJTgq6=*}kA$ZMML4DQFY@g5^YbvdX0}pN^R#_Sf6`eBrM=>yX1o`&g?1XnI|X1Y!>=F6}bL!rK;79pIs~7OkT61S>c(*lx0@;I}L5n)sSDErb6P>S2aTRL6&L8~Wc}2FeZm~fzN3^JC<%9x^DN_F9R_pw|ewFuftSkMB>ZgmeEqf{8_oS?P*^FMm3pMsmtpn(>%82xJ1^e;;+4|<<}$bJ zy`UdfEZKiHPw=VXv(1Y8sb#DjI47TjQGS2TdshCIQ-WR_zf0G1PK{h>r0{S3T>Jeu zGCsVv%8QRaxN$mD%D+c8zPGoV7e{ITx1Fk(S+o7yiccc#(z2ejIeUeYoKIAnJoHZ7 z?)f=C>~>OF-!0w6VNyMwL6@T@S3gku2?D|&0Knnk#-Prt|B%wxU3 znqTVm)4!|lC%tFlY1i9ywwI}MqU4Re8{=nX$GbSWe)WFYT4`T=MnGLNY30SMlRXtI z@72!gmg`?)r?hi#S&;l?r=N45-CZTr@b8z*o+bm4)S1=23Vibfjf>A^v#?Dy*>C)| zCwKqcn@_5HT-2J3>$g8y+P`x*r&P&oPvgo9Y8Q8@tetExSK8v+63H#jtpCjT`F@i{ zYI~Di+-!QaH99?Y+@<>uYioyB{Ckx=b;gVhy`I+Tlfoj_?wc*6ytw7grY)LAlMMb( zmoWKrtNOw89l~nCUB4AAe(tI?-CI&uu&nEo{zr-hLzwBA}mZkO& zmLF!@|K&(_PUp0Rr$h?BYixRIy6dEemx*>;X(Zoyw@kY~|2KcnyPGS0bK8f1nznzW z%1frNIVa56B%*80_qc5N&GZ`nt~W1|A}6UvPAfh3^Syjv=z%EH>~%~UCpTV>w*0-r zRY*hR)uyc2=PgY)_k8i4pcmnl9rfn^vreM|-DoxAvo^LxekMj+XWZEs9$Wo9;qy{m zy{WNp9i*Bqx!z4P4t7xE*;;z^=efB(7MG?NJ@UKd8?m?Rd+YszY$YbXV~YZN0)vGk z4N6ra?`}+qaFk|Ux8S!&q^9^A6c<-XF79;FW#x_~q4Q-|nq?Cb#~BrIIh#*yvz6Az$0-O4(z1zDe6GW-uB{$vnQN9sRPu?Y*<3r^3P)O@edxGky^LQE8s` z+UoP1o^{RfTzi?GKabeOWLxnh@nSXSwk-|ptz8l3^|GQ;o`)?gea~taa6OlK;T-NM zS)F`*#nkeXv#VFfFq zVcu1>UHYo7r}BJD&${Cre@*m+-Wle2nfAWQzTb3M>zviDUCWpK(5kq3erFInmrU@N z1^Z^MEH@5s+PS05oO$1|eNy)t4Q$RQoiOxeU}r5&>#~2HQBs$AYR6+i-_vPZH9lmo zPR>}@xW_7T@v*osl?ngV(kIQf_GaJu=6Z`4^KOlcPQvXQUMFukRCDir<)lW=!gU&k zPsPGJR(xQf#hp?5`^*GyjXY1>qoN%73PX?ZszdYsgT+ttQwmf+!cirUihN(}C%sDN^UH6!MbrO5c zBf=Nh1}FEa1J)uXE>{{FdHc*6F>_LTv1 zCwS}(H`d@?b6^>3_RNG=K_yCm7uwhqx=q(Q!A8|q7cj04NT?R-HPq8T-}maia>5jo*b{$iCK<>&dI~$gPFd<7 zD7i*o$JvCB|J&h9wYO5GZoH1DV}D`Mw8Ww`OW(!h>?{LgC)-kW#pJ6@d>s;c$|}b; zY|m=fTM*v#C@-yW=FuYyBHr$rrGIcL(+}4JHRd}fC#XMv&)};#>%(KiP#52cClp*$ zjg53zce?CL{*cX6RigB=#NonGD~>d&*F81r+45$tacu4v)K+aPV2>0?h0wh z`PYd|mb>$0I@kRD)6gv5Xv%Q-^0ZH1qx;KaIL_Ff*fno|O5@Wl(^UQ~TU&KkE7H$k z>rc*9@#26^w#t@Q7tbu6Bp-M~b`4|lGV@~=muLNW>?=FFtjjlbx|u=JyKg-Yx>XNB?)vkeBLO|VDK*f_}L%1V)_r$_UnCd-r}nA zVAeD@b!-2t_UlC~O?omVw)M7r5k7V@g@4k1lcriZ_MAr?k&#jBcoZG@JA@{*zc>6R zneirY#l&opx!+sc0tK`E0%j#mkeR;u;Lae404JVTq8!CDi?kLi-r(C<{M#b&v4G5S zIaX1g6KYBeZP#w7-Dcx?sjBhnrVZPkD#tJ_a++LQ6!~#Y&O;Z|llm^7BKjj$*Ct6{ zk92)1koet)OLXS*KS$XN-nxBDi&miZksuDLMr`78P2SKmWPg|026z({~!I*0_?Ee)IC@7JIdw z_g!idgtbFM9w>O!E%Cb89W-y4SPL4$C!-JLgaQshC*#{EV3a+na)v)f*ofG`{b6uvP4or|W&rl&$Bpw@;e? zKK0thjbU3gY~B1${(2E`Piv(v!`BPV+vKFK9DKI$ooxEr;=9!)c?TBRxoM)6!WSi@eU2Uv60f`5oBg;+sm3RHb(iW?% zJIwjcNpim9WSyT+{{KDyxc>jq|8w8J-GAS@V*8hGFFs|xe02Hc)r;-r-oM-D``zDP z{rmgjpVQOD(~7o-#`DqcHP?ie{burnVC%w4>L2L z{`|V``kZz8>(BiEeqN%%e|mVe_~&(Zw#)uEs?YxaUH{Yl|FuPb-#z;D;?0+n_Sfdw z{e1l5$=%8IHi@7AKY2O%^k#qY-|y>et#{9gzg)Mk=2QRw&rgoaPk;8mymDjyx`mb8 z|LK#Q6Bekj&AIE; z_trn~?Da)A{qG)Cnr>sVZ(qcc$@_YDuW`w$)tbR&c(bB!X5&Id^~v+j{;vzmc*>y1 zC)Kn&!YJfbce%8w~g~Wr$3jUcDH@% zoz#0@1L}8N@>yPR=8bxX^CRJk_i+b)GL?yWFG^a+JMEvy%(cfkThhF*8DE&g%<^v2 zOqI{&_WIW*OJ_xtsqd)VWx=R+s6an+VdlcG3L)aI+zS>>boN`#S|Obn*7)4>)|dUa z-%orH;Kwpo#_6hC%j^f9$Hz&_l0z zUd4)B?~!?}lWcJG&%;-{JF8E6Nj%vaVcOnfseU!K=7HkjNSB?vvd$to8rGk9wUsSt8Oa_rt1mlZCt~8-S*wpqnSWVetkd#rzLtKJn6YR})g+xam`NiG}gCh*?=Y0k@mQvZ56nmTu2WIj9p}_T6}9 zL;B%qC0}>Ee$f{Hl%X^G`rD%u8>afOxXK)3*l|VeqtR5$4()60tNPf=6kbf}Sv6_z zk^_%6EQ>g(xVyP^@n`G#&ocKrtvPYVtE+N~(6PlHyuWRO7;iMrsuykTICY-wTFSdA z7HbV8rbf#(FA>_W-3Rr+wEU7Bf8_~oZFdxdDUj)hKJWT8nb@+xsUhA7oPgI z`(3~5&-ty_>#O@;Qd&~>>-*=;lNbN3KHBi<-~6dpdyo9zymi;t7yo~@{gY4rC;p9T zV%e|CrY9@Tw-v2gx-iIO%W0QI_a9v^o8+LSe*42YkIG+rBX}-|3#c^y=rBL4Xd-;_ z9GiA4EAOK0Yh2c0m$F#O^WFJ)-z#b+z4PPfSaNact^0QQ(VB8y!N)X(RM)<{XlFR_ zQtI2qA9H1UvK0;s@J(cx#rAxz{gO`=o0{G2|Cvwu|Gk6p$V07H6phsJF-JQBnh+VVcVXpWJUjEjl z3(Uktt>QE1$V9%+^ieE2dRI)A^UI->l9fL$mRSY8ux*~L5fET|Qs&yH=5x1%f`w%w zbcOzLXd9@nYExcy=TIScp3S#^Y(Ekn|C~HuvL^9W{2tEN3KJ(@RGF`JWN*X~uk#C8 z&mSnYTC#9&nM>~W_i3?G6Au+{co6jYbA3*hy!oec<}2P|s$2Lujvlztwx%&N^1glO zQhv{X0uG)(&mwC#e~DN&Gw^uYi$hT&I&E$O{if%{tJCsyymrgqyLnf`JYDJ4wyyku z!io0(&)fgCGr#>Ui~F5io5R09@zIg7o^SqdU3>QU=l{3o|F`&G9>!YY{8xwR#LNFd z8Y?Vr%i6eo-}vNvteDov_q7&MsxKGr`+xP;IsdQqj}N}PAs_qbjmWm6hbLLpDywYY z+H^!r+Wg(GKfk_eHDoMtGCc8e!qVj*9$#90&(2or>~2%8%EEv(vy<|tMQCvxjF}Mg zhCOtJmAwM{dw0g(X2y`(sp->A*I4aZWb4vwZS7q$*|^^9*Sko)T~1GpUu%`PRqc#* zc{bavB`f&;-Tv9EEI$3G9#nGT(GjZSFIHA^T&15d8RsEJh z4sure-#@PTSyOWQdD4~imcJo2l2>h(`E8ZIcwx&L^N&ASH5KygPVDKqWRvff##?tw z<;BH^x{sH>o!WWss93`B8zJt#FTGt>vrBG~)|UNzb>~;5{Z^~fO3#VkU4AHa!H&d> z`n#mx`-pz{zf!73W4n95;;jE|Klp98y?@7X>Q#OA>TK=k&VSoCZTz<4e{KA)`yb~o z{QLLhRE1CB88(7%i&|x-|B4EWuhO3Rcy;Tir8P^os-!O7qIUiohhPfJv35^Ym*SY} z>yeIu`)_OAaMF|(SR~)^S;Jz-qLyX9nyxN7=w0G9&Cc(h#kb{ZCkqyHe-qenr%{ak z(r=NUJ1$nwy(+G0e_d*W>etyOM^5*+UVQy_0vGSGy*o;_eAh{Am}g6%`XwuC?rx@?lrY(Lloz0kO*`W(_j?ZQK zRVg9iu`iW(iSx~bD)(ZmBTsL9yU*DEV%B1onBxfxMJ}z-I3X*1|9X-ElNP6((>2SF z3*F~N|Mr^u`Hk;|iEPz>SlQ02-nza`R9JJ)v{NPYYSVAc z)Fa`HT}#VSof};hg+D+b(>VZDK?yi2d3}+uUyXlbcHQ*Sae>`k6yzCKHXP5oiz)`mY{Z%y?N%atoQu)UWhVRD6- z?xL$&a@QVr#wIJdZF;A2Bq(Al(`uE3Pu8D$?)%*Oyin6}uHnkNJWa(f>&yOr{CR~> z>_>sf=j!)~>uPH+<{n~a7LgRtSy8gxTc>2o2c{2-&knL)J~x$Pr|5dw1dhA64jyTW z434;1Clji<_%?Z3xE2{mNyLFRJ{5{NlMqvv33^pPD$)D}#&FnUmv){BtcU^w0 z;scA6@)vJrStO~QlDN#@(A?U1Y}P@yGW`v!BqBD?lm7nAQY^<|DszvW_V0$xs%Z{8 z4(Gnh_!%=nFT?xU<(SGpCN0+^D_8mz7kEAWeV~i=W(4#1_Zo_8TM82IuC~|UmRz}* zqvs~WWR1}KDFJ_~e_J_;zxo}K)FXPXGVGM5*>z3-Q& z3UlJ#cHFaBuD&R1-|@~D>(c`E_M{4mSsP3_=DfiAQuzV9^z-Roj&EFIX8&YS_o;{X z&fQ-(kH>V`)*h?Bk%E0E^ip>IF;X!6sHA((Oz`B^&x_oI{9b;JGYNZ9;qfy;$#awB z)fr|*k3F`%64$h?fB$G%_i=apP3=j}8x#J~Ae4@L&*> zJ2YqGe$#~$QUqS`+-#g#+~c97CgC4*TUS2x?pbq=TLKE1!#)*V?CB{jKX~o|MdGbI!%gpU)ac&XP|JbK{o3d1dC21!~jvgq|ARd-|t) z!@i9xjXSf?PUczkaOE#=(bcj#l`P6jCJM-Nsk5|sr6yVn9r~fEe9za@SVW>KsQ7g0 zp}N`ODaTlRZ~L&dy}o0g!0Rh(r>=9SHAGvt{HgrhmdWA5i8W`R&-kdjGyELe476mwwJeU?9d_L>_mJon<-Yy&WJYhHq`}KCH5-Fjb{*wA7WSsij)TqmcG~(FpJkD( z?yd2<^R<%btB9tV!{^d9)_#%*0$#`I{V(9~&hD|EF^y534?E~)!`aRJZq z3rm#0%xJAy@#5)cA?u0zHnh2}I`p!9`s6cT=H0v4$fPs*?o9ij`oG$0%C7s)`HHWu zh%b?`Ty}l+an%Pm8#eYU+AO}Z^plE=(nR$DM?txrZwm~zoQ&6wY!7Id#m~O+i=w92 zyogKJuJo;yXsdnJ?00<5^fS*78P$BMR4gy?-gx_lkb=99&B^D+M;(-Q{M6fZhxu*X zGbX*XC;OLiv^{*Qw&U<~sShjJV;|4vE=xOR^S(8$o3&_Od?AYNl7dp7?$0x8GJzwz~DLo#|fMduM)LjNON;(l>WbR@u$*Y-Xy=%t#NZ zV*#5tygu@Sp?uPUyol?}Ue%s2(~FzScDN@LrgL#k|7ka)*w^k{lHhYYuSbi%@uhEG zdniZG%)fJU6eW&L?Ub@P7=GojD9401yc?3Qtaz0>?PiVBh9|SE?+1!E z&u7q!J(-uaAaU>2({^tzf4ZL~db)fQ&*Go?$2YBe&}Dam_w9kJQxiXJwNZ_7`E+7} zvcZ0a<$rH$>OJ{mUw7m3e&PT1OOI8xeXg(lEBOCo^!)$F`OANupZcYv}uSANogp`_lV+Yk&W~pZ)FH z&-33mbAJ9*pZ8Do$N$;0U-$pezaQ~W{quf}Ki;>z^50DVDm2+*#@=%6^y8@uC*7LD zlXtOlZo%$V8={;emU75ENby{3bw$jzY2mf@)vOD4Xr8;3bVR$cZ{IoL(;qLIr|2{M zOgnJL^^PIWjMh|(C6d;>za?Cb1wEK}yUA&;=K>wIs>chug*bXPAM&1MB4=waHRDM{ z4%`1NM-DE3z2N)-a9AT z-8e+OD_8RQ!$K>I8JQhoUOKwDAGRGjlX&yY1)o!QDlJ0x<dQ5% znri|y*g~zj7tFrL6M7>=&g#B&eqnY+uldBl%)|h#uM$kp4|COUA*?RZJf+e30Ij^`j>3J{v$~p62>egoHUOXuA`JdDY=ghwmxm>Gt z@)X!TFaL_ujGM60;n?d7X%Q;(<7KBcEwg-|v3lke_xX1NUpy|IwAAB+FcLSzcv5$zVEM({^1NyU4G;4{{OGPRbSZsL4o~{4WGi9z4BbYPyT)@6(cXm zp1#ifxz*C_q`CX5-g}$#uj<}5|8t+8*xMB~oQDH;a=yQun#?d?v}zS!m&Qcnm)=p1 z)0T91O86}K5LmeBbHo@#=|5W(gt^d){(%PN>%ZqEj8vgrjd-MPC`ek3wbH_w} zEckqV&1w4uwo~P~p2=ve*Wwbq&G;>9?yGi{#4QgFZ5$;RXNNB4<4NUswA6IkzC&s^7o64l zskFXw#+4t&dh8cAI388MH_c-HZAB;36>N`ACM`YrLCSdgPZcJio}94DEEBkwupChQ zsKa}EzFkJ}?7vgj=cL(`yiLwKUjHq*??>_iw(oiUJ73iBghc86n_>HXN(O6BMyF!P z1*V6b73vEgtzfNP6XbV!i_F2&q~x9pQwmhHQli$*bnyM{^dj$!{4uY{+0XTR7e&-9 zkxUfrzZVr1IO%nyT}_I+{cA1l^dD-UkH`5Z?OA#{k;h?A(8KIEN5x~NmbhM#KfGqv zBI{>YzEw;=ynOoBpoq#HCtkh0`RDS?|0Q*6hpPt>{Yd*`{I(nPjN5M3y{9-W${|= z%xY(QKZf65jZT_7G0f<{EnE1Y{K%(2mpA?2(lp=hynXGr`FX3B%V(!eSQW{}^HnE) z@%dLXB?{v2PjYMHKIq{0aN^D?Wz%=+!d|6QB1 zaAQqR)$BzJluymv$GT)gOA%jE$dT^A-P`-OJYf)d|LkYOpP08}yZs&4BA&qA^1tqOsy+U-A!K67)V|}tmx@2%&>>LHbwBW- z$e|Ywb?ZX-zBBz|VEK^1YQD%)_lxY>eKt;Yt(j-m8?0>(p8Yv4&njZi+E*{9&$_>r z>%r7xuFk2v~|d{KV%ceL0kQedPmP?#tV=EA*JU{$5DCVpJQNXYg)QknC>mjfo!v zJ{4SZUVSQT{<2e%%myD6LidZTJI5Cj+_QA*{K>h>w-57$Gc5iiI^o@c?!pyQQW&(pO^pJqrz&DgH5@8u5?DJtkY^eyB}XFOGR=l*Ig#;qx$ zSN6{rTd`ej#*B9s>q_?D{L$Rsa8kj;(5$4qqH#?>oV`2Cg=W%@Dx3W zieB~NDZhn=&b@sn9R8LBSUvD%@G(AEG9w~=mDLV-ci#{CnymPNK zY)PMmgvO(@yS3h@vbIEApF35X;m$eboaS`_X+K+eejW(p<(a@~a{JsL-$}C=yQN|d zzF9K$a!cc+rtNGOR$O?VKWDdKXQz$p`t zj;X0~^65n)TX%CbEqtHLFxBJDnbonc{P zrpBWnojaeOrllO)E>x$nLOSu>CL4h}e_JN787DivQ2Wt$_q+b@7t9kjrwBQ0RF+%x z!^OrlM>F<#)rS+7yCoinD(-rneBn(<`qj{$Fy9p|QQP*ueYoBF`1DijHFt>%-RSOk zx%9cmnUuDM+tuez_iZqAnN_-gb4?}Z*#@bJuUq$BKX5j$$>mwy62m1=t>%QLIa%L7 zIMeOPE#IcO^XIuWYdBr*4^#bcf11hP4eY&v^X9P%skU7SKK(<}XW9mvnXY|J3u-tr z`6MoPn#5Nve7pGHIfoh1%N%EX+_>(DB%2s_lADQw0Bh-Yzw#BDbJ9biV)S3_p7YMU z@%7SXJ_Gd+H)c2#Oe^%9aK!oZh8GtfZal-^zvs<)w&wRHcIm~oA9a$A=kA%bpFPXf z{z>%AC28eizgBHn+r;#J0p8(g2KT}b&JQS|WKc`xqOlb83&JuuV}{J3Dk zo9C>tj+?KQ^S@HmE=~Wn-g&v*0zIKH<#RDzNz3n8O3dJ8)C>L2!>A{=$?*C4OT7BW z_FiUwI+yFhKj(YT8~OVhcBXH#HvD;ix~SmxT^m2m%8oPDT$^=%esEug`uYEtAJ+DM z)~eBYwe|P!`IBCL)?c!GP12;aq~2dO5k6eSD<$(2`P|C+14b->bPB_br~`5)rF-?fvUr zhy0f^nAa4Pwk}U~7krS|&n>seNbn5L=4l51vqRX+O+&2xrmZ}e7ocDGTxw^h2$#v` z*#`G?1LD5AX-xbTo_8=W-F@Gx<-&<6q5*-Qmdb>GVAK~&Dq&6Y`y8@^$@kcaDHf{? z1DPK+?>?}?^K0`2k+YHkR<@h+E9b45GIdturf2J`)*pOuvf#;272l<+mQ__}F1LO% z(|ZB;&#L9F**YQr?six`P*|#c4*Ul}h8#k}i-g8Ft34fdV0g+E~J9OVp{Ich|nefDU zqVHyj}0=XF{8J8pZJb;9I$v^jPBRleuOubQtO^qPH}`{uYfMThOX zRan=_MI1PC`{wed#J>stwsMKT&s6hD&t$#mQm1y)wt_N z$8(m+N;B-IraHDKtbX~~I>0pdS(s4RKJU4a2Cr^->#eDIes;;t$)9hZJSso=uSxdz z%R0CGvjUGFF1b@YBjxsAga6;zXRPX0>D<-MFJzOpj6W#6_xaoj4^)&H{|CQqof4^T zcUXWSJs`J&l>zq?}zFyxx$Fp{Y4jG#S?iy!vz4O5|N}oxl9AKkv%!*8ZKm&3Ibf zzRQI?XFe@w;GLk_+8y_psosY9jp?E9w~sc@m)_iNX_i)y<*=y6tnBIspN$<%&ix5j zSL&1$QZD*s(iTt4sI{M?{5UCHv2 ztj5!@eGxasm)OWIWqU0a_Er1hbLsL6y!uYUhYyrqHvDq-(8XVua%V0$&wbd*^Y({6pMI{T(n(tB1iPOGmU|qmS?4B{aD3( zzE9nzGT>{4LH;*~-Cy?bBs!hgYu~bZ^7s8KuatSbU|IH-Z^n+|8B>|Q++T8Bd239= zR-Y-H2OSevSPHX;UA?Y7GilR_AkKugtTkV*&AY!(-bE^9isQGQ1>L7!Wf~dX(YDck zk>$Df{>7^sB-#0V6u*4mp?O#iao%gbNBTm5VO&+>FB{=JW-EF)&mtGYBp++sz+ zuAK|A=jJQl_PMu6Rw+x4GrN!LXV0Y;p2se`U-4N^Jk?QmaCzftrAG7qM>GEIz23G( z>2U13e}?DZ(jr|(q00^vW~3+_+;V3v=juZej&r$YU!8VXGc#P} zaCZ3on=9tJ7j^9|=ihZN(5v;u%qP}Q^%Gsa)gDyqMjyYiprYuPSw!o{ojN*dw~4E{)l_h= zWV9BTW;Us6>bd>W{0CN_IGe@v!Dr6%hY2S3qHccG@~&}i7D-0WR%+}|D-4f%B3pHj z`E0FF=5?7~-Tn({Rav{0zA=keP7ak9{N^e@@9GtUcZbWqmK5JR_w0h_MKQ_Smmj&x z*UhN^aj-UG)x34*?bqz)m;Ru*>-mDRwq49y3SC)r@!Iwr4EYoU9%e#VzXvFap4trLHYABQbyn{g#vAhkDaQ$~2I_QAgRgvuq}i)Y?+ zIk~K;Y_@ktUY7iwO_tomH|aAD*!(+=~~vpS4soEJZzaIbeOpQl{kAJyGf4yPZ* zGi3?0|KvL3n{D;c+EVskr{dXtJCEGsQ)^tU{{Mabzbdq~eSaRkd6o13P0Gs`U!J`9 za`%4y{oS|h|9pJgA3oi_?uPaL&&JcHPdC4Q{r|Cj^Z#$(wR7vA?f)Zh--wBeym=>P zUi|hwn>KC@{r`TxA;WyV_22ZK#qP|v{+Igi+Q0YlPxk-+{p8o(qfam1d^x#(jcx6x z;}=ivR{viy$>;y%<^Fo-?PA~T|NZsNo2)v=-#W#dRYv*q;|c0n3Gyqx%&6bB>eXT;gC0}H;~T9{ z&KG?L;c~qGe-RAoA&9{4=Re>VM&I5A;f-SAs^?XC>_`??5*vI_* z(^T$5-M-T0vv)tL@VIw;vYx!}k+q*Ew-OK{vU-xf|6Iut?x>W22XBvC?cFZ*MlUol z+i_y+wTL@jXZo(a-(79pCFO01v}siR@HkkMkD=J(qm;{L`vqc0ZIfLO>|anmVd`xI zqn|4e>$GlXJjeRY`G(ense1J<&oIW?O=7!{{#H5Z{Eq*PZ@K4sN6+(l!PI?y;(k{v z>7R%Dyw^k7Pp=ZK z;PPg;dGF{9!|?x#+s*TmGd`O*+eb3lr|gL;^$eLZqsHjvtp~}ILY`i$RMx*zc#dh+ znq6mo9(Ps#PvTzI^Vwznv68KgrQ78nW%5t=NmRGoIPu-YCr>WBya`;-yWsqU?$W?ptK2tdO-dT#Nf-&=$@W242Msb-|Xo7x|~V?&0j6zx7JYmrmh7jD4=peGS}2 z54G2M{=F4>=ZenCx1VO~YHn-0#Pcnk)oZ%IMuTI`OXsftBQt-|yI)_KK8LCKU2Kv1 zZgOD3ZhbA4=DAZ}f4Qap_Qv|+n{Fwg5#M(5RvqD(`f01^tF?~u2L5_KL;dvBG^)Qa zhur^j)WB57o_kT=l5k1J(B0DwIR39v{-kqT`%~-6IqB1P|J=FY0aL=wS<88?i>hRt z3p>nq++K40;^RF(W+f_F-G26S>$yIzNmpGz&rnP`t>U&u<#_&f+l3FooNRc0^Zc2ZqzaWkvtICa7q9Uw64gHcGD$D_>hWjXGgUc1M&I;y zS7+b;G`)U{bj!h&tLe@{G{iyi%;9#OLw%JJFNe&m+!EqF(b~j!^SY9 zJ|q0!r1~n4=T~k-topaBle_rQ%^f{T+u6df=lqu zxMlixDgzvfn0I@BX}_@1zhZisL(05wMN5tHn>{b~S661=S1VhhQEBywbz1C;6F*X9 zwyw~&T;h7SZ%3=^MBd!@vi37LI%bAyRI@y95Hf&nZVwel%kevl_IcBW2dHtNK=Qd|VY3-+E)+vX~X!=4bZ3+jU7qxI}JFMqU2G z*PeH@nEYfPmX$axmC(NW`hfRRS>c`D<$S{T@&fE~b5slrKh-6k&=Lxdl5s2w?F*eR zR`tf&t$WsOZ(lR%H%qN1=1MY$i>6f=Sm<(WIb>jXU32kyW3Lr@ZW3+RQl`9FxpB7r z6rY2pOuS6C$qO0Ok1E|PuvirCT_l#6QOwcw^zM;}H)X@U7xpJjaKjS<8FOZL?f`fLkbzQnGbEZ?u$9T&5 zM+c1ZbXp%Qb28Pn&q!!}jKMjd4VbQQb6mc1mz8zd-n!Jv zT9~(oa+MJCe(I1 zFJJjaKu`L}`b|w~d4;oN^a_4CU0&d~Eq&VI(Dg4)b6ZHfUTDK9Bzxy#`q`5lx_-R& znMrf6v%eH*oZ%ugW3~J>(da6vja){_H=gncGWbNYIZxcgY~nL-!G&D z{>w=|n)Y+-zlqPDFl}M7TUDn$qy8zrsn>iSw976riHdfr)5^XPVqvO2L;6x;SXPYO z^?ld=K46(>dq9e-YsJNzD%qRrmOQJw@b`?9sqVL)ts7%EFhtiaEL-n>Loc{`R|xB} z=kxnAPcwaxmlTM0b+>1*n6o#2Qi@6GfrGJ=H z>K761lGPiwuaA5FSn5ZJ=8s9QA2Bj+UNEK3vL|!e%(yEGiz9w8aM_K|BDvCXdxDNeO`Cnu zev|Mn@vc2SR`C&uJ<)GUDvm!Dm|wlUb?&r`5IfT|b}dIv+D#VH_`UMOor9~U)EE7F zUfP+r=h?o!E$45=EYRVeqZ<%(WYslKr|XNuju)m@_A=?dk`-TT-J5XHXnOvmc|o*J8BK}xsG)}m>P|8#BDDV%)9NqI=i;w^r_xm}4Wh!_@!JqE!OI z9ZWaQu5q7oc;%)*Ri7HxjBx9GgF|9dn~K#X6(zl=d5Ku-Ts+Cek+|~FeHFzMX)QBb zTU~ynxA8n_dBOVci=K~%$R9mF8?84kQ$&)thA6Ds`|Rj*p@yp`o*jKMQ&*QetfXk$ zq?Ce?K2{zVxwCHjj6+Xe@whJ$bV4BcgLIKg_5yL~KUWtWoEb8uPkHvF&V|{|e+=~h zG+549WN|;+YFdXMlHZ=V=`!9szp z@rWD4M1C$~g=U%OrS6q8KD>*~J5+ZlZO*A}_EuZ2ut=mlNK;?FbdvG9)Tvo-HcQmD zM;v5+m%`rn*e`p*pWt^39?D&KeU$b9Vh*jFGr{l4&l8WAKCNb&-oTyB z82TW~=l4W=>l->x-WzOY_+%B=loYo6-|^a#Ju9BQJaF>XRiX1o_ne%+zR27u+@?_R zsK<>8$Bw6W&eUqugoU-ICL7FEv12uOvCuX-vmlqzVcUbLpWhwnoO;pgK}+D@l#}6! zj~3@0X%p`Gu3geO{Z{7g=ND}xwkWKrkgztB$+6Mps_I{NX3EB#xw|HvuiYN)$;SPQ zefw5sS^lSIxowgzExfb2c=#_}~5CC8aw`!v6mbaIf$GyMO1NnGg1_$<4EQ_dkF8|5VN|q6}G2zuf+v zcl>>;!;xc)ekdg5x`^K^F*TbmD9*W{vwvGgUm4pPro>wuu6Ipq?2fd(wDww+bLA^X zH>*RzEcG1q*!isI9&o&MZTb~t-JhY$D8$EA6TCsn?R#@R%M-n|zg^>*Z~kYf+8mPf z-TUmq@WYLP$e^9!3wS?p4 zBTEgQ-LGVNf9JVWp$A7u)1ea&7c&;i*u2?o$Yf-&_q=|LWN9+n%TS5M?_aHENOfa9 z^~ty|KkfaD^?KzQ$+DC0rN8bxy*#<5Cu-)Gl?QfZCVO>O^z3=z{Yz@@>3L@53)Lf^ z8w*7qYP8E0eEI9jnXf+={eH4LhQId68cUOXFA_H1d|e!*+h&(m9&>#5w*1()W1WcjmftInM$i8L@6(PD z)oDD;NoG5A)^P=@_jj#j68_DQ!Vj!ER6XRlq2$C z(&v2j=d6zu&+NCk7{4t)ib3#T4S(PHZuiZ<>f8U;|4F!3-~M<1)=k^y{rG?V+VwEG zxBv5V{>$6%`TD=k#3S>8%b9RqvsPm{zY?y5;(NQ3|Jr}#T<7Eb{pW@SPa~#oc=zj6 zSAo&;>79C8F3O#G85)1<*s5st^X79;{CVM(rQh{ST72E#rJ_rID+bF1xt400OxVwn zwflV1Dgh_u;`IeeziLhu91C?0+YxiRcB-BVLD!P_q z(-ov7vh94cS3Gmb6Te>IJvHo6@d2N%&Z|Nk_Af0L9PGX{)oDh>o|eSf=|7s!+{ru? z&Xis;#c^9uLj4xkyrcq8XM+#M)8A;{;+Lp6YpOkKM&P>6j3=`;EzO+0U)5zwz#jqM z6S`N9$cgGPug&;qRTs(?vxntXd_T9Br$S=+31{=q6%LLm&%%wl#Y4lVuPJ*qe?9jD zzv2XiU#2bhG8djZ&bemYVrSC_zTf`^c#D3rRIn8J$91H8>)u?ZUuQox)U9V#%f6M? z-E=^ZnSpDTX!ye&u6x2Hm!6G&zd&Sy?7B0ne(smwxNq;a^{;pZZ*#u8z5SHE+ODrP zkEiax{4r(OoZyA8qr3*Ph_CGhd%eXRq4JsCTDstEh?XyP6}CySvw3 zp*1S>()HNNrjUkrw?8*ctM=M|~12)4FL&oz5LT#hNsIKOFcRpv}(B_BP8ADMAH z*BdQ!y0|3|yi0XFH}7?9YLEB4xGe|&FSwv9P&dQ!IuGLD}|M{%my|y_Sd+d@#a{;xAw`SQ?@h_h$p8f1f%-XwRhf26J zw`5>>`n00@2UDsIOPTbd{(ent_`CLh-M$(B>I>Na{%835|A*K2-Fh^I@81JS529(?sFyTZsOx54GIpv6G|riu-@hVMP=jS z4+WPVx+jTTy7;kLrY|5?U`Dyx#%rIhn|?d-^G1SgT9Nrx&%CxPC58(xEIZfA>hVw5 z@e@0*(JVgB04tv(VvW6-y%!g_o$y_@PU5*psk|7+=x|J&{2 zRVUEtO5S~R2ROPlt_ z^+rNmEVH)#d%dD`#^z z3wni&IwprZnrBCd-{Vl7T)t?zLThE<##n_oQx2BEZISoyoV)!p_F#^X9D`0n@ieuH z8$LVPg*WWm*vKqs={jLg{jZoKulhJSqxU~N8SwLB;?$=98|SIZt`vFx$ValHbO(b3 z^OHB7u3xv_lSy~g>GnNgbD#IB^0n)mmDVkvzHim-^hZwfw$5th&YmEAPItoLOBa$E zmKLzpO<}oj6(n^o((wQ1ve{X4_$PFo>X+X#b=6^G?OhLLMK*<<+FNo@Xq{4vjsLgF z(}K=!n4ew)aN7P74YcoP4(*bl|-FPw%Zj|NV@M zc^g;!3c2w)C2_{73oaJEKGrU|Z|`PoI?Th~$7A8jGEtG+xl#MDP0=zwF@Zm87P&D8 zF*-zTvAeCfb^eTbQ={-bg0t7Oj9>Pf-?`>`POy!?Am^;6wLx-r zibKOfwxkJr%cC?HwCl2$um0bApgR6SL$m$cgTb6xIxW{4+`4z>J_uj7$4^$uvcJdd z{iF`oy0{f;=4}%TRp)x%UDM8~A&`7?^6y0t+@FYCa+_r{Q8D8zOLxcAcMN6U&dBON z`*UvJ-(Nn(rw{rU?7e*TzlZC8jS6PHGZZp_$c5+Q^xMS$u6Y-NZc7;zpt2u3RaDU~42|GWhF(}VJB#>6K zYp&gT6f_Uz74KT(He8!&G^AOc^a=#BX{EM_fM?8d^sK7V{Yj5slCtaYG(BA7jvIp zRC_c-_FG@j8L_UQ14`|$T{t!_y>jl-t&D{eHcxn}xu0iFY-Un%@be=!XSQXlb}8e$Gv=4)CYjvyvb8_u`CFrH-uqM6HZ0aYv-IY?+g{%z7gV<=U)`&rf9m_o zMKNdk?=9}$=v@D0?$2x1j|xw1uQLvG7Jr&roAaahW<=xa&F>>Bt7N`AFd7Qn%Bv0W zj42MQm(*bMJuMeGgR^EGi{=!?~dvCAk*#!xF5Pi$cB0ZTU_FJ$=Xp;Tg z-?P>oO@H)ARLX_fup`0w^{V+lzuHe(JMGa$lXJ(r&#v+_+$a#9A!{me;+_1(*qPIm z_rGdqs?fGx{2=eb><)*T((kIrS9tXw52^N_K4*S}{c`0aw^(C2gPwSMiyRDb5BLmxx-hB-$K#lKf9SqdzvMkt3S@>?ONP zr8Y_>9dgf{@~pc2tL01lMU9&e z-7S)|XZMQr1V+A-ziW~Eak1F8c>a|f(`T%CAFyxE_0COEHM(wfVSSQiMGMFL@GUa~IEl#{OFxR$*`O2zWlQ3FZldua^LZ^92&e^P&` z;VNugxc9eRvoFu;g{|F;O}W|aQoTK?{U5bYtTMTtvrja__0jrydarh@x&D#+O?M7o zLdApLx_R}VC8hS>*eEU9ZxnEN@?6i@BR(Mv_vQaEgb2sxAK^H&zJA%20E6EK%{nvk z#6&mxo)J^dX4n(GHC$~b4QidJYCPT2@DPSVpOxUv%Zg6Zh_u%_UpTm0O=U zsJQ22`a;fxcAo@`&7vJknr5+OY6qxr-kvZuV3U{8vi3uJ-|$7uuVptZlYg9ja$U@d zK#e%YXe0eiK6Zu?&OUB4pCmt1O3{3gu)*kTA zGiO?=Pd-|lCULvaF4!$);zTov*7RL-6*9wmw%wIe({FojwkqSq*Bcv-ihE7yoOMUy z(1fbeW#N~4+NbUFXS(hpw4>zuXU>>l&Us&od7cRESXTco>5O`|uPkHCy7kXvGn?zr zt?K#ow1 zU)ftFj*hOpF-(i3{S3eNFW8_hBW9RAqna^7)%#J^?Ein)Y>3IO3Y?U~TykH$BY{o_}p-gs_d5`OtWV_f>2_T;&0lV9*Z-yL$oczwdu38#2X zN|~4JFuXgT@t5I^1hvuwtq13PG_YA&`P6Oo%9E2Xb{$f%3!4;nqm$`G%yS9T%!kGo zou6vWOX+whWblIF4~u}S*12oX_jX$gd=5I_(`6of;@Fo;HqY$KllfVnHc#n4^Y@TJ zV926Y4Q9?`s+*5H7Cpb-kREz&LB=6rg)f)ha~_}Sw0YVm?*r`V>nHZPGsn$4^ya`f z{mHCQm@MHw)B|a@YoQ0|dZ?;E^&hGdw^gqGk{Y8U0d)3|_eq@#RO5(fI z<{;U$MahdMZwZf`p0Bw3&Q*Q+kQEnC6i;DqJn-vE_pkdV*U#)+w5uVD=}&n2)_0fs zCgon7SQn?EDq><6%J^E4ui?97nbrc1rqdb!j=z);=ZMJBvOE=7zE-8wDB#|?Hwwa` zXI*6G?V4J#K7>g(^Y@$>z1?|J-2UA>7x?Pxy5}=isB&1JTJE{@M0sIWju_vfy~Pga z>cg}H7D?Kk%IbX*GCyj@>pjuaqmySp`MdOXf^cIcyNpv97jL^jO%BU}w8oapZ(M`# z+f*HkU$k$#^d$|uEEhF5$MwF&%&vkqSH*>=Ox~^ceC9(oBT+VqNi(*4I_W$}W}4dI z`ZmI0MyWH~)I{rO1;?)$^813A1r*KpUv|F7eB|C4+t-3ijOtS-%1yhL`fpZrX5b8^ zPvu@K&(+=jx5ZZE+>{SNRTUEYEA}&5$-R)|(fh+ZtLk1+TlK+9?HkirgP)Z+=(O!r zPGogBHcfJRN_UIne|sMTL76K*pYm+nXsJ@3Yr4JAB1o#Ob|ZK5LU8Cc*RK=2gA6_o|Q1owHbBo4auCrsRJ0 zGky7{QETUWi#|)gnf&w2#G})jSInQNcA@pvr25Ff>o<3*iO${hLuO-(#q$VLtIY+G z2}izkH8>vEW31eGK-FNU_x^=>cQsbMpL}BC8`a>-)`@11^e(i|=8U|ujz7Mu_4kI? zvXU?E=BHiwVfjhi@2lyjD;jTq?Ylltj-QN0EL0)p*e9B@3yGW9)W7XqGetz@y3bv+)eN7uZ(LJ!B0cSKT=i^s z+1l*3hx}*M8O()#_wAUy=4eGwY0oFy9fFTEE!R}>$9%sMdAQ1G&;JdZPO|43)fZ~N zS?jo8_UQ5zpGE%m)$P*AjqBQLQpPH=c@dBK@}ti>^4@>Rv0k-8PN`b>Pt_Zt!}9BN zIiIa(x*@gU?xTy7<>f51t3U0JtFhW^_3K04%Rg_Q-q+th=iUFin`{65_;!5t?+XXh ze#TD^4-30C;eTmyZsq5R|G&=uxPQ~n_orF2*Dka%d{eXAsZ8$5f>)Q;{(Qdrp}+lK z6SIuu^p*f4iGt-SEr@J^!0=e_>fsj(~G z9%h?g%f2vTI`4}enqL1Ln~z_+UzP2@KWoapV0-;l={oG}i(fzQclx$J{NMe_JU06O z&BM2a3IDX;|1j`hz4@pAKeWC7XH5vwbgN9|oj+G3(_K94a~;kT3{xg&4ujhsny-uh4V`z^dbq3ZJ14T?1~uY^5nY6Mr7 zPFB69@~hV9lfz~8xm+LCC(H~n_q?R}gIo225_^bn=iSy<-?{{hYNWPBW@Kx1J4j~h zOgLL?IB|VYocW>4fB6qKe%nyNnSLQ;h0C&BH?AFCN);E?SpTOU{%FRr=S))DwT231 ztNUN|m$S~YJ7cSL#eg-Ig?-+ua1LG@`CcCB3#nJG-+yt)^`zCDtvBb?nZ+JII6c~Q ziKEaHKQ@8YpO=*`o7I!vQhV-Y#gn9>wJ2AD$iW5r?%B;+Kf|-rySY8Aw={Lp&x12l+1rb~ePh`c*)U4(T=d3)seRsF z@ju5nmdx8Je9AEC!5hVyJ@JJ{olgcZBbeN+h?(%yN#hFReCszI*1qlYDRrjBE8gvEu5)oO4Pz|gSSfaZ$JFDrftLR|;r?$6 zrUmxf-F$!d-~TVaPhR|Y@9G_$KfnLoe0lZgy?4HM+OJcey8r%v z`{w^^fArt5CGhIL;$*A%GvV0Xre$FjdplIi_l7LGay?vqmT-o>%BFl#k=UobTt?yE ztk)J-D7`jwz1O|x$ZMW+mpiRr+%#31e_CqQ-S+QG*8h_z{xnzoe#85!M?MGFUDsNC zU1+Mp-Va-R0$=t#pI2mK5!=Fjm1p0zw%+we%ond-?_E`Da_-{m(~{HUDq?Pl8y&B4 z*>A|PQrY0rhkctmL^WD1yBBQRJ-hKU^DFjKyL?!u`$+S23g};I6%a6qO!cygJbBbb z@UZs+qiJg!HiZ?x{`<#iuYhtd z;skg9y<7j+{@_hTbdv^cm`gQ-*t5a#K{^!~~`(J1MGyly0 zMd}Qh%e?>pewksS(Ld*3`I^cbC22DRK^n}( zybv-o!BEZ0+}WhXXWp`l=2IeAgM5!n^E|mF-{fA-ET*5;(dfUSApdf9rKlCvWN4Nf;K$5QjrjIC^u=#W?e>uKRO#u zYp@*2z2N7V`kR+Qi^uA5Nw7V0{L=NAyY5}%d%b#z*1nRTrL3x)hKe&8AFBU#4|_N( z?Son4`bFpX4=qc0eNcxp{N+C_+es4-n@^XY?r(o?|Bn|-Ubue!^7qf->hBL#5+A2o z`^nriW-prOADm__^Ka5u<;xk*l2$!AQK&v;UFWppK`iO(maraan)=Rf@{5~+Ds%by zY}lrr|Dlw|w?;-s-e9s%iphy(DGp{!-pKEA5Vu^dz>u=uW>25WjO$U$|IfJSm;cq5_n$nT)?Bn?Qc*Mi z0$pLF+Kom5vo_7nWs6k$6g%ncJqxqEb36C!gg{2W%`zKa z%-VX0Eh$gaNW6BMhRLo4b$R=%I+fqQOZAxKck{Vq?Yc&u(;8o%Y!112*)z%}=F6-p z4XS55M3-9cQj20Pv!3tPd{BM5Oo8pI=^LW1S&8=TTfT!o@79#Ji+Ucqv3m*`rcAu0 z%v9q4ZNnbLZHBV5S#~P!GVzjYtGWN;(9-tWxts3!TbyFA3yZsM?iqjOrKHzV`MRIn zQf?tmwNXOXIlQ;+^}UxWrd4+Bho11e!u^k4rQ9u?owKMo+(F876KC_CtA!Kp_D(#{ zz}LHJlN_7Kt)2s$ybr|AGWni;lrJiw^P8>JtVMoX{pZi|`O~p0?5`AG-`@85wJ$77 zHr&0ilvAeN!8FtDhpB(MdEu7NAE!^T`n+n9<~g-og9j&$ybU%|@OWu9c~S6=IURpA zgE<*$*{hs>-pHF()#!KYt8By9#Fnjccav^eRPLL1;r#K|wd~e;ym?~(I6p7@t9jwz z*P}ZQr+j#$jwnsQSz}s|%eAnBPhi@_d{rZ3Xl>d9}uKy1g`dk0i@c-xP%m4fT z^Ss@^@}F0S@dCEyw_92?kNnk}nQ(5#y?YBI?!Bp)?9E`MZQ$CbW}fXT%;2|3=(l;& zNp-nXFAn)W42+Rpt?g)8p%$ZbPJiRXC0h;oS@+zTxadu1pn%&HP6OBO9akMCF} zsZ(3yG$rlYOs({yvrFzMtv)KNFnf1AzrbSkRs0Kt-)_%enRfIx@Ag|;c~?oW$lT&_ z;btw#&S30&^8Ce?BZ&oEd=;x(e*E)2eU5#_>WTjMeJ@seOPhELI2<_6%CIl+CHU^T6t{%YR=kxA;{r*{3d^Xp%3ZAKENlY8d9`(jxrPny1*IxnpX; z`{gYzvIfpK*1whF&S1^_n%Vg!_e1vTRjnI1e0aAUsGBOaYo_yK&nbo(&HvY3F?v4b z`sFiGiTk%bTf%)H*~DXJv7<n01W!-eTJn!fWzH_w~$BreP$Tb$|V){mto zS0c3!$~0Gce~9hTYMk_7KkHgWlQS9`CcLuARo&M&u=8=*fGo}lvTUNwJNv>YhzU1Olp`QyPG6K1C!rm`fys{}f{&hgZr3F=d zTP5pUthj>sF@Hdu}I}ebRM_CJJxMJ@@+?iT)^RA@E(e|6hQq4iVtTy&Xr(fQ8O zc4sTD-1btr{)wxf+=^sk`+8ok^wS;l`1dP|TC#62Hr48Fs%$Cf)>}8}`-cb(1eop4gSsODF<8CQi(5$gJXkSt?SlDjJZ$Fe)w-Xquer)F zTl{Cl4sU-im3-s7N8f}O2AjMr-zshuKTFKefj{YIq<4FE-sKYo{XUv&TVy#Ct;hbH>Gcg;G)SZCXB z_ig)mg-qq`OZj|%uVL(~y`d{AVFrke3wPeJl}kIQC)_zq^~c7P1^U1W{Lr9cDfc{ABG#0 zICwVN=1gKeRsOSjYt=E6unqEcQ@1YFX8!W%_126zFPEBKGO%TmQZwJkapq@JQ+of! zGgr2+_&fX2!dkI6bBc8La+~HQFZyU|$2j4O;QyEF_FlR4=Zw+0=ihf-($MR%(0)`m zFRLk9qgf%+s@L_Hg7b`9m*$?9vz!oN(sw~yt?8Td%Ou~z)7r|{igtW2z3}Mvor)Wd z3%*?Tsjd~_yzH{|M#cf2reAOS9mJwKxup-a`tWQy_1q&@TTSrR*O(2n3{A~HX5G+x z!7yvi{M_S{Kk~S%goK84Z$H!CGL_HG)usL6+N_H|g#5W~?mDC08Wk`-eAUaxfe)1` zW&h^hHL00Z$(WQQy+r6$I@hc|{X@Ken4fhvw8w?qe{|#TH}-6iZ8!hz{F=ujx^eTA zOGX=+7cuj(%+wZJT0EU4VaLtCJT|Y|dGaJTC(4$;x>#T*!X>sOP~lkTy{AH(ZBIA! zXU#nQdav0_)rD#u*A}grq2IcEPU`XVDt;DeqPgGO&J?9TVd*>ZuqLT(O3%Cvhj)q0 ze;~+W{&%yIf$6U5nJ#JGlUx-YdJ`G1s<6s@N||lbv{t3+qzd2a2$A26TM{goXKqs7 z*m2#DH>F*uTCJd!XO0-to1-6|$vrPzyd`+vgCpNvr8Y1*|2#A0ijv$ zSFOE0y(#)!aH~$u?~@YyWv)DZZJ;x;p{D&}$=g{k-9P-f9Y6QJrP=&PvNgZ`LyupH z`MdDL`?IIaQY~V;KllYmuJ8YUz@8yVK5mBTqVwGWypv279*f`kb<|w-tz^jk-*5ly z*Z;S>a_{TJoij9RYG;;DZ z*%sXKr<#&(>Z`82VUWH4cFmntn~%*my<*Ot{iw-q4^y)(V~5}`+lM=x7Kg2PE+*Um zI8jDfH#zOnfr%@+4lcPpZC*(Es&Nr#%BFdFV$IFI|9&KuzioByZ@B!p`eH+%Z;RbD8kx$CXQ z!y5^|D!EUXE;^w$A@?9(YV*9p)o(<61opm~B5ZzY|LR5mHwdPwxUnwS^M)^ARp^a< z2UWEgB?Xs9s0SCHZfD=n}1!RiM-6GTS`T?U3R%WWxM_5yEa?PKCh`Z_CJ|6 zFQfiUXsdWygV&j3J6A4@%hfJE^W@%wh5t`-%WydQKVoElzA}X0YjKewkM)%@iKlZ; zRv08s=R5WGNux?s@u4{0iw0e@ruC?|i!3yJWuqo7ohp2AU1^%=#&dUUQ9;Z@uO{;h!$_Tr}V1OWcozx(hF@?8sR;b=sX9ybBi` z6F(>O_t^`k-zs~y8h%sXed58~*?ZdzeYOS1<$Udp{CzPzN%s@qi|y|jk-Pe{mU^+=TOWGBVS1vU#p)@>o67&@G53my`k#38#Y1p%MYwN-^O49Ech2%1 z&F^?FxF-6WRFq(v7?JanM%MCJxjBkaL zfTup^R7K%{DCwMui;sz%5>UFOmdJ5<(&!FxBXxD`IFzPz=qEpTXx8} zrJYQaSs?F-X{gW=r8ua|05^`^M@v2Ab zPaodu@bb~u3G-N|Njf_pPn9p$nCcN{EcI}DvzTRIQ_IBSv#L>bI#=F2KX0WLHj`Ph z&B6MH&SR6f3)+d_U(FO0?Rq&iV3+5We-7n*%Z0o-7@mGz+OD=N^?$f?Pgdi$!$zGa zJXU{GHFmaS`n>%~@|G9Hsk^wjJ2tYoi+TB&%>JXYRJ(llb#J%F`@$Bz&$|B9Q~S1T zh~*5|z_W_pLN*}+olOi{!Ac3UkBhZFuzRyY=5-CbqrhKJS(}>&#U8O(+zNep$SF2= zzGc$pWxMqJmELh?ubrc^`^cHQ38&;PFNttCKBe*dZFy#M(a6I_4Q%&H`58}np1YQv zz<$${J2)Yvw94b0kSdQg&*duSIK@-*Sgvnm*x=6}5Lx&0O5U~E8Pm?G$Fs9o9Qwb@ z=GTXpM-0E2O89+$^!HWk|E)&<>pA~lKlbaE^8f4RNB##*zAyfzd(B+d1^b*HP38DB zA@yRzhdE(AJUVH$g2!2Y`)%TOT2!@mqsKwtfHu|hj`u@;$CxtDT(b52?rTS$&9&Sr z&yv={dOE>}t?~3XK8Fnt4EqyWf+H>+2o!5p`p#(l?ykIHla<1h%OBQ<8Wy$h zHn-7{f5Xf8#eLHMKTDmv$~2c1ys>;1TJr9d$^7KrxY*m3^(755{)r!gZ!G*G#b&wp z_7XiFkvn@2ZqH$`ju+38SrosnOXDVIc+0tEU3I&41+x4XZdX%sdZ;Ho;o|b2yGX<-CtV?jvLhyCF4o%kRE+WFy3)kr>0c9m z-RsiSs@%EruY66VWysAZlSHn183fs$dgPHV9N!h?x_jzv#BoQ;xZ+u@8fdEq!f#*Sk*T7JnQ6 zn(O3;r|$~2>r*X#+4RFb^5g#YomsY3OK91>;*(}sC%B$#GF*LcbG|EJlA#!9d=|f= zfWe6n_u0|gN|yA#*~Pu{N%xdFcc1J~Xg~F?(!;#@SznYTFUk2WW~*+0t*Ws&gZE7 zXW_y)JF&`J!R)^Ej&-lnd=j~&PP2tv2+uPPDe$<${YO`~zu7rYX8lEzgO>MhOkS#} z*1XK1ef`W`_WOUHJr+>8=zvp0{i9z8qnP4(l+Vw2p=-#Npv%VB{<2_?{yip#lYdV4 zAC)hea3qe$*KW1C!Md!~tfwm*)1SV+=6n4W$NbmT&YPT6)=GVLtNi=SDPw=&UM97F zpZ?TO(=YdIKj$QR zeO)c5^V9daH4)BhcyilG5jeS>#E{dX7|Nx37s_8GT`5)FYV%|Oqcp^KBcW5 zxA&%Se5A$xJF^O#Qm^!#&Ht(||7%Xp@&!_FSS4qjcTktKuA9B*(@gWN&Kw2P92pMm z=?+Mc_El2zx#V!mPpjqc&I8=#Vv!df9+h}=#_8;j4|CsCwr_o-)hm~A<>pL<+J+L1 z)!$M*1S1zc*A-pW!~SXc!;fJkf&gF*5D1-=Rc(f-0W7qvoAJ&e%$85R$1^{RKc{aqlN9|^8+X@JV4uV)E#aVscdk}<%O2I-$=eV=)vLJv=7Dcnb?t7- zyJGLv|4LVI6u-m##;u|3&30!g?aEt^e$RZY_=aKgb;Y&8I=P+@+R=asc{m)mQ zf0h1{@A;l78~MVf*hbSoQTOkOyzU@}`(<+`X`Y*6znjZC(x@toi)kr+b!F$9)tc*iP0ZgoF;8)yT_oUcb^n;-+5ZlIK2_Xs(Y-v)tgAy- zJ1m@g>fRr6*Brh)me4#FVifb(=TFEBj?`aU=HHf|)?PN%#vm+QY_4mv>)iJp-P`9L zxVq`=?8_OiL^?!xl^4uOI69My$6=qzw?#s&G98Ndn4;#URI~?eJ#|22K}*-w%LxbT z7Q5&7T-?$eZfxnASfPA2J2@kCyPT+`?5^X?yw2|`JW91IwBtnYhMk!9#V=w?(}}6; zukW}l+Z-_UzKq@aB>Sg6f`9#3S$h_q+`Q1FQFO{=Zom2kT!srX&z!2@xOm(x^Xl=^ zb2AcsTfBqUo5)R)O`Z-IJ(wL-Y zN)zuDg*iX+mrYWPY)a(q`{;3GF8|7M0ii|dL0_5gUbySisXX&%YohLVvHi*d9hQFs z51njx@~-E2Z`e~%a^WVoDf0p0eQ+KjY<4v;7rTpUaeLtjU7JKhR_Vb}X^es3)WkuPYniABY?Q`kwfyjG7=hXO@#Ppq=E1tS+wPyC@U7uI= z%#ZxXeUhCqbotzAEt}d!4|Xn)FWbwVt#SM7#fmystaC_q4#p zEskq8O-~3kSvGC=^U$|9{yxh8^6B1WA5s7C=ik?aon0DRCHjR;WA%@krtG>41uHiu zUPuq@Z)9N2?pQD76#dRY`^7Jj>kbn9c1(u6n=F~OtA1N>Q!ckA>tbtEyLgfI)z2d9 zL~ky=wM#JSmE&D^r}BqCxwu~mK55+SvV2;0df~fwj*NmXGwTey#BQ-VsN7n*f95OZ z$;)^&j_+M9=cX_tIOR;vD~S^V0lzgCnu|7V^KfRovuv+G9>W@~%V#rw{y4?=aZ1D2 z>-?z!Wh=QiYi>0+YBJ6FxW)FNNnG|5$=ggJ&-_`}Ix{;*?(6mrxp;petKbIjYf*QL zS$>%sKJvM@J?-q8($qQ9kM?ePYqrd!!3VH&QIrIX?f$oh4#;=jH>~^=vnfNb}}R z{XV1bah&<-y7zC+UfuBBEq&wGjK%TaU&(lzm*`*$}*LJ@ZVpc8sA}A4WExqaftlg{R*q`t*E17?foOXZFL3Z(|`b8pt{yqD> z-fC8;)vSQ^CW4RjmtUz$HT5+0*|gOsR{vz`=5}k(&rt>^?u#9I!BODwNvHmu^Ylq- zlVsFbmDi-7S(#aAblGR|O6BCgljp1C#dK&Nd}PRca>B7B*T3#%Nz?Z5rEGn!Zy4NJ zy=Bs@PTtCP&&w~Iryp*!bE=n4;?T9ayJO|qY^|NXDkW@NC#tkQ%TA9>vYf2>Y@*Qj z3#l7zmoH^*G~Crz!~N9ksr^*v3r1(Mz3w{SoM9cfw{)`Un=qaQ)n_EEDj6P&F{&w+ zo`^M@%fzg1-+28(DMNyzo^+1%wvwkib6y*MbDjE5MR|$^lZ~9=lPCwZR1fq1MFDE} zCs(oFeDlEdP)l5K{?nhT)o;v&j`PjT?rG)zCOzea%Mo{-gZfE}BDD7L9sBUOzFzRp z^v~U!S8x8idGgZJKd-<4x39kF%eybH{s~-={c%2e_34iPn=JqT6a4>l_QU-um+yL)T8BMQNjdoN*mU`+k7gX$-=V|NS}d}5Yk9o=R)*Se8#~#rrPUV;S%sc+ zoUhb<>EjT+TDiE}maV49ZQ;LTwhxzmXS)34*rLrBe~VhJW7Ll5D?MT2rgCBTI*B`s zIcF9L#_j&i(Y?&F?7}MHNht#E?1IzGYfnEB^0@k*(QS?On|mu`r0b9F)4iqpPl4^^ zy^{ZFpU&=@|2~@g$Nt6J=7|4f?7A$|A@VkB!h+dG5&2!)WR2AJtaY3e8M1W|SMfbY z5&M;M`mD;LvN~>FXB57&e8R_bfeb}vj)Et?hq`e%ymREWy0v7-%p=x*ZPS~tYX|gZy zMfbMP5`NkEd(-isKdhcftd_0X|5L}JUEM11DF55E1LkSbMP3DspQcL~87mZ@&;7D& z#+&6=7p2y&uKxLIkI~loQc7iu0~UNa$y%(ss^;PCwdqyyado*Fcdp08@V%(jcHXi} zk#~Wo-U^Y4=C?oQDefs=D0V$TJL=W(H}|H!_}_5+NV435E6%T<%D>btwc|e%9IBjI zyLRfl71weI>>HdGFcF zwYOf&c&)1z=nO3XRh7PR>((~`*IBn8f3s@^DJpXzFGDf zuzEeHP&VyO)KfXlur20)>~Xa__v33G`5OPcJX_GUc*8fow9Q+LHr@;IK791nBHMQL zA15atd(s%(t(?5Q^y$?bm(+!ARw)E9_-;7lTd$>XrKikLe%b2(Q`*}5sjsLsN zzn%IurR&1RRxJ&~NviDY)?}_;blYU3e)QqQX=>SrUu;YN{J-+r<4oythez)o{@-oR zQgZG8_Fabm^$*tHyHWGyf35nz{g2nb`rBQwpfTE$qie2bg-y+`)PIkspPKk5#DD%- zdz)hUZL62tpRxb*z)mOB*P`yh8z~Jdp6KwdXHzB%>haEV6H8@Ve*C~x&0VvdcC5PY zJN+=*_T#;dS@-UGeP3?qa3=fwwM#W$)GidBxHYxwjOPiVeSNE5WviT=l*F5`tmljM zs``C?4imO2C@t`=6^MKy)fvllsk4UND`l2{zFjY|&GL$%;jS>B z=e7Loo~jE1Qs;hRY)sc^?LPM>{hj1(W#!u^4A+?+JzYBEipqgBiPwf&u@2pa6BAh) z4zd)ty>Iw1?`c!Zey5cQX(38`?=!o~OgnaBvsCiM`6j&9nvbWfc-K+J(vxt1>eNed zEYrW9D*9X;s&{4juU~%_IK|b{_m^1Y1Tv4nMIo})M*@ATAJkezm=`SVuGBA z+un6iZ&bHEIQne;=fdT+b9cJRt)2Gj)SW}@=bzU8sgcoAIsh?2n+1vAAG0Pbi&*|Kr)2{r-A|zDjz|8s(E3 zjXJm8dbGl+SNZT?F1^hkmaOQxr~bchf~4c8zb3L~PgcF0w|uf}g^3~aWuM6A{VCTE zmmhGusIij0HCkPHY17km!3T$G?=3z(S*G;F-xC|JrP%+!rs0-3Z~o2`Q(yE}_j8p$aNbdccl5!K6cfPy#O61zB4!@FJ5BS=G7!86>i!EcE@H1umK|_?in=R-4`V6DW;YYQ3zW;7=T-`p~^Zd>HvLEO9Z5MrYvXU=*-Mqeo zW1fcm`P1L_CdkJ2@838tA?>Dg`@f)LQcV2{`T^ItlrFGvE}b)P+5*>2hcb^93iY-r z71cYcuT~9UYnPe5`gY)y-zih-mn1k}e;PjPvD|HG2Q~RD@qC|m8xAZIuG$^*rX}oZ zxYWM&cQ>EAqrKuwdHdJHx=|68J6*S%F6-`l_(_xV&> z)$M?D{OXb`ZmTJCKP_R7la9Zve^)G*@y`c?1w1d4wH~Zclay@s^Jsst?M=jqHGi02 zOiR#Z*k!9LV6reZtuK!ug!`aU3oDnC$hHFS@w0# zsvSMJVWYgoob9XBnix)Ane_T#@=32E^+mIqAD!P|d*;A_N7GG`w;C-;X5Cn7AE-Xn zHZUj1N%g^hDR0}2Qm^bac^j7aB{h)#-f~jZc4?&82jm>FAhqdW#0bNuS@it_te%klea%RZlTcH zea$vwFSo%u1DE%#El(NPcUne2ZAj%)UT|q9!=h{6{I|Vls?WYr_PJrP(nSAFR+nr4 z%FBc>9-4jC;^476l~0~GrTsNh(U=izk;fxB=MJM;>Xn&nkFWfkx>xPOfs((D-Ol&7 zoKZ7o{4pi4Yo(`Bgo%eh2je-tT{g8rJ55~e=R2v3wj{LelAIg#oVBUt>@CYV*EX^R zu2-4ty`|`J?wP-57I22OaUAW-4)F?<+|qDEAT#it=cB&fx;pR5FoqW;Sr_Lz*6w() z!8dtoyYB4HWp1|Df9=oIUMhOcJf^7G+*~~|Z(mc(M98Md1tu;tI^f%EzHq5zvhZ8nZLJ#Gh>p}`|X{}S@cXAd(Jo- zZ17>vkolT>-s-qc@87hZc)nX2ooj+WhG?;0eSORK^_u?^C*?hQHF2@lx?Vng-CQOm zHRY~^OY{F8u;8**d_J|;>{nf(>7qaHyZx7kyUX8e{d0Hm<=5rQ!_&p%-*q!gJo`T` zE;i2h(|+^o@*m~*RsJit`CmKvz*^HS4pKV|-prZG^miSfT<6n@>*xHcKWClDzIq}3 z-86-lv!kzlaXgikpfYvizJE_U*YU37_nkj;_B3I3_vT2gTrrQ?qS~dATf7bASL^-w z{&{YKNBE_6C5B}Of5gvBOZw&N?0;{1yS4q_FPCp-7}!Z$nm;)ax++F$>YT>;X1d*6 zwH_DsCarV-Ang0EH%_}~a&VneiCVZvt?i$e$%Yovb(yORvh+e?GnVaHW`8#R`DF{M zS2q`!c>dmX<)l;Czn9BDJ~%r`T93C>LGw}JuQ^o>a+hC3M6RBd$bYKNbJh6+EN2$m zPyfugL&E-%{onkf^_x<@e+)lT9~B>c?}pF0|5JbMh8`#Nf6wLmtsN6&rB8m{_`>Sv z)>|85HaOScsdzHCW6I}kYrAG{7o5~`>e?T<9a-W#e7Tme^POeBz_0xJ&#nVU_!^(i z=dLe##Ju)P;6i2Fo!ZyCmrU}#BcJS~ny_i9aaZhy%(Jf-F=y>QRA=bUqUYf_`?bvN| zdUp$fg*1IUF zZO(}(%{qCjYR7R2--ODoiLQs)I$oSvaF_e7%Y?%>)@~Z_OgXp@TnFE4@$Yep#$I?}VhYQ)hYLxv3j2EDGH^^M>qS(Wmpj95dwp;1K1IwM%!g zwcfmL=I`Q%#Cm+L=gj-4u)B0YPKL9VSsr_TsZH7zqlwvbjob8|zBFi!nkAyF^D;cX zYwGlQVwW{Czgu$lG#Yw^>YS=s+S6WWuukj)Prt?PTXKnal&$~G6@Jkexb_XhB=_3J zu=>hF{M)CvNuA43+AgZuBGQrEvpq?2%M8Dmbyw~5_)f6%J`}34{mmD1a_3sTDt4pr zeTy5OTK(K~=xv9!@V&|6TXfSHQogH12Z<#qsFp2#@7Z?cd3yO<&ZKk26PacPZcgO9 zG(-7ThljwDlMhszH?4|)I@@1$RsY00waZ$kzT(`uOx2q4Q>ym8!_GXPuJ)JR7QXDU zh>4|pTGGK=OJ<31|DCPOqBl4D%KGybZHeE`Mjdml<5|5>Ble4wrHcRN=-8-flekuV zQMehyvX=47huDc)&U=Nm6>E6{TqC@;s1$RQ9^g2UE;6fAuua}fd(KAV)vIKutl&-* zxme{^drM{q*UXM7p=bX5cXv2`Y2|@PC&8~iEz$|wN`I*|KV327fchbCm-E?L(K9@x z(s%zkcIp1SGZW6M2%2QsOj{zjvStp8t$1sIK+w7r!`3v7sh_Jq{poJ=*1dC5QT3Q> z?%xQdTK_Ex-Yb`0y0BU*T(w$rU2ja^8}F)VyYi1DELUz`Y*Z$&<9v*Hfr)9`&$MGF z!;7Z4rXPLdGAWHKKyG^EgD*lG1s`uKydSN4F6MlCZol@?OJWL^g}=C-^pt$Cl3rO7 z>B_yvJK@m31T!g@i>cRkFz$Zea?-bG&`AD*A{Jf@uCsF~?#)+I7!LA@3CyUJG%)Px zh1cfQSIQcsHDe2ONv0-L7iR=m(!-BZla^Uy?}Ke0!4 zaw3nGQR43fCDI=zcf5b`@Uuhni+cwi%X#Tb?Z1Auu06E*Y+KocXRne%!#Do?(xDQe zqN#5aYZK+AJ~=AUfh%pr#Fx9CUb=kuj&P@XR%1$9#J%J$slBXI&dhvd%(O4=gO7x! zk$=2s*vjupd^dDtyr;Xit4kY1ojLf(Y1OaysqaF0jxAmwEq&3T(dfQQUXOyu$=MB(K;-~E-E(UWCY?PyxA zw)>||z=uyax#lHkGs;<7|MJ@Y&a>>&)k8UD%qx=BwHkzab}lL3$Txv?(RRg^QFeRJ ztp1Vy#pCz+os*6w{aNzY_xe*eA^+F=CrP(=F6-HQzU0pg%UBk+-CKAxSp{E~g}qr* zuz7~ufr!b0^N%bI{~x>cu*mj@wZ?hj``0M2sV|MaeaPoz;%zTJ)!<()5+SiY7QG2f zGba~2zSVfM$HPzVrH#jqH6NLM=KeTn^;&VRt@!3r_Q2QfS0m*Pkus8 zb5cq;@-NM2;`EnTU?VGbzw%XnX??ogOBSA;%{FT)^M6fzbw;^8!SlthU0dSTFTcBI z&QVPfl^@%tOYfezq}ylJtiJURzp8lloILH@X%}CzQ}Fh}5;L7gEAKy#YBt!mLaXKf z$_HPjCMT7o`{$%fTy1|PykU0F>D`xHU)En|ZC{wdO|a zl^d2X;qWe-`epr$EytY1XY4y97CXz#xML$j{Tzi&3Ewdt+(R=b`E&6MkPQ<@XME#-@(X|UVVvl6{$Cz#*N4t?rt zdw%n?>8EE;ce&Rir?TkxBdLNLGk)cSH;B|E-kY4_B6ex>xu;$~ept9q71vz4=z@&T z8}F98UsoM^x3u2NtSs=&jm1UzmYrUo{7y8VdAe;Q*pU2=T0srtu8xzbYsn-^rvU6ZuwO6-mh3$>(aW|}wU z(iTdmOJ6@!vrPPH;_YR15{Hs|J!e*!p6XZ0J#VGAlx@v-k@f6hy7NB%TcPdlRXXL( z<$JA3F~+lbrRpWwSZ2MPGr_cJf{IuiSB~2v=bb+`sLbBTC($5kyv!^0nucFc=C-{z z;^(Z&U&i}6-1$JCF-uL+YB`~6j;_buQ^UO;C|1rdh^*##5w`N|qAzb0u5j4C{%}8m zU0}Mt@4eG+juqr3_qg*bznmw0Bz0xTQ9CvE#>?jx9rfHkb%~@$Rfm4qO^*%N#issk zQd@A8X^P!h;RPxyCnqd5)~ggVQPWmb(-7uyuK+&5a9XMbSJ8P@ylH6K~#{FceAS6mgV#Gjk??Pk$q{!@0VXFVz| zsMfSQYjBi(-<^jq7Tvcfk?9vNe&l-SI4{fdbrMErh3>1KR_#ttHT)Z={=R(G6M;>i zrEYs&?5dk}v}fH$E5&c3VQsyO*0?D>FDdwUZ-2DI-u6jST{$L>Rl8YOuI+RAzR{0C z;BEwW*;Y&8Tw%R@ei=gp4!6r&k_Dz(Y_(2U@n7T5^1zF7F(UDN|1FsR7rwoi*71MK zuA=t;KinVNSN^UyW>~SQ)8t?9W3vnL6XyqMa8xiG|K+g@O4j?}E<53ct^GH{RT^=9 z%ufm=FFnhwxcKwuvap#4TZ%8A)RPy{`ggF!;M={0J2sTx-eSb}e)UGB1(8|FoN<0T z6hu0s)NMBHn#;3h6DJ?b%B;TcXO8VT@A7Jc<(>SMGgeH$nd&fAh~H`=_W`B*uV-(c zef6u@jnyI_ubeNuYkyJQU@OnU!)8UF8d~?(#ZI%hq@WtEHt~@Ocea4lmAU>qJIY_0 zsWeTpT(sfmlm%yB*^6?!xN zq-E1f{a?XCKSK82x{oJ_UxSMFH2+q_vSw<=(PR%WaHojja+|}_2LFHi_Ep4&E3b&&xFpf>aJkrZQ!|a4dl@=*mmaM6 zaNH~TW7OY5-ujxP{d3-}_?>+GT=J@4GoFbwio9pF&gPul<;j*7@uqb5AH`*_+%8O> z+Q(EAI$^;D$4A_O`@d)&lNFB8SUPo4O2VV1{mZm$q;DSQT2*y;cd5v#HOGYx?%TUv zEizN$|BiOoS>Lo4KIL>XIPmcVM~s}*;lLMLe|51;Pd|0id{ISZSkGjk&#IGUYBsqm zh?G=tN^v%vzJ5w&&(6O=p+(#qBKPaAUmj`qtj@TiC}_#%C&yEt1wL#2KS^=Y4WGg} zv-ZSwM6=3PwbtoxblIS3`i=R~G~1hkVGrb$=JnrHYdWE5$tkhI*5tX9t0af|pZ2SI z7EPZrbwo~G-emjPWVLs<;&de&A?EiMN)e_%kMSK3cG#CHaBxv;^GspBbQRVrquj>= zn`d}!*lb%QUD5m^ebIi`qIGhKK03|cr({nuydEC$$|l0LA!9}Hql@?dHM6sNt@C=u z{V8js?a4|(W3hhy)B<1lg0u16db z749hhnDJA@EZTrXP#1(QN;X8!9DJ8^RMmYjHRv$uunHaFgJ zNJcK6J~4al#x=_EITM_$v`_G{3w+SZP2>?ibdT*)#u~9&mZ&c)e?7j^@X_o?(CHN7VzEW$|HLbX=q-xd&{B1&0yB{vhRFQinG)dvl2kU2be2fyxH~XVvZg;Q#>=Tx# zX;kOR^I&GWqtw)ppZ-G0H?Ay6vU4i6J2ZVmW!TDQLFV9uo2P#6-v6G27kBC;t74PyrX)guCkcM_pPL2hIBY zHeBeHd5lhWahm9bS0224s%83x5W!IiGv_)5IBz%=F3}m6p#u znz?kw?#fqDjh$)XDeXd59#&8LTHTVFZY!(Kv0ue5YWk7u_}tPwZo&WaUM{jyB2PO<*DCcs1U z<(eG3a;t-kFIe`i;M8Zhf6(T2u}zRTqnh!lgF60dft<~2&TfdSd?~N3_F;$J{Y(BU zTmv6D@bEPJ<=WYLNvVGQu}`&4ieKZ8r7GIo4bqL7;yL5#YR(m(eMBqQ)YaeF5Vt~p zi~o@aU(M&lZ{=LJ%lqr`)Wc>6Z4%{#oTfjSd!kR`aFXZJL(FR`dd_rDZJKoY{gcIW zsu^vQI|`Fi_f@`gK6c*tYn>72jGy-+A52#X@w`zz>F=@Z*(NaPOnCo* zH6YK=cHW#u$QNKh*6P38*Z)pHcQxzoZPAf) z_P4Hy54c^Hk{(yXn)7HW%f}Nzt0pcF@O3=l$;g}1zWe{4PnE~-2up93Fj_rxY0lcxKM&&eMvzu}@X1CtU13a(r>b>*8r?Qx9BQ{6Zl!aGGk- z)1?}spLT3boAka~?r88LmTRtF99m47i#M~ZwS9l#?71tCx7lj4&e&bH)7&g}){T(+ zrykXMOy|{K(DEfY^$7C>!Q%qEeY+XjCf&CaO< z_9y1FB3p*pwyTBSx?YmaF*i$<@%S^j(4ps3;_)9GL0reG8hBS9uD=pE>%;LC5C1EL z{>%Fj>Y1+*=y4$P(%h2@>udBjA3wi!O2X`QS>n3dZ$3YoYE$U#u9uN!5go2|qiXK# zTjlwG>%`J%?Ks+J#wZH&VA1zZ6`_#Bf_;<-VXRk+P<5yeej1+C9ne ze)VIU?uRUEWD2&=QeV0y$!o^(e>06V6>|@)Z@a(fo8aE6tA6oUcM1k}%}RVH;M?W3 z^Y4OvKNA$3s#K#J?t7WK|1S+aX2r~DuCqkYW!IU~ogNL!I!P513f04vj&WoiWN~z} zn{)cazdrYa|7&$SI6n2C(vR>-vvjz4$$SD!T+*B`emv7odAFypt#Rk#>b=SLc&_yu zlbG!*M1||NE_`99=6$Z4VPgD@-h>Gki`;*zwd!nY8xV3oNsyDw&MTWo;Du|HCU zDyMy`?{_?QKKiIjGf&|5CFw2466dctzxIpcjSu{qtGXZBD4kwn_~L{~?xuADzMFTZ zZ;1Hfa<8i*A?EVj+pmv^DaCrmYWYa>YD{c8%vm;JLwLCUv*>eNtNu;*>6+CNxr4V% zYwEU6t231fEFWjTKds&_xqOBV!)mir>DSL~O;>!Zk-aA2y{b|uug{a1)>#vLL@(;c zotW{d$LHYu)Lkxd{eNCsF$Z=YG>&sS?c@20S=iH`clJ~5xAzxMI;Fng#@duc(UU#T zoXA-;#W(EV1u?m6GlJ$+dw-J@`+PFz!o1R}*=|J!ldYAU?7wV#aWZYkX&ttoht60n zv5fw*>rYJiL(k=GDd(rB>?)m`$x^>}`H_PLER$F3+D*5S{Ie=y;={`Q)YaZ8^y$0pW^J;p7UjF(Ma!UKTOJ=dH@9Z_Z z&K0;XIr~*3*J#ZuZ#9XhCLX;LR-RSZvh`{}+E?A8pEc!DzL%7hnyOv~GU!+oFx_wT zeW}TQy*jQnjO|28Mx|ZngXFDR71Dl>(lkxYBRFQQ?Bf0yDEq(v>nrY!-|p-`!mUSa+(lEGM?#NGDf&{P{~i?`7xHA~LQI+b4Z&leIcb&yYv6Vi}5W;$J9#m!?E zuLr+scc~4U)1x85A!X*J@H^&KM4m^L&Fs~u8NR8{-odcM@I(5HuN{?ZYdN*+lx=VJ z>ZEMhwmLt#V$$6U#}anQC~5t+^j!PNDPJ$r&}oj;gyJ*8yBL-BnuX1-#wo_*zIoX3UGAk*0#Q-3{e(^k=Oxt;dqK!%G~#vYS~<8tvQ zzprxnU4M2>`|WKvmcPCc%6oEpm*+;&^;$(6Dzy8KYLYY}3NT`<9)ZEB5RRp0+_D?8ePoTS6JNX87v$ z8q6@69r5tVgwK4=jh|F~!<@}QU@i0BmOYPjoMs2i`OLB4@XueJrk|E5L}+riyGDDc zPrX^1@yn%dYjS^^ZpOice3gJ%&c|PG^UX2iy>n0ZuCT8{d^T^sRI~Ae+w>MIhiDVdOIOS#o1W>U>+O5c(I!4ar9jg=rbx#1^1hiIClq}<^d?s_ zvYT9cDUi9uWZhTkAkmri9q-=eODi5d7kt&>v_9vLbpbD1Mdgz0q(2!p>!cubIm1{mfCuWtBbOovKbKNGoSiIDpQur-C$%Zx&Of^8G2f&gVjt_z#>dC}Q|$e} zd(+Nc8zryQS1g&o|M366$sg-a{<|;0aARA5=>PA@-!84LS?yBL^>2l8*$R${`&DI@ zFVv5Ge|~>=sn`a!l*46Vw>nQBVU_>2-B73U&br#8R@=5ZaMw@Y)@&p*IW$AT;_vj* zJfG=Velc&4d0PeijAN3I<9ihy5fQWOR^5i=qq`=xOb^g&BxzZC{H}iATVzM^MW7#M!}+-zhBQfD7$NhmdAy&s$b8XwQX3k^u-~w ze-o~Sa@pO!+j_o4Y1fBub}Q!|uel%hra@V^hV5zdK8^Uyi7#~?zf#rKC}0TD^u1S| zX7YNb_yZ@G3pYyE`(Ddlb?k7|(kj`VbrbYe@7hoCF+3)|y5hyw+%v0+ltec>q}K|6 zI&@=Bz*pY+aTDhs`;$52YKvHSi(td8ldmT)@HrpkdsJBYZNlWYMF-68bW}a+*zrVd zYKy}Kr{JH?Qg&)zTP~d28?$6}M$DvwjsQ`j^XR+Zs(4yPX$n zWApg*v1L)YH>bTeU%6Y@GJ3wzLB)5WVVw1nm$D3GX89hP-uXr&?{zEBXDPc19SP2d z?R+!Yvclvd4yUPIEPU|rF5izOOC-WGCakSEsrLHOj#amEmdGFaSifk8mt0`K zQQ*_*VMaM+A|57Z(vIjD=e(&4EnO4fvU~cb|Aj3p)AXbsJ&2ew=ldxs&IJ#jb}cz& zzou>JgDcPaH+ZE)d|6>rw!7tI#npM&j2N$6+r-X!W=f>@>=~zK*BM-&?Gsxud^?y{A+l-oULZt z;k_G+1M8=JxV)#Wx2Ui9Lbl!CxXkyf9a^$^*Y}+OmbV143Y>95PLcfIgV&(bisyW!zfD}6J?t*Q@R z6=_Whx%NP@%fGBRvgJ;e8-2F(~Tf8RIelQxE3 zIO=twwe^valy23BLzzCCB9^QZ-4P)*seO&qTB|jimbSc~ty6OH{k4Dtdv1xwZvN0I6}za=K z#=M4H3&x6BxwX7?3j*%;^jsBP-Yxa`=hGJ-_a{tMes*i2nX=tEoi3xk(qKI)Uv6uu z*@07n_S!hT$PWJg)#GbwxBBAA?e}h7+w6Sy`_HnEDaUm_Ev;PsB*rRQe}Yzzw>pE+ z)pZ)jJiX*SS8iX#cl`_JtjOapwb)ocoBU9hlhQgV`p#{m@WDwFHlX(iga!=h7d8KK;{Vr{bzwJlrYchX6Px;f%_dkO3k-eGR`Zafs*8lN*WPh)I z@r(XHsg=9;X*FA%x{$#hx7^OQTyWFRjmZ)}&!_qvZCiVT0 zsXO#=L;OSgJd1O8UtJf!#x!BC)wlliBTH8Bc}?75IMF+TKlMZI?X-f0tfE^hUEkPV zs*Jp_bElE)6g;?=7V-U#+nf(cW^zSa`edg}+N4Hm{Cxp4%+Pn_zkC+TU{FY>JFkRMeCG6sBcc!SS!EPo`4aRcBceOpQ4@$H-p|+w+R%Dvm*XtiOP5wC@IPQ2-y6|AY^DUB(_q7)LKQS!v zS#i_DKr`p@BF%FbGYZ1GO?qT2oPu`v=FMPte{)qMv3Q}V`6AO}5s4CFA`f_9NiA$W z|IOl@j+EG5ovzJy^tF;S%!);%JqxTae6L^i;W4NG7p-jP4-Ivli)MD^E|Srgx|-2= z^WM*QD&HC;#V%JLm^OVX*XPsTZ>DA2sI_{2%HMLr{m{~k&4=3QyEV^BB%6rUoY1wO;8nQ6L11N3@D#?tUz#`X>9xBr zn&$P!d`>Py-0dUH{fw)MvNKpXZoe=M(r>+J(5Gm8)Ae`z1ZvVuDZkPK3@)e&8*-vT~u^mkUd@w<}KdP<^Y$dw-+k`t0b$jYr~C zZ^^tB%v{9O_Low{OG?bL>@K*BGKYC%=8lcadfF&rO_+t2z%Hm~pbGD{_m< zhC0!or&fBV)Cx}2RIyA~T`^Tb{;bA=t(=0MdsMD68{1jG|5i2SX6TpLuBfQ`*QY1$ z)X4LGc}#*qR@YGbX{_-{SFR6JKAc&kJb}+{jgnrLReGq?qKT8Xu*%4WJvrtn@{;fsP1-g#{ThGd?=iAnQTBSrvqop?mWk(AT-A%+6?9Q} z#_6~{TRgVx$ZjoG7ge2*Wt|-Ou+8K3n}7+I945M?a_5DuZ~7r~Fw-$^qOBz=m6Vs%w*GL|PtSkzzc%_)R&yT2kUwOG8tyelih$^{{f<+nCico8L$5H|IUAQn*B8 zdY7Znxws9Pv7F_lVcUOH%6uyQS8W>l?NxBW+OQdmS|;&7i#njqB~YmvXBVF6##Ymx zaFDm|{Xyp({UzNRIn$W_gxs-gUixnR^P772Ej^u9TUCo~I$Rda^`h``#LcG?n(;f! z)5_%Hyc5?%Img88XBKq<^Xn7t6gD@{xs`S)TKrnX z?K4NK88V%@at_{R*&BK8^QR?svtu-#*e-6f`FLIIc-E9c`{*qJYAYY9hbkNj?_)AC zN%u-DIb|{_BTT?)*2d>5apG&^XQoZel(asiq#cm_V8w;-^U_A8F^-x}^TMtrt&V%x z)uYGJyt7NDs+f7s+Yi2-)8x{o^?iA;gl)!|8A%5%*G^Dh|96#Md?PUZ zreWrzgkrm+g=&SE$|$jg#dM?4ISZ|9xt&^x>2bOOKV&rF%Ix>_U3$SnL&Tk1vQye4&4U!|QyV za)M}vp2dWWW3y+hX70ZvTr74#JF#H8;qhntSS{~&AKcO0lCe};d1vCKd37JpK1yEt z)oxw$I%$T5>_0B{{#s*cEKvN~h4-qMefz0NRk3e+@}^DFz3Q`HUtcXY)Qk6-Vco`w zQx8j~+VsC)z%u!mUsZyePX#uS!1O<--oy&=_0-rPt1PZV^P1I_|$%~f82o&ssbO>TwjX4;=93- zw%@B)HI;K}OTymvIg<5tlMLr?`O0i~q~Mw0tkXwN_xQOBggvr8{&o6sxtlw`MxU(cWj8D;#SmWq$a~>}O?O z?E7}IU)|-kyk@TE%6Fd9(c`_H$4l**!e!|_9XF=4b6okoTp{60x(5r- z^Y_&{M;$n#P9_I7rG0e2r##;%k3Ie6Rh71RAKCB!mH%(b(z0YflY)QfrQ0>dMK9%m;smuld$?HX>2`UA4*y+ZL0CN$V8Wo)-N1GP^`Af5Cswgnp)u*+u~s>S_Gm z0e=}^C*oh*gn4p0EZ+Jnks-hC zL`2tlcagvPDY4fs=1H$+2@)#{DKgMsu|w0vFP8O;w76Vn%&IGDcapyprTPa8Cu#0~ z6Q=2`xqOPJq#Jt#m-O}tR-2vfgg3p>x}Bo=A!cXt+aGPUUO5uCmZ@%ERx2@A=%Op9 z^8Cr&PIqN?*QkUX;=l4sy7%ZRd*kDuQoi4wJ#X@{o-D~8HEp{@Kfa~Adi71!-)Gkw z-tc{Y=H!3NXDM+rui5=g-)7`~Hl&`5S?2Tlx3?>t_O7sBD9NYQBzQjR)b*NoQ(rE% z@OZenc|zlo+DGg!gs1l`)(}k8JIp8|o)p%wA!qe;Z@ISDFXu}iPI$K4Dats>r+uRR z{wcXTegeynA-bGOnX)vbU{oC(pTJ;$gc>$bV*~>c^l{ zyViHh%DoERmt@dcv+DlC*>7eFuTRlFKmQto$0P==3Z8YZ7TxTYv$?-x*7@yH^$%n+ z_HyR)opzkiD*k+1ZvMfN39bw)dMEz*dVoQwck_kw-#07puCMue_K`!eb#mlPlNp=3 z9K~zig|IvQSy3A%&wV>>v}3jgZ&TU?luc|-0+5Vsr??4|J^#Xl=F`UrETi4`C-?;AocdHKKBQrDLvC| z4bCVxTs)JeCL8R=>32!i?1-K2nJpW|PTaWL#4Bg^&+~yxijt!7<{kdJZW-@in=g3G zxcu>H9}oY}XVOf>RWiX|EIx@tb>{+iM;qdzXtox!TLskHTb z!%X=`=Dx(`3xD*TbJJvAyhZ!>q*E*8Zhv=)wsY8d|ADJ*+!LEy3YQwMm*{P|pMT`^ zuG_O6UokG7dDHey!Q76crJECSt}Up4)mB=6?HSL-s`^Qq{iQFK?|9nMHuLS>@b6~| z&k8Ynto8buGrh!U{_G13%MBKq_q+dnzM@ECZ_ccVTXT*qXOelg)TOGy`=fFFXCd*% zqTFr#d19A)EYx+T2a3Dx3--(Gf4
  1. )A85viJE;)}Pp8P$9oz;U?Wf=Cd}%e?G}4 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 literal 0 HcmV?d00001