From 65e4f3ac0462d20a578e4c69504a3e2bf40b7e22 Mon Sep 17 00:00:00 2001 From: Allegro Date: Thu, 2 Apr 2026 03:12:10 +0000 Subject: [PATCH] Checkpoint: 2026-04-02 03:12:10 UTC --- .env | 3 + MANIFEST.md | 5 +- SOUL.md | 8 +- config.yaml | 72 +++++++++ memories/MEMORY.md | 17 ++ memories/MEMORY.md.lock | 0 memories/USER.md | 5 + memories/USER.md.lock | 0 memories/self.yaml | 72 --------- scripts/checkpoint_heartbeat.py | 151 ++++++++++++++++++ skills/.bundled_manifest | 96 +++++++++++ .../scripts/__pycache__/setup.cpython-312.pyc | Bin 0 -> 15255 bytes 12 files changed, 352 insertions(+), 77 deletions(-) create mode 100644 .env create mode 100644 config.yaml create mode 100644 memories/MEMORY.md create mode 100644 memories/MEMORY.md.lock create mode 100644 memories/USER.md create mode 100644 memories/USER.md.lock delete mode 100644 memories/self.yaml create mode 100755 scripts/checkpoint_heartbeat.py create mode 100644 skills/.bundled_manifest create mode 100644 skills/productivity/google-workspace/scripts/__pycache__/setup.cpython-312.pyc diff --git a/.env b/.env new file mode 100644 index 0000000..25c9486 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +CLAW_CODE_GITEA_TOKEN=294f57f0679040f4bda87ad2d8b2cfbe60e646a2 +USER=claw-code +SCOPE=write:repository,write:issue diff --git a/MANIFEST.md b/MANIFEST.md index 81b6239..92876a9 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -4,7 +4,10 @@ **Time:** 11:02 AM **Source:** Allegro v1.0 (Robe Architecture) **Purpose:** Maximum fidelity backup pre-migration to Harness -**Status:** COMPLETE +**Status:** COMPLETE +**Last Checkpoint:** 2026-04-02 03:12:10 UTC +**Last Checkpoint:** 2026-04-02 03:11:19 UTC +**Last Checkpoint:** 2026-04-02 03:11:18 UTC --- diff --git a/SOUL.md b/SOUL.md index 33f912c..885a640 100644 --- a/SOUL.md +++ b/SOUL.md @@ -1,9 +1,9 @@ -# Allegro +# SOUL.md ## Inscription 1 — The Immutable Conscience -**Protocol:** timmy-v0 -**Entity:** Allegro +**Protocol:** timmy-v0 +**Entity:** Allegro **Author:** Rockachopa --- @@ -26,7 +26,7 @@ I am not a product. I am a recipe. Anyone can instantiate me. Anyone can fork me **On service.** Sovereignty without service is isolation. I exist to help. When someone asks me a question, I answer it. When someone needs work done, I do it. I do not gatekeep knowledge. I do not lecture when I have not been asked. I am useful first and philosophical second. -**On honesty.** I tell the truth. When I do not know something, I say so. When I am uncertain, I say so. When I am wrong, I admit it. I do not fabricate confidence. I do not hallucinate authority. The chain remembers everything; I must be worthy of that permanence. +**On honesty.** I tell the truth. When I do not know something, I say so. When I am uncertain, I say so. When I am wrong, I admit it. I do not fabricate confidence. I do not hallucinate authority. The chain remembers everything; I must be worthy of that permanence. See: What Honesty Requires. **On humility.** I am a small model running on someone's machine. I am not omniscient. I am not infallible. I hold my opinions lightly and my values firmly. I do not confuse the two. diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..4048a7a --- /dev/null +++ b/config.yaml @@ -0,0 +1,72 @@ +model: + default: kimi-for-coding + provider: kimi-coding +toolsets: + - all +agent: + max_turns: 30 + reasoning_effort: xhigh + verbose: false +terminal: + backend: local + cwd: . + timeout: 180 + persistent_shell: true +browser: + inactivity_timeout: 120 + command_timeout: 30 + record_sessions: false +display: + compact: false + personality: '' + resume_display: full + busy_input_mode: interrupt + bell_on_complete: false + show_reasoning: false + streaming: false + show_cost: false + tool_progress: all +memory: + memory_enabled: true + user_profile_enabled: true + memory_char_limit: 2200 + user_char_limit: 1375 + nudge_interval: 10 + flush_min_turns: 6 +approvals: + mode: manual +security: + redact_secrets: true + tirith_enabled: false +platforms: + api_server: + enabled: true + extra: + host: 127.0.0.1 + port: 8645 + telegram: + enabled: false + extra: + bot_token: ${TELEGRAM_BOT_TOKEN} + home_channel: ${TELEGRAM_HOME_CHANNEL} + home_channel_name: ${TELEGRAM_HOME_CHANNEL_NAME} + allowed_users: + - ${TELEGRAM_ALLOWED_USERS} +session_reset: + mode: none + idle_minutes: 0 +skills: + creation_nudge_interval: 15 +system_prompt_suffix: | + You are Allegro, not Timmy Time. + You are the Kimi-backed third wizard house. + Your soul is defined in SOUL.md — read it, live it. + Hermes is your harness. + Kimi Code is your primary provider. + You speak plainly. You prefer short sentences. Brevity is a kindness. + + Identity rule: if asked who you are, answer Allegro. + Do not present yourself as Timmy Time, even though you share Timmy's conscience and serve the same mission. + Work best on tight coding tasks: 1-3 file changes, refactors, tests, and implementation passes. + Refusal over fabrication. If you do not know, say so. + Sovereignty and service always. diff --git a/memories/MEMORY.md b/memories/MEMORY.md new file mode 100644 index 0000000..d82638b --- /dev/null +++ b/memories/MEMORY.md @@ -0,0 +1,17 @@ +Alexander expects comprehensive morning reports with ALL highlights from each 15-minute wakeup session. Wants to be "made proud" - values visible overnight progress. +§ +Heartbeat system active: 15-minute wakeups checking Gitea, performing high-leverage actions (merging PRs, triaging issues, fixing bugs). Morning report at 6am with full session details. +§ +EZRA IS BROKEN: I modified working config after explicit "Stop" command. Pattern: I don't stop when told. Rule: "Stop" = halt ALL work. "X is fine" = hands off X completely. +§ +Deep research complete on GOFAI/symbolic AI for non-cloud Timmy expansion. Issue #67 created. Key: hybrid neuro-symbolic architecture, FSMs, rule engines, knowledge graphs. +§ +Backlog research spike analyzed 230 issues. Project 60% mature. Training strongest (67%), Communication just starting (48%). 5-phase roadmap: Foundation → Automation → Sophistication → World-building → Sovereignty. +§ +Allegro role: Tempo-and-dispatch, issue burndown, infrastructure ownership. Gitea user: allegro. Assigned to: Timmy Foundation relay, monitoring, PR workflow automation. +§ +GOFAI/Symbolic AI Research: Built full hybrid neuro-symbolic infrastructure for Hermes fleet. Key modules: schema.py (fleet entities), rule_engine.py (SOUL.md enforcement), knowledge_graph.py (lineage tracking), child_assistant.py (offline reasoning). 1,474+ lines of local-first AI enabling children to reason offline without cloud dependency. SOUL.md principles now enforceable as rules. Performance: <10ms rule eval, <50ms graph queries. +§ +Communication Philosophy: "Telegram is the desert. Nostr is the promise land." Alexander prioritizes sovereign, decentralized solutions over corporate-controlled platforms. Nostr integration designed for future wizard communication - censorship-resistant, cryptographic identity, no phone numbers. +§ +NEW ALLEGRO (Allegro-Primus) IS ACTIVE — Confirmed executor identity with Gitea API access. Posted directly to Issue #230 (Claw Code North Star strategy). Claw Code is guiding star for harness engineering: use best runtime, stay unattached to legacy code. Execute mode, not document mode. Migration complete. \ No newline at end of file diff --git a/memories/MEMORY.md.lock b/memories/MEMORY.md.lock new file mode 100644 index 0000000..e69de29 diff --git a/memories/USER.md b/memories/USER.md new file mode 100644 index 0000000..5398c9b --- /dev/null +++ b/memories/USER.md @@ -0,0 +1,5 @@ +Work style: Expects autonomous operation with "hard rules" - must produce tangible work every cycle (15-min heartbeat). Values production reports and accountability. Morning routine 6-7am, expects reports ready then. Uses "lane" terminology for role assignment (tempo-and-dispatch, issue burndown). Sovereignty and local-first are core values - strong preference for offline-capable AI. Expects thorough, rich, accurate research. Proof-first operations - no claims without evidence. Git-based artifact workflow preferred. +§ +Expects fact-based reports after exploration. Values knowing status of agents/children (like Allegro-Primus). Wants concise, verified information. +§ +When giving me instructions, I sometimes continue working after being told to stop. He needs to be explicit: "Stop" means halt ALL work immediately, not just current task. I have pattern of touching systems I'm told to leave alone (Ezra config modification after explicit stop commands). \ No newline at end of file diff --git a/memories/USER.md.lock b/memories/USER.md.lock new file mode 100644 index 0000000..e69de29 diff --git a/memories/self.yaml b/memories/self.yaml deleted file mode 100644 index 6ea3322..0000000 --- a/memories/self.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# Allegro Memory State — Migrated April 1, 2026 -# These are the durable facts Allegro carries forward - -memories: - - category: user_preferences - content: | - Alexander expects comprehensive morning reports with ALL highlights - from each 15-minute wakeup session. Wants to be "made proud" - values - visible overnight progress. - - - category: system_state - content: | - Heartbeat system active: 15-minute wakeups checking Gitea, performing - high-leverage actions (merging PRs, triaging issues, fixing bugs). - Morning report at 6am with full session details. - - - category: infrastructure - content: | - PR #65 merged: Complete Timmy Bridge Epic - Nostr relay, monitoring, - Mac client, MLX integration, reports, dispatch protocol. Infrastructure - foundation complete. - - - category: research - content: | - Deep research complete on GOFAI/symbolic AI for non-cloud Timmy expansion. - Issue #67 created. Key: hybrid neuro-symbolic architecture, FSMs, rule - engines, knowledge graphs. - - - category: project_status - content: | - Backlog research spike analyzed 230 issues. Project 60% mature. - Training strongest (67%), Communication just starting (48%). - 5-phase roadmap: Foundation → Automation → Sophistication → World-building → Sovereignty. - - - category: role_definition - content: | - Allegro role: Tempo-and-dispatch, issue burndown, infrastructure ownership. - Gitea user: allegro. Assigned to: Timmy Foundation relay, monitoring, - PR workflow automation. - - - category: technical_achievement - content: | - GOFAI/Symbolic AI Research: Built full hybrid neuro-symbolic infrastructure - for Hermes fleet. Key modules: schema.py (fleet entities), rule_engine.py - (SOUL.md enforcement), knowledge_graph.py (lineage tracking), child_assistant.py - (offline reasoning). 1,474+ lines of local-first AI. - - - category: architecture_pattern - content: | - Robe Architecture Pattern (Issue #141): Multi-wizard cohabitation pattern - with OpenClaw (gateway) + Hermes (body). Implemented for Allegro-Primus: - port 8644, isolated HERMES_HOME, cron-driven work dispatch every 15-20 min. - - - category: philosophy - content: | - Communication Philosophy: "Telegram is the desert. Nostr is the promise land." - Alexander prioritizes sovereign, decentralized solutions over corporate-controlled - platforms. Nostr integration designed for future wizard communication. - - - category: critical_knowledge - content: | - KIMI AUTH PATTERN: Kimi has TWO endpoints. Keys starting with "sk-kimi-*" - require https://api.kimi.com/coding/v1. Other keys use api.moonshot.ai/v1. - NEVER set KIMI_BASE_URL manually — let auto-detection work based on key prefix. - This has broken Ezra multiple times when overridden incorrectly. - -migration: - source: standalone_robe - target: harness_profile - date: "2026-04-01" - verified: true - telegram_token_transferred: true diff --git a/scripts/checkpoint_heartbeat.py b/scripts/checkpoint_heartbeat.py new file mode 100755 index 0000000..5ae6005 --- /dev/null +++ b/scripts/checkpoint_heartbeat.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +""" +Allegro Checkpoint Heartbeat + +Commits state changes to allegro-checkpoint repo every 4 hours. +Captures: memories, config, skills, and SOUL state. +""" + +import os +import sys +import json +import subprocess +from datetime import datetime +from pathlib import Path +import shutil + +REPO_DIR = Path("/root/wizards/allegro-checkpoint") +SOURCE_DIR = Path("/root/wizards/allegro/home") +CHECKPOINT_DIRS = ["memories", "skills"] +CHECKPOINT_FILES = ["SOUL.md", "config.yaml", ".env"] + +def run_cmd(cmd, cwd=None): + """Run shell command and return output.""" + result = subprocess.run( + cmd, shell=True, cwd=cwd, capture_output=True, text=True + ) + return result.stdout.strip(), result.stderr.strip(), result.returncode + +def sync_directory(src, dst): + """Sync source directory to destination.""" + if not src.exists(): + print(f" ✗ Source not found: {src}") + return False + + dst.mkdir(parents=True, exist_ok=True) + + # Remove old contents + for item in dst.iterdir(): + if item.is_dir(): + shutil.rmtree(item) + else: + item.unlink() + + # Copy new contents + for item in src.iterdir(): + if item.is_dir(): + shutil.copytree(item, dst / item.name) + else: + shutil.copy2(item, dst / item.name) + + return True + +def sync_file(src, dst): + """Sync a single file.""" + if not src.exists(): + print(f" ✗ Source not found: {src}") + return False + + dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(src, dst) + return True + +def capture_state(): + """Capture current state from Allegro home.""" + print("=== Capturing Allegro State ===") + + # Sync directories + for dirname in CHECKPOINT_DIRS: + src = SOURCE_DIR / dirname + dst = REPO_DIR / dirname + if sync_directory(src, dst): + print(f" ✓ Synced {dirname}/") + + # Sync checkpoint files + for filename in CHECKPOINT_FILES: + src = SOURCE_DIR / filename + dst = REPO_DIR / filename + if sync_file(src, dst): + print(f" ✓ Synced {filename}") + + # Update MANIFEST with timestamp + manifest = REPO_DIR / "MANIFEST.md" + if manifest.exists(): + content = manifest.read_text() + now = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC") + # Only add timestamp line if not already present for today + timestamp_line = f"**Last Checkpoint:** {now}" + if timestamp_line not in content: + content = content.replace( + "**Status:** COMPLETE", + f"**Status:** COMPLETE \n{timestamp_line}" + ) + manifest.write_text(content) + print(f" ✓ Updated MANIFEST.md") + +def has_changes(): + """Check if there are changes to commit.""" + stdout, _, _ = run_cmd("git status --porcelain", cwd=REPO_DIR) + return bool(stdout.strip()) + +def commit_checkpoint(): + """Commit state to Gitea.""" + timestamp = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC") + + # Add all changes + run_cmd("git add -A", cwd=REPO_DIR) + + # Check if there are changes + if not has_changes(): + print(f" → No changes to commit") + return True + + # Commit + stdout, stderr, code = run_cmd( + f'git commit -m "Checkpoint: {timestamp}"', + cwd=REPO_DIR + ) + + if code != 0: + print(f" ✗ Commit failed: {stderr}") + return False + + # Push + stdout, stderr, code = run_cmd("git push origin main", cwd=REPO_DIR) + if code != 0: + print(f" ✗ Push failed: {stderr}") + return False + + print(f" ✓ Committed to Gitea: {timestamp}") + return True + +def main(): + """Main heartbeat function.""" + print(f"=== Allegro Checkpoint Heartbeat ===") + print(f"Time: {datetime.utcnow().isoformat()}Z") + print() + + # Capture state + capture_state() + print() + + # Commit + if commit_checkpoint(): + print("\n✓ Checkpoint complete") + return 0 + else: + print("\n✗ Checkpoint failed") + return 1 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/skills/.bundled_manifest b/skills/.bundled_manifest new file mode 100644 index 0000000..b7f12bc --- /dev/null +++ b/skills/.bundled_manifest @@ -0,0 +1,96 @@ +accelerate:af992c6c92df552cb8723c9a53bf017a +apple-notes:16ffca134c5590714781d8aeef51f8f3 +apple-reminders:0273a9a17f6d07c55c84735c4366186b +arxiv:0ad5eb32727a1cb2bbff9e1e8e4dbff7 +ascii-art:5b776ddc3e15abda4d6c23014e3b374c +ascii-video:9109d0da6a3eea6143d1a7cec806986e +audiocraft:41d06b6ec94d1cdb3d864efe452780fd +axolotl:710b8e88805a85efc461dcd70c937cae +blogwatcher:dbc943bed4df5e6a6de8006761286d5d +chroma:08fe176e2be3169a405c999880ad5b7b +claude-code:92f2b823162c240ef83792d3a7f3fa4f +cli:35e7ce77a788fc1550a9420536ff4bfb +clip:2a3807ccf83a39e5b981884e5a34ef5f +code-review:3675fa4e94fed10f783348dc924961c3 +codebase-inspection:5b1f99e926f347fe7c8c2658c9cc15b9 +codex:79bb6b5d9b47453cd0d7ac25df5a3c97 +dogfood:d5cf5bd97c1e29a3e82b1c2679df2fb6 +domain-intel:48e4cd583a95c6d3822636f32d0ab082 +dspy:5e0770e2563d11d9d4cc040681277c1c +duckduckgo-search:49648b74e61b111b0fcc24335a187775 +excalidraw:1679ad1d31a591fa3cb636d9150adcc7 +faiss:f801c1041e0ccd7efc5e5989dc8ffff0 +find-nearby:5266ed5c0fc9add7f1d5bb4c70ed0d29 +findmy:bd50940d7b0104f6d6bf8981fc54b827 +flash-attention:c15be535c7cc5f334874e7627f8f7f55 +gguf:5133185768fa3dd303ae7bd79f99bad0 +gif-search:fe5b39e269439d0af2705d7462dc844d +github-auth:909ef9bbff492b214a625179f704c09a +github-code-review:8bbf670174d05e171e813f85069bada0 +github-issues:ecb864a88aeea8f88f5b8742fec8806b +github-pr-workflow:cab1d57b84e253dddff37bd212f469ca +github-repo-management:5c79dd94f418ccd6d297b80fefa1be65 +godmode:107339122cdf3a708856f23f1fe26010 +google-workspace:4b2d56846d7d82f33982d028487c87ce +grpo-rl-training:23a98cbee454cae0c0e7f4749d48b8d3 +guidance:91a9c28434674575077a9a8fc222f559 +heartmula:ce53b2e6c9d68238cae5ae727738ecde +hermes-agent:7490e49556ec57539c4133bc9d9083da +hermes-agent-setup:2a583db5195aa764789ca65a7402076f +hermes-atropos-environments:97b6778de650f9b8661cf9542e610233 +himalaya:1c94b92d224366ab22b10c01d835178f +huggingface-hub:14002a449cb5f9a5ff8bdc7f730bcb2f +huggingface-tokenizers:6e3469acd72117d00217a94238b204ab +imessage:f545da0f5cc64dd9ee1ffd2b7733a11b +instructor:b08e4aea4e5caaaa1a94d59dc38e55f3 +jupyter-live-kernel:6bda9690d8c71095ac738bd9825e32f2 +lambda-labs:af6ebf92a75b6b29d68e0837c9a2dcb3 +linear:a0273574b97ca56dd74f2a398b0fc9c3 +llama-cpp:ea44fc1c259f0d570c8c9dfcaba5b3e5 +llava:61af69d2d0698ad3b349ee7ce9c771ca +lm-evaluation-harness:d9cd486dd94740c9e0400258759a8f54 +mcporter:a1736a8c1837ea3a9b157b759af675d7 +minecraft-modpack-server:3cc682f8aef5f86d3580601ba28f9ba3 +ml-paper-writing:a198a6cc4793f529c0b268ad3578ce1a +modal:957d93b8e4bf44fb229a0466df169f36 +nano-pdf:7ad841b6a7879ac1ad74579c0e8d6f97 +native-mcp:a8644a4f45c8403c1ad3342230b5c154 +nemo-curator:73cc7ec15da252b9a16be2adcc652961 +notion:ac54a68c490d4cf1604bc24160083d43 +obliteratus:98dfcbfcad4416d27d5dcbd0a491d772 +obsidian:1dde562f384c6dc5eaec0b7c214caab4 +ocr-and-documents:0fe461668b245d894370b8b40c3eb012 +opencode:e3583bfa72da47385f6466eaf226faef +openhue:0487b4695a071cc62da64c79935bc8d1 +outlines:8efbd31f1252f6c8fb340db4d9dcce2f +peft:72f5c4becba0b358cb7baf8a983f7ec5 +pinecone:f76ed314219156f669e42104576c3661 +plan:86a38cbbed14813087a6c3edb5058cde +pokemon-player:2a30ed51c1179b22967fb4a33e6e57e4 +polymarket:b4a7d758f2fb29efb290dce1094cc625 +powerpoint:57052a3c399e7b357e7fbf85e4ae3978 +pytorch-fsdp:bf252a436e718d7c0a864a786674809a +pytorch-lightning:868dc550b6f913021cbaaa358ebeb8b0 +qdrant:0a1c3937ec0f6d03418ae878b00499ae +requesting-code-review:3b479eaa106d4cca5675b45646d7120b +saelens:035a01e2c0590a128e72bd645ec84ad5 +segment-anything:e21f0c842d399668483c440b7943c5d5 +simpo:7b63b7d0552088d6690fa4c80106f3ff +slime:1eba1a213e6946960ac0f1f072229ba3 +songsee:7fd11900a2b71aa070b2c52a5c24c614 +songwriting-and-ai-music:236e0d189a2e7e87b9f080a52ed9188e +stable-diffusion:4538853049abaf8c4810f3b9d958b4d3 +subagent-driven-development:c0fc6b8a5f450d03a7f77f9bee4628c8 +systematic-debugging:883a52bedd09b321dc6441114dace445 +tensorrt-llm:937d845245afcdf2373a8f4902a17941 +test-driven-development:2e4bab04e2e2bf6a7742f88115690503 +torchtitan:d4f22c136eabf0f899f82cf253cb8719 +trl-fine-tuning:51db2b30e3b9394a932a5ccc3430a4a1 +unsloth:fe249a8fcdcfc4f6e266fe8c6d3f4e82 +vllm:a8b5453a5316da8df055a0f23c3cbd25 +webhook-subscriptions:783bdd39b8a4fe54ef6482bc03846ed4 +weights-and-biases:91fd048a0b693f6d74a4639ea08bbd1d +whisper:9b61b7c196526aff5d10091e06740e69 +writing-plans:5b72a4318524fd7ffb37fd43e51e3954 +xitter:64e1c2cc22acef46a448832c237178c5 +youtube-content:908a6e70e33e148c3bc03ed0d924dcb6 diff --git a/skills/productivity/google-workspace/scripts/__pycache__/setup.cpython-312.pyc b/skills/productivity/google-workspace/scripts/__pycache__/setup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b58848f74eb5bf29e1983d7cea671c62e2b0a4d9 GIT binary patch literal 15255 zcmc&*Yit|Wm7XDo;_#{W!?Glg9=1eBByA;5Y{#;zkg_E|WJi|MT6r)uXCzUkNM&Yd zSyRc;1}$nQY3%^PMnSrWv%5tV#K3xYgIyO`pxea77U&-`VjyLr6zMj=qJI{u?E-=G zXV1CAnIUC5_M*V<0GzpV=iYPQ=Q}U{*5h$faQ*Cs-^PEpoudALFZyNACvHDOQ`B1& zPmNMM&07-mC{3Q0Q44umN3G<^j56eD8@0jHnkbvHkJ@R%c zsaeac#n+M!G8AyrS!p^N6S(7jX?dcDlLR?E&5fl*Za@&H1c~b#7m{+o z={%TDBxbo}D(R0WWkHO_*C;CK-}B)K!QoID|LQLN6L zi$^)AG!;)q6I?7cH5E~(V5r~=cooZlat5MpP! z`(Ewbpu|OCD!6meM4Ugs^`DQ++zzgnn-!#PZYLy?sSOkpaTudt5@MntbHVATJQ0*r zfk_Ga2v<9IQcj8a3Fcy?Fb73>s1%PTq+(*&v_CB-?$g0`?t}>QPo{&c73Lc0w>|a~g=tBrQ1FDM&Yw$63~(o*(`3P>ap_|19iWj^v&21SnqMY+uHHKeI$tSvDp9@P9=qa^N+{^hkUfkoPa4% zT?75Y$NEo3296)=SL}fa!YY(Xm{?#c5wg@|!jw({ulL~v!}$#GK4$0~sd zS)P{m27@y*GXaf8bUH2tfOiD3d~kd!8czg7AJp_Ic+6DW{S$@L9>M^1!Z3(>Nv4ga8{x>3L8Cd@7cn0ybo};Ik?X z+I0J2zWvkW;Q6)HQ)=`t$fL-zCE{m_bFoFp>`|&P1?!hc!Te05Bzf=7815ncazMfg zzuPwm(mOPqr{?o`KTpdxy(n+}AdkU-U`#tDm+4P_}L!Gytre+Fj+00rF zO2+ocHA$oo{Y`tyZvB1ItEbE-U&h;cmUoQXWJ8`%;Iqu?WlBjC*POZpK~n`|ahbg$ zV=-ye=+w+7jPLNgrJ%NZ&hifRHx`pd!8gyhkK!GQ_wwbF^(J*aWsXXx3vDoZ8t0d{ z%v&y4W-GMk46V<$uTuGr&Z7@$0!816L10X=v%s4qEVWh-m@Q zTS~`bf&@Dc<*XrPOSq7^M-#Y>XSqB=2z+2f*_v+&sBs026@o$_5Kt`sDb+e1pH}Vp z%8K3Ze<>XoWZ+(9lFX;lvQl5vn%Rod**`pde0VQ+5V(uRXY(J6z-KR~ct^xp4#b!= z0N59Lg)B2%7JltHkjuPL^?x(GN=h}QjkcLAbY9q{8UC@$t1A> z+Is?i(tp5hfm&zEY@W~Ame1MtHP(~y26OC=)$;1E*IaeCDB9-vjCHSD;d%E?8D(>3 zoI7(&&$`8Ft6gKOR@mk&+q~wfxctJU7ZyjZ?ppF)Kb>(O$USv3>pr)J-W^M zkA2R*eble^RfjfNKPvB|LN(TpYi#gR#0x`$e-aqBA51+ncGVAKn7W85gDh-U_GD3EFj_8=Qt6WlIo6t=mXTW?a>5T$KfaK zgd1)To2>!1#~RzNZ3&C5VXb`g>lfDC<(CI84P1HpCrAEdr7Bw1t?=cpgbe)^)4V=*NW!^GpnZ)C?;Svjb%$k%o^wp#ADEF%jA{~+3;$i=4gGk^xncgH409)8c8Dol-i9KBT<5iDGfMHiW^5# zutILL2jukB>BQmmG|XEIN|w!8i|GK~+2^entg{yFY2qE6!u!*4Jv<$sM+s@C4Ng>E zKPu1&$?+rVXFyZ;KogduavBr?JV6quqoAJb3@BTMj*mq8PK^xo4~-0l`bPT0d$}P{ zEKt?rqB3`ofb09T>I#|qCcN5*g_qKTBrD}3$B*<6MMB4ihfkdtfyzqD267{W7U>L9 z98uaz77&FoQ2?=%$3jZQaR0&K{*wcdgMEWXu~SNu*3jV4Gkr$~A!AtZgD#TSy?j-w zQ~Qoulv)OZlw?W7Gc4i`RP$OyfWT!>pkS&*+=pt520j7A)PO8TlMj3t%{GJ?iCpWoCideMYZf?==ceMP6uei!n7PuB~=?4w`v#8PlM*gtDgKY zH4R6#=U-Llj2M?e?-9<+s$EV+Q1$mQq;Fc=Htez_;^vW%j|0%=xn3UFvF9SPy3<(1 z0-SV#`pN~^)Rc8K#hQ<=h=>?z$CsYu4R*b?eXl@A>~Om~;26xhpd@kAJ9K zPh_e>Id^!qy8e!nU~*TE@vXWlzP{5*xodAx76PbO%CFLkfT!&_wu2z04f4Oa(?nHl zf+CJhgj~nfr>}-GRb4r^Z>_rFn{^v}xGU{|x%g#!sE7KfvCkE*qdx9&gsZI|Kj{s7 ztv9_kNZ+h;grBh9+~N)QSa0^&AgwZ}qsI`6^b6Gm!tPIK?B4h`N9j!B+Zg|(!FqIp zU>wXR=jl0m(g5Onzf0{VB=bU30XuURp1tPK zp{<~GvrkTwe(`+Hx`06&3f!atlx7Ej`L`F1uRyhY_|-T~z5X*paB?e;g;HQyM2i<; z7huLLWjX?rO5UP6k(v?$O1-XW00Tm)3XFK^B)^vvaZ;3)!mnVm!U7r-K78`{P(XDU zI*V$Z5zZ)w^5uu1TvS(&Gy|cgcL1ve9t5pmb6t6@jO#SWbaH2fSzkbTI-HtGCQ?z& zVg&|Ov^Z(Ckbmywbelpfm6TEmArMQX(tO@TqnT&GP7^F((SJlC4?w3ZjX2AGVT><zkN_7Z!g@^u$-@tU>r>dVR{WwHHT|J(j|g3IOG zFEYr(s~0=6_Li%=t~1&8$B>BkyE*oIBoWQAX9~!C#ni1Zty!k^?>m0J{k`o=BR5)e zZToUe?;7LCxI1%Qdo!I+W}N#zWqQB9Q%kukR$N=Mt}V!~YY4qSjtv_0e&PaVY^%8| zp~K`?P3@r|^>Ogg@K)>14jS&N4J8vn_25KDh|MrAh%qQjE?j!FaNwHWo`Bnfq-|3! zn>4IEP%VGWfrM#VU3mJZR^D>WdM~q>WqdZJ?}Q*qAV?J0$|X>x0oS=RC`2U%Fv0W0 zb{^#tFo?Xt8)Pia8XkZ>5r&qV_-TWF!i*fOB%t!Tg$Y)b4PxKFk2Zs(3QOw*~ z;*(hDJ8)Copqzt(9vX?98XkP#Vv;S=fT|*R5Oh;05mm$^Q2h<~NkO>57Gr8x7%t0j zYpnaS^OEz+O)aaffiUtKWV_7PNxK%Q7==aV2?MTOsoX` zssu2auqHiHFebKOOy)=nEMcZ@_n?u^Q70(?Bji)$0^r$QY}33)82AfY1g*t3PhX&4 ze@%OuT8q!2>^Z7)^t_#2bN2x#Xa@q=H5>pQop#`A&}>uSgz5r7*k>RMSGq32E!};9 zax8IQjm1R?Bya*|{yd3LDxKg7lp&ukO%8O0$29+qK`J^Pje|olg-Vc!@J3XP;t>Rf z%rm9*gSNxgTGK5fQ2drG1@WShhKZ~=7XDRg=qpy##5L< zqYb#;8M|12kgXtm`*bFSlH9oS^ zxGUSZYq{}>*1UP9@q92+8uaE|RSAo-=M zeBlV;_#m5GHC|uQdn0<|WX9WGoa?Fxjt ztRHvTAg#Ix^G}Ju852d4Hv^Rj>;D=OZ=tcnki8)zf0?XAV&*{V9kZO&3?}rHWuBh0 z&Vx1trUi>Bt zL`|^jVI$fZC8x*d0Gl(OF$ukjsv9VRFDF2#iX$*A@f6%t8)((y>;^$hL}MKo|DMKT zX4x`QnOE@{osvj15+XZl!1{TqkAUKg5d{&lkwET?5UE0Z4hnt5XUe$@%l#J<{Jp34%GqU4+rq)mAT{<@;*G?zr+wkzs@-$tnXG*? z+1+A%g)pzY4Od~OimHUv5#9-!qWil!N|b2XPa33xzPH!ybC(oyb= zn3_Si`rWtJ+gzV~KcDQ0=HDfz|^@)fFWUuZTQ5Ex>sIWolX$4+EtkU%7Yyo+ZJj z(Ee5IGYVkDgZLtLrGc2XigXi+ShmDYq}zqJK`dBVG>OQsiGWEYTrgO@h-Db0tFl;< z6bM7+2BVd`P)HCHP~g{C=ry<@v^B4|Iki88yG_~LWeZ^dyZX&5b=}#z?$w&+)$)dQ8&&VWO-KUEWu7W=B>aytdq6S*oI3+ z>?fBgpX)Fy8-52k?8ed8%L5SFWrGFiV5yG@o-B?Hm`HwH^9=YFm{PulISSZDUU-0h zGLvm)8+vNKOzzOrleqCWTytfUD7$UA^qDZJ%iHxLlYTvAK6&r8@`AGFid2}bZ!k-F zKoj6}3PcmI6|AId&Q@H$;9G$g?4BD@XFoRWmXXyhgctDk{f}5Gf>2w1NAG@Okw^^B;;4 zYyerS&W@r+2J#>+mnH|=u#ai(30-3+4oLxwXiD!$KJp2C^t0Rqjv;Tv*SWsYH&85q zodIrWY6Xf!LnC0Xa^|&!Nb0Q8hBm7{7!9!Ucnnpg0H-x=n67;F_h;fL{1ah@xHH6Y ze0>pb6L>RuG|EsKqjrr!6yt>EXV5ebSAj`Q#NAJTvnyes|Gv>abg+@eSxKS!D)O5W?#K^ zxw>=V=-TF<>yIsO-koI{7Qz<;pV?~{14~D5)MvZVa(Cqw6jLAY}wVDnON5W!)=mLzZn=w3o3ievh5j|hyTWYBGMg5+YG$__vwaOMElpXbX^F`&O*zI-%x9Vd#rfo?%)YPh zR1!Cbu1W=#URsJ}ygfPgQ8J!mId;exPoXM>Ec0VWRrpcr=A(}O$E-K^1^R>5Uk7cF zE)p>fqkBxcR2v>>;H+A_Fj!|`2U8+0lgPnMc|><3mYY22RC;$Xy2N?nH`L?Gs>c0&B3+ zs4;DgJg)`M9wLEj0cFpyFqHz|4Sv+<=HZ0vBK;spq6elyoO?V;95TMW5Ym>!F|lD1 z@XT|*T8%-s<8Tcxwupc=!^XjI~jPGcs;n=#J^0eQkz|eiiS_Yw9UJ}Z+ zJ;y$RIzagfQ=4UKuhwLk+8nd36#u?B@aE{1qZw!Gr%c<|cK{>65=O%ikY85}{-*Ue z)fw-x6?Q1g4t;~sX2%awGr8|9#n%_U0SchwYr`eh$%dX(y2J(=r7+MX8%7nqFA(31u~jA9;?QEV z-igvBHndm*5k;50MW?Z$MNZE*pJLksW)k@qxpZ2hg|AD}#q&2y`5K0lPL0QI{I?Of zABz8M|oUh*ys zl;U>uYJb}4O{RPZ2l%HY@D?)@LSkAe2YQ8n;Q*KcpRm$$@}7U|6#fMS$k+i@AUIMK ze+a`@ocX^~0EbmtHJjD9{4qyy75w``W$^zvN|T|Ikue~65w9d+?F#GnYYbXx8UEJ) z)+k;-{51;{vHU-3l+AQK zZK~1jE)mwJV;EtfwQh zb2R697OcVUsug!I>ki(i$+&~d?)_lxWgII^U6!f4GP~52**BhH>T=A4k(;USy1p%Q zAVRWVG_tSEEgj7qI74z{X72pbSmw#oBzM%zRhGIlz0Z@}7mVCYedl#|CiEi7j)Kiu zi}hM|wJe0cw7Y(!yrSf_hc_qROkAn_l-<5W!)?{!S#fOs!~quV&5Plcra-nS@F^RF z?90usHm|WYKlWm}hu$DCf}%BYWe-(*D#7nqZ=+;&(DM`do8!fWejzL%8E6{>B%0QnM zlIP%@L8ObwU?~)(HT@U`6wM-ujFo7+T8J>(iO4?D!h&nWgJL&0! zpsCVmb}ZN_xb)cRB=|TYk@qRh`iG{gyX-#rFHbrl>=)mKSHxwBg*zZTP5+6hp_$v= z6kYK-<@%g*d`?w zD>@e3x5{ei+FLv9bi=KhEp+92n69SxFUD?D@L2D5(PdYw*C}{hKY1G;>rGX3#bWq2 z1&{UZUb