From c2828f2b9b5fffa222cbe0df938e6848798b414c Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Thu, 2 Jul 2026 21:16:10 -0400 Subject: [PATCH] feat(skills): add security/unbroker (autonomous data-broker removal) unbroker finds where a consenting person's info is exposed across data brokers and people-search sites and files the removals, running as far as each site allows and handing only genuinely human-only steps (hard CAPTCHA, gov-ID, phone, fax) back as an end-of-run digest. - Deterministic stdlib CLI (scripts/pdd.py) owns config, dossiers+consent, the broker DB, tier planning, the ledger, email, and the autonomous action queue; the agent scans/submits with native tools (web_extract, browser_*, delegate_task, cronjob, terminal). - Verify-before-disclose, least-disclosure (never volunteers SSN), consent gate, opaque ids, optional age-at-rest encryption, file-locked ledger. - Jurisdiction-aware (CCPA/CPRA, GDPR, generic); CA DROP one-shot covers the state registry (~545) in a single request; BADBOOL + curated people-search coverage; scheduled re-scan for re-listing. - No CAPTCHA-solving services or anti-bot bypass; browser email mode needs no stored password. - 85 hermetic tests (tests/skills/test_unbroker_skill.py; SMTP/IMAP via injected fakes, registry via CSV fixtures). Ships placeholder data only. Broker dataset adapted from BADBOOL (Yael Grauer, CC BY-NC-SA 4.0). --- optional-skills/security/unbroker/README.md | 163 +++ optional-skills/security/unbroker/SKILL.md | 285 ++++ .../security/unbroker/assets/unbroker.png | Bin 0 -> 455219 bytes .../brokers/advancedbackgroundchecks.json | 50 + .../references/brokers/beenverified.json | 56 + .../unbroker/references/brokers/clustal.json | 47 + .../references/brokers/clustrmaps.json | 52 + .../brokers/cyberbackgroundchecks.json | 53 + .../references/brokers/familytreenow.json | 50 + .../references/brokers/fastpeoplesearch.json | 43 + .../unbroker/references/brokers/intelius.json | 88 ++ .../unbroker/references/brokers/mylife.json | 35 + .../unbroker/references/brokers/nuwber.json | 52 + .../unbroker/references/brokers/peekyou.json | 53 + .../references/brokers/peoplefinders.json | 53 + .../unbroker/references/brokers/radaris.json | 58 + .../references/brokers/searchpeoplefree.json | 53 + .../unbroker/references/brokers/spokeo.json | 56 + .../references/brokers/thatsthem.json | 46 + .../references/brokers/truepeoplesearch.json | 43 + .../references/brokers/usphonebook.json | 53 + .../references/brokers/whitepages.json | 57 + .../unbroker/references/legal/ccpa.md | 27 + .../unbroker/references/legal/drop.md | 34 + .../unbroker/references/legal/gdpr.md | 20 + .../security/unbroker/references/methods.md | 235 +++ .../unbroker/references/state-machine.md | 43 + .../security/unbroker/scripts/autopilot.py | 396 +++++ .../security/unbroker/scripts/badbool.py | 177 +++ .../security/unbroker/scripts/brokers.py | 77 + .../security/unbroker/scripts/config.py | 124 ++ .../security/unbroker/scripts/crypto.py | 88 ++ .../security/unbroker/scripts/dossier.py | 135 ++ .../security/unbroker/scripts/email_modes.py | 76 + .../security/unbroker/scripts/emailer.py | 342 +++++ .../security/unbroker/scripts/ledger.py | 164 +++ .../security/unbroker/scripts/legal.py | 63 + .../security/unbroker/scripts/paths.py | 79 + .../security/unbroker/scripts/pdd.py | 810 +++++++++++ .../security/unbroker/scripts/registry.py | 293 ++++ .../security/unbroker/scripts/report.py | 161 ++ .../security/unbroker/scripts/scan.py | 32 + .../security/unbroker/scripts/storage.py | 138 ++ .../security/unbroker/scripts/tiers.py | 269 ++++ .../security/unbroker/scripts/vectors.py | 53 + .../templates/consent/authorization.md | 15 + .../emails/ccpa-authorized-agent.txt | 24 + .../templates/emails/ccpa-deletion.txt | 22 + .../emails/ccpa-indirect-deletion.txt | 30 + .../templates/emails/gdpr-erasure.txt | 19 + .../templates/emails/generic-optout.txt | 15 + tests/skills/test_unbroker_skill.py | 1296 +++++++++++++++++ 52 files changed, 6703 insertions(+) create mode 100644 optional-skills/security/unbroker/README.md create mode 100644 optional-skills/security/unbroker/SKILL.md create mode 100644 optional-skills/security/unbroker/assets/unbroker.png create mode 100644 optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json create mode 100644 optional-skills/security/unbroker/references/brokers/beenverified.json create mode 100644 optional-skills/security/unbroker/references/brokers/clustal.json create mode 100644 optional-skills/security/unbroker/references/brokers/clustrmaps.json create mode 100644 optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json create mode 100644 optional-skills/security/unbroker/references/brokers/familytreenow.json create mode 100644 optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json create mode 100644 optional-skills/security/unbroker/references/brokers/intelius.json create mode 100644 optional-skills/security/unbroker/references/brokers/mylife.json create mode 100644 optional-skills/security/unbroker/references/brokers/nuwber.json create mode 100644 optional-skills/security/unbroker/references/brokers/peekyou.json create mode 100644 optional-skills/security/unbroker/references/brokers/peoplefinders.json create mode 100644 optional-skills/security/unbroker/references/brokers/radaris.json create mode 100644 optional-skills/security/unbroker/references/brokers/searchpeoplefree.json create mode 100644 optional-skills/security/unbroker/references/brokers/spokeo.json create mode 100644 optional-skills/security/unbroker/references/brokers/thatsthem.json create mode 100644 optional-skills/security/unbroker/references/brokers/truepeoplesearch.json create mode 100644 optional-skills/security/unbroker/references/brokers/usphonebook.json create mode 100644 optional-skills/security/unbroker/references/brokers/whitepages.json create mode 100644 optional-skills/security/unbroker/references/legal/ccpa.md create mode 100644 optional-skills/security/unbroker/references/legal/drop.md create mode 100644 optional-skills/security/unbroker/references/legal/gdpr.md create mode 100644 optional-skills/security/unbroker/references/methods.md create mode 100644 optional-skills/security/unbroker/references/state-machine.md create mode 100644 optional-skills/security/unbroker/scripts/autopilot.py create mode 100644 optional-skills/security/unbroker/scripts/badbool.py create mode 100644 optional-skills/security/unbroker/scripts/brokers.py create mode 100644 optional-skills/security/unbroker/scripts/config.py create mode 100644 optional-skills/security/unbroker/scripts/crypto.py create mode 100644 optional-skills/security/unbroker/scripts/dossier.py create mode 100644 optional-skills/security/unbroker/scripts/email_modes.py create mode 100644 optional-skills/security/unbroker/scripts/emailer.py create mode 100644 optional-skills/security/unbroker/scripts/ledger.py create mode 100644 optional-skills/security/unbroker/scripts/legal.py create mode 100644 optional-skills/security/unbroker/scripts/paths.py create mode 100644 optional-skills/security/unbroker/scripts/pdd.py create mode 100644 optional-skills/security/unbroker/scripts/registry.py create mode 100644 optional-skills/security/unbroker/scripts/report.py create mode 100644 optional-skills/security/unbroker/scripts/scan.py create mode 100644 optional-skills/security/unbroker/scripts/storage.py create mode 100644 optional-skills/security/unbroker/scripts/tiers.py create mode 100644 optional-skills/security/unbroker/scripts/vectors.py create mode 100644 optional-skills/security/unbroker/templates/consent/authorization.md create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt create mode 100644 optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt create mode 100644 optional-skills/security/unbroker/templates/emails/generic-optout.txt create mode 100644 tests/skills/test_unbroker_skill.py diff --git a/optional-skills/security/unbroker/README.md b/optional-skills/security/unbroker/README.md new file mode 100644 index 00000000000..e215e556ea2 --- /dev/null +++ b/optional-skills/security/unbroker/README.md @@ -0,0 +1,163 @@ +# unbroker + +An agent-native skill that finds a consenting person's exposed personal information across data +brokers and people-search sites and removes it. It runs automatically wherever it can, and hands off +to a human only where a site demands a CAPTCHA it cannot clear, a government ID, a phone call, or a +fax. + +

+ unbroker: autonomous removal pipeline (exposure field, the loop, ledger, re-scan horizon) +

+ +## About + +Hundreds of data brokers publish people's names, current and prior addresses, phone numbers, emails, +relatives, and property records. That exposure fuels doxxing, stalking, harassment, and identity +theft. Removing the data is the documented antidote, but it is high-volume work, full of dark +patterns, and perishable (brokers re-list you). Commercial services such as EasyOptOuts, Incogni, and +DeleteMe solve this for a fee, but they are closed, and you hand a company you know nothing about the +exact data you are trying to erase. + +unbroker brings those core capabilities together (EasyOptOuts' automation breadth, Incogni's +legal-request engine, DeleteMe's verification and reporting) as a transparent, auditable, +self-hosted skill that the user's own agent runs. It is **multi-tenant** (manage yourself, family, or +clients, each isolated), **consent-gated**, and built for **maximum automation with a human +fallback**. Scope is **US-first**, with EU/UK (GDPR) and global coverage on the roadmap. + +The design is **Hermes-native**: a small deterministic Python CLI (`scripts/pdd.py`) owns the state +(config, dossiers, broker DB, tier planning, ledger, drafts, reports), while the agent does the +scanning and submitting with native tools (`web_extract`, `browser_*`, email, `cronjob`, +`delegate_task`). [`SKILL.md`](SKILL.md) is the authoritative reference. + +## Install + +```bash +hermes skills install official/security/unbroker +``` + +Then start a new Hermes session and drive it (below). The skill works zero-config; a few optional +env vars unlock more automation (all documented in `SKILL.md` under Prerequisites): + +- `BROWSERBASE_API_KEY`: the recommended default browser. A real residential-IP cloud browser that + clears soft/managed CAPTCHAs (Turnstile, hCaptcha/reCAPTCHA checkbox) as normal operation, so + those brokers stay automated. It is not a solver and does not defeat hard challenges. +- Hands-off email, two ways: **browser mode** (`pdd.py setup --email-mode browser`, no stored + password; the agent sends opt-outs and opens verification links through your logged-in webmail), + or **`EMAIL_ADDRESS` + `EMAIL_PASSWORD`** for SMTP send + IMAP verification. Without either, it + falls back to writing drafts for you to send. +- the `age` binary: at-rest encryption of dossiers and ledgers. +- the `google-workspace` skill: a shared Google Sheets status tracker. + +## Usage + +Drive it from a Hermes session: + +> "Use the unbroker skill to remove my data from data brokers. Here is my consent. Run it hands-off +> and show me the human-task digest at the end." + +The agent configures itself (`setup --auto` selects programmatic email if `EMAIL_*` creds exist, the +cloud browser if available, and encryption if `age` is installed), records your consent, then drains +the autonomous queue: scan, opt out (parents first), send and verify emails, schedule re-checks. You +hear from it twice: at intake, and with one digest of anything only a human can do. + +The underlying CLI (run via `terminal`, as `python3 scripts/pdd.py `): + +| Command | Purpose | +|---|---| +| `pdd.py setup --auto` / `doctor` | Self-configure (most-autonomous valid config) and readiness check | +| `pdd.py intake` | Create a consenting subject (captures aliases, multiple emails/phones, prior addresses) | +| `pdd.py next` | The loop driver: ordered agent actions right now, the human digest, and the next wake time | +| `pdd.py brokers` / `refresh-brokers` | List people-search brokers, or pull the latest BADBOOL list plus the CA registry | +| `pdd.py registry` | State data-broker registry coverage (CA ~545 ingested; VT/OR/TX portals); `--search` to find one | +| `pdd.py drop` | The CA DROP one-shot: delete from all registered brokers in a single request | +| `pdd.py plan` | Per-broker tier, method, search vectors, and the exact fields to disclose | +| `pdd.py fanout` | Batch brokers into parallel `delegate_task` subagents | +| `pdd.py record` | Update the ledger (validated state machine); auto-stamps recheck dates | +| `pdd.py send-email` | Render and send an opt-out / CCPA / GDPR request (recipient locked to the broker's own address) | +| `pdd.py poll-verification` / `verify-link` | Resolve email-verification links (IMAP poll, or browser-mode from pasted text) | +| `pdd.py render-email` | Draft-only fallback (least-disclosure) | +| `pdd.py due` / `tasks` | Recheck queue for cron, and the consolidated human-task digest | +| `pdd.py status` / `report` | Per-subject status, plus optional Google Sheets rows | + +## How it works + +- **Autonomous by default.** After one human conversation (intake plus consent), the agent drains a + deterministic action queue (`pdd.py next`): scan, opt out parents-first, send and verify emails, + re-check on schedule, all without pausing to ask. Human-only work (gov-ID sites, phone callbacks, + hard-CAPTCHA sites) accumulates silently into a single end-of-run digest (`pdd.py tasks`). +- **Tiered automation (T0 to T3).** Every broker opt-out is classified from fully automated, to + automated with verification, to human-verified, to human-only. The agent always takes the highest + viable tier and escalates to a human task only when genuinely blocked. +- **Cluster parents first.** Many brokers are resold shells of a few parents, so one removal can + clear a dozen child sites. The planner orders parents ahead of standalone listings and ships + field-verified, per-parent playbooks that prefer the **right-to-delete** lane over mere suppression + (for example PeopleConnect's "delete my user data", or Whitepages' privacy email, which sidesteps + the phone-callback tool entirely). +- **Multi-identifier fan-out.** A person is indexed under every name/alias, phone, email, and + address. The planner expands all of them (filtered by what each broker supports) so listings under + a maiden name or an old address are found, not just "primary name plus current city". +- **Verify before you disclose.** Nothing is submitted until a real listing is confirmed, the match + is confirmed as the subject and not a namesake or relative, and only the exact fields a broker + requires are sent (least-disclosure; SSN and ID numbers are never volunteered). +- **Jurisdiction-aware.** Requests file under the framework that applies where the subject lives: + CCPA/CPRA in California, GDPR in the EU/UK, a general right-to-delete request otherwise. It never + cites a right the subject cannot invoke. +- **Coverage that matches or exceeds commercial services.** Two lanes: (1) people-search sites with + per-site opt-out mechanics (19 curated records, including FamilyTreeNow, Radaris, and Nuwber, plus + a live pull from [BADBOOL](https://github.com/yaelwrites/Big-Ass-Data-Broker-Opt-Out-List)), and + (2) the **state data-broker registries** as a distinct legal-coverage lane: the **California Data + Broker Registry** (~545 registered brokers, the authoritative universe the commercial services draw + from) is ingested, with Vermont, Oregon, and Texas surfaced as search portals. +- **The DROP one-shot.** California's Delete Request and Opt-out Platform is live: for a CA resident, + a single verified request deletes their data from **every registered broker at once**, and + `pdd.py next` surfaces it as the highest-leverage action. +- **Ledger, audit, and re-scan.** Every case is a validated state machine, every PII disclosure is + logged (field names only), and confirmed removals are re-scanned on a schedule so a re-listing is + caught and re-filed. Ledger writes are file-locked for safe concurrent runs. +- **Privacy by default.** Opaque subject ids (no name in ids, paths, or logs), optional `age` at-rest + encryption of dossiers, and everything local. The skill ships placeholder data only. + +## Tests + +85 hermetic tests (no network, browser, or email; SMTP and IMAP are exercised through injected +fakes): + +```bash +scripts/run_tests.sh tests/skills/test_unbroker_skill.py # CI-parity harness +python3 tests/skills/test_unbroker_skill.py # dependency-free fallback runner +``` + +## Safety and ethics + +- **Consent-gated.** The engine refuses to scan or act on a subject without a recorded + authorization. It is a removal tool, not a people-search aggregator. +- **Sanctioned browser only, no solver farms.** The default cloud browser clears soft/managed + CAPTCHAs the way any real browser would, but there is no CAPTCHA-solving service and no fingerprint + spoofing. Hard interactive challenges escalate to a human task. +- **Least-disclosure and honest reporting.** The skill submits only what a broker requires. "Hidden + from free search" is never reported as "deleted", and residual exposure (public records, paid-tier + retention) is disclosed. +- **PII handling.** Dossiers live under the Hermes home directory (`0600`, optionally + `age`-encrypted), with opaque ids. + +## Status + +**v1.0.** The deterministic engine, the autonomous loop, the verified cluster-parent deletion lanes, +and full broker-registry coverage (the CA Data Broker Registry plus the DROP one-shot) are built and +covered by 85 hermetic tests. The skill ships placeholder data only. Live agent-driven submission +against broker sites is the active field-testing frontier. + +## Credits and license + +- Broker dataset adapted from the **Big-Ass Data Broker Opt-Out List (BADBOOL)** by **Yael Grauer**, + licensed [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) (attribution + required, non-commercial). See [yaelwrites.com](https://yaelwrites.com/). +- Code: MIT. + +## Disclaimer + +This is not legal advice. Only operate on people who have authorized removal of their own data. +Removing data from brokers reduces exposure but does not guarantee total erasure. Public records +(voter, property, court) and offline vectors are out of scope. diff --git a/optional-skills/security/unbroker/SKILL.md b/optional-skills/security/unbroker/SKILL.md new file mode 100644 index 00000000000..3888e04d02f --- /dev/null +++ b/optional-skills/security/unbroker/SKILL.md @@ -0,0 +1,285 @@ +--- +name: unbroker +description: Autonomously remove your info from data-broker sites. +version: 1.0.0 +author: SHL0MS (github.com/SHL0MS) +license: MIT +platforms: [linux, macos, windows] +prerequisites: + commands: [python3] +metadata: + hermes: + tags: [privacy, data-broker, opt-out, ccpa, gdpr, security, doxxing] + category: security + related_skills: [google-workspace, agentmail, himalaya, scrapling, osint-investigation] + homepage: https://github.com/NousResearch/hermes-agent +--- + +# unbroker + +Find where a person's personal information (name, addresses, phone, email, relatives) is exposed on +data brokers and people-search sites, then remove it - automatically where possible, with guided +human steps only where a site demands a CAPTCHA, government ID, phone call, or fax. Manages multiple +people independently. It does **not** defeat anti-bot systems, does **not** act on anyone without +recorded consent, and does **not** remove public records (voter/property/court) or accounts the +person controls. + +The Python CLI (`scripts/pdd.py`) owns the deterministic state - config, dossiers + consent, the +broker database, tier planning, the ledger, drafts, reports, **email sending (SMTP), verification-link +polling (IMAP), and the autonomous action queue (`next`)**. You (the agent) do the scanning and +form-driving with native tools: `web_extract` and `browser_navigate` for searching and web forms, and +`cronjob` for recurring re-scans. + +## Autonomy contract + +This skill is designed to run **hands-off**. After intake (+ recorded consent) there are exactly TWO +legitimate human touchpoints: (1) the intake conversation itself, and (2) ONE consolidated human-task +digest at the end of the run (`$PDD tasks`). Between those: + +- **Never ask the operator to choose configuration.** `$PDD setup --auto` detects capabilities and + picks the most autonomous valid config itself. +- **Never pause before individual submissions** when `autonomy=full` (the default): the consent + recorded at intake is standing authorization for T0-T2 opt-outs. (`autonomy=assisted` restores + per-submission confirmation for cautious operators - honor `confirm_first` flags in `next` output.) +- **Never interrupt the run for human-only work.** Record it (`record ... human_task_queued + --reason "..."`) and keep going; it all surfaces once in the final digest. +- **Drive the whole run as a loop over `$PDD next `** - it returns the exact ordered actions + to take right now (scan, poll verification, re-check, opt out parents-first, requeue blocked), plus + the human digest. Execute every action, record outcomes, re-run `next`, repeat until + `done_for_now`. Then present the digest, report, and schedule the cron. + +The hard limits that autonomy never overrides: no acting without recorded consent, no disclosure +beyond `disclosure_fields`, no CAPTCHA/anti-bot bypass, and `confirmed_removed` only after a +verifying re-scan. + +## When to Use + +- "Remove my (or my family member's) data from data brokers / people-search sites." +- "Opt me out", "delete me from Spokeo/Whitepages/etc.", "clean up after a doxxing." +- "Set up recurring privacy monitoring" (brokers re-list people). +- Checking which brokers still expose someone and why. + +## Prerequisites + +- `python3` (stdlib only; no extra packages needed for the core engine). +- **Optional upgrades** (the skill works zero-config without these; `setup --auto` turns on every + one it detects - each one converts a class of human tasks into agent actions): + - **Cloud browser (recommended default): `BROWSERBASE_API_KEY`.** `setup --auto` selects it + whenever the key is present, and it is the intended baseline: a real residential-IP cloud + browser **clears soft/managed CAPTCHAs (Cloudflare Turnstile, hCaptcha/reCAPTCHA checkbox) as + normal operation**, so those brokers stay automated (T1) instead of becoming human tasks. This + is not CAPTCHA "solving" - no solver service, no fingerprint spoofing; only interactive/behavioral + ("hard") challenges the browser genuinely cannot pass fall back to a human task. Without the key, + the plain agent browser is used and soft-CAPTCHA brokers drop to T2 (human). + - Email automation, two credential-free-or-not options: + - **Browser mode (no password): `setup --email-mode browser`.** The agent sends opt-out/CCPA + emails and opens verification links through the operator's **logged-in webmail** using + `browser_*` tools. Nothing is stored. Needs the inbox signed in in the browser Hermes uses + (a cloud browser like Browserbase won't hold the session; use a local/operator browser). + Falls back to drafts for an email if the inbox isn't reachable. + - **SMTP/IMAP (stored creds): `EMAIL_ADDRESS` + `EMAIL_PASSWORD`** (+ `EMAIL_SMTP_HOST` / + `EMAIL_IMAP_HOST` for non-mainstream providers; gmail/outlook/yahoo/icloud/fastmail inferred). + The CLI sends via `send-email` and reads verify links via `poll-verification`. The `agentmail` + skill (per-broker aliases) also counts. + - Google Sheets tracker: the `google-workspace` skill. + - The `scrapling` skill for stealth/Cloudflare-protected pages. + +## How to Run + +Run everything through the `terminal` tool. From this skill's directory: + +```bash +PDD="python3 scripts/pdd.py" +``` + +The engine stores data under `$PDD_DATA_DIR` (default `$HERMES_HOME/unbroker`), written +`0600`. Run via `terminal`, **not** `execute_code` (that sandbox scrubs env and redacts output, which +breaks reading the dossier). + +## Quick Reference + +| Command | Purpose | +|---|---| +| `$PDD setup --auto` | **Autonomous setup**: detect capabilities, pick the most autonomous valid config (no questions) | +| `$PDD doctor` | Readiness check: config, broker count, and which upgrades are on/available | +| `$PDD intake --full-name "..." [--alias ...] [--email ... --phone ...] [--city --state] [--prior-location "City,ST"] --consent` | Create a consenting subject; captures aliases + multiple emails/phones + prior locations; prints `subject_id` | +| `$PDD next ` | **The autonomous loop driver**: ordered agent actions right now + human digest + `next_wake_at` | +| `$PDD brokers [--priority crucial]` | List the people-search broker database (curated + live) | +| `$PDD refresh-brokers` | Pull the latest BADBOOL people-search list **and the CA Data Broker Registry** (`next` requeues this automatically when the cache is stale) | +| `$PDD registry [--search NAME]` | State registry coverage (CA ~545 ingested; VT/OR/TX portals surfaced); the DROP/email lane, not scanned | +| `$PDD drop [--filed]` | **The one-shot legal lever**: one CA DROP request deletes from ALL registered brokers; `--filed` records it | +| `$PDD plan [--priority crucial]` | Per-broker tier + method + `search_vectors` + the exact fields to disclose | +| `$PDD plan --batch` | **Reduce view**: overlays ledger state, groups brokers by next action (unscanned/found/indirect/blocked/in_progress/done), collapses ownership clusters, **orders `found` cluster-parents-first + emits a tailored `parent_playbook`**, prints `next_actions` | +| `$PDD fanout [--priority crucial] [--size 8]` | Batch brokers into parallel `delegate_task` subagents (auto for large runs) | +| `$PDD record [--found true] [--evidence JSON] [--disclosed F --channel C] [--reason "..."]` | Update the ledger (validated state machine); **auto-stamps `next_recheck_at`** | +| `$PDD send-email --listing [--kind ccpa_indirect ...]` | Render + record the request (recipient locked to the broker's own address). **browser** mode returns a `compose` payload to send via webmail (no password); **programmatic** mode SMTP-sends | +| `$PDD verify-link --text ''` | **browser mode**: extract a broker's verification link from webmail text you read (anti-phishing scored) | +| `$PDD poll-verification [--broker ]` | **programmatic mode**: poll IMAP for verification links (anti-phishing scored); auto-advances `submitted → verification_pending` | +| `$PDD render-email --listing ` | Draft only (fallback when no email mode is configured) | +| `$PDD due ` | Cases whose recheck window arrived (the cron re-scan queue) | +| `$PDD tasks ` | ONE consolidated human-task digest (present at END of run) | +| `$PDD status ` | Markdown status report | +| `$PDD report --sheets` | Rows for the Google Sheets tracker | + +## Batch operation (two-phase: crawl-all, then delete) + +For anything past a couple of brokers, run this as **map → reduce → act**, not broker-by-broker: + +- **Phase 1 - DISCOVER (read-only, parallel, idempotent).** Crawl *every* broker first and record a + verdict for each (`found` / `not_found` / `indirect_exposure` / `blocked`). Scanning has no side + effects, so it is safe to parallelize and retry. Getting the full exposure map *before* acting is + what unlocks cluster dedup and prioritization below. **Default: the parent drives `web_extract` + probes directly** - most people-search sites render name/phone/address results as static HTML that + `web_extract` reads in seconds. Escalate to `browser_*` only for the few JS-only sites, and to + `delegate_task` subagents only for genuinely *reasoning*-heavy work (large-scale namesake/relative + disambiguation). **Do NOT hand a browser-toolset subagent a big list of brokers to crawl** - in the + field this timed out repeatedly (600s, ~5-6 brokers each, no summary) because browser navigation is + heavy; the ledger writes that survived came at 10x the cost of parent `web_extract`. A `blocked` + (DataDome/Cloudflare/`antibot`) site is *not* a subagent job either: record `blocked` and requeue it + for a stealth/cloud browser (Browserbase) pass. Subagent reports are self-reports - the parent + re-fetches key URLs to confirm a `found` before trusting it (this cuts both ways: it caught a real + listing the parent had wrongly assumed was a false positive). +- **REDUCE - `$PDD plan --batch`.** Collapses the crawl into a phase-oriented plan: groups by + next action, **collapses ownership clusters** (a parent removal that clears children is ONE action, + not N - e.g. one Intelius/PeopleConnect suppression covers Truthfinder/Instant Checkmate/US Search/…), + and prints `next_actions`. `phase` is `discover` while anything is unscanned, else `delete`. +- **Phase 2 - DELETE (sequential, irreversible).** Work the reduced groups **parents first**: + `plan --batch` orders the `found` group cluster-parents-first (most children first) and emits a + `parent_playbook` with tailored, ordered steps per parent - follow that order and those steps + (full recipes in `references/methods.md` → "Ownership clusters - DO PARENTS FIRST"). Do the + cluster parents (skipping the covered children), **re-scan each parent's children after it confirms** + (they usually drop out), then the standalone listings; send the `indirect_exposure` cases as + CCPA/GDPR delete-my-PII emails (`send-email --kind ccpa_indirect`), and defer `blocked` to the + stealth-browser pass. Opt-outs hit CAPTCHAs, email-verification loops, and session binding - work + them **one at a time, carefully** (this is the opposite of fan-out), but do NOT stop to ask + permission per submission in `autonomy=full`; in `assisted`, confirm each one. **Prefer deletion + over suppression** where a broker offers both (e.g. PeopleConnect's "Right to Delete / DELETE MY + USER DATA" actually removes data; the suppression flow only hides it). + +Subagent reports are self-reports: the parent re-verifies key claims (listing URLs, match basis) before +recording `found` and before any deletion. + +## Procedure (the autonomous loop) + +1. **Setup (once, no questions).** Run `$PDD setup --auto` - it detects capabilities and configures + the most autonomous valid combination itself (programmatic email when `EMAIL_*` creds exist, + Browserbase when its key exists, `age` encryption when the binary exists, `autonomy=full`). Then + `$PDD doctor` and show the operator the readiness output **for information, not as a question** - + proceed immediately. Mention what would unlock more automation (e.g. email creds) but do not wait. +2. **Intake + consent (the ONE human conversation).** `$PDD intake ...` with `--consent` (and + `--consent-method`). Without consent the engine refuses to plan or act. Collect everything in one + pass - names/aliases, current + prior cities, emails, phones - so you never have to come back with + questions. For California subjects, also read `references/legal/drop.md`: `next` will surface a + `drop_submit` one-shot that deletes from every registered broker (~545) at once, which is the + single highest-leverage action. File it, then `drop --filed`. For non-CA subjects the + registry is covered by targeted CCPA/GDPR emails (`registry --search`, then `send-email`); the + people-search sites are worked directly in either case. +3. **Drain the queue.** Loop: + + ``` + while true: + q = $PDD next + if q.actions is empty: break + execute EVERY action in order; record each outcome via $PDD record + ``` + + `next` emits, in order: `refresh_brokers` (stale cache), `fanout_scan`/`scan_inline` (Phase 1 + crawl - see step 4), `poll_verification` (in-flight email confirmations), `verify_removal` (due + re-checks), `optout_web_form`/`optout_email_send` (Phase 2, parents-first with playbook steps), + `indirect_email_send`, and `stealth_rescan`. Human-only work never appears as an action - it + accumulates in `q.human_digest`. In `autonomy=full`, execute actions without pausing; honor + `confirm_first` in `assisted` mode. +4. **Scanning (when `next` says so).** For `fanout_scan`: run `$PDD fanout ` and **spawn one + `delegate_task` subagent per `batch`, in parallel, passing that batch's ready-made `brief`** - do + not scan all brokers yourself sequentially. For `scan_inline`: scan the few brokers yourself. + Either way, each broker gets **every** `search_vectors` entry via the `references/methods.md` + ladder (`web_extract` → `site:` probe → `browser_navigate` → `scrapling`), a 404 is INCONCLUSIVE + (not `not_found`), `blocked` is recorded when `antibot` is set and no stealth browser is available, + and subject vs namesake/relative is confirmed before recording: + `$PDD record --found --evidence '{"listing_urls":[...]}'`. + The parent re-verifies key `found` claims from subagents before trusting them. +5. **Opt-outs (when `next` says so).** Actions come pre-ordered parents-first with `steps` from each + broker record's own `optout.playbook` (field-verified; cluster parents like PeopleConnect, + Whitepages, BeenVerified, Spokeo have exact, live-checked recipes). **Deletion beats + suppression**: when an action carries `prefer_deletion`, complete the record's DELETION lane (e.g. + PeopleConnect's "DELETE MY USER DATA"), never just the hide-my-listing flow. Per method: + - **web_form** → drive `optout_url` with `browser_navigate`/`browser_type`/`browser_click`, submit + only `disclosure_fields`, screenshot the confirmation, then the action's `after` record command. + Playbooks may end with a right-to-delete `send-email` follow-up - do it (full erasure, not just + listing suppression). + - **email** → `$PDD send-email --kind --to + --listing ` records + discloses in one step (recipient locked to addresses the broker + record declares; `next` picks the kind from residency - never claim CCPA/GDPR for someone who + can't). In **browser** mode it returns a recipient-locked `compose` payload: compose a new + message to `compose.to` with `compose.subject`/`compose.body` exactly in the operator's webmail + via `browser_*` and send (no password); in **programmatic** mode it SMTP-sends. `next` also + routes human-gated forms (phone-callback/gov-ID) through a broker's deletion email when one + exists - the **rescue lane** (verified Whitepages pattern). Draft-only falls back to + `render-email` + a digest entry. + - **captcha** → soft/managed challenges clear automatically on the default cloud browser (proceed + as normal); only a hard interactive/behavioral challenge it can't pass is recorded `blocked` + (requeued for the stealth/operator-browser pass). Never a solver service. + - **phone_callback / account / gov_id / fax / mail / voice (T3)** *without a deletion email* → + never an agent action; `next` already routed these to the digest. Record them: + `$PDD record human_task_queued --reason "..."`. + 6. **Verification (when `next` says so).** In **programmatic** mode `$PDD poll-verification ` + finds arrived confirmation links via IMAP (anti-phishing scored, auto-advances state). In + **browser** mode, open the broker's confirmation email in the operator's webmail and run + `$PDD verify-link --text ''` to score the link. Either way **open the + link in the same browser** (several brokers bind the verification session to the browser that + opens it), finish the flow, then record `awaiting_processing`. `confirmed_removed` ONLY after a + verifying re-scan shows the listing gone - never off the submission flow's own confirmation page. +7. **Wrap up (once per run).** When `next` returns no actions: present `$PDD tasks ` (the + consolidated human digest) if non-empty, then `$PDD status `; if the Sheets tracker is + on, append `$PDD report --sheets` rows via the `google-workspace` skill. +8. **Schedule the next wake-up.** `next` returns `next_wake_at` (earliest due re-check). Create ONE + `cronjob` that re-runs this skill's loop for the subject (a prompt like: *"run the + unbroker loop for : `$PDD next` and execute all actions"*). Processing + windows, verification polls, and reappearance sweeps all flow through the same queue, so the case + keeps advancing with zero human attention. + +## Pitfalls + +- **Never disclose more than the broker already shows.** Submit only `disclosure_fields`. The engine + never volunteers SSN/ID numbers; you must not either. +- **No consent, no action.** The engine enforces this; do not work around it to "research" a third party. +- **`send-email` is idempotent + rate-limited.** It refuses to re-send a case already `submitted` + or beyond (use `--force` only if a genuine re-send is needed), and SMTP sends are paced by + `email_min_interval_seconds` (default 20s) with retry/backoff. Do not loop it to "make sure" - + a successful SMTP handoff is not proof of delivery; the due-queue re-scan is the real confirmation. +- **Ledger writes are locked.** Concurrent runs (cron + manual) serialize safely; if you ever see a + lock timeout, another run is mid-write - let it finish, don't delete the `.lock` by hand. +- **Autonomy ≠ improvisation.** Full autonomy means not *asking* between steps; it does not loosen any + gate. If a broker demands MORE than the planned `disclosure_fields` mid-flow, stop that case and + queue it (`human_task_queued --reason`) rather than deciding alone to disclose extra PII. +- **Don't interrupt the run with questions.** Config choices are `setup --auto`'s job; human-only work + goes to the digest. The only mid-run question that's ever warranted is a missing-identity fact that + blocks scanning (e.g. no city at all) - and that should have been collected at intake. +- **Use `terminal`, not `execute_code`** for `pdd.py` (secret scrubbing + output redaction break it). +- **Dossiers are plaintext by default** (JSON, `0600` under `HERMES_HOME`). For at-rest encryption run + `$PDD setup --encryption age` - it generates a local `age` key and encrypts dossiers + ledgers (the + audit log holds field names only and stays plaintext). It guards casual/backup/commit exposure, not + a full-`HERMES_HOME` read; set `PDD_AGE_IDENTITY` to a separate volume for real key separation. + `$PDD doctor` shows whether encryption is *actually* engaged (not just whether `age` is installed). +- **"Hidden from free search" ≠ deleted.** Only mark `confirmed_removed` after verifying the record is + actually gone; note paid-tier retention in the report. +- **Soft CAPTCHAs clear by default; don't fight the hard ones.** The default cloud browser passes + managed/soft challenges as normal operation (those brokers stay T1). For a hard interactive one it + genuinely can't pass, record `blocked` and let the stealth/operator-browser pass take it - never a + third-party solver service or fingerprint spoofing. +- **Broker pages change.** If a flow breaks, `$PDD record ... blocked` and flag the broker file in + `references/brokers/` for re-verification instead of guessing. +- **Verify non-field-verified records before submitting.** `confidence: auto` records came from + parsing BADBOOL (read `optout.notes`/`optout.links`, confirm the real opt-out URL). `confidence: + documented` records (several people-search sites) carry the correct published opt-out URL but have + **not** been field-verified (they 403 datacenter IPs), so confirm the live flow via the operator's + residential browser on first use, then set `last_verified`. Field-verified curated records (no + `confidence`, e.g. the cluster parents) have checked mechanics and take precedence. + +## Verification + +- `scripts/run_tests.sh tests/skills/test_unbroker_skill.py` (hermetic; no network), or the + dependency-free runner `python3 tests/skills/test_unbroker_skill.py`. +- Dry run: `$PDD setup --auto && $PDD doctor && SID=$($PDD intake --full-name "Test Person" + --email t@example.com --consent | python3 -c 'import sys,json;print(json.load(sys.stdin)["subject_id"])') + && $PDD next "$SID"` and confirm a readiness summary plus an ordered action queue. diff --git a/optional-skills/security/unbroker/assets/unbroker.png b/optional-skills/security/unbroker/assets/unbroker.png new file mode 100644 index 0000000000000000000000000000000000000000..18f7e3d5193a9df3646e4a085c2e6f91eba7dd3f GIT binary patch literal 455219 zcmeFZWmH^CvjB<)f`%Xo?(XiAAi)NA4ema;1qkl$?(VL^-EDBU!QFYBE9ai`t@ro+ zd#p8UdUsbl%XPWPTtc;2=OiKp;zqizq-qK-)k-z(~VGz4!RA@U_2x!I*pl ze1m|fjzoOcgMEJ{G7wh)KtQ-rKtTNZ4FU1^-u3GM0>Y6A0^;Z=1O!hK1jHBHv=({3 z_W=VHR}ZL*;Mw+$ox z7a&d|^U*uln3<9qPz@l>V_;*&pl4{KZ^YnYW&0NZ1fL7fd(+AYs7K^tWohleKp-L_;xB zAkdbFk$gMq!7 zEzr!yn&>aOdipkwKz>VCMTTz<+lA-z@(PEobIpWT_@%W@TjU@V+7eW@cvY|H1mtq5oG@ z^?#tUF){rU^&dn3gUZMF*M|SWfdA(1fAzkzR{(*J@$aJ&Kq!aDpND`Df{+mTrsM*7 z+;CT`Mqb!Qc)3}-t0g%fvTh8-T2YqXi|tTSlZ z>DbtI+iSS%P04oa;cUs$;*dVSgoKEQK7E3Rhk=2D`u`vQKjX&T2dL(b&8a`y+h@o| zzF7akY25Ewg*LV>KyMD+#ZQhVIa>QA$a6cb2yl^t!22~y4iWsI|2UmBT==js!j`9M zStrLkYsK^vx7Zt;w~}Nxt5mn&d;dYc5gk&iNh4pQa-or$t+VeIbbNl$A$-Tj(r|X4 zAx!xppx?f)Lfai>Zg_Y4vKz}a!1zB1P?JusE_Z zmgbfh1glC*OB=mikSOhq%mh+LOiJR*uU74)Fj~Obk*jannIM+HNv3~`>BcQ7lh;9S zuHX%#f5oX)$l9rAY%^3bt?o(%!Sb<~DZ#&Gx{4YG!T)_NxQQk~`b?b#KG2Onv|Sual_I9edh-^+1E zfm-(b^~fJI`?Lyn>jb|Mumxu+{DYVv8q8W{#NN|5uKPOmGdlAC5!>I$kUn?pP-m(W zm!8OOasvP8et$7HD1UXGpxo?U`t!q`9i8HuUp=G+Fo49Itfa#toSRffFf-^Ub~u)- zttzZ6T;)Ahb-LpiF@_rQK|bHr9B3`;L*k@E+9ADyhjwe4wTRnKXTc!1awLr~_uO1mW)@E6gus=i% z?QuIRKp}T%aa2Re$P7s`>Osbru>QjMmdhKDkdQWpsSqDCWvRIBo4{cjG=(Yj#rL|O zLbEguR-+-SmbJaNXCPj(qiZs6GPzeYUxONv$ug^%5iR&6*YAS_hbDcZjh1U+9Z*w{ zd?v?GIFs#Nkk=GtJ+0p^o@}(-mMf^!^Ge&~7apd6fr4VdKdK8g=#v{4OdD&pnFwP%ceKWKFJPP<3La+u9$=yNS}4><>WRsKlbx^0tU~(@1sN^u7(BiPD zzt&MfG6iW>{}801G5SEoK6wQ4P-RH1R8c)1PL3hUvt7EL{IXIN$7kSIltFvDb%aJO zfyNf#m$}h=s^N$&U+f6?CDZxit%?P$W5-5f3UZcr2jb-Uo$6wqp;=X5-j()CeY`(g z9@zyo@Mg2oHy0jqm|^y2&2G@$rURnI{TrqVoK2xmG<$e=XvqO z6>{d6jMw3v-d#u70j_e1;$e?!i#wlK#f6D-x`{%Lo6j9Xs9~pl#2t>XsxE;1rE9Mq zQ4rEP7S5W3%jNKLd`)dOa^orzaV0!H$g@c)B{j7zLB|=Q+}qG5dy$|0f`RhE7-I#7 zzSc(dZL(|f{yIE#ZdOQGvSV^tuqKt;>vn$kT4;HXX`gtsVHy@c}nNPjF(7UP7Th&a@$;^(YeJC-sYx1CD*FSlBD~uaGbpiN-g@AR6 zBd9>l$jqj^Wo4HC*j3@_f12Tch#Mc@H|r7XR*fjkTgBvDTE}G}c&l(E>j``dzPyB5 z6G{>6sj7?i(RMes&R|Szn#}_SSA1!4tM+*S1y4U?buKkB$AJytPN^9g#{s&s=ygb| zAkU2o+{CpK8m!vwp-8CCZd=O)EQ);->ne)Rkz*~Y=Fd~78LtBZH;ssWYhOCA&h{y6 z@;GV$p6gqQn5iz78(E91SLXw-^NX*fg3oWSrjPyk$aRY_AGs1$v4Z(jXP)ssb&Al^ z(k8ocC{qJlwRDQ(uipBhHAY`9P)=H&9L%UkK|O2(JL`=#pUIk@R`j&iCQG$b zVH~}{boy+WP}VLOq~S(v8%f+4WXs7!u)D`_X7%G|`S%K_wDc9xR;;O8@K=0o|Cv^# zEJ2lm=CI^^uGblmzdZVr;j6d<2E@rIj@F~AQ31-XvsIhwKN^?a+blO@&bH%on} zyJ3>sz3kAJ`&Z>#&FFobINNKg9TYWrc)X3xeBtfWKf98BJA7u7TB9xi z%D(&0Yl?&q-Sl4K1IbW3LSXsbL^KpI)J;VzzkTI?=2c(&$W zW4#ti+}%k;<7~_u>D+A&KV7}XMX6fd+yt*@I<=0EyiX4W)sti{veQny3R{cO$KZM= z?g)7ucXkZ8`V`T>Xd9_c{LC(W_p1yl$OP7n-{3!5=1J7jY*PJeE_W!O@FwQTC>6zi ze>)0^*y04KK7CGk33n|YXAUI_hR)i%!J&)}AI$~Eyt@On5ZTR7vkXqoy1d?QZry@T zxv-}mPG(*d7i;K&iA+*?3Ec@jFnR-+DeNg^sevB<@LnK&mV|ATA z+Q-|9vP+$-oNZmqWbWh=u=W`kg{fT)=Lk8Y0v!5uU- z&E={G<&nABpSL@pzrz08|DFCpbhu+V6}vfpIz6o=Yu)7h)5XpjK{qV0{5ZP;V@~!$ z$NtYJ;XkD{p{s4g`th{bie;yHc=AtDD&I1nrBwX?z1%xSsC2%x1_Jq-)C#@aJOzde zqc8qfbonnhz8D6v_EouW6|BJ~CrZ^c_4Jn6OYq3{oMQ9cym%k}>7a^ZLh`jnP#?CJ zeG_y4fjv_;!=%0{f6qaqa803EpF@jG$q0Iz^R%QkXCP&} z{7J1x*vy_S7AR3UM13TwkK_C`Hdu^7K`Yb#%sP_OtljL?VED!Sb3#p7*T1~KE?GRt zeZC4O9|dQcnOlkztNihWTTi`(VpaNG`alkGe81=+V#@_4b;8Sk`RZQ!@MTW-((!q* zGXgT$oWKehkEG)v8pc77>fY4=iLLaZ!V>@weYwG-65h}a-ziNp*IAINRqRHCij(Pb zc2m707s|i3z>5||I6DN8a0!&yFC40sK3eJ?U^hwKFxXL<)krd|8}nFN%X>mlSCDX9 zn|?4np}685FpKqtcKw$KjgeLbfNNM^*JvR3q^xzO0CnQasX*G*f~XGL_L4wANrg5z ziOekKfkF&CXjXvy<6oPyMu)O!3JdumHg~ceO`jnvvZCV{6rS-###nE4y1_HGJig!< zAbHiW)JSi6`kkd8cVTuoS^Amb?mLC*;B1MnzyKvlEw(_kjxL&2!-(XT@eoqwInWR! zT@k8U`oyy|Pm}CX?bj`VvSX2KP9FOWNF2*}p5RpM!{RbJmvTWyWsy>(y|$>Z8>hRP z7c(@SSa$K-Y8=CF?Sic=PlpbwIqFZt2%Ft*k>ag~2i&1#_t66=AGWY8zt#1QOu zla3Msvspa38)*R>{5)PYD^-e0=c&@)NU+G|8W6>1@EUMa`g809G%Bb}$ZW)28$2ue z$g!lSY?hmrWAa>?W3yqM7#|qefKfbtn|$3gIhzrWc(;GENF34UNRlFT!IBD&sL*vr zwh~XF!(6f()h^b)qE#Z_g~jSjzrW79Uw2nu0q+Tl`6R+v;g(`y!IAWZHN}lzl`75U zeA^ub4^moy|6v>~*y6ama=s?~;t8$F*r8pT;2eI^d3KRmGGB7mcKb49@ntN~V(M2a zXD#Vd#LC+}W#XQRuJ`7$C41V9wCvkPhcG2WI=?pcc5Ho}Bms*!=rkk4;Lg+K?zKmC zyu<4>{L9ma0OvD7H+=jfc9yG|Sbk4WXTf{v?i@;LJTw?jWVj@#G}2BQ)0W+ULg|VSAxUX?y|} zL&wX}*49czG{5S2r+TTf!^89Wz0caKPwDZM z?Y#EN6FWHtJxeDScsaaGUG1E#-R#ez-6PhX)C3Y+U0=GJ7cwTW><3QW_3t`*Zrs}I z+JXW`LLG$uY$UKtx19?vEWgL*!1d|w9{idDFyxue#fy&~yG>D$vjNNX^f8mY%S z7bjN~nEF;{`F;6z18sw2mV@7yaw&g%Ieb|i8@bZvQK5Fg?RL3|SUAHcH+cw<^9;kYsA~TLpPn&_KHyZUC42cl?=lq4%TCQLASr+E%_q(b$qc56^HJ#HR z&U&<0wLOJ%4ct-JTioDy&N?q%^*RH&eStb@srbCMd7a)tQ^&Yp zTfl!PDJr!Wz3*W{06Lw$aK|INMjq$U?Qq66+Kj3yUthEs5Lw_NRztm;6*Qo*P4@~Y z`fu?GzAnMu$BoL!j?1oV>1Y)x(O?DZSlAjU3sd~<_$+^eDBQpIjLZB^n(n6jVJqk%?}uIAJ(E!|hFEn&-(=CEr#3g6{L_^ySu3pS7=gJG5WBC$tUU zo$5km#jEtzL&GoVp$UBvJDFJwNIYN}40;Rq%%ZhS*Q6JBNaGPO0`>7W$&_Vts&*A-aM zbMlwWe%ICZGkDz+GNKYklPsdtpYi;d%tr$f9Gi4TzJ$V<6k6*DTy?KA3AOg$Zq@~NZA2YVWs_TjXKz9) z`JTS)%Lu+}D`(mDEC`3-d#_^P>q(-n_i1YE!uYlmbocYh&N8FmQ~%Yv2RPou#71T@ zk~Vuqoa0#rYuL&8Zqs1C6tlWa`F#>-hp!pDFFpSLW~?P*Gf{|tJ2!6di%L|t)-q+v z!|!H{pQ|OXh)gka$O!xv@Z-+Tc{`QSQ_~{sDRQ^jqBNQ$l4|KkISxi}8mS~kUZz!V z_;kYDF%(&TAN$7v`J3|Hdj&4UAE#bTQ4_08Zt6NPY&fv;OZX0D6Ikklr-!HQb}#mb zyp%C2@sh5loFjdihljXP1M-ZWFG~*4t^KF&$LK>8%^rG|XH&16XyV2cHqx>(A~f=H zM#cEezgx{)e5Qd>IN@?EV;2C273t)m5#5rx<3Pv<=>&IVR&|fzR>IfC{6<~9@C=)p z1#nYd5(><{zw%f5@iDY0-q)@`)6m>tl$P=-cQfub;a%-c0Q5{wLmN}1yW3WFp;~Wd z(>03u=Okdt{$=yjh42qqfhEqmRCc?Z=)Q^!&mS`S^NO66=!c~$!}kY+-WxrFekcnJ z8UFEj?AFqAolvWCKY*oyjw-Kt3gs#v;JzQ)7R|M=6OgE-tJzMV9OHC8Wk+HlxF!^; zCM4z%ei7d^4tVZpzaw(9wf&uBov(0mh|dSSE7mAyagF_29v;~Px^VhVveWwXcv0nO z17SN4d*3xV_y-;Jb52Hb#_UN3G3@_3>l?R3S=f?_c@hSi6MG1a6}l1H2@B}2J2fFDb=<#C>gGZcc?qcgQ_1InA`BiEcqhpr$0TlT4B0)vXT%f{!``TQz zPb*iPUK@+ubi{?UJjQ^O-+?(ryJ;Z&rq z%l@3fLm;*WR07j6F3#TgcYYy*u&;X_9ZeQzkY0ov#G5N)(f}ef>_uT&-M8%R%r*A| zm`)~mp%Pe{^VFP*!h-vWv4$1WpgW2=z&9+{lUGsToFJ0rrusA9i`Db z$L|^s!ivkA1GP##jh2~-cdIx@~o#bGo{JxH9WEDrLM3sa`51KEVx(`eJ@MH zWR(cp0o?H8r>hSxfYI)bOw1nqC>pm-Ath#OY;JFDjG)VsEuE+IkE;Vrm?VcJR`!oe zIzL9Fq~hZ-UE%oB4Qi8OEeQa7=c}kJ=vRFGuLhLbys75w?yhHw6|yXStd=!$Y)VDr z(XEG^5;Zdqz;+36{+T%8~g8m-4H9)kkFe!u%M!E<~29TgjnCDUvKZ+lzOmsB}a<wg$CqOID_x+^88r8*Z-x2>Od8g=a0v<` z615A*Wl?+sK!xxvRurD^-b-@h2)kWfwlaF$fp>Rd{mrP^2kQ*zz4EWeEd&kaaRcz~ zu2F4E5AqvzT0BmH6eIi}-2(8>=X8CuKu|^;Y8i-smJT%+-jfu|t0NNvebzPrExxBC z)Fyz6Y%7=;_z{WvZy~5UEGE$s7N=2Nc3q6YVN;;H} zAoO~@qrvRtT4XW;&D>GEvySW4+}Q$6=Fi}?eDjr#>h?gFI&2$M&Z&#IhPCMO_{78~ z=M#d;vg_MhhS7;!4q4Z2ug{Wvz-LGvd4~AM_sEJHnD$ezxGro#q;nLtKX^x;5Gn#m zCB0DE4X*zVuc@@s+t$^NV4*~d`oa?6`t$34eEh{!dtfvD_WW*b*%WvPn}>=npJQ-i zRGZrwXX=js)hxqq?+;Pv4!((*XK?RRbH;p6RtoR7uA; zzOi+SHxv@#@k}(pn)vd{B7kl6->rqhJ7+F>3>kAhFbadV}xN;dA4$+)S&@8^_ zo)aeKGoUWmAA4X$zT(=U%H_)G4;$Ej66;4Tk4vD|)kq7p{AtJ;33s6c2+ni~b(pj* zfWnwH&8*zRGO=E5bMi7>AlNGK^z1c3-4BJ`8bQ2b<$K0R*Az$m$FUQ4g$?0q+!F9| zvpv`5?@rG-RI2WhiKo5a-d!_8U(y}g`VYC=1#5N|*y!vv`~R8p#G@tHElS16tElWwk}WBht~J?boacFz!Rvqjjkgtd{&lu_L6_@cav*e7 zn+w~8;GsfitwfQ5UR&VFt)eTGOyVXLJ+XD&<1jnYqqvUmZhQaL%}x&`(=VEukwK^R znL&@SZ-p+(__~zy5>!A@@oBDyV9$i&V$qnAa-I97n;+E^rW4$)S-H~Y6kUYh&+OBH zSX&gx3f#*#krBAG%Q$Lrx}cx8eS!S4Y?5hkS)+!DVx@`GS3Ua;&f03EqDQoGjyKr{`!(jIo_$Hm^ zbBYXoGt2cC!dG?Q%EgPVEk0*tnw;d~327NR24H2}Fdf_%cQ@L4mgr9CA7@~~rLiaH zHP3B-*NpWJuMC3ks4CYH>k5btZJPV}t%R-!aQDaH3GLQhH+9%|K`&uI`AZ%$8j$Py%_7(Rcz>8M#0VkqctgvfMRb*HXN{TpK{HiAz_skCg#(ZO2 zPu=ncr_8(x#Tn%92`}ARJ|v_r2rQGXbfGpD2^icp5(%wE zM;`F^cZJsn^madgZ{sZz8ub`1t7Zu*;`m@)y*Ai95i8WX6_S)1iFMajh^bLtTcDIo;eobj`?x!~>gXdrr1FZ&cav}= zNyuFfk&-PW+h%yMq!Gv)pW6J4E70oijP0~o7r-QC484L39pld@)xO?gJd;=gveE37 zxcn^K8BW8KSqn}0>{L$PIhJJS5_3w!E2BfV*m>>+VQ!3$+UaS`l#Xcdq?``^a|Fjl3*z5b+bmLUza^I36Uk_v!fT^nv; z(@K1A;O(`ubbeTdv@F&jMeKk8p@STHY%d2jGeaZ}M7v3y)0sX)u(YBHzwmM&o1LE4 zXOkG^a-0Sr#}OhRW=z|weu;TM>f`^$dtL9_=q z@h!|4iX%GU9A`m@Rq5|ohKT4~M>q>qYBtT#jF*0GyY%2Yj&I%+2?*0b#Xzy5U!K|q zwh!f%9R0{;4A=7OPwZ2+qxd$hFb|pT;@L38vh%MZq31j_afaE3gU{^+a(xmLESrLx z0x6VvW9BmB5|`g3en8=OD8M;O_&Sm0ZvtAzE!ErMi^aMcSbJn-nltv1|6_MZKIJY{ zrORauhl>F53jnF^@CoNs8|k`;=(g*P$Yz8gy7>CAwC^Sr7EP z68i(ZevN?GF$Br?RZuOq#|&?&HMZI)u*>X|nFHE`wC!n6#OG%z@cuo2Ch?@LJ%=r7 zzC-Egl;tG{ek@Gs2l()AF_6s8^c96RTYW-t^ZgMH?J5eiN{i;x8BY>$E|p*Eh<9Te z4{_~d7F6WlHu^8h#UzvG2(ja`aM5Kz&I5Edj21!NJ(N*BlI1^kl6C9fIrwd+skia= z>oGMO4ZxqvwmOHwTB2wO|9Rp|t-ng=#CZf=e5@3uXM(#LeXa3B8jd-&lHO0-&2%lV z=H7X{cBe~Ol;<(mP>+SspN`*EQJJg#VkmLnZq~FyJ#3o3b*XxJ zg=AbAg|4v6iVWM3UxU^>k+{mA;grVR>HrqpGIO*!xz_TwBpyI~Ov(V1r=G`3na-7b z%%6ze_8k<2x{?9AP#Fu(<2>W{+k=tq808#Ij6*VW-rdgxw4X*awe?xH9#6!zTFVnx zzWLNI2Q2*(GJ)YK0}gP64{Ow1qx*YUX#O5OBIK%~oZ2wQ1}RHGuO56UQqwPrr4gkwS3Szj}?L4nM#k(cYL zp?qPac=NZYVCy_)I=fhv-LpvK>T)&X#fmbiCzYdb%+}U-dC?(G>1k1A&2=g2fvNP2 z*F}8Wr;O;Z`qqueph|_V3f@2yi5c zy0JaZ6iE^9E61?a+-_k7Hq+Yr#rv*wT|$Td8XeBhyF!nzw)sSr$wixLMr0uuGOnm# zN-6H^_M_%qNyx0G?LiqW1Oa%4BUUX^5;=pq#oEX5|1dGRPLTfW#{?vNRbo4I={q5t zDIUOvGt*{R$BN108X;{gz+jFP6*5DKU6^nJOE`z;7yO=|T;!Usy&NWaQ5L(TNsgPt zcNQovWV3gU_?VXtunU~KaYK$T&ok!1-9m91nu7;rSU$5?6&ae$g*1`R)>;A&<2htV zy zm*m}~fk0=MevbNXu3>iA{49D*oM+;jdB$>gnC1s{Gsrf2!E|CT0Aak0&d zs`@NF4SJn(xR1@E2`w%5?I82!4w`k8vm#~!*H);bmRE}D8x$y0-2V}663?;FpYo;4 zNw-z4Fg7Er{c6Hhlc!N`?l+(J*=^uWTJ(m$eJ4P24=L$Jx?aa9>sVT(02|;|1HF$* z1?2=%FSV%#R7xf9Y)vc~PL1!)Tu~fSdZN&-^788VEEjyLI#gtUm``Hmj8SKj4WW=7 zgOG+#p(s@bK##&=8e2Z_mMqJ$P^UC!4cOGW@~2wF>!V0EXcU|Gmy-TEZieS#(<`<|SNnaFQyPZb7rADqASK@?fe`zszZw@9OR4M~%2v3iHi6#3Yg; zk7kbXa{BM>DFWsEj*uyOmNC_tCp+Z$N4xD$ z_4hE7lx}JSNv+3dTeVt!*jP! zE4oijy`WybP5rJYi%TW`q)(han!t_mUo7mrtNe9)NAr>+cuB;$h#su39gLsOjeq%@ z4I5PqeX(6)`xE6Dn{`F{ahoaB1U$N=yyu6c$Z3+1(#S8b>ZlV(0qYzA;;K}~=Jwb6 z(`=GrUBd1wQg4|}q$;UclRhK8R#d=cETAdG4;ZxE`BD*W=`_X^+g%z`DPO!HVvLxg zpDax4Vlu4-m1Z+3M&86qXmZ76|2iu|jFR+A9ye%|TTL^ZolQ%d-1E2Jiq5NQ&^DEA zKn|CHl6|&Zl7coTTs{O!me0{^rrhRRN>>?H>(pnAnWR)z23^%{^vD>oFUr!)RzMMu zn5#{I%m+B4(*;NwJU==!5h~g}xfFGKOMhd&4~jBEkoeZz0zC4(Wqhh5dZt-viu+$p zUbI3SFT_J4t7o{0Hx5hG4u8uBVJY3i<{da;83?0#!OQE(6t0LHA(XI71+4dy8p3p7+VD^aRcH5`~jFi_dOqv`3{?Qv}$ z&x=j6LH|AZ?C1Au{OTr_fmME5;#g5j@?*e6wlX_>mczTXiy&ru*Hpc>Cb#dJiZ@qx zua`JyZrBRlop%*1+}%g zI8N4*2$W?aJD2`j=aZ9zr_~i6(L>=h57IYB(+Xynd*S{Mu)O7%2?j9?7zlpCJ-G%3 zeIC)=lN7?CMM34&)|6_od@_CoDgeWg&``x0MTgqjIF%!p(ciSq!y7o=(2T_Eb94M$ ze0)4CIl+X4UkYa~d0+7Y5awRTEuneWmy%btaa~YW}bcIq=Xf zQQUpOD=4(4XP_HK!}|IQ<`;zm)t=j=$->~qY_~aFlzy zgFrV22iB|F+IVwJLT^)3m!Gzi9-ehkSN;@v$hGS**?1br^qm&wyY{Zu)=tK5Zf0g5 z5miJ|ZFAN0ds7!?7Zw^VfOVCfj5cc(zHK*;lCJ*7&zkCga^t**_&!gFn)WnFQU*52 z_4)LEzFOsPC(X@$Y4?1t^T77FBH0e>n&4G63rb&*yrqkWSnwjE zucQO4wXq9wCKi_~K?)ZZ!BV27|Mo&}_#_Subw&yE?nQF@aD^Wi=8lu6YdR@3qtn{i zKb7JMx@hZpT)L+GmLiBQ3$^8PU+_PWA(G3I5)1qY3X3^8Jbdk?6nt2JL4A9h_^m%RdfyIsYx%IG8q8l}fy14UtB&_G@~9rS3(P3)GhdEPyupp$?mumV zc1=Ll6jzTR=e5`Mw}&&nr%~tKkz`&WQC;1){f_g#_4~264{%CuJT^lP=8UTI^e9-S zF?VvUwy(#X53B1hBQ_pA>BJ&Dk9n=`?x3BC_Kd?* z-dC-R?f2hRAm@S-+?vT1o(7{y-*(rZE(-;&k~`J}`1rKG{=kS1IWtz4q*?17_-gh? zyTtGd)?UZ$T&34;I9a$XBLT zCc(RM8?P(Ww~f1rj+cl)c-WOJA_6$pOx~MG;m${k&e!{GLJ~&OTFir?L(R9tiMJlr zj!Vjg3axncORx`449Ai0=)jgMi*R#{eLR}o)(-#M2B$Z;dVqiy%iSYZ+Bm=Mdf)r; z%=_)`^(5S4p$}$^>&H=jAff9H=i8>us>7uhp7plbpm?R&5(*14!_H5`LLB=k7h|_u z-Io#X*D)Ip18c90b?g)!anL9_;p3#>^N+WaDFe#u(w?v}WGv-sm1X(j;NW61s*hrO zR|}Q8FD7r-gx>pyHjGNc(<-|ZAr`?S;(bw2P+*eDs>ypiOY0dTCSECm{@;JaA34zJ zk7PB~!~@s7Q4;Ub(a~$3N{b?-1>89boi!yChyP$|O)pTB$_W_->2$R-P)R+S<}1QJ z*7)#7mt3~oEZxX-{0eM_{>E|bF%C~^cJ(&|dyFi3qN+tfwmO@)wLgFK+J?j>)49+I zg7b(bwy>nP`%X`@v;TOy-yuaFlMo#hTXo)ksFz>8uB4}*xVyV!E#7YJ);i7dEj?<< z@o4_88mS-qbaz7U4ef_%58NoS3Q&(8^f?_RQvx3_; zR9(%ir3R%>hdzv5Rg~%>q4@Qzps>&e2sC`_;BRk-Zn_HqN+y0=7cC@^0k3GiRYXUx zWvrdPSH`YoL{Diy-JZbewGxs{8^YO{=^0tW3rs(IoE;o6%o63$eQu@vRg~Ds@$d_l zX@$SR{mtiP&o4A2K%4(zQ@i!6VjEtH4~={sot|Vuht5Rb@4Xs$L{AWAOBb#b3ynxTBMY1Zc%g*RQ1pJYA5al}}|QuC0lY zDi_7gXt*=e)p-X6!lG{H;v10|rvPb5z3~}oX^ddpTR@KW`FHXI8V%;fBjuSgU% z(jw@?xuT051{Cu+(ooX{-)QCg8V&m!tS0|*of};Yn811&OMpNuZ;Fl@Xc?^@+Bs@A z#|9f2#^0~zBsg*UEND|1l!o!qohzj~7DcVueS!Mr;7w-zsb5-36Sa{d#BMk_H=TB0 z)rSs`aBcu%1|Q#~<*~1@6%(9hHYkieuHr*n9t13fE10yh+e*{hyG*L^nNO}dgoNe)^7?%Gi;RuXL8c)$S?AC`IUqcXQ`VJRl zt2K-9N5)sikW%!UbO!0*kvg_S?Dt12vpKQ0g07~T>_o@@CTzwTJk;dR1gF6m`e$TC zx<_%pX$%BDvNALHV;$F1oWbi$@Fv>v)WTvbj&3xBW2mrvE=6acI^^S0JzY9W6QEBc zxy9jDN0=OZXoQ^Rx5vp#pg6=I*7!AAjj8aR!yGRtX%O-hNaxZncSq9NR+-%dS!j6m*h<)I@Vb zv9J9a&{wCkN)-nKvqX{=yGYKud64xYP;)!4;aowcmW-LAr*ME=S3h+d@gCr$>s+|j z2c&?VEVX@=N4ax_5#R?AELDsWs*_bueY8)M_1-{7E7QHBhI!`!BtoMAZhd_@CNmBh z@rY$IM$wq-bzd@j$Q>9L>blR0vsoM#)e;%;)gM7=m>&bPqP4t`hfaI#VLodnp28$w zrx10^QH7IARP_RCO6Wdqv9Rx`aJ?R}D@($3?#O9`)k}o415GEb=n^N@(?xk~(K)oM zJN!^&6*OHWh)QJOa1dT-!lzpXMSiC)<7!&LL|}-*@*6P9-B`vkhGjd%rN&kh)Pps8 zlSz@w^oVQAQ=+TJ!)L@*4%DU%lu?AJ842d6K{y+bIdPP^>m1(|$1sFPTKm8ktJ~gp zs&A!?FXfqFFz)2bm)pp$9dM!dbLH!9C)ZU!m@iMcIPS)pR*C`usTc}7TqJH?x{87m zW@lY1?;Kax!$o&lGT1h%#c@0F?Zy zhrHXi_N0qRm>G&NNRffjK>~v1$|@%`FwERzErw7W-^=uUgxLC)Mn{!19cVJ_+B`5p z9?M*7&t@iyJY~u1NnK-!mWKqf&Bjie7Yn z$(%`M;VMTz1Zj?9rAbecrrKz!SNEDdlNXK>!MPUP(`y%U%^@r52ZmKcUGe!vn!GKJ z^1;oekDF8FPkBtsVNDlqSyOUTkZuuV4fc5Pp9%DG@b-6m_unT?^uFFqe>_EVR;JZ} zwfek4VP_h3u|HePC_=k69xmm-Nv^swOv6VPC1-D>?QRIZz;vG8k*C^ue!Ju$K_Ai0ErL*MA0kkI|2VOxN!z)Ca$MPd5;) z6j&D|p3|dg291n7^&zrfE!ahoCb&>G1A1vQx@of^UOzC_!%M0lXaQG#m^)ZO7=vc9 z1SNcJyCwU_XOco=m`HS5sLJ1L%=MPrL8*=A!-8|Qe*}T3=U+Xrre<+riZ(0ch_g~n zhtRhb5nIIg;+{-PY1mqF7y?hCa>$NXJs!82qj;cb;HaGT$6Kbv$)19JWnd37}K|xYH@c z6HXmNQ({=S&?)zGZjZ6Wm}U~bx^!Z6yzTOG>sAdMN5vyyizDI zKONbAyyE$2Da?W2qoPC#BZIg@hKCSY3#lYWkI^`OqCE8IFm{NsEpl{u96%S7ntXjMI|FLiN)>AEcxv^+u-}amnU3E z0Ksht3ZQQE{@9Y>{dZF;UWrz0`$OUn2GchUM@|;sAV^(vrOk{7E~)Md1^I_JSzo1X z1(L=pmXapm@I_({ad5s=r)6Y3hgN!@XnMaaTq+%_+kDp(_Je*88uw+^++!Bzi#QX= z0^Zijb0$Zk9hCN?b*g2_cxwXe{X8_Im`G;2hedqsIjvXj`xiQIIb{XQnJ_2Z(F^Qp zeoTieUQvwHc1hA@+n;T23I}>0o;?ry_`$h=3K!HB^n||?3=!Be+od$7cVK8bvNGAL zjHhv5oxN_{t@AmE>59lNN`GSqOV;AxN04yFEPuEeyzN2V#(G}r@O%myk{}+6w>c0x zmt4wTSp0tgxj;t0Tsz#WvuEG>lRx@*++1j|lnIl`z?3=&P8Qp*9ATsn$rN(M!UOl8 z`qeLg88s;LEVL6l@l*GN1W5(5S|`R9do^lO+FcC=D%2d{{NUjb$E))`NSfO%eRAP5 zy?uQjed?oM{`J4Nd(SxDRT&iRk>rVqtN-Co|Mb~spIKO#mjnT;_#|70v8FB=tBs!t zG7UwFZn#{y`_F#w+5hy_uil!tQMS7+X)9+`s!RW^CA#E&Q$0k^$XB_kRRYcM3kBBY zBk)Z(iyJz5*`-qHyU%>*>tFrq)a0aIp1_-CQJMy*vJsW!KP&N70&WoC1qh$}{1=ZL zJ%TqGjRJV6TVg3V?7+ddApu*1B((aVBG52OXG&}KQzv`7M5+7pl?f`csW?vQd6TXW zow}Ore%#GYJ&Xxx)rls_5Ezq9nybRmor3^Ao`R4KYlzGu+BZQF6|%Rv%b$%=aT9Ih zzzmX2G_l0wE)ySGi{>NGq)nll=UC6<6)ooS>cSx3Bd;6Xq+Y}>Iv=bc;?(G{6A_h* zttASgh8+905tXM=mz1@4uM`T*zC>GUdK^SAH`2rMs~WhLL}e5%ldq)En5|07J#W&= z%QPX5kK<=lDlqD(#xa&asNgRoc+nCn+52&DZM<9I2|Mqgm;wDb_J$T z5=5^bwWg=rM?F!*4%?@HIH&Z}6t+&|8R;cIyt}?yD)AL1UbSNhcS*45nI7FxStziM ztVeI~H2J=gs1&)i&ok=1Jdse-0-w$!BWCnQKPPyw3l|lh*b6Z`9IZ9`XG(P3&>db( z#3u{kWxk!|AJ*Wu^{Vu|NvF0JVyp-L>S+hf zJ)%Y_S(wao1xp?#^DV86joY+PC2B(U4nn}q*D@gfnSaAh25BZ`S@iEC^JoQ|+%}_#+jTR|)m;CK-K~k9Q$y?rv}gbc5vRD8_hh@IqHIjkgwamwQ!0TDntH6%tIHDr~Gj=ers zD>Wm?(3gKkXrr!iQ7dQ7dX=Oey)M@Eg-^;XiGN@JfSkQ*sZv=|8}qEllvWniBi|jp z?ov@sI}5~FqNR!?m{cjK0*aKhV}SI=M<9{O7%qI1-Qv$C$p|;Mai^eQ;vY;9py;BG zOt4guV5f&^%Yj=Bm9p_s3OBTj9(tiY_RkiCcn zM389+ymT8Oy;l}rUTSuh5Nhs71lF-TkBJ$!&nIj(HYb^$S*WpVGG<2;Q_4Q!W^|3h zorOLC7#rZLriz9J4ahvAmRurcOdCICBj*ZP9zb^{7OHFFKeY$@232by6&&%cs?9)6`O2^yz3V zbt=hQVJq(z|3U-dIf}4d(xsQTx8$qbMaakz5yXwNyXYF!u&@qViSctxldQ?(Q3wq4 zyv(2Ejp2H$6sk0MwauB+gIk6(S(h)V34tD&i{7CFlI`U?lp15@i&gC{(UW>NZ}0B$ zPkidrk3aq>-{95{35fVmQnhm7-HZR*Kl>M@(y}~8!;f~{Ci~W#Z}M4iVAXFJ>iDl^ zYO!xZ*vYl6>Kt0+VCD=)$Y_K>*qG>7&=yl9%X-a}Xcp)sn!)JZ{LRc`m7pT8Q^{<` z+*|zukvoc6Hn&=>p6fHdbFILMhcI3wpQlHTGAYFgink(YIuBJ4Qb1rQ5OC*1%&Fxt zF2CKG^t?%TqFFz+u^GfN*2Tn0Y$Pi5L7+sHktR<`1tvC>TA6I9Q6T!jA%MA<{n*}5 zo0?u^MmFtRj7fJGsx+DGsJSRv-IRyS|LS9o5_kO(`Cvh*VG#LC#QGs(n5RH8>Ze7TF7p-$8gJgiRBzo_^p zB^v}%&(x42da75c&b;j03o2J7^^{PNW?L5uldop~9Q&w^BsQA+(^Unghs4@}+pv`; zR%e=`4xWzgp3@zF@Ymg((#36+Yo8=YA5h7&IGxMGLo4_uM4hKOo}gZh6KmnHp}-P* zbr7dQ>MKMh=bC#ab%P+0JbX#G>EAlZB3SlLP{CBo!^v#I%W-a-v`{j|w0D0^tW_!R zRS-+8A*pz}yk<*-L&Fb0^6+Or|M~ubUgzjycngb5zyJGx@a%WK%h#nfwhU_>&rkit z!-k&?G#phD3-rUJW3P>Jxbb|b$H(6wk(Fvp;HtY?v0jc)9&pwNCYIGHW9o>Xjf0&- z42R^qB-N+}0jH8sv%5a^St=!+O>Fp?W1Uz}C3&mayoQ$5d%h9Ge|=s^W`hnobL@n* zuIb3Mkn&dDz^+q&Lirtvz#68}s4_cW8=y`nm8{eLd~-4NjM*hl<+a&wrZzoq(y7aD zIj6aP)maz(aYISpFTb<$WM01q6RGK-Gbk-&2?im1Cn10xnElw^FGR^|WFJhof`Y6< zVwSWRNQM>R3Tsx(>Fca>TWhy5W?Eqscl~i|8e1iu#oGExB(z)UrlDLMr;?g#)l5h5 zu}M>!+693c$Qr~FV?igACTgnNtaR(GFHkB#Wo+GIrL~pT>bbFrIZF$~lOQDng?+(C zt$m*?o7_lAu~#cgk#;b%Qq_U2Nz+FE<@o3;(ss3zR3+QNOIa7RRL(SUx>z%u7izV% z-%+I|^^7w-9d`@WnYz*rDdf!y6PY7wx6-XHs-rHUwYk^066T<+HwC~Le?&I|Dj`LP zD5C@%@DmUmxH9qvlt@vI8iyNO4WX4NM~y^7#6NEGW0{-pZ?mY6bGN)y&gHtCYX}=1 zW^z1>Lo(+|Pp1_4I-ogR4KU%(?-x_i;K9|DMAH+Kuzx!86ck9;SW6*m?_0O-s8$`@ zYEoN_mklDxS!7Y7rILq_TGLNElZG-zVdeTEQP#S(28<@gVI7rdjRe6Oo!oXB`98Zd zQ^FAEFEEm9^1+JVeyRy6Ag~n#lHs$&WhJ&Kf4ckgs>zZaO-zXux>Er)8iiZYsdJn3 zyvayrQxBuUHhaUxm%BC_>GMXpw-FeM?g#{$tZ22lG?ln{(#;Hd65Pcd*mh2|mjos^ zapHf>aCIh8*}^cURXGP@={!)IoV^AXL3AzS25}}9OiALp(u6-gC6__IwA0#v8 zr)W|pX@car92_Tk3hk1?fx}@=1qXH&YbK18P_6!(YevSGt4vwz#wzqxqam^+cyc@$ zf=aqatyxT)BU1)i-E1f}wrOd`p}a0vYTHD%!PAi`O68~-9a|V)PYq-eI+J+Wm&uVD zQF5}Pqjq}{OLJjhP{{g3m~5&_IheY2Qe&Zyc&mw$F|dp^M12JlE%xk!e8yiBnWCqB z_B&!P$mLD4HBONUAlPv>_HuSX~_+cZmYF!`-$^c#b;T01Kan>!kT?N~)i z+m^#luqYAeTDV(?pdKBoS~YvTN7M zCsDfI1wBa`@*i9Tn19?iKDeOUoGClh6mB+WS({HWE9Q4S;j5WOu7-VuPLH8tlQ!XZ z1W8jg6gKs``9rcyM4Zu?z=77r+z!#JR=Tau6f#G|p-BvCF{TY>Y$F1n9jn?Z(QJqNbSbNQ)dTK>4(BUpWTsK?-o6n7=Wg|H3VQ1+1 z%kcoLKy?Z?L|b5qnO)un6Lpmk7<9THPEbj@*T8b*O(oZBjgg+C;UQg~q^V`fdTQ9< zaBW&NYC1$Y4Yc0NQ`GlhBwt}I<8M6Zunm+`!x!NepnxSQgpM+e1ZdzvfdOcmchE%F zHmHyYfs3h`EA6Z<62aaG#ZZYx&M#3Z|MfdV$bo=8f~`UvSpcNo1ker=97#RKtT(-D z0AgnHq>YCStsHATc1>eN>tHLwe74~3lJE>|T^D+dCd1}pv+^^Q1fK**FF|8rQTdSh z0*X;Yv>R&_g^_8$+2k5KNaWxe-ojC=t<$E8vKl`bgvqkK&~SM1thyAYyL!0DX=AKA z>qArdlCo!6GzT1syJSTUqw#Pn-B#hwcGE#-vW|$(!b8m+h(ND%-IRMgM&8UttCZ}no z+YuO*SeY_XRyw=3@>7-5#&R+eNr8sfMs{^~Lz^$_9gWxL z&y~69PpNvF0njDr?N3e z8}&dx0P^{+LU&i8ON-q$*v85b!ex|8&Dij9ML0@AwU)=z!V{CVb56Kv3Q!qr{WI@L zV91YmB27}Hqd|vw4LvVqWQ5S8!kZu!_mns48JYr{+t|RWxqih+Lzd)Gh;i34yxcoX z)g?a~g29rZA%#t&9(jYjTMCt;-(>4*VuQkX=@*C@O&6!75Z0;0i6dMbvJ9+K1D-aJ zc=`OG)fv35lt6H2At0++KQ+!+*;(8qHYb^0Wa-WlW1fyCrnJj~XV)lc}*(4fF10MSN_~Q;Gw|uB6AZWk{6BM2rujbwsDVnKZ%*l#?fQ#D-G*JqZ`dR+6~Nz2%)<8Fg6?`Jf^$9x+Di6MBdS z8K!{qg`E?pQh{KVF@S)8ChMvM5&cv*7iUbqf3m*=2Fd} zNdZmG&`Z9C#a4OXVfWbBfdhvK>ZplHp(P3okBmP2;KRMWy-SNrSFc{aaQ^(<{5*bw z_0f9S)Il$TxY+pk_+yVfzIX3l=509^gf%s7uc1#uJ@s6HJ_1?_Qx)<@j~*S_HA;aS zUey~qjg0ARWf72GmLz(zhIp52r;Pffu8SW4<@6BDkt0VB96Hq3+jr#X(ebg}6t-(A zG5q6CepxOzFfe%R*s*>4_V@Mm-+k}N;a$V%@02mi;7-Nj!Gnh$f8w#3=@~v9xo7V_ zx@%0N0e^J;z=4Awe)6fAnHi0%?rUU-sdM!(Ya|WH^fiEd$g$M3r9sgHh)?=h+qQcK<0r~lTK~>1*oi@kCtiekzEIy3!A#^E|gKn znyQ*xMI@4z$cOA5i-64m-tsUbCOXYKn1|V%-|A97GBWa?|I#no8(Vjw)^p{Y!*8a_h|saaYihgsT5b8@tG0yW>omC!V;bbBH(iB-yE_l)oV@~{8K zmoxe@^^4Cx|IdEspS=0T>nzgQGN~5!)>`RC7;c5vg#-A;Nt2w@T3(f_A`a__q(h7k zWx0a~4*%NU|N9heZASFXBvRKqoAJeoj@)Mn4Hgy_`FP|1{eS%*^KZUoAEuFO5UH#f zp8hd(mRS0K{D~(Xd*TUqxXmq$)#!|px;-t%Av0Fxkg(7Y$K)jHTS*~QEl?b@3J z|FsE2?FSkGLJ)ohk8{y4M9IFKNjf_-0Cd&oWOFWp1%UKcIh}tPqH?4JxwY|SHlb*- zoP_r&?)u}#F1AW$${hGg#aOf)#@uH)#noIh9mkwC1<7C0Cn{o=-f)E+ECi%q*Zi6dkxW8uUu**^f4!qj>#2p z&QjxB)51a|)>G>pO`|Jkw2!z&eAiYfqPD#!wH-LwgwFwgZl#;SvS65kS(ej~@u%)E zBB&+pwAFtq*r~N`nk4DKN^vjbP@2!F{>nQvKi*yXd~>6=He%=)ld~T*G&iKQG1C+s zg7u_}Wo)O7`McIEDiRAqEofj0wPPE~?sx>&u)9W8(;3`=tU(~tOCB}RP|>JU&L6RB*ma}D zwsYxuliOA;FbD{wkAOR?IK7wy@OHFrDnC!tHQC5(fy$qVscRI8luGig^kGBY%x_QT zn!}3bj|!3>Y4#)K5A+jgS7^YYoLc`^h!QWx{54;y1BsC!H#{Dub>INRi$C>lt_z&H8<3egg9qXj6(_t+(8JW=S{kE zFh28i`Ly#rJ`*F9{mJTgR+`M~XJ{fd9YiN}qCR8;0to~Z-je}gd*&gsQ*cO@Xyx9z zIJAjD?hIay9{W_#2=5X{jv32hKW%47vq!USi-Y+2P2x8D_HtulZieX}tE4&G^paB4 zYojGoR5OvjE2yn5k!+G}dZyczTY!^lg#;zSm>LY^K*W%e7FNb4f#a&|nw4#+lk_(0 znjFL`$vq+F1?GA=I`Kbs(JAc~ht2g$aD_u#{~;+QLEbKF9Zgm^tw6@(BF8|!foURa zoKjYz5To>SP`Nt)OgH4-2~9GWG^2Lh)mwGhL@^pq+^kXjolp%8Znqu});h0i zEKVeOZX{#hEKx^Rmn>FZDDl5-T`O(lm~N?~h(&e&2vAbspAGZcROFX@|4v9eOb z3Dvo(TPC;-lG_$C}#R^beLbdz)j-nr2+J4Vly#5#mbK)@pq zTgh68Bo|}diEh+!TQfZ!+4&KlBqDM&F{K^*qeh`|+p$f0-lRLl^aI&?s!OxWnC^-G z#2_`g>QM2={&MM>CEBfpK@+TN5r(=CG6Gt@CbXs-mlQBjG)6HS<^86q_mo0yvnD4a zrsk~8+Ny;ab5jer$ftuskF2uv=K^^U``C~d2qSV@0<)cTS%0M)9!{8c&Y97%SZd>X z;R}qT^@&O^NAWAS(k;?B8I>3j+!BS7J&~Y{F;m;kPTN@$>@OJ1gzM#>Hl_6mKjIAm;vLT8wfpd%#n4y+myth%7o;T@~+KAHY(yU9c3INSYA>Hu^$O@AGawo;M*(!?b!^WEYoMr(|8xSkk_^ zqpgQx;wcn-vmRTSq((D@3gU!$Adlc3B?;cK4l!XelOQy8<>BhLS93z9e%Y87zGf}9 z3Lu*8HgRvD(ae0kBQdcBZla@{9l8_PjialGnm5aeN^LLo0kKu3)m>=fK{Yr_R02*X zQy|-dfjY_?ugsSewGvy90>{<-tv+n-SOmO7Ls4zWm z(sfVQJG*pn`dU6ZZs_j_jVLPgMefi}{HUghjKU_$n5c7kf+S?`00d-xvJu<63%}Mf z-LX|@qr{$vZrntp2@o2WxIJ;Q ztVIIjA_-G+nkeHKJ8i7WIv|F40~Nf6a%Dv?%@JpdFBwd4y`_51{e{o0^9 zp^)S6b#UFWPE!Iu60L-Qxov_+<>rm(z;qOa=}d`UtZ90vmHkJU2wIXtcf5@`*@^~qUNtWl#0Tnl=xWwbC_LZY+A_b0edpPd)YI zsRth9eM9gU*KCFtBc3~V_WR%a-la>ImzS3=y!-Cl?3`g`&z^`iGE8GQ(#+-63ndMX z`XhZ;CwY7}nygIQ=Lkh*x>_q62q=uD-)i_`o1x4Sze9Lsl`3E-QF2_I+Y<|A%2--j zeC6d=UU=cf+36`zvDH_@+X;wC6B+5}LeDt3+>Myep1kM2kALE$V`Jk9zf1#@VeCzT zX#8R7HA?W4BRo4j`}EV_KKstw%gf8AM#ZTvERpYZDO`8j7gHitR&_NL}_EH(L^rS+ObLTF%Dv_r2edqO;VwWPrCDP zx`i8^I4h);Q^2HgMcGtrQcuxNT)+18x4!k`S6?Mh=#GEhO=*X``YcIwPfs-!`GR7h zcjRXH~!-5U%PVU ziu;ZcpOnF=u&Zd|I&7l>OI}v4j|>)zM|k!3-tqhHzrUF4)~lW5tsuQRF>(Ew?|kRw zmtQJZDmZg;sicDcue?(dE%a6+Qm$w9*pKl$Y2k3GI`-#)!}h|7U3xTDJ(r%(Uo*S|4w zbE3Rr@oW_12|1ad#z?=>Q}c!&=e;#I;m9U-c5+YTP3jBB zN*p0)%2}xegNPB3PE@! z`n3iu8e;p%IUk)@%of&KFR$^mo>tJKq%jp^efkC*87?x>2^0}&AY|Xpv=tiVP6;q~}f2PwOOmb(xdhT|MId zM|!&gYCS|TH2%2hGO@<*{)k`L2LxgS6t^(*lLcz>VC&~G=B1d7OibkpnKARVEM6J& z7U4!cQLGqNQxj2|kunv_sgO6qG$hZ4wC%T-YZX&o26{42X&)zB;IyvT*#F>1ksg>L{ zGY5rl#1Ilxm{*rFyA{#&HX*Q;BcN4kQgTCN)pgdRj;b(?uZ0{?fZBwXh)@z1(v~|N z`EU>e>_$p0d;$kjrBE)`yHS?qNc>>+(!`30;jPzklt=gu?Bu?hzny`LvdE*lAS=YF)>Av z4p#E0l!P0yU@VgVpS|~tk|ev%1Jh@gcU^6!efRWuZ{P?zkRT}vBt>$$pj(j=?a|U6 z(H#mD_ej)_-9sL6mlBr}odnSz&H@lYf*24(00iO2U|jp|nf6`n%4b!j-|xHkMZ}9V zRoPvYGu_iSx;o>T`|i88$TH{qqzti3ovEeU|7XRy~;)1b`+T{=?Hw_ z%5E)_#riL7Lpyd+heGy(4SIPTFc6T&Cc{QdVS&o%CtZNCkeB;UIbt|&IA-KXg4+7x zYot{*I)Z1=2_<3*k0F6gL8lupESHfa<}{l`Q;AHqQm&NBB@7$h>qtL%--d4l4k$1o zQ>@o=jaoL7MH~}-%K%^>5N1D#WKpVru849vBw5aRv*BCs*rb{(pZwsdR9rwts{&u5T$lB%q+pCgG_h-oS^L4*nsQLCOHtXzV)R4jckKkaOPHO1EfJmCzPj>81q?)aA&E z>d7h=rb(pX2x3DF-{CigMMliw2dYsbCNf3C2nPR&+1%?U=N@!R_$Y!+Ex`^&z(xz5 zxW5zDB#q=zCa&9%K2nkBkR3ukl#_^;f+Kph6A78oGHgyW?U4fm2pDs7{1$Ab60k{B z<1gAkt#LpYeG4oM-0ujy!9(ZuyzWvo&89(;;@sEA{BOm$@f396|5er}^ zdxm1zOjZcUGbB|gtfXpbk`g&D}_c;rYT!%h5PHU7bp02$IaP$<}`riyIK2cW^2<(qccSCzg9!%`~(ykrc> z2ZVIkP#jyN&_P54vB^OfW5s5Cy#PcoJ$8Vi#_dw-mpY{biL8)ASdOzCQ?XiHch)qU z

8b<4LRFD-odKb3zPr#^|lwuOto+-#fF*6 zgp!;q@;}=65{S>>f=9}j z&5`aj617YQS4iB!r+f$3Jeq{N0Odlc=NvYSE7hxCyo@=oFI=}tpwJTks11BBJeRd; zN%96}4gLh{WDQj)E!(=@MY-!Cy#D)zsx@X?2&KpgM?%mI57c5q4uLBkt;joAA?yPN zgYW?w=E8dI9G{J3q0l!l*pK75xKJD&8I^T;7$t;HaDdKG98i-L=CUY(2=0mCU44vR zwF1Es!iE2M?Kf{s%mNhA4|sU^KyOuZ8-Ja?uxGJBa`eje<=dG%CLA?PHrwqrZ=2*1 z#h)BHhW!~X#l;Jh7veO?H_9_0u1qe@&;vk#2JgP)h`}rKg*X#62d5mA3|KR!Q9Xm$ zIy=@%2Lijrztr&X=-B9JCWm*brv?UwFv~FM$l7`1GP{afU^zoz!x88>-Z#9b)fM)R zO=4QYNm+`KS<1N>P1k5j24}Z0!VyB_WTNwa{FJepWA2==nuyiC^$`Hm;oHl3QpYgE zDV`xIoZe+f`Qu8V!1Y3|R=mvM3al4nG({mUVC}bHAailBo{|s0BWMCaVm>}T@!*3Gjf{?xZIHJ)8Y6(Px8_Z> zOQ=&K-l^2&N_BJ+iug}9uZy5XY)@JF zLxYGJ3ru16Eqy{mSQ%*(u|z&wIB@4(c)+~0ybP)(>{|??;9Ay1%0!xmVH0{>Z7i3U z&z?Db<Z`UCHF_S_YB85Gymp6Mt4%0Dz5Gcx?1T|ksT;qjrIDa9G&*eSVy96PrcjF>)Bx8(>kid4M$FVifBf~2ee|OX^K;ZmgK09& z;HRdLi#F-n*~)T(UNlBBVM@9RbCBZ3p~#`3|5&SrQCQ0OLMc39#Un&nEsmV`^jXpn z=!`%#Y&+aH={M!bbCX+!cu=QGJXJx34BIHPfvMiHNu7^a8cN%@CSjQ+ZaW0xE8PrhFt{Os24LY2EFT(P5lABZvhLH` zOoAxFP1uiKbr3h?reQ3kafxOLmlaVe(}VTVWJgF8+AwXnA;V9|QlTy}x{1LE2;T*S zYgsf^Jc~P-1Z8qB3is^5sddOusi%aR1h&8o4g=>QB%l@2{8I}g5gu(6@=E}rUE;twOw&Yh0?kE%GX=lR zjy#3LQKm(cl+x!`bHxI9MsKK@O~hyPfqOiFh_u1-ybKw3FBZ@SCWX`r7makI8yqaX zTenS@kzlu}Pzm^&JnDvN%7fry(_*j~?OcExp-J$G8*6xP0db>G5J3fpKT)BK%E5Gm z-ZM$wGe9`RVKk5|@1y4Ab<)y8TC-gAv5Ls3W*KKvWFLk=HwXlSPzLN;4Rj2*O39E6 z$Fq!V6a~Xp&!era)>YCwHmPO>r~lQAT+^{N1zNO+r~H;0E4Ymi;K0Fu84XN_6KwSn z#p_Z}P=X<FpHuKuZ+u`J@>79H+%`QRP z(TUQE=E@t)i<|gx?g}b$L6(##MatWJXre|c5J;k&0XjiQYbXiYA)&WOv!}KxDdQz> zRg(m>FqHRJu5;_+1WCu#Y#ac6QMZin#8JZMw1Wp~v`I`vGQ=p{oF*Az z&01NgoJj^EKLp>fahSk>0i)vM(i^jdmVo=>Zb$G)E-WKZSp&TcE76xrJ9xspvx3%g z$U_Q$&h~J$gg9`(P|{7=NZP4s+POZxQhXuB(Lx9OCKIal1T1+wBOtS<3jq9)(>lmh zK`7Hn!1V*UH6*$)Xcdv(u}Sq%PL@n!Zt95>8LbMeayh@yPd5dLVpYwm0+pT1BMD30 z4hUelVB~QM;XflgBu;J&x$A|%5DqH|2R4n+^#VoZVg!Q~4CbgcRLeYaI>#|V9Fbv_ zSS}-(ZShZ^7l8d*8xs!gcXey+#3W8gc>sa28rT3+P|iQkj8JnAkin6Ve>^TkLK!X5 zfi*BGG$?Kof@SoNrxcM>cuM#u92GS6`ndgXH~P55D&=V)=r7awh3Bpo!HuRDSrbW4#p4pDBKA#fcC zMAMriD{L4JKosdfmAXg(k}4BQikzGTf~rv4h9!E(CdE&j$1rW_B%t6wH_e=@;)VlB zPNFP;|B8wOLQZNTiMj|JSJHmx0pDK0N^b`QxWvh8Fl41B1CJl`gd;|}9ZlmfK<7B-c$yk-|Hc8(hi2GOt7g7Q z5EXolB>@L6l$Jr`ORGEU0R*Onn7DIZfTWNe^v2Q4N1^pM3Gqb;&qJl%FIvJ#_)Df4 zX`vcWY;A}}cxgF&6{J|kvvE^T(jy6wzGDCo;n{C=nUTpthtb-Bi3j5W1imWdd1^lT${!t+VZrIOl@aU(3K(sA;Kve zc2LA)4GpNqpZsSFa73IoQt%gZw8m(to;vV*o9sL`QPGZ;K(mZs#Ym;7w*%&ZUA8v_ znh@YX)Qw}a&E^+ki22!28io4jN+{-N?I;$5qFdG(Yh;A>UZo|m9R13#9An+$oiXda6Z0Bt8|RNX}iBQ;VY z>s`3Z4)a;eka^9Z2d;y-R3*~5N6Y;xbWAk{at(L0;VY_K!a@Ad9Fll{V{kKDbYh6Q zi|KF~ojH+AGJ!s^Mkt((ToM;rJiv@MW`cTao3@iJ($KD#HOrdJ!0d)MxB-qAb)M|- zU;Z)Am%P(g{320&MneuwP=#V58X=AK#hS#3yx+?XPCdM?P1|(qW(e;=84Hi z?Yrpoq20nlUb|~G{J;hbN1#mT4H~0CAnZirHic&UCJ_mD#e`<`TM=f!&}6xSHv*zW zVqsL}&QbB^$T`KK{&=_Tb8#h9q3eUv3%#d{{13{HE4{9)3RIvhVwK#WNR!k6Xuzxf zqzS`JRR)>FGFf|Vu}z%j(Pk*mHA8Rk7XRePhnhiFfD9^YHTl6tn8pS$5}R-{88)!P zcdDhw_Bd#%->^vzdQdB_ASrzcG&T8=LwxbTbLHSREOVQ$Qm-b`P$(Y*b=aVe@w+ZI zb`1Ue;TH@?4oU`xQ-Us<<1MBrz>jJ&oQ+?zM1n}+?cW(4=WarE>ZvOmIyDZ)48MZW zJRWr(KmB$l0l-Fs6NE>r3gYZc3iJUSzHgLGctj<(iMFV2YZkBFoPC(3=p)sjVup$F zGgBa%RO$|+9IO;yVhYuaWMcr6u<~F~yKRO*I|Nog3$$wym4$8F4&6wuITf~RuGpA- zFVs7o_y)P>-p2=qCl7t;Y0R_1ku8Hll4v{zBEgW{D5&Jpj!TWauM*ef zdTnlT{`KQ0E?>TkE>MiC7@{5cHI;35Y}>PUf4-2%(pnNfsY7EJb3-Hi!}WV+cIMP; zCyR?k#6~tvZrQzi4}}>+<1fvK!Cl$Ua}UhIPZe`fkecV`=TDt_ZGLtR0F8~0@7cF+ zpsyd(if>cG2h3%{&ALV)pkDX=-4s|kq#JKdp;Nb2(d$!!M zEtknM+D1QtIthSqlRB8v#fuj&TsT)+DHRHZ?K^gC+q#WW+W;3@0u(lS%qWp06@e%9 zI(|+1($v(MGiQqP3-W!4JR3F)4pp%3c>n-F07*naR1NRiy&FFdjo&z8piYJiU}LaO z#!P8t`TY6w=gys7E*8OnWGKGWeJ=KM zDxq_Xmi>3`9~>M^r|@e-uv$Wlz>b5Sw70mhaQx`8>FKNZL2U+LISe@yg;KH`x49w1 zxGbW;m>uI26L%gsFfuZNA>`(rM1OIxNNyXArRAlQ$BtdOd zXMVapR;k!4mFlvGMitb1bc;%{- zw~)3}IprBF!Ic}!-&pUik>QT zN;WbBU`7IFhs8WtW0 zef*vQ-k`mabntgJQN)cL1-A4C8z_b+;3EKrKl&$>h#Zk*5Pg#H$-AZCxC{ZhLl^)H zSAEGt(Nu6DRLGHJ^2o0qp_F4y@9-ul%#@63!yqHSB;Rm^V+DJ-Bu&G4H%kZ%8lpLQrxHMU(?4N>=J?g725~z=q2PNy;-<&Jm>SRw&)?9sKU|mhS zcEiTD?PRA(8r!xS+qP{swi`6IZ95Gc+cv)4=bZOEeZODp&z`ks&D^-=nj0sAV>lc6 zP@4`KLw5+pZd%xOKaHyWQ(&yNk%3p+&Gz7qh47x-zq^}s3Z%ek#dGx{`{Ru6DFv|H zj!ed*Fs<`oEnv>)wq>IAJRO!R<@4r;RpK#$e0tyUGmLEZpd&m1UvE|z{3cO3gw-U6 z9HfW^M7)%l{PCxF9oFMO6DZEBwsVFiSXViS6tVoIeWG^uv zYGgeWIY#&#RQVs~VCLQQR$ivC98^AP_+|x;ZosB0pKc2*9gx0_&5upBzqwV3g$+aLf-vE=N0IkoT%%5lri!nE;2{D#W8LS5IRBImFoY!gyn!>E ztTCd9%M5~p*NfaO^F22g+CS7PLsFqnXnPPqM*?mCZ-2TaLa-@^_Q^fi^R4Xn()S(?I^0&YOCt= zNwc0Nzh|*bhE}Zzh$%5&%zJ1>LM#3Of#ffu=#0J9WDM^aF#Kk>|v{i6)QKv1S2OOnOu~&rC@a6kf!wslx%icKuXD^sR{*` zA(%*(uKj03t=vXKEZ{g_`H2Y3fAP~5x_d2!I|U&IAi-%MXn_QW6IgT8un1i7V`)N0 zuLw2GFdtuDhgd|HuqUWTbd?a3Ht>sQZwjD?!n4{-CZwla4X#>*f9g$l>&Dfdw|fng zC{Cx2*2(jWa}IfPpCDDlXYtHZpG7hgA;O8kYp}G!b2$^1FY&F6$JXLc6;ixEORp#{ z2Xb)}Nf)8g*V5&t876XT%R{bHas`DscXP_C>rd(l_av$wZA9H)dfkIc5CNaHtoJ#I zWM7%2IpOl6g+dq6GtrGE+vFO;v{~$a?f^4j!Fwtpz3Hc-!mp;Sb?-|0eY0 zydtM!Cfs3>x|`)OIYTDc+|J-3@II5XyCHII5Cmz)UXRnHSE7z~2ht^{cw!u}Jg zqMQhi#Z1?zlu(NiECJn+FH~5O%W!T0OY~>LA4oRaN(7e*`adxOZ_z3|rUCSM1}kE` zm{wF~ZNc!Xzg!fkM8DJ7qr#=;TDFsXm+iR^sg}@>VCi>`$eOlf?WQP{Np)h<#6j{& zW1JSO-gPTEfy;!MC!s3+iG9qDb~i0w`!cb-<{W6Z6hYj(T2IeaTahor^_I6D=s7lBKOf zh^qnTBpGT96@qk@Ctd83a+;xAwyTyhp;`i^@-zBaKU|qq zi}rRRpKfQ9Wg`b?=J8*V{yHPVun9|##5^}N172o|2|Vi@{SC0-kF7X4%hk^wtm#Ov zh${+BiX*xG8=rYzj1@FqBWjO}Q*1MwqURC3AhrFpL9scE*tG*LA<*e50?&hz{Gn;^ zcDL~p&|5#evh>joQIcMbRwKeb_`=z}JgRk# zwDM_T`xC$ZqF(`os3Y0osZG|3kB~V!=eD`6gksoei{UUH?zeozqGBw?Nix=I;Eh03 zx5wa6bi*D}XH9ZeN7w@JgxG5(-C`CjvQPS~>e{}H#d$c|PV;3!EO*anf$lUD)_E|q zVca_E(~$;0se4}kAZ@G;g=b{sEs3^8mw;^zNue;KM6awYc!H?)9d1ZGReuf}L@Ju- zvnv{w*59)BDpO7vhV61sR7h#CYf3Z&$6K(TdjM86TyVPs1=fe8&XEk3Uw z8Qd>c+I()!X4YCE24#QAViE8iLRk&i<*qOfQu$l(*6M>Eg{mdU5p^;9y(|aiVj8f4 zEV6Gg2tWETzNvNNzekeS>u{T`PFr?AtFXF0E^ujMb}zmyMCJq*t6G>fTs(uDb52|eFS!)cXs4@RgWeZP11UJsybLvPS|xQU%sN(d-fYu#?Gs3n6fC|b zsk-8lAWamg9u(-KN_&q!>VK_@&Q|$BRHT&TR=QhHLi&~F_STBO*3}Bdr0?*O4n*uO zu@H6YW@ti~$G(TWsuUvs5cJr~7GwRBxb(nTuph23TlCzbF=Ecw&8TpK0jO8AbZl<= zV3A5#2e^0BWC>Okpdo0;WAZ=~iVToTa*|X(Oq8HXb^n&7M=~z~Jt7HRV5Ofl55BBU z&Ah@`;v!ie?j;DxHXe7escVKJ6=ve3;5%&hjPZjwWsYB77ENr`g1$=Xbc|t6Weks_h^}WI zc&mXbnrNwdAALL8PieAT9i=QH(#osZ{b&6aR0PRtwJuWf)4T}`obd15K6T&aOWs*) z7j=J#YWcP`Xx_@+taxYiYvTKxIRz)w){RM)X`DC{xR;V3qd_WtrCIY+28M6oERLvb z+)i)F5`=)7El3Qi9cE$g3?wsy+t`B#Tul{f{1{<*M8tg1OWqWrIyZMiWD zqhdnvFs3B?x>lklsf?ZmEoo<2V1_Xle1Bykmd9)+#I{RJc9xkOzGq|z#i3ZoFZh-? zADsgv-@Q8*V3YFo|p~Ee94Kw128VP^~9)E0&?3JIlwrOJAF~snl^@s8)?i zxh%?6T$~@`KCn!UNm6J)GwQ&(?_dU%BF`UP3W_qG@3$``t5E`;vq7wY4*jNrwInG- zJp!|Gp&{W@U;Sc0NdVoF}3*1d{;VJt+IL@}CZrf7drL!b7`B@L5@#R-FN7fP-8 z!Nr?2X~QV~IEY`OWR5lqzMQWtZ{R7k*(jKsK|LJ}ClHvKQPAOE{l~X=)|j>$c3x|t zS^MA=$}IC&3faqB1Am(=;%BJ&u>&ubsvB0fr7`{>b|MkH=se5r`g<_OiGQ6pn&&qK z7ud~C-D%+!@enY9(h3&^v+0<*ZKv;$*oX$BTF0!;gO6Q)ZuBVN5aK2 zty_{k7I4}3&JcxHl#_;BZ<^Ck0*uln*r%$7LTSXY+?Kk7!J}182Uo;u~fCDDE?f1^`{?%RTKLpN`>Rt${SPaMhK%gjn9d4UHX5nIW!O3~zDV7j9yvaS zZ0|zbvG>!qJ z`ev`a27l`Z<&=X6OoU%jQf`ZGAB|uwHQG{2Lz0WKf$W>(so1GlYfpL=?TXwV7Bq`& z9*b%SXTD<2SEILMgkpU&o}DIUAFFduJ=bdkX=*vZc~JA!P|oqSdtIq}=&|s%8tz>~ z->x^ERgRu2yI+kC`@6!Qd$xO>z24Hw0c7w8rf6<^P?yo(z%ft@aCTtaY6cyuwXy|HLfPeLk68SR85lZT=lPZ!4W0u*Oy7zU zftLN-Mx&?27<1aYy)wJmMRu+ zpZnDM&x^g>cYGAQz$J59WcoD!2>ZmnE=^0fiE^WFl6_%Y=qPj?5rt??6LD zpPONA-MCRBOdU^~{b|a%;GPk&jg*Wfu+C;TVDH^s%6nDJ%G?tTV+d&$z8c55)y_KK z>rd<3@VJ${AH?m#UfXdGdu(Trl)9WZBr!+RSr=Fk2Rmn{o*@*s#YTAJp5QJv!_3+#9#{*l4BC zp61TL)!tI=?(2S~LBq!Adh0lrB6n}SjtI);x~o(TZJB=5nWxOj=K7d6zzlF~snNh+ zdt=;DQyOyU)4a}b`88H(#LDOS>KJLNJ0M4{7U5`=Ja)re_3llR0;Vml%bvMWPut>F z!R?vHSW^bq`^7oRl;L~iyNow#8|_WX7_(_G%e+#HppBKMwXwdj2UHL{Gy50M$222O zSke>*Jjl6ViKmf{$l`3;Y(DT&(CZX@tk19`a8Z~PF3S4=e{1wXS3l5w$_Kv%f9ztW z;8zNEUZr%7*lOx^a%x@0-x6pcjHM|fCZ9!V2P_>a`Eo`O;ZD7B+wHJ}e!6XmU#*qt zDVL1Oozg^IlrqSs#2;Km+&Ho3VB?jI>t=Di9?h;59*+uIn`0O;B%Ogl=(4}$3cE27M8o0Yem|BI{SlZFBHIgUct5fjsFuR@-3ZV6D?ZRp4dlPIIH4GMn{6cAUBl#;GKYTn>>a0BT;Vhy4fj`~fiF3dGBd38m-pcLu8_ZLxiTJK$3Iu7yb(gXIy8tJmQz;i8< z_O5TAULO&h*j`45%4i4Pxz78l>9RdrbiP3|xH)vd#;gubV9yyrVS#oC=DJ$VW}&!C z8pjul%9!ywh(i=IP&tXDJ5#EuVU}5_qSrTd5MTZh<}X57MCG7;B(=?CyW=cb*iHlN zFsDuW2ia?D{vwGJWufBhq-U$g<|E47jfE-d=16A1*G%K|r}b#`Wse&nf`r}%JqP;* zdfaIDJRsf4$6ODs@mNOnN{>{YWALRG1f#*}O8n|pYQ%~n=`3{edR*l4)AU5AOqjMY zf2`sY2zc3X1JfbGM%@H1sy=zXle!c{Tf&}fWmSBe-Zz%4ks??j=;^YX(4GYTndawZ zGrx;`{NBu5SE$l2lc9m5gob28Kw&CjnB=DfHPQ3Dll(cnpW^I|!50igZq~B^_szW! zQ)?%ge8;1K+t(a>&DH9q`~Ia{ucsGzhwOyp=P1ej$o>yUhdx3KzNtTH2HtLpVBJPMGsZO>=i)w&$qd_LU@>m2;p|U) zJ7GeBnkhwcts=N^B>N<$+#z;10Fd^Sv)|xo(e%Fcd0wtj&Q(zYoJB>dq^3J-&^0c$6lmW0E zdUMFg@cz?^BmrGweNi=qFwLmMcJ6#_*oY}X2rIl{Ygx?Pk_rAgj&K7yM1$KE$&^hP z@v|#mJnnBrO`UGe$I-pTtJPlxpVzopvQJ(45wn0|IMQg4mD77Z#15$j=mazUrZ7<8dSaxuP%UE%qO?=U7el0eEs9mP>Vr7xkHga|Upj3r zL}X!Wds2|zGT17f*l8lG^RAuqPV3JWQp|f#mQY0`wNfngq>rKjk`scr_ODlMi;wf< zCasf{X<=RnMUs7@8@uPH)4Qj6rWjNBWKMJtyg^}&Y{#DnLv5conWccv<+_Rg^BX@F z9`f^vUf~X+FKK7Tc$OE?x}x)3V*RMQb5emf=&DC<`9ybbkU^{m#X>yIB9LAy(`%~* z44p$E7##uWoc@+cd>dKh!B9-<%p4>LV6sAA1-dS|1w+A!G!ycPyJR+S8xe3P)h~L% zeuOqn36>n$k?P+B<&kpW{Ni#M>4xC>Ks&klK33|WcB0omvSGp?Fnx_Bp}l7;MG7KhbwEhC@1?Qe3!7HN%x=BnpUvSGydVVyo(&K)335Ii{<+vC9QOR32Q zlvIds!Z#4%!ZBU3`1!8)qlE<4fnyzPx1`ur8GWd(X|{N?FS5CA!!~0pZ0r7@u_$^8 zs?>nL>ar+guRi-^Lns^uE6WeC-NaqZJ}2zq^el8s!mq6k__~HOj6Ku+1eQ}<4i``; zDgY%Bvaw$#<*1G?>TgxW>F#)%bI#P@ zD=0-v+;R%TkxsWQpfZ11+lnCgLS;r)SO|?X3u%hZSqw;wn^>lUJigILa&ShrT$3tM zbu=%|EHmyVM?Mqr!_c=yfP03Fo*!9HHEga?&8+Ai#z9KfaDgCa5mGdO|B{!a3?P(V zGJ$GeKvFlh6H{RlP<_yn`&z*ypYK~4A(>@x${5b(bAq3t?05yCOn;!JVBfPxs+Os1 zL%HXZjwxmvY0McoOSVs4{e#%P%)7b z0Mj(qx6@yYlfosyFF;`{A|{j=3XH^PZI?w!F46P~Ylv?%rd8U9Q5%;(6QG3Etprf# zm)mrQ1t&NFOyqa~6Yn6n$Kprtgb+c$N2)UstVgWARPRO<`yuZ;G(?>sqbIbYeYNB34IwDZduR0Ff;oub_{B(g5Zk(N} zJ$>tN3`HpFnmIhz*yT=hzuxs}KAkUE6zB~0@T0YG`=ZB5t$B{h>hVbw6L39&uNCeE zJL(GRq5M(+2jy>6rSPUqu7}89CYRP5r(g4(U@dLXJ)7k*}lUeTM)X<^EohJfe&N1MTE_;8lG5Q|y&N`%F zk;cu5dNs6R$EcA|KuP}CcuipVvwSXFaGQcYoHS_8AWwm}CL$3^l_J{7qW|ij z0Ux_v=GsWZU5^^pb>GKZtf~==&fvP+SAhH|Ne2sr2FFcs>&y@*k!ub2`)ahSM}E~w zP~L(Fcjf~pwR)6i@1^h)NLL!Jid}dk5~TEqci+5^X!+P3^fgC*Vr$#x`m{NUU`^2R zULau5G7Mmm87A;X&<$4T+nxNI<4W zzAvF0r}>tFBn%gsaDFcdy*#CX}q`u*#*Rix+;GZI0T5^VdWK*#h*O+UGH> z1&0!mWV>}!3Rx@}fhzBJdombC5QnLx^B{(RoI}v~QEFV0WJqreZ$GIW#J-U(fdN(@ z#Z5060m&7xs9Z|H0^DwG4rk8&9sC(~Ot8`nVRq8nIXBAa`$>c14JZ?9j@nJb+}~^ zT~xALOFbMI8VX!#ptvvf%~X&R5)G1;pusn6!J#k+~Oo z`EG6{sto9ZO*>gKPc>YRm($}Sc3j*7u{-fcxT3|=QO4)jYsww<{0Q`{B|fGj+jK%* zZhp}1sBCQGnV)ltuslVY+)PZG8C%%8%!ft?cIt+B5#=2F5;jMJM|iOGXcuJ->xtk? z;iXE)M9jK9gD+ty@pRYC8NCU5ln2q3%)R!$hZY`Bhhsu+4Qj1L`*A6OP%qK2Y|@Ud z)%a3n^M!p0#CR=^{2lSR4tRasgbq5BdJ*tG5@pUT!|wa&XHY3W$hC>n5GS*G?H#BF zXpeC$Y7?|#De<^oQLi`;3iF(JSbN#+KJ3o}@M@PW{E76iw^pYaih z6cgQz{?+eKHdNshD6)ACAf`pjkC2PlOz2@|aFt9JUDcc{!;6E@NYcgGT*3|AB(fD&bx7z0^AS|75)sPQ?g+F$T8&a%L*I}?Fxe0SK!^~2(aToF#IQu^@V;K{-MIkLDBNj=x=g-ga?g{ukO2ff>j*L#RS# zd4|nt6py6AGTOatg)@|)$n^qDt0*c|q%h)75m$o(prpvy6)3bNp{g;WECODM74y0t z04UPZihW3vw#+j)|0X!lRGKWWa5WJFefRl!DTNG^j$SK<4K~JFMpyKWZr6>s$Kn28 zLR0VB4f)7CtcON@(Mcyip9WVd*I_~+O_^8VF!$;Y@um|}%WYp%FLyeIov7U}V`Avm4|0&6RzY7is!5z$B* z7JtFF2)HkKEK)?d6vT3ldtk~D)&qiHHLZv#m0ZK3xWujw-8$yrw1)+l*S8w zz|<-I41jxvfvHKIGz5_iaplg7>}H+6Vca5w%6gv*M2L1$Wo;^`ScxHk5-t%A%i7M*k@0)gW+|DBmXp&4LDT5mw^o@wJh!$62O=TzNP4M28b49z!#4KIP7d!?*o z?1XZfj$5jF6O9!8$ zXOUBNZlnDI1z{SklJwim_)o$y{ecyQ{m*Gs7$*DJT@n;P6tu8z|B+F7DLHQUG#NVD z>N=8JB+0ZB>kM5ghDpGWz97D@cq5xXU}RZjJV5K!=@fk&E8r6A72$p^LYg5;q7{KP z)Ij4o)ANWd^J_>7l2__Dl^TrxL@%+lCMb!cq3eS@h-W8sR;-u++mVQ^SLGX6l5Yy6 zwu%V?ASHXke~&tiRU`p%cl&{3_bxn@7os{cZEikrPlDHo6dkuhbyA2|pe$G%!|Dva zr5a7M(~XEzg5{v!dqO1*lRe8Mk6Zs>4?RGy57my21O@qW+{x}hCb*tbZx_NJ`I0Rf zcev{p1x%(Lzj+mCDf!+Kz4}kcz1L!*ZN|2lTYl(MHXj0LrgA+}PDFje6+fKtuUlR8 za%vMGZA%~JH$`utL~|KFN0bV~S+RCRhIDz1eKuE~;hG(l0yjSp*~@W)-exq2ml5$#J5-pEfF9f3%7DkbXre>QvT6acu=QLNlr4onot6$sA>`cVA!O zyWI;BEyhwPv0Vl+QnYW*s~eFpXlB(H6l_TW(GM+X=9x8w13juPkZ|B7%-2cMN&E`! zfAV3JUlKbDXJO#{R}n!zz~_IxG=j6bBXEruL@mE+Ay zccnr6+60r^|3I5~nisgdfkpC>&MQf7uMm}!K6TUD=I9|_am^~v5#04G1 z!3GWS1JWzNdj>z^OA6xZJlfwxhBziC=v+Wc2o8-w(|*tV+aq^(!a`b-Hf3{?@`|^) z{G|CVF~Ie7f#!ez@1IAr0yxS2b^@WCCRw)`X|M(~3C!J8LxLu}ims-++*>q-=Mcq0 z$4P`tBZ*+scG<5pV~w>7#qz=|^nd>Rf9EhQ1kQiNX^rf8)n|&ITF4trT53R}5?)Mm zOivRv%1W{TWCPU~EA~1wa}aLpH(UYBogGOye}4odNi~dfculVhMXc_T09_QDmIzco39u^scQ$%ZYw1wJWW{~n37wkH>=D)dSSoN(>O{EI(MzWCO#&}KgW(4G zVrx~%wVz3N8qF*f=8p6f-AexMgDds-XI)Z|Ak_%wygD&LO*x5OXTt&IB*|P93N;=- zEMf5-GQPtw!NP{d|G+C19P#v4x=GT-Y3dEPXE>xfRGW`t)AoY96UZW$y5jUtmNngnft#n0oxZqD%bX zBr%5xgjIp!ehMS^R-c)k4^|W=CGy)T%YpGRiW3bVD=N{%GStL=`o7mg`~*F{?f)p`KRVG33@@dbA3)@3Y@oGjD>7<#Ut-W{ zS7`Z1ENJ*hBvJ$h$Say6pZ!%ohrP)@h~g{F8U8z-jUKcNsi&k=2%H(^d(wF$uOQIO z)2}wW00mhMSX2Ng$ariCP|K3(HvK&Ie^U3xP^FNy{#etv)WW~Nv>6)N%z){P{`9hQ zq`Kl#a6gEWv$mvEnIaMG*Perd{)>)neZ8yIwJ5y-mq?)+Z`BZ!rRBd93F*!V;*VnO zlwhqt`a|I&1R|_2G5`J|^p+v_mZ4}UD3g|fc1A%<|MwXFFn(cOuWMA*Ayh9_E}eW1 zwBwvIqy6N!ESqS$Kf`NEj9&32YD!~hfB&wXbP?+r{d>xX$UxE1b2R0RyGk`44&X;_ z^DV-amc$L2$Y|3v?R2dfxx<2ts&?L~ldLQT{P%2eL%Kam#-baH(QXDcT%aW{mdM5- z@ykEYs5Z|WrJZ*R3=w2V01LayEe!OT=pVS)3Y?&5qB8%-1_P&&>j@4j+TU4obhSCD{a$}S(1Yic> z{~EoMjXb;mslK7p_DNaVILX~_vQJxHQ^y^2kxKre$pmm`7?R5!e9`(@FNIZ+N z;fL517nUP^VmaYs1dvbk3eZ-`$Qyb7?Ivst{;}9O2#}UmwGAkew^J%2lHbC%L#D#l6vov*+ErGM9Wvq-F)k}oUjOf!tF{Wb3TxBF|HPv*5EK{40O~64i4)M3 zUT^B~1VQT%1+3p02#R#=U>EDtrR>mn8`fMfO9sj^b1 z5Roi>{WlCf^Fk$L+*J%(#72;d;R+YZOtu!h8aV%J_jJI4!jO=IaPQ(_jqnE>U{V{q z%Y`ZZ!Raq16;2P}!zsZUsDX{ z&xQd)&SCu$RqA!U6D|t6E9b+2BKY&YC12B{P}AG&!fcmGiDu_&%*~l7x3DbCeS#AY zT&_3%?+sn6hjQx6)$>v_Kst`$`%Q$?5h+u;Or1WpOYdq9%J!6U+0Qr1#1$?2TSsSCnWVFgq))o7&eUG|Gm(rYeTZ<$MF@vELl6ZI6;{qGen@Iwc;27hwVNJ7lGBy7u)^NmoBEcQWl~8t*|vnGToMR-aTnU|FHM!lw17P={a(LRx$ry z0*d6XQW8n%VP&bXq)HyAT^D``z1pzQdfp3M=w?b;135W?j3mn(>wY!sHahNCnZh@$lBIXFw3%mmA1-FYP)m|FN(1Q8b?_ue47g(l#PF_V*Yh z5~LZ-oY$a*EAX6!m=rSvV3ssZTFu50!cN^8(TV&o`jgY?wg0kihY)|fy`|hcjJ4*k zFp4~BN|0g<2TSq#dtV;%KS~+O=CWZl9{2~_Mvl}^3}2CWT)DzEBsmA`qmHz>7~RfR zL3+4J-BU$pwhg z_=O!fffYhDf7n9BpET=?1A|byL6^nN`*{Of;a7mpzL$Av<0Q!jk%TZ#v_Q4$ZqISq zs&b};fuWL2i8^QZsaBseP0~d1NDHAhs8I1|QrUuXZJcCL=^dwsq-lJEMM0dj(cF<0 z#`A2UqH&?tq!H7CMgt&}UbAX3Qi@iP5BJEZwTmydprcliMy>RS?!EBpEO(`(IN^}~ zrv>w}6Geg~OFa2usY)Jwf~>K=BqtcsNyD?`PZGI)W?6W{*&}6!&|l_Q&>hvx!HXW- zd>uAqis4q95b28+4T>%4(k!z_Mh%b-w4?~EG zFJ5upd9Y6Syyg3qom;u;7vJrCj?aFY+%KHFW|}StFlSGfv!|MmH_Aqv4GtcjjS@8- zkEOLOw5X=Y*eenNad zxzJ+w1!hWKyd3a77VMzz1F)g!-NiMM`Zt4lKszyxMksa0UDO=e(xr zE;U#_ELbjfBTi-V-t=sI0OsZvyF&#Y3EW@937=v#RD>+g3LZ-X1J(Yky- zyYixs*PU-KzT3sVK4xx4_WI|u^M!m*n}pfCcN%kX;UGrX|N07bK2V%r=2es=9PbVW zpG`)FziUQB9VwG%(-7-0q|SG4+$94~1vDQ?Da12i>@?<0c7z<*<-2XT!Wk_^^>7`x zpj|S0(2^u-Rg@uOAwKs9K3CoTp1xbAzSlWkV@>bJRc|?b?|{ya%^o!-U?)l%@sh0J z1<2440`J=y)S=jqN!vG%1}%Dw$m+A6&xBqNZ5wxOT{o+!s5`nZz>j+6^YJlvKN@N3 zc(eW3FCct5{CM5deRK8p2J5==eG4UgyUOvn+!FIS+jz^Ua$9WkJx}pHTDe__i_0T? zt|5FHR+8g+ImPVU=h=ANB#p)AxE%%7cjabbxis~i^*zXP?cCA6cqa6{t+>WGSNBtY;PNOicH=ZduyATP- z5?;Ov7ITu2;}ND5HT-mXco=r7%kJR~@fC3K@xC<^caY?&BRXv7=JrEbhu7!!u(RVO1Tqxa5AT!^3+wQ+*y~F%-+kefH$vIL_i|;+LP>~w zHOr(u$rha|70bJ);DNbf9X|JKbZ8_7#b~PB9hdv!27LFtjp^3OWugZHs?P^%a6F)2HZfuznN7l&mMjd z-&*lBA*Wd@@kBIa_WMbH4Te#O1-|c2Nwo z^4Rp!JGu@|PTQWHADSr)wSseIex zSTaV?VZchtwzDN&h*k0{85!BXw7?3hLgt-pxcs%)1mIXE3A8qKC}_7)(#^n6={B4(TTff0FYL|^**6G#y4k>5B*OqfDE`Oi%5R?qcdVmPHc*H z4+#>VX5*JmEx6Kc4z{Yyo)Ndl{h8Bb1xSSH-dWoNiXVts-(?FYP>RCy)BRg9S_P*X6vy4Te$< z`Veazo_JoL$z}3*-fwtsg6Tf56+div^I_ebp28XA+}zY5C&7*P2Yx-6%JM#2QlK*m zL}{$$38FMDs>0{;GIKErL4XW_fN{FO$D-(dmHELbq5DN zM__J;&&La6NL-J{QoeWdIhWI>H`Lq#S!2Cj*Vib?)pZ=)aaqgt?k|m8je+*r+%Ati z7fqlMJiffIA%BerR z3T9Qkf?P{G4MPF%Y3Hx$vGP=6RldMc6O_JC2O|tdrR6;T3}WCE4uF6!p7bE1)tpoPgUpj=y-!=%gbeQ z_Vb9L7=vuqTlB}HrV?h+`|A`hRNzJ1M-Sm+4KN6bcCo0+`<^+61_N{9o4U?$5%Q#T z5sY4q1xM$^CcV(NZ%CoV!Cv=yVgxUke9s9<7DwApkzu_>iqYXC;kHlr4}6cqsCH)y zDZ0J0z90M>Lb2RHoc6)nesMSe=<<7ExT_FCh*suIsH1dvRWLOF58Tn~fGQWHK*rM0 z(cpZ2Exz!)=4rd|xE#MyOO*GJ5exwLfYJyqzZ3>i@~l8g9_)Hxw8XB%rhoMzfPtN@ z+eehL=>X>4pm`vFoXS=XdzUJoU)brS%d-n8p*9`1kTpE2p#ZKP>&?Ad= ze63w<&ilhrtJ<%bvfBlOZl~x@sBn?Gipc{{lmCNMw zy$|$#{5%wkmzCDya`hVQ-{UV?@g5%Qduq%3%x8LV0PK0k*;UQR#2M0`^L|B`#p?`1 zy8$#ZzFRE^S3q*0Y*EMKD7db8ijE$=m?4wU4`1k0h0p8b%w4-b8jadTdoG&p=O((=a2m3ImLYVQ6QN!)gk%5f%Wbm(D>~ z*8N+fXFBVDYV?Gklp;Yr-#zJx(-zK}`nVyOT=2vm+_b25JxY|*g~q%v=@X++Re|;h z^JL+E3YM84{V7ej;f=~g<^x+)gQB~mVdqwYR5w=V-jP0fe-(FOK^-?*%uJ2khe}u7 z4=tt1%}*a2T6|sW7qf6`k*||%qj*G@AFgN9pwY71Kiizbq*SJg)1XL_CT9xP@RW%~ zm>!qd=*7XIyd@gpVJ!0Nuz(Baip;elYJJZ9i^Qw}^o!_XutoYGDLN z{}Xc3%IMml0JvyUzh=aqQZ&k3d%CuHD>bOAQWk+|q2WLZWhYiX{t?{`KjQ~=> zVns*(rzaAM`q=+i7otBY^opztW0r<)rdS-~s9Ds_wY~VK;94M}UlAAbZ_aNE6`_S) zY5Z&ZVZvZq@9UBceuMOBB!>r-ou3CUCM!t;2AmRBo(8K44B96FRWkK=s3VGRR?9FB2&(+ir;x4 za$wi1(X6K>FnimpxD^cllVwhd_S9uBj!vI7PJuyI3Dz%Nnf>FhS@|#0lEw;%lekb% zF=&=r$2frr8$Z(*j{83}`7RDbnuJ=(3?=@{P5t9>Tjro`(C$#t1Yf-wn%6TT;uznM z_8SKV17C|u^>f~qgh@UOt$%MGhrNg)MX~&XLVwQe4~&1>Ya111Tq4PQ{Dng=Ui@!y z!uoF!<_eeE;29*7j(9v14ga!$2Ak2gP^rLeO5jr?0hNZL7$efDqOof!{0>veoE?5T{EJBIIAXJ>$mg^zSNIuY|^#4CkTT#%Yp}4ypAJ*@X!D+NG1_0?_$iP7BIPE7r ziITw`++(YoH6uOqk%9b*DP2p8qs{!8Q$_Vs0&DsICw373%d$xEp#dX6HAqZ{T5Z|k zkl^h1d9GdnV$j{UCtCJN1{}AQ-~{9oECrBY+-e=Qdsbx8i9nd&NMz2)5%eFNBD&CO^+`djA+h@yxDQNrMo zi{L^ojD4UZ%7bg9v$zmbX1IEC1&oE+A2nPm(T>aqu>OVWh)uz` zxO>s~v1c8{$g22GfDS4ej;Z6DMTjL^LCy|m%Ma2DV+ZC$N4Yr1n^{9P30cs!vx0}*lf z%JFj6fZ)KM5e+uci^{y#L0`%F90uOfW1ETIBOV1 zukJ77Z^gxj=eNB~%O^NI%!%q0#&IJKHZ^+gHC6~<^sLeVlRSci4$ro+0|Gr`;V@xF zJdNTiZ=@VX4<(VLU!e~@{B2}>cV1A!9buo#A2OOgai<(mUo=G7ATFU&u+$T~f9fuv zwP0u{FU>43p-GA>c@Q1&PQvpjL((PyQbG<+VflyLYN1?F2yPU43h$?A6=|F>8v0)h z_*YJ11I#HUjHJ6IuCNSsImk-{lda57_N8 zZk_wB;xztH=YO9PFU^{qrdOsH)FeunA#s^L0(*d{hK8AnYUu+Q;P>;aRv#}!`dD3X zESk-cl7%;kt6D^=AACJmv@xWIbE9NYSI^M3Hf9W;^7pDALRTo zT7(1=yr2lBRx-p-t5Hp&e>Z@CqfuT9qt3pNTE4U^g(GjAaH^T#h4I@sk-hkCTz*fQ z#C8uJKIlv!wl*(Lir*I>Atf_S%W{GSsmGEAsxr4DP71hGvB>|5DUrwmHaj?ZDEWml z1`VDB{z)>}6K2)8Rgyv0&5oHcbexgcK_;lTg|I-W97X-ru?%2n<5@PFDr=1?35Tj! z#26yesa|e0W2k??INE9g8%4P$4O=1xk`8pPln5c(@fT&>V%0SsouBl_q8D;7P{oJM3(8wlO(k?n*Cw6SXWd>}<=# zS_j~4rHma=!6+30=JAsNUGZnP-UV$@3aL{Fr1im`WobB@nHXu(CU?2vhk*IUF-2Q* zt2Vz5g_=rj9tExJ-eg5c@}~xSXERErQskPX>TGdl#o$S|VhB>jGU)=3Y9S&6r-APz$;D<^Yor0TH|JN~XQ++}hy}8wI z?4Qo7q64`4zRAms-)qTMWaZ=Yj3st;1)hJ?B5#&0U@Dk<<2|K1Iy=y|`R~P}c+8HNYVM`SgDI_K!q&V>Q=xbv~hhYt4UBJZ#fW6!7ZXdtm^SM;%VAP}sl zc{-?4rO4t3NnSoLT6K_4{kbWmTGQ3lzq=zl8Lf-IZn~l5B7uKv&3;>#5%{zyBU$<=x`7#O*60zH=V z?&t@HW4klrr9N~(GfxW-#QG4#{0tPLd|3!D3!W!^@+Q)%8}`VPSz;^oWTo4X~ z?qxXadD$|Mn(Z+=1!fqS_+0Vs1lQ9cbSv^XCF14PhtUPw4Fm~AFNruDnULB}A0u4}z6 zM}UBWHgGrML5_uT5Y8u}5sHUimCy;;i=V6~;ZP9q_sm+HkPOciG0#p#KXX3Hkcjy3tPYHn7EQEsB}2Q{zR-?|{TKUKqlD!v8~soltzl zLBeEiw1{!IKP!U?-zK-@8aM>#?t2UqTXZt<_~o0U-j;67Qg!)d_2pTonVu&rJj+2? zq%gq9@dSa@7>X4LB;-S2$*i9qc4ZrEB?KQG92P4VR3k+^9@}srFGQ%$>@@rII~(S# zs?ADo`}6h?H~w_{D>H0lBo$DjOJk?blc-QbNOZ~bnci_p@p3qIfO6@57l19fgK<6)|9;vJcDAUPd^XlU6gr!G z-#eOgszTNl)xW{vY?2m`ry|P@D48FV8+uah$`jK0A`F57K6SIoY=_XcM z)!0t@uN5hS_NM!V8r9hD-~L+UbYKr!gJ*e%u|7KaDya-qfkUP>?RVE``_n|B4b*S_ zMT(R(czm6Wo)z;JvT@9;Ij(GCo5y#-hGlaWZ1(1KI39(HSz4{W1nJS~Kiv3wA=u_| zoEo)8*u9_Z(rJAEOwSvMCLJMa zY=WYH?YdU8sZ6@=rCm%}I$99*F*@#rPsPx<*ok8C#*84l9Et)hzi6#*~gW zf?ns0|MRL?gnC4N%DQ}sKSL0U#)N)@jy4=!6*wM`3U{4yTivfxGVu`mzo^uS)U2qm z&Fug+Uh^zXT5gZZ+WAwu$pbsLW~ zmt{7SoIL24dq#~3duxh!%x#Ws&aODWS7C#aETRw}$6qLt^Z~j@fr~qhQoXWTx}v>O z2(BlZQ{28$P$Gtwy4$c@ZI~OCyN^@X1CG`Vu~?23i$g8mpUM_pnfu}S+I-FX~ z^&IYsTypD~CtKH=>O1;CB_$25&$j0{?CT6uj#(Q@ZkN_ndC7F*?a1rAnDNJ2B8H!A z+pqh+Gh@@Z!_8_ux6)pBW3Pu-bUY7>bA92m7sWJYc_Jek<|y>b9S^1#b8dla7rZQ$ zXnRTxA$h9XS51~zUnU=Gu}64cf(EHA;5cJ~qc| z2yX(R5KrG-FWgwGt^KZT7QV3^l}BdS!@AG+94UAD^F`Xuj)zMId6;Owb+RIapTUphs*89fT`KoFEV%9_6IHccX_nE&@>Kc zx4F6s2Mm%D0sDldz>qyse@bqNX0+MPVVq2s@Jv$TZbXg!Ha+xuiaKqA0TF`~N#R)@ ziYg2-c8em+g%u@eKkIio{@ho8->*BfaXMbbmR20!rw{lgP#@&^4LV*`Zm$k|n}YB_ zFujADqCT^!q-#C}!RKpSz96IG+IeU|!9X{9DhQQh!XIUTz84tKUD|WSiL!&cL<#GR zSNPsxp47S9C}Esj-NBLMg!`i){o%(i&^L;q?UDMU}*#S%%SWEE%!MZJ@R7Dpq!p5HUR0;pOjY)K;lQVCql8uWNub_;= zx&V89HGi{pauP&r8GS1 zW;L}}R|cK~HGusSlOGJ}LqM*swNpscCdA0R6KIwePm3~(N7w*dDdm-bvGr(QR?TNp z7U3Iy;3Jq=irz>GjKOz)QG2 z*vO@^eC|ldw6-+XLc<={xj)j>-_TTy_C{n=oRfi)QA$@$XFxEf86pW?IeCyFfk-JR z`@A9s!*?^54VhlDQ%(O&_$cv>p7bvb!k#iwNY3X+<||?^c}7^CI3h0mobC5DY8-ye z*AC;VZOo!jwy<0!?j2EhKijdZY zS}l_!AU?wD&$f*|q+!k>6-=a=A4f*b4tvsk-E^R87rk2pyIa)gU+I#f7!f&l1*G5j zMVx;okSnB~>F$caNDsVtvW=uBN+2d>NDG*JmOvjetkA|IV~=w_qO~oW>g#cxF)cyw z^E`JVQ!El-Xu*WQm8#sC(ob1?cja7uhjO~til*%ud%oziWf&-UONZF$Ce;?q&xz;gZdp z^tQ2jONF+!DEL?qn{t-*nauK_;mk4t#p}i0zNN3D1K)qLunSx*rh3J|@Om~l)oQhQ zUn_wlZObr{ruF`Os@O`t-bYmqiTK$#MiV-GIUoq{1c60@k~nD3?bFhxakXDz^!Ykk z@Nz7NdV{hX>;1CXWR2$dC$Yrv+RPcj>m^6`l$jF{98hel=bg0iU0GTSuKZFjeT@{0 zrVblge_e$I)YU%-=-c*e3g|et1wFPiq-aSLNZkM40#Ez-S~g|aO%WgO4VLayy1sm| z#L75t7xENHGei#R$)JTh9pDPYYu>mJh;oz#}w>2mD0*AfsA(5UO@*e6; zHFKr2oJ{@o*fn^am36ZJ9S~ulLSfC*(gwAk590f*Nygt< zlosW%sq}01x4K$TN1!bBp6R4e>RKIgMFY(1NTI2*HAa@#X*$M#)-xv_MyJc44wZk%nw=eI!wxw$T=j8O#O2OGql}#Xz&T%wcJf<0ZOT`7=sWz0CDC^} zxSa;h3k&9Gzf>q?r!sF@QhjddCKJ7Y{1KJ1l*ojH+Vy&<$oXO|Kw!KkKo ziy>!vcP?^K%56fMB(u%_hssDYP(IQf~g=wQ4C3FLBe2I z$B=*MX>#NyTQztIJW86fPR*g6O(=W*Nuh+V!Jw|iJuEevbrMW-AfC>-p-`BV4CE;s z>C>ErZu4}+(9fRc8n^g_Q?A`3%a?w=@iZgCK{6JS3xb3%dGwDjZ20sZxi8jcVtrAT(NEn4b(r4 z+fr8jq}gsDgUYIwCf-AzG^xSk{F5)}lwsId1Fx!s)}wJNFbnnSQm@J2b32+A+dEOb zAHyXHhR2pC)|Ufvv@foCWe8!OpC8pD##+JvgBY;Uq2G;d0Wi(|&DCycjH+R$Kj(8a zOx26ZcfN#-QwVPLdlE$((-`pRIReKBw3NI>03Nv#Nu!ps9RnH61k>Oa)f#kOVJ>xt z*@I*0s$Jk_a}s#&TKPZrp`|=4W-lH+|ElK*;Pq!)*k)6e>Mux(--vyNx~w5?9M^o$a<8aNDWX`5fwU*FES>&9Bk!NbE#jQ%W&XUW!$+$qNM$BTfiR+bW3(C z2_I5e`$Ew)7oe5uB-Y5KpKwvX3d8Uw4!`%FEg^>3Ln5&9Firv^ZbYf&_=NKp>8CRC zO~k7}h|%7AzQ~n*&TRTuO z1O=qRb=g$4?zfJ;&MqTUWy1^e65OJ_Ni|pqSn4A|JL{0j)`8;pJtYz%WvEjIJ(H?H zwW#fmHI1rZJ$G=YxpH7+)xJ#p-&8Xv4H6o5p;y{hw`Zdzxc#~ZHZ-j;_OapG1>9Ix z_tn;*WU05)S>)PVaV1I~#-2@yp%F==Doa*|w0y2X)lA#wce+j~Zi|3rf=1AT<+G5@ zjK&gY*PgJ467kPfwu$4 z-5VlzX{KQ`=rrC+xFUtq3yw*sf`xNxr3e94T)wmugIUGg4TGLCt~qSm z8XQJPN!KKPgFGHnM;#_)2GpA|)vLY>+WG_I08a(p4o3?7&-+V{%Mt2_A6AU|l5plY z{FD%@C#DOOFoGt>UK|w%Q0FY|)W?gjv-9I%+>xl{ib>#ls*{DN&=Zt2d{M#bi5ll3 zl6k9)WX%jhs4J;xsvui%d|nOam;_==0_Nh(#)l&~75Mk~{-GKhwWIvaDCQ`j(*!1@ ze+Ki)3DbwUd74H(DKI*rh+_`MjXyvxzXx0@YtD>16Aa;XfeeCqic@J64eFNavByQ)Cr1;#6!LtjH5)rkd2R<-J>=k_ZktxC45S=Xgq4yEVtZ< zI@~zZSs!cIj{M2atvci?H(X#>(az%d^D?#6IJI;LK*FoS^@~4Di#N16#;IVAzceRx z&QDh?smWWqVMM<&w{p~2R5Ax{$g%DkAKz!&&h$EmaWd;#S?$P|CsA`Puc73;9bH>! z5=0@+$0aS$=t=U*^ZjT9%;x~O?t823{CqROI6@?-FI$k^@tKGMz6@ueCiX5r~t-{s$DEVt`<7f&Sgy4kvHw^tp8 zgdV+i-_4!7Qr*3xKsIn_b|xCk5(~jD$Csb5H1MnT0PIXai-n9-440Q={^ZDt`O*cK7Z@pl*Nx}ZaKBeD=t_3CbwN8N zyRt(=Sp0hwW_j6@hTSzE6cVXLdbNHhq176FCkzZr8BG0%y;a%$yxyZ_aO870nDs8B z!a*g7KK%3hT2z~{LJ?BQo?1x^yIS{fU>bE+8(HE}7xd9r#5lM-)w6gkYf z!)1Vc0iJoG0FN~I>v9$&Gu^83dQl2zDpE71yC#m=G6~3Awiv`Xr%+?`tb^a z8p=4LKe_y@^uV$rg9d^wr6`)o6+E%TI;6u=I_%3Ha(_3mdM778m4@#+-oEOFBbu84 zO_z$Ghl;pL2{sV!yTu99h8BEn+J)-7{w2T6Yu7wbqSV6DviRIO`wRK5ihN#93AONj zYB3GN2^W6DnH}wNX2jh8?8zAur;7LR%wttTEr(ZSijIgM+cfGZsQd*9Hz!-G>|UMF z2vkQ+dr*Hk;ctz%1bPA(&Tb0}^WAs!Xi;WJ!E%wCT(>(sj=}wy;1jOR8s9cLJ(wE2 zn&f*(7Mt=dYIkwDdv8{*;5rw>Uwq(-#?8=h$$0UWkdxxhtx&ziMtxj|({L^Abtp_*~I<2~^5aZ%PN3pmSfZ#=7tD*7+q(w<3*xA(als^0sB^vV|d z6PbWj1-sk909thP_;#qYj>z27kfj5r`!uHf;p%pt>Y(2zDT&0|CUF3H0T2G;@EA@h zBJU-?8{2G*#O74C$7g-LROqzNSB87?5n8Mp=Ywm3t!Ma6X{CaXjDsP81dD3$)DbS% z8*m0(=i7d2r{3Lt;@NBAHT$w&n%)r`ReJ1@RA>QM-RV-A@qknPsy<>Sym*Z{y;b_Lac1K4<5kPxS%)xg2>!XlfDQZa|r%YU~9`{ zov#uAJ$};%8^a)(1L~gb-idaH+)R)mvnLbugG_@+e={4~qDRoZw4B3vsq}^s!e6_d z4wi>wi)aD|eW%C~oEM&SY>QUmTkTFj{U)rr{M!k5pvUViS zjQIUb;BmUx5eSAJ$Kd5N%5<~8K5e}kX{7ZdJx^(=O3 z`z%E?e940p`3XI#M}Y-s*Ng01zndhlF^~lKCfS9sjWK)<{QUCJf=O0Xqz=Q^i!;#< zp+=b@iP%HKBY5YR!|6Ats^w)|5am{XJaczIClJ)dLQwem86`tsW}l+8w{miA;hOLW zSA=MIy-0q~Z?`g$oDBBJ(B(mVtyYX)qfsb;3AzhMPl-av4yU0mP~TsAhO4;GcNFY{ z2@gpP8O|Qo_(A`nsW3xYW=M(QlKrA+VQPvCQmRu^KNmxrgt#w51?i|B0|qOGOLTY0 zs6}2Uq1ZHU;ha&$y`GpvrObQgP%)aJk)`NStW52~d7(<`}F9KETUQQAI4PklT|jIqT-;8ByPEqK7E z>M}16yfBC*Gg1sO^xtkyuBQbtKEKnd?^>e=0rv#wABF_O>_f&70 zg^18d^4J=@dE)BtKp=aF34)yO{R#0q84O4x5Q{03dfae!ob)eF`<|Vn9sbsWo@pX= zi&|y|mUTqw8jA`w=wazNOWH4pWYj83QF3tv%x5OT+hpK^2dt0%>eJ?f&%)jLy!RwOuSFH~Vc^ zE~UzGKTeeRS{$yu5XEMCTsn0t_PBo!cj*4y9KU+Me@XRySWubRkKwpSvFExIgrJ|)f05kE@v|(}`*Lo*#>TFO%$gWf)md4= zP|>|S4tI{t%5k)6bU6ECVedA)S@%PA#-`#@nECPTx9oS2?BZNgu2KpM?3^%#IHf1F zUA%*x{sAi^S=n*!O^?#^+$4yD^%9Lr9>-uKvE|?ya}J_h5_Z!0`Gn=82%!NNtafRA z)nK!#TABO3naC&W%m*b^7VDQ6!Z9S2wf8R)h6B))sJZtr(=`4O@sb=ayp*J0#%v}D zIKSGKj+lgo`M22J6gagb=zA5Usn65S=b(&kbUFpmM>l&O$EGyw7Zg4UfwJnt4%6Uh z2(UOZ8A&lD87LJJ(l-i-Z$uCiwD}40+{#w)!I`1Ne$x~xV|@bKND4oX2uJY_#6exRq1rUciO$*1s@Wb z={`>^jZLmE^Y(Dp3HF4PELfu_I^6AYH1xSX%Zn?XDwu7!cuY2tau5@ska$R^09l5v zy1L?!k+DNzkM$uvE45a0{Y_P4qpf%rw+j(6rf5^3LZ?T97fG|F57&?g@;+^k2@={J z*cf6C!QPhkLr?~ZpJZc=Ek*R0)jX~a;ie}HMHHdYH4sXJPvF;Z`>Bx?*h5hG)+M1b z_BP~c|0A&w2M!O;ftECwj~%x}TnSE^g?_O|sNBB=#JKZUtoCcVx7)?pU@{fjwJS9) zM=$@w%3V(B)WlZTEs!q*WGxN@23M7*k5#1I-(5%}+{Ss^Cd@|Hir~=!eN@m3+i!fG z;vU6hm*VJfTwO*mbx*K38X8E`sb0|UBWtVd%g&zT`0|^12Sp#*2)7e)yXcj6fZ;#*@Y~WX#j9Cdr2zu_h#uFDnQO(U~$3yEVV_GP4^O;$=P-kNnq- z7XsbE8e)llGExsNR-mEAa^C`KKBvh14x6_<9=MumbJVU*?y9K07aB7g>nzqMT76$AZ!@lMdK zH*!vUn0#>4eR-^sI>z(Z0~Eyaj;^x?3kty8c-XC*j@mP&+hFLjKNUzF`!+bdwV}SD zI6hQOCR?G=zTYRC+GKdJB5rhfe;y6qvC(!kx?U*uSmCj<`wL{s9+;}}*>Pr#F)j9h zEdSOV!-*|rsi=A-#Wzw^$9lXbsGplFwx)al(}bMZRWPc(WIEZY98IhHaLg{2(i>)< z-!20$#!R!+FZbs%$3NwE5FM$^)L>W62IzHrfF19>-_|*rgm_r$HtG9j%!a}M{H@D2 zVV0})T0cLvqSu;u>C<+DKaM70uC_Yvap{JPv<2Ji>wI6bmH`aI)(ay+U>JZ{R`Cm~ z-yI-N^C$lAseb@II`4y!OXhmv1?II@6>7ay$#dUXiR% zU^t!KkJ+lqwr>VfEKr=$rGO{68l&B^|A|;#b14iB`t6mj`^q|t?ElFo4wAQ;7qo6C z`1YF?ek$GBb+xpQqgeta_{L8i(a^aNWPW*cOaV6+>WNRPj!OlR9X16zTUYj6^zYNQR#sx@{S9ep-=BV7-JxmcNg7l+TgnL2gQE2+&jI)*ky zbPH@>Mz$AA4={Wm{+Wc{$-k#LL6%@V02x|vS`lIG+s{uzRkaj%N^tM6EcU53A*O8N z3@vS3Ay+J$yiOeK+r&`?zr8X}aSgNKr?MM23t+4@Nsuas2#9?7YP9;_pg4-}_Scs&2c<=|$wp>t!db1Ry(wU2ui# z%i{b$@(i%p$*q$38*rJc^tVMgF>R$CkzHUT^&$e>tKF~P&-#`NyqH5~Wt(V`XC9B7 z9d`TIS2o8N7DT9jyWwYb*c18RIt4cv-7ijSfAN3Bz7*m_% z^_3dICD+25*Wa)Lk>_k7zR))XyvFc)Bi0V$*do7q0BBmSsU-X(*^?u-Jxj}4K~Rap zKkc)>!jvacvWi+iC7<)nAaIsgW{hzBBKSwi)}J0_pW?KeAm|7#&%s>rpgCp$w&Qwa zfAg*;V&=8N|2m63c6zzJc82e(e_VzFf_!r(&_8^8JHyzW&NDC|)FRT@r1&lmCN|)X zbJLu_T`vn=AwsSBEb)dnbqy%4xttK|J!3P6N1yi0z8ol~BpT?Bo)F*qK3Lgfw+#Xl$A7);9GCwjl^o4LjG+R*kit$@4lm2<2GObOi z0a*GOM|<#~V8>00Zz4)U@)63{`&V5<21Y@wg`(iV0mza<0T}5(nKt3sW;zBqULKyk ztg>^WA{X5NrfsG{!stPyI_I(H@0vFQQ&EBa2ElGQ382_R^hqkc|kX`6`6XGAKu7y#IohiVjyO(&}hN!>hz>>m##If)q{Cw}q zLxOE=A+R@uB?*zFC;COW`gn&V#BLL1*{UFN&M^g2#2)Zq8FMrkem9tC&lpvgqg}%M zAN7&L6vxcavyWNZWp9wMQ7X&l9Z29%_2xKnA2Qf7TKPVdOwAB0%%77Q$|lS}g(xS= z@*Q!WdJYe4%E)hYS46s8QWIlVcT`&A`?oSb&AKFT$JA%9r_x2wU_~Rr@BSThzpER> zpRM^2)&@wA=2E;SB|-6^35{%6O`rplWzBOP(t6%gN+``0_a?Kp#fsuZdo$?225{p` zhlK+t7$F`DM@yCyQ^>YRF(v+vj0%%Th)MZ%4^C}OjXVj#$v;u_D~bM-m&sjO-87varoD-*jgrL39yahMC0 zMWk}4%Vc|^;>_F0t0BC^MPu-fGK%WNJvdt$7^RkKY%e@-tv?cEjRsv|LatLmIY?*f zf)4u7bEC9~38#bqaVfCOJ2G-ME{djaHfb|518G4%Y`g#4YFX!bh;MVd?_ylV351eB zddWZ$ATQmMolgML+1@szZNBw@4p+p+`y2P(K#+pm@5~!_5y3H39MVu=8OGp@E-m&lMHqaGG;ekdN86C!IN$&+LuLmg<<`;N{sJOj)>H~0v`X`tw7 zHrRbT6aqNB#Sp6do!qV|cn5?AFk}*#4!HZ{bp|Oj^gKp&bL?HWOqD@SN|C{ij#LCR z7MXP|KX~`BX%|_CFKP zJcO_^lNPwD;Bz4!`6vH~IocGquIy=5OABJ}&p@mm2KvBFAS~{5%b0~N(lA^5GReu5 z@|timO?x=7lrLsr>e#G+F3^EhiJ@c}H_SJcc9eZh7KBB*Y$e41(^6oF*s?H{_Y@0e zYZ*HsU@L~OsDc9txu1KBr)-O4PseGn=Ep3TB;8=Hl{snx9pgZog-&V)t#oLlK$?6L zCh5)85az|OKvZXp?k7$l@1Y@uqR<$Rj4DQoZTqL7HaxpEmu6PGr7}A4cadD@R~uy}7ASF9#Yu`qPbL$>a}bnMnillICQl zq!BlCJwanmxfAkxq(-^#mpz28nWBu26)t@S0OoJWHxRJSMKL9&EG(e!3@{!MHufV}=RP8{zl@1Gcxr)=Dv_HO|DbEC(v?&s zx-^;PNS}60xu-9$B*jgbCh6OYV^JM35Hs`+!yq(lylXW6(TK8B4K36g%a~{%gPH7C zE-glqOezR_Uis%YyYSt}Wrv)xw)A@5T*^hoF-cmeoev|)kv0l6QQ91Ay@4!BLXk_k zsp>`y{i8K{`R-1C{jL;^w$`p>EA~Pa{}QofsNXJWW?*gV(e5n#{kb35TKoi|L~#%~ zoI6Vdwcoqi;$ey-!)NkG5D2Kn;8{~6s}U-lKwksg(c;gg=@3}qzi}kMHX*K31_zKtLrLx)ExER@SLI&L~<7U6;W z6wD7CdCGJEdX5hpHY7VLOiYw>0<(ey?A8pefGOw+pv`bMzm(gL=o!t( zL`Vremz_weO&#`}$ERGx;H9&M);7wE2Z8TQGcab{LboM|PIIsiX-+B}87W1*mr(=> zO}Bd*g9OJmWHuE|^tXaMe;kBLQ6i?u9~Dh9m1JN?6ri)mP-pO|L^WKM!N|fdi^75{ zni;?4=Xj9^udWozpSbkj4q)o1Fx|Y}PcW?)DPfx@N>JYUfS)3@PM0pm!ml>YH)QWsKYBRW&n$qZtg?Qh&a5cc z!n$twT?TASuG*vGVZ5MTm8dDq?5O@BK)7g+A&poyLYC8MF_1Yfdtr8`{KJ}o5~N7b zhTaNyNQH?Ed#^tY0#y|bZ^{5GOG^YT5LgXR4zEvgSPEr7xbzQh1LN>Y{DOPXGQz_g4SoA$dpQiPg z{SmhFm7HW9?PfC&1bd%IBw|s)H!42uSvE6~dv2E(;8t`Vt1i6_=c5^2s6r4OkqRwv zyz}NS`&hgM=PUL~aLskPF}6+hBdUKCCr!d%NRqDgn1I1Z;t2?zhJ}~&fMW$qw`0IE zN{J_Io5xWmKLLj7FA$mpdsGV}gad=!%=33l_g{LR=;^-m(~Z|ZMDSOK6t=ua2DC4f zB>WN_tRqriKB;Xj*&E$5H%wv|B%-sLnkA#Qx9;`TuuFRaJAE8Sk1_?l2paPWgOfj3 zA+2}W3Ib5&X=j7wBrf-GD0p-&Xkb7(?T$cluS;|jF_Ls{vX(V5rrI*Uumduu&EjQU zCQPZ}6%_*x?~6{Ka^GfPTC&>Rh~bO@vrCr2@kd!blVU_M&tzsBqo28umdCGV`O;Li zxv#1%IujsWl*Hp(Isza-l{J>Zwp;MR61P<4tra_hxnsKR>Gd#_*&~E`CD?bXpVwQ3#j)|RX>XpN>%hy;yY7eaP-Gx3 zK!F2g9A)g}ccm#_R3*}07yWYV(7(pXo~D^XVfO78qoyE%1lplt--cecTmjd#Or<(3 zKg34uh+2*ZX+ha#BxfOUMbl^y&T=>b@~K47idLZB&n%?X$<(QBN9TD3d7MW0)}O2wVjipe%U_ za`t;|8U_B=!&dL2k>Pi8M*s1MUgz@)eyywtPa5^A;3{~^lY$87X**<^gedI7B8!Gn zGagt*DDhLg>}j>iH0XuF7M&lm7dCEhSX{ejt~2KQ+9WbDt~x{7tfZnlB-j$A7K&07 z?c$4BbQ7xddrr(qD(Dru2eMpepdS~a;_d4e@ff^g=hhk%a(kIe%dqrM9@G=F*r-R2 zu3h3^A}*MI^2G+tB6v1V+`rKz2NgXKkI(9eDNuCmqZ$SQ&^7@T4iLC0x+@mJ z_cAHDJ*B0L>Ex%im~Vr(l?&|t*r>q%OrYX(IWN16PD7;jFPXu@XxGH+gqGPt*rXOj z)r%S;BcxXaa49547Few?Tct%OHxi>AAX*~ zU}71{&V9IW+9|_1ANt3BFUMA}ir8cb$6q(gvF}G_X2$uewMhR9cR+~0(^~`V^=@u- z|H;4F`r}t>48wH8pMS3MKmLPbjD_-Th&~3Vh0vGxGcUi{_#ghS)wS)AA#!0R_m94| z{M)}YFYiQ}*xPo$S8MkF$^Ws1&z>s%qu)LBrH>#f z_m)Ho;6N=Jh~B$~q#NIPv%z3CQ_B9{mlyu4-&&fh$Tr+bb9~lJ3IgM zPd0X%ihS%y;lKO6!@u&08Jn9-soe}Z?B;WqI{*8>-9$NX&Pe|GSGAH+o_ap@YM?=xfdJkH5DAeY1_5FS}IDeeBU9*|s}wU6`!#3BY0@cVRWS zyw-(ttfgQ5*vvov`k~{?rD3&@K$Ux|7XHic)c%h@+h}(}+QxD<_sk=DJgB$K9U8;> zZ?%-enmm6iT-yoh5sxqB|Ff?y{N69kA6YDlm5A#|Qhsi2bpOS-YyaXex38|^k3)^w zCyv0K48b8_Nc$N~QjF`1tHF&8x#H)m`LBI(_8UfbyxK_s+?NA1p683H`b9p_yysojNTFm|JkI(%6Z!SG^x@>Ck z+DICqGp4mV;lKZJop$ll3myE(3zgi{M|qyiHoIe-D?AsKi@BTIz4vcpLd!S#(lb@s z#V5~}&EkW3SB<(0uBZSnzuEk!f3o??JIx^5pDpFi9?fHvce-*R4l!>1N4bz&-wEHj z6>PUud5_HJpD{_>dcLqjO_c{U9s%>Sl_Dj1xuGXP8ZjSKoS9p~yy$kC7z&sIjMr)t zcEC^>BdJ+$HMX!dK`77670VS2fL)A04l!QnVsW9qz1C?rcw#72tJV2K^b5HCW5@{E z=}VO=HdCX%j(J0iD$fI6<$0Q(WI&f(<#OdxslKz-Y1JUW$e&#}M4w37vET))-b{aI zdp!)WZu{kOxiY^5vAUPhgEA^rT8&z>v8@l3XLHs0MT`~9(L@_bBJ55+CREPOHftN5 zZj&eDVx>AWe~3QHB=yov$klUKs?~hE+1%MQgECW|nKwztHBr*#csN7mi2zMTl>8`@r2I)=XoOL~-=+Q{?6 zY%HUp|JVYtKu&nL*NWrP3`|8e3~1?~?1jZ^xC}enIaoEeaUb%6_xl z58c68lL$=l@Z{kAEn?`O-z39`Sd0Xu7xdyBQ>YdrU0Cw8Dt8k{GT*n-yq;T+tMAp8 za=2A;v$G6va!bn65$Dl=hN^tAH(SloiL=O&NG@ipnJP{-Mk4NAG^dvk+1U=wAj24J zzAIc)`MKHL>`Y$9s9bP%n9fK~-!xmv^C()%_i&R`irH!t|Qu zY$*2(hKx-t;=#gqI5*2gV$8W1H#O?9F#~w1lmQ!6QiroGSyh|9)<6CamHYk;#&U6YTQYnH)K)b&}o>lZ1{w+wS4fK`rJP1)QNS zi`vze@!BQCu!W5k_GV`TJT%bbK@)gMj?9@^hQMJpLXST(mz_}=nQzI|$nE@WK9B}u zNy$Pwl$QyT$P^OG! zil)>^W`JX4@I22$H@zCdmP;VyXJ_*~V~aSdFo+>ZgCIo7lsjstim8lBvYti1tHPM1 zSd`?h2NiT?ivezKh39W{ai2%EC1F1+o9wY8d|yv~W$HH-a;B2OGMk&lMv6I))S?Gu z26n2h&EU&+r5fDY>|I?8)@rQSOmL$MES^)#1*!s7gZc$aGuDo%1Chm_G!0f3Fw(bs zGi5DJhI7CGzp~!Fz8-Ej-6fO4&t~Q;IlviC^EugE=zOM}M^UIu*@X@DHfyV$dbc)JeTLDcy;IAYE|AQ)glQVIiz-!JCY>|^fWym=F0U|kl?p(@PM|tbYxS?L zcdl;)qviw%Cl2KoXM{xeo7Gpi`!}|No160bN3a5y=NX&w=tBS0a=BNOy#_NJ-A=1n z-)z@++>}gQR-~cJ31^q!TQbp7)FXt=+GeL!AGOIKrYX$MFUosta*#f3H=2zdJYl;MEzh< zRTL=0N3X5gX1j%?##~J4ziOF_#|&JWfhWqSv9pddbePcZkaVtGouTV+PO-C^I~$nA zRD}_GI>uao;V`zKIN^U5*JB5@bUF=_Whezo!%pVQNn9AcltBU2Ya5#9imKNj3AG}Z z3nTBgDhwlJx3yJkcN&`f8#$;jxkE?9hBYhV+l^Yij?FzrE$|RhVG2c4qtrq@Y1g(o z&4$<;K44cX>X(i>vCdgskIkK}6&{^NIR~LTGhZrKRb58VhOr;)UBbCtC~G-pMpWyW z#$~*l1ycE66yZ0faW2PbemB6~-yfVc>FhEZIp=h}-aisPEJ@TUrvua1)NQ{dxnrec z)7L5Kla4+Ww%<#GR8F!R851+i9 z$9ifly>uSMyqB+c@c?FVcod3q5flq-7tG9`FX*$pJ(=|^bRrlLm6Gr^qo*_OG-h+5 zG@a0Gh#3tB>Vb3O7W0>!v1UpPvl7P28ge|8PA_m^BvFN#kOD?=rc`opJZds71?$Qr z2l_cl%H$K^ELr3UQ!{`XKS}A5Mw+*MP4Zg!Mvq@Cih1PKY`a?u&>Ob#A2Sa&ycC(K z#7B$$k;TT+n;;RfOR97xsd&f!DH=Tqv9VC5>CkMTw4|ZB8h>u3PZGr#85oa z==;d1QS~I~Vht2NtB9j4cX7bJ`hBKyp0nH`BLsp_ni)H(sNtp^pc;owR^SFO|{#3)BO_+6;? zrWrtNxnB$&{lcfJ1}7ebu;ZmA>Xkj^n4H4r(72*uiLpjAzZ7LYhjRqe*<7cjRb}4A zIpAsttbqid<(T9JH`H5h#JT+m+&WxSY^)Z>H??lnpF$7K7!!jN4Fhpd8htnlmyund zU;&ic1+Hsj9dOnTbEd`QRn<`-i$7IcR0Md5$ZKfWBpEFdGO5MXjJ!OEaHs-k-qrpL zUYC?9u(>mf(gWc4m}?CYPydLt3$vFax-F=1BwIB)_VFX1XQKuEQXi&#}g? zRIsH5IszXqP$g8StC#4EbMD2Gv!3I5M}iC;e1{0d!+~;+BGIB+AeQ$oVp6KKyvj+3 zvMjhaHCpu^!sbS1lbG>3VA|2@0=hFg@ZATcVBL;$V&b9{HB`*{5jCn4U?@RzCZTFR z2`LBWi@inf!ly-}_B?ATq*4A*ySkVF`Y{JmSs8(eIj=nED(P#qWM`BaQ@e?&5;b0s zTZ=bzGkg$&TvkA!ie9R>3X@@M+)b|T4rbI$29sCAi1%|h!rnMAs|eB?Oz6=drm=9{ z5F#NW?uRg)CZRMsQF06d?e>A44$hi1IgyrMDFH!U8@d^i#{-CsWaMXvhLn*Kq%8k4 zi~~B6gV{p#2O2xg^WpZGIzMMp{g+*dSd~7Lqs_=*E3gd4Od47{jZ0<>l=@Tk75ny( z!LQo823mPayls-uvap7voSYSPx&Y`k8Z+B8RFKSwBYH6-X02_jGtyvYqaK9n{N=sz zJ}vGzR0w+G7rzI&JDHeKb2A!Y`M~Uqh-Ez?5vhR?K{T*xAeMB>Tf8P z?V5_kU=qESCqlwt4&QV$i0wKwCCbE>3kW#bcp6fptgQ$oYjQ+4DhV!8zVs(ysYP%_ zC}|1eP(fOsCZk+o5*B;TR*_n-C8bAd5w3Ag7)Ci&1!7=LnW``_uR37DJ2>g{3MXSg@Tk$v{bnQt82#ka^tGFegU!poJ<(Bf;UH>a52mWPwtTKWY;|$Ue3% zAi>pzaUCAxsg>1j1&}DS^MHIk|o~?A&q0Y`O(kDw0Wo^k6U^dhpNk08f#Zk?KXa1KxC!g4!8FF+0i^s7WtPd-9#fJSP_ zo=A0zt5IS@cKlc~aWcnO-0)%XiM+;Htkq${ghus2d?+PSM@6=a*y9aJgqFK!mEi13 zVJeAgn4;8P^q01dQb{a#?j4k~E>p=u^lg?OL>`AOT%^u=8 z!H{YuVMXDpF86WRcwp((Z_|Nuj{g&^VZ+XG78+U<#`vwypCpz{T_vH>pCxoUh1lR{ z5ABTCj1xv|G)~W@XJjBUCb*A{2}WGedm2L%Ik(7dE&?dA;ZOr(8(dkWfCkKn(*KZF zHUvC?q!BA`)sP#LOGN6WkxCWPg%_rYfKAL0YfxfH5PnvdXr*A7@=(}#A8{@+%P&n& zLIjj4EFOr#h}XRXiZad!EpzCBP2(%fb0I6iGS>~+=-TMTg&78LYI#anh-H1+P%IP1 zQhE}!Ce<0Z@Rf;F869y48sFQmb&Vnskn-mwwdhXScno(8VVo_1cqCc&XiIqeL;ap27D|360)HR1!KQ0X3(%6;f z=8Q#3vq;e;6+XiCT%+8TP<;5w0X(J7%2X^y*Io+ItLF@_iO4L8fqLjLq1~km(TJRh3G|+y^Wb1y+n?vS zI|Gk(5?ThbP~k*EiY87sM6W>Co2$k1vTMS3A5p9rh!W~bR8|polk46= z+_oMU|1$`47Lp1uK1U}SAD4teWDPwDc)%A2XH7cW*7NF;F3S3Mi8Cxw)On=?)7PZ* zTkmJNPRFLNQ>vK|oT8X~nWQCS1}F_9aA1xJ@AM^#GZTY|LWd23lG83k!~ckwOFtMV zqH)KP$XL-ubog+R5IaDMK!$`ynixEyk2!%`9B?|6hETiqlhSZ+f2KvNTuzys6Nw!n zq8B`D^D4t2gE&c?&u-2wiAk3*!CfS-1r342cO+Fr!jJRdKM}EOQ4tzv5k@wI6z(M? zrcC{oyWI&@+YBm8F7etDVri8T|CuQhs!>27R}`-uKq1_SI;)vB=bmu02#L1C;5;?t zt{)*Axh#bNIP}2RzEHyFCtarqP14Vo|z9Wl8lE@z~ zMy=S5X^d#QAy55jb%AI}C30~uriE+4ibx+)riB^T37<-YU)9-Ga#xPv499{ZKryJp zij7~5%VY^)bXcsYoDp5|Pk;75Ci7e2SS)8UJGZz*&MrT(W5zqKT~be1eIB8+~bB&Gy$ zPq1AJ(0EVjIR&3&=Sf7$k)%yi>e^xu(ypRB5Lj6#aQ7i{i&ZH{d{~&LA0qc^;1vlP zuV%)|cyQ-5&f3784bDTreiIQ8M;3Hu#+XD^7Gn-YIS=q+%tx|}(y9VTD%zc+>Bd5o zmtuzxLZVD5&C%##;=8@u7oLeM9;C#`v8aqJTo+<7b(aQpnuOBijHDa{3gf{Y2WL&1 zoJh;BWYn{OUl{W#c_Iy1m!UYKJSd`3ck7pi6UQ3N#8V1?BF%&da*48|`1GcrP5S7> zs~FK5DS05{`X|YvgB8adJpbxf&(-RO_1q(3>%h2;>9sf?Dh-qj88)?~08yAb046}t zvN0f4u)(DuESZuT>#`v% zosuXw<3_^iFQS+8!V}2gh)PiT8Bu)p+@uy#Mo@4927ltx@*y4;JR0eZ*s`_uED4As zKT+uY5`U@D2%RUPaK(6Ul;EpCR0`6y-rW%d3nRrG0c64IP9MJw*n+f6J9p?sSqe}; zCcVJYhbK}rbP`{5N^Ez$l%rW{3pHUC!yXukdYmuaTe0ee3wf2DdBY}7Ia>({nQldV zi5YQk}26T?FXA!n^{gsErg7;_SbqC1C_% zKSL+QIFuytJWMm3Na@CnR{-6Mnh0{YJe0enQyE|h5~g0>%rkp={09I2KX;}#k{`xr*t5G0{t+l41|2Gh{Su|Nf`vm{J1 zA`4@QPC+rmIft+yVi?dNRGm2U182jBrPTQ6e~K49ck#i^&`dX(Fm@X@c?j7uk~9W3 zNb4Yk3(D|Qurd6u-&EF?B97)}g!e&CG1cAuI=hq7#Jt*Ximg#L3?b<~BD_?JT{*6DqICQWuy!T8pWB18CY`HEqNaI{M4T+46L3x_ z)5*tOtM1;{!C;~15k~O5I!-!RH6M*Fv2|sgyz-C{;1-H36}@?e_esWz$*v^wtqhDI zi$fGF3NB?R`w;5%WCF}LIo6FRof#um zTEo%y%WU(e`ipXG9}!7p{GemWFK~tUhSlO+O3Jf!BEblwXo(Sd9h_M7_D@@Ius9xY zz4%GKE|(0-m~(+3sRl}hOk`w9I{OGlwwAzAJB}^mB$iZpYo9{$M`j=06K=(F>aa&w zlZjHookS8KO*FHx-F*_PQJjm6?Gk0z>Ip#s9L6w`h#6O70xH$P33iT%o2p zlh|}33^GSU)-Jg8nr3+l!#SsHi4vv#SQ@`c&c>h6pn^4Y;#$;}8EI&PC5Ca`& zH9%#`C=1DE6wil~a18gGV8!n(3KhsTI+!Yvkl8C$Xb%doL59VxH z`mbuK{rT^%q#}f6Cqb5oV_}Y`Hv*4}(z>WdzY81?9@Rt~(|G&Utrw_r9zJ3Q6vKb# z&6PY%$el!k-dW{ZSsC(Ja3~o}MWR}vrSyK7sbeYQ5c`!X05d3)!J)^i1=6HzQW7y^ z>_>@)kR9H^m50&jC%HC?!6~VniCl(1k=}J^>4j>@mW^v@032Nnq3vU)+ml&aFm*>T zR#v;gT^n>@iCRQqDw39V9nOh&S4N}4u_7J|uGFz~W6*YiAK0x}aLy-X;Y?179fU(S z+z$<+9>~?fS(DDTxrlU0fxAnVn_-DGmWja5eo9}HGA7W4|0T3Tlu76i*dTO&R|aX` zBp9Z{rBh*u^_F6<#K}hC7%D=U5A;2JbWUrW=;Vx^;mjEpE&nYEsqGg+MrGFEV`xFB zYzFj30iC9~U(F@S z&7v>1>HSSzVAB8^bMC};7LMhFQD_1(PVt2f8&jPgOel>7hhmOkf-ijofvB%fu0;)Mcs}Fe75q4Dgf@dC4GCJR;=?3Xgc{o2hi#eGag_?p8RQeR>0*`39A_x8iuCgN%NmbX7 zOGK)o%EYK5bSM?69Ha$7QoGnmN>mZ&WW?+35D+I~i!&iC0gW5t2z7D ziWKvPV|c1AU)$iTBP?#2<5$N>!oGWAZp1ZVxu7;w=GOt79a$>Gge zk|JU@>{qIzUpG<{$JSaa#RO&uHw2~d|FC0$3bv?01~IY-EhAkRjh%MW+k8c8rrW5E z_gK#ZXuE=AJ0fna>yci&)i-s+{FD z3Qh>%I*@TR+G6hcv@bl%T|8(7kdK{~p>xHhSTrULPJKyoI88$7lDi5AfeG~kxi~m$ z(&S8fTkp{&tP7lyCs9EZ#?KH9O0+ViLnYk*?j*Yd+=*&@JZV*p)$!oFVvGv{KE>8& zcV6DHi7OQ~IL^Z^SPh3yuhr%A5gH@99bSLt@f6P{g>8sK%=5N0d)D^&bP8J`^TtV+ zeSq!Fa4q~oMq#@ixUvj-+Q7N3eRi{ajRu{-43*4kSj38tswC69Kw*!qswD`Y;l`uI zl1GL_;s}b!ZN!oa&Ih3UHRgiZ})ZN`ou@mX|rv&OA3_r zUt%ogTD@J!cE3oBS?i#ytcIx$agcB1KwLqW;Ex>S-Q^Z1` zR-hCc@)12MRsv>G^5yqXd!>Y#I4U%yunz7(pVRLUTs z{lEfyNr!zX(F|sv6mDwS&AhTgG%sc|KXnOf=+k5|DfKuNveOM!L(em^kC8z|qtF8CsN+TKI;L!Hu^A-EaAztVkv=KIErIbWagUROP7M2j(ExChJ zGGY>-dQg!Q-6!6@K??d1csE$XlFMw1 zru9gTF~@^nai~ItJ_45-RYn##Ak>u>?UJW7sRWk7BxOcPcf*{cF*f)_bE38X(14C^ zsp}&L8QOe+0ZR>15d}*1GR+QwlUn1Y&zLC(`!jH_FuUNDGhZprQDFqDx+uM{y=7d` zsRWSdAy8=|W-Ng!%w%w?t|d_7pV^V*Wf#g?a;35#zSdnj#0d%UzbKtu7(q|8x$>7nhgLZ+Q# z7OZaYVL*+1RMuuUT-oSdzst;K7*t{_(4nIpFUR;ZZ)mr)N?(bAM9UW(Re^z z(lUN0x0*$7$){Ze-p%lx3=B3tm$$JUUcJ?2Skpt?09?$|@^%o3 zJ-BhRONjV(dgUd~p})4$tu>Tx@PzmPK(dSp+;;ta_=|V z;qA5X$_;(55Nsrccd39wYU$lr?QSmBjV3*qSdZ$9mr*FR)y*zu z5Pw*ZsD)CvdQ*~GCuVB*BGMq!yS^H1G{reuqGw|@X06( z0~kOz*Sht#KHmo$%?{g8_pYvV8x4#oD<&fsU!o6dtsY;qRE5!CtK-;0{?ws@eVNJb z{bX`z^Qdg@JSC2pS?m?m7@$UonfDea_D_njKfVUZ#|hg!IH|5-sAf+r8>62Ut}%Bh1+~_l;;?pwfY;ifT}K)0_-{$hW;_q@Es$*d4 z#H4s_e*Jr*V*q`BW0%B)#r<@uXXvLrRuGE7t@S@rF0~^xfbvtR+;0p*<7C%^u*E9 z3#SSsPajYNK|{X19rm_NFM`S*Uno3zL?0`U)Tl66(C1UDd`_mDy;zqpQf!YsGAn#c zC74~1IfS91v3Zb5v0P?rYZaX2SLKPQg0PCxdE~5e46WaI_l=+*v%A5)%o%) zau0}7SLEAmH`;A%Tfk97wla69QeC7kNl`_Yh)^gN**9C+igk8WEX|dV_2$NaD{FSp z9NsH)^QD;u?}5_9T+>y;411eP=caYOA2_#kQik2QgO3-6 zR9S(08D*>U%Z19k8r#T0MJN^ud?H9Z(h7N3pjez;JkB?WcCk%TYGbKX2`JDE%!r;q zzA3~95Y<(U9MG4`v-R$6Q-G-^Tbw&|wCbyNM(C+9XtJN#)VLO^4Wg3*6=s|rOlp{E z*0&@kyjZiJ<10Zkhs5dd0VfnG`xCQyzSBceD3%wOPmX<7k))JSi(S^~1!o? z)dNYj&5(3y&v3YcGz>HJ@`*y2SMx^FyuQV!ZPh_GVWm(FLAK5hW`bV5gE=mn4Prh3 zgJ#6Gwqn+>hvf&8cw8i@tFfgX81@8S=HqD@HeJ?!+^ErXNT-D=;2g(cz0F{Z5=G30 z?Q>=A?v93;K_#qXU!YbeEie=Jn&Oe_;wpDeMy-Ez40NU z*^0iX&aU9vz{u3@V&YRk=h$Ixy91QYvPsiYilWFl_rYsgT4u;CP^5Sna5Z*A|;h6-?%p z22d_X4u%`|iAv}C4h;&QuWIvi_)$WE!=T)FT{(AE)d43LuLH8DCV}f|NY$7E23%k9 z0bK0}DFjX(;6KFy9gjQIaO~z9;BD#~W*9A1C2J+Kn{(K5eR4+UlsKQ>ndf^~Wwmbl z9O|OmV@ZqpeuLeN=0Lc3@l~)BtKew5 zJBO%Ons6jhG==Ky+*2R@{H3>EtJT&A;Yrc~hz0p=Dv)Qh>g-}|Yn5-pKmP2e7Z0B} z_sXC1p`$qG1Sk%;zu$xQO{&!PcR-gk4NsHYCIF*Yqag|LeP398!w#koVQj#JqKfkg zm@?l`QR@`H4BkExGlVm^;+~5}`)+27k6Cs4GJ{H5ki_UiFGCyAz|&zeqt6FfNsa(~ zkD{ePF)TKF3|cf~b%zW?8l^-7GQ@I1Fp98xGMjC*o-zl6aL-<8qW2}6=p;27DA!T3AjoIg@Y zt67Y>V7pP|P zDR7>7w4zsAd_yOj!VPCD8EJ!qGnOCo<6XYb8`hhAAXFAS#$2REM>ewwD9i&SML%c> zoeRTp3@m*jIT&U&X81Jkb}!3w5sehf)r=?OJO=k_fSF~}a;l%GsRj0UaPfxp%rR;w z1!`%7r5A8c^B41+oiR$pDvUIv+9jJ?jj=2BFjV!8ks)~AKoK!?g9h0i4 zV_k>ft2COYOTGFA$qxc z?*I-~gs+igPjD-t0W*492*-TnGvUrSAJ8Y^_kFR4x^`h3Hk@#LSd&qK2}KvIg@S@3kurC1%^i3i z(T{=!oI3ngO&VHBDrO+jL;{4eTIl>3XEYPSSj*Z{j8qmM5-kxSCl{;$D0QJJD|@=s zmqG-iQCd01%(#9eH2+xAC3Gw~tNa3oe@uECVm-{3V`+?20v1Zj!owB^7+d9ohw%Lage6nI*f*4Ir|UtAwH^knKCEFz^wvZp`qwf(1zm>aLZnm0Mgl1Uq_2 zg<=~KI7p@MU{dw9G8b?u4ib0}8^Wh%c^O%RG@JY%K}Te4dXRZlPV(?iK0oYcBqbUD zq!j^Lxv0c-jRpxcXq_etRBM^sI0A+JUb8{E-!QMo&Cu??XBCCs#H>yC`pK@G6+Ot8A(`yt)MkH06W4w zUu>XURo`=>nK2zIB=d%t@3361oziBkC^11?QRF zbJ0s&|IZe~bAgL(9(-2TpC3HjKO4SO_5Y0Y&&B!k5I?V48X+kX&*q*>=WR}XHs~f> zKO-?@RSce;{@+qQK?5(|ntZmRQ3a`G^tv$1{>wgvah-n~!?T>zzE^dtDb)0Sr3L6B zp(W6xX*^ulh4z4kgnoL$VVD8eEHEpY9FN;1IecdVh9~) z?li>`to*UMv^@}ksS*;=;Dj(ij8lR%z1SHoTJa)yU<;h1&2Vf2y|JCr{L_LGm)0^D zHtt;2pK;K{$|$?qc$c`##Eh9*Oom@&;YZtCaS{)=+LWzL12{LTDzJva+6m9;=xVGb z3`)Cr^KlveZR7izM??9Vuz5K~ztfpe6hta_HymB z_P+6+o{YX?3yybP;3<_?KtvtW$Yialm2$P>5coFosM2Vzane<7p;{CV*9Kk+6CCqF zxu;2L%Cy9h`H7q_tC3hz|F-eXos)=-8hwzs+SukO>#4jqkBO-Xcs+dzS;0hyXy#ht zR&_>!;}n%%OJ9l7Jr3uD>pX%oa|pl9eZ_GdGeAJx0vhDW^dXogs3qfx#%-Wy=o_Y9 z?5RZP;)t3eXzSG}t`)YCx_!R-j1I3UcB|>1+xNv;la;{9Mv6?T*HHkmF{YtWGrIr4Ei|^PsTs@<ykE`mg!TkZ2ZvY zcK3Jqie@(zktlcCKdcAZ_}AaL{HI?!I~y{HXzj+%;P?NYSHAZ%cNup$*kJsO9Yksu zn}&&>!>g0CtAGAWZ-4o#_bn>p^}7dyKl1tQJ2x;ZFeYfNV9|~)T0%cuUNN8J>Yse+ zlqoD&tBh&;+;?t$|7UjWXTn%$C8b@%&bS(mnac1lzkd01zj{hX6EM5|^-ta#Fy@c8 zv(z@5Bt*scj;rZp{OTTgPv%hk} zAaBsH+rIrypD}#!Dc3VDaWU~_^2UR!!+=Bly`S9tgWtOgy(;Ni<#0~N?HOtG#^q1{ z>(fX1pu`A)SMT;w3q}lX3E#P{Zy%1B%|I4F?ce$G#vlIN?wx(Vpu&8q(WX6`WRT_S z?+pLxmrmb(WCt9QzILyFZ{Ia>mcfY)@b{0$ZymDJwV#MzyF2)UzjNmkA0r-zIwVEg zG-43NXzh*nFMsYUXTR|lN{7`66JK7vO>dxDT5$SI)*haY-+0KUO01K~$8HY(z3AwYtLE*B08|OPZ+Vl?$>ctqKLT4;VdD>c z_s*w3j-~2QNPv?WV;Ay)^=kYZZ(aVvSI@t7-wsD|?8`U%cgc!*-CEE&v6B|>99_Nj zkeO0e2sd}unT5k>#Aly>002M$Nkl?=>i1)b|#->yQzM_H*CfUT1Pkr`%)%Lydzt1%J;hkkkKgVeAZhE;f`V$IZES2Fo~=Dh zDL{`T&F+m`yoB)Sfnk7FD-``aZSdFEnVWKP$rLc(R5!Qxc6RqEZdxphj;5OOH9UEI z=m&1PbvFhK#z(d;8X0OFArSdYey94u_ZL6hkok zo4ad+9U@(1r0(ev7@m!Xr}av~d-=}(Ek-w918%-yhR4OlneQlTYjD1~vzLm0SyDLf zT@BAqPmVGgl94w3oxNLpJVO7g9Peqpv$MzNXD7ZxPngKEyQQQxeqt#Ev5u}z9zSC3 z4LU4%hub;0xjERbHg$kQ62_&d;FdW!c^nrtBQtO`ElZt%uAUAKf1^T#rOro9yl0+T7h+Q7S6F9*Z+v zo<4d=cR!k8(BzGq_k1B;;hNag*kel+NnB{n|jo;KfRk?wa+|HD{i0jKT9@yJsar5U58W39#K=#lara3 z@OwYI{onqDdt^u3TY2J_grqzEa(2lO&+IN53=70TX@9f{)&}6eF? zwRv!`^&kGwr~ZQ<{j?vDc}bbFbA0vJ|Iy(Wzk1H6 z=k-xQv&VZS-4^Mr%z17ENLei~mY6rU<6Q-4PZSCxQ z{J;L>qhI>^#R-$lnI*HaerLb`#{D6aez=7?q=~|(J&dY5d;P<6DlF{a_3!^3yZ_an zxpQ!UQ4{cv+NxlTfdBaCj=uEu3+!eZc_t?@sp8@B`2J(Rkn`)vsf_3V{@8(>WApKd z86MyJ?OT84Pu*$MSd14(w6@q}SL2`m(&<-Tzj*J+owv6))^6_h&o9PrVqDI1PEcaU zV!L;v_s(N0VP*n+>gA39?2q33{P*nEfQD%Xvl3xU<>X)g`uW=r#@~30x$cvVe(&a< z%iw(DKJO-ToFgZ8&z)V>fZ+!Fo{?Yw! zyv0gO#I}BO*WsIAe+QeZB#gp2@Ey6oetS>+2gk00#Hvi6cxmI${qVsLfBy}^&AJIA zv1-9q`lr8i^6sPY+Yd*KRM^>EV>TP_4DUb2oSp}#iy5`-ukUa5?r%7mjI4TNyH5cj zftcSG=(z(ku5Ruzd8K#A{G`!jyT5*8(~i}*A7#42Oo9>&$#e=s?k1DW)*r*_cnxck`9@5% zdU)yxlm!Rc-TgiV=l=0JYGi6P1|Od99U`fn@Cy!BDVY0P{UZ$F@fyb1&7B@u?wza) zu|Uiq<2(Dko4f0ePS>?2Q#5!>JUkuqD`GsEC4z~6Z}29W{_at4u!${l zcJkOf-6D2@XtQ^29AGN>nyHO79&Bzi(Dv-&v79Ws_4U2|o6fvZ5=+AR=8gXDOT6(f z)0WTZdpwdN$q}ZkqC@F7< z3^W>Sq5PARM|_T1K|dZJ+`b1rlRtQB9|dayoIM@_zD!Ly9c+-MWB^CKz|3HiTyb)C zWFO2TFWgUXue%C852JMsE_GT zWTJ;hf{4k9{A`xy$Z9gweN5smYm!(rLm8e9DJ8V%C6*Ch(s;@c$*ryN*5-hz;#2_6 zHIxNnEPe{v%4tlGXP-I017Bl#cLe;Zho{Yy;E|B))czDJ+OG{~!eN#og54eCAx1?g ztMaM5j2E2qXySD2OShjf(xdaqHy^kTk!%;XO#9E&<2?*VbdceOgaZ6xXz!8ubCMdz z72spR(WLWzSUc%_@~ubXqm#CYE&PD*ZlOJ2D+Q;P65JU`d{LDZneo5Wj__!Vl{B%g zXxkjZx8{tEHy(_!Y^1`~QN|}sIwtj*er}D!to%&AU~&?lw5`=Z7Cd242aVFuL2m;l ztoE_8(F>E4CJ!EuzxjZO;)6VnJ`=mVmA zk_hRC=8inUH1_w;C%<)n9-MeG#PfVO_yo|+d|~)!o&0bPf#3}~BQ5NIWI`ByOzZ0m zoNzHiy3MYz_UKUnc0h^0HhFa|xp~QznEJ2Y(g=nbe~z+PC*h0=|7mCF+>3f8)Mn+$*%RAdQ}!vymVJ=4kO zEjf|5kt_P}MsGf}!%x=*Av7y14g0tE>@DUYPq^SM1q1H=qc#I1kcY_x^NY;VbxD}D zqLw%BU!5?w21(1cLXg}q9rQJUsvu67x2L4MT{LQJ0>~;U4iA)lql!P^4^JjKZws3^ECOh@~>VVrmmXGP^l18G|}lFbZ3tQ&t-XkH&-1V6@}X6*|xv z;mYh`7TC>P>6Wt2kTZ?W*~;)GxfPD{8;48@YP0%m5bCqxo_1v8#Lq99n)(A}MOx~U zZ~s-az+ozWr@8W) zd-mJUUl-$xvnG)fA+=_r1+rf1`$i?5I(S+dq1cvZr<#U_Opqr8hq8Vh|JPg;Ai@?6hqWZnDhjE&?t_C(0~zIkN*HFS z{lV2RA>!hsM8GR{9b&oQNY6ePNJ8A|so~sPD;x(J`Z>%`G8S3MiHdLZRbe;5q!bfk zIxP^}kHZ9%5$@B}g+_WVQibviTxeX!n`=a8=^ym3xDu8Fj$7oSzDziVwAl|!6CbrK zNeXV#f=NQY3oyP8G^Z$G4!OMvp0f`8fm$@{L1(jDoQF)m`URz44Z*@M0~H)vDkB6G zd5&`*Xynlk2a#r|>_lYhxP)mLNnC=WFDUaCg8`4cDM+%XT3Yftb59ClibHNpzJHs? zO4`Jp6q6e1F-^^{fMlvriK6*{GR;1Qle8RDam=YQ%DVv=iJZ%!Z^rfa3ZI;m91?hrjs1@@J~+THm;QcJ)}P^G4RBE&Z<@X98WTv zdwGaI`PC9^c@IA*Qf0y?axa1R)kD*lY!EU$Z@HFMg10Ql56_B8OBiB842@L?Umj-4 zk=c@Z2ia2O6Oz23t3Jl?MGBOWk=$KenJS?JHYR>D6a+k;rN*H`6(3tWp7^e& z*E`QlBe<`E1yqIbVdvsm$OUI_7O^10`o_*+W7nY=a?4O8`dRrJ4kM~hX8b1$QoG1u zxa@$v2;;5JLr)OMFvAJBKo5vG_zFzua3V1ZXzGz!bc4%S(N~5nnYirtzPr<*p$wwh>Wf z5X^4YVsJ4;a+l9cD1#M9S0)zeeH@*bQ>9Nzte|RGfdP=iPf8AlYt%T^SR>;q&==vS z$Z@$)U3r~T@8voIZX-+kVCD=>{Te@S+N#=Qc>(UlS(C+V<)tSx{#3z=fa6ms+la2o z9_{0&om03VvYDryP2VJyz0H?gaAB42HAw^!l~<wYyutx(6KWW^+H?vUpS&I=d zeS7p}Vocin^C1XK*nqh?&XW=8G1ByO@gQKlzy`Fehqx|eMp4}h(oa6=3#2tHmZ7ya zTI@Xn4X5a;QGLJ(VOt*B3$fE8Dd`n$9z8eodBx@~=LP_TxAh>8(otS&0Amzn3 zFFIVBVd!jR2O;NIllZWK*6FJzVZ*d>L<-N13%Cg?KH&h5g4DJar~z8=bkXwSkeNDU z*r;001%`4-?Zvq<5yA9pa)=jmSFD#XC1B7Lu=rg9Zz7G}OdOe%S{<6P>n3n@=y-!F zXi_9Zos$4l`VdUw3EFa&Dy5)}$0swSb=msJZ3sB}YyIZ~ zyTBCZ72j4QG!{ZjNF)I;!RbFxqjToQqto9+$HV(=NtkLEIrvg(v*%Q=aTb}sE+HcX)YnmlNP<}&3Eng*Q^@I+aeJ3T zdv0&0WZji$-AzJ0iFo>~x#BeSo8pwOPv)OS*jcjfx}k%hV`n*dM_stdgPq@uTJ`f* z1T#n-a!&flMkSOTm=G8zeigN$aAumg!f9@rCKk-JB%e3)n=oW%^FxQ0YycOn|i4AoCwRjQB#CVfaK%l_`{H?#v;%7i7YSa_ zeHUF_a8xDN*q_B@v@@roE^NbO2imFYBj^6bS(8awtd$gGN*BFD$v`FXjA)ILQreYo z=2678cU-@8qzN&rvqj>BNNmm3^Pj?aQ`68VK4FX97$75WA5Rjjuv!Y zBA5=MKw~Fqm}=o2oY;UvETdS%;V1*DS~VgST>EfNGu{R~Tb7e12~RXI0x_ZL%U~o9 z(-J70@td9u7lFzY@qaGE0ItoCyd0}bzVu*>@rPo@$sFF$bA-S^-s_RuBJhEsWBNTdv!jKy5WqX`}4?qJH*6CWpu;=zF@QOT56J}u`_L-^^61FyL-rz6jhKcLKYE{Xk`+a%{KFXsbCRPTLdd;Y2iKGiFx5fiGCChLXUa#e zeCYGga4zQ~(F|^&5bGJj74*=VOM+HmxxI!M5Le>jX-nhsR@^#*-I(MOn)q=jv7)}> z*>N7ME+(D9q?>h>PwJ^a{)c!Ky*Utl=8<&jt3ovVFW@J~S~?22!7r^E(%`c$^^hJ0 z;c1em(dsN+a~;%xt%xn7{JmX~KyV<(}+O}P00%>zBTG*s*3#geOZXh>`>l(~Ye zBl@OsM+J-M6J-zCKzA`ay4BoHbb-b=Lh87<{T=MZoc?lx-{vFE_3C zv!0uH!h8~xfS%iHGc7dDZRgwMWe8KNwXrqC(*X6r`i7jqfnzG4E`VN51j+4*iXnF7 ze=?Q7dTij*3a0|n$CwzFmTaa8lJXJ)h>J2&88JVl1+$Q(4M|F9IwN_akN=Y9Diu%B zX|~za!Bjo=R#%D8B}J&~i4Ox)$hkJwCJL`QY90dNuM3-t+*%QqMCv@j4cs!ym5L2k z4&JmEq6nTweF5A@O^iiOD3OW@6w3EvU{zhbB@zNMtGC<)67VI?i#8pHg$F(QpF)%X z!O}O6>Uok2uD>E8m164M3sDN1V6qL#^84E{}>~ zIa3SLC5jx%E0;VMWR=?St4Mj;eCgI}W$tPSWrkc3wCZG)qb2Y*(!As6MjnFfMaoR> zrw9FuC}>{i=V2*LiBlf<&3@^Ily2;qSv7^O8j^qjRv%vj2t6TkEXq1c4|0yE#avgn z=_XG3&C?v@r0!sH7M~!qoGivtpylh4|GKGDj-Uzl1c=qZ&*}T(tjUs)WUdq; zd2`*~Px)+A(VXHxdp(o?%_8;dLeEilz7^%n?ekm)(nJ19pBQjXi>qua)@)YrvDPCk zJ!fV~kfj~I2o2@8awIfn$0RmDc?7-F%hH>ZmsGobEHP9NbSEU5GKOS?RV}jx^S~7% zStDD%ED0GXnJPY9xp+3{%%gK5NtQj}IkX}dcmW5!*hq{nwe9>4)@NpEIo|EVYgnEM zP=-=5Z@(1fP#Fbo>czs%QKoU6^6F@(Cu@DV?gyd5Of=h&iG;53mwS7rqB+A$QAhD+ zoUw}Gr%e<*8Fh<0`rSO0BhSOX$N{Hu5Ff1oN)@sSya~j~rvTXem}sg>KJf(Krcq&h zkRNy4^Ti$-iOur)R4CEZ1(aLV0%iIfH2n?LLj+PaNx`piiC`C!o2VJ`BZq-JCpqQ=;|4iT%pFi712O9BZ zoJq>(hv)DA8dH_<%%t67+p-5bvehi^;lr4$BlYLDdrQyqqtCO{Y0Vt~SIkY~as+%oahdwR7<^#boJ zQjSr;G@_1~B$;_u%r{lcSq8kp-2wsjxW5!9EWwEsYYHF-uspUI~%2iVF8m<^+hDq`{0145Q1k;cUFiqA<*^VCguz5U~*z5mS<; z7ACL-Ql+xu8?m!T@Wlng>{yG3MGaW(hL>hk6KgaI5??Fo3aHEB@Z^H^DTror>HfZW z@|7`mYC|j|;e}}(3V7+Jy{wyv&4+b^oxr?PXFXcDTS?WcD}1ngNg~w}gOJ6@vhy{V1fc37b629bk`e@dSyKj6n91nclz8}WfGMUA zYo)-LJlTm0FX<&B7R5{&#Sn*clM*gGLTT@9Rpw0$Ac_xHPNyMNMx#FKIJ0;Tv@##T zWWGxyVsI&wF`N(K+>xtj$E3kEW~GyM-|3OE5x80h^3Ro9J4?i`ebR4Benn~JJjUSR^^FasoFO^qe+WzK9Az3 z;Ok>5e{M~Y2xX>`5$=&t@<^JK2~rZ~mS^?UOzIUmMq-HOTplSN5y-qR*`d$Tr}IvP zq>;p48@7-oUZPKK3UXqX83jNER~N@u7l&O8F^_yl4=bF!oL(E(k`t{Io{Q);91+J7 zy*}zwRN3UBi6s{+=}Xf=Ge{-TDsUb)MWu+LHhD}oIb7l#tiXAepWHRqOPt_u27=5m z`3Jg9DSZ|k2&K8iZorBHPL{#ND_3MRSSFCL*KuyG?o*3KWdH$kyTD0-Crbx24M`za z6btk`LQ?a4rL4^4jd(S9i6%zq7rCMYN#?;Cnt%uCYLh4Y>>0yXxu!J(<&%;S}p4d%*cPxA~T%^`La?WEi9 zvN9?!>@G6Wb^QR9LP$&RyF5mrlthjdXEcMgjY>G-DmO?^nlhaN66hf&tJ3g0JA`F= zAZ$c*w6Z*wcm;2Kt)q^jd{i1A{LI(0={Hl94reOb7n}p zI7pwC9`Ll1UL1K}=rz`gu1Q*4y zambCG9;;7d_yWvo$oPZI^dl~$RMJwris2Ed6eG2g0NC}rH=MoG^f?rG@R@GU^5gbr zRu7*wTPCBEMqDdu=<>yz=v<@7x!0rW~Ckr0_^XuzkEOvEpkqZuzI-*C5AgJMEJ*LGPk-)ZZv_s zh+2>U9x$EL<;|k;tgN0?AnI~q9$8_7^&koAoE_Mrob}dOxclCX!H!CwbCBKGa_Mr+ z*>t6uxmhK2f18{zKv%j}E#?B&^kzk87F%FBdigXnu(#FSJriyY8kMje$fk?ivrHrD zFA_TM_t;M6rP1W2Qetnj+tKXq0UA!KHw=XOQf^Bp5iJY-QM#mY}H6CFaL z8}6@>Cl|SKq4gemV5!$+X$X3xFR1_kC3luSY80F#Qf4!%v(I)n*@DPqYKbknOkG3k zw{P?XcaeiQwa@C<1ActnUXCH0b+&(*VxWllhEHV)B?A5v0$;pXSs>dZVU3a=QSSk+lRQJ@aBi!cL*<3SGep zuRJ-J(cq3o(Ax!CNP2?}-h={fB};59_|zM*(F=>Zt0-i7?EDM1QeA8TX z*i@|NF&OnCsj7j6q)~CWKu?`Q1wnoVUCxD;In}t5bLd$}7UFPX4uINqNtV+e3N=PO z2owqB1jk5zO&Uq>PBy4dbY510c7^Evh9={pQ_`#$pL`Nsszf@lRqc`*ZDd_uUS_I= zT?G6P_bY{O@RTJk7hwQ3tSB!MB^8SKIm`m-pqji8A*Y@d%|~^7an|IA;qW?Xm;IN0 zD&Fh-pOY&}YF>&ihLbP<*2Q1@2anhCn9%V?@*OcgZdY6+xYY_ zt$+QkOO`cuE%d9&@#D+?>x*w39t|m^lxqu!ACv7K!g8b&==ALB%U`?CYO?kRjV7$O z{J;Iw(Vd&rtyJVzR$N#I(O2i!^U3S)Ts&e^4Z5;iEqwIFuUrh)4=rMH(nw0t4E_W* ze&K6p)pdcaXDo<2nf%Ug+g5P1_SA8Y7;Jp<=(JuR*=KL^%fE5{KmMabT1T+8ZyGf! zDfldH{V%?Hrnwv#=n4MWSGQ2YEHV!ZoCTuaWY-k+y3Te)q|yKMlSgdj0xZf=&R7Pj zedI<{dH=9Nus9o#H_fz#N3^L`n??y$mEF{ttGEt_dg>TnLDfWtYg ze*KNhhsUIlywS$94avuEZ@hBLA~p+dWZ4UwrKjmMqzjyvif_I*{5wDW_?N$SMia(7 z85LLA%j{>z-Z$SLLX+6En@=xCA3NB%^Bu0NxC{E%rum1keJ!a=m z^le@dTsD10H$zU|eRTEpw=YQoSf`z2A#OI}`~0W2SAvsC*btHpGwIPCj@I9PaP^PA zcuWQcwsgM0`LBKJ^34b7z|5lkY+Cc`%>g?kRT?ia&r>!hL@#7K)W`-)9~-QH=H=DZ z6hiPWL8$|ZW*o+bSL?6dVsUkg!vZoohm7UHS=l?%n=|qG4 z+2GO6eHSAE0)u79J+?)$YNq&7Iv9&>=<@+bGKX4Hi{D?Ui} zB*UzGNOU!T8|LHELAS!P)7fq+qhc9N3GyS(U1DejPJ& zzE5LFeRd(AM*KmZzX(V-}8I+4qp0|Fa87#_l=t`v*i(4JXyAlcUHRQ8kv=3 zR&ZV^KKbeI+1%Rs>M#Es?=GF7voxKjVP|hX*tNYxydBwRz%t-;Gx%EHv&)A{-#v-> zzzcGEbTEF{kJx*cp0s%U97_M^!0j82#?XmTn4NsvpoJwt$pGHU zO@Y_A0a3U{4DKq5~s3=CIBIH8ck|Z0ANd8R{oX8t@rv z3sEP>6tlY$e2ShNI+eSlnqJ6x{^B*w%~Oh*t9fv9KYvrPXDI7ZR#8hsQG&L2OT_W$ zh`D>Jq|x{@gBLGtv`?3GMlEfikKh~?uEuHfWA@?gW&bnZ_XDs0>MtH0KI}Bs5t!f9 z{XAH6i|2$LHQ6lw@!|V4*Ps0C@4k8Gm9PAZFJN%DSz$ilYIdH(ckw;@If6cgv{Et=EMdh9U`B({1Z43#~`pUh}*#0X{+4@MEjpwWzAP4Z2@ z!C(fJ$%DR5hZK6_+iNNK2MQ%KT0G(~fKRu0Eu~TAI z3amz371EeJemCQ3pWV0J6LJ%LJDiOdQ^zzVQ8s zq}WyQgm<_@*Tn#*w!tOA35lr(Ah{)9HF+^$wRxm52vNve1&rQ_0+t&76@^%}v(2&E zTjpp|jV}yR8P!kAIo#88$-lF^fHfV6z${W^W97=($uXPKo`CP()Lq+Ul1F{)EUbeX9nS(Q6TW(i5f}8AW8yGSV-=%zA$=3t3 zgzzP-$SBa4K1ZyolQA3BSfC_Zfgi?XFxig_)DF+QRhslDhfral^0_Y$ewt9jLMGEY z({}~5F)lb17)BPnue~KfpWVSGYMFHkhtkME2<3iFmKG&7N$?_Lvri5kr`aus+{u$p zkVrj6YqIUsWASR1-fQEy)-61HGWY`V)36sK{b-pn_W2l60nB^N+$|D6Q7ud0PgcwV zCnonobTf>2IscT>x$u1McAhxc3tn^NOW;o=o)601^GW(NEiN(hJd!T)_Q5^6()1*V zD9VGylZKhD_x8G+jW*NyLPBh z>4Nf(?~T;4NfwSYQG62RdzigPZC2%quXV8<912PELTf>rNR!rdH}bVI2%Q-0XpG&V zXB};Zge`h5V%RW?0Z!O*6^jA$f=+u{IGbm}(G`SI2+jr5ZZx(k0#57LXEbbNCVENT zlr6nD4d>2HfwIv*SNf+@P0o=tPi*X+45Sf^!*jGr=S@OIt>4ptceKxZV~oWN1O**Tbfg>YyLQ<6pvLjnANX?8HF0%p*K zrXKkGh{IuI?ow{ZwE8?#jaQ}}^du2%*xMvu5YeD&X2EvMGFwbI95GHY!~}1^Q|AD# zC}anQJtbaXOdxxCH7g;f6WfotrF}bpG;KK&3~(4G<@o~1H*O(YD@yz93cJks@Yhty z>xBFy9~oE>bqJ9L0G1QrynaX@&P_Y}L;+JX#Nvb`CSuXW>n)DpfC$b(HEG5bxC!J> zPK_d+*>jw`T8ll?SRcU=^(dGQ5<{`XVD!su>jQQ3%X7k8R-}$9mjXeYq;DRW z#gt+-y~r}tUhkBSIgBa!xjs!(IAZDG(*76C{v(U3-EuhLO zdSO)7lUx+r=;67*0hQAyqKAE=# zi3@_KWVCAne#G7{&YDC#giL#)q-N)cTw>2CsLAD38$;QtrlBE!q)=3OAb24>Q4!BT z@}%$tr(|)Y*3n+E{bPvzojtlI`_IzGE};wWWddu#pHPM-nzG`E{}JSwpjdA@RDV=?CM z;hCKuDrkLjW2b+x%{Om8yYu-nII8~oQ;moN0_0S4t*vctRL(^?39J#TuH;s<*>)du*c`)H=AO2mfd`E#t22t4XlTqE!DEK=>Ye9 z={5to8)EI+I>QiNHBO+!x##;S&1{`4> z9muXe7PJG(1>g=BF}K*tRJn7smJ1g=MlGjkAHFDf6Vk|WBU~>y13D0b;g1v(GBz)MYQ>cM5DK+$XSLCb2 z&IV%~eM2=*@nC9-Qv7&CiM3Kki)ebVdN3X)xj{*hjNL%U0gdIOQ ztpqpk^DZ}Jgd+75H%hv(?K{mi^pKG$`ES+8c$%F^S}8QgR3v4<;jm2zq})U`#n>Ea z-O$!t(br(X!})H-XsuN_J>Sgq*oMc%ZAUSqm5i3o4ti1Q~csb zcH#R}Q%}rNHP?JtV>~gO7x)?(fU&*TNSdl+=&Becso;EBTg^EUASvK*-sET0Xgj)s zjd+pqOVSl-a$T4Y@83n13-w^jN+3VDRibL?inteKZJtOn=xoL*zn#(|PkYm{QYwY^&cJGgV z|K4Bu(|5eVQRi38Bqhl_nVbzrKmAK*fA#--VEekZ#_0IJ^v7@i;OBPf{{X}aMV6qH zp1*eMj=REab6P>;3V{`!wU{0BdOY%S7X|Lkj9|J`4>^YT5q8UYXI z(Bfz%sBcD-ul&aOfB%0xc;kV4WYZr1*&p2hkAL`}OxkcBVmOcO@c3l(_kQ~E-~6c~ z#{UEJ>DM;@^FMa$-}xQe_F*a|X%sP&d8waXe{1;H{=wnTf8~t!7=!Fj{=xk}|L@j@TL-AoMlQJ}sj887cKl96{fBnZFz5iJ2@U=S| zf8j?Ce)RY4i7DrDB=g!awyVr9`QLx)@bCY^37lb|{Jzib{N+D!`{lb78EBIS8cAVX zQ}0W^cJ@E~{fDo=$Nc`adk6jh=m+=z#J_uhHAyPq8gPM4t@j^Y{hfby^tXQM2nzv{ zdwc!wdUb$B#dNMlN{Hf+K(o8I_WFC{Hy)8jy<2V1_wt>=pZY`lKlTT1+}%&j(_#a!Ez9Jg!{Oiind86vvqx{<$55W!yV3jPU2I9` zZ}D{M5)0#QNw;r4xO(@olb>$x4gSRMzwu{(=zv%>T}@L$@SohZ&Rf&?AAj-j-~Oqi z*WY#6$eo?_PrWqY1@P~9d2n~P$7o$re3rTa-&lWiGXDCzBVQ@k z*6!~2KK;@LxrjH$hFIm$#fp{&dpn!MQSXg2^{nq;V{iW!gAJ~(&ajSr9phE64Tm6` z+gq3Cr{|}Sv79IdTYLK(n>#Kpr6Sb$)GxcKqP-;sPVL@1z%JvAB%ZvIBf; z>uPv@dUB-sKb~yu-`v{T#kN=wvw{-)#^&bP@u3rO7|yZY+r4?0N7sS#evBY6GrICM zYjbmV>&Af}P^cglI9C%|Y?tT9=Vy=62664|-@)Poe5It=nuK9u&5%hXqwzpVoeRQv zVaEb5;H$=MCK8+>DXN%Ew)SpqY;J4PO?5q0P)U07=>5y93%(EZ`?>a1gr5bt7 z-`FJL$A|ZQN1TkAn6kOGJ4EW$;EdPbMCS;L&S^Am+`7jXCz4<#=Y!2nvc%crhm3ea zGP@BDURm#Nb2a67dPN8R@apIdK1v}b6nh7E$#|`#i$Qof+1S`PeDDr-Hfm?!A5(U) z|9nGRc4nCE%kz`d6K8HgbK~GHuLmr5miLAE05&2F;@UnweD7)~Gnm&0cVD@r17Ici zc(Spz#f#JF(Sy~o&%;08-KvCGLWpwIs!hmDCDJJ^`AUM6&pFJZ=_tv6U2Qw{T#E5S zdAvAl^24xIRoAl2@)lHLtc|g)KI+dGF)=)&VKK^zKw-y(&Irp($x-RTa1Z| z$=7~!n6}e|-QMhf+r5qN{KOU|$fiS4N*uC;=EVN?)h$->-~+C&jWmS)&%CyEaL{+5 zO9;DSDY$(k?>)TQ;$5^qrc;C-tXFRLKK=16W71YFF}2BJAx@4?#&`DnAoGNGW16&2 zy|Ve*E7UJGvNPb&yT0S`F>@QK5)_uMmzQo0J`Lv-e3}=*n+SZLn?QW^vD*WP>HomM zqr2{t_clKL$*nb)FX`x$^DW)jFf6shEEb2H@_KylVDOobZ|rQdw#B@pA*BlzQvd-k zue6il{M%j{dLE;{gW zdpql|-5Y$GG}ZEmjCB-Ti;}*jI|l>0nb9*ddv5OazT=gRS4)kM7cr4QzdmMi()~wQ zSjluUp>r-?y*>EsC+NB@&P#_$Ba>;uf-*1N>@$Rvj#cZ}^)+U`|N7fk^!s+e5!HBD zt>zPVS!zYL$&Fi^>rvz8t((3fNalfmnmIGf(P{rzzHvcPLX04wKfaiJ!(|otM_d*wFZn@o)l!+9XAeDZ&=*ZbJ5fYaPC@U*x7;CPJLNL?Uxs$*WbFt7U%t~Khj3$`@=hj!*>p~#SAgy z&@&U;8F_3QVc(>m%zIzoRx__b`wc?WPIqEDQmC4KYr`b1#aiSHQ?4> zJz%*a(i37|@_;`&AHRDzesHSUt;1{m3PX=!9WNcMzjBMUDnb`<45o8Tv@=XJT5%0Z zQpbpK$T~T21dJYudVP)N{Nn5+l=HmsuCmc*5_H0bo-rnT%Q-zA4zspGVYWwX9qgXu zT8a6QEo0A}tTvn0d;15s;fPqZ@c1w^9>K}*@+@Z495Y0+v9+_+&1?2ue0_9zetvdL zHy(1gT(oC85tyjnw9tOHq3`kX;_Tvr6)hI6Pol$sW6nge%@O@#hzw6phF2HM%+Ltz z-Mj@&OYhb2;^Z7Pt}+lQod>t?rQ0ByA-`OWvFGfU#be2BZSOMwf<%ttYieV;o-l=+ z`eD&&RPElp6Zyq5)OdV;dK@(_QBTI(J2y7Bccu>zgD-ZQP8hc&bo_{DKAZ4Li~5=h zge0AuVRK)QMpKOLiiN5Aw_i#=M~AABta5gIWRLQaL$Q09?383<4Lz%foISogqYGde z9ZCE9x9=5r=&3I;i+Q_P0ge`Sb`Sd7+lh7=ZHb%b^LS3c$|+40&l$E0wMr?^$MqAb zUz|0Gz$oB@ed(TK84ZvnlTpE}Uq|4B6>ddNT0yniD~yvd%Mmqgl~u`P-Jy+KFg>KJ zOk~IM!y{e-X(X)hAsO%Qf3e;31~%gn4>m{9H?$Nc?!Gy8r+{07*naR6iK3AS}_T zBnJqhUQ!1gQlI#pJqbb0P!!=jY9~A&>m6+BAO!4#lGjd&Ax~(v3S5rFM=>lxZw<3f zFDhuzbEY5HG)nX{Y8M>NF@LZmY{dOutW5M*ZJ<+HUW3H?P~|2XI){KyEO3rZ%(bHw zXdK!xh|o2TcmJXhg8n~+g-6tAnl{X|cAVxrlG@nx;9KI08q+~!OMWGrlQ zxE(MgtKeigzBQQ@Th3LJ!*=~3=4-w9S^lzDAMW||#nU+l&S;%}FVoL*WDq2!T?pp^ zCqQM$a8A59>?SFFd9gzrWR@M6L(UCZ@d|M4Cm750HMoUsUXaWnrYYLuXa++;tj|vD z;avV9qL89|IiE+TWRUs{{eT_>%0KTE(9l^UIDxr=BNdbs$Oi;IUK0zH$x{wFP&2+Q z$j+?8Lx~KnT44nS!wKbO(c*`Km#e7Jd`%F@88FRDCLk1$Ib>ueca3_R#K8|H(M~A+ z@Hq?akVyhNJO<9qBmj%u{0DXlj=~xrxq#OE;7B0p4UcPS>aK1xB$IgL2VEsmTc~-h zKwkvOB}M>rA*WVtLN(xtPL_kI77M>hZ;*@OIr?Hiwa5^?jLj(Z1 zh9ynrmK>6$@D@Jw-kKI7%sZh%5XBo0py`%gDP~beEv1}!v=@2Tah?lAgH227$~YBd z)dM{1*F3D7wp^^nT7~l*elO0NEGAOzK82sB3RVOhpGw)r)EHRp?em@+u4zPQza4;u z3BuPvdsk>Ks$r}sOd@9tIJQz7h_;wU!l65S;jvc|2c&$Us&ZqSUb;mi<`5aEDiQ$B2r_CX1z07DcV-f)Nh9oB zh%LryK{Yb1TM}eMKJ{rwpOQitW{MuQAh;RE43K2x(!?ijC`}Hp8b<_;lAz%xc5q@T zH4=5qMnk7sff{g-GvpDYpH|DhDRVArbmQAu2P6;BQ(|!uD%4_bG!JM-sm8FDW>_ZF zg82kZuaAI)ga{fpi>;uGzlf(gdw*(bT0In@J+NL0!Fiv~RTtFxzB$E_)y zryMJW(0EuN#s>mZqoLPqw0GFVw+?uOe+gGdD|k;mSQ3fu=He> z;@OD;Hgnhq(1)oGF!WOLvu>gRv#*g$x&vjV@*HG%$%p()FF!gPeeJGll5Ob{Y3LhP z8hRV@Mp8tSz9cQohVufih>S2c76qK<+3F!BxtQS?Hd39+4+TAva#{KeeTY+COJ4;j zw<-|I_9*9?cd>7bNIbRHM592e#TMGRHAcvf#3)B_YI7?0*i!^8?cvQwOusVUoDrB zwUUBjzU62J7n$pLJOQ?OM1W9|aRBz3u%_{EyK1cu6Z5GCxb(YGq9RgBmV1= z!1A6ueC^tVh?F+1rp&i27-Yc(CPHII62t$Udwf9} zXw>|H&_7Jr4;0~t3iSU8Zr3+%d~EZ^%X!!850Bp&K7P~B5dYTw|3d>W+M1-PeySon ziqzjL$cunuN4bJ%&g z+AxVBlxSlCni!JWq)ipIj@ugs|0dwj6NAX9fP8q%)+sypDc_|AP4Q z{4CJVJ)FBK2Bzfo&QnV*$J_56=0rV=`PVW(Dkr%GG%8bNIW^jw0jaf&qBtb zY(kj^sQF*w9DhYz^6%na6&Zo_&WVt|NL59&;wu#oV5Iq+7yady;46srZERM~egUjo zf`h^BylXsQA@~A^9bvS)b&V0sRj4DVV0r|RtK4)1&4s?g<&22McHOpUoXd$sl=YNj z#UO42)6lgi3CM`P{u+s4+k9!D1Z-(N^MORlmd3ZT#1aNq&{q+VrqJ3i-K)Xz1u!s) zCRBv&g8Q&_P|}!6l0)->zPVk-SJG&jM*+_%$jii#Dq5Vv8pfllEoPdB-6^QWd}tcR z>bj$v&h#IA=U!A#LaEk==L9_u#3g>Jk@AD1W)mIJg<6@N$B`wG8c>%qRJ<>Je ziBU+4#05)cu8WTO=5~R+*d%|q^!8&!OJQ??I=6{h&C~#lKy$yvDv}rNXUt)ERh=`# z`%!TK2)C}dgl{$y`Q12H~MPj*=CgH0~r}}KtZ)1o&lcFwYHT>RK-d+@X;;YDt z2?+|>_E`NDak_Unh}L+9lThQq$6}jbo=H-V8p7O!jRNPWi6XA_QkSyJCwC=V=vBC% zk3}xh=2B6Kj8D{DH29oZZH87Vu!b^<`qHR4kX4MKryGq=VIfFXsi)o>mt5J=Cblq~ z4bAv8iS;7-l#nL2gis4}uDOj`I@J_p^vh)j&fv}9Ht_T!@-4g=@Jnqz9Zl;+!sW*B zDj||2sC)`5#|^lY(RtF;N6Oda3CSD!Derm_nm~$6GH_?$Mw>p%4`ld2K6}aGqlL2n z5@*hX65l1xTS~y;rO5TunFLK3Ban$?gFsd^p$T{*njVTTLy2i{p}f_@%#?fcgSm^k zUS;Slr9a4sK5TI1gQ>ImZi(xWL4=pa7?92y;CR09_cv z8?vW=>8{Mu2B~N&mP)lLa^)WR@E39NJtGmx#R4bs=~(q5Hyr#e)7$OtF9)TNM7j`9 zPx|2UNkQ(VuQ1*;mu;A$%`t!mtk{!0_@!{qkTsV*el!`?(v;4S){b1)OnWvpzav={W(#5k@MHP*fYUT(E zq=Sm&RS3L%A@0RllO~1Cb5;omn(N%;Q7ccQqU3e`7DXjwlcvFG6w-uVByK@J#F<#~ zLDKKNj&|=e>wuASrX_E}R2uav3{i2;YYije9XjkX;7r9}+N7hmT}L8PQ{WN6_9Yr{ za)E7&%`tV_9;%V?<#|ThQ2mq_ZNeay#AZI=-M2Z)5MRk?}U#3-N zB=xz-DhHmCQ566g4b0+6@3T0rVAhEk_AS_nsZTSPCvWfE#xuyMQRxT*oj4s(gV%uO zF&RmwR1)BZAu!s>5B|#!Y%{AQo(0YWLL+-Phd5db z=P6A*S4NMEN(WS2g9sQ|YaMk1m;tnOGbjQw2mZ^nLWF;be2Fk&1z&Q(7Ju$ZqMY+- zZyGuXy3El+v?Oz9AKLyk;kbkASqg47?@bo6eIA-dje}fgpd1sv3EsdErd+}{*Vmn9 zXb9GZyoUNIkFN>Ud0(%@j)aRuGQ(D<)>$IRl6mI+R^N48d(qy=OMAT-Y?f|HbshC$ zXcETXbGYk?dD8s^tea~YZ?fPNFRX+e))YE^>ktB4 zUr#BAHl?=kg1bU836|xuF&y)mscq1uC&sWOcs7sbjt)O2ezKf|A9+Of)Z`_@+Ens` zbL~iGe_!?7P#H0>QT)6TQ&>7Bl`r(c*4_|f-8kPi+TiFTj^Uh}x+Vn3FoX7-KW;37 zv-Ua6s74$7sig421m4)?tR*rU^;M{Y-qPj)tJ(uj7QxH^1UBD6WtHuKyaNY-MJzPRNpo0& zUavJKstBIMA|SEw97H%zZV^;bM8#LF=CV83SIN_4B_qCK5|^gGNqI#Ysn!K%;2cPC@NBH8sqla3|jl@x$qtDqi3g@VqJODUHmxWCFag@(_C*wXQ0PBRf zfhXW9LA8Ti87yJAG(}yM#@vc>2nc1~>PV1zVDD^^q(Qp`aZa?H!xB;80LPApJ6wF& zJj%aPOG{;1FLN&67I1)oBqBJEp$%sgjid^Y4xp1A~ zsp_3Oer?K#Iwx!iP^PgAsR~Zgi$1R!iM!AZVd3Wq(WTx(E!dHXQn*q;6RrTcsRu2` zEv^rmC!A$9zdBFjPB00TFeDMWh#Q|eg|ZHjry*&=qK+npoMwo*T=AtFDs#M{@;@Iy zefje#u6T=n%47DZXwX*(Lm5cqmEcfPHwU-N6$Wk!Z}Ui>xa5nj`<54%&?EoMT~Fjm(cRb8}M0-8ve*k{8o&>L&x#o7MA3dXzO=YEz>Zwn)5a?3RKX$xRO@w)Ak%p>+QN|h(XS;rE1Rt%5gpAXyQb%E5Qw> zXdWT{H|2~u43t(^u<@+CL3b_23fSlNdU4idv7PUDUXtKt#Beh&Q8nRno^u5DOY6$4 zSqMHy8M20Udi}gtfou;H6l?+Vl9nZ_0}4hZoU_-aBh4LclmarF)~+lnAtr6p!<3`4<}!64I)DvU=fQwv@e`gi`I?EtKu0uxV2~K43Tr&1$Bb>a;vJtb`#Oq zS?JENCeQFFU&Ua3)r4__$r=YQ0VkWOj7;us+2%P<^9D$-v1 z5v!cYGT1T+v3f~#iMJ*6jDYI6k=C>~n74+?XZIO$g$8q0GS{Pog?&w&@Iy&YoeC2zI6K@JjXzS zR`7@;tl?y)y;?vn>eLw_h0q%__exHnm&L#b(ok}i+QO$IP93*lqKm&+GH;fw%k%_J z(P(4wt|_kz#EGVjI9wzs%rt78^3h&JNDkpgwoRl}unmQoyVRKUBEKMFvV4o!o`a$u zgl>*zAoCC|R&uAEOz5lC6Xc=7n14&X23T_Db_kMn+b`V^nG=@;z(ZP@FHBCBNBoy) zP0)a(c!a*9SxIb+QwUOXdb7mw2l99(JcWvAsCPC2=fTkGm}~!K@zKfE#id`BDOG2eR}YUy??1epU`-MPdV?gj?e`h86$*Rbu@)Wvv~4Hn!}lHz zU4oA09>S)YNuL!<*|DQHoR#nnkFVZ+H1vJ7X@Za?xy>42jXfJ5pR#hH ztt;){@#X0L;gHP{EKDLNTR{gqZjC*Da5Ow+J;LD#L*e3L{qT4MIK+#R+J`1G+u^Y0 zwjC~`wa1qOg1`6Ra>C}sC28eY;O(Iqv!?gS`4xNp(a;Wt>xZYT#D2-r%4T%cl0U0l z-Py(H@bQ@K^}t8XridUR$LBD^rY!55LzdA-v6n+P zeQeC2e9jXYVUN$o509_dwFq!}f!Wql@P~lQiF!#IsTRAtChW`dm^6)*iuugq=l367 zZf;^6YYUVfAr7^hkCWnOmxA-?^m6?Xi&5Xd#ExG84=-!?53i0+Oe0@EVr1Rj>woT( zEK#X&3yyur*rV@T_c2-M<#pF}!lFidODjcN&QqDYeElOir>`_`_*pFdcYSyS=-? z{+wnj8EhRZ?PmwYZ?S|kigAU=-qGohlI8MEO-66h6d>X`KD#1O*n5Tm>}kiyj{U8* zo3Czs+ieZ!7S}U3>_ouUh3q|JH*mHIJw6-VKe~FC9Y8AA(tOId)FdGrYCL>=b$-E$ z)e&~Q#$K%V_6M)t#L|?ibA;hlVs~@x{bS@4fg?GJjelovarVJjluTDG( z#8T}q-RQr3(4)?nbr6s@cefDMwBb<&VUhn^yBp`1b!V1L)xis9e}9MfqxF*u*@!F? zmgd^tJ76c6TD?3yOwoU0+S=N?ygaK&^<7`z+Gewa?Z%Rr;RZZj95*($SO>ddgzVC1 zmG7H;Ay{spm1}E<{XkO^1%lm;tz8z!c67m#Lx#cj&hU6zW-wp2cMe8dFtbF>JG^`D z#m?iYtd9qqJG*^8fXpi~K>^>`-o89LEg+H#@U5MFw%=*eeI^DtAF%#euRmnVpK{1P z*x1><&BmfLgzdxe+V;-w@bbL9=geM)yF0uLr5G**!B!h=ZmpeC8skvopufF)+r1N4 zxxvPk-YHzA`N8Jio-bX?dZ9M!ZES3h*d8Vh5?=VWcGF-P}fvO&Zn1%^h;%)*OfR zfUJsOo11H=Q@!;212$*kBTK8RnF#1-+1h36))}vVBbQM|rx970yIH#ZH^QWmHfsGy z<8Lr|=l#_8eE;6fd%yC}e}Z=B#?6;mj-UM%5@{Q+tzdUuTr@edn(KH`1N1)m>F*^I zfAyDtwl`q^kH*c=v|c%1=RZgED#pW3J;S&s2zxB9oJs4N<;zk{P-(60Cy7i;Nq0x>oLzSM8*3i!&M zjU89xlb%ivyeSWUIHQ~jzV`MZyWMK3Ff8xogTc*x_8*`MlNmgrCu-@h*qzVqLufeh zK}s6kSMIQDW6ymmZ6m#vQb~2ZOr@{Vi6`W3yIYip;!73g-p> z;PL1^HX9qc`60_OvP%bhMk57=6DA+Y+0y&XoNepgeKa~@M{+ptxjD+mZf>yBINhIa zksQwDq*den$CLMuhwSSM41Ig|4tne)X+3Q(mn|jW)a>?Oj@*gy{ln3zZRCU{Drqu5 zc7UWVLWw46v;DA=uhZ!8@^Xw>1LxSARzqz1a-;8#MAXzYG3iAU$VICC2F@nn_m9Sh z***kAX@3vS2bc)Z+qI^oR#~O*e&GW*KdyN{HLKFpd`D!@0C>sPZqI!!7)tnNdNjrG#){tmsowRDt{%DQ$E8?|HF z@=9=+J)@J8_O|7*-Crh7D@t#TO)|`j;$$%A=Hvn3 z+U4F7J8W;;kJ}*@wo&29n-y8henB_dVK1Eiz5PC0(v!6aOGbwV&e0qAY#G3YJ%FE_ zYs8b21b5CrvUmeLJ<-j4%=@8>(nsgJ{d>3EED=G-0}4z^`vKhEbZP)LGtBD^i-emq zu+eu|ygp=8&|HyNz>=Wsmjio{P-E=7uXiKp9KHF>eYc^nZgq9O!Df%H54yqyoQ*Ci z7iF2SF~Qze%S;6zpnKKB9yQL!89U_d-2MZ9{4WkKFMjb0fA{3*fr`8GeL>v;QyI~) zsBO&VhrDE0a?>97pRi9i9d6`tHXEewBP&t~Y;I8|yjtM|XWK)5g2x!eGHBPVS_(k6 z2mO+5buv7dkIn3q$?nyw!3~b7TD$52j_}z8e8nqPVuC~VxH@MTMZ*kRfNj8eYtk*S zgQRRQeFeQ`k-UffN7Zs2Gvu7BE3#L!nT_kLZm@NhZ$itC*WsEe5bwTRO_qR6nj(r13x54`@BUphK`*csm)K}0}H z9YU@eJ##(Tz-HRJ_4x38-gZCv+24KZ&MRO37hf0+dEqJLPeXPPALin^g7jf9D{Qf= z;S$bC-dwl$(+HYO)tur#dp(oTW|8`Jq30+&-&R>O9?x}Is5w&CqjGA(2d9(6-@3pA z!Nk!F;`1Ar6mCCm(!^5X@?xdc#RZMrH{ZK@t2cJZaoXd2)-?Y*ijgm~j+jIgk@G42 z=xp-%jZ0wbmny|!S=3`t@}o+J-nJo`=go&Bei$DZD;S6<#t)P+4QVFnULq!VcIr!p zHa_^~5PL{F)o-5Z@VAL|TNl47vK5M}TU#d(^6f{X_YOxiY}jXfc?8^Ou~d+BM6V&4 znf8SWh|NN5M2}7==~pgJuDz(%l*{k(HsP?5cHLgrNq_x4ws$)kvO77*e(kji;scLe z57Q>A-ZP%`@Ufru>$E_$sIEZSNNW68HUWn{Yj;%JcjIHazTlZOLX*S`I}PWI z^>i|jTGF;aGsCshi_tgVA7M(CU0a+Z8vRSKVPCCDiiZ&pgq^J6wq%JGX<1REn)IY4 zZTrVH-B<4(j@~_DjryU>yi<|qb1PJ&CK&*0SyucrTD})OIvYPaGdk`IJV|QCmdtiW z@F1|o-{k$rs8L~6OMz!>00~N>pdwO-urQ;fSS^oN^c;YOgE!ao&X@!Y&^Pa2z4eeS zu!p6V;v8lHwP=KM4uZRx(AtT1NR(7?^GC!X|NDKMou{rQWZick@hzVHqRcH*a9+$( zPNQ`a$PB>l+@~jitKF3j!LfH8l)_Mr;oAF;M{ItGWl5S^E}~4Bgxe&jP=Jxy>iF<< z@;>QtoiicgLO_{4y||VWNQlp*Fjkd+bUryeyB-|1huRd)XpM8Xnwy~)&Rw=ONGMu8 zHWtUnP()x0I=sZJ^F`lLXc(XcRD+>l&p61;F?faqVy)N z2A9c3N|^zc9RUNrnx02V&PZy>MUQR;wwjlKtHnqP5nVG@^VcvVxDHN`R7-Sp`jj*Z zcv$s4;sVR{iQwk1DXTP8*K!`J;v|=(5gF_{@KR&PIfAfFV!&sjn?@XUp-1t7TqiHW z{FA^TqF!kAc6EN1cZHSUCL+{R%}nF{?YSzhI4a*v8SJ=C2JkL=$f4z|3)^_409KlH z!CTso==|cW$(F%630uz<=jf&JuQ1CpFJmqHtbqQ2UUHQB&vbM}2YM*k)sPPz^dQiz z^N^N)w8=Io#K0gwUQO9-#Ms#Wc7Pq3J+*s-3G^aSG3UZ+#BF@(>+>rsIf0gs4tPGp zXzzO^)!$v03Xm5hs{K{0`0xSi*SzJ?6Kh*m+Ke9b<80eHYz9| z^4<(V-aYGEI>OQBVbRDH*V#qT4-6X<-t73U%8y=Pi)kxqk8kCG(;+lmXG=eOs$z=( zuQ7^+M1|{nxn_{Y0A>(Z1Ogl@)?O~V8@0%3j~Qx-PbvWoM>D%*=a>|j4*|!D;5ogT zd{W2Y^ow-LjnUHER3bz`wZwwqDzLZh$T_zpX*jom&u802K%bC%4=Xchu!S}7|4{d4 z&$cbuUEbb%t=)I0yM5KIR@DeKRg@4i76@#G0vj7)6t=_05IpfzNokJ<{kg3Tc`>A^ZSAKRU;~~> zXl-a%&A!=)2e=kC$w;U*=09XafehA`)rC${ppMwV8fB!7NHK*;d5Zx}9}1IvGy~Tx zf1`@3m2vQ(!za}*^+cZY?!m84i_H&)wB4~BR7rA_bC&=*ekSKcG|syUL%kxW7*bq$ zG~j=}t7455Y{f+Xhkb^;E{O6~z{&>+jKGXGOKeulKQD+N-L&-WL@rJMK~7(GeH)%@7IntZ$~8F>j5^0jq}&#)wjHA}fV+ z@^PhYv$@iZ#Cif^P&#^E+o}k!L>?pdshXx&ZFvi!>Z)F=uvlh*C!u@=r(w>cS8I7& z=0!M$4^|&0#+2(B?U)}k{-#L7X@zyff)mn%Or_|<$LZ6iOcCZbm8Bv=PiljDkf}6% z_!EJTG1<}6GF%DX=i3oOYKDELk6}igC&3h5-FEpla0#y_9?P_+e-Gg1_$bbcqfSg2 zc@%iZ%ox2-+LNmV+AAwShx3HsGi6kwd^pz;50AqOytRc;a3Y0!){(xGW&q}K$Wb9w7GWBaYwj=!^79kzqk;>&%N#>0la3u-4z$yy!%x_Yh1UQ%k|C+7GWxDm8!;ZP@ z6yGUGO3x9^i_61Ppcc5(0I&u^K{vI4ZrLbuw1}U7 zj|XRg1qB2xaNRTsmd%uF$x9u&ZaABNJw54 z`nWls=%r&^cy)B8dyn8&MW3;TPhGwenTRQHYuIC$5xjc{9s?egp!be}$4fd6{#Z3e z(kBL&X^Sb2^22p}&HtskkfPB)K^ct+O4X(1=vkY^r+FE@Za$Woan8YdoYt!)={SF^ zq_#XwEl&V$g&CK0R<@@Q(w9^`UMRdia4N%!nT;i+{u+JVL``@fQCL&>@8S08S(C+X z8eP4qsqsupLX57i@lN>jh!%mB0J1A7D{*MYX-2_MA?3l-~RsTuYdi}R+}|&>q|fW+4WDq$Y`Ecnq4(wraxnx33H0? zMSk-S4oR|XPM0q~v-*=iw7$J&O=q&W<{Y7?YX_Wm{d@16|Jqmf500qZ3+tZK`{JipH(em4-CPfaoP(u%pZVy@pZLt$_L@pj=V%5tEF=0yzm)ps z>!+ywg#CLKEYnY38$PqcW{s0|s^k3l{PK;vXKz2$G@-;l`TWYC`uzI!EsU3_g;0wc zwb1KcV#L4t*4e-O`XOI|pfKcn`TElHeBMF!V@gj71DKX&t?KvhGqSnFu=GnehClw9 z^_OnB2)1z!G@Qr0V*nCPzWj~D@4cPbt-<1R+e;t4jvX~oqJURcl+-)>7q8z&Xa;~6 zpS?c#_dd7&k!P{78KbJ^QF{$~Sf}9M-8=h@KREjC8z-8RgN0iggOA=~RqkYYhIKhV zcggQ-x6l20ePLmHb?N07hpgkQ(iy)Jiyguek=O6?u@nZ`C6(}n>%$kW$@v6&T0RPk zbrf&hKYQaIA2W%x11C2I*Ebk%48<6F1+e7z)w^eRoyOIAe(~Diqt}L1vvF|cL{Ay@ zWG(5dch6a^Xw_X?{OI)|Yg=tsBHb9gqA|(-`n|K;5A9m9DQ|5JKXPNZwd&&_;5ao; z$K?X^;IH0MQqb3ii=Vu;{LC&3E@rV!Nd&+AmY>zZyS^YiwBpP zl)ruMDix=T)%dmkAzbE9m6GW5+f^9+XwsiYtbhQ?6!8Uv7~T5IJ&yLJlMN?eC!8JWWT>nOHNby~)ZftFCU88J`n#E_skkj*nhj&;dK>dK> zjcYg7);2_$Atp1_czkf68kxG_t$2BPcjtzStml?dARgYoeacrpsYM%`J8N58ZJ~D< znz$@2@+H&$gS)iZ7}yL8?A*M?O3OBjH$fT(7nV@VaXyxUo)5g%x3@DDG*2yTQg(96 zvS8*BOS0WtG>df8S4w*DkTTjsjZ-;)(A)ljdK6IVj%^t=+S=IBCfplKL*C1c2)M7% zK2Ewk7kyMq^dbH{J!>*@A}zlv0YT%>O($vuF&5W%y2xKaO%bG2pOO?-OOT+aa0$H6 zMaqNOZ03Sk;Qyu1uKtgI<)-CpI^VeJ!FNJS@iOXZ~y)4Upe@_Zyp{V z^Svso?-&2mpV<0KKef%%>wwjWlTz~~-*o>^fA{w9f6wnOiDd!)jrFCkecx|Y8gS=9 z)2pkCFI^kFxw^*S-#OgRH>1p1-`ZTFU&Ms%G4aR_pY#s-q=QdJ1`iIIC+FLXg)e<-?Qj0&>o=}( zTzXeVjdS2H_Ycp1;Wzfa`n{uj2X=B;OPKF>AM)`8CSAu!X-4yLk&mozZY{m@kPdag zs2-;3fBToNz4+WJ!!%CYmkZl;lYE{1>;LZH4_-Zf`>v(DvV6%WL41+();-N)oQwn< z3y;omcYVM&yl+3ieAD3j#PiF4{XgFQ(&yHhueG*Rno7hN>ex{uKyzTqd$&9CWMgsLslX(qqnd=rAj+e?dw>~pjPGT)Fb+}=OO zuv2~G?$VE@A;z4&cff}p+E{$Z!jSztcYFsc%sv@P<(-El0P=`xU;qds~Fr>TNtW;^S(pW6h9D^1u60K6rc(|GeT1CS<}pO$~V;ThEd`KDtZ(f2{!X)&5pTaWKIgk?KR_EJY+j^T+uZe=IQv>Y2pbLtD@R9rS(Z0VPW8iz zT^_Fay5@^82Hy~q<#6wzpY+Z+6vfxU4V;-8UQw5ar$Zp; z3|C8s`+R4|fc88|H?R3h?aPM$hQn11?vtbY2r>rTyyU(Sdf)e0dVpGo%LjY+{6J)m zKADo_@%+y4ii`BI)NR-rt zo^ZYb$4A(IjFikIz*gS8c8f1>SaOOMXnmGfSC0?&PEL+zXqAMq8ouE6fq{2kKUVmh z|3c$(-V$WgzP_n#mL?2ZiuBj9w4toL;S$XC;Q{}Hkrka&f2p?h1OZz^< zo}M*X49ypGlG&npgm^{3^-0izJyVk=b9~$#BUgAJ)d4~4*UdOE8AQR7aJrN3g$9N51A>*phKPPea0&@c#85VSLg5R+MZZHVoo4MueAp}c);qk3^;HBxM5|lO>jNEa*9&8w!*|dS~1?bAQ zriOshJG(s*p%}b;hvZVuEN5gxqVw;(drE&#Tp@!dI2**|izVtY`~!}#4(n!GwP^t& zlED{~$qoRRYw5(fJht^YzIf%Gvj==|5a_}$&K=;aq&BZv%$hOdyqFeY;gLUc?0yzV z0=qL(!6EkL(dBD*Pv3dqx`puT6-O*Z!@DsC2N0IN-;sdngblNUq2iW5ks`R4d@V$7 z1|Obkr+(+1Gim}v#Sk7GCHVaA<@39;3o1I{&zgotYy3d!$Od>74Q%)UkP83+!M=R! z{^hscX?;n7lZGhxd}jONrR#nlPPgo5KvV_%EG+>7=*;2cznR6AeD+#Le3k4}6BtZU$^DHG}Q2=!@6cw455{V}j#jINn1T zP-NV+Tn|nuJiC3dyY51VK+DkH;rZKp7w_&-r5kJ<687_2y7TY?HDc+GlS52(W%QR}PB^hiVD-x7<$X3d;{!Op^om1X z7SsAtwRE|6GI;UEz|BKDiLkNwxSK!5CNs~-B!3r)*|f4M)AgTnb>N?mACCE*(jr6` z>=AIbCg&tbox#|`u<G(u~$f^^- z`GRDc)^uct0TE8T1)R@^&yJ5+G&0Qz#5^+WOeEV%i^81ZIPoJ7Jk#_@$Vy#Gw6Q7w zepmxDEO?)lltmLO*-I$k#SEkUFh56)GP8KTwq*-1KmMoSA$B*Vd6N1;Ipe>A%RG*+ zuuu4eXwE_ao-9oMwdh<%NWoi#pR@3-jCT_b6*GX!n5$8V1RSmB!|FK}Ke}3D;>My6 zCp@dvE~zZ;tD9~+TkXA`c z!HFJ8O4oP6U~N`C4$fJeYP=?(%$JlMGX!7)63bJ@t2B6YTQJ7kX4G!KVfO0WB5@{? zHK2?yAmfmwVi%4JC?D|6IB3{Or*jnPV#8&C2U0|%DRj2&I z9qd8M)IPEMYqik^l`1Hi)}&wja4QHIr%sJ$Kn?W~P#{><#E@TW0P3_#jyqNF+D({A zDJT;@3ynY;Yk28hX;df!1CGag5m>2go?{L~n6&gzh#8xO2C5%p5u>+vfQv6DDKD8e z5;-AdiS0Ns;dEpG3tOB^i+EuOy$h8fFL6p`{qS9*;#4)f@g&)gj`1R=z7T@VKXSpT z5@lg=u>uule|05jLglBH)_QAxT7whx)E5y93zr?f2xH)+<{#-LH%{`TYiZ5UR}FqB zs1yhi=_HNg7kQJ5*TncU?zmNtiRDU`Ttnk!ikJ`p)k~xIxrB$P?+W?|+9j!El}qZw zI4cIE`4&C(MTzAi?3s4Tjj{uOf7a&?$seL4@2oSqu~zpGgcL1Z0SfMCZMse3+* z3L+!?8Yf+NH;n&O>A}zwV6f&XEg+^&^zzBkwqir7%9vR z1j7nEg4bOGNS^ryU77%M30Myvj|lQ3QB5QZ<7Z%l%0?i99i)DXVF zbm&3`*y4{2+}g4B%p<>@0q?r8sL05Qk_@r?v!QVKR_`;M3y(B{JJKMdSbEW2dseEk z3td13hY^FZ9sKxOwZJs#Cv+}Pf>*s&D!Y_YyE--aEqxK-tD;iV4k_ zti}O}39||kQQEB(BL`K*isU$%kn(^>nWn+(-N~#oG66S=h~6u&5pboo0>G&_LGx02 zp8qR) z40MX8XK#wQgcPg!8Y?aB6t%5{bn49nW>EfKgozY}T5+W1e_y7>*aT^46bsjY>$y+_ zLS~2)DsjugWU|9=LL#a4Rs$8h*q!HR(EV=23w(kpg1 z@BO#S2N?hIwAmRo*a|SBxpdD&GPLBBss>`1tt1^v$)!)Sx;A@{?D07h7d3Lz zP0Fas@duT(alr|sc#hw+@F}&R3ECqw;{v^JzI4?kqT$U~soS-{b5j(>wkRbm95`Ih$>uO>Qki2*UH1fct|Ngz8(DA51#xtn zz`AV`p`9^36WAAC2O(s0JQCR*s=uAcE1`Y=%3T#=&wmW4G2S9Ym{DA-Rpf&KD8-po zW6x@c&9L*-uRvo?3_>vYGB(MrFE}AEc!oICMpx80no5|Z?^MID{7>B`qq;Xz3=qjqGXHE9SP$g1D2pfd=!iTGN zHy$|d@5{a6OeUY8yh_OT7T!bpINDm-ALmjgT598{ItmU!=d5^jZ%bHGhZt`;D{e>4 zFSmtQVM%2`xdH%EMx@Z5NRkHL=o>kY2BexzP=&q$gsC}o2~ZUZ6~GL?1uk|O2#HH1 z@SrY!4$}YtKmbWZK~yq6>(ah90Sz0Kxvf-aJ0|kmNsy#)V@p}u3~`hinWTmo%LEgm z<5^n6O%)EMnsNzu?;ez+u?KhIIoFB|TiB0G=IScb(xsXr5f0J`$Gy*7VP$U2X>S?9 z8SY*Fpu##9oA&`PjUc=iJ)u)h2!lX?Ysb99eqc${rEOWb7A;X+B4kpdaxq|kZtDPP za>!4Z@?vjQS_RVhDEY!qX}WwVfow0?2#A=)cZ{~BFAx*YBkW>F#AamW7j-VSjEu;o zN-+g#=29vsv_6vLtxM^H#ys#zzTE{{?-DXb6mJEJHi{V$&rc%nUAhj095X~TLebYD zjd1i)NL{4AW3JJojT&$wilCO+7+v!wLN(N%p|Iv%=ek?!Lmr$crY1?8J_kBA#tP$L zQjkg$1yU8M@W)^~_^IEqtVbL{GdJbjz$w5-++L}ar0Kx3dg_sH*f+dUpDetq2H(E&gY?= zlEty+jKQ94F70_S8BSL?JUn|fu|*PYGfg2Z@Tm+;E*Zvux}KWZQ$--FK+!`08B3Ab zOh+CFghKErS^CTm!li5BOetQG1x3IaN24mf0=ht&6gZI$16*HAB%OPO5Da|&5kiYw z%;+0A!hC2AlaoyAy5$3j#R;@L!gj~Gp)Ib17rY!qQ_k+dtd*00enFy(*o0!|d4uMo zA0tb=QomWNeTDSj$l)(wQ}CgY8yTt>!J))i4+Mt}a2#>SmP%qSe2Pen&O}q3lgu#V z_@|cKB+=RsbXKPFjYhm)afuNq8+?Y$Fd`y@Bohv~KxVP6DUgwW&8ZrP!J`ndBThw! zj8YE@$1Yl2U>xfd_`aLV9MF&1H?+a`X+ zN|niqN*n}H#$7>)BV;P9m<^{q6ZBnK6us)*- z$~#3|QM~XZHm$0l?RJ{Dq9C;p{WC!YrXtLtmlIrS)J*hK3#d$ik4GM&fl+=vL1?@i z4=FlRjfZ>F+9AA??a>JN1NokwHCb#u3Db|IDFUvKrR;Rkn|fWqd;LYmFTf z>Nd5idZRHs*4|(Xnmg=@dLG(RSDrUheWy6AGTpCG?tJb$KrU5F>xIJ z@g~hFem`5(Kx8Y!A^UrCTi`^6rBDkCqe(~Z&=(I7r7h~;w2FFkwT_7g^K7u<9)vvd zsL=MvnS0b8eq`G}2(%6Z4@%zjQaY36Q+H+!k6bW@U^@(&w_g_)c=1e>o)SXaMxx{l z1OC;0cWt-)kRp1@X4JVO41F=sW^58DoD!xbVY7+KGEwQ&r@)Cwh>11%JOkYZ)_YKr zp9BH7@U%B*Q4#?WYc*wNmU%ruZvdzJ0n8$a z;%C&-Wgvm{@-wQ9U;>UoS>V!G)=(lqBO}lvl|{X|=qcB3`GE$-^r7?ASg}=nkUG;% z5P$I~M+aNKV6>oqrn@M{^Xif`5zqi=$=%{EWzR5UjNmDZ+*rMnU8Oa4+*M&zXn$=9 zg{l(hQz#3Ws>{Yg<{!9`SjNU&@=cKA(nhEvfAj-W9&h5LH`H(?gKX+Hk#&)Q@_`w8 z?!_YzyX zo@cs?lfKE4p^=mGj)4{v?KcJ|iA@%?_N!ltB92dz-dQNPTt~6^sv>n!AsP`jv}z!@ zcCr^vPuwTK)41(CVQPXfH)Pxzn8r-U$sGEWeb2dq)L(vQIhm3)^`Rx111`q}6ePKi zkc1IF*L4g~IBljolvmLcuHHh^Ge4KOV^sz^g2oJal^Vu5%EO$1bo%2_AKX9jlsyuz z^rVclEcOW-QGY+z1JNTO<|cVhfltqxEb&rUdMUjsIBqJc0}uxV1Rwc6)#N1l++w04<&*StdcdFDR6YIfbM{l z&uYv|l`08o2~`r1zD`8*Hhtz2JF{3E;~Z~Z2Mm%%1*-jwQo5Kx zhKe6~Q0*Go=hToeA7;r`&dq$pJAQ6JiWpogZ(H+LMpBHqAWYKBwx)i{D*$SNG-l+7 zAQot4fH9FmQ%tMPltXFDrs|yhs46(mlhwEjFl79xgGyiqT9%+*1&-AXRFko=EK{qZ zk5yPKFd0D7yd;Kq1TseDUo2YR$fk)TEsi@LPgX~aN00_e!aG_3;uR;762sf9RYWcE z0^q5bb2O7zr^dX`Fb>((OkQ8PH4nN-ws2E%DjT1S?apjLJ65Mf_C@%ywMNdcybh-=)CS1o}!L|xh@Lk3e^k%Lr9*`q!Rehd< zmMrj9s0}n6NI!>K)NmU7BrB*|f#oGloN?5^H#Iwv0(khHp{PEuaw?Ih0D~`5z)=59gvQf^GJGDmUIixAn9QVXG5AtdjC^{IOz73z<TLs=Bi(Qu zGA0%q_+TH99bMnn`r@r^`mXekz3S2qY^)77=#@*-vn5OxzUk)N!`5F+NebsHk(5zb z$4CKRVt4dg+Y9ULbZY_j%k)Y5Wp^u!w&6a(Q`yP2%eCKs6$HuITD4Y6RTD zRXf=Am8Bb-5Y!Nksx(O)yY}qlzz)GVU^-UzGDkJ9TrM}OxlvYAM7x9OOl{%lNNAzt zoDvRkdARKYG}&m*28!jWM6vTFd=Q6CKm}WYnJDLi-LM0GnsZqesJg?QHOe$L zuEdo<&M61>MQ2xeJINRW=$wtUZ*tBG@RQ~Nif03GYS*3s@C~!Sfrjk>pZ!n3MV6RU$u4rk&Vom2Fx;~F)> zxjHBJw&IU)p39A80*fr<-389KR@jGiVXy6)?nBLHpKO+X>vU<2^G{o%5k3`ZeQj}Y zNM)m`Py}`(2b{Aj(SMVu!$(rKkR&|padpc)PT9G&y|ii#D3t@=@V8ezr0ST1BdraF zvc3FpeevW}O>#T#kn7r}TOY=-vOW>Axx7HFfVEDyYMDNY%Em@#t}^y0>OC_iLEw4rds4D)Vp$Qj_&(-h5EGTKr1WP@>| zLLVmCPOY}$9i!DtBsCJ7I1Z&-2PtSb=$cZBaI6p}!iFuC0(x2u7SQ$25v$Hf4RjmFn94xDjRJ={V2N8q1U8T< za>}Th9q8el7iS1i3@!Tn6r|#iawYA{m3wt z=IL3JC7#bnB()BeXIk>6hekKWAGfV)>8t-O!7Sy68)6y77{)j_I=lSpE60E97w)s~ zAbTfPhvzd5fnyIBoYnS~Zy#}vnfBh|!rg~wzw+A$Z{KB}xE_127N?^o*p8QMBm9T2 zGmg2)86IbYh3~w1`geZm{_ZC23kIU!x{wZfrp{^NF=xN=+A-T2Gt_Z%#&LodzxI`* z19s@Q>BP0Cj|!*J=HZ9uUw`!^gQTRebLGkU;>T7}?MjVJRmezc_Srt-%pOKNE;vo@ z;>&+moLOvvB)#!(h2($bO^@Ws!6WEH_%`B+Y=?y0nxN}SCD z5ar1ElfU=vqyO!f?rmbM`IWklKCDp5HSjJk505W76Ouis4P`TGHGlEh7gol=6JZis zcM0A)Vo=CEjX0s?YpI%n(gh?SJRQdAJ8?^_SpM;8@1Z2bM(XaDG5?S1XL$Cf^=7T`t7vV$dV$vwKM$U$FrFe3^nHE8&!aL_o3$p;)S<&?w$R@Z$A9?8>et>Q!DQ& z(P)MW^VZ$dZ@=Z6P0Sn1^o46nKl<_-@j)&rMUR)1pcTDbi9Gs`dCRN3Rs zd=?fsf`wCa>{QsX%3kh3y!{s%FNAO2yWn*Ka5CqBrDul=pL%{JHuN~Q zx=1z;B zz0fb;c}T%37i`lAJi9jd>=wpHv7J;6*j(-@scPY|=Q%~0FWeZua2@?jI{;}nUc2YZ z0U5z9wPkH(@iW`Y7QvWKDkTNV7V$?hn@EcqVgC7RgJ*X<&1T9e+~op$l~cpP!VfW+ zAG@{u@+~CO0jLqkLl!{z(OY=_=rcs2;$+`h&sBXvkOg(hNiT9XG4J+e;&3n|ap zS9^yuY1G=Z)2zvP-}{N>M1V6wHg|5=_0OT#@;KbzQzJeB9Efwmd4p?i+&v3U8My@I z^!T8-lcmdxjjih&+jGISJWdYT*IJ!nSi{)b%F4=`FO<`at0MlE9zM9&I8XB`GgnK> zrrehYK%s5k{@GM`u(|taNjdqZWzCk}95S@JzI_!lYNV?iHkS*R+t+U88JcAtNtccf zIDV>Z5L%G4we6jiRo+pceK-?-SCt+}SAOxaMJMlN7fm{ay--nsE?^fZkRBJCMx0`+pS z(>VuPa=v08GR6`$ink+Fu0>8bA~0jKef^o-O@l*&jeNYnH(#zX+z;D}Smk;TkLq0I zLRMx~=qDtov^|2_@7$QT3;Ixgp9XGW+G~CM^M7LV+Rd;2<}WgKw7vV>$;m#4JEc~2 z%;%BK%@`-PbUw`GZ1@(JUjEb%uB>f*<9GiRtzV0frX%Wu;<+k(lIrTapt>6~=S8r! zINR;Jb2vxcEOMG32Us&wV$Pkd$*FoL9Ai+HqRZ(uA4tfi(QG-+FcNP#X?J~?=m}0w zFX+0{vszI>V$KV)6}L2JR7uqlXzzZ0Ddnjr#nCnJBp@?1j619>58$Ux(*d1|goQ*m zd~$M*X?T2o!Kn%!m2i?po#}cJSlm=U=wZg{r-@iRc)|@sr0inNAAK8~w0E;eid}eo zM!Q5$MvLGPz*spxoNi7oV?8*iHtgn+7M|l?mOPY&fkSrEX3!4&<(2H&9%hh~!N{{S zJ7YMfV*?-Xn6Dgi6P`iGQ!bp_ypjQ;p*>Z{P^ie_FS`x9Z@`cezQC&{$-gYie1P%rf@*PKTSK`_>GQ|fo#Qr8DzF%My9{Mh6eIso#@R6;iD0;eS=cf=&;6me99 zSs@z=IOE_1ObN_aI<*%bNHG8phovB-I@gb+$OSQP1?K&HlWgFTjd=WFMDmuL$SsL%k5 zhj&%7G6!Vt!2#s8BH+o&#HN(_Iq-x<=V7eHry7qDmv$%$o^T9Gs^R+X%|G*>{WZ?^ z`|V%;zwW>L22Bq~xh!xzi-VK->#`zq*cdMlH9ZF25$0FxMDj+D7wW6%sr5e4hpx%Q~BpQpP7IH-QdHVHD^Ax(LRC-+kqQ&73T#feOFUW20K^5)4PBS^Ns!y zoCiASGX0#^6m?W)s*2nbs@Ho{0RQH&MuZkUolbWPNk%(?9$Z zuYB#_?Csqdh4;daBuP-+js-4rl>6rH-u-tkFHS!8*)Q$heEzFn{v{4Y>N4(ux_}S% z`}D>pVKg;>UwKBvdW=hevEr!!Vp~{JDOI~CWqW2+Q~iA~p&y%?OsHS2>d`{*63fYB zHj5lB!)U;%Qz@;np=-AbWT}$TK9P(d3^9*1;QVfe1$Z5bE|6sA0PfY`QI%yUzE=j@?0k}`At3k=p(jAd zFPvKgR1429`OR}F9>}F6U987w#=$&mqfrHJ>8Db91+(s~G7jKe?NUZ9I?PNECj*Y& ziDXncl>v1AYkFf$vX;e%QT0=0L6X(xV4$gzM??G~HZH-4jEC5>UY7zp|RN9I(7N747-PsTZUCxx8je=IXCYgtx{k6@iD0dgZK%14n)JaSRv=yujO37+zP z1TWUE5q?^!S;(=FG0r0=t=d@Ztapt0Cj%crJXTU4t=_3}y5+0g1m{Eg*weEni``tkP$pIVxT&a)pjwp zir!%UkH?PtJHQYA8`PFBjY9fExKDF$^Q&#ZJ%89McDP}a&VkOV^&c6-fTWu&PJ#u@ zJlk)24~Ku~hD>SlL=$YslDkqCQI6_h@W}>$z%p+zSY{Azg%Q&M3llkTPcoW(Oem~T zZ8pa9vHb{y{QQ#Dei>?_qpiUYbJYUKAd?>trJf-t<79A>&W+!4Vb9JIu_0id&v;k9 zU<;`s>YT#P^4ZwusP-&NkJNbV0Mw2q>DTS@Teb|ra@HdwyD6Pz3d{2qtBfFXZG&rC z2PbBLsMLr{%+nN&x`z?3DRCDQSnP7nQY&mhUNz91JYyQ77L;GaRi+sIT8CtT^0lO? zWX>C5_F?q1Cx8l)SIJA0VO>A@Qezl}%@{c>Wkl8zQZs7WI_9u3Ypf{X=)?)^R_6mc zbxCSukY@m`y&2yf5~A5uY9SFEI)seX>&W!wDYhTxD(_>D0EaCK61G$HWUyd44C0~lQ{Nsn zxPy$&<^mfCGWeDw;J`9??*X1H>#{0Z4^luNv;l92kg@Ty+A_te@p_eVBKRop+@`{g zg&9cZKC=`%H3Ockb|@WW-xUl)z$b7|MDzqWb4fl_aKKbVG(v8Xa&E5gCvXh-{UpD# zCcZx~-ugN*-zzfd9UGgp&a=8j9*h-b(v3;dm{b(R@=%pJ?#ku}zM zLB-m~Q-LupK*Bm%TOF>i57t(O>#GCiUbWKb<`=xjY)44+c^*j>gy$eJ8nT8TjXP zryWSTA$vjkzY8bR=?*de2&boHg4;QFXN@B%{W|oRsjSySP@EIn2*ZJZ+Rt>f&MbQ} zIO?)f!ZOj=$owhzSP6^{f}Y9lHY=UJ6MMo;9Z9T_6L47#$yYj#+S<`4#%aC2%$;|1Ss{E0_7tTY~rRCqBP$zAI~q2-~qLC!){b(YZO?c zuB-In)!_6?@D0zdbKnVbDS|eiW>Zo@1`f-mu=c_^CNLibIPfW}scs|CF<)g{kEe?q zc!HLfctUw7(2wv{6*aOcM@ol9DQJco%9`YEeR9*s7;d~)@_f2M;i2bMR)DZPW5_y? z_8b|n&RHkmLP-|AdIT#~pTXf&49rCNpW`f29*L;Mwq z46ytoa|9%$w3(@%107_mE6OPs9@3EY+(hrlkAlby;*nEpSpB?LGN^A&gbnLra}+f$ zOE^s>Vj8R-x+CoAX<4j3?H)jD%oU1(=V@^G^TD5wFE&p`Cn}uhVVF-03i=FvV+O7| zzPga9U$oJMJPw?~@(sO5gcV=-u5ghQ`r<$`)>&RHX{K66YNY%gD=CuoYPTGt_PN|p zzUXmGjqvU3^?c^-ynMB+8U_vZm<2T;&!wNPFjc=E!A#1i=Nv)lw5|fTc7d5)+sCFxw%{SgF4tE%~`ydD*IRhp*}eno5aA!LQ<2c9dQ%#qrsm@O zl3wuq>)$>3pa0>#x9^-G)b8fefASOCKli7$9T=ox2H9z4grxtqXMS*W{tLgk_rL#( zhc4b+T=?X3%m2+!?|k9Y>)I%>B~$JZHvD||t<%5#Pagcvw+=Bk*H;(+{Euz?+@IOm zV3AfY~u^AH_utS$ZI53c`Le{OeoD}2CBUq)6!KTi6M-#`4@|MbD#2bxxV#PD-Jx%=n7 zu&!3@-c*k0vVw(r@z$NQzyE6w{^4)!qelK-x;FU17yaPY{>VNC;;1EeSh{={_50sH zJ2=%gy>)%{FaC$0_>cbV%Z?l~+$6FoEFu40-o1bLi~r)4fAlM_9Pu&j<-!lVwDMp6 zx$Vz?lrN>GDu5N{~$)@0^hk0{`3#6{k5OI z_RKZbYY1KRDN%HDaex2fAOH5l|Kr#8-hII2{N=5U#m~ODvcnh0Sjv+Qrm#&P99;l@ z@4(^aXLkpG;ZJV<%$K&V^QpT}ky^=rb%LbtJ~;h_FYo_@-`aokE;I9&x3&hKdUmk6 z>SxiStMBGWht63}`mJ})-hRLU^5W*^!k_=r*3bU?+s|IBHM1~Z#P-DaA0A%(^1t5y zKYwlSwcGM~b93oa&knDxV;ifv4!Hed)nS)^_ubR)-_!c$^Z!5dLu=^#6VI*kM09GA zB~ntXSbKax_V@q!-XFYvj2ij+`%}-ZJiF~T*Auo{;C=mDynOBU`FCz(pI`Dc{Mct! z|BIj6{@h1av0SZ;sk;rFNBVr>-+c4v=l|J*uY8yH%7u-Ug-_gCejy(l`L;Oekd%LK z-ar55+oy=kEuV`2!1F7+Yixj49eae8Rm$9M6&HpR!iHg@1T;GKNkuZ`K_ z(%#*-PEHP)D|nSOt8PY(?7gtOe0oCp-#I%wK}XALo7=n3`1)^w&Y@pkUERC;=E>o{qAf0L z?L51@zRpsgImGlfyjs!7+`C zPnFNr-rcuPPmd$%(zRz_v}k7^QPL|ZYTSz&ugHFGHXk&w&nq4!Pa`sVwt9kaIbSu< z)L-Mq8`YmAGqtf1eXyUWXH6DgHf)b`kEJLAu8*bcvg*2#?*2XgCLf;4LqE<7#>M5r@$tnQcTX8$pgo3UYi;<6kF5Ua=QkE;Z|xl5oogzA7T@I? zx6l8{m-j)=Aj$&Y=l<}g*RS*auMTQ^qs`M{ZhuFZ{=PrSVQ!+-2~ z$I4{Jj=?ObEH*A@dk;@u`0Y2=*M@u>#LCB;JA)tj^!iKBVyX1ZggB27-@Y)jwX?Q# zZ^edxV|DQIv&&!j94)d&v#`17ftibi2m5Eg|DBVS;ek`$TA#zueQfOuNDAjtb|oIp z>4~;Bk8kZB&^a-F$wnkEJ+tzK&u(lo3MXxsq$FKfz$pL2*H6}$2aF^EzP&#D>_^xB z_~+LH4sp>}2kx-z`r6X1-#OreB#1XwmR`8A{3AcGc72CEAR=k;1Gt*G+&?^j>)r*X z$-`xK^I?mY;iq0&`Qvbo;S6O1_sNx>54ztu{#Rc;#2zBR(XoZaSMQvE{moORs(Y2B zL@lnJjloB64H_G7DG_)H`nS9>^T&~CWAbbSj+eSM&eK5}yi@eL{ry!4!_MwRnm|NNDA&Zsbh z0cIBQei8hyzjt>3q1yrXu9#mRF1~b&;Z#S+uzXoN@%)YDFaE&VGdI~dsvFNBl{z8C z<(<9rKX~|iu9l)D+PQUWq(~Z@r{lekQxA!jJeD#*pDkk9Wf!M`?ZEOtg~D5I~xdB&Ii9VeP6o`tY9xV5wT!Zn7u6F}Bf_=A&s5AUBG z>^a!xnr+-j|9muUl`_|QZCluXa2rE}c5Ph7Fn&pYyuk;yj&G7chR!kl4)^>#&$+v#Bvm`u&_|fX=zPXulyC1o8?LC0)TaTK-2UF(GpwR{Zgp*I zWo?~8QiZ<9EgtRNJvg|JnL9%c$zX%8?BztYDCzmx;ohC&L(C z_#S-!;hnkGDkk3UjpwW`fU6oN%`W!tyfGIX3O;$=x^_!iIH$HQ4vr7^Fc#;7Q(-oD z2TlQ)!ZKZ0+`IQqvs?`tb9Pw6?Q738om*c9EIHb{_cmXGkI^+RoNsLI3|H3xtpTlB zn)e?v^RQeA6}?5kIh8u8BD=n;2pTqYkD+LU@AK#BS(7DUJuNV2F;{&`ogHJhsiN1& zSX8`KPxMN{|0^j&{(&!nkFi5-^JRw70{@)fvjI*o)wnS;p4Ej5rlF{u%!516LbDYk zfq6*>19*Owp<~-+a*hVk);lZb7u?QTx_qwaArwurGz2`rG}Mc$D@!YG+nIwW|3+n5UycM%FDx ztm3>=DQ0Kp2NBq{fNZhJ;zmb2v7s~U0cMkwo&ps*z0Ig1(#d=##BCzn*^U;m+(=U9 zlo^G^@df?Lxi9s2AY!`B{<;?vk5l7-I39{6!H4s7YfM3s24wKZBo%=PAEYH5hsD1- zynrP{AdX394R{rf(*Qv&&ds=!1>(3YmDg@JGgq+~ewlqPa;bF|9kDW{uqc0(Rg*MT z!201w>~a+jEd?YxJq8Q>HrXQpzAPhR5mU{i!bllt4Ozc+DK(O2$xRa}DZu5Y$h`6w zCY;&UGLQpBB+IM^aG1&Rk&ALk;jAqBvHNq+IQXZ|qbqjV#3bu9Lo$tQh9bB?O=&VL zgr&g^3{%gYu{XEof(_?5)dIuF=mUaf5s9n-W%I$1L6jl&i^n0aSi>dWbI3?tNk7K6 z5+#M{%#)NpL_A8=3a5hM8?N%GcHqoGQ`Ur2pgs}mg5*?wcRNyfV~#{{PQFN|G0BQd zo`0(xI(JY@dhkm~eiWZqrz-s=HvWM_5i&OuNypHs5RnMRc|fs*(TrO#I^FNOUezv3 zpo3y zA{upd()n#?qEP@s-a&v9}-Eh?;}o10}OWjYm12?1^+JL%FA zIZHTl(3l&NPPQ+h;E7R6nL%lDO#BhfhwSTFEDu*zG9yssni^f@G$C=HwlUX(j%wY9 z%r;weKP`u3@SnCyA#LR%a!EWUT2oU05RFBJw^RZVqE3<*Lh(IKT%lJfzQsQJ2Y8GF zI%CMp%C|cf{LwJr_l7)MB?}O@u$Gp@b|Zc~JiSyxI^Pf{Nds)DFnzE&ZEu(fhmwwk zE3G~mScAJ-lELev4^t1*^joJY( zodb?ZfD1m#jF_x8MKp!kNVYaTt-Pm8o7O)u4$3 zgA(%J$hA8XCsfU051D_fjiqp|GLSsv&qB7UVEuFF;zq)(yv9vA;tbUsMz8i}>4{LN zA_>`Dh2i-kAIH3@gBtUqY0eN8e}~>OYClB562b}|KqF9{wXHbEv?Bvw2YGb3mP`d+ zPeupruhl1NDCGfz&h0~~_9`clLhz?miVX`W1!#q7lC?U+9gj*WZ!8N!jo>OvRtWXM zpB699svJH@>HCM=SOF?e*(*D5Ml&Q$td-5$npaLdWh(WYxK5cC4hA%P`Gs9qMc}YH zNtyQm+b?w?fmbiyO5m@uCnS}>x5lK4lPI-LLBm6m8rOS@vaTYiO0zO;an=(PGU+g2 zrL5c$CE0kJkV)FyA+-q^s`hi%AAm0v{{ zf65txK0_=W8C8l3nM;p&70b2o!_zD{Q2nE&Xb{Vq&6KxhHRS@AOwFRe!_OS>dO)NJ zR3%8NmUapo*bo!UuL`VNJTqcS6BIA;`+68~6HXy}OMNv3zep#v#D>fnRSh67pgf-v z+Nek`a&a|7;y5j@u{({N_tR0-)wd8V=_hXD3 z_aKZxlL0MPu1Jzxl^Ab0XOW)0y|3K7welF+cRJH(7iu?%3dp4#Y;%jG+GM`Z)6+xm z%&!da7h*he6NlyoXP8wP45pWbC8!DHre;eD*iRXy0#u!;w{}z) zPAdV@yyBD4IbZs?_=@Af|fHTQw^hmkeLQ z2JxCW!l^CmhDl}|8bUKlXqh;`2DvHKjN!^|fdZVGnlgm|HHOqnHsA2fd0%`X5_o$VG7@@ ziPsR6zOo2^=0~W^Q(mbvYAMf!FLH8Rj6_s#q#Sd})O+~xDTG-W3uYmc1r815k5N&B zB@@j2qty~X%HAny-9XndiAO+YgnLdVJz)q6L)Bn>V?PxkuC+-xL&WsQzxwrO+;JrYJb7c~ z+RKZy$n0Hqbo=b!_SxxS*v<3Pq$Vk;`h)!QbwaB% z#3qnlr?A!frEu$QxT40cvZA*ANibKQrZ7K7Hs&>jtcDZ)I4|*x(M=PK=&u3?A%8&& zQ7{{0iD@&uw6(J zdM!6iY)#g*GD*6e^e6)IKj3*DsGU9%jJD-mF`3b%ESQ<7Q@lc^U8iVgGjzaYeiKB~pfvkjuy1|vrp@n#%IYM4)U72Y(1HED8VN?D?a z7q34@jpa!7@O+B>i1 zRU~+T51D~XIFRv0NYP9ZhGsbjB?W9%lX+33HMMM-vehn8W0NI5Tq|`w1ECwc2oqMr zDNtgA+hjICYI3nB^QBF3{D*_6I5pZVDEBc}Ov$25I6$Hoc;O6-mg_Dv-GT@$6DBKG zfFaBI)`VHKJS(>_21qgJkN=t&Aey;sm}_p#2n?=`#SXB#)k;mOrewL-KkZ;bIQiF; zWCqmjH1*g$P~!t#+)n7Qqa4Sn+{6BS{4oU5A)5^QoF+{M!^(1HGFLq~|1+6USEFVn zEww0Mmt>r^S$c6HEh2uyoA-p2AYIPww_y9L+2p1|rignA|=MqdO_^|IQQ^nzbU#KN)@=B3OmB=xQj;0W#RhX*jYT&83r)Nz@PFe)o1cjtQ z%^-Bs$(TH?sqJclqLx+~jRVqpNnThJI-9SR$>w`L%~herxLh#fNypFECcxoy1v3MJ zic%v+#R#`j=p@3?5Y}(}8Pwrn$b+XGHe0xwS1KgIlf=XlKo>nAvZL&Ui~?}7(Gg4C zb%(;LBIpAxB~V;?YG@fe1sPAzNugCPV2u+)XR857@(Cl}m4njxZkP*}G|^1sJomEH zxu^wt(=@1RBal=kDyPU=(emDs%XOHjTq?sz#v(y7hESpTFMr&n-S>_xK58>Ke&1h}ds!dD@q;iBR^yM)b4{UacWJFfjT zC=Q_9CJAhOE$7+?!*K{(#}au1Upg^f)`-wpUj!S0NMge-2@th z$|TG3B`++O^VL;*vF|qe!*vTWD`@9sN zHauiO2F12C*4axM|8OQGL3x580y2^&P<-RUMN*nNj^DhfNI><>trTOvEyY=ldG6iAkLHhg^ zTl2xI=Y`BP`41;uNf|Qb!X714%#5-?ig}zju^J~#vZR1WUQ$ni16NHZss^npfDpNz zCWc|qVrqewVpNQ9GKX`b#%l-(sy)8~yhJn4D@2=N=R*pB&vNl7NNVEfIqwM|tMctq zjDDf1zZN82(+S}ttWk;&?0b6FWU*T#U9d@s`!8ZlN)l7?5#lv_+TVnREzcvLT+nusoeiJ^LtXY^j7xFua1e1Y3}I%K?Bp9W zB#ATs(2GJkGKcfDCvcGfk~Ba_aK#-#rbXbA6i%u>Llin<^D7I{Mc9`a_+mUz0Lxz@ zW$wlXfHTHq#9*GWYr8Bp*a8n5T)Ydt%J3FgKxHN`*CVRFg35IH zfdXF!&eTR4+KNG9f>CRqf$6K%%vTFWCaeXO!fOZ1ufR=>WF7_8*jU(>0ktsh3`(Lz zL?4yV>{`}cCa~o)TRDlC@=!*V3fFWqyhn%58*>N(H>U0gAWpb=A#)L?&^MDM3>4zvBe|$?)R>x)pn8YtAXXm*!IV-EkyFDuvt!8H6S{PT>I1~PvAJVGy&|; zI`G`jB{xB0DV3V(t^jM|6tuSzS5=4iFfUso%s7*aY?2UEHU`cGw+0msGS16;CWrSB zkf-Vj`kwiC!qNJ?Esx-!3kewy2)?`s60WhJpc?%*?d5q-bQPXy`bGuYhhVb z2Zj>q6@TRT7HhB71|SJ6Xzp>%MJT}e)k+5Lbl2mCNoH>EMyH0n-sFAA8K%gt0G5_gg{wkTDm1hHF6X<=iw~oaFo!hhSE>h z*;r&%z2HL{Z+f|k%dz|9mr&$Y*^AU1%P1*fmri#?4l@=+-c`&;ozA+bXG|?=h>H`& z41j8(biCrKpCCdF5>_Pxe7gM^?kBSh+Zw|4OhgXzkkv{mlL1eG!-H&0b2$OpCk9Ox zZ2{oQ+G1^2C1VhZBoR>-rsYXcWiSCdbwi>QFR6G)DX3zbPBaxj>Oxj)5W_=GW~r%Q=4|Nl|909V?kK zI%l_bw&7$r!gFY}%jDa>p9ZwAaY(O4gW5c|2IXPu@#QDC`Ll*hxWxs~h(d)}@a+10 zbbNNo`HAOezSW|Ne%KTd6$b3n)04Al3!L}NTNykFkkWJ3Q`4M% z>?k88p`fV&?MYDU)O;W)fO!qCw3V?E8 z<6_y3jmT~eIOV^X(<6~M52+_@`e2ct`!9*y_qch1L3cPgm&_A5sSN1<>_iQ8oHQAz z5@;_QBPb>>ig|-VGtkl`SZjJxpE|`-Eu|TjWn*b`s1JYSHLV!-N#yjVRg(EKVdG%cWUwudE)@Qft*q)xrOvjLA?Yu~ z@Y$AcLgZ8QvSf`wJ0kU@@j&k`NmNFO`7ce#xl|3GNWknwO#Ifa#>9s*1u#Ka=)l=L zdt*~+X8K?Upi9arWbI;u5Ryuf+6jQX&zF?Xv_$kTu(D6{o_b%eOJnd-5=*lMS(13~ zE2t$cz@&4!sgS+$DwHx(D|6IB(keqS3STwa4Dd4vEQJf~)pYC8WSo)}oZhQdmp+wz zBvvNpj*DnJqD?ex}buHJ@|ZKJkHurBV%y@P8r}OABb$32^)lh*V;}qIcyzM!UM?vyvj*6lufQeMOIm|#)e=W|N_VnW&Va-YU zeuJK#HCgPwznSg{Q5~1ol`(;TJa*harh_Yj$0#1@ja}izR)8IGJw7;fn^dXg4z0&u z7aCQ9IW*607i~>AT_X*N{;rYAlUC)ME4?7r55f^a7Cxb=w~-Xw(6`4*Ylfcb{4>fyHM?5y-9OTBl!GU$Fp3{2W4&5- z&|9y3U0HnY+VI-u(*BXM^+kkA$%)MlH&z#3zeD!IVzyy=iUzW&$;LVrXSYiMN#<}G zVSZ-L{^ZZ?EbSdR&m?o|9`!O}=Aw9n{ zJhTTFc-*bCFX>?M)w`If_WW21^u<>tlS zFDy{p9NqNBy;wb%Ts5Kz49|=22G*^>r^v`Daxr%3qe1+_()CR@SKog&hSNCT%%?6b za5T}KgG)~Ff%ztHagN5-dASA--<NDGXdLaURkO*9I@&9AfKr#QAk2TXyna+&jK_ z`+-y2L{kBtzczf~8pkz_h~30Nvvs($xk4-V`k^;Aw(R%0yt25xJ6u`DG`8+pCZmLG z0DgLMl(MGgfiYO!SRX8}%qbxlWiRs8b>5uZyDT{j*j9UKc)rG)-vr~{TwboMZ(`jq zEFJh1SVl`6Dzh|L@g-r#!7bZ#AD(A}aqAwtWUQ<&?Vhc$xAqJ=N1L!C7rS9E9$0#9 zrW=fUn5*KB=b<)uTpY%B?Jo*jVTaf&C0$-#9xR{HMvLTQHbhcR-(i>F8EoqL%I5a@ z>5);Yl7bp6Z)_}~#?+p1K7`}+ht>7t!+nV5$Blj|hikkRO;Oe@kx)rll2WECJM8~3 zr;N;B@FSoqjc35DE^eaC^*NkVMr#{#afFP?14*d?D2kq7CIQVFWqQg>Rm7xJ*cxqh zb9XpgOM5ZRz6aB;tjaf4H=jOo{?G=C4(5SVE7?k&!-pC;&GdldmUfnht2{AN&;+ok zVYs@!5H(ipkYjnauFbcbIizZRlLrs|j6IT5sPFf7n!C9;=-1-0c1+B4C)_wtszDFj zgvdqHQ(7<}g>Dom#)s#g25w=x{O04I{}Y?nZhrMQf03SKd-u7Mll|j^{fP>Pe5quU zfy(ED9G540>E%!TAkXGEe)rdx*vhYSJxv$Te!HYo!B2dfoSBxzkeEP-ZwVX!dx!XLfMem%cqn5WHUVMjBSeWM=z|8QIAKiZLnT=H* zniURH<{42m28S3iJUPBRI6D3At9x(0v(M-h2FJ$g;-_95ZmqgB&P|wOg339=IT_oy zvv>CGw@wd_t&HrZ{=&`SM{cpdkOy|7fi_eM=S~wl%J|xyv)A6uYcxlOY%G23+2w0n zaA7wFHOd2r#-CSJk~}y(|K2+u!hvPLJ~%I2U;gN`%jA-cvVn&z5^hf7W3>5%&e@fupto# zGnQIZyG9`gOrKo7`{3f0cTO0~By@Fk@gp~upS$4(i_imJ)rscMF`09YPPzErJEw2l zW(?7h%C+Ui8=LOIZUI}KU3HQn{Rd}@a6;j6e){(2@MAA-f8_a1wlSv*OUG@;PVHb= z5p(n4@a*+B_P+o2q39gMx4ytpI@lk44#W=MOlJeHb%7D%pwuPj8NL!p$(n_(MyaN3-s{x^7Y%Nuf1c1!I~xK-HoL!_nAivvEX4P3X!Et4joeLbZhY9jpg-KH>C>aRsjAxo_BGHVfX!aPhY=t3g?9I0sihP`b2XIIPU8H`0Vn* zp`)H?4CC^pn?uy%F)%(vO)V6cgFYNsb#nRrJEznx&KuO$Us~K=S-#dHtoipkH;7G)wJ3e$HWsKMd9AUA) zIZ6~2bG-O7JHwB0%;P4zU3t7vJx4sE7~lL+VQ%l8b4cmEhn_PI`o{9&Hda>a9!ALJ zqZQgaynJxXXsH1_ZoBJC92V6KCm$mnrlif;((vG9>2&4#kN<_g%4v%K`d9z&!v}ZK zAng=`tu$JB(E+9_R4UBzK9pr*()n|?9(yW`5fm4>q9P_6j`n?`%y+5qUN@G}9C})U)8m74j1?mnS5`L$E32u6)5Mj>+1b%4 zC*`O@0?;+R$(2JYn$Z_bdFRcB_pX)o;mUez5F5**AJmCX&`g2T>SNbL(h<$1?~?Ng zPftAJk8sX_QH_s~^c>oK-pb${0Ws;2bgo(|7j)>EK!7uew7kmcHID>mdSsuHidq(; zMvl^%U!-J@0jC;iqHF;MD;wLkTvs_(qCc&aD6djMS)AjlqefxH+y?`M&W(p5!>-qcpuBT$|!nscklkYoDur5&;Ie;e9um09A(wJ}UK1acD1QQh|f63Ph+qvd% zZM%(K=jdHu{?zBu%r}1T$*jpP;rsv1psKINF{;=JoMSvVIhtcv*gJg4q%99Ly%a5t z6IJxGnte#-2op_1n0M1h4uEm1#k94~;>4O{?8<>O9c`vi(0fdarl-3hrr8INUIEjS z;j|3D(5E`Au}X`~MwQD;Ys<@PYuY!^lPkS1-3MLf(J?b(%!)C9WKR%1VuA=xj}9w5 z_v8!yDO1nPKhj@mi^w_s6Po9WIoUWTeUr2qd~gM^gG{N7#KS)48q2nNGXat^37;Xn^i6Q#mXPM)B98KHhIDLI}xaElb$ zOZFvQHH_-WMC}(jw|A4La6)mi67iOjI-)gShLof57PIgv{1DlQmjZYc*BL z1l&3m{2?*|SLwl4Mis&I0zlZN-T|I6Ci7Jn7eZUm3)6J&Gg}_*(AeIw=A2*MtIH!h=6_1|h{=x>ObC$$mS?v7# zb1GIZ=%c_h;@HQ1w4}=V*x<>d5p|!;yS})j*!9YxxnJMh{^V~Uhncj zDHx-*rAzj`P_<8dV{OHOz{#ciPXzBGWXaBlNp=_P#M1 z;Mg~TJegwwJ9AF$0M9?-X$1RWWjj%OO{g5zqVKdP;2|@ejJ8qnh&E^keH)Y)%lHyf zb^zSeo72_-V`e!ZlHo(mmWYVajDO6ASaSBA^u#1amcxVdKRa+zlm`j46lEB)MK((; zlR{fx{NfzVqX+ZyY>9{`^E|`C82Cm+E-X%ZeP3lY4cH!)(P__(D8TdiJM1itm4bDw zk;s6C0eAzXOcOkOr|TrDQ$DIjb{!tmZ@USo^szi3z@Wh}3?*HfrWSVZ&qOQ*7czp$B{_T%SEj)XtP^c4<$8gZ-)L1khd*-7?ZBTGj zY&t;Y#b#wPC~7$|3n~Ru##-VwnnyF>Sg1zekrLBbs1WA`z2!s}jZ10sTGjb3I%CaR z_JC`OdGx}xprZhit)L~!%&;BJD}t}Zh%$Q= zLw}s$VDLi_?$n;jU}7eLRtQ4ssU!T8BjH>b0arCrPP$+x>13wLPZ=XF!;rqX7d%=_ z*5D8SF;7X(*p?=_4{ww3GwzGF53t(#tW243;2c%(N2)eF&R*baqDzY?3?@j9Qi$ZU z1S!B2?H>CP7q*3uAQ=S9sK3W`GWx{a+XR1mk|Jg|0se6Wu!uYkU1;7GF)`jQ=ainu z<|P^W_^eyh-wycOQ42i3E%3*e@zIpFB9C-YQ>vuR!KeoI>H`FUxeeMFX3_MNp_39f z@_Zx*Z;Rl`S(9&zjS1pX^t8;=88GcL0rf6!!AAS0P?_MXRji0bhEGtN4XxHpH`L){ zJjGrUjVSB{?e}i9@bI)cq<_`y&;oGi#jFo~HLi?7`dJeqEMvMMy99LJSg6v|b;C&F zV1%5U_=R1&;N``o6SgEWgg%LZM#jBZDNGbXt3RUf@E!oGH&z{%mqJzlE##eP(@R-Gf$$6Bl3au(BR7m7wj)tB!g^ReTT^7(f`V>D2nO4k7&`O>bp+A+F zl#RsYj%+;!ZvKp%!YM$`))m2ItbPT~HJ+D)i%}LZxk{zRyf%pj4uaufSbo9nq)--; z!=tew<;eMjm`^>z15F1rH(ci>Eal(rqb|1Z)i? zRWoLb+vuB{Bo$>Aw;@ilHY4~MKfH7)kgJN-2_{GQbhjPV=p= zUn$Kz=DBk$j`i#)6qj{=_&{?5HF*T57m0*zvf zuBPZN@gP%`_Q|;?XHCL33P>xf1c>2Zr;LSra>D(l7^M990 zBL#aSz%heNoG$*kn@gYgz%m~OWN0njv;MTWu2(&AN$>aWo&4VGERZlB^TR&;{4z7& z>0h0~g~cG61{tGbyw2M{IQzX@$8X%_3wzQ(b!G8m?_b_nW30e&H4=pwE|@b%PeV6z zd*|e9uO72n02`L~r!PIXz&uW0zUQSOAnC<;bM2c!CbWI?wWHVXF(gN?a?VVzkH3F~ zSzL}#IzT1ofMce>4-16vJv{!}YsdSHfS%7Whvb7dnA*7H8#nC(nvX+xc*%a!HjmcW`??$H#8(?&M`UqaX`&?|*9P#phSn;XH5jqFt$d zImn#6!_!yqoPP5)Ue_xT2GCPin0%JODUqYZFb}JUfPH^=mzB;80y+`x2 z?0w7I8;^1}xoaDmlHuDE|M2V?c~6;5c>dsk zeVZI0zPhofe$FBAZ3XWsVS-#hue?;f)vgt0bKWr4_z ztwlJAmgJZ;qHhJDBrp#W=D7y#+SdF>o(s4IMgtyn_z?W;3{}5*|KwY@j_y8m;SoXC zHs-H5g*OVxp+_beguNGV7Kszc#84IwZ8|A)mYbhrE-VFLALExwdVYRoWBvv!8J09& zI%_qY+x=;Qp_99NnEIxeyPaDr3rw74`mCg*gIR#Q z{FrEacb8{5nStu+m4&No8T&9-#vHL3V+NdTB9o|-8%ql}wicNB8Q{uOE-i|cr+Y_d zw|AVa!7cUT+WG>*(pDsR44fMzr5qwGsel5{*ESY5VWuNgW(%2>kWY>79xWVYg$4yi zdX}=RZL+8Wzz*n-m@zfXtKz@)~*gFPo1K)`~U z%$p>A5NFWO0e-+tHK%j{zPtjxW2hbC*qP@B=JxFGF~76A3Fgef&upce+Wg7!!QsI^ zjSV+UKVgB0(_&^SQ5*a0aDV^ggtku6SlR+NdB~oURAClQPYw?b_I>`d<5*bT*mRC< zvUC>z^G64JOtfrjR8m%(w2o&?OmF6SN$s^`AP+M@TYnv<~O7_f>bYbD>aG!aTl}D7H^-U&a(i-9Va^j5+fO*!v z>;PVYOhsWbWChMRA`-bNu~0nAuWxVBx?d>i+}y$5!xJaYT349cs-&~z1Pnk%Vh#=- zW(o)F%&%{3JBe)u9}#6?fw_6d$A@|7oJsT~JbNAHLOtZE`XVkzb#urJvFg`6>n0dn z&c+(Xe+So3&YCQCGX&wKtye_gW?Yh%^W&ZaQM$&S=oR-u%2A{XO4Eqov93&+hKZJJ zV{QJYe{l1^`}0qw6%Hpo7ZhO{ox}5=|COD;{MT>Okl>!VzWks5sq262N4A-m7!=xw z1Q3?T{qNm9`5%Aw&d>eQ4ka0+&wh06zyC{5V@zOcMo}F-HN=6*xqtaPd;j%cdy`c= z^dDE&7yhF^dhKU^bjuMQVz+w66;~+rm!4nwD}U*k7oJ_F zlS>yOhdRp_meAR+fA!$M{omeXISYfM*EW{^{U6`{kN?Cqkj2OKlKQUjd}sIcfBlDV z{m*}!?~?Ntmd<|eQy*Bt5~ZJ;Xb5STSUR)0y7;Z-<8RzLWdx4p6o34OxBs(0eH{bQ zF-Lnherm?{`keJcXMgjbKKQGD>)!qmV@$+d`1A)>SnjT{-=2Tv zHhshV#`?lfe*flw@$X%~ewC5RAbX73mHd2n|MdU))t&$0XYV~cJfaW9=zQtfWtOI} z`ZaP6B&~(9tMgZO&c6KJ6V%Ae{vZDM+JEyOJpG|(m(AkB7uA0_XYTC3{Nny!{u^&T z*gGO{ZF%9Pr^Oj%*kA(i4Lc#fq!l!-aqKonr#X(@%VG<-h#1H$MA`b%$nS zOA<+Ee$qXi{q{Ex|LV`)x%Ji_Z|+&F^}x;1{*@B!zK*bTa>??;bup zWRC6pho4>kum0@KAN$OPoHm^oC%y~DedE=`zw)#9{{FA+VB`_bGU|^!y>#axtVlK} z0QRJ0B4e(<8>5^jtB<~K^*{fa>p%Tj7C$onNd(x@n)Jj5tVien^tX5am!G@$>)$xw zH9c#MUwmqLdu;*R2&+`iD+Wh~M;EnwuI!$E?RzZ4vSVd++DlJkT+dOuLOOPUn5=pE z_AvzjMbMpn;QGpQ*8tZFpP`nO`3D5qoZnSq-qF}$J{L@#YM<=W+>hw~1Bsk1iv*%f#Af65QSO8s_Ny{Rmf?oI-1d$=a&_h9RQ*UGIDz=MO z(Ue;7iFvp3(B&YuW>7D$Y+$9;sP70jSERnSxrutuXe0Qbm1fN~pLci=oaL}hSrf;c za-ZpundkS7ZI)&Dx@5|so0XLG-y0&(7$kde?;2ORxrH794rCIaMzpP}1$|$b}IPIin>T*KQsk>|FqUzPhqT z1v!0i+t*3&t(&FUE`_dbDP`Js*e=shcLc+8YG`R@jG#bzD6#kjV&pjldiU2)&YFbn zFwa>D5VY!4#3?lu`{hAslW|g1VyaIu>c2&Z*CcT~-}ND=B+8FW^yQ#)<{VJ5i^CRZ z4231@r(Z*6M1&<245`2{HVVBsBYSqQ&BzKUykkdEV_oCIoHIw%oO;jXGa7SWi&lMv zIP|nEbf)ZpL*KT@G9B4q(1?A4phq#9O^r52C3k|;5xVmWAsk@L1<@oUWnke7PFmq} zH4FSsqKXq zZn9cTHKGOxWJ?~>7Jf>sz zE2xMhN`X<0YSDk#u_&Ig-@a;b2rNaFCC}e{E~}Ou@3;Ht6KY={nI-;C*Qq?h0wUjNqlHnH_hOp=5u`MXR+rP zk-hU^s&u(6!~FYiU}l*T5vb*uVqd>?_T4+|`XOn0xlxBBR~qjo^^5)zPiDPVZ5VnoEVWxmkSr>iPR`tng)l$fv!_-{kgq!Wsj^#}V0`#UFCHd79IHXm}G zb;be-2XlY_{^3Jb1oxbeqEU4=w{MJsu>4pMe(>P-ou04 z2eHW}=`pz1Hm{^88>AXB=Jt14o;=h>MT2uT*jU}%9vb(I_A#>M{xwr&S4o+Er2d=I zkn~{Z{{8_v?{qcb2uZiEQun){2ci203KsCC=I^;(M^pDzccDDEM0eL#h#$wQ5 zVe`t(9vk|T<73ovc(f0~grj({DbLEzvKY&Oms-T;=auvo$K^Vb1Z{42x_yHM) zEL#wCSv27E$zJyC)dj~P%M)pv!?T>R`qBl#fQrk$T+fR7PW_&oHCY^8Bp^ju75o@};e{3#N9$Z2GgaAV`f~k+{c~y}tG~5iyl?L}c;?h2d8fV6 zv|&Gs4J5szcQh&dXo?}UwcsR9#WXQJvuHX7lTlzp`dCG_b2@H_Y3i7D7$_KgTw}Ok z-;g38;z$_!&=G}3nmE{4(sRskCpJxn)W+#u5t0O$fyY!xv=g2|T4AU0yyY}W1*nLw zB1dkt!$2o?Eh2l%x)R!#MneRCKAm%7M2R%iHq6MG);uhETZD;40^F%Ow=eca;|3cP z1m3JgBDp9v!X@Ce#Dcf1WI;nlM>Spoq7g1k9$Zt% zV5?af+3<`dYR@}@7SiVvI1e}mn6m|v793)*E4AXaY@(z%H8V2uEMcP>zF-NQcHJ{i zR7@1I(qzc>a1Kk*IX92&GX&=A2sk5#%0dicxxr^*l36^Ev^=Uv;j735Lc9E;B>*Te z@dF$0q|K318a=^4DX_$bUBxTCC8aS(Y1zmq(SUIG_P9=(4C{|Ah zyQx;>U2|fI&p)bKc4{s0_|ub=n9PeBr@=`ad)chCc$FHs=q94D3@%&>5+u&#GUAr@ z^j9t>rSM~8PVL>HvvgU}D4CMU4-Z6?!}5;`~7eGOZUQwwKl2@tf=-QczhYNC|xCRjXOsP?lN#}E0 zpgs7{h@%hjGdMwN`K0RR$;JX>9Cfzn_Zp@pC0U~AButfs6`64k!6ZE;1(^!9fm5KR zZVC@le+W`AN;jnM%nG8kBts1M0iVH%lqir(d0k9O)EA};__ny{h|Wd*deRE&Z@Y^Nyu08_&xxDrQdNYejB!C~7L|_b z4hyz#T^*nsp&C#kwU$`!?WaYsPh1V1O;D<_w=1yO^`N~&E9O`cW0Q0?5^7)2I1psj zOB+oTT5d}+U!f-4S(5Br7-kquqUlkg#f$M~F)D6~>ltv>% zOh{*e5|c}ct$AwJSjHKTW+4bMn{rXjxDzLOyd#EMFLZ_WtuF*OI4vtuG1~6;65SQm08tpbgsg`EXwD|8DtoQ zoH=&Bv0~dkbIv?LGj$udeP?uK6DMQ|)6c>ql330(8WW_6RiXF*K zgBzM(iiB$6muqRK=vy&}KL=mbaLR86I3WSdL4M2y3m3&|Y5n@fv!7ymg0a~R{q8po z@4akI@-M$IBLcUUL;)t8L0yfu>$`-LBprqVZbJN0hqYR5%!UPt}7QdRA;qk2!zPtKZzZTP2CsRHD)Ktzc+26e7H2y1?W zppX!=<*Aenu8Vxpc@pFzx*7hY5T)lpL#9>18@(2QXWauO%Bru5P8Yezor&6VQ(i~V&P4caAE?c zTo4H^+@g#P?WHW43u?1vExrw3SpHQw%yV+oqiE@7OP2Ty4vrsK231S(V~h|);>IFR zL6w|I@r)ktkSTZ{WdQ7@BfSAPasP;6q^K&QdWd(V5<7wE^p!D!8Yk4;4_!-IFM=_g zu_uP%qw4?!Z{!E6e-}B?4C~S^Ze~#z#WgG~iM_$_;3e zP)E;AFHh(97;ru5tc#|^SwZ-9yyiS$YnqJ!pdw3P@4D!{M}N_Wc)@?}oT@fN%yznqaES&o{x1&=Q{46v{9 zbsF0`^z0xph$wtqILl(6+$1*yq^;2(#7p>|jM*_XI!{vcU>Bx78RKo-UxL{O)dj~( z70{E9rEaXDXi_ywPLC{LV_1)QleYCSY5xr-Yq{_!4UA>cW5#(D=43dq?-2QtXqN4&7RUY+k_oeTZZX^c^f-8@z@k4@A;cjw2BcnRSc*4WJ@kq9c%93MB<_}#d7}5cK2J#w=Tm&e@#_^?9i!tOMuQoIarHlx!E8?D%=MF|jctOLv z*h)VHT$j{Itfy9{-uc$VX>}%*U#^luXzZp9Xk$o@pHyl+*yy6TaL~A58@{JR zDjo>7B1WQmDWeL-hbj+K+>E(CMj<6K0F2#Q;aCoaJd&Ih>;fmB z2GyYnJ(IjVMH@ls*ZGfp`zvH?T5MFFNO3s0)rdQ!LetZ$XtPVAQP!!^qm6#346i6) zjIP}zKsD4)Usy{T9Ywn(C(If%W$>n3Xqc%t-SvhIq|yWz!X*nu9D{A>lcxdAh$B%Z z3B8}`Ig4<%--SvEc?Zt9nym(6QJaBh?hpM3f=p2NR9@tUgS_N=g4kRAM`3l9S~B#W z5wCdxeYvD#@ZAl`49ar{l@v#K5Tz)$;Hgs(D*p{j#E~RZ_Fn$@3Q%x8G2r2THFzVxS9X!K0cv8=9@8ofX=lT^{$EOW$h(A^{t3a7mgsS zrh~X}$A16^oXeXWg61w6Y@W=tFD_WEEio@uSzIwF#lpxZOy%n-LKb1PW{i<5H6|ZS zgnbkF5>V;KXvBcqVrERzXojVE?hoPAyBW}+`Kn+Hy(kEYbPm|`ll0!KkSeI@m%WR zXRJxdCKH}40Dy;&(5Q15aL*1BfHZ2I0o-{36aLwo1Y}lPx$YIH5jY5F0HT!dpt26y zye+lavHp&7)HJjdlKD{qN}~ zi19}u)1F0N{(WdFSC2H~qNnV`qI$jge>}BJWAtENOb1W<49JF}4X?*AyPK---UV|e za7P;wC?<){S$lu)TWpwtya<1?|CS9@b*vK%Ox*U!@9biXk+GY1hWCzQJ$|~O93vmQ znO5wD{7l5VknSA@JUMF;#;Fov-vhXs8pV^%kqt*Wd-v$Boz6n9CDLkvGC&Dk(Tj`q!{#Ok zgUzNfVXxoF?XHQy9Vz0(IX^m@W8XVw!?Cp?$w9-=4>+B6nA@3NoJb%6?rtyhY%NAk}ae2Gku{brC(YJc7*x?$OA$Wxm&RP$dS!Bx@H%K-o!a3TIb7fXi z=wnAh137%7k<9-~8sf<4$SErSjLcxd0q%lBwOx6n+AB^64m_r+JJ~^xO+~0F3&F(z zT;MnY1>>VLq*3S^i&?lfQhQ1l&@m;k4gr@bQC!#GfCu;~k7`GLW64<>NlAlpQMCh6 zJgF8bp)*f8su+IACPl|-W7t#J!IFlEC>1OF0&v4Zp;oAjX=F%NiZ)bBQ4Z)4;X)jOhM^&BhXKMUddbq0P0*BFeQ04% z&=6WaQ^b8pr-%Uc#Itbp8_F(r=sIv`P3n;n#DQynIhi{aFitJ2IOj%>?xH)7d<=c0 zBibnDBdOmB!DGRP=+Tru-=VU{a6MLkK_st-_meoIu(}%EPf||bL;H5fFDD*DYRF@L z)9DX{31|w=F5j_I5wwx5?E` z@gH7y#u5R|I2eWwuSbxB0ygw~yz4*~Zgs14zWnG3-5-vC{v{81nnap?EI)=jHiWB> zPjDf#?BU0DU{mxI4L>x(X2jTSykN@SiY$#~tD0rjfIIHhv6|7!<0XwqLI9^45{q{N zY>#4TiC!DERgtoF4xpBk&7idwE5gk|_~Fx5IwwZx>E5Bo#$xwjHrL?-NVkL}=8!np zm8z43mT*2sWY;!UU$LefC-NS{pqb#B9L?bi6Kv+@Q_>*50WNfPx zP9${d{+i2k?1HI22aZs7-$V)QDSMaTkIF2(mXS!Uv)Y>)H z#B_WVWs*;jxhCDc%xSR<1_ z;{uKYe&$9qaIPt9iHFt=R^eQ@=2{$1>|SZEQ?7i>v2>v!bgRSLhl{QNbD4GU(4+<# z3)$H~U}cd_Rw_^NG#&oIWyQTpXaH)+Jc_!+A9MIqJQNcbFw{a;vdnz2yLhAp9J!Im zrR_Cl4c7r@0|UyKR0Bsz@hd#saL*H_?_bEFcRKp_~a~ZqWdoM^gDAj`_d99*68DFvulHd3}P0*(IQXi^e50 zG1!2VPdYX5;uHwCXU#WtD1J%>yXv&Gl&KLUVD;%Ds_S6Ng?fb?Ev2n&G-Ia_TdqUz z9nQ9E#*_pS33#$A&pg~xC@E20`W3$&!*J(Q`I_fAh-cE9a&itfe6CVC@G^swmW9-x z;<%o#sCj-zYgjS5)b&Gc$t0qv!-z6l(h!@n$%lhz(mmK_G849o7@jSV6-_Z`NQ%C2 z@}PZ2-faoN&QTqy)$=iVA!B zPP!%;dJ9V?7P8rr8d%&0XK+13Es{t~WecQ9d6CjJgFa{>D*7bx`+1PR;;^!@OS}BJ zgXvy7x$7u8hI`7;MN?hSi1fX>nri3XE8vpT5>`S|EOYHWZX{&$;MDv$jnP;aD#)VU z;NCMfr-72V%@%Uw-}g3t!x`Z^79_tNoIcC_4{Nzx4(~nGQG+|M+ZyFTVWv zC)c!$$MV%ksOt1&{;Pb3krwcDfiDEU`o{6Eerb;nc~qaRykAH;A`2bsZP?Hr!Yf8*A%!(VfY=F#orU;oO%wJkObcRL#5s7Ao! z_|VSRUp+bi9lo(|7SCYgM_yVZ;t-r@;L{mH_Uc_Yp{rcvTYP*t@wdLV|GnF8mJP1| zP*P41Jm13k(zgyC?lZJ%ii`!at@md>xcmp6Z&gg{I6^g0&lYYy;G61fGq`}}?>sp9 zoo^hT<$EF;0-%EvK`CI2VSoL#LufLBNurj`m!4UA@hLX>(~ZErri{$<{XjqQ=aA~c zgWc2Lefa?M2)Tr|;3%Y=%Bq?2##^TjVVb8rtjx3d`TMUgavM^UQ0H*2AwB=S2giKy z1sPEb-x36zud@(jj&f3+mPGQL0rD?>>+tTboMWw?oU#M|+zant{?z;Zq>x!u$T<<4 z0>%#Bv0vcCA@!%XmOp}+@*3*F0h@_$>O8o`AZ${^EMA)X5MMxjetAe+oXgtW+^q*E zuiXxE9A`KFsz*b5bw1ChGSA+6$m<5_(IgK5 zFFwEg$>)hU0~{JQHcu@g+&!SKZ_K}V6VCaHr>;t{J9f@3uC6TKKbXJIr)r{Q3ISVa zZC!h6ee+7bSYvgm;!<(hkbHmdfi>Df!IRM3`u3Iet?UY36oaD=J-kji+_f}V%TM_r z4PS||9h_v`Xncjh?*VE;`f+p~a5gr#*EaYj%?xUrki|vzT2C0dv21T$yEzja8ukav zC-}mj4fpBF+SRr7EoGSn&)!=5J8u;=^_(VUYx~;S)|F{y;LdHw_=x1b%quCnUS3_f zzELU)$mjq)de~=wcoX(O`?#@jWqo7IIyvQ(lusEwBq(a9#4Igdx$%rOb{6aG_r~We zh4SZE$lBI6YM)7*M~4OW@vczc9I;tCYMccw=PRpxSusi=bslGENb}9fRQd_tL%+Ur zL;+}W(P^9hp9`})SLJR*7$ zU9iO#-#SQ9zkc%>JCJEdo-VH*vMqnWr^DZ!Pt(RMkUpp`IHn5rt$e4+#0_^dP>hvd z3zM#uE&NAVGorpzuO|W8Fe#BQe)11)UVZvYzw!^5sJ3AXbZw%`^=)&z zsNTATEiAt9(kE9|*T44LzeGLhqNGjiZw41V=)mu7USdH6p7Dm|#l^K{zl6qDbooRI z-;C);IB4^*O)&EKlm#!K`4kxil+hWisFh{EF2hI$pRvhKjxyko-l?Bm#ymRY$U^kt#@|2IVSyRWeTI9)UFuLDIg|=F4w<&W?|N zkqWgNdH`4Xz|0B*LfI-ZkE|riOL_Vm%z}fXQ;z9N93d+hHYX{Itm3FFvBOb z501|cj!zGcd_j*%fv`TQ#?kG;U=?sGHwBnBfZmr4q8Yehl#vh6@zp_gwPZxlJq{BQ zN>qV~%G>Nyg5SYDw<% zSu!-qHvruO91OoP0}Gb-NC3}`eefwcfJ4QwCLYPn@u6}Fq5HZ@T-9F z*=x$1IR#htFP!tFEhl5(j!XmYsGfz80?arTLt+#dJR>wuJ{H%*6Xs6vEMXZy7K$h_ z9XyW4D~Sf4e6`Fsa6jWjA+MqqoiXlktmjcI_HC1bmGV~H9}p$Mf{p(07u)HV+a`Vh|Nk!NQ26Nao0e{nMr{$ zzYsyZ*q3Bv1|Y{t8%y?>^uH*vfoCArxXr0qzZ?Yy+i{;Su5RD>v7h;iSZ2TR`M>kv z?wc_|uoLpAMmr*#ja5qS38m0NSm3}o0^1>voksJ-jFBFl*nnQZ4DtOQpwm7iMvd5)4)o7t#?)XYmAOfp2J`}O zFr5EPV`nw7&`^~b<-Y{n;enJz;#$;EBTdCDW&q(s=d?7gk;6d@+ceNK5h@bc002M$ zNklkdM>|tvm0}VqE^<1>PwK z4d`Nxj8dvf#XaSg){s0Mg-u*V&^(+VD?I1B+q22>MbKW2(8IZ%&?S;Gw819Q9q$uq zzvJ6v%k0<`&I+I@S>N3L==c4|D_{A|2M_#oWb^L`TCJ3PfY(Ct@f(`dM8k`h!UpPLHm*luNO=sCP5X5A8< z!p-$Cba>qXR%(O0w|&_qNJQF9R89{|6Gx9uPVvtxV>*dEI%{TOJuZ2&-Wy|4bPRNCpb;JG)1f!tNJ!6ZH4=pKYMU+!dIu$9f>5eSU2u#I zJeU0%f<0D3?JSEK8ma1%m0|9P#)xmOF0m9w%LaOr#u_6COM;6;$5Ubi0gx}FF3<59 zX(f$a1r3}qU}LWazkG;+HZ!~uFBu%@jE!0Q!ZUHP$PG(u3h-0WB)P;KQ?dit!$aR`Qgl zvU)?15YJXK0z@$`YfkRjLdu~D_@NJMTpX$ee1SK-UaLczZEP|wEEj-d&7AU;71;$J z1RW6aNVa*$(FAb_!ssI_S{UIz!X7#$9&$@m_$Zuq1#>@XfvAZBqdhpZQ2-}k{n`E6 zp@9yEluy*VbbN-fMJX#22O4sL=M!Kv=Bbv~h`5NC8C$H0kWF#1xvs)A3uQA(GN z_@a!ac{C|a>@YP`h6ik@NXtN&j7o(t5!Ir#7wy9yX9h^&01heAzyUbZK}wos>Y+2$ zR-h)-u8p6`2_yjlZ+G1h8^4rlG;=YyDkxYv=L%wctU|%B6wE=d5WXHkQ64E$gwXs& zuF0;7b;Ph4she5HWJa`=P^%1yUf|$G{@N+vHYOwLO4e_nAP6S@!rUreDv+Zi=X|2@ z{PdWv*Ks~-L-KtPzc`V3wC6{54F%9S!*wL;k<|==_5D~bmLr`IDO2; z=&;g?DLmw3qZg|&Jojo5{DQH-mfSeK78>^A#V(xNHaxEDG6;IjIer(ru&tz(Nhgd+ zTj zpQzOm2RYG$ujIg*q|hh4OG0olh|RKZEFp%nj1OoKxFFqh`SBG{V1?ouE0!l&%!{QY zho>Ai=anWSHjB0|TG9aG>6DI0U!|e9W6X%A+KyIWX-GOK9HHPlECS(c;{JzFDrbga zlLlNqi^7fa}okOwT%#{?e7B4 zwM2m?0BB-^n|zbEg0>G!L^*f3OQz9=gK#9I^;cyWZP`j=9nw7JLhk8wG%B+mdj2@X zM350siO_Q1nsU+_PQI#j zYe}jrUdb$O_%nhBDp*>ZiTGn+bu*s8Bmto#b^<*~(ch2g@M@f220lhF%4Ng=zCC); zhA}P$mvoH&a!GrUy?B(QVWJTw;-fgR-VSMo*JCN0_!!rCTt+N?$8G_=4Ka<-TDFQi zeN@skI$h8snCZxJR_M#<$AFD-8F7!8i}&_$NxFSdU2wF2ROQX}1l(Vwdt(iylddTq z{}EP)`5v5~oHbd@4aL5Q-J-cfydvQEIA}@b((-f>A7lO;e+uMYiXHLNplVQ>U*%U7?`7blbn8>5dzBGdLy*RHxj(H_TFPO0M=?lY}5gHGVvh3pxk}qL?lY>wwe0hlY+&&ao3Pa|E|T z#pD4K;$y$~Dvz2G{=x=tb?r_gX>`x4Qmq8uo1ZV7ENWBXf}Dx}iI|dF2H89Vnb9u7BK7A))7FiCkX|NAY=CMDT zjUAH$0*2pWRrrPpNu^hfjy5VOk^NL5PNl(8Ey8FfluQ_eL4a|XN-^~UesZ#KMDe0x zxb$9Ak^*9NFtHg=m1sT0ehlU#A$Tv&bPFVdz#XDyPGLW!Mft7_> z4v~onStFo&!VEmmBDQpuCI_6BfEUsGkT3+NI;6xFyvg`LLXv7AB?6usI;3R2%?T7# zWuL!B8bY6HG;NV+;`rDxi*fyY=Hu5R*o4yWTtIKWSZaHEUI5GI1@ty|u;0C+r9{fi zY%K~IgP)5g4%9r9T?8Jkc~T(l(5n!&u2i#JNjgwF<>W%}QsYQco4v~=_1T}&oRndO zIV;4O%?woRFp;`fjH(t2=S7mj4A1_SfH=@;J%c?9Up3P1*2syNG<9|Zm*f%5;5yz_ z%LSZ66*XoM#W)c9-PsGl->#(gk30%DQ7tc4j9FqPb<`qprOUSi!T$GgPjo_ zi5=?v`s(~oe0t+Q{HZJ2g?Upb75@}7Uq&;p@$3s<+W#B>pFjMCf3@oz z{`j?LZrEE14%@|fn89ZH+ABwY{U6_V0l~t;m9>SR{=v;Z`NNxr*eTAzHv8RV}e0d|~qH?UTRt&v$;QD*Ova=k8l6L#{h>o<-h?I zbxv|vPA}g&`n$jQ@QdF%qyUpZY`;O+SXubtPptjSk8WMvv{WaXcIFt&z5M3M8#^cD=+%wIAN%y$zx#)-T-!`` zS`3V2qlaqFTm<%uUpn~P|MCHAYY2dhg(>UH^SqK)A<}j(Pd->4FW)}7b)T2)3!7{6 zKl1VQKl9_;PhDM}R13L!Huqrv?4SPDLpZ`vjkw3Wc6W_mieKQlGS~IQ%ZIL;jyYt}mAOGgwKl-hQZ@$G&1oKaA zE`I37BGXlU;~Kz@Z$$R7gxL$P+&#U$!{f;L_Qv8*egFC&`=PC;uEf9=you^?>iOLM z!P!6ioxQ*JtGnb8gYH*X=Rf@P()OymW=?>U3Xdfihu^t#a%%^(YHo9V;otfAI`!g% z&+-t24()?*#?$~}vhwM#ef{9)e)-`yUPsMm8_SC?-dMV^jb(4XOgItd=Du_9^jo)& zG0JICp1ZQ};is2ZmmMmecGTjBhv(mV^W^qJm)2~qx_Ichs}8Tv2A`jM#gUGXa^(JP&#dOLEzQFcpCwmWBpmYQS zOe$O3ybgOavft=hcZa(>%=M=sLs1)7t}m^uqmmext!Py`f;&UtbnoH)lam9|XQ|4@ z)-|3HEFY7#&im!%<-@%l)fh?FH?A%#=?u=p3y)q4I}a!>hl~+mj&EFj`eM$RvAx6# z-`$sHO-`BE5pYv9J*D>+7$HWU-o1D3 z$yt+;ld{fG!@WAmnX+D8kCrj%5s7#^imx>2FZo-iOU0dlEGlYa-nuH zHul0ZOF#8*ZTblAqYOQXPpsx&By(-b!P)XZ166Lf))qeVvDKgWq0PKsB>RXGNDoH2 zb?4-lzO)az12zkD&t6~r$l{;(NUt>4F~b_(FMRa?WD=#jxUs$Xqn}xO{<#%~OByG|xy+uQ9G_iVpZ~vpF#|;l z=Nl_?pLk*UbAUr5a-fSI{Ij{;-IG_}JpRAGunRm-j5n?<{Lm-Ye(3u*nW@~Os5~T7 zOxnh8zPkS}zPSIzm+hWe4)W3WEr0G0vILMpPV`)A0lmtJ*5sRaPu7>U5>U(a&4tf? zd`(HQE#(J}{cqr>=kNR0(l38`|I6Q|O<@Vn+=rfB{@f32ZeOi+S^Ro&Wh?dH4o{J*@p)pa0YgtA7N}(UEEt-6#b$i_E8p4SO6N=kfUwHP~0t=WBgrc#wdj8V$D?jM+)|Tcz z^1hWH`+<$;o^n5AnJ>h{O;b;Ehm;Rgo%y%o!e)(ceMYE zGH_sGSObg>51G%*eEG!%o&jFDeYSg$hGjs^C6ZDX&_-GjVyVyX-9NqkfJG(aq}0kh z%{n^E6@zvT?Vlf<%-wq9BWWPqy3}(-I?|Q0&HyG00m}X+yXpzez14{=%_7E9$=H&`SKb|k9`O)X;1*X zuxQssLQ@X#wTZ#8H2rf{!DHkRD?{4uN^y#y5AU-Cbh4m_{>rtd zvBi7NvFQ)?-#Xr(0Zw9Ahuc?fnyP&t;EODjKiJ*DxSV7~@VO02SIHU8@E+*!;K31` zPfKb`xUhv4j(DZUbdmcz?A$S9#=}FQ-5MUeOkFNY3kOnS?CF1Aw_=% zE6~)hg?ZC3xSYz@83=FN>&aP@#Y**~m$UUq!HR(6BPqLttPt(I_VgN6>6rFa_u{c-KZZNYlX(rVZ2)y|}hY=sl$svt%-qMYNUWEczy;MK&Rt z-(;0^Wwh8d7aX~FXn=(>@WA?6ka_<|T0C7-HhhzfYxG7Sb&`g4nBgw(%^le~J!bwS z9vqS>HhFsRN|$$|7^yA~U*MtE9T3_0hgbIjw~>ZSdoFbf&KW0KgNL-R^o#aqNE%=% zE1N95q`>kNEdy4>!#`thR0HLk1M2}yk_K0am?N(Dmio4hb{mQ|8An#ML-8XDDzq+};LM-Gm7 zxjyNL9p?hxIOitdETLdAidzyg9*1$DqOpXQ*{7XOy*a?W0{rOM-Wz&`0BFkS^w}Nh z?%w&%e(Udx9mu(0h5nT_BEb%7G#38JQ&Smm-oQ~K;~fl(YOtutIaZqA+nc-hu%;Ar zF=TyieQADk-H~V{B#*ETi4kxL!j#&XgUGto2zD+ssz$LtgW0;NJPh_W8OoJyJrmL2EFG+e7-5L zx{~n`YJtUVp7#~d-`R7H><}Ez(ev`kJewbNN}$rsrvRL>hfznIrp=Jk#ijH0Ri>C& z!xD<#F=k}N=a^eMq9rHD+lq!Rt%@jTrp#yKs6PLaD0Se2|S{(IsWfnEN!|Y`x zT?T}$$nZ{OiG8Cv%ZwHZ-IRl-{KE)MEquZ>2>>wZNZKLpl&UbwxIC>3GBP?i!Fk2a ztD%$)vx!WGJrQt|^d;1a?UKupT)+(gqAoym+|1DulQ$?>4f`-?9zE=q#Xc#)Y9$=2q4E-PDI*?@m*n86iW=fWCTIqA`Yw;^) zVkuGyc@M&S4z^i#DvO;BPx|)cL?M3>T}vqK1qV8G=*48q9%sL$2cj)^@`-a99hNZx z+B$oCs@J01C9{J!^vr%CqPxftO>oBsB30B&1!q?X7=;-oC(^ZGeZrOIux`XTaRete z%wq>HE-x_>P)Pue0zxl1KN?=?-MJ1hcg)G+m~e%tP12t8D%Lh4KDn~-1@!dCutZ#6 zTKn?XUOH;wKrPppz)XTww8t(yMnsJgv+SjpG|Zr5eiA#kFT`$DgRo^5DH{4O&N+s2 z*^DjD?$*c$OXQKJu9Ct-<+&BomC!6c4+E$jrNW6;B6J*JMoB9}1I|>*1@d%}UYzNM z=)3X=9~a{gYYdz$Qq>43@sVW)yviXslIzaF4IU5#z46srVc@PTCP{MQL)K}f1a*BwJ|&Y4j zq9H)o-jIL6O!NyK^7XRvO|yFMJ>W{!AV|241K4r zo|X%OaVn1=1hFX#d1fB@6qZbBF+~q@Nfflfq0vfQKj|rmZLgyNC6_k714>vSj?7Uv zX6UgbwPps~n7OchnL#d9NE(@^-(Od$hYuf5`ow##l4af{Y(#)hAGgI)Q7G5DK6(p! zuTD?Snv9&Z2%HrXRaE|#!~=PHB{e@zV>CQcLaZHY32+noQ3k*w;U1dWU#Y_xw6E9h5zYKjAN&y7JL2<*4p>p5a5Tehn8CMeeYnS0 z@r}Y|ac)G!mJ|3)%tj>VMAu^Nn1Llz!SoV@o~6K(7@~?FQSs(i-M=M7BoN*UnW3UiJ!sxXS01>=+k%>r( zd8MQ>5We&!h-Y>*kbLdnO-w1QS``9U__YF~#jY?o$4;=AOct|W%L#Cm1UQhQ+x?Go zZjjP|4+lY^Y$jrPHt?oKbVm}BYF;B&8;pQ$863mLBZwqwj7Vw@dtrc~EsvU7WRlDT zHu&-z*zPEQBbUUYY~a+S`wF20@-*5HWhG^D6cW?6I<#Z~(8eSghls{_hu%=@2JELz zlexSaH`3%lY3SvmL8%Eaxef6YI2dwnfeHa^`|w2+M-ihQJjhA187y(cD0aQ}rdUr< zg%#J5@!wOadg+r@B@yAhGpMq!^Z;47lEu2{Npm3r{-*D*#jRU?$EneKxRp3GmPm)I z5`B_3_dKizN8Q7isthOIPddPg$pTlQD6nI1f?7#&BprgP3wmBcuaaBp;e%_7xq?qQ zOBpVqfo*wEvRB~XXu{$Ye(u`!Oz@u1M#(^C7)$g4Y%YVK<~mkO3Pqj;UW_(LX%Be( ziIz%5li+|t0C>u3sXGX>^VA^UwBxR=+ z%h$Vi=`H9UOqkZ!J|iwy-dpCAH|;G9#)M;wu^~pu)58=oA<#3l74GPdakS_JrsGcx zJhfk{Ge~;S+pC8xb}RIqCg{Sr35ygFULMXf)KU#AG0OC;Bsvm1a%G4-98sg6{Sy|)Yc~?>jHh^& z3{n8@mQk^nnx3GCM?^5b5K#+9y?B{LU@I+zrD%v#>Eoe>jWuxXHY5?>gLiQilcUUF z8Mp;b0zLYW9?J?%g)eQM*=|$-y7XYTBu%0LkJ>xQfF{J0o9JFmI6W++<||;8v(iKc zPk1HJ-YfBm(j=&Kn@*;nMd>^h3wBCy0}=!{MT-zL12{V{nN+eyv(m`ze+K6bM9w3k z$3DFjn7Y@R4R{jOPkBvBP$LB(aP0tj7Z7f8Ct--2W(E}e{hM}0$DXV`9ZA?`3o^dTq`;^l$J z=aCkP(}bgd1DU)uFmx#h5ow&hsj+AZC+cVnjuRUm%69fziXzUHB)zjK!sR#$-aUX$;iqcJ88 zI=t=xJzwNMq`Ba_j|#uO;Nh49nBCt9zKHGpbf&9M=!vRVQFJVEM}Bt1h9`yc(Yxpi zq$j2{+iVIbWglfk9DGW=JsHuA-5>#d()Tcq+1r6Z%Th@kMdGi_jq+fg9LTC{`;m5h_(uH(uw$3~IqI zQns$iL;UtL;wfEbVbmkN4dNwsif-3T6Sswx_{ zcoh%h$LInpG{|8*mvt3JWWF&IT(LWy7$R`_jT#j0y&=``Z{sbAtXJf)C9+f*G)0N3 zt?)?CkxGNRe*S-bFHndtoK3Kq$DL<{Ta4%@Bi3cS5Ro z$c>z1q6N)&)cWe}LG^3CS2_kYCqZZpl5+v$7n!|`lTOEoN=p++GgN+c1Q&4@= zoun&flG6k5;G0;b($WfD9UwMX=8L}06>%2lU0k5rqf30aogrq!Y;h`eQyTYg!9i%r zo4%%M@1{9VkQ5Czn3k}(Df(0-X=X^;gH+u9sJa`g6}<{@mt{R&E-GP;B#mY&nYx|U zOsT!Vp_d?ORoro4?*i_D|FlIEl_tmq#3}&dfOBqfJx#i(q?ND=Q|_36lce4YHbM)a zo8_vH~7?S38Rxy^rf<&K zg-I(`y6VW@%kz`7CLjrC#bv{4Kb^Xq){fQMd;$c*XKU* zydL7CwX~)Tr~B%M5e};lLWSF+#IpkZ46&2T8GdpOv@b0qHKP{@P)#{ehzmW$93T$+ zEc-N(xV*c=H+qm*5I%>J)s?IjWLrDg(ccHEjOWP-H+tIEgi~gmTYm6!CVfzfSjwcT zAPHfTv%5n2O-OdADPExQ4=!ZH%fO1`#O07>6i-;@ zj+knUU3qvv-DC_jlLeHDY3okAH+JTa!4C;@lb69<`ol#Zsz2H45VeaK%q3>dG5ybR zISHjF1`{V`Uwp2Bj$ehQH5YT-DI}R0QJL}wHuq|WiRz?RV&a8U8EORPGw~ieI;$kj zap?4`7^(~m@YR2pMQB*?ic}mxrm!3!MnxQWGo@tpKMpT1h_BF+CUPaC4;dQ6tD*wN zYxICdc}kG_R_Pa~9em@Qlad!ROhz>Zgke=un~)S3{4BOWa!OI*8jclOjfK+7=7fPT zyPk4sM)_7%5sXExg>y8M=vg)q&P~`-$tiTvN@}Q_jGXC7Vb#hn)`Wz3mj8&DtI$WZ z(U?w!R;>Ou42&I$th~6k{Sm(5On~Fx(Mtp+x8=B)CN7wwDNd|d zi7-Xq`+LDJnJ(=G^x-6797?_BLawI3O|oaBdWW&^ICI9pFZx#80}csw5pc{V zme4M-?z?q@_$PkgQdZ&%K}NoBmE#%XZ3f=5t!KvGjdkl0zi#6~}1KCHtY*dC)pLMs1cAmuw$ z(+9=EL67DYPD!Ko2}v=fOEc-{OBs=_Ri3~!{L+xhF?D1N=P{iwkW}5O#uP$Leo<%h z-OFRfrkJEC8eQg%rtn6Nwj+)LwjUt_Ugggy%|)$VX5;dMvWpAD>}JFk@g?#9H+gYmfx!V-ZidGSNalheR!Y4)Je!P74F-(0T=}H05Sy6_xkDFUvoXK;~M7wyDXp{8s z)qTg;D2J_+v!o}*0h41C1=2%}u-<0Dc^g7KIcu_GVkA!IGy6QG8(z<*?tCAgvWxM^ zb0Ay3R8LV~OY=RiLtX(Oyvw?D@{Z52zloi({+NlH40$h=%q!v??S#ao@4>8LzZq6E zXb%Wz=N$SNA3?w~DY)$jJH;%WYVZ*|Lq@cA!Snz?o#-L$FWsCdkukOigYW9PO}$(@ zJ0!_?CzcRWxGjq#LNMTamk@XK>70QIxP}`xQ;aPLigW10x#D?^y@TBV8AG1j^9>ci zLG8x73com)N!yVakr=7ynurL`vWKKx#9_t*DMI3qVfKI4ro=vjc3e^sO_D)o8PcxR zh+ho7A`=~vb#`qH>98yEyi0__8YxWt56m1pK^P-1OU#*BdFu4g$zjS!y<2FB=&39PrN z_!%Bw?-h9PMZr$W5HWGFgh)$c2(@sV{OD2$I2nqz@_0b8f*C?l7H3Mu2sv>`2h%Is z2TL=KZKM!ZHCo1un<%;P5+o&rPtd?5fFIX_=h_nv6(vOp!WV24OH0rC6t)80N6LaL z)aHP6xDtlwToZBHnL5EGg2U=irX-kRlPURBbmpl=J**O*=-J<@G&4+q*wI)uB^6@k zDLM)D+0(`8BpvEk&f{O2=}1f5CVxB|T2J4S!&XFBq)4Mi9)-%r$G!;_!VCX6i$h(u zBuZSG3?0#o8Oo5U(UHU7g?0EfE)pcQMZQuQQHzs|8^b`U#lVbAvb~Ua7@_EGXU6@# zE8jti)oiDg83U0dZNo&FMqw~HgC22|bHqp*PlZfr6KxbGxZGi}7VI!HM(d3n$_ixs z!jtEKPZ5V6nkm***bGS($@XN-#V?v1^A@5NnDGdG9*vWSKE-Il|2?`LXJQO=T>R3t zO6!UGxaBn#))URR=;O@@dk?&xoHdD@5t6ear}pF`To1(36W15eUNwz|n5~?*=q*A; zyWlv$zkuRGZ{Vwqvc0Bz;FA!Geq@hIWLt+#QD#;Lpr=&{Bk%AK+eY@-C7YqCbPjM2 zJ^Xal7*Gr9DPJ8tWE;s9*Oi?}&u}752GIxf-U?3gkg#bSyUy`xJ813PXu;@_03%8D zhbPPnkM(xQ&TZJWi|m9)hY1LcAfY|;AtoN*cJNa!=Lg4Utkh;7M1-|h1ZPAXVXclT z0Rq1LQ*Fx8@p9fwW23=14PvKxC_@hvoFM7hvOA|7mBp>n;1}XfGer#e37nkzVU>ls z!y|dK^M}5vF``D7AY&Q;4tMi@Z^#0B8js_ z<;kgoyD_k?Z_U4SzQq3R>RMv{iSA*2h40_YzsXlKD2=B}WGEl;v#7-q9As1SRAv+n zPO#o!jI6x6&UarHpVD3rE1aATOc8N2AMoU4pM{jm8TbX z54EI6E^=(HENrhYzWKmHLV-OZXH#_HP)wx>9nlaC0}e+~we!`d7O$?4 zfa{8+*d~*t@3C7XGP2cZKKbZg;d!rZjup6E$tV8s0o&$|QvpB_WP6QoiVRsd1$JV( zwz0T#&^kzBvp3MqEw-2H3PADE9oZP4Pd&X>4~VLaPZ-R@_QvW`J-&8?mKauy0p3}e zcsPG^du@L8=HkuGrVy2$9gmo^adm4Ed@8)%3%d2c~ioV*U1{GNDe2$=Qw`au$ zpN+CPnqLzR6)!C>E-x<}bs2%A?4z~1xv<1n0H*2BR@TddaR^?ApzK4O7@8r%;Q_wrqrYIA2;`SvlLLSWIEV!u-y_omZKqIUBk@c z%E}zyyXYdY3Ec7uYNQ^`5EXD@SWx`;sc?R2ZFMbeX$R4rd0Zzq$kUzjLApq~=^i4} zPR=*n`>a(iQ)iEQHmNt`lH^zkKA;#bCw8vU}IV>^p|W9h8p*p8mYu2M;@J_#>(an$Mf0w>e_||=ycGK>>XZD z=UNZc2h{~f8{>g$djg`&D2xFz){t}Kw0NAF2Kpr5lZz(-T9_2b`4>O=LwxDzOTYRL zXlJ*tKFg<`4)=D)B(a$HJaiZF>Ak5)RJ0df`VdO45KCt@1XK1|m{ddh>tv#-2*`0Y38+8hDe-dOnl z7gx46-AKp(fZIT0X=Kms+xJht_{!1#p>L@H|L}7wFFn8P&Uwr72DzL&5F+RMN9W)A z-qF`zr_*O_Y!2{`e_-XA>wZdw4KD4tsuV-dK;7B-gT2$Qe&_g&w@!c}>puMS%11x2 z!k1UrR}%Uz_icz!BcBxd_8UiEd;KWen4j}4xKDgw`PrLvzV4vuLWcs6xeEtxJv{sB zYe#qPyHa{-W#RqT7eD@i)r~bM8BBDtA_>4eJudjzk+0o8`Pyqrity`e^B;SD^#jio zIGj_%WS)Mr?6jTzliz#&v&IL`*i_@!?jKHR6t z#{QfC(DN%FdKRX%q2aqS32+Js*2eC^={LW3@{QMzFt54g%Z*QM`?Z^D11m$TY~sW3 z;Pm|V1MFsYZCu<~uDR?0jiyW#I!imp=Ky)vXP;ZB#p1L4#15rYCc|M`sj(Z@lJbdw6Ie z6K`%VU^dM#CQ{XRkIwJzVq2q!Ilc+`;pdn6)aS;k-~8kkNgYd5?Pq6b@8$3Dm7t@Y zJ&bccSK~Ke@)4k}B`l@n7|z+-{ES`VQ35=G%*U3t*4cVeiz4O4h*VNaFArm{+&cdH zYex_EH2cUGzB#$&*WzdJ4r4r=ytQ|_d#K&Dwla@eKKB0Q>sxL-YL;4HtQas)>B2~T z{q8ZP>(0*E@v(!f*Ebfo*Ugt{2RN!@GkLZXr;ej%n15;u%X>CG2z+al4@mAEQ5xju z`sV!gb-Kc7Y*k8$y6>*+K2CthM>WYKYE!gr6iXv2Vy?>4B7Zvv3wuk~f9OyAc|P3o zoB!nR9z5KE6dQ|&67pR2p~O)R%pV=@9v>g%Vdhlf4_sbqWuMstB? zZApfyJU2n2bF`JGiEzkU>27*HZfK&1gC(}v><7k55QN~unsR& z3)Q226DT>oy5`qzQhld%F5`R%;E>PuQ1DSR4I&@Fv_4$m$eF`Ep84`=3i4=meR&mY z5;q&%PYCVrB#*HFmR2{e*x=4A0AS3|^XW@Imm}OcU(4KFSz8O|CNSyPA{RdPcIe6~ zaXx6t=D?SLA06)V70DS5#3c0FyRW8rW}H4PG_bz8_0doN$SYs|t(^yVt@&}Ixb3P_ zW8Dsdd74?@yt;G$_W9Y-hd%zyVU8yl#?8ei8(JleZK%KCBjl(qD z%-iOKC%k38Rp<`bFjL^XmW31O9ns?j{W0NYc;*Jc$w3>D@+~bo~54b*0woZRDD7>M~3ngN3lbDVbbs2N9pRkz*G2VvyCrr4bUw=O9;Zv)%v8-kbg2wq138yZQC) zX>W&pZES2Xw&|&I(WJ0|5GqAcB^0HURG^e7%1iPTMR~{{P)c4Rl}HrTTclDDDwGgJ zszI1C6akFE#=U(T+qb{>+|&O0{o7qWpE2fId+qLbntP9xM77TEtUcG9V}9otV|HWB zHJgYuL(li`W#pFi2rKwJM!8)K9w|Q@I8kcm3vc&frYY$~%*bj3T;5^`8^^*+tW;YF zZ1iYYml0bACTbIV@-!PK%f^JhJkOGq=iq!ooQyv>xN=%Jmt1yRv*3^}qkjZu>I^L^ ze^N^shrXuk|}?O)eVBPWImE z9gR?49MA}v5iyEMQ9z?872)gh*a!+9qAaSaP!_O7*B3GP03`Q`PS=qFm@HjCFPWH< zSQ4$ZRS&(OS*M$#`_RaUfp$ixJTEQ=fL3_dT-B1m?(8x^=|^DAAXa4CDaF?)4ql@N zbr2&)kN9H4Fpq~0)4WIZKyZ%VV-IIE!WaYn6UjLk!70EiUF_QRwaz*Nr7>s+2w*VT z#pir*b{57~uwE4G>=^Nuls>G-*0V+FX=@7k-hIJP=i!x%&K z$I)NfVxn#Ke;i=Sg(_fyf2ac9aYKwhrX9uYUVHZGCRVl;>1AUN@v!RHn_ zn)ViJCK_5FWSfpeqc+_XfRgVq1e<&tUnLL&Kn!O;#=smlmKGlN8BDo~8IxLY(-c_d ziG)xDgcsziXdBxh>@6aPGE@Q_@FiZGAqul5E~id#s-_Y%RWvyzVQsPkuHmbxM0ATJ zWs*X&WMoQK;vE1=-n*Ek=PQj+aGsp1IuZjYpQ&uvRT`02j{AXU7Bh?%{A=pPAZh9i zjiuUUwo(f(awMb=3)WSm+$_6@o@|mpycUuxFz#MTn$)3pqLYu#g!I({3sM5yXxURa zFTSd@K?48&SA_@XA=`y9E&$JW#u&e+MT++a)j~#CCM={;{;K5SVUkufAaz*yPd`ma z!!<*n?avHN{aA$-M0NZwf)}(2VwGH-{*+^u^9z}&SbZq)31Ss}ih=qeLL11Fcs0qy zAu(4~0P^VqHNHde3ptNk(%_`xtuQtJ^U%zwm7l9k=-4`T|k5x!iNba6h@cq zydL|N==1388T1O%Dot1><6w%VNlJQj`Dj8}tkn?Kx`Cfy zN&h&huWXV-$IQ9g_WAVXelC;@_ka_<9Vm6gizs;Fuw%CO;ahX)s_GG;hYw`N0XPce zgce83Jfa$30hqC;F)dXL@iOqq3C@sdK?#mE5J@=iNBjUMG~&nrs&ZtGgNXqQ^*S$; zgt3N-u#WzcCcs_kcid2^Wd_r#u&N|W8DwFh@drsndiGfvEY@qtFfr%1(z^`rWgsvI7dW2 zd3m&9gLCK+ivJonp)sHU1X8Z!=)WjMr3k1Qj{W15S|n8%&&AcM;{bG|2yjS~8elj# zT?NoYBzGK5#V?A1Nz7kFhn!MGM8@LG3x?0pUM&7c;i}#X&NcAFHpNT?OV08To(9Za z@}{I3cIc1yoSqd59eVCjB3m#ZNWOuBlIJMw7jX^=+KWH9LQV%DNr$Zu;?=NLOXOzY zM=?@MB!_$h@n@T~^C|LX~D;<^aO9=|z1rSpyKI+5cvnEr*s9rizMpiW*GN@v?JWYF6ff=(r zNy7i7l#NL5%o!v+hy6$Yb_WL9zB2!eQAB)7qGTwA@ihv^p|A{~Si&rjBTydI8@d!yIh9^5=+w2sQqy1d}>ePo#88QGxq{NX|Cw5xlpV<@1roHOCCKW5q-`hgg;>8Z;r&t6~IR3|=07TFJ? zL-OdPH-7t||MHCi1FLufer>nCw^_BJ)11Q+gU9zyMkkm)G5p4axeq+)oIG-0okxaZ zXVCDHp=kcr(eT@E4qrj?>Hq*h07*naR1OCW+FC}h?67nu+JE&FLdI_@3ZlCwnq8YYi)Kv| z8EolWcTR?PnI0M)F$L!G{>m;B{^ifgqOX4eAGeq>dHZB^#u_hPrP|}Y&F+izhgbL8dmHF`$`Y#+;`QV9>G<$e8xkDmOjBT(;0QOfY9!9Mbr@=7b|!8r&gD%s zY02@LQ#+Eftm@v0%go3{mh7lTXW3T77GFz)6K9w=+3WP2#SAO<{2N<4l=9fhl`&ju zqVEuf#zh-;c6K~qsyIsVBMhrDwyDZh`1CJx?3iSCdhALU^QgPAwaJ{k1v(EsppEl0 zCuLGN0cU38`sNnR=&X#92+HCc3Df5I-ar;nN>(>F*EY5mf+t%{$~e}YU)|STTGD#@`XR0v?wst50O!{8P ziCKMiax&f)6SiyrlI2@6>ogS{yp>$rvQ8dRws&-M7MNhE`5njtHfIc-tW z5rQ=2DN3S>q-P^2NXf_uiIQmaM2N6udRe0QjC21xDcH1{gAS+A09%K}ah^5~As`hWDxAO87I ze!x25t9J0Cdbr?bczE3VC;#-z|LmW?z}P2pT-s{?z_Y8b-;OV$GuowYueP3DU;C?< zdIx92wKl6Y2Q%^BYpr9$~XnfKi{_lTy^y|NU`#4rc zZm+h!|CtqfP**xfAqZk`G%mC-^u90O9KL+}oNkBC{--~_`CtCs%a?ZPBSYiSKi1$! zJ@e=v{~xyxPf2gg5|$5KXT@pj=qx&uY0fe0G45|355N8f9TgpJ=Z8PI{@?tESDtyo zneW0EaL1sCj}iapUp@IBe)INSmYFf@bfxwFYb$#$3TC{oE-eOe@iMZ$*1EFY{?ehoyE`Q={M?{h zUO=AN>%8y!3dZp)xJ8@wD3qwyS6>?*^_}v;vZN0^i3DR-+bCP}ay2^pdbYp$*7(f> zI`9@tUY@<$#e!!&8Ai%fmSQ?|oUOaN-a310*gJF7`RY#ReOH+S=^B?Nux^Z`HS?i+ zv-Rq2=UuS!{h3RhC-=Jn4t)ER-yn?bSi^2OD zdYS{&era>`{LnWF3MwxiA9xZ|sLc|(Lageoe?0H90KC7IP8ne=6&9`CL&?$_MmkqEH?Wy#0P!&k zr!R^kNn^{fR)$$QB#qgDv5Gw!qgk``Fub-UIB=v6GnhfJid968Ok?{5pR6w#4A{*< zp;#)+`k@iKYpBFIdSYro(&521RXW9AY7EqDhPWRv3-gCYQugG&o9GqjXOFuXt4SI;yUE4A( zh8Y;fo>L9+igeR4+G_!n`4Xa1GIdW2IZ1-TCeEB6k}SF(xps$ zHbk(;@FIG~T}nBLRH95g9>NvyrUVFmRje3bAZ=@{du4~|a`EXmyL&Q)42yEcGHNy} zq0#p%BrBs=ySqD`E8FazBT(9=CD$>^M%~kM0I}p))xqEZW0?-vNT0?*@=qzD(Q~i6 zF?}}c$=Ca%^)(vgmEGO7OS|kV<mSt} zl?o_I+*)aW&y!5#w1q-*tY2X-lFPfRyX#%&#F2c>d2GD0(d%FouCl0N#deZlhN-^% zYX9KaPH}QYpSZoz#$t1fk>NZ(c6V7A+r6~Ca%E>#aAMm(l0_P1G^uMVDaN7@ zm*MAEZ;xJjdr)y+fnx`ET2EeDdHNC~m%g4bII_WhG+W&(yDPr!tCPqZ@B#Ph_UO{~ zs$;IO&Qf|-gAT?ozCHN*>(Q4eqw7s3~)iAQL%8Slb0N{=; z+}<8-ZJ-&??V(UHK={hd;g?>cMHY8*!8yyr_q*45?LjJ+Vw*BH_nWtdx5%T=_k_O1 zpnK=3{grqXDE$(<88Ei}=DnCqTXP=C!0OZcE8DEdRAr*k``kDfzIk_aaJm2-TkV<4 z6coECIc>MFmY#pJ|N0%L-d1c7Vls@#KEX)j7RYKCFT7b*4L)n7XE;aj-F3jbROhGz zPD`L4fA!YjwcEqPUSv^I*paK|!MC^0BHe0Z$-R0@{Mql9ZV}La`Z5ZS7d9B`&~A+1 zxI23N&fxH@=6oUn_V-hlm=Fqm@ZIj5^v5^f9K3NaM#3vXf1`9gb*a0X_HARo6$Q|SF?BobrWWK)_n{9n52bo3AqhKemQ$`=1 zOG`>KSG&!UY<*=$t{{tXQwEb}NGVHWY{w0jHk0wG##V>L<1)h(<3-nK2ca!j{`u(! z{WCmCry2fr6m`rW%5dD@H+ZMdU{#)N6y@&zQYPnAOdu zs}5~(2K~Y5@j)(TpQUCJ(ExTpiND5Cby;@$N#-Ns&!>EGcS;2u?IPJ3H*1O}0B~@^6cEIqY?5`QPdH z*a_xtyf!rnb;I5k8{yIVLnylQ$$F>jC zjlqC2gPe&!oBTU@o@1{8CU0?tL(%AkVyavf(D+T>Lf9$H1gW8-pqXb}6VC?DyWo6$ z*5o^3Zke?6{_{SW?lS)edOI+s&eZv?d+fNqQ&~+{ePLjS=%0S6Cs=`j`%84J#Q)k&YwAxu8o@ zn`~S*$PzOG)M+yV62kltRek7?+J?q>#^Aq~UxyW$NoTZJ37O2;94TorZ`}+?h4@C7 z2nfSW&6;J+TzL{TX3KHIgu*oUF~F;CEs#|qvFWv(14>^T)B92^eWI0C8_7AmWxC?4 zo0#9mH(aN;x@;ztDZMd>qrM4(G8X@K+*TTQR8rgY7!3^Yh+=E4BJ`o5;_H)ZgyGL# zPMqo@7g3PDzS}Y*0<|zD5ED&b0UDfZ93^8UXU`3|I*B(H4PRC{wLP22$k9F`8&AL) zBqilUDfA7-P^J&2ojIyzs%aQNg6~dGrsYJ!;2cVxs%U;Uvk{8Y*miGxh~&=!REl=y ze+`~d@l+7f77Q%tBlneJav3+&7+xhv#Ydizh|y)mvKYylC+TaHB3oos_PhF)OK`;s z4EZ-|2dW0qSCn$-oEh>9Oy&~fyzWyXYVIV;tt4pb(qQbVn zT++ymY*l3b#^^KFLHLyrf8av;Y2u()Ei$j7yeBP%0@kB!2b8zSOM~-&bvL%0s248< zRuGFXMKnrr1XLnfK8-?+0#foy7v^6u6Z8atmP~`5e%0L~qN-8>1V*^Aqj)z^Dy$kB zfi10p&QB;YqgUV&8eA5iD6C)x-!q&9F=k%sJR?-OzLcKyBF809JnqymHI7_*mSmz` zlnnLZ#b0E(az_8a%ZQkge2z)<2?wYicU~#SJa%K3NK4)Nl}hw zE{G#L3VoEW%%F%fLoJhd$z%RSiGi}@(JZ-L0la$UJ>x+=&q)v!>Kb2qh+~F!z)al| zJc&a}$z>+1$rP=Xr>2G_JyDa&|tLvkEokqoHirN9Tky^$M(V?Km>{dvLD3*lKe@w)a3;|gJqREMFVTDwqlm-_C zm>*Sw`9)k9wcCX&c_4<6pi~j?1te4j1B?Y@WJef;Sb{U08`~UJm00)iiw(+4vm)p% z({QQF%gl&cgrBDBn6Hx9I_e|^u+J^D<=1>*I1EH%lWExTur8ip0d5?{Ko@SGL*E!W z=Lxn@NMxq@L4;(aO2h^D;Z}peF|6Q@x@m;QB_Se;STzN3Wi<}9m%cjUc+&_E6(})L zjE;jMl;90ysreUWCdu$2I*|GkOM;;CE*iS9gvmhggBL!y0T22hEH|TP=}I8(AxLOY z=EZDA2*`jAz#u1u6a;dTYFq@U7A~u#9Lt#chIb3y%w>Fwb*d#{c?@DxnZ87+!~{(_ zs$8hREv{o4|KKbN6LGA=^5xyJGr253<^UAsW`qotRb4R)EhTF5Vh~Bdr;stmX$nGd z*D-yGfIl~gaYx+p7_p|webW*rvX8s<6Q77XhaFL)(8>=_&Igq$5oVBiOwkH>GAuG5 z2Ua%sHZFf~Wn*6&_A$Npa{u5p_Z1*)rNEc7Wjp);q5Qg3eGEV#l+YiB2+?fa=i!vr!O%`gOq2)0dtDezz?@J+@@avrgZ ztYJ!;R`kJirwFD3%oewi32q4t&YKlAII5C`6AgCpNkE76+LiL{v9_l!y)f-xpCuo?ca2gw$8Y1&l(H3>2YJN$}GI#~rZhO-srL{fs_GoJk}}Aq;Y3 zL2tA`t62%@Q;8B9M=^DTATrjt)KdiVn?VVf5od^nlFs(3$(xFCE2$bf{(DKKxYT>V`(k5|T3<5{`$kRkv0IoP8S4ld4(#?GuIi3s?Co;z& zn)HZAb8z;OxT?{d6ewTntA>j{=|Z z77<5g8ml0qdSFCKN5+h&2$-hNc-(D9D%MIe`ewWmF`iAQNqN8eP!-i2#S+g;{y>Qu zYn3WgHE>d0d?!wFDwl=lj1kECM3WTVRip=5>AR-LFG@y^3i0G8ys*#e)No{tx}P@c zq_QNKS+y8~1e+#Q97QiiGc11d=Yo4i;;yhIRv}N#RGf#W-B>spXD^ zlJU|MVaYW1<}@1etwbt^-V|P0q4S07JA+mi2qaJkN5%|A z1j&@rfvBFPB8q$&E$|d7(uRmX5rax@6;A&7(S8jMYp@Cb$+<>eMgrQ%!KOnv`6)2K ziR7L$5(plbKa312-t<+TNf)gEMBK<(V@V#LhKWcx*=l%ZD9^zHdE}Stl1yECrSp>C z`~?n<7z~t?L=XNPY!102J!$lobF$SSQMk)nrDOf-OE`vM%q@2&4}kD<)difRf@DIp zfHoAeRG#2rRYpoRYH`G*&_+mL6q#me_4Z#C)n_bLA8XGlFn_D0eL^-l;%n5x3(}}L zQ-M?IO@;V?!lD}lk*q7Y3*m#J$vd$nOyUd`v2jIk9c};*Q9K$%=?u~&C}H}L0X}h? z&DBDWHtG<(Dgg?_YUh0p#5Z<+rF1tUv| zt8l?9BAu4I+M}65D6yi<098Ki(}+L-B{)3-aw+8`QbjWRJE2Hdt%Qnjmf)Q{Uw~N$ zrGtAYU{WY*0vM>7oMFaTO%)rb#N%gzH52WfJU%{aGTDux1D#a697f<_T9WeA^lZ8- zQ&Nol-wbWK--#X?aRV}v;%46ydBS84)2{<35h82w=a>H8_Ffw(GR`q|obeDbtL#J@ zRw%xa4jF4C7L~Kc55R&Su~UieTX5&Gl^w zErI3_KQbQ!R1q@GN*NWED#WbE|E1Npc{QF1w2i1fUP6UW(NU5WF$)Y&DkJ1e;0D+v z4Lk`|qy%%3P_RhES|yb$EPBmu=%XbRKQ%ZD&a=@Iz9c70b}c?m=rfhbICMd1=6*!Y z=p~7Q5n?)RS8@walV;)$xayHu$d$4!#3sBXZ4}c{uZ_eiB!3}A z1&LPsLmkrA9#anZ46wXGt0Nw!$ZAi~CLt5z#ZlxvLrOS5q!?K|LD6M+^*=*=QkD{s zp7p)ZHmfjRC9#^Sc0_<`$UpsIEmABr)nklzQ%FNG^_Om;{RV<6`Kfxc)P$@MPDFna zSm#AoBk2i8L`bZemw+gR* zYb7irs0bhB_dzg|hPySCZlSvBxV6L)HX(qpj$0!6T;kQyE4+8<_wiYi?}WkB%7e%} zrN2g!4-&UQzR<~=A}y(h85@g}pxNA;-F8mdAB`Oi*ni9N#lF7W zvwlR1Y;nnEUV|Z<$dCjhpe7eX3=+;=c#?7uvAMe2N4s7HS3>$Vr&6Y4C$hvU6Oa`n z^Z+U;%z{H22pD04BZPZpYvcOFUAa=sloYo?o^cF*@*IoMO?8fQJxy16B;hU^XPF+ePhD)xR7oLhZ@hq+&4(~~j@sgJr zzsx4moysGKP16-U)AYf-dNt|E1$)#j|E26DL?#e+4jlBfttSXo49jdJ-3-d)LZpUw zq^AyHaw=JMHA7qwR03j6Q4^G!X^NyLATl!}DB$u}UARQkC+P#*O38Fzia?YCnOt@) z3@V-r!Is4b=7)@^7bD7d6)jMkOt#Ld5o{bjZ8zLlW{n0Jr@ zTRgJfBuolzAgmBfmCqMYc!F>4rW z${rpa+P!pE-J!78;|)5jU`%4x&44+pT7_rrMV$ByJ6Lia%?#(ARXX2T$TA}-GP!vq zo4;bv+G_#oawDiiF->)n8vZO;c7I+?y$+juA@B-Is##2=W@+qYc8!W}#!#0CsTS|PF_A}XM~xlpw|7_M@JZY}3NBItoRQJwcogqU+~{URcut8* zp23F8dZaWV9ArG~xeRKqJi<9R4vL{r>2dfdctoB;5Aa+N6;_pES;*PWiC4L4i;R+y zMUj`W9LNTbOZGhD(Uh7OftCu^yK85~U*s37tn^1YP3oX9$72;nG*cvRLTUzKW~}T~ zBY<#gOXVL!UYT)=!O1(TBb3mhSK0yAeJGSwuyOIk5F=26Lysb(X(AUwSmKro8DgZG zbmbFT-^#e+LkR`KmotkSclZP-E(vUxf^pPr>lcyybTY+?oHBa`;iciBfZ%Jfw^Yo~ z$LlI}B8s(vCd}m-V!qbSULq!}_!Mk^;?N!2g4qi`3P`BM7$I1E^jScTP85hl0=(7$ z$;=d&2q!tjm0DF%k;s3zSRyINXxRKSns+62!T7uy6(oRlNE~q@qnvfK=rUz7p^qqv zVk6_w$m~TXb|;dS1d?$wFHt6O)VOL4e{XJB8~H%SEnp@FC(NbfBwpc(WCK4_i82j# zkAzdHL;051(91$_N}SDj4#`+AWC(K0?HuPYVZ9|lW>jND;D-^EMVu>X(YEy8xvNeq z944)tRl7aIM{+ph$s@7yuLR{oRDYcDJ0Izt`8+;rGTDu8O(*p)?ExO9B`Gzt>DhE! zD?>)2QxNkfco9eT z*&??Ft&`sHTd()O@*F3`xky)XS+Z~fN1uK3?%?eM$H@kKHfgo*91g$o&EEbtrl@rB z9Vyz6=*>7e@P${;Pqhx|Cq}1d{g+-n{OUK}4qmuL9NP70i>MoiN9Q+go^pO5tbtBN zxwg~!xsPwo)`%!nbUYYW?%zw_GWO7s*WMm}@%f%hiQ$ERAtog=Ds}7dX!zPKOfqaJ zdK&Jn%e&p5`N$T7n)8~)l%x`{p)@d5T?Bc9ZLz<3w#}JY+70IrVhP z9%n7%Z3oxh-ROMcLz^7rqny*1uK;ZhS;5kCpT_>Eb^CDim2aJqQ^d8q_9B)*uz%hk zJ@;Dgm_rkyb`xuTz4L?DS3mSL8ft)t&UvO(ynUbo38WZs;@@*GpR>`XQy(-FB92gA z{lVzDSI_Sqk(KsPtaN0jQg&{C@6}aX#OVvpu#q`f4{eh)nmafhQhxS0{Z2t`d*hOM z^)MQL`>pfa>?aL9vLJV-^}g$?PwlNtVQ2PgIJR!wL-FWWg9#BXZ*@6}lcNHs8BuQX zi0!yMnP(>2#ntmxAz@Op6XZ1nb_E8@u|j3r9f2cKMtA?;~&%clIiOg-|I#!^ZW z96E}mg_#-f&iJ_3dj6F6N=FpgPy(^T=SveuWIv%&~o%a+NTb?b%*ETqiCWz!iP#jkyT^yOB{WZwX7$pQr{H*=7@tmemE&I6Asl+Z$=S`VJr0$z($1ByP$QDw zF{9Ou2G)3R%BC3;4yIh>I%mT~?rIQ^SJye^Zq z6S9c&c)=$CG0{0q#%N=6cPTiMuB@G!N0C91`0l0acq)<`Ku`4S2fv>a zTc7*FpKxTS!EvGD$~pDB%zujL;s<(75@sl(V;9A?;X9ihju_tHJQ6$^#%2Q` zHsPVnbH$N*n0cH6b=n_sN*>f4oy{S)d)w=KJ8SGuED1D z;E+QkG(Aa|p;OqPJXT6hc$2`7-Vu8RLwU8+SzB*$xG)_d$V4$#B`Gv;LK0XfM`r_$ zQnaV!Y({uuK00kVs40)|R#w329W^xBMjPp}Z>+hA5*8J^-3X!C>zQGvgVFJ+ zM`Lq%9a%u4(7?Rl(D}by1aZMNM|ES*V_3i~#})2wu5hkk*<2m)Xt8`HV3?UhIC|J^ z1CD7XO2*=->jmII#|LgWM}Hj6gB~~vZ!gY(UR(7H>llc#fWi5BpP}v%1>oK(CIxR4 zc4{O}zGHSaxRz%bM>ANr6dT{#RXgW`a(W&~P_%M$)2JXc)Gf{wWQ>_HZ_d@^AQ?(B zuR}Ck>ufI-(2+kPa{w-t^Y--+mZKfb5;23d6SMzKQn+05tnG0snVZO+~ zEehc@PPUTG5;IXufWr;NfU^l<$wKGYwra8PTC1ln;-WokP}N@p%Ih1~3U;e@G9NoSV13Zj`gMHm>Me?qk)?XeMUc8}(q^U;h zoxRsW>X5WegIkxzg@}*lX)RuI)j?F8&F$Uq`S@Rd>1&@qxQE4DqSOSDxuxU>SP&Fs z+`PGQrsk!?dpGGup8eh*;YI5!fAOgyN5dEWEahPdYxnVfd}EWDa8uM}tkfbc%u`|| zf!bLHG3&oPt7a*eJx2#a_R)7@8w`hCj77dPuCLnB(%IXQM<~sz1|stsDgTaJMcVz= zy`kOnD&IQk_3b-jREa1z^C`S{PMx7NVsK|&?pc!FckyG@KbxFc_!qT-jiR98~FuyC#$pQlH!m$?4IJj>>!^0c{8|LH? zO7h75(k`6L^%G0TYpEDGIM-0S1}I8^Kpt$h_2EM_8FcTI0@GdV^3h(-i3cT^Xj{&m zWt)nTTm5_5l$r#1@Soob+-5t3gnPz$&-$(2;SkR0eLyC!Q9X z^^vgwF4v|XuMn|up;`%HPdGY`5#NX{Li0++#&{?a!6J$RUjakykwug*!2wjnC|Z6> zrRAqIV(|7%ck$&|snUc*TIZ*I&ist6=8GqB0Wt{r0E9Tus2secwN87B88dybM|2EE1%F&F#6^i!LGp4oD2g`U@SFD+jWp76tOZr9>pV zO7BR3FBgfPQy!!DUj(m=TuF=r**W(3PI;^DrKAPPeCk zlPA>95NQ%!?yF0ag-TmJ&i_V!7H>p~BQ<@$SbjCYX+@X=zMQlP4wWZ#4;ykWh&Tba z_&dF00a4{OAr7C&&Ba+-#i)KmQaHJodV;SS?L#iOCd3dSDVFX9)Khtc8u?ar5%n}U z1~;$8OD;r;!b`ByDXB-kOq${EHSr7KNUJP-$Pt}w7t znb4~!vVaa=oipK&bwY5g8YNEw(;&kQiZZ!Fx?C|l!2kk^MfVA=ZA#ZsatUIGNG&Qc zixcLFl_MI8OMwB(EJEjW{@N5ygo8dJ%D>rK@)U63bGVdQ7A7Umb9+D~`0@#XRC5=c>gT*q23{;+6fKzd zuBNz|G8yU+Bjyy=h7)ZmZqzADw&k*@PQvCDwF;)mY*igu>990z_%DW_*(X{IA@gD; zIQBaS9RW<*$zKyT-4*9D338m(4l)BJ))Dv)rK1pQ8-@w*hXKyJk*$LBXxk(5Cd8Y8 zFRD^}p=6km`zQvEl~mwFCF4l~hUp=FW8qI96a!J9F2b*pn}kW-$RHo^(pa|q#Fut! zdTbZ1;+#Fp175a5kUMjA`l_EBxYHE*6u}QlTmd{NeUwU zDqtE`GK)r^7MxF+tu;dEa$O?IMK6MF!JrZ2b9O0oAmls@cUl9+RGf0uUZ*+sd$H2f zXWO5}XcOHi9SOJu@z-OF1Y3aS<>29weQF$glt(QpQq)oj4bgwoQDAV8KD|2+1Q1By+haU)O$l8~ z64U_5IU{6zId`Qy9pH%414jgfO=FKf0e4)D35N!!4vnGi#(lo;V<}>NVAf>&fB>uwh27_+SW!a6&?sq|mTtb(>G&p+LYR&scawR|`vgmlQnJ&YQLiq%c`r z0sQwq$c;2Z-2>y6n3j8Y>yHjSIy1?MW3C(Y0TF2`-N z3F8R|_B!JoFySnM7?VpT3G!bskD?R_Q`O}uzAT|;Qh^fA`ASZnCg+$iyhjB%8Ew*F zxVj2^Bh0D5D|%@DASUKA&7r24rmD56b^~MjF`|c^M-cxxu`$!K)$*YnUb_%8p_I1bJM;d~;;CLM>yMD~4$(dM)% zNpcD2dc!K1K>!a~b|>TnkcSxTUEZ>IZ!`;KHA!*DTd8+#SFbuQ?#%sAf2e@aOsOVn zI1H4Npb#mVyaqwjDR{_U=rx_u!7}vV#f+#Z;C#ue2Sh>+xBW$^O;rPqnJd4qR)`z}p?ce{z_Rf|w)*Zp2cF2H( zOtj~8CojI%``ynR9Wk%E%^bVd&;7{O4}EYG8fV(186~>rE8}W>P5#$^b^I64pVG9^ zS3P}Y*>9Zw(N~y_Zu{}%mF~~};PwZ%-5kp=|k4 zwZXh?h9ih?-0FY&izhF%Azd~`DU+;bFwlY7T}CvEMlx8HYdb$>HQ&@0?5zhQgbJsrPtd%*fC za{KCT=dXS5){lO8ok^mUEsYEqr;^zr+2c_!KKtD1pFekY>ws3i1^u&^yL+25(CmVg zHYDLA`zv<_caL40vbo;*@eghM#7DO-?@%iQxA-EzfA*#jfA0Cy|NG0QZy!+Vt)%a{ zvO-Q-KISeET#qv(lS>su_6*aHeF&6k;r z_oh+*_~5p)wKxi5b$x5^Qm4Ca&Mcs}QRtltvtgLPAUFme!E@0;D_$~`;Fxe4ieS2p;BwYxO)=|ju z!Oi}lM{Qwt{nnMMWZV+YZ7x|pa&mavSH1CgV{3nNcYirCU%G}TN4NUDGi0M|?CxJ% z-PoL}a#gmH4@_ia{ln?u9pBLyG-o3K6 zxr>SxlopFu2L&G8d&|i~aLk)N=b?AkvPGH3<_QeOa_+TQ|72AhZ|zpNv5s z*_Qdp^{C!&+#0@qYw(qCpR>pSTjK*yul|EyymV=A)ep*%cKpz~)4a1(V*DpxJo&>f zoHEA?X0|t0e&z?ae)*I8)^_*_hKp>_W7Zsx-nujR!i#65Nx%A@Yis}D=Po_{)P^(? z*AWD#>HDj%oqXoGv*S~zC$e1QZ+!pefBJVWJ4U1t)Q~ioIXw0(=Rf;;Z|qh1I^T946Jh?5^$ z8R*;0svK?o!M)FZgVjuqtUPgP^>6)+-JkjK9X>6~41b!31)K{0wQrrh{Py6L8$&o} z+0(~Au<@V#d;9ySF<~d*XkI(`Uw!8A^DmyUehBOH`lXeh`?2j`{&#i*w*ohdBu2Nd zzjb~O%jugvj12~PF;*B1e&NQsGf*2^i560$>e^m+dqc~NJYuo%Pkn6rAO5XN3_D@e z$Pb(YOzTU8R_pCMh;$E|kBOd`kl2yG^i#V(@{!FVX(k{e{-;oV@rARO-srz{V~BaW zx842G4{iMFFJ8L5zba;}medSOXpe{g=N}(@?)l!`6ZXe%yBch*{q37W>_4%)zyJLkzxoUN*RKIym4S>Cd3xty$bz1~`sVq`S)VGhwb5Dc zc3!(PyiHm#(72Fwf14HGo$d85^Qtha_jgu);$xft!O!la{F;m62=KRV_uDJ&Z@h9Y ztMqE?+}bbQ8nI*z7Md5}y!o(M!R~tZsE3Zn6o4Q7@aBK~3zwd`26)zs;K-Pc`W&4M zcR$_v>MQ4Wj+`yKy}=aQE=#;w&)!7Fjn*;2pV;s2Y;+G|oi0n!Kl-{%x`_Ueq^X_!>XmsTA2>QM;o>&N(yzi|BRw+64>WE$;wbES*g@13=79QfE|o(BM~ z?{ryB^dPG^V6dqD~N4;rY@plt8VS=Q45BYceLhQ8BDa>eO7tT zU8Dp!%`X2mHe6i1HW-}r4o()Xj7A2m2W@KUL3fOo?!Vv1aG6JMu~dD1V>{k6Xm7An z)<&#+#wuDgcM^6twlUbr3o00|D|Q8Erw8Y!r?w8$7ecuZeq#&UR5a=tl8%O_C%5|j z1+yEGbbANRl@?%;XBMuH{V_XjT;8JHzBij1L=F0jO z+Hh9D9*&7r0(urvDf6wmbJEx z;oMo@wFb@ePJ22UoDX{=tjQSNSzX=0TI}^G0JCaDbQF%E>_;@WC!)Dy?R)p|?%S-) znPG!RbhWv;)1~Pol~Nz)sUFp5fh_Y-p&*lv5bSQeYzDmjir;yL@X2CWc!;lQjC`<+ zgQ>>$_DKnOat<*oJVtFkYr_oV3k-e19t#<*i<*3a-=L>$q;K0;Va}YTlW{o5Pg2q_ z5lzFK@=j}m?L`~Na2l2h-vPnHex)u4GgIKO#)4%MMog`U&KRy343inCiJRMQ%egHF zgEaJ&^nkfW7;q5CBbIMVQf3FHq^f1WN|B)-wUHF-6G`djhfF(#q-Z9z6GfGh%a?b6 zphsRN^O4-0lffHwRda17rDSi*Awwi)7Zg|`7J@MGz#2fq6~K{uJ+%M;KmbWZK~#p?DX10z zgn$Q%0IBnUA$8;4`R!xpP|UQl*gce6GauT_Bfc{C`HQgznW@x*OK|%;w2cmNz`@Zu zHq-F!!?G*7yhI$>KW8+GA`+6P&eblJh0;hcnknFrXr7QR{5jc|NWuAGZ+PQ?W&TrK zC*ocoLzXRgP#B!Mf)+TC&FF|;xG;m!@OXr21n2gaWyU9ixa`x!pD~*k*5sz&}j_tN6T8xF?xW{%{Q{X(H1}JwoERATHG{~@{Gj^mJVMeFE zk;v(@{C9ffa23nIA=>)F#$~#UsfHOx(S)H$h+f+1&{5XVCaQ4k-|FE|WiURufkzcq z0ceT8C@xIH5t*88E=^rx51odB#-QhiDBzPK&1*8yjDVJb64qSc4lDy^8VA8_lNL84 zhCoRir75g*n2~;#6Q~7e!a{N`t05@KvFOg$YwChWO*iBUPDnsSp^_z%LJB8bsY(+G zZ7)STAw1Q&Lg|5;GCBr8ntzX%c~&=jl2H>xG$>)>0ip!1at zR%F|jQCX%g*&VZ&oRd(Jc}U0wi{cV%l7c~(i1wxb&Rum{;V@}9uRY;o+U--*CmF>j z{|etesG=mEEx(26o&7vMYclzI5T@@-lLXxFOIay{qV_IaqWCiC_hNe>n@(Cfn(8dd znFLKJOB;B3z%=Z(u^+gw5q$xI(hN*`x(G{rPS(SOq_fAM(Z*t34hD#Q1vY5V)3aMO zf}RSKs^cFpoFiW0 zAPFwoY70AK9i|MXGYa6Eh%hIAND4EWQC_xjD2D+9Dbt8&^hK4E0K|k7R%<3D)d12Q zN8vc8)z|B}60O(=8Ngqu-Ukg!$6YMN13?7+;1`av5b;LqcKQDAZbOFS|C=ccN_^inkFEUGKl%a4` zIaKkPgmnScyLctVq+saEzbfuDW$inI(C~i%XC!WqOOqMh58VSF>1ep^D3rqh@8$AM zmp6P`dG?~j#({#4$95ia?3m~@q9qOMka&FDa`=jmA+cNlVj~D{kCOO`7Vpr$mc(X| z7&5CPx|21T32=&rU4%`r>{|Fq(H@9y14{@W=(}!62|Kbr#kn0S^p4kI>OoK9%n%KW zQt2>V%f{jYKenX!fHuxJiNHIueXdWt86B z1>SwzQ->gOF@VV+Ef}2vY{El_ymcKlKB7z0xXN=R8?tKpz>L!+qnyB&I%M8S!Osg5=)if zXAYQdq#it>amK7wgBc2C7?Wa&9i)?{kf?T!gn-5Cli%pgRX7JY!A$|qOC(0>NYr{p zfr$bbQbH61Y$nmTWQ`z^a0*U_V$s4JuM?r1!hFJOOu~bCWHy2im~vu^IK z>~iW7C}}~qdRc3QFbWYBlQI%n<68tGnzA=Jq#`W1^fXN+$l!?4(1rknfIxnLByGrw z+XviG_+siXZV;ysmY4uDe&7dAq*Bt#6ypwYc!sbU(MTDw%9;j!25~1=m=aPZNG3l` zE17U{W$NZyc-Hyyq)gTdR~2IOH?mP! zHSIkYx0Mu|l(=g)aG;q`s5c(xHB(DEA&4x@xHHH+LY6liWH#t2Y532Qho@@hFH%pZ zkNnMDB`k{KH8YXXK1CUrDhPGl!nVRhqm#ON9Kt+4YqH{Y zO2W!>!EflL_-CA2Wi|CY*1S(m{HTta5kE+JnF&)lFwK}@kyBB(a8hqdag{KL>liqq zw&E>Ki7HVgiBOZPK`(NEPb%g-U&(wRBtCba!qhCxOweoYcB*A%Mrlzi=-~eAPDjsMsB8h^OKS`g&NgDKcfDe7)K?TiU z89B&c$&TAtid6)tqNEO^FUvkXa3ze-4KiAhPW{^TM@XfT23bkGLL$W|T=2jjY|8?F zb&RBM`k)<&wQ`H3(h#%3L(+#2H~v%vnDJIpTn+L`at+RtpTbB$RWab$mYZrJc%5?1 z^8~Jn5h=TPKhnlmLB(v~rjxrk(WwT0LL_$F)0y5CoN^q29}gY3$dG%0}2cq$0xCkjFd3mJ>$*GOv;Aqa#kSP_C7 zf9@4;HFBg^h1OA$cmi6vn*O*^B6qHgI0Ih$2Z@wP%p;C@;wF6pYSu^OdHUMFrp#1o z{~7!wn@$3~ia!qyS+bg;Rop_H3C-M-Ch0S%jyq2oK7<$L^GkAxFhg9?P&p(>t}@;- z`V37#qF1G@PHR2|eG-j(c?hrYbhv~!oHD1NP!zO$3bFqp-efqPsg@v(7$_ma0#KTYkY5o4Sbhq=Xu2DO`Di;6gKC77LKRp6 zBS!&DI}(w}TX#IF5>PqF6mte~KvJa$c=du2p5>Ml=7I!F>mkXA7VRBV`Xu0gavmHr zcPM>*!bK?eU?=3RG?UPh6r$o%=MgnnuW~bRA}xa<05#@IMcPSU0Ea+$zj&^HCMi^{ zsxgzFV5+cfgrFtR=2x0X>M73dXx3C@bFB2L_pQ!gWO&wMj#(kDnHVo)aFPlDHl zFHy@q!xAux8CbPeoo42{&V-+mbn+dXRH;TXH80IHOk#pyNTSp<#*zq~FuoaqJPKTu z!y-fEM#L|1jpbGSHeDHV;XP8gkm8*NP8hoYDTwY*Nu`eBegRSmsfFD?7tO%69t9baJt}H#-xgDs<;LX&&5~^;2*~8@mZ6} zZuLfQ)1F2T{?n3_r>1AqU737F^FCLPhf)F^s!7&78FlVrQ)r@}2@bO2_5UWtXXGanlrwJ}-F~Pue zaSCgQ@X|afnhbSh9Q;BzGVXw`b1YMtgd|iD>Q2u2K?icnWfZ{E?X#YZi{}ImGz70A zMx2Ve`i=P3xKK;LC@fdpO-5$(3akhTg**D`RS_glCSUszgTIPL{QZNyi3kaicL^i) z214Y~WcW)$LZkHK1PH{ukyE-+s|YR$1|T&5wcrB$A58O@4+`=vXz zuA;~R?^Q0uZ+KO=P-C4--=Qzv$wu;4F;afXSu@l>bCoQ%j#Pro5GO*0(q>q|tk6nb zm5516UuZ!X8Q3z+D8g)q>#bW_aIiy{6*^N^pU^0i-i4yvI>poXb9(s zgUFPdXg0e6&X2$RFLOe25>L%)wp~+kXHy8A!aQljV>7KO`Uo#RP=4pHOjIVPTalWX z$Y`IU3``Y-I&NWGVM2eQpT{E0t} z(8r<DtYt`5n#vP;?GhtbPA4;kDj2{%9q6>B%nS&}U0c5c@5Uk{5g&qcr zeU0z`SuR5Z(Pa|=ChJ4ln432*Ru#s$N5?ne(qBYJ0VWfg>HOA6IjtPNt7Ba7pRP0(gVlBF&7VwZH=^=+1 z*kIBo_gtc9WT0&0%py5gDGua#sv(Drv$u(>C;b8S6wb@MD6UV!A!Nt zQ*$-w6TB=K1Xs<5v?|1O$Q4plqa+=m<;H_d@k$`G4y{FjaeH|pvW*flPt+Kxv6!56 zL564UK+6o#{aysH^a!ZhW#!aRp5m&~Y0k8d&2PlI#>2b^x zCrr{LV9D48^a>a_Mbc1L+3K^f7 zD=CvxLw&X~R{k^OhNqfw1b87_LQlf}CELWby!n?UXcoMZEq;?H3n64dQ`l` zXb>66aTN3u)OMrV#m;aPI_w3O3|s!D=#^A!1I`r!DcobibOJ+-LZC*PHWudF8-a|E8KD8kDKa4+sf9Ee zTXGaClsGP4k<}Rz#2W~UtR@A9y+_E^MMSZwynxFmlwgL!q2WVU7IKh^5+*&y-&qb1uCskK_rHl$1 z!p5D%{Ur&BgEVdxO~nud<}vpmjv7*E7SkiGj2Ccqo$ibjI2E?PX_Et+QA#aSt&!#& zebzq0st|vd5i441KWL;&W)_0WIpJQ_Z*lQhVrFpCh#Yz3PX>s)keJ}il!#O4lkLKM z0!;40By6~ng8(mSO-S)AnV3|`L6DWW4O*Q^5S~F*`M`X6o{mt_`x`H|BIwTFX<`G) zpP4UZ`JpB19S+Y9(zCp8yUkTx1ubcVlLgF_P!pD3!7a&LQP2`;`kwGnqNW4Bb5F@a zmhGjfCehO141lOENB1Fpq~OPAO(xqhn55IemJo%9X^CuoN1UmAsrk$d! zeW$=Cz7OUK$h@I_iof;=#fj|?-N)2kJEaLY%A*<#=E1K>z6-iJl zNO_gvN=?u7rnhiO^%{F~HR)kT=27oj*FLY9s_>8Hw#MEsAt|s0KblrfEM%9T4xC&6 zNZjrTg{-$%*(p$C3~EEdCc|h{QW#vgNvGTBAF+gYR>9hwFfvIG6pdS zaN<>DRC~dSDX<+NmmM~_ua-L3_qwP3wFQ<<+s&>yapWFbIAfdzSExm1U|Y3tMNvs7 zuNbRJ-wT^eGnen~EaqNg6?QO#7V?sL6@@=EoZ*SS*$JFxnPv5?){i_5aOgrzem#H# zD*?_eS}KYYU!J|Xc4^B`Lo*k1JwV*o3m&twp2$q@nk#qCZL@88S!!iRRo1e3s`pUMU4K8?M z_i{qJw~nlHWD+CP#06o6dJ1YOjU_)Rtgg|g0ARL-8HyCU8?I1iQ+?qY7YPA=b*IaA z-?%jjHN4m=LCpl)p+^OdG6PK%JlKX(RkqqY>)p-O4!e*dcu-FgU<(EIUFYN{2oW=* zxW=DSAunVyF)DCUrfg6Eculo5DjTp{>`891H?ihLxw^Vz3&2(gXpmrp+}~oK=C*kh zq?QjPcfZN*;xCSN30)-cP1L3o9nG5{+> z7PU9oz)h~RZM7SEL+u|KL>8=oV1Y1`rY`9@-$mYN+{i>Y!38(#93neK8V>}q8^wV7 zCb+!7IU7>9+#-DzoYXoi>+Dz%_!c)ejDQ)M^}%cbNO<_Qd5Gx`$||BKar*O3LOJ zQ>5|0!JX#OAo56d)C+kuqN|(BB4U`M9`hQ@BrU|01ve(KIxnE7PMR|Tj5-Ae0S*@x z0D{?Af-O!eX6SrFQme!Kg`{g7+NA2rtKB@!Bl|3nWgaWIk~gbmL!z2nP%IDSnkw_@ zTZc&%*#+&yvx@od{60QwGUO!x`BiZU8t!dC)yMAN}Rmd;k4!++1V8&YfQ@el#$UP=Oe3;VhgNUhT($$i}~UF!=31 zJow5BXBP9=I+5}SH5~!g3|-~H$?(hH@-Qd|;o7aQztaEpe|B?sGfXV^GY@!1O`veB zZv4`XKK(tt8kW|<$@q8w?C^!xdvxUP1O&Bea4&AaxlT_;pMU<;(GCw%ZoPc-{D1kK zI~ICtDqrx*n9Mu?c?_NPrh=3B}y-wyUZwO za1I*$bN=|3zTG?S`LUaB|E)XczxnBd&wfL2S`_pWMZjAO`Ly1=cmCXK=P<)L!-wth zUp{yG>%Vnti=#rYDzMkpiz{9P=h(*H`1v>bY~YL?$vEbX+vDH)VcG-LT)h)qnAg z^JM1Wc>JedJ?-^x#mS27cN5?gR@fGNe9|9%?WNw`V~jF<$g<&`6ON7PUiQpMiQ^Wr zqH>{jPO>4h$nE2E4!1o0$G>%p<9wpivUDZq!sOJzf1@sOFihfSD>}=SIK#({o(Q1h|+c18|BH0R#HV2ozh3Ho%V)bdFlM-J?9Hh z+7D0L_tuBlyW7<2>5GU&?)5o5W=L@b>ZCW~RK|buyR9cLTaE0UrLjN?K5}UPh1Yto zz8#Ig&}wq;Y}?=#0wGHEtdC+`W8%lQSyK z5ieM$zQTtVPy6oa@R%w=4Y#H^%DTC=x3<1TlMrvlR?di4qV_peCC9lvilo1>y}P=$ zZ9dLjB*Q^@1MFo&F>eRwqroQh<1uGY&0mnWIJK`N$Gcpw$AL7P9F8)t#1JBCgdYaL zf~Dc$oMRpr@DWLY?)iSmVsFC-f!^xo_U88Gc|P!g7}#^q1JraT7ILg@Zmq5_le7c) z!1*OwWKdH0p?NZM*WlcRS-@p z;*84Gjh*EMhVME`=EEexx>*r$=xhIl13g)3jZv{qdzZBG4Sf3bZ|!vO$F2h zkT0xu;jd5=N?qlNAIs6ZemxG*f=N!i|06%Ty?_0ypZPtywVnMZ`@IudijbsAm%>}F zx_>SXN=6k#XWxDHgCAL2-+b;1f67*e6aNNH?TKR&v+4U#ZpP=pvBhOHuDiiDb&LZs z2FDJOE4+#OVh?hRdGGSIpZg=j}IWN;odh7aemTYC=gXGTA~A+074mXV3-AL_JJ;Wy%s~oJCiIm|(## zK!)Ps=q;Y+TU_@6e^^OVDYa%06-jwq%750#nwbaDOdzv)5{+!#s zuIkl$)wr;oa$@7eg+-8J6Vf;aCm`Y=g`g-{h|q{n1o43{2q7dukx&pQ5#d8ntbk(2 zE^wR}<3ui8P%fujuD*ZmeeX8sp8o8f-*1ey)?T|i_ulvJwS{1wefFMf&N2UUj4|h$ zbF8^$qhi!#%CX{`(w$;oNnCJVfpfoH!8X~23QKfvvBl~&!<6@Y84#Rvv6A^Hp^98d zX(7tg3%^7b4VzJqRLdOrm7K!^ttMhlnOVsGJqE0nC*%!O+NRCz-H-mhANlTAe(U)7 zL6wsVN#}1CY#Cxe`uU!;v6;3HPLA$j!@vCTAKJhE{FgubD{;hSN>oc#Ail4kXE!#P z?B*jpEJl$S#(zeYd>3_cHn5D0lo@3;SV+Di)r#O6>XqJUat6|6fp=(KUPO02fiPZQ z+6&@%c{*~Wf|s&u11B9?xZGI0W5DR;WrK(K+0`ZUK3ggTuM`@S9-VOv_EY)*1UST+ z2#yFwGsL7jj71LEfgYPOdp=$f`XaL734yJ43{AQ^fi&DZI@%C%VS+ajq5E&Uy#%H{^Lu!VR|vZUHDQ=6Yw1j zO~0**+;BT-fMSS*DMMfyn)J$@cC*{E%cnaINukH?M2W%N&^Lo=55XI`qXMPSCLnjP zby`bac-y*2h8MbQWA5VwgTcy}2_*Bmst0sRHn?RT{Pk!$a!9qu~V)&TU-r!AOjfK#1YK z?h6~Nt1xzHdrhyMY>}aA#mr7y#X6cxJ%Mwpvs(j{;F$+P5p2~pT()CaT5yq7DFk39 zIJsa1hoZ2Gv>DlaOH{nbppw8b*adU8p?SLR9YxUVl1p=xj@M=!vW- z1foUg;EG`KMmdTdXAFTHkA+#L5SbM8)C|oAlPIc20NI@_W76A{B=v?r@sU5KHrT?ktl@TAN8sPSz@DN64SYGf$Cy2v7!)n1urJs)EWR!h;G5nJqT4qWV76uk9wUkacxFg2? z7-1dD)c&aQLMR+8Ye=Lq5s5TJ%v>u$^NVgCTbDU)jwv#4)T2)5fHB7*!`L8GhmNQ( zjPr2Gcn=*Xe`t)p&_1rH1<4bECe*OfhCo!}M<{$WA}cgl)oj>vL) zJIZ>8i4*KAZVFAdaL%PMNXFzHzvYC%DySA3!Z9GoD!T0j^*U3k95ya!#b;x zPz8BW)yXD~icVPo=h2I&6m=36hF@6s?uq9U@ohFNpeSMsdZkMyQ44835_+vq{{R~y zGQ5~n&8U+SIWsa;b@9K#p$%{_<|z})f*H&RH*nQ;c3Q}gsl8>Qs*)XmT;dE_%{k&z zOUVLz8Zw8geaMU)EmHq*qVa8+YP2Rk-^GaS)%bxRiW&taeEG$_GUgURXHmd$D@4hn z7E~D-kgX!9sM#{$x&~cC{r|oHU(f&*qNtsZEA2C_FwYSD$t8VUja*5GMCrm~BN8p+ z@_P;*EBZ2>zXax|2=s!sw}@JfRgk{dpQ_J&uK*oyN7@Mwhpo*nB}x=9IkyX=5i>U0jYI0IsE@L9n;e z*x&GkKr(_pdrj?B-{?ut#7Cy_F^WmP8|?-Y{s8ZGNXsiVK>&wyOdqC&on0_-YTUP5 za}0y&oBLZ#DQC1SI_5B}>5i}?2mR5-5bz<)JIf}DWV7STS*!GHX&WDw+y!hA>8t;> z?ac;iqE$oMNS^u6g8I0ut1^|J4fFs3i>@weo>xv9c^ zlb-x=D@U2G^#_x){^-F8lO7zMB5}9ffH--WtGK2buV2OxFAB$Gp^UEYuwbRdYxf*j z1>ZiMG8&F3P^QY=KXuNcvho@l&f^fj#dbY8M_4AS0s;%nh`6@f-0o6gsEQ0dE3b`^ z70fzz(H}oJ9iI1G|3n-{=T@Gm9`(ok!bQ&7{cujT!DORAH@i{QH)CD|;90w{-ZZcr z!#=$jADxfRd(7~|8d~3Iud(ij!hwUuGKHDT{`e9*4?Bwr(^%VP>~lpc#iIm|9=*QL zQS$Aig$DdkUhrE756-o~E(YLB3pf>Ki+YHH=87kUmJr zu!$EfN4)!hd2R@ogOsTYx{93fR9s(sT*es>WrfGep)57&jKe8-p0lZn7aW=T3^s~I zUO@mWHrC6TQL|2d%t3pZVcJwEaRJ!?B=ymk**doBxLhW4rKH0lvk!enuoyv?nH7#& z#q>v>-4fg`g>nAnoCAlXFb;Ss0;MzIb;XULnkhXebWn8U|0wWAfOBI+Rp!2P21c%B zTgE+u=mX~Z@(^t-nHB4D3f^XuM1^4nMaen$U8}`ftED9>9FuG7WyC5>=5u+5$SiJL zd0*0@(nuF&WNmb{>~a@s9E@TtAt_iqgdRie#Ux0^i?V)I)fXw=d&p98mcl6v|9qBd zz$BHps|X6*DTQMM|i!v(o;s2Srn=$ej>E)_r5HgzWkISfmmJC zJXM-n*kgJlso4a-*gM%}{_{Vy{qOzM4PJC=yhU_TbhMI_37!2v`mKw<`gb4L9j~oD zf6)4wpS<>me_#uXz}CkuHg7$QILJqL9*+OUryl;p&z-r7bAA1XKeq87{Mj2ApoNw~ zW|3mJfIj}SU%U9Pe)hq=lOeX_{#N5>{=~IE`iHhjD1G#u5>r8K^Cu_gqrdULJ^aPb zoN+<-^wF2P|Iwel{=%(js#375m_g6uWom<{$V_2fhWLMJBVfioW^I z@byE71zFhf<3G6l7yrZo2Bk(E^cA>egef-swa=gb_n$g?tKTPjySx7J7g`6K&5J%S z`bwS)ZX6{-b#ELFzVw~`SGoP_fH?Zc(d(HPz2URV+J&{^#|k6e)aON{@mfW z-tNQ9*2enxywG`mw{hB=`7b{sXVl$Wo}a3KN{u zEqwX4-e3R4hrjXFOJ004KK{zh)+;xfF51+6qS=536}-?=mRYoB`fkH2t^b%LGu(zV9NpKqgGE&=??<2i_9bI`8{PGf+-l$2ZPNUU zUSpk0Qd5`TemMNvJHxXJPs6^w*ZSCVEzB|odKVpf1Ly1S4qm^H;it9q>h0Fc*IQJj z8P2I-*p4x%eD`?#m3R8b=iVo*2mkns?cJ`^JQl%u2!zFN-yMGE9#aU{n1t}b8|_zb z!J`}cL^0J8F}T}YKfN4%d{m%1JG;tN8fyRz=I`fe{sM0 z(dU__p>eO7U1=s*!}?+&;MeaAX*XbYr_=c8?bZti?lCmSJLJ?&9$)Vs55M}(@Z{3F z^5$;id!BFeI5CyfT0qs&uHWo-d64+-rA9cF6$5K$??&|LeO6jve}w>rPQhm~*7@1d z#mNy}I3>2Zv)A2X(L)TM)Kr33X0+`Z#}Dta5CjXlwb9+)y8(OUNbXDm@@RK9F3(TT zP7kr2Allg9+W=hZ7?_sPPO|k#z6+Eo@<*2?>- z9^QM?cSz%LtGlsx?KV#VyqBq=7G8UScK71+;n~TN${3IKuHSBNY%t6KpL6tF)0-pL z@q;^qK|dwkzxg88YdoVZ(pww*muDvr?^}q!2QFIyzU|OzMVH|)1kc$41oJZzRA~#o zr7PN%D*00u>DgJ6A!jxL3W+MRd{g3@Je87)Fn(rexB;SVC3#lvjJ;A373P&x%Oio$ z(K!1$)lXYbUvh1``H`2(%>^(%3N}M1MglI!U%B3A(8c+KYipbB=JPiiuY9oUD?=LT zuqKP@z|B43ZW>}^oQ^|JoLoal$?X`Sen&4z$Go~_~*exdb&=eorUinN?ki_G;JG!Ku*n;m6D zSau${b@4V5wcf_LI zDR^Y-VBrU@GrCOsL#%@-d)w#@k?bNN)B~RE6 zB=nka?85Qra}d%w}_P$Q`W zK1{P|!0BP{^vu!91xJdk`0W`at+NLxYHk0H&#w@-( zI|X5po?6HX2E!q=g<*7XaPr{v^7349W*wZjTb=IqzE#C4L#eFwE?srXu-q)IS8$7M zS~M1*sfp3q@q^3rvsKpQ-obOhb(95TX1(6o$%7$Q(GoZ5Z0vNme0r20bDNwW-#x`gbaG4S@?W@5@zu%F;~?7{Tt5} zRR}bCj`8s5{$a0o?wpV_8w!p5I6rxCH&%Ji5OV?9<`&DtS!ECLqTc4|pWbz)^YCN| z&J;vNAe;R8J?{v~PZ42h6(EE!(fmBXlV3kOYcko@q6yAvzDm7$4lQGlA2t-kOz7dmHQ;#GBFtblAU>Ah`}&KeqCJ+q#)Z4y$C7#AQac~CsE zmZc!)QHJ##-mN5|C#O&GiJEj3JsuLn-Gm*%d_@?qL7@kM4I`R%u!_k?*uYm9lz_j} zY_hX>jH5(k&`DKu(BbU3S+*QwTC7)vX?lN$JPLf#LQ(^wXN-mCyzcjc)+`8$k=-eJ z<`v@7Av&p%m;PvyK?JtrHW4aLJ1!)p;Cx(Vb(C-Rm@)`>blNbptW`sFNceWeFr$6G zR_0wT(;MSGc`8Jy!Ieui3^B;o0gDUegH zUG>?wQW4Oh<1W#vhWPHZHq}V!Q(Q8QI7~@io?^TbB!@}PkDlNYzkQ7rhC1NdDvZn6 z6IhTEv-%}OGZOux7nJFeWO;S3N1R`gM^r8J%9x>IhFS(FD%29JF&)uTnsXMnwGtp# zO$DVnM&+KTEzzKYUe+|UY%xW`L>=BPaPbwsJ-R6F-3pacDbKO%z-sF2!m}3*n6&` zj$)&rwP>PZsO72i>5Lr*xi`3*-0oEg^P4VNA;~uW`R0)e`lwd3%)qFXFBAYV#YDUV zL@ZoKT}U%W4-4GJAO|?ZWZok&v6xLI7aYhufiT-R=!rI&vn_baiISK}0W-n5WKm!E z@y=s+!_dqOu|x`HZAxZRTBsfSGef|C*)?B%vcXeFp&$)?p3jS=p$2G*EIv6d-JhFqu|jtH?#tpGDl zV&Ayo3VMH46*ImU8w@Q|TjzjW))vlyKk>x^do=|3N*A7F*S2e3q9Drp5Z)Pr1gW4b zFg^h>4J`6`N^eKVAXP8yeE`~3LWTvaapM<4oYyhIOXLUA>E)~yah|;x{E3?2u zquUq}$%^a=%dlw?oucGTR8(|myq}`VYNFBb`U=vCkG8Bfih}d4B@zBCdQ1+=KdLlq zih1cv3xs(P?Ltr%#K;x3iuwdIm>pPSm^GNf(9_De_cpMs;3z%(&VV%C?~>cCQh`?k+GN%^s1Vm$@L2so@XdF>joe9J@)Ty`jGBS6F_ zvldeYP8p#BU2u+HGtkisw+wcZY*tjs2=PUS5!A(3cM;q!tY9OP#CL?CRTZCkCJaDwALvCc3LlZ+&@^ZSP967< zaekSs`jHRF%b+qc?%V9;Qzw+XaTLB~5N2b9#FsZ{3MNhH+i7$tW{dz4I<( z48=FYeu!o?|M|h60E;l8mjb0C&a@C0S~7m#5u0LW#46%CX68-^t{$EUd?zzWz-7{B zY~5ec3{4Ww$oMddJnY>(7VM%F zPMHbks7uWlyp&*${%Kv-^IeKrG4n{udUD%^DrG(5Y5AX>HHn;Xj=hrgExH$FPx)&? z6$;^TF9Rc$@)b1N80p1l@*=_0Qo%e$$LX?Vh}*}`kx7=i~}k-0hvQ2hR^~qWWh1oXk9VZ z_Jd+Ak>ziJJOg;BFrU<40Gn#j#UL+g5nk;mZzlAjq$gLn2wf0rjV;OebsRp@m(=Ai znAY0zGUOx7>ngB}OgaX1i-7zM_E*pcd%+>JKI&&qT$C6UwjojUY7%Dx>w|&#@l=vl zX;R6=795ue6QLs0V=0IRNYH1c@qQw333$*eTEr%B=CTAl@RPwQtIBGQgy^_n$Pu(e zPF|d`30=%OF-pc zNJ8nDQ<2w_GAijMf|AR0c;+~XaPvcOn?lJu$eF8<5Lin$OO(g2!c0b^504j+$|CpG?{7J~W%R`R zA(xD$=0^|>!gBJ+xnMphB#$I>jC*N>jct4aIyuacxda7S$-HR`5%es&h%bVd5-cWp z{E#aEtElww9rHG)HK-yWyVT4yuH*ok{1gES6E!Bn7wOA%@8kE`S(C|b)dxm*Y#9Hu zk`z}9;iXj5&REJhvLbOw`;>lz>&PsI3Stz5v5FWruyfXIgcCBiSZRq#=J+D zLgTV4FUATKBdR?%K*ai91Q#O-f|stukNmj@F;87&;$R6M2DFOdJ?Q0uPx-`5PfWK> z`$CjPryaPd_}2x;66=%m=-@TNq>+-CG;Q(G|0i#Sq_zeiliVFr3dqPm36_*Z86*{U zuwx?;1rOx_06+jqL_t)#;KQIm3nJ%e@*-B|i)+@OdSPbFr7N>6w(0;eF(E_Gx&3!zZ8ycYmr_j@sQ#6`47 z!AdAo_KdM4a1o`a;9T~Jp>!hCASg{6$!1+Z1(;u@^C=`)lif(*BT{Tu2}!7r=%{Ov z3u&X8%wiK5k0&OH>Q(YAe<6YCs9F?ER4qi2`N*P(Pk=ex>N0uDOLZdZG8e&%aRu+o zQdCHpl<&plMY=Mg{55#$pZaF9A?u8p#!r29N<$Z8ijc*KlD0q(q$N~U4nb$rgeyVo zX$?&^MSZe@L{R=%M-1X820ER5Axr|6`NnT1i+ryBDpQG5`D?zbQ$JDc6n;svGLm2I z=tntQ$cn1+EK5~I7M}R=tBROQH5-@Y1?{RNi9oDe@pCoZTzn8`+C@%gkcwJ76E>Hm zewh`i9y05Xcq^0qW*rLlOYbbTMAFus2!XOJNu5@`)Dy1qmqhcw^YoGFeBjf%E;GLh zucGmuTqZqb$>XBydh%pXkm7MUuhZeLUp_%@Pk}UYwp>as zl9ic~nz@+fSp^r#r!h->&{Xt=Z+g9)o>0uITCyc%MNs)zRm&yis3pnl{I=EfC$Q5$ z&r+mL2nd3v4p{e>Sn(@t8Cf73UIryiUe)f4ilthTBwhY3Kq>OPez1e<*%gS9FsWFNTz{#+130VNdoO*sC)T ztR7qUFJ|-@s#{D{h6sJNEQ^^hhLmW_e`n~ci}1vkoq;@5A>pkEr=WF4mqbqq^;KxI z!7H!k0Ou~}k}bwAhSZbH#a`Y0%@Kox;EREYpW#((T}5>UDt|>;3%LS5)mYI!u~w%k z7knirbwkE%Uxav`ns0=D-NLkeFB6*P@ldbr!;jf@r84P@; z_MH!ob)C+-_SFxs7kE3w5FG{zJSC^_=dNtNAo3u)*fzr*2U#DRZ;PD7Rkjll0|qI? ze7Q}QE>=H49h1JHuUrxX4rS1@h}X3*hVwobxEQK08FmaGNGXFUVj1pZDUdn3)?%J> z0tI(z2mCPTs0guxqa_D(v>F<)INuA2t4^3D2p<2GE1=R=Y762h!%~jSoFNW2ha*47 z+xaCOF25sC;=osIwK0g)HHixyX1YJgXto$9@wkhOi)& zXU_VF$iOSVB8B;qGpmn_+UV^n0b3B#6 zAsrV%DKAyTk_6MZ^x1Yn#{UX_rWg=jEotJ^66l>~IE^qcJ|&(P!q-SN)Qo<^N`2$nj#%PkE~#GXpeRI?5xRTH+mPnbgAK2j9E#F zt9oGFU+atw=D!|W_dk}vk0zQzniq=4@L_K(TXJrJqCBXNQHLYiQi_HEQw+0)H@57) zZP$>Ezb!T&x-mjXP!vCXyvL;oV~37qSm1l-1U@m?KB%n(hn@lpGgO$8)3QDRp7s~E zlg5FvLL>7D&b4A>K}1)AML-zV7@T87Hr&9E?nF)^BD$NPhofvkGzu|*Fg2k{bx0t6 z39Lw57A}w?H7iwOMY3FJ34>B31JqfMglh+5oER^7LMByQR{9H&u&8VtIC+JyV6rf> zFuuUc%u#QEBYiMW5dmJj@SOnvUId0D}%Ha-$$Dl0}jUTBk1PvATZqIh*=l?v=4gK2p=O?TdigjK~SoJ0kF4K~3SzRjd?cq)I*S4Q(YjjjbgzIUZk0-^-xw=A*< zx2i44!_u#Z*94iPuBi0H1z++K{yAbV4WGuPuWXQ(kk1E2NzDh&T~FbOhzq`^^|_=b zFg~T`yb!*OpZ^VnEPtb{GOLNpc)|HZ+Q?uDBaxACB_~DB2Gno1A~=77&G-uRD_JQM z7UUJz<#icf{#IbC2ui~D^7}ZLNyGP?0;;r8KfMaY##hNpm9_}*x=2_2l$1~H_t{yK z?}x?I%Hzm9qrX~~kCV1WzTiz<3>qALA(kKZndjMNfz;vcFk_9fX9LFQ6dgaCm}8Q} zMEAI#$RHp|NH~)eHKo{Oj=r3Eh~hh#C4E(c3l>aZc3Ov;dNF)Rr{btu0h*MVP}-bb z-;eFY>GI)X>ikQ;1pT285wxQAB54|B9Wi? zDlxqz00Q-Z<>7L0lVH{`+yt}9bqaw$i~z^e++P!IqaLvWWcp+lVIg+n#tlLag2xy# zk~)0MU!lp!2Bb8?w8=EfM3(1ZR}(7um@*$x(Skt|2Cjpea1KdoK2u~q_^BKCk%+E;3Sf-<W&vxtK8$%M@e%mY{c21eFW z$1c$xT$D2DOK?*}I-+B^+N^8cli52!79xmWcSx!ry6k`u1h&yo0ba$!v_g`VPj#7L zkqYPqa4V-1a;LSlz$Yklrj9e~k^#fx7L>9UsJ?=oU^Bi@1?q}J4X1(l%#=@|q-hj7 zP0n<8CAQ%|PW>sXDQC=fOJxrzmmG|Jf9%t$(=_)k=NfiRk z07+wL{P-QNz!krYt)gr*jjsZxsa3!d`Uot^^Ow|qrYO^BYvjC>kzi&%B4Cn%B8nR! zk(Xg-BT!?WL}r&s=Dmg4w8Xd|mcO4^M_YPMZogFZ#p7?aNMVr#w6tgw@c=F(A$bQ8fxWaG`$DlntoxJmqleFn0!%9qedr_ON zql@9``M9sC%BFyxqH*tV)Nc3e>|723iLj|o$PSMO9DKrt*eo_dkmJ+QJBOY~9JJ9x zmh_}KJ{=yN!z%ACvvqFV*lYgiPUCVgTXN*WHkM5e7+n9>-56FIa)8^Ib9&x=FgWXS z)D5n%xsn;c&wHbzb2jUCH(42+tQ~ANKKaqE0JK0$zsJ=C*Yz*XK4I&bZ{OprO5UTk z`Xf)fx%veRAv;PuXj*k2v0w84v-t1-=%Ove{= z(HN;7^uo67_m2ke+-C!EDp<-I-|E1v(eE7(&Ms9uX_}1*XN|pbv;F)&Z=7pPhZp|X zf}TQW(|fjM9*$b)z45(=gLe)&{vkOBnNMnl48|ypGbgEjR4?w?RSxNw!3RDUF&@0wxgjz zH_ZaIaERi)6Z99ik!3#NSg8-*XmU{GqT>iA%(8FaRgFl4bnJZo;e*zzx7v%~aJSiB zdvHE^_ay2TnwYFzrve;w=BsYxL;**DIVVO^OF913 z67x2naAwsjH`Xr(OUj6e44k3*)=`=_u+J{v4UQoC;6b-Xh6|2!q&Sb~Tkmj|Nw6{* zZ+Dt6bA-X|mX8WG#|6~~`a@10aRl9&0@xC__ShM|!*PpK+Su}nEuMC^I=$ig>pkZ! z=ti8R(%RbD?{qre&G|iUc=FV=nyJ;!RIjmK;t!xi^7fDYN z&a&IyJ6L`c%7ksVw|Z{(?NccK=()48-EMW2Wx>%vwL6=G6Dl^$$RryLZtd)ihud*I zpMY(yd1Uh#962>Xr@Pr|b)3Mn=-A@7(`7sH^j_T zt(LUCxy>fq2~H9uZEta)ZD)xZQ3sn7drHuW;86*h?bg=rfp<~lHOGFt-Q{hQOvsDU zZftIIre(bxt0bziy>T|kGaeDtvvxMO_q!XM%_GK)kpmD1IOx_w}O%=UvF?jASu zvr5uid)oDI%wfUr9&y?=Th)rg(bzBCXki4^#C&K(3erq$8K=uViM5VIfk z?Ss~}9ZncsYjxbQQd=eLcDfua&fWmScl7X-kt5JO1pI~TEskkn<4HHH#Dt6aW`J`O zVMKDG_nikrOg%D%=Eio5({5;Z?NH2H$9RVsey$N zs;Uk(M28I-r~J{Wu@@tT2x_@~(A;QofLp-~v`Wg+&m%aW+&dm)_n@EXvnL!91Lx4p zfai_E2{a?jQ!Mr|yQyz<)~@d~pTE||q;OYlbRNS|NQI=ZimAupH*Y_{boO)^Fgc@z z^A+*Hw^mTeym#Bgvm(!W6MAcay?_^Du4`+}c4hZ2dJ3;?qiA_sDX@#5CO5a;J1E7|2;hw6}os5OH!o=FA~Z z#GyW*E{-qX*<7P)q2xN}iooN_Xzgs^Dex?%=VbZKZu7Q7ZrMEX4&s}TmZ+gNw+n};3H4<|Z zMD6t)YL1LAo}H*|VelcWTf9eY0bYef9(Z8j_>x1t=?U%fIiG1~v$47I6zH|6U1Nvg z)w2bJhf4;_BN>r09*8C z5zHt5V4n6Tr{^O|HY2w;)_J0E8U8XyIdZ@cYP2Be>|5&`c*BY6%V;fAP8jF$gH%Yu z4Zlt8LXE|P$9y8*V^Bt%*@MW`WZJ8p4U&+KD;*Ue9xT}=fZE+Y9KlM6=!P zV7r6{7ZOAx$r+4;fyX)*;N1=PmtLwEYvXWmc`s$!8sH^Ig8G_*o4&o#ZMRmau>imDq#X3QgZgKN3kaOqqctBM_PUukx6#)Jh2#Ww7B6}BSG&Uf^Oj|*>yg!#Zz&Qk* zqm_blDk{Wi-js`u3Nz*)x-*V2_xS@!Icafoi)yAAiw;RW=jYtUCE`2Xt#-%rY!_(_ z;XtE{bCk0@_vL9GD^y-rxGIW@w7I?e(NFxycfb5w$H#}2L={1Z5KUVF6_^Dweoltu z+@gb%qkEHa|K*SW(82ZRzxdf-;k>9)-jzJ8VC@mX&u(loizixKz0tOZr5nke>(g{Iq{bOm&a-3O>zi-)#?KE*ojCT@Ked_Lg#|?0q>N_LD}I{7@`7yKL(K zCe-=(_>3JN2O4~_S11WWfeaP-5+D83h&#%lO4rXZ7WXupg+Q1)C8nm(aEJwkLr+AaLl>0 z6S}%p&gUg)`Iqy_i0;|*pjSE`fdCKc06!mGT6dPa0z8?a_HrcTye9i{Ofx^zf~&r?=ot zp4R2OE92Iz;;OVoNM6T9&0CQ_4bQW)CbNXHm4#DOk+-dl(M;hLO7dxLJ}Rzh$RdX1 zq|Hx6__abWD->TPdxVEfoCPC#<`?}L?`SlP_@n{nGa@I6@I2&Xy$R1RW1cf9byANx zjo#e>9cXMh%xMP(SJ6)9(icXv?1ZQc5zJYm(rds)2L?8h+u-}qg|QVTpFHuxMT4f* z*yyfrbTAR^P2rSLPt2OefUbRX*|YCNrP&R@A!Z6EcgwlV$YGvU22+?c7&K}5VKTq~ zuNvSS4?|@zZU;{?!023@+bB2zcB{M&XuAU@&4r(`MCeU1*Md@Hbrsc~tTFZAIgDmG z;ZG|A^?2YRW(T&rB@P;A_oV>@8Jq_v>Q|En{4fnIN^6KJfJ|6SNzX!*6~h^aU{gqp z+L&gAW#)4$Lx6ynwl&1KU@)YE2a2YuaUqoqk_vM_)mU*ZoM=8vaM&P?Yn-cza(HFT zsYsk%gz^;-bzqlcG5d~~fk2O@q{y)RUDHGy#$On11Nhe9^df9HOW#XrU?X|p5IP%1 zJ{9NaCe;FDSOFZ8DTbAbhX*PZLj+M5L9)cD24QXM<=>ZF>kKl``Xg*sT@{nDEDnNm z*a&dKoiyNKmeyE~;6oFWWeE-x0#fcC z+6R7Q3IFD*;b<{om&3XIqwcVYVH<6iSSxupC}-Xs7E|*a-M#mPB=X2EzwCW)+#qoABA-#eF0qj$jB<}sF`_J z6eJYcReE`E%+w{lLg`NmKCi~dkaWt)qt%E;%9;&lfUneIMwG-{1^5;8DQTUVD{8<3 z@gta-r@yjx6|5I^(>wCXBn|M$ak+NpnORQtltU}UhR1UGf5)5dXJ<`j3B|3gx2pVH zWK>xKMLnDiEF&XjMrHfAki14Y^(J@ZXa)rQ$!+2@w;nzf^jm73K*oD|Vn47%Cw7U=rt3?Wi8_6Y>*l42& zj%8ymFq8Yn0E&Uo>obc7PVBX4%cDBOxihPnwTaZ&NwDq#w_!e`6S`RW%3EL2IZm}?g1qnt-i4?6E*y95(^bXLWn~m54c5nzT&oQ3JVKEh$s9l9M{DT~rwO<5+jiN1_lMBSX%4#vpB;RUf5Ra2~~Hh9Rj6 zAp>&_&cmi8iXzC`2-6-4%`*h!sB!ziZ$6Wxbjf!8J4ylbG>kl1SNU?DhmUd@VtOB0 zkS?Ty)Tb6|E=R7@N(Y=w%{tk(h%F;HXB?exSf!#FqN1YqdKS6Q0BDRr3(kieNW-kx z2wUmoHnM;M2Ee((sVMLJa1ckq5je-WLP7#@QAMSPhH6k3F{&s$Qqtau=}GNbIMh|m zcnU14n)QSHN?G()nPh(CNJvQ#JWjuYJ~)c7)r3Yb5KF!ScsYIC8j;h&S0RMOQ^e8U zpn(O#GFC~a#1s(K*X!jeR7zb7UeiLXc4l2d!5g_<%}YgWnO;duk=OaOmQ1r+WGEC< zauVR)NQ-n45>>92`@Gom$>vz)(jr}n9->hfOE;Ii3@&~}tAPc0Jz$Pp*@&(}=aN_9 z=`m}3HTpS%_kI~lT#>wDFFfYXEg8?~OA=755JVZwU?xa@n+#t`Hw|2Z_dbH2oi+JB zm{RJcZZUi@BonR*UkbY-kamPt6dNXn(?0rQ>xaK*i=K#a!RQ9OIc=kvg*E2=+T^u& z2EX+!Y%L3RceC;PU)}i7bM(26mw;m$twV=0cwc;ax%S)NzWnYx1G~e<+Kbm(fAHg* zTN@Z;zHczgz~Kca-3FG*o%^HDeWM3DX5!99>l6RfjSs)P-)?ECIPnQ`-*k`11K#J3 zSg!HgU%C73@1CqRhU>%igWcv2e{6Ga(~9 z-1^vyo$vb~)9swvSV$TpWODARi^V5Gw#<^g8?O?n4i4S*QyzXo=O-Z#PH}ul^ zmh-{c@C)A=ynTP5Mc7*V*bANSdxa@KWq%)PVXTX8o!*pbWZ!zb|2wbsTy-&7V;U;Iw*&f$oAjUm!kZnwVwLmNyHLyt_YCZ?t~@ zM>Y<&pw@QLnvfHW07qeY(twRGe7k?#<23N*&UWW}UfuubD+e3Q=xpIaF`7+dW?}V* z!;|y=SHJP_%iny+G3m|GWV1cKeY3UMhSO*qgw|#IKu+g_wRew)OejRh%u@Zx3!U$O zrMt7C35;?gjm?c}9I+f^{Ovoa{gM~xXbf$$mSv}$dIT%!ipIxxPiuFMhbKLI2qqD| zdb@+#_o(ccOwR8u)7CPZ@b+$lsgQQHQTD;NcL9!X=APa= z9x)Sus=c?h{yi^sKl)+^&aL@YAq9pEWGcYP#pr8q_WAJMAIo*WyMAN0#neU!5-?DU zFX|4p_wFh0h|xLo8XF&dvHg87cXqd0j!aw4Wk_%fbd8tb-*~(KrPq27PniR<#=ORx z+bw2@qK8Frl2d0`V06;cOk_^;E4Mq}|DpD^Jq$}i0^5Z4IMe~A9l!SO;7i}_zk4)d zs1I}Y#RKH^ZkuW3gLg`RoBICg`2LyIp8E*R+}>?6*VY<1>%3-$K!1GqczoJ3OQd^# zr+ICMI#_9Zng)8tj~||n?wvVxgi9s|TSl9B1;d#PsRW>Uwpqt=s-a{?NVc)L%N@b< z4f~){ZpMT%$4SU-o+E@#sd~Zg;nK zcrIAZOO%{*@?1fpq@AtpHZ$nMz*x+IW?|%XlM)b2nQp#v_$()i= zGBerSX5u`O&ViPf>rLj9_IhWult{|NuZ^ue`pIb}DGB|x#;y0xSW-|(+TGY`Z*JNy zFLjhDGh3Nz6BU4_d24sy26{O<*z5fZ%IE@3K*GwQwvw(;49z^##4k{zlQ?l(d)FML zSiuXmkr|w<_gIzrQVHI7;4*Gz!iu|iS)+JG=9E9x>lwOdXH6nKoTnLr0G4%>S!$&w zRB=C4y(m#LG!$g$faG*oL}l!iN?CP}U72VaNe&JI$O#rB?Jf&8fAsq||I>ftme1(C z(91&M-YnReT=vHQ>;HLzrDEjT+O6HjpZ{aK|H6;#I?|=l#dokB^mNL1?hpQpzy07l zZ}+=QS8A+%;?>T7@)vIG@3#ti)l<nulWG+(*h{ty4$!3S~A!F;ty^A%uim6Rv?5?4P_2vz=!|iFCTyXjR(9?C+3ys+W+>ybnwaF zw;ip6U2NgvIiAkw8?Rsf=RbS+?)?EnW!s&`ANj$pf9FqM+w7u~U`G0^80Nwh&%g7l zM;LI}MA)V;9yI^bpWOSge|pEkD{@nlC9!W^$6xwR@4x;#hj$;I@hW+DWBo_JckAE( zSFT;#r*$a7lXKXgOwKMwfB*kJdF>shv%9{%$F|yv%h_KerLiO#9P-le&WYp z`RRZ0UNul%{2x3351S$iw|HMbY|*+1k?kzbFS4pb`t_J&C z|KRBEL#*vFqr2GdEM>#Q#3VJ||H7%3ZUX{dT>A{SHo<24@gLm!OMmj<#an>OOVsvA z!`J$ljSl|j|Ks?-{Y4iuQ30sxxAqzs$IQ*GBa1b`)@)qg=B8yM0xdF3)lYu!#=rHG z`yYRqr4NY=A-Pyp`0DjX|KPJ{|IN=I@`S?(E2b)HA?CpumTQggU>|ev`Zg(Xay=&kHca!ey3?T%S~Yf9}oK{ zZ;yKqojBt1;SIuit0mpuIq37?Iby-ogvIGBA7P0%vn`i!zP6@O)!iKQF@typWa&C9 zlbXFVCW+FL&O0r(&0SUjjbgcpMY^%Y+9oDA&Xb~6Ew&wG#mF8ES^F|>wRw7LUtFB{ zl48+~C))=%hV3rk(UmtgH@8^w!-^$}V7~l$70_&BJ~C_5IW<&(_6E=5%!PHEk449V z*XQ z<*P+sYc{Z-=z`c9Let0hbRoLAg(U>Nt>ij`jC2MYod%0tFq@cI#~WH+z{c$u_*_!< zT2ZvohIG2k?qJNY-UbVLTTIW>AmasiSWd)KTg-(a1)g2oo#s}zMPpAZ%)l5o4m0B7 zhA2xx&SfUv-K}?9ELKHUIOj#4!wmFsfPtt>k$r&|bMKI}-K2tp#Yk<47Mx42+M*ug zS2ZjKV)So=O&%E5jm0s8Npr(_n?dY%+K7Vt+P?{SgLlVd-eDaOkE+FcSJBlf`ZY24 zHz2Mn+9U(ET(N6F2Z-F98ckCJlz}wT@?e0@c@NDlD##0_a}(5@oWlvcD?OK(bs)kF zL8!&I*h*F}Ba%2|XCljjCI5}h4SJpCCT$@7iZ7P2^+5=`yttVe?BS0J&}7jkquMM# zBIfYY{b*RxJgr}HqjR*?0X$|qG}&2(T&Qez-7uq8O3oo+q-(-#JqN8^jns5q5cQ4i zs9wK6V*i?|NCTKJtVz{~0#PDHxfQZW;ew@R0^B?lF(jpYv5q@{w;4pRfnwJC8}~=| zPUpdiy1CnU;ehG{KErjc1A}vPjx2%;AK<8vAO~!SXTK7QRZ-Tpx867$VFyPU1tWZs zXyQ%?co|Wr}6QDOSAJejr67BKwy7Nf`m=5w_#jC;R$cd$-2hAJ01 z$6~`Y?WWG+=4EV%l@b?A*U6Gsv&9w~6l>N7z?pUutFV_^DvY~#Hf;`M23m(IF%~g& zES5PJ6+v*KtT7A`$Mcsssw-R76go#)C?O=pwwOofHfW9AT1yx>v82#HegN#p z&98DsNklCvpTHb?W0-Z&XHa$tGnC4R{dz=`A3;&$05ui^eie3lsI}bG^jLwW#N_v|f2jQ+-jRnvwo#x_R!FVn?QCZL?XEsA47xSb~6?5jklp zN`-|m=%#^7bA8W&&(4}GS$Zt3K^%H16a8NP1|vmL(B4=E?i0kFA6-<`L5js93}+`5 zW&=%Ib3GT|^Cm}2g(P|NN*@iFVp8>er|g?wrjEtiWXuCwI8DL8l$azCYaBRtr>PCZ z3hr*Ffjvae#$8Xx5p7nsO(cX~$Gw92i^1o;HDuQe2(W3QWtitYx>%ptWQKuN`Z+QO zIa(FCC>lO-ZL8sr%w6n4i%P$R2T`Yz;@2Tw@E#@^i#d2x3?+T7#sr-6QO~7X@X*ZB z7PyL|A*J&}vz35DgcWkij4B~q9+@*27I`R>_aTgcX@{FjSw?Wk%Sa`qkEdufJ6uto z#z&YnvWzlAft0trXnkq`VT)@_m;@s1L(6myT+3Qx)wSv^zZr6lsij!(GBBl+Dgl9nB#AUGRW-#cOLdm=1c|swBkPK-EeOdPk6_av;0*nG+&{ z`DqRqWJ)v*NFR9ISt;pET-<2NUvpfl^Qh|e7#N0!CE!s66*%0fn|N-d(32P2Dorjl z27G+DDF|Z{CGwQ@COE0`G}PLrW>iOwM=uJbGOe*e%$M2Jsfo#unNVtq!Qju*29ha6 ztVMZaAy}|m50_-F9IO>$Lyu86PaMGNcNScFT9Y~YtO~Oj(}cY8<}p^`kOTW=zzgme zPOm{n?T*@Pb)I)-H=`}UxwdZ3lg4#0KLeu*^LCw2K&eH2tqNEI3Wv(F3_Mt=Ng84X zxJA0)Qt0{MRp3!OW(zcfR!JJwV-~%TbVi({2uWdRmQB^j4Ko{P0$ZsW9nR+SyLJ_v zEwVSw|Ejnt)wB0KJ8KdNDG8gVC?{^p@W;hWbtzPljXn}bDkU!pl9WZ6N?E`ef0cWG zm4HkHpfdSQMNX56${68sV^{UeK<>I&%t~jB`Cy*~p?{I2M$fgTimY?9x@I;OQrP%W zpX>CIlal*LA`BKS9U=WO(thkj)mrigPb* zERoah4GTDOv5$eiA||=%Ee18h9VRD^f|0p>rv!l50M)>Qo`|qBkQ6pii=C^)6+Tx4 zWf@~WhylYsZE9`%t!8ZP13YLm7jmS#7LzV7lGs})X|!rEXHKDO!d+f#b826U4kH)A z|B3)0zPhqXZpZ! zjEn418PzH@C&OqgI46!6Yj%7iMPb0j_H+R#@AIyZCw}0RN)B>r0%SR_)FOM-WXedI z7-3}KC^S-xh^Bv@m#^t%ez!+$E2U*63$yL&Hp4qoQ9D);%YcXILWmj>te z!7X$vag>oknS2F5wfrK3>Gd*S#gmb7F%wcIAuv8!&|U;zOKFQVR`$}Bl9t!=zZoxh ziKy3lR|V9QMD8VJM#zqTOC7-!Qbq;j3c7mYl4Sn3PNTodv?QD-ct6)yU{+C;$9uAN zuT7iYpuD(#;T%vT%C% zudeg5jD1?a6})}C!$#5F`&3W&Z|*RZy&^eMJoF=kG9t#X1VcggDH>-EN@yfN97z-- zs=fG(p166CN#Z+4nO(D5It^HaPzOxjW z5x#h%3hVJ9lD;mODw1%4Wq@JhwnVa<;Ci{JI{(CX`~@IJ_@D>MB%~!wNt2lGbo5h> zHi?ttIuI%>Vt`@3+4mMQsuPSl)`>eJNY1L=Tp-4gMZrv<(|@BK?Xg&N9AF79TTnx< zhg6{%#~EF)!bbt2Ckt)zKvoXOgC5HdV*ZJP9GfhL_reB^GKEf4H;IE8j@|(ZmM9xo zYO!n_Ndw(UlfeugT(qGWHjF?MY@s{irAjh;Sq{j>FYC%EOktQJ6@L<|CM8u~oNu~A zTYka3{1orDlqO#t6-^4{Wp=yOUj=Z~pCE&!{PH*!Iy71h)S>koQ2u8eNZ`;NNQD)}IwgRxN?RoIx=2_2 zlxR=w_t{yK?}x?I%Hzm9qrX~~kCV1WzTh>zeb6)lFP|yy%*B-K(Y_ky65>VJX_hnm z%%ok7NlZr0lgwXF@#bT=mIwap`k2xez9cJ%BWxaMA;~mA@aff)`w9k^Cwx+H!D=Nv z1`S~oD7&+^KbQBoAH%CZb7f9nzW%UV$nE=m1e*|P`H(o{v@(zrVG)qawfyj@NB)MDQ^ z!;cG4-cc3j-oSBtl{HDEX8sE0H zVCJVHSaH{tcWg!X1fF0VyCL#qr66l5fb)%ylNyOh`Z zgjDJQVhED+NE2Ae0OMM5Tz8}gNhmmhm=8>lJVH^SETJ^PQ}JezZ|;(l%#b~0C=>qG zd~l9Gl*W=u#~oC)r2H35m-`|y|C4M`sTm=$MKXc$-o0NhJr>YBK^#MukDl3531v*@+N1Pl*jmjLRd{_QEIPE{nDWT-2X%T0+|{zjgH5M{c^EhMQpapoTj3iDcxco)W< zq}ojo;)Esx9|9%GFZnQA{wc)p8EJgbNEfak3Vi(V;CIk0rzaZ-0!A`9DK7zxgavf` zFe_N%s62SooBEGjmeDJxH2%g97b}TXU>O_POo_uMMCDQ_5||`IlPfB*ZG|s8Y^I|g zKpgr*yn?>KPpy)?fT-Z7RU*==86AX?2?KwI zI8n-P=|kH|9hoeUi)KuqMe7ndaBcE=7sNpw+L0(F^>V=(6*HS66Izo1HHn{j7qAHz z1h(Hx%R6D2PqUTpLp6zEn~o3t>yL;yUY}cl$GN&(4}mcB8A) z8#hvT<|Ro>XhyslQDcx?gcyn^svcYS*VI#B){~a}yqO>%9Uq(#S*aVD% z)`p|NsdBNix2>5bpk&cAd&gxE4tj{=?YS9A99g>SBnFcQ z^?Fi>E62&hyCJ@VUvs3FGY_m8RtnoakSdx`nth|BFI5;Q!$?B|n zjgd2cLQ-T&^|J4`+LlU3axZ7bL0!vt4D0YYchy zYg%#@QWEC?@NJ%aG8&4|4Q(JaHK+J$+#sX84*jXgXc20}cq3j4l2`yHi%Wh>8?;IR zo+zXWP}>(XGdsDD%OnXLX@gCEebdc_H6dmKAd(lMQPPFVhRn%rBvbJ(-PkFhfd0BJBcnloa=PWT7}P#)p7F zSftOWtkqyjOi?OL2tJnpNpWNy1S;S8GisB4Fi!7`d&e=^np!j%^-cg0u~^eBH}Vl~ z8F(Oz4`Ql9!Eq~yEh_aOym33f-M8km#yi7qlyp?pgN3(CDO*_Jh8W`S`P-K4+*16ECr{T zkP{sE^I-4yT4o;UBG=Fc8nEvvT*VC`SxgZ%gPAlHWzZGkOan{6r}O*ltjUlQ`T12+ z1Wj#(*!9B60AdRn`I(_1WuXL>m7k|0{Bjg>;4wW80-<-MBVp@9j&BLm411v*^s;oa zAGG&#kSPwlj?L*j5*mXp9`+*>WeB0{X`mN(IMg)cEEM+U!0@9Nny~ITsEQs*SxMla z0ch-K*zfa%JHG6*t3enGm_{BGm@ZX~iHS+euEnE^0oz&F)y7_I7?!aur6xddp5P=> zNKDmH?83;->TGfZhYr6v{DGxbmy}d&9^rx7_Q>p+ga_sdNh@%r3~0gKX2elam-vj` zu?9`$5?g3eEy;|kahQ>vu7PDE!Qp^ee-MXZ#;9twlG2O-G-uQ(F^9_Z!!mPJ&;jHy zNJCPY0XU3E_xO+=3eMee3{0pP=)ttldWJ?YK1dO!UY{egw>l;A`W z)&qRNyn7B4ViyeHJ;l%gMXHL`JM!X48OIFW8ycQHiwGT2o~p{>+oHBZ9*!EI1*|5u za^WH$C-6=<`34%+hgNA)(!h!b4@9vj6m%K5smU4vDHhmee-55lAhnn@ho==lHE8gG z2pBu?Q>0NiuAPY#^PB^&Ozv3Z56GT6n8<*WtvV^2Y~&Q!LZP;>^*xwSQ52+7>kE!R zg^T+P)q+pe1%ce8PKEOwoW~b>h6g^-m>WNWX93mml?dmaQ2d~X02kRypn*-~C{qhY zY`6CZoDaoF7_!3BJny7u!ra&$*ONK0f<46~JXx>UK}cr9!mCw2@0V1SY6C}002M$NklYQzT7G%82@ErJ_0 zt!&AODFF}Wjh}Pk21%7^Nt`*>$)m=|Yb}pt!|yt!esjb{C6RN33@z}zo^kRRuH+;h zz^t}5CX3E0W4NG25~2Ak%dVCtfb*$S;^NsZ)IwB^P_M*jUP%jZdfR| z;Qjty0a!()hwoq{>PTc;5pWekEMdk}@hRe@E94=3inS!^dkuPa)?{+DO4K^Pm1tZSq=r^FQv0Ka^~-(*Ta-^xQip0 zUCPiIx7`pro^0~g5!AZTZBgYtoMYT|^B%e&Le|^kwpL0E=w?-*lGAguQdnzg#13|t z78gBCy|ITZfF>-LQ;tpFv6Eyc@DWF0g#E$pkj-{%!|1a$N$4cA5m{qdZo9!i=Gr9( zSU1-=(gUyt`xensBmf#%vX#6o!x=pRC9@=iM55gAj zwAq0St=U(Gq-2=A3|nb}hN+4*slC}p0#Lv;4UWwrM2&#P+3OQAMn^S(l+d}$95q+8%)+a>`>jf zwX?p-Vj`kzj&y9(z0+N1TSu%1j$y~zgC`IyQ`D%WBoH=wVKqQe`nVFiG{gQ@yK!S@ z%zi{Q;P7(#QG0!_+hqSjK#`RsKv57))RjCF0DkBkNnKgwY2$(uM&4VUwOiXh-Oq7O z9J`Bew%1QD8Ox*^a9=pC=T-(S%0jiuM4?9bhjT!D(8|GYqPM#1H+LEvRI-pydR(Mq z8_u0><4B8&0>F}UxituE0wuL-Ax-ul=7Lagsj2F@JJj{)=|j&n{2E{a-|lz z(b$a>YdH94mewnd8e#);4*tpV1+?969x$O|#D=0X%yYpu3)ePX$_B^My8wSe@|)Y- z)+M&eiRDOZoT(GwJgcOR9SLf%RcT|$$qGuH1FvODmUgk(EicNUMiuCRkxBNMpy7x| ztcotsSTpGIBukZRpC4FIz%G8v`)?XgmaxgV`C6N$2f|G?YQTk;5mdNYr;QcdBIZF3 zV(;n&YC_l|)f+O(jd;{3FHIWVrQo#mY$6%k9A+_*A6xwnY)R+fX++p$+l6l>xD4Sp zyJaI=7DP!bud$kqZG^d{Er)qW&M;#roX{;%crN>DQ`U=;LPZ%x)~OlPLKwtt?e7Ig zEKnR`A6OE&La@o+XiNc`r>1*ju_0Pkf6{89$y}?&u**C(wNLuikR7=ojtV2|t#*t1 z#2^(>cSMo7;WjwxU2xc2Rz}9QJ8qK^Y6)iG9RwO_B4=Dcxg5&Sq(_gg4Q;da$qZ>+ zAUhQ%7|i>0k>qzJL^=4M7pIo@6;U;+fLJ2u49WYt2+h7PgjI=??J$h=+ImI7a4{

ow_PZ6AWf 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

e#kzvt!$~ZQHhO+qP}n>A2%`eCs{u-Y@qrRMoD% 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

PL=nI)i9;5RR*8@W)vawWZs*$lkll@!! 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 )K%VFS{pj zN;C)!asjF;p*fd3wMPv+$=sC$L%9-a)yPV+i&2=9e$i;*qD>IL_US%|^%hbU7z5S- zc%S@7NUE*41zy7(Q`~Nty`tG8ZW1J~{)?W};Ixvh!mJ;s2nV;`u$xd7Snh+j#$Ym> zaax_+)xWwFqqsKmy=bciJoXuNRRdb+k$N9+NOQ5%<}AjsA(sFy{QTnBIEvH-Od?cdnMl_csGuyaxp?dan~6B5G%1qe zWT}lJ+$;nNg_103)K^x)#T&1b@%5O8R?W&=d%iC^lp6*EWtp_p7m>1*X!4Ml+j zx9E)A1zIr!r4WLOlWJb2N|s!ai>w&2bRxt+nC7;?t-MOF)<|UPrUKMRU_ z0z`edtH|vtb3w~e)zN|kNHNHoD2LD>6%xryRw^L{o7Sp1G&_Q&8H;wP%oW24zYK+1 zw3KTu8{!lYs5}~QLrl(1;S52*+DB0}VF>ZjmfuDXG)fC3IOQCT|(oN}utiiM6{menPULHR3cqC`mP(zO!WLJ4Sv%1Q)8%C^ZO*dap5 zrUzFF1PM5;iioa>g0gC0vPkJlxSQs$kChP=lIi3Jl$(PS=iE-){VUwn<0!zpGoSdH zb|EaH`-MSNUzz4Xh%$r;VX&NWRJt>>#tnDf5=zdnC5y|VE~+!iXL9g&NR>q$WZw`E z#6a5mvJwVs@kS#}eQLdSBqDodpU50ZN$Zw1J!$k>&WY>pAUK3z2ab`e=G>efJ#TGR z;nL&fti{sc{Pe6z$VN$|S1L#)@xC{nUsolU5B;Vd%TbZA{^HJx(C_$+U)AxG^&IO|_tMgOWUioS`(!#c(Y$`r} z^Sw|scImm-p&=DtyLaR5O1V6I{_5t+LSk!u@Z9B6KEE{g!0Ha%u9nvB3)fx_Mq<nocZOQB%P`Db2f@9AG#nw_}$K08rcTYE1) z|GLlTpS<_U;>-iP%1)hRI5pOxNrEkHJwunSzvl7zbLqtWPv1=^HV4mMIeX>#a3)>wk z@+KY*sgc*~?;ac*Ie)EK$jwZA7T;Lu=ow&8TU(fpwReYG+9-Ya;x&R$VSOeUrwW@Z z^V&r#j+1>^Vzdl3Yw$h@CCvm5Sa;<_Y@?GOAVu$Eon4V=JIxRVDo$ZeC>%xMyLyK= z*OzI}lo)O8$RsuqC3?lPOFDXohA&)=L|b`C`Q{p}>NbsW==JxuQrYDx>9?@Fa&qNzeZmhI)bPb<-Cfd@* z!>b?)(!tp`a^Bi+WFBwfeIg==i!U|+@R!c>XJKAfDDf`LX#b+i{1!_1@{ zfEvzY#Q`KId>R5DfMZuOL-^?B=X;0Fc;L+3quGhiShYNV?ZvkC9zt$X@vZ6mH~gV6 zqTE=SFXXfI)ox$l?B(m-gOa6KC`^xknoA{y&p*@J(L=0uDzWkK&c{)DxwDu2ysoUN zX<_EU{G)sMTpG>cQbOV|L&XHC9%Sqry)bHD4|H~^7F5^w02BSe8$cpn)BrszZ3|BG3`_F_}x$6$|l+2WFJP($_pz= zQ~E|OoV)y7u~d3+>;3q~61#RTKKoK<-|)uD!o;ojX!Z25^V1Xgbn@(#7wHGWvG&o6 z&-r{jd)&1$KQnpvBhkjsgIi7+DjRKg(g*H;9Mmd-Hy1if9v7# z`^m+V0h94fx+-tLH#7c8OMBmym%sAp&IgxXcw=jAo^9{l{iB6^er;)*p4X{^KNMl+ zEWM91RMK6|vDU6wN6+{tZ+X1_%P)NC!DsI>V!7SEM-M)TwfA3r`D?e{{eB?QGI;)( z*{OS8Z{X64Urui>tz}a~=dRKT(xtYKs2unYE<>kfM2~0z*@jnm^{f@b>x87aR?)8Z>vcxQZmxSk<&=5 zVn15|+FBa|*A~;@9L>OA-_bR2;knm*zTmx2-ooH8%z;+}W0wM<2u8n`SF-nxuzb+g z)w9~voJwrs=MeR7?}B5?vyalrEm}I}TKB+3EXd83S%#>=Ggm6*QYacttS{wrSv1G% z^Wr#ZY46+;i`?DbJ%IUwDL};-chQy3p5eD)KW#}u~x(BFfCb^l8Z*HwGF>B3b(r6CMinMmotISW{ zFQJ#IEsWisfiu`P^g=u&fr-S%>H-e1lS@>s2ZYE6Ke}uhsP-rOhym-F`w%DMyfTGbx2**uOu3(Mx z>==wo5~%w2z}YLzGuIX-J^nx!^8t?w^M$6APHZv52P~6Gwsy#rqmWGxj9tc|Mc={` zMHVLS`h$^yGnZ+SJi;Q4)Ys@_hLIF~KEh%yhk=VNi# z4W2`?n=3PYBXE^xC>7|Lr^jzFg}(6Y7w+FEF&0N!I%Xf-jJ5S#df`jspS+C^D6zG= zu{1k${@G%YN8Nctk+y|Lw`sFQopTD4#>({I*=JT4=kv`O0Mdzg&)^xPHuvxr^9^SHTntu2h!l!omgAg$RK;PVQ-I@rft0~!V|AWsr8paSmD4km1?pUSBX&DwpX{(Dm-Y3v_(U>NhtQ8Hb{=PCByW*1A$F zB;tw>1VgC!%KQWRzFt4dM2>0-^B3o0G|{mF~fFAqF!>=8eTicRuXuAH$mTcy<4s#eczn zyu)a-k=_xIh;jfd0=DuTuejaNtcEoC`~mS^+`mDm;|oTa3BYYcE6XY(VjlZcj&H0_ zKlqf>^Ut=4jo#E;DCB1!++s+;#K*ni^9I+Jrl#(F?DYnDt#?QFKyq_+_Q7X3I0@Si z#oCyyvduXXjlo$S1;yBggAnFZ)Z)xI!vQb#i%bKUGhm4N13W}VUfC?`ue|?Pl^!Pteo(>^urshA5h#9W=`ZD}C}=SrH|gte zXL@`-P8Me-FiPC=^m2}qa~0W0CuSp(8Y$*|zqlnU&U(*)H2~fh!@h|-c=UsjXd#`> zHKll{lXR@gTZ~1oKaftw@$EAd!O8ZX!Ahl5d{Gviydk-`xwS%%ziRtE#%x?EC?YwK8pJfuJYd>JmbK+s z+%x%1Y6D;CLuQ^O{E^|YHbl>qgX|~`*>S1Xbej7z>WGO|(HJ%!l1=JuK&oelWNCOC zETuvgSMvO$o7nL@!vsSQiyV*s*6OTyp_|?GS1`vOK1HLLMI*AM>AR&;nXZysOPM4S zEt>iA%mXY%9*eV@iqDSY>`#-IC-&UyJ@ILK_fYT9c}&B6A&pmZWo{fJ zk_kCz1r*LlEDrL1DLSlp0v zjc*DD#lqJi*hKDCkm_0E0-nTO%4$ZGxNnx{#yk2(=|Wi+OKz>PqJl*|Fm}b~_lH|z znRJ37tnbWKyuUc4!_nBoJ0GquJ{mZC)#nc*2u8`t`=1uF3Fewi5k+3wA4Z~Wv~jQB zM<=XvJbCmZatVY(z|2nGE#%U{AT1FGLEF;w1ElHohbWSE45E&%-gI)kRHPG@af6|s zMLg6M&x>}dQp%IygAjEv9_N;x=mLTnTJ0&qk=mrgmPpB`c7AI$? zXHA-NYPGh$u0QhzwtC{ydtLMFeL8U05XZYOnU;Os;gPU7xypWf}p-@if zXjo8t?)Bf8pS-;^^N>-5IV+x_7rylO=;Lrh;%s>E>H8O+fBpRR*O?siBoxI#UZD+Z z1)bw<8KQJpFp{XBDm~66gNlSzxjjBs-o-k|XPFsadhXYl2eAZzE5gmDKb=Gd!Y#Pm z&t86sM_e8KajBI=8A-Wv zNMt8(5%WPUMhU4*uV4J?Z_{?R)|Qw|%bc}JtyJz9hf`mPZ~%A1L!u5j9ELOmKH5!e zJ6urho&C?g_9mA4!pt}(f*Dk#`dS(RJ1lEH7k)F7NiYH>H`inBoxtD=K^DRwiRM9$ zJ~-3fJH+A?)?Rz}APy~_qlsJu*yHQy9T~lt$>&mZI;7yVpj$&ItZcen^2l)|nZ;HY zE<E5s5~>jcw>X}TCCJgqGdV7Mw4iV_jAvx7IYtM6H+2f1u&eQ6e@LWFdw zbZC^NFsPcTkP4RATaTB5`Gag%bIvaPXk2RyW!1yjh(}oI7HpbF%*sZN%*Mq!cWFwp z2L0#`t|{EiIqa-Ico#`yU9k|dLebHm5O zAPHTS$XF&~9lgW&4)I}cs<=CedwA{*;4uetX`a(*bxjOK^E_0gR3NSZ3Nc(*;O_1} z)6&_SSX&~vh42!y(v1VH+}VBR@{4^#XIaSJTv>!zi!&@9qf%b4N)4Ui`6f-_XiMKP zzK|fH7ujqwn@SWr3uBj_XLS{|!TC*0nHseYV;=j2(rij}pt7mj522_rb%)^^M#`12 z^<;-ChW3*@YLTvq`B(*CEFRqH`z$EW@Ejs7z(`OO4=H2!UwHOajI-Ivd&OL)ncmea zODk9ae2@q;ZJtRS4n^?=;Qghc7*ctu1Z&WUlgY#4?0sekB8cXut@TAhQ?9-I^+aNA z?%^Go_N&HF9F>+{uxSTx|Ff@rJzvPsjnJ{gaGH%?Y;Es^Y~mki`+i^W!u3}N&s^kD zAp|U8Py!HoIXW{gv&T}UgrBl!=nUP_=GqeL+L7z4Nk^RD>p=& zKF2v}gjRsGx^}Kcz)$X;Hdvb8rRRTb@XRIN2FD=Ff)>v~eBn#Kg%I)1;1b5HmnDv7 zAFYJ(POSSfQwRpufb@TiRh3Ft|L6;EeCxs850h(4j;vv3B-V=m60iT(`U-AlJPXPe z?Px0%JO#uyUTo)dCH$&)Yr)BBkL2Z6wGR7M8+{DeB?|vV(W&~QE zeQ@FWYfG~a@C->5rgiMF8h-T)zdm$sodCGW+wUpqT7RnwkT10`R}?XN`FbZqQF~V= zzMjpdCvJ&LpOtG?Ql!J$ScE_{fFc6nus_JVaWud2YR5kQd&# zB5hq)U;NVeji0kF@8L|n1AAq`wly5vwr$(?j&0jEJGO0gY}A*wa6T6s{bnBoETT7kAxQH>q zs9=G3$`+)ynGJ+*pPz}D!H#Z@Sq-1xC)N$7ZLY6@OCFITmD5(EjM&dfmNgI!7EX07 z5o~dQZ4^RZwvhi96I{k$mp>dj8?CDtSWQS#rRcTz6un{+jWnE|&oq7*2#EB;e=i68>;HGcRt)*WxY3*jJn zGr#_Ne4mRLAk$AmKnk%L#EN+*__swnqcdF|HMNuuo#R5L6|AkjUfaI!Mbww1AB`YNF#GJWAzhNwZZe>MkTc=XH1>=_w` z#rK*f85qtxZK{-98e_#+m=?c|7l%GQniWxC)c2CGSBTbr!^%Wvf+Ud6Z$A% zVwJ zCRVe4$bcNS0T0DJc3~p1;(zx*+Y4FXJH}rV|Ky?Ae;k^_D8II8uMbzlF&+ze&J763 zS1zRnn=D*pG7xEGvln@fjFUGAlg=VTpJ2tLR}NA`N5J&%@E`pkuR3Nar_#cNSX5>TorP4o)i|e`*3j#yhLc~kdeBm;UF>pY^#bceg2jzzo2YFN+Q`Rjhv-jGTLpz5Nb%>!R&iK(enSd? zN{ymp1d9$Yft`+-*6F5Z`XJjs`-M5j=lQ9%R$o6<9B=Oa(Qj2C_^)~;Kcf{rdSne; zsL3z{(NOAJrSVZVohT;GL<6}N1<2Y zp{?Gi@KsXs#z?h96ceM&Emh(_U9vY5Yi(e0@W5k$;+qdvu{5Y~p$?xZX5s&{ynx^h+ zhfEz2OAFo@&^E0Nw;!7SdS*dkPcOflUJ68;AnIi?X%^yWmK~9M_Cbj1gaFFSiv&dv z&g!?f#g3P8xihZ_#?F`R4l;224zqpJ^Sv-7*2d}siUvJNi!J@)z(gX9pK16FNbPpW?KI9fCA5swCv$pQcze$-}9g?V*o{<>Vi_z+<;W5IAC&5!tj>^#HHijuZ%c9R41ea zmzRV5y6J67xXes}7!f4G@7K9?WZeA``d+t0{F}lQi;#;0%!E+cce_X7UrcDDM_NT{ z0k^1%k(QUBLJ-$asapAS*>mPr846GBVZMKMvjw;R4@{hF$A4$92yBy z)m8aH*;ADtZAcjSAUNPh?%aUGKg4#796v?CExF&6K2!2wkDr58YnBg)nehF?Ax~1) zAYd-5n))#P7!9MPf_^^m$JCMs#Qp_lFFyCzWjF=Ha4i~XlROB3+>W08BNOGT`K(k9mK0HZFXEJJR2 zcmT6teH8Q>Z2g|aY2q6v=;4;Cjm}&Pqwm*H{wFn0Ne}U}WM=Gi^}aCrsuV+NFc!@q z4cxoQ7T5$u8`G&1FEU3z4JEJR`kO2gDzED8O~aV+ z;l9h8FV3Zy{NE5cTLwVv?&UQh0bbXytN40NU!%Vv(loLruT>3vnnFPi?W|fb%-X_? z$ujoFC?vv)g+Rw8X_iFDNX*J~c3G|v${^@#Iperc%xV+C(ZRJbN(oR?jwP{Z!@xXe zl)4OM>!!nPL50(|QPI)Du=MymKIm}Ob1ZSnQ7L-=9JjSuz8P|4;hEW+?=1Z^!9}r# zRU5ETo4PV)keGwnoY?l24PDr#2Tn%HV5;TZWe-`}vGm|};GS({U2M0WAwU)h^cYAE znS`B^3qB)Kd%UZ&KR|(@$EQ%e)#y`_Qvd9eK}(pJ2GQK_f5?q;TAIjcv+{neHxny) zkJqoq{>g_1>MSQvA%(9*aAVQy7F%m^d;bD9cNGgZmM`*&aZ$!AG&dFW)T<48NJb9_O_>-p7MzOJk?{QJN$<*jRu9{k!u92BMXk$P|Qbdl% z&^K}$?~P99wYY&}ZoTTVT+W`Z>05zN;m>4vFOEydpzkyk=zwx5lzzS86RLl#;K$-a z9V%Xsy~HL@g;b{p(qv@O84i|kI#Gn%r!B{kQ`fqu-YLhH30%|KvAq(kFCq8fONG+XG2 zRecMBY;LQrj-57|UATF~8uyBTV}|;At+uy2I|($Xg$Km&}tJOIyb? zbf=yl#;Crfw$?^s_FgIIBEEnqEFfewhn;h5qbq_f=_{T^90{n$B$tcY{rx+saLgi~ z5fFTOO;}j0sgp%4Lz=y2DmgN=dDG-O!6WWt!6;0x_eGjPgi9OU$X>2$+(!&5FvTqP z$XZi~T1Y$0Gn{A$rDhG4lMM9FS3oiaF`n9pyt&Gu-s6@I6f~NvYO3iF99l;V)~hxB zy+Ir6@HWOCGujqu)*J=1wnt(i*+YQhxXyi5+;3bqykfe+T5@4I__1ci3)?m{9gBoZ z%gT>-P3RUW8k;XhM^RQVTgo=4>)!aLf9>&=KCfc1AS~L|B@9W~3liUI{bDs4(?kN7#>8!}@e|K?`ojG9=8KMTj6s4}y3DpG{)n3cVZU9IRZT~xMfvn2^^{Ddid zo)&l+$_Ugk=w1ehS=Hcls4BJ*yNRydri{qT0b{D%-1eSMt}wjJXCw+>aMU(ILtKRW zFi$V_ehkJ6GueY=!;1ZWA;d5prs@V)>^y8m+=4PtO2^tyiL^ ziFUqnQLiZ`(MxSOQsYaM*mTM>!>9$N$H%2nNl|1D<#H@&p3V<10{F(E3JXy9tzx5K zFrCoPdVH*E82CRnqi&)3JZN@CCV2YH8&Drr*0dzCv-GhDArL;mxfi(H;d&zdgt+xW zT)O^wl00(qzLVp@UO_(&VEUc* z1j7R*!N-{~b@y11%=Ap&pTf&AaUl0d%o}k%!Grx0???nFgYGWso&`bS*bSvgU*xa4 zn>^m540>Za12~*dX8aliMjYNwUf;xB8=1|^ifU6O2f0iCrXG?qFh@8YSN~XF>WeMY zZmdGj#HhQf#|FKa3rfS7H3VbC*D*^4K{iGT8S;l%l90eKA$h%yp6|mIGcniPzJ15G zo#H}skTV7LBYrM{A@+Nf5bkOVH+E%#okwZfY81JldaCDBy$`b1)t4rXfg(3|Hoij1 z?oF4TtY<&%HNCXS%0Yov!z@G>$==19C3rl;88R{HvOG84gquC;jpPQR8}gijs&|P0 z6Xksh8>AbU%24LdiGi_t%xdlwtu^C0G|{1nt_`JlVKy_vhiG;S1Y8?)LIXgW!cb=j zdOnT0R^48{ZcHG>jrqAwGh)}}mWvES-MH)~c`DVM&`e)1&EDf8vu{{%HnmO(axN9J za_|zY>kx4?b0pfMPv8F9ixZkoN==+cS0`f2NNXw?SIzRb;6vY6P0vZJX9r>B-01Zp1&sF1Q|Dx>GU%DR9h!L3)Zn4&8=i z-w+&DJH#0EbuoqV447!uQQ}1v&|R9Y`$t9hGG5H0gT>KTsdXfQ-tKmXmX-OEW+j)XL6jZN&iP3OFc;%W@x4GTCP3bB}`W{ zvyrfK(08r#XfJ_|MurV0_zjeDlC-1wM3o&$46i=V9oM@~gisvq&&Q5iQU_r2|O~JjM0z zoyHHM(Ie?>qWGGdm;^-G!cg~A!^qgc%!uX~yvL;!f|d*^LZyO5CO>Dmi9*;tl~osj z)MUm%(K<>EkjaND!r+dHG1k2eUaRd;h1kRzxjX^hBrp<(RACQ_{LBHkM8m`<&$n3Y z8B;Ex%a2w-e#<(GXIO1j5i=no2i#&l1s3~q;7UJ%x&@yG!!C ze#)wNx~5NYF-bJ|$T<7IoHfb(#ds#8su^8E#37KuoYR<$`M5PzSQu;wXLIuTE=ze8 z491e@tc<0?Lkf3A>o)0nDyYRrU(Ttl#+ibf*kEMXk{Y$+lXEL;Z{kI~G5MjIOcq!+ zcDPynr{oIdJ3$L3YjZR5v`(upiI{KB?B&TUmHc0NueQ8GjHCl>-?VAmV` z6@26$sI0xIVu1HP6s5YZA=wa{mkyGyrdz_@EnD@Y9OeYtf?`$|aWkkSk}jH5E0zCr zniflEY;hG$M?PF>`Xj*g6zhRi6|t9UAoF&3LDwLpWov3_iUTp z^rXcclk#o&^f8F@7$AfR!nHD(48hhff->`{B3?Fc{P9{!UG@;Q41J zrKODN1EcR&yY?~#r{Ew@25`Qtr+96ZBw|b-DyMpm8j5twB~I#@Tf++-p5Je%&Qaya zz*bp?R#*^4SpWO=l5a)bO4eOt*VtKYpuH^ReRf#Fz0n{sE^0I<;~_**rb*pO+t?3; zg}5Z-*^Y&yOdpo5^nSblm6Zt|s3d2U3P;5`rHh?~7v`1O&=%vCw!G-zcvx418C$5w zf>K-hxN(EwaN5_lzf)I%gwhSm+JTQ>Q2fUc3;HI0FhGa=H;91vVqTFyAHuw)ngYd3 z?P?orDa>{wZ!8F&IJ`Ttm-pM7BhW$xr=3T9XO(NNf+l?m-EkA_@!1h0C}c^^L?1aR zKYt(tMcX0H$Z3NpiSF>}>&Ts12Nd< zA0Xa90D%ZsOQT_ANwaz@^+~HHY{KZ|fJK-UC?Co+qjCs zSyd~lA1B$^tsBIZ%h5y?a3jC~i8DUlQA&w&Z^S8F#RM66VSS?ufMz;AI7Fs{C}zK@ zm~*_Z+J<$Z9J4fGYAx`eO6TEvH1&{|Vk7(*8#VljqNYw1uNPUf7S-``2Nvx41a}6~ zBWD@`3&RhBgC{_JQim55`BhHT2ZSJ%y#&R9vt<-MiNb|`s!~ZXT5GW87b%0Lg)dy9 zzFSqit`hk@NapT2Fun}tM1WxJWpR1;2!)*&>|2Y+)EbM$PoiR1nkH&T$g<37<-EMz zlDHNbHLAOuv*D3HeslIlVRs)V<3+D~)v-6=ChiK(o3!k7_DXXUr#D@@`(qjq#NXp< zj91{Wk3Ytz33-#EkdA-}tdxD3N4lq%*Z$0v$OMRaEssFh>qo#{@fwB>5_`1afni6g z+A{7#t}7-3k+GXx%C065x>-6L;u7M0dhJfM^r1l20Dvpo5UEf^49DL=$a?)N-?sy5q1=byR#^NWqFW|?w1uXp$wrLEPmz)E^-iy7^0 z(GJmXnDC|@jf1n%8JzueTdmoN!5I=k$LVj!PdYcdburSx9jb0G+?YcZVj3FMoE|4kJJQX)DINtEeqE7YWGY3O zeRI1>>di=?e_b{60?RyTsvQmln@qiA!q_unjN#uLEMIqS@8B~)@ZCZ8aeu!gY|CVu zw`3=5?X-vR3BXZq<;CZJQ?{7f8`9BO<55(1SPy5db>3cUv$jZz=!R7HfU>p-FK~>3 zKR(m|b@vXcF1=l*tT9gxNswyUH6=%iN|nu$U&K($ChclkNS0>q=W%)#m1-Kp(oue3 z&1!bQow6;9IF2|iY4zWz6ksQ!7+fM%Of*O&$mJTFy33`_Z{RJyoZhd#g-=rb_^f$) zjK75#mB@2-n-y_DngA1o1S<(Mc3J&SJh*)PKK*v%ATh%~n#F!V65(C*555Xp7tGlW zHO1UN>CWDs#rYn-x%a)xL5LwRF>&j@i=@| z3LYz8Al#(Dbee%9%&ax{Pf&OfAGVpU+g6DqI$TI}y6F_V z7bK|s{#_P{BOHFEPQH52v*pE*qcrkzKXuX8`*skiu>&7U@)?nK$!30YwJ)Vu@LRU< zItJvk~to7X7yy|Pz*?w`$GOT983th~5U9Zr=(G16ou=kzbJ`QSE# z9#kzzZ)^37V_Ig_dJs1>*nt}t3tN1g;ggk7+zV7nd-B^z^l0VHc_y!q?0PsEezs#r zqZ(XeXC4H5*Pw&M?I+ovbk5bZmFwZnKtu03J0UB1BwXk*o{!Joz1*sRLE1_VMc37{ zZ5K08Eq^qN{b_N32b;6Ip>0w;OK1Ww=Ds)cFCguqWZbwGaF9gFm%2OBPylbK+WO7; zHU234sE?zwN#@LN#DYvg>QqY_lPms5xrZeWjWqK!wY=6d3ul6+BFVVCnUkf@z=W)+ zr{v&UBAiWL&x{F^Pi-*4^HG8qKxL6F+3Xw~f#5&)!VKA3`bNrEl`_Zr;Y^EST>v2Z z=R8zIoK2^;!P8}e&;P2WXWhTcjmJ+05>Bb&mt52?VA3dmpC_Wt|NCr|BB>ee;z8nLARc39gv z?{0wC>3C)Bx6!D*JCeY7TSX3?@SQl%t8}fhx!LBgJ)(=7<=Fh1tjum|L7LMwq7CZ$ zp^o3^=w%Ft4;|ly%q>h+11_DSG{>voBzx|x4{k>GQ7?{OMgi{_Nm&K{ruXLm3KyQQ zzrR*yOP=ANnBK@5difsq%o){-0pJ&P3P|TWi$B4s_ zQD-yGMlP^@JW%g;D}{+spHlk7h(pr$)k?ij%CXuDIKtLshGskG_jXTGZTBcq4bA!+ zCgb8Wo@OO(YJ{i#y}jGTL(li9Rl5f7J;p5X#_Uk;CDsZr(7-fI;`=9%Rh6<`%f}L0 z_bQN|gZH^NeTI^u^ex3oDIu6~S35!{mLJ2AZ!7DuK7DQ-`S=N#4!NJh(Ez0h3u=|8 z`mVQ@>)4~Q)r%l6G6TcH-z+6AMM6#h?E^hP9b(hUTg!gx$XU&GLOEb^cnuPaN zFsQjz(KC%Ka!xmech`@BcjViVa8YIg_c8+T$_!WDnyC&oKVjU@AfBPo_3a2;UptO|-i>7mGW1~J!tP8Aw z@{cV8N&^2xy-szR8t#Dc3+hE4q@r`HZJo?X2jcI9sYjudApsg<`J23a6@R;psrV%h zORpCton%#3s7u+*`>BSY8bPitxnoGlU-_@*>x8lj-9dqjNE)FNUX zzl&Pd7BG-c$N|k#0#2uBmpbp-{B1d{hi`WH*~_a|`=6nuZopkQtu=watTuJrDzl?c zf`mx*|MA@mKzTvoBDmvS^SxCWo)}RWmSEc3@4VkE5`8M#Sh51Hg@txb=h;A%(E}=0 z8mveIjDySMa>0A~>zrjiiDuc`7Jl;(YFe}}C1lBw0?T4`=#k}A3VeB8td+DXK1n;n zY|nq8V!o@ZXd*@MeVx84$L2@rQ%QOu0{MHN^ zT+~2jf>)$}7sy`Z;i$ay9Zj^4jWTOmqTH&6y_CFF$O$t;&c3jTmz&9OWY-@Hl3bAq z#;vsmdg8WO@Q$Af(&mk8C55(yDz?VSTf4328`$)QI4H|4FuGj$-Q!9I!w9Slw|0;)|!Uau`V+LJFJkH{`)gNLPD`e*Tmls zv7Ml9N+}MMcGgZFsnvi|j5-0&zFO@uiU!neTKVd;)z*6cpjNe!B&I1>%D?Ukq-)3^ zwAXPg$7RBXeMkv1v?g1&M09pI3|^w-FR(hvasN%(8agocgrAIei%nJy>YA|1hdQW_ zEpVYG$s^fcV#R-26jFF^b$xj$f7+fO*MD-hqSkA{9Y*upg}G}7Yu!L~C_l1d+W)*<8z1 zDZ9eVIw{IcOT&HdyJ&%jLu;i;YbMtj2i-!7o&CWMiEAEenSUNqTctSXze|3-BODKZJA3;nInr zF&5Y}Ht=tf8qFFJXJx^}WMI1d=Rg#@{=Xw^7Ho{d?le$=7zoDdDC=jbZGZU|AXpT33b|@26GaB&9f$Yar zq0U~K`JatpyU9ObUn<)(9PbGc-%ZzNu;Lk9c0xI=(kIlxKj3QVoa0#3vj{xuZ5_-K z9XKPZm7V^XSvwTSMcLFVS5@Q9q^jWf+&X%hc>?EWS3m^i!+@ zJ+Bh91GJO%&p#>$8_SB7@65CW#wu9EiqvRk!G7%%@bM(kyf;`$(Qi(v-(L>|XX;+* zmVTx%ontyZhnrVQy~@x|skBFpw)NL{5wvP8YL}gHtMaQJy(n5W&O`JYo z!f5{bNv4U)kMDCOdS`K}Hm{PU)T&bX5|AZoi|XAX@Kb)w|0XvM7}DEof4w4MO4*b_yK2(1B(?Q6FR~aw z1X+j#@|4l$_)e%i%T?m_OU+;{#>8a&%K2Jr?O*-bUN!DN;KB`DB5DT*$|8dY!2u?g z`Hh(7pAo0+mO2NGmj#F)JBdelH{l;y*0y(9J$U*!@cVX5|2#c7J`l0SKHr1)fZY5w z6((nIGO9-NI_Oj(Qkn7mKFAPXmm)tuQQYuzl|%d&NW-;EWIkR#tp$hg-#DSoK*$D} zj*N9Wvg64SkruP0*69O8@J$K6Zy_TWfqZ>oY=h=8!ZU^=j{9ubBjZ`zn74xveXykH zk;l$4OlKcI%l)8XFVR%vTHWbuFbqL9vficHl_+N!$Nzs2Uo*`&UgDa4)oIXBNMHuq6Ytb5aEYlg+^r_7j zx)Zh?VPn2}Ej_r?ryXWBWW4m^4sT*z!HTvS00jy9)D)O{_6AHluq?NQ&I0uAM;tcW z8J|o^f*?keFEq%I2TX~RrMl$#f5{?#|M-}6hz0iw4HM!zLI%&jD-$OJ7*bp+bAbwf zCH9V0RX@C$eB}YHcgT$RGPj5|C@DYUkAs=?^eXyvB!Hv(|69U52L=wEDivXF(UhvG zBux23PeIfIz5&FoJxT72>ym1mhx6leP*ej;Mz; z-Y897W*E9fTdGXV4e3`(;|-w&4f3C|Xeca6`>?kH{^_XwuISP|zgjk9b z_2p%C;hg85@;#;3Dih!&YPC0cd(5cSTVmLyj1k7c<&io8m~!;G`?#Mv#&Bcedk8Lh zK$@iaK3UrCsFq!-?JnIcWz6r~ou6UEmN2hm<_wLw}*%7V9$BI5=|F7^k1Ek?phrqojM;7)P{@o@d2?Xz;e zS~IjXzH)fi*dY+sOS?K+sM)M=eTE3HCad}6xT zV)tjjoi_spG0zlc^hcDi1n<>9=WQH&9|vP&eF)K;CS*zv?>t4fC3yj#G)Olgc9a$j zpw6zZN39K z#XE|wF7Fq{&OwoIZu9?73xKY>*KqUI=WYmd`(8U~v-@Ridh+Y_^rE35I^k?<^6>mA z;699(7w`?UZTL_*_J`vp;PT=$Cccl}jlH3s`%TOJh+x^Bmp9vUFD62`U!?!{h#)YZ z_1t9Z=Y1IPJP$`??ppOI=dkIW0IhNLRoy_LHZ!w9yr)x)F4@k&ioZVa`Te7n`u4!Fu6FtR(zXEIkeeT)|T%L}_6oh`Md0imu z@a{1K1+ZtasW$)UyPO5L0&sdS<{mwR8&Yxme%(vF&k1iAq(;0Qd|5__HfO9;k!h&c zeu{cuJ9j|gK8Hchnx@^<=zjS`D0%Mrw!d&qwG za0c^B4(T0?=#q538-C693AdY(5vGpd)eGx@*Nla8HkwDW#6NzvL-{rcAj!%F1Ze0s#CS{$jDaC2Eu%*?l>)7p zON_^M`nE4(yaXg*%!Ah9+7!Pa%K^gKIsj_`(;9D(GF%F#3N3gWE+Y0Bs}u~WQ#x$D z_`U?hY`=XpuFE(zN3k=ckONdaCLNLnMoN02afk510AZU5zU3gEXpWg94uB{o=@bSZ z4YlNHSha=A#YnX!jE4(&n}FB z6&%_Z`CpX$z~f(3=~xHm!D4|$!$_lD(QkCzUDBX?DHDg}6_B@*qm$Iw2Nb@tE$&^D zoxjJS1j33!$pl&}yh?*(7{^_MmCch`%tq}?l?|Q2<5oaI&W?Odc%aj|5tkEEN@k3Z zJW+tl!Xy4{U1+fXoA`ia662@pIy-XBm)#w)V-@o6ofNhQF{^;kz(y1lnES7mxe$Iqr6nyJm+t_gOjLJa@N% z%n=>Ev49n?_gzYhUIm2!&?e+DELVU)Au59hQQS!#7UBH}B$m@Jb(Yj*BjtaJ8l{#s z0zu}UTfI{MD&rzwd=v97?|Ytn0t^*1PDN7rdS6ega#3$iI8RmyeP^c!9sfx;53aYq z-2&h?MBFpMB8`$N1C@-P3B)kA8>e1m&)5MUfqgZCivc`q9QE!m9wHcbYfri7Ja3rm zE0s@OeSo=uc%QnjaUD?1f8|@F2Qw3ZTYH&7S01IeAZ z*xqx*7cv50!1m8r2;RQtKWg{AI#8&7hAiB8s!={pAdK( z@!c~qP*`O8YRB2{`#sy`-~2nqTcb8@-{Sf~WbmbdNP{FQ;2ZJZG1RCRZT`u6K4J=K z(&w-!b9B+ICWODb;;VOFPqs$s9N?9KP6M+_NV^+RaC@-ud7AFO0!r^wGPJngq{r?I zS^?eZdYx@f{}4Om%?AXS-I90?p2Q&x5ZnkoK0wk&j;Dy~`9bbiRT&O5?4~bf(#q{W zuo$^q8F}m@yN((gjO1ZC6pYJxYfO@!v)F zot+(On&4T8A^i^$LOcMi!p6j$Z@RD7-|dgjPYGd7`3k;StEB0B zQR^+-QYh1b;@s8LiJRvYv5$&5id~phS2Ra)zn&D|Dc=WfiIi|z$3K+ zZngFY#zux=U{dZQpEmn`UXqg1O*s}Y1l4R^d}r}bqZ0aIy+UBia3bRnq#G4#qloA6 zdHo9!0@bKA8jW0v4;QS3I|tR-1CZjYh7mz$W4o+v%E}dJf9I3J3?qfbDOk)g9lS-Z zOjW60Se-is-mpusMzv&Wy!?piqxkZ8pvnhZ$(jzcf(g=^YtF!bC=X4V{RK4gh2im6*C4pZ9Isl0 zIWj5Jk?uul^xt@o-aRwt!6r*77zBq7uw$d3zeCkbSDRtjk2hJjWI59mzm4RCQo)Cv zMx39kGi!`jfA9lK_)lOo|Cm8$9AjDjlo&a+N%VxFg*abw`}jOuY8 zsq8ap0)KmAm{|&x$2$4+t1M$&+b7Zmg1dXo8Q#IuZpoghwd2!aw?(n2!2JS|@z*qL zbGseyF0z7w>7e}z;#t;-mQks!&{49`1tgA~*{IkDK!L&rF`XS?F`OiWV6If^G8BiD zOdyC9Os3yk-5-VRf6PaCK=W96F(+ip2vReerNf{|NrOqbNkhl3@QO-IGt`Qhf3&E{B@gM4P|8ISelV0T;ba~yhwOu z6qc28Ur$FBp}kYc*@U)KGJ^WY{EA4?d`~!YzZjD@zGtrA()bafJ_=@m~7pr)YX5{xX|5@u?7ow-@oy;{+TAqdABa4;Y*=dZ1ohM*0V zo*95G_~|}2{GrIK9^JH@o9kxkOnipstRK++^||{-nwweb6Der`TsV#kllImn7HyG9yb38{Lxn{i7%PxX5Tx#N_X+V3po ztBo8iF#m3-)3PvfPP$d|bV)q_SF}u*(Pr0Yl~8)G5G7)}H#WS8qZP-ot#>%TZpLB% zWLxNryGDee1I(L5N8~g-Rw!&0K1Ru+Mnd8#y)``KQR*K(L>p2G$ddNn;OgTa^Vmo) zcR;8M*jfwoqSho!a5s>S5u|LP032}BFA1q%NZ@Hv50Q{6-DY9FN@{DDG_1?i-hg zGrfK1iN0t1O~={D`a9t%aqZau5LU*7%ifK3g)I9cm-nR)iR&mkzkUOL0TS<_RAV}It_f8 zP{|VDjJDdEMwbPp+e9BI0fwF(!wrt3ZQdH|ECy0RhANCP%z+z-R_|ppo;Ia2<)BK@ z)(3I+1-c=IW1J!zSI(oCO-%ptTQg=G(DVvAdXsBD(hH82%1pg@f&^_OCLfU@LVWS0Amcmu@Zp;5mW|q-wXMT z+&b-^_a~tqlpK8}O~yx?zXbkduW26-LsvZ_VTtg%R;b`Q@%LLG(^CQb%?$l`%Ha z%tlBnDT#^zUmR3I?C3=#>MC^kv;!Wwq@yhJL7!3KAl{ z_RoD-KrYQ$w_v4WAa@6@86+hDq{#=#)T`96&n{zB415{f83%5J#@ zotjI!mPeGP(4T|_*84*-vl8bc89$rR)~Vu}c3Ghd*=si|b*r3u!u&GHk}|5q(mYeT zbztOVQnglf5^eAf4e^P>4!g2RfWR`bt70jIj`n0>Y8|WaPC38um>$WvQ5X~_seKLj zDtv*c(8SfFQZl(m=})NiS&H&CHcz1!^x9gJRa_O9FfbzQ(YG1eGON|F>J}swNUhN# z{c%P6)^W7bgVZ)wt4XESd-Sd6*6fUl9O1%yuUT)CuY4S5skn4m6YDT!51da> z%?x{Mcg1uI?@9jZZ$+HNz|Brfq#9=*%Wo~&y)^qFqt!pw{mZ*%56@xSI4ZBzMIBqE z*rR_Xvi_F{{eP6N3|N*);HuOwXpa^`H+Mqo2td zlda@@qrtI$f2B;~QHs|J8?KLQ!C1r=9{QqHGTAhZ16c^#3E>d&Hoo(x+PcqrXO zDytYQO3}Y+PiG@}%EM-9lB4ma$fX}5B-e{o=7y%Jsvq?i#}rR~geAxi>GeNs^nd9! zgrF=`yL7soLr9FZ(|KcFC@HZ}_e9GSUzfi>_0$F*yOqAeUypNLy2ZBNFxnckLMLw+ z0jAqEHPULyY`gzwCM+-nG7z1N>1Q6EbbQ`d3;No7mdRA(NHE65N3 z>{pBxr%u(H($8lZWSUAwyc+Z-)>zDf9!L+p#JO5=K|3jKX1g(-9-sN4f zG&-=~8g76L*5+uqJO8&ehRl>p@D~BZTyp(F>pxh~@S7Z~t#TAI*ReU5tZ7SM=O}_^ z`@b2x9TM)R;D+~2R#3U+Qa>|&(%D{(woX3*n(D29|@7jjd z+5_sK{6A6u57Ap5(U0&s*V|G@y3IZ-{Z3CT^^@Js;I($PS|)9C$cLQBOQPfPLSbSq zvgykIGM4{4ItVm6F!}Scz*NN;>IeGn?wzl12$F^iA|1PGc(UaU7@SJ^hOBVmR6V5jlMbE2Fz6PK4xf7Ckh1sw33E|50n`{#9$} z-Th0eVFu7@#9O0up;rOa8vmU#Rl+@wvTP#-Vs@@c&SV4~4QTToM%`0@i|UXkb8HH= zjEpfa3lAoLDvHlNK~w)*YVn@{SR&MS5+Q$aI52|_Q+M=g3XJ+}*bC1jm2{WZ_}47h zyhywWD`0_eK>_b%`EMD>|3qCY@eWB)G_zaVbh);D=A#pVjnW8_Uu32QeGh>DHUlO_|~rPS1r0pHRbo!iEQuX zl_g3e3F_Rb8mLtlk~!$u`t~b}w2(xE78?KR@$}5JFC{1v79F5c%A>MXx~1^&ZIcW> zan6)H4Rb}al^^U60W)C~-<*$-{5d8DPvs#({uv2yWbOv~sa+!dsNqy}PH)skSQa4c zI8^Xos88-F4+&EM3w1*p%sV<>NIpLqM@P^4$DW1^QK9Z0u6{4Cz9ad=4PqU zw8Xw-K=VKzAy%QDxF1~!X+MuAUP{Y!lMmr*XS*} z&UC6JDY;2tm6b&W4jIR}fmDndAOFkzXS^y?Az2-X0!yNoW2v-^3L(QE?bPKPaNYo$~rqK!EC7*tcSeGP=fkF4@~7%!A||`est@-pWcuWEx3aSWe|& zk{gvU2!y~dCCUTIUr{9WHuQwIQR|wKY%wSCcrd2=MfRe8+NiW=8wq|cQ?<#e+` zX+OERY>KKP$%U*1e^Ar2E9wG^AkS)B&<87-1(Q@0NfAORl%uG?&K;}5isqdKz!Xug z5>`8dQCZxO__Ls7?+|-9$VL-kQ~J^70X<20l!B{4N@zRbNPyyyZfo#c0GEf-nYpM& zj_Z^uDA88nOZmh9?{+xqRt{iR80|bML9|Yq^qQR**hB`lRcBdR-I`aQI9ygouTLx7 z#*cD)L`+@NUe`!VQA-#0WR(A1MZPsF>zA;iv8tg32QKud6QoywBtzP!n&zMZGiMtA z{47#zuS|ugu1O+tdutUxLQJ}7?`TcQ(@7ceTZQnFWd*c61&+=6S%Kh|hR#@Ve6Rh& z`IAXJq#wZ!bWp^LHOCrWxZ4aON@VcBt0PxySsP#TGP?Eo#U7m|$<_=7zO+SLU- zXkcxTHd$v=hk(`A(kyaxb5VSF^deXeJ3@rWU7B;5Hc5d}nMldn(&{lh_z8FY>A}z% z60KNA1v!p|H2D(y652fg0dOc0qZ@_7XeHt3gCVMyp|v(f@*K$k$vO=H+)>2n z4+?A<0L=ycB15u<7SWglr9_doQ0#m-r`%o_R*nQCcKdR11W-I=L^rx94dK<$XRK{# z>(L!K6~bKb`4P0XrpsANX}-O`XoG{zXePpk@y#? zx+E%@v$T%|=};pABtQ>59zA3u++0IP*Zz>6M<8*lVW)mflnbxs5$NQEDGtCb!0j**TBKnETZX7lGkD3N*YnL>HKbGZSja}2%8!kbI9D5Tiumw7Y?oke?6w$;BB zy~OPl@az+(t!bu@9akT#fhK?oD6ey@@O^bxY{3nR#mo~p2i}-7#n_7QQ zhJ4#4(pR1UF#*}i_2I9yjooT1aAQCSqnq4HDP}_{V%}d>eo<`~o5UjtOBS#)WJSMa zdmN}EwH`N-_0C9b^g22aCERhC*T~`cdRz%t_k4wa@$Om}vUK|z8BN*7V6qdpzoYtTEw0+)nvKd`=*YjQ7KK)DQr>um4;o=L2KE&8P zY;5;uWcMjPrx@3@Q9VJSox8Pa#TD&=($3cy_m{2y zy@r-q&Gc2ErN6iO)y~=6zVLoYXl$m2@4JHA3PZPY&3jb0hM67-&g8LEU;*;+_A4p` zptHRy1VmZ90NlSWzw!KTcj(1VTmjcNeoYx7UwLUi=d36a0KBckC=bWyW(E#_wCNoD!)1e_B zPE2;oHJyog>oc&RIng`PStLo_ROcsQ`fs;Kj}E*G;4|f#u5E7TASH^qrxYm=qv4or zUmN=ijME++&o}r7IJ_y-xeizyE=Qyxe(!_(@RaRd(0Y&{dluK*B)8bi#ETt|Rc8Qx zRMqLNps%8DW_Le+aCe`9BvpX{2b0_P^LjMp4IJLfn{TbBpIn#AW%pxCSbPUrTS%#Q zvOELN?d$q^m7T9}hwCkrLZR~f68rSza=I{{hu)`OJXa89={YU3KU5yT$dC@E$<6Zl z2;40&D|O+^Nn!aeMoxgU@Sfc}`zgGCeL-A8_svUv8v#oQwyb%0O56K%QtuHa`e@EV zS7WN{F_M^^{vIYuP?>2|ww~i{h(2T}#_b;FrGrnyrtViiX-JLL-i4J)_@}VA2O*6y zQ?Q}0`}@K`n)>%4xxN8|X8$1&iB3^1-68kv_P5!~y^-05EZz?l5R5;0#3dncITF^@ zO^t4y_fvW>_`J*9EKqMHtOQG|%lsGkStl2`xgp57)FiLZ76>4Ix)t^@Y}Q+w)w&n_ zZ$qWV>?2l$Caj+Cqy)Hl+>)Bc{*E?^mhP9Ud1eFQ2>p9e*-AuAQWs%=8n*Gme4r zBw0D0mU3Y6`3@hxFQXmjCY9*=pf9CvX&3b2^FDF;J3qjpQ|{lJ7KQQGUp#sO0+`F~ zM)-_}R*S54D)Ox2>Qi-l1i%m8HD~E+y5&H-;`qGP3MHFzd4f}1%4PJuO`5Oy*gHvE zUgPpwO2%iNa=O33HX7E$!{OY64o>LkM}g+}*<8~=cJEK5pOSLuz9lJNoFw-@pqYDpW0ru@x z=80qRudA=#RCxd~l?3Ywm#@B!!Rc=KYZ(wz@Hy@#00ag`4g){^r8*$7vE>HORN*B(MIGb8L*Yg4J(%ij$Gd*}gLYGpGyWjt8 z$Kvw4nZGYw1ZD^sk~*;J9yy@jy_Bu1+xgxpdMfA7fIPs(^7^`;e>T<_ahM7jcvEeA z-%dw5B|LLx!QIsL^RdW-(XM-TKf8RW`I5-lz45q7b$x(`cGV!95VXKrLSKQ6bD=&y_WqWuALy0eMz>)h2BAJTabp*R*59)hQV{xd=M>j^%=dE8^Q zH<{PfT1rNRbZ00WJ)dVS$CJOKW_C{N=i)Fl^OHH_>~}0Km-BV;C%e6xpCoy{mQD|E z^uF9qUsxij-HO|JHvky^GW`c#PD%{^YxaLDb~>#c z^{zOQ)jC|vtRT>y_%@ad>yk;H0rmOCcyrEWV)bQ69$2lCa~WU(?SyG7gh;9S*s z&J<4vE0;q^05BD1jd63=TNKSy=MCWidJRT@WzNSDKe41q@m#>;?fz-a*R`I5o2Yd-`%yoYAqzEEboe<7ID^^ixei2*)1= zsc4SUVL>iMRk)vUCOsVA>>Q+HOS(S$`EhvfxUL8j2iABdlZt+p5a1 z-JR{~CpRkSe6%KdYRgmqJ+hU`O*e~c06Db$iuu>)T4}Dum?>>*N{7tGaj?G(q*1bb z8XSGr*2vU`kwOT;!!LINHp?-UDuJT@kj5DQ#)@#a41YD#<^hXXsDQxU&C%uWmg_WNwG0u1`-NsVrDr6YN;b!_+(}G1L5x?kF zSm%}$M-EZQONUUCk5aTwSvEn0fB#;3-o@B78j#w05mCj&5TPxtkU{%>tF~PZMwl-W z?$#HPN-6pZ^Y!9j+~~5S1kf;~Am4+XYR4TM#tRBp)YU>uG5(6ch6}ZVWlyce!NTJm zotY{Za+4bl^o5wI@dpL*u5(Xe-x;124NZ}=*-PMd*~Qi7V}7!uaEloz`JSJOL16}y zr3Nt#t3xmRt7kmdGF&%pkE;LM41<3tJbZHQgr8z`TqjW*Gw?`NW06M~px&u`n=(Wj z5hw%y`@l&^WC~5#1w2#YCgB~B1lITX zqDn=WU{v5moIDaf`f`T)vIPWM1rVm*W_}BX40_HTv#wDa}~IbHSImdLGckC%XBGSq#?%G;Pdg=U04N;jo&?`M}%#dR=U&l z_xG{8xW*{vCI;Z!yps&;y|1}v}Ybif!->1r_DFLj#7q|3dW)P(lDdHVrYw}j-Z(pMXZT+6#Oo!pfq@b zQ!BFWC5Yyc=e7_n;r)D~Idl&I_oGGvS26`}bk@p%*EsBiiJ71$g?&%>-l~$zQMkmo z4)nyPsaQ0M$m$-O&hbQcWhdZ2ogD%3Z6II6VHyN#M;~2)QAQroN}Xz#OF5m%o%)Os zc8ChPi-kyO)|&@U1v27Wbm^kZ*N9oeiy>OS!zGiX|0)Vk)99+?2ghiFsMAoTIaxGH z?l>K|lhWves3mLpNPsl$2`EY?Zz3hs1`bgS?AVKh&TV#_~7!o&I!5! zzS`%7TMRPI@Q^AZG(0dnbE~t!&isACiW<7XJrz$@ml)&8-^l@zGOm=b5UeDfp)hHB zuAZ4=Ym*)HjsT&AfVe!)ojjW)Gsc-p%4)9_Q;qL#&Fg#|y1B;t^Lh$(=;FF-2esp7 zaya%fp@4{M2Erg*i0mXgNfAJo=_7pqoDFw^DbfA7-A2RP3!j=^ zozScZy#->Ttu4+kBk^g$Y%)7Slw zP(fV{exTd5pVlGffO5et6^^Iv4lhP6SYgbr9!Gs|961a&yR#%P!l)oMgueFvhdpxj zqd_cEN@9hWmzX#K3wyeT>Qc~Ohv^?@))tEmG7SqHCH+xz#$@*Fo`*S=hH_e_}X8uZq%_QH+k8f zhn@TM-3=`4;q3rwokf<=bQs`k%K-QrF?RR^szEeei?M_6>t$WaR`E%igwNNSdTZju z1RnQ|5(iRN+Z%7Tg$XKZ7={U%A#4<0XrF`JY0vhMeD{*y$w;F#{%+&pU_56eI{!1b zb^G0>S!~JGBW%n~{de(LxBF`PX|x6l2rlK){Xe|Imi0hj;!cF{-JWoY34U{A5~7Rf zhHX%anY!P8f8LSq5{>2MCqcO{d4&#Ddw4n5cC}}8+7-JqR{4@lb*|Zi3^_{GY3h2r${djICoU|7f zpSQCr>KsNw7<4c^`P>~KQ2ET z?KBqh)lBp=*wv@1d9yumEQ~&)HOd!?^u`O3-KxEBc8;2zLnlZPnrHScdf@|6Ma)OS z4km-;Prq{GIaaPoW()cyQ~6W0jYQ+v>sp&$7scljmJO`+D}hsJ=TVBAuA%y%gUWAE%tY@q~RL*SLeI9P5Lm~K3uH6-d-LhqtZfZ?fq#!18A)P)R#76Q^%;FwJXGSj2^lx5ga+=$OP zm+q7?Ie?zcm?6U`LD}Op4$-7_yWZ~gDA;%LP0)EveUCopCi;V0B|D6I?Njy5J(=o; zP&)NlE_F@Pupn;ay-!fSr8D;$IULdXH?Tw-9`f0VlnX>EK(TCT_)f6+55r%fMR1-q z@K7DlejUK`V}bcxy)Mge`cLgCq-fm^%a*5AdnuV47JJ_yjI31lHM~-mNy1JXI;o6! zZR?%kbB?v+PkkN+uU_$eT&eqHBhz<}9{_oKAthUn&I z{)~=phJU04iAO|*!Hj=YT>AUP$V?CZ4P;>=`hk>4$rYHu|0cfZ8xURBVhP;N&vY<% zBsmb#8v&rhY(5G_N+et`o{t#^4wfsPzPwF5vMb$}3-;x%XLj)3ypc*vsoitcLkh^! zp@YlD8nPO_OB@U?-%r>z$)R4CwWB+I!dhOi1unJozy)xvbMT4yvp@uSApEoWh&-dU z8_tR`z|r^Fo5K>o;bb7?;jz+~ck61JrsL&n3GmfgZ&;Qi6Itw>#Z>jVuul#K2>I9N zmld+#x7btfg#@HAE{C={uy?;4jHE@%&^AXZyQC`_sAy3uVxEj1;%#+~Mg6{EMo%ur zmoO`%lC3(Md1EqwIO`WsYUHvB76{X*LeqRfR4}L}nTitLCvT-cW$@|zRS=lCq*IoM zod0DCL7%XKgOR0w!^)MIN|-vnoA2Lqn#gHD3VI#^AZuRy#`w-AK`-MIGQdzQlOr!a zIHEhfgSb>yQ&We9@{~7XztBiLc1J87QKY;a>t70I6Oh3aCMgfY+b6il?;Qk2(Nd3g zj908oX*>$~VH~6m`-0WXBHro6yBnvS^A(`HVs$lhnM@7lKTjZ7mnVR~p zp-wKD7stqj%2wwD(J0G*!UtE+gs22cnp(P^fKiOIlP|6?65MzRMR-u-yeCMg9JI4p zpax30E*5Hvp@UnYr+3zf=AJAXm<=6@LQHUOS2;n=jI1t2WCZC7%P3c)pOcGUv3KY4 z4&GL0OIr(*%W*^1a5cF+8$onv)dV~^3JyA?z7&jT_b>qo^czxPF(i$#+K3`Ii9{4i z5f5OxoXD~N$x$U{3(6y*Lk2Mvr{vR%>u9GowX75Npx(Ek;IL=*31rnhd&NUjtd;u%g8GJv)t@1 z-`hC7pE*XEXay}(2#R@rQXw*m{ps{S|6wx59YVzmO-)(|EtfMUYr%GnzaMKxK$;_s zSWHl-R7na`$bzDRSaxaqbp33B*A%?^Mj$3kIA|@Zl2#{CVV8cyBaR_%(nPvlq8$25Wobmnj29m$!2B7*3>{I zP$R}P`zebmg3td7Tjc82?UZTFQT!*+N5XmVr`jxQQwZj!@!8n7@=e5gYy z*r5A$ePwT2yAa687JjX{0*3Ldn;xLOa8HZM#Q;W$z@u&V@|GeI+Wq<|D$6@<$^}sM zGZ0&knbGQfqGEWed-Av0$o-yscIxjjj>ZXssAlCBGrCV;bQIQacr;ebQ=Q>8aRK~drM=N1 ziVvH%7=)32gJs^wUK*@{3n#*-wUqF}D;#YCcJCMGz2?paXLS3iQF3BDzR82R%>DBh z-UIg?Hw|X;UAK5}ReAJdp0I``Km&fj=v!~P1)?^v?_TI-&WC|sM?v*aF-&1SusnNSttfZ zhlBA%_)`gEq!9bzdV95qK#zbZXXP!J;_Z)5r=gj*Q1T%%T{&_!yp661w`7(e2(8tI5YHXmjS+3)q8Rzk-#uu)@Y>hDbXV@v3fU4ch^g!E5@CcyWYbb zz7puaE*77@;?-`p8tENZ6Mtv0pv+lHE{Aup<*@|)_DUAfH!lvO%UK zL1%kIH(lp}LNgY5JOfj0X!g62zm_0-Tp_esVd_?#9Jp!kPh?AUUNNq$ApUS8kSvv- z949A%;lafe(_(m)Y`OTk55ol^YEcdi53v{HJwpL$EYLxxwl|dwSFj(uk}_3hDlsE6 zt3mR=;3|MpyCwLck_4qwi6TKT3eAQ&mZY7XnS^g)*0$O`!=+&n{cFvG8)@clP#hF( z(4;)L^p~<`jJ>!!(@2bUVeV`_X2z zW7?yXEIUFClvaNLc1%~=XI-!93RIZzNKpb^Ef4NT?W;@Bhe&76yMmZtSakahZxK8> zXS`%EI;4+=_BKxxhBsW!)i^+Qg^-}Mkt{W8mqy~JvMH0~qe-EHM4CMm>M(7Hln$h* zXuo4H6i7)47%{yDN)e@Y^J`N9!`iFhn3BggnS(>xtN~5`pN0!mP*{^Ai9e$M6edp_ z4^X5XnFq+xSjNa$8pC2fF!ig2&2cFeHKKkSWTj4+30+id)kgZ=N_x!{IyXK>r5j0M zSZT(GZ(+nrdeqMhbso1i4YY407sMY_%Z8s1Gn2>;6qPDW-QU~7jzK_Kp4qZd{>fi% zP7%Qg^usYTtY>^caEk>a!?cS)p0O#AFewdr3y7c*BlKGU#`rzR&TcP|@i&9#%msf5 z6CDDXezkYuLq>H(^>Mde2rXrlgmT>35lSq8OAy2+#p{M>c=IeU z8mC@;M9Yvijvnh@e!5bALvD+=vOh)-c6HuupZsn$p%F_wQntx$yJZ0;gQUBhDFS8*!+_VMa*X2P%x)EH zd2dbd=t7_1+qse)9Ohc!JcS>|L3o}dma3_Z#c;++M5+W-L(ni|i4@$s@Sa)EYEOg( z4jB^(DM$~AxOl#=sqhiWX&?%zEYZlfI%Wj?Fq-YWq-9~>Jx{@q0fj&s5lpKSwMn1E zlUI)<2O3P5_(T_a0d?9GC4k>QlbBd3zd}xLe4$<$;)H^M!jm4nTe3O|a|~fN!|w-m zo3Prcn32u=Q}yhuTGc#PeqkXoTg6Kjl5Bvme`bYolI=-oVm<7N4a}f1lad?aZ#Zcn zTcU7(W8#E|raF}*MD14aTso`;1e_V^2r-aS7v#*}0EOT8LAfw0icx=oPX>QwR?yL4 zC0#mIlyCw(b50USTFT}YVtoZq<37?aNidBhQKYP}{Jb%+KO|Z%gyCU*@pz*W>qLF| zNgG7Gj6$DweiR9b-q#CM_6g-f$2YGDq59lsOHy3nnb2T~A}^)q0gr%$0|ncz0_6nIA*T9##270#gk zNh_c`?~s6m=L&EC%@l0CHBygGA&LpiFQGGy47Ky4a zmWgGklmemfRqn5q(&3=Ox?vf&B$b=Au}F=U=2&DIsZsErMbJ+y;3!3^i2S}Nh-0DK zQet*`qHyQYgYav(saMc~>vH9|(f+N=MJ;JIC1!m(O}5Fl5F5Jed`#}8N93c!Vtmmk zmvJ5_^W3!qO`4yI$`n>RyLjy-hCJrpEs>c$hZ*?y&$*p)VJOKTHm$ig2i;Ije1)x* zY;ivXj8&@2Sx?3k&5Fp}RD|`UMSf^WHlY!aQ~hH1tT@u5T#8@P95JKSq;8WEtFM(S zr)>9mWWuNRkrp#6=Br@h;?87L%WwQ$WY^@hAVsC1?Ou3fb}1E0R8}!Tnhb1h#WmJO z1raadQ@`kbt23xjWIsoBw(OI;}G*@f^OKP=HJGK;OD$6b?@1EDrjbo&BJg;*{8SV|SXnl|VzXyf95y6Q7M(q>>TQQAU73_9wr8vY+80-yUYC89}fiI-FjU9)1m zKaaJftK#mgk=APUkY(CK_vxK4Kq#v)tC*7+;=Ki-l#h>}t|E%{Kl*e5<%PjhJ|~9p zAKHV^hf+5pku;VpfP*@v8}aiofW~DK!5xI$`Bh4j}rE5I#-BRFIu`hQ!FQ7+}eDp)>61nuN(*FODU1#Ot z6pn4@63tFb5?N(2oP_amyrx=oR_xfp%b*kC|CG^3_|N+s=_j*#7P#jzkPM>Y2Gxxv zTE;Vwe_Ak^e7~$&1)PSYfAMA5DHRy5UVOWe+&=isH&FVgnM4WntW?iO?qB-mkrm*j z>zaMt2NcW?GcX9$hU8%6EhM48vU(f)bRAZw^XBB$ULG?d?l8_d8wChB$p1&3-9xlP z!p}{ynusAZc~gSRw05fY*T|str;?zAJIdKgvLtQluH0>@KL3BbEq{XiTh0EV@Ae>^ zLHR&lQ{lFJljSmx-3w(+<04OotJ*}yleDDL;;v18?#lcPpcvx413Vd8!OLC#wn+bj zBmDQUNA$os&vmH|!`l>E2LN0lO{VJQ|JG^Sv>7I_L9J&m=2{pV$oii|8=ooLDnL94 z0hnlittTPI(>jxXV-^bzy z9AW4?5pN>UBxz?M%OW#;P}(~_3ge%u@k>!B8z_zpMYX*u=M^z-w%fe%;w_|j~|-dmk-r3hv2p!gfdfWD%+n#kBHh+@ z2Mh|EeA9#qk9%mGZB<#a->r8f{~Tq=b@F)n?7wa2|8=(>Ako~`&2dHDzYxn(%3rcU zzM$6Dzs8pTxGHK9Ygfm+Vw@9F<>c z(R72x1g?fkJ&^jorj)YCT&Hy`<7(LdyPN@{!yMEV>$FKS#%WA93EFlRC&wrWcd4ih z*@2{pqA)+fbtn1vqdOofHB~GBauTQREVepW+ zr-9>5;8)gV)xnHGjZ0g_KsB&@A)v^)H&H(1|0eO@M$d480@m>-A#!3&vQG z8lyzbkpl@Y{IU|~-U(}c0G|zibd}iBfA<$KN#_p1Vb(OB>VbTgQK%&lZzhkrzP?2Y z0w#NkT<5E4fqS{e<9d2NxXFkzREMt*|ajUvRnPy!utuBI#{Rg zS~OVcN}_nJkS0ZW!K@i{>P-`0vM#Yu0ECDCO|<}gHehbf4(p!>nf1&1aHPMXJVd$9 z=N15_E~NqKzs9~ufU)mD_uhJIO)NgT?`!D}Hc+8&5Ph%^Z`$$_ZBcnH z0BCoEMx&-)ib4o<+BgW646jwx%=o7kz2XS+z z$ENllUb0A4DUp^BAHm)$ov4l?tD(B}Mt2{dKk(qam|7zSe^vyo6&?^*8;g&j24_GG z3Lw?|^yf4rP?RntTe`uP(XG)7BtTpM!YXYhUH!=mz4Av<@i!_Jy$Kkpf~*=TG36Tt zu(a^#l=3_dq_h_Mpwgl?CiQOOk5-t8gM%B-R84KVWGWKUp|?`RY9@72(2-VcI<+y> zoNamVfkdaA?maQ=u?k?o8Y6&W5e&!#qTUvL#mk3#S|wR>axi`X=|k10fJ-TIWOM(~ zvm-vTB7Z?Z7%W}m%2iQtLrMlcG!+v;I58w2)fFu=Q-K>4_S2%knbN3DMZGyU4+gP- z!pZnRNq;%1wmeS-)iOQIK}&pBvy_i0zES@K!Dw82R57V?c>hjKutG)R2y&*>t1z}p zBX17f2$c+v2CxHf`%~q`f?`8|aK2E8LI%MpX$&>q!K;iGH9{lmPztV(n$*$?QbRJn zeX%dzxOe(bk;3>6;WCafr3uxyGA31*{^Ke?`o(+zX7z6-^7w(86Xv|QFSSf#)kunF z;S`Nh$VQZ19$+pzFPrQ-KekaH5{r|!d3n{B-FJ?9t;!_J)yw?=M6c%{DhwF-Fx;_Y z>&uJB;;5wF{QCUz@-{Y1$Z16`D?GlO2~*kbO+lPQker)~NjO3auD8j>h`XM=9al!S zCqt4H*`l?O&aSp@ z6ga2Y=kg@TWg_`*E$|Ty3~wz8RIvD5EG!(UlZSY`p1=N2Q2_&|FKy=t+Wn%kP72l+FJ-LcQHXPeyJ)YTEB zd9!8M+G}fnO`EpAd9Lp{oB`Cdw-XyQl+I62fd{u^mLy0K;``L+)Mb+*!S$fOG=4WX zv*XzWGSpO6PfP*05y1)^8=H%eHsD2o;wDf233ug}pKc{jX@5G)DhpNZE<5*s!a{;u zM^M6%k`TUpza`&=9sNF%(?S1EcyG(F^V8v~$#_&Yo>tRmu}NzE?Ou25s&#teqB5dt z1t~ep=XbhC_S=TnCFgO|Ht*90_l#JJ(BpVl>)Q^HKjUPJ2 z%je$8z6paO%z~X1CHWnFwr<~u6fdrK5M*;Zn)>!B>r!b?Hn=&%YiG?d7=dEK^mJ8q zbW~w4vGMS3(5aL zxILyX_EdtKvf77O>bHebf%22grudZcniKqldvTZCvRt{zUC}BkD_UOR zHKE=tT{LIW@%iJ@>~s5=eVKjK>cj`&``a>tefF@2k?y66buM7=Gis+Ure?U;ne)Nl#u|NL#z#R|fi0 zRrks5xb4e|jk5CA++2KD_GQlJb$7bf(Z^eJ7wZiF#?}_xjm~=WA1S-9y_7EJsaA9w z&zHl9v53p5n6KBV=JzgtQw^?&nu`LtX8qp$8lR7I>>RJhx={SjIrXlH&4UWPm$5$4 zNZa<08bd|_nc0Pv6?)&-en9Tff6aIE+$k}J>h>Hw{MM>`8~H! zt1hefeQ0f$Ra9)hj!{2EN7Hv+Z*014&91DxvwvNi(D3E{HYRc%p7!Np;&GfcQP*{S zNus?=Uw6A&t@YJ0_c;l{wtHPL<9j+ww)p_@0m}IbKF)D!*ZI1&(|dY-@6_2mL_K`k za5)Ys$r<_tFJ?S@pkAtenK0}2=Y`YoFS~o&{$Nu$y``?xW@;-tM+Zq;|}Pp zr+|!)&u`$}o7_#j?>!*VveEc0hs30$sJr$MBA;)1Ur^jP+wc5(XMZlco~pU+K4*rh zDk{1jqH7GsJ`T+ImRB^ss%rdjEB>H=US3I$ZMeO^rvT)wT^AA5SDznO3{^g7kJBN< zb%Ag2pu~B9wDi)_Q^ShqI7xU5FjUtkzXkGL@5XMv=V?7%tgCr`HR-T%pX zI|q4lt?@J6q{V-MC~}$RebRQBTujmRJsRGd2ZWy$S%Zny% zn)4jr*E(^$azG7{3-r$=OGcmL_3dmN{Pr{6WgVx@hcXqcKwCTUHS#=BE0Tn_-@j* z2llS34rsavv4X@0!?vr~rzScL_bo8=_tUO7h6=xnCi&sL(VIF& zGK{Bfud9KBlRr5h?MTPM_&!w?ZAv0z*uP+^`bI6uZvgiN!r_ z-2jZ~K_LGziQIAqz_KbzJ4 zDmnbg>p$zx)98Mx)ZBi57>x}GNZhY&w{E|E*{jWVr|$}7`4b;mU+?e@qZ@7dij4cU zqvos`Y@IE;==?80iJF9!m6dg?xcf%^Ztr`c>|I|+8J~McZ&#gWR|9Yt=@IP7P7ToZ z9^CjxhzdW)l?@v?F=ln-&_NnDPg|bn##IX_)ltI6olO;p74-VZ-a^NmU|Z~Ww7q_2j`;ud`hn<{$}V^ zE8FAU;5wlF_j_L?y{&EK$K}`8NBUZM?B?UBO^vP3b*$URWlYZby{M|{;?t(f@zkH1 zWHq(*%Ez*@aJ|pxw~x?vMPSif7BZ&%%()1t+Wp`ZohJR>zNRAS0O%r)VMFy29UE5OFs^2#4eA8sc`s|p3aiuF5PO>9NZ7?S*enbRd zyq7inpk0~!WqzKFt`SkPm*sK^CYO@&s?UNo5^KJpL4)?SaDac+W%Nd!!OUR3kmEN? zO0r$&atG-B^9lLaSwzJ)GaFBY$-=&C9FW>XJQL$p*`n?*@1daGS?i5vv*m-DIv< z&Pn#Hg}bPs&{my-VH-iMPy^)JZH3-v*x=qe|66M$U90`wcm{pT|Hsrja97d* zTf?z2v29M0iEZ1qF|lpi=85f0FfmSSPHfxw^4xphwZ31_t5sy> z*XMDJO0i!oUAM>O1vn6nJP$&^h=t;?vhvs4n}u*FPg_gt<9Xoe?|uL9QmCDJww=TF z^}oMw2YIx}+iyK>ELEr>T6Ki+#! zhxm?q^~cwO~F~; z&Pk}i)W!ESQH-~|x0?3A5RC8Dm?0N4(r3tt9%_hJN?`)q1r<89Tjaq@5IyL{!}Hj7Wv-dUW3Nw|*e^RuTChxH z9EkBszeu5Mb+fy0rZq8SPGdDz)xKiN`e%HciHQR3geE_~tv{n+QztJ1eAF$`aE5)c4bW34OzN@Lq7Cz)cpBN)%QYZ-{Q$in-Z1b%z zCEExFlQqaVYE0uo3X<=DeIeGrBgtvn!tF2>%nD!1X$fVvxI(HsgsN06mH6X*r>)eQ zC_0V1YlXa|eAK)J3Hjmc=E*&T3|3K_6Frm({#Y?yw4brPG{(51V$3moGDs^qRQs9g zjJou%W=@yMEYqGZErA4L054{4@D5BxJL?Sy(TR)s&K%(Dy~UmrpYe0(8V$qu+u6^^ zryrGuL5yo(39L`hVe66rdhH49Q6txt(HKY0T%9ZM6MH=%&`>BxMJaQ`8RI1DaH{k5 z6;G2mjAG;dzQUM^Jo?i-nvM5>j8>++AAwDfi+fGatxLN56GU31uPXq7bvC1&4|_7u z5SvXHE}H(f$YF)JNHU5uleB<=nhQI|lm+u3B}167coQNDu!|UvROkJAk}dE)>;DYY zV5SoIcrMm4_(yuJ?FzGx8c#uuvE*Q)BuFAX)Pz!}!AQ^&B5+zjXfKre`)aDD?zdN; zX(PQ}PfCo^RA9F^(uF97IMPIZ-8#83$=7YIb1-2Q5ce z@)2~Pm7=$%piece;YCH5RWG1<*(2arODAP$Zb1iJ7ejvxD1bd=nA|7_TU?)gN{OAXPVgQbVFC3~Mo zs~cVN9tR=%m$C#Q`OM7S#>Pekzejkyd>!}cD}S=$6tG{0Fj|P|DM>`s5TlI+c4HQw zhxRp;d(-~6Xa#|bzdLVF&m#Pv?EQbSuKaXy4O^_z@O^s|7(Thc68IEycc;RmiwO9r zs4YA($$zDbU*}_CaeK=ByPNv#4J*;#xnH3<{|rvFLNL{8HeOXlJ7mB(&Q~DSz(5ni z{Gv)j(eP(rqn{Dx)1pOH)s$TelR>|qc$^(30dcneIdU=W**JYSzM-qVx%xKj$@hoz zzrA=~2#-nBK^tXzkTc@HyU2D};LIG={-vH%8&Ce%WEy%;Js%gHm)&<$H)F88FZJGUi=PIvH7!W zdLP&MG~c(!Y`IdkDhG8B$O)Wj0pA6u>QegM-RltZTWd0x~N|QC5*1@rL z>zH13Uok?2vXMNSnv%BZGaf$8b=CFphP>gvOa%4zR!T{wcbW9}d^e*5ksh-8l@QX5 zYW{QBhgAYM73*)WZ*CVGFZ(9QB50yL9%FOJ8?Uen9uEGU)>=gn)>!HP4s$sCQ6LBD z!7f>oqTo;C6T;g~$=01_$XcguL(^r|QqFlQ+)x9(C{nYs$~fq)b-pX?W+jJ~zVD0J zP$elS329WCA`}XM<&MpJ@_#eNW1TgDpffJ}%LQ6(MZ+riThqH)UgZJs%hFmDPO^fZ zdHsk`y4gTH~F1Ifi? z->o_U3!J&(i>@?b^7eH3 z*;e;%VrMsbpkV-SO+-NWKF{|=s57*f7ddyw*uHYvY=k^6rYP#1!fe)em^cvb|5lYx zz+I2klpgc+5^b63qToJ)-19-?d^l~!pwkV$dPZAi!}w=E>NRY*z@L^#uYx!+ieiQ) za0Rc;e*LvK|FYxegXp?_BkRzKD>`U5a%EGGhvWB(!)z$lnyy>YkBFmVnV-C0z1{v9 z85v+iHiK3b*84PsSQ{S9z5Z}No|m8|k+ZY1285qo&&)hObA~kQqEpc- zK+?DPGzFf*d!Qq{E(zQ%ROzr!<}bgddvN;Q7i$KszSN1Kky+CYdk6b zs8g_7i;1bA?IC}hT&Cx5IV^b|ZF!wZT&UmuDa$VuZGNKt%?@gN2hE2t0F8W}FW?WV z1xiZvx<~Z-8YelVLXj?)LDSFUJh^%l@Q#n9E0^N)t4ZB!@}|&ZTsdKMUI}AVJ^nNp z7_9d&)8`w{@37U%pkrC6NmJIbI44(@S1RDmQ5C3#IAOhwFyHHv(YZceWnT_mEs z4^FI?Uc;EE*ER*Vv=}S8b4vX3QS6B3f;lXn2tJ-`*|7NP2e?y$3vYYMU=Bk2(Kg`w-RYLlIW zuR!lBV-&x!q|h!Egl&h4G~pd==7e}>H5Qz-5)n|M4q|9^d;l+Vh~t_Z(oSL-65dWy z%TY6<<-gnAXxlpgdNpR%f<~XmyA>rVy<*Yk&1~P>mxqR&-ouE%jnt^2*uFq18=Ua1 zI@aK-IWr3jNYyi)ArXc)dP|XDpi#UjNtTG;igVm%2@^=czki&q`mP6THG;CXD%b!Q z+jWkgn#~@It49xRPZ5CHa%yxWWA?bPf!8?}8sZ!nQ7-GH0Hx*(h85eE)g-B*x<7|} z$~q;wNq%+i#>VI>6evSlLRA^`5M{g8zdUf`MNkyrHP(y(o<2Sk0&IoLI5e4kpJd+d z7yXilZfV8^zMgwtlngT?3`WL2^xN5{sDW^jxCqbrn;lhcReR@mQ$(NR$ox0g;FhbR zN-7-{LHKOF4eAT@xBVq_>YOwM%Gcc zpscxvs8xs=t;4X3cPcV`SMl=nun?db|C~qNM8dj}3H`8#kQeK1N&GleUKdL?ex~Ho zImq`rb0aqkQw1(xq-g=`-YbPa_0Yh`*(qjz4dA{GeRuYukpsrhna?#O)j8V zN_of7a;FGj@G;zm!|m`=TsRT> z%HPn(Hm3$;u_gcY-r!5lQ%j5-|69)AXC$eDuC}MJ$B{9d`nUf@OYXXU-zsXsOpo{S zW9Z%2?IE%wCvvB5v?*VTk%B#w1)?5l=pSm;$I18iGJ)r^y3cjjWxbbZgRjFWgLgP$ zl=u-Jm1J8x^K|E#vwduSZWT|A(`!KDpmlwR}%o{v17Kwv@e6D5u2pnyhOJ zbMNk7&(mrxi2i@x2$5WjJQMBaa!`WNbbjDZumI*rHp4@r2LK3_VmFc@-RK-!uVe6x zJyG}^{BQKueZdz&(RH?#IRhPB@w_eqR=KqKlpM}qWe-L~&@iHIzvFMU)~sXF>-y}y33$Ay zE%#fyOHkEQ;KGuTWx)RALx;>GaVJLl9sXk{zSD9hBrO8x5gN6koe}bq$-wghk>L(& zJ3C@}R|YSS43=0-v;r$jYj^< zdnFs)W#`*w=jEU1Cco>us_M$m!3zW8wdcVVx}V(fA4`UHZn3*f@TT=HxQ{!rLAEnXq(l$wi!~+jB_nl zzC_2E6&(Ce?~gS)tFArHBU3VUU2YFrM}bF|9dGV}BD${YY4qO&`zOZoO3y%ezUS@D zMcr?ss`)qjPsMMGO_%GLXuQ0UwAGb`iQlvWJd44FM@s_khF|=T&j!Ae58n}Gwyn(8 z_v!GR&I`4(OCd;mtDUL^$fSb^a>(-HMUSL0>bxBIf5aOS*Vp+zMdRh;5#XdPdO9M< z1{DVL`_BbE^H-Ps3+HxUIM?*ve7Um83kEy_j`Ddnygl^Kf^LD8Pd#73g90Ac+qJno zg8})2TO1j(+mLkF=#gVE63Vt+=*VGG=9G6j={~P_2K&6#-%;n|k;FJ!D5R_FApE-- zxMS3sIbU0@q^*;|II-IKUpf57O8(}Eqbo1N>0!Rj9&3ZT|Bh~Aab+ozNU53*-T^~n zBdWntOQ-gs1Ha#7>i5JWL1^F$^%J&(tB0JmJ7*YxE-1OT=;oEG-dPS(@Y zv!ls;8`g}5u|~(Y?ZDt2$$Gn46K>~_J*)warw`)%Tu=X2_~nKqwDR_f>q1fn!38m>Xo*u zfGq*D22CC9LsnKcM<+yZAL{>J;0VG3qNsV7G<}}0&Xs?(_)f9xpH;p<8yi02!_$Mv zswvC88xdn&wIPqQy9E_qZB~}{ck+Woot_>aUtZp(q_j?0f!ZKHA}%Z~lbUOcken+W zqnVr*#))ia9da>btZ+KcpEx)e8~cBOWKL!BOkX&f6vtAb=48RLvD;Idtb9v@sL#R- zH~m@jx)sJOpk66&YAS9k!`m2JdH_}e^YRE=i`Ma54@)ssI`1pJClx-@?%1z3t zE>BG{>e64g+v(L8w6;zi-8oIoUXK!wAQuF-wz6~M#K{&FHO_iZZFI1)x#D+A4eSk0 zc6YiLz7Lm{LfS=J!u+$WZwj_mBE##>Wwh}3H#iCmKKC?o=jB8Ws`qvH`W%bAiK0cK zsXXkGZPi>{Tn6Q(qNJoQ&dS1d8|W2KDXp!YD%gr2=A`?6JRw#bGs3!;ucs$hVt5!7 z-zDk_)U$j{tV)IDa!ZcO;!H25Q|sEji~Hl#Q*mTvRu&KljJ$EQZ0!D)>Qihf;9{DY zR?@1@=3sA|dA%ML6$6o${-N{R*Ee|m0#yI|Q?F;n$AYOaY+C+rrpZ(l*ro>lD_~1j z9!`<$Cj^zH2EPxt-6JEGgg3p%UO;XoQ%>-%tlj;3W7y@ck@qyZ`wmFz$eEOj3c@GI0^gbKsKPc#Uo_)L}MRm?hMXEBki|G#rfD!>!AHw{Yto^)3E{+UFJIr z91hk=fruMZf(0RbRw$q+#Q~DX9KDEBwR2Rfa`;Pm%0%J1icQQ5EkM70u_1^y3iZy2 z7D?;8ASri0PXi1}v?(fonz1gVi`)U*LZpKi%h_7)u`QHI-Don2=q_=~F|m7sDMGQH z!B+B;mgj{ax7tY*!gB%tEkw5=kaUzb7FFf1jHncB;yIr{KDZg?Kg3%){*1ErLQYjB zU=fpr@#(W8@#dHUQ3DhGQ34v#9up>iMv6CIcAH|y{`e+(Gs7@Lnrf*1{@gvnjB#j+ zD(P_~BQS#el*+Vucw(+9lFbw&PZZ1zk_3fXw^5!B0Lvh2BRvffwX-%lWipXqN~I6h zPSSWrbO`ShZm3TE0!zK4Q)humuG7Jl9SK6Hg($IVJG$&gS*d9cC3C>3DsBGOK2aJG zOz1Qr2&wE8gdAjAe88z>O)jBJs7Q=0%U-1N+6?*3zSq+G%YtS$PjHNstnV3`tRly% zz(u&UV?JUA{2aI+A}8By%oQ*ekQG_Ys(`u#U^9;pXH0?2VyZ;6Go{M|9K$F7qJ^kb zZn0dmjCv=DHT*GoNY{e^lv4HEmN+gjjM8snjYhJl`@affpAU6AbFGO9XCOx=5}7U* zJC8yxI2^tKxGW_x7cZ2G52M7xs=iH8Z?gxNW0AEqS$6^Ahqm2+`~g4AE~%bHpQde) z^8!N1^)%Qu1|*}cQ5uyKXT`ApBD{OgqvjL%dB$(1H*HkVR>Q@>R31x_oj!*vC7tswR759a;>(Wl1%mX zINK_lwr3g9(cjeVh3$zo+*mn zmy9#IX*>1RG$)7r1jkZg20a_F))ldLvpC?I+K28Y$W3_k1Ff zTrWqbY_6FI!o0wj?}WixU+tp`^Fa9o;Jel;2U!}u-8n4{n3}+9Quv<^{Qr`Ez8Z9x zI4~|Jp4i6NiLR%^!)pIFm!QNci<4~&4tzAwjFZ~2js%_%qm(`bzKpU{Kp@pB!5MXq znExie#zgv;Ryzf$EL!Ti$zDDfv%-H(d@5o_l(Ut^+T?7K=>f2fuOy44l6CsTW_Un} zxy)p;MDYi|H_!jV=>O$d)o>G%H$dW@T2t|BD9bFyddc_FUgw9qRZ`c#T)4A58Dh^^ zU7YKxDpr7ScNb%*Tk_Khrg@^5grsJbLgbOOU{VpOSeH}+j!n3) z7if>}3#BNigl`#yi{M=A2+c>6)r1P|l;MFu-2&0(#8_YJ7A6_H|9{lCW(9w%rm0k| zK#y$x^gGv>uH~OFCms(1hj3#4;#siRBQyXHkPM8kAZ1qs#`iatDY#kC<^<+(CGHY{ zqUwi_ooG<~FyjuA)O%*FVG(ZmYnuROh|AZnAQQ^_O&cfgJO{}~)4OZuEThyVjGl?o z6?g>+Q%5)+{%e$T^-?*tGEz_nD~T_jfmic#(YLKoUw4W}^5@Ar;Cxsf(}+x@k#>v# z;3s_6{xSU*Gk^kb_b4$=wL7jbYZ;zN^x^jSGBF228Djj{^w*CMfM!^aUOay8dT1FC zMj4w(#t!E>R~-)_)gIV{QJ)@Y7IhN)Yy@LgraBwROr}Q?yZZJO2Sp8CGd?0rBhWX5 zgMz;a3dyz|Omm?AsapMobnuJ)QcBuMc{ajDn{M|EanW9`4|jbHc0w_!RyEQ|b{^>oYgsW(5O_ee+Fvk}j+B8cK{ zY}k@~1$(tee~|T1Xe(|@U9VIh3?^euneR`Mw`fd3$0Hb<(X6c`_({~gsyt`xz(D~X z{Ok1gW;bt`>5ozODhwWq0ShW03e_OX3UJ~eniKXH0dg+&n$`Z@eZnEN5_p-UGDZqYpgy0@f1TOSHa+&YW-&)R5w#?r=`1W5;0^^E?hIMh z=vV$)*-R+U(c$a)$=M!Dc#BAup9iDrp4+EwT&49QPArAgFApg(VDgq^WLtX$_A7wZ zwR`M0qfIKie~^0J1N20Va)aQ6H#v9D*9Bemyb9!|o+@ITbyFuvrx@{a1rb@%dx8fG zODYTk%2ZXygGanX2 zj+U4Up29$*!G70lik#w;SnPBJ>-pPyypniqdjDn~W-e&I$e}r#BXP(!>6==d52tKN zD+?3p06127(^y=n#T}fh7#Z$-C?PrxR~1VgNcMpLRr_bbNOwk77V5hcvZ(qJ>ng5v zV=|-pA?c*8$;DNa)JYw(B7xy0x*Xe%DKzN9tz`2r}LO(b;_UVSX z#G|_GPucqGmPcDzrs?INCw?ps3pF}R0Ww1@dF1%W4t9p!My4vqQAsgmM$)wa_eF>r z|9N2;&#@LlUpb~(?nK6dJloep23K*9Trnws?x_@W|jK_?h;dI6@buRjK)UoD&V4>xs6*m*s%YsinKWoK)iO9ZAh$u#f zRj7kLv4XzTe9`wk7(Z4!yyPBlg$$X4veI;dBups;hHEb2B}sIHh=C^DNV?wh=of(i zFrQ4d0pw>?CYmYr8G&x&kivzYhsOQJ+Iv<$sj3(tb$RyI=0Z@F3{LQId46s-(jtEg z3Q-d0AnG0hQ5T~tr7flOluKc$;m9uG$X_uHOtBe7_Krtoh$>K%QY}8&D3+}=QpcFO z1iW?jFqm~Q8NcNdy5gQ8f>vfjP{OObnVRTLhO){=sp%9M&}>@oU8X<(5xn%5h-}0K zB2hIDPNexb#L|Ct;kJOO6;6Ob?e_bhAQzTw^oqFGWfW4~Q~FmP(^bCABl}8Jlx_ZCY5 z&8!b)vBTOZX2GhQlL_qQnEt8`et@@9L2a7chJM-=Z`6%%we@|fKh2hPXhNu{Cy2&55$|K6{{=KM-6q_+TmvB6{zyAw z_*lVIfBi`v!nC(ITjE5nfX`2`htMg)=mL;(Pl+juQo+q5rRd0^hR2W(!O!7U^ZX0T z?LdM%=H#s#=8QWp3q`u%Slk^su{BIC=$X|8QyXLTB6ujENSOQ zKinD7!P{f7D#JbiF8S+(b0>s(Xhi3i$h7RcDk+f+wO~R>$EAX>W}6(JJ#X7nRRMTJ}|H3Gkx{J70!mb`IWB9h^KU}iFDHyXnyL;6nAaIlI~*`y}F=iO9H&74D2IqAZa*nK+DMl36%Bp(2O zRXv(9!h?3zViLJTp#7LkDwvi7HlnmlAi<8)<#)M|Baf_&LRx#MuC{#>0CR8 zlazH3426$bbOyM3%6UkiK%h3;cHX>Zf~tKIGmi!zIY!cyq4ELAt8680Ns2gaH%T24 z%VGpPmFg&KD(L35a^bfIW%?-T4HNs3RK-CNEE~9OJup*QECE%O zs`@nA*%4g_B3n|vJ5@nhNIgnb^as1LG7uH|cRZ#vEl#3Zq-B2AuBf;2v{|6eDy308 zE-_J3r0C)r(_|Fx5FZ9BWIj37&r@ur6gRc#g3%KBh8BrLNvh=I(77pth;sB|$tp$Z zm>NB5NXBNFUBl-2@n1T#Mj_t7kW%smr`dwwfexnfX=OC!ko_#rw4B!@NlP)kh0f-+ z6~^@yXACXcICLZl!MQt0lw!kjCC6JU5(I%}nFCZ}dm1QCX$r1wS@aBoJW&$K0@LMo zfL_0*8;*2F06MN*u^YfxbxOb~2bR9sXKXR@s15uKht3&Tz9+&`>S&;ZHo^wi(? zTs3nhsY2nDh*_5NIWy{JE(-HlGOI!|2DVJIF^%Zq{wxB{M`C{k^il*b(3aQr@T z?|ZD98dMX@QID@NHcIT14pC*nCE^*>Qd&A? z5AH^IMEfipy(TnmR%c*VpP-YM!pe__}z=S_wf<61Zrb59{pQ& z0Ve8P$HEqknRHlLd~)Y*(}Te%ruUCH1gYljEorcgB}`r6XgxyRHL7K8>Y7z0geX#EG$-TlRKv19muh`e27axG4A5fZmovdV8wd1Rwd|=gote{6ok=5 z@nnpcJbC5Idp`8!P0LhX*Rb|B0cO{g?P~Fr@~enh?V`4{;WDqpaoz4gV!0?okDq_)7a7Z7sI^Y*SPqeq&t;*)| z1ZR>I!m1_`i^@pwdlOODqlA@dp;?L~)yhAy#mI`^RCZ`&R&z`TvteQ~fLSLTWP9N& z{PtBkR*ad!wfzI$DENhD61y5l?ky0P@lY$VNc=^D4VKkGiAy4$iCS$A=?9t)+n!Tp#lqimkuGd2iy)0yd6se2{y&g8p9)WU$K(xqc+*mz`#vf*>JMRN_S1pyR% z&ZL-;3Hi3F!py$$<*k8)o$|_Ph%S_^l&aD^{a>tbA23G}MKaz}fSO85rX{?)w*)17 zmOpq$xaV$R#I<0DjUXyr)Tz6vmyyC?ET7^&&ZF1q}zdpDX znWur%Cu_OBzO+66GvQMU?%n{}%0>1L$V#!c)AvsxOh={<&99E^jf@RV`YOy%gy!sQ zNz?CW|AsT&-!74U09(_t9MY6bo&+pa^|(k1U{*Vpce05^HjKlsXs2hzunr zfiv4vF7&&W{L7Yi1*G-3CY~Oqe_Nb-S{mhsgChi3+X)6spO;O)C+ai?7^$y{_RYV8 zPXu6TAW^Wwn&)!T^hz(x-St)*|C%NcZaKDD^rapq4JT^&*;Q%jww{|8h`1EtHA#ZS zXwE4%ysFo0ncf#TPI(5BO@79?7H~_5Rn@quaUW*$UW+!&?w0H5|Jg6iK>jhG8h4g# zt2HES>G}tEIY`SS`Cm_MtXJ}+ddo`pwRJ_}NqdXWCdZnVuGC~v@P9uCeI*LaY3v+Wa}Z?_9{#4?J~>`j+FXVXf~KFIYGjRT2l?s{ zAXfDWeoi48@=DCV6!vJ8A;rONOk;3&VAIP#b&cacRH1&N911LO8yq>KyPPE9RdDPi zf)~t{^dTTQ4`kE~E;qzw8P-|fx$;lHk2D>>%93V9$aCW@J$D*Fq`B=&U&Q%J)#Jxw)q4k?mQOh=N9`RdIoL=3e{imJ(Hi(Qgf-5_FMAHs;P$Y zs%g|$mSe3prp%>*Fr=0+r#Gk2d&SS{$z)=3R41Xb@=RR5j(x<3Lc7iHp1ab0qQqPZWIbEep-51Qaua& z#E=WC-1*(zzv{vm8(q}4%#gqFK^0t6WPCBg>G+G_=Hw_xAr$t$=iK&BKxty!Yl(lk zF4OEMQ%fc-u+=hZk?(4^;&J3;RXTmslqOdM4}t^B4D}e!9GLzAd8gTYVa?^=_>p)l z*;#f0bxk2T%X_sub1i)JIbw#nU+X&62@wYVQ71-)G#fRp@edbg?d;00$960h-+{UH zVcAQ(z)QX&>51Gra#pzS1g)$D0O z_W|SFn~enb4p0=&X284-7k{Hms}2I}oEQ) zT~I;AJ|);}0NeysVXH&6^<>Bo#;8*Tl@u9G=e(dnyA1_{jt^-(BfH0)Z>>A6s-1Wg z+227`bq?xJHiwIBCu0+YJ#}GbFK)@w~D7-#N^st$O=0(a8=M8l^zsSrjf@M+^L9E6vR+*6Id;9t6K`LXzxCCO6- zrMg3ns%=l?#w;U*%1w9JprYxxH+QVMgEqsHGjwAuzEcn68M{yhYwO49mJ~mc;5(*;RT~ZTGL^!_50y8fD*m(i+CyjRxb0r{2)tZ1$E^VOFO{UfNTxXV1lmV@ z&oQI}((aUt%%N8B_n4gTz=cmLM9laa>%cK3sa%NqEZ$grSCa~Bvv(x?)rk=3kiguZ zyp34oO1AY*g6`%1*=;6zw7A64E~K{gDVTV%n-MzZkTM```}3k0@?S70k`UyKn>f;04ateo%)LQ>ff9K^8o0RDw%Hu8mT0%*`DDj}f6d7vo4MaQlY`l$|ci)J4bF zh#Ii*8#ETPWwQEBpp8ukYCY4}X%9{Ch4IoFJ62ldrr>C-g2%MiY-z1vkS|Nmd27;5 zpv?Kfe-CU}*0(o&k$_1^3#~za(}|IB?h35}X)rNC{Chn{!JR$jKHn>Se+;+i#Jwq~ z4J?>$h}6c5O7$gr#BFGfnOJ6rVkl7d_q9_LnanUU&1&+q*gKwts$-AA9HqhXE$1u6ES%F6h-&OCO)6CWl4 zPsnTvK1$`NpiVMrQisZglkE$dH<6$fc6M@~5;Mv44{4wX=va^w4K0g~t$Fq@{K!$C zTT$=|`Sh4Da1q~q^$rh6HU^Z)40?5gt;BNoBBwFw!f>XfS($jF& zL|JWn77Yfilk$pSnm)A5BH-MdC~F1`w6qRZI_vbvD-5`JXSdgCW$(<)b?ve&5=X%= z&J~W?4uQ)%@vgncDBSyLmgcd;N-fXUAw61gv)s)s{|sH}!wK*c!qsLHPL}gZtUC+F zuX7IFSxX>hD-J?fUhEl2br=+04?*kg?d#$ZjxD`AI-;#N7n(xM#g^ET%0K9avN?9t zK0(86$%7;{fb-FltiRI_`uAb_poax#!1i&bZ05_lEc~1z$VFE2RV|8!zJ}$l_EY z^EmS)DMMvh=T_zUv3hrV)HnlX%2Ftmr6H$&E&L;%nKAwR-xEW3XcFzu;*AIclyUs` zC7C~*nGqEd%uazcBkr3b5VCBwo>){Wu%WN+`Do<4C}|4G=|Jv_y3pb=52V#{ z968Sz+h2oKOu#!^tM3$IaWoy!*>C-$VoE5EG)-@>7xLcrP>7%yK=96_p)6wSob^1O zLBzpSUU+B7!D$CipkE-;N8$3{MM0|)kT5l0&^8OwV}?Guw_%g3rj(hHWk}&^A#>Z8 zoTZKFbLR}`YGWwx-T^jMc!w?a>nmFg9I3L@ZTuD1TzLmjl16Tew>-=$(4WLhH12#K zoW(Vg3{~Dt6u1Gb`PG@P-UbjBD`y(cZmgqWDCJI*63Iq&-9~aQUC}?%3{GMhQsH|W zfYdxBzK%~aUNW$yb=!#=!4mqQ8lz*^CovVa`n0^DwnaG;6q6M&;y{AE&P$BzKoG*T z$0X+bZ5iS^%`02823ZSvH)bAEu=G*c{H(#N*rb8eV!Dd#&f9()sPAK!txsd}eG?MB zNQMW|$U5I5npwOoG}@9>prB@!5n&UN;!g^5LX0YE@G15V++V%L+ab@YGe~BR2{Nwy z&76`ah~nb}gL%b0u)F!yy0bfDxz+5}`(gprl$ts7lYdE32sPM=Tu80QV5efOg)(Xp z+10fX)sf|~#xxV?e~eky_4Z4cTa%JE8adwgN}zsm%|h~1EI`eoosM+KZ7_x4)DWSW z3lUvs%AZ_dd|!}{fRm-Pqr&mg9SIc65wu=eD3h!$Sp!C?{FB11#ppLH+N^>nl?3W) z{HAsb2cUV@+r&gbVJebL4(G>x`kH^ei zM(IJugID?Ifkw%A=&3B41f{nx_=Ir`LZ<#;Tn6t>wty3l3}VN_@sfK=s!awZd!i+q3Xe+6ebXc_8Vbpc zkV6Z4UN0c+lD?Zs?-@_KedqMm@_dEz@f^a+IRlMoC(BX7YdG*^$ZnDCIPP3fn_4al zv_)r;dGXw}r-!ijH|w?vn`rrrM)9;-)nN5T4CL24FSma z6~9;{qRR)E?jZ25BG8nOYCnhQA<>K0!%H z&|f+oO3ZncqD4i8ai`9hu;pcgRP#%)HZqJ-1X^hl5-uMKj;gec@ht z?}$aG_abDo<+jlpN_O)4aM*a*XhsBsbS@dRy12_9F(`X> zO>DU&+B2mvgwG4Pg&y1L*$*k9*2Gc*7P-5UA-zPKyi>cFN zC~Ap=<)mjPUeW8TPM~q>F6)U6ZcSx4)d&lMBg9ljF_QFLb7%Qr4?6r8??CkD>%sTb81RUBq)&HCGR4E#G<{7PVR6&K(cezu5oLq3<~hDthnvZT_ypVM8e>}na9B4Ru0Zx@)rCW;9x7%{1;3AJRID61|#eou7l&6?0KV>BXXf z+H**fWMj67wvW;b~n%ibT)_(T%FQYhe;*xylZKwX#1id29` zYQ$aaCkf(%p#<}$Lz1D$uu~OdO!L3gvK#02A;!!L$&*Y^QRSTlS+K;hjQX4x)ZiJpJL^kPP@NrlcwQ}-0u;6-Eor(BipL1q-QtP_7NC;W*>d`5S z{jzE%gjxS+r;bL;yNjRo(j~%hzHrh0bN)FoC{nodFViFIPn7CPKi%}7STT^RPpaOO zz4a?6_WW@#Nv(C)&mIl1-08iXf`}tY8=Ocv`J+7V$W47r!i_-QD9FA8H4EPugS37a zpfb20y{EqD&)ycJHd>esM)7sin#6q%D-F)H4fO_INBidSO^Dz-i zhXHZ6U_y=Y%kO*VRJDa#zAeKR?@r_nyrcHYGp#A?)w?X?Cf=wmEUn8rmLFevzLPqj)!I1Q2Shp^$NM1+XL_JG2&5vZM6SI)wu9c2>dHAIws}iBB;_Ao zJkk{P?1?2wFz2i#*Zqjuhr3_V!JPp}k6}#?JI0IC?#DRvIJCy>+WLaT1aAllq6p*} zbS#nA$A0PzLuU1EfLX1IW~~HT|ElMl7u8;`S{}3oTekr46Iy*LA7swL)1Ii0Sv@!D>Jm z#{Pn+Z@;lfIT*sx&^J{|hKg*=G)7-o!5j@|j)YOfwA;oSJ;W}qT2o#N(v&X85nU8v z77+iYt|Yfd>CUx9+`{SJaxR%Ap_tQ)>%gX&Z%C9#I%5dl&;Usq6QvIr z9X)9klLHS#@Wvafxz}|87?_<^oScP`1xd1HR0+c)UX00bYlgJ6l%yEc_!VEmxx%2p zGY0w1Mub{PC3RB(PT3F?U`4qS4Xgv63orw)A4?0B)QbD)b{UvJzt2I3FAlhB)CA z$TNg+D`OCrIl0c!ut(^VHPk+;%7Ai1;DeiwxSSJRwdBV;TaSyJe|^oL#ei3N%J}N7 zFdo{_z=%(1`iBls&cx9HWBvaDwm?b0$@qI-W;;>If@@T7DH-q=pXy_#3PhHQdbChk z8CmeRIbE)jD%v0dSsiYJ(Zu4fyR5?DD$$LNiwX+$!99N>hI}x=)L;`G4b@77gCE){ zLdr9d(yqD&ds)?Z$36++AC<&xtz5RoSzE8?WCNj((nzIpf}U&wB54Nmt=?k6Fln;c zMFbKWO=Sz0uwQ5Vz#gKgSj>W4bt})el$EQAu@h9>bNErTXNZ@XnRL%in0>@2bzdDm03Pdr?nTA#kfShL2h_ z=-vM${SJF3wC2M4C!0A&Hvg2BM0Pt8$SNk55^1}FI|!h8OK&tSGxv&qG9K;Ox3zok ztLjyzq_V!es%~Or@U@MP9PZpzY_w|okR|Pm z3CidoC$`XY$np!zZP`IW207NDCiXsr6|ii{`-mW{Fk;AI8LZud9_SxcMJdQp<&QY2 z$x3cQ& zzp~e#6%RZ?M1%rs%5X&-wzIHE85zU#52RIn!Qa?xSFudVay$-RWNoWjqO`zx90!}K z6E5&6h^cc%ObTR($`!iO)GN_tRYwB(lTuB`gA8C}+wPPBUp!L z(Z-(KVvD<2gO9}q78r@k@XUfBh9f))Fquv~$xQO=j&AC7@%-sydlH1V^;aGze$SBDQZ^a4A#g`^Z^8naE@}>$0|LCOLA{ z4hy&#)pRkpIza|ZjM3Syv$!z$u^9_b5*%&C6kTkj3B-~EMo*m#?SiVYnp?2I%TWL# zm6U?wiBIiD%82SdIXW;gd{~uNnk^IyS6pB+n#acm_P(-yeCUY5UTp#dN@)@wN-8;r zW9xLd3g8gQnt*%$M11*@ae%Ee;Sc zTO!oDJR>#7Cut=@u^EA?_@YptI;$J0<#Zt(9&CE1K)k}f3pLu5pgprw9BFuQNL^{}Mq2Q4KIxaHyGvC_PIw7Cg9flPXUF z(&aVHZcmwa0^8r_{v*A`78lG&doNt+P779)T#_u*`&ng9Mq}>g7SeN3R-h_5RYz=4 zv`BbP+pFsX<0H|@F|;JkI0-f$Q8^7#A^4Z15=EIDrDCx}I24bC0q@CpTyM43tUSwi zxTk;HW>4c>yeaq-SS|-HiGLKGG2~LQcruCic9=H8>NyMCsdzjQi(sp(J7L4rPe&nT%@kr3!*lhB!8&dYRvtfvSH=Rrs>CIBm(1N#62nQ>rK~*ZE zHYpkTkZx4Ir2R>IkuM36ep$uP_+O=QRguU->v{*STK-MSAo2Af1LUNUQEX$EG~1j znD{j^h**kr6}GB20G?Dh=~BZu@KIq{vXMr`E*UOGHY-yhRT)UK!HGnC_m*dek919q z4(Uu{$RVO^i&Grs(#qP3`W0HMjGEZGT+EKqgntl(p)5yUHo;&iVVk)b-fShAcqEgI3U6jN zTO7oqL-!pI04dmGA%nE&-XsV^Z!*}*iDR^vW)c=|z?Ez_7MK_IqB1@Mv*k>3yt zdZ)HN|Hw#Rr_VcqWlO!5m|8@2M@)9sjAMXA!=Cw9;^pbx{|G})Dvrl$!rgL#wW2K@ z4}|)+bA}FPHufaN#ygX~0fW8NXe(piE^r@YRP%=2q zb`UWg;lNe13|BS`?I_PP{}RN+78N|aiA8z$yi2hZ2M=$Kdykl$)oLSG44WYb@noWY zs+QPFr7p?^arRrV|05Z)ivuX$pW@5G9{e!OaHLVis#~#HGY#X|AmurV?`(`!c=l;w zlcwx>YpYzWHg=4#NeC?Io_C(J@oX0QZIz4Ct>IwbHe%urKujP@Dm0Od24cP=p?&|03Yk6l2of5jv6L>p5unV$O#Y5%F>M-b9?#PE(@xot zPDu%Ssf45HY+K`5DAC`&ky!`3?45HjVOu(Xo`u(X^_ceV$Zf0Cr5_-L4UEqVzNjil~B}>yE6DY zmbEUP>O44pu$?Z@S<@toEw%Od7lww1V8l^b!>Y8=V!@pRPzY-0Kp)o8Y4~QF&E)iO zYL8H(lf!ApKRMO4KQb|fbD_8UAT_+CxrOx$`cF$qDdWIc`)M0Kl z_Qk_ttEbH3Dq%%?c;^;+K}%^l+_AYw$09Y@+-$XaIDw0Er79}gmW9Vgqu$r>_bHpd z5Rpn-76Cm6w{0dz*%IU`iB3*h9iH&`=)ktk)Ou%qlZ)-@PIq#AbY#y~nrzk5)n<=zo!-{qQ-7U4|%l+NK~uDnP@K2ef%J#kT3`QuYyDAJQE*b*yw7ol+6qDJTEIvxeMfBuUiEs@O3;L3yhbq_<$U5(YuK~BG^UnNvB(6 zrP6ocDQnGQVg~!S;Z;UQIl22m2GN{ug&aK*01FFEsDH~0ZG-QUN!lU)fPxkbHd}cc z){D^KYsz#XX?e?WGVTRevxk>WyA0S0>dm9u0yg)uWf|mQbkvw!_0jQz;`5hXrk8$~#bIJ_3gaFRO33R`t3}zy>YVTqa1M-5y01f$;0sP<}h)LQEt7b@VcC)Kj z0L|F`oa|X5G7V+XlT}d}?_(S<0=NWH2+~D$P{9N%yZ9}P>uiZY7P7{0#SOVD^Oe9L z!F-fI)-ScOL+1TdR;C@;@UUHBRzc^O5u!dZY8q`E3Imr(HuT7L4GZIz@;$|LZU*%z z@F&z%xSRtbP#@zNCmmAv_=k;Jz#scIWWzXXsZ0Qp)bpYgB}$mGBw^*mW7W(tgtDy6 z&?kK)Cfy_p*&L#YEk#g{^7=q~!Y!69ZH9nE(8r$vXJ3G3ik+v~1HhSrsc2?uJB5{u z1z?gIE)xSluqI|aL^cfbG#SiE%rwB1KoAUXV*g_&nM@e4uduu;C@p(sig0K)y4a*V z7WelHHLXwuP>LO&(xfgEXmnI_He@_7gzte?6BGrh=in72LgAu13}Bo_BnDUQOj#_K zWXf@aOk>b9Mk(eV>YUd!$LQGcjiAKEKnQyrN5CYCIVw6AgA`a_R?n$Rno);W5Kl!z z7_%uIDj}qpFNsN>C3dqNQ#4AY0#TrB>f&G>u~TZ}RB&-T)y2zy?(?lxlXD1xYV?k$( z!T(ZPmMS1Xp`H!(31$>ND!9SyWTzl`$v{$UV3tcmAa~hcm0;_=g<3=HDoP}DEE7}E z(i6t1eoD0IVVABEzfbCFbgEN)C$bGv%1g|U1~Z;RNN04FH(mYdnsaXuj|Hh4GNDkV zD%~n)I?_i{&;snFo5C_1XSWLM;nNE<(ukDxjxG%`2?umCXI0yt5MNn>Woi^pVM?S) z3Pw**G?*A=-GJk<_yqwfMw)pP4U==r!H=@!jfGG83!?!HN9|-+9LcF~xL4AY=^s*Y z@s9#uQcuF;WAUIjZxVx`$!^CIDU%?z*E<7~Ot3kSUNe76J;!uzlvNidhek6?|47Cp zxk&D%fnY<0RhE@FUrThse^vxI_rPFeYb0G-2EJt8BGntcVvZIz67gW~<#D@Qni#nii~bmsYoLTQ57wvez{6T*zDc&LXzAMC0hhS(=!i znis9MyDIj*`V5_x!(By-ibe49BSJ3U9Ap$4d044lQhSdkEKz0z9`%@yKO<5;^bEeC zsTkdL=F--npvi)9NRyWaNX1c7QB@e^Wnd5&Z8d3@p@sT^PoY_D_5&+Gfj*Qt(-$L> zwQ>mqJZ6CD(4+2X=yG7*B6?YTo=B2=ulfL0Y|~X)#&4O#%Q!6^1bqQREUVbEF9+Ua zQIsDDp%)M-glpDQG_E9$6rTJd7UL;(T@~ewa${nvp-Jp#s#nhOlKZA9&?PeZnw)jf z@dGU879uK96kN;s;qaD_1H;7!hfo$YfjAns2rON`bXANEupxskPEkaJRrx2Ee4=dv zMS4*?)TF}_7Wfl)L81s4k_UCE$l9ZbD$B1DnJufbu%!{Ce`IK5#8rM{S~~T~${ic1 z1qXvBPjtbD*nsD;*)lc?nml@)K{%9s3}h?i$T&lHpCu;h)()>0Yzp*{K`R?VG}RXi z^MuLSmWmGd*%~Fns!>FvrbQ#Rh$gadQRuQUTm~4a5->qV*_x0KSIVLmX+Lx!REel` zMIan2_e~*2zEI;)XbUy40!FfivrJ_z5?@$l?LN-w)1kiCFoJ4HH1;Gr7?Z+M^o0$n zr9w@1udACJSuGm5NL_+`d7IUSa7*QpN`Q>ojqsuvkYQX6bYvm)g+lg{d=;9kXI_-> z;k=t8n2VA9X3plQHM(jNfnjDW!f&1i1)!E6MVVworbq!J|Chb@46-B3^84!f_sScT z0jf|1*FXbpr_J{E_?acSORmvsEk$W*L{a)ckwHt(7%7XUHu0h)o2wv+RGBnsWkMuhxC?Ef zMr=JsZe$}#Y@Llhbe9A|@tH|V8AlQ2ak`OGC7kV9IBZfp5v`9R(8Ny>+=ZRb;qG0X zIgj<}B}pefzpeWMN4^G>@0k3lzrE|nf0pru8VkwvJY|biw%k#!a0$>dg`fcsERa#! zqmYA^t3raeiHcM*8nQ+}5tIiith^S~a=KT3a<*ciUmm%lLSiWv8dGZ;Sy(bq@+HM| zkSOYa(%gl!3k)l=`pjfj@Gti7dpz6O?Q+VpNyW^6@8FUe3XiJfrqn=YRlgi6 z3sA;NHNkl7tKp=<8E7k2$yQgzN($k0$Gk+=p*rD^j1AmhxAo#ZE&qqo)^R!p9;~{buhrlKsG;(ibMGMxa*mwsmpVr))$jHio~zS+_^6k&_suMa4qz zJD;$+3z@A!ghp3f@Y-MaiFd7b!7gD?{iQ$uuuCdpme+v}9@gaO3f-`A2_fZms1ZUB zg?9=|xsWJRna$!HH|#+y?t<6XE-W68NfI1Y0I4=qL_SF`yb}n8zi?(LM?>=bAii98 z20T;O0YKU<`B5HaL`blWln>o28ekC!cA>EZ0VOQSh+%@U;T2nVxK8<;c({mAy$)ihBu=TN>6zod@0WQC1#-CDun+L1g$_j*(e>Aw-s6ThdgKhg*g06$@652*-C=<4Ef#_ZYG}}W}oUv z&NQ^^5S!T=K^TvdctUgqjEaH{|F>h-W`q6_y2dFudn}p-(x0sk(Kgz$NPG7JBF7gi z^@Hms@;y>0MxO~`A(b2z#Ojibw4O&~KgRIW@U@c``Q_yzVU{BT!hvDGzOV>;_{QZS z?Z370+yw`<0(CXF0a3=E9adY298erxzmnwDM4^D*r6O@peIBIO`AvQhO2YKNt^@DF z!2ZL72ahPC;L!L-{`rymlAYMFv>=44JO6>Z_V0X_P%0n^oRAuh$)$Z=KwpB+E+aU3 zT>gtiPKDXF<+YWEO=uQQNh273@PMZkgU1Np1{}V``#VS9`TLU*hx%j?urd@Bq)$c% z7i%*mRJm_>Y=&n;A@^ojU$Zo$+*^j8K8UJ*SpWQB(l*xhv%n!6QTsSIJ=$7lHjVK! zNhA;AEFkBx`(?CwCX`qBpt#ccNEJqPm3VgJb}Z8R9ygdV#m#h|>RqTg3zJTNFB&<|Uo zvz-fdT_!c`^27` z!hCA6uAx6dWs7yGvbG{4{wPkw)e0ZcHAbFUCYrO!EBlEZrhwBH9a`L`;HM%+d|dY?W}IuHon<)@e%Aw&%P2AUJ$V!qUKLazOoUYUxELQ#Blo zsal%gjP2s*@}~reM=}|Fvs#@T)SUH9(PS}wfitx(WmA%2)G$M;S-riCy5(VfY#jp5 zUgB3nK=ljY6^+r?J;uA4`(mo+(bh%&&?IeGXoA#j$QjmIc4rVW{9voD+t&iQ9A)yA zvRIWQC%Z7!Ly2+)MCHH{`E?k1JbrJc!fh4|Po_onX#6Cpv(lZzg|QbRbGo-od0bg+ zwY-bP>h$8>14q8>Qn_@`I19#5`nD|ok1L3Zn3YX(y*3)DrBQ1m*;#~mI6wBZttaxy zDg1F0cu#(ogGuN6OY@gPCP*ZJrBhxIR+Gzi?O*@j zmrP|WXnr8c^737yUM(19iSIrE1XviNZ>q$;pvpV_mk#os;aU@~I0 zgRNGz)LPvud5^mG6G+RWA7zjO0vV`Tz=UleYV56mrC_T-kTaU$^ynUS<-^8LC_Qxs zmB!}Q4m|G93nxC06S_4ZA&FaZ**(v2-)rvx{}$ADxtaMm1%HZB}D7S61^J zrSfO}(aOqnIzO209QusHv>lV3sIJYh#Jvm`Wu41Deytu=-ztts7N}aCIr&4js9}>s zY)P#UY0NDv+wGXr?XHvTAsIyskd$YV#YdNKUC`omni8%BkIXq~D>2YGZ0BQh>V+F> zCD}V%3FHRK$LZ;|u1UWD`@**F+&*j4*D*lAC$u;lE-jvY>dEACY58vP{CC@z(}tly zZm}GX_gve3v7y=YnKo;(sVr3|5^D^FU#UrUmA+wsR8B;w3tbWtb=+-V|wy;~BTfY8&sM(0&+a?HLrN}xAecO?t z)H=L|Jff#HSu3vI`QY1kkAK&esmikKI<7Mrlr5^SZIZA@ObusE(!*UVcF@6%S5hV< z%Ly}R)q1*JXQ*Y)BbK!LS9iOlwtd#5)t+Q6XC+ppz+D(%LH-_xm z9+}l9BtAW2&GOi|ptkNh`1C;WD5hjx_G#3lmiN^M0xgpa&a`f2(3BX=r=?8win@2% zUe-r3-P=lMSp)oI+B_D#%t!X*sg{`MU9vGzWQe!U`L@#fV=7Z`%fiM_NJyQ*+Q;y1 zzy;C$c@*84=ho%A{%NIE;=F0GAM_n6K{e_phQJvI-Y>j_&jlS;)V)*EQa=3lOIcs24+_l zHk0P4`$6|Hrsww@nr zn_4tb4_V7kPjsFgH=iO*Y$Konnjo7!S0ZLQLh z*4zYaj3?|q3t5&y8cF_VqNm%^$xFpqISzQOe3K5rpf>=d6d))TVb~M)-RA!zQ3OCh|X6|AZ@Mckm&E`Qw!2RBs zeamR=)~n6kujCEGv2=pP3v>@T$@KZ?-@`okd~xHJ9&)^-(V~9X>8;1h)x(FHDBE2{ ztt&l>P_NS`0QD!C$HX123fBSC27*->yipGu>rX0PAoOaGmQ6?-P&ScDGQ%%Ffq0eT zhaD|%FbV!-8^m_yWDB_@S@VQEsPEuzo zP#LEZ{L5Cf`<9pBHpJ6JBz9yfo2?ehHuJCvLz_svGpTe|+t#u$*vHPL`&7!R#bi3o zj^v4IrR)maeaiYc!7N@fI1ShjJBwNEE|E+o(>3-7euz+;EysQz8CHEGk3SAt55x=9 zNxe$E#8l4AqJ3Cz6Y&6aDvkL}dWrmD6>1@^^lG!kE1{a5K>Ax)ODlMG3& zYLAnLm&0m;c$Ly=7M-cq$l`|vwBCqRIzy4JC|>q-d02(3){$b3%v3^~jE5WA2YN?0 z4oqCCwX)e-sjP{*53OiPwM06bXXSG?WOPGZH&%BmI7o6Plfj&7ir$t2_6fMkwjyipQwA2~*!cd@-H+QM4)-bKK7!$)?HwGMJot?E!gz=W zr6!l}oI3cqLT7J%0fqJ}Kmku@a=Z2(=^Gw*A7t&1(~BXK%?<6^H$1-Y;nm0%Gwo2% z!0^sJkE6f_b;Z_Up^Bu|QRwd5wdY7@&%ncux3hb6e1Fft=+-4@V@bR}`L3RkU3+^5 zM=r;BP&zf|QS(~m)%qZ8sa}!0=5oBfskAe%Ku8p_)yD%}C)<_d*MhgvLv;Qgm@cG~X_CCI&&ZeG7_%Bm z6}gW?7Y>d5M3_uxbJ`a;dRV&F^DADH(?u=HjURXY9ePny+(w@?Bb;Y2_3>mScgb<=@Pu2F8-!CG}BYH zB{1ijrPs^j#&}W1b5uuFqK0Vdz!tysX-EP&o6Tk^(oM41Szl9tkO{cQdUJWr2scNTn2XxgQ>keaYN^dTQ%+2KTyj1HY zHE;M7LF#8;Og5d)`SI2*78N07ah>9>jmTgC z**`LY>PNr{$vtkUgN^P9^nyu%CnO@vd%P8=#u|AmWJYB)%jPJDyK`s;*Ib0ttP;Sx zU#6!xiYu-lidm&pZlve(Dt(Ro#1j04wNN`jYf&l|BlQTT35`}VQ7O?w9X@bWWOxHB z+r1s~F^f=!sM=S1a>oMWM!&$z(*=HmT90 zS-gzU;f+G2hOD9EkneIr2+|q|s*wLt}^PXma zP^A*d8tCfI6CF8qphS1wZIz;WHGL?2da5dVy^y-NEt`FHe68q*PG-{85yR9Ouqjc+rQ`Us&#G+QQu6Yo>^(E00T_!|bj&;~3vp_-2^(ZWvhMv4SXl9ON%0%9UXMRW!yK&EJgA{GwW zCUnI_yhw~5mR`Ck5f9G6V_q5h)HD)+Bm`6#KpG=W;8oPE8N}?-c|g|G>55UoMG77A z9ZC=dqrymo;HlBmjt-v6dJj`h3F!17)4dp?L)IrjGHLn%Q9TbVZhoRsYZH6yo>aAF zMX0V+&3dRa070rlWaCfLgB+#1ZdU1E*5_F$T8pnqyu3=h$c=q=bem?-C#hb?DbY^7R?eiov#hjm?fqfxSeu2Fv#Ibg_J&v@vw$BJSqm2E;Nw^Yk% z96zj+8<#0H~WwJiGchLJU4I--;#?ynvxluQ;|B2mVMi5xD=I@Z}95)@%18=5Tr51yY|Ve ztl}Cvf|@l#g&~m`8k?Hf_mq`@dH`z1!O@A``<|kZg-amx{^4C?Q->(}VLEbp2ZzV^ zKSi@(de%kxR}C>II(rB9JpMejYWU^Ecyy0WJAEzHb(r%eR;&Xq2c!u-y#*R%K9NIahrq@59XVSTm@qHs?aU{L6&PR6b z8{2(Q?Tw$CT&YKU=U(LKy$_{KG1_g2#&heY9GM#3{aD>FRJa=L+~CjzS&79I$Pqo6 z>EE$y=hQ()y9QZf^i<#A*x1xT4ZiX9v2=J5HpEN&*V{ilF?A%9&j-dNa+Ty2pf-A<&^54g@*q7#0l$x*pJx9aelByJJ-en3^$d;%{Gum1 zC_LcVKQs}Q-;vLEjf@`{9Gj#f^d;%lprey`J9`ELeB4t~Po9JiUw+TX!~qI+z%Ttf z5AA+W8^}WrUs*$Ad(ah|jN2fAc2&Ri={156 zjZRX5WH2~&z)-MzoFtFQi$t3;x^e+RD;zy|uD7yJ~h(eVRay@QAdKkD1DleaRL?~2e} zlUnBs)Tj*%?;hE?PenR>)N0^1JaK@GpqK^WC{6=ACdkTMzPo|mJG67>o^l+Ev)I@C8Xs?Q-`Px1)I9#usD&@L_lI{bW2jZHm9s%g1G zbh02hHhF*|hb?I6)+6Uid0r&r?T*-vEsMT%mjN;IsMee$2!`4Emr6^sc@E z%Qf!_MjlrCoqEA`<@;eooYxf5&CgE=|(`CYIS6M|IVo+2Alf~)+3Igk=?wlR1C^+Dctn1{Bgn} z&pr78O#(b2-YIyrRTq)6xK%<;jsw%OQkP)mvXz@C&fZ;^7{0c`nMmR#=F^ZbgjzL} z*@-G1ykv5fEQz>ZiO3xk3)*dp)Lp2}7Z1YkV8>b<2?dkgAqG(o6JV zeid@~<<`aVz~FH|UdZ}#wdaPNdtfkVaFTfo>hi^xRuwFVO*CCNQcwt+Qeud}hZ^x@ zfpSq%@yLr@*NPf?q~9MlIUALg0@T-3&?eLB&l5~oQGuLPm02~=1zo7HkOUH|J}I&o zx2|6rE8Hv9N(zny<)9smF_-U6rPuNM^n~U!A_u@#rhSdjO+`Z8sVPgcpDuKOBwtsO zxI+BqR|9J$7<~eMWxgC0f+AGd)yAldf<{3v#mi$3xFin!<8p?v*h03>0}Tl}rxI1j2uwEIGGmh)zA7$|zEp#IFF-hlxI^w5Ue+veNF543oGi zmVN~2O%{WZbU>QXEwtVZL?JT7uL(=GPg2yCz%O~Ggcvu1;igP@{DC28QNm?->I1|0c>{=+cvBR4(goce z@LBC=`pXL}op}Tg%;+O|Lfea1#f*18sc}ap$K%)Q>EMHE@|_$4lQY=vXfBuo`Ig1@ zYA9^YAr=&dRn9kCMj~g`TD4G(r2x*SXcyf(ytVQ zorocNqDp$RiPVZz_US}I^@*Q6K@o-BgU&Kch1;<@`KT|t0iCHNab$W>KvcR_P}DjZ zxt;~2-t1T9jFRk%C?TrKVkJRo^A=c_B!YV`;4oVk2 z0|MLe^UG~2o#O?E7Vzt-qBF!*L``uAQ?)`Z#9J?*O*5wzk-01*jLQ~3amWH5cOcQ# zL#9Aoi-0HKG(Inb>qKA9)|}gCP5SypQs@(#oDCO`?!tuAEXa5nviVM4-ypQ!WNaBc z(Rsdx>-@?FS%EqGN)G7uCNRP*k<8@^6p}y=wJ)-H8S*)X7;IqbLEHd?BsQbQ!p!cXTjsOJVZ)WQ98gg3e$Ve0Ye#GpE95hv>wcrKF;1f%?J8 z;UTF-1RCN&R4J6F)8we5Bu}CNBG1>Jsfrxx2$BlBQa})2ALw}Fk)F;$=j$*q#G&Vv zI8LD?Q>TF?g&Qj*&-iE`3g~DKK13|}0likuWX+Sy%SZsX?%)Cps4VOufPk|>WPNsIulPwgG>yuaAPrz+JSc;WNCAB-4r=SOBYQP6 zh7_vP--?9MmBq??hF*9*xzr1oAJT^|SeKQS#l%2S1T-&e@csCuofM&pWlb)R1Hcst zYo91pA+c^f1aLtH3}q)Q4Yw*)9>+{$m0U2iMurmT=;hAk zN>m6=zRh8`q6I#=Y*B7MJE+ZgBdKl3da@vZR6tn~BHb;$_12^HW?^EvI<7N#^TL?azc$Y8yGdh1=R z`lUzQ%m&r#*2&{bN&|JKQbmr6qE%=X46Bg_l-eU-kU=aF`XQHPm6ByCzVI6d)EP(c z6N)~dHMx*^yGhn2p*KPDb8!=_n`Ut`v5pdZ4!_9kyyI_vlTi&leWS(V(%SM;z33p3 z_tk%8>vR*~S1rbpOpot7vTNet+S+oMoxqt~Cq{j#xaz6r!geHb1?aWn+KQh!dT#u* zl!@XBYJ?B18bFS&t}I3op(#~Ux3;{f^5tiRUgK;Izd&hqHC&&Hj#ZjT7gtuobYkXZ zqv~8G-bjYphg&Ycwz3rAr=j4@$>xfyD}1_zRKkkIj?I_Wmg!sw(RmqokqaQKN-#*7 z(4}qdEEShE7%p`1rqS9}%B$t*kWj2}-ZUIk8bTW7=Y?gkAPb_9CGzeL0(_(3buj+uGVho+y5j+_ZTBidMO?x&&yGz!D=_Ek) z5vyA<_{onzFOVutwbNull&eemMGhCCwe9%Murd2}22JrI(Q3yIJ ziL~go^4e;kk5z*j^-jPD-Le3O3(-{8RvNN~cxh70%CdUaz)5YN>PQ!<&13~SgmlKj zq%A0__N((lr-%X`MJ1e-=te_K-CHg;&`nM%i=KewNjE+9QIILnp!1#u@xox0P$vy{ zL)Oc0lMOB2J7vQRxTo24s23x4PneP6JDR!;*TrR(X`Le2Sk{p840 zr4l)4v1r(u)4`{1hI^qv72E)^5eljgqer9z1ud?Om&SMvYMwNu%iLTiUs=|Kt}GyC zdG*4FTIlt3%NP>d7_UcPS0q#!E9)DJN^81$Et>H+rz6^;UN7J02cHl`0)+tXvp+=l z$apV>HFxzx?BD}oJ-rpb=;VDQ3nZrnUG-BlNI!nOl%NJZ6=}2ddh~Tg3wEFr2+^X| zijMANach3mi4-mCTr?w6^6QW~x=@btlV6s_u$teeo-uki1Y9Fs?>254JWPSJ#tY<` z7|P?wVOUTwH??qS2)@Kbcw4lR}@Q{3xt{2-nPs4No zX%#O|s0<_{B*y?$x+GsJg%NE{m;M}$SxJDcq9c7>k+1~Ziynap2`y{arnRES4?K~g z?#UtEXzfZ$Wpu8uT?I6m(4^th1E7n_k$f@$H`}^~3}P!ee8OQn5;l5};${t>kf`!4 zAI)C{Rl}!BE|T$vL`#0~vCV=z=*W?_e+C6kD5V zK%?Q-g}0y~`E_c16(bNM5F@ZD1cGX4Q`|9AjKF6efp)(#?Uw&gGcaULHpDCY+dp*O z#K5gH$hr#O`2o%9;z9kH8DLH{#I_hn?XxCbvg(PcC$sU&@!TVMVzAH7#_x$%*5o~8 zHAWua#|Xp-#0WG)Ag)H5p%T+#1X?1{?pLPW@>?css~-eob(;tdS(Ea@>DbVY+K|DM z(pCW5XH7b_tsg;`Sc9$)f}3cHJm+he7`|@s&PE7HBM>97 zT+JV}Xw*0%41>Aq7D}!iov^Oox1yfqet7GpkHSM5yBlIAwJq&4ky94N*Vf zZTqZAOD6+k==xU*NNB5`Zc89f>t>~+cxeuS2qFxg(4b(Ad(hAghB`38p0O8NIDk=u zFf%$qzF`}mD|8Y}EUU1f1(zDx!P*ZBuJEl~n?%7tNuDy$n4t^EA})RisL|gF4M8gn zAdMmZ8sMNYi$>Adk;XAAQlshNN1?3NXelL%(Z^owOxmzCGKa}wV~Vg8g01~vrAU#I zE&~A>p5{SZ3D$dO=7;`y>9rLW3?GOBO^NZ4cSQ}FqSNDgsu{?lL>U4GAld@ETlq+k z8lGAffgvD<0IWIyP3Z88KxGg#2sR=_xx{!EVARA_J%SUlw#u<-z+){@4$N+ZxRlbu zkiKMT#CRzma2Kb`VweaVj*c9K6a7u#OdPX|E!xHGqi8(31d*jXD3q_$U)I$!K$PWvrQ8+5}eiYoA{$6%~4^R@5f@##F%9HS6d65Rp zVUhk)&teyEe8dQR1`*&D;r+{N&x+4r>f^9lNG)T*B(uJ+ZfcbQhCQ z$*W7}PR!q(X3}m%C)*EjaL3r)=^M-_oY?mSdoR!3y?N#AN#@EhS8HP506I}hv_9p@1i$*n6F7U%Eu z_K(cmy+L7OWz?00Ip*%|+H;5*ZCGG)Gq-PEKD&dZl6Ourk&~!zUOk)Z>_wC58<(+T z21jSg1m9CsUzP7g1(?7x< zDKpbId;0ovx$cFzyJHi3S@V|3a@Q}PoteJg(>KVH#Z1H_3zp_)ubw-h$*@T+YS`7= z&&phV1ymf}vUQN)PH^`S+}#OINFcbo28Y2V1h?Ss?iSpg!QI_;26y=<@4b8PcmGvu z(JU4{(^aRt&gp$>@A_tf@$OR1@Z+9<=KvjYk3+OA+=g0yv-p2YkQgA^7L4$Xd6^uHa&WZJy8pi4FkqqHifgn9KB_k;=Y`3I+bNMps zM>)HBKFXvVd~ z>kp+8+pbdSOMsabQ1lnPB{+dkXd<0Xjv|H1N%MW?IZfk(B6opguS+}{&wJ-i`VWV_ zWCms=9*?HwA`O!Ue4)s68(-mI_r;AHLtFOgI&cP!fB2(b@7UI06qBl(& z$183`K<|X_-XYP(u*(fd=pN-n`v$doN*?}pCUa0Ec&~fA_fKAv$)dW^!fy9M=S|hp zz|Q%V{_FXeNYKs_!m6q9c@KEd`FPy<0(a6+ z60^Udr>Q3cq)S+>ak>O1bqIT&3@jhBGpKnvUrRF*xSby*+3CDm_&l05G@fk6v8*+_ z|1f(bY*q7zV;GK5`s+T+Mw?^iY|SUQcdobBBp$cnWE~Gb(i1(=gvNr9@O@8bd-#7? z%U^kBxj7hEzzVR$owPW<-h%x!V~GEUisgcSDQ9XWrLj z`a>yTFgA=FL@9y?+R{+_keigE7v@^HM{wl-Q zN*r~Ks$If$xkT_Je@I}ccd!a@b&AIhlcbP3Xt{5_x0M#%&o!qg8i!e~U{0t!f|V5^ z^ITuZHy2>we7UK@*fA*}iU`D6z(p6ndXKx1o|U4fm#Uqa)vd+V#uc@1^ud8dc7IS2sq=9a6_ez(ze^8kr!q@RO)G?Tqk=3rN zWB843o|HZcEZ}vwKj*{&sNVhf*(OQcU7O}O(A}oniEcwzTWgkc^Si6F7r1L^ahqsk zD-O=zJnE&mwaD(crieAB)e~T$nyu`9_u6}))aJBv9H_uPXg)A>{~<+QjD(mVtJx*e zOFy+!zIh3NkKtOa0kT48pa6h_S+Oct+ zo|}nWT3HiueC=Cd^azx|(f0D1FhqHgHy1Vm=dSzb#DRS}b+izk1k!MBl5wfdEhYSf ztG&1{0t1@2K(o=~ICi6!bGb4zH6uKD*;BU&lE(7WNj&p$&!Kbznv+M7PM>e% zvY}9$$pe%NT_;cJ<8U#L+@QZ~+$(ds7-1YG>Og8n{y1OO4`_zMBAK@}e+Zt&_S>D} z{p@B^%;3cor=WN$^1MYa-Vf-DRb9V zT{x%hKEhdW5gV9Cza92m@Mr?VX{aE3kf!e$gucF2bDJ1ElyOLJxb0|fd@VA?Qd-&E zem*S$boxFmFAZir5k3_e3RQo=MZT-mB1aR6S0|&sMAV_rdO1G>=s)Fk(5=PWWq-;e?MAMZX@dfnP|qRX`%o+k16`AD4&nt?@nMe{7FK zT)LD718$-=InPM(k557FC!W4d_IKQ*qT4(AT>W2RRs61@2sj@am1d_ z$D1>{Lf(MHeGThX9JxysqP0i;a0}FY_3_O6bLpyb#?fjZpLHGJ4!xMsqCK>4czd;` zu>vS}F^?kkJx~?g@QfB*SQ7}5NPYD(C1Y@|&d;9L zp>_^UIQMu0=mB}j#WebYdf-WhKXjvDn26?R#I zUknW!K}5KY(eYS6vg^;2osl;`Ssneevxk^!AT})>ZHMAHjGZf*340@qen!0H9pdv~ zWSJ0@o_WG{n`XAREpB)_@ABwg!x|-chl6|5Zhx84e3X{2n=@vAMns(HbxJV5r?06u zTe=`uC11yUT?7?*Ths&p-qhi^MgSp=p!T?a2a9O4ikYQ4ft3NWkQkj*QF!BG-45H) zwsL*sFKZi?rqLlm_%vaHjV6e@6&R!_xxwJN3-XrU&F%ufS6mn$AkByGx#ELN`b)OT7d!%4|n(aUOeM#)}bsCrqi)9v$ zUU#BNh|ZY>&&dDz9e>FZy-UK>JLEczZ{qK;nTvEqsg?N3rsB{D&sx6AS2B(veky@# z6s)&d2v?7N)eo+|H=VUkVr`jn2p(VU7&sm)w9BrW$#Tq3IDR?&nO}qJ?BfNdcn&v^ z_oo(4Ss$j6Oxx2f+3Yqw+}%3p{KezsZmDKH9^g{R(drbIgBR|^VQ>AzSJ<_PG%c&S zoz*j`;K^O~t6tQHrJpt*`j`cHi0`~#F; z?vF3G>#vG->uhQ*(gVYNjbMcf5YE?8Tnms=c3bflD#tAH;mMk#ZM96zlOMN`!R_jb zQ}^-laFT$rs<_E>8C97N_|P7~W$LH2jAOF)f|+WRd_R49G5L-?H37k zr273gnOk%|@9SXaYT>(rEHjhE3xJ+EqNjfC1xHrEm$MOb0vKuS%8VwQRj#QHtO10z z$3u}u>ti+);TD90bsxo1Wyy@2);p2`Q4cWuhEX_D;O|!pbCl&^CLv)LzxQ_=o-b+E zfJOGAfS8crOm_mZDeaA?9c1&U9`~2aluUoIPrT_Sv7h2(;PobJLSG^<^G{MLtp>Pm zuhHeb&h=A|J6|amT+7VA-k?b1Ccp+gtuYjc`_q)zLlc;ZDi*WJLX z&G&8gsWlidc>+cDOPRutQfoex)w1lczoVnLxC@O1DdE&sLG z3Aoui*V+wQylpOCZZjq_XYn^yruP%SmqHuh{;i_%K!xq;07(R3mxw8W#;TuPIp+F3 zWFAMSHIVg_M6HCZCG2Ohp#n2_!;c#+9zOPi<6i0$qh}0qQAOAase9Za06M@678Md` zy~E>RU)9DrDf6C3YLg@IolB2nO~a?Rp!U;fo9&dq#qLePx*)EQ5J+d;%LDNMLoCP5 zNfguA>y)Xg*jbeZz_iOx>t?s-=7xwWxskN5-PaU0{3Xab0+wTq&eADWM%1m^DVrXW z6}jsys3U44sjL zT=(Oba&{;BFKa&+^NC}WuU;W9qNV-15=5JaBFm*t5adT$%H!FQ_M?vcnKE%#j?^U9 zj_>Qo@4td`;b1!X|8U?4#jkN@W%7Rc@O4@Bjg%Q%u4Ws$)?+)Ou#*3V<8ni?rMNks z`x98kf1_pGn#7u6#IEyE8r*&>trD!a_;$~6@THB(XM3tDuxcLv6X5oKWmQ4w_7}3E ze)dK2X{+Sr2wa4nH#mBCPg!TtZT?+&ofHp21vRyc z#;s~DY82Fq#f)$N6JBRLIcKTP?8Kf%5~L+DY8d!t~iob#+* zT%Wb1%iAIV`;TVeXBmv|4WA^{ONZhe5#tpM{%kByZ=d$hkg;Nk+F>874Fha-g*;Dx zv;cr;USVK;UiX(CdJHqc0@JMBRORZcXiIJCGUFdEF;Ibz7&$F_>g3jM?IUC)c>+XN zQN-Uxn#6`v4il5`@Y5WQ+sP)=qLpT^#mV7ePy}y2B=r{}e?E8-GbZorcOu*DJ|iKd zV3&)&bsq!NC>Gh?DE@qDv_DyXuZR4ccdM#mdW@BaJWle4$*k5^aaw49bp3=k(KcZ) zTr!wRu*&AKGp)(@p`cX0GPm&q;u&Pho>*-OLzEZe(w$6vE?Y!#??z^LAB8NJxn6P~ zf_cwKDGEHmscxLp%alfgnKP-6suEIlJ2C(z+$Gj5`8)ttDajD`%4qbM?b-jmBNIqiiI*8lJ7p(o|w#mPx&7_;@yq(gf#+OFWd7)ee8@L#6ErO@6}6L`o)-_qUXMK&jde@VxX@-R{&f01`u)UKX5;MAV$;^D4X|gYASoKu z80seO6kX%#iF0Nz@ngz)=H*nBk!N)7;0in49~V!0#56+^FjOoXOKISv!9|JLXA)Y% zETQwh@P00jW$f7JWxD?9q}=h+Gb+QJOxuw z1VB`O)Yv~tO*#sBRY44@8DDL;ZOq6xo*Dc(tJmTev=x4WR=zamI=HyIIO{(`=B+UV z2%s=SL@D2p#870I3j3_=?Xy2Vd>I&^)S1ub)$qn5RDHd5`GIJ;p8?`o}BRQ)AYoEhRr&DjWcE;t-`0 z&5`m*<^@_)z=4c7mT`SBBPFxT(^zq?e^71Nn;TmC4!Y}+i*AWMaFafjVkMBQ1ADBr z&9O8NLDD>z{!n=m#&L~Rx|?&N<|!L`ANmH0M@)n_0?>NC+Hd83+#bm6@F^)P($6D3 zbO4{ye^7rHU`G_}ANETwa2lOP7_zd`MkwB&NdsBQya?w?SL~z+E$Kfx-W3qpXzM-A zRk>E+lp&AQ>py!f^rt28C{?`dItA8rTsI19cs>|_@I*F3yye1aMm(k2 zJ8!Yqe4hgfu+_tSU##1`GfLj}?hZWo1zwkvT9x$aU)Q4(gFOXar}Rk<$LU@-&l2=s zyv*Mw3SXam`K}%$n)UA;7vAnN3L3vuZGi-x+8x~luQp!m{T-VhkEiB3pLcXe%ilI$ z?O(6!r|%7pJD&^uM;hhdc9r(+#=mC8aICOf3-(r8<{&cI;FSBM18Xxk=DI#bjSFl# z@lv>a)44GBa><=&<2rz>2hnr&uV%N&HB*iMaNwF)nVM!EmGV^SGhY+G3{O16?-@P3 z@O1R2azz}kJl%6(KcTI+I9|Mvb>uD~?_nwCd2RY>o^-((;pg97(qS9#cs>OUMzuez z6*RYwAOkvYoqWB2{MZX1YZG6vFVXSY4rGC#f?4@YzThX{hPK)+*aJG>)3RhZy66t~ z*LwluxF=1_pwYg=-Jc;Lpvf5#;hH;)1u_!f;1V1&wvT+{4IzHH(eD*Q-H!{ZL|#uv z6tMX&KxO8_UQd_OgEP?w>`SL9cY1@-Qql*NLeVb?zF-m4CJO6S@;Joi#geiJ!#07j z5S|ZR+nU;XvD#nW54;=&iG{JQAQxywBh$_r6eQxG3~+|a1r}K|gzGTGla9dVA9y?8 zec&TwG7l={-;HOuXI)sz@vOo>SQ*SvB9+`ySZgs^bc~?X)&l z>YDta1is04o&%bMALko2iyd4np?Xu97ZMUo_i@>@oGsi=S)R9jVKGIvSE^pv;Bcvo zrxJ#(C%TL1(1|GucoCF*&S~|U>GbZgs90Er_y#%SVXw40&Q&^NWe-3K`o`t^+s|us zkcB(dgtx!!o^xK3JOh3ni_eXDx37;Yp?0JX;k%9YHw5g4FW%=8OjP|g6^~HsH$;r` ze~kFKgYa30TRsfT)$e_thY(RF?cZV!9`Xhsj+=KNkZE7z{po>kY;HZPNH61)qr;EE z%C**8ViOWFTk|4213xXbS-I5Mc2ScEBn`dHqBPMy|)rC!H_`tnD zxtbx?B^af4`}?Jdt2u|q!!$-MNtU+}k%y6jIUGmDwV4J<8klf9WA@uy-;1i}PsrjK zZf{RlbpVYpge950y!6`cQ!?5Lu+a4^;TlMth1B=X6aR7AJZ7HEhIVdVhrX zr^l>0b&)HXm`GvANJp#kc{UoL7?Hm&lBU7n>U&G*#pJ2$>E%)Db`hfVP zac&djy>06|70yt;r8JK2iBQ$1$$PFAEz21Sqa_36c?ay@5quQ!aG{>?i3rRz^k-gW zvX7qvzB;$FyA!;V#l(nF2&8;>8`&LYUsyzqZD~WOOb3IcZ}w$`B4I%TzYImkqD;w^ zf*j1qwu7ud%dt28iM|%a@Apm}rnPKklLxsX2r z6bi-g5gM1&`rd0dccSaEOwpevs9cyU0m8ap(~(Cs_w}tS9A9=~hAH%%(yJn7;@_8l z9QsWCJD}^QFfU$Bk8aqn+;(!_XvHKh<&w6m0p6`8Hz}vGx_}lH+p6_!be5XD2owQvg%5|yrsmPo844IA*jjh(7 z<%wsF1(DYkn9d6UCyltbQ!uKpTgf&0Th&p=_%8VQ@v!8ip!3dm9ax0j`Et^0mrnlz zN|Vo6+8veKTZ^9ec{zA`d#Q4Hc}*MXyc@V|JqQbDNa)2*c>^s39nQYS@u)#Wu|1!t zQcX(1QB;t>?~tKnwP?KF`1+WeO|9G*6Pbl6oZ?EKhwPq`$chN0xS!1~|4IL>_uH=< zfqm{}+8ia*q|$nxVR2&Hqu$CPwjL86G6mkq6-Ww!t$rvOAb%F-<~wzMSo8-Ibd^}2 z#V}hMo@oK?qn{@sGyqb=^9Y3+I#&E^g*-paJxL~tGlDpWNU6B+xsdk2E2$XZ(7SJh z7g*ehm5AbHp)s4JV%5-wMVND}2q|N)R z6)n@Co}HsKpkUBWJxI{eaG>!$!K$R~^qRt_Kr8VxV&2!Itth^>AU|a~L2Ddh3s&HH zw|P)I=4U_XaI*S&f1daQESY1q#5u!Hh_O>!qUW^{n1LGp8X3D$d+fAI?(Z{nr+6w1 zxT4EH2Y(dm`ALoOSY1m+cswwWGt9{Sjs}}dPaHSFv<$jSovG5OUzY4;!Od?D2i-nG z(A@1J|0qYvRx@zXd^%JD7DkP5cy zG+bx2tZZ2#KX4yA$K(%+=ByJ$`g0Q>rSz9RA59MJ6_4gxRBX)7jV_gd;DUr$;~Iy( zzzGl7w|+Yz8zX7edfZEDIfPm`nUDdQT-y26r^y-Fh(0lYHD_&qS##Qp>9~$20k*rO zf|WXzoo)huQEZel^$t^oFn(En|LYn+^LCYx`^@4+O|DL$NndxCdvlT)Mhj!ho>#QqaHi1dVe zD6;tD;^&a#Kz}TZ9z)#^w5^p2x&ia*2x4172eeCh1QHlUA>A{ZlnU2Bmw@<`hD5x* zSURE~$F32f@Wn-^QK<3e5$&+rD27@-5>ldGBDZ|r(j0|oS&3K0X(;8uA!N1@{jApJJOap7!Uk)FZD^`Bt87<@^5Xzhr z^DzPoO3r2g-z-YfFgmh?0_sZ~?Q|b886<;o!Mfp4qCQY1`Uqnl%$F*Z-afv3h z_DgQJHZ<*O&iCRhaD9B&DcDJ0F!oJ-L%W6RB-|3?I8LO%T)CBLSRXPBb*V>EH^hJN z=Wmy`X$0a|{Eg?W>!2+JNu65U`m<{^tyTFO-ZxalheLAn|5`LZ^dF1)wu?HU)T<|$ zcn6;HzRanwB~e~c?REnALZMl9#R3=G{-ZK>$Kzfpb9F~*pivhKXZ6y7A*!GG_@0TS zIJKeZ%xv-PkI4F!~H_dy@}@n-N(?t zwc|2RrOZ39uRo3E3}1qo+UjG9adiS?l=Lhb!t8#Ja!!`t;@3qjnwg%UumVu~x9>VZ zDAi94oMYnk5Z-&uoHyN=(Ve@NNF5!S$X;4KKTim+&wuK@CPVxP0a`pZ3@53@fPHRu z+qWkto{6xvYzs@jr+C0&fC2&L40~GDu#u~41coP)E;kxfh)); zNng@iw00loy&}7HHz0)%dtU+*xb+?k_O5S+d*seq2j^|azbDRPDZJ}!on;#wqB5kB zxZ1bb(*{?al8%2l9eO=lDSNw4=)5;}G>ROxtyhBpT)X4GoG);eTdznN{OHF+k!Qd6^7n^7qmB z{e70c(5yB%#D>{pdJ2&_aJ%o&!S&s|V1JnJ^9STlY*a`riTtK;=%2@i77#8^)X|FupQ53+O|?rCxG9X-0UZI&I@XL_T% zg&7iAWfB2usR-FcLU8+U7g4I*?X-V+i0@w^`VLuUge*C*z902Ut+-K>Kn@BwP16P6 zet)am%Or+eil;O*A!ndZAl3rX1|YUtcZT2TXxa3Kx$!y$58iKU%>b$L6`=;4DE@*9 zE+vYQ-@WCMAwRX9@xvEGq6T*{@(R6LsB?%2bE=K049MZ5$Zy9AeOE5rft(iazTyW} zWEXb~V9+d)h_7bdjjp|`nmRibTB=on3c;8sXM|kL;lYe8KM8!o`H@U&M+pW&-DJN z=BaY($2p-L$3jJ{-d7ZiS3bB%-l(0R+m*s`^_-XxbsoHh(XPr)FG@R%NEePFJyXPS zQ!Dc~*F+#81%&?$j6I`doR_8gbCUYm!aigP$U}Q1|EsWix6Zse@;IJzC!UbCSzrbx z1vLN19#PfK%^tRfO3p#^po1omA`>pqVG}liJ#o}t!n+_S zqvm0qBO>IzN`=cVi{k;Cvs)Tq}V=o_`aW<8iG5Q6~ z+;&1$xJfx(vozwSa4EZuCri*f&uv@FQW{{D&(i-{IF6S$RoEr3jk=BL8%zn_?Vi(7 z)KbCl3ZDE-IF7xigPrRik$%BDY@S7u-Z8~T-hMeL>$2Vn7@?vFp#1=n6`S)kJ}m14 zPU6w8+0PFBSq`(INcAq#i(VW2CFq}kG+rFa#0QTXW4|KZjbQ&}4OGwyAA*nuWWNGL|dF>b{-buZ6$mPmh)G7*tPljMc+=4oa6hCL_XZKKXAAIr1q?_&E4B zFeK?{mVpixYo~6T)B0Dga9qiWkL84fVoa_3CKOFuoMcZs#ifG61Oq1@T2l8ZTZEBv(3`>J-@%b3jB-E3DVGa&FKuOz*~KT0&8 z1YfZ(U^~Uy#(&YljZsC$)8WFxh_yaXI)Le0kPN2$af`+Tdw-sSZ-;TQfV-REjJ^TP z3YxPZZ=ovd663)U@bqTsaw)BV&eas&GoHU>Vai_)8|F0Y#NBmC3x8Z(7}z6)zq0dE zl2gfvz{sdRzRnnhoI8>KNHVJ9KTORQ?1&{Qj+eB;E7gY z-!JP1NSCkl;W=#_6p}V$x0__IGcCo;j5f8txZodiDN2>N*47D-(jX)0%EZ!OfEmA& zjofGtKhDpJ#Ijyppl$&Ds;9cShT^Ki^e0ywSLMMHqJC$}i)rKLHXWtF9UVcN>? z3>VGqV9o7Qd7VnrrIY%AF&DM~oCuCv;-DLQrR^i2!kIEE{BB3gt|wkuIpu7|ncIt$ zgL_2~Iu1izMbIEzosj!1h2^ihkOG%MQFE-U?F)u}$=Y8M1g&iX@REDlR|(yf-~9t; z%D8Z4$j)T3C$UWV%JdvEzgMl&leOy*pD7uq7R7OSWs&K8%IvJ+7XEFt=3;1@jrfy^ z7y2p?S^lRFG$p2F6;<@lLnfOLmAgb@WDtQm)ZPD-k2xQ&>nj1MOYTmOqU`4}EyXH1 z`qclE^6rBD2%X!kf1Dg~o1?t8eE$R-4o_x1mFhLo(H!w_ZW7W;j zE*0iU(AFu-Z2p#zVkK_x3+bTuVVmewPFNrzO}DbPs*%!_ZPD+G!p?VYAh*a|?Cnl> z6s?VL!9{ejn20Yx_+eLa|59P;R_V4^&W$p1fjz@yNUS~)mcnSZRQCSM9Mq3=J>~dm zMG~JcKl)C8VJkHit#nI$g=cA`Wj0cS=-R0u`n2qI!uN^lF5dZ_McCBRpTv4HKsCq;)~QtTpUxpSQT$uz<^vMhPMS z8vMyjGDeoafYTAXksg(mk`sC4?0zhp>*)LFosJQspsI4gIP;h zajK_^vsC!@+yfK1tM69prP6a+LP$E-=(${4q)KPhOp6`4VEDVpWA@ON5#fiLE=PLsfh=X1G>zJl$mvSt)*8*L4fAr-AM zO?ZLzVUrrQr$e))!rygSQO?>7RMlbbD;Y{@Oku-ZX4B55ao+Ed=_Yb&5e_jl=v4_^ zQsqYKG#Fh+S*$gzxHDopWZmUi*6GdbNR&Xsa!xONH`X}kObln|tcE0(wFd-reqII+ zqfr24pLUG`9^XPKnAjYd2nuJgzLtgv6o!iu+%a2HMOY}=W5@X470>^vI<~O<+7bQN zlb*#4YY{W&Ioc%oC}TObGQDk3TFK*{oS2ss zgN`Hw2zHV`ChiTHSob=Yw&)x;@#&jVQ|c_%!voCVTIK@0TpEHLg5L2DZgKLts7~Hp zD(tm8L5BLcBL`)kv4)T7=xN-{%9+NT1Ngl#Pva9yLP}Ex0a#ku$e}`Qh@&RsFqS?g zhU=H{3`B-k>)7p}Rw^DuC@OvSD#Li_wP)LGZ9ZQh^^MvJfLqp{Q9?)S__9{gioAE! zPYC4msCRbim`+&eBZ12(9 z!bnYb+B{Jm(mQxE3L4@=VFmWS(eW037Z1>Kib?<-pE;&}CFTNV0NX;+}(@ zL2xQ>WZ=qep3o2@X~Zp!NbW`oQCLt*^)%=B&iy1Nf!w|JD z*VWvA{f5wK(Qbkxxwb{Q^e0ZXYH64_$znduQg@H&=tmLOL`@C)td=O>4?8*Bbw6jm zG0!a}5VlNx7H%hh>BhA`f0FYhqU2jnA_UDvTsAUS8hu?)owJfup(=^CjUQkAH6oq3E@ z+&1_RXFwDD)6Cupzzr&y?@pRR!!d}6se-Ahf^pgNU{Jg9iIqXOZT<6X$n|$Ca_&_) zkEdxEaWBk&zq(a(Axut3qZel4PZ*iiaH2~|rxB7+ZYyO9qcX-{R*v=6cFV-lyaygS z;t*@W0|NHe~XH}oU3xwLwmC;`1pmwX|d+1Oz)8KEFyw3$Edyeg8>)qzDpGc2cLZ6395 zo+Y->a411=dob(21%rQntXJSxKRnh?PODT6j|s0^ZU9Gxv%fk-Z6k2{N%nf0)ae@=n_y#gab?Sve zI0-$69frpf>k_pwC_CzjhHmf!k8{HBs@{Y>oV$DZbjdjw7ucq*)W||jIb*m*mD>{uv~$gN6m0;Zu^=OJ6AcXZoi5C7QbfGTM6y|7_N4VAba7 zKc;KZv%Prg~q}8Z`Lg9zFWb z$tXJ*rTRt;oHPw7rBPDm-5RS$;ngZ&H6Zt5$SgkmcsphO4<**F0Lrd$|50Rj2fL{L zmZBuigal#zkLPbKGOy7Dfy;JO%4 zceWqvkFF`X=lw&-73*HwkajZHfKRpP9izS8x3@z2asKep$!cV?2`J{*{y%c^ z^}Lp^Q!7Tie<9gpA7!DnA5hlbQT_4%eIAoE`TvLz`@0*v=72`kPzWMA+VSm;L@p;3 zKbBxOs%=5mbmOmFy_%t`lRN}fdL8wAMDqUujY2RNgAgPYI*Wa7q$!ZuN0rTglMr;2 zIf=RWlFE9muaX`9VEg!&5$tlNEP55x`X2`r!{eWYhgBW0@*!9NEhnj8AA`t3M+ zI}>D2yWoJRlD7~=$J&^O?t+Kwh~DtE3pWL0`)}RBzhH;I#|9>7!<_?CIomMQ!m%Z# zyO2Y@=;ebnXDhmb4rVZ$?X*LSev$S4a#rwe0p(>e4KJ$BojADso}Poh4+Og`dN6*Wrz2d)UKmM6eMoY`&mCk12NDwET+9s>USPM{$Dyi=z+~am>WWi>j5inF<;Xp5r4|E%*?7q7K_? z6sl-KUJ0O`0kTl&{~r||XeKoTq*0;>367fd1bj9e5~VInuju>ZJ=KksF#1a04hJ12 zlQpH2DPF$sZBNy8fI8v9F~ZlC){p(m|B~kZ`$&5QVH9fzLR^9s%@Bj|L&}kALXKYr zb3OWmS`j>k-XX(#RG-{F&}QiUWp!kt63iP`YnD0bcKri!{Tt#*VOZ{yb0i`Wb|P)! zs54R&B={K!Au``C_OD<)4GZXK-9)O-=D!0%3hkiO2-D-PQuZd|c>ra;pt|v}aG;p= z4Lldi2+)qDXRHLV2s_yob8Lwbf^}*J& zYgs9ul%C~pjnASI zSb}lSuyzB5&I#JN2p!znDasV4eoZi=V@Y-1&s@;u^$!-4vJIs3Jo#Fj>s3H5>Ge;S zFrh^VVaMs65tXt6DM$PkwtLRi`d!rtXEmP>f2blc?BY@KxKHKVtuK6j-VU$@gKm(pKY`~2yQ!&B6n9p%4cXfA3+3OMgCn!AcuHBluJ!Ch3- z{P5$S=Sm_dgox63A;OF7R3GY{NvVEliB>O(JQP}UDO-umE~5{3qH~Y`X9y`_eMT`p za*Vk$)3=GQuv$sVh;oqn7g^LEu+rJtPP@D5EhuusHF^lMzpG@c(f7dB@UA`N5hwqL zZ4Scv%l+mUcZo9;SPQ^o+AIn4cz!opRDn<-ndP(g{xPG?0&Ak$w^qGH0wWO9Qt*zb zFy!+8i<%n3_uL-jw&^oPoCfl)|rai<0#3xx=ad8KLKVO4g}g>ZVbQZL9)c zOdhhfkM@{f_prVJIx#mj*IOToe>)F!r zxJMKvCw`7F2Q^QI0BUn(HY$PPw7M3&OAKo}u-Q8wp7f+U|J%nmOoVi8ST}$5mK|Ff zx7waO$O$jF{5-RzJNv-P`9}K3$p8L^PziE`-#X4Nm2C4SPkioE)TG;W4<%J~dOV2D zF#QLYNw)#2*4x+0KAgA=9@%{yKxYqPKj@}!I?Vf84Po){as ze2ADWk>a{VEYO)YQzl-%-v~lWNU)GAP^ob&`TEfyF{VH{1x5a;e-(e6nuCB^^!KRA z&MUoCv&KhU#|uf?m@qsizT#bINAH>oNfq{tPq>%Gca!0=jNl~BGnp?1sqCiQyYUhz zdq9)IQ0!=Eb`s%Gg-;o`8dygrpT3P!d{uit01FD{XwztqXHn}4EmEV%N|WGIMwrR9>aoDfCFtecCS34B+h*@7Q%2#5 zs@XSvOJ=Xde}O08Gydr%mVvQ27eK7jfoD;)v!(oriKCi6hPl7zQ!KP}dj)(RsQB`RsO+?K0ia>ijkc6uiCvTGbo!tb_O%TTFR=c-FP7tey{ zYP<0|YaAWFebMZMSKhi6^zwB3!{f0;)9GN{bw#)0tm3*sTo_>g_9{*4{d;q-&=Zu= zX|OePh_HXQUSqu8(|@v1<$F|+6h$i3=DOzMZ9Xn|vm4h}xAQ)J&y6q5vf1PYM_t!N zkunCKh{)6SB=Mj@ki&ZXnaHlKxvZ>ABZ@@8@qQ|p>=X<>0fF=yUkBcYTj`e(b`{6bYo8+Lecaf6F^(6ZE^|emN@o~NN z0^Z2pizh_U`A{O8$9w)X&9>vmaeRsSqeqsRG-2P@=YvLDA;;Zwh>UxS*;qYnEc_kV^YTI(9u6)P&vHI-J~5o7`TtS% zj?tAx&DLc&RJD9 zOO>m5*N>uU;rqim>u(p0W%EmV{{2yw^WO4VTMrLtP)`Jkx%jk2%4MFB zSaXMMZEcZ-O5sxtyQh?ETI*{1?RK;IgC*VywyO^lQv~ZUEP0fO8QkVyZI8=x85{_E z{ZL2(p9g3K1qJFlu7^b_`f<{QW49ju*Qb-ydbicfNu-rvFtCJaKvN@iMvL-z4!imM?e6okv}!s&W4Xr+V1L0NEHas3TfBI(1I|04& zxESL91q?nYMRzh0BX`$hMB_|*tR3^3=^)Et|KiIDS%w_!V98e>LlVm@ zKLFB-lM_PSSy|Xk*Hc^S(lY+B{*CzR&?VPve*3xSh(pHK(&!6prs27Xw^eKXT%BRp z@wnz%0bI%BM49pcKk>eyS?Qw+Q$^p&OPzwB(P5D~;Y!Q%)N+U0)dz$&r@hy__SPF- z_hav-_j3$90*U8#_NKXfj#=^OC^4bo#^=oUOOA4}{GroG3! z0@A~CjaGx%Yeb~JhacSjmH+1@lAF7NwcS+LRkWb*!wNId`SN};d_0ly{6dQK-Ln09 z1B_3fRrWr<2DwC}31th9oEs0@f*)~U@6SR{yW8)+M_zhcw{z=Tx79gb_Zg6HP&MsW zZR0hqHp}CTHQiq!NPai&PJ>Dk66^keXIK6b`OD3wpnz{u|C{cy!Iyp{pPJ5w`+QT{ z`qkp%M_;ivEd7qVBW=4i!2Kb)45t5qyZ`k)%TsY*4AzaeIjaoMi6{#cJCJfD^Su-b9ka@R<@3l7_9+G^*?z5l?s$5% z2VV#7RineM2uZUF%h#2@*L3G|*VAc94&e#!{gl4PGv4+~8&*rF%ctx4HV}c}3;3|D zCw?V8`y0GQB!zoqj)bWBdk(u5&suz5Q7ikub>;Z(XIzt_|GLK8`dH%ZJfxqt-wNcn z|0v7x8~3$ey`7UO@s{6uf8*S6-}VhfBueLXziQulWT1#id-^zh{x}G=W%w#Te%KX+~I;S272t}HIky_JpE$gTH)Z40Y0yVZ`{Gt~;&R5O`lnD(t?7Tw$G`UshI2pO1+B zGhFwBOiSmPsy2sx=Rv*9_9yLi28-)ZVwo~BPvA9pn!&*h8i zAmf+ro3HoR9`8c>{`U6QBR7in*J*?2tj7Wn4$AFMy!H6D(0Hn<+oZ*bl1OVvh>HP6saq0?-B z$S2SF-qGLszVz4be0uBc?Y+99mIXz4$bL&u@UeM|vV_B;Hw$)Hy-R|_VtDy57xcM! ziBkan)#>c#Zr5I(HkJP*3+pE*MMe9K3rOp?-Jn}3 zh!Y1B`Nk6)BUnSo&kR;o##j9msD_==FZga=yWb}I24w`_B>bHYlho}uUR3nIdq|N4 zUKVRU_KCh`b5P9qzfSsPMeE((WBtDYwAHO2{M~nY`RlWFapW?|KDRktFR}j5fN_TI z_(wx|3?bv;ao(@Hd4HFq1*yiCM)z&6bpqhMb9Wo-caWj~K9~N;iTH%%=HgnV>;4(n z5A}6o{2h7Xf0PMW=_z;3epF}bGpr<;i=@nGn0z&IBug=u^7`rvzCW7&UiN=Y@qcTd zrq}iiH)3juguP}#)i}`YaCzMu#42KyDWR-d!LGlyQA2DnAeoJCxmU_K=L7UbYrTAS_qYQqz@ zbg%%ol|>fuf0+pod>xSBU0Xk%(B?|VTlAFU)}uObzw{~VzE*Kpr<|pvZ{Ho2NY?dv z9g|@sARrj}dgR>t2myx2+d1;}7Tf3~jW_dW#!LZcvwpPL&u;(Exln}?VzZC)$}y}r?*=dSxpdhKk_?RWpnv&D++&9)-Nm`VM%i$}rF zB{YdxAm)7A2`G?TotTSEmP=zf%=!9q)``9e*#4LS2AC-_cL8;S!A|OVv59nPO3V5W z4ZrDZe*KrwY1^$AGMcuw60Buibs9>RRU01z2NOCZmw9tp{W>FvhJ~Ehha8IiQA<{{ znIe!R=P3WrF)X5&XZu=-(>L&zIf9F>ut=r9LjU#jh(W8wq{0$T#nZJ}2!R#6d$`*5 z=hN0V{Z<15Io3ZIMn0bQZiQo?YT7Ors_zlG)WQ$93HrzoWA1%k>sC zO<)|;cN|qud`cStYDvDyza<%EQYw0BL;i00X_dF8c~Qop1xl? zvlB|b9ukP~aBwM10t(63$CARtlw`q!gtWbnr@QYjfw_vEt*x@+FBapuvIC>N!y=jc zSJ3mFcK3@p>qs)ZQ%6h_`}X%M>dkqLp3N42BCKBaqWN(kirb%bH%U*=*}m($xhZ9s ziX4Q#=K3^LLh1*^$NWR03JDF#@%s3^l!-;BH}v)uh0|aM*v~%B-fXr1_A^6{CE|6u zScwDXPJ(`!r5@i~x{TA=-5$?&$a-GK75eS&%M8h^w^;9$a%4_brdug(<=$dqIl z+fFX8--1)zFOIBK29yvPXDMN#xX*v?kex9k8Ou#hrpcl$!yt1A2f0^ORYj)I<*?Y6 zKPnnk1%SOj)jjy16S!Y{SmK>`18bV47%ElvSRy>y%5X;8ntw09*XQd_VM&{=rE4%I z9EpLv)Q+x7g&?~D;r1ia#{Aq|vuy^G#Q8%SYfby@k`r~^b&o)cwMhd#mcE-O&3vMb z)!OSFqFM{!M`LHz{*ku*@RUum?*~=2AqOvfl_(l=IqFy6*48X=Q?B=%0%NAGwpjW9 zy{yBu8U~KdL??u38RqPUB1+PLR_f+Ygj>Y3xY5*8B&0OcodEL!R%jRB|b7m`t*O` zl$*0Dt@&3W8TR!24>x|%fp)7}8)C^Vn{M~%O%+$)Q_p_i{(k>{=lo<{&(v*y@}lr| zyIAQZK)NI#Sl;%rR+ktaO`vSuvhG)o^*M|Eei>TVdvw137)(BzDEYonkjED^Ys*rd z7$FPS2-DNj=Cx~mZSD>51I1-cYG;=Q0~3u*Vd(N095d(SS7we+6;t;wW&k`ytTr5@ zk|0a-U}xe@<#8G6@^P5HJv?_@cX~fxex85dV|_p8bR+Lyp^-Y#oCrpy=sa}kzaxlb zDEK^(w!3$*nXbY2?v@iUQKTa`JWtF_wscxeWu9hm*wwS-F4^J$k51?3)Urd|VFMoL z#VR0UU2K67!Vb_>^;vGMM!@fLGW`ttQ!-C9=Eaa!WqXmzy$F-@t4i)nn^3-Fxe4O5e)L>Z_vr zr2#>K|0_-KeV?=Au&QOlYgpU=iU3G#^a%QWIm1@*0gCff2v3Ntrkb}M&c{UGpDpu$ z*LhTSc3uK=m=IHU3Y6~?VkD@zd>_l*$Pe$%e8)@60j`Dn`T1`61D3-kKoqU$bQH57@!1Y%>CgM%+wnq9x$ zkDpRm$IJREby9>`s&wKM2avqg@J?A zzDN){LzAetF)p6U2MwNHCf^wQo9+!8kfdd0zj*Q(;!TIyfP(=+#oTwQe8O~%we;wS zplt4b*dy|JS=9)1)s7_Wna~KA(et@I?DTd&axR$2Wo8H4A4Q`SxDD-YaX*f%(@2L= z2syV(nzKTi2tBIlM%4vDne8b-1nZ+gS$i+=zDHeu+Z4 z4I9aF4Yn@hzP|Qh*Qd&<&|$?!!z1}!>URx%@^`;|Ar0W0)gDYXu%3hvsjOUz}-&&_V-efdd>Gh&R352*EnAG zX5;S7uBiXp?KUOb#|V+n#};STRo=Cr!%dF>-JRfy8lR8B_3_t}b4}a+RB$9FF%G`N z&C4yRg5d27IW6P3gFTm&Vg^$AQL()l#wPu!jkb!pK!hYyibliN(Q-G3`&LJW9e}+o zOmfi$`{=ed^IYB_5JfXRf$r$Ag@QsZorJ~yDUCNE75X@&O7Qz&xE1vl%m1~r1?W+l zR}ffrzR+NaWA2~8z!~m-Eqd=SLK!tUB0Jwh-dsjJFtxK^>o`3XeCyvfB@oD#b!KK@ zeyGk`|2~_~@$nmP`0Ge-dwGNO_$b&AkP#6RjexYrNFH`vK9-`lB1_r5cSh?wXc}d6 zZc*a-k5Rl18>>&?V+L$P>@mjun&>y6nD~eIPPnlIq1R1s z^3qbfo^Q)r$*Th0l$b5cWQQwjJjmWjUeNaqp!;j9rCUB$X_`?+?*EAFRu%qn!Vaq|d>St0tUb1^r}TKdsos+~Iz>m7JA61fwmAwt6MfeA#BT{&D*IV88o4l<51VMBp<|-(T=AK~@$WDGO}h zq%4y9ui|w48qD`I!-dR*ws(^WR5| z-+>-vf-EnW-_K2?5{SC~`(8&q*w(D8@WfEoSsVWR_Fp2aH6t-dx2h}|hp=o*(X5lJ zE;QLjePuN@?n@VGSXHg5C;#xUTE|$Eq|twcc0WGW#J~2`d}}#7uVa0E)xaz}-b20^Xu;EQi1OY8Vke$uoW?0eZs>M zU9_>q+No3LzOC)=cb+`CAvb}0H<~c4q11hCYky2}3)TI+`4nS!bl(~kt7h<DpvQ^mB!l1k%lfLbrJ&(F4MD-hP41L` zo|A7_KL=W^vopagg#cpTeCCO|GSS&z;2jScfzD*a43tZewH_G>fI*3ef+ z=3FgVs;I5RMZa+`e)jhfIb46gC|@Y0AkW7LDbn?3!!eN1IZrH`@4AhyarPo1N|3w5 z*twC3p?vdF@ZUezKkPUJ`+jWkH2UEU0{1pB$*aHR_i`iboFgMS$2K57p7Q+o=zIui z4re*SavJcp_4)3m-)_df>1IR6$;URZ_mb`kyz(dQ^H>ERdY-wHPEM{4L>7VkusA1I zzZ_qt$BG@^mC?#(7;;?!sRGm>O5HOOY@E7;liIZ64!$ z--rAb|7Lxs^&9@?yld$D?bU$a7>eNK>?6}=(j zK^PaR#e%XApkXze+JJEdpY7|Z%+UJUCE~F6a2mP*WNiW& z|GRJ?fMd|APt1sEv0GbUcU|jvh12u-daVMI&s(#D(mb*JT1{q~z{KC-8%q83atmO5 zRLQ-8w6)0pIR5<+EJ5T`TU8MGZrftxcQmp~3WrI*)nfn6n!&-6ckoPuv^}QKF;RF? zx$4{+bsYyq#N~R1j$}|+$J5?+G?6h~l#iF==k>JVxsmq$VjK%Ze%5aj+!f24Jxwn9 z?`P^nA77u83QrE~TS*ma`fiKt8+6}QHU3#I86I9om9JP;8l#hIGAZ=?#9YI%grI-5 z?Ypge`+~J|HgAHv-#^l}lx5v@-TUP>TI6-!g1f)@p7o9UKVIR|YJKm1XWz|_Z*u>A z#N)Ivs80MD4#m`Yv!OdcD&1c~ZCUeB|srz2^ys=_Gun4(yC` zoU`r&bij?HE>*U7HFaJFym!A}+WTd#SA+vc2l)9QavQh>rdtJi1`vxaC0 zeRu1>-Yrc|TYRex4?SrpH-~2oguCRdww|uck`@4%2_?lsHCnzPsk&Yt{SSpze$@b+ z^Odd^w%Wb1T8dbmN2So}$YUAyU=0|SI@~^^#~Jke-WI4q1sLEryFQDuc-@et_n?vf z?nOm9$IIbyqV7#+^X7PtnRD2YIUIPZGVWZgU?;8v&%{ZbXq%<)_f{6K`yE@+e2IeX z=7){8_i&)N3?{u^v)AY2#_<6E(ZnE!X#-h!A7yG`LF+m4?LAmXv>lt8?YAmz|(aag_-bGpv4F+FFleLTUJq8|;P zPT933y&+LYTNz8i?_Orkj8!K~S64X%9*()$hw7u_bJ{$qiz5pW*UGGl^gaJZAEEBk^lQw7>ndTuDiRxD}iOw zRa|%Y1lc&%Nt$+bR93#sS!Vo+X(}BkN<$>~g;=8H8}ObNrsC@69CD=3nz%{$O9qEj zM95-9I1|mQ#&pMlQiSkR4XY3+kW8jUn8tFP3{s&p$3BvzeJF5)pqOSW0Rm!&!$ADOakRDj8Bk`Pe zGFe|N48Sxf5PvDwh**R=QDLjoQq~*ys8k#Z!j)XKP85RKsO>cdhiU^^4j@nA1lOi^^wZuIm&)+)}exsW5-35(Tza z>s_|DnRYwmn^)_ydvAm_PsxOr8bRC{8 z91bG(A9ajo?ynP}IScz+9MXn-`gm~~l45Y*C4(-9bqu0k#MD?n-=0wH zyn=!ckhTOT^lA06PPNGm65@OA&BDdExjPYYKjmulFPhO?dr(J6pa_QEm_y z&3k+CD54^Qx)p4LGC8Om_tV`^o?u>F*+7b#X^DCf<4& zXfc>sO)5~&8Y)&`2J1YX+?Gh*~+x(Npa`M9F&yG|KEIfLli4yQS2yU z3|s~ISf#O}2^w-3Sbl@z!YF@DAkaya<(*JJcL{P)lNCzv)O#n{r}{sz>VK_TJCvXS z7DemqXpULIeIGOfr07W7KIjoo9Y1E;H>uEtyxD}2r#X-mT;^1d8L%DJpX9Rkch?IV zoYeo`3TOXsFMyN9;FEqaLodn952mUVq}ky5E*k~qFh()-F)#4w5=Bv$yh;sRZ444v zQ&Emg^X7nLE5M@mG4j4rF=Sa^OQ|g%+9{?%Y zhJei+DU*V=gfTU8tS3so^tK8~@;-~sNNL|QgY37@RL*%WeZ;} zlZ{mu6%~(Y^&0ZOw&D;@)9R7CyRMu>c-ws4X+fCXHyVbumI$>x_85dB%{dwpg0yPY zqVkYx@+`HTs2Bogv-bbX-vfvhahitGGT_gU# zinzWQK?mz-6-9-5!41DCAYpbn(9dBtG;!)95I&g4a4}WF)aV2{C$L(&CgOyGP$CGe zya!snek!DeD2Y(W7jJcW0AfNBdzLDMFi}xtRBWbXvd)K&^9RdzvK z{=MG~>(o=Ql<3v!*u!OCcSPV(q&=WXZUH8jm*N zO6BH~J3nQw^p=0Kc+eVj0;yIhDC~evBhBSKK351rZw1kG?vt@!y8J}$OeMbhmtZ7p z4*&o2#990ma)7U{;XA)&-*HXkVOW;2R7AaDFKz!J4&1H1Z0^w-K2uqzf`87u2g$U# zOSG&E0L*+t(Oak>B9jh{n5Zqh{1LGO+?~Q60Wp;@m5CDl=ttzptsxWRI1}uR^~aGL zc{IsM{1mrXh_S-00#e=LzQ&Viclk)YEejedb@Vdz37l}{-3E_jN>tO% z{^kgI&y`5f5LY!_c#TVNUNR z3e)(wV{Qsxt5H>h9!0$`-(jJurN#a1?|vAefnOe74Y+1t~Vu8mmr87#mAOu*>L? z4h&&wXK8|Yn=xjf&**rTE6uslhOz1(CGmerI~p|Vu;V00DJGy@U?HLpaX~w8RUNZ` zNo#ln)ZQAwgN6sAhn|``IBtnowxAe?K_m>=f|F3|Ic3$)jET^U&RdjQ#JWR?)Z_|3 z;078B`^95Xt(VfZlgZAS#4%ADFzX*85=G5=4|g(QVRHSWWDF~vpt*w;nxx4$>`c?v zdD$Cecwz8&EK!_7GyDP0h$mLJbz_rhZVLiY%#!j#Ym0oFB|Azwsm4?3ApDgK7tGZ> z=okvC96<9m6)zhVEMdjlAeaqVkr>ICbzBVU0e8zc8E|U>j`a0HAy+x5-s`={oY7oM zn9oT{Q_LnoRyOdChZ5s%swh1hgGg0kY=p65AWVZiuQ8V|KjPiI7rLPs$jpA# z$3?yPgW634JM|Hmng?Kp>Fyo!8I#4+^Uz7fnpNczFO6b%mWcF5BkbZkbnh4H;Q^DDoD6JRXzi*px01kCHnE2T>d17p9m|(x8+DIXE~R zW-H9~T}1a7j6+cH&mbd~zqQ4sb)d!yJx^`gG9G>d9-xAh^=MD`|hb#66XT?M2^&kCVl4>c)Wu#@2?D}2TY8nNG-T#LLc z)v#y=lj=c99OuYL6$wuU--?6a8aVo36+``F_?(p;nJ^ACvI#8&Z_IsO7>Xx1{(2hG z=1G>;f0GJ1uhh*J58QN-h~<7+3c|#v?|^@U)$@oVAH zmgBONX+)Dem+k~-9D`_u=k8GA4Tl{D^~U9w`kk)3dv$8g?@X9ZuNrPUn$)thQ+l5- z@6HVOW0Su-jML}xTdn!r8FqXEy*`aCF9TB>iq$5&ik{Nmpt*M4Z5XR!@k+mYBWhcH z%t{|F5x}-rnGP;Y^X;v?ogVXx0h{1GE6N#)v%L80t>zDs`f=0>92u;2kF*Vf?$+kc zY7F~f!W9Hzzj`Besvjn*H#>UWlF+u`zJdVr@{TNS;KcQ z)?F^;K8Jf3+IChMoTQT{g<-NT9Qg&sDulF&dOWG`W1_z8F&K?^dUUKr9q7^#@anz{&4b1AaYjVq zXU_1MOFLc0+ju(%JsPRZV8lLR6#o75< z{PfB?$5UFan+4m2p>I5qu>Py-c3~!5uXgTKUV_7K@Z(}Gt;|uSlskKcU3!^?)%C8y zIO&fT&Z+{V1?7N|9gUd1 z3(WC3Db=Rr^x633LL28tv|FoH-}*hf>G%ur>(8*tgTLWGRsWN^;F?)YJ-xb zN&A5_`GV@Hi&?kGS(Q_!M*j$P!a{TTu6Wnq@M$0vh}_M|t=g<7s?gZds3=K=6;5*H z;1J*woH4Ro)&zPeJ9{@*$y|=lmWW&)?~N)^3vT$A|HDiAxzA;QB2YB^17@VBxhP+nlu7&ksf{ScT}2{o%tLY{ zmz~6fM`e?*6~(yFANj28(8<0DF&1%A_~+-`zESXsm@Cb6(6VhXL$&RxDEKTKoHNFh z#*n`o$<0?b+9kyrxa4>T(xRW{P6eX!6j_B$)?PdbO`QcGv6VDY2+xlPaNN9-DJLpb z1j;9hz;Oo>C;2Yrv%3Q3?Bw)SS(BHW;=eSx)ec)#Sa`_LKKX}XA!?OCz|75`D^1G7 zr<5h=`;|`@R!)$kr(jc<6BABtju$jte%NwIHhNlF?69eE4~PF;Yb!R*;8C3YlSx7l zEE8lde{gS1s1|PG{S03@hiXzlR(VJIS)$O236&$uT0O1k%w{DFt&~nH^FI|@Ga)VA301?>$M3{`!~8E_$SnPp?A{WsG$RTJsb|;{uS}}_Vp=o; zovfbkPme~I z{O*S)N>q7DXqP6+n)XJ|N9jH+l^41L@qql5xa^M>4#c7aPf%Vpr|}|iTItVICS9%P!X+)McuXbm^6Ua5{o+aM>U7Eqd|$rILzF1dZ-qdYE2j?0!a^yGo0>gku-pRX=Qwp1>wN_F^1_I5NbdXGcA-!NiWrPAam zG36BWI{!c~zllo*|IFovl$j8p35<7DY6-5~*3#W=Bqhj4IJz<`|!n`CT zAQcXWhu}MEQJXZ1fx0&aj=N%DsBD@ezaUT4losYwuxxQz(WD7jk?WO5zTybNbIwtF z^Jr0(Y$f%~q$T&1rY8vpivtfQ#{ddI4FZmLRK-~vOD|FlbOhA_3-bLfeA6-p7c<6m zbqR4tX~Xzfu8%H`?2Y)Z?cb_O3t)W-KG;~L5v>4=1BFE7awt{=0qbhAyfe78@bDwu zfI~l6r-@-@JH-FP704mzME#OpU7m!L=sJz)c+&GyWpQ? z$`v!S_HN<9*c^O~{tdi-XUaBi48Vr#xZ^C&GYwE5&z z;29;1y7<{xlwPX@`AMqNVDJ`C?cLBNl)D8(A{e%1lA8>Z-q6K&;O;Y=936-!Oo>{P znO1FU{-Vc{-%@im6xxB=aVTKLSo+1ybmaP|ohg;?@!NOu8fpMy094j~5ay2SfwwA+ zjSN=W0-FR5PKcm1f;3gwVEC7t8eBdbn=r*9{;)4vQaK77&3axM8X250> z^`I7+r*DIp2F)F@6B7pVxv}y|BJEgogC0!e&|yDtiSNfV6`3j(y*hGl!`nMGhJ4*cWf&~D%zC-TAHn`UGYxBu;+0FE~WY56G+XBsDUl* zlSM;F4_pupPzZ}bbwA?}u(>G{QPUbV zeHBnU)0IuJ+T_lIQ%!hqM)X`N5RFkBlo#qpp+5DJYp$2wNQyRqgwM&`^L5+Pu5yqm$ zAIMrFe@{Umby2Ao*xUS|>fSInj969q5wEXmnD#M7zKMl|;J0`Mn2; zP`RgE1Ikti+COl00_LYudRvZKm?UD=sjE_q+wn-_prbL0LdLrrAZcJ%*cY9sqfXn$ zl#*4T9<3^mEr)mHq3NH^W$@z-7ZM5=v*yEu?=o4UY7a!&?ZyYomv02jqO_~yW4t0J0 z8RMJxzdp81NtLI@KYfi9YZ8}9zv_xwFf($_mIfk4vppU>JYna#{^j}B4V$zEa+R4i(Rq^j7uc(2zI>p`~ z90B&&753|V0%70aju3t+qgQ0y1ZWHi!6p{bEG!UI!rF6Z`eKjQeYR9CCAOvGfj)`@ zB?M-oGuQp9I!Oo`elOM#`Jgd4e?P@@34f=50;6$rNkuRl8nD#3;jKF=F+NrWs zTF@j=*_E)-2;bL0Rf$0G{2$A-)G4>ti z7F$tLCGOxf$GZG-j?6q>wQNnng^rwe)vp;9EU3ADawJDl7)ct%E2E)a6q zRCYw})_N+uY5M5&)&@_)_XqWHh_fjFq0v-nR!MQ7mO?PKs{o{zqLp{7dF<+rE8b&3 z?G|ionu!DywR7?~5t`8(m{!Uxp>d8-t{l`D_3dx1l!LtcKAT!d783a-yfO!H)RPNG z&^TGJV3~4s)gUBh($H)1ELA%%eY=Pu8`0G5Et)cge2hK;X+`YHJ1@Qp9V}Sr5rZVO zE7~g60~4k51i-I2I3KG748ZP$%i_|qjqwliM<*&rqS!6l6+PjlO9J+Mzm>`Vh%*38 ze(H+eaUFw#H8lH{8V2|e7ALtvCKFl~G6NF$c@I0&1N6L7g&7kbux0qVJ&wf_ZIC=t z3QD{UPE9#bCQ5ReR5tpOgG04BPg*!AnrpQ6)Qp>km z(l(g`G%Cn6r+Xwg`?5c!6MyOcC59YjQPUJp*>6L3N#(m-c4LgYii`6pL)0|Ql2SX3 zPyqIq3$!jjNIi}BU(?4W-*;FVS8q2IXW@I7OGsG`)_)-})aZl#rxSlE%~C$Qb++f~ z7!Jx312xo>;+$rWMl!q@ra@1IUmMYqlu2au@2ztv>JcT*Rpf^Td7m-D4ycBhbZ{OS zZire_R$LfiF^`1GIeu_o6GRNxEn8V$E@om{sX=q|giqtCqB=;W$Ce70prZOR{tXUl zy#0|Uy)7bu1Iw!z6x9{=s4rL5y1yq`%{~iM8t(_W8GGfk0wm3)tdkh>&20BGb7d>< zXj;Kj5Mo}0`?B_d!p%q`_q_^baV=yPD>V*IH(`L(Y+-YxvXw>@p{3EDzCn1OS6FyW zafvi6vTYbnnI+4{%7b)N^&NTI(!EaHaV)hfxlsifdwIjCNd^6%;VJ3PJu5HAF>PNN zG#pYzq}zM> zU>eHznVN6{HFWsJvpDrD0ZlF6Pb3K*1%he4IepLpdY-M5EJPM#iYT`4zK znHY2)i>k`pG5Yvr;N*~OfVDDYc$8Dx5@wZpYe))m6q59x{zs^EdD_Lzv7|31bl?-A zdgMG}WH>7|M$sY-n}{b#KMj@hWoa8O;(Fo2EU&~%vs{Fn0YapC7<`{s3ppyp5JJ3( zcUeSF5~M4|RGyyU4G!bXH4vT&Mg?F%|Jy4tqVHo~x5nz`@37U+$}p_k86-eh_!(Au z(QNaAu;a#Y{yk&yb1n)MO8y+<16hOX71dA*=aGwszFIZ(AEa3Lz{rb}4!U9tGDKEX z3A*<%N;G!1thsD0Oe}&cMMAG07XCQ3Ci!dqYRa`#t(;eUbm5JrtTq4iM1XBRnYC%l z5F9gJ)jav@7{H1bMP1J?SGF#AQI?GVXKg_fz))!vr-8Dsk&Bx}q*`M`qz65I%fTKN zR<6*20|wQ`9LKEk@BqO!;uTZzOjeXb5)8+$i8JIeSS503gs!KEfAQZ?HEdI{HFg29 zhU40F(Sz6iMBe{J*L-9+@u?ho?kS7+ zu;8O-(qh)?*pd&9gb!0EP%GBqF>paS3{x!dg&Ozbkx`-YVZ$BOtsZ6S7-RH;+ z+ACiVp87r3%5x}ER{T$nGDB8QwFezp(FhwdaSwVS_%w^EtE`GQ90s}{XIgX^Ri#!_ zd9OUTc!MHC6?tXnq@O${+kSYDgCI@$bd0)8!7y1!Tu4oS51c1ZDA<&2D+&C99q0E; zOsh|=CHpR;f|h7th+40ZXD-PF%b{UI7OpfXcZ>|%!G;7KIuq%jfZ4{I>tECz6Wprx zVcNOOk97MIIN<l(2zCd0F^0O^Ul(6Uw^0k8~Py)!g98pVw4iUMz+IS3g+^ z`3I)5nPh%)k3^O9p}bUwmlH?&=T@JKM@F(r3BrDPW=v3AhePX29Lq>= zep^$CMoHIE8CO47gu{SBy*7K=@&({+%4C6K)3m6BZsaSRNmyGDk^IbgYh;AJg<>nt5?82x2f0>mui>I_3}(Ihg-d^uAi+qVP|?aF#iUp$>3$0H#3U&*DU*lu zZ%c$}CF##t9peUG2y4#;i3wa9*;p5?Jn1Tw$@>U276tHnuwJg|d&Ca;lSFB5qHUB= zjJ~*&Rq`7$lp<*oBucMhhV*zmGX&Q;3tgSB1egTc=`I7O(mxC7Fpw>C^c7aB*fRY| zcA=0%Z4@=CWRq4P%DpL>EWAZ6Q*>d`z4(qMgxzW9myL!5@w8}}DokYkC!jU2LgqK^ zq0XAVUI0-!fSXoI0l*#I7`a@&^SYt39I;wptZqqirVA2aP@=d0{Wf z)=y=|GoxsCV3=vUVXy4Os&q4>;?|o&6ec{<9BPI_+z|P7{$7CYIo+B*S30Uq=@x|@ zPv&Y>x56iaxa|+^d4oS3)~Ja`T!YyeQ|x^AZo)`xk52b;-e?Pw|CxKY;7srn8Fh{X zloCvLh&+RAjE6Nix-#D9+#9lCR>*uHJBt`2aU60nat>y}3&j7(6%0dhE)?|t1BXC( zzb~{Y2}mNiD3fr=fBcj0oH*g z#X(Y$;t1<7Wz1O^wuIk%(`GVZHNM-t0W7zX6T_TIlT4zXc_jF)`&6xRqUIr~aCoYpq5$q}uL%f@OI(k`q-Amd1;%?gd7 z(j=;M2^k`V-m^-MNQV2E7@yYvRUxvVvTB)OEXHKKKBfIy^J(WZksguBH^lU1asno| zqdEhqovf8^vn0^sWfGhUt7EAj)>wso2CVq_hXAk1Teq=X;6ad4Tc~e1Vf?UZxK&C5 zTFG)UZI^cCMlZcif};tssMk4UO|~5*-2UYk!&#GHAq6sxfaa+*P&K_|n$6A@$7@CE zGvcmSVf3zCSZUYyeAn8FbzMbEI-VPntcJw&IAmv)7@RV=T(_a5PK)bPGTW)(*SKgF z^~rjAS7_xB8di|m&g%<-q>`ZYKVmXQudAC?^(sVVpg2AVWSe88FErd|jlg-~2tDH) zn&cTL^^S!C(UU?YuE77+@ky;qvJULZ{q{BsebTC5-)zq+NvSBUqI5Qxj=(Ai#0b## zZO3ZMhrfK8MrtkMtMHr(6FVZ@RV#ZAS-l?%RuOxEICQFp72hwPoNeqdg|5o4xNyId z7ft>!Hr9G82y`;W2_JVf+u0r4-l5QCi~>4{m~*n(8A-7jMt5eevkvWDR?3$KQUytf z;ZHY9QpOB|n>bV{D&29C1EsYBUs9@5PlR#nB_lZnc|DxPn5BXiGh(FrDkvc_P3i7M zWe3MXo2!C?u5XkT6=H)I0&=jB_|{W?RD%>P;*Kz6D;_l!$SXQL3X# z7fK}zudKUQRCvs?)EsfHpIy4IR5-zFAlt345+pCs>e@+q&29r;{>rO!a>R8PPk?ho zLTqwR0<1+a-H9_T29z|SUvSm-IN$D?U&(-#`?ZY=Q9*Mc#cK|D%n0iw(&jXuqY7zM z17N;x&9;wF;$#FX+4dZ9LRElf>dDAK?@O8Sl2M5ckkLY;2nD%9i-c8}05d@TTH8_N zv5zPH$GQAGn&5)E@gJo(aKa6C!RC)`=E4GXVWpiHXk6`H%#ZcFJa&4IMillMMwo)V z)1aZ83*JDl!1q_c($JT4FGS;yUTKYa{~uATyXCjbkQOwe46jGxW@_CxLPC#y8~iB7#(1KP zl*VzZP_)NJDw?AZlPnB%^a#aTXwU+mRvRo7W#JKX^>30T-A^6{skT&QIe;upH4lJk{djx4C1#1%;E5qoPPxL>cay^(Mwt`mGTB+DbQ0m>=rJg@jX~ zmehMQ)t&JcN31Cw8dTy8mF9?iQBO6%$H59&5Sh`i0u&D|GN6P455EcZc56Gt<1I8O z(bKmuknGms)mS)1b2H46cNeN5xm)X#On*l_AhVyj+Tvua|SPS}; z;a|xykNiUC0A8t8{lehaFhV_vN{qDRsr6j)3f+$^6^2e!g$LB+hFZ~=;zWU?l~+lT zHgzA8FDg{;jAG{(K_HC{^QDmr^?P4R{nr2`Rv9I$s*+Gub8{hcaYRI}R?S7v)xJ}sLqgO? zIBM5wk$B4$@^i9V!tXyyRD$EjitT{r&el<_M zgQO-o)#_KZ$xLGOW&Qxe9HS7G7gA9t%7~DMpirF{gN&D4^FbTYAP*o^j`!&C zx61>+$zVOsZ+dVy8^v1lj?$D@7 zaKg{y25|vjxR;t4PkRD6&w7-!kcyxe>gC#4=bmBd?NdCSljkMrr86}e%s7r8TCkKc zZW@e7Rbz2RE$CFJ#_JON(t>HVAY{BPP@}Etb^m)R&8Fv6MUxsp&$PE+b40V(aB-(L z&*;!y_?6~>%>XO$78vUn#OikFlYMxcO7TEb(^yfU9MUlZM+COs)ozcC)OZo&eoZZ1 zRhq-RQ9tAvjXK8gW=onwH^fW1-lEBaDrIPOLKKe(P4Y}fXRbZekT4Fg?45_O!XPX> zA7G&QaGa@eMSB=VfeNt`K!h?I;ba);?en6Nh4?N6=v*wo@qyi4j$v}#mwJfpP+lFJQ;Yw!#2)DK-dh3Zhrkq~4|yn2HEc}+|z z8*Ap7qfH@NWp!xaj^ZZX(ou?s9&L`xnRGLz)q@L5DwW}h**ptfvONmk@WK=H6XkTi z5mda}qm^f&Tk|^;XwYPmC+Ty*YBY%R29k89MQ;-cCEnno#>nd>1vQD?nYRilAc!kI zlVRFn<2-{W%YMTSU!QnuXtss7$i&Ky#n`|o*+#P}AgE4qJelD^(}i4x9!2z!Y;#9Z zj@PmPPAbz3Dy}^|c^YT*#5fBa#Zui-?9pO&ya@F3ELSi$tZG%D6r?ar?>F-$u|x89 zqNZXgU2G171Q`xCV8uybP(p@1FqLj?ro+@Zju+NRnmLINvFIf+ndbIHl2@;Viv29L zbnH=?6!;hC>F?R*b`E;=EI7iG-b=hNxKfAOcvGg`4gtR0&@U~LZfYJK9SoIm#LMu~ z9r|ZQj9*Q7mdQ4$R|oLYWc2?`Gw-9~6e47*$Ab#qLR93vM4`kpIOxxG;07(u(GP*y z?AX{aZhOFJ;K0(3RFhuP9FpW^X+h8rqezEIWt*D|9gUiU!J?4PwiYy#?M6;dPN)M0 zT96tX4FZE4y`u>zt)0BBN@2aVKTOGF$aOMxdDxMu|nYkRVE*Pq6 zRCW^WC!~-imIX-Xn4%E|4;p~iE~k^zIumP`@fIhm@8tBI6Y9@xNCG! zFUOKlo^H5eUS`F7JDUd=5={(A-@veZsl4-0e)~aQho)G8gF#1g{IbPObEfIZ z4o(GpbVhNM6l)HQlwR1EKh(pk2&5jvW_6{mUYcpn>OOCKc8nUCAzoL^vkw)^Cr%fi z*)uwtV@sa#M!O}mGM6mmIqMpPD8fzrRRqNpK(RcQFYP^6cwzr2;}(uE9%I#2OS03u zHJb2nZ;Q~-uAP@Lp3!PxxVV{j7@oqX7r*d2Oj1G-zQ_t>>m8Z3*rto%& z1{&0HfVXF$+&5fgET@&TspQP5$;%fub+^$RL{~mm0!x=PU^(vzd|`i%H)KkM=160m z&G8w$FUcEwW%)H|8d$*$J;$^}jHXQWaZ&H+h{2(ivl>0N~q^e-LC z?LVHUgK4g`6ypU*v%3=Dj2ZPRI1mku>g9?MCkQ$d@z&<#l36KQgh%Ux9`b2)VWo3z z&9)EcO8br#wjUY=Ud|#=LUYXQNb+KshAO~{m#Lf>C=ZQrYN8#gIh~w6HAz35(yH?< zi&QjYtlo~<#qwyry#Hi=$AQuQ5uT{eoPb_dKD|BJ*&=7_TLk+!Cppqv8lvZ#lR(eOs1K47_xtl$HGBzbZ8(@K?Ig*X;E_5r zv?D>o*&RbT@9fd@cN!&1%O&0sBy9cm%`~;9vqWGVK^r8xPN7I_Kfu|Ua~!Ks!J8Eu z(mTNOIkU>JHKDxNAj@FYK!Gcw&+4^`o(jsGRTDG^z>bX!Xkf5}RoQl4*Qp1^x{})O zcsw^Un9unydEzaUnHJ!Mv6j*aq#yG7!co0@Gr)>B@DTAdm?ZF7#Gx0)Xp{qM&dmtg z*qa*LWTkka*LC{MK?90Kdu$`SU@4b|2F~~@)aZI8QYJfICm~SC6Jw0>LPF~#v~(iL zOGNdUlSUd;#%?>@PbcxM0;^U6Us=^CQBJ4jMMOc@rT;fKcO)`R<5;ERHaq#~NPmDW zLvm9K?}Bm@)wODLfGWp%;c79@k;iLvh@ z^@iKb%X|As(3}*r_bYhhB!DBi#UD%w@vam?2Wp|D_b_&G5Z9`oAmWjK{AhqTW%^~< zw}4UwjCr&TJPg2^%%k}%2vEOPV21?lteodC8=;;k6$;uAOMGKHofJ_>$VD~70FfwD zDTnT_)vSgF63>Api>FfB8U^b3u-d3|*gko}oxiDff@~94D zrKMr@D>WZ|5)CK-L%dMO949gM((O=zX!Q!^@kBGG3R>xF4lCCjoCw+6D$T*^2YtqC zjKT^g_xSW8fzmq-aUAku z;;xQx91m2$56gHXnI{xAo-eLIM~Sl}?Lk30CwizWENA0DKN>3Z>Le4{Z0s+;3%=$eEO3mqLD6R2>_ z5hkDno^VNxSrFJ@Q7Pt#Isv_-3mK(?iCG$0HDNz&sKU^7HRFDVtwO2IDm5mSeobrX z@YYarr4ULTVf0f;-ln8jG}+~%$pscozO?B9J9l*`Rx?&ayu#f0r%pL@l6X zz9;~iC?Q1qo5m+IUO^1Y_`2v+i~dx)s93luB2wUJ=E+zl$%KE+xGss|WGZMB3_%fr zwaphw1uy#^(>jp{uTvo{MD1FE1ur*d8lB~PVBt-Za3Vzl z75)k^3nk4Rsh|pn$D2v<^!koyz~>!zHld5D1&q{V@S(D!scf+D)Y`&SP^Fg#or?;@ zK#8x|2|n;76HJxZ!h9800+SDa?sN#B9ab((^lYyG31bDwW_2P7NL-ccVdZ)|T@B;0 z#`ZN+r+o_Xa-SIb924{g&N-5c4El2x?}+~<@%e--EJ zIP?wBnAo`UWI_IUTXp^{cJ!Ip?%LXkS?Xb#*o#`}wtc=VC}lpPp(rb~aimVNA_*@A zyl#+Z)2b>2&^elbQhTHy(N+q5ffwd?@}f!eQ-huJR3o^#Y;K49wkx2{^O2uw8u%z< zRAV${z+*bTz{NefWQ@3qBdKbg9=;i3wV?o%kH$p{V#q+HSr~r6Rb)~_3pq-H7~2#J zRS*<-5r`h6p`FA+5hH+w2ttestw?0VLJVhN3F4XT2~;=&bZFqWPtb0J3%mnR<}fwn zCT7ek2na_Ss6de-*D~|ePK6vbaVFVQfmoHJPrnV4ofY|~d{8KqQmmlZ%a+9Ta&qn) zcO)UKFiI#X-nHhCjpvX|1$6RPywXu*dXM));CQGxpb<)hVnV>dWvz2oCC(7$g7Job zRM<){Ets$tRM#>ZzD&65B{B(h&JQPJVpY%}N$!J`buA`4y-otBX`zyjbA+5Cdpjp_ z223oUT6jsqiZ^=eb`yoa1jV&jQLav+#*-KNc#fEW@xPn`hZT9=EKeY*D4+Y)>YGCy z8{u-t>+p_$eECt$Bq3l22er39CQOo^NNj|_4~c*~4b>INQ5qM42@a%{Dvr91Qn-{u zb0ZR!x{p^Yy2@C`SaspkWViQtu7*7cz-a6tB5atpKp>M^uzXGX^qJ57;A>n4TzgJn z2V6HId(Gfv^Q{0+Da@iu!`Bf9EDCYlyG&?+x?{H&eyC|oA~Ho)5w1zTP=ZX6su5RM z%n}CadaGa!RQP=INmh}}k%?58c3+>d_+Pk^ZfTo3b?(Vy`?>1C^9)j(++a?Ws6vhq zxZAf==(rtLl1O z=3!N)Zlmto5fL&FM`FH7 zA)a&610CE$)ZE(5rEk5bk8wc`V1Zccdah;M@`5I{qtZUFB9VQiBCC)wKCbrq5gU?Dzh!ZX~WE zv<(646%{IdN`$C0Y@{LtrmQkICT(LTFW=Sne z5KyQVa#$>&G9h9&E|cgsEUT}IRcBG*3AJlWOq`Qxg7u|)=(1fi=AP*}oEyVlMUkFf zIjXm`1KN;du*-7$O8F5dl_B((N-^W~>}Nv8|Y^zUg)n)&8W3u8bKIS%46rjhJF~l- z*;$g}l3Z!UrDB5;KPVI-DMBHM(nm!|;ulfN4N)XROLDnxX5E+t2Ebx~LBn;Uy{Yc< zzMl6+zmxZw`>N|z6}tPi!Q}1g_wLPm@?@TW=FR-yljc2;lh(0GvQ4H{Hz*chXk(XH z%YLQbs&rd-w~{7^1kZfFke9`S?A@XE@u}%iCx$YEr8VABz2astn)GjoA^dQY!?0tM z8xr(Iqiim}p<*iL_OUlY(ibl=mt4%YuZ4zb;+n#@klfd=| zh}8z5m>?k!0SA*l@`a`=XSXc?lfXS!Dw7U<+A0KOrVMULnmpFkbFlC3W-UOglGl1Q z0y{=PIv4ixEoP{tvRz1}f8TNZpAW$;NCX{+j83W9(>v%ynrQ-eEsTffnpcOmGgO+K60I$(bkJlgSpoeD1 zA3T&z1a+`R;1MHGF6KP#T@HV!t!JQ^WgNjqcDZN^O_Y7T;nD$1o_UkHs%}yN6aj4NYh%CH+t)tM=NhI*n?|~8 zO}+wG_>Q4ZeO6L4WNMPaBN0>*^}tPXb{|2lW0TcPnGLLlZT5}a4vb{2K(VxN=h|mK z{T^EuZo(!F)tXOk0hHc4^xTwHonPCH0Yqm00DkO#cmIE4F<#A3wN%h z)A7pu*T*1hItwjAfR4oD3v~95;gwunxSdzCo?DcbR;v-X9|X#UY-o3kg*a;$ewFO_O(I+D79|3JP2{P$1q0lVcB=Ylk3Vj4Mkdq%h;b&sh{-{5XKs?Dd z^Au6@*>s#r&ffR@PKkOPo@A4B-nT=54u&U}2bLcUmD0BxJ0ffsP2blDJahyYrIlYA zp`P+Xv20(=Z<*=iE(A=D#*Oz(w@jxEQZ>#*Xfp>VGR9vero^el<7;!`)R4#*zi1ts zG_tEk2U(1m002M$Nkl91|*s1o4;-Bv?_(wVsy?yoLd^V#TlN!Az zuR`!t@b({DUrNN*in*+suAs~D$t%Y%lw*1UHi%uCzeR(`Z%M0`Q5X6bf=~-TBm|h# zotpnVy?nEjjp`1%Iq3KE{BDT5;j&qp@-DhV(Pk>P4sRWsB-=E47+};Wd99Xn^}kA- zRo*K0?PP}_ zPRxK{&fPfQEnp70TmEiL%<@JO8$v2kXcJiO2ftvxhpKCL7suVoHw~%fiiC{w4Jp<% z*G@LoLtsr+Gl3^Gd;=g`SZYY#4ddO=?F6e@iIAdbX8lbuo0fCqU%kBUPH|JHH)P}P zSQ|n%$QwF01R7B`O-=_sa0KqND%J|?ZauZE)?{iScb}M}Z>SFl(~nz`&-8*jqIx5wUyItN4nKc+7&ArOl_PS$&v%+VW_DX{I&{f8>=9R zv(3T}>d9|)LzS4dA${$3hary?vy%AWl5<(sAX}KTY{iBjNbP=(ZkY>03DK;}>_c@( zbTy?(we~W%iC~FR%au}V2=DAu^w*xHT0)I+4H<(IR4 zP+GZ=u?eYShK+`Rgvie;f~wl$8d&6ofZq~i!$W@XuUd%}HI-ZFLAUajZI3+4pP)kw z$6!@G$Trg!4IFDGr~+5N&#lT{erQ^ijDeDDZBY3wqgsrOC*~yhb?&l~2U4SC6|e@# zBxO`DBMC-8)z5}fU5$Sff^0Odeyv9eTPmrcgiOfq9m#&>s&FNf#!yO0RHz;0#YWYJ zVFD$qw3AhpgsSZ--!d_Z1jIU34Y=F@$VT&?%xftW*+E_al;?)2@te0QA|n3)M({RD zO&%zDghYpgR4zByU;+qO1#k5bsj`r=M46N()q->oFiucfIjJXV{3?M6p;P|T8ltZ* zU|7L@5uue6&61qtT$%+@$*258du8!>MMjETDw7gGNFdS2!$N>+RH;{zqBQkQnprBF zs;nwwlp@uVKjc+;$pela3S336>6Aj>uKPe^CAw4)rPG`%bczPWBUR#(VpX6bPq;A- zPWH)wQOW7YRSh@#FUda?ulk~53flz1WD#@Qq7H9N?7&p zl@MvTYSHVFT7M=F=C;SqM!FTq=xR_&Acyg3oEeXKL!jJva7XLdq^ca)$F~?MPv6FrGs62GRZ_XonT{BHu1rem`p^|(HQh>3uAeo@p^**OPiRAM^lL?KY!v6g`F-B z(Q>(5I=&8<@CQ0=4m-KXq*AG5#BOs?O!<7)>2lFGVY zKY*o_GI4Qp^EkNNUQ&riR^>MyA4#*k1*Z3X%gIx%9(h{gd_KnmlFy~9O;%OAJgjXF zw!gJmfr3>sK7YH@?dB=WW-{qSjCVF~AVfn!ok_&krCn-<6wj{JYInI1C}cD2{!GPV zQ!j(X@r~FRj$!v!Rk{k0{(b-mSlALT+;6oxs3H`4KCw{BQx#3Uqe_HZHiyq*w-!`Dfr$i?QVE%soK-5rGg<>Cv)3}e$<9%YNo+u`(f zwps1@)Ji_N!h%jmdk?A58{+cYXV35JmntWlGO$`8sCa|nXTR|q&;9a0Jo3Ufp+1XuuG5!2{q?_d z?3Hg0>^_o9CnJlqRI+MH8*QMwg*zVm%CDSw{ntkJAE&CV&rcnB;T!z$;PUj1y{BH@ zb@WUsvG%q9^uIg!{2TqF`{>x?tMmQ44j(x4`qbwiLBi;S51#(&#L;K(T>N0{=-K11 z{_3qy{>B^bJo_vE+1X$E`$t~>7W882&NaAZE!!J2(Rj@pe@D;Yv9n)0`s{1{BYWt! zm*yvn#XM3xawy?okHPW%Cl8!>sdr=-ok}9QI^XWG(tPCfR}Y?ip{sACvwtL;PC?%%4nMvB=-KXpaUR`xbQQJDkgw+D z3HpZRd%@(`*{|i$hw{;VPj&VVqksJ1iP+i-#CPn#af+{hco#~#`bWF_ zM{$!;k&d1Hg}qOmp{79>AQl)gJaGVl`1(rs;P|PRzB#=6NO%8;)8*ymgx8LV{U@O{ zcsLH7eie(l2Sz)(2YHYkZr`!z-WcD1qN8gNf@{pU?HC!nAm^#>8}iq z?W5-KhM7vn<#FB&5ndAD?t>EtJ9~$c@n|NM@cM(pdyces^##Hm-Tksd5R7nm*FpM6 z>I^5mOd{4bFiOoibn2zP;oW2p-nsASnSIC3Qena!z3eCyYVSVu^ea+WJ%eoMKpuLB z#>w-@o}*C4Y%*?h*tomr=$ZcEJ$9#q>NkGi#F5jl_KobNR?w%jr&#~Uu6;+(4(&eV zcDa%Xh;zvF9BAo?K+6m{}KoAYB7>LEhx}!6ch2 z(0Tm3uFi?v`W=hI6&!ydwD&b%-x1hbA+c=tb%yu95g32T(>Y$wr^>}_*YUp>oOsF8 zyWipIfE_~b?q;Z!d{fqNx#Qmr?R(wRdx$&~Q)~7>clU|k@C~2z^dEKld$Q}dOAK?9 z9d$^v*1a!$;A_6oGoFsI0{U}l-{@%!@eZDJxB~h3yv-dB@B3JWF0qK1vtuN?KFPj-Vkw+(=y=DzuX{&MIX#{E#G%B4IJ-0`L{hihdcvM*=#V;+0G-s8rq8$2VDNXVmew- zNLDiaczso&+$L9>i;1Ja>Bda}IH9h7m&d;{H%a?YCt%yC{bILU=bJPd88xp|u8D3N8n$%^8oZy!pM~!zuOD>92J6jTUmb$*Z5d|D!(~+O>c0k<%-4cM6!$-?#hb(1fA(+OULV9Xy1KM9d+W>Oo}|OR z^6|TomHC0ueV0FdC$YAMqmhoky}KWZwlsIUn9tw7cK-I&&j4y@Y%ffL2N{pu^v#P4 z(>He=IyJQG(4`OGYJ!Q3HlhbV)+g_Le_`tS=)PkxJfL2gyG=D%UYMd?zzayh-MIL{ z<&WOZ<+6CKs299Z5S5xua{N&iWPo~0AZN%RdE@;1=YRHNHbdZUdrxmHvU=^)_tutY zC-$G{AK5#7pNV9voX; zm_B#)`?U2i*Y>Xd#pxUJbeo^oCiU=130_^AO}_V+V1D=urUHxMnJwptktgp;d zKqe5Xt&=$WXiO+Md#JNp#vCXcyItlKP#kuf)RGb*4iaLxKnXf{bDO??9)I@G#J;t~ z`I*T};m(10Y;F41MVb+QK8J@CE;~PUeSY!^m9}qWci-?>xNDHAwZ1evap)A8XMPUu z)sNo%<6JiF3&~gqPyN-;etPHXr!+fMFv_>Rd+5ri??l&@F`vwn88v?RB`R-IkvwLn z)?#{X`Dg!ens~v}wJW`HlTxwRJlV)> z^yW_--mZ>=U&Bl1?iz>(gU1S)cv~U4eD42Auiof>>et;pdyDDyQaRJu zM^`H+E_j<=2Hej7`^5Ao9f!W@?LVB4FJ`0D(Q7}j|)%_o+<15c6X(C!x?wX;9`XWs5TzL94N$yJ-fCEk8FGHPxupJEtqwSD``)i47cQ|jm$xh{op^d}^|Swg?~|vA z{V%aJb?0ZRSN@`$i_sM`j0C${{p{bx?|cBQ^beoN#%9YKt!{DoH;|F0X_>hXZ9rA7 z_QVllYH#ZT2pTdqNx4RwQc(}ADts{Ctz(nQPBPE8Sb(AGTwPR6RW>O5M5tmTUq(>n z+6<9-q+9e+8D$Ozha>|V<4Fs4^quCC{%`qJ{^zXk7Rs*X!ntLEV{ffJv6?L z6nQ-Gm?-GTKPO@%ndfd4&+Mp9^HAa%GHBxTH$ zIv@&}T>y_zQX)Zf3G)0tH>HG5f2gaYXE+gCE#`8(U`Wxcnj=ajWxi#9N{B+foaLU> zM`lDioRm1);SeIBidepJaWIzVbn}TON*OIudE}e_{344JpD3wIwkdn5;i{Ia4-spy zvtrp3{AEBRrHFS{5CTj;zf3y1C$hT091q-nj0Zr}7IaqcM3eX^lM2^{CnLR(V2Gbfet-w|Nwb5D zy3g3Ula_69=7v$wrmn1Fk^X880;(U8GT^9`7j1*p8}<*KqNH%Jl}Ze47vi%Y^9)<8 zZYJLp5=$^ho6`sFORwI-C+BJ(p^J2e210wj+E&a4Q3mc%`B{7poAJ_WDjTQ9i@4tYiuipy8DlQ zQDf@0nMbQE~Cz@5`%?09#tTbM?l#x4-k>{O_4${HK5Nd()Rc zF@%j`AXTDv4vc^OAO8>0#hJ+qA535Uq;Gux!tGl(&b>K$=-KHj=hl~c!kzspWAcQk z;*&)x^eEER8*>L$1`G?g|K#E185S1=M;lG~zGKhtJ#v=$bNo2@rH_7c>*6`6?Zm;8 zPM7=YCx0V9kjR=CDu;ri#FNhBbmC@cqr@zuaERI`zIhQ{CNpy9g zqkm*@cn_YZ**jP9NQtZhMPQ-NResbm`NTF}w8HTp44qs;F%G&w=xOVybork^|KJbmq>h;LyeHE|OzBMp<))^kkuHI2q9LgwD9%I+u3?KMKtFJ3D`A+=S zPo(9NjPZEMGKI=xRV+CCy?xLB&icjgC2qgVR1+L1q4DQD-TPM0|3P~3bHj>`W8V!Q z`c`J~LgeZX%JPfY3Jmr2IDJTAYQ01_5ay>xcPVLb)sTk^_!ovGt5iT>05wPtM&r{?%{G(;_$JE-uOI=iWky*K;F; z8;sz5^46c+`uu}nXW!|s|0l8K1*)Y=jwlk1zxBoG_x|X2*XHj$^_5>8+;c>J)2yvL zf9uNJZ@o%`%>eh}R^j}PeTg}-50Lr3pW-_Y*$ zwS}3gGh2{1s3t}nyq#C^8E7L zZKe|}&fJtH-)3W@P*^78k4%(gB${GkwL~6@27 zx_s_!)`M`1v>=`F^<}*Bt4q_oN3mAJ$e3idR9cw1F?snD20$gNl2`J_35&rg^tH?9 zrf**P1f7h=qFt;+NH~|lWQ^+fL{}E6|Fj`sAWxt; zgv5NF%IuOXyaN~LCQqmouDo1|7CBe-K_O>h`3oAvrD)UvS&y%(LM2TlOho*bg#xoj zR_15uJE>{3R7!)uE=kFuibGlt`A-oqPFK@D#2kOfFo%Q9pY$nAFPDU8| zNA}|u!gI}Htb8GZ?~|on3)8oT9Js^91AT*6=$oI%BWtL{5jA(`>dL|llQRb*msgsAEo9$E6AoiR4&KI$U_{WSQd%AW@O_a8q7%EcD4?>8|!6yCa`mj(+k(W=ty2sEoZOr+*f`@m3+eC^0NHmi7Qbdj4}J z49H?8qO1QcE<%&~oiV^F@DdU8tMMhf>QJqd2&r3j0d5*HHA%TfP|4K;D{3ClSL@iM zvQu2uhNbcftxQqom`kn(LB&SC8e~i$s!G*pxgjcH3a#rOfAHB`f7CyAP^K0UD9I|3 zVo|Lxp;?xVFqFKdqi=X{@3GH*{0GH6OA1&WW~Z%}X1a`foaffY+a3Kkt9c^JGmJJe ziIq#y%DOdHYI}X^QIr6su$mlKDnOa6&gAya4y>)jket&8FhPD{=4L*Z!5hJZ$o8H= zsK)2-|1cF@VL$;1`f|y0DTgOR<)>=0B+s;FX+-MHfz8&@)gKIXPG0-e!OT!Q3sG(K z6AYlo*H^6$nQ2FzL!P%i8QqhpG9DUTTe)-flZk`R>^c1O{PZN_usBFE_&jXV@n9Q~ z*aeY+4dmsjhWyU#egdTG7J)1abJ;?Caq61*g_6;T%j50p8=_&JyM2|R6QO#l7Kr1v zzyOfp#;X@ik&zwQ_>&mw5arB2%qL@!_}WrW-v~2ML6kwpRBSbyj)AiS|0N?@sdzH7 zk}u@c>Q3ol@H@=hy6kd#7}?>)faMXxyABmH8D2%A>nmNZA;#R}QPvDGiQd5{Iu~be zW>d+Ypm9|fn zxjaqGFrf(4gJP&eExnzZDkBdKsEH!dktc`~MKKko&_lGbY92yQaG6xY9Whq$}3Gv2)c2bB%)|fY`rq3S7%Sdxa4#-b78KaexHlk4fW04<|=~$%RrkC7M(qsabNG zEoHN+J(oLFNcCk+&V9z}Z{Oev??8rXP%NZ`cV;3mNT?jE#mm`*p@CK_F!5q;Z8F2^ zoNS8q*YeIIgUd2iCOGkOdg&6&!{ax9vU=&yJ)O*(JVC`Kt0WJhbajlX(R0ZPnM4_U zG&O&|5St^&Vs){XKPKZ4RXW8zDY?ZcyhpLQLJF5WI}$J`WGS$eJ33!tvMHHl1e`7{ zwazkj(PNQ!Y-QSG@=?zWW^a}!b6~x^8YPi2{wl$8A?%xjQ}x{#;r_2$$0m)u?IhFN z%4{XT0AjJAW)8Jk=C7ac8{hYL|NDQznu!Zz4-O@`8yx~@DB^wY)AjtH~-215?!2~xqklE=kNCp z?UmM_`YszuT5tlvtEBo$JDig;lH{lZ5QBo`o6BkjYDsT;1Uiwh-V@gpv3DY6HTzzwRUR|?yg9eS0#%gTa zwr$(C8{2kc+qP}nX>5LXpYwj_eR{5I|9RiDXU!V?)~uP?KGbV7EcKWBP|uEs5BJe| zWfWW>d*+=`7F3ps_4f+}vO~RfHlD#*4i67XN#E~aWJq!RRV-rfH^y!i&Ry*v?sbOR zlBV(j5giRxeduL2eCz4;Y9kdBHSY}SXCoPAAth&S(d^LeHvc!pnGl(fTcsqokvg)- zlyNnN2R4NZ&T~T}79k`xt=In+(q0uvLLV2mu-Hu-q zxW~&*$Eoi_I^+3!3QN@60R}Y)o)ig7?p7EShy(xZbY;*!1=ee~x}l%&7gJ-nO)l+=r4dC^rlg11%UGU@0_v0{u|8i2L|;6) zjLRr5b-7fpIqQjI~_YUrG zvaHmdD)AYX264TiA8T?w$zfNz-IQf3Df`u?say4H{N=j?-O5W5e7Z~E;H&l%34Fh% zr}z6U&m>8*qLX5+;*@0j-f`8gBqg!(V$~Z_cr#KR?qkLqcsYv?UL!;^B@1(-r3?A97 zDj&58ksQEUUNmnCr1oUl`VBA$0&Ut4HOE8xQd3$nc=jugzRuDUfk+k>#A5?}tP!*8 z+(Zt8`(!ruX!;ruqMQMZv8KPgf_o0zFK9;_^@F7GcnrX^9s)UNyskiq_rUl&S~L-( zMFmFW>?oX;5|EJP%Vr~)RtbfLDNzpJcG_ji>uB=oPbrztv9JPnX}`wk393m>zx@be zfxp0B8GE|e-6z@{UMUQBO8$7DZnW1-Z5jC)^5AEuLkn7^Z^lJ1X<5}LNJ_v)sp!$p zh8Qc9OcKHndLqIJ72sg);%-oescg+W6?OtUvmzT*(EP+B*{A>mN`c}L#}&Oq6YWGj z)J$%TKUjWEw%ZayIWhA(caUI;V`K+{l_7ai(!3O#H%iTli4yD0o{9 zAC9J_LkL5n)ps}TVn|zfW%wg|GM{RH$JD6ta}Bq8sT9VB+tAh?1(8(wT29aMCOMEc z7xW)pI^DbKC^c$oaec2CV|5Xcm42slAgR-9Ot;5O*jxB0f66Gm&vxxGj_AStH3ExlX@%#oO z7x=%UhuSMh57Sb#XyRnK)9=}P6ie@CYz(RD3bIcdX=7QzdY0o+IGCw!#fJ3%IxDA! z3v4qZ+&hz?gh*(#h7u?RJGlf8;!W*9Q?s7(ZXA79$ptI5C@#RGuk|4mScBGK1@=-V zVQ~3;L#RL&oB7U|G_aj8Y4znA z5E8FkYrXh_Up(_;G8450b^7rOj%OP(6)GV!Yh z8v=cSQ_0w_4XU-_1a-yAZ{(~|C(STvbpjz^#dGbGhpYBtEOz9s5bH|Sf62Uv9gHZz zX0=(xwq1QWP5(86tQV5s9Q7qO+KL=R4%Fm;AmPz?-%n#v*jD6l?OH}KB2XC-{~-8M zwzNfVVZ=8fc3+U*AVYzCpO3%bXI@g=ZX04CWP>N4_VL~RV%fMor46BsRZ(GSyiWd1Xc<57~cZ0=;IC7{PE+% z2sUjKD|IQ1O7F(vgJJW=g_MX48f>k_)nY4K%T7Zxlxj(eAY$}N&8f(ZDvGOoHQms+nN7XvZv@wfE*828ZbV-soHfScp|HaiRZ$`(jHyvlg}16Sr(_E zL^4umF1g=RvRRr>gPypOR4*5CtD7T7)Ix}PqgV`$*3h*oG7BY9z}za@1B8yKL}op1 zzA=uHttVP1!1R=uet4Va$t7E_oBqPMp9a7 z+V998R$oEoNKt&Npv3l6%fb?M9eTuK+`VXvIH73L+#L70Xx1!V+|{^my&QW#r+(LqPpvd;VsVJFkr z`DMGp0z18*(}-|OzXUopMYEQP)tt4s2a~QEOiE}_vf1cZ1Q!G7Uxcz0K^t}H?=_5X z4Cw2rf4q%&Dxu>4sb3-kHa;d;7wkTjyLc@BljEy=Nq`frc~dY(YbsT%(pi`)ecW%0 zm9~jlu{Db-nqmU}7hO(ki1U!vlnoQ9lmfchigJsb#Gns%a(m^LQgCinS->%+?0Ma6 za>D-bwiM^R;y+9Jhrsp`h93qW{S!eljNpx&-W=cp!c`#=Q<*YQ6_a`;?OiFJf|YYQ z_5x#lLGiBXUjo7K6N%;xe6&o8eW@V+7;f!GML(&ulm68d@FR7R&&oIncJ3d+{fkXY zKi)IXc(7+B2ciSVHMe-Fk(;Dj;wDPD_K2S&oh8(4RKv_!O}RaqSjp+j zso#AyxZUDE3_gdF^vzNUx57Z9oiInNo0htz7YG|ee!&c+NMW>t=Yi<2hy9n-8G$Q! zb0)t{>=%iNOa3SyOE-jI{2+0l>3db%Zl$&AouMf*a8J#|JoT-&_@E;X3+U#`$&D3b?g1P2}6v$^Mogs!C95R-v9+_er_7R4#@fbB4}dxs25V# z*f9T7eLq1nfr&!V_#v}r0Ae-hWA$?}0AYp|X+9fZU++W`dcRr24R?cVe4R)(!& zAE84^C3YaqRT`$?U&)!1)t4^_NscQ6s0ATFEiOs2Ihq<%4ePF6M-rpT{`+@d;T$Ij z%QK7enRF|niPZ0#YT;&`*Ey4bI_#SGjIFgaYmmIK9b@rM1zHTz7yn-IvzdQy;WRtw zDb|dnx8%vf*M5o?wl%)Nr?P&emN3E{D!oL&jk2)wrB!}g&%7}AhHV)cDQ3RpL5|E{ zlH;TY9S^8>BOV7-m!k@{4%&RDS$`I78bCv+60*s<;@X(8XuX7F#uocu6a61K;!U$} z?O5U@i6}7 zQ}iG#dkjyT#`lK|b+mXZdg(SwvhfYxlzx5(Vz@)tMC4xqkY3iM9c~Rx&s@kcGuD&x zT?VK%G7DLNFrHVze}(8PynQX$E$N+hU`s-eh}x2QU1SVtg|zv{F()`T_J7}Z5>w;KR>Trs1>%_`O%TuPcKRCr!zN|?%!&?GabmbmVfEw(r zXcL0`Gh?6kl4z5di~ylm?q3Xy@aOP{4%er?G1la+T+xU}bcwgO%0t>f+L>qC%vR^7 zmKYnF8#C8c6Z4iE(;EkJkOvGxyomoL={jCJ3jH-aqw&TfA7T z88PQ}2~sDpVcxADJv5*EKfaa(!Vf0jyzhX3A>YXo5h~YzRQh?@d6RG#j1*HWKh<`N z$)*UQtveRn}Ukus@WRu zW091xS7|T(u3R=^p7Nx=P@9{voxw_g(I@`;qWHHQB7Of?-EuX_vQ+WHgT#U)rQ~O- zM$3ELxBVMBoh)n9rof=e{L(!sG|6{_GcuRk6@I4^7W@Cbxt5?8!L62mnrKpqTQm>v0yHiODx*sOEkIs^tJ^5vGp~4#Yg%!#ls|DgS(ahMct^ux&gE|-CkJi3XIeat z#2Yzil&cncV5=Ii4738QGNmYDUxRXBz+4iQX`C6|2-LO-u~0v>BGIDGVUaU32iev% z^Doh2cD4lxa*OYW`O+eq0wVDW+s|Dpdv+xiOd z`3_{vYZMG>wZ84vSS6m{{@5qXCqAkR0!4ZM7N;%;==ivezva7fJm2C!zED|UEAIP@ z27k<5+6Bzl5}LncY6{x<1-Js|#9Of~*#`)szWA?o1qXIVwfi3$4H5GgQB~g1k0#zI zr)ec2Um8fwrr4OGsla(w4>m?gVQkLFrH~0*)6HrP8rv61^8p0C@R5ELj${=+FjXu0uY7H{#7-|awk%>}8B3iib7%gvCSIZRbf9AY+a~jbb1u>? z;{c6q|ASA{%n3H6>Nj0%0k=p!$+!y_2ahlj%KsnD{=@%v4?*?U&$2D^E9S*pSyXr& zvrhAv9pU$^VWstS(8VWHuHN_T27r)Ol(KJX21H#Z!qNg8kXnqKA2tK|{SBpJx&I3K zSE~5c1gEuiN~}tws_)7V7%yif!)gbmI8VBjUfc{qh6oB4$-9n}j&%!az~@(&{aUm~uW z|Iw6#O6nXyh)8B40|pprh$iQCTXMRq!Nl}nycJO+vg!QLg0$L^7J}2ifjx%bBHpy2 z@V*vg+Q?L4c`O=JsxdHf#jq8Doyv_4X%66+)7R^<*3sS*AZ)A(QpqQ*^Y`0(5sKq8 zh;NA}9>~Iss{6r8Rf%+!R$6D-U&}W=c>k2osS1DmgLYW!>Y8HJ@Qr^CW0@88Z()gK zTl}?-0El_DTtI{wi7B7oJV)^x)Hx`$%Y{HHk_wqK4s*u&gMIgVeoSf{nP~JiA~#EX zYL(woLt_8EtGNW#Y+u_sFpY0Opw{n-M;MWc`}wUgL!}ljS*!0YT3s@bsfz#Y4FJxy zA8*=xE59bn!$Q^Eu|>FsWq1h`!iIPb&8Voqi!Q12Z+x!$LzkFmg1#OJJv4lM@=2jC zpb_#9fU32!>U$+Cir~V`+tg%KS42;=hGsO<_>^vfg!cNEKktr@_y?P!(#xz^&<7)` z2e#uUz_7y*5i5nclC=N=h)}hY<&F1Ei-Uy=wHwd#jNM=Uh!Y;PF^78X1;fIwDbaG= zoJ!l^%D)w0rTx-3-ZmDkFcIX1>0~Xbr8ZxCP(j@&lwPv_WpfyQ!G64%ohc*HWCyLj zu0)ucaZF@}06YLtn3}d^OwFr5kc6}z=cG~z-s|63Fg~*T@cVRi$)wNt1p`uDIV3Ma z*YJNJsZTe2<0Ok45BgUESH}tC7DiZx=71E#Qp6XHzg+lUShup_Y>p@S5iyvVGv6Zm zjDe93z((~a9_eQ*uv{pVSee(jTTq3!kn8HCO~tDM5#L+2{xP@4kXXlc;C&F8;}qj-TeJ*o80C# ztZgDF;wI1vTZ{e==933yCi2@K-jC@oNs6cbRUV9rfsqPw0_I#J-N z#<=bAYyzy-*S~U6lC0~J=YU|W?3yBDZ>1L?{j6oLU zpvAe(6-x_CaC%c?l$p$?Syj|oH*zXa9y_H0!JEYpigO&NZz7_^wtKZ=HB_F+T3us7 zi30D`IZu*Fs!o+j(&ukG?T4^DAu6BaW9rr#GmreOc#?xq9h<7mA3B(-N$O>9_-a{;46*~xwWSjzb{#wDZE>x>VIonNH~etEfWR1^VXP0L6FA|6u1$lYQkpKVEB4m))=sJ~ocVW!xD!ntC*yoC(kS*FU z4)aup2M-aa8@B{m1d{95hUzm%7TWyfXrG=1d9V90{N3l#I60Zgplc=(&rH&POp}^N z1=+U5p!Qld)bMdiB#0NpEf8}IB!>xwFOYMPBSR&|T9+yPmRV88{}!@lsp*i-N-myC zdfG2fjPiJ9#Manp@JT7%A^*ORxG@Cn6B3E>P9cyfjeATDkAeV&0@oHNZf7LSp6B z*Bm1AFtmz1E`$fVvr>-r4GnVcrzAk2j0y1?C0~@o>MY4XlKKzwC&@gbGu z6?w>c*;Q4CR$}N1ivH&$-JOgEWX5oEvwFOQWrbp9X(m??AFHg`P+97f1eWv;Yo^>n z5?L3g*M&X^Y8IxXBHk7J1sj*0Qn@W4z16KJCSB;HmWsL2FxFa*NRGECaDGNvNQ|&^06Q#Tc-%%lz}4#kxYss|I`O`J#${#tPyJ#=hYkFsPAM~Plaos&QyT`8-W&5q$xGs+& zc`63Zr?~IHu~1>ekzCJ#^<3HokLK&;oom>$er}43ho`m=ZT7@q-We^)$SaCS%lU(A zM<;KttZ4sINe+%q_uhlt$`9caNAm2k7-zg}8fBb4=AypeW^l{fwFmax>3#SNtb&dl zUV;3uw=obou)C=d#fy+m6u9Bu*rTZ0kFEWXq%;)+R?7 zIk2Zr1`lKoCInJ0k(}MBPlURe+HnLzBSx#n`{Dx=#D1>K@l3*FN>aIYL~(dqBAB7G zCdeT3gOp9PKTs3J^MY0g%(O%hKYL1c+BzA~^SW=J;FD3h>kzDI%`ySR$&@J_rtbBR zHTz|Q0H)%WI~Q?HiwI;&R5Z>6&J4GDwtpsnV@n^iarkOGH+|E1!0;@&erOLNMvnZO z8h5{BUU^XMC*l5(^()Z1Mz) zDH%##3DM^HZ|WC|VSVZQTa-2mSxTc55Yy8U$ejYs)eG2FPQ2P!iHd2C)yxlhHn_7| zwhp6p+=JSU-5e^BmhU(V8Y5}sWD2DIHO2~Clx z9IyF~9YV6N|GqlWv`5FNj2IwFsAKQYry2FqE1QtWs;-RDCV_L-i5}P?J*a!`wJNz2&mLb4^50mOGjCPNJip*>T|L0jMG1%9a9OYm@1?sqiP! zImcWPP^+LC|I=T2+QKsUfOD|qs2|%PYjU}xKqI}?3eCj%@wSw7RMh^_J!8_<`g+B% zQ`sqKIdNf&<93)he9F(9*p0rl!qI$G!cdbqAS-ei%TV>3-4;EMQD_1ry@{DA9Indd^AK1sM|QEIIMI7j7;uAoBv=J|L7R65_mMhFDmq}~BK z6R~|REH*&$-t#=Zgt>cO&4<_A7f90cS@qel*B(vZ>U?r+yyyAvfop1C0!lSC>%dYJ zv8s69=2w;wXBPOWU7k`^atB%*!w6xsTx(2hfxR=rs$3jlusmN9JA$(z9UTky=qy%h zKTl9)I3L52f~DO$dX8VjKaVdMsy@{(w_UfEwS)WOLquS+-4BjaRocJ@xjt+?y;38X zQFQ$EI14vA1i)oF+h2$0w0$7lPw&B`JMJWOmlt??{nH{UVI;9wUk9u1VJ=T`*93CA z+lL-;>(;bJ1Pv`e6~0fu%wkc2mhe)8i#%en-;XYT7*I#kAV)7-MZJ?`Z9UFAWOnpb z8+pd`dBDEW*t7US39@k}p`^>O7B6=rCRBq## z@?1HEZ=_04KD9o&;Jiv7?btjAMQNNntID~4(sWyfov6NkRH#OQrJ73=2eM-W(=CggcblizsPDBS z^3*Hd$C&U9o}OgwM@%ZF5S*JuSAJDa=Ux+Y4d6dDMhn@ayoyrP zDGc-AS<^X|z3VAMHh#vTVuU^j(?dhKbo9K7kWv zPA*}hxU#id%pRTUabJwN=`p#V!m&ks7Pfrmu`x#a4|P-DY2H+NX68P62#m@|P}3XO zPXL`L-rG((TRWcQ@}eSbSuYwtV$`|~G5IptPJAKg?di*O`1wJKd;q)fRc6CC^J42xu+b+~C5{EwX+)ANq_vj?fKJlE&XX!7^g0Afm`9P_@!Ii_rT29G+ag<=`!U{<{san? z$L(lJbcvppnZxb5&gC;hP!7)GNb2;>gGW8Bi>dQ+e!JiA4Aoosy%J6S{uz@(PUjhx3f&JJXf|a_P0eo_m>;m*(}RK6ah#tyTLwO4tu~+^PCLe{Trol z|6{~NBEHrGOD^3D+>Q1haN;cqZ4N9K9s0yZPG8GmX*R^|uN_1shjMkoHlBZU*y23q zY+xG)!1kKhxm7SnyFRP~nUY49f*fTpK$3)Sx$$_vZcJ}hy#&diR8}O3LwW*5ys`Rs z1PE5XlV+zlxM0_FbVNPKxtN+>cWgDha`?Atj|?1PbyjvSt2OI#H(>b+-D69Rds^Pn zILo920JmxDhj{L6_*ffElQG7)xSm(WV5m`x9ilh)t&p+lHKvev%4_HzE7E1Bc|3kP zy8MQT=zFwMaHrXY+PA) zc3j2orCtXr!|tPUr7Q3VJZfEAJC_DtqWM(PKkb-)g6fH#3q8r+naSXJtbz({>16m6 zay|$udh}g5$?`bL_E;VA-!swOWJc9p&D@bIYhq|}9XY-FK6`yH;gb+e6XSH;V6*M& z{ychG)OC4^26ySjRp(rkfutiZ(81{b7W8AUx4O$a-C{>8NaIWl_e7aGyVWW^#Rj%? z`d8^u*~2Zrl6pywnE`8Bb_M1B&36hze&hQRf%b!ljKiA~LWBM%FohP$)!$GcM0*Vp z(tE=y4HZ}yr??xB^Dn!ScvZ$8^=eRoj^s(hs1E%7hVmf=7Pg+0=(nyQSNx1+(~TLd zwZ8`Vvk;u;M?JYm7)T@qV(IsEJvm!zt2sS_QQOE}65jYU(36PbVl|XTZ@@%EEuGwq zyp!~-ku#65QK^xn1nI=!O$G6QQYc>J;(NlWZMhna=K0$HD{Cx zMmXY|4ZTxaYHL1cY=6_rXdTq;{Q7Cc4ANH1mXYeXcoJ(ClHyN4{lf>k0u`!2G7V@) z5(q2cQ0c~>9M2pD+^G9Xq#2nyPpszDm_gsm^?KL4ao{Afsk>4{`pDTQm0C|ddvt@+Xg zgze4PYEn9LQzB9A&4g{x7aHi|Ws=aFjYu^M+a*9KxWZ3GOjQavNM}E0H|-TBTFM{o z))TCAQzQ-%En1E>L|JEgpJGXCY)S#Qta{+FtL-oo)`wd(tYf3 zz&|?Y;Hwd*w~$-|LBRGJiUCT)0n%Z6Fu$wBnjs5y;+YT92T`c7%Y6rzH7r~to+x;7 zKVUoF6k=Nf1E*eT%^!?`?tsMwNFzox9eL6n}NmD zyPSPJSL(<9k3H69Wt5{F-(UHPs%e>)m**Zkm|Z=lH-P4P>B=hBj!i&ibGzSk;G<89 zR8iSUNd0~!GMn?z@}@yVh0ntru3!?%IrkO-$KFR@7=8CRJUn7xq2BZNd??!r687-g z8A!z>w*U^jDv&2jm)dG^{^%Y-)p>oenUc|Jdl`|5hcwoR8`xQb98A=N^@#Y7OE;VZTT+xm>lA?k;;rm7+kRke!OY?dgT$cVf*!XY#nvSZJp@N3SH@g=CMUU7XdN-#< zb4!!Aie=~I&;^9#2IO%rxe2uiVRUyhULyKs6iw7#&9$^E4D}+ZU%vG!l)(1bK2G=d z@D|^$7G2UcC|J$}|C9cFnkD!_MG+jq*L3O8x58B8eJyiaLqw1utn#7cE}N!!y|lam zB%HA(ZkFD}(#AdD$(QGaq6bTayLy{A{p7H6ta*_tkd5Wwg+gk7KFAR@?Ypsn)AAv(?mg}u zq4``k-B|_Od8bpDY*VT8u1C#o_2{(1iM?{)^c@pkxHzJGpEXrBnYFt3JI zaOfw4eWe*|qTx=7!Be9al6uyst4FwRq{z{6VucU*JRY}*N=boy?Hq-1GXSh4N&@h` zSqIljA;rgW#jX^2WpzheuYA>c;chV=+3fEpZ9FlU3!2wdYMJexC+pF3HKu{yBU(aG zk;*|5dAziEI1^IZJq~6Mz2fpe6Cq-OI(M%Z(zCm!4E+Te)!{GA&74nH2jILDLMm(I z(_KK7p(fVTjANfaigcvAd%r5NsfsXpoSExe4Zz`HZ)`QbR;P^UeNQ)({3z=qWPw)vomKm*f+|)ucyz1fA+>y~l&qM1cI%(C@b*~5mr9Pq*K%za zr{BiLdFCBv;1*JP6>P~WFZ|Sr?GOHvhNWIpXHVmXJM|H5;@M^RqHAd>+{sy={cA4k zE8Jw4WwutEV(go){QhsfC|zRJKUITK%?W;AvlD z2V|>1wNz71=-9^i1Ic9y&*rgmzc-NIoT#OK|E`|okfvKlNpiuTf@(ikQIy1FilY|< z$5@P7r$;C)dP;=JTX0qt(uD*DxdTr*TEZYKh3ouhI%~ z&*vP%M6^Um7ViPoLKWh@SSX%%JN(*lz=z({;z$IK3+=1Ln3@a~YFCrtTVjU7*3M;r ze3z0AESED=g0@zz=(NSn2and}Y(2brLMT=XYs0)qnE>Qijq1m5p#oald#+~Jv5nDJ zGpSKlXy3Zi0K;rDA}TOrmH1I8*4~GE&R`f_ob=^fiz z8OJ0wz??_2#G~5vz648-z&t{)WJDFDVy;N`9ss_obK_TR2fHU(t7>K^ToI(~=NUqr zWe*s`5U?6M7Mod2*;BbpWd1~=z=fQc=xTMKN!(UX+tEs!`Bmls&X@}ZDqpp}vfoGp z*WUYe^(*m!yze*rnk2F8Os~Fib=9mc7$~QfjyTk?Z_7l5jEFa6gSi6wh~aNrte-vW znP(sdubh4{?Si#kF%ze^45M75L0 z^xz=-o!aPJ@1}y0pWlVg}J&5r{vcDBn%y40ZM6K zvtqVuw;gGL0{v8urg5m9rPuYcgHE3tidt%91r^^zDE=+l_qPaCnu+x+R!8@@?h#Gq zCR(RRb16Y_w3ps~HXP*QJig!UI~{RwGpKTpxz5fD5XU=m5>9U*HY>slLEovm)y z#+cMDr$nkS+X`&=!?J3u!hItAGHxH+r5+P!Z1*5HBnB25L}}>+9HW5RLibR6l+h<= zY`0bGn%Ik*b3&*lJQ)w+hkBQXJiUv_L`!n)i*vS*H)Llk4{Fa#^2!56!^pEyu1 zyRipRS%CbXC&-<0^5HH;cqgyNV`yy8wZA1Elf&)o=o{k+nZw7md(-14Z8p^j_7xGSl{_s zB^1*!K}kf!(Lf&GcC@`QPlw)&-nfAan21aWHf<9}9CGFFV3MDcJhehRGDXQQV6Pm} z-bD#A$n>$t_u2VLHr0)-XZ>4BC7MBk;^dAnvuv|+%8VKteD>57SgYsPsnMgZ0$(9l z##0n)%UD42im3KXPCn{l)kJclJ?_MzW#({af`4(gUjnA8dEX4P=hL@gj0}oDEKjh2 zYd=>p?99yf9#J}7y1iW1wKFw1MjlArNmc)zKPRDNeuU*rRO=YH$(h{q!JPh9a=%=` zGO%Y+<7aMs?P>bSg6M!css={RqBxxSsBA1YIgyO%$n858x#IbSyo}ryEeeYj9l}}b zWd%-;`9qc^gEAfEvFfF4bRpM#JfhtkP2?cp6!YTT7!tNjn19E*ki3>AVh9(ITn4A{ zBdaZftHN-0_WI^BycmSOA`;UQB#`HUWlfWh*GhkM^L3@g*efv8OViJm1hhV3$^|a+ z>zc=IEVA&F6}1cPvL6M)P5*0zWz;bY;V%ls{LLM@>@EW3b-i3x~ylx(PZGDoMC-p*r==)D~kcYBL_=8{w+~Q4Kpo5#BF2D!$C?`+O#!T?xnUcFu z(L-R%s<|@Ta*Rt3#s(C}kxw0hf-9(XoW0oV+|z|XVSPx__h_jjjFZM(J>XU{F78ez zG#z8x${p=oE-8@dM_Q)F3d$)MHHQZS34YD!+XaD*AirKGP!T;~{_L)qUs<3#yg;Kl zoQ)vfTeAZLUxtYP?UB(b9kjNvduNwkmiYlCAEVu>EGe|Eg;aTE%Z)8YqaD=8=I?)g z7=jerTVESk*p)sJExyuR;55B!9@D2mAhg&Tw@^W3(8Jop(<*}%ljPhwNi$$0K=22`uMk3??n9CfK~P{a#48YfCs%ukFCOv{vaHyWfb3=x|;1)ZIjvghgwj1K~3yTilF0~qPCr5WFby4H`QZz> z8kx92ZHVQb8jNz19FTS1cWSa2(s)*;Fo_HhI0}9x-cDbl-B4FytlE6^AP9w!U0%`c zL{vPx7xTjr71k@7ezpj_y~N=5AYKO$(?Y3P(Re{3jDOdNiAt|;X2eILXh zK!~hUp!q!_$-y9z6%SBXd>X|9F0-_GBTQTbo-^P=9fXIOrf6;~l`}-thl@FO%vxaV z-0eY0aBl^C!hKN!@^c@km^(kP2}wKhgIGK|M6(M(BI7{%1-2rW+C&x3xgl*h3-Sb` z3D-1C!7D)GXLXK4^6n4{1^CK;35K;&-C3-nhJTOzX(8NGT*cy5d8kRLKx)zIjXtK@ z&3?*CcvOv5?;~j0ZF4LgcoiO4%#{6lc^C&}$f zY-{@jDinBL{x&-9aQ8mlj)8PVQ4R5#xfE<8PFG`d>vdI=jehHZA-w~;%X^^)Se_-> z6y6j{<;BeR1wt8%6e+EXZwk={<@&)Vcn5y3Lz2_V;O#qPYxt>O0LS>6RXY11T~Rq1 zksis><^)M}J-K*zmAM3;M|Q!Opy*kVMkFF&JZ1faxK29h5~Z3S=?-?L%$7;xWFMna z+>_u=>WYd5{h8ZjZq=y~eWJ7AfJs~!IA?}MU})+Ww0YGP_XLm7+9m`#?;wt; zcDebbXG}??2hjMxr0CGK$|9>(7 zP2~cPWpk{8j!r`?6s0M052pP7R)zHF~oPUZEGZ+NWaJjroGc#bAMrW zfVE8lg^c;~pJzOoca}8GW|X*rj6%YS4mHj)t+GOlVt6$MY&W44ar%ZyWv(|O^;DFB z3R*sGCvzAklaLqqKacG$Xn73-m0RyH`qygX$Vf}l3JrD*{={2qS=GS?97+M1Vj0stzoOO7+?#k-`o1X(oP#)S zm+Ze3*Wo|`U!FZ*FjQ9HLg;?M3=aKSFebrQGrwsujFVVP?uo0=I=2Z&B4lXKQBRzU zF0Zq)O#Z!Wm|%R=xemyng|h94Xd!68(z~2^r0j~Z2q}x17W-d9pM=QA;8~m_P1ol` z7EjbKSzWP!eW}faV`kLedJDQl9Z0cvJ}y0rl85WFE^@e@Wq{*$H+qftF~Bun4qRRU zCwAC`LtJ~6%&BP+1F%1+2QtU^|96xZ_>l()jkYc-KQ|cpR2a0FhVbQ#f$l?>83aoqe)1>fzVf24uyCxlOAr`2}7^M)XS85C6RB-qvl1Ofekvv_>$v_FdCff3=z2D5szV)9kh~r__5r10vLVajtEsJTwL1#`9APP(jPit^ zKSh1%nA}uBqmUjM)FjNKqFhMw&uMO}qpGXP!1m5g8Vvf?#YJ6>VN1a7VA}|TB)bJ zzPa(cC+AW$Qxga2^3+xHqS4vo6uU-+O z+a1XSM$`Tv7^l2tZc7mn%?SUmoiqPt1MT8CZAnR}B_-1-QF%+WTBf!`)lOOlrBks) z=va~|A)>LBsJ$h_Ok=6MiG;2~iCQX_#5P7TXf0_G5h;pRbXuY9sPV(w>L2mm^Zf8V z=XuV(_uS`)`#JZA3;ubFGTGlts(KM6nM6PUkGk#_DMdE(FHgrH8FK!WK9#j*tI5A_ zcHvehGZWr$l0~XucO>(#Gb#TK_Vx1zDjt0hqSyQ!7)t~Jov%c!uq~24sSDhzr>?;C zkrh=~mon1Z^*m&4JMkUnvCY;c0p z8&qY+V(a1jWTx1;=FWAivayEGq|=~4hXBZ&w1@0aH0S!8U4~Vfgg6q|d{cLjP$mIr zCGL-h%ccLr99ao=0^q3iQ|jJ|cRN)iTxOml@nwwxc)d6VE_VPC9TF_eP zbk_;fHfmQ%GVmGVbe5jRt!izU64ecBX=;AdaQ?ycoewcFcCyfv22(8lUL|D#LztT< zc-m|)cNf@xT7{;@tc-5ct{EtBMtdIu4ZWz1^FU$ZybC00XW^Ck>J#6aR&({6+wkby z*J3g^c?x;*b?4D2+-kB2{N1uAr{$R>zV$(MS(WC~4(|tJ1dc;%BC<)95Z56+HtsVO zB+yp=;dKAFZ0ml<3v9pE^O!jMaImD)-{9ik9Oh`t3f>MGS*s@Bv1Vxcs(jS-r*X0( z8BtQqLOBYjio>4@M4}KJ54H4q54B29`?j1tC)X%I+IrQoG-q*PO(UI2Gb&y)hzsK0 zEfw^KQwpd)aAZu7w8g!oTTPpr+{O27_W*|AOlD?7N1a04@vmzuG%B2Iji-&97A9UtY%>>Vut`wSynd?UO8t{h@1vl_-sH8;ovRf7zX3JhlndTg1Q{j8)yw&CzZC4Qefx8%?= zQdUJg)VJ5tnDY1tWP&K2&7B~?!%Uo>_QB_qSKh+S(##?6|3;%-P=YfTP9|*GALuep zc-?><83Sp`L!uF3u>d7vGhY*%url{!ZlU~OG*~4(irIrwaJVmT5=1=&RSP`#^cY_v z5et;59y#7JIGqTKg;Fw|nof6P}@l$96JUy^9xXFJ!rjzFzt%(7KOwn_!4^4hZw`3fc2ZS6*9(;fu*b z?=I8m$aXF%UfoRZe;^s_JZo5bLm!|$h1WdZNTDFkef72@N)`6Wm0FjjkiZLyVOH#s z!3p)@z@(2?OT90J?n0za8s#WkIve82U2`;aEAfi-iBOBM4gN)$iyZO=kv+a-VYf5p zlmQB#*p!tbwR$Hb|2*C1nzEjjhb-n>@S!azwEv;^0Jn8O_NC!@pWr_Sj)m-Env8k66!yd9GSSKJF)NKIKPh8w0bRxHf&YEnKVJy@iq9`T!K>G%7o8J9Y6u9 zGq)^b2JogmdsNBV_u$zb(EoDsJ!KefQITi7Scb(B1C1Y-7w+C?JA9NPBo^^eVbJ^5 z9!+e8>3Ixqdn~UOs((uS6?u0AO)c%$hgJL_(rsVALAdQoJmop6f1~cw&DR4x8M`sg z&Q`1R&F|&;4%&R0e=c=y1nv)Oji@^cm+erA39KmXS|6~GjCY|AdF_<3AV2#c55v2)HIPBjj}>Hh*;2Q#1m literal 0 HcmV?d00001 diff --git a/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json b/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json new file mode 100644 index 00000000000..ecc3932a61d --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json @@ -0,0 +1,50 @@ +{ + "id": "advancedbackgroundchecks", + "name": "AdvancedBackgroundChecks", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.advancedbackgroundchecks.com", + "fetch": "web_extract", + "match_signal": "result", + "by": ["name", "phone", "address"], + "url_patterns": { + "name": "https://www.advancedbackgroundchecks.com/name/{first}-{last}", + "name_state": "https://www.advancedbackgroundchecks.com/name/{first}-{last}/in/{ST}", + "phone": "https://www.advancedbackgroundchecks.com/phone/{digits10}", + "address": "https://www.advancedbackgroundchecks.com/address/{num}-{street-with-type}-{city}-{ST}-{zip}", + "person_profile": "https://www.advancedbackgroundchecks.com/find/person/{first}-{last}-{22charID}" + }, + "url_format_quirks": [ + "All path segments lowercase, spaces -> hyphens. Name: /name/jane-public ; name+state: /name/jane-public/in/NY (state 2-letter UPPERCASE).", + "Phone: /phone/5551234567 (10 digits, NO punctuation).", + "Address: /address/123-main-st-anytown-ny-12345 (all hyphen-joined incl. ZIP; abbreviations like 'S' and 'Ave' kept verbatim, not expanded).", + "Removable unit is the person profile: /find/person/{first}-{last}-{22charID} (opaque mixed-case ID). Also /find/name/{first}-{last} and /find/name/{first}-{last}/in/{ST}.", + "NO 404s for plausible patterns: an empty search returns a soft-200 page with 'similar' fuzzy rows. The real 'not found' signal is the ABSENCE of an exact-match block in the results heading, NOT an HTTP error. Do not record not_found off a 404 here; read the heading.", + "No anti-bot gating on search/result/phone/address pages (web_extract reads them fine). Site self-brands as 'ActualPeopleSearch' in FAQ text.", + "Search tabs: /?tab=phone /?tab=email /?tab=address. Directories: /lastnames/{surname} /firstnames/{first} /people/{state-name}/{city-name} /people/zip/{zip} /people/areacode/{code}." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.advancedbackgroundchecks.com/opt-out", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Two-step email-verification flow: initial form (radio 'I am: The subject of the request / An authorized agent of the subject', First name*, Middle name, Last name*, Email*, consent) -> emailed link -> full form -> confirmation (processed within 45 days). CAPTCHA-gated: Google reCAPTCHA ('Recaptcha requires verification'). Verified read-only 2026-06-30; not submitted.", + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/beenverified.json b/optional-skills/security/unbroker/references/brokers/beenverified.json new file mode 100644 index 00000000000..8fad47fe34c --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/beenverified.json @@ -0,0 +1,56 @@ +{ + "id": "beenverified", + "name": "BeenVerified", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "beenverified", + "owns": ["peoplelooker", "peoplesmart"], + "search": { + "method": "url_pattern", + "url": "https://www.beenverified.com/app/optout/search", + "fetch": "browser", + "match_signal": "result", + "by": ["name", "phone", "email", "address"] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://www.beenverified.com/svc/optout/search/optouts", + "email": "privacy@beenverified.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email", "profile_url"], + "deletion": { + "via": "email_followup", + "email": "privacy@beenverified.com", + "kinds": ["ccpa", "generic"], + "notes": "privacy@beenverified.com is the documented address for opt-out, access, deletion, and correction requests (verified from the live privacy policy 2026-07-01). Controller is The Lifetime Value Co. -- a deletion request here can name their other properties too. DPO: dpo@beenverified.com. CCPA window: respond within 45 days (extendable to 90)." + }, + "playbook": [ + "Opt-out tool at beenverified.com/svc/optout/search/optouts ('Do Not Sell or Share' footer link; the legacy /app/optout/search path serves the same search) -- clears PeopleLooker + PeopleSmart.", + "Search the subject, open the matching listing, and submit with the confirmed profile URL + contact email. Email verification: poll-verification picks up the confirmation link; open it in the agent's own browser.", + "ONE opt-out per email address via the tool; for additional listings email support@beenverified.com or privacy@beenverified.com.", + "FULL DELETION follow-up (right-to-delete, beyond listing suppression): send-email --kind ccpa (CA) / generic to privacy@beenverified.com naming the listing URL(s); as the controller is The Lifetime Value Co., ask that the deletion cover affiliated LTV properties (NeighborWho, Ownerly, NumberGuru, Bumper) in the same request.", + "A separate property-search opt-out exists (NeighborWho/Ownerly are property-focused sisters); note residual exposure if relevant and re-scan the children after the parent confirms." + ], + "notes": "Opt-out form + deletion email both verified from the live privacy policy 2026-07-01 (policy dated 2025-10-21). Authorized agents: signed authorization letter or CA POA emailed to privacy@beenverified.com; agent-submitted delete/know requests must include the consumer's name, valid email, age, and address.", + "quirks": [ + "The 'Do Not Sell or Share My Personal Information' footer link now points to /svc/optout/search/optouts (observed 2026-07-01); records citing /app/optout/search are the same tool's older entry.", + "One opt-out per email address through the tool; email support for additional removals. The same browser/inbox must open the confirmation link.", + "Sister LTV Co. properties (NeighborWho, Ownerly, NumberGuru, Bumper) keep separate opt-out tools -- do NOT assume the BV tool cleared them; the privacy@ deletion request can name them, then verify by scanning each.", + "Right-to-know requests get an initial response within 10 days; deletion/access within 45 days (CCPA)." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/clustal.json b/optional-skills/security/unbroker/references/brokers/clustal.json new file mode 100644 index 00000000000..c90a6fdfd99 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/clustal.json @@ -0,0 +1,47 @@ +{ + "id": "clustal", + "name": "Clustal", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.clustal.org/", + "fetch": "web_extract", + "match_signal": "record", + "by": ["name"], + "url_patterns": { + "name_index": "https://www.clustal.org/people-search/{letter}/{first-last}/", + "name_state": "https://www.clustal.org/people-search/{letter}/{first-last}/{st}/", + "record": "https://www.clustal.org/record/{first-last}-{8charID}/" + }, + "url_format_quirks": [ + "Name index: /people-search/{first-initial}/{first-last}/ e.g. /people-search/k/jane-public/ (lowercase, first letter of LAST name as the {letter} segment, hyphen-joined name). Optional state refine appends /{st}/ lowercase 2-letter.", + "Detail (removable unit): /record/{first-last}-{8charID}/ e.g. /record/jane-public-a1b2c3d4/ (opaque mixed-case 8-char id). The index page links each match to its /record/ URL.", + "Readable via web_extract (no hard bot gate as of 2026-07-01). Rich profile: age/DOB, current+prior addresses, phones, emails, relatives, neighbors, associates.", + "Name only: search is by name(+state); no reverse phone/email/address path observed. NOTE: clustal.org squats the 'Clustal' bioinformatics brand but IS a real people-search/data-broker site ('Find Your DNA Relatives'), not the sequence-alignment tool - do not dismiss it as a false positive." + ] + }, + "optout": { + "tier": "T0", + "method": "web_form", + "url": "https://www.clustal.org/privacy-control/", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["profile_url", "contact_email"], + "notes": "Opt-out at /privacy-control/ using the /record/ profile URL; support help@clustal.org. Verify the exact form fields + any CAPTCHA live before submitting (requires flags below are provisional from the site's opt-out copy, not yet a live form walk-through).", + "email": "help@clustal.org", + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL", + "confidence": "curated" +} diff --git a/optional-skills/security/unbroker/references/brokers/clustrmaps.json b/optional-skills/security/unbroker/references/brokers/clustrmaps.json new file mode 100644 index 00000000000..988aeddd6e9 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/clustrmaps.json @@ -0,0 +1,52 @@ +{ + "id": "clustrmaps", + "name": "ClustrMaps", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "clustrmaps", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://clustrmaps.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://clustrmaps.com/bl/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email", + "profile_url" + ], + "notes": "Address/resident aggregator. Opt-out at /bl/opt-out: submit the profile URL + email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url (the address/person page).", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json b/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json new file mode 100644 index 00000000000..a592504f768 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json @@ -0,0 +1,53 @@ +{ + "id": "cyberbackgroundchecks", + "name": "CyberBackgroundChecks", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "cyberbackgroundchecks", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.cyberbackgroundchecks.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.cyberbackgroundchecks.com/removal", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Free people-search. Opt-out at /removal: find the record, submit email, confirm link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/familytreenow.json b/optional-skills/security/unbroker/references/brokers/familytreenow.json new file mode 100644 index 00000000000..5700d57d01c --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/familytreenow.json @@ -0,0 +1,50 @@ +{ + "id": "familytreenow", + "name": "FamilyTreeNow", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "parent": "familytreenow", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.familytreenow.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.familytreenow.com/optout", + "requires": { + "profile_url": false, + "email_verification": false, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name" + ], + "notes": "Notorious free people-search / doxxing site (no registry). Opt-out: search the record, select it, confirm removal on-site. No account, free.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Select the exact record from search results, then confirm removal; historically no email step, but re-lists periodically so keep the re-scan scheduled." + ], + "est_processing_days": 2, + "reappearance_risk": "high" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json new file mode 100644 index 00000000000..3cd7c90b1c4 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json @@ -0,0 +1,43 @@ +{ + "id": "fastpeoplesearch", + "name": "FastPeopleSearch", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.fastpeoplesearch.com/", + "fetch": "browser", + "antibot": "datadome", + "match_signal": "result", + "by": ["name", "phone", "address"], + "url_patterns": { + "name": "https://www.fastpeoplesearch.com/name/{first}-{last}" + }, + "url_format_quirks": [ + "Name path /name/jane-public (lowercase, hyphen join) was ACCEPTED by the router under challenge, so the name pattern is confirmed even though content never rendered.", + "Sibling of truepeoplesearch (near-identical removal flow/branding); phone pattern is LIKELY /{digits} or /phone/{digits} and address /address/... but UNCONFIRMED - do not assume.", + "MOST aggressively gated of the people-search trio (2026-06-30): both server-side scraping (Firecrawl 504) AND headless browser (Cloudflare -> DataDome) fail on search AND /removal. Treat as fully blocked; needs residential-proxy/stealth browser to scan or opt out." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.fastpeoplesearch.com/removal", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Opt-out NOT directly observed (2026-06-30): /removal is itself behind DataDome. By sibling-site pattern almost certainly mirrors truepeoplesearch (email-link flow, subject/agent toggle, name+email fields, hCaptcha) - INFERRED, not verified. Confirm before acting.", + "est_processing_days": 3, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/intelius.json b/optional-skills/security/unbroker/references/brokers/intelius.json new file mode 100644 index 00000000000..1b3af8358ec --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/intelius.json @@ -0,0 +1,88 @@ +{ + "id": "intelius", + "name": "Intelius", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "parent": "peopleconnect", + "owns": [ + "truthfinder", + "instantcheckmate", + "ussearch", + "zabasearch", + "classmates", + "peoplefinder", + "peoplelookup", + "addresses", + "anywho", + "publicrecords" + ], + "search": { + "method": "url_pattern", + "url": "https://www.intelius.com/", + "fetch": "web_extract", + "match_signal": "result", + "by": [ + "name", + "phone", + "address" + ], + "url_patterns": { + "name": "https://www.intelius.com/people-search/{First}-{Last}/", + "name_state": "https://www.intelius.com/people-search/{first}-{last}/{state-name}/", + "full_report": "https://www.intelius.com/search/?firstName={First}&lastName={Last}&city={City}&state={ST}&traffic%5Bsource%5D=INTSEO" + }, + "url_format_quirks": [ + "Name summary page: /people-search/{First}-{Last}/ (hyphen join; case-insensitive, both Jane-Public and jane-public work). Readable via web_extract (no hard bot gate as of 2026-06-30).", + "State refine: /people-search/{first}-{last}/{state-name}/ with the state SPELLED OUT lowercase, e.g. /jane-public/new-york/ (NOT the 2-letter code).", + "The summary shows last-known address + a 'possible relatives' list + a FAQ ('Where does X live?'). Corroborate the subject by address before acting; the 'Top People with the Last Name {Last}' block is unrelated namesakes.", + "Part of PeopleConnect: same data surfaces on Truthfinder/InstantCheckmate/USSearch; one suppression at suppression.peopleconnect.us covers the cluster." + ] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://suppression.peopleconnect.us/login", + "email": "privacy@peopleconnect.us", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email" + ], + "deletion": { + "via": "in_flow", + "url": "https://suppression.peopleconnect.us/guided-mode", + "email": "privacy@peopleconnect.us", + "kinds": ["ccpa", "generic"], + "notes": "The portal's 'Right to Delete / DELETE MY USER DATA' (bottom of guided-mode) is the verified deletion path and covers the whole cluster. privacy@peopleconnect.us is the documented rights-request address (their 2025 CPRA metrics: 33,513 delete requests, median response < 1 day) - use it as the fallback if the portal breaks." + }, + "playbook": [ + "PeopleConnect portal (suppression.peopleconnect.us/login, privacy-center entry at /privacy-center) -- ONE flow here clears Truthfinder, Instant Checkmate, US Search, ZabaSearch, Classmates and ~15 more. DO THIS PARENT FIRST.", + "Step 1 asks ONLY for an email + consent checkbox (no name/DOB, no CAPTCHA) -> sends a verification email. Least-disclosure entry: just the contact email.", + "poll-verification will pick up the verify link. The link authenticates a SESSION bound to the browser that OPENS it: the SAME agent browser must open the link and drive /guided-mode (a different browser is bounced to /login).", + "SUPPRESSION != DELETION -- guided-mode's default flow only HIDES the report (data retained, can re-list). Scroll to the BOTTOM of guided-mode and use 'Right to Delete / DELETE MY USER DATA' (CCPA/CPRA) -- this actually deletes across the cluster and emails its own confirmation link; poll and open that too.", + "If the portal breaks: email privacy@peopleconnect.us (rights-request address, median response < 1 day per their published metrics), or sister addresses privacy@intelius.com / privacy@truthfinder.com / privacy@instantcheckmate.com / support@ussearch.com / privacy@classmates.com; phone 1-888-245-1655.", + "After the deletion confirms, re-scan the covered children (they normally drop out) before submitting any duplicate child opt-out." + ], + "notes": "PeopleConnect portal covers the cluster. Authorized-agent requests: signed written authorization (full name, address, phone, the email the consumer uses) or POA; for Right-to-Delete they verify agent authority with the consumer by email. Verified from the live privacy policy 2026-07-01 (policy dated 2026-06-30).", + "quirks": [ + "Step 1 (suppression.peopleconnect.us/login) asks ONLY for an email + a consent checkbox, then 'Continue' -> a verification email with a link. No CAPTCHA, no name/DOB at step 1. Least-disclosure entry: just the contact email. Verified live 2026-06-30.", + "The verification link authenticates a SESSION and lands on /guided-mode. That session is bound to the browser that OPENED it; a different browser hitting /guided-mode is redirected back to /login. So for hands-off automation the SAME agent browser must open the verify link (Mode B: read inbox -> agent browser navigates the link -> drive guided-mode).", + "SUPPRESSION != DELETION. The guided-mode/suppression flow only HIDES the background report (data retained, can re-list). At the BOTTOM of guided-mode there is a separate 'Right to Delete' section with a 'DELETE MY USER DATA' button (CCPA/CPRA) that removes the user data across the cluster - this is the stronger action and should be preferred. It also emails a confirmation link. (Confirmed via security.org Instant Checkmate guide + live flow 2026-06-30.)", + "Their published request metrics (2025, all US users regardless of state): 33,513 deletion requests, 26,603 complied, median response < 1 day - the deletion lane is real and fast. Verified from privacy policy 2026-07-01." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/mylife.json b/optional-skills/security/unbroker/references/brokers/mylife.json new file mode 100644 index 00000000000..cdb739c1916 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/mylife.json @@ -0,0 +1,35 @@ +{ + "id": "mylife", + "name": "MyLife", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.mylife.com", + "fetch": "browser", + "match_signal": "profile", + "by": ["name"] + }, + "optout": { + "tier": "T3", + "method": "phone", + "url": "https://www.mylife.com/privacyrequest", + "requires": { + "profile_url": true, + "email_verification": false, + "captcha": false, + "gov_id": true, + "account": false, + "phone_callback": false, + "phone_voice": true, + "payment": false + }, + "inputs": ["full_name", "profile_url"], + "notes": "Often pushes a driver's-license upload or a call to (888) 704-1900. Emailing privacy@mylife.com with name + profile link is an alternative. Also covers Wink.com.", + "est_processing_days": 14, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-28", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/nuwber.json b/optional-skills/security/unbroker/references/brokers/nuwber.json new file mode 100644 index 00000000000..f8d4424a3e8 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/nuwber.json @@ -0,0 +1,52 @@ +{ + "id": "nuwber", + "name": "Nuwber", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "nuwber", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://nuwber.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://nuwber.com/removal/link", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email", + "profile_url" + ], + "notes": "People-search. Opt-out: submit the profile URL + email at /removal/link, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url (paste the listing URL you recorded).", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/peekyou.json b/optional-skills/security/unbroker/references/brokers/peekyou.json new file mode 100644 index 00000000000..0c46810dc2d --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/peekyou.json @@ -0,0 +1,53 @@ +{ + "id": "peekyou", + "name": "PeekYou", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "peekyou", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.peekyou.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.peekyou.com/about/contact/optout", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Aggregates social/web profiles. Opt-out: paste your PeekYou profile URL(s), pick a reason, provide email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed PeekYou profile_url.", + "Email verification required." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/peoplefinders.json b/optional-skills/security/unbroker/references/brokers/peoplefinders.json new file mode 100644 index 00000000000..6187f0c14d5 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/peoplefinders.json @@ -0,0 +1,53 @@ +{ + "id": "peoplefinders", + "name": "PeopleFinders", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "peoplefinders", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.peoplefinders.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.peoplefinders.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Standalone people-search (Confi-Chek family). Opt-out: find the listing, submit with a contact email, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url from evidence.", + "Email verification: poll-verification picks up the link; open it in the agent browser." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/radaris.json b/optional-skills/security/unbroker/references/brokers/radaris.json new file mode 100644 index 00000000000..dbfb29a9a7d --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/radaris.json @@ -0,0 +1,58 @@ +{ + "id": "radaris", + "name": "Radaris", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "search": { + "method": "url_pattern", + "url": "https://radaris.com/", + "fetch": "web_extract", + "match_signal": "View Profile", + "by": [ + "name", + "phone", + "address" + ], + "url_patterns": { + "name": "https://radaris.com/p/{First}/{Last}/" + }, + "url_format_quirks": [ + "Name profile page: /p/{First}/{Last}/ with First/Last Capitalized and a TRAILING slash, e.g. /p/Jane/Public/ . Readable via web_extract (no hard bot gate as of 2026-06-30).", + "The page aggregates: a 'phone numbers & home addresses' table (the DIRECT hit for the subject), a relatives/namesakes carousel ('Review the potential relatives'), and resume/CV records. The subject's removable row is in the address table; the carousel entries are OTHER people - disambiguate by address/age before acting.", + "Page is noisy with testimonials/reviews boilerplate; the signal blocks are 'phone numbers & home addresses N' and 'resumes & CV records N'." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://radaris.com/control-privacy", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "profile_url", + "contact_email" + ], + "notes": "Multi-step control-privacy wizard: step 1 NEXT -> step 2 'identify your personal page' (paste the NUMBERED profile URL into the 'Or Enter URL of your page' field; typing reveals a NEXT submit button) -> then user_email + Google reCAPTCHA -> emailed verification link. If there is no View Profile button for the subject, email customer-service@radaris.com and reply to the auto-response until removed.", + "email": "customer-service@radaris.com", + "quirks": [ + "CAPTCHA: the form carries a Google reCAPTCHA (hidden field g-recaptcha-response) plus anti-bot fingerprint tokens (jfp, token). Tier is T2 without a captcha-clearing browser backend (T1 with Browserbase). (Record previously mis-declared captcha:false.)", + "The /control-privacy form REQUIRES the per-person NUMBERED profile URL. Pasting the aggregate /p/{First}/{Last}/ URL is rejected with the validation error: 'The URL must include unique number at the end'. The real removable URL looks like https://{region}.radaris.com/person/~First-Last/1234567890 (see the field placeholder).", + "The subject's own record may appear ONLY as a static row in the 'phone numbers & home addresses' table with NO 'View Profile' link, so no numbered profile URL is exposed for them (the /p/{First}/{Last}/ page deep-links only to relatives/namesakes via JS onclick, not static hrefs). When that happens the /control-privacy form cannot be used -- do NOT fabricate or submit a relative's or namesake's profile URL. Fall back to email: write customer-service@radaris.com with the subject's own listed details and request removal, replying to the auto-response until confirmed.", + "Pressing Enter in the URL field reloads the wizard to step 1 (does not submit); type into the field and click the revealed NEXT button instead." + ], + "est_processing_days": 14, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json b/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json new file mode 100644 index 00000000000..47be9653535 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json @@ -0,0 +1,53 @@ +{ + "id": "searchpeoplefree", + "name": "SearchPeopleFree", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "searchpeoplefree", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.searchpeoplefree.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.searchpeoplefree.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Free people-search. Opt-out: find the listing, submit with an email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/spokeo.json b/optional-skills/security/unbroker/references/brokers/spokeo.json new file mode 100644 index 00000000000..d63c0f101ba --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/spokeo.json @@ -0,0 +1,56 @@ +{ + "id": "spokeo", + "name": "Spokeo", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "spokeo", + "owns": ["freepeopledirectory"], + "search": { + "method": "url_pattern", + "url": "https://www.spokeo.com/search", + "fetch": "browser", + "match_signal": "profile", + "by": ["name", "phone", "email", "address"] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://www.spokeo.com/optout", + "email": "privacy@spokeo.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["profile_url", "contact_email"], + "deletion": { + "via": "email_followup", + "email": "privacy@spokeo.com", + "kinds": ["ccpa", "generic"], + "notes": "privacy@spokeo.com is the documented direct privacy contact (verified live on /optout 2026-07-01). Use for full CCPA deletion beyond listing opt-out, for listings the form rejects, and when more listings keep surfacing." + }, + "playbook": [ + "Opt-out form at spokeo.com/optout -- clears FreePeopleDirectory. Inputs: the confirmed profile URL + contact email; the form emails a confirmation link (poll-verification picks it up; open it in the agent's own browser).", + "EVERY LISTING SEPARATELY: 'you may have multiple listings on Spokeo. Each one is identified by a unique URL and must be opted out individually' (their own wording). Run ALL search vectors first, collect every listing URL, and submit one opt-out per URL.", + "Fast: requests process in 24-48 hours per their page -- re-scan after 2 days and record the real outcome.", + "FULL DELETION follow-up: send-email --kind ccpa (CA) / generic to privacy@spokeo.com naming all listing URLs -- covers data retained beyond the free-search suppression.", + "Paid/account data may be retained even when hidden from free search -- verify actual removal via re-scan; never mark confirmed_removed off the free-search view alone." + ], + "notes": "Form + privacy@spokeo.com verified live 2026-07-01. Their page: opting out does not remove data from original sources and listings may reappear as new public records arrive -- keep the reappearance re-scan scheduled.", + "quirks": [ + "Profile URL formats the form accepts: listing URL like spokeo.com/{First}-{Last}/{City}/{ST}/p{id} or a purchase URL spokeo.com/purchase?q=... (examples shown on /optout).", + "Multiple listings per person are NORMAL (one per name x location x record cluster); each unique URL must be opted out individually -- feed every found listing URL through the form.", + "Processing is 24-48h ('depending on the nature of your request and the amount of data').", + "Paid accounts may retain data even when hidden from free search - verify actual removal, don't mark confirmed_removed off the free-search view alone." + ], + "est_processing_days": 2, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/thatsthem.json b/optional-skills/security/unbroker/references/brokers/thatsthem.json new file mode 100644 index 00000000000..dd6113313fa --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/thatsthem.json @@ -0,0 +1,46 @@ +{ + "id": "thatsthem", + "name": "That's Them", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://thatsthem.com/", + "fetch": "browser", + "match_signal": "result", + "by": ["name", "phone", "email", "address"], + "url_patterns": { + "name": "https://thatsthem.com/name/{First}-{Last}/{City}-{ST}", + "phone": "https://thatsthem.com/phone/{areacode}-{prefix}-{line}", + "email": "https://thatsthem.com/email/{email}", + "address": "https://thatsthem.com/address/{Street}-{City}-{ST}-{ZIP}" + }, + "url_format_quirks": [ + "ADDRESS path is fully hyphen-joined and joins street+city+state+ZIP with hyphens (e.g. /address/123-Main-St-Anytown-NY-12345) and REQUIRES the ZIP. The older slash form (/address/Street/City-ST) and any ZIP-less form 404.", + "NAME and PHONE and EMAIL paths use a slash before city/state and do NOT need a ZIP: /name/First-Last/City-ST , /phone/AAA-PPP-LLLL , /email/addr@host.", + "Street abbreviations are kept verbatim (Ave, Pl, St) - do NOT expand to Avenue/Place/Street; expanding 404s.", + "A 404 on a constructed URL means WRONG PATTERN, not 'no record present'. Treat as INCONCLUSIVE: fall back to the on-site search box (browser_type into the address/name field + submit) and read the resulting canonical URL." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://thatsthem.com/optout", + "requires": { + "profile_url": false, + "email_verification": false, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "street", "city", "state", "postal", "contact_email", "phone"], + "notes": "Opt-out form is gated by a Cloudflare Turnstile CAPTCHA (so tier is T2 without a captcha-clearing browser backend; T1 with Browserbase). All 7 fields are marked required by the form (Full Name, Street Address, City, State, ZIP, Email, Phone). Site sends a confirmation email and states ~72h processing (this is a completion notice, not a click-to-verify link). Least-disclosure tension: the form DEMANDS email+phone even though a public record may show less - disclose only to remove a record that is actually about the subject. Do not click the Spokeo identity-theft-protection link (paid product).", + "est_processing_days": 3, + "reappearance_risk": "low" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json new file mode 100644 index 00000000000..0523fdab1c9 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json @@ -0,0 +1,43 @@ +{ + "id": "truepeoplesearch", + "name": "TruePeopleSearch", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.truepeoplesearch.com/", + "fetch": "browser", + "antibot": "datadome", + "match_signal": "result", + "by": ["name", "phone", "address", "email"], + "url_patterns": { + "name": "https://www.truepeoplesearch.com/results?name={First%20Last}&citystatezip={City,%20ST}" + }, + "url_format_quirks": [ + "Search results URL is QUERY-PARAM, not path: /results?name=Jane%20Public&citystatezip=Anytown,%20NY (space-encoded; comma between city and state). Confirmed as the canonical form the site's own search box generates.", + "On-site search tabs: Name / Phone / Address / Email / Neighbors (so name-, phone-, address-, and email-searchable).", + "HARD-BLOCKED for automated reads (2026-06-30): Cloudflare 'Just a moment...' interstitial -> DataDome device-check CAPTCHA (geo.captcha-delivery.com) on every results navigation. Page chrome (header/footer) may render while the result body stays blocked; submitting any search bounces to DataDome. web_extract/Firecrawl 504-timed out. Needs a residential-proxy/stealth browser (e.g. Browserbase) to scan; otherwise record 'blocked'." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.truepeoplesearch.com/removal", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Removal page renders even when results are blocked. Flow: name+email+captcha -> emailed link -> fill opt-out form matching the record -> confirmation ('allow 3 days'). Fields: dropdown 'Exercise my rights as a: The subject of the request / An authorized agent of the subject', First Name*, Middle Name, Last Name*, Email Address*, consent checkbox. CAPTCHA-gated: hCaptcha ('I am human'). Contact support@truepeoplesearch.com; PO Box 7775 PMB 29296, San Francisco CA 94120-7775. Verified read-only 2026-06-30; not submitted. (Record previously mis-declared email_verification:false.)", + "est_processing_days": 3, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/usphonebook.json b/optional-skills/security/unbroker/references/brokers/usphonebook.json new file mode 100644 index 00000000000..ff1d0082b6c --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/usphonebook.json @@ -0,0 +1,53 @@ +{ + "id": "usphonebook", + "name": "USPhoneBook", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "usphonebook", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.usphonebook.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.usphonebook.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Reverse-phone + people-search. Opt-out: paste the listing URL, provide an email, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/whitepages.json b/optional-skills/security/unbroker/references/brokers/whitepages.json new file mode 100644 index 00000000000..ddc6a0362c8 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/whitepages.json @@ -0,0 +1,57 @@ +{ + "id": "whitepages", + "name": "Whitepages", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "whitepages", + "owns": ["411"], + "search": { + "method": "url_pattern", + "url": "https://www.whitepages.com/", + "fetch": "browser", + "match_signal": "listing", + "by": ["name", "phone", "address"] + }, + "optout": { + "tier": "T1", + "method": "email", + "url": "https://www.whitepages.com/suppression_requests", + "email": "privacyrequest@whitepages.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email", "profile_url"], + "deletion": { + "via": "email", + "email": "privacyrequest@whitepages.com", + "url": "https://whitepagesprivacy.zendesk.com/hc/en-us/requests/new", + "kinds": ["ccpa", "generic"], + "notes": "privacyrequest@whitepages.com handles BOTH opt-out (removal from the site) and CCPA deletion requests, explicitly offered for people who do not want to provide a phone number for the automated tool. ~2 business day reply; opt-outs processed within 15 days. Verified from whitepages.com/privacy/consumer-rights 2026-07-01 (page dated 2026-06-22)." + }, + "playbook": [ + "EMAIL LANE (fully autonomous -- use this): send the removal + deletion request to privacyrequest@whitepages.com including the confirmed listing URL. This is Whitepages' own documented alternative 'if you would prefer not to provide a phone number'. Expect a reply within ~2 business days; they may ask identity-verification questions (name, email) -- answer with least-disclosure, never an ID number.", + "Include in the email: the listing URL(s), the subject's full name as listed, and the request to (a) remove the listing(s), (b) opt out of sale/sharing, and (c) delete personal data (CCPA 1798.105 for CA residents; they honor requests from other states per their consumer-rights page).", + "'Once a listing is removed, all known connected listings are also removed and the requester's information will not be sold by Whitepages in any capacity' -- one request covers connected listings; still re-scan afterward, and check Whitepages Premium + 411.com separately.", + "Alternative 1: webform at whitepagesprivacy.zendesk.com/hc/en-us/requests/new (same ~2-day handling; good fallback if the mailbox bounces).", + "Alternative 2 (only with an operator on the phone): the automated tool at whitepages.com/suppression_requests -- paste the listing URL, provide a phone number, answer the automated voice call and enter the 4-digit code. Fastest (est 1 day) but NOT autonomous.", + "Opt-out requests may take up to 15 days; verify with a re-scan before recording confirmed_removed." + ], + "notes": "Email/webform lane verified 2026-07-01: privacyrequest@whitepages.com or the Zendesk form replace the phone-callback tool ('if you would prefer not to provide a phone number... submit a request to a customer service agent'). Authorized agents: written signed permission required. General privacy contact: support@whitepages.com.", + "quirks": [ + "The automated suppression tool (whitepages.com/suppression_requests) REQUIRES a phone number + automated voice call with a 4-digit code + agreeing to their ToS -- that lane is phone_callback/T2. The email/webform lane exists precisely to avoid it; prefer email for autonomy.", + "Deletion exceptions they state: public records (property, court), fraud-prevention data, active-subscription data, legal holds. 'Hidden from search' vs 'deleted' distinction applies -- their opt-out removes the listing; the CCPA deletion covers non-public account data.", + "CCPA opt-out requests: up to 15 days to process. Right-to-know/access requests also via privacyrequest@whitepages.com or the Zendesk form." + ], + "est_processing_days": 15, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/legal/ccpa.md b/optional-skills/security/unbroker/references/legal/ccpa.md new file mode 100644 index 00000000000..475a7ce012e --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/ccpa.md @@ -0,0 +1,27 @@ +# CCPA / CPRA (California) + +Use for California residents (`residency_jurisdiction` starts with `US-CA`) and, in practice, many US +brokers that honor CCPA-style requests nationwide. + +## Rights invoked + +- **Delete** personal information (Cal. Civ. Code 1798.105). +- **Opt out** of sale/sharing of personal information (1798.120). + +## Request content + +Render with `legal.render_request("ccpa", broker, fields)` -> `templates/emails/ccpa-deletion.txt`. +Include only: full legal name, the contact email for correspondence, and the confirmed listing +URL(s). Do **not** include SSN or government IDs. + +## Authorized agent + +When acting for another consenting subject, use `render_request("ccpa_agent", ...)` +(`templates/emails/ccpa-authorized-agent.txt`) and attach the authorization artifact recorded in the +dossier (`consent.authorization_artifact`). The broker may separately verify the consumer's identity. + +## Notes + +- Brokers must respond within 45 days (extendable). Track as `awaiting_processing` until confirmed. +- "Hidden from free search" is not deletion - verify the record is actually gone before + `confirmed_removed`. diff --git a/optional-skills/security/unbroker/references/legal/drop.md b/optional-skills/security/unbroker/references/legal/drop.md new file mode 100644 index 00000000000..3b96333fc8e --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/drop.md @@ -0,0 +1,34 @@ +# California DROP portal (highest-leverage lever) + +The California **Delete Request and Opt-out Platform** (`privacy.ca.gov/drop`) lets a California +resident demand deletion from **every registered data broker** with a single verified request, for +free. DROP is **live** (as of 2026); registered brokers must begin processing requests on +**2026-08-01**. The registered universe is the **California Data Broker Registry** (~545 brokers in +2025), which this skill ingests as its own coverage lane (`pdd.py registry`); one DROP request covers +all of them, which is how this skill reaches (and exceeds) the breadth of commercial services. + +## When to use + +For any subject with `residency_jurisdiction` starting `US-CA`, sequence DROP **first**: `pdd.py next` +surfaces a single `drop_submit` action covering the whole registry. Then handle the individual +people-search sites (which are also worked directly because they hold free, indexed listings). After +filing, run `pdd.py drop --filed` so the loop stops re-surfacing it. For non-CA subjects +DROP does not apply; cover the registry brokers with targeted CCPA/GDPR deletion emails +(`pdd.py registry --search`, then `pdd.py send-email`). + +## Flow (agent-assisted, mostly human verification) + +1. The operator creates/verifies a DROP account (identity verification is required by the state; this + is a human step - `human_task_queued`). +2. Submit one deletion request covering all registered brokers. +3. Record a single ledger case `case__drop` to track it; mark `submitted` -> + `awaiting_processing`. Registered brokers must process deletions on the state's schedule. +4. After the DROP cycle, re-scan the people-search long tail and only act on sites still showing data. + +## Caveats + +- DROP covers **registered data brokers**, not every people-search site. Keep doing the individual + opt-outs for non-registered sites. +- Identity verification means parts of this cannot (and should not) be fully automated. +- FCRA-regulated brokers (flagged in the registry, `optout.fcra`) hold consumer-report data with + separate rules; deletion may be limited and a dispute or security-freeze may apply instead. diff --git a/optional-skills/security/unbroker/references/legal/gdpr.md b/optional-skills/security/unbroker/references/legal/gdpr.md new file mode 100644 index 00000000000..d00d5469343 --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/gdpr.md @@ -0,0 +1,20 @@ +# GDPR / UK-GDPR (roadmap - Phase 3) + +For EU/UK subjects. Not part of the P0 US-first scope; templates and routing land in Phase 3. + +## Rights invoked + +- **Erasure** ("right to be forgotten") - Article 17. +- **Object** to processing - Article 21. + +## Request content + +Render with `legal.render_request("gdpr", broker, fields)` -> +`templates/emails/gdpr-erasure.txt`. Address the controller's privacy/DPO contact. Include the data +subject's name, the contact email, and the listing URL(s); cite Article 17. + +## Notes + +- Controllers must respond within one month (Article 12(3)). +- EU-specific brokers and portals (e.g. Acxiom's EU consumer portals) are added in Phase 3 with + `jurisdictions: ["EU"]` records and residency-aware routing. diff --git a/optional-skills/security/unbroker/references/methods.md b/optional-skills/security/unbroker/references/methods.md new file mode 100644 index 00000000000..6e25f0a7bb6 --- /dev/null +++ b/optional-skills/security/unbroker/references/methods.md @@ -0,0 +1,235 @@ +# Opt-out method playbooks + +How the agent executes each broker `optout.method` using native Hermes tools. Always obey the +**verify-before-disclose** rule: confirm a real listing exists, then submit only the fields the broker +requires (`pdd.py plan` lists them per broker). + +**Autonomy:** `pdd.py next ` sequences all of this - it decides which method applies, orders +parents first, and routes human-only work to the digest. In `autonomy=full` (default), execute its +actions without pausing per submission; the consent recorded at intake is the authorization. These +playbooks are the HOW for each action type. + +## Scan ladder (all methods) + +Confirm exposure before acting, cheapest first. Run **every** `search_vectors` entry from `pdd.py +plan` (each name x location, phone, email, and address the broker's `search.by` supports) - different +vectors surface different listings for the same person; dedupe found URLs. + +1. `web_extract` on the broker `search.url` (fast HTML -> markdown). Look for `search.match_signal`. + Build per-vector URLs from `search.url_patterns` and heed `search.url_format_quirks` (see below). +1b. **`site:` search-engine probe (cheap, do it early and in parallel).** `web_search` with + `site: "First Last"` (add a city/ZIP or a unique phone/address to cut namesake + noise) often returns the **exact profile-slug URL** in one shot - which both confirms the listing + exists AND hands you the opaque `/find/person/` or `/p/` URL you'd otherwise have to + derive. Two big wins seen in the field: (a) it disambiguates namesakes fast - the SERP snippet + shows age/city so you can tell the subject from a same-name relative before fetching anything; and + (b) a broad `"First Last" ` search (no `site:`) surfaces **brokers not yet in + your DB** (e.g. information.com, peoplefinders.com) - record those as bonus exposures. Note: empty + `site:` results are INCONCLUSIVE (many broker pages aren't indexed / are `noindex`), not `not_found`. +2. If the page is JS-rendered or returns nothing useful, `browser_navigate` + `browser_snapshot` + (and `browser_type`/`browser_click` to run the site's search box). +3. If blocked by stealth/Cloudflare, use the `scrapling` skill via `terminal`. **If the broker record + has `search.antibot` set (e.g. `datadome`), results are behind a device-check CAPTCHA**: a + cloud/stealth browser (Browserbase) or `scrapling` may get through; if none is available, do **not** + burn attempts - `pdd.py record blocked` and move on (a re-scan with a stealth + backend can pick it up later). +3b. **Operator-browser path (the reliable unblock for anti-bot sites).** Cloudflare/DataDome key on + datacenter IPs + headless fingerprints, so `web_extract`, the proxyless agent browser, and even a + cloud browser often fail - but the **operator's own everyday browser (residential IP, real + fingerprint) sails straight through**. For any `blocked` site, hand the operator a paste-ready + search URL (built from `search.url_patterns`), give them the identity anchors to judge by (current + + prior addresses, age, a distinguishing detail) and the namesake/relative watch-list, and ask for + the verdict or a screenshot (the agent can read screenshots). This is a **first-class scan path, not + a fallback** - treat the operator's live check as authoritative and record the real verdict + (`found` / `not_found` / `indirect_exposure`), citing `scanned_via: operator_browser`. Same for + opt-out forms the agent's browser can't reach: guide the operator field-by-field (least-disclosure), + pausing before submit. (This is exactly why the same trick clears email-verification links the agent + can't open - see the Verification loop.) +4. Capture evidence: save listing URLs and a `browser` screenshot into the subject's `evidence/` dir, + then `pdd.py record found --found true --evidence '{"listing_urls":[...]}'`. + +If a listing genuinely does not exist: `pdd.py record not_found` and move on. + +### A 404 (or empty body) is INCONCLUSIVE, not "not_found" + +A constructed search URL that 404s almost always means the **URL pattern is wrong**, not that the +person is absent. Never record `not_found` off a 404. Instead: + 1. Re-check the broker's `search.url_patterns` / `url_format_quirks` and rebuild the URL. + 2. Fall back to the **on-site search box**: `browser_navigate` to the search page, `browser_type` + the raw query, `browser_click` Search, then read the **canonical result URL** the site lands on. + 3. Only after the site's own search returns an empty result set do you record `not_found`. + 4. If a pattern was wrong, fix it in `references/brokers/.json` (`url_patterns` + + `url_format_quirks`) so the next run is correct - see the rule below. + +### Log URL/format quirks for every site you scrape + +Whenever you discover how a broker's URLs are actually shaped (path layout, hyphen-vs-slash joins, +whether ZIP is required, abbreviation handling, query-param search, anti-bot gating), record it in +that broker's `references/brokers/.json` under `search.url_patterns` (the templates) and +`search.url_format_quirks` (the gotchas, including which forms 404). Bump `last_verified`. This makes +the deterministic URL path reliable across runs and subjects instead of rediscovered each time. If the +opt-out form's real requirements differ from the record (extra required fields, a CAPTCHA, an account), +fix `optout.requires` / `optout.inputs` / `optout.tier` too - those drive tier selection and +least-disclosure. Log opt-out mechanics gotchas (a broker that needs a profile URL but doesn't expose +one for the subject, an email-only fallback, an authorized-agent toggle) in `optout.quirks` - the +planner surfaces these as `optout_quirks` per broker. Example: Radaris sometimes shows the subject only +as a static address-table row with no "View Profile" link, so `/control-privacy` (which needs a profile +URL) can't be used - fall back to `optout.email` rather than submitting a namesake's URL. + +### Distinguish the subject from namesakes and relatives + +People-search sites are dense with namesakes and family clusters. Before recording `found`, confirm the +record is the **subject themselves** (corroborate via DOB, a known current/prior address, or the +identifier you searched). Two non-removable patterns to record as evidence but NOT as the subject's own +listing: + - **Namesake:** same name, different person (different DOB/location with no overlap). Not the subject. + - **Relative record:** the listing is about a *different* person (a relative) and merely *names* the + subject in a "Family" field, or carries the subject's email/phone as a secondary datum. This is a + third party's record - the consent gate correctly blocks acting on it. See "Indirect exposure" in + the web_form section for what the subject *can* still request. + +## web_form + +1. `browser_navigate` to `optout.url`; `browser_snapshot` to read the form. +2. Fill only the planned `disclosure_fields` with `browser_type`/`browser_click`; for `profile_url`, + paste the confirmed listing URL from evidence. +3. Submit; `browser_snapshot` to confirm the success state; screenshot to `evidence/`. +4. `pdd.py record submitted --disclosed --disclosed --channel web_form`. +5. If the broker requires email verification, follow **Verification loop** below. + +### Indirect exposure (named as a relative / your email on someone else's record) + +You asked the right question: if a broker lists a *relative* and names you in their "Family" field, or +shows **your** email/phone on **their** record, that IS personal information about you - even though the +record's primary subject is a third party. Resolve it in two distinct lanes: + +- **The self-service opt-out form does NOT cover this.** That form removes a record whose *primary + subject* is you. It has no notion of "scrub my identifiers from this other person's record," and + submitting it with the relative's address to force a match would be (a) disclosing data the listing + doesn't tie to you and (b) acting on a third party's record. Don't. The consent gate exists to stop + exactly that. +- **What you CAN do - a targeted "delete my personal information" request (CCPA 1798.105 / GDPR Art.17).** + These rights attach to *your* personal information *wherever the business holds it*, including as a + data point on another person's profile. So the subject may email the broker's privacy address and + request suppression of **their own specific identifiers** (this email address, this phone number, my + name in family/relative associations), citing the relative listings as the locations. This is a + narrower request than a full opt-out and does not require the relative's consent - you are only asking + them to delete data about *you*. Use `render-email` with the `ccpa`/`gdpr` template, list only the + subject's own identifiers + the URLs where they appear, and record it as a normal `submitted` → + `awaiting_processing` email case. Verify by re-scanning those identifier vectors (email/phone) after + the statutory window - `confirmed_removed` only when the subject's identifier no longer appears. +- **Caveat:** the broker may decline to alter a third party's record beyond removing your specific + identifiers, and "your name in a family graph" can be derived from public records they'll re-list. + Note residual exposure in the report rather than marking a clean removal. (Operational guidance, not + legal advice.) + +## email + +`pdd.py send-email --listing [--kind ccpa|gdpr|ccpa_indirect]` always does +the deterministic parts (recipient locked to an address the broker record declares, refusing anything +else; `--listing` mandatory; records `submitted`, logs disclosure, stamps `next_recheck_at`). How it +actually sends depends on `email_mode`: + +1. **browser mode (no password, autonomous):** the command returns a recipient-locked `compose` + payload (`to`/`subject`/`body`). Compose a NEW message in the operator's **logged-in webmail** via + `browser_*` (paste `compose.body` exactly, disclosing nothing beyond it) and send. No credentials + stored. Requires the inbox signed in in the browser Hermes uses. +2. **programmatic mode (SMTP creds):** the command SMTP-sends it directly, no human. +3. **draft_only fallback:** `pdd.py render-email --listing `; a digest entry + tells the operator to send it, and the agent records `submitted --channel email` afterward. + +Then follow the **Verification loop** if the broker emails a confirmation link. + +## Verification loop (email_verification brokers) + +- **browser mode (autonomous, no password):** open the broker's confirmation email in the operator's + webmail (`browser_*`), then `pdd.py verify-link --text ''` returns + the anti-phishing-scored link. `browser_navigate` it **in the same browser** (several brokers, e.g. + PeopleConnect, bind the session to the browser that opens the link), finish the flow, record + `awaiting_processing`. +- **programmatic mode (IMAP):** `pdd.py poll-verification ` polls IMAP for every in-flight + case, extracts the link (anti-phishing scored: only opt-out-looking links on the broker's own + domains), and auto-advances `submitted → verification_pending`. Then `browser_navigate` the link in + the agent's own browser, finish the flow, record `awaiting_processing`. +- **draft_only:** the digest tells the operator to click the link in the subject's inbox; the agent + records `awaiting_processing` on their word. +- Either way, the due queue (`pdd.py due`) brings the case back after the broker's processing window + for the verifying re-scan; only that re-scan justifies `confirmed_removed`. + +## phone_callback (e.g. Whitepages) + +Submit the web form, then the site places an automated call with a numeric code. If the operator is +available to read the code, capture it and complete the form (T2). Otherwise queue a human task. + +## phone (voice menu) / fax / mail / gov_id -> human task (T3) + +Do **not** attempt to automate. Create a `todo` task and `pdd.py record +human_task_queued` with exact instructions and an explicit **withhold** list (never SSN; never a +driver's-license number unless the subject chooses to and crosses out the ID number). Capture the +confirmation reference back into the ledger when the operator completes it. + +## captcha + +**Default: soft/managed CAPTCHAs clear automatically.** The recommended baseline backend is the +Browserbase cloud browser (`setup --auto` selects it when `BROWSERBASE_API_KEY` is set). Being a +real browser on a residential IP, it passes managed challenges - Cloudflare Turnstile, hCaptcha / +reCAPTCHA checkbox - as normal operation, so those brokers stay T1 and you just proceed. This is +**not** CAPTCHA solving: no solver service, no fingerprint spoofing. + +Only a **hard** challenge the browser genuinely can't pass (interactive image grids, behavioral +scoring that flags the session) becomes a fallback: `record ... blocked` and requeue it for the +stealth/operator-browser pass (`methods.md` → scan ladder 3b - the operator's own residential +browser is the reliable unblock). Without a cloud browser configured, soft-CAPTCHA brokers drop to +T2 and become human tasks. **Never use a third-party CAPTCHA-defeating service.** + +## Ownership clusters - DO PARENTS FIRST (playbooks live in the broker records) + +Many brokers are resold shells of a few parents, so **one parent removal clears a whole cluster of +children** (see `owns` in each record). In Phase 2 you MUST work the cluster **parents first**, then +the standalone listings - doing a child before its parent wastes a submission the parent would have +covered. `pdd.py plan --batch` **orders the `found` group parents-first** and emits a +`parent_playbook` whose `steps` come verbatim from each record's **`optout.playbook`** - the single +source of truth, field-verified, updated as live runs discover mechanics. What follows is the +operating doctrine; the exact steps are in `references/brokers/.json`. + +**Deletion beats suppression, email lanes beat forms.** Each parent record carries a structured +`optout.deletion` lane (`via: in_flow | email | email_followup`, plus the privacy address). The +autopilot routes accordingly: + +- **`in_flow`** (PeopleConnect): the deletion control lives INSIDE the web flow - complete the flow + and use the **Right to Delete / DELETE MY USER DATA** control, never just the suppression step. +- **`via: email`** (Whitepages): the fully-autonomous lane - `send-email` the request (residency-picked + kind: CCPA for US-CA, GDPR for EU/UK, generic otherwise), then `poll-verification` for their reply + and answer identity questions with least-disclosure. This is also the **rescue lane**: any broker + whose form demands a phone-callback/gov-ID/account but that declares a deletion email gets routed + here instead of the human digest. +- **`email_followup`** (BeenVerified, Spokeo): the opt-out form is the fast primary (it clears the + listing), and the playbook then sends a right-to-delete email for full erasure beyond suppression. + +Verified parent facts (live-checked 2026-07-01; details + steps in the records): + +- **Intelius/PeopleConnect** (~15+ sites in one flow): portal entry asks only email + consent → + verify link is **session-bound to the browser that opens it** → guided-mode → **DELETE MY USER + DATA** at the bottom (suppression alone re-lists). Fallback `privacy@peopleconnect.us` - their own + published metrics: 33.5k deletion requests, median response < 1 day. +- **Whitepages**: `privacyrequest@whitepages.com` (or the Zendesk form) handles removal + CCPA + deletion **without the phone-callback tool** - that phone call is only required by the automated + tool. One removal also drops "all known connected listings". ≤15 days; check 411.com + Premium. +- **BeenVerified**: opt-out tool (footer "Do Not Sell" link → `/svc/optout/search/optouts`) + email + verification; one opt-out per email address. Then `privacy@beenverified.com` deletion follow-up - + controller is The Lifetime Value Co., so name their sister properties (NeighborWho, Ownerly, + NumberGuru, Bumper) in the same request, and verify each separately. +- **Spokeo**: form takes ONE listing URL at a time and **each listing must be opted out + individually** - collect every listing URL from all search vectors first, then submit one opt-out + per URL. 24-48h processing. `privacy@spokeo.com` for full deletion beyond free-search suppression. + +After each parent removal is confirmed, **re-scan its children** before submitting anything for them - +usually they drop out and need no separate opt-out. + +### Any other parent +A parent without a hand-verified `optout.playbook` gets synthesised steps from its structured record +(URL/email, `requires` flags, deletion lane, notes/quirks). Follow those, and **write what you learn +back into `references/brokers/.json`** (`optout.playbook`, `optout.deletion`, `quirks`, +`last_verified`) so the next run is exact - that file, not this one, is where per-broker knowledge +accrues. + diff --git a/optional-skills/security/unbroker/references/state-machine.md b/optional-skills/security/unbroker/references/state-machine.md new file mode 100644 index 00000000000..feae5a3efbe --- /dev/null +++ b/optional-skills/security/unbroker/references/state-machine.md @@ -0,0 +1,43 @@ +# Case state machine + +One case = one (subject x broker). `pdd.py record` validates every transition against this table and +appends it to `audit.jsonl`. Authoritative definition lives in `scripts/ledger.py`. + +## States + +| State | Meaning | +|---|---| +| `new` | Case created, nothing done | +| `searching` | Scan in progress | +| `not_found` | Subject not listed (will be re-checked next cycle) | +| `found` | Listing confirmed; action needed | +| `indirect_exposure` | Subject's PII (email/phone/name) appears on a **third party's** record (e.g. named in a relative's "Family" field). Not removable via self-service opt-out; needs a targeted CCPA/GDPR delete-my-PII request | +| `action_selected` | Tier/method chosen | +| `submitted` | Opt-out submitted | +| `verification_pending` | Awaiting email/callback verification | +| `awaiting_processing` | Submitted, no verification needed; broker processing | +| `confirmed_removed` | Verified gone | +| `reappeared` | Was removed, now listed again | +| `human_task_queued` | Needs an operator step (captcha/ID/phone/fax/mail) | +| `blocked` | Broker dead / mechanics broken -> flag for DB re-verification | + +## Allowed transitions + +``` +new -> searching | found | not_found | indirect_exposure | blocked +searching -> not_found | found | indirect_exposure | blocked +not_found -> searching | found | indirect_exposure | blocked +found -> action_selected | submitted | human_task_queued | indirect_exposure | blocked +indirect_exposure -> submitted | human_task_queued | not_found | found | blocked +action_selected -> submitted | human_task_queued | blocked +submitted -> verification_pending | awaiting_processing | human_task_queued | blocked +verification_pending -> confirmed_removed | human_task_queued | blocked +awaiting_processing -> confirmed_removed | human_task_queued | blocked +confirmed_removed -> reappeared | confirmed_removed (recheck refreshes the date) +reappeared -> found | indirect_exposure +human_task_queued -> found | indirect_exposure | action_selected | submitted | verification_pending + | awaiting_processing | confirmed_removed | blocked +blocked -> searching | found | not_found | indirect_exposure | action_selected +``` + +A transition to the same state is always allowed (idempotent field updates). diff --git a/optional-skills/security/unbroker/scripts/autopilot.py b/optional-skills/security/unbroker/scripts/autopilot.py new file mode 100644 index 00000000000..0c900818a8d --- /dev/null +++ b/optional-skills/security/unbroker/scripts/autopilot.py @@ -0,0 +1,396 @@ +"""Autonomous action queue: what should the agent do RIGHT NOW for this subject? + +`next_actions` turns (dossier, broker DB, config, ledger) into an ordered queue of +concrete agent actions plus a human digest. The agent's whole run becomes a loop: + + while True: + q = pdd.py next + if not q["actions"]: break + execute each action, record outcomes + present q["human_digest"] once; schedule cron at q["next_wake_at"] + +Policy (cfg["autonomy"]): + full - intake consent is standing authorization; T0-T2 agent actions are + executed without pausing. Humans appear only in the digest. + assisted - same queue, but every submission action carries confirm_first=True. + +The queue is deterministic and side-effect free: it never mutates the ledger, it +only reads. Executing + recording stays with the agent (and the record command). +""" +from __future__ import annotations + +import datetime as _dt +import os +from pathlib import Path + +import brokers as brokers_mod +import emailer +import ledger as ledger_mod +import paths +import registry +import tiers + +CACHE_STALE_DAYS = 7 # refresh the live broker list after this +FANOUT_THRESHOLD = 8 # above this many unscanned brokers, use delegate_task fan-out + +# States with nothing left to do (absent a due recheck). +_TERMINAL = {"not_found", "confirmed_removed"} +_IN_FLIGHT = {"submitted", "verification_pending", "awaiting_processing"} + + +def cache_age_days(now: float | None = None) -> float | None: + """Age of the live BADBOOL cache in days, or None if never pulled.""" + p: Path = paths.brokers_cache_path() + if not p.exists(): + return None + now = now if now is not None else _dt.datetime.now().timestamp() + return max(0.0, (now - p.stat().st_mtime) / 86400.0) + + +def _now_iso() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def _min_future_recheck(ledger: dict, at: str) -> str | None: + future = [c.get("next_recheck_at") for c in ledger.values() + if c.get("next_recheck_at") and c["next_recheck_at"] > at] + return min(future) if future else None + + +def _digest(broker_row: dict, reason: str, steps: list[str], prep: list[str] | None = None) -> dict: + return { + "broker_id": broker_row.get("broker_id"), + "broker_name": broker_row.get("broker_name"), + "reason": reason, + "agent_prep": prep or [], # commands the agent runs BEFORE handing this to the human + "steps": steps, # what the human actually does + "withhold": ["SSN", "full driver's-license / passport numbers"], + } + + +def request_kind(dossier: dict, allowed: list[str] | None = None) -> str: + """Pick the honest legal basis for a deletion request from the subject's residency. + + ccpa only for California residents, gdpr only for EU/UK residents, generic otherwise. + `allowed` (from the broker's deletion.kinds) can restrict DOWN to generic but never + upgrades to a law the subject can't truthfully claim. + """ + res = (dossier.get("residency_jurisdiction") or "US").upper() + if res.startswith("US-CA"): + kind = "ccpa" + elif res.startswith(("EU", "UK", "GB")): + kind = "gdpr" + else: + kind = "generic" + if allowed and kind not in allowed and "generic" in allowed: + kind = "generic" + return kind + + +_HUMAN_GATES = ("gov_id", "fax", "mail", "phone_voice", "phone_callback", "account") + + +def _email_lane(row: dict) -> tuple[str | None, str]: + """(address, why) for the autonomous email lane of this broker, if one exists. + + Lane rules: + 1. the broker's primary opt-out method IS email; + 2. the record marks its deletion lane email-preferred (deletion.via == "email"); + 3. RESCUE: the primary flow is human-gated (gov ID / fax / phone / account) but a + right-to-delete email exists - the email lane restores full autonomy (this is the + verified Whitepages pattern: privacyrequest@ accepts requests precisely so people + don't have to do the phone-callback tool). + """ + deletion = row.get("deletion") or {} + req = row.get("optout_requires") or {} + if row.get("method") == "email": + addr = row.get("optout_email") or deletion.get("email") + return (addr, "primary opt-out method is email") if addr else (None, "") + if deletion.get("via") == "email" and deletion.get("email"): + return deletion["email"], "record prefers the right-to-delete email lane" + if (row.get("tier") == "T3" or any(req.get(k) for k in _HUMAN_GATES)) and deletion.get("email"): + return deletion["email"], "rescue: primary flow is human-gated; deletion email restores autonomy" + return None, "" + + +def _optout_action(row: dict, playbook: dict[str, dict], subject_id: str, dossier: dict, + email_mode: str, smtp_ok: bool, confirm_first: bool) -> tuple[dict | None, dict | None]: + """Map one actionable `found` row to (agent_action, human_digest_entry). + + Routing order maximizes autonomy: (1) the email lane (primary email method, preferred + right-to-delete email, or rescue from a human-gated form) beats everything when SMTP is + up; (2) genuinely human-only flows go to the digest; (3) web forms are driven with the + record's own field-verified playbook steps. + """ + bid = row["broker_id"] + req = row.get("optout_requires") or {} + tier = row.get("tier") + deletion = row.get("deletion") or {} + + # 1) The autonomous EMAIL LANE (right-to-delete by email + confirm the reply). + # Autonomous when SMTP is configured (programmatic/alias) OR in browser mode (agent sends via + # the operator's logged-in webmail; no password needed). + email_addr, lane_why = _email_lane(row) + can_email = (email_mode in ("programmatic", "alias") and smtp_ok) or email_mode == "browser" + if email_addr and can_email: + kind = request_kind(dossier, deletion.get("kinds")) + via = "browser" if email_mode == "browser" else "smtp" + then = ("send-email records it + returns a recipient-locked payload; compose and send it in " + "the operator's webmail via browser_*, then `verify-link` on the reply and open the link" + if via == "browser" else + "state auto-records as submitted; poll-verification picks up their verification reply, " + "open its link, then record") + return { + "type": "optout_email_send", + "broker_id": bid, "broker_name": row.get("broker_name"), "tier": tier, + "confirm_first": confirm_first, "send_via": via, + "to": email_addr, "kind": kind, "why": lane_why, + "command": f"python3 scripts/pdd.py send-email {subject_id} {bid} --kind {kind} " + f"--to {email_addr} --listing ", + "then": then, + }, None + if row.get("method") == "email": + return None, _digest(row, "email opt-out (draft mode: a human must hit send)", + ["Send the rendered draft from your own mail client", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed contact_email --channel email"], + prep=[f"python3 scripts/pdd.py render-email {subject_id} {bid} --listing "]) + + # 2) Genuinely human-only work goes to the digest (no email lane could rescue it). + if tier == "T3": + return None, _digest(row, "human-only opt-out (gov ID / fax / mail / voice phone)", + [f"Follow the broker's process at {row.get('optout_url') or row.get('optout_email')}", + "Provide only the fields the listing already shows; cross out ID numbers on any document"]) + if req.get("phone_callback"): + return None, _digest(row, "phone-callback verification (operator must be on the phone)", + [f"Open {row.get('optout_url')} and submit with only the planned fields", + "Answer the automated call and enter the 4-digit code to finish"], + prep=[f"python3 scripts/pdd.py plan {subject_id} --batch # confirm fields first"]) + if req.get("account"): + return None, _digest(row, "requires creating/holding an account with the broker", + [f"Create/log in at {row.get('optout_url')} and submit the opt-out", + "Use the subject's contact email; no extra PII beyond the planned fields"]) + + # 3) web_form: drive the browser with the record's own playbook steps. + steps = (playbook.get(bid) or {}).get("steps") or list(row.get("optout_playbook") or []) \ + or tiers.synthesize_steps(row) + action = { + "type": "optout_web_form", + "broker_id": bid, "broker_name": row.get("broker_name"), "tier": tier, + "confirm_first": confirm_first, + "optout_url": row.get("optout_url"), + "clears_children": row.get("clears_children") or [], + "steps": steps, + "after": f"python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed ... --channel web_form", + } + if deletion: + action["prefer_deletion"] = ("this record has a right-to-delete lane -- complete the DELETION " + "flow, not just suppression" + (f" ({deletion.get('notes')})" + if deletion.get("notes") else "")) + if req.get("captcha"): + action["note"] = ("CAPTCHA-gated: attempt with the configured browser backend once; if it " + "does not clear, record blocked (do NOT retry-loop or bypass)") + return action, None + + +def next_actions(dossier: dict, brokers_list: list[dict], cfg: dict, + ledger: dict | None = None, env: dict | None = None) -> dict: + env = os.environ if env is None else env + ledger = ledger or {} + subject_id = dossier.get("subject_id", "") + autonomy = cfg.get("autonomy", "full") + confirm_first = autonomy == "assisted" + email_mode = cfg.get("email_mode", "draft_only") + mail = emailer.available(env) + at = _now_iso() + + batch = tiers.batch_plan(dossier, brokers_list, cfg, ledger, + browser_clears_captcha=cfg.get("browser_backend") == "browserbase" + or bool(env.get("BROWSERBASE_API_KEY"))) + groups = batch["groups"] + playbook = {p["broker_id"]: p for p in batch.get("parent_playbook") or []} + by_id = {b.get("id"): b for b in brokers_list} + + actions: list[dict] = [] + digest: list[dict] = [] + + # 0) keep the broker DB fresh (autonomously) + age = cache_age_days() + if age is None or age > CACHE_STALE_DAYS: + actions.append({ + "type": "refresh_brokers", + "why": "live broker cache missing" if age is None else f"cache is {age:.0f} days old", + "command": "python3 scripts/pdd.py refresh-brokers", + }) + + # 0b) DROP one-shot: for a CA resident, ONE request deletes from every registered + # broker (the whole CA Data Broker Registry) -- the highest-leverage removal there is. + registry_recs = brokers_mod.load_registry_cache() + residency = (dossier.get("residency_jurisdiction") or "US").upper() + drop_filed = bool((dossier.get("preferences") or {}).get("drop_filed_at")) + if registry_recs and residency.startswith("US-CA") and not drop_filed: + actions.append({ + "type": "drop_submit", + "one_shot": True, + "registry_count": len(registry_recs), + "url": registry.DROP_URL, + "command": f"python3 scripts/pdd.py drop {subject_id}", + "why": f"CA resident: one DROP request deletes from all {len(registry_recs)} registered " + "data brokers at once (superset of what commercial services cover).", + "after": f"python3 scripts/pdd.py drop {subject_id} --filed", + }) + + # 1) Phase 1 crawl: everything unscanned (read-only, parallel-safe) + unscanned = groups.get("unscanned") or [] + if unscanned: + ids = [r["broker_id"] for r in unscanned] + if len(ids) > FANOUT_THRESHOLD: + actions.append({ + "type": "fanout_scan", + "broker_ids": ids, + "command": f"python3 scripts/pdd.py fanout {subject_id}", + "how": "spawn ONE delegate_task subagent per batch IN PARALLEL with each batch's brief; " + "parent re-verifies key `found` claims before trusting them", + }) + else: + actions.append({ + "type": "scan_inline", + "broker_ids": ids, + "command": f"python3 scripts/pdd.py plan {subject_id}", + "how": "run every search_vector per broker via the methods.md ladder " + "(web_extract -> site: probe -> browser), record a verdict per broker", + }) + + # 2) in-flight email verifications: poll the inbox (or hand to the human in draft mode) + for st in ("submitted", "verification_pending"): + for bid, case in sorted(ledger.items()): + if case.get("state") != st: + continue + broker = by_id.get(bid) or {} + if not ((broker.get("optout") or {}).get("requires") or {}).get("email_verification"): + continue + if mail["imap"]: + actions.append({ + "type": "poll_verification", "via": "imap", + "broker_id": bid, + "command": f"python3 scripts/pdd.py poll-verification {subject_id} --broker {bid}", + "then": "browser_navigate the returned link IN THE SAME AGENT BROWSER (sessions are " + f"browser-bound), complete the flow, then record: awaiting_processing", + }) + elif email_mode == "browser": + actions.append({ + "type": "poll_verification", "via": "browser", "broker_id": bid, + "how": "open the broker's confirmation email in the operator's logged-in webmail " + f"(browser_*), then `python3 scripts/pdd.py verify-link {subject_id} {bid} " + "--text ''` to score the link, browser_navigate it in the SAME " + "browser, then record awaiting_processing", + }) + else: + digest.append(_digest( + {"broker_id": bid, "broker_name": (broker.get("name") or bid)}, + "verification email must be opened by a human (draft mode, no inbox access)", + ["Open the broker's verification email in the subject's inbox and click the link", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} awaiting_processing"])) + + # 3) due rechecks: processing windows elapsed / reappearance sweeps + for case in ledger_mod.due(subject_id, at=at, ledger=ledger): + bid = case.get("broker_id") + st = case.get("state") + if st in ("awaiting_processing", "confirmed_removed"): + actions.append({ + "type": "verify_removal", + "broker_id": bid, + "why": "processing window elapsed" if st == "awaiting_processing" else "periodic reappearance re-scan", + "how": "re-run this broker's search_vectors; if gone record confirmed_removed; " + "if still listed record reappeared and requeue the opt-out", + }) + elif st in ("submitted", "verification_pending") and not mail["imap"]: + pass # already covered by the digest entry above + + # 4) Phase 2 opt-outs: parents first (batch_plan already ordered them) + for row in groups.get("found") or []: + action, task = _optout_action(row, playbook, subject_id, dossier, + email_mode, mail["smtp"], confirm_first) + if action: + actions.append(action) + if task: + digest.append(task) + + # 5) indirect exposure: targeted delete-my-PII requests + for row in groups.get("indirect_exposure") or []: + bid = row["broker_id"] + if (email_mode in ("programmatic", "alias") and mail["smtp"]) or email_mode == "browser": + actions.append({ + "type": "indirect_email_send", + "broker_id": bid, "confirm_first": confirm_first, + "send_via": "browser" if email_mode == "browser" else "smtp", + "command": f"python3 scripts/pdd.py send-email {subject_id} {bid} --kind ccpa_indirect " + f"--listing ", + }) + else: + digest.append(_digest(row, "indirect-exposure request (draft mode: a human must hit send)", + ["Send the rendered ccpa_indirect draft", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed contact_email --channel email"], + prep=[f"python3 scripts/pdd.py render-email {subject_id} {bid} " + f"--kind ccpa_indirect --listing "])) + + # 6) blocked sites: stealth pass if we have one, else the operator-browser path + blocked = groups.get("blocked") or [] + if blocked: + ids = [r["broker_id"] for r in blocked] + if bool(env.get("BROWSERBASE_API_KEY")): + actions.append({ + "type": "stealth_rescan", + "broker_ids": ids, + "how": "retry these with the cloud/stealth browser backend, then record real verdicts", + }) + else: + for r in blocked: + digest.append(_digest(r, "site blocks automated access (anti-bot); a human browser gets through", + ["Open the paste-ready search URL from `plan` in your everyday browser", + "Report the verdict (or a screenshot) back to the agent", + f"Agent records: python3 scripts/pdd.py record {subject_id} " + f"{r['broker_id']} "])) + + # 7) anything already parked as a human task + for bid, case in sorted(ledger.items()): + if case.get("state") == "human_task_queued": + broker = by_id.get(bid) or {} + digest.append(_digest({"broker_id": bid, "broker_name": broker.get("name") or bid}, + case.get("human_task_reason") or "queued manual step", + ["See `pdd.py tasks` for the exact steps recorded with this case"])) + + # registry coverage summary (breadth beyond the scannable people-search sites) + coverage = None + if registry_recs: + coverage = { + "people_search_sites": len(brokers_list), + "registered_data_brokers": len(registry_recs), + "worked_via": "CA DROP one-shot" if residency.startswith("US-CA") else "targeted CCPA/GDPR email", + } + if not residency.startswith("US-CA"): + coverage["note"] = ("DROP is CA-only; for this subject the registry is covered by targeted " + "CCPA/GDPR deletion emails (`registry --search` then `send-email`), " + "not a single portal request.") + elif drop_filed: + coverage["note"] = "DROP already filed; registry deletions are in the brokers' hands." + + next_wake = _min_future_recheck(ledger, at) + return { + "subject": subject_id, + "autonomy": autonomy, + "phase": batch.get("phase"), + "counts": batch.get("counts"), + "actions": actions, + "human_digest": digest, + "coverage": coverage, + "done_for_now": not actions, + "fully_done": not actions and not digest and not next_wake, + "next_wake_at": next_wake, + "note": ("assisted mode: pause for operator confirmation on every action with confirm_first=true" + if confirm_first else + "full autonomy: recorded intake consent authorizes these submissions; do not pause. " + "Present human_digest ONCE at the end of the run, not per item."), + } diff --git a/optional-skills/security/unbroker/scripts/badbool.py b/optional-skills/security/unbroker/scripts/badbool.py new file mode 100644 index 00000000000..9a415ceef4b --- /dev/null +++ b/optional-skills/security/unbroker/scripts/badbool.py @@ -0,0 +1,177 @@ +"""Pull and parse the Big-Ass Data Broker Opt-Out List (BADBOOL) into broker records. + +BADBOOL (https://github.com/yaelwrites/Big-Ass-Data-Broker-Opt-Out-List) is a +maintained, frequently-updated markdown list. `refresh` fetches it and parses the +"People Search Sites" section into records that merge UNDER the curated DB (curated +records always win). Auto-parsed records carry source="BADBOOL-auto" and +confidence="auto" so the agent treats their URLs as best guesses to verify first. + +`parse()` is pure (markdown in, records out) so it is tested offline; `fetch()` is +the only network call and can be bypassed by passing markdown directly to refresh(). +""" +from __future__ import annotations + +import re +import urllib.request +from pathlib import Path + +import storage + +DEFAULT_URL = ( + "https://raw.githubusercontent.com/yaelwrites/" + "Big-Ass-Data-Broker-Opt-Out-List/master/README.md" +) +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + +# BADBOOL legend symbols. +SYMBOLS = { + "crucial": "\U0001F490", # 💐 + "high": "\u2620", # ☠ + "gov_id": "\U0001F3AB", # 🎫 + "phone": "\U0001F4DE", # 📞 + "payment": "\U0001F4B0", # 💰 +} + +_LINK_RE = re.compile(r"\[([^\]]+)\]\(([^)]+)\)") +_OPTOUT_HINT = re.compile( + r"opt[\- ]?out|optout|removal|remove|suppress|control-privacy|delete", re.I +) +_FIND_HINT = re.compile(r"find|your information|search|look ?up|look for", re.I) + + +def slug(name: str) -> str: + # Drop a trailing .com/.org/.info on the displayed name so "FastPeopleSearch.com" + # matches the curated id "fastpeoplesearch"; keep .net/.id so distinct sites differ. + n = re.sub(r"\.(com|org|info)\b", "", name.strip(), flags=re.I) + return re.sub(r"[^a-z0-9]+", "", n.lower()) + + +def _heading_flags(heading: str) -> tuple[str, dict]: + flags = {key: (sym in heading) for key, sym in SYMBOLS.items()} + name = heading + for sym in SYMBOLS.values(): + name = name.replace(sym, "") + name = name.replace("\ufe0f", "").strip() + return name, flags + + +def _priority(flags: dict) -> str: + if flags["crucial"]: + return "crucial" + if flags["high"]: + return "high" + return "standard" + + +def _pick(links: list[tuple[str, str]], hint: re.Pattern) -> str | None: + for _text, url in links: + if hint.search(url): + return url + for text, url in links: + if hint.search(text): + return url + return None + + +def _clean(text: str) -> str: + return re.sub(r"\s+", " ", text).strip()[:600] + + +def _build(name: str, flags: dict, body: str) -> dict: + links = _LINK_RE.findall(body) + web = [(t, u) for t, u in links if u.lower().startswith("http")] + mailtos = [u[7:] for _t, u in links if u.lower().startswith("mailto:")] + optout_url = _pick(web, _OPTOUT_HINT) + search_url = _pick(web, _FIND_HINT) or (web[0][1] if web else None) + + if flags["phone"]: + method = "phone" + elif optout_url: + method = "web_form" + elif mailtos: + method = "email" + else: + method = "manual" + + return { + "id": slug(name), + "name": name, + "category": "people_search", + "priority": _priority(flags), + "jurisdictions": ["US"], + "search": {"method": "url_pattern", "url": search_url, "fetch": "browser", + "match_signal": "result", "by": ["name", "phone", "address"]}, + "optout": { + "method": method, + "url": optout_url, + "email": mailtos[0] if mailtos else None, + "requires": { + "gov_id": flags["gov_id"], + "phone_voice": flags["phone"], + "payment": flags["payment"], + "email_verification": False, + "captcha": False, + "account": False, + "phone_callback": False, + }, + "inputs": ["full_name", "contact_email"], + "notes": _clean(body), + "links": [{"text": t, "url": u} for t, u in links], + "est_processing_days": 14, # unknown for auto records; drives next_recheck_at + }, + "source": "BADBOOL-auto", + "confidence": "auto", + "last_verified": None, + } + + +def parse(markdown: str) -> list[dict]: + """Parse the 'People Search Sites' section of BADBOOL into broker records.""" + records: list[dict] = [] + in_people = False + heading: str | None = None + body: list[str] = [] + + def flush() -> None: + nonlocal heading, body + if heading is not None: + name, flags = _heading_flags(heading) + if name: + records.append(_build(name, flags, "\n".join(body).strip())) + heading, body = None, [] + + for line in markdown.splitlines(): + if line.startswith("## "): + flush() + in_people = line[3:].strip().lower().startswith("people search") + continue + if not in_people: + continue + if line.startswith("### "): + flush() + heading = line[4:].strip() + elif heading is not None: + body.append(line) + flush() + return records + + +def fetch(url: str = DEFAULT_URL, timeout: int = 30) -> str: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 + return resp.read().decode("utf-8", errors="replace") + + +MIN_EXPECTED = 20 # BADBOOL's People Search section lists ~47; far fewer => upstream reorg, warn + + +def refresh(cache_path: Path, url: str = DEFAULT_URL, markdown: str | None = None) -> dict: + """Fetch (or accept) BADBOOL markdown, parse it, and write the snapshot cache.""" + md = markdown if markdown is not None else fetch(url) + records = parse(md) + storage.write_json(cache_path, records) + out = {"parsed": len(records), "cache_path": str(cache_path), "source_url": url} + if len(records) < MIN_EXPECTED: + out["warning"] = (f"only {len(records)} parsed (expected >{MIN_EXPECTED}); BADBOOL's " + "'People Search Sites' section may have moved/reorganized - check the parser") + return out diff --git a/optional-skills/security/unbroker/scripts/brokers.py b/optional-skills/security/unbroker/scripts/brokers.py new file mode 100644 index 00000000000..4cb63a5c6b0 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/brokers.py @@ -0,0 +1,77 @@ +"""Load and query the broker database (references/brokers/*.json). + +Each broker is one JSON file for clean diffs/PRs. Files beginning with `_` are +ignored (reserved for notes/scratch). +""" +from __future__ import annotations + +import json +from pathlib import Path + +import paths +import storage + +PRIORITY_ORDER = {"crucial": 0, "high": 1, "standard": 2, "long_tail": 3} + + +def _load_curated(directory: Path | None = None) -> list[dict]: + directory = directory or paths.brokers_dir() + out: list[dict] = [] + if not directory.exists(): + return out + for fp in sorted(directory.glob("*.json")): + if fp.name.startswith("_"): + continue + out.append(json.loads(fp.read_text(encoding="utf-8"))) + return out + + +def load_live_cache() -> list[dict]: + """Records pulled from BADBOOL via `refresh-brokers` (empty until refreshed).""" + return storage.read_json(paths.brokers_cache_path(), []) or [] + + +def load_registry_cache() -> list[dict]: + """CA Data Broker Registry records (separate coverage lane; empty until refreshed). + + Kept OUT of load_all() by default: these are not people-search sites to scan, they + are worked via the CA DROP one-shot + CCPA email. Consumers of the scan/plan/fanout + pipeline must not receive them; use this directly for coverage counts and the DROP/ + email lanes. + """ + return storage.read_json(paths.registry_cache_path(), []) or [] + + +def load_all(directory: Path | None = None, include_live: bool = True) -> list[dict]: + """Curated records, with live BADBOOL records merged underneath (curated wins).""" + merged: dict[str, dict] = {b["id"]: b for b in _load_curated(directory)} + if include_live: + for b in load_live_cache(): + bid = b.get("id") + if bid and bid not in merged: + merged[bid] = b + out = list(merged.values()) + out.sort(key=lambda b: (PRIORITY_ORDER.get(b.get("priority", "standard"), 9), b.get("id", ""))) + return out + + +def get(broker_id: str, directory: Path | None = None) -> dict | None: + for b in load_all(directory): + if b.get("id") == broker_id: + return b + return None + + +def by_priority(*levels: str, directory: Path | None = None) -> list[dict]: + wanted = set(levels) if levels else None + return [b for b in load_all(directory) if wanted is None or b.get("priority") in wanted] + + +def clusters(directory: Path | None = None) -> dict[str, list[str]]: + """Map a parent broker id -> child site ids it can clear (force-multipliers).""" + out: dict[str, list[str]] = {} + for b in load_all(directory): + owns = b.get("owns") or [] + if owns: + out[b["id"]] = list(owns) + return out diff --git a/optional-skills/security/unbroker/scripts/config.py b/optional-skills/security/unbroker/scripts/config.py new file mode 100644 index 00000000000..7f53554fe80 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/config.py @@ -0,0 +1,124 @@ +"""Install-wide configuration with easiest-first defaults. + +Everything works zero-config. `setup --auto` (the autonomous path) detects what +this environment can do and picks the MOST AUTONOMOUS valid configuration without +asking anyone; plain `setup` keeps the easiest-first defaults and only upgrades a +setting when a flag opts in. + +`autonomy` is policy, orthogonal to capability: + full - intake consent is standing authorization; the agent submits T0-T2 + opt-outs without pausing per submission (default). + assisted - the agent pauses for operator confirmation before each submission. +""" +from __future__ import annotations + +import os +from pathlib import Path +from shutil import which + +import emailer +import paths +import storage + +DEFAULT_CONFIG = { + "autonomy": "full", # hands-off after intake+consent + "email_mode": "draft_only", # zero credentials + "browser_backend": "auto", # auto = Browserbase when BROWSERBASE_API_KEY is set + # (recommended default; clears soft CAPTCHAs), else plain browser + "tracker_backend": "local-json", # no external dependency + "encryption": "none", # files still written 0600 + "default_rescan_interval_days": 120, + "email_min_interval_seconds": 20, # pace SMTP sends so a run can't torch the account +} + +VALID = { + "autonomy": {"full", "assisted"}, + # email_mode: + # draft_only - render drafts; the operator sends + clicks verify links (zero setup) + # browser - the agent sends + opens verify links through the operator's logged-in + # webmail via browser_* tools (NO password stored; needs a browser the + # operator's inbox is signed into) + # programmatic - CLI sends via SMTP + reads verify links via IMAP (needs EMAIL_* creds) + # alias - AgentMail agent-owned inboxes / per-broker aliases + "email_mode": {"draft_only", "browser", "programmatic", "alias"}, + "browser_backend": {"auto", "browserbase", "agent-browser", "camofox"}, + "tracker_backend": {"local-json", "google-sheets"}, + "encryption": {"none", "age"}, +} + + +def load_config() -> dict: + cfg = dict(DEFAULT_CONFIG) + cfg.update(storage.read_json(paths.config_path(), {}) or {}) + return cfg + + +def save_config(cfg: dict) -> Path: + merged = dict(DEFAULT_CONFIG) + merged.update(cfg) + for key, allowed in VALID.items(): + if merged.get(key) not in allowed: + raise ValueError(f"invalid {key!r}: {merged.get(key)!r} (allowed: {sorted(allowed)})") + return storage.write_json(paths.config_path(), merged) + + +def detect_capabilities(env: dict | None = None) -> dict: + """Report which opt-in upgrades are available without extra setup.""" + env = os.environ if env is None else env + home = paths.hermes_home() + google = ( + (home / "google_token.json").exists() + or (home / "skills" / "productivity" / "google-workspace").exists() + or (home / "skills" / "google-workspace").exists() + ) + mail = emailer.available(env) + return { + "browserbase": bool(env.get("BROWSERBASE_API_KEY")), + "agentmail": bool(env.get("AGENTMAIL_API_KEY")), + "email_imap_smtp": bool(env.get("EMAIL_ADDRESS") and env.get("EMAIL_PASSWORD")), + "smtp_send": mail["smtp"], # CLI can SEND opt-out emails itself + "imap_read": mail["imap"], # CLI can POLL verification links itself + "google_workspace": google, + "age": which("age") is not None, + } + + +def auto_configure(env: dict | None = None) -> dict: + """Pick the most autonomous configuration this environment supports (no questions). + + - email: programmatic when SMTP creds exist (CLI sends + IMAP-verifies itself); + alias mode when only AgentMail exists; draft_only as the capability floor. + - browser: browserbase when the key exists (clears soft CAPTCHAs -> more T1). + - encryption: age when the binary is installed (free privacy, zero human cost). + - tracker: stays local-json (google-sheets needs a sheet id -> a human choice). + """ + caps = detect_capabilities(env) + cfg = load_config() + cfg["autonomy"] = "full" + if caps["smtp_send"]: + cfg["email_mode"] = "programmatic" + elif caps["agentmail"]: + cfg["email_mode"] = "alias" + else: + cfg["email_mode"] = "draft_only" + cfg["browser_backend"] = "browserbase" if caps["browserbase"] else "auto" + if caps["age"]: + cfg["encryption"] = "age" + return cfg + + +def browser_clears_captcha(cfg: dict, env: dict | None = None) -> bool: + """True if the chosen browser backend can clear soft CAPTCHAs (shifts T2 -> T1). + + Browserbase is the recommended default: a real residential-IP cloud browser passes + soft/managed challenges (Turnstile, hCaptcha/reCAPTCHA checkbox) as normal operation. + This is NOT solving/spoofing - hard interactive challenges still escalate to a human. + `auto` inherits this whenever BROWSERBASE_API_KEY is present. + """ + backend = cfg.get("browser_backend", "auto") + if backend == "browserbase": + return True + if backend == "auto": + env = os.environ if env is None else env + return bool(env.get("BROWSERBASE_API_KEY")) + return False diff --git a/optional-skills/security/unbroker/scripts/crypto.py b/optional-skills/security/unbroker/scripts/crypto.py new file mode 100644 index 00000000000..98594f5e840 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/crypto.py @@ -0,0 +1,88 @@ +"""At-rest encryption for sensitive files via the `age` binary (optional). + +Engaged ONLY when config `encryption: age` AND an age identity key exists AND the +`age`/`age-keygen` binaries are available. When engaged, JSON docs under +`subjects/` (dossier, ledger) are written as `.age` ciphertext; the audit +log (field NAMES + states only, no raw PII values), `config.json`, and the broker +cache stay plaintext so the engine can read them. + +Threat model (be honest): this protects against casual disk inspection, accidental +`git add`/commits, screen-shares, and backup/cloud-sync leakage. The identity key +defaults to living beside the data at `$PDD_DATA_DIR/age-identity.txt` (0600); set +`PDD_AGE_IDENTITY` to a separate volume/token for true key separation. It does NOT +protect against an attacker who can already read your whole HERMES_HOME (they get +key + data together). +""" +from __future__ import annotations + +import json +import subprocess +from pathlib import Path +from shutil import which + +import paths + + +def age_available() -> bool: + return which("age") is not None and which("age-keygen") is not None + + +def encryption_setting() -> str: + """Read `encryption` straight from config.json (no config/storage import => no cycle).""" + cfg = paths.config_path() + if not cfg.exists(): + return "none" + try: + return (json.loads(cfg.read_text(encoding="utf-8")) or {}).get("encryption", "none") + except (ValueError, OSError): + return "none" + + +def identity_path() -> Path: + return paths.age_identity_path() + + +def ensure_identity() -> Path: + """Generate an age identity (X25519 keypair) if missing; return its path.""" + if not age_available(): + raise RuntimeError("`age`/`age-keygen` not found; cannot enable encryption") + p = identity_path() + if not p.exists(): + p.parent.mkdir(parents=True, exist_ok=True) + try: + p.parent.chmod(0o700) + except OSError: + pass + subprocess.run(["age-keygen", "-o", str(p)], check=True, capture_output=True) + try: + p.chmod(0o600) + except OSError: + pass + return p + + +def recipient() -> str: + """The age public key (recipient) for the identity, parsed from its header.""" + p = ensure_identity() + for line in p.read_text(encoding="utf-8").splitlines(): + s = line.strip() + if s.lower().startswith("# public key:"): + return s.split(":", 1)[1].strip() + if s.startswith("age1"): + return s + raise RuntimeError(f"no public key found in {p}") + + +def is_engaged() -> bool: + """True only when encryption is actually active (configured + available + key present).""" + return encryption_setting() == "age" and age_available() and identity_path().exists() + + +def encrypt(data: bytes) -> bytes: + out = subprocess.run(["age", "-r", recipient()], input=data, capture_output=True, check=True) + return out.stdout + + +def decrypt(data: bytes) -> bytes: + out = subprocess.run(["age", "-d", "-i", str(identity_path())], input=data, capture_output=True, check=True) + return out.stdout diff --git a/optional-skills/security/unbroker/scripts/dossier.py b/optional-skills/security/unbroker/scripts/dossier.py new file mode 100644 index 00000000000..50b4c8c6b10 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/dossier.py @@ -0,0 +1,135 @@ +"""Subject dossier management + consent gate + least-disclosure field selection.""" +from __future__ import annotations + +import datetime as _dt +import hashlib +import os +from pathlib import Path + +import paths +import storage + +# Identifiers we never volunteer in an opt-out (would expand exposure, not reduce it). +NEVER_VOLUNTEER = {"ssn", "social_security_number", "passport", "drivers_license"} + +VALID_CONSENT_METHODS = {"self", "written_authorization", "poa"} + + +def now() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def new_subject_id(full_name: str = "") -> str: + # Opaque id: derives NOTHING from the name, so PII never leaks into directory names, + # case ids, drafts, or the audit log. full_name kept only for call compatibility. + return "sub_" + hashlib.sha1(os.urandom(8)).hexdigest()[:10] + + +def create(identity: dict, consent: dict, residency: str = "US", prefs: dict | None = None) -> dict: + dossier = { + "subject_id": new_subject_id(identity.get("full_name", "subject")), + "consent": consent, + "identity": identity, + "residency_jurisdiction": residency, + "preferences": prefs or {"email_mode": "draft_only", "rescan_interval_days": 120}, + "created_at": now(), + } + save(dossier) + return dossier + + +def load(subject_id: str) -> dict | None: + return storage.read_json(paths.dossier_path(subject_id), None) + + +def save(dossier: dict) -> Path: + return storage.write_json(paths.dossier_path(dossier["subject_id"]), dossier) + + +def is_authorized(dossier: dict) -> bool: + c = dossier.get("consent") or {} + return bool(c.get("authorized")) and c.get("method") in VALID_CONSENT_METHODS + + +def require_authorized(dossier: dict) -> None: + if not is_authorized(dossier): + raise PermissionError( + f"subject {dossier.get('subject_id')!r} has no recorded authorization; refusing to act" + ) + + +def all_names(dossier: dict) -> list[str]: + """Primary name + aliases (maiden/married/nicknames), deduped, in priority order.""" + ident = dossier.get("identity", {}) + out: list[str] = [] + seen: set[str] = set() + for n in [ident.get("full_name"), *(ident.get("also_known_as") or [])]: + if n and n.lower() not in seen: + seen.add(n.lower()) + out.append(n) + return out + + +def all_addresses(dossier: dict) -> list[dict]: + """Current + prior addresses, each tagged with `kind` (current|prior).""" + ident = dossier.get("identity", {}) + out: list[dict] = [] + cur = ident.get("current_address") + if cur: + out.append({**cur, "kind": cur.get("kind", "current")}) + for a in ident.get("prior_addresses") or []: + out.append({**a, "kind": a.get("kind", "prior")}) + return out + + +def all_locations(dossier: dict) -> list[dict]: + """Distinct city/state pairs across all addresses (the vectors for name searches).""" + out: list[dict] = [] + seen: set[tuple] = set() + for a in all_addresses(dossier): + city = a.get("city") + key = ((city or "").lower(), (a.get("state") or "").lower()) + if city and key not in seen: + seen.add(key) + out.append({"city": city, "state": a.get("state")}) + return out + + +def contact_email(dossier: dict) -> str | None: + """The single email used for opt-out correspondence (designated, else the first).""" + ident = dossier.get("identity", {}) + prefs = dossier.get("preferences", {}) + emails = ident.get("emails") or [] + return prefs.get("contact_email_for_optouts") or (emails[0] if emails else None) + + +def select_disclosure(dossier: dict, inputs: list[str], override_email: str | None = None) -> dict: + """Return ONLY the dossier fields a broker's opt-out actually requires. + + Enforces least-disclosure: skips anything in NEVER_VOLUNTEER, and skips + `profile_url` (that is captured per-listing at submit time, not from the dossier). + A single contact email is used for correspondence even when the subject has several + (see all_names / all_addresses / search vectors for using every alternate to *find* listings). + """ + ident = dossier.get("identity", {}) + addr = ident.get("current_address") or {} + phones = ident.get("phones") or [] + available = { + "full_name": ident.get("full_name"), + "first_name": (ident.get("full_name") or "").split(" ")[0] or None, + "contact_email": override_email or contact_email(dossier), + "current_address": addr or None, + "street": addr.get("line1"), + "city": addr.get("city"), + "state": addr.get("state"), + "postal": addr.get("postal"), + "date_of_birth": ident.get("date_of_birth"), + "phone": phones[0] if phones else None, + } + out: dict = {} + for key in inputs: + if key in NEVER_VOLUNTEER or key == "profile_url": + continue + if available.get(key) is not None: + out[key] = available[key] + return out diff --git a/optional-skills/security/unbroker/scripts/email_modes.py b/optional-skills/security/unbroker/scripts/email_modes.py new file mode 100644 index 00000000000..d5b40eb8495 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/email_modes.py @@ -0,0 +1,76 @@ +"""Email modes A/B/C helpers + anti-phishing verification-link extraction. + +Mode A (default): render a ready-to-send draft to disk; the operator sends it. +Mode B/C: the agent SENDS via a Hermes email mechanism (IMAP/SMTP gateway, +`himalaya`, AgentMail, or Gmail via `google-workspace`) and READS the reply to +resolve the verification link with `extract_verification_link`. Those transports +are driven by the agent through native tools; this module stays network-free so +the hermetic tests pass. +""" +from __future__ import annotations + +import re +from pathlib import Path + +import legal +import paths + +_LINK_RE = re.compile(r"https?://[^\s\"'<>)\]]+", re.IGNORECASE) +_VERIFY_HINTS = ("opt", "remov", "verif", "confirm", "unsubscrib", "suppress", "delete", "privacy") + + +def render_draft(broker: dict, fields: dict, out_dir: Path | None = None) -> Path: + """Mode A: write a ready-to-send opt-out email for the operator to send.""" + body = legal.render_optout_email(broker, fields) + out_dir = out_dir or (paths.data_dir() / "drafts") + out_dir.mkdir(parents=True, exist_ok=True) + fp = out_dir / f"{broker.get('id', 'broker')}.txt" + fp.write_text(body, encoding="utf-8") + return fp + + +def render_request_draft(broker: dict, fields: dict, kind: str = "generic", + out_dir: Path | None = None) -> Path: + """Mode A: write a ready-to-send request of a specific KIND. + + kind: generic | ccpa | ccpa_agent | ccpa_indirect | gdpr. Used for indirect-exposure + (ccpa_indirect) and explicit legal requests, where the generic opt-out wording is wrong. + The filename is suffixed with the kind so an indirect request does not overwrite an opt-out draft. + """ + body = legal.render_request(kind, broker, fields) + out_dir = out_dir or (paths.data_dir() / "drafts") + out_dir.mkdir(parents=True, exist_ok=True) + suffix = "" if kind == "generic" else f"-{kind}" + fp = out_dir / f"{broker.get('id', 'broker')}{suffix}.txt" + fp.write_text(body, encoding="utf-8") + return fp + + +def extract_verification_link(email_body: str, broker: dict | None = None) -> str | None: + """Return the most likely opt-out/verification link from an email body. + + Anti-phishing: a link is only returned if its URL matches an opt-out hint + and/or the broker's own domain; arbitrary links score 0 and are ignored. + """ + candidates = _LINK_RE.findall(email_body or "") + if not candidates: + return None + + domain = "" + if broker: + url = (broker.get("optout") or {}).get("url") or (broker.get("search") or {}).get("url") or "" + m = re.search(r"https?://([^/]+)", url) + if m: + domain = m.group(1).replace("www.", "") + + best_score, best_link = 0, None + for link in candidates: + low = link.lower() + score = 0 + if any(h in low for h in _VERIFY_HINTS): + score += 2 + if domain and domain in low: + score += 3 + if score > best_score: + best_score, best_link = score, link + return best_link diff --git a/optional-skills/security/unbroker/scripts/emailer.py b/optional-skills/security/unbroker/scripts/emailer.py new file mode 100644 index 00000000000..927bc153565 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/emailer.py @@ -0,0 +1,342 @@ +"""Programmatic email (Mode B) via stdlib smtplib/imaplib - no human in the loop. + +This is what turns email opt-outs autonomous: `send()` delivers the rendered +request straight to the broker's known opt-out address, and `find_verification_link()` +polls the inbox for the broker's confirmation email and extracts the link (scored +by email_modes.extract_verification_link, so arbitrary/phishing links are ignored). +The agent still OPENS the link with its own browser - several brokers bind the +verification session to the browser that opens it (see the intelius record). + +Configuration comes from the same env vars the Hermes email gateway uses: + EMAIL_ADDRESS / EMAIL_PASSWORD (required for Mode B) + EMAIL_SMTP_HOST / EMAIL_SMTP_PORT (optional; inferred for common providers) + EMAIL_IMAP_HOST / EMAIL_IMAP_PORT (optional; inferred for common providers) + +Anti-misuse: `send()` refuses a recipient that is not the broker record's own +opt-out/privacy address - this module cannot be repurposed to email arbitrary people. +All network calls live behind small functions that the hermetic tests monkeypatch. +""" +from __future__ import annotations + +import email as _email +import email.utils +import imaplib +import json +import os +import re +import smtplib +import time +from email.message import EmailMessage +from pathlib import Path + +import email_modes +import paths + +# provider domain -> (smtp_host, smtp_port, imap_host, imap_port) +PROVIDERS = { + "gmail.com": ("smtp.gmail.com", 587, "imap.gmail.com", 993), + "googlemail.com": ("smtp.gmail.com", 587, "imap.gmail.com", 993), + "outlook.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "hotmail.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "live.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "yahoo.com": ("smtp.mail.yahoo.com", 587, "imap.mail.yahoo.com", 993), + "icloud.com": ("smtp.mail.me.com", 587, "imap.mail.me.com", 993), + "me.com": ("smtp.mail.me.com", 587, "imap.mail.me.com", 993), + "fastmail.com": ("smtp.fastmail.com", 587, "imap.fastmail.com", 993), +} + + +def _domain(address: str) -> str: + return address.rsplit("@", 1)[-1].lower() if "@" in address else "" + + +def smtp_settings(env: dict | None = None) -> dict | None: + """SMTP connection settings, or None when sending is not configured.""" + env = os.environ if env is None else env + address, password = env.get("EMAIL_ADDRESS"), env.get("EMAIL_PASSWORD") + if not (address and password): + return None + inferred = PROVIDERS.get(_domain(address)) + host = env.get("EMAIL_SMTP_HOST") or (inferred[0] if inferred else None) + if not host: + return None # unknown provider and no explicit host + port = int(env.get("EMAIL_SMTP_PORT") or (inferred[1] if inferred else 587)) + return {"host": host, "port": port, "address": address, "password": password} + + +def imap_settings(env: dict | None = None) -> dict | None: + """IMAP connection settings, or None when inbox reading is not configured.""" + env = os.environ if env is None else env + address, password = env.get("EMAIL_ADDRESS"), env.get("EMAIL_PASSWORD") + if not (address and password): + return None + inferred = PROVIDERS.get(_domain(address)) + host = env.get("EMAIL_IMAP_HOST") or (inferred[2] if inferred else None) + if not host: + return None + port = int(env.get("EMAIL_IMAP_PORT") or (inferred[3] if inferred else 993)) + return {"host": host, "port": port, "address": address, "password": password} + + +def available(env: dict | None = None) -> dict: + return {"smtp": smtp_settings(env) is not None, "imap": imap_settings(env) is not None} + + +# --- sending ------------------------------------------------------------------ + +def broker_addresses(broker: dict) -> list[str]: + """Every address the broker record itself declares (the ONLY valid recipients). + + Includes the primary opt-out email, the right-to-delete lane's email + (optout.deletion.email), and any mailto: links parsed from BADBOOL. + """ + opt = broker.get("optout") or {} + out = [a for a in [opt.get("email"), (opt.get("deletion") or {}).get("email")] if a] + for link in opt.get("links") or []: + url = (link.get("url") or "") + if url.lower().startswith("mailto:"): + out.append(url[7:].split("?")[0]) + seen: set[str] = set() + deduped = [] + for a in out: + if a.lower() not in seen: + seen.add(a.lower()) + deduped.append(a) + return deduped + + +def _split_subject_body(text: str) -> tuple[str, str]: + """Templates start with a 'Subject: ...' line; split it out for the MIME header.""" + lines = text.splitlines() + if lines and lines[0].lower().startswith("subject:"): + return lines[0].split(":", 1)[1].strip(), "\n".join(lines[1:]).lstrip("\n") + return "Data removal request", text + + +def browser_send_payload(broker: dict, body_text: str, to: str | None = None) -> dict: + """Build a recipient-locked {to, subject, body} for the agent to send via browser webmail. + + No network and no credentials: the deterministic part (recipient-lock to the broker's own + declared address, subject/body split) happens here; the agent then composes and sends it in + the operator's logged-in webmail with browser_* tools. Same recipient guard as `send()`, so + the browser lane cannot be pointed at an arbitrary person either. + """ + allowed = broker_addresses(broker) + if not allowed: + raise RuntimeError(f"broker {broker.get('id')!r} declares no opt-out email address") + recipient = to or allowed[0] + if recipient.lower() not in {a.lower() for a in allowed}: + raise PermissionError( + f"refusing to target {recipient!r}: not an address the broker record declares " + f"(allowed: {allowed})" + ) + subject, body = _split_subject_body(body_text) + return {"to": recipient, "subject": subject, "body": body} + + +def _rate_limit_path() -> Path: + return paths.data_dir() / "email-rate.json" + + +def _respect_rate_limit(min_interval: float, sleep, now, state_path=None) -> None: + """Pace sends across CLI invocations so a run can't torch the sending account. + + Persists the last-send wall-clock time; if the next send is too soon, sleep the + remainder. Cross-process because each `send-email` is a separate invocation. + """ + if min_interval <= 0: + return + p = state_path or _rate_limit_path() + last = 0.0 + try: + last = float(json.loads(p.read_text(encoding="utf-8")).get("last", 0.0)) + except (OSError, ValueError, TypeError): + last = 0.0 + wait = min_interval - (now() - last) + if wait > 0: + sleep(min(wait, min_interval)) + try: + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps({"last": now()}), encoding="utf-8") + except OSError: + pass + + +# SMTP errors that are permanent (don't retry) vs transient (retry with backoff). +_SMTP_PERMANENT = (smtplib.SMTPAuthenticationError, smtplib.SMTPRecipientsRefused, + smtplib.SMTPSenderRefused, smtplib.SMTPDataError) + + +def send(broker: dict, body_text: str, to: str | None = None, + env: dict | None = None, _smtp_factory=None, + min_interval: float = 0.0, max_retries: int = 3, + _sleep=time.sleep, _now=time.time, _rate_state=None) -> dict: + """Send an opt-out/legal request to the broker's own opt-out address. + + Recipient is locked to an address the broker record declares (PermissionError + otherwise). `min_interval` paces sends across invocations (deliverability / + account-safety); transient SMTP/socket failures retry with exponential backoff, + permanent ones (auth, recipient refused) raise immediately. NOTE: a successful + SMTP handoff is NOT proof of delivery - real bounces arrive later as inbound mail; + in programmatic mode `poll-verification`/inbox review surfaces them, and the + due-queue re-scan is the true confirmation. Returns send metadata. + """ + settings = smtp_settings(env) + if not settings: + raise RuntimeError( + "programmatic email not configured (need EMAIL_ADDRESS + EMAIL_PASSWORD, and " + "EMAIL_SMTP_HOST for non-mainstream providers); fall back to `render-email` drafts" + ) + allowed = broker_addresses(broker) + if not allowed: + raise RuntimeError(f"broker {broker.get('id')!r} declares no opt-out email address") + recipient = to or allowed[0] + if recipient.lower() not in {a.lower() for a in allowed}: + raise PermissionError( + f"refusing to send to {recipient!r}: not an address the broker record declares " + f"(allowed: {allowed})" + ) + + subject, body = _split_subject_body(body_text) + msg = EmailMessage() + msg["From"] = settings["address"] + msg["To"] = recipient + msg["Subject"] = subject + msg["Date"] = email.utils.formatdate(localtime=True) + msg["Message-ID"] = email.utils.make_msgid() + msg.set_content(body) + + _respect_rate_limit(min_interval, _sleep, _now, _rate_state) + + factory = _smtp_factory or smtplib.SMTP + attempts = 0 + while True: + attempts += 1 + try: + with factory(settings["host"], settings["port"], timeout=30) as smtp: + smtp.ehlo() + try: + smtp.starttls() + smtp.ehlo() + except smtplib.SMTPNotSupportedError: + pass # already-TLS ports / test doubles + smtp.login(settings["address"], settings["password"]) + smtp.send_message(msg) + break + except _SMTP_PERMANENT: + raise # auth / recipient refused: retrying won't help + except (smtplib.SMTPException, OSError) as exc: + if attempts > max_retries: + raise RuntimeError(f"SMTP send failed after {attempts} attempts: {exc}") from exc + _sleep(min(2 ** (attempts - 1), 30)) # 1s, 2s, 4s... capped + return {"to": recipient, "subject": subject, "message_id": msg["Message-ID"], + "from": settings["address"], "attempts": attempts, + "delivery_note": "SMTP accepted; not proof of delivery - a bounce would arrive as " + "inbound mail. The due-queue re-scan is the real confirmation."} + + +# --- inbox polling ------------------------------------------------------------ + +def _decode_part(part) -> str: + try: + payload = part.get_payload(decode=True) + if payload is None: + return "" + charset = part.get_content_charset() or "utf-8" + return payload.decode(charset, errors="replace") + except Exception: # noqa: BLE001 - malformed MIME must not kill the poll + return "" + + +def message_text(msg) -> str: + """All text/plain + text/html content of a parsed email message.""" + chunks: list[str] = [] + if msg.is_multipart(): + for part in msg.walk(): + if part.get_content_type() in ("text/plain", "text/html"): + chunks.append(_decode_part(part)) + else: + chunks.append(_decode_part(msg)) + return "\n".join(c for c in chunks if c) + + +def _broker_domains(broker: dict) -> list[str]: + """Domains this broker legitimately mails from (site domains + optout email domain).""" + domains: list[str] = [] + for section in ("optout", "search"): + url = ((broker.get(section) or {}).get("url")) or "" + m = re.search(r"https?://([^/]+)", url) + if m: + domains.append(m.group(1).lower().removeprefix("www.")) + opt_email = (broker.get("optout") or {}).get("email") + if opt_email and "@" in opt_email: + domains.append(_domain(opt_email)) + # strip subdomains to the registrable-ish tail (mailer.intelius.com -> intelius.com) + tails = {".".join(d.split(".")[-2:]) for d in domains if d} + return sorted(tails) + + +def fetch_recent(env: dict | None = None, since_days: int = 3, limit: int = 30, + _imap_factory=None) -> list[dict]: + """Fetch recent inbox messages: [{from, subject, date, text}], newest first.""" + settings = imap_settings(env) + if not settings: + raise RuntimeError("IMAP not configured (need EMAIL_ADDRESS + EMAIL_PASSWORD, and " + "EMAIL_IMAP_HOST for non-mainstream providers)") + import datetime as _dt + since = (_dt.date.today() - _dt.timedelta(days=max(0, since_days))).strftime("%d-%b-%Y") + + factory = _imap_factory or imaplib.IMAP4_SSL + conn = factory(settings["host"], settings["port"]) + try: + conn.login(settings["address"], settings["password"]) + conn.select("INBOX", readonly=True) + _typ, data = conn.search(None, "SINCE", since) + ids = (data[0].split() if data and data[0] else [])[-limit:] + out: list[dict] = [] + for mid in reversed(ids): # newest first + _typ, msg_data = conn.fetch(mid, "(RFC822)") + raw = next((p[1] for p in msg_data or [] if isinstance(p, tuple)), None) + if not raw: + continue + msg = _email.message_from_bytes(raw) + out.append({ + "from": msg.get("From", ""), + "subject": msg.get("Subject", ""), + "date": msg.get("Date", ""), + "text": message_text(msg), + }) + return out + finally: + try: + conn.logout() + except Exception: # noqa: BLE001 + pass + + +def link_from_messages(messages: list[dict], broker: dict) -> dict | None: + """Pure: find the broker's verification link in already-fetched messages. + + A message is only considered if its From domain OR any contained link matches + the broker's own domains; the link itself must pass the anti-phishing scorer. + """ + domains = _broker_domains(broker) + for m in messages: + sender = (m.get("from") or "").lower() + text = m.get("text") or "" + sender_match = any(d in sender for d in domains) + body_match = any(d in text.lower() for d in domains) + if not (sender_match or body_match): + continue + link = email_modes.extract_verification_link(text, broker) + if link: + return {"link": link, "from": m.get("from"), "subject": m.get("subject"), + "date": m.get("date")} + return None + + +def find_verification_link(broker: dict, env: dict | None = None, since_days: int = 3, + _imap_factory=None) -> dict | None: + """Poll the inbox and return the broker's verification link (or None yet).""" + messages = fetch_recent(env, since_days=since_days, _imap_factory=_imap_factory) + return link_from_messages(messages, broker) diff --git a/optional-skills/security/unbroker/scripts/ledger.py b/optional-skills/security/unbroker/scripts/ledger.py new file mode 100644 index 00000000000..e5ec331a1e4 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/ledger.py @@ -0,0 +1,164 @@ +"""Case ledger: opt-out state machine + append-only audit log. + +A "case" is one (subject x broker) record. State changes are validated against +TRANSITIONS and mirrored into audit.jsonl so every action is auditable. +""" +from __future__ import annotations + +import datetime as _dt +from pathlib import Path + +import paths +import storage + +STATES = [ + "new", "searching", "not_found", "found", "indirect_exposure", "action_selected", "submitted", + "verification_pending", "awaiting_processing", "confirmed_removed", "reappeared", + "human_task_queued", "blocked", +] + +TRANSITIONS: dict[str, set[str]] = { + "new": {"searching", "found", "not_found", "indirect_exposure", "blocked"}, + "searching": {"not_found", "found", "indirect_exposure", "blocked"}, + "not_found": {"searching", "found", "indirect_exposure", "blocked"}, + "found": {"action_selected", "submitted", "human_task_queued", "indirect_exposure", "blocked"}, + # indirect_exposure: subject's PII (email/phone/name) sits on a THIRD PARTY's record. The + # self-service opt-out form does not apply; the lever is a targeted CCPA/GDPR delete-my-PII + # request (-> submitted) or a human task. Re-scan can clear it (-> not_found) or upgrade it to a + # direct listing (-> found). + "indirect_exposure": {"submitted", "human_task_queued", "not_found", "found", "blocked"}, + "action_selected": {"submitted", "human_task_queued", "blocked"}, + "submitted": {"verification_pending", "awaiting_processing", "human_task_queued", "blocked"}, + # verification_pending -> awaiting_processing: the verify link was opened/acknowledged and the + # broker is now processing the removal (their stated window). confirmed_removed still requires a + # verifying re-scan, never the submission flow's own say-so. + "verification_pending": {"awaiting_processing", "confirmed_removed", "human_task_queued", "blocked"}, + "awaiting_processing": {"confirmed_removed", "human_task_queued", "blocked"}, + "confirmed_removed": {"reappeared", "confirmed_removed"}, + "reappeared": {"found", "indirect_exposure"}, + "human_task_queued": { + "found", "indirect_exposure", "action_selected", "submitted", "verification_pending", + "awaiting_processing", "confirmed_removed", "blocked", + }, + # blocked: automated tools (web_extract/proxyless browser) couldn't read the site. A later pass + # -- a stealth/cloud browser OR guiding the operator's own (residential) browser -- can resolve it + # to any real scan verdict, so blocked reaches not_found / indirect_exposure too, not just found. + "blocked": {"searching", "found", "not_found", "indirect_exposure", "action_selected"}, +} + + +def now() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def load(subject_id: str) -> dict: + return storage.read_json(paths.ledger_path(subject_id), {}) or {} + + +def save(subject_id: str, ledger: dict) -> Path: + return storage.write_json(paths.ledger_path(subject_id), ledger) + + +def new_case(subject_id: str, broker_id: str) -> dict: + return { + "case_id": f"case_{subject_id}_{broker_id}", + "subject_id": subject_id, + "broker_id": broker_id, + "state": "new", + "found": None, + "evidence": {}, + "disclosure_log": [], + "history": [], + } + + +def get_case(subject_id: str, broker_id: str) -> dict: + return load(subject_id).get(broker_id) or new_case(subject_id, broker_id) + + +def can_transition(old: str, new: str) -> bool: + return new == old or new in TRANSITIONS.get(old, set()) + + +def transition(subject_id: str, broker_id: str, new_state: str, **fields) -> dict: + if new_state not in STATES: + raise ValueError(f"unknown state {new_state!r}") + # Lock the whole load-modify-save so a concurrent cron re-scan / other tenant + # can't read a stale ledger and clobber this transition. + with storage.locked(paths.ledger_path(subject_id)): + ledger = load(subject_id) + case = ledger.get(broker_id) or new_case(subject_id, broker_id) + old = case.get("state", "new") + if not can_transition(old, new_state): + raise ValueError(f"illegal transition {old!r} -> {new_state!r} for broker {broker_id!r}") + case["state"] = new_state + for key, value in fields.items(): + case[key] = value + stamp = now() + case.setdefault("history", []).append({"at": stamp, "from": old, "to": new_state}) + ledger[broker_id] = case + save(subject_id, ledger) + storage.append_jsonl( + paths.audit_path(subject_id), + {"at": stamp, "broker_id": broker_id, "event": "transition", "from": old, "to": new_state}, + ) + return case + + +DEFAULT_PROCESSING_DAYS = 14 # when a broker record doesn't state est_processing_days +VERIFICATION_POLL_DAYS = 1 # how soon to re-poll for an unarrived verification email + + +def _plus_days(days: int, start: str | None = None) -> str: + base = _dt.datetime.strptime(start, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=_dt.timezone.utc) \ + if start else _dt.datetime.now(_dt.timezone.utc) + return (base + _dt.timedelta(days=days)).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def followup_fields(new_state: str, broker: dict | None = None, + dossier: dict | None = None) -> dict: + """Auto-scheduling stamps for a transition, so nobody has to remember follow-ups. + + submitted / awaiting_processing -> recheck after the broker's stated processing window; + verification_pending -> re-poll the inbox quickly; + confirmed_removed -> periodic reappearance re-scan per subject preference. + """ + if new_state in ("submitted", "awaiting_processing"): + days = ((broker or {}).get("optout") or {}).get("est_processing_days") or DEFAULT_PROCESSING_DAYS + return {"next_recheck_at": _plus_days(int(days))} + if new_state == "verification_pending": + return {"next_recheck_at": _plus_days(VERIFICATION_POLL_DAYS)} + if new_state == "confirmed_removed": + interval = ((dossier or {}).get("preferences") or {}).get("rescan_interval_days") or 120 + return {"removal_confirmed_at": now(), "next_recheck_at": _plus_days(int(interval))} + return {} + + +def due(subject_id: str, at: str | None = None, ledger: dict | None = None) -> list[dict]: + """Cases whose next_recheck_at has arrived - the autonomous follow-up queue.""" + stamp = at or now() + out = [] + for case in (ledger if ledger is not None else load(subject_id)).values(): + when = case.get("next_recheck_at") + if when and when <= stamp: + out.append(case) + out.sort(key=lambda c: c.get("next_recheck_at") or "") + return out + + +def log_disclosure(subject_id: str, broker_id: str, fields: list[str], channel: str) -> dict: + """Record exactly which PII field *names* were disclosed to a broker.""" + with storage.locked(paths.ledger_path(subject_id)): + ledger = load(subject_id) + case = ledger.get(broker_id) or new_case(subject_id, broker_id) + stamp = now() + record = {"at": stamp, "fields": sorted(fields), "channel": channel} + case.setdefault("disclosure_log", []).append(record) + ledger[broker_id] = case + save(subject_id, ledger) + storage.append_jsonl( + paths.audit_path(subject_id), + {"at": stamp, "broker_id": broker_id, "event": "disclosure", + "fields": record["fields"], "channel": channel}, + ) + return record diff --git a/optional-skills/security/unbroker/scripts/legal.py b/optional-skills/security/unbroker/scripts/legal.py new file mode 100644 index 00000000000..325687b273d --- /dev/null +++ b/optional-skills/security/unbroker/scripts/legal.py @@ -0,0 +1,63 @@ +"""Render opt-out / legal request text from templates/ with safe substitution. + +Templates use {field} placeholders. Missing fields are left literal (never crash, +never inject blanks that look like real data). Field values come from the +least-disclosure selection in dossier.select_disclosure. +""" +from __future__ import annotations + +from pathlib import Path + +import paths + + +class _SafeDict(dict): + def __missing__(self, key): # leave unknown placeholders untouched + return "{" + key + "}" + + +def template_path(name: str) -> Path: + return paths.templates_dir() / name + + +def render(template_name: str, fields: dict) -> str: + text = template_path(template_name).read_text(encoding="utf-8") + return text.format_map(_SafeDict(fields)) + + +def _join_listings(value) -> str: + if isinstance(value, (list, tuple)): + return "\n".join(str(v) for v in value) + return str(value or "") + + +def _join_identifiers(value) -> str: + """Render the subject's OWN identifiers as a bullet list for an indirect-exposure request.""" + if isinstance(value, (list, tuple)): + return "\n".join(f" - {v}" for v in value if v) + return f" - {value}" if value else "" + + +def render_optout_email(broker: dict, fields: dict) -> str: + ctx = dict(fields) + ctx.setdefault("broker_name", broker.get("name", "the data broker")) + ctx["listing_urls"] = _join_listings(fields.get("listing_urls")) + ctx.setdefault("full_name", fields.get("full_name", "[your name]")) + ctx.setdefault("contact_email", fields.get("contact_email", "[your email]")) + return render("emails/generic-optout.txt", ctx) + + +def render_request(kind: str, broker: dict, fields: dict) -> str: + """kind: generic | ccpa | ccpa_agent | ccpa_indirect | gdpr""" + template = { + "generic": "emails/generic-optout.txt", + "ccpa": "emails/ccpa-deletion.txt", + "ccpa_agent": "emails/ccpa-authorized-agent.txt", + "ccpa_indirect": "emails/ccpa-indirect-deletion.txt", + "gdpr": "emails/gdpr-erasure.txt", + }.get(kind, "emails/generic-optout.txt") + ctx = dict(fields) + ctx.setdefault("broker_name", broker.get("name", "the data broker")) + ctx["listing_urls"] = _join_listings(fields.get("listing_urls")) + ctx["my_identifiers"] = _join_identifiers(fields.get("my_identifiers")) + return render(template, ctx) diff --git a/optional-skills/security/unbroker/scripts/paths.py b/optional-skills/security/unbroker/scripts/paths.py new file mode 100644 index 00000000000..887748f4175 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/paths.py @@ -0,0 +1,79 @@ +"""Filesystem paths for the unbroker skill (stdlib only). + +All per-subject data lives under PDD_DATA_DIR (default: $HERMES_HOME/unbroker), +which is the same trust boundary Hermes uses for .env and OAuth tokens. +""" +from __future__ import annotations + +import os +from pathlib import Path + + +def hermes_home() -> Path: + return Path(os.environ.get("HERMES_HOME") or (Path.home() / ".hermes")) + + +def data_dir() -> Path: + override = os.environ.get("PDD_DATA_DIR") + return Path(override) if override else hermes_home() / "unbroker" + + +def config_path() -> Path: + return data_dir() / "config.json" + + +def subjects_dir() -> Path: + return data_dir() / "subjects" + + +def subject_dir(subject_id: str) -> Path: + return subjects_dir() / subject_id + + +def dossier_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "dossier.json" + + +def ledger_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "ledger.json" + + +def audit_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "audit.jsonl" + + +def evidence_dir(subject_id: str) -> Path: + return subject_dir(subject_id) / "evidence" + + +def skill_root() -> Path: + """The skill directory (parent of scripts/).""" + return Path(__file__).resolve().parent.parent + + +def brokers_dir() -> Path: + return skill_root() / "references" / "brokers" + + +def brokers_cache_path() -> Path: + """Live broker snapshot pulled from BADBOOL (merged under the curated DB).""" + return data_dir() / "brokers-cache" / "badbool.json" + + +def registry_cache_path() -> Path: + """CA Data Broker Registry snapshot (separate coverage lane; DROP/email, not scanned).""" + return data_dir() / "brokers-cache" / "ca-registry.json" + + +def age_identity_path() -> Path: + """age identity (private key) used for at-rest encryption when enabled. + + Defaults beside the data; point PDD_AGE_IDENTITY at a separate volume/token + for real key separation from the encrypted data. + """ + override = os.environ.get("PDD_AGE_IDENTITY") + return Path(override) if override else data_dir() / "age-identity.txt" + + +def templates_dir() -> Path: + return skill_root() / "templates" diff --git a/optional-skills/security/unbroker/scripts/pdd.py b/optional-skills/security/unbroker/scripts/pdd.py new file mode 100644 index 00000000000..09039ab4734 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/pdd.py @@ -0,0 +1,810 @@ +#!/usr/bin/env python3 +"""unbroker - deterministic CLI helper. + +The Hermes agent orchestrates scanning and opt-out submission with native tools +(`web_extract`, `browser_navigate`, email mechanisms). THIS CLI owns the +deterministic state: config, dossiers + consent, the broker DB, tier planning, +the ledger + audit log, draft/template rendering, and reports. + +Run it through the `terminal` tool (it can read PII files under HERMES_HOME); +do NOT run it through `execute_code` (that sandbox scrubs env and redacts output). + +Examples: + python pdd.py setup + python pdd.py intake --full-name "Jane Q. Public" --email jane@example.com \ + --city Oakland --state CA --residency US-CA --consent --consent-method self + python pdd.py plan sub_xxxx --priority crucial + python pdd.py record sub_xxxx spokeo found --found true \ + --evidence '{"listing_urls":["https://www.spokeo.com/..."]}' + python pdd.py render-email sub_xxxx spokeo --listing https://www.spokeo.com/... + python pdd.py status sub_xxxx +""" +from __future__ import annotations + +import argparse +import json +import os +import sys +from pathlib import Path + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +import autopilot # noqa: E402 +import badbool # noqa: E402 +import brokers as brokers_mod # noqa: E402 +import config as config_mod # noqa: E402 +import crypto # noqa: E402 +import dossier as dossier_mod # noqa: E402 +import email_modes # noqa: E402 +import emailer # noqa: E402 +import ledger as ledger_mod # noqa: E402 +import legal # noqa: E402 +import paths as paths_mod # noqa: E402 +import registry # noqa: E402 +import report as report_mod # noqa: E402 +import tiers # noqa: E402 + + +def _out(obj) -> None: + print(json.dumps(obj, indent=2, ensure_ascii=False)) + + +def _require_subject(subject_id: str) -> dict: + d = dossier_mod.load(subject_id) + if not d: + sys.exit(f"error: unknown subject {subject_id!r} (run `intake` first)") + return d + + +def cmd_setup(args) -> None: + if getattr(args, "auto", False): + # Autonomous path: detect capabilities and pick the most autonomous valid + # config without asking anyone. Explicit flags still win below. + cfg = config_mod.auto_configure() + else: + cfg = config_mod.load_config() + for key in ("autonomy", "email_mode", "browser_backend", "tracker_backend", "encryption"): + val = getattr(args, key) + if val: + cfg[key] = val + if cfg.get("encryption") == "age": + if not crypto.age_available(): + sys.exit("error: encryption=age requested but `age`/`age-keygen` not found. " + "Install age (e.g. `brew install age`) or use `--encryption none`.") + crypto.ensure_identity() # generate the key now so encryption is actually engaged + path = config_mod.save_config(cfg) + migrated = _migrate_subjects() # rewrite existing dossiers/ledgers into the new at-rest format + out = { + "config_path": str(path), + "config": cfg, + "encryption_engaged": crypto.is_engaged(), + "detected_upgrades": config_mod.detect_capabilities(), + "migrated_subjects": migrated, + "note": "Defaults are easiest-first (draft email, auto browser, local tracker, no encryption). " + "Pass flags to opt into upgrades, then run `doctor` for a readiness summary.", + } + if cfg.get("encryption") == "age": + out["age_identity"] = str(crypto.identity_path()) + _out(out) + + +def _migrate_subjects() -> int: + """Re-save each subject's dossier + ledger so they match the current at-rest format.""" + sd = paths_mod.subjects_dir() + if not sd.exists(): + return 0 + n = 0 + for child in sorted(sd.iterdir()): + if not child.is_dir(): + continue + sid = child.name + d = dossier_mod.load(sid) + if d is not None: + dossier_mod.save(d) + n += 1 + led = ledger_mod.load(sid) + if led: + ledger_mod.save(sid, led) + return n + + +def _check_writable(path) -> bool: + try: + path.mkdir(parents=True, exist_ok=True) + probe = path / ".write_test" + probe.write_text("x", encoding="utf-8") + probe.unlink() + return True + except OSError: + return False + + +def cmd_doctor(args) -> None: + import platform + + cfg = config_mod.load_config() + caps = config_mod.detect_capabilities() + data = paths_mod.data_dir() + writable = _check_writable(data) + curated = len(brokers_mod._load_curated()) + live = len(brokers_mod.load_live_cache()) + total = len(brokers_mod.load_all()) + + L = ["unbroker - readiness check", "=" * 42, + f"Python : {platform.python_version()}", + f"Data dir : {data} ({'writable' if writable else 'NOT writable'})", + f"Config : autonomy={cfg.get('autonomy', 'full')} email={cfg['email_mode']} " + f"browser={cfg['browser_backend']} " + f"tracker={cfg['tracker_backend']} encryption={cfg['encryption']}", + f"Brokers : {total} available ({curated} curated + {live} live" + + ("" if live else ", run `refresh-brokers` to expand to ~50") + ")", + "", "Opt-in upgrades:"] + rows = [ + ("Cloud browser (Browserbase) *RECOMMENDED*", caps["browserbase"], + "default backend: clears soft CAPTCHAs (Turnstile/hCaptcha) -> more T1", "set BROWSERBASE_API_KEY"), + ("Email auto (AgentMail)", caps["agentmail"], + "send + auto-verify, per-broker aliases (Mode B/C)", "install agentmail skill / set AGENTMAIL_API_KEY"), + ("Email send (CLI SMTP)", caps["smtp_send"], + "`send-email` delivers opt-outs itself (Mode B)", "set EMAIL_ADDRESS / EMAIL_PASSWORD (+ EMAIL_SMTP_HOST)"), + ("Verify-link poll (CLI IMAP)", caps["imap_read"], + "`poll-verification` reads confirmation links itself", "set EMAIL_ADDRESS / EMAIL_PASSWORD (+ EMAIL_IMAP_HOST)"), + ("Google Sheets tracker", caps["google_workspace"], + "shared status dashboard", "set up the google-workspace skill"), + ] + for name, ok, enables, how in rows: + L.append(f" [{'ON ' if ok else 'off'}] {name:<28} {enables}") + if not ok: + L.append(f" enable: {how}") + + # At-rest encryption: report TRUE engagement (configured + key present), not just binary presence. + engaged = crypto.is_engaged() + L.append(f" [{'ON ' if engaged else 'off'}] {'At-rest encryption (age)':<28} " + "encrypts dossiers + ledgers on disk") + if engaged: + L.append(f" key: {crypto.identity_path()} (0600) - guards casual/backup/commit " + "exposure, NOT a full-HERMES_HOME read") + elif cfg["encryption"] == "age": + L.append(" WARNING: encryption=age is SET but NOT engaged (age binary or key missing);" + " dossiers would be PLAINTEXT") + elif caps["age"]: + L.append(" off - dossiers are plaintext (0600). enable: `setup --encryption age`") + else: + L.append(" off - dossiers are plaintext (0600). install `age` first to enable") + + L += ["", "Verdict:", " Ready now in DRAFT mode (no setup needed): scan brokers, draft opt-out", + " emails for you to send, and track everything in the ledger."] + if caps["browserbase"]: + L.append(" Cloud browser ON (recommended default): soft/managed CAPTCHAs " + "(Turnstile/hCaptcha) clear automatically -> those brokers stay T1.") + else: + L.append(" No cloud browser: set BROWSERBASE_API_KEY (the recommended default) so soft " + "CAPTCHAs clear automatically; without it those brokers drop to T2 (human tasks).") + if cfg["email_mode"] == "draft_only": + L.append(" Email is draft-only: you send drafts + click verify links. For hands-off email " + "WITHOUT storing a password, run `setup --email-mode browser` (agent sends + opens " + "verify links via your logged-in webmail); or set EMAIL_* for SMTP/IMAP.") + elif cfg["email_mode"] == "browser": + L.append(" Email mode: browser (no password) - the agent sends opt-outs and opens verify " + "links via the operator's logged-in webmail. Ensure that inbox is signed in in the " + "browser Hermes uses (a cloud browser won't hold the session); else it falls back to drafts.") + if not crypto.is_engaged(): + L.append(" Storage: dossiers are PLAINTEXT JSON (0600 under HERMES_HOME). " + "Run `setup --encryption age` for at-rest encryption.") + if not live: + L.append(" Next: run `refresh-brokers` to load the full broker list.") + + # Freshness: warn when cached lists / curated mechanics are going stale (silent broker rot). + import time as _time + STALE_CACHE_DAYS, STALE_VERIFY_DAYS = 30, 180 + + def _age_days(p) -> float | None: + try: + return (_time.time() - p.stat().st_mtime) / 86400.0 + except OSError: + return None + + fresh = [] + for label, p in [("BADBOOL", paths_mod.brokers_cache_path()), + ("CA registry", paths_mod.registry_cache_path())]: + age = _age_days(p) + if age is None: + fresh.append(f"{label}: not pulled") + elif age > STALE_CACHE_DAYS: + fresh.append(f"{label}: {age:.0f}d old (stale, re-pull)") + stale_curated = documented = 0 + for b in brokers_mod._load_curated(): + conf = b.get("confidence") + lv = b.get("last_verified") + if conf == "documented" or not lv: + documented += 1 + continue + try: + if (_time.time() - _time.mktime(_time.strptime(lv, "%Y-%m-%d"))) / 86400.0 > STALE_VERIFY_DAYS: + stale_curated += 1 + except (ValueError, TypeError): + pass + if fresh: + L.append(" Freshness: " + "; ".join(fresh) + " (run `refresh-brokers`).") + if stale_curated or documented: + L.append(f" Freshness: {stale_curated} curated broker(s) last-verified >{STALE_VERIFY_DAYS}d ago; " + f"{documented} documented broker(s) awaiting first-use verification.") + print("\n".join(L)) + + +def cmd_intake(args) -> None: + if args.json: + data = json.loads(Path(args.json).read_text(encoding="utf-8")) + identity = data["identity"] + consent = data.get("consent", {}) + residency = data.get("residency_jurisdiction", "US") + prefs = data.get("preferences") + else: + if not args.full_name: + sys.exit("error: --full-name (or --json) is required") + identity = {"full_name": args.full_name, "emails": args.email or [], "phones": args.phone or []} + if args.alias: + identity["also_known_as"] = args.alias + if args.dob: + identity["date_of_birth"] = args.dob + addr = {k: v for k, v in {"line1": args.street, "city": args.city, + "state": args.state, "postal": args.postal}.items() if v} + if addr: + identity["current_address"] = addr + priors = [] + for loc in args.prior_location or []: + parts = [p.strip() for p in loc.split(",") if p.strip()] + if not parts: + continue + entry = {"city": parts[0]} + if len(parts) > 1: + entry["state"] = parts[1] + if len(parts) > 2: + entry["postal"] = parts[2] + priors.append(entry) + if priors: + identity["prior_addresses"] = priors + cfg = config_mod.load_config() + consent = {"authorized": bool(args.consent), "method": args.consent_method, "recorded_at": dossier_mod.now()} + residency = args.residency or "US" + prefs = { + "email_mode": args.email_mode or cfg["email_mode"], + "rescan_interval_days": cfg["default_rescan_interval_days"], + } + if args.contact_email: + prefs["contact_email_for_optouts"] = args.contact_email + d = dossier_mod.create(identity, consent, residency, prefs) + _out({"subject_id": d["subject_id"], "authorized": dossier_mod.is_authorized(d), + "residency": residency, "email_mode": (prefs or {}).get("email_mode"), + "names": dossier_mod.all_names(d), + "emails": len(d["identity"].get("emails") or []), + "phones": len(d["identity"].get("phones") or []), + "addresses": len(dossier_mod.all_addresses(d))}) + + +def cmd_brokers(args) -> None: + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + _out([ + {"id": b.get("id"), "name": b.get("name"), "priority": b.get("priority"), + "method": (b.get("optout") or {}).get("method"), "owns": b.get("owns") or [], + "source": b.get("source"), "confidence": b.get("confidence", "curated")} + for b in bl + ]) + + +def cmd_refresh_brokers(args) -> None: + res = badbool.refresh(paths_mod.brokers_cache_path()) + curated_ids = {b["id"] for b in brokers_mod._load_curated()} + new = [b["id"] for b in brokers_mod.load_live_cache() if b["id"] not in curated_ids] + out = {**res, "curated": len(curated_ids), "new_from_live": len(new), + "people_search_total": len(brokers_mod.load_all()), + "note": "Live records have confidence=auto; verify their opt-out URL before acting."} + if not getattr(args, "no_registry", False): + try: + reg = registry.refresh_all(paths_mod.registry_cache_path()) + out["registry"] = {"total": reg["total"], "sources": reg["sources"], + "portals": reg["portals"], + "note": "Coverage lane worked via the CA DROP one-shot + CCPA email, " + "not the people-search scan. VT/OR/TX are search portals (no " + "bulk export); CA is the superset. See `drop` and `registry`."} + except Exception as exc: # noqa: BLE001 - registry pull is best-effort + out["registry_error"] = str(exc) + _out(out) + + +def cmd_registry(args) -> None: + recs = brokers_mod.load_registry_cache() + if not recs: + _out({"registered_brokers": 0, + "note": "registry empty - run `refresh-brokers` (pulls the CA Data Broker Registry)"}) + return + fcra = sum(1 for r in recs if (r.get("optout") or {}).get("fcra")) + out = {"registered_brokers": len(recs), "fcra_regulated": fcra, + "source": "CA Data Broker Registry (CPPA, 2025)", "drop_url": registry.DROP_URL, + "other_state_portals": registry.portals()} + if args.search: + q = args.search.lower() + hits = [r for r in recs if q in (r.get("name") or "").lower() + or q in (r.get("id") or "") or q in ((r.get("optout") or {}).get("email") or "").lower()] + out["matches"] = [{"id": r["id"], "name": r["name"], + "email": (r.get("optout") or {}).get("email"), + "url": (r.get("optout") or {}).get("url"), + "fcra": (r.get("optout") or {}).get("fcra")} for r in hits[:args.limit]] + out["match_count"] = len(hits) + _out(out) + + +def cmd_drop(args) -> None: + """The one-shot legal lever: CA DROP deletes from ALL registered brokers at once.""" + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + reg = brokers_mod.load_registry_cache() + res = (d.get("residency_jurisdiction") or "US").upper() + eligible = res.startswith("US-CA") + if args.filed: + prefs = d.setdefault("preferences", {}) + prefs["drop_filed_at"] = dossier_mod.now() + dossier_mod.save(d) + _out({"subject": args.subject, "drop_filed_at": prefs["drop_filed_at"], + "note": "recorded; `next` will stop surfacing the DROP one-shot"}) + return + _out({ + "subject": args.subject, + "eligible": eligible, + "residency": res, + "drop_url": registry.DROP_URL, + "covers_registered_brokers": len(reg), + "steps": ([ + "Go to privacy.ca.gov/drop and create/verify a DROP account (CA resident).", + "Submit ONE deletion request; it applies to EVERY registered data broker " + f"({len(reg)} in the current registry). Brokers must process starting 2026-08-01.", + "After filing, run `drop --filed` so the loop stops re-surfacing it.", + ] if eligible else [ + "DROP is a California mechanism; this subject's residency is not US-CA.", + "Parity path for non-CA: work the people-search sites via `next`, and send targeted " + "CCPA/GDPR deletion emails to registry brokers that hold this person's data " + "(`registry --search`, then `send-email`).", + ]), + "note": "DROP is the highest-leverage removal: one request covers the whole registry.", + }) + + +def cmd_plan(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + cfg = config_mod.load_config() + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + bcc = config_mod.browser_clears_captcha(cfg) + if getattr(args, "batch", False): + _out(tiers.batch_plan(d, bl, cfg, ledger_mod.load(args.subject), bcc)) + else: + _out(tiers.plan(d, bl, cfg, bcc)) + + +def cmd_fanout(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + grouping = tiers.fanout(bl, batch_size=args.size) + mode = "scan AND opt-out (operator authorized submissions)" if args.optout \ + else "READ-ONLY scan (submit nothing; reconnaissance only)" + batches = [] + for i, ids in enumerate(grouping["batches"], 1): + brief = ( + f"You are scan worker {i} of {len(grouping['batches'])} for the `unbroker` " + f"skill. First load the `unbroker` skill and read its references/methods.md. " + f"Subject id: {args.subject}. Handle ONLY these brokers: {', '.join(ids)}. " + f"For EACH broker: read references/brokers/.json; run EVERY search vector from " + f"`pdd.py plan {args.subject}` (filtered to your brokers); build URLs from search.url_patterns " + f"and heed url_format_quirks; a 404 is INCONCLUSIVE (rebuild/try the on-site search box), not " + f"not_found; confirm the SUBJECT vs namesakes/relatives before recording; if search.antibot is " + f"set and no stealth/cloud browser is available, record `blocked`. Record each outcome via " + f"`pdd.py record {args.subject} " + f"--found --evidence '{{\"listing_urls\":[...]}}'`. Mode: {mode}. " + f"Log any newly-discovered URL/format quirks into the broker JSON. " + f"Return a concise structured per-broker report." + ) + batches.append({"batch": i, "brokers": ids, "brief": brief}) + _out({ + "subject": args.subject, + "broker_count": grouping["broker_count"], + "batch_size": grouping["batch_size"], + "should_fanout": grouping["should_fanout"], + "batch_count": len(batches), + "batches": batches, + "instruction": ( + "If should_fanout is true you MUST spawn ONE delegate_task subagent per batch IN PARALLEL, " + "passing each batch's `brief`; do not scan all brokers yourself sequentially. Wait for every " + "report, consolidate, then proceed to opt-outs. If false, just scan the brokers inline." + ), + }) + + +def cmd_record(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + broker = brokers_mod.get(args.broker) + # Auto-stamp follow-up scheduling (next_recheck_at / removal_confirmed_at) so the + # autonomous loop knows when to come back without anyone remembering to set it. + fields = ledger_mod.followup_fields(args.state, broker, d) + if args.found is not None: + fields["found"] = args.found + if args.evidence: + fields["evidence"] = json.loads(args.evidence) + if args.reason: + fields["human_task_reason"] = args.reason + case = ledger_mod.transition(args.subject, args.broker, args.state, **fields) + if args.disclosed: + ledger_mod.log_disclosure(args.subject, args.broker, args.disclosed, args.channel or "unknown") + _out({"broker": args.broker, "state": case["state"], + "next_recheck_at": case.get("next_recheck_at")}) + + +def _email_request(d: dict, b: dict, kind: str, listings, identifiers) -> tuple[dict, list[str]]: + """Least-disclosure (fields, disclosed_names) for an opt-out/legal email of KIND. + + A removal letter must self-identify. Name + a contact email are already known to the + broker (the name is displayed on the very listing being removed), so not extra exposure. + """ + fields = dossier_mod.select_disclosure(d, (b.get("optout") or {}).get("inputs", [])) + ident = d.get("identity", {}) + if ident.get("full_name"): + fields.setdefault("full_name", ident["full_name"]) + fields.setdefault("contact_email", dossier_mod.contact_email(d) or "") + if listings: + fields["listing_urls"] = listings + if kind == "ccpa_indirect": + # Indirect exposure: name ONLY the subject's own identifiers to scrub from a third party's + # record. Default to the contact email + the subject's name-as-relative if none specified. + # The indirect template renders ONLY these placeholders; do not over-report disclosure with + # unrelated dossier fields (phone/street/postal) that select_disclosure happened to populate. + ids = list(identifiers or []) + if not ids: + ids = [contact for contact in [dossier_mod.contact_email(d)] if contact] + ids.append(f'the name "{ident.get("full_name")}" where it appears as a relative/associated person') + fields = { + "full_name": fields.get("full_name"), + "contact_email": fields.get("contact_email"), + "listing_urls": fields.get("listing_urls"), + "my_identifiers": ids, + } + return fields, ["contact_email", "full_name", "my_identifiers"] + return fields, sorted(fields.keys()) + + +def cmd_render_email(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + kind = getattr(args, "kind", "generic") or "generic" + fields, disclosed = _email_request(d, b, kind, args.listing, getattr(args, "identifier", None)) + if kind == "generic": + draft = email_modes.render_draft(b, fields) + else: + draft = email_modes.render_request_draft(b, fields, kind=kind) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_draft:{kind}") + _out({"draft": str(draft), "kind": kind, "disclosed_fields": disclosed}) + + +def cmd_send_email(args) -> None: + """Mode B: render AND deliver the opt-out/legal request - no human in the loop. + + Sends ONLY to an address the broker record itself declares (emailer enforces it), + then records the ledger transition + disclosure and auto-stamps the recheck date. + """ + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + cfg = config_mod.load_config() + mode = cfg.get("email_mode") + if mode not in ("programmatic", "alias", "browser"): + sys.exit("error: email_mode is draft_only; run `setup --email-mode browser` (no password; " + "sends via your logged-in webmail) or `--email-mode programmatic`, or use " + "`render-email` and send it yourself") + if not args.listing: + sys.exit("error: --listing is required (verify-before-disclose: never " + "email a broker about an unconfirmed listing)") + # Idempotency: don't re-send if this case is already submitted/beyond (prevents duplicate + # requests when an action is retried). --force overrides. + _POST_SUBMIT = {"submitted", "verification_pending", "awaiting_processing", "confirmed_removed"} + current = ledger_mod.get_case(args.subject, args.broker).get("state") + if current in _POST_SUBMIT and not getattr(args, "force", False): + _out({"skipped": True, "broker": args.broker, "state": current, + "note": "already submitted; not re-sending (idempotent). Use --force to re-send."}) + return + kind = getattr(args, "kind", "generic") or "generic" + fields, disclosed = _email_request(d, b, kind, args.listing, getattr(args, "identifier", None)) + body = legal.render_optout_email(b, fields) if kind == "generic" else legal.render_request(kind, b, fields) + + if mode == "browser": + # No network / no credentials: hand the agent a recipient-locked payload to send in the + # operator's webmail via browser_* tools. State still records deterministically here. + payload = emailer.browser_send_payload(b, body, to=args.to) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_browser:{kind}") + case = ledger_mod.transition(args.subject, args.broker, "submitted", + **ledger_mod.followup_fields("submitted", b, d)) + _out({"send_via": "browser", "compose": payload, "kind": kind, "disclosed_fields": disclosed, + "state": case["state"], "next_recheck_at": case.get("next_recheck_at"), + "instruction": "In the operator's logged-in webmail, compose a NEW email to compose.to " + "with compose.subject/body EXACTLY (disclose nothing beyond it) and send " + "it via browser_* tools. Then use `verify-link` on any confirmation reply.", + "note": "recipient is locked to the broker's declared address"}) + return + + result = emailer.send(b, body, to=args.to, + min_interval=float(cfg.get("email_min_interval_seconds", 0) or 0)) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_sent:{kind}") + case = ledger_mod.transition(args.subject, args.broker, "submitted", + **ledger_mod.followup_fields("submitted", b, d)) + _out({"sent": result, "send_via": "smtp", "kind": kind, "disclosed_fields": disclosed, + "state": case["state"], "next_recheck_at": case.get("next_recheck_at"), + "note": "if this broker verifies by email, `poll-verification` will pick up the link"}) + + +def cmd_verify_link(args) -> None: + """Extract a broker's verification link from email text the agent read in webmail (browser mode). + + IMAP-free counterpart to `poll-verification`: the agent opens the broker's confirmation email + in the operator's webmail, pastes the body here, and gets the anti-phishing-scored link back. + """ + _require_subject(args.subject) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + text = args.text + if args.file: + text = Path(args.file).read_text(encoding="utf-8", errors="replace") + if not text: + sys.exit("error: provide --text '' (or --file) from the broker's confirmation email") + link = email_modes.extract_verification_link(text, b) + _out({"broker": args.broker, "verification_link": link, + "next": ("browser_navigate the link IN THE SAME browser (sessions are browser-bound), " + f"complete the flow, then `record {args.subject} {args.broker} awaiting_processing`" + if link else + "no broker/opt-out-scoped link found in that text; confirm you opened the right email")}) + + +def cmd_poll_verification(args) -> None: + """Poll the inbox for brokers' verification links (Mode B) - replaces the human click-chase. + + For each in-flight case (submitted / verification_pending with email_verification), + extract the broker's link (anti-phishing scored). A found link auto-advances + submitted -> verification_pending (the email HAS arrived); the agent must then OPEN + the link in its own browser (sessions are browser-bound) and record the next state. + """ + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + led = ledger_mod.load(args.subject) + targets = [] + for bid, case in sorted(led.items()): + if args.broker and bid != args.broker: + continue + if case.get("state") not in ("submitted", "verification_pending"): + continue + b = brokers_mod.get(bid) + if b and (((b.get("optout") or {}).get("requires")) or {}).get("email_verification"): + targets.append((bid, case, b)) + if not targets: + _out({"subject": args.subject, "results": [], + "note": "no in-flight cases awaiting email verification"}) + return + results = [] + for bid, case, b in targets: + hit = emailer.find_verification_link(b, since_days=args.since_days) + if hit: + if case.get("state") == "submitted": + ledger_mod.transition(args.subject, bid, "verification_pending", + **ledger_mod.followup_fields("verification_pending", b, d)) + results.append({"broker": bid, "verification_link": hit["link"], + "email_from": hit.get("from"), "email_subject": hit.get("subject"), + "next": f"browser_navigate the link IN THE AGENT'S OWN BROWSER, complete " + f"the flow, then `record {args.subject} {bid} awaiting_processing` " + f"(or confirmed_removed only after a verifying re-scan)"}) + else: + results.append({"broker": bid, "verification_link": None, + "next": "no matching email yet; poll again later (next_recheck_at is set)"}) + _out({"subject": args.subject, "results": results}) + + +def cmd_next(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + cfg = config_mod.load_config() + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + _out(autopilot.next_actions(d, bl, cfg, ledger_mod.load(args.subject))) + + +def cmd_tasks(args) -> None: + _require_subject(args.subject) + print(report_mod.human_tasks_markdown(args.subject)) + + +def cmd_due(args) -> None: + _require_subject(args.subject) + cases = ledger_mod.due(args.subject) + _out({"subject": args.subject, "due_count": len(cases), + "cases": [{"broker_id": c.get("broker_id"), "state": c.get("state"), + "next_recheck_at": c.get("next_recheck_at")} for c in cases], + "note": "run `next` for the concrete follow-up action per case"}) + + +def cmd_status(args) -> None: + _require_subject(args.subject) + print(report_mod.render_markdown(args.subject)) + + +def cmd_report(args) -> None: + _require_subject(args.subject) + if args.sheets: + _out(report_mod.sheets_rows(args.subject)) + else: + print(report_mod.render_markdown(args.subject)) + + +def build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser(prog="pdd", description="unbroker helper CLI") + sub = p.add_subparsers(dest="cmd", required=True) + + s = sub.add_parser("setup", help="write install config (easiest-first defaults; --auto = most autonomous)") + s.add_argument("--auto", action="store_true", + help="detect capabilities and pick the most autonomous valid config (no questions)") + s.add_argument("--autonomy", dest="autonomy", choices=sorted(config_mod.VALID["autonomy"])) + s.add_argument("--email-mode", dest="email_mode", choices=sorted(config_mod.VALID["email_mode"])) + s.add_argument("--browser-backend", dest="browser_backend", choices=sorted(config_mod.VALID["browser_backend"])) + s.add_argument("--tracker-backend", dest="tracker_backend", choices=sorted(config_mod.VALID["tracker_backend"])) + s.add_argument("--encryption", dest="encryption", choices=sorted(config_mod.VALID["encryption"])) + s.set_defaults(func=cmd_setup) + + s = sub.add_parser("doctor", help="readiness check: config, brokers, available upgrades") + s.set_defaults(func=cmd_doctor) + + s = sub.add_parser("intake", help="create a subject dossier (records consent)") + s.add_argument("--json", help="path to a dossier JSON file (overrides flags)") + s.add_argument("--full-name") + s.add_argument("--alias", action="append", metavar="NAME", + help="other name the subject is listed under (maiden/married/nickname); repeatable") + s.add_argument("--email", action="append", metavar="EMAIL", help="repeatable") + s.add_argument("--phone", action="append", metavar="PHONE", help="repeatable") + s.add_argument("--street", help="current street line1 (enables reverse-address search)") + s.add_argument("--city") + s.add_argument("--state") + s.add_argument("--postal") + s.add_argument("--prior-location", dest="prior_location", action="append", metavar="City,ST", + help="a past city/state (or City,ST,ZIP); repeatable") + s.add_argument("--dob", help="date of birth YYYY-MM-DD (only used if a broker requires it)") + s.add_argument("--contact-email", dest="contact_email", + help="which email to use for opt-out correspondence (default: first)") + s.add_argument("--residency", help="e.g. US, US-CA") + s.add_argument("--consent", action="store_true", help="subject authorizes removal on their behalf") + s.add_argument("--consent-method", default="self", choices=["self", "written_authorization", "poa"]) + s.add_argument("--email-mode", dest="email_mode", choices=sorted(config_mod.VALID["email_mode"])) + s.set_defaults(func=cmd_intake) + + s = sub.add_parser("brokers", help="list the broker database (curated + live)") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.set_defaults(func=cmd_brokers) + + s = sub.add_parser("refresh-brokers", + help="pull the latest BADBOOL people-search list + the CA data broker registry") + s.add_argument("--no-registry", dest="no_registry", action="store_true", + help="skip the CA registry pull (BADBOOL people-search only)") + s.set_defaults(func=cmd_refresh_brokers) + + s = sub.add_parser("registry", + help="CA Data Broker Registry coverage (hundreds of brokers; DROP/email lane)") + s.add_argument("--search", help="find registered brokers by name / id / email substring") + s.add_argument("--limit", type=int, default=25, help="max matches to print (default 25)") + s.set_defaults(func=cmd_registry) + + s = sub.add_parser("drop", + help="CA DROP one-shot: delete from ALL registered brokers in one request") + s.add_argument("subject") + s.add_argument("--filed", action="store_true", help="mark DROP as filed (stops `next` surfacing it)") + s.set_defaults(func=cmd_drop) + + s = sub.add_parser("plan", help="compute per-broker tier + next action for a subject") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.add_argument("--batch", action="store_true", + help="phase-oriented batch view: overlays ledger state, groups by next action " + "(unscanned/found/indirect/blocked/in_progress/done), collapses ownership clusters") + s.set_defaults(func=cmd_plan) + + s = sub.add_parser("fanout", help="batch brokers into parallel delegate_task subagents (large runs)") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.add_argument("--size", type=int, default=8, help="brokers per subagent batch (default 8)") + s.add_argument("--optout", action="store_true", + help="brief authorizes opt-out submission (default: read-only scan)") + s.set_defaults(func=cmd_fanout) + + s = sub.add_parser("record", help="record a ledger state transition after an agent action") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("state", choices=ledger_mod.STATES) + s.add_argument("--found", type=lambda v: v.strip().lower() in ("1", "true", "yes", "y")) + s.add_argument("--evidence", help="JSON object stored as case.evidence") + s.add_argument("--disclosed", action="append", metavar="FIELD", help="field name disclosed") + s.add_argument("--channel", help="disclosure channel, e.g. web_form / email") + s.add_argument("--reason", help="for human_task_queued: why a human is needed (shown in `tasks`)") + s.set_defaults(func=cmd_record) + + s = sub.add_parser("next", help="autonomous action queue: exactly what to do right now") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.set_defaults(func=cmd_next) + + s = sub.add_parser("send-email", help="Mode B: render AND send the opt-out/legal request (records it)") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--listing", action="append", metavar="URL", required=False, + help="confirmed listing URL (required: verify-before-disclose)") + s.add_argument("--kind", choices=["generic", "ccpa", "ccpa_agent", "ccpa_indirect", "gdpr"], + default="generic") + s.add_argument("--identifier", action="append", metavar="ID", + help="(ccpa_indirect only) a specific own-identifier to remove; repeatable") + s.add_argument("--to", help="override recipient (must be an address the broker record declares)") + s.add_argument("--force", action="store_true", help="re-send even if already submitted (default: idempotent skip)") + s.set_defaults(func=cmd_send_email) + + s = sub.add_parser("poll-verification", + help="Mode B (IMAP): poll the inbox for brokers' verification links (anti-phishing scored)") + s.add_argument("subject") + s.add_argument("--broker", help="only this broker (default: every in-flight verification case)") + s.add_argument("--since-days", dest="since_days", type=int, default=3) + s.set_defaults(func=cmd_poll_verification) + + s = sub.add_parser("verify-link", + help="browser mode: extract a broker's verification link from pasted webmail text") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--text", help="the confirmation email body (read from the operator's webmail)") + s.add_argument("--file", help="path to a file with the email body (alternative to --text)") + s.set_defaults(func=cmd_verify_link) + + s = sub.add_parser("tasks", help="ONE consolidated human-task digest (present at end of run)") + s.add_argument("subject") + s.set_defaults(func=cmd_tasks) + + s = sub.add_parser("due", help="cases whose recheck window has arrived (cron re-scan queue)") + s.add_argument("subject") + s.set_defaults(func=cmd_due) + + s = sub.add_parser("render-email", help="render a Mode-A opt-out / legal-request draft (least-disclosure)") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--listing", action="append", metavar="URL", help="confirmed listing URL") + s.add_argument("--kind", choices=["generic", "ccpa", "ccpa_agent", "ccpa_indirect", "gdpr"], + default="generic", + help="request type. 'ccpa_indirect' = delete MY identifiers from a third party's " + "record (indirect exposure); default 'generic' opt-out.") + s.add_argument("--identifier", action="append", metavar="ID", + help="(ccpa_indirect only) a specific own-identifier to request removal of " + "(e.g. an email or phone). Repeatable. Defaults to the contact email + " + "name-as-relative if omitted.") + s.set_defaults(func=cmd_render_email) + + s = sub.add_parser("status", help="print a Markdown status report") + s.add_argument("subject") + s.set_defaults(func=cmd_status) + + s = sub.add_parser("report", help="status report (default) or --sheets rows") + s.add_argument("subject") + s.add_argument("--sheets", action="store_true", help="emit Google Sheets rows as JSON") + s.set_defaults(func=cmd_report) + return p + + +def main(argv=None) -> None: + args = build_parser().parse_args(argv) + try: + args.func(args) + except (PermissionError, ValueError, RuntimeError, FileNotFoundError) as exc: + sys.exit(f"error: {exc}") + + +if __name__ == "__main__": + main() diff --git a/optional-skills/security/unbroker/scripts/registry.py b/optional-skills/security/unbroker/scripts/registry.py new file mode 100644 index 00000000000..5e42356deab --- /dev/null +++ b/optional-skills/security/unbroker/scripts/registry.py @@ -0,0 +1,293 @@ +"""Ingest the California Data Broker Registry into broker records (coverage breadth). + +The CA registry (CPPA, under the Delete Act) is the authoritative universe of data +brokers doing business with California residents -- ~545 businesses in 2025, each +required to publish a name, website, contact email, and a CCPA-rights/deletion URL. +This is the same universe commercial services (DeleteMe/Incogni/Optery) draw from, +plus the FCRA/GLBA-regulated and marketing/risk brokers most lists omit. + +These are NOT people-search sites you scan with a name -- most have no per-person +lookup UI. They are worked through the LEGAL lane: the CA DROP portal +(privacy.ca.gov/drop) is a single request that deletes from ALL registered brokers +at once (CA residents), and per-broker CCPA deletion emails to the contact address +are the fallback / non-CA path. So registry records are kept in their own lane +(loaded only when asked) and never dumped into the people-search scan pipeline. + +`parse()` is pure (CSV text in, records out) so it is tested offline; `fetch()` is +the only network call and can be bypassed by passing csv_text directly to refresh(). +""" +from __future__ import annotations + +import csv +import datetime +import io +import re +import urllib.request +from pathlib import Path + +import storage + +# CA CPPA registry CSVs are published per year (registry2024.csv, registry2025.csv, ...). +# 2025 is the latest COMPLETE dataset; the current year's file is empty until the Jan +# registration window closes. DEFAULT_URL is the known-good fallback; `ca_candidate_urls` +# probes newer years first so coverage auto-advances when the next year is published. +_CA_CSV = "https://cppa.ca.gov/data_broker_registry/registry{year}.csv" +_CA_FLOOR_YEAR = 2025 +DEFAULT_URL = _CA_CSV.format(year=_CA_FLOOR_YEAR) +DROP_URL = "https://privacy.ca.gov/drop" +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + + +def ca_candidate_urls(today: datetime.date | None = None) -> list[str]: + """Newest-year-first CA registry URLs to try (auto-advances; never below the 2025 floor).""" + year = (today or datetime.date.today()).year + years = list(range(max(year, _CA_FLOOR_YEAR), _CA_FLOOR_YEAR - 1, -1)) + return [_CA_CSV.format(year=y) for y in years] + +# Multi-source registry lane. Only California publishes a clean bulk CSV (with contact email + +# CCPA-rights URL per broker) AND offers a one-shot deletion portal (DROP). Vermont, Oregon, and +# Texas maintain registries too, but only as searchable PORTALS (no reliable bulk export) and with +# no DROP-equivalent -- and they overlap CA heavily (CA is effectively the superset). So they are +# wired as first-class portal sources (official URL surfaced to the operator) rather than scraped. +# Adding any state that later publishes a CSV is a one-line "format: csv" entry (the parser is +# column-detection based, not CA-specific). +SOURCES = { + "ca": {"jurisdiction": "US-CA", "format": "csv", "url": DEFAULT_URL, "has_drop": True, + "name": "California Data Broker Registry (CPPA)"}, + "vt": {"jurisdiction": "US-VT", "format": "portal", "has_drop": False, + "url": "https://bizfilings.vermont.gov/online/DatabrokerInquire/", + "name": "Vermont Data Broker Registry (Secretary of State)"}, + "or": {"jurisdiction": "US-OR", "format": "portal", "has_drop": False, + "url": "https://dfr.oregon.gov/business/licensing/data-broker-registry/Pages/index.aspx", + "name": "Oregon Data Broker Registry (DCBS)"}, + "tx": {"jurisdiction": "US-TX", "format": "portal", "has_drop": False, + "url": "https://texas-sos.appianportalsgov.com/data-broker-registry", + "name": "Texas Data Broker Registry (Secretary of State)"}, +} + + +def portals() -> list[dict]: + """Registry sources that are searchable portals (no bulk export) -- surfaced to the operator.""" + return [{"key": k, "jurisdiction": s["jurisdiction"], "name": s["name"], "url": s["url"]} + for k, s in SOURCES.items() if s["format"] == "portal"] + +# Field label -> substring to locate its column on the header row (robust to +# year-to-year column shifts; the registry re-orders/adds columns between years). +_LABELS = { + "name": "data broker name:", + "dba": "doing business as", + "website": "data broker primary website:", + "email": "primary contact email", + "rights_url": "exercise their ca consumer privacy act rights", + "fcra": "regulated by the federal fair credit reporting act (fcra):", +} + + +def _norm(s: str) -> str: + """Registry CSVs use NBSPs and a BOM; normalize for matching + clean values.""" + return re.sub(r"\s+", " ", (s or "").replace("\ufeff", "").replace("\xa0", " ")).strip() + + +def slug(name: str, website: str = "") -> str: + base = re.sub(r"\.(com|org|net|io|ai|inc|co|us|info|llc)\b", "", (name or "").strip(), flags=re.I) + s = re.sub(r"[^a-z0-9]+", "", base.lower()) + if s: + return s + dom = re.sub(r"^https?://(www\.)?", "", (website or "").lower()) + return re.sub(r"[^a-z0-9]+", "", dom.split("/")[0]) or "broker" + + +def _domain(website: str) -> str: + dom = re.sub(r"^https?://(www\.)?", "", (website or "").strip().lower()) + return dom.split("/")[0] + + +def _find_colmap(rows: list[list[str]]) -> tuple[int, dict[str, int]]: + """Locate the label row (col0 == 'Data broker name:') and map fields to columns.""" + for i, row in enumerate(rows[:5]): + if row and _norm(row[0]).lower().startswith("data broker name:"): + colmap: dict[str, int] = {} + for field, needle in _LABELS.items(): + for j, cell in enumerate(row): + c = _norm(cell).lower() + if needle in c and not c.startswith("if the data broker"): + colmap[field] = j + break + return i, colmap + raise ValueError("CA registry: could not locate the header row") + + +def _get(row: list[str], idx: int | None) -> str: + return _norm(row[idx]) if idx is not None and idx < len(row) else "" + + +def _build(row: list[str], cm: dict[str, int], jurisdiction: str = "US-CA", + has_drop: bool = True) -> dict | None: + name = _get(row, cm.get("name")) + website = _get(row, cm.get("website")) + if not (name or website): + return None + email = _get(row, cm.get("email")) + rights = _get(row, cm.get("rights_url")) + dba = _get(row, cm.get("dba")) + fcra = _get(row, cm.get("fcra")).lower().startswith("y") + state = jurisdiction.split("-")[-1] + + method = "email" if email else ("web_form" if rights else "drop") + if has_drop: + notes = ("Registered CA data broker. One CA DROP request (privacy.ca.gov/drop) deletes from " + "this and every registered broker at once; or send a CCPA deletion request to the " + "contact email.") + else: + notes = (f"Registered {state} data broker (no one-shot delete portal in {state}). Send a " + "CCPA/state-law deletion request to the contact email.") + if fcra: + notes += (" FCRA-regulated: some data is credit-reporting data with separate rules -- deletion " + "may be limited; a consumer report dispute/security-freeze may apply instead.") + return { + "id": slug(name, website), + "name": name or _domain(website), + "dba": dba or None, + "category": "data_broker", + "priority": "long_tail", + "jurisdictions": [jurisdiction], + "search": {"method": "none", "url": website, "fetch": "none", "by": ["registry"]}, + "optout": { + "method": method, + "url": rights or website or None, + "email": email or None, + "requires": {"profile_url": False, "email_verification": False, "captcha": False, + "gov_id": False, "account": False, "phone_callback": False, "payment": False}, + "inputs": ["full_name", "contact_email"], + "deletion": { + "via": "drop" if has_drop else "email", + "email": email or None, + "url": rights or None, + "kinds": ["ccpa", "generic"], + "notes": ("Covered by the CA DROP one-shot (privacy.ca.gov/drop); CCPA email fallback." + if has_drop else "CCPA/state-law deletion email (no one-shot portal)."), + }, + "fcra": fcra, + "est_processing_days": 45, + "notes": notes, + }, + "source": f"{state}-registry", + "confidence": "registry", + "last_verified": None, + } + + +def parse(csv_text: str, jurisdiction: str = "US-CA", has_drop: bool = True) -> list[dict]: + """Parse a data-broker-registry CSV into broker records (deduped by id). + + Column detection is by header label, not fixed position, so any state that publishes a + registry CSV with name/website/email/rights columns parses without new code. + """ + rows = list(csv.reader(io.StringIO(csv_text))) + if not rows: + return [] + header_i, cm = _find_colmap(rows) + out: list[dict] = [] + seen: dict[str, int] = {} + for row in rows[header_i + 1:]: + if not any(c.strip() for c in row): + continue + rec = _build(row, cm, jurisdiction, has_drop) + if not rec: + continue + bid = rec["id"] + if bid in seen: # disambiguate id collisions by domain, then a counter + dom = re.sub(r"[^a-z0-9]+", "", _domain(rec["search"]["url"])) + cand = f"{bid}-{dom}" if dom and dom != bid else bid + while cand in seen: + seen[bid] += 1 + cand = f"{bid}-{seen[bid]}" + rec["id"] = cand + seen.setdefault(rec["id"], 0) + seen.setdefault(bid, 0) + out.append(rec) + return out + + +MIN_EXPECTED_CA = 100 # CA registry has ~500+; far fewer => wrong/empty file, warn + + +def fetch(url: str = DEFAULT_URL, timeout: int = 60) -> str: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 + return resp.read().decode("utf-8", errors="replace") + + +def _fetch_ca_latest() -> tuple[str, list[dict]]: + """Try newest CA registry year first; return (url, records) for the first non-empty.""" + last: tuple[str, list[dict]] = (DEFAULT_URL, []) + for url in ca_candidate_urls(): + try: + recs = parse(fetch(url), jurisdiction="US-CA", has_drop=True) + except Exception: # noqa: BLE001 - a missing year 404s; fall through to older years + continue + if recs: + return url, recs + last = (url, recs) + return last + + +def refresh(cache_path: Path, url: str = DEFAULT_URL, csv_text: str | None = None) -> dict: + """CA single-source refresh: fetch (or accept) the CA CSV and write the cache.""" + text = csv_text if csv_text is not None else fetch(url) + records = parse(text) + storage.write_json(cache_path, records) + fcra = sum(1 for r in records if (r.get("optout") or {}).get("fcra")) + return {"parsed": len(records), "fcra_regulated": fcra, + "cache_path": str(cache_path), "source_url": url} + + +def refresh_all(cache_path: Path, fetched: dict[str, str] | None = None) -> dict: + """Multi-source refresh: pull every CSV source, dedupe across states by domain, cache. + + `fetched` optionally supplies {source_key: csv_text} to bypass the network (tests). CSV + sources are ingested as broker records; portal sources contribute their URL for the operator + (no bulk export exists) but no records. CA is processed first so it wins domain collisions. + """ + all_recs: list[dict] = [] + seen_domains: set[str] = set() + per_source: dict[str, dict] = {} + for key, src in SOURCES.items(): + if src["format"] != "csv": + per_source[key] = {"jurisdiction": src["jurisdiction"], "format": "portal", + "url": src["url"], "records": 0, + "note": "searchable portal (no bulk export); operator/agent searches by name"} + continue + used_url = src["url"] + try: + if fetched is not None: + text = fetched.get(key) + if text is None: + raise RuntimeError("no CSV text supplied") + recs = parse(text, jurisdiction=src["jurisdiction"], has_drop=src["has_drop"]) + elif key == "ca": + used_url, recs = _fetch_ca_latest() # newest-year-first with fallback + else: + recs = parse(fetch(src["url"]), jurisdiction=src["jurisdiction"], has_drop=src["has_drop"]) + except Exception as exc: # noqa: BLE001 - one source failing must not sink the rest + per_source[key] = {"jurisdiction": src["jurisdiction"], "format": "csv", "error": str(exc)} + continue + added = 0 + for r in recs: + dom = _domain(r["search"]["url"]) + if dom and dom in seen_domains: + continue + if dom: + seen_domains.add(dom) + all_recs.append(r) + added += 1 + entry = {"jurisdiction": src["jurisdiction"], "format": "csv", "url": used_url, + "parsed": len(recs), "added_after_dedupe": added, + "fcra": sum(1 for r in recs if (r.get("optout") or {}).get("fcra"))} + if key == "ca" and len(recs) < MIN_EXPECTED_CA: + entry["warning"] = (f"only {len(recs)} parsed (expected >{MIN_EXPECTED_CA}); the CA " + "registry file may be empty/moved - verify the source URL") + per_source[key] = entry + storage.write_json(cache_path, all_recs) + return {"total": len(all_recs), "sources": per_source, "portals": portals(), + "cache_path": str(cache_path)} diff --git a/optional-skills/security/unbroker/scripts/report.py b/optional-skills/security/unbroker/scripts/report.py new file mode 100644 index 00000000000..1c38164a24f --- /dev/null +++ b/optional-skills/security/unbroker/scripts/report.py @@ -0,0 +1,161 @@ +"""Status dashboards, Markdown reports, human-task digest, and Google Sheets row export.""" +from __future__ import annotations + +import brokers as brokers_mod +import ledger as ledger_mod + +STATE_LABELS = { + "new": "Not started", + "searching": "Searching", + "not_found": "Not found", + "found": "Found (action needed)", + "indirect_exposure": "Indirect exposure (PII on a relative's record)", + "action_selected": "Action selected", + "submitted": "Submitted", + "verification_pending": "Awaiting verification", + "awaiting_processing": "Processing", + "confirmed_removed": "Removed", + "reappeared": "Reappeared", + "human_task_queued": "Human task", + "blocked": "Blocked", +} + + +def status_counts(subject_id: str) -> dict: + counts: dict[str, int] = {} + for case in ledger_mod.load(subject_id).values(): + state = case.get("state", "new") + counts[state] = counts.get(state, 0) + 1 + return counts + + +def metrics(subject_id: str) -> dict: + """Outcome metrics: what's actually confirmed vs merely claimed, and what's overdue. + + removal_rate is confirmed_removed over cases we actually acted on (found/submitted/... ), + NOT over the whole broker DB, so it reflects real progress on real exposure. `in_flight` + is 'claimed' (submitted/verifying/processing) but not yet re-scan-confirmed. `overdue` + counts cases whose recheck window has already passed (the cron backlog). + """ + c = status_counts(subject_id) + removed = c.get("confirmed_removed", 0) + in_flight = c.get("submitted", 0) + c.get("verification_pending", 0) + c.get("awaiting_processing", 0) + open_found = c.get("found", 0) + c.get("reappeared", 0) + c.get("action_selected", 0) \ + + c.get("indirect_exposure", 0) + acted = removed + in_flight + open_found + c.get("human_task_queued", 0) + c.get("blocked", 0) + return { + "confirmed_removed": removed, + "in_flight_claimed": in_flight, # submitted but NOT yet verified gone + "open_needs_action": open_found, + "blocked": c.get("blocked", 0), + "human_tasks": c.get("human_task_queued", 0), + "acted_total": acted, + "removal_rate": round(removed / acted, 3) if acted else 0.0, + "overdue_rechecks": len(ledger_mod.due(subject_id)), + } + + +def render_markdown(subject_id: str) -> str: + ledger = ledger_mod.load(subject_id) + counts = status_counts(subject_id) + total = sum(counts.values()) + removed = counts.get("confirmed_removed", 0) + + m = metrics(subject_id) + lines = [ + f"# unbroker - status for `{subject_id}`", + "", + f"**{removed} / {total} confirmed removed** · removal rate (of acted-on cases): " + f"{int(m['removal_rate'] * 100)}%", + "", + f"- Confirmed removed: {m['confirmed_removed']}", + f"- In flight (submitted, not yet re-scan-confirmed): {m['in_flight_claimed']}", + f"- Open / needs action: {m['open_needs_action']}", + f"- Blocked (anti-bot): {m['blocked']} · Human tasks: {m['human_tasks']}", + f"- Overdue rechecks (cron backlog): {m['overdue_rechecks']}", + "", + "| State | Count |", + "|---|---|", + ] + for state in ledger_mod.STATES: + if counts.get(state): + lines.append(f"| {STATE_LABELS.get(state, state)} | {counts[state]} |") + + tasks = [c for c in ledger.values() if c.get("state") == "human_task_queued"] + if tasks: + lines += ["", "## Outstanding human tasks"] + for c in tasks: + reason = c.get("human_task_reason", "manual step required") + lines.append(f"- **{c.get('broker_id')}** - {reason}") + + indirect = [c for c in ledger.values() if c.get("state") == "indirect_exposure"] + if indirect: + lines += ["", "## Indirect exposure (your PII on third-party records)", + "Not removable via the broker's self-service opt-out (the record is about someone " + "else). Lever: a targeted CCPA/GDPR delete-my-PII request naming only your own " + "identifiers."] + for c in indirect: + ev = c.get("evidence") or {} + note = ev.get("summary") or "subject's identifiers appear on another person's listing" + lines.append(f"- **{c.get('broker_id')}** - {note}") + return "\n".join(lines) + "\n" + + +def human_tasks_markdown(subject_id: str) -> str: + """ONE consolidated digest of everything that genuinely needs a human. + + The autonomous run accumulates human-only work silently (never interrupting); + this digest is presented once, at the end, so the operator clears it in a + single sitting. Includes queued tasks and blocked-site operator-browser checks. + """ + ledger = ledger_mod.load(subject_id) + tasks = [(bid, c) for bid, c in sorted(ledger.items()) if c.get("state") == "human_task_queued"] + blocked = [(bid, c) for bid, c in sorted(ledger.items()) if c.get("state") == "blocked"] + + lines = [f"# Human tasks for `{subject_id}`", ""] + if not tasks and not blocked: + lines.append("Nothing needs a human right now.") + return "\n".join(lines) + "\n" + + lines.append(f"{len(tasks)} manual step(s) + {len(blocked)} blocked site(s). " + "Everything else ran (or will run) autonomously.") + if tasks: + lines += ["", "## Manual steps"] + for bid, c in tasks: + b = brokers_mod.get(bid) or {} + opt = b.get("optout") or {} + lines.append(f"### {b.get('name', bid)}") + lines.append(f"- Why: {c.get('human_task_reason', 'manual step required')}") + where = opt.get("url") or opt.get("email") or "(see broker record)" + lines.append(f"- Where: {where}") + for q in (opt.get("quirks") or [])[:2]: + lines.append(f"- Note: {q}") + lines.append("- Withhold: SSN and full ID numbers - always.") + lines.append(f"- When done, tell the agent so it records the outcome for `{bid}`.") + if blocked: + lines += ["", "## Blocked sites (open in YOUR browser - it gets through where bots don't)"] + for bid, c in blocked: + b = brokers_mod.get(bid) or {} + url = ((b.get("search") or {}).get("url")) or "(see broker record)" + lines.append(f"- **{b.get('name', bid)}** - open {url}, search the subject, and report " + "the verdict (or a screenshot) back to the agent.") + return "\n".join(lines) + "\n" + + +def sheets_rows(subject_id: str) -> list[list[str]]: + """Header + one row per case for the optional Google Sheets tracker. + + The agent appends these via the `google-workspace` skill, e.g.: + google_api.py sheets append "Sheet1!A:F" --values + """ + rows = [["broker_id", "state", "found", "tier", "removed_at", "next_recheck"]] + for bid, c in sorted(ledger_mod.load(subject_id).items()): + rows.append([ + bid, + c.get("state", ""), + str(c.get("found", "")), + (c.get("automation") or {}).get("tier_used", ""), + c.get("removal_confirmed_at") or "", + c.get("next_recheck_at") or "", + ]) + return rows diff --git a/optional-skills/security/unbroker/scripts/scan.py b/optional-skills/security/unbroker/scripts/scan.py new file mode 100644 index 00000000000..3c91c30e774 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/scan.py @@ -0,0 +1,32 @@ +"""Stdlib fetch helper for simple url_pattern brokers (osint-style). + +For JS-rendered or anti-bot pages the agent should use the `web_extract` or +`browser_navigate` tools (and the `scrapling` skill for stealth/Cloudflare). +This helper only covers plain static pages and is intentionally network-light so +it can be mocked in tests. +""" +from __future__ import annotations + +import urllib.error +import urllib.request + +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + + +def fetch(url: str, timeout: int = 20) -> tuple[int, str]: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + try: + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 (https only by convention) + charset = resp.headers.get_content_charset() or "utf-8" + return getattr(resp, "status", 200), resp.read().decode(charset, errors="replace") + except urllib.error.HTTPError as exc: + return exc.code, "" + except (urllib.error.URLError, TimeoutError, ValueError): + return 0, "" + + +def looks_listed(html: str, match_signal: str | None) -> bool: + """Naive confirmation heuristic for static pages: does the match signal appear?""" + if not html or not match_signal: + return False + return match_signal.lower() in html.lower() diff --git a/optional-skills/security/unbroker/scripts/storage.py b/optional-skills/security/unbroker/scripts/storage.py new file mode 100644 index 00000000000..29a66bb80d3 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/storage.py @@ -0,0 +1,138 @@ +"""Storage helpers (stdlib only): atomic JSON, append-only JSONL, strict perms. + +Default backend is local-json. The optional google-sheets tracker is handled in +report.py by emitting rows for the `google-workspace` skill; this module stays +dependency-free so the hermetic tests never touch the network. +""" +from __future__ import annotations + +import contextlib +import json +import os +import time +from pathlib import Path +from typing import Any + +import crypto +import paths + + +@contextlib.contextmanager +def locked(target: Path, timeout: float = 10.0, stale: float = 30.0): + """Portable advisory lock via an O_EXCL lockfile next to `target`. + + Serializes read-modify-write on shared JSON (the ledger) across concurrent + processes - a cron re-scan overlapping a manual run, or multiple tenants - + so one writer can't clobber another's update. A lock older than `stale` + seconds is treated as abandoned (crashed writer) and broken, so a dead + process can never deadlock the queue. Works on macOS/Linux/Windows (O_EXCL). + """ + ensure_dir(target.parent) + lock = target.with_name(target.name + ".lock") + deadline = time.monotonic() + timeout + while True: + try: + fd = os.open(str(lock), os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600) + try: + os.write(fd, str(os.getpid()).encode()) + finally: + os.close(fd) + break + except FileExistsError: + try: + if time.time() - lock.stat().st_mtime > stale: + lock.unlink(missing_ok=True) + continue + except OSError: + pass + if time.monotonic() >= deadline: + raise TimeoutError(f"could not acquire lock {lock} within {timeout}s") + time.sleep(0.05) + try: + yield + finally: + with contextlib.suppress(OSError): + lock.unlink(missing_ok=True) + + +def _secure(path: Path, mode: int) -> None: + try: + os.chmod(path, mode) + except OSError: + pass # non-POSIX / unsupported FS; HERMES_HOME directory perms still apply + + +def ensure_dir(path: Path) -> Path: + path.mkdir(parents=True, exist_ok=True) + _secure(path, 0o700) + return path + + +def _is_sensitive(path: Path) -> bool: + """Per-subject docs (dossier, ledger) are sensitive; config/cache are not.""" + try: + Path(path).resolve().relative_to(paths.subjects_dir().resolve()) + return True + except (ValueError, OSError): + return False + + +def _age_path(path: Path) -> Path: + return path.with_name(path.name + ".age") + + +def _atomic_write(path: Path, data: bytes) -> Path: + tmp = path.with_name(path.name + ".tmp") + tmp.write_bytes(data) + _secure(tmp, 0o600) + os.replace(tmp, path) + _secure(path, 0o600) + return path + + +def write_json(path: Path, obj: Any) -> Path: + ensure_dir(path.parent) + data = (json.dumps(obj, indent=2, ensure_ascii=False) + "\n").encode("utf-8") + if _is_sensitive(path) and crypto.encryption_setting() == "age": + if not crypto.age_available(): + raise RuntimeError( + "encryption=age is configured but `age` is not available; " + "refusing to write PII as plaintext. Install age or run `setup --encryption none`." + ) + target = _atomic_write(_age_path(path), crypto.encrypt(data)) + if path.exists(): + path.unlink() # migrate plaintext -> ciphertext + return target + target = _atomic_write(path, data) + ap = _age_path(path) + if ap.exists(): + ap.unlink() # encryption turned off -> drop stale ciphertext + return target + + +def read_json(path: Path, default: Any = None) -> Any: + ap = _age_path(path) + if ap.exists(): + return json.loads(crypto.decrypt(ap.read_bytes()).decode("utf-8")) + if path.exists(): + return json.loads(path.read_text(encoding="utf-8")) + return default + + +def append_jsonl(path: Path, record: dict) -> Path: + ensure_dir(path.parent) + with path.open("a", encoding="utf-8") as fh: + fh.write(json.dumps(record, ensure_ascii=False) + "\n") + _secure(path, 0o600) + return path + + +def read_jsonl(path: Path) -> list[dict]: + if not path.exists(): + return [] + out: list[dict] = [] + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if line: + out.append(json.loads(line)) + return out diff --git a/optional-skills/security/unbroker/scripts/tiers.py b/optional-skills/security/unbroker/scripts/tiers.py new file mode 100644 index 00000000000..8d145b8cec3 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/tiers.py @@ -0,0 +1,269 @@ +"""Automation-tier selection and per-subject action planning. + +Tiers: + T0 fully automated, no verification loop + T1 automated submit + automated verification (email mode B/C, or backend-cleared captcha) + T2 automated submit, verification needs a human (hard captcha / phone callback / account) + T3 human-required end-to-end (gov ID, fax, mail, voice-only phone) +""" +from __future__ import annotations + +import dossier as dossier_mod +import vectors as vectors_mod + +HARD_HUMAN = ("gov_id", "fax", "mail", "phone_voice") + + +def select_tier(broker: dict, email_mode: str = "draft_only", + browser_clears_captcha: bool = False) -> str: + req = ((broker.get("optout") or {}).get("requires")) or {} + + if any(req.get(k) for k in HARD_HUMAN): + return "T3" + if req.get("account"): + return "T2" + + captcha = bool(req.get("captcha")) + if (captcha and not browser_clears_captcha) or req.get("phone_callback"): + return "T2" + + if req.get("email_verification"): + return "T1" if email_mode in ("programmatic", "alias") else "T2" + + if captcha and browser_clears_captcha: + return "T1" + return "T0" + + +def plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, + browser_clears_captcha: bool = False) -> list[dict]: + email_mode = (subject_dossier.get("preferences") or {}).get("email_mode") \ + or cfg.get("email_mode", "draft_only") + actions: list[dict] = [] + for b in brokers_list: + opt = b.get("optout") or {} + search = b.get("search") or {} + tier = select_tier(b, email_mode, browser_clears_captcha) + disclosure = dossier_mod.select_disclosure(subject_dossier, opt.get("inputs", [])) + svectors = vectors_mod.search_vectors(subject_dossier, b) + actions.append({ + "broker_id": b.get("id"), + "broker_name": b.get("name"), + "priority": b.get("priority"), + "method": opt.get("method"), + "tier": tier, + "human_required": tier == "T3", + "search_url": search.get("url"), + "fetch": search.get("fetch", "web_extract"), + "antibot": search.get("antibot"), + "search_by": vectors_mod.supported_by(b), + "search_vectors": svectors, + "optout_url": opt.get("url"), + "optout_email": opt.get("email"), + "disclosure_fields": sorted(disclosure.keys()), + "owns": b.get("owns") or [], + "notes": opt.get("notes", ""), + "optout_quirks": opt.get("quirks") or [], + "optout_requires": opt.get("requires") or {}, + # The DELETION lane (right-to-delete), distinct from listing suppression. Structured so + # the autopilot can route to it: {via: email|in_flow|web_form, email?, url?, kinds?, notes?} + "deletion": opt.get("deletion") or {}, + # Exact ordered opt-out steps maintained IN the broker record (field-verified knowledge + # lives with the data, not in code). + "optout_playbook": opt.get("playbook") or [], + }) + return actions + + +def fanout(brokers_list: list[dict], batch_size: int = 8) -> dict: + """Group brokers into batches for parallel `delegate_task` scan subagents. + + Scanning many brokers serially is slow and burns context; above `batch_size` + the agent is expected to spawn one subagent per batch (see SKILL.md). + """ + ids = [b.get("id") for b in brokers_list if b.get("id")] + batches = [ids[i:i + batch_size] for i in range(0, len(ids), batch_size)] + return { + "broker_count": len(ids), + "batch_size": batch_size, + "should_fanout": len(ids) > batch_size, + "batches": batches, + } + + +# States that mean "the crawl reached a verdict for this broker". +_SCANNED_STATES = {"found", "not_found", "indirect_exposure", "blocked", "submitted", + "verification_pending", "awaiting_processing", "confirmed_removed", "reappeared", + "action_selected", "human_task_queued"} +# States that still need a deletion action taken. +_ACTIONABLE_STATES = {"found", "indirect_exposure", "reappeared", "action_selected"} + + +def batch_plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, + ledger: dict | None = None, browser_clears_captcha: bool = False) -> dict: + """Reduce the per-broker plan into a phase-oriented batch view. + + Overlays the current ledger state on each broker, groups by what the operator + should DO next, and collapses ownership clusters so a parent removal that clears + children is ONE action, not N. Read-only: computes, never mutates the ledger. + """ + ledger = ledger or {} + actions = plan(subject_dossier, brokers_list, cfg, browser_clears_captcha) + + # child id -> parent id (only for parents present in this plan set) + child_to_parent: dict[str, str] = {} + for a in actions: + for child in a.get("owns") or []: + child_to_parent[child] = a["broker_id"] + + def state_of(bid: str) -> str: + return (ledger.get(bid) or {}).get("state", "new") + + groups: dict[str, list[dict]] = { + "unscanned": [], # no verdict yet -> Phase 1 crawl + "found": [], # direct removable listing -> Phase 2 opt-out (incl. reappeared/action_selected) + "indirect_exposure": [],# PII on a third party's record -> CCPA/GDPR delete email + "blocked": [], # anti-bot / needs stealth browser -> requeue + "in_progress": [], # submitted / verification_pending / awaiting_processing + "human": [], # human_task_queued -> the end-of-run digest, NOT re-scanning + "done": [], # confirmed_removed + "not_found": [], + } + covered_by_parent: dict[str, list[str]] = {} + + for a in actions: + bid = a["broker_id"] + st = state_of(bid) + # cluster collapse: if a parent in this set is already actioned, the child is covered + parent = child_to_parent.get(bid) + if parent and state_of(parent) in ("found", "reappeared", "action_selected", "submitted", + "verification_pending", "awaiting_processing", + "confirmed_removed", "human_task_queued"): + covered_by_parent.setdefault(parent, []).append(bid) + continue + + row = {"broker_id": bid, "broker_name": a["broker_name"], "priority": a["priority"], + "tier": a["tier"], "method": a["method"], "state": st, + "optout_url": a["optout_url"], "optout_email": a.get("optout_email"), + "clears_children": a.get("owns") or [], + "optout_requires": a.get("optout_requires") or {}, + "optout_quirks": a.get("optout_quirks") or [], + "deletion": a.get("deletion") or {}, + "optout_playbook": a.get("optout_playbook") or [], + "notes": a.get("notes", "")} + if st in ("submitted", "verification_pending", "awaiting_processing"): + groups["in_progress"].append(row) + elif st == "confirmed_removed": + groups["done"].append(row) + elif st in ("reappeared", "action_selected"): + groups["found"].append(row) # still needs the opt-out action + elif st == "human_task_queued": + groups["human"].append(row) # parked for the digest; never re-queued as work + elif st in groups: + groups[st].append(row) + elif st not in _SCANNED_STATES: + groups["unscanned"].append(row) + else: + groups.setdefault(st, []).append(row) + + # PARENTS FIRST: within the actionable 'found' group, order cluster parents (a removal + # that clears children) ahead of standalone listings, most-children first. Working a + # parent before its children is what makes the cluster dedup real -- do them in this order. + groups["found"].sort(key=lambda r: (-len(r.get("clears_children") or []), + {"T0": 0, "T1": 1, "T2": 2, "T3": 3}.get(r.get("tier") or "", 9), + r["broker_id"])) + + return { + "subject": subject_dossier.get("subject_id"), + "phase": "discover" if groups["unscanned"] else "delete", + "counts": {k: len(v) for k, v in groups.items()}, + "groups": groups, + "cluster_savings": {p: kids for p, kids in covered_by_parent.items()}, + "parent_playbook": _parent_playbook(groups["found"]), + "next_actions": _batch_next(groups, covered_by_parent), + } + + +def synthesize_steps(r: dict) -> list[str]: + """Generic ordered opt-out steps derived from an optout record's structured fields. + + Used for any broker without a hand-verified `optout.playbook`. Bespoke, field-verified + step lists live IN the broker JSON (`optout.playbook`) - single source of truth that + accrues knowledge as live runs discover mechanics (see methods.md logging rule). + """ + steps = [f"Opt out at {r.get('optout_url') or r.get('optout_email') or '(see broker record)'}" + + (f" -- clears {', '.join(r['clears_children'])}." if r.get("clears_children") else ".")] + req = r.get("optout_requires") or {} + if req.get("profile_url"): + steps.append("Needs the confirmed profile_url (paste the listing URL you recorded).") + if req.get("email_verification"): + steps.append("Email verification: the same browser/inbox must open the confirmation link.") + if req.get("phone_callback"): + steps.append("Phone-callback code required; queue a human task if no operator is available.") + if req.get("gov_id"): + steps.append("Government ID demanded (T3): human task; never send SSN or a full ID number.") + d = r.get("deletion") or {} + if d.get("email"): + steps.append(f"DELETION lane: a right-to-delete request can be emailed to {d['email']}" + + (f" ({d['notes']})" if d.get("notes") else "") + + " -- prefer deletion over suppression.") + if r.get("notes"): + steps.append(str(r["notes"])) + for q in (r.get("optout_quirks") or [])[:3]: + steps.append(str(q)) + return steps + + +def _parent_playbook(found_rows: list[dict]) -> list[dict]: + """Tailored, ordered opt-out instructions for each cluster PARENT in the found group. + + Steps come from the broker record's own `optout.playbook` (field-verified, maintained with + the data) with a synthesised fallback so the guidance is never empty. Standalone listings + are intentionally omitted -- the playbook exists to make the parents-first order concrete. + """ + playbook: list[dict] = [] + for i, r in enumerate([x for x in found_rows if x.get("clears_children")], start=1): + steps = list(r.get("optout_playbook") or []) or synthesize_steps(r) + playbook.append({ + "order": i, + "broker_id": r["broker_id"], + "broker_name": r["broker_name"], + "tier": r["tier"], + "clears_children": r["clears_children"], + "optout_url": r.get("optout_url"), + "optout_email": r.get("optout_email"), + "deletion": r.get("deletion") or {}, + "steps": steps, + }) + return playbook + + +def _batch_next(groups: dict, covered: dict) -> list[str]: + tips: list[str] = [] + if groups["unscanned"]: + tips.append(f"PHASE 1 (crawl): {len(groups['unscanned'])} broker(s) unscanned -- run `fanout` and " + "scan read-only before any deletion.") + if groups["found"]: + parents = [r for r in groups["found"] if r.get("clears_children")] + if parents: + order = " -> ".join(r["broker_id"] for r in parents) + tips.append(f"PHASE 2 (opt-out): {len(groups['found'])} direct listing(s). DO CLUSTER PARENTS " + f"FIRST, in this order: {order} (see `parent_playbook` for tailored per-parent " + "steps), then the standalone listings.") + else: + tips.append(f"PHASE 2 (opt-out): {len(groups['found'])} direct listing(s) to remove.") + if groups["indirect_exposure"]: + tips.append(f"{len(groups['indirect_exposure'])} indirect-exposure case(s): send a targeted " + "CCPA/GDPR delete-my-PII email (render-email --kind ccpa_indirect), do NOT use the opt-out form.") + if groups["blocked"]: + tips.append(f"{len(groups['blocked'])} blocked (anti-bot): requeue for a stealth/cloud browser " + "pass; don't burn subagent time fighting CAPTCHAs.") + if covered: + n = sum(len(v) for v in covered.values()) + tips.append(f"Cluster dedup: {n} child site(s) covered by parent removals -- skip separate opt-outs.") + if groups["in_progress"]: + tips.append(f"{len(groups['in_progress'])} in progress: resolve verification links, then confirm removal.") + if groups.get("human"): + tips.append(f"{len(groups['human'])} parked human task(s): present via `tasks` at end of run " + "(do not re-scan or re-queue them).") + return tips diff --git a/optional-skills/security/unbroker/scripts/vectors.py b/optional-skills/security/unbroker/scripts/vectors.py new file mode 100644 index 00000000000..4fcf006e1d3 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/vectors.py @@ -0,0 +1,53 @@ +"""Enumerate the search queries to run per broker, across ALL of a subject's identifiers. + +People-search sites index a person under every name, phone, email, and address they +have. A subject with two names (maiden/married) and three past cities can have many +distinct listings on one broker, each found via a different search. `search_vectors` +expands the dossier into the concrete searches to run, filtered by what each broker +supports (`broker.search.by`, default ["name"]). +""" +from __future__ import annotations + +import dossier as dossier_mod + +# What a broker can be searched by; default if a record doesn't declare it. +DEFAULT_BY = ["name"] + + +def supported_by(broker: dict) -> list[str]: + return list((broker.get("search") or {}).get("by") or DEFAULT_BY) + + +def search_vectors(subject_dossier: dict, broker: dict) -> list[dict]: + """List of {by, query} searches to run for this subject on this broker.""" + by = set(supported_by(broker)) + ident = subject_dossier.get("identity", {}) + vectors: list[dict] = [] + + if "name" in by: + names = dossier_mod.all_names(subject_dossier) + locations = dossier_mod.all_locations(subject_dossier) + if locations: + for name in names: + for loc in locations: + vectors.append({"by": "name", + "query": {"full_name": name, "city": loc.get("city"), "state": loc.get("state")}}) + else: + for name in names: + vectors.append({"by": "name", "query": {"full_name": name}}) + + if "phone" in by: + for phone in ident.get("phones") or []: + vectors.append({"by": "phone", "query": {"phone": phone}}) + + if "email" in by: + for email in ident.get("emails") or []: + vectors.append({"by": "email", "query": {"email": email}}) + + if "address" in by: + for a in dossier_mod.all_addresses(subject_dossier): + if a.get("line1"): + vectors.append({"by": "address", + "query": {k: a.get(k) for k in ("line1", "city", "state", "postal")}}) + + return vectors diff --git a/optional-skills/security/unbroker/templates/consent/authorization.md b/optional-skills/security/unbroker/templates/consent/authorization.md new file mode 100644 index 00000000000..9815916727f --- /dev/null +++ b/optional-skills/security/unbroker/templates/consent/authorization.md @@ -0,0 +1,15 @@ +# Authorization to act on my behalf (data removal) + +I, **{full_name}**, authorize the operator of this tool to act as my agent for the limited purpose of +removing my personal information from data brokers and people-search websites, including submitting +opt-out, deletion, and do-not-sell/share requests under applicable privacy laws (e.g. CCPA/CPRA, +GDPR) on my behalf. + +This authorization is limited to data removal. It does not authorize any other use of my information. + +- Full name: {full_name} +- Date: {date} +- Signature: ______________________________ + +Store the signed copy at the path recorded in the dossier `consent.authorization_artifact`. Required +only when `consent.method` is `written_authorization` or `poa` (not for `self`). diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt b/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt new file mode 100644 index 00000000000..e5e4a09a114 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt @@ -0,0 +1,24 @@ +Subject: CCPA/CPRA request submitted by authorized agent (delete and opt out) + +To the {broker_name} privacy team, + +I am an authorized agent acting on behalf of the consumer named below, under Cal. Civ. Code +1798.135 and the CCPA/CPRA. Written authorization is on file and available on request. + +On the consumer's behalf I request that you: + + 1. DELETE all personal information you hold about them, and + 2. OPT them OUT of the sale and sharing of their personal information. + +Their information appears at: +{listing_urls} + +Consumer: + Name: {full_name} + Email for confirmation: {contact_email} + +Please confirm completion in writing to the email above. Do not request more sensitive information +than necessary to verify and process this request. + +Sincerely, +Authorized agent for {full_name} diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt b/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt new file mode 100644 index 00000000000..db2d201c73c --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt @@ -0,0 +1,22 @@ +Subject: CCPA/CPRA request to delete and opt out (do not sell or share) + +To the {broker_name} privacy team, + +Under the California Consumer Privacy Act as amended by the CPRA (Cal. Civ. Code 1798.105 and +1798.120), I request that you: + + 1. DELETE all personal information you hold about me, and + 2. OPT me OUT of the sale and sharing of my personal information. + +My information appears at: +{listing_urls} + +Identifying details for this request: + Name: {full_name} + Email: {contact_email} + +Please do not request more sensitive information than necessary to process this request. Confirm +completion in writing to the email above within the statutory timeframe. + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt b/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt new file mode 100644 index 00000000000..e561e8d6e11 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt @@ -0,0 +1,30 @@ +Subject: Request to delete my personal information from third-party listings (CCPA/CPRA where applicable) + +To the {broker_name} privacy team, + +I am not the primary subject of the listings below, but each one currently exposes MY personal +information as a secondary data point (my email address and/or my name shown as a relative or +associated person). I am writing only about my own personal information, not about the individuals +who are the primary subjects of these records, and I am not requesting any change to their data. + +Please delete and suppress the following personal information about me wherever it appears in your +database and on Spokeo-operated sites, including Thatsthem.com: +{my_identifiers} + +These items currently appear at: +{listing_urls} + +To the extent the California Consumer Privacy Act as amended by the CPRA (Cal. Civ. Code 1798.105) +applies to my personal information, please treat this as a request to delete it and to opt me out of +its sale or sharing (1798.120). Where CCPA does not apply by residency, I ask that you honor this as a +standard removal of my personal information consistent with the policy you apply to such requests. + +Please do not request more information than is necessary to locate and remove these items, and please +do not add any new identifiers to my data in the course of processing this request. Confirm completion +in writing to the email below. + +Name: {full_name} +Contact email: {contact_email} + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt b/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt new file mode 100644 index 00000000000..b1b7936af98 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt @@ -0,0 +1,19 @@ +Subject: Request for erasure under GDPR Article 17 + +To the {broker_name} data protection officer, + +Under Article 17 of the EU General Data Protection Regulation (and/or the UK GDPR), I request the +erasure of all personal data you hold about me, and under Article 21 I object to its processing. + +My personal data appears at: +{listing_urls} + +Identifying details: + Name: {full_name} + Email: {contact_email} + +Please confirm erasure in writing to the email above within one month, as required by Article 12(3). +Do not request more personal data than necessary to action this request. + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/generic-optout.txt b/optional-skills/security/unbroker/templates/emails/generic-optout.txt new file mode 100644 index 00000000000..3fef1bf986a --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/generic-optout.txt @@ -0,0 +1,15 @@ +Subject: Opt-out and data removal request + +To the {broker_name} privacy team, + +I am writing to request the removal of my personal information from {broker_name} and any sites you +operate or supply. My information currently appears at: +{listing_urls} + +Please suppress and delete the record(s) associated with my name, {full_name}, and do not sell or +share my personal information. + +Please confirm completion to this email address: {contact_email} + +Thank you, +{full_name} diff --git a/tests/skills/test_unbroker_skill.py b/tests/skills/test_unbroker_skill.py new file mode 100644 index 00000000000..920d0da799b --- /dev/null +++ b/tests/skills/test_unbroker_skill.py @@ -0,0 +1,1296 @@ +"""Hermetic tests for the unbroker skill. + +Stdlib + pytest only; NO live network, NO browser, NO email. Each test runs against +an isolated temp PDD_DATA_DIR. Runnable with pytest or directly: + + python3 -m pytest tests/test_unbroker_skill.py -q + python3 tests/test_unbroker_skill.py # portable fallback runner +""" +from __future__ import annotations + +import contextlib +import os +import shutil +import sys +import tempfile +from pathlib import Path + +# Resolve the skill's scripts dir across layouts: standalone dev repo (tests/) and hermes-agent +# (tests/skills/ -> optional-skills/security/unbroker/scripts). +_HERE = Path(__file__).resolve() +_REL = ("optional-skills", "security", "unbroker", "scripts") +_CANDIDATES = [ + _HERE.parent.parent / "skill" / "scripts", # standalone dev repo + _HERE.parent.parent.joinpath(*_REL), # standalone layout + _HERE.parent.parent.parent.joinpath(*_REL), # hermes-agent (tests/skills/) +] +SCRIPTS = next((c for c in _CANDIDATES if (c / "pdd.py").exists()), _CANDIDATES[0]) +sys.path.insert(0, str(SCRIPTS)) + +import autopilot # noqa: E402 +import contextlib as _ctx # noqa: E402 +import io as _io # noqa: E402 +import json as _json # noqa: E402 +import smtplib as _smtplib # noqa: E402 +import time as _time # noqa: E402 + +import badbool # noqa: E402 +import brokers # noqa: E402 +import config # noqa: E402 +import crypto # noqa: E402 +import dossier # noqa: E402 +import email_modes # noqa: E402 +import emailer # noqa: E402 +import pdd # noqa: E402 +import legal # noqa: E402 +import ledger # noqa: E402 +import paths # noqa: E402 +import registry # noqa: E402 +import report # noqa: E402 +import storage # noqa: E402 +import tiers # noqa: E402 +import vectors # noqa: E402 + +_AGE = bool(shutil.which("age") and shutil.which("age-keygen")) + + +@contextlib.contextmanager +def temp_env(): + """Isolate every test in a fresh PDD_DATA_DIR.""" + prev = os.environ.get("PDD_DATA_DIR") + with tempfile.TemporaryDirectory() as d: + os.environ["PDD_DATA_DIR"] = str(Path(d) / "pdd") + try: + yield Path(os.environ["PDD_DATA_DIR"]) + finally: + if prev is None: + os.environ.pop("PDD_DATA_DIR", None) + else: + os.environ["PDD_DATA_DIR"] = prev + + +def _consenting(full_name="Jane Q. Public"): + return { + "subject_id": "sub_test01", + "consent": {"authorized": True, "method": "self"}, + "identity": { + "full_name": full_name, + "emails": ["jane@example.com"], + "phones": ["+1-415-555-0137"], + "date_of_birth": "1987-04-12", + "current_address": {"city": "Oakland", "state": "CA", "postal": "94601"}, + }, + "preferences": {"email_mode": "draft_only"}, + } + + +# --- config ------------------------------------------------------------------- + +def test_config_defaults_are_easiest(): + with temp_env(): + cfg = config.load_config() + assert cfg["email_mode"] == "draft_only" + assert cfg["browser_backend"] == "auto" + assert cfg["tracker_backend"] == "local-json" + assert cfg["encryption"] == "none" + + +def test_config_roundtrip_and_validation(): + with temp_env(): + config.save_config({"email_mode": "programmatic"}) + assert config.load_config()["email_mode"] == "programmatic" + try: + config.save_config({"email_mode": "bogus"}) + except ValueError: + pass + else: + raise AssertionError("invalid email_mode should raise") + + +def test_browser_clears_captcha_logic(): + assert config.browser_clears_captcha({"browser_backend": "browserbase"}) is True + assert config.browser_clears_captcha({"browser_backend": "agent-browser"}) is False + assert config.browser_clears_captcha({"browser_backend": "auto"}, env={}) is False + assert config.browser_clears_captcha({"browser_backend": "auto"}, env={"BROWSERBASE_API_KEY": "x"}) is True + + +# --- storage ------------------------------------------------------------------ + +def test_storage_json_and_jsonl_roundtrip(): + with temp_env() as data: + p = data / "x.json" + storage.write_json(p, {"a": 1}) + assert storage.read_json(p) == {"a": 1} + assert storage.read_json(data / "missing.json", []) == [] + log = data / "audit.jsonl" + storage.append_jsonl(log, {"e": 1}) + storage.append_jsonl(log, {"e": 2}) + assert [r["e"] for r in storage.read_jsonl(log)] == [1, 2] + + +# --- at-rest encryption ------------------------------------------------------- + +def test_encryption_off_writes_plaintext(): + with temp_env(): + d = _consenting() + dossier.save(d) + p = paths.dossier_path(d["subject_id"]) + assert p.exists() and not Path(str(p) + ".age").exists() + + +def test_encryption_age_round_trip(): + if not _AGE: + return # age not installed -> effectively skipped (keeps hermetic CI green) + with temp_env(): + config.save_config({"encryption": "age"}) + crypto.ensure_identity() + assert crypto.is_engaged() + d = _consenting() + dossier.save(d) + plain = paths.dossier_path(d["subject_id"]) + enc = Path(str(plain) + ".age") + assert enc.exists() and not plain.exists() # only ciphertext on disk + assert not enc.read_bytes().lstrip().startswith(b"{") # not plaintext JSON + assert dossier.load(d["subject_id"])["identity"]["full_name"] == "Jane Q. Public" + + +def test_encryption_keeps_config_and_audit_plaintext(): + if not _AGE: + return + with temp_env(): + config.save_config({"encryption": "age"}) + crypto.ensure_identity() + # config.json must stay readable plaintext (crypto reads it to decide) + assert config.load_config()["encryption"] == "age" + assert not Path(str(paths.config_path()) + ".age").exists() + # audit log holds field NAMES only, kept plaintext by design + ledger.transition("sub_test01", "spokeo", "found", found=True) + assert paths.audit_path("sub_test01").exists() + + +# --- broker DB ---------------------------------------------------------------- + +def test_seed_broker_db_loads_and_is_well_formed(): + everyone = brokers.load_all() + assert len(everyone) >= 10 + ids = {b["id"] for b in everyone} + assert {"spokeo", "whitepages", "mylife"} <= ids + for b in everyone: + assert b.get("id") and b.get("name") and b.get("priority") in {"crucial", "high", "standard", "long_tail"} + assert (b.get("optout") or {}).get("method") + + +def test_clusters_expose_ownership(): + cl = brokers.clusters() + assert "freepeopledirectory" in cl.get("spokeo", []) + assert "peoplelooker" in cl.get("beenverified", []) + + +# --- tier selection ----------------------------------------------------------- + +def test_every_broker_resolves_to_valid_tier(): + for b in brokers.load_all(): + assert tiers.select_tier(b) in {"T0", "T1", "T2", "T3"} + + +def test_email_verification_tier_shifts_with_mode(): + spokeo = brokers.get("spokeo") + assert tiers.select_tier(spokeo, "draft_only") == "T2" + assert tiers.select_tier(spokeo, "programmatic") == "T1" + assert tiers.select_tier(spokeo, "alias") == "T1" + + +def test_captcha_tier_shifts_with_browser(): + tps = brokers.get("truepeoplesearch") + assert tiers.select_tier(tps, "programmatic", browser_clears_captcha=False) == "T2" + assert tiers.select_tier(tps, "programmatic", browser_clears_captcha=True) == "T1" + + +def test_hard_human_requirements_force_t3(): + assert tiers.select_tier(brokers.get("mylife")) == "T3" # gov_id + # thatsthem's opt-out is Cloudflare-Turnstile gated (captcha:true) -> T2 without a + # captcha-clearing browser backend, T1 with one. (Corrected 2026-06-30 after the + # live scan found the real form gated; the record previously mis-declared captcha:false.) + assert tiers.select_tier(brokers.get("thatsthem")) == "T2" + assert tiers.select_tier(brokers.get("thatsthem"), browser_clears_captcha=True) == "T1" + + +def test_plan_excludes_disallowed_fields(): + d = _consenting() + actions = tiers.plan(d, brokers.load_all(), config.DEFAULT_CONFIG) + for a in actions: + assert "ssn" not in a["disclosure_fields"] + assert "profile_url" not in a["disclosure_fields"] + + +def test_disclosure_maps_street_when_broker_requires_it(): + # thatsthem's opt-out form requires a street line; select_disclosure must surface it from + # current_address.line1 (regression: 'street' was in broker inputs but unmapped, silently dropped). + d = _consenting() + d["identity"]["current_address"]["line1"] = "123 Main St" + out = dossier.select_disclosure(d, ["full_name", "street", "city", "state", "postal"]) + assert out["street"] == "123 Main St" + # and when there is no street on file, it is simply omitted (never a blank/placeholder) + d2 = _consenting() + out2 = dossier.select_disclosure(d2, ["full_name", "street", "city"]) + assert "street" not in out2 + + +def _mini_broker(bid, owns=None, requires=None, notes="", quirks=None): + return {"id": bid, "name": bid.title(), "priority": "high", + "search": {"by": ["name"]}, + "optout": {"method": "web_form", "url": f"https://{bid}.example/optout", + "requires": requires or {}, "inputs": ["full_name"], "owns": owns or [], + "notes": notes, "quirks": quirks or []}, + "owns": owns or []} + + +def test_batch_plan_groups_by_ledger_state(): + d = _consenting() + bl = [_mini_broker("aaa"), _mini_broker("bbb"), _mini_broker("ccc"), _mini_broker("ddd")] + ledger = { + "aaa": {"state": "found"}, + "bbb": {"state": "not_found"}, + "ccc": {"state": "blocked"}, + # ddd absent -> unscanned/new + } + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["phase"] == "discover" # ddd is unscanned + assert bp["counts"]["found"] == 1 + assert bp["counts"]["not_found"] == 1 + assert bp["counts"]["blocked"] == 1 + assert bp["counts"]["unscanned"] == 1 + assert any("PHASE 1" in t for t in bp["next_actions"]) + + +def test_batch_plan_collapses_ownership_clusters(): + # a parent that is being acted on (found/submitted/...) covers its children -> child dropped + d = _consenting() + bl = [_mini_broker("parent", owns=["kid"]), _mini_broker("kid")] + ledger = {"parent": {"state": "found"}, "kid": {"state": "found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["cluster_savings"] == {"parent": ["kid"]} + # the child must NOT also appear as its own actionable 'found' row + found_ids = [r["broker_id"] for r in bp["groups"]["found"]] + assert "parent" in found_ids and "kid" not in found_ids + + +def test_batch_plan_orders_found_parents_first(): + # found group must be sorted parents-first, most-children-first, standalone last. + d = _consenting() + bl = [_mini_broker("standalone"), + _mini_broker("smallparent", owns=["c1"]), + _mini_broker("bigparent", owns=["c1b", "c2b", "c3b"])] + ledger = {"standalone": {"state": "found"}, "smallparent": {"state": "found"}, + "bigparent": {"state": "found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + order = [r["broker_id"] for r in bp["groups"]["found"]] + assert order == ["bigparent", "smallparent", "standalone"] + # PHASE 2 tip spells out the parents-first order and points at the playbook + phase2 = [t for t in bp["next_actions"] if "PHASE 2" in t] + assert phase2 and "PARENTS FIRST" in phase2[0] and "bigparent -> smallparent" in phase2[0] + + +def test_parent_playbook_has_bespoke_and_synthesised_steps(): + d = _consenting() + bespoke = _mini_broker("bespokeparent", owns=["truthfinder", "ussearch"]) + # bespoke steps live IN the broker record (optout.playbook), not in code + bespoke["optout"]["playbook"] = ["Step one from the record", "SUPPRESSION != DELETION warning"] + bl = [bespoke, + _mini_broker("newparent", owns=["k1", "k2"], + requires={"profile_url": True, "email_verification": True}, + notes="synth note", quirks=["q1"]), + _mini_broker("standalone")] + ledger = {b["id"]: {"state": "found"} for b in bl} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + pb = {p["broker_id"]: p for p in bp["parent_playbook"]} + # standalone (no children) is NOT in the playbook + assert "standalone" not in pb + # bespoke recipe comes verbatim from the record's own playbook + assert pb["bespokeparent"]["steps"] == bespoke["optout"]["playbook"] + # synthesised recipe: newparent reflects its requires-flags + notes + quirks + steps = " ".join(pb["newparent"]["steps"]) + assert "profile_url" in steps and "verification" in steps.lower() + assert "synth note" in steps and "q1" in steps + # ordering is stamped on each entry, parents-first + assert [p["order"] for p in bp["parent_playbook"]] == [1, 2] + + +def test_batch_plan_phase_is_delete_when_all_scanned(): + d = _consenting() + bl = [_mini_broker("aaa"), _mini_broker("bbb")] + ledger = {"aaa": {"state": "confirmed_removed"}, "bbb": {"state": "not_found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["phase"] == "delete" # nothing unscanned + assert bp["counts"]["unscanned"] == 0 + assert bp["counts"]["done"] == 1 + + +# --- ledger / state machine --------------------------------------------------- + +def test_ledger_valid_transition_and_audit(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "spokeo", "searching") + case = ledger.transition(sid, "spokeo", "found", found=True) + assert case["state"] == "found" and case["found"] is True + # found -> submitted must be allowed directly (action_selected is optional) + case = ledger.transition(sid, "spokeo", "submitted") + assert case["state"] == "submitted" + audit = storage.read_jsonl(__import__("paths").audit_path(sid)) + assert any(e["to"] == "found" for e in audit) + + +def test_new_can_record_scan_outcome_directly(): + with temp_env(): + assert ledger.transition("sub_test01", "thatsthem", "found", found=True)["state"] == "found" + assert ledger.transition("sub_test01", "radaris", "not_found")["state"] == "not_found" + # a scan that is bot-blocked on the very first hit must be recordable as blocked directly + # (no need to pass through 'searching' first) -- and not_found -> blocked when a re-scan is gated + assert ledger.transition("sub_test01", "spokeo", "blocked")["state"] == "blocked" + assert ledger.transition("sub_test01", "radaris", "blocked")["state"] == "blocked" + # a blocked site later scanned via the operator's own (residential) browser resolves to a + # real verdict, incl. not_found -- blocked -> not_found must be legal. + assert ledger.transition("sub_test01", "spokeo", "not_found")["state"] == "not_found" + + +def test_indirect_exposure_state_and_transitions(): + with temp_env(): + sid = "sub_test01" + # a scan can land directly on indirect_exposure (PII on a relative's record) + case = ledger.transition(sid, "thatsthem", "indirect_exposure", + evidence={"summary": "email on relative record"}) + assert case["state"] == "indirect_exposure" + # the lever from there is a targeted delete-my-PII request (-> submitted) + assert ledger.transition(sid, "thatsthem", "submitted")["state"] == "submitted" + # and a separate broker: not_found -> indirect_exposure is allowed (found on re-read) + ledger.transition(sid, "radaris", "not_found") + assert ledger.transition(sid, "radaris", "indirect_exposure")["state"] == "indirect_exposure" + # re-scan can clear it + assert ledger.transition(sid, "radaris", "not_found")["state"] == "not_found" + + +def test_ledger_illegal_transition_raises(): + with temp_env(): + try: + ledger.transition("sub_test01", "spokeo", "confirmed_removed") # new -> confirmed_removed + except ValueError: + pass + else: + raise AssertionError("illegal transition should raise") + + +def test_ledger_disclosure_log(): + with temp_env(): + ledger.log_disclosure("sub_test01", "spokeo", ["full_name", "contact_email"], "web_form") + case = ledger.get_case("sub_test01", "spokeo") + assert case["disclosure_log"][0]["fields"] == ["contact_email", "full_name"] + + +# --- dossier / consent / least-disclosure ------------------------------------ + +def test_consent_gate(): + assert dossier.is_authorized(_consenting()) is True + nope = _consenting() + nope["consent"] = {"authorized": False, "method": "self"} + assert dossier.is_authorized(nope) is False + try: + dossier.require_authorized(nope) + except PermissionError: + pass + else: + raise AssertionError("require_authorized should raise for non-consenting subject") + + +def test_least_disclosure_selection(): + d = _consenting() + got = dossier.select_disclosure(d, ["full_name", "contact_email", "profile_url", "ssn", "date_of_birth"]) + assert set(got) == {"full_name", "contact_email", "date_of_birth"} + assert "ssn" not in got and "profile_url" not in got + + +def test_designated_contact_email_overrides_first(): + d = _consenting() + d["identity"]["emails"] = ["first@x.com", "alias@x.com"] + assert dossier.contact_email(d) == "first@x.com" + d["preferences"]["contact_email_for_optouts"] = "alias@x.com" + assert dossier.contact_email(d) == "alias@x.com" + + +# --- alternates / search vectors --------------------------------------------- + +def test_all_names_and_locations_dedupe(): + d = _consenting() + d["identity"]["also_known_as"] = ["Jane Public", "Jane Q. Public"] # 2nd dups primary + d["identity"]["prior_addresses"] = [{"city": "Berkeley", "state": "CA"}, {"city": "Oakland", "state": "CA"}] + assert dossier.all_names(d) == ["Jane Q. Public", "Jane Public"] + assert [loc["city"] for loc in dossier.all_locations(d)] == ["Oakland", "Berkeley"] # current first, deduped + + +def test_search_vectors_fan_out_across_alternates(): + d = _consenting() + d["identity"]["also_known_as"] = ["Jane Smith"] + d["identity"]["prior_addresses"] = [{"city": "Berkeley", "state": "CA"}] + d["identity"]["emails"] = ["a@x.com", "b@y.com"] + d["identity"]["phones"] = ["+1-415-555-0137", "+1-510-555-0199"] + broker = {"id": "x", "search": {"by": ["name", "phone", "email", "address"]}} + v = vectors.search_vectors(d, broker) + assert len([x for x in v if x["by"] == "name"]) == 4 # 2 names x 2 locations + assert len([x for x in v if x["by"] == "phone"]) == 2 + assert len([x for x in v if x["by"] == "email"]) == 2 + assert len([x for x in v if x["by"] == "address"]) == 0 # no street line1 yet + + +def test_search_vectors_respect_broker_capabilities(): + d = _consenting() + d["identity"]["emails"] = ["a@x.com"] + v = vectors.search_vectors(d, {"id": "y", "search": {"by": ["name"]}}) + assert v and all(x["by"] == "name" for x in v) # broker can't search email -> no email vectors + + +def test_search_vectors_address_needs_line1(): + d = _consenting() + d["identity"]["current_address"] = {"line1": "123 Main St", "city": "Oakland", "state": "CA", "postal": "94601"} + v = vectors.search_vectors(d, {"id": "z", "search": {"by": ["address"]}}) + assert len(v) == 1 and v[0]["by"] == "address" and v[0]["query"]["line1"] == "123 Main St" + + +# --- opaque ids / fan-out / antibot ------------------------------------------ + +def test_subject_id_is_opaque_no_name_leak(): + sid = dossier.new_subject_id("Maiden Married Person") + assert sid.startswith("sub_") + assert "maiden" not in sid.lower() and "person" not in sid.lower() + assert dossier.new_subject_id("Maiden Married Person") != sid # not derived from the name + + +def test_fanout_batches_large_runs(): + g = tiers.fanout([{"id": f"b{i}"} for i in range(20)], batch_size=8) + assert g["broker_count"] == 20 and g["should_fanout"] is True + assert len(g["batches"]) == 3 and g["batches"][0] == [f"b{i}" for i in range(8)] + small = tiers.fanout([{"id": "x"}, {"id": "y"}], batch_size=8) + assert small["should_fanout"] is False and small["batches"] == [["x", "y"]] + + +def test_plan_surfaces_antibot(): + d = _consenting() + broker = {"id": "tps", "optout": {"requires": {}}, "search": {"antibot": "datadome", "by": ["name"]}} + actions = tiers.plan(d, [broker], config.DEFAULT_CONFIG) + assert actions[0]["antibot"] == "datadome" + + +def test_plan_surfaces_optout_quirks_and_email(): + d = _consenting() + broker = {"id": "radaris", "search": {"by": ["name"]}, + "optout": {"requires": {}, "email": "x@broker.test", "quirks": ["no profile URL -> email fallback"]}} + a = tiers.plan(d, [broker], config.DEFAULT_CONFIG)[0] + assert a["optout_email"] == "x@broker.test" + assert a["optout_quirks"] == ["no profile URL -> email fallback"] + + +# --- legal / templates -------------------------------------------------------- + +def test_legal_render_keeps_missing_placeholders_literal(): + out = legal.render("emails/generic-optout.txt", {"broker_name": "Spokeo"}) + assert "Spokeo" in out + assert "{full_name}" in out # missing field left literal, never blank-injected + + +def test_render_optout_email_includes_listing_and_name(): + b = brokers.get("spokeo") + out = legal.render_optout_email(b, {"full_name": "Jane Q. Public", + "contact_email": "jane@example.com", + "listing_urls": ["https://www.spokeo.com/jane"]}) + assert "Jane Q. Public" in out and "https://www.spokeo.com/jane" in out + + +def test_render_ccpa_indirect_request_names_only_own_identifiers(): + b = brokers.get("thatsthem") + out = legal.render_request("ccpa_indirect", b, { + "full_name": "Jane Q. Public", + "contact_email": "jane@example.com", + "my_identifiers": ["jane@example.com", 'the name "Jane Q. Public" where it appears as a relative'], + "listing_urls": ["https://thatsthem.com/email/jane@example.com"], + }) + # the request must frame this as the subject's OWN data on someone else's record + assert "not the primary subject" in out + assert "jane@example.com" in out + assert "https://thatsthem.com/email/jane@example.com" in out + # must NOT use the full-opt-out wording that claims the record is about the subject + assert "DELETE all personal information you hold about me" not in out + + +# --- email verification-link extraction -------------------------------------- + +def test_extract_verification_link_prefers_broker_optout_link(): + body = ("Hello,\nClick https://www.spokeo.com/optout/confirm?token=abc to confirm.\n" + "Unrelated: https://ads.example/promo\n") + link = email_modes.extract_verification_link(body, brokers.get("spokeo")) + assert link is not None and "spokeo.com" in link and "ads.example" not in link + + +def test_extract_verification_link_ignores_unrelated_only(): + assert email_modes.extract_verification_link("see https://example.com/news today") is None + + +# --- BADBOOL live-pull parser ------------------------------------------------- + +BADBOOL_FIXTURE = """ +## Search Engines +### Google +This is not a broker; ignore it. + +## People Search Sites + +### \U0001F490 BeenVerified +Find your information and opt out of [people search](https://www.beenverified.com/app/optout/search). + +### \U0001F490 \U0001F4DE MyLife +[Find your information](https://www.mylife.com), and then [opt out](https://www.mylife.com/privacyrequest). + +### \U0001F3AB PimEyes +To opt out, [upload an ID](https://pimeyes.com/en/opt-out-request-form). + +## Special Circumstances +### Not A Broker +Ignore this section entirely. +""" + + +def test_badbool_parses_people_search_section_only(): + recs = badbool.parse(BADBOOL_FIXTURE) + ids = {r["id"] for r in recs} + assert ids == {"beenverified", "mylife", "pimeyes"} # google + notabroker excluded + bv = next(r for r in recs if r["id"] == "beenverified") + assert bv["priority"] == "crucial" + assert "beenverified.com/app/optout" in (bv["optout"]["url"] or "") + assert bv["source"] == "BADBOOL-auto" and bv["confidence"] == "auto" + + +def test_badbool_symbols_map_to_requirements_and_tiers(): + recs = {r["id"]: r for r in badbool.parse(BADBOOL_FIXTURE)} + assert recs["mylife"]["optout"]["requires"]["phone_voice"] is True + assert recs["mylife"]["optout"]["method"] == "phone" + assert tiers.select_tier(recs["mylife"]) == "T3" + assert recs["pimeyes"]["optout"]["requires"]["gov_id"] is True + assert tiers.select_tier(recs["pimeyes"]) == "T3" + + +def test_badbool_merge_keeps_curated_and_adds_new(): + with temp_env(): + badbool.refresh(__import__("paths").brokers_cache_path(), markdown=BADBOOL_FIXTURE) + merged = {b["id"]: b for b in brokers.load_all()} + # curated record wins over the live one + assert merged["beenverified"]["source"] == "BADBOOL" + # a non-curated live record is added with auto confidence + assert "pimeyes" in merged and merged["pimeyes"]["confidence"] == "auto" + + +# --- report ------------------------------------------------------------------- + +def test_status_counts_and_markdown(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "spokeo", "searching") + ledger.transition(sid, "spokeo", "found") + ledger.transition(sid, "thatsthem", "searching") + ledger.transition(sid, "thatsthem", "not_found") + counts = report.status_counts(sid) + assert counts.get("found") == 1 and counts.get("not_found") == 1 + md = report.render_markdown(sid) + assert "status for" in md and "Count" in md + + +# --- autonomy: auto-configure --------------------------------------------------------------- + +def test_autonomy_default_is_full_and_valid(): + with temp_env(): + assert config.load_config()["autonomy"] == "full" + config.save_config({"autonomy": "assisted"}) + assert config.load_config()["autonomy"] == "assisted" + try: + config.save_config({"autonomy": "yolo"}) + except ValueError: + pass + else: + raise AssertionError("invalid autonomy should raise") + + +def test_auto_configure_picks_most_autonomous(): + with temp_env(): + # bare env -> draft_only floor, auto browser (still fully hands-off policy-wise) + cfg = config.auto_configure(env={}) + assert cfg["autonomy"] == "full" + assert cfg["email_mode"] == "draft_only" + assert cfg["browser_backend"] == "auto" + # SMTP creds -> programmatic email; Browserbase key -> cloud browser + cfg = config.auto_configure(env={"EMAIL_ADDRESS": "agent@gmail.com", + "EMAIL_PASSWORD": "app-pass", + "BROWSERBASE_API_KEY": "bb"}) + assert cfg["email_mode"] == "programmatic" + assert cfg["browser_backend"] == "browserbase" + # AgentMail only -> alias mode + assert config.auto_configure(env={"AGENTMAIL_API_KEY": "am"})["email_mode"] == "alias" + # encryption auto-on exactly when age is installed (free privacy, zero human cost) + assert config.auto_configure(env={})["encryption"] == ("age" if _AGE else "none") + + +# --- emailer: programmatic send + verification polling -------------------------------------- + +def test_emailer_settings_inference_and_floor(): + assert emailer.smtp_settings(env={}) is None + assert emailer.imap_settings(env={}) is None + env = {"EMAIL_ADDRESS": "a@gmail.com", "EMAIL_PASSWORD": "p"} + assert emailer.smtp_settings(env)["host"] == "smtp.gmail.com" + assert emailer.smtp_settings(env)["port"] == 587 + assert emailer.imap_settings(env)["host"] == "imap.gmail.com" + assert emailer.imap_settings(env)["port"] == 993 + # unknown provider without an explicit host -> NOT configured (never guess blind) + corp = {"EMAIL_ADDRESS": "a@corp.example", "EMAIL_PASSWORD": "p"} + assert emailer.smtp_settings(corp) is None + s = emailer.smtp_settings({**corp, "EMAIL_SMTP_HOST": "mail.corp.example", + "EMAIL_SMTP_PORT": "465"}) + assert (s["host"], s["port"]) == ("mail.corp.example", 465) + + +class _FakeSMTP: + sent: list = [] + + def __init__(self, host, port, timeout=None): + self.host, self.port = host, port + + def __enter__(self): + return self + + def __exit__(self, *a): + return False + + def ehlo(self): + pass + + def starttls(self): + pass + + def login(self, user, password): + self.user = user + + def send_message(self, msg): + _FakeSMTP.sent.append(msg) + + +def test_emailer_send_locks_recipient_to_broker(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "radaris", "optout": {"email": "privacy@radaris.example"}} + _FakeSMTP.sent = [] + out = emailer.send(broker, "Subject: Remove my listing\n\nBody here", env=env, + _smtp_factory=_FakeSMTP) + assert out["to"] == "privacy@radaris.example" + assert _FakeSMTP.sent[0]["Subject"] == "Remove my listing" + assert "Body here" in _FakeSMTP.sent[0].get_content() + # arbitrary recipients are refused -- this tool cannot be repurposed to email people + try: + emailer.send(broker, "Subject: x\n\nb", to="victim@example.com", env=env, + _smtp_factory=_FakeSMTP) + except PermissionError: + pass + else: + raise AssertionError("non-broker recipient must be refused") + + +def test_emailer_send_requires_config_and_broker_address(): + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + try: + emailer.send(broker, "Subject: s\n\nb", env={}) + except RuntimeError: + pass + else: + raise AssertionError("unconfigured SMTP must raise (draft fallback, not a crash)") + try: + emailer.send({"id": "y", "optout": {}}, "Subject: s\n\nb", + env={"EMAIL_ADDRESS": "a@gmail.com", "EMAIL_PASSWORD": "p"}) + except RuntimeError: + pass + else: + raise AssertionError("broker without a declared address must raise") + + +def test_browser_send_payload_is_recipient_locked(): + broker = {"id": "radaris", "optout": {"email": "privacy@radaris.example"}} + p = emailer.browser_send_payload(broker, "Subject: Remove my listing\n\nBody here") + assert p["to"] == "privacy@radaris.example" + assert p["subject"] == "Remove my listing" and "Body here" in p["body"] + # the browser lane refuses arbitrary recipients too (same guard as SMTP send) + try: + emailer.browser_send_payload(broker, "Subject: x\n\nb", to="victim@example.com") + except PermissionError: + pass + else: + raise AssertionError("browser lane must refuse a non-broker recipient") + + +def test_browser_email_mode_is_autonomous_without_smtp_or_imap(): + with temp_env(): + assert config.save_config({"email_mode": "browser"}) # mode is valid + persists + d = _consenting() + d["residency_jurisdiction"] = "US-CA" + mailer = _mini_broker("mailer") + mailer["optout"]["method"] = "email" + mailer["optout"]["email"] = "privacy@mailer.example" + verifier = _mini_broker("verifier", requires={"email_verification": True}) + led = {"mailer": {"state": "found"}, + "verifier": {"broker_id": "verifier", "state": "submitted"}} + # browser mode with NO EMAIL_* creds -> still fully autonomous (agent uses webmail) + q = autopilot.next_actions(d, [mailer, verifier], _auto_cfg(email_mode="browser"), led, env={}) + sends = [a for a in q["actions"] if a["type"] == "optout_email_send"] + assert sends and sends[0]["send_via"] == "browser" and sends[0]["to"] == "privacy@mailer.example" + polls = [a for a in q["actions"] if a["type"] == "poll_verification"] + assert polls and polls[0]["via"] == "browser" + assert not q["human_digest"] # browser mode needs no human for these + + +def test_verification_link_from_messages_is_domain_scoped(): + broker = {"id": "spokeo", "name": "Spokeo", + "search": {"url": "https://www.spokeo.com/"}, + "optout": {"url": "https://www.spokeo.com/optout"}} + phish = {"from": "phisher@evil.example", "subject": "verify now", + "text": "click https://evil.example/optout/verify?x=1"} + real = {"from": "no-reply@spokeo.com", "subject": "Confirm your opt out", + "text": "Confirm here: https://www.spokeo.com/optout/verify/abc123"} + hit = emailer.link_from_messages([phish, real], broker) + assert hit["link"] == "https://www.spokeo.com/optout/verify/abc123" + # a phishing-only inbox yields nothing (domain scoping + link scoring) + assert emailer.link_from_messages([phish], broker) is None + + +# --- ledger: follow-up scheduling + due queue ------------------------------------------------ + +def test_verification_pending_to_awaiting_processing_is_legal(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "intelius", "found", found=True) + ledger.transition(sid, "intelius", "submitted") + ledger.transition(sid, "intelius", "verification_pending") + assert ledger.transition(sid, "intelius", "awaiting_processing")["state"] == "awaiting_processing" + + +def test_followup_stamps_and_due_queue(): + broker = {"optout": {"est_processing_days": 10}} + d = {"preferences": {"rescan_interval_days": 30}} + f_sub = ledger.followup_fields("submitted", broker, d) + assert "next_recheck_at" in f_sub + f_done = ledger.followup_fields("confirmed_removed", broker, d) + assert "removal_confirmed_at" in f_done + assert f_done["next_recheck_at"] > f_sub["next_recheck_at"] # 30d rescan > 10d processing + assert ledger.followup_fields("found", broker, d) == {} # scan verdicts get no stamp + led = { + "a": {"broker_id": "a", "state": "awaiting_processing", "next_recheck_at": "2000-01-01T00:00:00Z"}, + "b": {"broker_id": "b", "state": "confirmed_removed", "next_recheck_at": "2999-01-01T00:00:00Z"}, + } + assert [c["broker_id"] for c in ledger.due("sub_x", ledger=led)] == ["a"] + + +def test_badbool_auto_records_have_processing_estimate(): + recs = badbool.parse("## People Search Sites\n### Example\n[opt out](https://example.com/optout)\n") + assert recs[0]["optout"]["est_processing_days"] == 14 # drives next_recheck_at for live records + + +# --- autopilot: the autonomous action queue -------------------------------------------------- + +def _auto_cfg(**over): + cfg = dict(config.DEFAULT_CONFIG) + cfg.update(over) + return cfg + + +def test_next_actions_scan_first_then_optouts_parents_first(): + with temp_env(): + d = _consenting() + bl = [_mini_broker("parent", owns=["kid"]), _mini_broker("kid"), _mini_broker("solo")] + q = autopilot.next_actions(d, bl, _auto_cfg(), {}, env={}) + types = [a["type"] for a in q["actions"]] + assert "scan_inline" in types + assert not any(t.startswith("optout") for t in types) # never act before the crawl + assert q["phase"] == "discover" + led = {"parent": {"state": "found"}, "kid": {"state": "found"}, "solo": {"state": "found"}} + q2 = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + opt = [a for a in q2["actions"] if a["type"] == "optout_web_form"] + assert [a["broker_id"] for a in opt] == ["parent", "solo"] # kid covered by parent + assert q2["phase"] == "delete" + + +def test_next_actions_fanout_above_threshold(): + with temp_env(): + d = _consenting() + bl = [_mini_broker(f"b{i:02d}") for i in range(12)] + q = autopilot.next_actions(d, bl, _auto_cfg(), {}, env={}) + assert any(a["type"] == "fanout_scan" for a in q["actions"]) + + +def test_next_actions_routes_human_only_to_digest(): + with temp_env(): + d = _consenting() + t3 = _mini_broker("faxer", requires={"fax": True}) + cb = _mini_broker("callbacker", requires={"phone_callback": True}) + led = {"faxer": {"state": "found"}, "callbacker": {"state": "found"}} + q = autopilot.next_actions(d, [t3, cb], _auto_cfg(), led, env={}) + assert not any(a["type"].startswith("optout") for a in q["actions"]) + reasons = " ".join(t["reason"] for t in q["human_digest"]) + assert "human-only" in reasons and "phone-callback" in reasons + + +def test_next_actions_email_send_vs_draft_digest(): + with temp_env(): + d = _consenting() + b = _mini_broker("mailer") + b["optout"]["method"] = "email" + b["optout"]["email"] = "privacy@mailer.example" + led = {"mailer": {"state": "found"}} + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + q = autopilot.next_actions(d, [b], _auto_cfg(email_mode="programmatic"), led, env=env) + assert any(a["type"] == "optout_email_send" for a in q["actions"]) + # draft mode: same case becomes a digest entry with the render command as agent prep + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert not any(a["type"] == "optout_email_send" for a in q2["actions"]) + assert any("render-email" in " ".join(t["agent_prep"]) for t in q2["human_digest"]) + + +def test_next_actions_poll_verification_and_due_rechecks(): + with temp_env(): + d = _consenting() + b = _mini_broker("verifier", requires={"email_verification": True}) + led = { + "verifier": {"broker_id": "verifier", "state": "submitted"}, + "done1": {"broker_id": "done1", "state": "confirmed_removed", + "next_recheck_at": "2000-01-01T00:00:00Z"}, + } + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + q = autopilot.next_actions(d, [b, _mini_broker("done1")], + _auto_cfg(email_mode="programmatic"), led, env=env) + types = [a["type"] for a in q["actions"]] + assert "poll_verification" in types and "verify_removal" in types + # without IMAP, the verification click becomes a human digest entry instead + q2 = autopilot.next_actions(d, [b], _auto_cfg(), + {"verifier": {"broker_id": "verifier", "state": "submitted"}}, env={}) + assert not any(a["type"] == "poll_verification" for a in q2["actions"]) + assert any("verification email" in t["reason"] for t in q2["human_digest"]) + + +def test_next_actions_blocked_stealth_or_operator_browser(): + with temp_env(): + d = _consenting() + b = _mini_broker("gated") + led = {"gated": {"state": "blocked"}} + q = autopilot.next_actions(d, [b], _auto_cfg(), led, env={"BROWSERBASE_API_KEY": "bb"}) + assert any(a["type"] == "stealth_rescan" for a in q["actions"]) + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert any("anti-bot" in t["reason"] for t in q2["human_digest"]) + + +def test_assisted_mode_flags_confirm_first(): + with temp_env(): + d = _consenting() + b = _mini_broker("solo") + led = {"solo": {"state": "found"}} + q = autopilot.next_actions(d, [b], _auto_cfg(autonomy="assisted"), led, env={}) + opt = [a for a in q["actions"] if a["type"] == "optout_web_form"] + assert opt and all(a["confirm_first"] for a in opt) + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert all(not a["confirm_first"] for a in q2["actions"] if a["type"] == "optout_web_form") + + +def test_next_actions_refresh_then_done_flags(): + with temp_env(): + d = _consenting() + bl = [_mini_broker("solo")] + led = {"solo": {"state": "not_found"}} + q = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert any(a["type"] == "refresh_brokers" for a in q["actions"]) # no cache yet + assert q["done_for_now"] is False + storage.write_json(paths.brokers_cache_path(), []) # fresh cache + q2 = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert q2["actions"] == [] + assert q2["done_for_now"] and q2["fully_done"] + + +def test_parked_and_reappeared_states_group_correctly(): + # Regression: human_task_queued / action_selected / reappeared used to fall into "unscanned", + # so the autonomous loop would try to re-scan parked or already-actioned cases forever. + with temp_env(): + d = _consenting() + bl = [_mini_broker("parked"), _mini_broker("chosen"), _mini_broker("back")] + led = {"parked": {"state": "human_task_queued"}, + "chosen": {"state": "action_selected"}, + "back": {"state": "reappeared"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, led) + assert bp["counts"]["unscanned"] == 0 + assert bp["phase"] == "delete" + assert [r["broker_id"] for r in bp["groups"]["human"]] == ["parked"] + assert {r["broker_id"] for r in bp["groups"]["found"]} == {"chosen", "back"} + q = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert not any(a["type"] in ("scan_inline", "fanout_scan") for a in q["actions"]) + assert {a["broker_id"] for a in q["actions"] if a["type"] == "optout_web_form"} == {"chosen", "back"} + + +# --- cluster parents: verified deletion lanes + data-driven playbooks ------------------------ + +def test_cluster_parents_have_playbook_and_deletion_lane(): + """Contract: every curated cluster parent must know EXACTLY how to remove the data. + + A parent record (owns children) must carry a non-empty field-verified optout.playbook + and a structured deletion lane -- deletion beats suppression, and the knowledge lives + in the record, not in code. + """ + for b in brokers._load_curated(): + if not b.get("owns"): + continue + opt = b.get("optout") or {} + bid = b["id"] + assert opt.get("playbook"), f"{bid}: cluster parent missing optout.playbook" + d = opt.get("deletion") or {} + assert d.get("email") or d.get("via"), f"{bid}: cluster parent missing deletion lane" + # every declared email must be a legal send-email recipient + for addr in [opt.get("email"), d.get("email")]: + if addr: + assert addr in emailer.broker_addresses(b), f"{bid}: {addr} not sendable" + + +def test_curated_intelius_playbook_prefers_deletion(): + b = brokers.get("intelius") + steps = " ".join(b["optout"]["playbook"]) + assert "SUPPRESSION != DELETION" in steps # the trap, encoded in the data + assert "DELETE MY USER DATA" in steps # the actual deletion control + assert "privacy@peopleconnect.us" in steps # the email fallback lane + assert b["optout"]["deletion"]["via"] == "in_flow" + + +def test_curated_whitepages_email_lane_is_autonomous(): + """The verified Whitepages pattern: privacyrequest@ bypasses the phone-callback tool.""" + b = brokers.get("whitepages") + opt = b["optout"] + assert opt["method"] == "email" + assert opt["email"] == "privacyrequest@whitepages.com" + assert opt["requires"]["phone_callback"] is False # the callback is only the ALT tool + # programmatic email -> fully automated (T1); draft mode -> needs a human for the verify loop + assert tiers.select_tier(b, email_mode="programmatic") == "T1" + assert tiers.select_tier(b, email_mode="draft_only") == "T2" + + +def test_request_kind_is_residency_honest(): + ca = {"residency_jurisdiction": "US-CA"} + tx = {"residency_jurisdiction": "US-TX"} + de = {"residency_jurisdiction": "EU-DE"} + assert autopilot.request_kind(ca) == "ccpa" + assert autopilot.request_kind(tx) == "generic" # never claim CCPA for a non-CA resident + assert autopilot.request_kind(de) == "gdpr" + assert autopilot.request_kind({}) == "generic" + # broker restriction can force DOWN to generic but never upgrade + assert autopilot.request_kind(tx, allowed=["ccpa", "generic"]) == "generic" + assert autopilot.request_kind(ca, allowed=["generic"]) == "generic" + assert autopilot.request_kind(ca, allowed=["ccpa", "generic"]) == "ccpa" + + +def test_email_lane_routing_and_rescue(): + with temp_env(): + d = _consenting() + d["residency_jurisdiction"] = "US-CA" + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + + # (a) primary email method -> email send action with residency-correct kind + mailer = _mini_broker("mailer") + mailer["optout"]["method"] = "email" + mailer["optout"]["email"] = "privacy@mailer.example" + # (b) RESCUE: T3 (gov_id) form but a deletion email exists (no via preference) -> + # email lane instead of the human digest + hard = _mini_broker("hardsite", requires={"gov_id": True}) + hard["optout"]["deletion"] = {"email": "privacy@hardsite.example", + "kinds": ["ccpa", "generic"]} + # (c) phone-callback form with deletion email -> email lane too + cb = _mini_broker("callback2", requires={"phone_callback": True}) + cb["optout"]["deletion"] = {"email": "privacy@callback2.example"} + led = {b: {"state": "found"} for b in ("mailer", "hardsite", "callback2")} + q = autopilot.next_actions(d, [mailer, hard, cb], + _auto_cfg(email_mode="programmatic"), led, env=env) + sends = {a["broker_id"]: a for a in q["actions"] if a["type"] == "optout_email_send"} + assert set(sends) == {"mailer", "hardsite", "callback2"} + assert sends["mailer"]["kind"] == "ccpa" # CA resident + assert sends["hardsite"]["to"] == "privacy@hardsite.example" + assert "rescue" in sends["hardsite"]["why"] + assert not q["human_digest"] # nothing left for a human + + # without SMTP the same brokers fall back honestly: email draft digest / human digest + q2 = autopilot.next_actions(d, [mailer, hard, cb], _auto_cfg(), led, env={}) + assert not any(a["type"] == "optout_email_send" for a in q2["actions"]) + assert len(q2["human_digest"]) == 3 + + +def test_send_email_accepts_deletion_lane_recipient(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "hardsite", + "optout": {"deletion": {"email": "privacy@hardsite.example"}}} + _FakeSMTP.sent = [] + out = emailer.send(broker, "Subject: Delete my data\n\nBody", env=env, _smtp_factory=_FakeSMTP) + assert out["to"] == "privacy@hardsite.example" + + +# --- human-task digest ------------------------------------------------------------------------ + +def test_human_tasks_digest_markdown(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "mylife", "found", found=True) + ledger.transition(sid, "mylife", "human_task_queued", + human_task_reason="gov ID demanded") + ledger.transition(sid, "fastpeoplesearch", "blocked") + md = report.human_tasks_markdown(sid) + assert "gov ID demanded" in md + assert "Withhold" in md + assert "fastpeoplesearch" in md.lower() + # empty ledger -> explicitly says nothing is needed + assert "Nothing needs a human" in report.human_tasks_markdown("sub_other") + + +# --- CA data broker registry (coverage breadth: DROP + email lane) --------------------------- + +def _registry_csv(): + """Mimic the CA registry CSV: junk row 0, label row 1 (with the real NBSP), data rows.""" + import csv as _csv + import io as _io + buf = _io.StringIO() + w = _csv.writer(buf) + w.writerow(["", "junk header the site hides", "", "", "", ""]) + w.writerow(["Data broker\xa0name:", "Doing Business As (DBA), if applicable:", + "Data broker primary website:", "Data broker primary contact email address:", + "Data broker's primary website that contains details on how consumers can exercise " + "their CA Consumer Privacy Act rights, including how to delete their personal information:", + "The data broker or any of its subsidiaries is regulated by the federal Fair Credit " + "Reporting Act (FCRA):"]) + w.writerow(["Acme Data LLC", "AcmeDBA", "https://acme.example", + "privacy@acme.example", "https://acme.example/ccpa", "No"]) + w.writerow(["Credit Bureau Co", "", "https://cbc.example", + "privacy@cbc.example", "https://cbc.example/rights", "Yes"]) + return buf.getvalue() + + +def test_registry_parses_ca_csv(): + recs = registry.parse(_registry_csv()) + assert len(recs) == 2 + assert len({r["id"] for r in recs}) == 2 # unique ids + acme = next(r for r in recs if "acme" in r["id"]) + cbc = next(r for r in recs if "cbc" in r["id"] or "credit" in r["id"]) + assert acme["optout"]["method"] == "email" + assert acme["optout"]["email"] == "privacy@acme.example" + assert acme["optout"]["deletion"]["via"] == "drop" # worked via DROP, not scanning + assert acme["confidence"] == "registry" + assert acme["category"] == "data_broker" + assert acme["optout"]["fcra"] is False and cbc["optout"]["fcra"] is True + + +def test_registry_refresh_isolated_from_people_search(): + with temp_env(): + res = registry.refresh(paths.registry_cache_path(), csv_text=_registry_csv()) + assert res["parsed"] == 2 and res["fcra_regulated"] == 1 + reg_ids = {r["id"] for r in brokers.load_registry_cache()} + assert len(reg_ids) == 2 + # CRITICAL: registry brokers must NOT leak into the people-search scan pipeline + assert reg_ids.isdisjoint({b["id"] for b in brokers.load_all()}) + + +def test_registry_multi_source_framework(): + # generic parser works for a non-CA state (proving multi-source, not CA-hardcoded) + vt = registry.parse(_registry_csv(), jurisdiction="US-VT", has_drop=False) + assert vt[0]["jurisdictions"] == ["US-VT"] + assert vt[0]["source"] == "VT-registry" + assert vt[0]["optout"]["deletion"]["via"] == "email" # no DROP outside CA + assert "no one-shot" in vt[0]["optout"]["deletion"]["notes"].lower() + # VT/OR/TX are surfaced as portals with official URLs (not fabricated rows) + ports = {p["jurisdiction"]: p for p in registry.portals()} + assert set(ports) == {"US-VT", "US-OR", "US-TX"} + assert all(p["url"].startswith("http") for p in ports.values()) + + +def test_registry_refresh_all_ingests_csv_and_lists_portals(): + with temp_env(): + res = registry.refresh_all(paths.registry_cache_path(), fetched={"ca": _registry_csv()}) + assert res["total"] == 2 + assert res["sources"]["ca"]["parsed"] == 2 and res["sources"]["ca"]["added_after_dedupe"] == 2 + assert res["sources"]["vt"]["format"] == "portal" # no bulk export, surfaced as portal + assert len(res["portals"]) == 3 + assert len(brokers.load_registry_cache()) == 2 + + +def test_next_surfaces_drop_for_ca_resident_only(): + with temp_env(): + registry.refresh(paths.registry_cache_path(), csv_text=_registry_csv()) + bl = [_mini_broker("solo")] + + ca = _consenting() + ca["residency_jurisdiction"] = "US-CA" + q = autopilot.next_actions(ca, bl, _auto_cfg(), {}, env={}) + assert any(a["type"] == "drop_submit" for a in q["actions"]) + assert q["coverage"]["registered_data_brokers"] == 2 + assert q["coverage"]["worked_via"] == "CA DROP one-shot" + + tx = _consenting() + tx["residency_jurisdiction"] = "US-TX" + q2 = autopilot.next_actions(tx, bl, _auto_cfg(), {}, env={}) + assert not any(a["type"] == "drop_submit" for a in q2["actions"]) + assert q2["coverage"]["worked_via"] == "targeted CCPA/GDPR email" + + ca["preferences"]["drop_filed_at"] = "2026-01-01T00:00:00Z" + q3 = autopilot.next_actions(ca, bl, _auto_cfg(), {}, env={}) + assert not any(a["type"] == "drop_submit" for a in q3["actions"]) + + +# --- hardening: locking / rate-limit / retry / idempotency / freshness / metrics ------------ + +def test_storage_lock_mutual_exclusion_and_stale_break(): + with temp_env() as data: + target = data / "x.json" + with storage.locked(target): # hold the lock + try: + with storage.locked(target, timeout=0.2): # second acquire must time out + raise AssertionError("second acquire should have timed out") + except TimeoutError: + pass + with storage.locked(target, timeout=0.2): # released -> acquires fine + pass + # a stale lock (old mtime) from a crashed writer gets broken + lock = target.with_name(target.name + ".lock") + lock.write_text("999999") + old = _time.time() - 120 + os.utime(lock, (old, old)) + with storage.locked(target, timeout=0.2, stale=30): + pass + + +def test_email_rate_limit_paces_sends(): + with temp_env() as data: + state = data / "rate.json" + slept, now = [], [1000.0] + emailer._respect_rate_limit(20, lambda s: slept.append(s), lambda: now[0], state) + assert slept == [] # first send: nothing to wait for + now[0] = 1005.0 # only 5s later + emailer._respect_rate_limit(20, lambda s: slept.append(s), lambda: now[0], state) + assert slept and abs(slept[0] - 15) < 0.01 # waited the remaining 15s of the 20s window + + +class _FlakySMTP: + attempts = 0 + + def __init__(self, host, port, timeout=None): + pass + + def __enter__(self): + _FlakySMTP.attempts += 1 + if _FlakySMTP.attempts < 3: + raise _smtplib.SMTPServerDisconnected("transient") + return self + + def __exit__(self, *a): + return False + + def ehlo(self): + pass + + def starttls(self): + pass + + def login(self, u, p): + pass + + def send_message(self, m): + _FlakySMTP.sent = m + + +class _AuthFailSMTP(_FlakySMTP): + def __enter__(self): + return self + + def login(self, u, p): + raise _smtplib.SMTPAuthenticationError(535, b"bad creds") + + +def test_email_send_retries_transient_then_succeeds(): + _FlakySMTP.attempts = 0 + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + out = emailer.send(broker, "Subject: s\n\nb", env=env, _smtp_factory=_FlakySMTP, + _sleep=lambda *_: None) + assert out["attempts"] == 3 and "delivery_note" in out + + +def test_email_send_does_not_retry_permanent_error(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + try: + emailer.send(broker, "Subject: s\n\nb", env=env, _smtp_factory=_AuthFailSMTP, + _sleep=lambda *_: None) + except _smtplib.SMTPAuthenticationError: + pass + else: + raise AssertionError("auth failure must raise immediately, not retry") + + +def _run(argv) -> dict: + buf = _io.StringIO() + with _ctx.redirect_stdout(buf): + pdd.main(argv) + return _json.loads(buf.getvalue()) + + +def test_send_email_is_idempotent_browser_mode(): + with temp_env(): + config.save_config({"email_mode": "browser"}) + sid = _run(["intake", "--full-name", "Jane Q. Public", + "--email", "jane@example.com", "--consent"])["subject_id"] + _run(["record", sid, "radaris", "found", "--found", "true"]) + first = _run(["send-email", sid, "radaris", "--listing", "https://radaris.com/p/x"]) + assert first.get("state") == "submitted" and first.get("send_via") == "browser" + again = _run(["send-email", sid, "radaris", "--listing", "https://radaris.com/p/x"]) + assert again.get("skipped") is True # not re-sent + + +def test_registry_candidate_urls_newest_first_with_floor(): + urls = registry.ca_candidate_urls(__import__("datetime").date(2027, 3, 1)) + assert urls[0].endswith("registry2027.csv") and urls[-1].endswith("registry2025.csv") + assert registry.ca_candidate_urls(__import__("datetime").date(2024, 1, 1))[0].endswith("registry2025.csv") + + +def test_registry_and_badbool_warn_on_too_few(): + with temp_env(): + res = registry.refresh_all(paths.registry_cache_path(), fetched={"ca": _registry_csv()}) + assert "warning" in res["sources"]["ca"] # 2 parsed < MIN_EXPECTED_CA + md = "## People Search Sites\n### One\n[opt out](https://one.example/optout)\n" + bres = badbool.refresh(paths.brokers_cache_path(), markdown=md) + assert bres["parsed"] == 1 and "warning" in bres + + +def test_report_metrics_removal_rate_and_overdue(): + with temp_env(): + sid = "sub_test01" + for st in ("found", "submitted", "awaiting_processing", "confirmed_removed"): + ledger.transition(sid, "a", st, **({"found": True} if st == "found" else {})) + ledger.transition(sid, "b", "found", found=True) # open + for st in ("found", "submitted", "awaiting_processing"): + ledger.transition(sid, "c", st, **({"found": True} if st == "found" else {})) + led = ledger.load(sid) + led["c"]["next_recheck_at"] = "2000-01-01T00:00:00Z" # force overdue + ledger.save(sid, led) + m = report.metrics(sid) + assert m["confirmed_removed"] == 1 + assert m["open_needs_action"] >= 1 and m["in_flight_claimed"] >= 1 + assert m["overdue_rechecks"] >= 1 and 0 < m["removal_rate"] <= 1 + + +if __name__ == "__main__": + failures = [] + tests = [(n, f) for n, f in sorted(globals().items()) if n.startswith("test_") and callable(f)] + for name, fn in tests: + try: + fn() + print(f"PASS {name}") + except Exception as exc: # noqa: BLE001 + failures.append((name, exc)) + print(f"FAIL {name}: {exc!r}") + print(f"\n{len(tests) - len(failures)}/{len(tests)} passed") + sys.exit(1 if failures else 0)