{ "cells": [ { "cell_type": "markdown", "id": "dtsim-00", "metadata": {}, "source": [ "# `dtalite-simulation` — the third EDOC row, the first DETERMINISTIC-track external engine\n", "\n", "**What.** `dtalite-simulation` wraps DTALite 0.8.1's mesoscopic queue simulator (Zhou & Taylor\n", "2014) — the wheel's `simulation()` entry, a sub-second queue-DNL map from a plan artifact\n", "(`vehicle.csv`) to an experienced-time artifact (`trajectory.csv`) — as the third **EDOC-1**\n", "observational row ([ADR-036](../../docs/design/adr-036-external-dynamic-observational-certificate.md) /\n", "[ADR-040](../../docs/design/adr-040-dtalite-simulation.md)). It is a DIFFERENT engine from\n", "`dtalite-tap` (adr-029): that row is the wheel's `assignment()` static Frank-Wolfe on an\n", "exactly-mapped BPR (certified against the *declared* cost law); `simulation()` has **no declared\n", "cost law** — *the engine is the instance*, and the certifier re-derives every scored number by\n", "re-running the pinned engine on the model's emitted plans (G1 replay fidelity). This is an EDOC\n", "producer, **not** a `TrafficAssignmentModel` — never in `MODEL_REGISTRY`.\n", "\n", "**Score.** The engine is **deterministic**: its only RNG is an LCG re-seeded `101 + time_step`\n", "at every step, so it consumes no seed (`seedable=False`, `seed_list=()`, no macroreps —\n", "disclosed). The score is the single **frozen-field best-response gap `RG_D1`** — a door-to-door\n", "quantity on its own leaderboard scale, **not** the Wardrop `relative_gap` of the static rows nor\n", "`dtalite-tap`'s `relative_gap` (same wheel, different engine), so it never enters those tables\n", "(R8 non-comparability)." ] }, { "cell_type": "markdown", "id": "dtsim-01", "metadata": {}, "source": [ "## How this notebook is graded\n", "\n", "**A notebook never claims a number it does not compute in that cell.** Every quantity below — the\n", "negative-control separation anchors, the certified `RG_D1`, the resolution delta, and the\n", "boost-window censor — is recomputed here by the same substrate the benchmark uses (`EdocEvaluator`\n", "via the certifier-owned replay runner). The model emits artifacts; the certifier, model-blind,\n", "re-runs the pinned `OMP_NUM_THREADS=1` replay and recomputes the score (a doctored experienced\n", "record diverges from the byte-deterministic replay and is censored)." ] }, { "cell_type": "code", "execution_count": 1, "id": "dtsim-02", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:25.968155Z", "iopub.status.busy": "2026-07-21T13:56:25.967819Z", "iopub.status.idle": "2026-07-21T13:56:27.979805Z", "shell.execute_reply": "2026-07-21T13:56:27.978697Z" } }, "outputs": [], "source": [ "%matplotlib inline\n", "# Setup. `dtalite-simulation` runs the DTALite 0.8.1 wheel's simulation() engine ONLY in\n", "# throwaway subprocesses (the wheel prints a banner and ctypes-loads an OpenMP .so into the\n", "# host on import — adr-029), so availability is a find_spec probe that NEVER imports. This\n", "# guard raises politely when the wheel is absent rather than failing with a G0 error later.\n", "import importlib.util\n", "\n", "if importlib.util.find_spec(\"DTALite\") is None:\n", " raise RuntimeError(\n", " \"this tutorial needs the DTALite engine wheel: `pip install tabench[dtalite]` \"\n", " \"(pinned DTALite==0.8.1; see docs/design/adr-040-dtalite-simulation.md)\"\n", " )\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from tabench.models.adapters.dtalite_simulation import (\n", " DTALiteSimulationAdapter,\n", " build_dtalite_corridor_scenario,\n", " certify_emitted,\n", " negative_control_separation,\n", " reference_scenario,\n", ")" ] }, { "cell_type": "markdown", "id": "dtsim-03", "metadata": {}, "source": [ "## The instance\n", "\n", "The pinned reference is a **two-route corridor**: `O ->a1-> MA ->a2-> D` (fftt 2x300 s, the\n", "1-lane 600 veh/h bottleneck route) vs `O ->b1-> MB ->b2-> D` (2x420 s, 2-lane). 1000 agents\n", "depart 2-per-6-s-slot over 50 min (1200 veh/h aggregate against the engine's measured ~600 veh/h\n", "per-route transfer-admission law), so the step-0 Frank-Wolfe split piles the transfer queue onto\n", "route A and separates from the MSA-converged blend. The engine identity + version, the `.so`\n", "determinism pins (`OMP_NUM_THREADS=1`), the 7->13 h engine period, the 6 s dynamics grid, the\n", "boost-window constant, and every floor/deadline dial are **all inside the content hash** — the\n", "engine is part of the instance. `seed_list=()` is the deterministic-track disclosure." ] }, { "cell_type": "code", "execution_count": 2, "id": "dtsim-04", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:27.984658Z", "iopub.status.busy": "2026-07-21T13:56:27.984409Z", "iopub.status.idle": "2026-07-21T13:56:27.991772Z", "shell.execute_reply": "2026-07-21T13:56:27.990999Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "instance : dtalite-simulation-ref\n", "content hash : f3bf543b1fc21e08dba9c5078d0114caea5ac26fcff9211c6e61ac6b9362d7c7\n", "engine (pinned): DTALite 0.8.1\n", "seed list : () (deterministic track: no seed, no macroreps)\n", "network : 4 edges, 1000 agents (all O -> D)\n", "lanes : {'a1': 1, 'a2': 1, 'b1': 2, 'b2': 2} (a1/a2 are the 1-lane 600 veh/h bottleneck)\n", "grid : dt = 6s x 3600 (6 s engine dynamics grid; departures on-grid)\n", "declared : separation >= 5x, floor 10s, replay deadline 30s\n" ] } ], "source": [ "scenario = reference_scenario()\n", "\n", "print(f\"instance : {scenario.name}\")\n", "print(f\"content hash : {scenario.content_hash()}\")\n", "print(f\"engine (pinned): {scenario.engine} {scenario.engine_version}\")\n", "print(f\"seed list : {scenario.seed_list} (deterministic track: no seed, no macroreps)\")\n", "print(f\"network : {scenario.n_edges} edges, {scenario.n_agents} agents (all O -> D)\")\n", "print(f\"lanes : {scenario.lanes_of()} (a1/a2 are the 1-lane 600 veh/h bottleneck)\")\n", "print(f\"grid : dt = {scenario.dt:g}s x {scenario.n_intervals} \"\n", " f\"(6 s engine dynamics grid; departures on-grid)\")\n", "print(f\"declared : separation >= {scenario.separation_factor:g}x, \"\n", " f\"floor {scenario.floor_seconds:g}s, replay deadline {scenario.replay_deadline_s:g}s\")" ] }, { "cell_type": "markdown", "id": "dtsim-05", "metadata": {}, "source": [ "## The negative control — step-0 split vs MSA-converged\n", "\n", "`RG_D1` must *separate* a bad assignment from a good one. The control is the step-0 Frank-Wolfe\n", "split emitted as-is (`iterations=0`); the converged state runs the certifier-owned MSA `1/(k+2)`\n", "best-response blend (hash-derived switching picks — no cross-version RNG dependence). The gate\n", "compares **floor-displayed** values (`max(rg, floor_gap)` each side), so a self-certifying\n", "shared-transfer topology whose anchors both collapse to `RG_D1 = 0` separates ~1x and is\n", "**refused at construction** — this cell also separation-vets the topology, which\n", "`certify_emitted` requires. Two emissions + four certifier replays, ~2 s (no macroreps)." ] }, { "cell_type": "code", "execution_count": 3, "id": "dtsim-06", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:27.995894Z", "iopub.status.busy": "2026-07-21T13:56:27.995583Z", "iopub.status.idle": "2026-07-21T13:56:30.023637Z", "shell.execute_reply": "2026-07-21T13:56:30.022251Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "step-0 control : RG_D1 0.37224 (the FW split, piled on route A)\n", "MSA converged : RG_D1 0.05031\n", "separation : 7.40x (floor-displayed; declared >= 5x)\n" ] } ], "source": [ "anchors = negative_control_separation(scenario, wall_seconds=600.0)\n", "\n", "print(f\"step-0 control : RG_D1 {anchors['control_rg_d1']:.5f} (the FW split, piled on route A)\")\n", "print(f\"MSA converged : RG_D1 {anchors['converged_rg_d1']:.5f}\")\n", "print(f\"separation : {anchors['separation']:.2f}x (floor-displayed; \"\n", " f\"declared >= {anchors['separation_factor']:g}x)\")" ] }, { "cell_type": "markdown", "id": "dtsim-07", "metadata": {}, "source": [ "## Certify the row\n", "\n", "The model emits its final MSA plans `P`; `X` and the frozen field are defined by the adapter's own\n", "pinned replay of `P`. The certifier re-runs the identical replay and checks G0 pins (engine\n", "version + inert seed), G1 replay fidelity **twice** (the determinism double on the raw\n", "`trajectory.csv` bytes — byte-deterministic at `OMP_NUM_THREADS=1`), G2 demand bijection with\n", "exact on-grid departures, G3 completion census (from `current_link_seq_no` + non-filler chains —\n", "never the dead `loaded_status` column), G4 conservation, the resolution-floor gate, and `RG_D1`\n", "against the certifier-owned time-dependent shortest path. With no engine router the substrate\n", "TD-SP is normative-only, so R3 is a harness field-arithmetic self-cross-check (disclosed)." ] }, { "cell_type": "code", "execution_count": 4, "id": "dtsim-08", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:30.027808Z", "iopub.status.busy": "2026-07-21T13:56:30.027621Z", "iopub.status.idle": "2026-07-21T13:56:31.855241Z", "shell.execute_reply": "2026-07-21T13:56:31.853414Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "feasible : 1\n", "RG_D1 : 0.05031 (floor_gap 0.0118 -> sub_floor=0: RANKED)\n", "resolution : delta 1.75s <= floor 10s (field represents experienced costs)\n", "delivery : max backlog 0s, br_coverage 1.00\n", "R3 self-check : max 0.000s <= tol 15s\n" ] } ], "source": [ "emitted = DTALiteSimulationAdapter(iterations=16).emit(scenario, wall_seconds=600.0)\n", "m = certify_emitted(scenario, emitted, wall_seconds=600.0)\n", "\n", "print(f\"feasible : {m['feasible']:.0f}\")\n", "print(f\"RG_D1 : {m['rg_d1']:.5f} \"\n", " f\"(floor_gap {m['floor_gap']:.4f} -> sub_floor={m['sub_floor']:.0f}: \"\n", " f\"{'RANKED' if m['sub_floor'] == 0 else 'at floor'})\")\n", "print(f\"resolution : delta {m['delta']:.2f}s <= floor {scenario.floor_seconds:g}s \"\n", " f\"(field represents experienced costs)\")\n", "print(f\"delivery : max backlog {m['max_backlog']:.0f}s, br_coverage {m['br_coverage']:.2f}\")\n", "print(f\"R3 self-check : max {m['r3_max_s']:.3f}s <= tol {m['r3_tolerance_s']:g}s\")" ] }, { "cell_type": "markdown", "id": "dtsim-09", "metadata": {}, "source": [ "## The boost-window censor — an instance-design defense (pair 12)\n", "\n", "DTALite's `simulation()` carries an off-by-units bug: the discharge capacity is boosted x10 in\n", "the **last 720 six-second intervals** of *any* horizon (the last 72 min). A congested emission\n", "that finishes inside that window has boost-deflated experienced times. The reference exits hours\n", "before its 4.8 h onset (boost-clean), but a **1 h-horizon variant of the same topology** puts the\n", "onset at `3600 - 4320 = -720 s < 0` — the entire horizon is boost-covered, so the instance is\n", "degenerate. The certifier **censors** it (`feasible=0`, `boost_crossing_n = n_agents`), the\n", "in-loop MSA census **raises**, and the separation gate **refuses** it. Same topology digest as the\n", "reference (n_intervals is not a topology field), so it is already vetted." ] }, { "cell_type": "code", "execution_count": 5, "id": "dtsim-10", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:31.860571Z", "iopub.status.busy": "2026-07-21T13:56:31.860314Z", "iopub.status.idle": "2026-07-21T13:56:32.238615Z", "shell.execute_reply": "2026-07-21T13:56:32.237244Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "boost onset : -720s < 0 -> the whole 1 h horizon is inside the boost window\n", "certify : feasible 0, boost_crossing_n 1000 (every agent boost-exposed)\n", "in-loop MSA : RAISED -> MSA iterate 0: 1000 agent(s) exit inside the engine's x10 discharge-bo...\n" ] } ], "source": [ "boost_variant = build_dtalite_corridor_scenario(\"dtalite-boost-demo\", n_intervals=600) # 1 h\n", "onset = boost_variant.dt * boost_variant.n_intervals - 720 * 6.0\n", "\n", "em0 = DTALiteSimulationAdapter(iterations=0).emit(boost_variant, wall_seconds=600.0)\n", "cm = certify_emitted(boost_variant, em0, wall_seconds=600.0)\n", "print(f\"boost onset : {onset:.0f}s < 0 -> the whole 1 h horizon is inside the boost window\")\n", "print(f\"certify : feasible {cm['feasible']:.0f}, \"\n", " f\"boost_crossing_n {cm['boost_crossing_n']:.0f} (every agent boost-exposed)\")\n", "\n", "try:\n", " DTALiteSimulationAdapter(iterations=1).emit(boost_variant, wall_seconds=600.0)\n", "except ValueError as exc:\n", " print(f\"in-loop MSA : RAISED -> {str(exc).splitlines()[0][:70]}...\")" ] }, { "cell_type": "markdown", "id": "dtsim-11", "metadata": {}, "source": [ "## Visualize\n", "\n", "One figure, every mark certified above: the step-0 control and the MSA-converged `RG_D1`\n", "(floor-displayed), the resolution floor, and the separation factor. The gap between the two bars\n", "*is* what `RG_D1` exists to measure — a bad assignment (the FW split, transfer queue on route A)\n", "vs a near-equilibrium blend, on the frozen realized field. (`RG_D1` is a scalar on its own\n", "leaderboard scale, so this plots the certified quantities directly — a house chart, not\n", "`tabench.viz`; the bottleneck/newell/matsim precedent, adr-035.)" ] }, { "cell_type": "code", "execution_count": 6, "id": "dtsim-12", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:56:32.243211Z", "iopub.status.busy": "2026-07-21T13:56:32.242839Z", "iopub.status.idle": "2026-07-21T13:56:32.430623Z", "shell.execute_reply": "2026-07-21T13:56:32.429830Z" } }, "outputs": [ { "data": { "image/png": "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iFatWuHx48cFjoGIiIjoYycTQoj8Kmlyrdq+ffs0CsDT0xN16tTBypUrAQBZWVlwdHTE8OHDMXHixHzXz8zMhIWFBVauXIm+ffvmWz8hIQHm5uaIj4+HmZmZRrFq4mzHLkXWNtH70vDg3g8dAhHRf5omeYla17SZm5trJbB3paWl4dKlS5g0aZJUpqOjA29vb5w/f16tNlJSUpCeng5LS0uVy1NTU5Gamio9T0hIKFzQRERERB+AWklbUFBQkXQeExODzMxM2NjYKJXb2Njgzp07arUxYcIE2Nvbw9vbW+Vyf39/zJw5s9CxEhEREX1IBbqmLSMjA8HBwVi3bp00N9uTJ0+QlJSk1eDyM3/+fOzYsQP79++HgYGByjqTJk1CfHy89IiIiHivMRIRERFpg8ZTfjx69AitW7dGeHg4UlNT0bJlS5iammLBggVITU3F2rVr1W7LysoKcrkcz58/Vyp//vw5bG1t81x38eLFmD9/PoKDg1G9evVc6ykUCigUCrVjIiIiIvoYaXykbeTIkahduzbi4uJgaGgolXfu3BknT57UqC19fX14eHgorZeVlYWTJ0+ifv36ua63cOFCzJ49G0ePHkXt2rU13QQiIiKiYkfjI22nT5/GuXPnoK+vr1Tu4uJSoGk3xowZA19fX9SuXRt169ZFYGAgkpOT4efnBwDo27cvSpcuDX9/fwDAggULMG3aNGzfvh0uLi549uwZAMDExAQmJiYa909ERERUHGictGVlZSEzMzNHeWRkJExNTTUOoEePHoiOjsa0adPw7NkzuLu74+jRo9LghPDwcOjo/HtAcM2aNUhLS0PXrl2V2pk+fTpmzJihcf9ERERExYFa87S9rUePHjA3N8f69ethamqKv//+G9bW1ujYsSOcnJyKbKSptnCeNiL1cZ42IqKipfV52t62ZMkS+Pj4wM3NDa9fv0avXr1w//59WFlZ4ccffyxw0ERERESUO42TNgcHB1y7dg07duzA33//jaSkJAwYMAC9e/dWGphARERERNqjcdIGALq6uvjyyy+1HQsRERER5UKtpO3QoUNo06YN9PT0cOjQoTzrdujQQSuBEREREdG/1EraOnXqhGfPnqFUqVLo1KlTrvVkMpnKkaVEREREVDhqJW1ZWVkq/yYiIiKi90OtOyJYWloiJiYGANC/f3/pfqNERERE9H6olbSl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", "text/plain": [ "
" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAFKCAYAAABPSmitAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlPElEQVR4nO3dd1QU19sH8O+ywNIRBCnSFCs2FBU7FhRLbLFFjSKWRI29xPKzN6yIvSSKJRp7SzQWjCT2JLbYC0EBGyBIVep9//Bl4soCu7CoxO/nnD2HvXPn3me2DM/OzL0jE0IIEBEREdFHTedDB0BERERE+WPSRkRERFQMMGkjIiIiKgaYtBEREREVA0zaiIiIiIoBJm1ERERExQCTNiIiIqJigEkbERERUTHApI2IiIioGGDSVszNmDEDMplMq22GhIRAJpMhJCREKuvXrx9cXFy02k9hfMh4VL0+2iCTyTBjxgyttvk+PX/+HF27dkXJkiUhk8kQGBj4oUMiLdq0aRNkMhkePnz4QfpPSkpCqVKlsG3btnzrFvX+4WPbHwJFt18qDtLT0+Ho6IjVq1d/6FCKHJO2/6B58+bhwIEDRdpHSkoKZsyY8UnuIArjyJEjxToxy8vo0aNx7NgxTJo0CVu3bkXr1q3VXvfhw4eQyWS5PgYNGqRRLGfOnJHWjYmJ0XRTPmnvY/9REMuWLYOpqSm++OKLDx0KFVJe3/cdO3Zo3J6enh7GjBmDuXPn4vXr10UQ8cdD90MHQNo3b948dO3aFZ06ddJam9999x2ysrKk5ykpKZg5cyYAoGnTplrrp6DxFBdHjhzBqlWrVCZur169gq5u8f1K/vrrr+jYsSPGjRun8brW1tbYunVrjvKjR49i27ZtaNWqldptZWVlYfjw4TA2NkZycrLGsXzqctt/9OnTB1988QUUCsV7jyk9PR3Lli3D6NGjIZfL33v/VDR69uyJtm3bKpXVr1+/QG35+flh4sSJ2L59O/r376+N8D5Kxfc/BL1Xenp6HzoEJR9bPNpgYGDwoUOQZGVlIS0tTaOYoqKiUKJEiQL1Z2xsjC+//DJH+aZNm2BmZob27dur3db69esRERGBgQMHYtmyZQWK57+iIO9jbuRy+QdLmH7++WdER0eje/fuH6T/oqTN90gdMTExSE9Ph52d3XvpLy+1atVS+b0viBIlSqBVq1bYtGnTfzpp4+nRYuTMmTOoU6cODAwM4OrqinXr1uWoI5PJkJycjM2bN0uHm/v16wcAePToEYYOHYqKFSvC0NAQJUuWRLdu3dS6RuXtazgePnwIa2trAMDMmTOlft4+enTnzh107doVlpaWMDAwQO3atXHo0CG1tjMxMRGjRo2Ci4sLFAoFSpUqhZYtW+Ly5csq48mOSSaTYfHixVi1ahXKli0LIyMjtGrVChERERBCYPbs2XBwcIChoSE6duyI2NjYHK+dqiNgLi4u0muYm9OnT6Nbt25wcnKCQqGAo6MjRo8ejVevXinFvGrVKqmv7Ede/V+5cgVt2rSBmZkZTExM0KJFC1y4cEGpTva1RmfPnsWYMWNgbW0NY2NjdO7cGdHR0XnG/Xbfw4YNw7Zt21ClShUoFAocPXoUAPD48WP0798fNjY2UCgUqFKlCjZu3JijfyEEVq1apbRdMTExuHPnDlJSUtSK421Pnz7FqVOn8Pnnn6v9Dy02NhZTpkzBrFmzVCaQt2/fhqGhIfr27atUfubMGcjlckyYMCHP9p89ewY/Pz84ODhAoVDAzs4OHTt2zPEd+uWXX9C4cWMYGxvD1NQU7dq1w82bN5Xq9OvXDyYmJvjnn3/g4+MDY2Nj2NvbY9asWRBCKNVdvHgxGjRogJIlS8LQ0BAeHh7Ys2dPjvjyeh/VaSOv/Udu17StXr1a6sve3h7ffPMNXr58qVSnadOmqFq1Km7duoVmzZrByMgIpUuXxsKFC/N8vbMdOHAALi4ucHV1VbmsatWqMDAwQNWqVbF//36VbWRlZSEwMBBVqlSBgYEBbGxs8PXXXyMuLi5H3V9++QVeXl4wNTWFmZkZ6tSpg+3bt+cZozbeo/y+a9kiIyPRqVMnGBsbo1SpUhg9ejRSU1PzjC/bjRs34OTkhI4dO+LQoUPIyMhQa72ikpycjLS0NJXLfv31V+jo6GDatGlK5du3b4dMJsOaNWuUylu2bIkzZ87k2Lf/pwgqFv7++29haGgonJychL+/v5g9e7awsbER1atXF2+/jVu3bhUKhUI0btxYbN26VWzdulWcO3dOCCHE7t27RY0aNcS0adPE+vXrxeTJk4WFhYVwdnYWycnJUhunTp0SAMSpU6ekMl9fX+Hs7CyEECIpKUmsWbNGABCdO3eW+rl27ZoQQogbN24Ic3Nz4ebmJhYsWCBWrlwpmjRpImQymdi3b1++29qrVy+hr68vxowZI77//nuxYMEC0b59e/HDDz+ojEcIIcLCwgQA4e7uLtzc3ERAQICYMmWK0NfXF/Xq1ROTJ08WDRo0EMuXLxcjRowQMplM+Pn5KfULQEyfPj1HPM7OzsLX1zfP12f48OGibdu2Yt68eWLdunViwIABQi6Xi65du0p1zp07J1q2bCkASK/Z1q1bc+3/xo0bwtjYWNjZ2YnZs2eL+fPnizJlygiFQiEuXLgg1QsKChIARM2aNUXz5s3FihUrxNixY4VcLhfdu3fP9/XO7rty5crC2tpazJw5U6xatUpcuXJFPHv2TDg4OAhHR0cxa9YssWbNGtGhQwcBQCxdulQIIURoaKjYunWrACBatmyptF3Tp0/P8VqpKyAgQAAQJ06cUHudoUOHiipVqoiMjAyp7+joaKU6ixYtEgDEwYMHhRBvPs+urq7Czc1NvH79Os/2GzRoIMzNzcWUKVPE999/L+bNmyeaNWsmfvvtN6nOli1bhEwmE61btxYrVqwQCxYsEC4uLqJEiRIiLCxMqufr6ysMDAxE+fLlRZ8+fcTKlSvFZ599JgCIqVOnKvXr4OAghg4dKlauXCkCAgJE3bp1BQDx888/K9XL7X1Ut4289h/Zn7O3tyH7Nfb29hYrVqwQw4YNE3K5XNSpU0ekpaVJ9by8vIS9vb1wdHQUI0eOFKtXrxbNmzcXAMSRI0fyfM2FEKJcuXLi888/z1F+7NgxoaOjI6pWrSoCAgLE//73P2Fubi6qVKmitH8QQoiBAwcKXV1dMWjQILF27VoxYcIEYWxsnCPWoKAgIZPJRNWqVcXcuXPFqlWrxMCBA0WfPn2U3rt32y/se6TOd00IIVJSUkSFChWEgYGB+Pbbb0VgYKDw8PCQ/hfk912Li4sTM2fOFGXKlBEAhJ2dnZg4caK4d+9enuulpaWJ6OhotR6ZmZl5tpW9vzYxMREAhEwmE7Vr1xbHjh3LUfebb74Rurq64tKlS0IIIZ48eSIsLS2Ft7e3yMrKUqp75swZAUD89NNPefZfnDFpKyY6deokDAwMxKNHj6SyW7duCblcLt7NvY2NjZWSjGwpKSk5ys6fPy8AiC1btkhl+SVtQggRHR2da5LTokULUa1aNaV/gFlZWaJBgwaifPny+W6rubm5+Oabb/Ksk1vSZm1tLV6+fCmVT5o0SQAQNWrUEOnp6VJ5z549hb6+vlKMhUnaVL22/v7+QiaTKb1n33zzTY73K7f+O3XqJPT19UVoaKhU9uTJE2FqaiqaNGkilWX/M313JzZ69Gghl8uVXo/cABA6Ojri5s2bSuUDBgwQdnZ2IiYmRqn8iy++EObm5krbDSDH+1aYpM3Dw0PY2dnl+w8g27Vr14RcLpd2/LklbZmZmaJRo0bCxsZGxMTESP8U/vzzzzzbj4uLEwDEokWLcq2TmJgoSpQoIQYNGqRU/uzZM2Fubq5U7uvrKwCI4cOHS2VZWVmiXbt2Ql9fXynudz9faWlpomrVqqJ58+ZK5bm9j5q0kdv+492kLSoqSujr64tWrVopvUcrV64UAMTGjRulMi8vrxz7mdTUVGFrayu6dOmSo6+3paenC5lMJsaOHZtjmbu7u7Czs1P6jB8/flwAUNo/nD59WgAQ27ZtU1r/6NGjSuUvX74UpqamwtPTU7x69Uqp7tvfLVVJW2HfI3W/a4GBgQKA2LVrl1QnOTlZlCtXTqPvWlZWlvj111/Fl19+KQwNDQUA0aRJE7F582aV+7Ps/Z46j7cTe1UePXokWrVqJdasWSMOHTokAgMDhZOTk9DR0cmR5GZvW5UqVcTr169Fu3bthJmZmdJ+NduTJ08EALFgwQK1XoPiiKdHi4HMzEwcO3YMnTp1gpOTk1ReuXJl+Pj4qN2OoaGh9Hd6ejpevHiBcuXKoUSJEkqnHgsjNjYWv/76K7p3747ExETExMQgJiYGL168gI+PD+7fv4/Hjx/n2UaJEiVw8eJFPHnyROP+u3XrBnNzc+m5p6cnAODLL79Uusjf09MTaWlp+cairrdf2+TkZMTExKBBgwYQQuDKlSsat5eZmYnjx4+jU6dOKFu2rFRuZ2eHXr164cyZM0hISFBa56uvvlI63dq4cWNkZmbi0aNHavXp5eUFNzc36bkQAnv37kX79u0hhJDey5iYGPj4+CA+Pj7fz82MGTMghNB4sMq9e/dw6dIlfPHFF9DRUW83NWLECLRp0ybfQQs6OjrYtGkTkpKS0KZNG6xevRqTJk1C7dq181zP0NAQ+vr6CAkJUXlKDQBOnDiBly9fomfPnkqvl1wuh6enJ06dOpVjnWHDhkl/Z586S0tLQ3BwsFLf2eLi4hAfH4/GjRurfP3ffR8L0oY6goODkZaWhlGjRim9R4MGDYKZmRkOHz6sVN/ExETp+iV9fX3UrVsX//zzT579xMbGQggBCwsLpfKnT5/i6tWr8PX1VfrOt2zZMsf27969G+bm5mjZsqXS++Lh4QETExPpfTlx4gQSExMxceLEHKfk85taqTDvkSbftSNHjsDOzg5du3aV1jcyMsJXX32VZ3zvkslkaNasGbZu3Ypnz55h7dq1SE1Nha+vL+zs7DBkyBClz3mNGjVw4sQJtR62trZ59u3k5IRjx45h8ODBaN++PUaOHIkrV67A2toaY8eOVaprZGSETZs24fbt22jSpAkOHz6MpUuXKv0vzJb9GfkvjxjnQIRiIDo6Gq9evUL58uVzLKtYsSKOHDmiVjuvXr2Cv78/goKC8PjxY6XrZuLj47US64MHDyCEwNSpUzF16lSVdaKiomBra5vjeitLS0vo6+tj4cKF8PX1haOjIzw8PNC2bVv07dtXKXnJzbtf5OyduaOjo8ry3P75aio8PBzTpk3DoUOHcrRZkNc2OjoaKSkpqFixYo5llStXRlZWFiIiIlClShWp/N1tz96BZccTHx+vdI2dvr4+LC0tpedlypTJEcPLly+xfv16rF+/XmWcUVFRGm6ZerLn4urdu7da9Xfu3Ilz587hxo0batV3dXXFjBkzMH78eFStWjXXz+rbFAoFFixYgLFjx8LGxgb16tXDZ599hr59+0r/pO7fvw8AaN68uco2zMzMlJ7r6Ojk+FxXqFABAJSuHfv5558xZ84cXL16VenaJVWJxLvvY0HaUEf2j4F3P6P6+vooW7Zsjh8LDg4OOfqysLDA33//rVZ/b++v3u4/t/3i28nS/fv3ER8fj1KlSqlsO/tzHBoaCgCoWrWqWjG9rTDvkSbftUePHqFcuXI52lW1r1CXmZkZvv76a/j6+mLu3LmYO3cu1q5di6+//lraj1hYWMDb27vAfeTH0tISfn5+mD9/PiIjI+Hg4CAta9iwIYYMGYJVq1bBx8cn14EG2Z8Rbc9d+jFh0vYJGT58OIKCgjBq1CjUr18f5ubmkMlk+OKLL7Q2fUZ2O+PGjcv1KGC5cuUQERGRY8d16tQpNG3aFN27d0fjxo2xf/9+HD9+HIsWLcKCBQuwb98+tGnTJs/+cxvdllv5u/8IVMnMzMx3ecuWLREbG4sJEyagUqVKMDY2xuPHj9GvX7/3NjVJfts4cuRIbN68WSr38vJSmmfv7SMFwL/v5ZdffglfX1+VbVevXr0wIedq+/btqFixIjw8PNSqP378eHTr1g36+vpSspN9MXxERATS0tJgb2+vtM7x48cBAE+ePMGLFy/yPToAAKNGjUL79u1x4MABHDt2DFOnToW/vz9+/fVX1KxZU3rNtm7dqrK9gkzpcvr0aXTo0AFNmjTB6tWrYWdnBz09PQQFBam8OP7d97EgbRSFgn4HLS0tIZPJCvUDKysrK8+JebMHVhVUYd+jD/ldA4A///wTGzduxI4dO/Dy5Ut4enpiwIABqFy5slQnLS1N7Qv8ra2tCzTSOPvHdWxsrFLSlpqaKu2rQkNDkZKSAiMjoxzrZ39GrKysNO67uChU0paamvpB5uz51FhbW8PQ0FD6Ff+2u3fv5ijL7VfGnj174OvriyVLlkhlr1+/zjHSSx259ZF91EBPTy/PX2V6eno4ceKEUlmNGjWkv+3s7DB06FAMHToUUVFRqFWrFubOnZtv0lYYFhYWOV6LtLQ0PH36NM/1rl+/jnv37mHz5s1KoxLf3T5A/V+A1tbWMDIyUvn+3rlzBzo6OjmOHubn22+/VTo99e7pJlUxmJqaIjMzs0h/Yb/r4sWLePDgAWbNmqX2OhEREdi+fbvKf5C1atVCjRo1cPXqVals7dq1OHHiBObOnQt/f398/fXXOHjwoFp9ubq6YuzYsRg7dizu378Pd3d3LFmyBD/88IM0urFUqVJqvWZZWVn4559/pKNrwJtTwwCk0dF79+6FgYEBjh07prS/DQoKUiteTdtQ9zPq7OwM4M0+6O2jhWlpaQgLC9PaZ0ZXVxeurq4ICwtT2b86+0VXV1cEBwejYcOGKpPat+sBb0ZYlitXTu0YC/seafJdc3Z2xo0bNyCEUHqvVO0r8hIVFYWtW7ciKCgIN2/eRMmSJdGvXz8MGDBA5ZHGc+fOoVmzZmq1HRYWVqA7RmSfKn83iZ4+fTpu376NxYsXY8KECZg4cSKWL1+usl8ASsnmf41GSdsvv/yCHTt24PTp04iIiEBWVhaMjY1Rs2ZNtGrVCn5+fjl+zVLhyeVy+Pj44MCBAwgPD5dOg92+fRvHjh3LUd/Y2FhlIiaXy3P8ql2xYkW+R5JUyf6V824/pUqVQtOmTbFu3ToMHz48x1xA0dHRsLa2hoGBgcqdU2ZmJpKSkpSuUSlVqhTs7e3VHtJeUK6urvj999+VytavX5/v65P9i/Lt11YIoXKOMGNjYwBvXre85jSTy+Vo1aoVDh48iIcPH0o7wOfPn2P79u1o1KhRjlNt+XFzc1N5rVNeMXTp0gXbt2/HjRs3cuzIs9/LvGRfl+Pk5KTyl7Eq2YlXr169VC5PSUlBeHg4rKyspF/UqqZ52LFjB3bu3IktW7Yo/WoPCwvD+PHj0aVLF0yePBklS5bE4MGDsWXLlhxTgbzbr46OjtK1Tq6urjA1NZU+mz4+PjAzM8O8efPQrFmzHPMJqnrNVq5cKf0DEkJg5cqV0NPTQ4sWLQC8eR9kMpnS5/Dhw4ca3bVAkzZy23+8y9vbG/r6+li+fDlat24tJRAbNmxAfHw82rVrp3Z8+alfv36Ou6/Y2dnB3d0dmzdvxsSJE6V9xokTJ3Dr1i0pqQOA7t27Y/Xq1Zg9ezbmzZun1E5GRgaSkpKkeb5MTU3h7++P1q1bK73X7yZJbyvse6TJd61t27Y4fvw49uzZg27dugF489nM7bTquyIiIjB8+HAcPnwYmZmZaNGiBaZOnYrOnTtDX18/1/Wyr2lTR35HrVV9Dx4/foyNGzeievXqSv83Ll68iMWLF2PUqFEYO3YsYmJisGDBAnTp0gVeXl5KbVy6dAkymazAE/QWB2olbfv378eECROQmJiItm3bYsKECbC3t4ehoSFiY2Nx48YNBAcHY/bs2ejXrx9mz55d6MPNpGzmzJk4evQoGjdujKFDhyIjIwMrVqxAlSpVclwT4uHhgeDgYAQEBMDe3h5lypSBp6cnPvvsM2zduhXm5uZwc3PD+fPnERwcjJIlS2ocj6GhIdzc3LBz505UqFABlpaWqFq1KqpWrYpVq1ahUaNGqFatGgYNGoSyZcvi+fPnOH/+PCIjI3Ht2rVc201MTISDgwO6du2KGjVqwMTEBMHBwfjzzz+VjhAWhYEDB2Lw4MHo0qULWrZsiWvXruHYsWP5HmqvVKkSXF1dMW7cODx+/BhmZmbYu3evytM52af7RowYAR8fH8jl8lxvyzNnzhycOHECjRo1wtChQ6Grq4t169YhNTVV7fmtCmv+/Pk4deoUPD09MWjQILi5uSE2NhaXL19GcHBwvqdLVq5ciZkzZ0qnvvOTmZmJnTt3ol69eirn5AKAP/74A82aNcP06dOlee1U3f0j+8hamzZtpPdQCIH+/fvD0NBQmuPp66+/xt69ezFy5Eh4e3vn+sPz3r17aNGiBbp37w43Nzfo6upi//79eP78ufQempmZYc2aNejTpw9q1aqFL774AtbW1ggPD8fhw4fRsGFDrFy5UmrTwMAAR48eha+vLzw9PfHLL7/g8OHDmDx5srQPbdeuHQICAtC6dWv06tULUVFRWLVqFcqVK6f29WCatJHb/uNd1tbWmDRpEmbOnInWrVujQ4cOuHv3LlavXo06depobdJUAOjYsSO2bt2Ke/fuKR2V9Pf3R7t27dCoUSP0798fsbGx0n4xKSlJqufl5YWvv/4a/v7+uHr1Klq1agU9PT3cv38fu3fvxrJly9C1a1eYmZlh6dKlGDhwIOrUqYNevXrBwsIC165dQ0pKitLlBW/Txnuk7ndt0KBBWLlyJfr27YtLly7Bzs4OW7duVftHUWhoKC5fvoxJkyahf//+ah8R0+Y1bd9++y1CQ0PRokUL2Nvb4+HDh1i3bh2Sk5OVfuy+fv0avr6+KF++PObOnQvgzf/Cn376CX5+frh+/br0Qxh4k7A3bNiwQP/Tig11hpjWq1dP/Pzzz/kOvY+MjBQTJkwQAQEBmo5iJTX89ttvwsPDQ+jr64uyZcuKtWvXStMavO3OnTuiSZMm0jDu7OH7cXFxws/PT1hZWQkTExPh4+Mj7ty5o9aUFqqGuJ87d06KB+9MVxEaGir69u0rbG1thZ6enihdurT47LPPxJ49e/LcxtTUVDF+/HhRo0YNYWpqKoyNjUWNGjXE6tWrlerlNuXHu9MxZG/L7t27lcqzpy94e5qHzMxMMWHCBGFlZSWMjIyEj4+PePDggVqvz61bt4S3t7cwMTERVlZWYtCgQeLatWsCgAgKCpLqZWRkiOHDhwtra2shk8mU3rt3X0MhhLh8+bLw8fERJiYmwsjISDRr1kyaNyuvbcktztxAxXQd2Z4/fy6++eYb4ejoKPT09IStra1o0aKFWL9+fb5taDrlR/YUDMuXL8+1TvZ2qZqeRVXfb0+dsWzZMgFA7N27V6lueHi4MDMzE23bts21vezpQSpVqiSMjY2Fubm58PT0VJp64e0YfXx8hLm5uTAwMBCurq6iX79+4q+//pLq+Pr6CmNjYxEaGipatWoljIyMhI2NjZg+fXqOfe2GDRtE+fLlhUKhEJUqVRJBQUEqv/t5vY/qtpHb/kPVPG1CvJnio1KlSkJPT0/Y2NiIIUOGiLi4OKU6Xl5eokqVKjliUrVfUSU1NVVYWVmJ2bNn51i2d+9eUblyZaFQKISbm5vYt29fru2uX79eeHh4CENDQ2FqaiqqVasmvv32W/HkyROleocOHRINGjQQhoaGwszMTNStW1f8+OOPecatjfdI3e/ao0ePRIcOHYSRkZGwsrISI0eOlL47+X3XUlJS1J5Gp6hs375dNGnSRFhbWwtdXV1hZWUlOnfuLM3Fli172qKLFy8qlf/1119CV1dXDBkyRCp7+fKl0NfXF99///172YYPRSaEGldiExGRVvXr1w979uxROiJEuZs9ezaCgoJw//593n+UcggMDMTChQsRGhqa53WLxR3naSMioo/e6NGjkZSUhB07dnzoUOgjk56ejoCAAEyZMuU/nbABal7TNmbMGLUbDAgIKHAwREREqpiYmBTZvIBUvOnp6SE8PPxDh/FeqJW0vTuj++XLl5GRkSFN5nfv3j3I5XK151QiIiIiIs1ofE1bQEAAQkJCsHnzZqUZ1/38/NC4ceMct6AgIiIiosLTOGkrXbo0jh8/rnT7HODNZIStWrUq0P0iiYiIiChvGg9ESEhIyHHPSODNZHmJiYlaCYqIiIiIlGl8G6vOnTvDz88PS5YsQd26dQG8mbF4/Pjx+Pzzz7UeoLZlZWXhyZMnMDU1/U/fVJaIiIg+fkIIJCYmwt7eHjo6+RxL03Rit+TkZDFkyBChUCiEjo6O0NHREfr6+mLIkCEiKSlJq5PIFYWIiAgBgA8++OCDDz744OOjeUREROSbwxR4ct3k5GSEhoYCeHP/vbdvJfExi4+PR4kSJRAREaHxvRuJiIiItCkhIQGOjo54+fKl0n23VdH49Gi2p0+f4unTp2jSpAkMDQ3zvJnuxyQ7RjMzMyZtRERE9FFQJ4fSeCDCixcv0KJFC1SoUAFt27bF06dPAQADBgzgdB9ERERERUTjpG306NHS7MNGRkZSeY8ePXD06FGtBkdEREREb2h8evT48eM4duwYHBwclMrLly+PR48eaS0wIiKioiKEQEZGBjIzMz90KPSJkMvl0NXVLdSlZBonbcnJyUpH2LLFxsZCoVAUOBAiIqL3IS0tDU+fPkVKSsqHDoU+MUZGRrCzs4O+vn6B1tc4aWvcuDG2bNmC2bNnA3hz4VxWVhYWLlyIZs2aFSgIIiKi9yErKwthYWGQy+Wwt7eHvr5+sRhER8WbEAJpaWmIjo5GWFgYypcvn/+cbCponLQtXLgQLVq0wF9//YW0tDR8++23uHnzJmJjY3H27FmNAyAiInpf0tLSkJWVBUdHR5VnjYiKiqGhIfT09PDo0SOkpaXBwMBA4zY0TvOqVq2Ke/fuoVGjRujYsSOSk5Px+eef48qVK3B1ddU4ACIiovetIEc5iAqrsJ+7Aq1tbm6O//3vf9i1axeOHDmCOXPmwM7OrlCBEBERkfaFhITA3d1drbozZszA69evpefTpk3Dtm3btBrPunXrUKlSJbi7u+PSpUsoUaKEVttXZcOGDShfvjxcXV0xaNAgpKenq6yXkpKCnj17oly5cqhQoQL27NkjLdu4cSOqVasGXV1dBAYGKq03efJkVKpUCTVq1EDt2rVx7NixItkOjZM2FxcXzJo1CxEREUURDxER0SctIyPjg/U9c+ZMpaRt1qxZ6N27t1b7CAwMRFBQEK5evYqSJUtqte2srCxkZWUplYWFhWHq1Kk4ffo0Hjx4gOfPn2P9+vUq11+8eDEUCgUePHiAY8eOYejQoXjx4gUAwMPDA7t27UKvXr1yrNe4cWNcuXIF165dw4YNG9C9e3ckJydrdduAAiRto0aNwr59+1CmTBm0bNkSO3bsQGpqqtYDIyIi+lTIZDJMnz4dderUwaRJk5CYmIhBgwahbt26qF69Or766iukpaUBAObMmYPKlSvD3d0d7u7u0nRbx44dQ61atVC9enV4eXnh1q1bOfp5+PCh0pGtpKQkaSDG4MGDAbxJQNzd3REVFYV+/fpJR5WSkpLQv39/VK1aFVWrVsXMmTOldpo2bYpx48ahcePGcHV1ldp6V9euXREaGop+/fqha9euOZbntQ2LFi1ClSpVUK1aNfTu3Rvx8fEA3hwd7NKlC3x8fFC1alVp0v9se/bsQYcOHWBrawuZTIbBgwfjxx9/VBnfzp07pdjLlCmDpk2bYv/+/QCAGjVqoHLlyipPcbZp0waGhoYAgGrVqkEIgejoaJV9FIbGAxFGjRqFUaNG4fLly9i0aROGDx+OoUOHolevXujfvz9q1aql9SCJiIiK0u7du1WWt2rVCubm5oiPj8fx48dV1unWrRsAICIiAhcuXFC5TB1yuRx//vknAOCrr75C48aN8d1330EIgUGDBmHZsmUYOHAgFi9ejKdPn8LQ0BApKSnQ0dFBVFQUevXqhZCQEFSrVg3btm1D165dcfPmTbX7X7t2LdatW4fTp0+rPGU5e/ZspKam4u+//8arV6/QqFEjVKpUCT169AAAhIaG4tSpU0hPT4ebmxvOnz+P+vXrK7WxZ88euLi4YOfOnXB3d8fDhw+lZXltw9GjR7Fx40acP38eJUqUwFdffYWJEydizZo1AIDz58/jypUrsLGxyRF3eHg4nJ2dpecuLi4IDw9X+RpoUjc3QUFBKFu2rFI72lLgK+Jq1aqF5cuX48mTJ5g+fTq+//571KlTB+7u7ti4cSMKeB96IiKiT1L//v2lvw8cOIBFixbB3d0dNWvWlE7tmZmZoXz58vjyyy+xbt06xMbGwsDAABcvXkS1atVQrVo1AEDv3r3x5MkTPH78WGvxBQcHY9CgQdDR0YGxsTH69u2LEydOSMt79OgBXV1dGBoawt3dHaGhoRq1n9c2BAcHo0ePHlIyOWTIEKW+27ZtqzJhe99OnjyJmTNnYufOnUUylUyBbxifnp6O/fv3IygoCCdOnEC9evUwYMAAREZGYvLkyQgODsb27du1GSsREVGRyO+ImLm5eb51HB0d4ejoWOAYTExMpL+FENi7dy8qVKiQo96FCxdw7tw5hISEoF69erme6lNFV1dX6S4Qb1+/pql3k5K3p7CQy+VFem3eu32//dq9y8nJSSmBfPjwIZycnHKt++jRI2lw5cOHD9GqVSu1Yvrtt9/g5+eHn376CRUrVlRrHU1pfKTt8uXLGD58OOzs7DBs2DBUqVIFN27cwJkzZ+Dn54epU6ciODhYOgdMREREmunUqRMWLFggJT5xcXF48OABEhMT8fz5czRu3BhTp05Fo0aNcOXKFdSrVw/Xr1/HjRs3AAA7duxA6dKlUbp0aaV2bW1tIYSQrhXbsmWL0nJTU1PpWrF3eXt7Y8OGDRBCIDk5GVu3blU7oVFHXtvg7e2NXbt2ISEhAcCbEajq9t2lSxccOnQIz549gxACa9euxRdffKGybrdu3bB27VoAbwYwhISEoFOnTvn28fvvv6NPnz44ePAgatSooVZcBaHxkbY6deqgZcuWWLNmDTp16gQ9Pb0cdcqUKZPrC0JERER5W7p0KSZOnAh3d3fo6OhAV1cXCxcuhIGBAbp27Yrk5GTIZDKUL18evr6+MDc3x7Zt29C3b19kZGTAwsICu3fvznFESldXFytWrMBnn32GkiVL5hgMMHbsWLRs2RJGRkY5ruGbOnUqRowYIZ2+7NatG7p37661bba2ts51G9q0aYMbN26gfv360NHRQfXq1bF69Wq12i1btixmzpyJhg0bAngzaOLrr78GADx58gRt27bF1atXAQDjx49H//794erqCrlcjpUrV8LKygoAsGnTJkyZMgVxcXE4cOAAFi9ejJ9++gk1a9bEgAEDkJqaCj8/P6nfrVu3Sq+VtsiEhhefPXr0SOsX161atQqLFi3Cs2fPUKNGDaxYsQJ169bNd70dO3agZ8+e6NixIw4cOKBWXwkJCdJFpWZmZoWMnIiIipPXr18jLCwMZcqUKdCM9ESFoerzp0leovHpUW0nbDt37sSYMWMwffp0XL58GTVq1ICPjw+ioqLyXO/hw4fS8GIiIiKi/zqNk7bMzEwsXrwYdevWha2tLSwtLZUemgoICMCgQYPg5+cHNzc3rF27FkZGRti4cWOeMfTu3RszZ85E2bJlNe6TiIiIqLjROGmbOXMmAgIC0KNHD8THx2PMmDH4/PPPoaOjgxkzZmjUVlpaGi5dugRvb+9/A9LRgbe3N86fP5/rerNmzUKpUqUwYMCAfPtITU1FQkKC0oOIiIiouNE4adu2bRu+++47jB07Frq6uujZsye+//57TJs2LcekgvmJiYlBZmZmjrlVbGxs8OzZM5XrnDlzBhs2bMB3332nVh/+/v4wNzeXHoUZjk3alZ6ejmHDhsHCwgKWlpYYPnx4rkPEhw8fDkdHR5iZmaF06dIYNWqUNDt4eHg4TExMlB66urro0KEDgDcTNvbu3RsODg4wMzNDzZo1cejQofe2nURERNqgcdL27NkzaTSEiYmJNDT4s88+w+HDh7Ub3TsSExPRp08ffPfdd9JojvxMmjQJ8fHx0oP3TP14zJkzB2fOnMGtW7dw8+ZNnD59GvPmzVNZd+jQobhz5w4SEhJw7do1XLt2DQsXLgTwZl6dpKQk6REbG4sSJUpII5iTkpJQs2ZNXLhwAS9fvsSsWbPQs2dPlbd4IaJPw7v3pyR6Hwr7udN4yg8HBwc8ffoUTk5OcHV1xfHjx1GrVi38+eefUCgUGrVlZWUFuVyO58+fK5U/f/4ctra2OeqHhobi4cOHaN++vVSW/QLo6uri7t27cHV1VVpHoVBoHBe9Hxs3bsTSpUulSQz/97//Ydy4cZg2bVqOupUrV5b+FkJAR0cH9+/fV9nugQMHkJWVhc8//xzAm+He48aNk5a3b98eFStWxIULF+Dm5qbNTSKij5y+vj50dHTw5MkTWFtbQ19fv0hmrid6mxACaWlpiI6Oho6ODvT19QvUjsZJW+fOnXHy5El4enpi+PDh+PLLL7FhwwaEh4dj9OjRGrWlr68PDw8PnDx5Upq8LisrCydPnsSwYcNy1K9UqRKuX7+uVDZlyhQkJiZi2bJlPPVZjMTFxSEyMhLu7u5Smbu7O8LDwxEfHw9zc/Mc68yfPx9z5sxBcnIySpYsiQULFqhse8OGDejdu3euw/mjoqJw+/ZtVK9eXSvbQkTFh46ODsqUKYOnT5/iyZMnHzoc+sQYGRnByclJ5U3n1aHxPG3vOn/+PM6fP4/y5csrHQFT186dO+Hr64t169ahbt26CAwMxK5du3Dnzh3Y2Nigb9++KF26NPz9/VWu369fP7x8+ZLztBUzERERcHJyQnR0tHSqOzo6GqVKlUJERAQcHBxyXff27dvYtm0bBg8enKPeo0ePULZsWWn6mHelpaWhdevWcHR0xObNm7W7UURUbAghkJGRoXRLJ6KiJJfLoaurm+PIriZ5SYHvPZqtfv36qF+/foHX79GjB6KjozFt2jQ8e/YM7u7uOHr0qDQ4ITw8vMAZKX28su8TFx8fLyVt2ddHmpqa5rlu5cqVUaNGDfTr1w/BwcFKy4KCglCzZs1cE7auXbvCyMhI7YEsRPTfJJPJoKenp/KuPkQfK7WSNk1G2mWP2NPEsGHDVJ4OBYCQkJA81920aZPG/dGHZ2FhAQcHB1y9elW6DvHq1atwdHRUeWr0Xenp6TmuacvKykJQUBAmTZqUo35aWhq6deuGtLQ0HDx4sMDXExAREX0oaiVt6twsFXjzy4WHmkldfn5+mDt3rnQ/uHnz5mHgwIE56iUlJWH37t3o3LkzzM3NcePGDcyZMwc+Pj5K9U6cOIGYmBj07NlTqTw9PR3du3dHcnIyfv75Zw5MISKiYkmt845ZWVlqPZiwkSamTp2K+vXro3LlyqhcuTIaNmyIyZMnAwAGDx6MwYMHA3jzY2D79u1wdXWFqakpOnbsiHbt2iEwMFCpvQ0bNqBr1645jtSdO3cOBw8exNmzZ2FlZSXN5Zbb9CJEREQfo0IPRChuOBCBiIiIPhZFesN4ADh58iQ+++wzuLq6wtXVFZ999lmOC8KJiIiISHs0TtpWr16N1q1bw9TUFCNHjsTIkSNhZmaGtm3bYtWqVUURIxEREdEnT+PTow4ODpg4cWKO0Z6rVq3CvHnz8PjxY60GqG08PUpEREQfiyI9Pfry5Uu0bt06R3mrVq2kebaIiIiISLs0Tto6dOiA/fv35yg/ePAgPvvsM60ERURERETKNL4jgpubG+bOnYuQkBDpTggXLlzA2bNnMXbsWCxfvlyqO2LECO1FSkRERPQJ0/iatjJlyqjXsEyGf/75p0BBFaX3dU3b2Y5diqxtovel4cG9HzoEIqL/tCK992hYWFiBAyMiIiKigin0ndgzMzNx9epVxMXFaSMeIiIiIlJB46Rt1KhR2LBhA4A3CVuTJk1Qq1YtODo65ntzdyIiIiIqGI2Ttj179qBGjRoAgJ9++gkPHz7EnTt3MHr0aPzvf//TeoBEREREVICkLSYmBra2tgCAI0eOoFu3bqhQoQL69++P69evaz1AIiIiIipA0mZjY4Nbt24hMzMTR48eRcuWLQEAKSkpkMvlWg+QiIiIiAowetTPzw/du3eHnZ0dZDIZvL29AQAXL15EpUqVtB4gERERERUgaZsxYwaqVq2KiIgIdOvWDQqFAgAgl8sxceJErQdIRERERAVI2gCga9euOcp8fX0LHQwRERERqaZW0rZ8+XJ89dVXMDAwULpNlSq8dRURERGR9qmVtC1duhS9e/eGgYEBli5dmms9mUzGpI2IiIioCKiVtL196yrexoqIiIjo/Sv0bayIiIiIqOipdaRtzJgxajcYEBBQ4GCIiIiISDW1krYrV64oPb98+TIyMjJQsWJFAMC9e/cgl8vh4eGh/QiJiIiISL2k7dSpU9LfAQEBMDU1xebNm2FhYQEAiIuLg5+fHxo3blw0URIRERF94jS+pm3JkiXw9/eXEjYAsLCwwJw5c7BkyRKtBkdEREREb2ictCUkJCA6OjpHeXR0NBITE7USFBEREREp0zhp69y5M/z8/LBv3z5ERkYiMjISe/fuxYABA/D5558XRYxEREREnzyNb2O1du1ajBs3Dr169UJ6evqbRnR1MWDAACxatEjrARIRERFRAZI2IyMjrF69GosWLUJoaCgAwNXVFcbGxloPjoiIiIjeKNAN4wHA2NgY1atX12YsRERERJQL3hGBiIiIqBhg0kZERERUDDBpIyIiIioGmLQRERERFQNaTdp+//13xMfHa7NJIiIiIoKWk7amTZuibNmyvJ0VERERkZZpNWkLCwvDnj178Pz5c202S0RERPTJK/A8bao4OzvD2dkZzZo102azRERERJ+8Aidtf/31F27fvg0AqFy5MmrXrq21oIiIiIhImcZJW2RkJHr27ImzZ8+iRIkSAICXL1+iQYMG2LFjBxwcHLQdIxEREdEnT+Nr2gYOHIj09HTcvn0bsbGxiI2Nxe3bt5GVlYWBAwcWRYxEREREnzyNj7T99ttvOHfuHCpWrCiVVaxYEStWrEDjxo21GhwRERERvaHxkTZHR0ekp6fnKM/MzIS9vb1WgiIiIiIiZRonbYsWLcLw4cPx119/SWV//fUXRo4cicWLFxcoiFWrVsHFxQUGBgbw9PTEH3/8kWvdffv2oXbt2ihRogSMjY3h7u6OrVu3FqhfIiIiouJCJoQQmqxgYWGBlJQUZGRkQFf3zdnV7L+NjY2V6sbGxubb3s6dO9G3b1+sXbsWnp6eCAwMxO7du3H37l2UKlUqR/2QkBDExcWhUqVK0NfXx88//4yxY8fi8OHD8PHxybe/hIQEmJubIz4+HmZmZmputebOduxSZG0TvS8ND+790CEQEf2naZKXaJy0bd68We26vr6++dbx9PREnTp1sHLlSgBAVlYWHB0dMXz4cEycOFGtfmrVqoV27dph9uzZ+dZl0kakPiZtRERFS5O8ROOBCOokYupKS0vDpUuXMGnSJKlMR0cH3t7eOH/+fL7rCyHw66+/4u7du1iwYIHW4iIiIiL62BTqjgivX79GWlqaUpkmR69iYmKQmZkJGxsbpXIbGxvcuXMn1/Xi4+NRunRppKamQi6XY/Xq1WjZsqXKuqmpqUhNTZWeJyQkqB0fERER0cdC44EIycnJGDZsGEqVKgVjY2NYWFgoPd4HU1NTXL16FX/++Sfmzp2LMWPGICQkRGVdf39/mJubSw9HR8f3EiMRERGRNmmctH377bf49ddfsWbNGigUCnz//feYOXMm7O3tsWXLFo3asrKyglwuz3GD+efPn8PW1jb3oHV0UK5cObi7u2Ps2LHo2rUr/P39VdadNGkS4uPjpUdERIRGMRIRERF9DDRO2n766SesXr0aXbp0ga6uLho3bowpU6Zg3rx52LZtm0Zt6evrw8PDAydPnpTKsrKycPLkSdSvX1/tdrKyspROgb5NoVDAzMxM6UFERERU3Gh8TVtsbCzKli0L4M31a9nTejRq1AhDhgzROIAxY8bA19cXtWvXRt26dREYGIjk5GT4+fkBAPr27YvSpUtLR9L8/f1Ru3ZtuLq6IjU1FUeOHMHWrVuxZs0ajfsmIiIiKi40TtrKli2LsLAwODk5oVKlSti1axfq1q2Ln376SbqBvCZ69OiB6OhoTJs2Dc+ePYO7uzuOHj0qDU4IDw+Hjs6/BwSTk5MxdOhQREZGwtDQEJUqVcIPP/yAHj16aNw3ERERUXGh8TxtS5cuhVwux4gRIxAcHIz27dtDCIH09HQEBARg5MiRRRWrVnCeNiL1cZ42IqKiVaTztI0ePVr629vbG3fu3MGlS5dQrlw5VK9eXfNoiYiIiChfhZqnDQCcnZ3h7OysjViIiIiIKBcaJ23Lly9XWS6TyWBgYIBy5cqhSZMmkMvlhQ6OiIiIiN7QOGlbunQpoqOjkZKSIk2mGxcXByMjI5iYmCAqKgply5bFqVOnOJEtERERkZZoPE/bvHnzUKdOHdy/fx8vXrzAixcvcO/ePXh6emLZsmUIDw+Hra2t0rVvRERERFQ4Gh9pmzJlCvbu3QtXV1eprFy5cli8eDG6dOmCf/75BwsXLkSXLhw9SURERKQtGh9pe/r0KTIyMnKUZ2Rk4NmzZwAAe3t7JCYmFj46IiIiIgJQgKStWbNm+Prrr3HlyhWp7MqVKxgyZAiaN28OALh+/TrKlCmjvSiJiIiIPnEaJ20bNmyApaUlPDw8oFAooFAoULt2bVhaWmLDhg0AABMTEyxZskTrwRIRERF9qjS+ps3W1hYnTpzA3bt3cffuXQBAxYoVUbFiRalOs2bNtBchERERERV8ct13EzUiIiIiKjoanx4lIiIiovePSRsRERFRMcCkjYiIiKgYYNJGREREVAxoLWnbt28fqlevrq3miIiIiOgtGiVt69atQ9euXdGrVy9cvHgRAPDrr7+iZs2a6NOnDxo2bFgkQRIRERF96tRO2ubPn4/hw4fj4cOHOHToEJo3b4558+ahd+/e6NGjByIjI7FmzZqijJWIiIjok6X2PG1BQUH47rvv4Ovri9OnT8PLywvnzp3DgwcPYGxsXJQxEhEREX3y1D7SFh4eLt1btHHjxtDT08PMmTOZsBERERG9B2onbampqTAwMJCe6+vrw9LSskiCIiIiIiJlGt3GaurUqTAyMgIApKWlYc6cOTA3N1eqExAQoL3oiIiIiAiABklbkyZNpBvEA0CDBg3wzz//KNWRyWTai4yIiIiIJGonbSEhIUUYBhERERHlhXdEICIiIioGNEra7t+/j7179yIsLAwAcPjwYTRp0gR16tTB3LlzIYQokiCJiIiIPnVqnx7dv38/unfvDh0dHchkMqxfvx5ff/01mjZtCjMzM8yYMQO6urqYMGFCUcZLRERE9ElS+0jb3Llz8e233+L169dYs2YNBg8eDH9/f/zyyy/4+eefsWrVKmzatKkIQyUiIiL6dKmdtN29exf9+/eHTCaDr68v0tLS4O3tLS1v1aoVHj16VCRBEhEREX3q1E7akpOTYWpq+mYlHR0YGhpKc7YBgKGhIVJTU7UfIRERERGpn7TJZDKledjefU5ERERERUftgQhCCFSoUEFK1JKSklCzZk3o6OhIy4mIiIioaKidtAUFBRVlHERERESUB7WTNl9f36KMg4iIiIjywDsiEBERERUDTNqIiIiIigEmbURERETFAJM2IiIiomKASRsRERFRMaDW6NExY8ao3WBAQECBgyEiIiIi1dRK2q5cuaL0/PLly8jIyEDFihUBAPfu3YNcLoeHh4f2IyQiIiIi9ZK2U6dOSX8HBATA1NQUmzdvhoWFBQAgLi4Ofn5+aNy4cdFESURERPSJ0/iatiVLlsDf319K2ADAwsICc+bMwZIlS7QaHBERERG9oXHSlpCQgOjo6Bzl0dHRSExM1EpQRERERKRM46Stc+fO8PPzw759+xAZGYnIyEjs3bsXAwYMwOeff14UMRIRERF98tS+92i2tWvXYty4cejVqxfS09PfNKKriwEDBmDRokVaD5CIiIiICnCkzcjICKtXr8aLFy9w5coVXLlyBbGxsVi9ejWMjY0LFMSqVavg4uICAwMDeHp64o8//si17nfffYfGjRvDwsICFhYW8Pb2zrM+ERER0X9BgSfXNTY2RvXq1VG9evUCJ2sAsHPnTowZMwbTp0/H5cuXUaNGDfj4+CAqKkpl/ZCQEPTs2ROnTp3C+fPn4ejoiFatWuHx48cFjoGIiIjoYycTQoj8Kmlyrdq+ffs0CsDT0xN16tTBypUrAQBZWVlwdHTE8OHDMXHixHzXz8zMhIWFBVauXIm+ffvmWz8hIQHm5uaIj4+HmZmZRrFq4mzHLkXWNtH70vDg3g8dAhHRf5omeYla17SZm5trJbB3paWl4dKlS5g0aZJUpqOjA29vb5w/f16tNlJSUpCeng5LS0uVy1NTU5Gamio9T0hIKFzQRERERB+AWklbUFBQkXQeExODzMxM2NjYKJXb2Njgzp07arUxYcIE2Nvbw9vbW+Vyf39/zJw5s9CxEhEREX1IBbqmLSMjA8HBwVi3bp00N9uTJ0+QlJSk1eDyM3/+fOzYsQP79++HgYGByjqTJk1CfHy89IiIiHivMRIRERFpg8ZTfjx69AitW7dGeHg4UlNT0bJlS5iammLBggVITU3F2rVr1W7LysoKcrkcz58/Vyp//vw5bG1t81x38eLFmD9/PoKDg1G9evVc6ykUCigUCrVjIiIiIvoYaXykbeTIkahduzbi4uJgaGgolXfu3BknT57UqC19fX14eHgorZeVlYWTJ0+ifv36ua63cOFCzJ49G0ePHkXt2rU13QQiIiKiYkfjI22nT5/GuXPnoK+vr1Tu4uJSoGk3xowZA19fX9SuXRt169ZFYGAgkpOT4efnBwDo27cvSpcuDX9/fwDAggULMG3aNGzfvh0uLi549uwZAMDExAQmJiYa909ERERUHGictGVlZSEzMzNHeWRkJExNTTUOoEePHoiOjsa0adPw7NkzuLu74+jRo9LghPDwcOjo/HtAcM2aNUhLS0PXrl2V2pk+fTpmzJihcf9ERERExYFa87S9rUePHjA3N8f69ethamqKv//+G9bW1ujYsSOcnJyKbKSptnCeNiL1cZ42IqKipfV52t62ZMkS+Pj4wM3NDa9fv0avXr1w//59WFlZ4ccffyxw0ERERESUO42TNgcHB1y7dg07duzA33//jaSkJAwYMAC9e/dWGphARERERNqjcdIGALq6uvjyyy+1HQsRERER5UKtpO3QoUNo06YN9PT0cOjQoTzrdujQQSuBEREREdG/1EraOnXqhGfPnqFUqVLo1KlTrvVkMpnKkaVEREREVDhqJW1ZWVkq/yYiIiKi90OtOyJYWloiJiYGANC/f3/pfqNERERE9H6olbSlpaUhISEBALB582a8fv26SIMiIiIiImVqnR6tX78+OnXqBA8PDwghMGLEiFyn99i4caNWAyQiIiIiNZO2H374AUuXLkVoaChkMhni4+N5tI2IiIjoPVIrabOxscH8+fMBAGXKlMHWrVtRsmTJIg2MiIiIiP6l1jVtbwsLC5MStsjISI4mJSIiInoPNE7a3ubm5oaHDx9qKRQiIiIiyk2hkjYhhLbiICIiIqI8FCppIyIiIqL3o1BJ2+TJk2FpaamtWIiIiIgoF2qNHs3NpEmTtBUHEREREeVB46QtMzMTmzZtwsmTJxEVFZVj9Oivv/6qteCIiIiI6A2Nk7aRI0di06ZNaNeuHapWrQqZTFYUcRERERHRWzRO2nbs2IFdu3ahbdu2RREPEREREamg8UAEfX19lCtXrihiISIiIqJcaJy0jR07FsuWLeMcbURERETvkcanR8+cOYNTp07hl19+QZUqVaCnp6e0fN++fVoLjoiIiIje0DhpK1GiBDp37lwUsRARERFRLjRO2oKCgooiDiIiIiLKQ4HuiJCRkYHg4GCsW7cOiYmJAIAnT54gKSlJq8ERERER0RsaH2l79OgRWrdujfDwcKSmpqJly5YwNTXFggULkJqairVr1xZFnERERESfNI2PtI0cORK1a9dGXFwcDA0NpfLOnTvj5MmTWg2OiIiIiN7Q+Ejb6dOnce7cOejr6yuVu7i44PHjx1oLjIiIiIj+pfGRtqysLGRmZuYoj4yMhKmpqVaCIiIiIiJlGidtrVq1QmBgoPRcJpMhKSkJ06dP562tiIiIiIqIxqdHlyxZAh8fH7i5ueH169fo1asX7t+/DysrK/z4449FESMRERHRJ0/jpM3BwQHXrl3Dzp07ce3aNSQlJWHAgAHo3bu30sAEIiIiItIejZM2ANDV1UXv3r3Ru3dvbcdDRERERCpofE2bXC5Hs2bNEBsbq1T+/PlzyOVyrQVGRERERP/SOGkTQiA1NRW1a9fGzZs3cywjIiIiIu3TOGmTyWTYu3cv2rdvj/r16+PgwYNKy4iIiIhI+wp0pE0ul2PZsmVYvHgxevTogTlz5vAoGxEREVERKtBAhGxfffUVypcvj27duuH333/XVkxERERE9A6Nj7Q5OzsrDTho1qwZLly4gIiICK0GRkRERET/0vhIW1hYWI6ycuXK4cqVK3j+/LlWgiIiIiIiZQU+PXrp0iXcvn0bAODm5oZatWrB2dlZa4ERERER0b80TtqioqLwxRdfICQkBCVKlAAAvHz5Es2aNcOOHTtgbW2t7RiJiIiIPnkaX9M2fPhwJCYm4ubNm4iNjUVsbCxu3LiBhIQEjBgxoihiJCIiIvrkaXyk7ejRowgODkblypWlMjc3N6xatQqtWrXSanBERERE9IbGR9qysrKgp6eXo1xPTw9ZWVkFCmLVqlVwcXGBgYEBPD098ccff+Ra9+bNm+jSpQtcXFwgk8kQGBhYoD6JiIiIihONk7bmzZtj5MiRePLkiVT2+PFjjB49Gi1atNA4gJ07d2LMmDGYPn06Ll++jBo1asDHxwdRUVEq66ekpKBs2bKYP38+bG1tNe6PiIiIqDjSOGlbuXIlEhIS4OLiAldXV7i6uqJMmTJISEjAihUrNA4gICAAgwYNgp+fH9zc3LB27VoYGRlh48aNKuvXqVMHixYtwhdffAGFQqFxf0RERETFkcbXtDk6OuLy5csIDg7GnTt3AACVK1eGt7e3xp2npaXh0qVLmDRpklSmo6MDb29vnD9/XuP2iIiIiP6rNEra0tPTYWhoiKtXr6Jly5Zo2bJloTqPiYlBZmYmbGxslMptbGykhLCwUlNTkZqaKj1PSEjQSrtERERE75NGp0f19PTg5OSEzMzMoopH6/z9/WFubi49HB0dP3RIRERERBrT+Jq2//3vf5g8eTJiY2ML3bmVlRXkcnmO2189f/5ca4MMJk2ahPj4eOnBe6QSERFRcaTxNW0rV67EgwcPYG9vD2dnZxgbGystv3z5stpt6evrw8PDAydPnkSnTp0AvJlS5OTJkxg2bJimoamkUCg4YIGIiIiKPY2TtuzkSlvGjBkDX19f1K5dG3Xr1kVgYCCSk5Ph5+cHAOjbty9Kly4Nf39/AG8GL9y6dUv6+/Hjx7h69SpMTExQrlw5rcZGRERE9LFQK2lbvnw5vvrqKxgYGMDPzw8ODg7Q0dH4zKpKPXr0QHR0NKZNm4Znz57B3d0dR48elQYnhIeHK/X15MkT1KxZU3q+ePFiLF68GF5eXggJCdFKTEREREQfG5kQQuRXSVdXF0+ePEGpUqUgl8vx9OlTlCpV6n3Ep3UJCQkwNzdHfHw8zMzMiqyfsx27FFnbRO9Lw4N7P3QIRET/aZrkJWodabO3t8fevXvRtm1bCCEQGRmJ169fq6zr5OSkecRERERElCe1krYpU6Zg+PDhGDZsGGQyGerUqZOjjhACMpmsWE0HQkRERFRcqJW0ffXVV+jZsycePXqE6tWrIzg4GCVLlizq2IiIiIjo/6k9etTU1BRVq1ZFUFAQGjZsyGk0iIiIiN4jtZK27FOfAODr61ukARERERFRTmrN21GlShXs2LEDaWlpeda7f/8+hgwZgvnz52slOCIiov+y9PR0DBs2DBYWFrC0tMTw4cORkZFRoLr9+vWDvr4+TExMpMf58+cL1Bd9nNRK2lasWIHFixfD1tYWPXr0wKJFi7Bt2zbs3bsX33//PcaMGYO6devC3d0dZmZmGDJkSFHHTUREVOzNmTMHZ86cwa1bt3Dz5k2cPn0a8+bNK3DdoUOHIikpSXrUr1+/QH3Rx0mtedqynTlzBjt37sTp06fx6NEjvHr1ClZWVqhZsyZ8fHzQu3dvWFhYFGW8hcZ52ojUx3naiIqWo6Mjli5diq5duwIAdu/ejXHjxuHRo0ca1+3Xrx9KlCiBwMDAQvdF74/W52nL1qhRIzRq1KhQwREREREQFxeHyMhIuLu7S2Xu7u4IDw9HfHw8zM3NNa67ZcsWbNmyBXZ2dujfvz9Gjx4NHR0djfqij5d27kVFREREGklKSgIAlChRQirL/jsxMVHjuiNGjMDdu3cRHR2NDRs2YNmyZVi2bJnGfdHHi0kbERHRB2BiYgIAiI+Pl8qy/zY1NdW4bq1atWBtbQ25XI569eph4sSJ2Llzp8Z90ceLSRsREdEHYGFhAQcHB1y9elUqu3r1KhwdHXOcrtSkbjYdnX//xRdkffr4MGkjIiL6QPz8/DB37lw8e/YMz549w7x58zBw4MAC1d21axcSEhIghMBff/2F+fPno0uXLmqvTx8/jQYiEBERkfZMnToVL168QOXKlQEAX375JSZPngwAGDx4MABg7dq1+dYFgJUrV+Krr75CRkYGSpcujaFDh2Ls2LFq9UXFg0ZTfvwXcMoPIvVxyg8ioqKlSV7C06NERERExQCTNiIiIqJigEkbERERUTHApI2IiIioGNBa0hYaGormzZtrqzkiIiIieovWkrakpCT89ttv2mqOiIiIiN6i9jxty5cvz3P548ePCx0MEREREammdtI2atQo2NnZQV9fX+XytLQ0rQVFRET/De3HHvzQIRAVyk9LOn7oECRqJ23Ozs5YsGABunfvrnL51atX4eHhobXAiIiIiOhfal/T5uHhgUuXLuW6XCaT4RO7uQIRERHRe6P2kbZZs2YhJSUl1+Vubm4ICwvTSlBEREREpEztpM3NzS3P5Xp6enB2di50QERERESUk9pJ29tiYmLw8OFDyGQyuLi4oGTJktqOi4iIiIjeotE8bTdv3kSTJk1gY2MDT09P1K1bF6VKlULz5s1x9+7dooqRiIiI6JOn9pG2Z8+ewcvLC9bW1ggICEClSpUghMCtW7fw3XffoXHjxrhx4wZKlSpVlPESERERfZLUTtqWLl0KZ2dnnD17FgYGBlJ569atMWTIEDRq1AhLly6Fv79/kQRKRERE9ClT+/ToiRMnMGHCBKWELZuhoSHGjx+PY8eOaTU4IiIiInpD7aTtn3/+Qa1atXJdXrt2bfzzzz9aCYqIiIiIlKmdtCUmJsLMzCzX5aampkhKStJKUERERESkTKMpPxITE1WeHgWAhIQE3hGBiIiIqIionbQJIVChQoU8l8tkMq0ERURERETK1E7aTp06VZRxEBEREVEe1E7avLy8NGp4/vz5GDx4MEqUKKFpTERERET0Do3uiKCJefPmITY2tqiaJyIiIvqkFFnSxkEJRERERNpTZEkbEREREWkPkzYiIiKiYkCjedr+S/bv3w8jIyOlslatWsHc3Bzx8fE4fvy4yvW6desGAIiIiMCFCxdyLDczM4OPj4/2Ayb6AI4dO4aEhIQc5fXq1YOjoyMAYPfu3SrX1fb36ebNm7h161aOOg4ODqhfvz4A4Pz584iMjMxRx83NDVWqVOE2fZBt0lfZJlFxkf3dKarvU0pKitqx8EgbERERUTEgE0U0YqBt27bYsGED7OzsiqL5AktISJCy4Lxuy1VYZzt2KbK2id6Xhgf3fugQqJhrP/bghw6BqFB+WtKxSNvXJC8p8OnRmzdvIjMzU3oul8ulQ/UAcOTIkYI2TURERETvUPv06OnTp1GnTh3peb169VCzZk24u7vD3d0d1atXR3BwcIGCWLVqFVxcXGBgYABPT0/88ccfedbfvXs3KlWqBAMDA1SrVo0JIhEREf3nqZ20rV69Gn369FEqO3XqFMLCwvDPP/9g5MiRWLNmjcYB7Ny5E2PGjMH06dNx+fJl1KhRAz4+PoiKilJZ/9y5c+jZsycGDBiAK1euoFOnTujUqRNu3Lihcd9ERERExYXaSdtff/2F5s2bK5U5ODjA2dkZLi4u6NOnD86fP69xAAEBARg0aBD8/Pzg5uaGtWvXwsjICBs3blRZf9myZWjdujXGjx+PypUrY/bs2ahVqxZWrlypcd9ERERExYXa17RFRkbC3Nxcer5582bY2tpKzy0tLfHixQuNOk9LS8OlS5cwadIkqUxHRwfe3t65JoDnz5/HmDFjlMp8fHxw4MABlfVTU1ORmpoqPY+PjwcAlcPjiUgZvydE9Kkr6v1gdvvqjAtVO2kzNTVFaGioNEfJ559/rrQ8LCxM49GYMTExyMzMhI2NjVK5jY0N7ty5o3KdZ8+eqaz/7NkzlfX9/f0xc+bMHOXZ20FEeTDf96EjICL6oMwD3k8/iYmJSgfHVFE7afP09MSWLVvQtGlTlcs3bdoET09PjQJ8HyZNmqR0ZC4rKwuxsbEoWbIkZDLZB4yMCiMhIQGOjo6IiIgo0qlbiIg+ZtwXFn9CCCQmJsLe3j7fumonbWPGjIG3tzdKliyJ8ePHo1SpUgCAqKgoLFiwAD/88EOus//mxsrKCnK5HM+fP1cqf/78udKp17fZ2tpqVF+hUEChUCiVlShRQqM46eNlZmbGHRURffK4Lyze8jvClk3tgQjNmjXDihUrsHz5ctjZ2cHCwgKWlpaws7PDypUrERgYmGOgQn709fXh4eGBkydPSmVZWVk4efKkdAuXd9WvX1+pPgCcOHEi1/pERERE/wUaTa47dOhQtG/fHnv27MH9+/cBAOXLl0fXrl0LfI3YmDFj4Ovri9q1a6Nu3boIDAxEcnIy/Pz8AAB9+/ZF6dKl4e/vDwAYOXIkvLy8sGTJErRr1w47duzAX3/9hfXr1xeofyIiIqLiQOM7Ijg6OmL06NEql7169QqGhoYatdejRw9ER0dj2rRpePbsGdzd3XH06FFpsEF4eDh0dP49INigQQNs374dU6ZMweTJk1G+fHkcOHAAVatW1XRTqBhTKBSYPn16jlPfRESfEu4LPy1aufdoamoqVq5ciUWLFuU6ipOIiIiICk7ta9pSU1MxadIk1K5dGw0aNJDmRQsKCkKZMmUQGBiY6xE4IiIiIioctY+0TZgwAevWrYO3tzfOnTuH6Oho+Pn54cKFC5g8eTK6desGuVxe1PESERERfZLUvqZt9+7d2LJlCzp06IAbN26gevXqyMjIwLVr1zjfGREREVERU/v0aGRkJDw8PAAAVatWhUKhwOjRo5mwEWlg06ZNnCeQiEgF7h/zp3bSlpmZCX19fem5rq4uTExMiiQo+jj069cPnTp1em/9CSEwbdo02NnZwdDQEN7e3tLUMh+Si4sLAgMDP3QYRFRI/fr1g0wmw+DBg3Ms++abbyCTydCvXz+pLDo6GkOGDIGTkxMUCgVsbW3h4+ODs2fP5lj//PnzkMvlaNeuXVFuAn3i1D49KoRAv379pGHFr1+/xuDBg2FsbKxUb98+3quQCmbhwoVYvnw5Nm/ejDJlymDq1Knw8fHBrVu3YGBg8KHDy1NmZiZkMpnS9DRE9PFxdHTEjh07sHTpUmmKqtevX2P79u1wcnJSqtulSxekpaVh8+bNKFu2LJ4/f46TJ0/ixYsXOdrdsGEDhg8fjg0bNuDJkydq3ZKouBFCIDMzE7q6Gs8WRlqi9n8YX19flCpVCubm5jA3N8eXX34Je3t76Xn2g4qXPXv2oFq1ajA0NETJkiXh7e2N5ORkzJgxA5s3b8bBgwchk8kgk8kQEhICAIiIiED37t1RokQJWFpaomPHjnj48KHUZvYRupkzZ8La2hpmZmYYPHgw0tLSco1DCIHAwEBMmTIFHTt2RPXq1bFlyxY8efJEGqmsSlZWFhYuXIhy5cpBoVDAyckJc+fOlZZfv34dzZs3l7bvq6++QlJSUo5YFy9eDDs7O5QsWRLffPMN0tPTAQBNmzbFo0ePpEsBsi8HyD6Mf+jQIbi5uUGhUCA8PBxxcXHo27cvLCwsYGRkhDZt2nwURwuJ6I1atWrB0dFR6QDDvn374OTkhJo1a0plL1++xOnTp7FgwQI0a9YMzs7OqFu3LiZNmoQOHTootZmUlISdO3diyJAhaNeuHTZt2pRvHKmpqZgwYQIcHR2hUChQrlw5bNiwQVr+22+/oW7dulAoFLCzs8PEiRORkZEhLW/atClGjBiBb7/9FpaWlrC1tcWMGTOk5b169UKPHj2U+kxPT4eVlRW2bNkC4M3+09/fH2XKlIGhoSFq1KiBPXv2SPVDQkIgk8nwyy+/wMPDAwqFAmfOnEFiYiJ69+4NY2Nj2NnZYenSpWjatClGjRqltH3jxo1D6dKlYWxsDE9PT+l/SLZNmzbByckJRkZG6Ny5s8pkmN4h6JP15MkToaurKwICAkRYWJj4+++/xapVq0RiYqJITEwU3bt3F61btxZPnz4VT58+FampqSItLU1UrlxZ9O/fX/z999/i1q1bolevXqJixYoiNTVVCCGEr6+vMDExET169BA3btwQP//8s7C2thaTJ0/ONZbQ0FABQFy5ckWpvEmTJmLEiBG5rvftt98KCwsLsWnTJvHgwQNx+vRp8d133wkhhEhKShJ2dnbi888/F9evXxcnT54UZcqUEb6+vtL6vr6+wszMTAwePFjcvn1b/PTTT8LIyEisX79eCCHEixcvhIODg5g1a5b0OgghRFBQkNDT0xMNGjQQZ8+eFXfu3BHJycmiQ4cOonLlyuL3338XV69eFT4+PqJcuXIiLS1NWs/c3FzTt4qItMDX11d07NhRBAQEiBYtWkjlLVq0EEuXLhUdO3aU9g/p6enCxMREjBo1Srx+/TrPdjds2CBq164thBDip59+Eq6uriIrKyvPdbp37y4cHR3Fvn37RGhoqAgODhY7duwQQggRGRkpjIyMxNChQ8Xt27fF/v37hZWVlZg+fbq0vpeXlzAzMxMzZswQ9+7dE5s3bxYymUwcP35cCCHEzz//LAwNDUViYqK0zk8//SQMDQ1FQkKCEEKIOXPmiEqVKomjR4+K0NBQERQUJBQKhQgJCRFCCHHq1CkBQFSvXl0cP35cPHjwQLx48UIMHDhQODs7i+DgYHH9+nXRuXNnYWpqKkaOHCn1NXDgQNGgQQPx+++/iwcPHohFixYJhUIh7t27J4QQ4sKFC0JHR0csWLBA3L17VyxbtkyUKFGC+8d8MGn7hF26dEkAEA8fPlS5PHsH97atW7eKihUrKu2QUlNThaGhoTh27Ji0nqWlpUhOTpbqrFmzRpiYmIjMzEyVfZ09e1YAEE+ePFEq79atm+jevbvKdRISEoRCoZCStHetX79eWFhYiKSkJKns8OHDQkdHRzx79kyK1dnZWWRkZCj12aNHD+m5s7OzWLp0qVLbQUFBAoC4evWqVHbv3j0BQJw9e1Yqi4mJEYaGhmLXrl3SetwpEX0Y2fu0qKgooVAoxMOHD8XDhw+FgYGBiI6OVkrahBBiz549wsLCQhgYGIgGDRqISZMmiWvXruVot0GDBiIwMFAI8SbZs7KyEqdOnco1jrt37woA4sSJEyqXT548Ocd+dtWqVUr7UC8vL9GoUSOl9erUqSMmTJigFMeWLVuk5T179pT2ba9fvxZGRkbi3LlzSm0MGDBA9OzZUwjxb9J24MABaXlCQoLQ09MTu3fvlspevnwpjIyMpKTt0aNHQi6Xi8ePHyu13aJFCzFp0iQplrZt2yot79GjB/eP+eAFOJ+wGjVqoEWLFqhWrRq6deuG7777DnFxcXmuc+3aNTx48ACmpqYwMTGBiYkJLC0t8fr1a4SGhiq1bWRkJD2vX78+kpKSEBERgW3btknrmpiY4PTp0wWK//bt20hNTUWLFi1yXV6jRg2l6y4bNmyIrKws3L17VyqrUqWK0hyDdnZ2iIqKyrd/fX19VK9eXak/XV1deHp6SmUlS5ZExYoVcfv2bY22jYiKjrW1tXQaMygoCO3atYOVlVWOel26dMGTJ09w6NAhtG7dGiEhIahVq5bS6c+7d+/ijz/+QM+ePQG8GaTXo0cPpVOd77p69Srkcjm8vLxULr99+zbq16+vNDtDw4YNkZSUhMjISKns7f0PoLzv0tXVRffu3bFt2zYAQHJyMg4ePIjevXsDAB48eICUlBS0bNlSaX+8ZcsWpX05ANSuXVv6+59//kF6ejrq1q0rlZmbm6NixYrS8+vXryMzMxMVKlRQavu3336T2r59+7bSvhJ483+C8sarCT9hcrkcJ06cwLlz53D8+HGsWLEC//vf/3Dx4kWUKVNG5TpJSUnw8PCQdgRvs7a2VqvfDh06KH1ZS5cujadPnwIAnj9/Djs7O2nZ8+fP4e7urrIdTe9zmxs9PT2l5zKZDFlZWfmuZ2hoyClviIqp/v37Y9iwYQCAVatW5VrPwMAALVu2RMuWLTF16lQMHDgQ06dPl0aZbtiwARkZGUoDD4QQUCgUWLlypcprvd/Xvqt3797w8vJCVFQUTpw4AUNDQ7Ru3RoApGt7Dx8+jNKlSyu18+59TN8dcJifpKQkyOVyXLp0Kcek+5x1onB4pO0TJ5PJ0LBhQ8ycORNXrlyBvr4+9u/fD+DNkaTMzEyl+rVq1cL9+/dRqlQplCtXTunx9s7p2rVrePXqlfT8woULMDExgaOjI0xNTZXWMzQ0RJkyZWBra4uTJ09K6yQkJODixYu5/voqX748DA0NldZ5W+XKlXHt2jUkJydLZWfPnoWOjo7Sr8L8qHodcusvIyMDFy9elMpevHiBu3fvws3NTe3+iKjotW7dGmlpaUhPT4ePj4/a67m5uUn7lIyMDGzZsgVLlizB1atXpce1a9dgb2+PH3/8UWUb1apVQ1ZWFn777TeVyytXrozz589DvHXDorNnz8LU1BQODg5qx9qgQQM4Ojpi586d2LZtG7p16yYlem8PoHp3X+7o6Jhrm2XLloWenh7+/PNPqSw+Ph737t2TntesWROZmZmIiorK0batra20jW/vK4E3/ycob0zaPmEXL17EvHnz8NdffyE8PBz79u1DdHQ0KleuDODN/GR///037t69i5iYGKSnp6N3796wsrJCx44dcfr0aYSFhSEkJAQjRoxQOmyflpaGAQMG4NatWzhy5AimT5+OYcOG5Tolhkwmw6hRozBnzhwcOnQI169fR9++fWFvb5/rXHEGBgaYMGECvv32W+mQ/oULF6TTEr1794aBgQF8fX1x48YNnDp1CsOHD0efPn1gY2Oj9uvk4uKC33//HY8fP0ZMTEyu9cqXL4+OHTti0KBBOHPmDK5du4Yvv/wSpUuXRseOHdXuj4iKnlwux+3bt3Hr1i2Vt2B88eIFmjdvjh9++AF///03wsLCsHv3bixcuFD6Pv/888+Ii4vDgAEDULVqVaVHly5dcj1F6uLiAl9fX/Tv3x8HDhyQ9qO7du0CAAwdOhQREREYPnw47ty5g4MHD2L69OkYM2aMxtMK9erVC2vXrsWJEyekU6MAYGpqinHjxmH06NHYvHkzQkNDcfnyZaxYsQKbN2/OtT1TU1P4+vpi/PjxOHXqFG7evIkBAwZAR0dHOvNQoUIF9O7dG3379sW+ffsQFhaGP/74A/7+/jh8+DAAYMSIETh69CgWL16M+/fvY+XKlTh69KhG2/ZJ+tAX1dGHc+vWLeHj4yOsra2FQqEQFSpUECtWrJCWR0VFiZYtWwoTExMBQLqw9unTp6Jv377CyspKKBQKUbZsWTFo0CARHx8vhPj3Yt9p06aJkiVLChMTEzFo0KB8R2BlZWWJqVOnChsbG6FQKESLFi3E3bt381wnMzNTzJkzRzg7Ows9PT3h5OQk5s2bJy3/+++/RbNmzYSBgYGwtLQUgwYNUhpNpWqwxciRI4WXl5f0/Pz586J69epCoVCI7K9MbgMKYmNjRZ8+fYS5ubkwNDQUPj4+0mipvNYjoqKn6vv+trcHIrx+/VpMnDhR1KpVS5ibmwsjIyNRsWJFMWXKFJGSkiKEEOKzzz7LcTF9tosXLwoAKgcuCCHEq1evxOjRo4WdnZ3Q19cX5cqVExs3bpSWh4SEiDp16gh9fX1ha2srJkyYINLT06XlXl5eSqM1340/261btwQA4ezsnGNEa1ZWlggMDBQVK1YUenp6wtraWvj4+IjffvtNCPHvQIS4uDil9RISEkSvXr2EkZGRsLW1FQEBAaJu3bpi4sSJUp20tDQxbdo04eLiIvT09ISdnZ3o3Lmz+Pvvv6U6GzZsEA4ODsLQ0FC0b99eLF68mPvHfKh9w3gidfXr1w8vX77Mc341IiL6b0hOTkbp0qWxZMkSDBgw4EOH85/GgQhERESktitXruDOnTuoW7cu4uPjMWvWLADgZSDvAZM2IiIi0sjixYtx9+5d6Ovrw8PDA6dPn1Y5bQppF0+PEhERERUDHD1KREREVAwwaaNCefHiBUqVKqV0w/ji4OHDh5DJZLh69SqAf2+M/PLlyzzXq1evHvbu3Vv0ARIREb2DSRsVyty5c9GxY0e4uLgA+DcZevfx5ZdfAnhzm5X58+crtTFx4kTIZDKEhIQolTdt2hR9+vR5H5uBBg0a4OnTp9IEwZs2bUKJEiVy1JsyZQomTpyo1h0TiIiItIlJGxVYSkoKNmzYoHKId3BwMJ4+fSo9sm8T07Rp0xzJ2alTp+Do6KhU/vr1a1y4cAHNmzcvyk2Q6Ovrw9bWNt/bUrVp0waJiYn45Zdf3ktcRERE2Zi0UYEdOXIECoUC9erVy7GsZMmSsLW1lR7ZR7CaNWuGs2fPIiMjAwCQmJiIK1euYMKECUpJ2/nz55GamopmzZqp7DstLQ3Dhg2DnZ0dDAwM4OzsDH9/f2m5TCbDmjVr0KZNGxgaGqJs2bLYs2dPrtvy9unRkJAQ+Pn5IT4+XjpSOGPGDABvZlFv27YtduzYoenLRUREVChM2qjATp8+DQ8PD43WadasGZKSkqT71p0+fRoVKlRAly5dcPHiRbx+/RrAm6NvLi4u0mnXdy1fvhyHDh3Crl27cPfuXWzbti1H3alTp6JLly64du0aevfujS+++AK3b9/ON8YGDRogMDAQZmZm0pHCcePGScvr1q2L06dPa7TdREREhcWkjQrs0aNHsLe3V7msQYMGMDExkR5XrlwB8Ob+nKVLl5aOqoWEhMDLywu2trZwcnLC+fPnpfLcjrIBQHh4OMqXL49GjRrB2dkZjRo1Qs+ePZXqdOvWDQMHDkSFChUwe/Zs1K5dGytWrMh3u/T19WFubg6ZTCYdKTQxMZGW29vbIyIigte1ERHRe8WkjQrs1atXMDAwULls586duHr1qvRwc3OTlr19XVtISAiaNm0KAPDy8kJISAhevXqFixcv5pm09evXD1evXkXFihUxYsQIHD9+PEed+vXr53iuzpG2/BgaGiIrKwupqamFbouIiEhdTNqowKysrBAXF6dymaOjI8qVKyc9FAqFtCz7urYXL17gypUr8PLyAvAmaTt16hTOnTuHtLS0PAch1KpVC2FhYZg9ezZevXqF7t27o2vXrtrdwFzExsbC2NgYhoaG76U/IiIigEkbFULNmjVx69Ytjddr1qwZkpOTERAQgPLly6NUqVIAgCZNmuCPP/7AL7/8Ip1GzYuZmRl69OiB7777Djt37sTevXsRGxsrLb9w4YJS/QsXLqBy5cpqxaivr4/MzEyVy27cuIGaNWuq1Q4REZG2MGmjAvPx8cHNmzdzPdqWm7Jly8LJyQkrVqyQjrIBb47O2dvbY/369XmeGgWAgIAA/Pjjj7hz5w7u3buH3bt3w9bWVmlutd27d2Pjxo24d+8epk+fjj/++APDhg1TK0YXFxckJSXh5MmTiImJQUpKirTs9OnTaNWqlUbbTEREVFhM2qjAqlWrhlq1amHXrl0ar9usWTMkJiZK17Nl8/LyQmJiYr5Jm6mpKRYuXIjatWujTp06ePjwIY4cOQIdnX8/0jNnzsSOHTtQvXp1bNmyBT/++KPStXV5adCgAQYPHowePXrA2toaCxcuBAA8fvwY586dg5+fn2YbTEREVEi8YTwVyuHDhzF+/HjcuHFDKWH60GQyGfbv349OnTpptd0JEyYgLi4O69ev12q7RERE+dH90AFQ8dauXTvcv38fjx8/hqOj44cOp8iVKlUKY8aM+dBhEBHRJ4hH2ug/qaiOtBEREX0oPNJG/0n8LUJERP81H89FSERERESUKyZtRERERMUAkzYiIiKiYoBJGxEREVExwKSNiIiIqBhg0kZERERUDDBpIyIiIioGmLQRERERFQNM2oiIiIiKgf8DEWlolODBuJQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(6.4, 3.4))\n", "labels = [\"step-0 control\\n(FW split)\", \"MSA converged\"]\n", "vals = [anchors[\"control_displayed\"], anchors[\"converged_displayed\"]]\n", "bars = ax.bar(labels, vals, color=[\"#c44e52\", \"#4c72b0\"], zorder=3, width=0.55)\n", "ax.axhline(m[\"floor_gap\"], color=\"#9a9a9a\", ls=\"--\", lw=1.2,\n", " label=f\"resolution floor {m['floor_gap']:.3f}\")\n", "for b, v in zip(bars, vals):\n", " ax.text(b.get_x() + b.get_width() / 2, v + 0.008, f\"{v:.3f}\",\n", " ha=\"center\", va=\"bottom\", fontsize=9)\n", "ax.set_ylabel(\"RG_D1 (frozen-field BR gap, displayed)\")\n", "ax.set_ylim(0, max(vals) * 1.18)\n", "ax.set_title(f\"{scenario.name}: {anchors['separation']:.1f}x separation \"\n", " f\"(declared >= {anchors['separation_factor']:g}x)\")\n", "ax.legend(fontsize=8, loc=\"upper right\")\n", "fig.tight_layout()\n", "fig" ] }, { "cell_type": "markdown", "id": "dtsim-13", "metadata": {}, "source": [ "## Takeaways & pointers\n", "\n", "- **Deterministic track, structurally.** The engine consumes no seed (the LCG is time-step-keyed),\n", " so `seed_list=()`, there are no macroreps, and `per_seed_scenarios` refuses the empty list —\n", " macrorep misuse is impossible. `scenario.seed` stays hashed but is engine-inert.\n", "- **`rc=0` silent failures are the engine's signature.** Pre-period drops head-block later\n", " same-first-link agents, period-end truncation leaves `07:00:00` filler chains, and an unsorted\n", " `vehicle.csv` silently corrupts the later-departing agent — all at exit code 0. Success is\n", " DEFINED by the parse + completion census, never `returncode` (the adr-029 doctrine); the\n", " certifier writes `vehicle.csv` itself, sorted by `(departure_time, agent)`.\n", "- **`OMP_NUM_THREADS=1` is a CORRECTNESS pin, not hygiene.** The engine's `#pragma omp parallel\n", " for` over a shared `std::deque` diverges and SIGSEGVs at OMP>1 on a congested net; the child env\n", " always pins it (beating a hostile parent), which is why the raw trajectory bytes are\n", " reproducible and G1 is byte-exact.\n", "- **`RG_D1` is not Wardrop `relative_gap`** and not `dtalite-tap`'s `relative_gap` (same wheel,\n", " different engine). A separate leaderboard table (R8); never compared across engines/tracks.\n", "- **Provenance vs score.** DTALite's printed gap/summary and its debug logs are provenance only;\n", " `X` and the frozen field are defined by the pinned replay map, which is why a self-reported\n", " record is never gated.\n", "\n", "See [ADR-040](../../docs/design/adr-040-dtalite-simulation.md) for the measured family constants\n", "(the R4 re-derivation, the head-block/lull/boost hazards, the fftt-column probe) and\n", "[ADR-036](../../docs/design/adr-036-external-dynamic-observational-certificate.md) for the\n", "certificate." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" }, "tabench": { "covers": [], "requires_extra": "dtalite", "track": "external", "unit": "dtalite-simulation" } }, "nbformat": 4, "nbformat_minor": 5 }