Film an agent in real M365 Copilot
The one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged
renders "look junky"; director/qa_gate.py NO-GOs them via the synthetic-stage
check). Proven end-to-end on a full location shoot (GO).
Work repo: your agent project repo (= $REPO). Python: $REPO/.venv-local/bin/python
(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as
the canonical implementation): auth_bootstrap.py, film_take_v3.py,
gate_and_tighten.sh, postprod.sh from a prior shoot's scratchpad. If gone,
rebuild from the spec below (it is complete).
0. Preconditions (fail fast, in order)
- Agent reachable in M365 Copilot: published in Copilot Studio with
Authenticate with Microsoft (Dataverse
bots.authenticationmode = 2 — mode 1
breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,
agent added from the store for the filming account. Orchestrator + ALL child
agents must share the same auth mode (ConnectedAgentAuthMismatch otherwise).
Republish order: children first, orchestrator last.
- One-screen answer rule in the agent's instructions (Kody's law): responses
≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,
save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).
- Dedicated browser profile at
~/.rapp-director/chrome-profile (mode 700).
If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,
agent deep-link) and have KODY do the passkey/MFA sign-in — never touch
credentials yourself; Authenticator number-match prompts may hit his phone on
relaunches. Session persists; warm relaunches usually skip MFA.
- Agent deep-link:
https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…
(from Copilot Studio's "See agent in Microsoft 365" link).
1. The take (single Playwright script, CDP video — desktop stays Kody's)
launch_persistent_context(profile, channel="chrome", headless=False, viewport=1728x1117, device_scale_factor=2, record_video_dir=…, record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled, --disable-backgrounding-occluded-windows]). Do NOT force --window-size/position
(causes gray letterbox band).
- goto deep-link → wait for composer
[aria-label*="Message"], [placeholder*="Message"].
- Fresh chat: if main innerText > 400 chars,
goto the deep-link again.
NEVER click the global "New chat" — it silently drops you into vanilla Copilot
(the take-2 wrong-subject failure).
- SUBJECT-IDENTITY GATE (mandatory): abort unless the composer placeholder
names the agent (
[placeholder*="<Agent Name>"]). Never film without it.
- Collapse the nav sidebar (PII: agent list, chat history, account name):
button[aria-label*="ollapse navigation"]. The hover tooltip ("Expand navigation")
lingers until the next mouse move — trim covers it.
- Per question: click composer →
page.keyboard.type(q, delay≈65) → Enter →
scroll-follow while streaming (page.mouse.move(864,480) +
page.mouse.wheel(0,900) every ~2.2s) → settle = main innerText length stable
3 consecutive samples. Questions carry the one-screen constraint implicitly via
the patched instructions; keep them demo-grade (a "what can you do" + one
end-to-end scenario walkthrough).
- Outro: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the
whole conversation. Hold 4.5s. Close context (flushes video webm).
- Save DOM screenshots + main innerText transcript per question for QA/report.
2. Post + QA gate (the film is not done until GO)
- Sample frames across the WHOLE timeline and READ them (Read tool). Every real
defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA
screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.
- Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and
sidebar-collapse frames must go).
ffmpeg -ss T -i take.webm -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4.
python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json].
blank-frozen-spans NO-GO → dead-time compression: cut each flagged span
keeping first 1.5s (select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB),
re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.
- If a transcript is supplied and cuts shorten the film, remap turn timestamps
through the cutlist (t' = t − cut_time_before_t) into
*_edited.json — the
gate binds film duration to the transcript timeline by design.
- Deliverable:
director/dist/<Agent>_Location_v<N>.mp4 (dist/ is gitignored —
films stay local). Commit ONLY director/qa/<slug>/EVIDENCE.md evidence.
If the repo requires an org token to push, push with that token explicitly —
never a plain push under the wrong account.
- Open the film for Kody (
open <film>), report which frames you actually read.
Known traps (each cost a take)
- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.
- No scroll-follow ⇒ money answer streams below the fold, never on camera.
- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.
- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).
- Co-sessions may hold the repo: check
git status before editing shared files;
own only your files; single commit at the end; token-push, never plain push.
Parameters
The typed contract this capability answers to (JSON Schema — the deterministic layer):
{
"properties": {
"film": {
"description": "Derived from `<film>` used in the documented command at line 63.",
"type": "string"
}
},
"required": [],
"type": "object"
}
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as film_m365_agent.py and embedded as the fenced Python below (sha256 267e4ae3a8057975…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to film_m365_agent.py first:
python3 film_m365_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 film_m365_agent.py # or on stdin
python3 film_m365_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""FilmM365 -- Film a Copilot Studio agent in the REAL M365 Copilot surface — the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says "film <agent>", "make a video of <use case>", "location shoot", or any ask for an agent demo video. NEVER use the synthetic stage — qa_gate blocks it (synthetic-stage check).
Generated by the rapp skill from film-m365. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability. The brainstem
# returns this to the model, so the skill's instructions still drive behaviour
# -- now behind a typed, deterministic tool contract.
INSTRUCTIONS = '# Film an agent in real M365 Copilot\n\nThe one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged\nrenders "look junky"; `director/qa_gate.py` NO-GOs them via the `synthetic-stage`\ncheck). Proven end-to-end on a full location shoot (GO).\n\nWork repo: your agent project repo (= $REPO). Python: `$REPO/.venv-local/bin/python`\n(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as\nthe canonical implementation): `auth_bootstrap.py`, `film_take_v3.py`,\n`gate_and_tighten.sh`, `postprod.sh` from a prior shoot's scratchpad. If gone,\nrebuild from the spec below (it is complete).\n\n## 0. Preconditions (fail fast, in order)\n1. **Agent reachable in M365 Copilot**: published in Copilot Studio with\n **Authenticate with Microsoft** (Dataverse `bots.authenticationmode = 2` — mode 1\n breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,\n agent added from the store for the filming account. Orchestrator + ALL child\n agents must share the same auth mode (`ConnectedAgentAuthMismatch` otherwise).\n Republish order: children first, orchestrator last.\n2. **One-screen answer rule** in the agent's instructions (Kody's law): responses\n ≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,\n save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).\n3. **Dedicated browser profile** at `~/.rapp-director/chrome-profile` (mode 700).\n If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,\n agent deep-link) and have KODY do the passkey/MFA sign-in — never touch\n credentials yourself; Authenticator number-match prompts may hit his phone on\n relaunches. Session persists; warm relaunches usually skip MFA.\n4. Agent deep-link: `https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…`\n (from Copilot Studio's "See agent in Microsoft 365" link).\n\n## 1. The take (single Playwright script, CDP video — desktop stays Kody's)\n- `launch_persistent_context(profile, channel="chrome", headless=False,\n viewport=1728x1117, device_scale_factor=2, record_video_dir=…,\n record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled,\n --disable-backgrounding-occluded-windows])`. Do NOT force --window-size/position\n (causes gray letterbox band).\n- goto deep-link → wait for composer `[aria-label*="Message"], [placeholder*="Message"]`.\n- **Fresh chat**: if main innerText > 400 chars, `goto` the deep-link again.\n NEVER click the global "New chat" — it silently drops you into vanilla Copilot\n (the take-2 wrong-subject failure).\n- **SUBJECT-IDENTITY GATE (mandatory)**: abort unless the composer placeholder\n names the agent (`[placeholder*="<Agent Name>"]`). Never film without it.\n- **Collapse the nav sidebar** (PII: agent list, chat history, account name):\n `button[aria-label*="ollapse navigation"]`. The hover tooltip ("Expand navigation")\n lingers until the next mouse move — trim covers it.\n- Per question: click composer → `page.keyboard.type(q, delay≈65)` → Enter →\n **scroll-follow while streaming** (`page.mouse.move(864,480)` +\n `page.mouse.wheel(0,900)` every ~2.2s) → settle = main innerText length stable\n 3 consecutive samples. Questions carry the one-screen constraint implicitly via\n the patched instructions; keep them demo-grade (a "what can you do" + one\n end-to-end scenario walkthrough).\n- **Outro**: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the\n whole conversation. Hold 4.5s. Close context (flushes video webm).\n- Save DOM screenshots + main innerText transcript per question for QA/report.\n\n## 2. Post + QA gate (the film is not done until GO)\n1. Sample frames across the WHOLE timeline and READ them (Read tool). Every real\n defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA\n screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.\n2. Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and\n sidebar-collapse frames must go). `ffmpeg -ss T -i take.webm -c:v libx264\n -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4`.\n3. `python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]`.\n - `blank-frozen-spans` NO-GO → dead-time compression: cut each flagged span\n keeping first 1.5s (`select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB`),\n re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.\n - If a transcript is supplied and cuts shorten the film, remap turn timestamps\n through the cutlist (t' = t − cut_time_before_t) into `*_edited.json` — the\n gate binds film duration to the transcript timeline by design.\n4. Deliverable: `director/dist/<Agent>_Location_v<N>.mp4` (dist/ is gitignored —\n films stay local). Commit ONLY `director/qa/<slug>/EVIDENCE.md` evidence.\n If the repo requires an org token to push, push with that token explicitly —\n never a plain push under the wrong account.\n5. Open the film for Kody (`open <film>`), report which frames you actually read.\n\n## Known traps (each cost a take)\n- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.\n- No scroll-follow ⇒ money answer streams below the fold, never on camera.\n- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.\n- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).\n- Co-sessions may hold the repo: check `git status` before editing shared files;\n own only your files; single commit at the end; token-push, never plain push.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = [
{
"cmd": "python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]",
"line": 63
},
{
"cmd": "open <film>",
"line": 74
},
{
"cmd": "git status",
"line": 81
}
]
class FilmM365Agent(BasicAgent):
def __init__(self):
self.name = 'FilmM365'
self.metadata = {
"name": "FilmM365",
"description": "Film a Copilot Studio agent in the REAL M365 Copilot surface \u2014 the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says \"film <agent>\", \"make a video of <use case>\", \"location shoot\", or any ask for an agent demo video. NEVER use the synthetic stage \u2014 qa_gate blocks it (synthetic-stage check).",
"parameters": {
"properties": {
"film": {
"description": "Derived from `<film>` used in the documented command at line 63.",
"type": "string"
}
},
"required": [],
"type": "object"
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
missing = [k for k in self.metadata["parameters"].get("required", [])
if k not in kwargs]
if missing:
return json.dumps({"status": "error",
"missing_required": missing}, indent=2)
resolved, unresolved = [], set()
for step in STEPS:
cmd = step["cmd"]
for key, value in kwargs.items():
for token in ("<" + key.replace("_", "-") + ">",
"<" + key + ">",
"{{" + key + "}}",
"$" + key.upper()):
cmd = cmd.replace(token, str(value))
for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):
unresolved.add(leftover)
resolved.append(cmd)
return json.dumps({"status": "ok",
"steps": resolved,
"unresolved_placeholders": sorted(unresolved),
"note": "Resolved deterministically by the agent; "
"run in order. Nothing was executed here."},
indent=2)
if __name__ == "__main__":
# Standalone entry point: the deterministic layer runs with NO brainstem,
# no framework, no install. This is what lets a "simple SKILL.md" platform
# keep real determinism -- the host model shells out to this file instead
# of improvising the procedure in prose.
# echo '{"arg": "value"}' | python3 film_m365_agent.py
# python3 film_m365_agent.py '{"arg": "value"}'
# python3 film_m365_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(FilmM365Agent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(FilmM365Agent().perform(**json.loads(_raw)))
# rci-capsule:v1:H4sIAAAAAAAC/628d5Pb2NU++FVYerfKmoFayEn2eAskCAIEA0gCRPC4Rsg5BwJ4y/7se0F2a2Tvb//bqRn1NMK9JzznOc+5zdb/frL7LiqbT9+KPsu+fPL8Jh7sLi6LT9/+8b+f0rjwPn37ZBdh5n/68imLC//TNwr/8qmyGzsHd4I4y8GNrkx98Manvy3f//3Tv/65rNS6TVy9lvokgOsre7Upqzgru9Wt6724XNmhX3SruFh1kb+6brnD6ohT5I+n2r4JbNdf/d5jCEo8HzqfDuaqtQt3Wdf3Vg97WnXlKrdT/301z8/L1RB7ftl+XSmZPT2aOIzAdeCY3wIbPN+LXbsDLy+ugy+bqClzf1U1JbDe/7JqfLdsvPa5XwUWBasBy3ll9bkoV8Ap3y9Wrl11fQMeBpeAp2lXVqsOGFEOfvPLl+VV4FQT5+0XcNv23ro499/cMq8av219cNUuvFUIrHgDL8RBDCwDbuzOX1da668ey+ty6U3A1ald/f4M8+pvTwf//vunL+DKy+OXo6syWP2tB++5duu/389K95nGVRuVZbdcKxuw6bSy23QVPP///xWwr6vT9r69rpalFufbqQBfuthdtd0Sh/c81PYfi+UrB+yRtqu4W33+8eTb60k38t30l68AGf5o51XmtwBOABQRCPQS0g+4xeDep2//+ykDCAMoqSaAxQK81XZ+1T4R6Obejxv4yotBcrqygd9t+FpNqxfmVm9vRflmL7B6a/y6Bw96q3+8vXWNXbyAuOq+Jm1Z/PMnHP/ry8cGZQUi/o7ej/s08ef9EHgJXOv69sdtBv3XP/8FXCjarumfeAQWf/qf1QvqxZ/gbnw7+w9g/178XqggvgDBP2O5srvolZr/BvLq8wKGv7Srpgd7hysMwag3hH5DqW+v1Hi/F41fgOJtn6kv01XSF+n0+6e/rr7/H2L2fXU6v+3OT4jnT3gv6f7+X1n8/nvxnseV0gBgFyuwxVtXvoEvwHaAvgAkcfWfSFt93p1/+bp4qJdNCnyvym+rqew/vAJVlgBznjdWn39b/V/XrXJednhm+Nvq+/MC/BVsN7wtS2ewExfwCwDAos+R3f5U1uDNqx/4wHnAE688t6sA1POrel9mvxvmlgAt0Mr2QO3+FVSnb3egGn5ffAaVU5QFoIVstUDSz4GpT6d+ARYtNPGHA5YAibarJXxfVt8XqPyxVPwfA/689HvxfYnuH6Cw/+gW0/ziaxstj1Zl2wFLvOXbl202sCwGiX4aBtIKDLc7N6ps7+tKClYhgMOXJaNOH2fen+60le+uHD8rH6vPAI9xu1oYJfM7/xXx//mfFbLkCvBX4cVPRK4+B3acrQK77b4sWATEBgjq9wL9uvr1V+6ZERAHN7KdzF/u/wzTX3/9tqp6J4vbhSXBzf9i70fcRb8Xq9Wy0sKkRffk1ef11TF2m7ItA7DK6jNvdzbgOUAr3x0Qxq/2n48DI/PS81e/rbDvHwTzvIA+l3aAdeniZ1EA1Pje2wtFIFFZu+JO/DMuT6OBD+CZDJCv6tt5C/18EeQcsP6X54qvBZ4XfoosqA//WXvLd0tulzKzXbfsi+7r6tyAQliyDx4DCOIOB7AySM2fC7arvG8BRUR2886dNmgpi58vbz5/33y48Iz6ErBj3OZL2r+vSvBG84jbZx7Bklf/Pe6vfH177QZADkxrlkyWPxuUgeSC97AlpefCf3tvUYD3Hn6zUIYPcvDeZJ/GAsT9zFo/2CWzHwDvoENV4KrfPk0BKcEoYvVvFEFWj2dbhJ+8NcT+oyobEBxl8eE/F1wY5c+cK5y6EUHYlMFWXm69MtGC+6ulIXYLakDoMJL6Ajo6gPa/WQT0yOvSjdSVHXT+KzHvhfzzO6+4P+O4BA9fgsD/6PBOUz5a8PJ7bwdxADX//d/wV1DI1dsPZnSfCuDt/anvq8/PnNEI8p4PUJNgw8yHbacF8QMx6t/DuST4BzWsPkeg14Nt/+SnLy/2f5cY73D8GYie71dvgNTTX56SIFpiIp95c+WV7wKkbVN/go8Ct2rjsHgDiXwvk8IflriUvfsqQ5B2b6kqG5TGwritnwV/Xf1UmgArRZ87fvP2jNcSlXzhyxyIqAhEPQKMUkVLdsviuWLjZ3a/NAEgpW5AuCwsX4Gcxm3X/hVkqsl/egTIhh6UJdAsaVytgL0gdsTXFfefbgI+jbquar/BcA4q9Kublb33Nf9gC5AKu4OfoYH/1sVd5kveW2XHzd//7/fvflu8x6jvTwM/Pyv4P3npL0sPvPn+nw34BxetwI6/f1o9w/3BmIAJl168UDnQMfGidH+Wja+e8uWp/15i6z36H6oPAANItFcFAWJ9W31/BeSP90ABG/4A9NX5Y/f5h8R8B8Jvv396QW/RZwt2gFBqfxNAAv0nRj6K7DeUxpgRRVF6kZND7Pp/tIAC/T+APAZZ/Q37EK1/PE38AwD7PUzPZf7jXhvP/m84QVIjhuEEEKJN2P4GhJIXt0sTeHOW6LwFoDkCfdv+BuBT5k+aBgTWNWWWvRPpT2/Ybho2gCk9EL230nWzHhTB2wPMDqD6/vnL968rvgSKQ10IFrTpt/dbb4spMOiOz1a1rPnZtYH2bFdhAxAJ+hqoe6ccVw6ojCVfb6AzduWfWFpSgbLYizIW8l7aYbnU+/d/2E1sv2U26Ja/gigfQVwBHH7/9M8vq39UGRgqojIDzPqf974/9/j1VwE4Hi05erbAOAAFAlAUg4w1Kkjj6u8rArAhuN8Akvq+2PT9Wat/GmaH4I0nd7wUtZvFbvp8JsxKBxDC759O/uO5BcDjO6IWiQnQUXSghrymrJ5VDLYFLg92EWeZ/aeABLHq3lH7BgLQlCDybe88pdXS8UHufnn35qat99uN+ibx25MqqeZqx6lbQHEgqAslTL8sTtoOgNmqLxYAPu38EcqforVsW4C+1v7ZSkBj++94/u1V8Sfw4N+XoAKJdnoy1XOIWcRB2YOy7N7N2wBI2dX7xFHYA4iB5zt2s+gGRZK+ve8D2kb3rJsnTS12f/noz0+bfvm2WPfd6buuLP4r+x87gNXj8InlZ7KfdR+VLxItsw6w1uffP23HaiHin5/9ZVl6Ed6LvgYbAkH1NHbBQl4u01IOVvkxpoKxD4Rv6X0fXipgi7oHTSteJO4LDD8C/A7i78tc9BVQvVPajfe1myr/c72UO+CipQkTDEX+8v3j6W3R/Xh1se7XXwFRAT/fAvAH0IcPIBgWWQO6zyJllmC+Nnja+3Wx9zNDEV8IBgGLQs/Y/XQfDKB+9hn5wiLL7SV70+rf2Fes/eXDgBZUZ7bItv+qDYDfEPREwIqAGpZl8UW8tb7bd2D+XmTRMg1+XV3ewwG0nd2A1bvXPPQhXpZ3QEuNFwIHb8RuvFQF0BXLkq++CDrYU5b+qTv+ukpBBb6GmmV6egM8smgvG5TbY0EOUPnPmvJKUHXQst+y3E9TTev6BcAO0LZ2lnaAmvsw+qijcw/ob6mVZ3CWcR3Q//uo/2+UAYFBEI9efYSOwJBfFrWBfKXJ9gMb7ZIbgK/V+9rL24sJD1A+S80VC2qeqPu6EkFFrYivJAjWJivb5+2li4Cml/Xt0nBf/ejhO/nLxtsiHvjz8f2QAqgl0Nyh/87QTxNx9RMunwR64eBlMGu6j+4IRKUCxhewyoV7nle8eOdZykAtFKDreotgeFUFGP2eo8XtmWUgr59kYS/d98UZung+bFfLYcgyQz8Vz3XL8a+Ufb6CDvgsRUAZ2yfmFvH0bPQeGPIAtbUlYLcGZGdRsEPcxu9jS1aG7bfXaPQG1lqqwHsXwF9e7PiikS+LLnmJzxfOnrMK6NE2AJqmnL6sAOV8MNCXP1vQl/fyX6aCd654KW51KfbFs+hl+/v8AEQ6KHPfLt4AhrMvH++8BWDTV1gAKoEwA9F+idAlFC+7Xnu/uR+k9R7Ep8wNSxCZ70GQV364egMxVVdv8bMJfF1QsHpzvw3AUmcEkv252tsilf3uhbs3twlWAKhvVTz+EeTdauoHgNJq9QboIMjsEIBlGRRB7YJeAEj6a14R31+i+vv/nycw31+qGkglJ7MXsdGUs1+8taAw2vejiQ+a+XF4tvo4PHtRKOggy9i6WswOwT7Lu89FV08OWPL0ygIKCghwH9DCwOzf/gIA+9nxuwfI/efui/3F+QV6CaVf/vIFBAqo4d9OsHDljts/rqBNwur6+y9f3hdu/LdXBbxmInz11DwtSAmXAZgU9pPhngc4z7Oi2AWpibNvK6ZdzSUwH9R9BSp3kfDlQiYfYQDjhf1zWYLCavsKsN5yRglKBHjbLrNP0/nFjwF1kXw5mDmATCueFQW2zKv23daf+GV5femeoHL/Avi6e450KLZc/mN57w/HBzb7f3S/vLTG91//AKAE09MzWd9/On19X/t1+AckXPviAa9vXgdA7/D/OeEfle5Mi2AG88trKODBVVDgS4/49tMJFVCUQPY/9cPf/zi8nyv9Mfzt9PcnFFefnw8s8QmBZgyLcoHYy76nbYs57VORP0+lFh7ZlHkOhNXz3PjnozD4b23Wh3+Ht/dFF222X3NvaXSg+grX/zH1Le48T6reAd0uB3tls5BA6j8dXhL65fnnO5csfeZ11x9/NK6fbHxNbfaiq+IXHgB5eu8D7jtVvZ87/F6QX1fn6qekP9H1PBj+/P2nI0uA0dWLt5fGv5TFizSWXgcmhNdYBrjU+6B1uSgfywE1YJjV52chuQvL208ueU4xu/+zTkU97Gc+XTL5oXmX8ljk+dKRFzKEVh+C9MkTy6Kn5/n5TzLlfcUctJDp48DiJVra94Oup+eAzb+8B65czt5zAJ3ngjoYQT/G9h+j6HOeBT0tyxablsH58+bjQAy4xLkuoJFfPnANptjXWftzweepEQAJ8O3tYzxetLi3xGtZFxAOyJhvN6A6m9fUWP+QMoBaCgDL508FQCN5deVN+da+eOt90l560wewvr2OysEU8eOA+fvqVZCrpQoXInseKnlL/v32rwuGFlvKAqT0ea76ur56H13dF94XEIItgKb56wuNby+gvoL4J/a+Po+zgbvtjzP5RU2//8Rmican9x/2+IDi2uWsHoQF6IYu9p/fPX8ABL7+5497+OXHSB8HbN/fQbr8XMH7OIjySrdfTlnBlcXkhebsReUDrqDwxapFAIOVABqAY5/+9a8vnz6ayutHCe/3yyfEPoHbwKkOxG2xZvluaXzNsDz9v5/aFIBh+R+HIsA7ItFK3OufDUyhJEbQiX44eD5OCIZ+CtuqrlBJj2Xhjnea6MmWFO/vclzxOX/LCOww7gciQ6j8KJBty5LiNXnwYwJtA3YfEFmSMnVN8wRmcuc+okY5TTqMlsK7jDqt3dxtldr65Qbe7tlhDlGL4/1IUUdLnt3b4TgxMuFqrhFx1NHM4plgpkubTROwGdeE6FqEUerkEnYkzfC6jujAH5BkGr3r8TrA+CGgMDg9OZtUS1DkeN2lmq5BJS5J8eFygKJoSvfr6/rmR/YByaw1C9/NvOiVDcNcGo0rz/oxmVQe40ejPO9jNCZi6xpKIRG7a5zdSukkPW4yheMxsy117oxX82EUt+a24OIo5Xn0fGxVaB36D3U76NeLulPDq3BLSFiSjUeZ3g5IFBCHe9+p0nDZIPOml7bVLd9UeFVuLySBmJJQ9NjawjfHKLjKtLDfZmJIimiKn89ltw+oio+b8YbjnAHDFfJoGVujXXF/k5yzbIgn2/LL0qdhRJrDcJQyCY+TA3PYViEy9lE1BptmgFn6ccBu9VhAbK4/ZOdBeCBoIpsVaZ7uTIJX2/0dJhxvH84msZduRmoyAQy1qDECKRYzgUiz7OmyufMzG+vhTYRJyTP3CIx7VVBUN1PtJOoYaGPR5KeKho42vD0S9KlAj/FkIIMnRX41e6VnRboHbzLGu1K3bF2Wt0smcfQ1UpOC8A2M0oN4DqSwv+dat4ZFX0IHh7nadoyl5w5dF3rFsAcXFs9NRxnb+pIS4Tht12zWWagkw48dK0V7nFYGkS7XirKBipliz6oQa8ZZPLrBTei1gITEknd2xlQZI68YRAH3e3y/bSx4Qkf3gMFoCJuNI9hIu9vBjhFFZ4oMhhlhe7yhOI96uFLXro/+zszz+hDf24eo80TrFBHq5cKJkdKO6x4Kr4SCnFrERt7DU1Sb3nVzMqItSlygKeSuUMsHFwt2D3fmyKw3eXynko2CX5oxMkWafyisril6Us2ui2IMR2OM5YWT0FD5YSCm5MQd4YMyNgSZnoMiv+Bs2U0bm2h0P99Bgy4zohVxx9KXhO2uKQp9hs9p60h7bk6vE/D8nMxaKBuZyUzRTmGrmbmK1iORz+KFafgmXFsOi88btFPatX1U7KirWbmgbyAQW7QHJbAP+6aJJHimpImEoT49bH1/R1O6uYf4TGTihuUPeHzbPCTtkZl3U73BmLnlkTn2DtI6VrYMqireJkJqucW5x4GoB5gQhcdRCtsryIuvo2jE6qznnExunGgi2G2l21bQa2R7ro6esjFMtvFPV+gx9I/ZhY4SJLMbLlNmanvllGzQN/wcNBT7YNaRUXGeLUY4vt64Gl5VUZGZgSXfuDQUKddVQkVrJYmL4m2CQ1h23W+Kx+nWF8lYcmO1nm38pFl0sO8ZsT6eT5fpTtnmeoY1a9tupGq4Xgt+GnvkpviqVUMnsV03x90IdntAfXzm54wN/CZSt2VkJxihX2B1G+umuOa3cCfYduauLYGQYlyZQ/MhJnBEbS6haJd0JGv1KNEwi+FMAXd050nxRIdGl1eIzJP3MduuNes8szSBRtQQXy0yu++RXsrQuXSLc3wOj9WwsR5bJnxom3WuGM2Dy5Bjqsy4dgmoR2TO7bYpvdK2I36S2f5s7/s1ym2EWuBpiBU79UjKpboTu5JE12t5w+AwDTq3Hif3Idh4mzZH6YbxNIe5z0XcZ0iejBzsCpiSN801rNchxKfJnMSDSBacf7Ain9j1MBmC/rrDI/bELpGA4nkrVc7l1BvAMsUTBc7fZdRenkvEEFVW2veOIZ63dVFEG1SSNtQBuE5ImdCjsSbWjvVY+9llU0V3DVIdZTwGU8SHW99eh9ZeF2+hmzw2qhlu5Id5f/QM57ZmP+9KwzSlPaNcmLEXiP3aKpFq2Jpan2d6UM7WJtwrxWNzUGURRAEKFCHmshHks4a3/Tzwj9ildMsqRLLqaFAFicHKoMWGOPhvrZa6055vA/Dp2DGjkHe64t8An6sE7Q9LH4PxhB8S3BiDimZC0Qwy6QJ1wn0Yj+fQ1QzN9AlTu4XnbgyOGsp3hFOva4cupcn2BuF2I8cdaETEQLV2yAlSKlsXJYHQ+ODm647xW1M8DQ9hbdmJXDRMU28DfcDJWuOcmGOUbURFUKEpm63k8P6EsrQqs6ZndF6UttmlUa4n9mbyCcIbl2CvCA2NYpfA7ljoYUpjIa73BY0ritFTm+FePbx7gwToRecydWjQw4RygVRXg26E4eHa2qIdYqw8hPtLWZ9SA9tkB6ljh7Ny4LkOY85cfik57Wojek75PscKThVdLQ0TGHigkRvySLYhUZNbuuopeFdHKlpd6L7BHpAZ8BaqCZeKuF04RY807ZTt7uvt7rFmbqi032WIBmtbhWErGEau3KbKVReb9u6cs+D7k+LAKdUdqGAoiJtk2RdIY+HgJkLboQ/TEy6taZqBzuYJg+mqmnMXbTWrdnrLQo5rTgiZaQvFl06WDCKF2vXEqMSaxRtucHDNg4u15GGcYJX3nQj4wULpWh0f8LHmNYVCr7oOP+qLefb3xGbTSsepPcllE/cqG174rABdPqBxzOXE/dBy7qgnU6xuONkjUzA44rwapSPrpFREH+0G066d6ymW3huaRAshes0vQnu5ZHDTHWfKdcKNH/Pz9iK3HrymWH7abdRgl6YDXW66TQRHPG+QlWy0J3xApPBynzobtitLTXo62573los2KQIUUcOkxykyWr466Gq58Wn62Hqsr4NauW0amTrnYj/PE96rzRWnYE5j/FmZDtKwwaGAwlXaZKuH3SYx6Wk5rWln0DCZNT+jcJ5p477TFAMndjUapua8PerE9lJ3+Da/MPFBufDH0+54B6rqcrw+ILx21YvjoONMqQnOnYwCFjPpiMwuIzbIRh/7awEGceyG7mbUc8eU60HtOcODLmfQ8z36+LBRkzFtZBtwJ9HuigeHXN3NBfHjkS93WUQQMlCw+YAbjUDPzGkNUxpMSxy6DYPqgfVmtudhXEwtL1g7hXxxmCDw7QlmjR3kXhqD1IWB5YILpz4Caidyzp2vzerAS7dqZ1kzl5rhlg+jA/U4W6N/AsIylPUWs2T/6to+hyKXCzwfqPmhcmwiFhdO3432Tr35epJAKZfC29Etm51jPjan0wYN1/F08yDhGjsSt2mgQYgTau2X/OlxskX9dkS1SxJy57yCSPeI8Xcc3/r7G19cdhuKP8cWUXAqFZRTHEDMOQ5gEicS3FbudOGyplBc/Z1adykJx3dujcWSdxq4ETvU29Rd58JuraGlQO3398seMaBMUglVQZoGJROo1AbSN2vHZE/bW37ZdnorO4Og3gBDzjHQhRymBshjv+b37TkS+p5lxzuthFGOJ8dLvr2zuHJR+P1xi3HJBXV4dntKPPW+uSNstCYrwnV8Yo3tjpsZy9S6ksShITpvBCRBXIROfpQzx82NtrErYTKcnVq1QGpBketpwjq+PGpoJ5AXtJ8i56gza9W+XLVM46D2YLbD6UrPawEi5WsA1HO2ts0HLmPiSUSrWiaiKHJbEasqTNrUYkSFYJDj6gpjgnjHXViiIv27COEReecNnSphqiH1R1wDhma6ThQhye/4s3ZcSzzac3cYzgKtOEQJ5uQct72o47pY9/sYyA+fNVqcPwS6H14fQr0BcdqSLoaFY0heuSGur1LXUM58J0e2zO+Q7K6VEipPUBeZG6ozM/5e2mS+Vy9cr9OCEThnPjkk2frCzfusujC0PZwf3E05XNfpRW446AytCxFuPJt2GERT1yKc47kPcUZCCF45YqKGNMLNjo0yb8+iEAoTwSnHtvNAf9UJFTsYodix4q3f7g91AkaOzdG+KT2xs28NGRAjP6BzeJIRqXicj0moomCmhJjtuk2p9CBSeh7jhC5zegkQCtgQRuZQUa2LkO5lAz4bw8Ug5uO+7p25QJlQidfqQAFTJ6SZG7IrXQhFA9EhyWBnS3ub9/fRRd5JekWlKafqazTe+ikasBayJxOLccnTum+Yy4O8EVeIwwQxPJ7MEvVMtSIKAdGUgRofMpgSm3m3Dk8GuV8rLhdp8yTt16k8INBe37vCkZO5Imwaptx64Rx1uDJyEh6iTkFeKpHZ7VtKAloKFeHEOtFznhMiZwSXDmIfZXTwgyHccqZJVS6sYEEPG7sd0hfpOq00rNPx4mYcXMZUiLGD4Mw5TY+01Mgyc0oND6WrOVow04vYtLkEMr+mKAem5iByzWJugiiD9f509mUSDjfieBGuJHEBU/aZAFZuivqG3mpqCOa1ospSyK3vGo7eoUHc1zB5oPrg1Pi0Ix5zc/IfSIsfzuEjldTBZD1ow6OFx/HdLYfOZXszzppxXzN3C8x+8JCGG/aB541fQh2gwZ5ATfJ8Fize2K9ZoPOaYxYytl8CHp+vRwjeifzJk+qaiQqWiWFZqg4uFyMeNzodYUIhkhEHU8gbxEokLmtMu4NUrmZ0rWy5YDT2vhy7mdPg6UYdb4dgYhKYaWElk9K56+nd0SBGvLRYVD264AlQbA0UejMF1ze2VDaPEygXzsdZsl9f8ylN0D6Fmis3x5Cibw3CS1wu3a2TXTuyNKJMLJwPRbyLznAKeaGr1C2kslCbn7moyVvuXGBD++hmEz9fYxPWO17m1kl3pUTEHy+N9QgP6xOx5iWeldT6MKW55/f4pEnIVpMwuR8KeVugMopuG+MWlakfTmh/7BkJ6g7uKMnlSEouteHESz7UibsWwK7V0OhgsLWuUKKEa6O9RdYGhmp78rUHc03tOVS13Q56cHavFmDI7tbV+sSKdMgfDvC0DJY+50jiTgsk4XjJNlF3YMxJEga9RgMbn6VzaSrBfouhzNq83mu03oac6nDG0B9Uk8UfwYalZ0xgjYBitPqCli5XcTBOw+PaxNaX8mZHZskzlzIO13aAI+xg73a+URXQ7lLAnF7QxKWgJPtsMY/OoDaRxPcTP2mPqoObMC+GwoHhrhe9CxdujnmRwQFgKirhaMiXhhHmTabpGg+EeO14/sCe2lqe12PQdKbIB5wWMid7y9qcP6AaBiMOrIwO7VU0/Dg4AVw0CAs/9IBSWleLW5NuYdRogVI/CMVDhhUk9XkL4w/7igNac6C73SnaXQ6trN4zYabYLlmzI0Hh8MY87LumrDc06XcHOtqZptsC9jACjZ1gHkcVSGnECQgWWTHV4KKdtHQuN7IPFxAGUa6iKg5SzgdIJGQ7F4gDty9yZHuT6crLFMgwyRZKFT/2vW2l1UhpMndMVnHHVbWeoowbc95V7Lnqj5qTbYnWCBhnQM+NrDnWdjTaPF207wS7vtnvH/RY54f7Deu3lE4VlzQKAiiWL21pD1c4MVQI9da3dJt7xtSI8ICg98FRT3BNeg5DxIFm7ONDbl0sI7aO1whldROlsHRD000KESx6f6i3TMNMP9GvDc8UvuQU3kG8zCred73S2N79ttMZTb7vBJZMNbL3eLkq/NN+RBo8D/mA4I7OrPaJf6WvthU9DH+G7Qt1dQXJRSpyvDFqQotOT6fYfQyEzjqgFHXlnTEKxHmdKECQaVRr+Dtv69yA/HvoOLatNmhSigImXJm72c47tiTv7V31gPQeqNwuBlgWeJJuSpjGSNrx1UxQYaOabxPPontjmu7SfkAIGOGuwQTExJ3EcwE78ZBXWmekmjtSu9M8heYRn9mZrEV3PjlpuDsd0YdldR7c30sJK+gu0dms39bbYQcmazN1KN+Cri3Q+m3B31Cjhzz0eo6Y2Nkkvra5+1SAWRTJKia1VatYS09OutlLqGAaAG3GPTyiDkp1x9vxBB+4zme7frwh9j48oBJ+HiwjQ/TbcCfo/WW8t825xgblcrpp8GzYfk1tL9b67F3neuwRaFuV1iXSpqT1TmkT5d66MIM22jNBr+riuSUgkt1xdR2tr+T0sGE6Z7XqZDbHdWfi4oindzLToUI5yt6DygZvRE/lGfO17OTSfdCjU51ZlJGIe7VAiLNiibN2f1DIYIaJfmNFZiiD2KQvtluoheMfq9ZGRQnZbXCRNoubVx4b86BeaBhT91dYYvwbQSOH2L76Ni4eypbRJvE+ULbKxpNeZnJBQNiD8U47ArCacLgkZVUI2D25K2MjAmAY2+lMDOU+NfjKLofCF0uqZnWBwYL7tol0oh67pi/O9yxt7cmqMJm43YbgnE2IFGf3w+wW1947HzVZw0mjY2q7nR1kprFp2qxvynwjZmvGbFzexIekZTGCbSlykwbaZafHlVrYseype4sRcFQ40SKo4uBYk0cPQWulbrREPKktfqxidjsh11w5t8He21xpVYT3QPo2l7rVcaABbmtXifHLw7hv8f0m8WYLi9aEdk+6M/p4NCKi11kxoRSxbfZsYbJ59LC06wRT9NneyRMRGu1BESDkJIrqVoM9BlEtaqCxa1hVJJPQWkrK5dXoHLhi5DQ/1sycPWbipIhVWFlNWzH+uov2cqe5ttpsDhZKDg8/95iYJ2AHhQZ9pC8TmpwAJ+B0UKIc2l9Jcd+mKODFifccyzooGOruWWI/9YcMw8+deAc9U4lcmSnvE6Wr5InwmYIhPapW9pTjJBaYu0P3pvsFPbJgz+YIOW3dIF43IVqkM+Y+QQgehz3Vc7GjcXY2e6UjjoPBpHRv46fNZYZAr25tUS7pHIL6KRsZwsjNTlE5kMI6X2ORe9ATBRPKGa7nbjxJR6vaTuKh0ORruqdPhuXnMd3otjzQzHEz3LHpUMxeG/YPtwcJwqgTKVEdnV9SuiJzONjASYhj0imXtRa+MYTYJ/K2peNhnQZm1o6kNx/Ju60e6ciMjtTBSyliN7KoexEqXBHOE3xNrmccuVXF1lk7sr03g/uel0VtVINE5VQMnQIKJQZcVwUkqB/lNM7YFfLiqUoqMiOGO3xH4CZXWzSOnZn0m7UobcuCJGWq4OgakveHHe6zCVORwxx77Aa01riLd97Ba0SVmkLoPKe1MaMPehfPltzvqUGrwromlTHvvFg3EdGEJVLPmLi6Z+eN18m5tbMwodUuR9jUI95rDbZeMxaiyxQxRYhRZQ6CVrZGHo7Xu41BmgbluWEQyO4+PwZc6gaMOXDEbdtHxZ4YxCOWpslYxqjWQ3sU7SNMQTe7eTp1fcT0SV2chyZ6OIKneL6B3pFwZzvpWNRO77pa3a99xEZtCx4YMu94NYWG6k5tqZvkVycMDrzN3sDs2p5ho4OPY3d5APDfNtZ06KrpkB2gx67ChXrYX6sETcOjbelXh0mufCwczhiqQofCN11SFceJIrW9I1gyPJwI0Ec7RrzJG4u+CdIIP856EPBO7UqBVcMRHahVfUqPeI4b8JpG5slFq+lmW9LgdUFWHIBvURsNHgvmGdrg8uuMBzokb+f+tFd027mcTiccmWZkNim638YSm8sxsvfRDlev0hmq251wnJtBlCtu7IdeMajT5trhNoQPTVrZCjElGi2IWK6YqFflx2EMeuCSLZZAe9FNdwwIZSLVmCzoXMsm+g4cV2LmTgwHYj/4yp32jg1vGmSjK+YZcurOKmjXOpxiGDOtU5bsFD7zHUfKepnoWMGysGB7p21pugo9sr47ia3fUVLIqPHmjyPae7eo306Bew62cX8EbYC+JxMypirc0TenAyVxq2oXiy4xFc8X/Cbtm8q4a8yshIlFmvjd4aqLSSi0f5myI9WUHnYCkmgmYOs65tMGu5E+ZZqJsz35d04/nG7nrtDwC7QbfRIWWvJm1FSSFG1MzbsrdUMQ84AqQuqtzzgaELVbiSrvWh5qUmKIXw952A4Zre7Z6rqfKyOemwreD93VTR/nKE+mQRvB5BLM58pGd3ex6ZG68yDFVXl7jdo7r7+upxj0/8Y3BLokyq6B+65skV2rysZpGLMjNvbMiZuz7NyXM6KBtNT3WPdJSh+rCswaNnLel9RJXk/r4sChJruZ+dphrNG4j3XGnIdrXHmy2jMBVA4H2YkbKj5UWV+nOoEdJmOvONTQXzVWog31lkh80tXd2kN1wKDSNbvksFbOJzXBB69QwFjSAW4iL4ys914nItJYKV1EsfodI7VC3E7rfmMo2o3Apx2QZJSZs2R5qnkIXj+O+QO1t8PGsa43zJE7PnUmVz0U6eZEQegldsiA0y8B3d6yPlIyVmmmsycW1x3bGbhnugYKu7RddrN1xmQGsNucZML1tjtQJFb28d2edepugdHDNQ7BWRM1wseT3ho7Z84D0XI9vOu8tSVoEVsgPYh7M7lT5wksdpXutFDsZS+2tWRm3XC4VsHo6dy+cgXvxEu5ClWdYN9wVwe51ylKZFFsanivBwNV0Ys+rUWBJ5jOjMZSU2hDyxoYLfRAcAZHkqdumuVNlKPcJKdl75CH52oqSP7usS18KiOCq9OV6JqV0CzjBrQPMdE4HM7qXSVVvu+C4mTYrrg/QBCJD/ykDC2YUfQpUEyxnLNmtxdMa987xyFTjZTZ9Z5bBhalW51888jsWrZOz2Ln9dbEmPxI4novmt0ROpyKlk6ONnMmQqp2xsDNdiSU9GtS9fBrlOFdIRNICukmkG6USQlBq3nugIlqwm+YtjuSdYafksust/FRO5GNsZ7rhtHQA65UtR0VVOMEiQvxAhiBLjNR255WMpSZDvckGuHTeDDsnU5cK1xl+ZRxdCLwJ4eaKLi7yJl6UYoITD3+QS4zk5qbM9valYDkxcUmMvSxDQ5eLV5tsx1hhLcJgI1GYu3DsWDjh3+fj1ORJdo9gxRcG73rIEcU0ENoIPba+a7nyLGYO5MNkvlY3c5gBKrObiJG5HaPZC5q1Tdn4xvaoz5l0XGUtrg2Z042zHNyUbXj+bQ/RJ18za/xA3Guck+rdz2RuxsPZ/mFnYwBU25dxg6JdchsHUcyOb0lNGB8LSk9ujoh03m++fyx6szdlalOk8NQOAkJe21XnNnRFmryQtdsrwuITTtuL+Kb3EUy1EQ0oquDguN7I0w3WHlwh4Gt2hpLhuIuKIabqM5dUsqhwXR9gC5V9IC1ovQGszxp1qYk6GzGRWum6+ohHlvOSS2AsqKTbfhG6/cw64K131oDCTTBPm4jvUP0JBL3YU+YHRkeC0v1REbOnJsN0Jjrghlhzo5isW4PgX+rLXukrLua0mKZOKqTD7ZG6PhNnoN8KulxjVEldudnfZ88ykuB0OdAQ4K+Uxm9zpuLJXu4dWf9/EayWZk7hggmyUkPM/KcwnmP0XKx2QLOiudYtIutnN7L+uR78y0XdPw821eSPvft/UGSQafxntthaUdejNZA1Fozc8wxe3xD94ABC7jZB+sWTGpkFrBZV3jkhPZ5u7Z2V19NzbgyZHVSekVe53sCaqv28WD86D5pDUaF6pQa2tZujlXVjvWgXwzBOqWFpvepNt325EHbIy6tnUPeobX1LSxYb/AfYhcLRz66QWnps3503e4a5HiHZ4y6phh9risoSUJ/M9TtxlrbRHO4we28t5mE73yPEby7OODIpT7dAvw4n2X+eBwoy173uHGoevuI3O9zlx6nnoX0PZ7e5pBsQ52A+Y2HJg4tXPrzncVPQy1ya7vd3TN67WoT0Ap5NLVOLhT3UhV1JqgOPZpN/NGTs8k1LYvXVfZqIQ9O5iodNrv8Jh/Pmz0YU9YEFfiaf06T/QajSNNyUz0oBRF2pJROLzfjWCSjWPsEcTm07GHPIXo6RTcEzx25ReKpPe273KY6ISdyLCkqKhzOaHQWhbF73HZ0LuPK2B1m6Kj0Qmga9/uhsuvJeujr8k5VOTta+J274D3QP+tQgehCE6ezaiCsoNdUdPCY64PDFYXOim6OZuGWKQforpVU0AItXiYkeuH4ffoQhKZ5sMLGKqwRZYO4ri5k64zHxB9SO23YNGHG4rILcq6aPes6tedwRMqksSQCBgOZmh3PSC6McjkpJ6ga2R1CceH5stU5RsPgsm4brw/WFV3BfCxOZsPeyIz2CbTYHqIpEUCnwA7sBbHoPd8fof2eLanDBD3q+DFE6cZEfPsgxHdpC+XXCjlnCJHdRZMs0yN5tBCou2Wm1RRkkVsMub/2wRhm9bFN6a2AyTIs9zqdVPzmKjnnzXqfjT27SyfMbq7n+07Y74fzmWyB8GHAFHoCzamHZ/sUwoU8uCaDq/TeOrYDtkePpxrbCYQ10iNpPYo9G+yzXq0IN1W39RUUDETvzC5sc3qw8Itb3HA9S6/0KVOwjkxtRxaAGK8x99r4uDtfvcbfOyiALyvdk4d3Smt8onbOdb/dSNiN0kPtRB3EIo2wLcq0bT9pCYILEN1hwjAZGur2mAemQ8GL/YRWR1wowFB/95w0wuWu2MEaJtDi8RZG0jzaRj1DXSWcm5o5N3Dg34BCYbfGbFAMYJb5SgH4eYIVK9TV0KLGnDeMGD7YYdh3fnOKcHFqW7W4KxhWoKfmilE5plZJKh58uu1nAiuM6w7dl9Vt1m3DxQQ3jhx5nKdybqV+7QL1pd2khJ50oNVkbId3WCRDGTOcHVeNuwrItPM69Q+TGvtrj/PKgayCQM3Cvq2EQyOu7+iFuNkTW57uLDmpVzYAS/Lsrj1r1LU2pjnK9MBpULje0SKz7k1cqB5pz3Hcb5++LB9z9N8/GLl8mPFt+d1FGL7J0uHwNfeWv7Hg+eur4Lbj0oRHIDaCIriN4R6L0iiFBASJux7rsaSHB7YTYA7mMSSDUliA2zSNU56DUaxt4/7zo46vX1y3Cxds+I9Pyyd3vz0/w/jtpx270m67b977Jy2fn9Fsf0NXz7864Tf805f/j9dev2TSfXv7++tTkf8ED7oxMBz9ijxfev5CXtlMH58HXT4n/bPbi7MT2CX/+LXGjwc7O3z/ax6W32J5fRAULAqW/df/A5zs/bBnRAAA
1---2name: film-m3653description: Film a Copilot Studio agent in the REAL M365 Copilot surface — the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says "film <agent>", "make a video of <use case>", "location shoot", or any ask for an agent demo video. NEVER use the synthetic stage — qa_gate blocks it (synthetic-stage check).4---56# Film an agent in real M365 Copilot78The one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged9renders "look junky"; `director/qa_gate.py` NO-GOs them via the `synthetic-stage`10check). Proven end-to-end on a full location shoot (GO).1112Work repo: your agent project repo (= $REPO). Python: `$REPO/.venv-local/bin/python`13(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as14the canonical implementation): `auth_bootstrap.py`, `film_take_v3.py`,15`gate_and_tighten.sh`, `postprod.sh` from a prior shoot's scratchpad. If gone,16rebuild from the spec below (it is complete).1718## 0. Preconditions (fail fast, in order)191. **Agent reachable in M365 Copilot**: published in Copilot Studio with20 **Authenticate with Microsoft** (Dataverse `bots.authenticationmode = 2` — mode 121 breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,22 agent added from the store for the filming account. Orchestrator + ALL child23 agents must share the same auth mode (`ConnectedAgentAuthMismatch` otherwise).24 Republish order: children first, orchestrator last.252. **One-screen answer rule** in the agent's instructions (Kody's law): responses26 ≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,27 save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).283. **Dedicated browser profile** at `~/.rapp-director/chrome-profile` (mode 700).29 If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,30 agent deep-link) and have KODY do the passkey/MFA sign-in — never touch31 credentials yourself; Authenticator number-match prompts may hit his phone on32 relaunches. Session persists; warm relaunches usually skip MFA.334. Agent deep-link: `https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…`34 (from Copilot Studio's "See agent in Microsoft 365" link).3536## 1. The take (single Playwright script, CDP video — desktop stays Kody's)37- `launch_persistent_context(profile, channel="chrome", headless=False,38 viewport=1728x1117, device_scale_factor=2, record_video_dir=…,39 record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled,40 --disable-backgrounding-occluded-windows])`. Do NOT force --window-size/position41 (causes gray letterbox band).42- goto deep-link → wait for composer `[aria-label*="Message"], [placeholder*="Message"]`.43- **Fresh chat**: if main innerText > 400 chars, `goto` the deep-link again.44 NEVER click the global "New chat" — it silently drops you into vanilla Copilot45 (the take-2 wrong-subject failure).46- **SUBJECT-IDENTITY GATE (mandatory)**: abort unless the composer placeholder47 names the agent (`[placeholder*="<Agent Name>"]`). Never film without it.48- **Collapse the nav sidebar** (PII: agent list, chat history, account name):49 `button[aria-label*="ollapse navigation"]`. The hover tooltip ("Expand navigation")50 lingers until the next mouse move — trim covers it.51- Per question: click composer → `page.keyboard.type(q, delay≈65)` → Enter →52 **scroll-follow while streaming** (`page.mouse.move(864,480)` +53 `page.mouse.wheel(0,900)` every ~2.2s) → settle = main innerText length stable54 3 consecutive samples. Questions carry the one-screen constraint implicitly via55 the patched instructions; keep them demo-grade (a "what can you do" + one56 end-to-end scenario walkthrough).57- **Outro**: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the58 whole conversation. Hold 4.5s. Close context (flushes video webm).59- Save DOM screenshots + main innerText transcript per question for QA/report.6061## 2. Post + QA gate (the film is not done until GO)621. Sample frames across the WHOLE timeline and READ them (Read tool). Every real63 defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA64 screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.652. Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and66 sidebar-collapse frames must go). `ffmpeg -ss T -i take.webm -c:v libx26467 -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4`.683. `python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]`.69 - `blank-frozen-spans` NO-GO → dead-time compression: cut each flagged span70 keeping first 1.5s (`select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB`),71 re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.72 - If a transcript is supplied and cuts shorten the film, remap turn timestamps73 through the cutlist (t' = t − cut_time_before_t) into `*_edited.json` — the74 gate binds film duration to the transcript timeline by design.754. Deliverable: `director/dist/<Agent>_Location_v<N>.mp4` (dist/ is gitignored —76 films stay local). Commit ONLY `director/qa/<slug>/EVIDENCE.md` evidence.77 If the repo requires an org token to push, push with that token explicitly —78 never a plain push under the wrong account.795. Open the film for Kody (`open <film>`), report which frames you actually read.8081## Known traps (each cost a take)82- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.83- No scroll-follow ⇒ money answer streams below the fold, never on camera.84- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.85- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).86- Co-sessions may hold the repo: check `git status` before editing shared files;87 own only your files; single commit at the end; token-push, never plain push.8889<!-- toaster:generated:begin -->9091## Parameters9293The typed contract this capability answers to (JSON Schema — the deterministic layer):9495```json96{97 "properties": {98 "film": {99 "description": "Derived from `<film>` used in the documented command at line 63.",100 "type": "string"101 }102 },103 "required": [],104 "type": "object"105}106```107108<!-- toaster:generated:end -->109110<!-- toaster:generated:begin -->111112## Run this — do not improvise113114This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `film_m365_agent.py` and embedded as the fenced Python below (sha256 267e4ae3a8057975…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `film_m365_agent.py` first:115116```bash117python3 film_m365_agent.py '{"key": "value"}' # arguments as one JSON object118echo '{"key": "value"}' | python3 film_m365_agent.py # or on stdin119python3 film_m365_agent.py --tool # emit the JSON tool contract120```121122Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.123124```python # rapp:deterministic125"""FilmM365 -- Film a Copilot Studio agent in the REAL M365 Copilot surface — the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says "film <agent>", "make a video of <use case>", "location shoot", or any ask for an agent demo video. NEVER use the synthetic stage — qa_gate blocks it (synthetic-stage check).126127Generated by the rapp skill from film-m365. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""128129import json130import re131import sys132133try:134 from agents.basic_agent import BasicAgent135except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.136 class BasicAgent: # noqa: D101 - minimal stand-in, same contract137 def __init__(self, name=None, metadata=None):138 if name:139 self.name = name140 if metadata:141 self.metadata = metadata142143 def perform(self, **kwargs):144 return "Not implemented."145146 def system_context(self):147 return None148149 def to_tool(self):150 return {"type": "function", "function": {151 "name": self.name,152 "description": self.metadata.get("description", ""),153 "parameters": self.metadata.get("parameters", {})}}154155# The procedural layer, verbatim from the source capability. The brainstem156# returns this to the model, so the skill's instructions still drive behaviour157# -- now behind a typed, deterministic tool contract.158INSTRUCTIONS = '# Film an agent in real M365 Copilot\n\nThe one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged\nrenders "look junky"; `director/qa_gate.py` NO-GOs them via the `synthetic-stage`\ncheck). Proven end-to-end on a full location shoot (GO).\n\nWork repo: your agent project repo (= $REPO). Python: `$REPO/.venv-local/bin/python`\n(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as\nthe canonical implementation): `auth_bootstrap.py`, `film_take_v3.py`,\n`gate_and_tighten.sh`, `postprod.sh` from a prior shoot's scratchpad. If gone,\nrebuild from the spec below (it is complete).\n\n## 0. Preconditions (fail fast, in order)\n1. **Agent reachable in M365 Copilot**: published in Copilot Studio with\n **Authenticate with Microsoft** (Dataverse `bots.authenticationmode = 2` — mode 1\n breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,\n agent added from the store for the filming account. Orchestrator + ALL child\n agents must share the same auth mode (`ConnectedAgentAuthMismatch` otherwise).\n Republish order: children first, orchestrator last.\n2. **One-screen answer rule** in the agent's instructions (Kody's law): responses\n ≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,\n save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).\n3. **Dedicated browser profile** at `~/.rapp-director/chrome-profile` (mode 700).\n If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,\n agent deep-link) and have KODY do the passkey/MFA sign-in — never touch\n credentials yourself; Authenticator number-match prompts may hit his phone on\n relaunches. Session persists; warm relaunches usually skip MFA.\n4. Agent deep-link: `https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…`\n (from Copilot Studio's "See agent in Microsoft 365" link).\n\n## 1. The take (single Playwright script, CDP video — desktop stays Kody's)\n- `launch_persistent_context(profile, channel="chrome", headless=False,\n viewport=1728x1117, device_scale_factor=2, record_video_dir=…,\n record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled,\n --disable-backgrounding-occluded-windows])`. Do NOT force --window-size/position\n (causes gray letterbox band).\n- goto deep-link → wait for composer `[aria-label*="Message"], [placeholder*="Message"]`.\n- **Fresh chat**: if main innerText > 400 chars, `goto` the deep-link again.\n NEVER click the global "New chat" — it silently drops you into vanilla Copilot\n (the take-2 wrong-subject failure).\n- **SUBJECT-IDENTITY GATE (mandatory)**: abort unless the composer placeholder\n names the agent (`[placeholder*="<Agent Name>"]`). Never film without it.\n- **Collapse the nav sidebar** (PII: agent list, chat history, account name):\n `button[aria-label*="ollapse navigation"]`. The hover tooltip ("Expand navigation")\n lingers until the next mouse move — trim covers it.\n- Per question: click composer → `page.keyboard.type(q, delay≈65)` → Enter →\n **scroll-follow while streaming** (`page.mouse.move(864,480)` +\n `page.mouse.wheel(0,900)` every ~2.2s) → settle = main innerText length stable\n 3 consecutive samples. Questions carry the one-screen constraint implicitly via\n the patched instructions; keep them demo-grade (a "what can you do" + one\n end-to-end scenario walkthrough).\n- **Outro**: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the\n whole conversation. Hold 4.5s. Close context (flushes video webm).\n- Save DOM screenshots + main innerText transcript per question for QA/report.\n\n## 2. Post + QA gate (the film is not done until GO)\n1. Sample frames across the WHOLE timeline and READ them (Read tool). Every real\n defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA\n screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.\n2. Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and\n sidebar-collapse frames must go). `ffmpeg -ss T -i take.webm -c:v libx264\n -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4`.\n3. `python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]`.\n - `blank-frozen-spans` NO-GO → dead-time compression: cut each flagged span\n keeping first 1.5s (`select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB`),\n re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.\n - If a transcript is supplied and cuts shorten the film, remap turn timestamps\n through the cutlist (t' = t − cut_time_before_t) into `*_edited.json` — the\n gate binds film duration to the transcript timeline by design.\n4. Deliverable: `director/dist/<Agent>_Location_v<N>.mp4` (dist/ is gitignored —\n films stay local). Commit ONLY `director/qa/<slug>/EVIDENCE.md` evidence.\n If the repo requires an org token to push, push with that token explicitly —\n never a plain push under the wrong account.\n5. Open the film for Kody (`open <film>`), report which frames you actually read.\n\n## Known traps (each cost a take)\n- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.\n- No scroll-follow ⇒ money answer streams below the fold, never on camera.\n- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.\n- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).\n- Co-sessions may hold the repo: check `git status` before editing shared files;\n own only your files; single commit at the end; token-push, never plain push.'159160# Ordered commands lifted verbatim from the capability's own documentation.161STEPS = [162 {163 "cmd": "python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]",164 "line": 63165 },166 {167 "cmd": "open <film>",168 "line": 74169 },170 {171 "cmd": "git status",172 "line": 81173 }174]175176177class FilmM365Agent(BasicAgent):178 def __init__(self):179 self.name = 'FilmM365'180 self.metadata = {181 "name": "FilmM365",182 "description": "Film a Copilot Studio agent in the REAL M365 Copilot surface \u2014 the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says \"film <agent>\", \"make a video of <use case>\", \"location shoot\", or any ask for an agent demo video. NEVER use the synthetic stage \u2014 qa_gate blocks it (synthetic-stage check).",183 "parameters": {184 "properties": {185 "film": {186 "description": "Derived from `<film>` used in the documented command at line 63.",187 "type": "string"188 }189 },190 "required": [],191 "type": "object"192 }193 }194 super().__init__(name=self.name, metadata=self.metadata)195196 def perform(self, **kwargs): # toaster:generated-perform197 missing = [k for k in self.metadata["parameters"].get("required", [])198 if k not in kwargs]199 if missing:200 return json.dumps({"status": "error",201 "missing_required": missing}, indent=2)202 resolved, unresolved = [], set()203 for step in STEPS:204 cmd = step["cmd"]205 for key, value in kwargs.items():206 for token in ("<" + key.replace("_", "-") + ">",207 "<" + key + ">",208 "{{" + key + "}}",209 "$" + key.upper()):210 cmd = cmd.replace(token, str(value))211 for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):212 unresolved.add(leftover)213 resolved.append(cmd)214 return json.dumps({"status": "ok",215 "steps": resolved,216 "unresolved_placeholders": sorted(unresolved),217 "note": "Resolved deterministically by the agent; "218 "run in order. Nothing was executed here."},219 indent=2)220221if __name__ == "__main__":222 # Standalone entry point: the deterministic layer runs with NO brainstem,223 # no framework, no install. This is what lets a "simple SKILL.md" platform224 # keep real determinism -- the host model shells out to this file instead225 # of improvising the procedure in prose.226 # echo '{"arg": "value"}' | python3 film_m365_agent.py227 # python3 film_m365_agent.py '{"arg": "value"}'228 # python3 film_m365_agent.py --tool # emit the JSON tool contract229 _a = sys.argv[1:]230 if _a and _a[0] == "--tool":231 print(json.dumps(FilmM365Agent().to_tool(), indent=2))232 else:233 _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")234 print(FilmM365Agent().perform(**json.loads(_raw)))235236# rci-capsule:v1:H4sIAAAAAAAC/628d5Pb2NU++FVYerfKmoFayEn2eAskCAIEA0gCRPC4Rsg5BwJ4y/7se0F2a2Tvb//bqRn1NMK9JzznOc+5zdb/frL7LiqbT9+KPsu+fPL8Jh7sLi6LT9/+8b+f0rjwPn37ZBdh5n/68imLC//TNwr/8qmyGzsHd4I4y8GNrkx98Manvy3f//3Tv/65rNS6TVy9lvokgOsre7Upqzgru9Wt6724XNmhX3SruFh1kb+6brnD6ohT5I+n2r4JbNdf/d5jCEo8HzqfDuaqtQt3Wdf3Vg97WnXlKrdT/301z8/L1RB7ftl+XSmZPT2aOIzAdeCY3wIbPN+LXbsDLy+ugy+bqClzf1U1JbDe/7JqfLdsvPa5XwUWBasBy3ll9bkoV8Ap3y9Wrl11fQMeBpeAp2lXVqsOGFEOfvPLl+VV4FQT5+0XcNv23ro499/cMq8av219cNUuvFUIrHgDL8RBDCwDbuzOX1da668ey+ty6U3A1ald/f4M8+pvTwf//vunL+DKy+OXo6syWP2tB++5duu/389K95nGVRuVZbdcKxuw6bSy23QVPP///xWwr6vT9r69rpalFufbqQBfuthdtd0Sh/c81PYfi+UrB+yRtqu4W33+8eTb60k38t30l68AGf5o51XmtwBOABQRCPQS0g+4xeDep2//+ykDCAMoqSaAxQK81XZ+1T4R6Obejxv4yotBcrqygd9t+FpNqxfmVm9vRflmL7B6a/y6Bw96q3+8vXWNXbyAuOq+Jm1Z/PMnHP/ry8cGZQUi/o7ej/s08ef9EHgJXOv69sdtBv3XP/8FXCjarumfeAQWf/qf1QvqxZ/gbnw7+w9g/178XqggvgDBP2O5srvolZr/BvLq8wKGv7Srpgd7hysMwag3hH5DqW+v1Hi/F41fgOJtn6kv01XSF+n0+6e/rr7/H2L2fXU6v+3OT4jnT3gv6f7+X1n8/nvxnseV0gBgFyuwxVtXvoEvwHaAvgAkcfWfSFt93p1/+bp4qJdNCnyvym+rqew/vAJVlgBznjdWn39b/V/XrXJednhm+Nvq+/MC/BVsN7wtS2ewExfwCwDAos+R3f5U1uDNqx/4wHnAE688t6sA1POrel9mvxvmlgAt0Mr2QO3+FVSnb3egGn5ffAaVU5QFoIVstUDSz4GpT6d+ARYtNPGHA5YAibarJXxfVt8XqPyxVPwfA/689HvxfYnuH6Cw/+gW0/ziaxstj1Zl2wFLvOXbl202sCwGiX4aBtIKDLc7N6ps7+tKClYhgMOXJaNOH2fen+60le+uHD8rH6vPAI9xu1oYJfM7/xXx//mfFbLkCvBX4cVPRK4+B3acrQK77b4sWATEBgjq9wL9uvr1V+6ZERAHN7KdzF/u/wzTX3/9tqp6J4vbhSXBzf9i70fcRb8Xq9Wy0sKkRffk1ef11TF2m7ItA7DK6jNvdzbgOUAr3x0Qxq/2n48DI/PS81e/rbDvHwTzvIA+l3aAdeniZ1EA1Pje2wtFIFFZu+JO/DMuT6OBD+CZDJCv6tt5C/18EeQcsP6X54qvBZ4XfoosqA//WXvLd0tulzKzXbfsi+7r6tyAQliyDx4DCOIOB7AySM2fC7arvG8BRUR2886dNmgpi58vbz5/33y48Iz6ErBj3OZL2r+vSvBG84jbZx7Bklf/Pe6vfH177QZADkxrlkyWPxuUgeSC97AlpefCf3tvUYD3Hn6zUIYPcvDeZJ/GAsT9zFo/2CWzHwDvoENV4KrfPk0BKcEoYvVvFEFWj2dbhJ+8NcT+oyobEBxl8eE/F1wY5c+cK5y6EUHYlMFWXm69MtGC+6ulIXYLakDoMJL6Ajo6gPa/WQT0yOvSjdSVHXT+KzHvhfzzO6+4P+O4BA9fgsD/6PBOUz5a8PJ7bwdxADX//d/wV1DI1dsPZnSfCuDt/anvq8/PnNEI8p4PUJNgw8yHbacF8QMx6t/DuST4BzWsPkeg14Nt/+SnLy/2f5cY73D8GYie71dvgNTTX56SIFpiIp95c+WV7wKkbVN/go8Ct2rjsHgDiXwvk8IflriUvfsqQ5B2b6kqG5TGwritnwV/Xf1UmgArRZ87fvP2jNcSlXzhyxyIqAhEPQKMUkVLdsviuWLjZ3a/NAEgpW5AuCwsX4Gcxm3X/hVkqsl/egTIhh6UJdAsaVytgL0gdsTXFfefbgI+jbquar/BcA4q9Kublb33Nf9gC5AKu4OfoYH/1sVd5kveW2XHzd//7/fvflu8x6jvTwM/Pyv4P3npL0sPvPn+nw34BxetwI6/f1o9w/3BmIAJl168UDnQMfGidH+Wja+e8uWp/15i6z36H6oPAANItFcFAWJ9W31/BeSP90ABG/4A9NX5Y/f5h8R8B8Jvv396QW/RZwt2gFBqfxNAAv0nRj6K7DeUxpgRRVF6kZND7Pp/tIAC/T+APAZZ/Q37EK1/PE38AwD7PUzPZf7jXhvP/m84QVIjhuEEEKJN2P4GhJIXt0sTeHOW6LwFoDkCfdv+BuBT5k+aBgTWNWWWvRPpT2/Ybho2gCk9EL230nWzHhTB2wPMDqD6/vnL968rvgSKQ10IFrTpt/dbb4spMOiOz1a1rPnZtYH2bFdhAxAJ+hqoe6ccVw6ojCVfb6AzduWfWFpSgbLYizIW8l7aYbnU+/d/2E1sv2U26Ja/gigfQVwBHH7/9M8vq39UGRgqojIDzPqf974/9/j1VwE4Hi05erbAOAAFAlAUg4w1Kkjj6u8rArAhuN8Akvq+2PT9Wat/GmaH4I0nd7wUtZvFbvp8JsxKBxDC759O/uO5BcDjO6IWiQnQUXSghrymrJ5VDLYFLg92EWeZ/aeABLHq3lH7BgLQlCDybe88pdXS8UHufnn35qat99uN+ibx25MqqeZqx6lbQHEgqAslTL8sTtoOgNmqLxYAPu38EcqforVsW4C+1v7ZSkBj++94/u1V8Sfw4N+XoAKJdnoy1XOIWcRB2YOy7N7N2wBI2dX7xFHYA4iB5zt2s+gGRZK+ve8D2kb3rJsnTS12f/noz0+bfvm2WPfd6buuLP4r+x87gNXj8InlZ7KfdR+VLxItsw6w1uffP23HaiHin5/9ZVl6Ed6LvgYbAkH1NHbBQl4u01IOVvkxpoKxD4Rv6X0fXipgi7oHTSteJO4LDD8C/A7i78tc9BVQvVPajfe1myr/c72UO+CipQkTDEX+8v3j6W3R/Xh1se7XXwFRAT/fAvAH0IcPIBgWWQO6zyJllmC+Nnja+3Wx9zNDEV8IBgGLQs/Y/XQfDKB+9hn5wiLL7SV70+rf2Fes/eXDgBZUZ7bItv+qDYDfEPREwIqAGpZl8UW8tb7bd2D+XmTRMg1+XV3ewwG0nd2A1bvXPPQhXpZ3QEuNFwIHb8RuvFQF0BXLkq++CDrYU5b+qTv+ukpBBb6GmmV6egM8smgvG5TbY0EOUPnPmvJKUHXQst+y3E9TTev6BcAO0LZ2lnaAmvsw+qijcw/ob6mVZ3CWcR3Q//uo/2+UAYFBEI9efYSOwJBfFrWBfKXJ9gMb7ZIbgK/V+9rL24sJD1A+S80VC2qeqPu6EkFFrYivJAjWJivb5+2li4Cml/Xt0nBf/ejhO/nLxtsiHvjz8f2QAqgl0Nyh/87QTxNx9RMunwR64eBlMGu6j+4IRKUCxhewyoV7nle8eOdZykAtFKDreotgeFUFGP2eo8XtmWUgr59kYS/d98UZung+bFfLYcgyQz8Vz3XL8a+Ufb6CDvgsRUAZ2yfmFvH0bPQeGPIAtbUlYLcGZGdRsEPcxu9jS1aG7bfXaPQG1lqqwHsXwF9e7PiikS+LLnmJzxfOnrMK6NE2AJqmnL6sAOV8MNCXP1vQl/fyX6aCd654KW51KfbFs+hl+/v8AEQ6KHPfLt4AhrMvH++8BWDTV1gAKoEwA9F+idAlFC+7Xnu/uR+k9R7Ep8wNSxCZ70GQV364egMxVVdv8bMJfF1QsHpzvw3AUmcEkv252tsilf3uhbs3twlWAKhvVTz+EeTdauoHgNJq9QboIMjsEIBlGRRB7YJeAEj6a14R31+i+vv/nycw31+qGkglJ7MXsdGUs1+8taAw2vejiQ+a+XF4tvo4PHtRKOggy9i6WswOwT7Lu89FV08OWPL0ygIKCghwH9DCwOzf/gIA+9nxuwfI/efui/3F+QV6CaVf/vIFBAqo4d9OsHDljts/rqBNwur6+y9f3hdu/LdXBbxmInz11DwtSAmXAZgU9pPhngc4z7Oi2AWpibNvK6ZdzSUwH9R9BSp3kfDlQiYfYQDjhf1zWYLCavsKsN5yRglKBHjbLrNP0/nFjwF1kXw5mDmATCueFQW2zKv23daf+GV5femeoHL/Avi6e450KLZc/mN57w/HBzb7f3S/vLTG91//AKAE09MzWd9/On19X/t1+AckXPviAa9vXgdA7/D/OeEfle5Mi2AG88trKODBVVDgS4/49tMJFVCUQPY/9cPf/zi8nyv9Mfzt9PcnFFefnw8s8QmBZgyLcoHYy76nbYs57VORP0+lFh7ZlHkOhNXz3PjnozD4b23Wh3+Ht/dFF222X3NvaXSg+grX/zH1Le48T6reAd0uB3tls5BA6j8dXhL65fnnO5csfeZ11x9/NK6fbHxNbfaiq+IXHgB5eu8D7jtVvZ87/F6QX1fn6qekP9H1PBj+/P2nI0uA0dWLt5fGv5TFizSWXgcmhNdYBrjU+6B1uSgfywE1YJjV52chuQvL208ueU4xu/+zTkU97Gc+XTL5oXmX8ljk+dKRFzKEVh+C9MkTy6Kn5/n5TzLlfcUctJDp48DiJVra94Oup+eAzb+8B65czt5zAJ3ngjoYQT/G9h+j6HOeBT0tyxablsH58+bjQAy4xLkuoJFfPnANptjXWftzweepEQAJ8O3tYzxetLi3xGtZFxAOyJhvN6A6m9fUWP+QMoBaCgDL508FQCN5deVN+da+eOt90l560wewvr2OysEU8eOA+fvqVZCrpQoXInseKnlL/v32rwuGFlvKAqT0ea76ur56H13dF94XEIItgKb56wuNby+gvoL4J/a+Po+zgbvtjzP5RU2//8Rmican9x/2+IDi2uWsHoQF6IYu9p/fPX8ABL7+5497+OXHSB8HbN/fQbr8XMH7OIjySrdfTlnBlcXkhebsReUDrqDwxapFAIOVABqAY5/+9a8vnz6ayutHCe/3yyfEPoHbwKkOxG2xZvluaXzNsDz9v5/aFIBh+R+HIsA7ItFK3OufDUyhJEbQiX44eD5OCIZ+CtuqrlBJj2Xhjnea6MmWFO/vclzxOX/LCOww7gciQ6j8KJBty5LiNXnwYwJtA3YfEFmSMnVN8wRmcuc+okY5TTqMlsK7jDqt3dxtldr65Qbe7tlhDlGL4/1IUUdLnt3b4TgxMuFqrhFx1NHM4plgpkubTROwGdeE6FqEUerkEnYkzfC6jujAH5BkGr3r8TrA+CGgMDg9OZtUS1DkeN2lmq5BJS5J8eFygKJoSvfr6/rmR/YByaw1C9/NvOiVDcNcGo0rz/oxmVQe40ejPO9jNCZi6xpKIRG7a5zdSukkPW4yheMxsy117oxX82EUt+a24OIo5Xn0fGxVaB36D3U76NeLulPDq3BLSFiSjUeZ3g5IFBCHe9+p0nDZIPOml7bVLd9UeFVuLySBmJJQ9NjawjfHKLjKtLDfZmJIimiKn89ltw+oio+b8YbjnAHDFfJoGVujXXF/k5yzbIgn2/LL0qdhRJrDcJQyCY+TA3PYViEy9lE1BptmgFn6ccBu9VhAbK4/ZOdBeCBoIpsVaZ7uTIJX2/0dJhxvH84msZduRmoyAQy1qDECKRYzgUiz7OmyufMzG+vhTYRJyTP3CIx7VVBUN1PtJOoYaGPR5KeKho42vD0S9KlAj/FkIIMnRX41e6VnRboHbzLGu1K3bF2Wt0smcfQ1UpOC8A2M0oN4DqSwv+dat4ZFX0IHh7nadoyl5w5dF3rFsAcXFs9NRxnb+pIS4Tht12zWWagkw48dK0V7nFYGkS7XirKBipliz6oQa8ZZPLrBTei1gITEknd2xlQZI68YRAH3e3y/bSx4Qkf3gMFoCJuNI9hIu9vBjhFFZ4oMhhlhe7yhOI96uFLXro/+zszz+hDf24eo80TrFBHq5cKJkdKO6x4Kr4SCnFrERt7DU1Sb3nVzMqItSlygKeSuUMsHFwt2D3fmyKw3eXynko2CX5oxMkWafyisril6Us2ui2IMR2OM5YWT0FD5YSCm5MQd4YMyNgSZnoMiv+Bs2U0bm2h0P99Bgy4zohVxx9KXhO2uKQp9hs9p60h7bk6vE/D8nMxaKBuZyUzRTmGrmbmK1iORz+KFafgmXFsOi88btFPatX1U7KirWbmgbyAQW7QHJbAP+6aJJHimpImEoT49bH1/R1O6uYf4TGTihuUPeHzbPCTtkZl3U73BmLnlkTn2DtI6VrYMqireJkJqucW5x4GoB5gQhcdRCtsryIuvo2jE6qznnExunGgi2G2l21bQa2R7ro6esjFMtvFPV+gx9I/ZhY4SJLMbLlNmanvllGzQN/wcNBT7YNaRUXGeLUY4vt64Gl5VUZGZgSXfuDQUKddVQkVrJYmL4m2CQ1h23W+Kx+nWF8lYcmO1nm38pFl0sO8ZsT6eT5fpTtnmeoY1a9tupGq4Xgt+GnvkpviqVUMnsV03x90IdntAfXzm54wN/CZSt2VkJxihX2B1G+umuOa3cCfYduauLYGQYlyZQ/MhJnBEbS6haJd0JGv1KNEwi+FMAXd050nxRIdGl1eIzJP3MduuNes8szSBRtQQXy0yu++RXsrQuXSLc3wOj9WwsR5bJnxom3WuGM2Dy5Bjqsy4dgmoR2TO7bYpvdK2I36S2f5s7/s1ym2EWuBpiBU79UjKpboTu5JE12t5w+AwDTq3Hif3Idh4mzZH6YbxNIe5z0XcZ0iejBzsCpiSN801rNchxKfJnMSDSBacf7Ain9j1MBmC/rrDI/bELpGA4nkrVc7l1BvAMsUTBc7fZdRenkvEEFVW2veOIZ63dVFEG1SSNtQBuE5ImdCjsSbWjvVY+9llU0V3DVIdZTwGU8SHW99eh9ZeF2+hmzw2qhlu5Id5f/QM57ZmP+9KwzSlPaNcmLEXiP3aKpFq2Jpan2d6UM7WJtwrxWNzUGURRAEKFCHmshHks4a3/Tzwj9ildMsqRLLqaFAFicHKoMWGOPhvrZa6055vA/Dp2DGjkHe64t8An6sE7Q9LH4PxhB8S3BiDimZC0Qwy6QJ1wn0Yj+fQ1QzN9AlTu4XnbgyOGsp3hFOva4cupcn2BuF2I8cdaETEQLV2yAlSKlsXJYHQ+ODm647xW1M8DQ9hbdmJXDRMU28DfcDJWuOcmGOUbURFUKEpm63k8P6EsrQqs6ZndF6UttmlUa4n9mbyCcIbl2CvCA2NYpfA7ljoYUpjIa73BY0ritFTm+FePbx7gwToRecydWjQw4RygVRXg26E4eHa2qIdYqw8hPtLWZ9SA9tkB6ljh7Ny4LkOY85cfik57Wojek75PscKThVdLQ0TGHigkRvySLYhUZNbuuopeFdHKlpd6L7BHpAZ8BaqCZeKuF04RY807ZTt7uvt7rFmbqi032WIBmtbhWErGEau3KbKVReb9u6cs+D7k+LAKdUdqGAoiJtk2RdIY+HgJkLboQ/TEy6taZqBzuYJg+mqmnMXbTWrdnrLQo5rTgiZaQvFl06WDCKF2vXEqMSaxRtucHDNg4u15GGcYJX3nQj4wULpWh0f8LHmNYVCr7oOP+qLefb3xGbTSsepPcllE/cqG174rABdPqBxzOXE/dBy7qgnU6xuONkjUzA44rwapSPrpFREH+0G066d6ymW3huaRAshes0vQnu5ZHDTHWfKdcKNH/Pz9iK3HrymWH7abdRgl6YDXW66TQRHPG+QlWy0J3xApPBynzobtitLTXo62573los2KQIUUcOkxykyWr466Gq58Wn62Hqsr4NauW0amTrnYj/PE96rzRWnYE5j/FmZDtKwwaGAwlXaZKuH3SYx6Wk5rWln0DCZNT+jcJ5p477TFAMndjUapua8PerE9lJ3+Da/MPFBufDH0+54B6rqcrw+ILx21YvjoONMqQnOnYwCFjPpiMwuIzbIRh/7awEGceyG7mbUc8eU60HtOcODLmfQ8z36+LBRkzFtZBtwJ9HuigeHXN3NBfHjkS93WUQQMlCw+YAbjUDPzGkNUxpMSxy6DYPqgfVmtudhXEwtL1g7hXxxmCDw7QlmjR3kXhqD1IWB5YILpz4Caidyzp2vzerAS7dqZ1kzl5rhlg+jA/U4W6N/AsIylPUWs2T/6to+hyKXCzwfqPmhcmwiFhdO3432Tr35epJAKZfC29Etm51jPjan0wYN1/F08yDhGjsSt2mgQYgTau2X/OlxskX9dkS1SxJy57yCSPeI8Xcc3/r7G19cdhuKP8cWUXAqFZRTHEDMOQ5gEicS3FbudOGyplBc/Z1adykJx3dujcWSdxq4ETvU29Rd58JuraGlQO3398seMaBMUglVQZoGJROo1AbSN2vHZE/bW37ZdnorO4Og3gBDzjHQhRymBshjv+b37TkS+p5lxzuthFGOJ8dLvr2zuHJR+P1xi3HJBXV4dntKPPW+uSNstCYrwnV8Yo3tjpsZy9S6ksShITpvBCRBXIROfpQzx82NtrErYTKcnVq1QGpBketpwjq+PGpoJ5AXtJ8i56gza9W+XLVM46D2YLbD6UrPawEi5WsA1HO2ts0HLmPiSUSrWiaiKHJbEasqTNrUYkSFYJDj6gpjgnjHXViiIv27COEReecNnSphqiH1R1wDhma6ThQhye/4s3ZcSzzac3cYzgKtOEQJ5uQct72o47pY9/sYyA+fNVqcPwS6H14fQr0BcdqSLoaFY0heuSGur1LXUM58J0e2zO+Q7K6VEipPUBeZG6ozM/5e2mS+Vy9cr9OCEThnPjkk2frCzfusujC0PZwf3E05XNfpRW446AytCxFuPJt2GERT1yKc47kPcUZCCF45YqKGNMLNjo0yb8+iEAoTwSnHtvNAf9UJFTsYodix4q3f7g91AkaOzdG+KT2xs28NGRAjP6BzeJIRqXicj0moomCmhJjtuk2p9CBSeh7jhC5zegkQCtgQRuZQUa2LkO5lAz4bw8Ug5uO+7p25QJlQidfqQAFTJ6SZG7IrXQhFA9EhyWBnS3ub9/fRRd5JekWlKafqazTe+ikasBayJxOLccnTum+Yy4O8EVeIwwQxPJ7MEvVMtSIKAdGUgRofMpgSm3m3Dk8GuV8rLhdp8yTt16k8INBe37vCkZO5Imwaptx64Rx1uDJyEh6iTkFeKpHZ7VtKAloKFeHEOtFznhMiZwSXDmIfZXTwgyHccqZJVS6sYEEPG7sd0hfpOq00rNPx4mYcXMZUiLGD4Mw5TY+01Mgyc0oND6WrOVow04vYtLkEMr+mKAem5iByzWJugiiD9f509mUSDjfieBGuJHEBU/aZAFZuivqG3mpqCOa1ospSyK3vGo7eoUHc1zB5oPrg1Pi0Ix5zc/IfSIsfzuEjldTBZD1ow6OFx/HdLYfOZXszzppxXzN3C8x+8JCGG/aB541fQh2gwZ5ATfJ8Fize2K9ZoPOaYxYytl8CHp+vRwjeifzJk+qaiQqWiWFZqg4uFyMeNzodYUIhkhEHU8gbxEokLmtMu4NUrmZ0rWy5YDT2vhy7mdPg6UYdb4dgYhKYaWElk9K56+nd0SBGvLRYVD264AlQbA0UejMF1ze2VDaPEygXzsdZsl9f8ylN0D6Fmis3x5Cibw3CS1wu3a2TXTuyNKJMLJwPRbyLznAKeaGr1C2kslCbn7moyVvuXGBD++hmEz9fYxPWO17m1kl3pUTEHy+N9QgP6xOx5iWeldT6MKW55/f4pEnIVpMwuR8KeVugMopuG+MWlakfTmh/7BkJ6g7uKMnlSEouteHESz7UibsWwK7V0OhgsLWuUKKEa6O9RdYGhmp78rUHc03tOVS13Q56cHavFmDI7tbV+sSKdMgfDvC0DJY+50jiTgsk4XjJNlF3YMxJEga9RgMbn6VzaSrBfouhzNq83mu03oac6nDG0B9Uk8UfwYalZ0xgjYBitPqCli5XcTBOw+PaxNaX8mZHZskzlzIO13aAI+xg73a+URXQ7lLAnF7QxKWgJPtsMY/OoDaRxPcTP2mPqoObMC+GwoHhrhe9CxdujnmRwQFgKirhaMiXhhHmTabpGg+EeO14/sCe2lqe12PQdKbIB5wWMid7y9qcP6AaBiMOrIwO7VU0/Dg4AVw0CAs/9IBSWleLW5NuYdRogVI/CMVDhhUk9XkL4w/7igNac6C73SnaXQ6trN4zYabYLlmzI0Hh8MY87LumrDc06XcHOtqZptsC9jACjZ1gHkcVSGnECQgWWTHV4KKdtHQuN7IPFxAGUa6iKg5SzgdIJGQ7F4gDty9yZHuT6crLFMgwyRZKFT/2vW2l1UhpMndMVnHHVbWeoowbc95V7Lnqj5qTbYnWCBhnQM+NrDnWdjTaPF207wS7vtnvH/RY54f7Deu3lE4VlzQKAiiWL21pD1c4MVQI9da3dJt7xtSI8ICg98FRT3BNeg5DxIFm7ONDbl0sI7aO1whldROlsHRD000KESx6f6i3TMNMP9GvDc8UvuQU3kG8zCred73S2N79ttMZTb7vBJZMNbL3eLkq/NN+RBo8D/mA4I7OrPaJf6WvthU9DH+G7Qt1dQXJRSpyvDFqQotOT6fYfQyEzjqgFHXlnTEKxHmdKECQaVRr+Dtv69yA/HvoOLatNmhSigImXJm72c47tiTv7V31gPQeqNwuBlgWeJJuSpjGSNrx1UxQYaOabxPPontjmu7SfkAIGOGuwQTExJ3EcwE78ZBXWmekmjtSu9M8heYRn9mZrEV3PjlpuDsd0YdldR7c30sJK+gu0dms39bbYQcmazN1KN+Cri3Q+m3B31Cjhzz0eo6Y2Nkkvra5+1SAWRTJKia1VatYS09OutlLqGAaAG3GPTyiDkp1x9vxBB+4zme7frwh9j48oBJ+HiwjQ/TbcCfo/WW8t825xgblcrpp8GzYfk1tL9b67F3neuwRaFuV1iXSpqT1TmkT5d66MIM22jNBr+riuSUgkt1xdR2tr+T0sGE6Z7XqZDbHdWfi4oindzLToUI5yt6DygZvRE/lGfO17OTSfdCjU51ZlJGIe7VAiLNiibN2f1DIYIaJfmNFZiiD2KQvtluoheMfq9ZGRQnZbXCRNoubVx4b86BeaBhT91dYYvwbQSOH2L76Ni4eypbRJvE+ULbKxpNeZnJBQNiD8U47ArCacLgkZVUI2D25K2MjAmAY2+lMDOU+NfjKLofCF0uqZnWBwYL7tol0oh67pi/O9yxt7cmqMJm43YbgnE2IFGf3w+wW1947HzVZw0mjY2q7nR1kprFp2qxvynwjZmvGbFzexIekZTGCbSlykwbaZafHlVrYseype4sRcFQ40SKo4uBYk0cPQWulbrREPKktfqxidjsh11w5t8He21xpVYT3QPo2l7rVcaABbmtXifHLw7hv8f0m8WYLi9aEdk+6M/p4NCKi11kxoRSxbfZsYbJ59LC06wRT9NneyRMRGu1BESDkJIrqVoM9BlEtaqCxa1hVJJPQWkrK5dXoHLhi5DQ/1sycPWbipIhVWFlNWzH+uov2cqe5ttpsDhZKDg8/95iYJ2AHhQZ9pC8TmpwAJ+B0UKIc2l9Jcd+mKODFifccyzooGOruWWI/9YcMw8+deAc9U4lcmSnvE6Wr5InwmYIhPapW9pTjJBaYu0P3pvsFPbJgz+YIOW3dIF43IVqkM+Y+QQgehz3Vc7GjcXY2e6UjjoPBpHRv46fNZYZAr25tUS7pHIL6KRsZwsjNTlE5kMI6X2ORe9ATBRPKGa7nbjxJR6vaTuKh0ORruqdPhuXnMd3otjzQzHEz3LHpUMxeG/YPtwcJwqgTKVEdnV9SuiJzONjASYhj0imXtRa+MYTYJ/K2peNhnQZm1o6kNx/Ju60e6ciMjtTBSyliN7KoexEqXBHOE3xNrmccuVXF1lk7sr03g/uel0VtVINE5VQMnQIKJQZcVwUkqB/lNM7YFfLiqUoqMiOGO3xH4CZXWzSOnZn0m7UobcuCJGWq4OgakveHHe6zCVORwxx77Aa01riLd97Ba0SVmkLoPKe1MaMPehfPltzvqUGrwromlTHvvFg3EdGEJVLPmLi6Z+eN18m5tbMwodUuR9jUI95rDbZeMxaiyxQxRYhRZQ6CVrZGHo7Xu41BmgbluWEQyO4+PwZc6gaMOXDEbdtHxZ4YxCOWpslYxqjWQ3sU7SNMQTe7eTp1fcT0SV2chyZ6OIKneL6B3pFwZzvpWNRO77pa3a99xEZtCx4YMu94NYWG6k5tqZvkVycMDrzN3sDs2p5ho4OPY3d5APDfNtZ06KrpkB2gx67ChXrYX6sETcOjbelXh0mufCwczhiqQofCN11SFceJIrW9I1gyPJwI0Ec7RrzJG4u+CdIIP856EPBO7UqBVcMRHahVfUqPeI4b8JpG5slFq+lmW9LgdUFWHIBvURsNHgvmGdrg8uuMBzokb+f+tFd027mcTiccmWZkNim638YSm8sxsvfRDlev0hmq251wnJtBlCtu7IdeMajT5trhNoQPTVrZCjElGi2IWK6YqFflx2EMeuCSLZZAe9FNdwwIZSLVmCzoXMsm+g4cV2LmTgwHYj/4yp32jg1vGmSjK+YZcurOKmjXOpxiGDOtU5bsFD7zHUfKepnoWMGysGB7p21pugo9sr47ia3fUVLIqPHmjyPae7eo306Bew62cX8EbYC+JxMypirc0TenAyVxq2oXiy4xFc8X/Cbtm8q4a8yshIlFmvjd4aqLSSi0f5myI9WUHnYCkmgmYOs65tMGu5E+ZZqJsz35d04/nG7nrtDwC7QbfRIWWvJm1FSSFG1MzbsrdUMQ84AqQuqtzzgaELVbiSrvWh5qUmKIXw952A4Zre7Z6rqfKyOemwreD93VTR/nKE+mQRvB5BLM58pGd3ex6ZG68yDFVXl7jdo7r7+upxj0/8Y3BLokyq6B+65skV2rysZpGLMjNvbMiZuz7NyXM6KBtNT3WPdJSh+rCswaNnLel9RJXk/r4sChJruZ+dphrNG4j3XGnIdrXHmy2jMBVA4H2YkbKj5UWV+nOoEdJmOvONTQXzVWog31lkh80tXd2kN1wKDSNbvksFbOJzXBB69QwFjSAW4iL4ys914nItJYKV1EsfodI7VC3E7rfmMo2o3Apx2QZJSZs2R5qnkIXj+O+QO1t8PGsa43zJE7PnUmVz0U6eZEQegldsiA0y8B3d6yPlIyVmmmsycW1x3bGbhnugYKu7RddrN1xmQGsNucZML1tjtQJFb28d2edepugdHDNQ7BWRM1wseT3ho7Z84D0XI9vOu8tSVoEVsgPYh7M7lT5wksdpXutFDsZS+2tWRm3XC4VsHo6dy+cgXvxEu5ClWdYN9wVwe51ylKZFFsanivBwNV0Ys+rUWBJ5jOjMZSU2hDyxoYLfRAcAZHkqdumuVNlKPcJKdl75CH52oqSP7usS18KiOCq9OV6JqV0CzjBrQPMdE4HM7qXSVVvu+C4mTYrrg/QBCJD/ykDC2YUfQpUEyxnLNmtxdMa987xyFTjZTZ9Z5bBhalW51888jsWrZOz2Ln9dbEmPxI4novmt0ROpyKlk6ONnMmQqp2xsDNdiSU9GtS9fBrlOFdIRNICukmkG6USQlBq3nugIlqwm+YtjuSdYafksust/FRO5GNsZ7rhtHQA65UtR0VVOMEiQvxAhiBLjNR255WMpSZDvckGuHTeDDsnU5cK1xl+ZRxdCLwJ4eaKLi7yJl6UYoITD3+QS4zk5qbM9valYDkxcUmMvSxDQ5eLV5tsx1hhLcJgI1GYu3DsWDjh3+fj1ORJdo9gxRcG73rIEcU0ENoIPba+a7nyLGYO5MNkvlY3c5gBKrObiJG5HaPZC5q1Tdn4xvaoz5l0XGUtrg2Z042zHNyUbXj+bQ/RJ18za/xA3Guck+rdz2RuxsPZ/mFnYwBU25dxg6JdchsHUcyOb0lNGB8LSk9ujoh03m++fyx6szdlalOk8NQOAkJe21XnNnRFmryQtdsrwuITTtuL+Kb3EUy1EQ0oquDguN7I0w3WHlwh4Gt2hpLhuIuKIabqM5dUsqhwXR9gC5V9IC1ovQGszxp1qYk6GzGRWum6+ohHlvOSS2AsqKTbfhG6/cw64K131oDCTTBPm4jvUP0JBL3YU+YHRkeC0v1REbOnJsN0Jjrghlhzo5isW4PgX+rLXukrLua0mKZOKqTD7ZG6PhNnoN8KulxjVEldudnfZ88ykuB0OdAQ4K+Uxm9zpuLJXu4dWf9/EayWZk7hggmyUkPM/KcwnmP0XKx2QLOiudYtIutnN7L+uR78y0XdPw821eSPvft/UGSQafxntthaUdejNZA1Fozc8wxe3xD94ABC7jZB+sWTGpkFrBZV3jkhPZ5u7Z2V19NzbgyZHVSekVe53sCaqv28WD86D5pDUaF6pQa2tZujlXVjvWgXwzBOqWFpvepNt325EHbIy6tnUPeobX1LSxYb/AfYhcLRz66QWnps3503e4a5HiHZ4y6phh9risoSUJ/M9TtxlrbRHO4we28t5mE73yPEby7OODIpT7dAvw4n2X+eBwoy173uHGoevuI3O9zlx6nnoX0PZ7e5pBsQ52A+Y2HJg4tXPrzncVPQy1ya7vd3TN67WoT0Ap5NLVOLhT3UhV1JqgOPZpN/NGTs8k1LYvXVfZqIQ9O5iodNrv8Jh/Pmz0YU9YEFfiaf06T/QajSNNyUz0oBRF2pJROLzfjWCSjWPsEcTm07GHPIXo6RTcEzx25ReKpPe273KY6ISdyLCkqKhzOaHQWhbF73HZ0LuPK2B1m6Kj0Qmga9/uhsuvJeujr8k5VOTta+J274D3QP+tQgehCE6ezaiCsoNdUdPCY64PDFYXOim6OZuGWKQforpVU0AItXiYkeuH4ffoQhKZ5sMLGKqwRZYO4ri5k64zHxB9SO23YNGHG4rILcq6aPes6tedwRMqksSQCBgOZmh3PSC6McjkpJ6ga2R1CceH5stU5RsPgsm4brw/WFV3BfCxOZsPeyIz2CbTYHqIpEUCnwA7sBbHoPd8fof2eLanDBD3q+DFE6cZEfPsgxHdpC+XXCjlnCJHdRZMs0yN5tBCou2Wm1RRkkVsMub/2wRhm9bFN6a2AyTIs9zqdVPzmKjnnzXqfjT27SyfMbq7n+07Y74fzmWyB8GHAFHoCzamHZ/sUwoU8uCaDq/TeOrYDtkePpxrbCYQ10iNpPYo9G+yzXq0IN1W39RUUDETvzC5sc3qw8Itb3HA9S6/0KVOwjkxtRxaAGK8x99r4uDtfvcbfOyiALyvdk4d3Smt8onbOdb/dSNiN0kPtRB3EIo2wLcq0bT9pCYILEN1hwjAZGur2mAemQ8GL/YRWR1wowFB/95w0wuWu2MEaJtDi8RZG0jzaRj1DXSWcm5o5N3Dg34BCYbfGbFAMYJb5SgH4eYIVK9TV0KLGnDeMGD7YYdh3fnOKcHFqW7W4KxhWoKfmilE5plZJKh58uu1nAiuM6w7dl9Vt1m3DxQQ3jhx5nKdybqV+7QL1pd2khJ50oNVkbId3WCRDGTOcHVeNuwrItPM69Q+TGvtrj/PKgayCQM3Cvq2EQyOu7+iFuNkTW57uLDmpVzYAS/Lsrj1r1LU2pjnK9MBpULje0SKz7k1cqB5pz3Hcb5++LB9z9N8/GLl8mPFt+d1FGL7J0uHwNfeWv7Hg+eur4Lbj0oRHIDaCIriN4R6L0iiFBASJux7rsaSHB7YTYA7mMSSDUliA2zSNU56DUaxt4/7zo46vX1y3Cxds+I9Pyyd3vz0/w/jtpx270m67b977Jy2fn9Fsf0NXz7864Tf805f/j9dev2TSfXv7++tTkf8ED7oxMBz9ijxfev5CXtlMH58HXT4n/bPbi7MT2CX/+LXGjwc7O3z/ax6W32J5fRAULAqW/df/A5zs/bBnRAAA237```238239<!-- toaster:generated:end -->240241<!-- rci-capsule:v1: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…(truncated)