---
format:
html:
toc: true
toc-depth: 2
theme: {dark: darkly, light: cosmo}
number-sections: false
number-depth: 0
code-fold: false
code-tools: true
highlight-style: nord
---
<style></style><style>.printedClojure .sourceCode {
background-color: transparent;
border-style: none;
}
</style><style>.clay-limit-image-width .clay-image {max-width: 100%}
.clay-side-by-side .sourceCode {margin: 0}
.clay-side-by-side {margin: 1em 0}
</style>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" type="text/javascript"></script><script src="https://code.jquery.com/ui/1.13.1/jquery-ui.min.js" type="text/javascript"></script>
```{=html}
<div style="display:none;"><style>/* ---------------------------------------------------------------
Fedoras — one palette, two schemes.
Dark is the default. Quarto puts .quarto-light on the body when the
reader flips the toggle, and everything below is written against
these variables, so a scheme change is nine lines rather than three
hundred.
--------------------------------------------------------------- */
:root {
--paper: #1b1d21; /* background */
--ink: #e6e4df; /* text */
--ink-soft: #a9a49b; /* secondary text */
--rule: rgba(230, 228, 223, 0.22);
--panel: rgba(230, 228, 223, 0.05);
--violet: #9d8dff; /* apparatus, epigraphs */
--gold: #d0a44c; /* beats, commits */
--coral: #e2707c; /* moderation, rewrites */
--green: #6fcf9b; /* the Helps */
--blurple: #8b95f0; /* Discord */
--violet-rgb: 157, 141, 255;
--gold-rgb: 208, 164, 76;
--coral-rgb: 226, 112, 124;
--green-rgb: 111, 207, 155;
--blurple-rgb: 139, 149, 240;
--ink-rgb: 168, 164, 156;
--panel-hard: #101215;
}
body.quarto-light {
--paper: #faf8f4;
--ink: #1c1f24;
--ink-soft: #6b665e;
--rule: rgba(28, 31, 36, 0.22);
--panel: rgba(28, 31, 36, 0.05);
--violet: #6c5ce7;
--gold: #b0863a;
--coral: #e04f5f;
--green: #2ea078;
--blurple: #5865f2;
--violet-rgb: 108, 92, 231;
--gold-rgb: 176, 134, 58;
--coral-rgb: 224, 79, 95;
--green-rgb: 46, 160, 120;
--blurple-rgb: 88, 101, 242;
--ink-rgb: 128, 128, 128;
--panel-hard: #14161a;
}
/* ---------------------------------------------------------------
Fedoras — screenplay typography for the HTML edition.
Loaded by fedoras.screenplay/assets. Edit here, rebuild, done.
PDF styling lives in notebooks/tex/fedoras-preamble.tex instead.
--------------------------------------------------------------- */
.screenplay {
font-family: "Courier Prime", "Courier New", ui-monospace, monospace;
font-size: 1rem;
line-height: 1.35;
max-width: 62ch;
margin: 1.6rem 0 2.2rem 0;
}
.screenplay .slug {
font-weight: 700;
letter-spacing: 0.04em;
margin: 1.6rem 0 0.8rem 0;
}
.screenplay .action {
margin: 0 0 0.85rem 0;
}
.action{
white-space: pre-line;
}
.screenplay .action.beat {
margin-bottom: 0.35rem;
}
.screenplay .dialogue {
margin: 0 0 0.95rem 0;
}
.screenplay .character {
margin: 0 0 0 12ch;
font-weight: 700;
letter-spacing: 0.06em;
}
.screenplay .paren {
margin: 0 0 0 9ch;
font-style: italic;
opacity: 0.85;
}
.screenplay .lines {
margin-left: 6ch;
max-width: 50ch;
}
.screenplay .line {
margin: 0;
}
.screenplay .transition {
margin: 1.1rem 0 1.1rem 0;
text-align: right;
font-weight: 700;
letter-spacing: 0.08em;
}
.screenplay .direction {
font-style: italic;
opacity: 0.85;
margin: 0 0 0.9rem 0;
}
/* In-world text: banners, signs, whiteboards. */
.screenplay .sign {
border: 1px solid currentColor;
padding: 0.7rem 1rem;
margin: 0.9rem 0 1.1rem 4ch;
max-width: 46ch;
text-align: center;
letter-spacing: 0.05em;
}
.screenplay .sign p {
margin: 0.15rem 0;
}
.screenplay .whiteboard {
text-align: left;
}
.screenplay .whiteboard-title {
font-weight: 700;
text-transform: uppercase;
margin-bottom: 0.4rem !important;
}
.screenplay .whiteboard ol {
margin: 0;
padding-left: 2.2ch;
}
/* --- The Fedora Handbook epigraphs ------------------------------- */
.handbook {
max-width: 54ch;
margin: 1.4rem 0 2rem 2ch;
padding-left: 1.1rem;
border-left: 3px solid var(--violet);
font-style: italic;
}
.handbook .rule-number {
font-style: normal;
font-variant: small-caps;
letter-spacing: 0.08em;
opacity: 0.75;
margin-bottom: 0.25rem;
}
.handbook .rule-text {
margin: 0;
}
/* --- Drafting apparatus (hidden in the reading copy) -------------- */
.beats {
border: 1px dashed var(--gold);
background: rgba(var(--gold-rgb), 0.07);
padding: 0.6rem 0.9rem;
margin: 1.1rem 0;
max-width: 62ch;
font-size: 0.88rem;
}
.beats-title {
font-variant: small-caps;
letter-spacing: 0.1em;
font-weight: 700;
margin: 0 0 0.35rem 0;
opacity: 0.8;
}
.beats ul {
margin: 0;
padding-left: 1.4rem;
}
.beats.note {
border-color: var(--blurple);
background: rgba(var(--blurple-rgb), 0.07);
}
.status {
display: inline-block;
font-family: ui-monospace, monospace;
font-size: 0.7rem;
letter-spacing: 0.14em;
padding: 0.15rem 0.5rem;
border-radius: 3px;
margin: 0 0 0.8rem 0;
}
.status-outline { background: var(--ink-soft); color: #fff; }
.status-draft { background: var(--gold); color: #fff; }
.status-locked { background: var(--green); color: #fff; }
/* --- Live (editable) code cells ---------------------------------- */
.live-cell {
border: 1px solid rgba(var(--ink-rgb), 0.4);
border-radius: 5px;
padding: 0.7rem 0.8rem;
margin: 1.2rem 0;
max-width: 68ch;
}
.live-label {
font-size: 0.78rem;
letter-spacing: 0.09em;
text-transform: uppercase;
opacity: 0.7;
margin-bottom: 0.45rem;
}
.live-src {
width: 100%;
font-family: ui-monospace, "Courier New", monospace;
font-size: 0.9rem;
line-height: 1.4;
padding: 0.5rem;
border: 1px solid rgba(var(--ink-rgb), 0.35);
border-radius: 4px;
background: rgba(var(--ink-rgb), 0.06);
resize: vertical;
}
.live-bar {
margin-top: 0.5rem;
display: flex;
gap: 0.5rem;
align-items: center;
}
.live-run {
font: inherit;
font-size: 0.85rem;
padding: 0.25rem 0.9rem;
border-radius: 4px;
border: 1px solid rgba(var(--ink-rgb), 0.5);
background: rgba(var(--violet-rgb), 0.15);
cursor: pointer;
}
.live-run:hover { background: rgba(var(--violet-rgb), 0.3); }
.live-out {
margin: 0.5rem 0 0 0;
padding: 0.45rem 0.6rem;
min-height: 1.6rem;
font-size: 0.88rem;
white-space: pre-wrap;
border-left: 3px solid rgba(var(--violet-rgb), 0.6);
background: rgba(var(--ink-rgb), 0.06);
}
/* --- Front matter ------------------------------------------------- */
.title-page {
text-align: center;
margin: 3rem 0 2rem 0;
}
.title-page .title {
font-family: "Courier Prime", "Courier New", monospace;
font-size: 3.2rem;
letter-spacing: 0.22em;
margin: 0;
}
.title-page .subtitle {
font-family: "Courier Prime", "Courier New", monospace;
letter-spacing: 0.1em;
margin-top: 0.8rem;
opacity: 0.85;
}
h1.sidebar-title,
h2.sidebar-title {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
.personae {
max-width: 66ch;
}
.personae h3 {
font-variant: small-caps;
letter-spacing: 0.1em;
margin-top: 2rem;
border-bottom: 1px solid rgba(var(--ink-rgb), 0.35);
padding-bottom: 0.2rem;
}
.personae .who {
font-family: "Courier Prime", "Courier New", monospace;
font-weight: 700;
letter-spacing: 0.06em;
margin: 1rem 0 0.1rem 0;
}
.personae .what {
margin: 0 0 0.2rem 0;
font-style: italic;
opacity: 0.8;
}
.personae .desc {
margin: 0.15rem 0 0 0;
max-width: 60ch;
}
/* --- The reader's protagonist ------------------------------------ */
.pc-name {
font-weight: inherit;
border-bottom: 1px dotted rgba(var(--violet-rgb), 0.55);
}
.screenplay .slug,
.screenplay .transition,
.screenplay .character { text-transform: uppercase; }
.name-field {
border: 1px solid rgba(var(--violet-rgb), 0.55);
border-radius: 5px;
padding: 0.9rem 1rem;
margin: 1.6rem auto;
max-width: 60ch;
}
.name-label { margin: 0 0 0.6rem 0; }
.name-inputs { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.name-inputs input {
font: inherit;
padding: 0.3rem 0.6rem;
border: 1px solid rgba(var(--ink-rgb), 0.45);
border-radius: 4px;
background: rgba(var(--ink-rgb), 0.06);
max-width: 14ch;
}
.name-note {
font-size: 0.82rem;
opacity: 0.7;
margin: 0.6rem 0 0 0;
}
.name-label,
.name-confirm {
font-size: 1.2rem;
}
.name-inputs input,
.name-inputs button {
font: inherit;
font-size: 1.2rem;
}
/* --- Artifacts ---------------------------------------------------- */
.artifact {
font-family: ui-monospace, "Courier New", monospace;
font-size: 0.88rem;
line-height: 1.45;
max-width: 66ch;
margin: 1.4rem 0;
border-radius: 5px;
overflow: hidden;
}
.artifact p { margin: 0.1rem 0; }
/* Discord */
.discord { border: 1px solid rgba(var(--blurple-rgb), 0.5); }
.discord-head {
background: rgba(var(--blurple-rgb), 0.14);
padding: 0.4rem 0.8rem;
display: flex; gap: 0.8rem;
}
.discord-server { font-weight: 700; letter-spacing: 0.06em; }
.discord-channel { opacity: 0.75; }
.discord-body { padding: 0.7rem 0.8rem; }
.discord-msg { margin-bottom: 0.7rem; }
.discord-who { font-weight: 700; }
.discord-role {
font-size: 0.7rem; letter-spacing: 0.08em;
background: rgba(var(--violet-rgb), 0.25);
padding: 0.05rem 0.4rem; border-radius: 3px; margin-left: 0.4rem;
}
.discord-at { opacity: 0.55; margin-left: 0.5rem; font-size: 0.78rem; }
.discord-reacts { margin-top: 0.2rem !important; }
.react {
display: inline-block; font-size: 0.75rem;
border: 1px solid rgba(var(--ink-rgb),0.35); border-radius: 10px;
padding: 0 0.45rem; margin-right: 0.3rem;
}
/* Moderation log */
.modlog {
border-left: 3px solid var(--coral);
background: rgba(var(--coral-rgb), 0.08);
padding: 0.6rem 0.9rem;
font-size: 0.82rem;
letter-spacing: 0.03em;
}
/* Git */
.commit {
border: 1px solid rgba(var(--ink-rgb), 0.4);
padding: 0.7rem 0.9rem;
background: rgba(var(--ink-rgb), 0.05);
}
.commit-hash { color: var(--gold); font-weight: 700; }
.commit-meta { opacity: 0.7; }
.commit-msg { margin-top: 0.5rem; padding-left: 1.5rem; }
/* Terminal */
.terminal {
background: var(--panel-hard);
color: var(--ink);
padding: 0.7rem 0.9rem;
border: 1px solid rgba(var(--ink-rgb),0.35);
}
.term-in { color: var(--green); }
.term-in::before { content: ""; }
.term-out { opacity: 0.9; }
/* AI */
.aichat { border: 1px solid rgba(var(--green-rgb), 0.5); }
.ai-model {
background: rgba(var(--green-rgb), 0.16);
padding: 0.35rem 0.8rem !important;
font-weight: 700; letter-spacing: 0.1em; font-size: 0.75rem;
}
.ai-system { padding: 0.4rem 0.8rem; font-size: 0.8rem; opacity: 0.85; }
.ai-system pre { white-space: pre-wrap; margin: 0.4rem 0 0 0; }
.ai-body { padding: 0.6rem 0.8rem; }
.ai-turn { margin-bottom: 0.6rem; }
.ai-role { font-size: 0.68rem; letter-spacing: 0.12em; opacity: 0.6; }
.ai-assistant .ai-text { border-left: 2px solid rgba(46,160,120,0.6); padding-left: 0.6rem; }
/* Email */
.email { border: 1px solid rgba(var(--ink-rgb),0.45); padding: 0.7rem 0.9rem; }
.email-head td { padding: 0 0.6rem 0.1rem 0; vertical-align: top; font-size: 0.82rem; }
.email-head td:first-child { opacity: 0.6; }
.email-body { margin-top: 0.6rem; }
/* Handouts */
.handout {
border: 1px solid currentColor;
padding: 1rem 1.2rem;
font-family: "Courier Prime", "Courier New", monospace;
}
.handout-title {
font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase;
border-bottom: 1px solid currentColor; padding-bottom: 0.4rem;
margin-bottom: 0.7rem !important;
}
.handout-table { width: 100%; font-size: 0.85rem; margin: 0.5rem 0; }
.handout-table td.k { opacity: 0.65; width: 34%; padding-right: 1rem; vertical-align: top; }
/* --- Prose between scenes ---------------------------------------- */
.prose {
max-width: 64ch;
margin: 1.5rem 0 2rem 0;
font-family: "Iowan Old Style", "Palatino Linotype", Palatino,
"Book Antiqua", Georgia, serif;
font-size: 1.06rem;
line-height: 1.65;
color: var(--ink);
}
.prose p {
margin: 0 0 1.05rem 0;
}
.prose p:first-child { margin-top: 0; }
.prose p:last-child { margin-bottom: 0; }
blockquote.turn {
max-width: 64ch;
border-left: 3px solid rgba(var(--violet-rgb), 0.6);
padding-left: 1rem;
margin: 1.4rem 0 0.6rem 0;
}
.name-confirm {
margin: 0.7rem 0 0 0;
font-weight: 600;
}
/* --- The d20 ------------------------------------------------------ */
.roll {
border: 1px solid rgba(var(--violet-rgb), 0.5);
border-radius: 5px;
padding: 0.7rem 0.9rem;
margin: 1.2rem 0;
max-width: 60ch;
font-family: ui-monospace, "Courier New", monospace;
}
.roll-head {
display: flex;
justify-content: space-between;
font-size: 0.75rem;
letter-spacing: 0.12em;
opacity: 0.75;
margin-bottom: 0.5rem;
}
.roll-bar { display: flex; gap: 0.7rem; align-items: center; margin-top: 0.3rem; }
.roll-go, .roll-rewrite {
font: inherit;
font-size: 0.82rem;
padding: 0.25rem 0.9rem;
border-radius: 4px;
border: 1px solid rgba(var(--ink-rgb), 0.5);
background: rgba(var(--violet-rgb), 0.15);
cursor: pointer;
}
.roll-rewrite { background: rgba(var(--coral-rgb), 0.12); }
.roll-go:hover { background: rgba(var(--violet-rgb), 0.3); }
.roll-rewrite:hover { background: rgba(var(--coral-rgb), 0.25); }
.roll-value { font-size: 0.9rem; letter-spacing: 0.05em; }
.roll-out {
margin: 0.6rem 0 0 0 !important;
font-family: "Courier Prime", "Courier New", monospace;
min-height: 1.2rem;
}
.roll-echo { font-size: 0.8rem; opacity: 0.8; }
.roll-note { font-size: 0.8rem; opacity: 0.6; margin: 0.4rem 0 0 0 !important; }
.roll-foot {
font-size: 0.72rem;
letter-spacing: 0.1em;
opacity: 0.55;
margin: 0.5rem 0 0 0 !important;
border-top: 1px solid rgba(var(--ink-rgb),0.25);
padding-top: 0.35rem;
}
.roll-cue {
margin: 0.6rem 0 0 4ch !important;
font-family: "Courier Prime", "Courier New", monospace;
font-weight: 700;
letter-spacing: 0.06em;
}
.roll-line {
margin: 0 0 0 6ch !important;
max-width: 40ch;
font-family: "Courier Prime", "Courier New", monospace;
}
.roll-out .roll-line:first-child { margin-left: 0 !important; max-width: none; }
.companion-name {
font-family: "Courier Prime", "Courier New", monospace;
font-weight: 700;
letter-spacing: 0.14em;
font-size: 1.05rem;
margin: 0.7rem 0 0.3rem 0 !important;
}
.companion-intro { max-width: 58ch; margin: 0 0 0.3rem 0 !important; }
.session { max-width: 60ch; margin: 1.1rem 0; }
.session-who {
font-family: "Courier Prime", "Courier New", monospace;
font-weight: 700; letter-spacing: 0.12em; margin: 0 0 0.3rem 0 !important;
}
.session-text { margin: 0 !important; }
.ac-name { border-bottom: 1px dotted rgba(var(--violet-rgb), 0.55); }
.companion-naming { margin-top: 0.6rem; }
/* --- Plots -------------------------------------------------------- */
.plot {
border: 1px solid rgba(var(--violet-rgb), 0.5);
border-radius: 5px;
padding: 0.7rem 0.9rem;
margin: 1.2rem 0;
max-width: 62ch;
font-family: ui-monospace, "Courier New", monospace;
}
.plot-controls {
display: flex; gap: 1rem; flex-wrap: wrap;
font-size: 0.8rem; opacity: 0.85; margin: 0.4rem 0;
}
.plot-controls input {
font: inherit; font-size: 0.8rem; width: 7ch;
padding: 0.15rem 0.35rem;
border: 1px solid rgba(var(--ink-rgb),0.45);
border-radius: 3px;
background: rgba(var(--ink-rgb),0.06);
}
.plot-status { font-size: 0.75rem; letter-spacing: 0.1em; opacity: 0.7; }
.plot canvas {
display: block;
margin-top: 0.6rem;
background: var(--paper);
border: 1px solid rgba(var(--ink-rgb),0.3);
border-radius: 3px;
}
.roll-go:disabled, .roll-rewrite:disabled {
opacity: 0.4;
cursor: default;
}
.sketch {
border: 1px solid rgba(var(--violet-rgb), 0.5);
border-radius: 5px;
padding: 0.7rem 0.9rem;
margin: 1.2rem 0;
max-width: 62ch;
font-family: ui-monospace, "Courier New", monospace;
}
.sketch canvas {
display: block;
margin-top: 0.7rem;
background: var(--paper);
border: 1px solid rgba(var(--ink-rgb),0.3);
border-radius: 3px;
max-width: 100%;
}
.sketch-page {
margin-top: 0.7rem;
padding: 0.5rem 0.6rem;
border: 1px solid rgba(var(--ink-rgb),0.3);
border-radius: 3px;
background: rgba(var(--ink-rgb),0.04);
font-family: ui-monospace, "Courier New", monospace;
font-size: 0.9rem;
}
.sketch-page button {
font: inherit; font-size: 0.85rem;
border: 1px solid rgba(var(--ink-rgb),0.45);
border-radius: 3px;
background: rgba(var(--ink-rgb),0.08);
cursor: pointer;
min-width: 2ch;
}
/* --- The page itself, when Quarto is not doing it for us ---------- */
.screenplay, .artifact, .prose, .handout, .beats, .roll, .plot, .sketch,
.todo, .puzzle-box, .personae, .name-field, .live-cell, .session {
color: var(--ink);
}
.handout, .puzzle-cell, .sign { border-color: var(--rule); }
.terminal { background: var(--panel-hard); color: var(--ink); }
.title-page .title, .title-page .subtitle { color: var(--ink); }
/* --- Form controls -------------------------------------------------
Inputs, textareas and buttons do not inherit colour from the page,
so every one of them needs telling, or the reader types black on
black and cannot see what they are writing.
------------------------------------------------------------------- */
.name-inputs input,
.companion-input,
.todo-input,
.plot-controls input,
.live-src,
.sketch textarea,
.sketch-page input {
color: var(--ink);
background: var(--panel);
border-color: var(--rule);
caret-color: var(--ink);
}
.name-inputs input::placeholder,
.companion-input::placeholder,
.todo-input::placeholder,
.sketch-page input::placeholder,
.live-src::placeholder {
color: var(--ink-soft);
opacity: 1;
}
.roll-go, .roll-rewrite, .live-run, .todo-del,
.sketch-page button, .puzzle-cell {
color: var(--ink);
}
.sketch-page button {
background: var(--panel);
border-color: var(--rule);
}
/* Quarto's own search box does not follow the book's palette on every
theme, so it is told here as well. */
#quarto-search input,
#quarto-search .aa-Input,
.aa-Form,
.aa-InputWrapper input,
.quarto-search input {
background: var(--panel) !important;
color: var(--ink) !important;
border-color: var(--rule) !important;
}
.aa-Form { border: 1px solid var(--rule) !important; }
#quarto-search input::placeholder,
.aa-Input::placeholder {
color: var(--ink-soft) !important;
opacity: 1;
}
.aa-DetachedSearchButton, .quarto-search-button {
background: var(--panel) !important;
color: var(--ink) !important;
border-color: var(--rule) !important;
}
/* Canvases inherit nothing, so the sketch cells read their ink off the
element's own resolved colour. This is the line that gives them one. */
.sketch canvas, .plot canvas {
color: var(--ink);
background: transparent;
}
.tribute-heading {
margin: 2rem 0 0.5rem;
font-variant: small-caps;
font-weight: 600;
letter-spacing: 0.04em;
}
.tribute p {
margin: 0.6rem 0;
}
.tribute-meta {
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid var(--bs-border-color);
text-align: right;
font-size: 0.85rem;
}
.tribute-meta p {
margin: 0.25rem 0;
}
.tribute-date {
font-style: italic;
}
.tribute-attribution {
font-size: 1rem;
}
.tribute-source {
margin-top: 0.75rem !important;
}
.footnote {
margin-top: 1.5rem;
font-size: 0.9rem;
color: var(--bs-secondary);
}
/* ---------------------------------------------------------------
The three endings.
All three are in the HTML. Which one is visible is a class on
<body>, written once by fedoras.reader/paint-standing! from the
reader's standing, so a chapter that forks does it here rather than
in nine lines of DOM work per passage.
A page with no class on it shows the middle one. That is what the
print edition gets, and it is what the table actually got, and the
PDF reads straight through with no gap and no note.
--------------------------------------------------------------- */
.ending { display: none; }
.ending-reconciled { display: block; }
body.standing-closed .ending-reconciled { display: none; }
body.standing-outstanding .ending-reconciled { display: none; }
body.standing-closed .ending-closed { display: block; }
body.standing-outstanding .ending-outstanding { display: block; }
@media print {
.ending { display: none !important; }
.ending-reconciled { display: block !important; }
}
/* ---------------------------------------------------------------
The slips.
--------------------------------------------------------------- */
.slip {
margin: 1.2rem 0 1.2rem 4ch !important;
padding-left: 1rem;
max-width: 46ch;
border-left: 2px solid rgba(var(--coral-rgb), 0.55);
font-family: "Courier Prime", "Courier New", monospace;
font-style: italic;
opacity: 0.8;
white-space: pre-wrap;
}
#quarto-margin-sidebar { display: none; }
.scene-code {
border: 1px solid var(--rule);
border-radius: 3px;
padding: 0.6rem 0.8rem;
margin: 0.9rem 0 1.1rem 0;
max-width: 62ch;
font-family: ui-monospace, "Courier New", monospace;
font-size: 0.88rem;
line-height: 1.45;
background: var(--panel);
color: var(--ink);
overflow-x: auto;
}
.scene-code pre { margin: 0; }
.scene-code code { background: none; padding: 0; }
/* Pressing Enroll flashes the name it confirms, the same name or a new
one, so the press can be seen to have done something. */
.name-confirm .pc-name.pc-flash {
animation: pc-flash 1.4s ease-out;
}
@keyframes pc-flash {
0%, 30% { color: var(--green); }
}</style><script src="scittle.js" type="application/javascript"></script><div style="display:none;"><script type="application/x-scittle">(ns fedoras.carry
"What the reader carries between chapters."
(:require [clojure.string :as str]))
(def ^:private book-key
"The registration on the front of the file. It is not a secret and it
is not pretending to be one — it is the number this is keyed to, and
it is the same number a reader has been looking at since August."
3812)
;; ---------------------------------------------------------------------
;; Bytes
;; ---------------------------------------------------------------------
(defn- to-bytes [s] (.encode (js/TextEncoder.) s))
(defn- from-bytes [b] (.decode (js/TextDecoder. "utf-8") b))
(defn- bytes->str [b]
(loop [i 0 acc ""]
(if (>= i (.-length b))
acc
(recur (inc i) (str acc (js/String.fromCharCode (aget b i)))))))
(defn- str->bytes [s]
(let [out (js/Uint8Array. (count s))]
(dotimes [i (count s)] (aset out i (.charCodeAt s i)))
out))
;; ---------------------------------------------------------------------
;; The keystream
;;
;; The same small xorshift the dice and the floors use, so there is one
;; generator in this project and not four.
;; ---------------------------------------------------------------------
(defn- keystream [n seed]
(let [out (js/Uint8Array. n)]
(loop [i 0 x (bit-or 1 (bit-and seed 0x7fffffff))]
(if (>= i n)
out
(let [x (bit-and (bit-xor x (bit-shift-left x 13)) 0x7fffffff)
x (bit-and (bit-xor x (unsigned-bit-shift-right x 17)) 0x7fffffff)
x (bit-and (bit-xor x (bit-shift-left x 5)) 0x7fffffff)]
(aset out i (bit-and x 0xff))
(recur (inc i) x))))))
(defn- mask [b seed]
(let [k (keystream (.-length b) seed)
out (js/Uint8Array. (.-length b))]
(dotimes [i (.-length b)] (aset out i (bit-xor (aget b i) (aget k i))))
out))
;; ---------------------------------------------------------------------
;; Base64, url-safe
;; ---------------------------------------------------------------------
(defn- b64 [b]
(-> (js/btoa (bytes->str b))
(str/replace "+" "-")
(str/replace "/" "_")
(str/replace "=" "")))
(defn- un-b64 [s]
(let [t (-> s (str/replace "-" "+") (str/replace "_" "/"))
pad (case (mod (count t) 4) 2 "==" 3 "=" "")]
(str->bytes (js/atob (str t pad)))))
;; ---------------------------------------------------------------------
;; Rolls, short
;; ---------------------------------------------------------------------
(defn- pack-rolls
"[roll mod rewrites], shortest form. A roll with no modifier and no
rewrites is one number."
[rolls]
(into {}
(for [[id {:keys [roll mod rewrites]}] rolls
:when roll]
[id (cond
(pos? (or rewrites 0)) [roll (or mod 0) rewrites]
(not (zero? (or mod 0))) [roll mod]
:else [roll])])))
(defn- unpack-rolls
"Every shape this has ever emitted: a bare number, the short vector,
and the verbose map that went out while `pack-rolls` was sitting here
unused. Tokens from before this change still read."
[m]
(into {}
(for [[id v] m]
[(clojure.core/name id)
(cond
(number? v) {:roll v :mod 0 :rewrites 0}
(map? v) {:roll (:roll v)
:mod (or (:mod v) 0)
:rewrites (or (:rewrites v) 0)}
:else {:roll (nth v 0)
:mod (nth v 1 0)
:rewrites (nth v 2 0)})])))
;; ---------------------------------------------------------------------
;; The token
;; ---------------------------------------------------------------------
(defn- checksum [b]
(loop [i 0 s 7]
(if (>= i (.-length b))
(mod s 251)
(recur (inc i) (mod (+ (* s 31) (aget b i)) 251)))))
(defn pack
"A map to a token. The keys are one letter each because this goes in
a query string thirty times a page."
[{:keys [name companion echo rolls deeds epoch todo]}]
(try
(let [payload (js/JSON.stringify
(clj->js
(cond-> {}
name (assoc :n name)
companion (assoc :a [(:n companion) (:given companion)])
(pos? (or echo 0)) (assoc :e echo)
(seq rolls) (assoc :r (pack-rolls rolls))
(seq deeds) (assoc :d (mapv clojure.core/name deeds))
;; when the reader last withdrew the whole record.
;; it travels because the alternative is that only
;; the state travels, and then a link from before
;; the withdrawal quietly reinstates it.
(pos? (or epoch 0)) (assoc :g epoch)
(seq todo) (assoc :t [(:seq todo 0) (:items todo)]))))
body (mask (to-bytes payload) book-key)
out (js/Uint8Array. (inc (.-length body)))]
(aset out 0 (checksum body))
(dotimes [i (.-length body)] (aset out (inc i) (aget body i)))
(b64 out))
(catch :default _ nil)))
(defn unpack
"A token back to a map, or nil if anybody has been at it.
An absent field comes back empty rather than missing, which is fine
and is not a licence: the caller merges this forward and knows that an
empty Echo means the token is old, not that the Echo is nought."
[s]
(try
(when-not (str/blank? s)
(let [raw (un-b64 s)
want (aget raw 0)
body (.slice raw 1)]
(when (= want (checksum body))
(let [m (js->clj (js/JSON.parse (from-bytes (mask body book-key)))
:keywordize-keys true)]
{:name (:n m)
:companion (when-let [a (:a m)] {:n (first a) :given (or (second a) "")})
:echo (or (:e m) 0)
:rolls (unpack-rolls (or (:r m) {}))
:deeds (mapv keyword (or (:d m) []))
:epoch (or (:g m) 0)
:todo (when-let [t (:t m)] {:seq (first t) :items (or (second t) [])})}))))
(catch :default _ nil)))
;; ---------------------------------------------------------------------
;; When it does not reconcile
;; ---------------------------------------------------------------------
(defn complain! []
(js/console.warn
"016.09 — entry does not reconcile and has not been carried forward. Retained."))</script><script type="application/x-scittle">(ns fedoras.reader
"Everything the reader owns.
One atom: containing Name, animal, echo, fortune, score, deeds. A widget
reads it and never touches storage directly, and every change goes through
one of the setters, which writes, re-reads, and lets the watches fire."
(:require [clojure.string :as str]
[fedoras.carry :as carry]))
;; ---------------------------------------------------------------------
;; Storage
;; ---------------------------------------------------------------------
(def prefix "fedoras.")
(def carry-param :f)
(def forget-param
"A page that loads with this on it withdraws its own record and stops.
It is a separate field from the token because it must work on a page
that has never seen a token."
:forget)
(def withdrawn-param
"Survives exactly one reload, to say the thing was done. The state it
would otherwise have been recorded in has just been deleted, which is
the one place a confirmation cannot live."
:withdrawn)
(def legacy-params
"The fields the query string used to carry, one per fact. Stripped off
any link that still has them. There was a second copy of this list
called `carried-params` and the two had drifted."
[:pc :pcl :ac :acn :echo :fortune :score])
(defn- read-json [s]
(js->clj (js/JSON.parse s) :keywordize-keys true))
(defn- write-json [v]
(js/JSON.stringify (clj->js v)))
(defn stored [key]
(try
(when-let [s (.getItem js/localStorage (str prefix (name key)))]
(read-json s))
(catch :default _ nil)))
(defn store! [key val]
(try (.setItem js/localStorage (str prefix (name key)) (write-json val))
(catch :default _ nil))
val)
(defn remove!
"Take something out rather than writing an empty one over it, because
a stored nil and a missing key read back the same and only one of them
is what was meant."
[key]
(try (.removeItem js/localStorage (str prefix (clojure.core/name key)))
(catch :default _ nil)))
(defn storage-works?
"Whether anything at all is going to be persisted.
On a file:// path some browsers give every page its own opaque origin,
which means localStorage throws and the whole book forgets the reader
the moment they click anything. Worth knowing rather than guessing."
[]
(try
(.setItem js/localStorage (str prefix "probe") "1")
(let [ok (= "1" (.getItem js/localStorage (str prefix "probe")))]
(.removeItem js/localStorage (str prefix "probe"))
ok)
(catch :default _ false)))
;; ---------------------------------------------------------------------
;; The query string, which is a transport and nothing else
;; ---------------------------------------------------------------------
(defn- current-url [] (js/URL. (.-href js/location)))
(defn param [key]
(try
(let [v (.get (.-searchParams (current-url)) (name key))]
(when-not (str/blank? v) v))
(catch :default _ nil)))
(defn set-params! [m]
(try
(let [u (current-url) sp (.-searchParams u)]
(doseq [[k v] m]
(if (or (nil? v) (= "" v))
(.delete sp (name k))
(.set sp (name k) (str v))))
(.replaceState js/history nil "" (.toString u)))
(catch :default _ nil)))
(defn- int-or [v d]
(let [n (js/parseInt (str v) 10)] (if (js/isNaN n) d n)))
;; ---------------------------------------------------------------------
;; The atom
;; ---------------------------------------------------------------------
(def default-name ["Owen" "Mercer"])
(def state (atom nil))
(def animal-names
"Number to the animal's grammar: what it is called, what more than one
of them is called, what a ledger would file it under. Filled in by
`fedoras.state/assets` from a later script tag, so it is empty for the
moment between this file being read and the roster arriving, and
nothing here may treat an empty roster as a missing roll."
(atom {}))
(defn- as-grammar
"One roster entry, whatever shape it turned up in.
The page used to be handed {1 \"Pigeon\"} and is now handed
{1 {:animal \"Pigeon\" :plural \"pigeons\" ...}}, and a book whose
`names-form` has not caught up with its roster hands over one of each.
A bare string is an animal with no grammar, which is precisely what it
was before, so it becomes one here.
This is normalised at the boundary rather than at each use because the
alternative was a `merge` three functions away receiving a string,
throwing `conj on a map takes map entries`, and taking down every
render watch on the page — a build that is one function out of step
should read a little worse, not stop."
[v]
(cond
(map? v) v
(string? v) {:animal v}
:else {}))
(defn- read-companion []
(let [s (stored :companion)
n (int-or (first s) nil)]
(when (and n (<= 1 n 20))
(let [given (or (nth s 2 nil) "")
g (as-grammar (get @animal-names n))
;; the animal's name is a convenience and the roster may not
;; have landed yet. the number is the fact.
animal (or (:animal g) (nth s 1 nil) "")
named? (not (str/blank? given))]
(merge {:plural "" :taxonomy "" :collective "" :other-names []}
g
{:n n
:animal animal
:given given
:named? named?
:name (cond named? (str/trim given)
(not (str/blank? animal)) animal
:else (str "d20 " n))})))))
(defn- read-name []
(let [s (stored :pc)]
[(or (first s) (first default-name))
(or (second s) (second default-name))]))
(defn refresh!
"Total on purpose. Every render watch in the book hangs off this atom,
so anything that throws in here blanks the whole page, and what it
reads is JSON that a previous version of this file wrote, which is not
a thing to be optimistic about. A key that is the wrong shape reads as
absent."
[]
(reset! state
{:name (read-name)
:companion (try (read-companion) (catch :default _ nil))
:echo (int-or (stored :echo) 0)
:rolls (let [r (stored :rolls)] (if (map? r) r {}))
:deeds (let [d (stored :deeds)]
(set (map keyword (if (sequential? d) d []))))
:epoch (int-or (stored :epoch) 0)
:todo (let [t (stored :todo)] (if (sequential? t) t []))
:todo-seq (int-or (stored :todo-seq) 0)}))
;; ---------------------------------------------------------------------
;; What a chapter may ask for
;; ---------------------------------------------------------------------
(defn reader-name [] (:name @state))
(defn companion [] (:companion @state))
(defn echo [] (:echo @state))
(defn deeds [] (:deeds @state))
(defn fortune [] (count (:deeds @state)))
(defn epoch
"When this reader last withdrew the whole record, in seconds, or
nought if they never have.
It is not a clock and nothing displays it. It exists so that a
withdrawal can be compared against a link: a token stamped earlier
than this was written by somebody who has since been forgotten, and it
is not allowed to put them back."
[]
(:epoch @state))
(defn standing
"Fortune less echo. Added to every roll for the rest of the book, and
the number the last chapter reads to decide how it ends."
[]
(- (fortune) (echo)))
(defn registration [] "3812")
;; ---------------------------------------------------------------------
;; And what it may change
;; ---------------------------------------------------------------------
(defn set-name! [f l]
(store! :pc [(if (str/blank? f) (first default-name) (str/trim f))
(if (str/blank? l) (second default-name) (str/trim l))])
(refresh!))
(defn set-companion!
"Three cells: the number, the animal's own name as a courtesy, and
whatever the reader called it. The number is the only one that has to
be right, because the other two are recovered from the roster."
[n given]
(store! :companion [n (get-in @animal-names [n :animal] "") (or given "")])
(refresh!))
(defn set-echo! [n] (store! :echo (max 0 n)) (refresh!))
(defn add-echo!
"One more thing taken back."
[]
(set-echo! (inc (echo))))
(defn did!
"Record a deed. A set, so doing the same thing twice is doing it once,
and nothing anywhere says that it happened."
[k]
(store! :deeds (mapv name (conj (deeds) (keyword k))))
(refresh!))
(defn animals!
"The roster's grammar, from the page. Normalised on the way in, so the
shape `fedoras.state/names-form` happens to be emitting this week is
something only this function has an opinion about.
Refreshes, because a companion read before this arrived is holding an
empty animal name."
[m]
(reset! animal-names
(if (map? m)
(into {} (map (fn [[k v]] [k (as-grammar v)])) m)
{}))
(refresh!))
(defn rolls
"Every check the reader has resolved, by id.
Normalised on the way out. Storage keywordizes keys on read, and a
check id is an arbitrary string rather than a name, so the keys come
back as keywords and nothing matches them. And anything that is not a
map at all becomes an empty one, because assoc on a vector with a
string key takes the page down."
[]
(let [r (:rolls @state)]
(if (map? r)
(into {} (map (fn [[k v]] [(name k) v])) r)
{})))
(defn roll-entry [id]
(when-let [e (get (rolls) id)]
{:roll (or (:roll e) (get e "roll"))
:mod (or (:mod e) (get e "mod") 0)
:rewrites (or (:rewrites e) (get e "rewrites") 0)}))
(defn remember-roll! [id e]
(store! :rolls (assoc (rolls) id e))
(refresh!))
(defn score []
(+ (reduce + 0 (keep :roll (vals (rolls))))
(or (:n (companion)) 0)))
;; ---------------------------------------------------------------------
;; Import, once, on arrival
;; ---------------------------------------------------------------------
(def carries-epoch?
"Whether the codec on this page round-trips a withdrawal stamp."
(try
(= 12345 (:epoch (carry/unpack
(carry/pack {:name ["Owen" "Mercer"] :epoch 12345}))))
(catch :default _ false)))
(defn- wipe!
"Everything under the prefix, and then one thing: when that happened."
[at]
(try
(let [ks (vec (for [i (range (.-length js/localStorage))
:let [k (.key js/localStorage i)]
:when (and k (str/starts-with? k prefix))]
k))]
(doseq [k ks] (.removeItem js/localStorage k)))
(catch :default _ nil))
(store! :epoch at))
(defn- merge-token!
[{:keys [name companion echo rolls deeds epoch todo]}]
(let [ours (int-or (stored :epoch) 0)
theirs (or epoch 0)]
(cond
;; A link from before the reader withdrew the record. It is a true
;; account of somebody who does not exist any more, which is not
;; the same thing as an instruction to rebuild them. This is the
;; case that made `forget!` a lie: it emptied one page's storage
;; and every other page, and every entry in the back history, was
;; still holding a complete copy and handed it straight back.
;; A link from before the reader withdrew the record. It is a true
;; account of somebody who does not exist any more, which is not
;; the same thing as an instruction to rebuild them.
;;
;; Only when the codec can say so. A page that cannot read a stamp
;; off a token must not conclude from its absence that every link
;; in the book is stale.
(and carries-epoch? (< theirs ours))
(js/console.info
(str "016.09 — the link this page was opened from was written before the record "
"was withdrawn. Nothing carried forward. Reach this chapter from a page you "
"have opened since, and whatever is current will arrive with you."))
:else
(do
;; They withdrew it somewhere this page has not heard about yet.
;; The erasure travels the way the state travels, which is the
;; only way anything travels in a book read off a disk.
(when (and carries-epoch? (> theirs ours))
(wipe! theirs)
(js/console.info
"016.09 — prior record withdrawn at the reader's request. Nothing carried forward."))
;; the name is the one thing a reader can retype in five seconds,
;; so the token is allowed to have an opinion about it
(when (seq name)
(store! :pc name))
;; The animal:
;;
;; This was write-once — take the token's only if there is
;; nothing here — which is right on one origin and wrong on a
;; folder of files, where every page has its own storage and the
;; token is the only thing that crosses. A reader who opened Act
;; II after rolling and before naming taught that page the horse,
;; permanently, and Act II could never afterwards learn that the
;; horse was called Horace.
;;
;; The Echo is the recency stamp. It only ever goes up, and a
;; reroll raises it, so a token carrying an Echo at least as
;; large as this page's is at least as new as this page and is
;; allowed to speak. One older, and it is a link from before the
;; reroll and is not.
(let [have (read-companion)
here-echo (int-or (stored :echo) 0)
there-echo (or echo 0)]
(when (and (:n companion)
(or (nil? have) (>= there-echo here-echo)))
(store! :companion
[(:n companion) ""
;; a blank name in a token is a reader who had not
;; named it yet, not a reader who unnamed it
(if (str/blank? (:given companion))
(or (:given have) "")
(:given companion))])))
;; upward only, always. after the companion, which reads it.
(store! :echo (max (int-or (stored :echo) 0) (or echo 0)))
;; a check is resolved once, and what is already in this browser
;; was rolled by this reader, so it wins every collision
(when (seq rolls)
(let [named (fn [m] (if (map? m)
(into {} (map (fn [[k v]] [(clojure.core/name k) v])) m)
{}))]
(store! :rolls (merge (named rolls) (named (stored :rolls))))))
;; deeds are a set, and a set does not get smaller by being described
(when (seq deeds)
(let [held (let [d (stored :deeds)] (if (sequential? d) d []))]
(store! :deeds (vec (into (set (map clojure.core/name held))
(map clojure.core/name deeds))))))
(when-let [t todo]
(when (>= (:seq t 0) (int-or (stored :todo-seq) 0))
(store! :todo (:items t))
(store! :todo-seq (:seq t))))))))
(defn- import-token! []
(if-let [t (param carry-param)]
(if-let [m (try (fedoras.carry/unpack t) (catch :default _ nil))]
(merge-token! m)
(try (fedoras.carry/complain!) (catch :default _ nil)))
;; nothing to do, unless somebody has a link from before the token
(do
(when-let [pc (param :pc)]
(store! :pc [pc (or (param :pcl) (second default-name))]))
(when-let [ac (param :ac)]
(let [n (int-or ac nil)]
(when (and n (<= 1 n 20) (nil? (read-companion)))
(store! :companion [n "" (or (param :acn) "")]))))
(when-let [e (param :echo)]
(store! :echo (max (int-or (stored :echo) 0) (int-or e 0)))))))
(defn- withdraw-if-asked!
"A page loaded with a withdrawal stamp on it clears itself and does
nothing else.
This is how one button reaches twelve documents that cannot see each
other. The page the reader clicked opens each of the others in a
hidden frame with the stamp in the query string, and each one runs
this on the way up. Nothing is scripted across the boundary — every
file is its own origin and none of them can touch another's storage —
but a document can always clear its own, and a query string is the one
thing that crosses.
Returns true if this load was a withdrawal, so boot knows to skip the
rest of its work."
[]
(when-let [at (some-> (param forget-param) (int-or nil))]
(when (> at (int-or (stored :epoch) 0))
(wipe! at))
true))
;; ---------------------------------------------------------------------
;; Rendering
;; ---------------------------------------------------------------------
(defn on-render! [k f] (add-watch state k (fn [_ _ _ _] (f))) (f))
(defn el [id] (.getElementById js/document id))
(defn q [node selector] (when node (.querySelector node selector)))
(defn q-all
"Every match, as a vector. One argument searches the document; two
searches inside a node.
Written the long way because a NodeList is not a Clojure collection
and array-seq is not in Scittle's bindings."
([selector] (q-all js/document selector))
([node selector]
(if-not node
[]
(let [nodes (.querySelectorAll node selector)]
(mapv (fn [i] (.item nodes i)) (range (.-length nodes)))))))
(defn text! [node selector s]
(when-let [t (q node selector)] (set! (.-textContent t) s)))
(defn on-click! [node selector f]
(when-let [b (q node selector)] (set! (.-onclick b) f)))
(defn enable! [node selector on? label]
(when-let [b (q node selector)]
(set! (.-disabled b) (not on?))
(when label (set! (.-textContent b) label))))
(defn show! [node selector on?]
(when-let [t (q node selector)]
(set! (.-display (.-style t)) (if on? "flex" "none"))))
(defn widget [k id f]
(on-render! k (fn [] (when-let [node (el id)] (f node)))))
;; ---------------------------------------------------------------------
;; Withdrawing the record, everywhere
;;
;; Twelve documents, each its own origin, none able to read another's
;; storage. Every shared channel is shut: localStorage and IndexedDB are
;; origin-scoped, window.name is cleared on the way across, cookies do
;; not apply to a file, and an iframe gets its own origin so the parent
;; cannot script it.
;;
;; It can still LOAD it. A hidden frame pointed at a sibling chapter,
;; with a stamp in the query string, runs that chapter's own copy of
;; this file, which clears that chapter's own storage. Nothing crosses
;; the boundary except the URL, which is the one thing that was ever
;; going to.
;; ---------------------------------------------------------------------
(defn- sibling-pages
"Every other chapter this page links to.
Read off the sidebar rather than configured, because Quarto already
puts the whole book in it and a hand-kept list of filenames is a list
that goes stale the first time a chapter is renamed."
[]
(let [here (.-pathname js/location)
dir (subs here 0 (inc (.lastIndexOf here "/")))]
(->> (q-all "a[href]")
(keep (fn [a]
(let [h (.getAttribute a "href")]
(when (and h
(not (str/starts-with? h "#"))
(not (re-find #"(?i)^(https?:|mailto:|javascript:)" h)))
(try
(let [u (js/URL. (.-href a))
p (.-pathname u)]
(when (and (str/starts-with? p dir)
(str/ends-with? (str/lower-case p) ".html")
(not= p here))
(str (.-protocol u) "//" (.-host u) p)))
(catch :default _ nil))))))
distinct
vec)))
(defn- sweep!
"Tell every other chapter to withdraw, then call `done` once.
Once, whatever happens: a frame that never fires must not leave the
reader looking at a button that has stopped meaning anything, so there
is a deadline as well as a count."
[at done]
(let [pages (sibling-pages)
fired (atom false)
finish (fn [] (when-not @fired (reset! fired true) (done)))]
(if (empty? pages)
(finish)
(let [box (.createElement js/document "div")
left (atom (count pages))
one (fn [] (when (zero? (swap! left dec)) (finish)))]
(js/console.info "016.09 — withdrawing from" (count pages) "other chapters")
(set! (.-style box)
"position:absolute;width:0;height:0;overflow:hidden;border:0;visibility:hidden")
(.appendChild (.-body js/document) box)
(doseq [p pages]
(let [f (.createElement js/document "iframe")]
(set! (.-onload f) (fn [_] (one)))
(set! (.-onerror f) (fn [_] (one)))
(set! (.-src f) (str p "?" (clojure.core/name forget-param) "=" at))
(.appendChild box f)))
(js/setTimeout finish 5000)))))
(defn forget!
"Forget everything, not the six things somebody remembered to list,
and not only on this page.
Emptying this document's storage was never the whole job: the reader
was also sitting, complete, in the query string of every link on every
other chapter and in every entry of the back history, and the next
navigation put them back. So this clears here, stamps when, and then
visits every other chapter to say so. The stamp is what makes a link
written before the withdrawal refuse to be believed afterwards.
It also says so while it is happening. It used to do all of this in
silence and then reload, which is indistinguishable from a button that
does nothing except reload."
[]
(let [at (quot (.now js/Date) 1000)
btn (q js/document ".pc-forget")]
(when btn
(set! (.-disabled btn) true)
(set! (.-textContent btn) "Withdrawing the record…"))
(wipe! at)
(sweep! at
(fn []
(let [u (current-url)]
(doseq [k (concat [carry-param forget-param] legacy-params)]
(.delete (.-searchParams u) (clojure.core/name k)))
(.set (.-searchParams u) (clojure.core/name withdrawn-param) "1")
(set! (.-href js/location) (.toString u)))))))
(defn- note-withdrawal!
"One line, on the way back up, and then the button goes back to
offering. The confirmation cannot be stored, because storing things is
what has just been undone — so it is read off the query string once,
before anything else in boot is allowed to tidy the query string away."
[withdrew?]
(when withdrew?
(js/console.info
"016.09 — record withdrawn from this chapter and from every chapter linked from it.")
(when-let [b (q js/document ".pc-forget")]
(set! (.-textContent b) "Record withdrawn")
(js/setTimeout (fn [] (set! (.-textContent b) "Forget everything")) 5000))))
;; ---------------------------------------------------------------------
;; Export
;; ---------------------------------------------------------------------
(defn token
"What this reader looks like from outside. Recomputed rather than
stored, so it cannot disagree with the state it is describing.
Guarded, because this runs on every render and inside `decorate-links!`,
and a codec that throws on one unexpected key should cost the reader a
shareable link and nothing else."
[]
(try
(let [{:keys [name companion echo rolls deeds todo todo-seq]} @state]
(fedoras.carry/pack
{:name name
:companion (when companion (select-keys companion [:n :given]))
:echo echo
:rolls rolls
:deeds deeds
:epoch (epoch)
:todo (when (seq todo) {:seq (or todo-seq 0) :items todo})}))
(catch :default e
(js/console.warn "fedoras: could not pack the carry token —" e)
nil)))
(defn decorate-links!
"Every internal link carries one field.
Two things were wrong before this and both of them mattered. It ran
inline, at parse time, so any link below the script tag did not exist
yet — which is every prev-and-next arrow Quarto puts in the footer.
And it copied the query string rather than the state, so a page opened
from storage handed on nothing."
[]
(when-let [t (token)]
(doseq [a (q-all "a[href]")]
(let [h (.getAttribute a "href")]
(when (and h
(not (str/starts-with? h "#"))
(not (re-find #"(?i)^(https?:|mailto:|javascript:)" h)))
(try
(let [lu (js/URL. (.-href a))
sp (.-searchParams lu)]
(doseq [k legacy-params] (.delete sp (clojure.core/name k)))
(.set sp (clojure.core/name carry-param) t)
(set! (.-href a) (.toString lu)))
(catch :default _ nil)))))))
(defn- rewrite-address!
"Put the token in this page's own address bar and take the old fields
off it, so a reader who arrived on a legacy link stops looking at
their own Echo."
[]
(when-let [t (token)]
(set-params! (into {(clojure.core/name carry-param) t}
(map (fn [k] [k nil])
(concat [forget-param withdrawn-param] legacy-params))))))
;; ---------------------------------------------------------------------
;; Tokens
;;
;; It used to be a chain of str/replace calls, which is why {pc-last}
;; worked in a scene and rendered as the literal characters {pc-last}
;; inside a dice passage.
;;
;; Case follows the token: {ac} is `ted`, {Ac} is `Ted`, {AC} is `TED`,
;; so a passage can start a sentence or write a cue line without the
;; author reaching for a second token. Note that this makes {PC} in an
;; already-written scene render as OWEN rather than Owen; the old regex
;; was case-insensitive and threw the information away.
;;
;; An unkown token is passed over: A brace in a passage that is not
;; something this understands comes out exactly as it went in, so this
;; is safe to run over arbitrary prose.
;; ---------------------------------------------------------------------
(def ^:private token-re #"\{([A-Za-z]+)(-[A-Za-z-]+)?\}")
(defn- apply-case [head s]
(cond
(str/blank? s) s
(= head (str/upper-case head)) (str/upper-case s)
(= (subs head 0 1) (str/upper-case (subs head 0 1)))
(str (str/upper-case (subs s 0 1)) (subs s 1))
:else s))
(defn render
"Replace every {token} the resolver knows. `resolve` is called with the
lower-cased head and the lower-cased tail — \"ac\" and \"-plural\" for
{ac-plural} — and returns a string or nil."
[resolve s]
(str/replace (or s "") token-re
(fn [m]
(let [[whole head tail] (if (string? m) [m m nil] m)]
(or (some->> (resolve (str/lower-case head)
(some-> tail str/lower-case))
(apply-case head))
whole)))))
(defn- string-hash
"Stable across loads, which is the point: the same sentence picks the
same alternative name every time the reader opens the page, so nothing
reads as though it were rolled twice."
[s]
(reduce (fn [a i] (mod (+ (* 31 a) (.charCodeAt s i)) 1000003))
7 (range (count s))))
(defn- an [s]
(str (if (re-find #"(?i)^[aeiou]" (str s)) "an " "a ") s))
(defn- animal-tokens
"What a passage may say about the animal. The reader's own name for it
is a name; everything else is the species, because a reader who called
a marmot Ted did not thereby decide that two of them are Teds."
[source tail]
(when-let [{:keys [animal plural taxonomy collective other-names name named?]}
(companion)]
(let [kind (str/lower-case (or animal ""))]
(case (or tail "-name")
"-name" (if named? name (str "the " kind))
"-kind" kind
"-a" (an kind)
"-plural" (if (str/blank? plural) (str kind "s") (str/lower-case plural))
"-many" (if (str/blank? collective)
(str "several " (if (str/blank? plural) (str kind "s") plural))
(str (an collective) " of "
(if (str/blank? plural) (str kind "s") plural)))
"-taxonomy" (str/lower-case (or taxonomy kind))
"-given" (if named? name "")
"-other" (if (seq other-names)
(nth other-names (mod (string-hash source) (count other-names)))
(str "the " kind))
nil))))
(defn- reader-tokens [source]
(let [[f l] (reader-name)]
(fn [head tail]
(case head
"pc" (case (or tail "-first")
"-first" f
"-full" (str f " " l)
"-last" l
nil)
"ac" (or (animal-tokens source tail)
;; no roll yet, and a passage still has to read
(case (or tail "-name")
("-name" "-kind" "-other") "the animal"
"-a" "an animal"
"-plural" "animals"
"-many" "several animals"
"-taxonomy" "animal"
"-given" ""
nil))
nil))))
(defn fill-with
"Put the reader into a passage, plus whatever else the caller knows.
The dice box passes the die in this way."
[extra s]
(let [own (reader-tokens s)]
(render (fn [h t] (or (extra h t) (own h t))) s)))
(defn fill
"Put the reader into a passage. The only place any of these are
resolved."
[s]
(fill-with (fn [_ _] nil) s))
(defn animal-label
"Kept for anything still asking. The display name, as stored, not
shouted — the old one upper-cased and every caller lower-cased it
again somewhere else."
[]
(when-let [c (companion)] (:name c)))
;; ---------------------------------------------------------------------
;; The carry-over
;;
;; What a reader takes to the next book.
;; ---------------------------------------------------------------------
(def on-the-record
"What goes in the token. Everything else is furniture.
A key is on this list because it is small and because losing it would
lose the reader's year. Adding one is a decision about how long every
link on every page is going to be, so it is a list and not a
convention."
#{:pc :companion :echo :rolls :deeds :todo})
(defn kept
"Read something the reader left in a room. No widget that calls this
needs to know anything about tokens."
[k]
(stored k))
(defn keep!
"Leave something in a room. It stays where it was made."
[k v]
(store! k v)
(when (contains? on-the-record k) (refresh!))
v)
(def ^:private alphabet "23456789ABCDEFGHJKLMNPQRSTUVWXYZ")
(defn- b32 [n len]
(loop [n n i 0 out ""]
(if (= i len)
out
(recur (quot n 32) (inc i)
(str (nth alphabet (mod n 32)) out)))))
;; ---------------------------------------------------------------------
;; The name and the animal, on every page
;; ---------------------------------------------------------------------
(defn- paint-name []
(let [[f l] (reader-name)]
(doseq [node (q-all ".pc-name")]
(set! (.-textContent node)
(apply-case (or (.getAttribute node "data-case") "pc")
(case (.getAttribute node "data-pc")
"-full" (str f " " l) "-last" l f))))
(when-let [i (el "pc-first")] (when (str/blank? (.-value i)) (set! (.-value i) f)))
(when-let [i (el "pc-last")] (when (str/blank? (.-value i)) (set! (.-value i) l)))))
(defn- paint-companion
"Each span carries the token that made it, so {ac-plural} written in a
scene at build time still says `marmots` after the reader rolls a
marmot. It used to carry nothing and every span got the same word."
[]
(doseq [node (q-all ".ac-name")]
(let [tail (or (.getAttribute node "data-ac") "-name")
head (or (.getAttribute node "data-case") "ac")]
(set! (.-textContent node)
(or (some->> ((reader-tokens (or (.-textContent node) "")) "ac" tail)
(apply-case head))
"the animal")))))
(defn- paint-tokens []
(doseq [node (q-all ".tok")]
(set! (.-textContent node) (fill (.getAttribute node "data-tok")))))
;; ---------------------------------------------------------------------
;; Ending / Standing
;; ---------------------------------------------------------------------
(def deed-roll
[:nerve ;; a natural twenty with the Echo at nought
:named-it ;; the animal was given a name and kept it
:kept-the-programmes ;; both sheets went in the bag and stayed there
:no-name-for-the-box ;; nothing was spoken into the undertaker's box
:read-it-back ;; the ledger was read against the room out loud
:opened-the-cage
:held-the-door
:went-back-for-it
:signed-nothing
:walked-out
:told-a-new-one ;; Ariathne was paid in something that was theirs
:said-why]) ;; the chancellor asked, and got a true answer
(def ^:private deed-bits 15)
(defn- deed-mask []
(let [held (deeds)]
(reduce (fn [acc [index deed]]
(if (contains? held deed)
(+ acc (bit-shift-left 1 index))
acc))
0
(map-indexed vector deed-roll))))
(defn- deeds-from-mask [mask]
(set (keep-indexed (fn [index deed]
(when (pos? (bit-and mask (bit-shift-left 1 index)))
deed))
deed-roll)))
(def band-code {:closed 0 :reconciled 1 :outstanding 2})
(def code-band {0 :closed 1 :reconciled 2 :outstanding})
(defn ending-band []
(let [reader-standing (standing)]
(cond
(>= reader-standing 4) :outstanding
(>= reader-standing 0) :reconciled
:else :closed)))
(defn- paint-standing!
"One class on the body, so a chapter that forks three ways does it in
the stylesheet instead of in nine lines of DOM work per passage. A page
with no class on it shows :reconciled, which is what the print edition
gets and what the table actually got.
This existed and was never wired to anything, which meant every
`sp/by-standing` on every page was rendering all three endings at
once, or none."
[]
(when-let [body (.-body js/document)]
(let [classes (.-classList body)]
(doseq [old ["standing-closed" "standing-reconciled" "standing-outstanding"]]
(.remove classes old))
(.add classes (str "standing-" (clojure.core/name (ending-band)))))))
(def code-version 3)
(defn- check-char [body]
(nth alphabet
(mod (reduce + (map (fn [c] (.indexOf alphabet c)) body)) 32)))
(defn carry-code
"What this reader looks like to the next book, as an accession line."
[]
(let [n (+ (* code-version 4294967296)
(* (get band-code (ending-band) 1) 1073741824)
(* (min 31 (or (:n (companion)) 0)) 33554432)
(* (min 31 (echo)) 1048576)
(* (deed-mask) 32)
(min 31 (quot (score) 10)))
body (b32 n 7)]
(str "016.14 · " (registration) " · "
(subs body 0 4) "-" (subs body 4) (check-char body))))
(defn read-carry
"The other side of it, for the book after this one."
[s]
(let [cleaned (-> (str s) str/upper-case (str/replace #"[^2-9A-Z]" ""))
tail (subs cleaned (max 0 (- (count cleaned) 8)))]
(when (= 8 (count tail))
(let [body (subs tail 0 7)
n (reduce (fn [acc c] (+ (* 32 acc) (.indexOf alphabet c))) 0 body)]
(when (= (nth tail 7) (check-char body))
{:version (quot n 4294967296)
:band (get code-band (mod (quot n 1073741824) 4))
:companion (mod (quot n 33554432) 32)
:echo (mod (quot n 1048576) 32)
:deeds (deeds-from-mask (mod (quot n 32) (bit-shift-left 1 deed-bits)))
:score-floor (* 10 (mod n 32))})))))
;; ---------------------------------------------------------------------
;; Is any of this working
;;
;; Type fedoras.reader.diagnose_BANG_() in the console. Faster than
;; opening the storage inspector and reading JSON, and it says whether
;; the token agrees with the storage, which is the failure that cost an
;; animal.
;; ---------------------------------------------------------------------
(defn diagnose! []
(let [t (param carry-param)]
(js/console.log "storage works: " (storage-works?))
(js/console.log "origin: " (.-origin js/location)
(if (= "file:" (.-protocol js/location))
"— every page may have its own storage"
"— one bucket for the whole book"))
(js/console.log "name: " (pr-str (reader-name)))
(js/console.log "companion: " (pr-str (companion)))
(js/console.log " raw storage: " (pr-str (stored :companion)))
(js/console.log "roster loaded: " (count @animal-names) "animals")
(js/console.log "echo / fortune: " (echo) "/" (fortune) " → standing" (standing))
(js/console.log "withdrawn at: " (if (pos? (epoch)) (epoch) "never")
(if carries-epoch?
""
"— CODEC DROPS THE STAMP, carry.cljs is out of date"))
(js/console.log "rolls: " (pr-str (rolls)))
(js/console.log "token on url: " (or t "none"))
(when t
(js/console.log " unpacks to: "
(pr-str (try (fedoras.carry/unpack t)
(catch :default e (str "THREW: " e))))))
(js/console.log "token we'd emit:" (or (token) "none — pack failed"))
:ok))
;; A handle on `window`, because Scittle keeps its namespaces inside the
;; SCI context and the browser console cannot see into it. There is no
;; `fedoras.reader.diagnose_BANG_()` to call — that is the shape a
;; compiled build would have, and this is an interpreted one.
;;
;; fedoras.diagnose()
;; fedoras.forget()
;;
;; and for anything else, scittle.core.eval_string("(fedoras.reader/...)")
(set! (.-fedoras js/window)
(js-obj "diagnose" (fn [] (diagnose!))
"state" (fn [] (clj->js @state))
"token" (fn [] (token))
"forget" (fn [] (forget!))))
;; ---------------------------------------------------------------------
;; Boot
;; ---------------------------------------------------------------------
(if (withdraw-if-asked!)
;; a hidden frame, doing one job. no token, no links, no painting.
(refresh!)
;; read before anything registers a watch: `on-render!` calls its
;; function once on the spot, and the links watch tidies the query
;; string, so the flag is gone by the time the DOM is ready
(let [withdrew? (boolean (param withdrawn-param))]
(when-not carries-epoch?
(js/console.warn
(str "fedoras: carry.cljs does not round-trip the withdrawal stamp. "
"`forget!` will clear this chapter and every chapter linked from it, "
"but a stale link will not be refused afterwards. "
"Update resources/fedoras/carry.cljs — `pack` needs :epoch in its "
"destructuring and :g in its payload, and `unpack` needs :epoch back out.")))
(import-token!)
(refresh!)
(on-render! ::name paint-name)
(on-render! ::companion paint-companion)
(on-render! ::tokens paint-tokens)
(on-render! ::standing paint-standing!)
(on-render! ::links (fn [] (decorate-links!) (rewrite-address!)))
(if (= "loading" (.-readyState js/document))
(.addEventListener js/document "DOMContentLoaded"
(fn [_]
(note-withdrawal! withdrew?)
(decorate-links!)
(paint-standing!)))
(do (note-withdrawal! withdrew?)
(decorate-links!)))))</script><script type="application/x-scittle">(fedoras.reader/animals! {1 {:animal "Pigeon", :plural "pigeons", :taxonomy "bird", :collective "kit", :other-names ["dusty wings" "coooo"]}, 2 {:animal "Giant Centipede", :plural "centipedes", :taxonomy "arthropod", :collective "colony", :other-names ["clicker" "legs gooo"]}, 3 {:animal "Marmot", :plural "marmots", :taxonomy "rodent", :collective "madness", :other-names ["the alarm" "the fat rat"]}, 4 {:animal "Cat", :plural "cats", :taxonomy "felid", :collective "clowder", :other-names ["the cat" "cat"]}, 5 {:animal "Turkey", :plural "turkeys", :taxonomy "fowl", :collective "rafter", :other-names ["thanksgiving dinner for non vegans" "gobbler"]}, 6 {:animal "Giant Badger", :plural "badgers", :taxonomy "mustelid", :collective "cete", :other-names ["angry grandpa" "stripes"]}, 7 {:animal "Giant Weasel", :plural "weasels", :taxonomy "mustelid", :collective "sneak", :other-names ["the scout" "slenderman" "the ermine"]}, 8 {:animal "Fox", :plural "foxes", :taxonomy "canid", :collective "skulk", :other-names ["foxxxy" "spry foot"]}, 9 {:animal "Wolverine", :plural "wolverines", :taxonomy "mustelid", :collective "gang", :other-names ["the small trouble"]}, 10 {:animal "Dog", :plural "dogs", :taxonomy "canid", :collective "pack", :other-names ["the dog" "the ordinary dog"]}, 11 {:animal "Python", :plural "pythons", :taxonomy "serpent", :collective "knot", :other-names ["ssSSssSsss" "coilssss"]}, 12 {:animal "Mule", :plural "mules", :taxonomy "equid", :collective "barren", :other-names ["dapple" "HeeHaw :("]}, 13 {:animal "Lynx", :plural "lynxes", :taxonomy "felid", :collective "clowder", :other-names ["tufts" "yelper"]}, 14 {:animal "Ape", :plural "apes", :taxonomy "primate", :collective "shrewdness", :other-names ["treecrawler"]}, 15 {:animal "Horse", :plural "horses", :taxonomy "equid", :collective "harras", :other-names ["rocinante" "the one nobody rides"]}, 16 {:animal "Moose", :plural "moose", :taxonomy "cervid", :collective "herd", :other-names ["its a giant moose"]}, 17 {:animal "Wyrmling", :plural "wyrmlings", :taxonomy "draconic", :collective "clutch", :other-names ["the wyrmling" "scales"]}, 18 {:animal "Falcon", :plural "falcons", :taxonomy "raptor", :collective "cast", :other-names ["the raptor" "true sight"]}, 19 {:animal "Wolf", :plural "wolves", :taxonomy "canid", :collective "pack", :other-names ["the wolf" "the packleader"]}, 20 {:animal "Bear", :plural "bears", :taxonomy "ursid", :collective "sloth", :other-names ["the bear" "the citadel"]}})</script></div></div>
```
```{=html}
<script type="application/x-scittle">(ns fedoras.ui.dice-ui
"A d20 the reader can roll once.
ROLL ONCE. It used to let you press the button all afternoon. The
handler had no guard and the box painted nothing from storage, so a
roll was neither kept nor refused. It is kept now, the button is spent
once it has been pressed, and the only other door is the expensive
one.
STANDING IS THE MODIFIER. Fortune less echo, added to every roll. It
is stored with the roll rather than read live, because raising the
Echo in Act IV must not quietly reword a scene the reader finished in
Act II.
THE PASSAGE MAY SAY THE NUMBER. Every outcome string is rendered with
the die in scope, so a line can say {result} and mean the number that
was actually rolled rather than the number the author guessed. This is
the reason the passages used to lie: a success wrote `rolls a
fourteen` whatever the reader rolled, and a reader who rolled
seventeen was told, in their own book, that they had not.
A passage is still allowed to be vague. `rolls low` is a choice now
rather than the only option.
SCORE. Every die adds its face to the score, including the ones rolled
again. That is the temptation: a rewrite raises the score and raises
the Echo, and only one of those two is fatal.
FORTUNE. A natural twenty is worth a deed, but only while the Echo is
nought. So the reader who has never taken anything back is the only
one who can still be lucky, and nothing anywhere says so."
(:require [clojure.string :as str]))
;; ---------------------------------------------------------------------
;; What a roll is worth
;; ---------------------------------------------------------------------
(defn band
"One and twenty are themselves. Everything between them is a sum."
[natural dc modifier]
(cond
(= natural 1) :fumble
(= natural 20) :crit
(>= (+ natural modifier) dc) :success
:else :fail))
(defn line
"What was rolled, what it came to, and what that was."
[natural dc modifier]
(str "d20 → " natural
(cond
(pos? modifier) (str " fortune +" modifier " → " (+ natural modifier))
(neg? modifier) (str " echo " modifier " → " (+ natural modifier))
:else "")
" "
(case (band natural dc modifier)
:fumble "FUMBLE" :crit "CRIT" :success "success" :fail "failure")))
;; ---------------------------------------------------------------------
;; The number, in words and in figures
;; ---------------------------------------------------------------------
(def ^:private spelled
["zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"
"ten" "eleven" "twelve" "thirteen" "fourteen" "fifteen" "sixteen"
"seventeen" "eighteen" "nineteen" "twenty"])
(defn- in-words [n]
(if (and (number? n) (<= 0 n 20)) (nth spelled n) (str n)))
(defn- magnitude [n] (if (neg? n) (- n) n))
(defn- signed [n]
(cond (pos? n) (str "+" n)
(neg? n) (str "−" (magnitude n))
:else ""))
(defn- arithmetic
"17 + 1 = 18, and just 17 when there is nothing to add, so a line that
uses this reads correctly for a reader whose standing is nought — most
readers, most of the time."
[natural modifier]
(if (zero? modifier)
(str natural)
(str natural " " (if (pos? modifier) "+" "−") " " (magnitude modifier)
" = " (+ natural modifier))))
(defn roll-tokens
"What a passage is allowed to say about the die that produced it.
{result} is the face, because that is what somebody at a table says
out loud. {total} is the number the DC was measured against, which is
a different fact and usually the less interesting one."
[dc {:keys [roll mod]}]
(let [total (+ roll mod)]
(fn [head tail]
(case head
"result" (case (or tail "")
"" (str roll)
"-word" (in-words roll)
"-mod" (arithmetic roll mod)
nil)
"total" (case (or tail "")
"" (str total)
"-word" (in-words total)
nil)
"mod" (when (nil? tail) (signed mod))
"dc" (when (nil? tail) (str dc))
nil))))
;; ---------------------------------------------------------------------
;; Remembering
;; ---------------------------------------------------------------------
(defn- entry [id] (fedoras.reader/roll-entry id))
;; ---------------------------------------------------------------------
;; The passage
;; ---------------------------------------------------------------------
(defn- segment-node [tokens seg]
(let [cue? (str/starts-with? seg "@")
node (.createElement js/document "p")]
(set! (.-className node) (if cue? "roll-cue" "roll-line"))
(set! (.-textContent node)
(fedoras.reader/fill-with tokens (if cue? (subs seg 1) seg)))
node))
(defn- paint-passage! [node tokens text]
(let [box (fedoras.reader/q node ".roll-out")]
(set! (.-innerHTML box) "")
(doseq [seg (str/split (or text "") #"\|")]
(.appendChild box (segment-node tokens seg)))))
;; ---------------------------------------------------------------------
;; The two states a box can be in
;; ---------------------------------------------------------------------
(defn- clear! [node]
(fedoras.reader/text! node ".roll-value" "")
(set! (.-innerHTML (fedoras.reader/q node ".roll-out")) "")
(fedoras.reader/text! node ".roll-note" "")
(fedoras.reader/text! node ".roll-echo" "")
(fedoras.reader/enable! node ".roll-go" true "Roll d20")
(fedoras.reader/show! node ".roll-rewrite" false))
(defn- fill! [node {:keys [dc outcomes]} {:keys [roll mod rewrites] :as e}]
(let [b (band roll dc mod)]
(fedoras.reader/text! node ".roll-value" (line roll dc mod))
(paint-passage! node (roll-tokens dc e)
(or (get outcomes b) (get outcomes :fail)))
(fedoras.reader/text! node ".roll-note"
(if (zero? rewrites)
""
(str "This is version " (inc rewrites) " of what happened.")))
(fedoras.reader/enable! node ".roll-go" false "Rolled")
(fedoras.reader/show! node ".roll-rewrite" true)))
(defn- paint! [node check]
(if-let [e (entry (:id check))]
(fill! node check e)
(clear! node))
(fedoras.reader/text! node ".echo-count" (str (fedoras.reader/echo)))
(fedoras.reader/text! node ".score-count" (str (fedoras.reader/score))))
;; ---------------------------------------------------------------------
;; The two things a reader can do
;; ---------------------------------------------------------------------
(defn- resolve!
"One die, and what it costs and is worth.
The score is not touched here. It is the sum of what is standing, and
what is standing is what this line just wrote."
[node check rewrites]
(let [natural (inc (rand-int 20))
modifier (fedoras.reader/standing)]
;; a twenty is worth a deed, but only to somebody who has taken
;; nothing back. deeds are a set, so it is worth one, once, ever.
(when (and (= 20 natural) (zero? (fedoras.reader/echo)))
(fedoras.reader/did! :nerve))
(fedoras.reader/remember-roll!
(:id check) {:roll natural :mod modifier :rewrites rewrites})
(paint! node check)))
(defn- roll-once! [node check]
(when-not (entry (:id check))
(resolve! node check 0)))
(defn- rewrite!
"Raise the Echo first, then roll under it, so the new number is
penalised by the cost of having asked for it."
[node check]
(when-let [e (entry (:id check))]
(fedoras.reader/add-echo!)
(resolve! node check (inc (:rewrites e)))
(fedoras.reader/text! node ".roll-echo" "Something remembers.")))
;; ---------------------------------------------------------------------
(defn mount! [check]
(fedoras.reader/widget
(keyword "roll" (:id check))
(str "roll-" (:id check))
(fn [node]
(paint! node check)
(fedoras.reader/on-click! node ".roll-go" (fn [_] (roll-once! node check)))
(fedoras.reader/on-click! node ".roll-rewrite" (fn [_] (rewrite! node check))))))</script>
```
# Scene 2 — In Season
```{=html}
<span style="display:none;"></span>
```
```{=html}
<blockquote class="handbook"><p class="rule-number">The Fedora Handbook, Rule #6</p><p class="rule-text">“Every organization needs a treasurer, a secretary, and a scapegoat. With careful planning, these can be one person.”</p></blockquote>
```
```{=html}
<div class="scene"><div class="screenplay"><p class="slug">INT. A GRAY ROOM WITH NO WINDOWS — TUESDAY, 10:52 A.M.</p></div><div class="screenplay"><p class="action">The room is already set with twelve chairs arranged neatly around an ornate conference table. Marcy Antellier is laying out pens, one at each place, and a small bowl of mints in the middle of the table, while Bartholomew Tranche-Lard (facilities) impatiently waits for the quarterly meeting to begin.</p></div><div class="screenplay"><div class="dialogue"><p class="character">BARTHOLOMEW</p><div class="lines"><p class="line">What are those?</p></div></div><div class="dialogue"><p class="character">MARCY</p><div class="lines"><p class="line">Mints.</p></div></div><div class="dialogue"><p class="character">BARTHOLOMEW</p><div class="lines"><p class="line">It's a meeting, not a hotel.</p></div></div><div class="dialogue"><p class="character">MARCY</p><p class="paren">(Smiling)</p><div class="lines"><p class="line">It's a meeting! So take a mint.</p></div></div></div><div class="screenplay"><p class="action">Bartholomew Tranche-Lard takes a mint and holds it up to inspect it, the way you might a fine jewel. The man is gigantic, and he looks like a drill sergeant who has been retired to the school as their gym coach. Everything he does is too loud, and not on purpose.</p><p class="action">Dalton Hillcrux comes in behind him, on a call, and does not hang up until he has sat down.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DALTON</p><div class="lines"><p class="line">No. No. Tell them no. Tell them we'll do it in</p><p class="line">April.</p></div></div></div><div class="screenplay"><p class="action">He hangs up. He puts the phone face down on the table and looks at the mints.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DALTON</p><div class="lines"><p class="line">Whose idea?</p></div></div><div class="dialogue"><p class="character">MARCY</p><p class="paren">(Still beaming)</p><div class="lines"><p class="line">Mine.</p></div></div><div class="dialogue"><p class="character">DALTON</p><div class="lines"><p class="line">It's fine.</p></div></div></div><div class="screenplay"><p class="action">Dean Magnus Sterling comes in with Priya Kessler-Vance. He is mid-sentence. She is walking half a step behind him and not in a subordinate way.</p></div><div class="screenplay"><div class="dialogue"><p class="character">STERLING</p><p class="paren">(Red faced)</p><div class="lines"><p class="line">-and I said to her, I was saying, the thing about</p><p class="line">this institution is that we are in CHARGE of</p><p class="line">knowledge!! That is the WHOLE of what we are.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Sit down, Magnus.</p></div></div></div><div class="screenplay"><p class="action">They sit down. He is at the head of the table because it did not occur to anybody else to sit there. She is at the middle of the table because that is where the agenda is.</p></div><div class="screenplay"><div class="dialogue"><p class="character">BARTHOLOMEW</p><div class="lines"><p class="line">The House.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">What about it.</p></div></div><div class="dialogue"><p class="character">BARTHOLOMEW</p><div class="lines"><p class="line">The floor plan has changed twice this month. The</p><p class="line">south corridor is a foot longer on Tuesday than it</p><p class="line">is on Monday. The Helps on the west side have</p><p class="line">stopped going into the reading room. Nobody has</p><p class="line">told them to stop and nobody knows why they have.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">It's contained.</p></div></div><div class="dialogue"><p class="character">BARTHOLOMEW</p><div class="lines"><p class="line">It's contained the way a tiger is contained in</p><p class="line">your house while you remain locked outside. The</p><p class="line">thing in the back room is doing something to the</p><p class="line">building. I would like it on the record that I</p><p class="line">said that.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">It's on the record.</p></div></div></div><div class="screenplay"><p class="action">The door opens without a knock. Montgomery comes in. Black suit, plain, no tie. Black sunglasses, and a wire at the collar that is hard to miss and no one mentions.</p><p class="action">He stands behind the chair at the far end of the table and looks at Bartholomew.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">It isn't a leak and it isn't contained. It is a</p><p class="line">thing you were given and you do not understand,</p><p class="line">and I am not here to explain it to you. I am here</p><p class="line">because the alternative to checking on it is</p><p class="line">finding out.</p></div></div><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">The floor plan is going to keep changing. The</p><p class="line">Helps are going to keep avoiding the reading room.</p><p class="line">Every quarter somebody at this table is going to</p><p class="line">tell me the building is doing something new, and</p><p class="line">every quarter I am going to come down here and</p><p class="line">tell you the same thing, and the same thing is:</p><p class="line">leave it alone and write it down. That is not a</p><p class="line">difficulty. That is a job. You are supposed to be</p><p class="line">able to do it.</p></div></div></div><div class="screenplay"><p class="action beat">Bartholomew puts the mint in his mouth. It is the loudest thing that happens for a while.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">Meridian does not come down here because we enjoy</p><p class="line">the drive. We come down here because the last time</p><p class="line">we stopped, somebody moved something.</p></div></div></div><div class="screenplay"><p class="action">Montgomery takes a mint from the bowl. He puts it in his pocket. He does not eat it.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">Term one is over. Where are we.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Where we expected to be. The November drafts came</p><p class="line">in on time and the December list will settle where</p><p class="line">it always settles.</p></div></div><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">And the exception.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Still an exception. Still small.</p></div></div><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">Small is not a category of exception that Meridian</p><p class="line">recognises.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><p class="paren">(It's handled. It will come out at the front end)</p><div class="lines"><p class="line">and nothing downstream will see it.</p></div></div><div class="dialogue"><p class="character">MONTGOMERY</p><p class="paren">(Then it isn't handled, yet. It's just going unnoticed)</p><div class="lines"><p class="line">for now.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Yes.</p></div></div><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">Fix it.</p></div></div></div><div class="screenplay"><p class="action">The door opens again. Odile comes in first, and then Dr. Alfrès Jairis-Égari, and the room does something the room does every time. It stops. Not because anyone decides to. Because the room has been having this meeting for a very long time and it has never once had this meeting without him.</p><p class="action">He is old in a way that serves as a point of reference. He has long ceased to walk freely - one part carried and another part guided, yet still he is still legally the man who owns the buildings. Odile sits him down and sits beside him and does not touch the pens and does not take a mint.</p></div><div class="screenplay"><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">He can hear you. He would like you to continue.</p></div></div></div><div class="screenplay"><p class="action">Nobody has said anything yet.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">We were just finishing.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">He would like to hear the exception.</p></div></div></div><div class="screenplay"><p class="action beat">Kessler-Vance looks at Sterling. Sterling looks at the table. Nobody looks at Odile, which is the arrangement.</p></div><div class="screenplay"><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">One provisional. His hours below ground are</p><p class="line">running longer than the band. He does not seem to</p><p class="line">notice. He is doing well in his coursework and</p><p class="line">poorly at being unremarkable.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">Name.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span>.</p></div></div></div><div class="screenplay"><p class="action beat">Odile does not react. Dr. Jairis-Égari does not react. The room, which has been holding its breath without knowing it, puts the breath back.</p></div><div class="screenplay"><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">He would like the file.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Of course, no one is stopping him.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">He will have it before Friday.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Before Friday.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">And the photographer.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Which photographer?</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">There is only one person on campus authorized a</p><p class="line">camera.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">Her approval is state-issued. It is renewed</p><p class="line">annually. It is for anomaly documentation. It is</p><p class="line">not ours to review and it is not ours to revoke.</p></div></div><div class="dialogue"><p class="character">ODILE</p><p class="paren">(He knows whose it is. He is asking if she has used it for)</p><div class="lines"><p class="line">anything else.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">She has used it for everything else. She</p><p class="line">photographs whatever she looks at. The state</p><p class="line">approves it because the state would rather the</p><p class="line">photographs exist than not.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">Does she keep them.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">In her room, in a box under her bed. She has been</p><p class="line">advised that it is inapprobate to display them</p><p class="line">where they can be seen.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">Has she taken one of the House.</p></div></div></div><div class="screenplay"><p class="action beat">Kessler-Vance does not answer immediately. This is the first time in the meeting that she has had to think about what to say.</p></div><div class="screenplay"><div class="dialogue"><p class="character">KESSLER-VANCE</p><p class="paren">(She has photographed the outside of the building. She)</p><div class="lines"><p class="line">has not been inside. The House does not let her</p><p class="line">in.</p></div></div><div class="dialogue"><p class="character">ODILE</p><div class="lines"><p class="line">He would like to be told if that changes.</p></div></div><div class="dialogue"><p class="character">KESSLER-VANCE</p><div class="lines"><p class="line">You'll be told.</p></div></div></div><div class="screenplay"><p class="action">Dr. Jairis-Égari's hand moves. It is the first time it has moved since he sat down. Odile takes it and holds it and does not look at anybody.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MONTGOMERY</p><div class="lines"><p class="line">Then we're done.</p></div></div></div><div class="screenplay"><p class="action">He leaves. He does not say goodbye. He does not say anything else. The mint is still in his pocket.</p></div><div class="screenplay"><div class="dialogue"><p class="character">STERLING</p><div class="lines"><p class="line">Well. I think that went well.</p></div></div></div><div class="screenplay"><p class="action beat">Nobody answers him.</p><p class="action">The door opens one more time. The Caretaker comes in.</p><p class="action">He is not hurried, does not take a mint, does not sit down. He stands at the middle of the room and looks at the empty chair at the far end - the one Montgomery has just left, and then he looks at Marcy.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE CARETAKER</p><div class="lines"><p class="line">The box under the bed.</p></div></div><div class="dialogue"><p class="character">MARCY</p><div class="lines"><p class="line">Yes.</p></div></div><div class="dialogue"><p class="character">THE CARETAKER</p><div class="lines"><p class="line">Is it still under the bed.</p></div></div><div class="dialogue"><p class="character">MARCY</p><div class="lines"><p class="line">It has never been under the bed.</p></div></div><div class="dialogue"><p class="character">THE CARETAKER</p><div class="lines"><p class="line">Where is it.</p></div></div><div class="dialogue"><p class="character">MARCY</p><div class="lines"><p class="line">Inside the wardrobe, on the doors, where they have</p><p class="line">always been. The box under the bed has four</p><p class="line">photographs in it and they are photographs she has</p><p class="line">already shown somebody. The ones that matter are</p><p class="line">in the wardrobe.</p></div></div></div><div class="screenplay"><p class="action">The room does not react. This is obviously not new information.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE CARETAKER</p><div class="lines"><p class="line">Good.</p></div></div></div><div class="screenplay"><p class="action">He leaves. He is in the room for less than a minute. Nobody in the room says his name and nobody in the room writes down that he was here.</p><p class="action">Bartholomew takes another mint and this time he eats it immediately, which he does not normally do, and which nobody comments on.</p><p class="action">The room begins to end in the order it began. Dalton is already on another call. Sterling is still at the head of the table and is the last to stand up. Marcy is collecting the pens. Odile is watching Jairis-Égari and does not look at anybody and does not take a pen.</p></div><div class="screenplay"><p class="transition">Cut to:</p></div><div class="screenplay"><p class="slug">INT. HALLORAN UNION — ROOM 3C — WEDNESDAY, 7:00 P.M.</p></div><div class="screenplay"><p class="action">A folding table, dice tin, and hats.</p><p class="action">The grid on the pizza box lid has been redrawn because the old one wore off, and it is not the same size as the old one, and Miles has noted that in the ledger.</p><p class="action">Victor stands at the whiteboard, drawing a diagram of the south road. It has more arrows than it needs.</p></div><div class="screenplay"><div class="dialogue"><p class="character">GUILDMASTER [VICTOR]</p><div class="lines"><p class="line">The Collegium has received a complaint about the</p><p class="line">toll bridge on the south road. The keeper has not</p><p class="line">filed his returns for three weeks. This is a</p><p class="line">matter of civic importance, and the Collegium has</p><p class="line">entrusted it to us.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Us? Or you?</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">Us, Derek. The Fedora Society acts as one body.</p><p class="line">That is what a society is.</p></div></div><div class="dialogue"><p class="character">MILES</p><p class="paren">(I thought a society was just a club with a)</p><div class="lines"><p class="line">constitution.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">It is a body, Miles. A body with a constitution.</p><p class="line">A constitution is the skeleton of the body. We are</p><p class="line">the muscles.</p></div></div></div><div class="screenplay"><p class="action beat">Derek raises an eyebrow but says nothing. Simon leans back in his chair, relaxed, like a man who has been on many toll roads and found them all the same.</p></div><div class="screenplay"><div class="dialogue"><p class="character">SIMON</p><p class="paren">(So we go south, collect the missing returns,)</p><div class="lines"><p class="line">and come back. Easy.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">It is never easy, Simon. The toll keeper is a</p><p class="line">small man named Undertaker. He has worked that</p><p class="line">bridge for years, and he knows every inch of the</p><p class="line">road. He will talk. He will delay. He will offer</p><p class="line">you tea. Do not drink the tea.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Why not?</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">Because tea is for civilians. You are collectors.</p><p class="line">Collectors do not drink tea.</p></div></div></div><div class="screenplay"><p class="action">Miles writes down: 'No tea.' He writes it in a new column that he draws without asking.</p></div><div class="screenplay"><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">You leave at dawn. The animal will accompany you.</p><p class="line">It has been restless all week, which means the</p><p class="line">road is not right.</p></div></div></div><div class="screenplay"><p class="action">At the mention of the animal, <span class="ac-name" data-ac="-name" data-case="ac">the marmot</span> looks up from the floor beside <span class="pc-name" data-case="pc" data-pc="-first">Owen</span>'s chair. Then it puts its head back down and closes its eyes.</p></div><div class="screenplay"><p class="transition">Cut to:</p></div><div class="screenplay"><p class="slug">INT. THE SOUTH ROAD — IN THE FICTION</p></div><div class="screenplay"><p class="action">The road is old and wet. The party walks two by two. Victor describes the countryside: low hills, grey grass, the sound of water somewhere out of sight.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">This reminds me of the Via Appia. The Romans built</p><p class="line">roads like this, straight and true. They lasted</p><p class="line">forever.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">This road is curved.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">It curves because of the hills. The Via Appia went</p><p class="line">around hills too. The Romans were not stupid.</p></div></div><div class="dialogue"><p class="character">MILES</p><p class="paren">(Are we sure this road is on the map? I don't)</p><div class="lines"><p class="line">remember a south road.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">It is on the map, Miles. You are just not looking</p><p class="line">at the right map.</p></div></div></div><div class="screenplay"><p class="action">Miles writes down: 'Map discrepancy noted.'</p><p class="action">The animal stops. It stands in the middle of the road, looking toward the bend ahead. Then it sits down.</p></div><div class="screenplay"><div class="dialogue"><p class="character">PALADIN [SIMON]</p><div class="lines"><p class="line">What's wrong with it?</p></div></div><div class="dialogue"><p class="character">RANGER [<span class="pc-name" data-case="pc" data-pc="-first">Owen</span>]</p><div class="lines"><p class="line">I think it sees something.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">Roll for the animal's instincts. It knows the road</p><p class="line">better than any of you.</p></div></div></div><div class="screenplay"><p class="direction">Roll for what the animal senses on the road.</p></div></div>
```
---
```{=html}
<div><div class="roll" id="roll-road-instinct"><div class="roll-head"><span class="roll-label">THE ANIMAL, ON THE SOUTH ROAD</span><span class="roll-dc">DC 11</span></div><div class="roll-bar"><button class="roll-go">Roll d20</button><span class="roll-value"></span></div><p class="roll-out"></p><div class="roll-bar"><button class="roll-rewrite" style="display:none;">Rewrite history</button><span class="roll-echo"></span></div><p class="roll-note"></p><p class="roll-foot">Echo: <span class="echo-count">0</span> · Score: <span class="score-count">0</span></p></div><script type="application/x-scittle">(if-let [mount (resolve (quote fedoras.ui.dice-ui/mount!))] (mount {:id "road-instinct", :dc 11, :outcomes {:fumble "The animal lies down and refuses to move. Victor says, \"It isn't tired. It's warning you.\"|@VICTOR|The road ahead is quiet. Too quiet. Nothing moves, and the wind has stopped.", :fail "The animal whines, once, then walks on. It doesn't look back.|@VICTOR|The road is just a road. But there are no birds, and the grass is very still.", :success "The animal walks ahead, then stops at the bend and looks back at {pc}.|@VICTOR|There's a toll booth ahead, and a light on inside it, and a smell like old water and pine sap.", :crit "The animal moves to the far side of {pc} and presses against his leg.|@VICTOR|Something has walked this road recently. Something that didn't leave footprints. The animal can't tell you what, because it doesn't know words like that. But it knows the road is old, and that the old road never forgot how to be dangerous."}}) (js/console.error "fedoras: fedoras.ui.dice-ui/mount! is not on this page. Either the file that declares it was never shipped, or the namespace inside it does not match the path it was shipped from."))</script></div>
```
```{=html}
<div class="scene"><div class="screenplay"><p class="action">The toll booth is a stone hut with a wooden window, and the window is closed. The road bends around it. The animal stops again, this time at the threshold of the booth, and will not go further.</p></div><div><div class="session" id="session-two"><p class="session-who"></p><p class="session-text"></p></div><script type="application/x-scittle">(fedoras.reader/on-render! :session/two (fn [] (when-let [node (fedoras.reader/el "session-two")] (if-let [c (fedoras.reader/companion)] (do (fedoras.reader/text! node ".session-who" (clojure.string/upper-case (:name c))) (fedoras.reader/text! node ".session-text" (get {1 "The pigeon walks up to the booth with its head going, the way it walks up to everything, and stops a foot short of the step. It walks the length of the step, and back. Derek says Decimus Brutus sent pigeons out of Mutina with letters tied to their legs, and that nobody ever asked the pigeons. The Documentarian asks whether he should write down the number on its ring again, in case the booth wants one. Victor says NO. He says it very loudly. He says that nothing is to be written down within a hundred yards of this booth by anybody, and the pigeon settles on the road facing the shutter and tucks its ringed foot up under itself, where nobody can read it.", 2 "The centipede goes into the gap under the booth's door, which is what it does with doors, and comes back out faster than it went in. Then it goes round the booth instead, the whole of it, along the foot of the wall, until its head meets its own tail at the step and it has put a ring round the booth made of itself. It lies there. Derek says Caesar did that at Alesia, a wall round a wall, and that it worked, and that it took him a month. Victor says the centipede did it in a sentence. Simon says it is beautiful and is told, not for the first time, that the colour is a warning. Simon says he knows, the way a man says it when nothing he has been warned about has ever happened to him.", 3 "The marmot sits up in the road in front of the booth to look at it. The looking goes badly, so it chirps, and the chirp goes round the stone hut and comes back from inside it: the same chirp, quieter, a little late, and then a cough. Victor stops. He had not planned to do the cough. He did the cough. He looks at his own hand as though it did it. The marmot lies down flat in the road with its paws over its nose and will not go any nearer, and Derek, who has been leaning back, sits forward and asks who else is in there. Victor says NOBODY IS IN THERE, DEREK, very loudly, which is how everybody at the table knows that somebody is.", 4 "The cat will not go near the booth while anybody is watching it, and everybody is watching it, so it sits in the road with its tail round its feet and looks at the shutter. The Paladin looks away first, at the road, which he has been told is dangerous and which has never been dangerous to him. When he looks back the cat is on the windowsill of the booth with its face against the shutter, listening, and its tail has gone as thick as a bottle brush. Then it is back in the road. Nobody saw it come down. Miles writes NOT APPROVED, and Victor asks what is not approved, and Miles says the cat, generally.", 5 "The turkey stops at the step of the booth and its head goes through every colour it has and settles on one Victor has not used before, which he calls the colour of an overdue return. It gobbles at the shutter, and from somewhere inside the booth a kettle answers it, a thin whistle that rises and cuts off. The turkey gobbles again. Nothing answers. Victor looks at his notes, turns a page, turns it back, and says SHITTE, quietly, in the old way, to the notes. The turkey stays in the road with its tail fanned, facing the shutter, waiting for the kettle to try again.", 6 "The badger will not go through the door of the booth, so it goes under it, as it goes under everything, and the ground under the booth turns out to go down a long way, towards the river. It comes back out almost at once, backwards, with water in its fur that is not from the rain and a smell on it that Victor describes as very old road. Then it digs at the foot of the step, hard, down and away from the booth. Derek says it is looking for the road under the road, because there is always a road under the road, the Romans built every one of theirs on top of somebody else's. Victor looks at him for a long time and writes something on the back of his hand.", 7 "The weasel goes at the booth in a straight line at full speed, as it goes at everything, and stops dead on the step so hard that its back end overtakes its front. It stands up and looks at the shutter. Then it begins the dance, sideways and backwards and straight up, and Victor, who danced it with the weasel the first night and knocked over the tin, gets up to dance it again. He gets as far as the first sidestep. The weasel stops dancing and sits down in the road with its back to the booth, and Victor stops too, and stands in Room 3C with one foot off the floor, and says SHITTE, in the old way, and sits down.", 8 "The fox is at the edge of the light, where it always is, and comes no nearer to the booth than that. It sits in the bend of the road with its back to the booth and looks at the bridge beyond it, and then at the Ranger, and then at the bridge again, the way a guest at a party looks at the door while the host tells a long story. Victor describes the booth, the stone, the shutter, the step. The fox yawns through all of it. When Victor gets to the bridge the fox gets up, walks to the rail, looks over at the water for a long time, and comes back and sits in the road again, having shown them.", 9 "The wolverine lies down across the step of the booth, facing the shutter, and decides. Victor gives the table the deciding. It takes a while, and the smell comes off it in the meantime thick enough that Derek puts down what he is eating. Then the wolverine gets up, walks once round the booth, and marks all four corners of it with great deliberation. Derek says Romulus did that, went round the whole city and marked it, and then it was his. Victor says Romulus used a plough. Derek says the principle is the same. Victor says THE PRINCIPLE IS NOT THE SAME, DEREK, and the wolverine lies back down across the step, facing the shutter, in possession of a toll booth.", 10 "The dog trots up to the booth wagging and stops at the step as though it has come to the end of its lead. It sits. It looks at the shutter, and at the Ranger, and at the shutter, the way a dog tied up outside a shop looks at the door when somebody is inside. Simon, who has never once been refused anything by a dog, crouches and tells it that it is a good boy and pats the step, and the dog looks at the patted step with enormous sympathy and does not move. Simon says it has never done that to him before. Derek says there is a first time for everything. Simon says not usually, not for him, and is puzzled about it for the rest of the evening.", 11 "The python reaches the booth last, pouring down the road after the party, and lifts its head at the step, and the pits along its lip go looking for the warmest thing inside. Victor tells them what the python finds, which is nothing. No stove, no kettle, no lamp. The booth is the temperature of a church. Derek says Victor told them there would be tea. Victor says THERE WILL BE TEA. Derek says the snake says there isn't. Victor says the snake is not the Dungeon Master, and the python lays itself along the step, the whole length of it, with its head turned towards the bridge, where the pits have found something warm a long way below the road.", 12 "The mule plants itself in the road a cart's length from the booth, panniers on, and becomes part of the road. The Cleric pulls. The Paladin offers it a mint, which it eats, and it stays where it is. Miles turns back to MULE. DECLINED TO PROCEED. and asks whether he can write DITTO under it. Victor says ditto is not a word the Collegium recognises. Derek says it is Italian. Victor says THEN IT IS CERTAINLY NOT A WORD THE COLLEGIUM RECOGNISES, and the mule, which has heard all of this before, moves its weight from one hind leg to the other and waits for the party to come to its senses.", 13 "In Victor's next sentence the lynx is on the roof of the booth. In the sentence after that it is on the far rail of the bridge, and then in the road again, and in none of Victor's sentences is it inside the booth or anywhere near the door. Derek asks why it will not go in. Victor looks at his notes. The lynx, in the road, looks at his notes too, from the other side of the folding table, and Victor puts his hand flat on them and keeps it there for the rest of the session.", 14 "The ape stops at the step of the booth and holds out its hand to the Ranger, palm up. It wants the pencil. The Ranger gives it the pencil, and the ape looks at the shutter for a while, turning the pencil over in its fingers, and then it puts the pencil behind its ear and sits down in the road with its arms folded. Miles points out that a toll booth is exactly the kind of place a pencil is needed. Victor says the ape knows that. Miles asks why, then. Victor says BECAUSE, MILES, THERE ARE PLACES YOU DO NOT SIGN, and sweeps his arm across the folding table, and the dice go everywhere, and Derek catches two of them.", 15 "The horse will not go past the bend. It stands in the road with its head up and looks at the booth, and on the stone over the booth's door there is a crest, worn nearly flat, and it is the crest on the horse's breastplate. The wrong one. Derek says so. Victor says it is the crest. The horse folds one foreleg and bows to the booth, nose to the road, as horses were once taught to bow to kings, and then it backs away from it, three steps, and comes no nearer. Simon, whose paladin still cannot call a horse of his own, says the horse has lovely manners, the way a man says it about somebody else's staff.", 16 "The moose cannot fit through the door of the booth, and nobody expects it to try. It turns round. That takes a long time on a narrow road, and Victor gives it the time, every scrape of antler on the booth's stones, until the moose is standing with the booth at its back and its face to the way they came, entirely calm. Derek does the reversing beep, from habit. The moose does not reverse. Victor says it has done all the reversing it means to do on this road. Simon says, pleasantly, that it is a lovely animal, and asks whether moose are expensive, and Victor stares at him until he stops smiling.", 17 "At the step of the booth the pack on the Ranger's back goes cold. Everything on the road is cold already, so it takes a moment to notice that the one warm thing the Ranger has carried all week has stopped being warm. The Ranger opens the pack. The wyrmling is asleep, curled nose to tail as it always is, with its eyelids shut tight, the way a child shuts its eyes against a room it does not want to be in. Derek asks what colour it is now. Victor says it is the colour of the booth. Derek asks what colour the booth is. Victor says GREY, DEREK, IT IS A TOLL BOOTH, and the Ranger closes the pack and goes no nearer.", 18 "The falcon will not go near the booth. It sits on the Ranger's forearm with its talons through the same holes in the sleeve and looks at the shutter, and at the slit of dark under it, and then it turns its whole head away and presses it into the Ranger's shoulder. Victor says it wants the hood. The Ranger has the hood in his pocket. He leaves it there. Victor asks whether he is sure. The Ranger is sure. Simon says he would have put the hood on, and Victor says YES, SIMON, OF COURSE YOU WOULD, and Simon says thank you, because he thinks it was a compliment.", 19 "The wolf stops in the road short of the booth and lifts its head and howls, once. From under the bridge, a long way under, the others answer, more of them than the Ranger has heard before. Victor does the howl, and then, without being asked, does all the answers too, one after another, each a little further off, until he is howling into his own sleeve and Miles has to wait for him to finish before he can ask anything. The wolf lies down in the road facing the bridge. Miles asks how many wolves are on the sheet. Victor, hoarse, says one.", 20 "The bear walks up to the booth and puts its nose to the shutter and breathes in, once, the whole width of the booth, and whatever it smells makes it sit down. It sits in the road with its back against the stone wall, and the booth moves a little on its foundations. Victor is on his feet. Nobody saw him get up. He tells them the bear is sitting against the booth the way you would sit against a door you did not want opened from the inside. Then he sits down, and says, in a very small voice from behind the shutter, that he would be grateful if the bear could lean on something else. The bear does not lean on something else."} (:n c) ""))) (do (fedoras.reader/text! node ".session-who" "") (fedoras.reader/text! node ".session-text" "Roll for your animal in Act I, Scene 5, and it will be here."))))))</script></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Why won't it go in?</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">Maybe it smells the tea.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">The animal does not drink tea. It does not enter</p><p class="line">toll booths. It knows the toll is not a toll.</p></div></div></div><div class="screenplay"><p class="action">They knock. The window opens. Undertaker is a small man, or a thin man folded into a small shape. He looks at them like a man who has already paid.</p></div><div class="screenplay"><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">The Collegium sent you.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">We're here to collect.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Then you'll need the form. They always send the</p><p class="line">form. They send the form and the two men who carry</p><p class="line">it, and one of them reads while the other one</p><p class="line">watches my hands.</p></div></div><div class="dialogue"><p class="character">MILES</p><div class="lines"><p class="line">We don't have a form.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Then you're can't be from the Collegium.</p></div></div></div><div class="screenplay"><p class="action beat">The window closes. The road is too quiet again.</p></div><div class="screenplay"><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">He is correct. The Collegium did not send a form.</p><p class="line">That is why they sent you.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">Because we don't know any better.</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">Because you can be sent back.</p></div></div></div><div class="screenplay"><p class="action">The window opens again. Undertaker looks at the animal sitting in the road.</p></div><div class="screenplay"><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">It won't come to the window. It knows the toll.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">What is the toll?</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><p class="paren">(A name. One from each of you. It can be)</p><div class="lines"><p class="line">anyone. Someone you would give up.</p></div></div></div><div class="screenplay"><p class="action beat">The party looks at one another. The animal has not moved.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Marcus Antonius. He was a liar and a thief.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">That name is already in the box. You'll need</p><p class="line">another.</p></div></div></div><div class="screenplay"><p class="direction">Roll for the toll. What the table rolled is in the box.</p></div><div class="screenplay"><p class="action">Derek thinks. He thinks the way a man thinks when he has already spent his best name and is now being asked to spend another.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Gaius Octavius.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Also in the box.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">How many Romans do you have in that box?</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Most of them.</p></div></div></div><div class="screenplay"><p class="action beat">Simon leans forward. He has not been worried this whole time, and he is not worried now.</p></div><div class="screenplay"><div class="dialogue"><p class="character">SIMON</p><p class="paren">(I don't have a name to give. I've never wanted to)</p><div class="lines"><p class="line">give anyone up.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER [VICTOR]</p><div class="lines"><p class="line">Then you may pass. The toll is not for everyone.</p><p class="line">Only for those who have someone they would give.</p></div></div><div class="dialogue"><p class="character">MILES</p><div class="lines"><p class="line">That seems unfair.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">The road is unfair. It is old. It was here before</p><p class="line">the Collegium, and it will be here after All the</p><p class="line">Collegium is, is a paragraph in a ledger.</p></div></div></div><div class="screenplay"><p class="action beat">Miles writes that down. It takes him a moment longer than it should, because he is not sure if it should be written in the ledger or somewhere else.</p></div><div class="screenplay"><div class="dialogue"><p class="character">MILES</p><p class="paren">(I could give the name of the man who approved the)</p><div class="lines"><p class="line">road. He's probably dead, but a name is a name.</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Dead names are acceptable. Some say they're the</p><p class="line">best kind.</p></div></div></div><div class="screenplay"><p class="action">The window closes. Then it opens again, and the undertaker sets a small box on the sill. It is a wooden box, very old, with a slot in the top.</p></div><div class="screenplay"><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">Speak into the box. If you lie, it will know. If</p><p class="line">you tell the truth, it will know that too. It is</p><p class="line">the only part of the road that still remembers</p><p class="line">what the road was for.</p></div></div></div><div class="screenplay"><p class="action">Derek looks at the box. Then he looks at Victor.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Is this in the rules?</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">It is in the road.</p></div></div></div><div class="screenplay"><p class="direction">Roll for what happens when the box is opened.</p></div><div><div class="roll" id="roll-toll-box"><div class="roll-head"><span class="roll-label">LISTENING · THE BOX ON THE SILL</span><span class="roll-dc">DC 13</span></div><div class="roll-bar"><button class="roll-go">Roll d20</button><span class="roll-value"></span></div><p class="roll-out"></p><div class="roll-bar"><button class="roll-rewrite" style="display:none;">Rewrite history</button><span class="roll-echo"></span></div><p class="roll-note"></p><p class="roll-foot">Echo: <span class="echo-count">0</span> · Score: <span class="score-count">0</span></p></div><script type="application/x-scittle">(if-let [mount (resolve (quote fedoras.ui.dice-ui/mount!))] (mount {:id "toll-box", :dc 13, :outcomes {:fumble "{pc} rolls a one.|@VICTOR|You bend to the slot and say hm, the noise anybody makes bending down, and the box takes it. The slot closes on the sound. Somewhere inside, very small, your own voice says hm, and then says it again, a little more like you each time.", :fail "{pc} rolls {result-word}.|@VICTOR|It is a box. It is very old, and the edges of the slot are worn smooth the way a step is worn, by a great many people going the same way. Whatever it does, it does not do it where you can hear.", :success "{pc} rolls {result-word}.|@VICTOR|Inside the box, a long way down for a box that size, there are voices. Hundreds of them, each saying one name, and then saying it again with the same breath in the same place, the way a saved day says it.", :crit "{pc} rolls a twenty, and Victor puts his pen down.|@VICTOR|Inside the box there are voices, hundreds of them, each saying a name. One of them is yours. It is saying a name you have not said yet."}}) (js/console.error "fedoras: fedoras.ui.dice-ui/mount! is not on this page. Either the file that declares it was never shipped, or the namespace inside it does not match the path it was shipped from."))</script></div><div class="screenplay"><p class="action">The party is still deciding what to say into the box when the curtain behind Undertaker shifts. Undertaker does not turn around, but his hands go still on the window ledge.</p><p class="action">A girl steps out. She is their age, maybe a little younger. She is dressed in layers of green and brown that do not look like they belong to the road. She holds a small, folded page against her chest, as if it is the only part of her that is still dry.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">Don't speak into the box. It doesn't just remember</p><p class="line">names. It remembers voices. Once it has your</p><p class="line">voice, it can call you back to the road whenever</p><p class="line">it wants.</p></div></div></div><div class="screenplay"><p class="action beat">The party is quiet. Victor is not quiet.</p></div><div class="screenplay"><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">She's not in the module.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">She's not in the ledger, either.</p></div></div><div class="dialogue"><p class="character">MILES</p><div class="lines"><p class="line">How do you know?</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">She's not dressed like someone in a ledger.</p></div></div></div><div class="screenplay"><p class="action">The undertaker sighs. It is the sigh of a man who has kept a secret for too long and is almost relieved to be found out.</p></div><div class="screenplay"><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">She came across the bridge three weeks ago,</p><p class="line">carrying a page from a book and a cough that</p><p class="line">wouldn't stop. I let her stay. The forms for</p><p class="line">letting her stay are worse than the forms for</p><p class="line">filing returns, so I filed the returns wrong.</p><p class="line">That's all. That's the whole crime.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">And the toll of names?</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><p class="paren">(That's part of the bridge. I don't make the bridge.)</p><div class="lines"><p class="line">I only keep it.</p></div></div></div><div class="screenplay"><p class="action">The girl takes a step forward. The animal, which has not moved from the threshold, rises and walks to stand beside her. It does not growl. It does not wag. It just stands there, as if it has been waiting for her to come out.</p></div><div class="screenplay"><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">What's your name?</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(I don't give it. Not to collectors. Not to men who)</p><div class="lines"><p class="line">carry boxes with slots in them.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Then what do we call you?</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(I'm a druid. You can call me that. It's not a)</p><div class="lines"><p class="line">name, but it's the truest thing I have.</p></div></div></div><div class="screenplay"><p class="action beat">Derek looks at Miles. Miles looks at Victor. Victor looks at the ceiling, as if the word 'druid' is one he has seen in a footnote and never expected to say out loud.</p></div><div class="screenplay"><div class="dialogue"><p class="character">VICTOR</p><p class="paren">(Druid. That's a class in the old sense. The one)</p><div class="lines"><p class="line">that talks to trees.</p></div></div><div class="dialogue"><p class="character">DEREK</p><p class="paren">(Trees? Like the things in the margins of the)</p><div class="lines"><p class="line">old maps?</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">I thought those were a metaphor.</p></div></div><div class="dialogue"><p class="character">MILES</p><p class="paren">(The word 'forest' appears in the ledger three)</p><div class="lines"><p class="line">times. All in margins. All in different hands.</p></div></div></div><div class="screenplay"><p class="action">The girl looks at them for a long moment. She looks at Miles, then at Derek, then at Simon, then at <span class="pc-name" data-case="pc" data-pc="-first">Owen</span>. When she speaks again, her voice is quieter, but no less sure.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">You really don't know what a forest is.</p></div></div></div><div class="screenplay"><p class="action beat">It is not a question.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">It's not a metaphor. It's not a map. It's a place</p><p class="line">with a thousand voices and no names, and it's</p><p class="line">dying. That's what I'm trying to save. The last</p><p class="line">one. And the page is the only part of it that can</p><p class="line">still speak.</p></div></div></div><div class="screenplay"><p class="action">She holds out the page, just enough for them to see. It is not paper. It is a leaf from a codex, broad and veined, with letters that look like they have grown there. Derek leans in, and the girl pulls it back against her chest.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Is it a leaf or a page?</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">Yes.</p></div></div></div><div class="screenplay"><p class="action">The patrol arrives before anyone can ask what that means.</p><p class="action">There is no sound. No marching feet. No horns. Just a change in the air, and then a man in the road, and then two more behind him. They are wearing the colours of the Collegium, and they are carrying a form.</p></div><div class="screenplay"><div class="dialogue"><p class="character">PATROL LEADER</p><div class="lines"><p class="line">Collectors. The road is closed. The bridge is to</p><p class="line">be cleared. The girl is to come with us.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">She doesn't seem to want to go.</p></div></div><div class="dialogue"><p class="character">PATROL LEADER</p><div class="lines"><p class="line">She isn't asked.</p></div></div></div><div class="screenplay"><p class="action">The animal turns. It does not growl. It simply places itself between the girl and the patrol, and it does not move.</p></div><div class="screenplay"><div class="dialogue"><p class="character">PATROL LEADER</p><div class="lines"><p class="line">Call off your beast.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">It isn't a beast. It's my companion.</p></div></div><div class="dialogue"><p class="character">PATROL LEADER</p><p class="paren">(It is the same thing. Call it off or we)</p><div class="lines"><p class="line">will.</p></div></div></div><div class="screenplay"><p class="direction">Roll for the standoff. What the table rolled is in the box.</p></div><div><div class="roll" id="roll-standoff"><div class="roll-head"><span class="roll-label">THE STANDOFF AT THE TOLL BRIDGE</span><span class="roll-dc">DC 13</span></div><div class="roll-bar"><button class="roll-go">Roll d20</button><span class="roll-value"></span></div><p class="roll-out"></p><div class="roll-bar"><button class="roll-rewrite" style="display:none;">Rewrite history</button><span class="roll-echo"></span></div><p class="roll-note"></p><p class="roll-foot">Echo: <span class="echo-count">0</span> · Score: <span class="score-count">0</span></p></div><script type="application/x-scittle">(if-let [mount (resolve (quote fedoras.ui.dice-ui/mount!))] (mount {:id "standoff", :dc 13, :outcomes {:fumble "{pc} rolls {result-mod} and the animal does not move. The patrol leader smiles.|@VICTOR|The patrol leader says, \"It's loyal. That's worse.\" Then he raises his hand, and the two behind him lower their spears.", :fail "{pc} rolls low ({result-mod}). The patrol leader steps forward, and the animal holds, but it is outnumbered.|@VICTOR|The standoff does not break. It bends. The party is going to have to move quickly.", :success "{pc} rolls {result-mod}. The animal stands perfectly still, and the patrol leader hesitates.|@VICTOR|For a long moment, nobody moves. Then the patrol leader says, \"This isn't the road. It's the bridge.\" And he turns his men away.", :crit "{pc} rolls a twenty. The animal takes a single step forward, and the patrol leader's horse shies.|@VICTOR|The patrol leader does not shout. He does not order an attack. He just looks at the animal, and then at {pc}, and he says, \"You have until the next bell. Then I come back with more than a form.\""}}) (js/console.error "fedoras: fedoras.ui.dice-ui/mount! is not on this page. Either the file that declares it was never shipped, or the namespace inside it does not match the path it was shipped from."))</script></div><div class="screenplay"><p class="action">The patrol is gone. The road is quiet again, but not the good kind of quiet. The kind that comes before more men.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(We have to go. The bridge won't keep them)</p><div class="lines"><p class="line">long. It's old, but it isn't loyal.</p></div></div><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Loyal?</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(The bridge only keeps what it's been paid to)</p><div class="lines"><p class="line">keep. The Collegium underpaid it years ago.</p></div></div></div><div class="screenplay"><p class="action">The undertaker is already at the window, pulling a latch that opens a small gate at the side of the booth.</p></div><div class="screenplay"><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">There's a path behind the booth. It follows the</p><p class="line">old road, not the new one. The new road goes</p><p class="line">south. The old road goes somewhere else.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">Where does it go?</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">It goes to the place the road used to be before</p><p class="line">the Collegium decided where roads should go.</p></div></div></div><div class="screenplay"><p class="action">The girl looks at the party. Then she looks at <span class="pc-name" data-case="pc" data-pc="-first">Owen</span>.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">Your animal already knows the way. It won't cross</p><p class="line">the bridge because it can smell the old road</p><p class="line">underneath. That's why it sat down.</p></div></div><div class="dialogue"><p class="character">MILES</p><div class="lines"><p class="line">I thought it was because of the tea.</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(There is no tea. Tea hasn't crossed this)</p><div class="lines"><p class="line">bridge in twenty years.</p></div></div></div><div class="screenplay"><p class="action beat">Derek looks at the empty cups on the undertaker's sill.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">Then what were we supposed not to drink?</p></div></div><div class="dialogue"><p class="character">UNDERTAKER</p><div class="lines"><p class="line">The water. The water comes from the old road. It</p><p class="line">remembers the road. If you drink it, you remember</p><p class="line">it too.</p></div></div></div><div class="screenplay"><p class="action">The girl is already at the side gate. She motions for the party to follow.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">The animal knows. Let it lead.</p></div></div></div><div class="screenplay"><p class="direction">Roll for the animal to find the old road.</p></div><div><div class="roll" id="roll-old-road"><div class="roll-head"><span class="roll-label">THE ANIMAL AND THE OLD ROAD</span><span class="roll-dc">DC 12</span></div><div class="roll-bar"><button class="roll-go">Roll d20</button><span class="roll-value"></span></div><p class="roll-out"></p><div class="roll-bar"><button class="roll-rewrite" style="display:none;">Rewrite history</button><span class="roll-echo"></span></div><p class="roll-note"></p><p class="roll-foot">Echo: <span class="echo-count">0</span> · Score: <span class="score-count">0</span></p></div><script type="application/x-scittle">(if-let [mount (resolve (quote fedoras.ui.dice-ui/mount!))] (mount {:id "old-road", :dc 12, :outcomes {:fumble "{ac} starts down the path, then stops and circles back. It sits at the toll booth and refuses to move.|@VICTOR|The path is a dead end. The old road is under the bridge, not behind it, and the girl looks like she's about to cry.", :fail "{ac} leads them off the path and into the brush. The going is slow, and the girl keeps looking back at the road.|@VICTOR|They find a track, but it's narrow and flooded, and the patrol will have no trouble following.", :success "{ac} moves to the side of the toll booth, sniffs the ground, and then slips through a gap in the hedge.|@VICTOR|Beyond it, there is an old drovers' track, half-hidden by brambles. The girl exhales. \"It knows.\"", :crit "{ac} walks to the edge of the bridge, then turns and follows the old road under the arch. There is no path there, but the animal doesn't hesitate.|@VICTOR|The girl laughs. It is not a happy sound. It is the sound of someone who has been alone for a long time and has just remembered what company feels like."}}) (js/console.error "fedoras: fedoras.ui.dice-ui/mount! is not on this page. Either the file that declares it was never shipped, or the namespace inside it does not match the path it was shipped from."))</script></div><div class="screenplay"><p class="action">They follow the animal. The old road is not a road in the traditional sense. It is a memory of a road, and it goes where the new road cannot.</p><p class="action">Behind them, the toll booth is still. The undertaker has closed the window. There is no sound from the bridge, and there will not be until the next bell.</p><p class="action">The girl walks beside <span class="pc-name" data-case="pc" data-pc="-first">Owen</span>. The leaf is still against her chest. She does not speak for a while.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><p class="paren">(I didn't think I'd ever see a real animal)</p><div class="lines"><p class="line">again. Not one that knew the old roads.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">What do you mean, a real animal?</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">The ones in the Collegium are made. They're copies</p><p class="line">of the idea of an animal. Yours isn't. Yours came</p><p class="line">from somewhere else. It knows the old road because</p><p class="line">it was born on it.</p></div></div></div><div class="screenplay"><p class="action beat">Derek, from behind them:</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><p class="paren">(Are we still collecting the toll? Because I)</p><div class="lines"><p class="line">think we've gone a little past the toll.</p></div></div><div class="dialogue"><p class="character">SIMON</p><p class="paren">(We're not collecting anything. We're running.)</p><div class="lines"><p class="line">We're doing it quietly, but we're running.</p></div></div><div class="dialogue"><p class="character">MILES</p><div class="lines"><p class="line">I have to record that. 'The party is no longer on</p><p class="line">the south road. The party is on the old road. This</p><p class="line">was not in the ledger.'</p></div></div><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">Write it in the new column. The one we made for</p><p class="line">things that are true but not approved.</p></div></div></div><div class="screenplay"><p class="action">Miles does. It is the first time the column has been used for something that is not a joke.</p><p class="action">The old road goes on. It is not straight. It curves like the land had curves before the Collegium graded them. The girl stops once, and the animal stops with her. They are standing at the edge of a treeline.</p><p class="action">The trees are not like the trees in the margins of old maps. They are taller, and darker, and the leaves are heavy with water that has not fallen.</p></div><div class="screenplay"><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">We're here.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">It's a forest.</p></div></div><div class="dialogue"><p class="character">THE GIRL</p><div class="lines"><p class="line">It's the last one.</p></div></div></div><div class="screenplay"><p class="action beat">The party stands at the edge of the forest. The animal walks a few steps into the trees, then turns and looks back at them, as if to say, 'This is what I've been trying to tell you.'</p></div><div class="screenplay"><div class="dialogue"><p class="character">VICTOR</p><div class="lines"><p class="line">And that is where we will end for tonight.</p><p class="line">Because I need to read what a druid actually does,</p><p class="line">and I don't want to do it in front of you.</p></div></div></div><div class="screenplay"><p class="action beat">Nobody laughs. Derek is still looking at the trees.</p></div><div class="screenplay"><div class="dialogue"><p class="character">DEREK</p><div class="lines"><p class="line">I thought forests were a myth.</p></div></div><div class="dialogue"><p class="character">SIMON</p><div class="lines"><p class="line">So did I.</p></div></div><div class="dialogue"><p class="character">MILES</p><p class="paren">(The word 'forest' appears in the ledger three)</p><div class="lines"><p class="line">times. All in margins. All in different hands.</p></div></div></div><div class="screenplay"><p class="action">The girl looks back at them from the treeline. She is not smiling. But she is not running anymore.</p></div><div class="screenplay"><p class="transition">Blackout.</p></div><div class="screenplay"><p class="slug">EXT. CORLISS FIELD — FRIDAY, 4:30 P.M.</p></div><div class="screenplay"><p class="action"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span> is crossing the field because it is the short way back from Plant Services and he has a torch in his pocket and a bucket in his hand.</p><p class="action">A machine at the far end fires punts. It is on a trolley and somebody has to keep feeding it and nobody is feeding it, so it goes off every forty seconds whether or not anybody is ready.</p><p class="action">CHAD is under them. Two freshmen are trying to be.</p><p class="action">It fires. A FRESHMAN runs to a place on the grass and stands on it and puts his hands up, and the ball comes down eight feet behind him.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Again.</p></div></div></div><div class="screenplay"><p class="action">Chad takes the next one himself. Two short steps back, a wait, one more, a wait, about a foot to his left, and he has it against his chest without appearing to have gone anywhere at all.</p></div><div class="screenplay"><div class="dialogue"><p class="character">A FRESHMAN</p><div class="lines"><p class="line">How do you know where it's going?</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">I don't. It's still going up. Nobody knows where</p><p class="line">it is yet, including it.</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Take half of what's left. Then look at it again.</p><p class="line">Then take half of that.</p></div></div></div><div class="screenplay"><p class="action beat">He says it the way you say a thing you have said four thousand times.</p><p class="action">He notices <span class="pc-name" data-case="pc" data-pc="-first">Owen</span> on the touchline.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Thinking part!</p></div></div></div><div class="screenplay"><p class="action"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span> has both programmes in his bag. He has had them in his bag since September and has taken them out about eleven times.</p></div><div class="screenplay"><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Can I ask you something.</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Go on.</p></div></div></div><div class="screenplay"><p class="action">He gets the September sheet out and holds it where Chad can see it and puts his thumb on the line.</p></div><div class="screenplay"><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Thirty.</p></div></div></div><div class="screenplay"><p class="action beat">Chad looks at it for about two seconds.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Yeah. Bell.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">He's not on the October one.</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">No. He went in September.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Went where?</p></div></div></div><div class="screenplay"><p class="action">The machine fires. Chad does not look at it. It comes down forty feet away and rolls.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Reviewed. He was carrying from last year and he</p><p class="line">didn't get it back.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">In September? Review's in December.</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Review's in December for you. We go in June.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Why June?</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Because you can't review a squad in season. They</p><p class="line">did it years ago and lost four in a November and</p><p class="line">the season went, so now it's June, and by June</p><p class="line">you've had two more terms to be fine in.</p></div></div></div><div class="screenplay"><p class="action beat">He says this the way you would say the away kit is white.</p></div><div class="screenplay"><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">So Bell got reviewed in September because—</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Because he came off the squad in August. Knee.</p><p class="line">Once you're off, you're on the December one like</p><p class="line">everybody else, except he was carrying two and it</p><p class="line">was September, so they didn't wait.</p></div></div></div><div class="screenplay"><p class="action beat"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span> stands there with a programme in his hand.</p></div><div class="screenplay"><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">They didn't wait.</p></div></div><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">No.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Chad. Where did he go?</p></div></div></div><div class="screenplay"><p class="action">The machine fires. Chad takes a short step and waits and takes another and catches it, and holds it, and does not throw it back.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">I want to say home. Everybody says home.</p></div></div><div class="dialogue"><p class="character"><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></p><div class="lines"><p class="line">Do you think it's home?</p></div></div></div><div class="screenplay"><p class="action beat">Four seconds, which is longer than Chad has taken over anything all year.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">I think if it was home he'd have said something to</p><p class="line">somebody. He had a locker with a picture in it.</p><p class="line">Somebody cleared the locker and it wasn't him.</p></div></div></div><div class="screenplay"><p class="action beat">The machine fires. Neither of them looks at it.</p></div><div class="screenplay"><div class="dialogue"><p class="character">CHAD</p><div class="lines"><p class="line">Sixty a day since I was nine. It's not a skill,</p><p class="line">it's just the sixty.</p></div></div></div><div class="screenplay"><p class="action">He goes back under them. <span class="pc-name" data-case="pc" data-pc="-first">Owen</span> folds the programme and puts it in the bag with the other one and carries a bucket back across a field.</p></div><div class="screenplay"><p class="transition">Blackout.</p></div><div class="screenplay"><p class="action">Friday night. He has Victor's dice tin, which he was given on Wednesday and has not given back. A corner is a one, a two, or a three.</p></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/corners
</code></pre></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/halfway
</code></pre></div><div class="screenplay"><p class="action">Start in the middle. Take half of what is left. Look again. He rolls the die thirty times and types in what it says, and it is a way of not thinking about a locker.</p></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/rolls
</code></pre></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/dots-from-rolls
</code></pre></div>31<div class="screenplay"><p class="action">Thirty dots is a mess with no shape in it, which is what thirty of anything looks like.</p><p class="action">So he asks the page for the die instead, and gives it a number, so that he can put in as many as he likes and see what happens at each size.</p></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/dots
</code></pre></div><div><pre><code class="sourceCode language-clojure printed-clojure">#'act2.s2-in-season/draw
</code></pre></div><svg viewBox="-4 -4 108 95" width="400" xmlns="http://www.w3.org/2000/svg"><rect height="95" style="fill:var(--paper);" width="108" x="-4" y="-4"></rect><path d="M45.32,19.01h0.01 M47.66,9.51h0.01 M73.83,48.05h0.01 M86.92,67.33h0.01 M93.46,76.96h0.01 M96.73,81.78h0.01 M98.36,84.19h0.01 M74.18,42.10h0.01 M87.09,64.35h0.01 M68.55,32.17h0.01 M84.27,59.39h0.01 M92.14,72.99h0.01 M96.07,79.80h0.01 M73.03,39.90h0.01 M36.52,63.25h0.01 M43.26,31.62h0.01 M71.63,59.11h0.01 M85.81,72.86h0.01 M67.91,36.43h0.01 M58.95,18.21h0.01 M29.48,52.41h0.01 M14.74,69.50h0.01 M57.37,78.05h0.01 M28.68,82.33h0.01 M39.34,41.16h0.01 M19.67,63.88h0.01 M9.84,75.24h0.01 M4.92,80.92h0.01 M27.46,40.46h0.01 M63.73,63.53h0.01 M56.86,31.77h0.01 M28.43,59.18h0.01 M64.22,72.89h0.01 M32.11,79.75h0.01 M66.05,83.17h0.01 M33.03,84.89h0.01 M41.51,42.44h0.01 M70.76,64.52h0.01 M35.38,75.56h0.01 M42.69,37.78h0.01 M71.34,62.19h0.01 M85.67,74.40h0.01 M67.84,37.20h0.01 M33.92,61.90h0.01 M41.96,30.95h0.01 M45.98,15.47h0.01 M72.99,51.04h0.01 M36.49,68.82h0.01 M43.25,34.41h0.01 M46.62,17.20h0.01 M48.31,8.60h0.01 M49.16,4.30h0.01 M74.58,45.45h0.01 M87.29,66.03h0.01 M93.64,76.31h0.01 M46.82,81.46h0.01 M73.41,84.03h0.01 M61.71,42.01h0.01 M80.85,64.31h0.01 M65.43,32.15h0.01 M82.71,59.38h0.01 M91.36,72.99h0.01 M95.68,79.79h0.01 M72.84,39.90h0.01 M36.42,63.25h0.01 M43.21,31.62h0.01 M71.60,59.11h0.01 M60.80,29.56h0.01 M55.40,14.78h0.01 M27.70,50.69h0.01 M13.85,68.64h0.01 M31.93,34.32h0.01 M65.96,60.46h0.01 M32.98,73.53h0.01 M66.49,80.07h0.01 M83.25,83.33h0.01 M91.62,84.97h0.01 M70.81,42.48h0.01 M35.41,64.54h0.01 M17.70,75.57h0.01 M8.85,81.09h0.01 M4.43,83.84h0.01 M27.21,41.92h0.01 M13.61,64.26h0.01 M31.80,32.13h0.01 M65.90,59.37h0.01 M57.95,29.68h0.01 M28.98,58.14h0.01 M39.49,29.07h0.01 M69.74,57.84h0.01 M84.87,72.22h0.01 M42.44,79.41h0.01 M71.22,83.00h0.01 M60.61,41.50h0.01 M55.30,20.75h0.01 M27.65,53.68h0.01 M63.83,70.14h0.01 M81.91,78.37h0.01 M90.96,82.48h0.01 M70.48,41.24h0.01 M35.24,63.92h0.01 M67.62,75.26h0.01 M33.81,80.93h0.01 M16.90,83.77h0.01 M58.45,85.18h0.01 M29.23,85.89h0.01 M39.61,42.95h0.01 M19.81,64.77h0.01 M9.90,75.69h0.01 M4.95,81.14h0.01 M27.48,40.57h0.01 M63.74,63.59h0.01 M81.87,75.09h0.01 M40.93,80.85h0.01 M20.47,83.72h0.01 M10.23,85.16h0.01 M5.12,85.88h0.01 M2.56,86.24h0.01 M26.28,43.12h0.01 M13.14,64.86h0.01 M56.57,75.73h0.01 M78.28,81.17h0.01 M39.14,83.88h0.01 M44.57,41.94h0.01 M22.29,64.27h0.01 M61.14,75.44h0.01 M55.57,37.72h0.01 M27.79,62.16h0.01 M63.89,74.38h0.01 M56.95,37.19h0.01 M78.47,61.89h0.01 M64.24,30.95h0.01 M57.12,15.47h0.01 M28.56,51.04h0.01 M14.28,68.82h0.01 M7.14,77.71h0.01 M53.57,82.15h0.01 M51.78,41.08h0.01 M75.89,63.84h0.01 M37.95,75.22h0.01 M18.97,80.91h0.01 M9.49,83.75h0.01 M4.74,85.18h0.01 M27.37,42.59h0.01 M13.69,64.59h0.01 M6.84,75.60h0.01 M53.42,81.10h0.01 M51.71,40.55h0.01 M50.86,20.27h0.01 M50.43,10.14h0.01 M50.21,5.07h0.01 M50.11,2.53h0.01 M50.05,1.27h0.01 M50.03,0.63h0.01 M75.01,43.62h0.01 M87.51,65.11h0.01 M68.75,32.55h0.01 M84.38,59.58h0.01 M42.19,73.09h0.01 M46.09,36.54h0.01 M48.05,18.27h0.01 M24.02,52.44h0.01 M62.01,69.52h0.01 M81.01,78.06h0.01 M65.50,39.03h0.01 M32.75,62.81h0.01 M16.38,74.71h0.01 M33.19,37.35h0.01 M41.59,18.68h0.01 M70.80,52.64h0.01 M60.40,26.32h0.01 M30.20,56.46h0.01 M40.10,28.23h0.01 M70.05,57.41h0.01 M35.02,72.01h0.01 M67.51,79.30h0.01 M83.76,82.95h0.01 M66.88,41.48h0.01 M33.44,64.04h0.01 M41.72,32.02h0.01 M70.86,59.31h0.01 M60.43,29.65h0.01 M55.21,14.83h0.01 M27.61,50.71h0.01 M38.80,25.36h0.01 M19.40,55.98h0.01 M59.70,71.29h0.01 M79.85,78.94h0.01 M39.93,82.77h0.01 M69.96,84.69h0.01 M59.98,42.34h0.01 M79.99,64.47h0.01 M90.00,75.54h0.01 M45.00,81.07h0.01 M72.50,83.83h0.01 M36.25,85.22h0.01 M18.12,85.91h0.01 M34.06,42.95h0.01 M17.03,64.78h0.01 M58.52,75.69h0.01" stroke-linecap="round" stroke-width="0.7" style="fill:none;stroke:var(--ink);"></path></svg><div class="screenplay"><p class="action">Two hundred. Nothing yet, or nearly nothing.</p></div><svg viewBox="-4 -4 108 95" width="400" xmlns="http://www.w3.org/2000/svg"><rect height="95" style="fill:var(--paper);" width="108" x="-4" y="-4"></rect><path d="M68.01,43.30h0.01 M59.01,21.65h0.01 M54.50,10.82h0.01 M52.25,5.41h0.01 M76.13,46.01h0.01 M38.06,66.30h0.01 M19.03,76.45h0.01 M34.52,38.23h0.01 M67.26,62.41h0.01 M58.63,31.21h0.01 M54.31,15.60h0.01 M52.16,7.80h0.01 M26.08,47.20h0.01 M38.04,23.60h0.01 M19.02,55.10h0.01 M34.51,27.55h0.01 M42.25,13.78h0.01 M71.13,50.19h0.01 M35.56,68.39h0.01 M67.78,77.50h0.01 M58.89,38.75h0.01 M29.45,62.67h0.01 M64.72,74.64h0.01 M57.36,37.32h0.01 M53.68,18.66h0.01 M76.84,52.63h0.01 M88.42,69.61h0.01 M69.21,34.81h0.01 M84.61,60.70h0.01 M92.30,73.65h0.01 M96.15,80.13h0.01 M48.08,83.36h0.01 M24.04,84.98h0.01 M37.02,42.49h0.01 M68.51,64.55h0.01 M84.25,75.57h0.01 M42.13,81.09h0.01 M71.06,83.84h0.01 M85.53,85.22h0.01 M42.77,85.91h0.01 M46.38,42.96h0.01 M48.19,21.48h0.01 M74.10,54.04h0.01 M87.05,70.32h0.01 M68.52,35.16h0.01 M84.26,60.88h0.01 M67.13,30.44h0.01 M83.57,58.52h0.01 M41.78,72.56h0.01 M20.89,79.58h0.01 M60.45,83.09h0.01 M30.22,84.84h0.01 M15.11,85.72h0.01 M32.56,42.86h0.01 M66.28,64.73h0.01 M83.14,75.67h0.01 M41.57,81.13h0.01 M45.78,40.57h0.01 M47.89,20.28h0.01 M48.95,10.14h0.01 M49.47,5.07h0.01 M49.74,2.54h0.01 M49.87,1.27h0.01 M74.93,43.93h0.01 M37.47,65.27h0.01 M68.73,75.93h0.01 M59.37,37.97h0.01 M29.68,62.28h0.01 M39.84,31.14h0.01 M69.92,58.87h0.01 M34.96,72.74h0.01 M67.48,79.67h0.01 M58.74,39.83h0.01 M79.37,63.22h0.01 M64.69,31.61h0.01 M57.34,15.80h0.01 M28.67,51.20h0.01 M64.34,68.90h0.01 M82.17,77.75h0.01 M66.08,38.88h0.01 M33.04,62.74h0.01 M16.52,74.67h0.01 M58.26,80.63h0.01 M79.13,83.62h0.01 M89.57,85.11h0.01 M94.78,85.85h0.01 M97.39,86.23h0.01 M98.70,86.41h0.01 M74.35,43.21h0.01 M62.17,21.60h0.01 M81.09,54.10h0.01 M90.54,70.35h0.01 M95.27,78.48h0.01 M47.64,82.54h0.01 M48.82,41.27h0.01 M74.41,63.93h0.01 M87.20,75.27h0.01 M43.60,80.93h0.01 M71.80,83.77h0.01 M35.90,85.18h0.01 M17.95,85.89h0.01 M33.98,42.95h0.01 M66.99,64.77h0.01 M83.49,75.69h0.01 M41.75,81.14h0.01 M45.87,40.57h0.01 M47.94,20.29h0.01 M23.97,53.44h0.01 M61.98,70.02h0.01 M80.99,78.31h0.01 M90.50,82.46h0.01 M95.25,84.53h0.01 M72.62,42.26h0.01 M86.31,64.43h0.01 M93.16,75.52h0.01 M46.58,81.06h0.01 M23.29,83.83h0.01 M61.64,85.21h0.01 M80.82,85.91h0.01 M65.41,42.95h0.01 M32.71,64.78h0.01 M41.35,32.39h0.01 M70.68,59.49h0.01 M85.34,73.05h0.01 M42.67,79.82h0.01 M71.33,83.21h0.01 M60.67,41.61h0.01 M30.33,64.10h0.01 M15.17,75.35h0.01 M57.58,80.98h0.01 M53.79,40.49h0.01 M26.90,63.54h0.01 M13.45,75.07h0.01 M56.72,80.84h0.01 M78.36,83.72h0.01 M64.18,41.86h0.01 M32.09,64.23h0.01 M41.05,32.11h0.01 M45.52,16.06h0.01 M22.76,51.33h0.01 M11.38,68.96h0.01 M55.69,77.78h0.01 M52.85,38.89h0.01 M26.42,62.75h0.01 M63.21,74.67h0.01 M81.61,80.64h0.01 M90.80,83.62h0.01 M95.40,85.11h0.01 M47.70,85.85h0.01 M23.85,86.23h0.01 M36.93,43.11h0.01 M68.46,64.86h0.01 M34.23,75.73h0.01 M17.12,81.16h0.01 M33.56,40.58h0.01 M16.78,63.59h0.01 M58.39,75.10h0.01 M54.19,37.55h0.01 M27.10,62.07h0.01 M13.55,74.34h0.01 M56.77,80.47h0.01 M53.39,40.23h0.01 M76.69,63.42h0.01 M63.35,31.71h0.01 M81.67,59.15h0.01 M90.84,72.88h0.01 M45.42,79.74h0.01 M72.71,83.17h0.01 M86.35,84.88h0.01 M93.18,85.74h0.01 M46.59,86.17h0.01 M48.29,43.09h0.01 M74.15,64.84h0.01 M62.07,32.42h0.01 M56.04,16.21h0.01 M53.02,8.11h0.01 M76.51,47.35h0.01 M88.25,66.98h0.01 M94.13,76.79h0.01 M47.06,81.69h0.01 M48.53,40.85h0.01 M74.27,63.72h0.01 M62.13,31.86h0.01 M81.07,59.23h0.01 M65.53,29.62h0.01 M32.77,58.11h0.01 M66.38,72.35h0.01 M58.19,36.18h0.01 M54.10,18.09h0.01 M27.05,52.34h0.01 M13.52,69.47h0.01 M6.76,78.04h0.01 M3.38,82.32h0.01 M51.69,84.46h0.01 M50.85,42.23h0.01 M50.42,21.11h0.01 M50.21,10.56h0.01 M25.11,48.58h0.01 M12.55,67.59h0.01 M31.28,33.79h0.01 M15.64,60.20h0.01 M32.82,30.10h0.01 M16.41,58.35h0.01 M8.20,72.47h0.01 M54.10,79.54h0.01 M52.05,39.77h0.01 M26.03,63.18h0.01 M38.01,31.59h0.01 M44.01,15.80h0.01 M47.00,7.90h0.01 M23.50,47.25h0.01 M61.75,66.92h0.01 M55.88,33.46h0.01 M52.94,16.73h0.01 M76.47,51.67h0.01 M38.23,69.13h0.01 M69.12,77.87h0.01 M34.56,82.23h0.01 M67.28,84.42h0.01 M58.64,42.21h0.01 M79.32,64.40h0.01 M89.66,75.50h0.01 M69.83,37.75h0.01 M34.91,62.18h0.01 M17.46,74.39h0.01 M8.73,80.49h0.01 M54.36,83.55h0.01 M52.18,41.77h0.01 M76.09,64.19h0.01 M38.05,75.39h0.01 M69.02,81.00h0.01 M34.51,83.80h0.01 M17.26,85.20h0.01 M33.63,42.60h0.01 M16.81,64.60h0.01 M33.41,32.30h0.01 M66.70,59.45h0.01 M33.35,73.02h0.01 M66.68,79.81h0.01 M83.34,83.21h0.01 M91.67,84.90h0.01 M45.83,85.75h0.01 M72.92,86.18h0.01 M36.46,86.39h0.01 M68.23,86.49h0.01 M84.11,86.55h0.01 M42.06,86.57h0.01 M71.03,86.59h0.01 M85.51,86.59h0.01 M42.76,86.60h0.01 M71.38,86.60h0.01 M60.69,43.30h0.01 M30.34,64.95h0.01 M65.17,75.77h0.01 M57.59,37.89h0.01 M28.79,62.24h0.01 M39.40,31.12h0.01 M19.70,58.86h0.01 M9.85,72.73h0.01 M4.92,79.67h0.01 M27.46,39.83h0.01 M38.73,19.92h0.01 M19.37,53.26h0.01 M59.68,69.93h0.01 M54.84,34.96h0.01 M52.42,17.48h0.01 M51.21,8.74h0.01 M50.61,4.37h0.01 M50.30,2.19h0.01 M25.15,44.39h0.01 M12.58,65.50h0.01 M56.29,76.05h0.01 M28.14,81.32h0.01 M64.07,83.96h0.01 M32.04,85.28h0.01 M41.02,42.64h0.01 M45.51,21.32h0.01 M47.75,10.66h0.01 M23.88,48.63h0.01 M36.94,24.32h0.01 M18.47,55.46h0.01 M9.23,71.03h0.01 M54.62,78.81h0.01 M52.31,39.41h0.01 M51.15,19.70h0.01 M25.58,53.15h0.01 M37.79,26.58h0.01 M68.89,56.59h0.01 M84.45,71.59h0.01 M67.22,35.80h0.01 M58.61,17.90h0.01 M79.31,52.25h0.01 M89.65,69.42h0.01 M44.83,78.01h0.01 M22.41,82.31h0.01 M11.21,84.45h0.01 M5.60,85.53h0.01 M52.80,86.06h0.01 M26.40,86.33h0.01 M13.20,86.47h0.01 M6.60,86.53h0.01 M3.30,86.57h0.01 M51.65,86.58h0.01 M25.83,86.59h0.01 M37.91,43.30h0.01 M68.96,64.95h0.01 M34.48,75.77h0.01 M17.24,81.19h0.01 M33.62,40.59h0.01 M66.81,63.60h0.01 M83.40,75.10h0.01 M41.70,80.85h0.01 M70.85,83.72h0.01 M85.43,85.16h0.01 M67.71,42.58h0.01 M33.86,64.59h0.01 M41.93,32.30h0.01 M70.96,59.45h0.01 M85.48,73.02h0.01 M92.74,79.81h0.01 M96.37,83.21h0.01 M98.19,84.90h0.01 M99.09,85.75h0.01 M99.55,86.18h0.01 M49.77,86.39h0.01 M74.89,86.49h0.01 M62.44,43.25h0.01 M56.22,21.62h0.01 M28.11,54.11h0.01 M39.06,27.06h0.01 M44.53,13.53h0.01 M47.26,6.76h0.01 M23.63,46.68h0.01 M36.82,23.34h0.01 M18.41,54.97h0.01 M34.20,27.49h0.01 M67.10,57.04h0.01 M58.55,28.52h0.01 M79.28,57.56h0.01 M64.64,28.78h0.01 M32.32,57.69h0.01 M16.16,72.15h0.01 M58.08,79.37h0.01 M54.04,39.69h0.01 M27.02,63.14h0.01 M63.51,74.87h0.01 M31.75,80.74h0.01 M65.88,83.67h0.01 M82.94,85.13h0.01 M91.47,85.87h0.01 M70.73,42.93h0.01 M35.37,64.77h0.01 M67.68,75.68h0.01 M33.84,81.14h0.01 M66.92,83.87h0.01 M83.46,85.24h0.01 M66.73,42.62h0.01 M83.37,64.61h0.01 M41.68,75.60h0.01 M45.84,37.80h0.01 M47.92,18.90h0.01 M23.96,52.75h0.01 M11.98,69.68h0.01 M5.99,78.14h0.01 M28.00,39.07h0.01 M64.00,62.83h0.01 M82.00,74.72h0.01 M41.00,80.66h0.01 M20.50,83.63h0.01 M60.25,85.11h0.01 M30.12,85.86h0.01 M65.06,86.23h0.01 M57.53,43.11h0.01 M78.77,64.86h0.01 M39.38,75.73h0.01 M44.69,37.86h0.01 M72.35,62.23h0.01 M86.17,74.42h0.01 M43.09,80.51h0.01 M21.54,83.55h0.01 M35.77,41.78h0.01 M17.89,64.19h0.01 M58.94,75.39h0.01 M29.47,81.00h0.01 M39.74,40.50h0.01 M19.87,63.55h0.01 M34.93,31.77h0.01 M67.47,59.19h0.01 M58.73,29.59h0.01 M29.37,58.10h0.01 M64.68,72.35h0.01 M57.34,36.17h0.01 M78.67,61.39h0.01 M39.34,73.99h0.01 M19.67,80.30h0.01 M59.83,83.45h0.01 M79.92,85.02h0.01 M64.96,42.51h0.01 M32.48,64.56h0.01 M16.24,75.58h0.01 M33.12,37.79h0.01 M41.56,18.89h0.01 M45.78,9.45h0.01 M47.89,4.72h0.01 M73.94,45.66h0.01 M36.97,66.13h0.01 M43.49,33.07h0.01 M71.74,59.83h0.01 M60.87,29.92h0.01 M55.44,14.96h0.01 M77.72,50.78h0.01 M63.86,25.39h0.01 M81.93,55.99h0.01 M90.96,71.30h0.01 M95.48,78.95h0.01 M47.74,82.77h0.01 M73.87,84.69h0.01 M86.94,85.64h0.01 M68.47,42.82h0.01 M34.23,64.71h0.01 M67.12,75.66h0.01 M58.56,37.83h0.01 M54.28,18.91h0.01 M52.14,9.46h0.01 M76.07,48.03h0.01 M88.03,67.31h0.01 M94.02,76.96h0.01 M72.01,38.48h0.01 M36.00,62.54h0.01 M68.00,74.57h0.01 M59.00,37.28h0.01 M79.50,61.94h0.01 M64.75,30.97h0.01 M57.38,15.49h0.01 M28.69,51.04h0.01 M14.34,68.82h0.01 M7.17,77.71h0.01 M28.59,38.86h0.01 M39.29,19.43h0.01 M44.65,9.71h0.01 M22.32,48.16h0.01 M36.16,24.08h0.01 M18.08,55.34h0.01 M34.04,27.67h0.01 M67.02,57.13h0.01 M58.51,28.57h0.01 M29.26,57.58h0.01 M14.63,72.09h0.01 M32.31,36.05h0.01 M66.16,61.32h0.01 M83.08,73.96h0.01 M66.54,36.98h0.01 M83.27,61.79h0.01 M41.63,74.20h0.01 M45.82,37.10h0.01 M72.91,61.85h0.01 M61.45,30.92h0.01 M30.73,58.76h0.01 M65.36,72.68h0.01 M57.68,36.34h0.01 M53.84,18.17h0.01 M26.92,52.39h0.01 M13.46,69.49h0.01 M6.73,78.05h0.01 M3.37,82.32h0.01 M26.68,41.16h0.01 M63.34,63.88h0.01 M56.67,31.94h0.01 M53.34,15.97h0.01 M76.67,51.29h0.01 M38.33,68.94h0.01 M44.17,34.47h0.01 M22.08,60.54h0.01 M61.04,73.57h0.01 M30.52,80.08h0.01 M40.26,40.04h0.01 M20.13,63.32h0.01 M60.07,74.96h0.01 M30.03,80.78h0.01 M65.02,83.69h0.01 M57.51,41.85h0.01 M28.75,64.22h0.01 M39.38,32.11h0.01 M69.69,59.36h0.01 M84.84,72.98h0.01 M67.42,36.49h0.01 M58.71,18.24h0.01 M29.36,52.42h0.01 M14.68,69.51h0.01 M57.34,78.06h0.01 M28.67,82.33h0.01 M39.33,41.16h0.01 M19.67,63.88h0.01 M9.83,75.24h0.01 M54.92,80.92h0.01 M52.46,40.46h0.01 M26.23,63.53h0.01 M13.11,75.07h0.01 M31.56,37.53h0.01 M40.78,18.77h0.01 M70.39,52.68h0.01 M35.19,69.64h0.01 M17.60,78.12h0.01 M58.80,82.36h0.01 M29.40,84.48h0.01 M39.70,42.24h0.01 M19.85,64.42h0.01 M34.92,32.21h0.01 M42.46,16.11h0.01 M71.23,51.35h0.01 M35.62,68.98h0.01 M67.81,77.79h0.01 M33.90,82.19h0.01 M16.95,84.40h0.01 M8.48,85.50h0.01 M4.24,86.05h0.01 M27.12,43.02h0.01 M63.56,64.81h0.01 M81.78,75.71h0.01 M65.89,37.85h0.01 M82.94,62.23h0.01 M91.47,74.41h0.01 M95.74,80.51h0.01 M47.87,83.55h0.01 M48.93,41.78h0.01 M49.47,20.89h0.01 M74.73,53.74h0.01 M37.37,70.17h0.01 M43.68,35.09h0.01 M46.84,17.54h0.01 M48.42,8.77h0.01 M74.21,47.69h0.01 M87.11,67.14h0.01 M68.55,33.57h0.01 M84.28,60.09h0.01 M67.14,30.04h0.01 M33.57,58.32h0.01 M41.78,29.16h0.01 M45.89,14.58h0.01 M22.95,50.59h0.01 M36.47,25.30h0.01 M43.24,12.65h0.01 M21.62,49.62h0.01 M60.81,68.11h0.01 M80.40,77.36h0.01 M40.20,81.98h0.01 M70.10,84.29h0.01 M35.05,85.44h0.01 M67.53,86.02h0.01 M58.76,43.01h0.01 M29.38,64.81h0.01 M64.69,75.70h0.01 M57.35,37.85h0.01 M78.67,62.23h0.01 M64.34,31.11h0.01 M32.17,58.86h0.01 M41.08,29.43h0.01 M20.54,58.01h0.01 M60.27,72.31h0.01 M80.14,79.45h0.01 M90.07,83.03h0.01 M70.03,41.51h0.01 M85.02,64.06h0.01 M92.51,75.33h0.01 M71.25,37.66h0.01 M60.63,18.83h0.01 M80.31,52.72h0.01 M40.16,69.66h0.01 M45.08,34.83h0.01 M22.54,60.71h0.01 M11.27,73.66h0.01 M55.63,80.13h0.01 M52.82,40.06h0.01 M26.41,63.33h0.01 M63.20,74.97h0.01 M81.60,80.78h0.01 M40.80,83.69h0.01 M70.40,85.15h0.01 M85.20,85.87h0.01 M67.60,42.94h0.01 M83.80,64.77h0.01 M41.90,75.68h0.01 M70.95,81.14h0.01 M85.48,83.87h0.01 M67.74,41.94h0.01 M58.87,20.97h0.01 M79.43,53.78h0.01 M39.72,70.19h0.01 M19.86,78.40h0.01 M59.93,82.50h0.01 M54.96,41.25h0.01 M27.48,63.92h0.01 M38.74,31.96h0.01 M44.37,15.98h0.01 M47.19,7.99h0.01 M48.59,4.00h0.01 M74.30,45.30h0.01 M87.15,65.95h0.01 M68.57,32.97h0.01 M34.29,59.79h0.01 M17.14,73.19h0.01 M33.57,36.60h0.01 M66.79,61.60h0.01 M83.39,74.10h0.01 M66.70,37.05h0.01 M33.35,61.82h0.01 M41.67,30.91h0.01 M20.84,58.76h0.01 M35.42,29.38h0.01 M42.71,14.69h0.01 M21.35,50.64h0.01 M60.68,68.62h0.01 M80.34,77.61h0.01 M40.17,82.11h0.01 M70.08,84.35h0.01 M85.04,85.48h0.01 M67.52,42.74h0.01 M83.76,64.67h0.01 M91.88,75.63h0.01 M70.94,37.82h0.01 M60.47,18.91h0.01 M80.24,52.75h0.01 M65.12,26.38h0.01 M82.56,56.49h0.01 M91.28,71.54h0.01 M45.64,79.07h0.01 M72.82,82.84h0.01 M61.41,41.42h0.01 M80.70,64.01h0.01 M90.35,75.30h0.01 M95.18,80.95h0.01 M72.59,40.48h0.01 M36.29,63.54h0.01 M18.15,75.07h0.01 M9.07,80.83h0.01 M29.54,40.42h0.01 M39.77,20.21h0.01 M69.88,53.40h0.01 M34.94,70.00h0.01 M67.47,78.30h0.01 M58.74,39.15h0.01 M79.37,62.88h0.01 M89.68,74.74h0.01 M69.84,37.37h0.01 M59.92,18.68h0.01 M29.96,52.64h0.01 M14.98,69.62h0.01 M57.49,78.11h0.01 M78.75,82.36h0.01 M89.37,84.48h0.01 M44.69,85.54h0.01 M22.34,86.07h0.01 M36.17,43.03h0.01 M68.09,64.82h0.01 M59.04,32.41h0.01 M54.52,16.20h0.01 M52.26,8.10h0.01 M76.13,47.35h0.01 M88.07,66.98h0.01 M94.03,76.79h0.01 M47.02,81.69h0.01 M23.51,84.15h0.01 M36.75,42.07h0.01 M18.38,64.34h0.01 M9.19,75.47h0.01 M54.59,81.03h0.01 M27.30,83.82h0.01 M13.65,85.21h0.01 M56.82,85.90h0.01 M78.41,86.25h0.01 M89.21,86.43h0.01 M44.60,86.51h0.01 M47.30,43.26h0.01 M48.65,21.63h0.01 M24.33,54.11h0.01 M37.16,27.06h0.01 M18.58,56.83h0.01 M9.29,71.71h0.01 M29.65,35.86h0.01 M64.82,61.23h0.01 M57.41,30.61h0.01 M78.71,58.61h0.01 M64.35,29.30h0.01 M57.18,14.65h0.01 M28.59,50.63h0.01 M14.29,68.61h0.01 M57.15,77.61h0.01 M78.57,82.10h0.01 M39.29,84.35h0.01 M69.64,85.48h0.01 M84.82,86.04h0.01 M42.41,86.32h0.01 M71.21,86.46h0.01 M60.60,43.23h0.01 M55.30,21.61h0.01 M77.65,54.11h0.01 M63.83,27.05h0.01 M31.91,56.83h0.01 M40.96,28.41h0.01 M70.48,57.51h0.01 M85.24,72.05h0.01 M92.62,79.33h0.01 M96.31,82.96h0.01 M73.15,41.48h0.01 M61.58,20.74h0.01 M80.79,53.67h0.01 M65.39,26.84h0.01 M82.70,56.72h0.01 M66.35,28.36h0.01 M58.17,14.18h0.01 M79.09,50.39h0.01 M89.54,68.49h0.01 M94.77,77.55h0.01 M72.39,38.77h0.01 M36.19,62.69h0.01 M68.10,74.64h0.01 M84.05,80.62h0.01 M92.02,83.61h0.01 M71.01,41.81h0.01 M60.51,20.90h0.01 M55.25,10.45h0.01 M27.63,48.53h0.01 M38.81,24.26h0.01 M69.41,55.43h0.01 M59.70,27.72h0.01 M29.85,57.16h0.01 M39.93,28.58h0.01 M19.96,57.59h0.01 M9.98,72.09h0.01 M4.99,79.35h0.01 M52.50,82.97h0.01 M51.25,41.49h0.01 M50.62,20.74h0.01 M50.31,10.37h0.01 M75.16,48.49h0.01 M62.58,24.24h0.01 M31.29,55.42h0.01 M65.64,71.01h0.01 M57.82,35.51h0.01 M28.91,61.05h0.01 M14.46,73.83h0.01 M7.23,80.21h0.01 M53.61,83.41h0.01 M26.81,85.00h0.01 M38.40,42.50h0.01 M19.20,64.55h0.01 M59.60,75.58h0.01 M29.80,81.09h0.01 M14.90,83.84h0.01 M7.45,85.22h0.01 M53.73,85.91h0.01 M26.86,86.26h0.01 M38.43,43.13h0.01 M69.22,64.86h0.01 M34.61,75.73h0.01 M17.30,81.17h0.01 M33.65,40.58h0.01 M66.83,63.59h0.01 M33.41,75.10h0.01 M41.71,37.55h0.01 M20.85,62.07h0.01 M60.43,74.34h0.01 M30.21,80.47h0.01 M40.11,40.23h0.01 M20.05,63.42h0.01 M60.03,75.01h0.01 M80.01,80.80h0.01 M65.01,40.40h0.01 M32.50,63.50h0.01 M16.25,75.05h0.01 M58.13,80.83h0.01 M29.06,83.71h0.01 M39.53,41.86h0.01 M44.77,20.93h0.01 M72.38,53.76h0.01 M61.19,26.88h0.01 M30.60,56.74h0.01 M40.30,28.37h0.01 M45.15,14.19h0.01 M47.57,7.09h0.01 M73.79,46.85h0.01 M86.89,66.72h0.01 M93.45,76.66h0.01 M71.72,38.33h0.01 M85.86,62.47h0.01 M42.93,74.53h0.01 M21.47,80.57h0.01 M10.73,83.58h0.01 M5.37,85.09h0.01 M27.68,42.55h0.01 M38.84,21.27h0.01 M44.42,10.64h0.01 M47.21,5.32h0.01 M73.61,45.96h0.01 M61.80,22.98h0.01 M55.90,11.49h0.01 M77.95,49.04h0.01 M63.98,24.52h0.01 M81.99,55.56h0.01 M65.99,27.78h0.01 M83.00,57.19h0.01 M41.50,71.90h0.01 M20.75,79.25h0.01 M60.37,82.92h0.01 M80.19,84.76h0.01 M90.09,85.68h0.01 M70.05,42.84h0.01 M60.02,21.42h0.01 M55.01,10.71h0.01 M27.51,48.66h0.01 M38.75,24.33h0.01 M44.38,12.16h0.01 M47.19,6.08h0.01 M23.59,46.34h0.01 M11.80,66.47h0.01 M5.90,76.54h0.01 M2.95,81.57h0.01 M26.47,40.78h0.01 M38.24,20.39h0.01 M69.12,53.50h0.01 M84.56,70.05h0.01 M92.28,78.32h0.01 M71.14,39.16h0.01 M85.57,62.88h0.01 M67.78,31.44h0.01 M58.89,15.72h0.01 M79.45,51.16h0.01 M89.72,68.88h0.01 M94.86,77.74h0.01 M97.43,82.17h0.01 M98.72,84.39h0.01 M74.36,42.19h0.01 M62.18,21.10h0.01 M31.09,53.85h0.01 M40.54,26.92h0.01 M70.27,56.76h0.01 M35.14,71.68h0.01 M17.57,79.14h0.01 M33.78,39.57h0.01 M66.89,63.09h0.01 M33.45,74.84h0.01 M41.72,37.42h0.01 M20.86,62.01h0.01 M60.43,74.31h0.01 M55.22,37.15h0.01 M27.61,61.88h0.01 M63.80,74.24h0.01 M31.90,80.42h0.01 M65.95,83.51h0.01 M57.98,41.75h0.01 M28.99,64.18h0.01 M39.49,32.09h0.01 M44.75,16.04h0.01 M72.37,51.32h0.01 M36.19,68.96h0.01 M68.09,77.78h0.01 M34.05,82.19h0.01 M42.02,41.10h0.01 M71.01,63.85h0.01 M35.51,75.22h0.01 M42.75,37.61h0.01 M46.38,18.81h0.01 M73.19,52.70h0.01 M86.59,69.65h0.01 M68.30,34.83h0.01 M59.15,17.41h0.01 M79.57,52.01h0.01 M39.79,69.30h0.01 M69.89,77.95h0.01 M34.95,82.28h0.01 M17.47,84.44h0.01 M8.74,85.52h0.01 M4.37,86.06h0.01 M27.18,43.03h0.01 M38.59,21.51h0.01 M19.30,54.06h0.01 M34.65,27.03h0.01 M67.32,56.81h0.01 M58.66,28.41h0.01 M79.33,57.50h0.01 M64.67,28.75h0.01 M32.33,57.68h0.01 M66.17,72.14h0.01 M83.08,79.37h0.01 M41.54,82.98h0.01 M20.77,84.79h0.01 M60.39,85.70h0.01 M30.19,86.15h0.01 M40.10,43.07h0.01 M45.05,21.54h0.01 M72.52,54.07h0.01 M86.26,70.33h0.01 M43.13,78.47h0.01 M71.57,82.53h0.01 M60.78,41.27h0.01 M55.39,20.63h0.01 M52.70,10.32h0.01 M76.35,48.46h0.01 M63.17,24.23h0.01 M31.59,55.41h0.01 M40.79,27.71h0.01 M20.40,57.15h0.01 M10.20,71.88h0.01 M5.10,79.24h0.01 M27.55,39.62h0.01 M13.77,63.11h0.01 M6.89,74.85h0.01 M53.44,80.73h0.01 M26.72,83.66h0.01 M13.36,85.13h0.01 M6.68,85.87h0.01 M3.34,86.23h0.01 M51.67,86.42h0.01 M75.84,86.51h0.01 M87.92,86.55h0.01 M43.96,86.58h0.01 M46.98,43.29h0.01 M73.49,64.94h0.01 M86.74,75.77h0.01 M93.37,81.19h0.01 M71.69,40.59h0.01 M60.84,20.30h0.01 M30.42,53.45h0.01 M15.21,70.02h0.01 M7.61,78.31h0.01 M53.80,82.46h0.01 M76.90,84.53h0.01 M88.45,85.56h0.01 M44.23,86.08h0.01 M47.11,43.04h0.01 M73.56,64.82h0.01 M61.78,32.41h0.01 M80.89,59.51h0.01 M40.44,73.05h0.01 M45.22,36.53h0.01 M72.61,61.56h0.01 M86.31,74.08h0.01 M93.15,80.34h0.01 M46.58,83.47h0.01 M73.29,85.04h0.01 M86.64,85.82h0.01 M93.32,86.21h0.01 M96.66,86.40h0.01 M73.33,43.20h0.01 M36.67,64.90h0.01 M18.33,75.75h0.01 M59.17,81.18h0.01 M54.58,40.59h0.01 M52.29,20.29h0.01 M26.15,53.45h0.01 M63.07,70.02h0.01 M81.54,78.31h0.01 M40.77,82.46h0.01 M45.38,41.23h0.01 M72.69,63.91h0.01 M36.35,75.26h0.01 M68.17,80.93h0.01 M34.09,83.76h0.01 M42.04,41.88h0.01 M71.02,64.24h0.01 M35.51,75.42h0.01 M42.76,37.71h0.01 M21.38,62.16h0.01 M10.69,74.38h0.01 M55.34,80.49h0.01 M27.67,83.54h0.01 M13.84,85.07h0.01 M6.92,85.84h0.01 M28.46,42.92h0.01 M64.23,64.76h0.01 M82.11,75.68h0.01 M66.06,37.84h0.01 M58.03,18.92h0.01 M54.01,9.46h0.01 M52.01,4.73h0.01 M51.00,2.36h0.01 M50.50,1.18h0.01 M25.25,43.89h0.01 M12.63,65.25h0.01 M31.31,32.62h0.01 M40.66,16.31h0.01 M20.33,51.46h0.01 M35.16,25.73h0.01 M42.58,12.86h0.01 M71.29,49.73h0.01 M35.65,68.17h0.01 M17.82,77.38h0.01 M8.91,81.99h0.01 M4.46,84.30h0.01 M52.23,85.45h0.01 M51.11,42.72h0.01 M50.56,21.36h0.01 M25.28,53.98h0.01 M62.64,70.29h0.01 M81.32,78.45h0.01 M65.66,39.22h0.01 M82.83,62.91h0.01 M41.41,74.76h0.01 M45.71,37.38h0.01 M72.85,61.99h0.01 M36.43,74.29h0.01 M18.21,80.45h0.01 M9.11,83.52h0.01 M4.55,85.06h0.01 M52.28,85.83h0.01 M26.14,86.22h0.01 M63.07,86.41h0.01 M81.53,86.50h0.01 M40.77,86.55h0.01 M70.38,86.58h0.01 M85.19,86.59h0.01 M92.60,86.59h0.01 M46.30,86.60h0.01 M73.15,86.60h0.01 M36.57,86.60h0.01 M18.29,86.60h0.01 M9.14,86.60h0.01 M54.57,86.60h0.01 M52.29,43.30h0.01 M76.14,64.95h0.01 M38.07,75.77h0.01 M44.04,37.89h0.01 M47.02,18.94h0.01 M48.51,9.47h0.01 M24.25,48.04h0.01 M37.13,24.02h0.01 M68.56,55.31h0.01 M34.28,70.95h0.01 M17.14,78.78h0.01 M8.57,82.69h0.01 M29.29,41.34h0.01 M64.64,63.97h0.01 M32.32,75.29h0.01 M41.16,37.64h0.01 M70.58,62.12h0.01 M85.29,74.36h0.01 M92.65,80.48h0.01 M46.32,83.54h0.01 M73.16,85.07h0.01 M36.58,85.84h0.01 M43.29,42.92h0.01 M71.65,64.76h0.01 M35.82,75.68h0.01 M67.91,81.14h0.01 M58.96,40.57h0.01 M29.48,63.58h0.01 M64.74,75.09h0.01 M82.37,80.85h0.01 M66.18,40.42h0.01 M33.09,63.51h0.01 M66.55,75.06h0.01 M58.27,37.53h0.01 M29.14,62.06h0.01 M14.57,74.33h0.01 M32.28,37.17h0.01 M41.14,18.58h0.01 M20.57,52.59h0.01 M35.29,26.30h0.01 M67.64,56.45h0.01 M83.82,71.52h0.01 M91.91,79.06h0.01 M70.96,39.53h0.01 M85.48,63.07h0.01 M67.74,31.53h0.01 M58.87,15.77h0.01 M29.43,51.18h0.01 M64.72,68.89h0.01 M82.36,77.75h0.01 M66.18,38.87h0.01 M58.09,19.44h0.01 M79.04,53.02h0.01 M39.52,69.81h0.01 M44.76,34.90h0.01 M47.38,17.45h0.01 M23.69,52.03h0.01 M36.85,26.01h0.01 M43.42,13.01h0.01 M46.71,6.50h0.01 M23.36,46.55h0.01 M61.68,66.58h0.01 M80.84,76.59h0.01 M90.42,81.59h0.01 M70.21,40.80h0.01 M85.10,63.70h0.01 M42.55,75.15h0.01 M21.28,80.87h0.01 M60.64,83.74h0.01 M55.32,41.87h0.01 M77.66,64.23h0.01 M38.83,75.42h0.01 M69.41,81.01h0.01 M34.71,83.80h0.01 M42.35,41.90h0.01 M21.18,64.25h0.01 M60.59,75.43h0.01 M80.29,81.01h0.01 M65.15,40.51h0.01 M57.57,20.25h0.01 M78.79,53.43h0.01 M39.39,70.01h0.01 M44.70,35.01h0.01 M72.35,60.80h0.01 M61.17,30.40h0.01 M30.59,58.50h0.01 M15.29,72.55h0.01 M7.65,79.58h0.01 M28.82,39.79h0.01 M64.41,63.19h0.01 M32.21,74.90h0.01 M66.10,80.75h0.01 M33.05,83.67h0.01 M66.53,85.14h0.01 M58.26,42.57h0.01 M29.13,64.58h0.01 M14.57,75.59h0.01 M57.28,81.10h0.01 M28.64,83.85h0.01 M14.32,85.22h0.01 M32.16,42.61h0.01 M16.08,64.61h0.01 M33.04,32.30h0.01 M41.52,16.15h0.01 M20.76,51.38h0.01 M35.38,25.69h0.01 M67.69,56.14h0.01 M83.85,71.37h0.01 M66.92,35.69h0.01 M58.46,17.84h0.01 M79.23,52.22h0.01 M64.62,26.11h0.01 M82.31,56.36h0.01 M91.15,71.48h0.01 M45.58,79.04h0.01 M22.79,82.82h0.01 M61.39,84.71h0.01 M80.70,85.65h0.01 M40.35,86.13h0.01 M20.17,86.36h0.01 M35.09,43.18h0.01 M67.54,64.89h0.01 M33.77,75.75h0.01 M66.89,81.17h0.01 M83.44,83.89h0.01 M91.72,85.24h0.01 M95.86,85.92h0.01 M97.93,86.26h0.01 M98.97,86.43h0.01 M49.48,86.52h0.01 M74.74,86.56h0.01 M62.37,43.28h0.01 M81.19,64.94h0.01 M65.59,32.47h0.01 M32.80,59.53h0.01 M41.40,29.77h0.01 M20.70,58.18h0.01 M35.35,29.09h0.01 M42.67,14.55h0.01 M21.34,50.57h0.01 M35.67,25.29h0.01 M67.83,55.94h0.01 M58.92,27.97h0.01 M54.46,13.99h0.01 M77.23,50.29h0.01 M88.61,68.45h0.01 M44.31,77.52h0.01 M72.15,82.06h0.01 M61.08,41.03h0.01 M55.54,20.52h0.01 M77.77,53.56h0.01 M88.88,70.08h0.01 M69.44,35.04h0.01 M59.72,17.52h0.01 M29.86,52.06h0.01 M14.93,69.33h0.01 M32.47,34.66h0.01 M41.23,17.33h0.01 M45.62,8.67h0.01 M72.81,47.63h0.01 M36.40,67.12h0.01 M43.20,33.56h0.01 M46.60,16.78h0.01 M73.30,51.69h0.01 M86.65,69.14h0.01 M68.33,34.57h0.01 M59.16,17.29h0.01 M54.58,8.64h0.01 M52.29,4.32h0.01 M26.15,45.46h0.01 M13.07,66.03h0.01 M56.54,76.32h0.01 M78.27,81.46h0.01 M64.13,40.73h0.01 M57.07,20.36h0.01 M78.53,53.48h0.01 M64.27,26.74h0.01 M57.13,13.37h0.01 M28.57,49.99h0.01 M64.28,68.29h0.01 M57.14,34.15h0.01 M78.57,60.37h0.01 M39.29,73.49h0.01 M19.64,80.04h0.01 M9.82,83.32h0.01 M4.91,84.96h0.01 M2.46,85.78h0.01 M51.23,86.19h0.01 M25.61,86.40h0.01 M62.81,86.50h0.01 M56.40,43.25h0.01 M78.20,64.92h0.01 M64.10,32.46h0.01 M57.05,16.23h0.01 M28.53,51.42h0.01 M14.26,69.01h0.01 M32.13,34.50h0.01 M66.07,60.55h0.01 M33.03,73.58h0.01 M16.52,80.09h0.01 M33.26,40.04h0.01 M41.63,20.02h0.01 M45.81,10.01h0.01 M72.91,48.31h0.01 M86.45,67.45h0.01 M43.23,77.03h0.01 M21.61,81.81h0.01 M10.81,84.21h0.01 M5.40,85.40h0.01 M27.70,42.70h0.01 M38.85,21.35h0.01 M19.43,53.98h0.01 M59.71,70.29h0.01 M29.86,78.44h0.01 M64.93,82.52h0.01 M57.46,41.26h0.01 M53.73,20.63h0.01 M26.87,53.62h0.01 M38.43,26.81h0.01 M19.22,56.70h0.01 M59.61,71.65h0.01 M29.80,79.13h0.01 M14.90,82.86h0.01 M32.45,41.43h0.01 M66.23,64.02h0.01 M33.11,75.31h0.01 M16.56,80.95h0.01 M33.28,40.48h0.01 M41.64,20.24h0.01 M70.82,53.42h0.01 M60.41,26.71h0.01 M55.20,13.35h0.01 M77.60,49.98h0.01 M88.80,68.29h0.01 M44.40,77.44h0.01 M47.20,38.72h0.01 M23.60,62.66h0.01 M36.80,31.33h0.01 M68.40,58.97h0.01 M84.20,72.78h0.01 M67.10,36.39h0.01 M83.55,61.50h0.01 M66.78,30.75h0.01 M58.39,15.37h0.01 M79.19,50.99h0.01 M89.60,68.79h0.01 M69.80,34.40h0.01 M84.90,60.50h0.01 M92.45,73.55h0.01 M96.22,80.07h0.01 M73.11,40.04h0.01 M86.56,63.32h0.01 M93.28,74.96h0.01 M46.64,80.78h0.01 M23.32,83.69h0.01 M61.66,85.14h0.01 M30.83,85.87h0.01 M65.41,86.24h0.01 M82.71,86.42h0.01 M91.35,86.51h0.01 M70.68,43.25h0.01 M85.34,64.93h0.01 M42.67,75.76h0.01 M46.33,37.88h0.01 M73.17,62.24h0.01 M36.58,74.42h0.01 M18.29,80.51h0.01 M9.15,83.56h0.01 M29.57,41.78h0.01 M39.79,20.89h0.01 M19.89,53.74h0.01 M34.95,26.87h0.01 M42.47,13.44h0.01 M46.24,6.72h0.01 M73.12,46.66h0.01 M86.56,66.63h0.01 M43.28,76.61h0.01 M46.64,38.31h0.01 M48.32,19.15h0.01 M49.16,9.58h0.01 M49.58,4.79h0.01 M74.79,45.69h0.01 M37.39,66.15h0.01 M18.70,76.37h0.01 M59.35,81.49h0.01 M54.67,40.74h0.01 M27.34,63.67h0.01 M38.67,31.84h0.01 M69.33,59.22h0.01 M84.67,72.91h0.01 M67.33,36.45h0.01 M33.67,61.53h0.01 M16.83,74.06h0.01 M58.42,80.33h0.01 M54.21,40.17h0.01 M77.10,63.38h0.01 M88.55,74.99h0.01 M69.28,37.50h0.01 M59.64,18.75h0.01 M29.82,52.67h0.01 M14.91,69.64h0.01 M32.45,34.82h0.01 M66.23,60.71h0.01 M33.11,73.65h0.01 M16.56,80.13h0.01 M8.28,83.36h0.01 M4.14,84.98h0.01 M2.07,85.79h0.01 M1.03,86.20h0.01 M0.52,86.40h0.01 M0.26,86.50h0.01 M0.13,86.55h0.01 M50.06,86.57h0.01 M50.03,43.29h0.01 M25.02,64.94h0.01 M62.51,75.77h0.01 M81.25,81.19h0.01 M90.63,83.89h0.01 M95.31,85.25h0.01 M72.66,42.62h0.01 M36.33,64.61h0.01 M68.16,75.61h0.01 M34.08,81.10h0.01 M17.04,83.85h0.01 M33.52,41.93h0.01 M66.76,64.26h0.01 M58.38,32.13h0.01 M29.19,59.37h0.01 M14.60,72.98h0.01 M32.30,36.49h0.01 M41.15,18.25h0.01 M20.57,52.42h0.01 M35.29,26.21h0.01 M42.64,13.11h0.01 M21.32,49.85h0.01 M10.66,68.23h0.01 M30.33,34.11h0.01 M65.17,60.36h0.01 M57.58,30.18h0.01 M28.79,58.39h0.01 M39.40,29.19h0.01 M19.70,57.90h0.01 M9.85,72.25h0.01 M29.92,36.12h0.01 M14.96,61.36h0.01 M7.48,73.98h0.01 M3.74,80.29h0.01 M51.87,83.45h0.01 M25.94,85.02h0.01 M37.97,42.51h0.01 M43.98,21.26h0.01 M21.99,53.93h0.01 M61.00,70.26h0.01 M30.50,78.43h0.01 M40.25,39.22h0.01 M45.12,19.61h0.01 M47.56,9.80h0.01 M23.78,48.20h0.01 M11.89,67.40h0.01 M5.95,77.00h0.01 M52.97,81.80h0.01 M51.49,40.90h0.01 M75.74,63.75h0.01 M62.87,31.88h0.01 M31.44,59.24h0.01 M15.72,72.92h0.01 M7.86,79.76h0.01 M3.93,83.18h0.01 M26.96,41.59h0.01 M13.48,64.09h0.01 M31.74,32.05h0.01 M15.87,59.32h0.01 M32.94,29.66h0.01 M41.47,14.83h0.01 M45.73,7.42h0.01 M22.87,47.01h0.01 M61.43,66.80h0.01 M80.72,76.70h0.01 M40.36,81.65h0.01 M45.18,40.83h0.01 M22.59,63.71h0.01 M61.29,75.16h0.01 M30.65,80.88h0.01 M40.32,40.44h0.01 M45.16,20.22h0.01 M22.58,53.41h0.01 M36.29,26.70h0.01 M18.15,56.65h0.01 M34.07,28.33h0.01 M17.04,57.46h0.01 M8.52,72.03h0.01 M54.26,79.32h0.01 M77.13,82.96h0.01 M88.56,84.78h0.01 M69.28,42.39h0.01 M34.64,64.49h0.01 M17.32,75.55h0.01 M58.66,81.07h0.01 M54.33,40.54h0.01 M52.17,20.27h0.01 M76.08,53.43h0.01 M88.04,70.02h0.01 M69.02,35.01h0.01 M34.51,60.80h0.01 M17.26,73.70h0.01 M58.63,80.15h0.01 M54.31,40.08h0.01 M27.16,63.34h0.01 M13.58,74.97h0.01 M56.79,80.78h0.01 M78.39,83.69h0.01 M39.20,85.15h0.01 M19.60,85.87h0.01 M34.80,42.94h0.01 M17.40,64.77h0.01 M33.70,32.38h0.01 M16.85,59.49h0.01 M33.42,29.75h0.01 M16.71,58.17h0.01 M58.36,72.39h0.01 M79.18,79.49h0.01 M64.59,39.75h0.01 M57.29,19.87h0.01 M78.65,53.24h0.01 M89.32,69.92h0.01 M44.66,78.26h0.01 M47.33,39.13h0.01 M23.67,62.86h0.01 M36.83,31.43h0.01 M68.42,59.02h0.01 M59.21,29.51h0.01 M54.60,14.75h0.01 M27.30,50.68h0.01 M13.65,68.64h0.01 M6.83,77.62h0.01 M28.41,38.81h0.01 M39.21,19.40h0.01 M19.60,53.00h0.01 M9.80,69.80h0.01 M29.90,34.90h0.01 M39.95,17.45h0.01 M19.98,52.03h0.01 M34.99,26.01h0.01 M67.49,56.31h0.01 M33.75,71.45h0.01 M16.87,79.03h0.01 M58.44,82.81h0.01 M79.22,84.71h0.01 M64.61,42.35h0.01 M82.30,64.48h0.01 M41.15,75.54h0.01 M45.58,37.77h0.01 M22.79,62.18h0.01 M11.39,74.39h0.01 M30.70,37.20h0.01 M15.35,61.90h0.01 M7.67,74.25h0.01 M53.84,80.42h0.01 M51.92,40.21h0.01 M50.96,20.11h0.01 M75.48,53.35h0.01 M62.74,26.68h0.01 M56.37,13.34h0.01 M78.18,49.97h0.01 M64.09,24.98h0.01 M82.05,55.79h0.01 M66.02,27.90h0.01 M58.01,13.95h0.01 M54.01,6.97h0.01 M27.00,46.79h0.01 M13.50,66.69h0.01 M56.75,76.65h0.01 M78.38,81.62h0.01 M39.19,84.11h0.01 M69.59,85.36h0.01 M59.80,42.68h0.01 M29.90,64.64h0.01 M14.95,75.62h0.01 M57.47,81.11h0.01 M78.74,83.85h0.01 M89.37,85.23h0.01 M94.68,85.91h0.01 M47.34,86.26h0.01 M23.67,86.43h0.01 M36.84,43.21h0.01 M18.42,64.91h0.01 M59.21,75.75h0.01 M29.60,81.18h0.01 M64.80,83.89h0.01 M32.40,85.24h0.01 M16.20,85.92h0.01 M8.10,86.26h0.01 M4.05,86.43h0.01 M52.03,86.52h0.01 M51.01,43.26h0.01 M50.51,21.63h0.01 M50.25,10.81h0.01 M50.13,5.41h0.01 M75.06,46.00h0.01 M62.53,23.00h0.01 M31.27,54.80h0.01 M65.63,70.70h0.01 M57.82,35.35h0.01 M78.91,60.98h0.01 M64.45,30.49h0.01 M82.23,58.54h0.01 M66.11,29.27h0.01 M58.06,14.64h0.01 M29.03,50.62h0.01 M39.51,25.31h0.01 M44.76,12.65h0.01 M47.38,6.33h0.01 M73.69,46.46h0.01 M61.84,23.23h0.01 M30.92,54.92h0.01 M15.46,70.76h0.01 M7.73,78.68h0.01 M28.87,39.34h0.01 M14.43,62.97h0.01 M7.22,74.78h0.01 M53.61,80.69h0.01 M26.80,83.65h0.01 M38.40,41.82h0.01 M69.20,64.21h0.01 M59.60,32.11h0.01 M79.80,59.35h0.01 M39.90,72.98h0.01 M69.95,79.79h0.01 M59.98,39.89h0.01 M54.99,19.95h0.01 M52.49,9.97h0.01 M26.25,48.29h0.01 M13.12,67.44h0.01 M56.56,77.02h0.01 M53.28,38.51h0.01 M76.64,62.56h0.01 M88.32,74.58h0.01 M44.16,80.59h0.01 M22.08,83.59h0.01 M36.04,41.80h0.01 M18.02,64.20h0.01 M9.01,75.40h0.01 M29.51,37.70h0.01 M39.75,18.85h0.01 M19.88,52.72h0.01 M34.94,26.36h0.01 M42.47,13.18h0.01 M71.23,49.89h0.01 M85.62,68.25h0.01 M92.81,77.42h0.01 M46.40,82.01h0.01 M48.20,41.01h0.01 M74.10,63.80h0.01 M37.05,75.20h0.01 M43.53,37.60h0.01 M71.76,62.10h0.01 M60.88,31.05h0.01 M55.44,15.53h0.01 M77.72,51.06h0.01 M88.86,68.83h0.01 M44.43,77.72h0.01 M47.22,38.86h0.01 M48.61,19.43h0.01 M74.30,53.01h0.01 M37.15,69.81h0.01 M43.58,34.90h0.01 M71.79,60.75h0.01 M85.89,73.68h0.01 M42.95,80.14h0.01 M21.47,83.37h0.01 M35.74,41.68h0.01 M42.87,20.84h0.01 M21.43,53.72h0.01 M35.72,26.86h0.01 M67.86,56.73h0.01 M33.93,71.67h0.01 M16.96,79.13h0.01 M33.48,39.57h0.01 M16.74,63.08h0.01 M33.37,31.54h0.01 M16.69,59.07h0.01 M33.34,29.54h0.01 M66.67,58.07h0.01 M58.34,29.03h0.01 M79.17,57.82h0.01 M39.58,72.21h0.01 M44.79,36.10h0.01 M72.40,61.35h0.01 M61.20,30.68h0.01 M30.60,58.64h0.01 M65.30,72.62h0.01 M32.65,79.61h0.01 M41.32,39.80h0.01 M20.66,63.20h0.01 M60.33,74.90h0.01 M30.17,80.75h0.01 M15.08,83.68h0.01 M32.54,41.84h0.01 M41.27,20.92h0.01 M70.64,53.76h0.01 M60.32,26.88h0.01 M55.16,13.44h0.01 M27.58,50.02h0.01 M38.79,25.01h0.01 M44.39,12.50h0.01 M72.20,49.55h0.01 M36.10,68.08h0.01 M18.05,77.34h0.01 M34.02,38.67h0.01 M42.01,19.33h0.01 M46.01,9.67h0.01 M73.00,48.13h0.01 M61.50,24.07h0.01 M55.75,12.03h0.01 M77.88,49.32h0.01 M88.94,67.96h0.01 M44.47,77.28h0.01 M22.23,81.94h0.01 M11.12,84.27h0.01 M55.56,85.43h0.01 M52.78,42.72h0.01 M26.39,64.66h0.01 M38.19,32.33h0.01 M69.10,59.46h0.01 M84.55,73.03h0.01 M42.27,79.82h0.01 M21.14,83.21h0.01 M60.57,84.90h0.01 M55.28,42.45h0.01 M77.64,64.53h0.01 M63.82,32.26h0.01 M81.91,59.43h0.01 M65.96,29.72h0.01 M32.98,58.16h0.01 M41.49,29.08h0.01 M45.74,14.54h0.01 M47.87,7.27h0.01 M48.94,3.63h0.01 M74.47,45.12h0.01 M37.23,65.86h0.01 M68.62,76.23h0.01 M84.31,81.41h0.01 M67.15,40.71h0.01 M33.58,63.65h0.01 M66.79,75.13h0.01 M83.39,80.86h0.01 M41.70,83.73h0.01 M70.85,85.17h0.01 M35.42,85.88h0.01 M67.71,86.24h0.01 M83.86,86.42h0.01 M66.93,43.21h0.01 M33.46,64.91h0.01 M66.73,75.75h0.01 M58.37,37.88h0.01 M29.18,62.24h0.01 M39.59,31.12h0.01 M44.80,15.56h0.01 M72.40,51.08h0.01 M36.20,68.84h0.01 M68.10,77.72h0.01 M59.05,38.86h0.01 M29.52,62.73h0.01 M64.76,74.66h0.01 M82.38,80.63h0.01 M41.19,83.62h0.01 M45.60,41.81h0.01 M22.80,64.20h0.01 M36.40,32.10h0.01 M68.20,59.35h0.01 M84.10,72.98h0.01 M92.05,79.79h0.01 M46.02,83.19h0.01 M48.01,41.60h0.01 M49.01,20.80h0.01 M49.50,10.40h0.01 M74.75,48.50h0.01 M62.38,24.25h0.01 M56.19,12.12h0.01 M78.09,49.36h0.01 M89.05,67.98h0.01 M94.52,77.29h0.01 M97.26,81.95h0.01 M98.63,84.27h0.01 M99.32,85.44h0.01 M74.66,42.72h0.01 M87.33,64.66h0.01 M68.66,32.33h0.01 M84.33,59.46h0.01 M92.17,73.03h0.01 M96.08,79.82h0.01 M98.04,83.21h0.01 M74.02,41.60h0.01 M62.01,20.80h0.01 M31.01,53.70h0.01 M40.50,26.85h0.01 M70.25,56.73h0.01 M35.13,71.66h0.01 M67.56,79.13h0.01 M83.78,82.87h0.01 M91.89,84.73h0.01 M70.95,42.37h0.01 M35.47,64.48h0.01 M67.74,75.54h0.01 M58.87,37.77h0.01 M79.43,62.19h0.01 M39.72,74.39h0.01 M69.86,80.50h0.01 M84.93,83.55h0.01 M42.46,85.07h0.01 M71.23,85.84h0.01 M35.62,86.22h0.01 M67.81,86.41h0.01 M33.90,86.50h0.01 M41.95,43.25h0.01 M20.98,64.93h0.01 M10.49,75.76h0.01 M5.24,81.18h0.01 M27.62,40.59h0.01 M63.81,63.60h0.01 M56.91,31.80h0.01 M53.45,15.90h0.01 M26.73,51.25h0.01 M38.36,25.62h0.01 M19.18,56.11h0.01 M34.59,28.06h0.01 M42.30,14.03h0.01 M71.15,50.31h0.01 M60.57,25.16h0.01 M55.29,12.58h0.01 M27.64,49.59h0.01 M38.82,24.79h0.01 M19.41,55.70h0.01 M9.71,71.15h0.01 M4.85,78.87h0.01 M27.43,39.44h0.01 M63.71,63.02h0.01 M56.86,31.51h0.01 M28.43,59.05h0.01 M39.21,29.53h0.01 M69.61,58.06h0.01 M84.80,72.33h0.01 M67.40,36.17h0.01 M83.70,61.38h0.01 M91.85,73.99h0.01 M95.93,80.30h0.01 M72.96,40.15h0.01 M86.48,63.37h0.01 M93.24,74.99h0.01 M96.62,80.79h0.01 M48.31,83.70h0.01 M49.16,41.85h0.01 M74.58,64.22h0.01 M62.29,32.11h0.01 M81.14,59.36h0.01 M65.57,29.68h0.01 M32.79,58.14h0.01 M16.39,72.37h0.01 M33.20,36.18h0.01 M16.60,61.39h0.01 M8.30,74.00h0.01 M4.15,80.30h0.01 M52.07,83.45h0.01 M76.04,85.02h0.01 M38.02,85.81h0.01 M19.01,86.21h0.01 M34.50,43.10h0.01 M42.25,21.55h0.01 M46.13,10.78h0.01 M23.06,48.69h0.01 M61.53,67.64h0.01 M80.77,77.12h0.01 M65.38,38.56h0.01 M57.69,19.28h0.01 M53.85,9.64h0.01 M26.92,48.12h0.01 M38.46,24.06h0.01 M69.23,55.33h0.01 M34.62,70.97h0.01 M42.31,35.48h0.01 M21.15,61.04h0.01 M35.58,30.52h0.01 M17.79,58.56h0.01 M33.89,29.28h0.01 M41.95,14.64h0.01 M70.97,50.62h0.01 M60.49,25.31h0.01 M30.24,55.96h0.01 M40.12,27.98h0.01 M70.06,57.29h0.01 M60.03,28.64h0.01 M80.02,57.62h0.01 M90.01,72.11h0.01 M45.00,79.36h0.01 M22.50,82.98h0.01 M36.25,41.49h0.01 M18.13,64.04h0.01 M9.06,75.32h0.01 M4.53,80.96h0.01 M2.27,83.78h0.01 M51.13,85.19h0.01 M75.57,85.90h0.01 M37.78,86.25h0.01 M18.89,86.42h0.01 M9.45,86.51h0.01 M29.72,43.26h0.01 M64.86,64.93h0.01 M82.43,75.76h0.01 M41.22,81.18h0.01 M45.61,40.59h0.01 M72.80,63.60h0.01 M36.40,75.10h0.01 M43.20,37.55h0.01 M46.60,18.77h0.01 M23.30,52.69h0.01 M61.65,69.64h0.01 M55.83,34.82h0.01 M77.91,60.71h0.01 M38.96,73.66h0.01 M69.48,80.13h0.01 M84.74,83.36h0.01 M92.37,84.98h0.01 M46.18,85.79h0.01 M73.09,86.20h0.01 M86.55,86.40h0.01 M93.27,86.50h0.01 M46.64,86.55h0.01 M48.32,43.27h0.01 M49.16,21.64h0.01 M74.58,54.12h0.01 M87.29,70.36h0.01 M43.64,78.48h0.01 M21.82,82.54h0.01 M35.91,41.27h0.01 M17.96,63.93h0.01 M58.98,75.27h0.01 M29.49,80.93h0.01 M64.74,83.77h0.01 M57.37,41.88h0.01 M78.69,64.24h0.01 M39.34,75.42h0.01 M19.67,81.01h0.01 M34.84,40.51h0.01 M42.42,20.25h0.01 M46.21,10.13h0.01 M73.10,48.36h0.01 M86.55,67.48h0.01 M93.28,77.04h0.01 M46.64,81.82h0.01 M73.32,84.21h0.01 M86.66,85.41h0.01 M93.33,86.00h0.01 M96.66,86.30h0.01 M48.33,86.45h0.01 M49.17,43.23h0.01 M49.58,21.61h0.01 M24.79,54.11h0.01 M37.40,27.05h0.01 M18.70,56.83h0.01 M59.35,71.71h0.01 M29.67,79.16h0.01 M39.84,39.58h0.01 M44.92,19.79h0.01 M47.46,9.89h0.01 M23.73,48.25h0.01 M36.86,24.12h0.01 M43.43,12.06h0.01 M21.72,49.33h0.01 M10.86,67.97h0.01 M30.43,33.98h0.01 M40.21,16.99h0.01 M70.11,51.80h0.01 M35.05,69.20h0.01 M17.53,77.90h0.01 M58.76,82.25h0.01 M79.38,84.42h0.01 M64.69,42.21h0.01 M82.35,64.41h0.01 M91.17,75.50h0.01 M70.59,37.75h0.01 M85.29,62.18h0.01 M92.65,74.39h0.01 M96.32,80.49h0.01 M73.16,40.25h0.01 M36.58,63.42h0.01 M68.29,75.01h0.01 M84.15,80.81h0.01 M92.07,83.70h0.01 M96.04,85.15h0.01 M98.02,85.88h0.01 M74.01,42.94h0.01 M87.00,64.77h0.01 M43.50,75.68h0.01 M21.75,81.14h0.01 M35.88,40.57h0.01 M42.94,20.29h0.01 M71.47,53.44h0.01 M60.73,26.72h0.01 M80.37,56.66h0.01 M90.18,71.63h0.01 M70.09,35.82h0.01 M35.05,61.21h0.01 M67.52,73.90h0.01 M58.76,36.95h0.01 M54.38,18.48h0.01 M52.19,9.24h0.01 M76.10,47.92h0.01 M88.05,67.26h0.01 M94.02,76.93h0.01 M72.01,38.46h0.01 M61.01,19.23h0.01 M80.50,52.92h0.01 M90.25,69.76h0.01 M95.13,78.18h0.01 M47.56,82.39h0.01 M23.78,84.49h0.01 M36.89,42.25h0.01 M43.45,21.12h0.01 M46.72,10.56h0.01 M48.36,5.28h0.01 M74.18,45.94h0.01 M87.09,66.27h0.01 M43.55,76.44h0.01 M21.77,81.52h0.01 M10.89,84.06h0.01 M55.44,85.33h0.01 M52.72,42.66h0.01 M51.36,21.33h0.01 M50.68,10.67h0.01 M25.34,48.63h0.01 M37.67,24.32h0.01 M68.84,55.46h0.01 M34.42,71.03h0.01 M67.21,78.81h0.01 M58.60,39.41h0.01 M79.30,63.00h0.01 M64.65,31.50h0.01 M57.33,15.75h0.01 M28.66,51.18h0.01 M14.33,68.89h0.01 M32.17,34.44h0.01 M41.08,17.22h0.01 M45.54,8.61h0.01 M22.77,47.61h0.01 M11.39,67.10h0.01 M5.69,76.85h0.01 M27.85,38.43h0.01 M38.92,19.21h0.01 M69.46,52.91h0.01 M84.73,69.75h0.01 M67.37,34.88h0.01 M58.68,17.44h0.01 M79.34,52.02h0.01 M89.67,69.31h0.01 M94.84,77.95h0.01 M72.42,38.98h0.01 M61.21,19.49h0.01 M30.60,53.04h0.01 M40.30,26.52h0.01 M70.15,56.56h0.01 M60.08,28.28h0.01 M30.04,57.44h0.01 M15.02,72.02h0.01 M32.51,36.01h0.01 M41.25,18.01h0.01 M45.63,9.00h0.01 M22.81,47.80h0.01 M11.41,67.20h0.01 M30.70,33.60h0.01 M65.35,60.10h0.01 M32.68,73.35h0.01 M16.34,79.98h0.01 M33.17,39.99h0.01 M41.58,19.99h0.01 M20.79,53.30h0.01 M60.40,69.95h0.01 M30.20,78.27h0.01 M15.10,82.44h0.01 M57.55,84.52h0.01 M53.77,42.26h0.01 M51.89,21.13h0.01 M75.94,53.86h0.01 M62.97,26.93h0.01 M31.49,56.77h0.01 M15.74,71.68h0.01 M57.87,79.14h0.01 M28.94,82.87h0.01 M64.47,84.74h0.01 M32.23,85.67h0.01 M16.12,86.13h0.01 M33.06,43.07h0.01 M16.53,64.83h0.01 M8.26,75.72h0.01 M54.13,81.16h0.01 M52.07,40.58h0.01 M51.03,20.29h0.01 M25.52,53.44h0.01 M37.76,26.72h0.01 M43.88,13.36h0.01 M71.94,49.98h0.01 M35.97,68.29h0.01 M17.98,77.45h0.01 M8.99,82.02h0.01 M54.50,84.31h0.01 M77.25,85.46h0.01 M88.62,86.03h0.01 M94.31,86.31h0.01 M97.16,86.46h0.01 M48.58,86.53h0.01 M49.29,43.26h0.01 M49.64,21.63h0.01 M24.82,54.12h0.01 M12.41,70.36h0.01 M6.21,78.48h0.01 M3.10,82.54h0.01 M26.55,41.27h0.01 M13.28,63.93h0.01 M31.64,31.97h0.01 M65.82,59.28h0.01 M82.91,72.94h0.01 M91.45,79.77h0.01 M70.73,39.89h0.01 M35.36,63.24h0.01 M42.68,31.62h0.01 M21.34,59.11h0.01 M10.67,72.86h0.01 M5.34,79.73h0.01 M52.67,83.16h0.01 M76.33,84.88h0.01 M38.17,85.74h0.01 M44.08,42.87h0.01 M72.04,64.74h0.01 M36.02,75.67h0.01 M43.01,37.83h0.01 M46.51,18.92h0.01 M23.25,52.76h0.01 M61.63,69.68h0.01 M55.81,34.84h0.01 M77.91,60.72h0.01 M63.95,30.36h0.01 M31.98,58.48h0.01 M40.99,29.24h0.01 M45.49,14.62h0.01 M72.75,50.61h0.01 M36.37,68.60h0.01 M68.19,77.60h0.01 M84.09,82.10h0.01 M42.05,84.35h0.01 M71.02,85.48h0.01 M35.51,86.04h0.01 M42.76,43.02h0.01 M21.38,64.81h0.01 M10.69,75.70h0.01 M5.34,81.15h0.01 M2.67,83.88h0.01 M1.34,85.24h0.01 M50.67,85.92h0.01 M50.33,42.96h0.01 M50.17,21.48h0.01 M75.08,54.04h0.01 M62.54,27.02h0.01 M56.27,13.51h0.01 M53.14,6.75h0.01 M51.57,3.38h0.01 M50.78,1.69h0.01 M50.39,0.84h0.01 M75.20,43.72h0.01 M87.60,65.16h0.01 M43.80,75.88h0.01 M46.90,37.94h0.01 M23.45,62.27h0.01 M36.72,31.14h0.01 M43.36,15.57h0.01 M21.68,51.08h0.01 M35.84,25.54h0.01 M17.92,56.07h0.01 M33.96,28.04h0.01 M16.98,57.32h0.01 M58.49,71.96h0.01 M29.25,79.28h0.01 M14.62,82.94h0.01 M7.31,84.77h0.01 M3.66,85.68h0.01 M1.83,86.14h0.01 M25.91,43.07h0.01 M37.96,21.54h0.01 M43.98,10.77h0.01 M46.99,5.38h0.01 M73.49,45.99h0.01 M86.75,66.30h0.01 M68.37,33.15h0.01 M59.19,16.57h0.01 M54.59,8.29h0.01 M52.30,4.14h0.01 M51.15,2.07h0.01 M50.57,1.04h0.01 M50.29,0.52h0.01 M75.14,43.56h0.01 M62.57,21.78h0.01 M56.29,10.89h0.01 M53.14,5.44h0.01 M51.57,2.72h0.01 M25.79,44.66h0.01 M62.89,65.63h0.01 M31.45,76.12h0.01 M40.72,38.06h0.01 M45.36,19.03h0.01 M72.68,52.81h0.01 M36.34,69.71h0.01 M43.17,34.85h0.01 M71.59,60.73h0.01 M60.79,30.36h0.01 M30.40,58.48h0.01 M40.20,29.24h0.01 M70.10,57.92h0.01 M60.05,28.96h0.01 M55.02,14.48h0.01 M27.51,50.54h0.01 M63.76,68.57h0.01 M56.88,34.29h0.01 M53.44,17.14h0.01 M26.72,51.87h0.01 M63.36,69.24h0.01 M56.68,34.62h0.01 M28.34,60.61h0.01 M64.17,73.60h0.01 M32.08,80.10h0.01 M41.04,40.05h0.01 M20.52,63.33h0.01 M35.26,31.66h0.01 M42.63,15.83h0.01 M71.32,51.22h0.01 M35.66,68.91h0.01 M67.83,77.75h0.01 M83.91,82.18h0.01 M66.96,41.09h0.01 M33.48,63.84h0.01 M41.74,31.92h0.01 M45.87,15.96h0.01 M47.93,7.98h0.01 M48.97,3.99h0.01 M49.48,2.00h0.01 M49.74,1.00h0.01 M24.87,43.80h0.01 M12.44,65.20h0.01 M56.22,75.90h0.01 M53.11,37.95h0.01 M76.55,62.27h0.01 M63.28,31.14h0.01 M81.64,58.87h0.01 M40.82,72.73h0.01 M70.41,79.67h0.01 M35.20,83.13h0.01 M17.60,84.87h0.01 M58.80,85.73h0.01 M29.40,86.17h0.01 M39.70,43.08h0.01 M69.85,64.84h0.01 M84.93,75.72h0.01 M92.46,81.16h0.01 M96.23,83.88h0.01 M48.12,85.24h0.01 M49.06,42.62h0.01 M24.53,64.61h0.01 M12.26,75.61h0.01 M31.13,37.80h0.01 M15.57,62.20h0.01 M32.78,31.10h0.01 M66.39,58.85h0.01 M33.20,72.73h0.01 M16.60,79.66h0.01 M58.30,83.13h0.01 M79.15,84.87h0.01 M39.57,85.73h0.01 M44.79,42.87h0.01 M47.39,21.43h0.01 M48.70,10.72h0.01 M49.35,5.36h0.01 M24.67,45.98h0.01 M37.34,22.99h0.01 M68.67,54.79h0.01 M34.33,70.70h0.01 M67.17,78.65h0.01 M33.58,82.62h0.01 M66.79,84.61h0.01 M33.40,85.61h0.01 M41.70,42.80h0.01 M70.85,64.70h0.01 M35.42,75.65h0.01 M17.71,81.13h0.01 M33.86,40.56h0.01 M41.93,20.28h0.01 M70.96,53.44h0.01 M35.48,70.02h0.01 M42.74,35.01h0.01 M21.37,60.81h0.01 M10.69,73.70h0.01 M5.34,80.15h0.01 M52.67,83.38h0.01 M51.34,41.69h0.01 M75.67,64.14h0.01 M62.83,32.07h0.01 M31.42,59.34h0.01 M40.71,29.67h0.01 M45.35,14.83h0.01 M72.68,50.72h0.01 M86.34,68.66h0.01 M93.17,77.63h0.01 M71.58,38.81h0.01 M60.79,19.41h0.01 M55.40,9.70h0.01 M77.70,48.15h0.01 M63.85,24.08h0.01 M31.92,55.34h0.01 M65.96,70.97h0.01 M57.98,35.48h0.01 M78.99,61.04h0.01 M39.50,73.82h0.01 M19.75,80.21h0.01 M9.87,83.41h0.01 M29.94,41.70h0.01 M39.97,20.85h0.01 M44.98,10.43h0.01 M72.49,48.51h0.01 M86.25,67.56h0.01 M43.12,77.08h0.01 M71.56,81.84h0.01 M60.78,40.92h0.01 M55.39,20.46h0.01 M77.70,53.53h0.01 M63.85,26.76h0.01 M81.92,56.68h0.01 M90.96,71.64h0.01 M70.48,35.82h0.01 M35.24,61.21h0.01 M67.62,73.91h0.01 M83.81,80.25h0.01 M41.91,83.43h0.01 M70.95,85.01h0.01 M35.48,85.81h0.01 M67.74,86.20h0.01 M33.87,86.40h0.01 M66.93,86.50h0.01 M33.47,86.55h0.01 M41.73,43.28h0.01 M20.87,64.94h0.01 M10.43,75.77h0.01 M55.22,81.18h0.01 M52.61,40.59h0.01 M26.30,63.60h0.01 M63.15,75.10h0.01 M31.58,80.85h0.01 M40.79,40.42h0.01 M20.39,63.51h0.01 M10.20,75.06h0.01 M30.10,37.53h0.01 M65.05,62.06h0.01 M32.52,74.33h0.01 M41.26,37.17h0.01 M20.63,61.88h0.01 M35.32,30.94h0.01 M17.66,58.77h0.01 M8.83,72.69h0.01 M54.41,79.64h0.01 M27.21,83.12h0.01 M13.60,84.86h0.01 M56.80,85.73h0.01 M53.40,42.87h0.01 M51.70,21.43h0.01 M50.85,10.72h0.01 M25.43,48.66h0.01 M37.71,24.33h0.01 M68.86,55.46h0.01 M34.43,71.03h0.01 M42.21,35.52h0.01 M21.11,61.06h0.01 M35.55,30.53h0.01 M17.78,58.56h0.01 M8.89,72.58h0.01 M4.44,79.59h0.01 M27.22,39.80h0.01 M13.61,63.20h0.01 M6.81,74.90h0.01 M53.40,80.75h0.01 M26.70,83.67h0.01 M38.35,41.84h0.01 M69.18,64.22h0.01 M59.59,32.11h0.01 M54.79,16.05h0.01 M77.40,51.33h0.01 M88.70,68.96h0.01 M69.35,34.48h0.01 M84.67,60.54h0.01 M67.34,30.27h0.01 M33.67,58.44h0.01 M41.83,29.22h0.01 M45.92,14.61h0.01 M22.96,50.60h0.01 M61.48,68.60h0.01 M30.74,77.60h0.01 M40.37,38.80h0.01 M20.18,62.70h0.01 M35.09,31.35h0.01 M67.55,58.98h0.01 M83.77,72.79h0.01 M41.89,79.69h0.01 M20.94,83.15h0.01 M10.47,84.87h0.01 M30.24,42.44h0.01 M65.12,64.52h0.01 M82.56,75.56h0.01 M66.28,37.78h0.01 M58.14,18.89h0.01 M79.07,52.74h0.01 M64.53,26.37h0.01 M32.27,56.49h0.01 M41.13,28.24h0.01 M20.57,57.42h0.01 M35.28,28.71h0.01 M42.64,14.36h0.01 M21.32,50.48h0.01 M35.66,25.24h0.01 M42.83,12.62h0.01 M21.42,49.61h0.01 M10.71,68.10h0.01 M5.35,77.35h0.01 M27.68,38.68h0.01 M13.84,62.64h0.01 M31.92,31.32h0.01 M65.96,58.96h0.01 M82.98,72.78h0.01 M66.49,36.39h0.01 M58.24,18.19h0.01 M79.12,52.40h0.01 M64.56,26.20h0.01 M82.28,56.40h0.01 M91.14,71.50h0.01 M70.57,35.75h0.01 M60.29,17.87h0.01 M30.14,52.24h0.01 M65.07,69.42h0.01 M82.54,78.01h0.01 M91.27,82.30h0.01 M45.63,84.45h0.01 M22.82,85.53h0.01 M11.41,86.06h0.01 M55.70,86.33h0.01 M52.85,43.17h0.01 M51.43,21.58h0.01 M50.71,10.79h0.01 M50.36,5.40h0.01 M25.18,46.00h0.01 M62.59,66.30h0.01 M56.29,33.15h0.01 M28.15,59.87h0.01 M39.07,29.94h0.01 M44.54,14.97h0.01 M22.27,50.78h0.01 M61.13,68.69h0.01 M80.57,77.65h0.01 M90.28,82.12h0.01 M45.14,84.36h0.01 M22.57,85.48h0.01 M11.29,86.04h0.01 M5.64,86.32h0.01 M52.82,86.46h0.01 M51.41,43.23h0.01 M25.71,64.92h0.01 M12.85,75.76h0.01 M56.43,81.18h0.01 M78.21,83.89h0.01 M89.11,85.24h0.01 M94.55,85.92h0.01 M47.28,86.26h0.01 M73.64,86.43h0.01 M86.82,86.52h0.01 M43.41,86.56h0.01 M21.70,86.58h0.01 M10.85,86.59h0.01 M55.43,86.59h0.01 M77.71,86.60h0.01 M63.86,43.30h0.01 M31.93,64.95h0.01 M65.96,75.77h0.01 M32.98,81.19h0.01 M66.49,83.89h0.01 M83.25,85.25h0.01 M91.62,85.92h0.01 M45.81,86.26h0.01 M47.91,43.13h0.01 M73.95,64.87h0.01 M86.98,75.73h0.01 M43.49,81.17h0.01 M71.74,83.88h0.01 M35.87,85.24h0.01 M42.94,42.62h0.01 M71.47,64.61h0.01 M60.73,32.31h0.01 M55.37,16.15h0.01 M77.68,51.38h0.01 M88.84,68.99h0.01 M94.42,77.79h0.01 M72.21,38.90h0.01 M86.11,62.75h0.01 M43.05,74.67h0.01 M71.53,80.64h0.01 M35.76,83.62h0.01 M42.88,41.81h0.01 M21.44,64.20h0.01 M60.72,75.40h0.01 M55.36,37.70h0.01 M77.68,62.15h0.01 M38.84,74.38h0.01 M19.42,80.49h0.01 M9.71,83.54h0.01 M4.86,85.07h0.01 M27.43,42.54h0.01 M63.71,64.57h0.01 M31.86,75.58h0.01 M65.93,81.09h0.01 M32.96,83.85h0.01 M41.48,41.92h0.01 M70.74,64.26h0.01 M35.37,75.43h0.01 M17.69,81.02h0.01 M8.84,83.81h0.01 M29.42,41.90h0.01 M14.71,64.25h0.01 M57.36,75.43h0.01 M78.68,81.01h0.01 M89.34,83.81h0.01 M94.67,85.20h0.01 M72.33,42.60h0.01 M86.17,64.60h0.01 M68.08,32.30h0.01 M84.04,59.45h0.01 M67.02,29.73h0.01 M58.51,14.86h0.01 M29.26,50.73h0.01 M64.63,68.67h0.01 M82.31,77.63h0.01 M41.16,82.12h0.01 M70.58,84.36h0.01 M60.29,42.18h0.01 M80.14,64.39h0.01 M65.07,32.19h0.01 M82.54,59.40h0.01 M66.27,29.70h0.01 M83.13,58.15h0.01 M91.57,72.37h0.01 M70.78,36.19h0.01 M85.39,61.39h0.01 M92.70,74.00h0.01 M96.35,80.30h0.01 M98.17,83.45h0.01 M99.09,85.02h0.01 M74.54,42.51h0.01 M62.27,21.26h0.01 M31.14,53.93h0.01 M40.57,26.96h0.01 M70.28,56.78h0.01 M85.14,71.69h0.01 M92.57,79.15h0.01 M46.29,82.87h0.01 M48.14,41.44h0.01 M24.07,64.02h0.01 M62.04,75.31h0.01 M56.02,37.65h0.01 M28.01,62.13h0.01 M39.00,31.06h0.01 M19.50,58.83h0.01 M59.75,72.72h0.01 M29.88,79.66h0.01 M14.94,83.13h0.01 M32.47,41.56h0.01 M66.23,64.08h0.01 M83.12,75.34h0.01 M41.56,80.97h0.01 M70.78,83.79h0.01 M35.39,85.19h0.01 M67.69,85.90h0.01 M83.85,86.25h0.01 M91.92,86.42h0.01 M70.96,43.21h0.01 M35.48,64.91h0.01 M67.74,75.75h0.01 M58.87,37.88h0.01 M29.44,62.24h0.01 M39.72,31.12h0.01 M19.86,58.86h0.01 M34.93,29.43h0.01 M17.46,58.01h0.01 M8.73,72.31h0.01 M54.37,79.45h0.01 M27.18,83.03h0.01 M63.59,84.81h0.01 M81.80,85.71h0.01 M90.90,86.15h0.01 M45.45,86.38h0.01 M47.72,43.19h0.01 M73.86,64.89h0.01 M61.93,32.45h0.01 M55.97,16.22h0.01 M52.98,8.11h0.01 M51.49,4.06h0.01 M50.75,2.03h0.01 M75.37,44.31h0.01 M87.69,65.46h0.01 M93.84,76.03h0.01 M71.92,38.01h0.01 M60.96,19.01h0.01 M80.48,52.80h0.01 M40.24,69.70h0.01 M70.12,78.15h0.01 M35.06,82.38h0.01 M42.53,41.19h0.01 M71.27,63.89h0.01 M85.63,75.25h0.01 M67.82,37.62h0.01 M58.91,18.81h0.01 M54.45,9.41h0.01 M27.23,48.00h0.01 M63.61,67.30h0.01 M31.81,76.95h0.01 M65.90,81.78h0.01 M32.95,84.19h0.01 M16.48,85.39h0.01 M33.24,42.70h0.01 M16.62,64.65h0.01 M58.31,75.62h0.01 M54.15,37.81h0.01 M77.08,62.21h0.01 M88.54,74.40h0.01 M94.27,80.50h0.01 M97.13,83.55h0.01 M48.57,85.08h0.01 M24.28,85.84h0.01 M12.14,86.22h0.01 M56.07,86.41h0.01 M28.04,86.50h0.01 M14.02,86.55h0.01 M7.01,86.58h0.01 M3.50,86.59h0.01 M26.75,43.29h0.01 M13.38,64.95h0.01 M56.69,75.77h0.01 M78.34,81.19h0.01 M64.17,40.59h0.01 M57.09,20.30h0.01 M28.54,53.45h0.01 M14.27,70.02h0.01 M57.14,78.31h0.01 M28.57,82.46h0.01 M14.28,84.53h0.01 M32.14,42.26h0.01 M41.07,21.13h0.01 M70.54,53.87h0.01 M85.27,70.23h0.01 M67.63,35.12h0.01 M83.82,60.86h0.01 M41.91,73.73h0.01 M45.95,36.86h0.01 M47.98,18.43h0.01 M48.99,9.22h0.01 M24.49,47.91h0.01 M37.25,23.95h0.01 M43.62,11.98h0.01 M46.81,5.99h0.01 M48.41,2.99h0.01 M49.20,1.50h0.01 M74.60,44.05h0.01 M37.30,65.32h0.01 M18.65,75.96h0.01 M9.33,81.28h0.01 M4.66,83.94h0.01 M27.33,41.97h0.01 M63.67,64.29h0.01 M31.83,75.44h0.01 M65.92,81.02h0.01 M57.96,40.51h0.01 M53.98,20.26h0.01 M51.99,10.13h0.01 M75.99,48.36h0.01 M88.00,67.48h0.01 M94.00,77.04h0.01 M72.00,38.52h0.01 M61.00,19.26h0.01 M80.50,52.93h0.01 M90.25,69.77h0.01 M70.12,34.88h0.01 M35.06,60.74h0.01 M67.53,73.67h0.01 M83.77,80.14h0.01 M66.88,40.07h0.01 M58.44,20.03h0.01 M54.22,10.02h0.01 M52.11,5.01h0.01 M26.06,45.80h0.01 M63.03,66.20h0.01 M56.51,33.10h0.01 M78.26,59.85h0.01 M64.13,29.93h0.01 M57.06,14.96h0.01 M28.53,50.78h0.01 M64.27,68.69h0.01 M82.13,77.65h0.01 M91.07,82.12h0.01 M45.53,84.36h0.01 M47.77,42.18h0.01 M73.88,64.39h0.01 M86.94,75.50h0.01 M93.47,81.05h0.01 M71.74,40.52h0.01 M35.87,63.56h0.01 M67.93,75.08h0.01 M33.97,80.84h0.01 M16.98,83.72h0.01 M58.49,85.16h0.01 M29.25,85.88h0.01 M39.62,42.94h0.01 M19.81,64.77h0.01 M9.91,75.69h0.01 M4.95,81.14h0.01 M27.48,40.57h0.01 M63.74,63.59h0.01 M31.87,75.09h0.01 M15.93,80.85h0.01 M32.97,40.42h0.01 M66.48,63.51h0.01 M58.24,31.76h0.01 M29.12,59.18h0.01 M64.56,72.89h0.01 M32.28,79.74h0.01 M16.14,83.17h0.01 M8.07,84.89h0.01 M4.04,85.74h0.01 M52.02,86.17h0.01 M76.01,86.39h0.01 M63.00,43.19h0.01 M81.50,64.90h0.01 M90.75,75.75h0.01 M95.38,81.17h0.01 M97.69,83.89h0.01 M98.84,85.24h0.01 M74.42,42.62h0.01 M62.21,21.31h0.01 M31.11,53.96h0.01 M15.55,70.28h0.01 M32.78,35.14h0.01 M66.39,60.87h0.01 M33.19,73.73h0.01 M16.60,80.17h0.01 M8.30,83.38h0.01 M54.15,84.99h0.01 M52.07,42.50h0.01 M26.04,64.55h0.01 M63.02,75.57h0.01 M56.51,37.79h0.01 M28.25,62.19h0.01 M39.13,31.10h0.01 M69.56,58.85h0.01 M59.78,29.42h0.01 M79.89,58.01h0.01 M39.95,72.31h0.01 M69.97,79.45h0.01 M84.99,83.03h0.01 M42.49,84.81h0.01 M46.25,42.41h0.01 M23.12,64.50h0.01 M11.56,75.55h0.01 M55.78,81.08h0.01 M77.89,83.84h0.01 M63.95,41.92h0.01 M56.97,20.96h0.01 M28.49,53.78h0.01 M14.24,70.19h0.01 M32.12,35.09h0.01 M41.06,17.55h0.01 M45.53,8.77h0.01 M47.77,4.39h0.01 M23.88,45.49h0.01 M61.94,66.05h0.01 M55.97,33.02h0.01 M27.99,59.81h0.01 M63.99,73.21h0.01 M82.00,79.90h0.01 M66.00,39.95h0.01 M58.00,19.98h0.01 M29.00,53.29h0.01 M39.50,26.64h0.01 M19.75,56.62h0.01 M34.87,28.31h0.01 M67.44,57.46h0.01 M33.72,72.03h0.01 M41.86,36.01h0.01 M45.93,18.01h0.01 M72.96,52.30h0.01 M86.48,69.45h0.01 M68.24,34.73h0.01 M84.12,60.66h0.01 M67.06,30.33h0.01 M83.53,58.47h0.01 M41.77,72.53h0.01 M20.88,79.57h0.01 M35.44,39.78h0.01 M42.72,19.89h0.01 M46.36,9.95h0.01 M73.18,48.27h0.01 M86.59,67.44h0.01 M43.30,77.02h0.01 M71.65,81.81h0.01 M85.82,84.20h0.01 M67.91,42.10h0.01 M83.96,64.35h0.01 M91.98,75.48h0.01 M95.99,81.04h0.01 M47.99,83.82h0.01 M49.00,41.91h0.01 M49.50,20.95h0.01 M74.75,53.78h0.01 M87.37,70.19h0.01 M93.69,78.39h0.01 M96.84,82.50h0.01 M48.42,84.55h0.01 M24.21,85.57h0.01 M62.11,86.09h0.01 M81.05,86.34h0.01 M40.53,86.47h0.01 M20.26,86.54h0.01 M60.13,86.57h0.01 M30.07,86.58h0.01 M40.03,43.29h0.01 M45.02,21.65h0.01 M22.51,54.12h0.01 M11.25,70.36h0.01 M5.63,78.48h0.01 M2.81,82.54h0.01 M26.41,41.27h0.01 M38.20,20.64h0.01 M69.10,53.62h0.01 M59.55,26.81h0.01 M79.78,56.70h0.01 M64.89,28.35h0.01 M57.44,14.18h0.01 M53.72,7.09h0.01 M51.86,3.54h0.01 M75.93,45.07h0.01 M62.97,22.54h0.01 M56.48,11.27h0.01 M53.24,5.63h0.01 M76.62,46.12h0.01 M88.31,66.36h0.01 M69.16,33.18h0.01 M34.58,59.89h0.01 M67.29,73.24h0.01 M83.64,79.92h0.01 M91.82,83.26h0.01 M95.91,84.93h0.01 M97.96,85.77h0.01 M48.98,86.18h0.01 M49.49,43.09h0.01 M49.74,21.55h0.01 M49.87,10.77h0.01 M24.94,48.69h0.01 M62.47,67.64h0.01 M81.23,77.12h0.01 M40.62,81.86h0.01 M70.31,84.23h0.01 M85.15,85.42h0.01 M92.58,86.01h0.01 M46.29,86.30h0.01 M23.14,86.45h0.01 M11.57,86.53h0.01 M5.79,86.56h0.01 M27.89,43.28h0.01 M38.95,21.64h0.01 M19.47,54.12h0.01 M59.74,70.36h0.01 M54.87,35.18h0.01 M27.43,60.89h0.01 M63.72,73.75h0.01 M56.86,36.87h0.01 M53.43,18.44h0.01 M26.71,52.52h0.01 M63.36,69.56h0.01 M81.68,78.08h0.01 M90.84,82.34h0.01 M70.42,41.17h0.01 M35.21,63.88h0.01 M67.60,75.24h0.01 M58.80,37.62h0.01 M54.40,18.81h0.01 M52.20,9.41h0.01 M26.10,48.00h0.01 M63.05,67.30h0.01 M56.53,33.65h0.01 M78.26,60.13h0.01 M89.13,73.36h0.01 M69.57,36.68h0.01 M34.78,61.64h0.01 M17.39,74.12h0.01 M33.70,37.06h0.01 M41.85,18.53h0.01 M20.92,52.57h0.01 M10.46,69.58h0.01 M5.23,78.09h0.01 M27.62,39.05h0.01 M38.81,19.52h0.01 M19.40,53.06h0.01 M59.70,69.83h0.01 M79.85,78.22h0.01 M89.93,82.41h0.01 M69.96,41.20h0.01 M34.98,63.90h0.01 M17.49,75.25h0.01 M58.75,80.93h0.01 M29.37,83.76h0.01 M64.69,85.18h0.01 M82.34,85.89h0.01 M41.17,86.25h0.01 M45.59,43.12h0.01 M22.79,64.86h0.01 M11.40,75.73h0.01 M5.70,81.17h0.01 M52.85,83.88h0.01 M76.42,85.24h0.01 M63.21,42.62h0.01 M31.61,64.61h0.01 M65.80,75.61h0.01 M32.90,81.10h0.01 M66.45,83.85h0.01 M58.23,41.93h0.01 M29.11,64.26h0.01 M14.56,75.43h0.01 M32.28,37.72h0.01 M41.14,18.86h0.01 M20.57,52.73h0.01 M10.28,69.66h0.01 M5.14,78.13h0.01 M27.57,39.07h0.01 M63.79,62.83h0.01 M81.89,74.72h0.01 M40.95,80.66h0.01 M70.47,83.63h0.01 M35.24,85.11h0.01 M42.62,42.56h0.01 M21.31,64.58h0.01 M10.65,75.59h0.01 M55.33,81.09h0.01 M27.66,83.85h0.01 M13.83,85.22h0.01 M6.92,85.91h0.01 M53.46,86.26h0.01 M51.73,43.13h0.01 M50.86,21.56h0.01 M25.43,54.08h0.01 M12.72,70.34h0.01 M6.36,78.47h0.01 M53.18,82.54h0.01 M76.59,84.57h0.01 M38.29,85.58h0.01 M69.15,86.09h0.01 M84.57,86.35h0.01 M67.29,43.17h0.01 M33.64,64.89h0.01 M66.82,75.74h0.01 M58.41,37.87h0.01 M29.21,62.24h0.01 M14.60,74.42h0.01 M7.30,80.51h0.01 M53.65,83.55h0.01 M51.83,41.78h0.01 M50.91,20.89h0.01 M25.46,53.74h0.01 M37.73,26.87h0.01 M68.86,56.74h0.01 M59.43,28.37h0.01 M79.72,57.48h0.01 M39.86,72.04h0.01 M19.93,79.32h0.01 M34.96,39.66h0.01 M67.48,63.13h0.01 M58.74,31.57h0.01 M79.37,59.08h0.01 M64.69,29.54h0.01 M57.34,14.77h0.01 M78.67,50.69h0.01 M39.34,68.64h0.01 M44.67,34.32h0.01 M47.33,17.16h0.01 M48.67,8.58h0.01 M49.33,4.29h0.01 M74.67,45.45h0.01 M37.33,66.02h0.01 M68.67,76.31h0.01 M59.33,38.16h0.01 M79.67,62.38h0.01 M39.83,74.49h0.01 M44.92,37.24h0.01 M72.46,61.92h0.01 M86.23,74.26h0.01 M43.11,80.43h0.01 M21.56,83.52h0.01 M10.78,85.06h0.01 M55.39,85.83h0.01 M27.69,86.21h0.01 M63.85,86.41h0.01 M56.92,43.20h0.01 M53.46,21.60h0.01 M26.73,54.10h0.01 M38.37,27.05h0.01 M19.18,56.83h0.01 M9.59,71.71h0.01 M54.80,79.16h0.01 M77.40,82.88h0.01 M38.70,84.74h0.01 M19.35,85.67h0.01 M59.67,86.13h0.01 M79.84,86.37h0.01 M64.92,43.18h0.01 M32.46,64.89h0.01 M66.23,75.75h0.01 M58.11,37.87h0.01 M29.06,62.24h0.01 M39.53,31.12h0.01 M69.76,58.86h0.01 M34.88,72.73h0.01 M42.44,36.36h0.01 M46.22,18.18h0.01 M48.11,9.09h0.01 M24.06,47.85h0.01 M12.03,67.22h0.01 M6.01,76.91h0.01 M53.01,81.76h0.01 M76.50,84.18h0.01 M38.25,85.39h0.01 M19.13,85.99h0.01 M34.56,43.00h0.01 M17.28,64.80h0.01 M33.64,32.40h0.01 M66.82,59.50h0.01 M33.41,73.05h0.01 M16.71,79.82h0.01 M58.35,83.21h0.01 M54.18,41.61h0.01 M52.09,20.80h0.01 M76.04,53.70h0.01 M63.02,26.85h0.01 M56.51,13.43h0.01 M53.26,6.71h0.01 M51.63,3.36h0.01 M50.81,1.68h0.01 M75.41,44.14h0.01 M87.70,65.37h0.01 M43.85,75.98h0.01 M46.93,37.99h0.01 M48.46,19.00h0.01 M49.23,9.50h0.01 M74.62,48.05h0.01 M62.31,24.02h0.01 M56.15,12.01h0.01 M78.08,49.31h0.01 M89.04,67.95h0.01 M44.52,77.28h0.01 M47.26,38.64h0.01 M73.63,62.62h0.01 M86.81,74.61h0.01 M93.41,80.60h0.01 M71.70,40.30h0.01 M60.85,20.15h0.01 M55.43,10.08h0.01 M27.71,48.34h0.01 M13.86,67.47h0.01 M56.93,77.03h0.01 M78.46,81.82h0.01 M39.23,84.21h0.01 M44.62,42.10h0.01 M22.31,64.35h0.01 M11.15,75.48h0.01 M5.58,81.04h0.01 M52.79,83.82h0.01 M76.39,85.21h0.01 M63.20,42.60h0.01 M56.60,21.30h0.01 M53.30,10.65h0.01 M26.65,48.63h0.01 M63.32,67.61h0.01 M31.66,77.11h0.01 M65.83,81.85h0.01 M57.92,40.93h0.01 M78.96,63.76h0.01 M89.48,75.18h0.01 M69.74,37.59h0.01 M34.87,62.10h0.01 M42.43,31.05h0.01 M46.22,15.52h0.01 M23.11,51.06h0.01 M11.55,68.83h0.01 M30.78,34.42h0.01 M15.39,60.51h0.01 M7.69,73.55h0.01 M3.85,80.08h0.01 M26.92,40.04h0.01 M63.46,63.32h0.01 M56.73,31.66h0.01 M28.37,59.13h0.01 M64.18,72.86h0.01 M82.09,79.73h0.01 M91.05,83.17h0.01 M95.52,84.88h0.01 M47.76,85.74h0.01 M48.88,42.87h0.01 M24.44,64.74h0.01 M62.22,75.67h0.01 M81.11,81.13h0.01 M90.56,83.87h0.01 M45.28,85.23h0.01 M22.64,85.92h0.01 M61.32,86.26h0.01 M55.66,43.13h0.01 M27.83,64.86h0.01 M63.91,75.73h0.01 M56.96,37.87h0.01 M78.48,62.23h0.01 M89.24,74.42h0.01 M44.62,80.51h0.01 M22.31,83.55h0.01 M61.15,85.08h0.01 M55.58,42.54h0.01 M77.79,64.57h0.01 M38.89,75.58h0.01 M19.45,81.09h0.01 M59.72,83.85h0.01 M79.86,85.22h0.01 M89.93,85.91h0.01 M44.97,86.26h0.01 M22.48,86.43h0.01 M36.24,43.21h0.01 M43.12,21.61h0.01 M46.56,10.80h0.01 M23.28,48.70h0.01 M36.64,24.35h0.01 M68.32,55.48h0.01 M34.16,71.04h0.01 M17.08,78.82h0.01 M8.54,82.71h0.01 M29.27,41.35h0.01 M14.64,63.98h0.01 M57.32,75.29h0.01 M28.66,80.94h0.01 M64.33,83.77h0.01 M32.16,85.19h0.01 M41.08,42.59h0.01 M20.54,64.60h0.01 M60.27,75.60h0.01 M30.14,81.10h0.01 M65.07,83.85h0.01 M57.53,41.92h0.01 M28.77,64.26h0.01 M64.38,75.43h0.01 M82.19,81.02h0.01 M91.10,83.81h0.01 M95.55,85.20h0.01 M72.77,42.60h0.01 M36.39,64.60h0.01 M68.19,75.60h0.01 M59.10,37.80h0.01 M54.55,18.90h0.01 M27.27,52.75h0.01 M38.64,26.38h0.01 M44.32,13.19h0.01 M47.16,6.59h0.01 M48.58,3.30h0.01 M74.29,44.95h0.01 M87.14,65.77h0.01 M93.57,76.19h0.01 M46.79,81.39h0.01 M48.39,40.70h0.01 M24.20,63.65h0.01 M37.10,31.82h0.01 M43.55,15.91h0.01 M21.77,51.26h0.01 M10.89,68.93h0.01 M30.44,34.46h0.01 M40.22,17.23h0.01 M45.11,8.62h0.01 M72.56,47.61h0.01 M36.28,67.10h0.01 M68.14,76.85h0.01 M34.07,81.73h0.01 M42.03,40.86h0.01 M46.02,20.43h0.01 M48.01,10.22h0.01 M74.00,48.41h0.01 M62.00,24.20h0.01 M81.00,55.40h0.01 M40.50,71.00h0.01 M70.25,78.80h0.01 M35.13,82.70h0.01 M67.56,84.65h0.01 M58.78,42.33h0.01 M79.39,64.46h0.01 M39.70,75.53h0.01 M44.85,37.77h0.01 M72.42,62.18h0.01 M86.21,74.39h0.01 M68.11,37.20h0.01 M59.05,18.60h0.01 M79.53,52.60h0.01 M39.76,69.60h0.01 M44.88,34.80h0.01 M47.44,17.40h0.01 M73.72,52.00h0.01 M61.86,26.00h0.01 M80.93,56.30h0.01 M90.47,71.45h0.01 M95.23,79.02h0.01 M97.62,82.81h0.01 M98.81,84.71h0.01 M49.40,85.65h0.01 M74.70,86.13h0.01 M87.35,86.36h0.01 M43.68,86.48h0.01 M46.84,43.24h0.01 M73.42,64.92h0.01 M61.71,32.46h0.01 M55.85,16.23h0.01 M52.93,8.12h0.01 M26.46,47.36h0.01 M13.23,66.98h0.01 M31.62,33.49h0.01 M15.81,60.04h0.01 M57.90,73.32h0.01 M53.95,36.66h0.01 M51.98,18.33h0.01 M50.99,9.17h0.01 M25.49,47.88h0.01 M12.75,67.24h0.01 M31.37,33.62h0.01 M65.69,60.11h0.01 M32.84,73.36h0.01 M66.42,79.98h0.01 M58.21,39.99h0.01 M54.11,19.99h0.01 M52.05,10.00h0.01 M26.03,48.30h0.01 M63.01,67.45h0.01 M81.51,77.02h0.01 M65.75,38.51h0.01 M57.88,19.26h0.01 M28.94,52.93h0.01 M14.47,69.76h0.01 M7.23,78.18h0.01 M28.62,39.09h0.01 M64.31,62.85h0.01 M57.15,31.42h0.01 M28.58,59.01h0.01 M14.29,72.81h0.01 M7.14,79.70h0.01 M3.57,83.15h0.01 M51.79,84.88h0.01 M50.89,42.44h0.01 M50.45,21.22h0.01 M75.22,53.91h0.01 M37.61,70.25h0.01 M68.81,78.43h0.01 M34.40,82.51h0.01 M17.20,84.56h0.01 M33.60,42.28h0.01 M66.80,64.44h0.01 M58.40,32.22h0.01 M29.20,59.41h0.01 M64.60,73.00h0.01 M57.30,36.50h0.01 M53.65,18.25h0.01 M26.83,52.43h0.01 M13.41,69.51h0.01 M56.71,78.06h0.01 M53.35,39.03h0.01 M76.68,62.81h0.01 M38.34,74.71h0.01 M69.17,80.65h0.01 M59.58,40.33h0.01 M79.79,63.46h0.01 M89.90,75.03h0.01 M94.95,80.82h0.01 M97.47,83.71h0.01 M48.74,85.15h0.01 M74.37,85.88h0.01 M62.18,42.94h0.01 M81.09,64.77h0.01 M65.55,32.38h0.01 M57.77,16.19h0.01 M28.89,51.40h0.01 M14.44,69.00h0.01 M32.22,34.50h0.01 M66.11,60.55h0.01 M33.06,73.57h0.01 M16.53,80.09h0.01 M8.26,83.34h0.01 M54.13,84.97h0.01 M27.07,85.79h0.01 M63.53,86.19h0.01 M81.77,86.40h0.01 M40.88,86.50h0.01 M20.44,86.55h0.01 M35.22,43.27h0.01 M42.61,21.64h0.01 M71.31,54.12h0.01 M60.65,27.06h0.01 M55.33,13.53h0.01 M77.66,50.06h0.01 M38.83,68.33h0.01 M69.42,77.47h0.01 M84.71,82.03h0.01 M42.35,84.32h0.01 M21.18,85.46h0.01 M35.59,42.73h0.01 M67.79,64.66h0.01 M83.90,75.63h0.01 M41.95,81.12h0.01 M45.97,40.56h0.01 M47.99,20.28h0.01 M23.99,53.44h0.01 M62.00,70.02h0.01 M56.00,35.01h0.01 M28.00,60.80h0.01 M64.00,73.70h0.01 M32.00,80.15h0.01 M41.00,40.08h0.01 M45.50,20.04h0.01 M47.75,10.02h0.01 M48.87,5.01h0.01 M24.44,45.80h0.01 M12.22,66.20h0.01 M56.11,76.40h0.01 M78.05,81.50h0.01 M64.03,40.75h0.01 M82.01,63.68h0.01 M91.01,75.14h0.01 M45.50,80.87h0.01 M47.75,40.43h0.01 M48.88,20.22h0.01 M24.44,53.41h0.01 M62.22,70.00h0.01 M56.11,35.00h0.01 M78.05,60.80h0.01 M64.03,30.40h0.01 M57.01,15.20h0.01 M78.51,50.90h0.01 M64.25,25.45h0.01 M32.13,56.03h0.01 M66.06,71.31h0.01 M83.03,78.96h0.01 M91.52,82.78h0.01 M45.76,84.69h0.01 M47.88,42.34h0.01 M48.94,21.17h0.01 M74.47,53.89h0.01 M87.23,70.24h0.01 M43.62,78.42h0.01 M46.81,39.21h0.01 M73.40,62.91h0.01 M86.70,74.75h0.01 M43.35,80.68h0.01 M21.68,83.64h0.01 M60.84,85.12h0.01 M80.42,85.86h0.01 M90.21,86.23h0.01 M45.10,86.41h0.01 M72.55,86.51h0.01 M36.28,86.55h0.01 M43.14,43.28h0.01 M21.57,64.94h0.01 M60.78,75.77h0.01 M55.39,37.88h0.01 M27.70,62.24h0.01 M13.85,74.42h0.01 M56.92,80.51h0.01 M78.46,83.56h0.01 M89.23,85.08h0.01 M44.62,85.84h0.01 M22.31,86.22h0.01 M11.15,86.41h0.01 M30.58,43.20h0.01 M15.29,64.90h0.01 M57.64,75.75h0.01 M28.82,81.18h0.01 M14.41,83.89h0.01 M57.21,85.24h0.01 M53.60,42.62h0.01 M51.80,21.31h0.01 M50.90,10.66h0.01 M25.45,48.63h0.01 M12.73,67.61h0.01 M31.36,33.81h0.01 M65.68,60.20h0.01 M57.84,30.10h0.01 M78.92,58.35h0.01 M64.46,29.18h0.01 M32.23,57.89h0.01 M41.12,28.94h0.01 M45.56,14.47h0.01 M72.78,50.54h0.01 M36.39,68.57h0.01 M43.19,34.28h0.01 M21.60,60.44h0.01 M35.80,30.22h0.01 M67.90,58.41h0.01 M58.95,29.21h0.01 M54.47,14.60h0.01 M27.24,50.60h0.01 M38.62,25.30h0.01 M19.31,55.95h0.01 M59.65,71.28h0.01 M29.83,78.94h0.01 M39.91,39.47h0.01 M44.96,19.73h0.01 M72.48,53.17h0.01 M61.24,26.58h0.01 M55.62,13.29h0.01 M52.81,6.65h0.01 M51.40,3.32h0.01 M75.70,44.96h0.01 M37.85,65.78h0.01 M43.93,32.89h0.01 M46.96,16.45h0.01 M23.48,51.52h0.01 M11.74,69.06h0.01 M5.87,77.83h0.01 M2.94,82.22h0.01 M51.47,84.41h0.01 M50.73,42.20h0.01 M50.37,21.10h0.01 M25.18,53.85h0.01 M62.59,70.23h0.01 M81.30,78.41h0.01 M40.65,82.51h0.01 M20.32,84.55h0.01 M10.16,85.58h0.01 M55.08,86.09h0.01 M77.54,86.34h0.01 M88.77,86.47h0.01 M94.39,86.54h0.01 M97.19,86.57h0.01 M48.60,86.58h0.01 M24.30,86.59h0.01 M62.15,86.60h0.01 M81.07,86.60h0.01 M65.54,43.30h0.01 M82.77,64.95h0.01 M41.38,75.77h0.01 M45.69,37.89h0.01 M22.85,62.24h0.01 M36.42,31.12h0.01 M68.21,58.86h0.01 M59.11,29.43h0.01 M54.55,14.72h0.01 M77.28,50.66h0.01 M88.64,68.63h0.01 M94.32,77.61h0.01 M72.16,38.81h0.01 M36.08,62.70h0.01 M18.04,74.65h0.01 M34.02,37.33h0.01 M67.01,61.96h0.01 M58.50,30.98h0.01 M54.25,15.49h0.01 M27.13,51.05h0.01 M63.56,68.82h0.01 M31.78,77.71h0.01 M40.89,38.86h0.01 M45.45,19.43h0.01 M47.72,9.71h0.01 M48.86,4.86h0.01 M74.43,45.73h0.01 M62.22,22.86h0.01 M31.11,54.73h0.01 M65.55,70.67h0.01 M82.78,78.63h0.01 M41.39,82.62h0.01 M20.69,84.61h0.01 M60.35,85.60h0.01 M80.17,86.10h0.01 M65.09,43.05h0.01 M82.54,64.83h0.01 M41.27,75.71h0.01 M45.64,37.86h0.01 M47.82,18.93h0.01 M73.91,52.76h0.01 M61.95,26.38h0.01 M55.98,13.19h0.01 M27.99,49.90h0.01 M63.99,68.25h0.01 M57.00,34.12h0.01 M78.50,60.36h0.01 M39.25,73.48h0.01 M19.62,80.04h0.01 M9.81,83.32h0.01 M29.91,41.66h0.01 M14.95,64.13h0.01 M7.48,75.37h0.01 M53.74,80.98h0.01 M51.87,40.49h0.01 M50.93,20.25h0.01 M75.47,53.42h0.01 M62.73,26.71h0.01 M81.37,56.66h0.01 M90.68,71.63h0.01 M95.34,79.11h0.01 M47.67,82.86h0.01 M23.84,84.73h0.01 M61.92,85.66h0.01 M30.96,86.13h0.01 M40.48,43.07h0.01 M20.24,64.83h0.01 M60.12,75.72h0.01 M55.06,37.86h0.01 M52.53,18.93h0.01 M26.26,52.76h0.01 M63.13,69.68h0.01 M31.57,78.14h0.01 M65.78,82.37h0.01 M82.89,84.49h0.01 M91.45,85.54h0.01 M95.72,86.07h0.01 M72.86,43.04h0.01 M86.43,64.82h0.01 M93.22,75.71h0.01 M71.61,37.85h0.01 M85.80,62.23h0.01 M92.90,74.41h0.01 M96.45,80.51h0.01 M98.23,83.55h0.01 M99.11,85.08h0.01 M49.56,85.84h0.01 M49.78,42.92h0.01 M49.89,21.46h0.01 M74.94,54.03h0.01 M37.47,70.31h0.01 M18.74,78.46h0.01 M34.37,39.23h0.01 M17.18,62.91h0.01 M33.59,31.46h0.01 M66.80,59.03h0.01 M83.40,72.81h0.01 M66.70,36.41h0.01 M58.35,18.20h0.01 M54.17,9.10h0.01 M52.09,4.55h0.01 M76.04,45.58h0.01 M63.02,22.79h0.01 M31.51,54.69h0.01 M40.76,27.35h0.01 M20.38,56.97h0.01 M35.19,28.49h0.01 M42.59,14.24h0.01 M21.30,50.42h0.01 M60.65,68.51h0.01 M80.32,77.56h0.01 M40.16,82.08h0.01 M45.08,41.04h0.01 M47.54,20.52h0.01 M23.77,53.56h0.01 M11.89,70.08h0.01 M55.94,78.34h0.01 M52.97,39.17h0.01 M76.49,62.88h0.01 M63.24,31.44h0.01 M31.62,59.02h0.01 M15.81,72.81h0.01 M7.91,79.71h0.01 M53.95,83.15h0.01 M26.98,84.88h0.01 M38.49,42.44h0.01 M44.24,21.22h0.01 M47.12,10.61h0.01 M48.56,5.30h0.01 M74.28,45.95h0.01 M37.14,66.28h0.01 M18.57,76.44h0.01 M59.29,81.52h0.01 M29.64,84.06h0.01 M39.82,42.03h0.01 M69.91,64.31h0.01 M34.96,75.46h0.01 M17.48,81.03h0.01 M58.74,83.81h0.01 M79.37,85.21h0.01 M64.68,42.60h0.01 M57.34,21.30h0.01 M78.67,53.95h0.01 M39.34,70.28h0.01 M19.67,78.44h0.01 M9.83,82.52h0.01 M4.92,84.56h0.01 M2.46,85.58h0.01 M26.23,42.79h0.01 M38.11,21.39h0.01 M44.06,10.70h0.01 M72.03,48.65h0.01 M36.01,67.62h0.01 M68.01,77.11h0.01 M59.00,38.56h0.01 M29.50,62.58h0.01 M39.75,31.29h0.01 M69.88,58.94h0.01 M84.94,72.77h0.01 M92.47,79.69h0.01 M71.23,39.84h0.01 M35.62,63.22h0.01 M42.81,31.61h0.01 M71.40,59.11h0.01 M85.70,72.85h0.01 M42.85,79.73h0.01 M21.43,83.16h0.01 M60.71,84.88h0.01 M55.36,42.44h0.01 M52.68,21.22h0.01 M51.34,10.61h0.01 M50.67,5.31h0.01 M25.33,45.95h0.01 M37.67,22.98h0.01 M43.83,11.49h0.01 M71.92,49.04h0.01 M85.96,67.82h0.01 M92.98,77.21h0.01 M96.49,81.91h0.01 M98.24,84.25h0.01 M74.12,42.13h0.01 M62.06,21.06h0.01 M31.03,53.83h0.01 M40.52,26.92h0.01 M45.26,13.46h0.01 M22.63,50.03h0.01 M61.31,68.31h0.01 M55.66,34.16h0.01 M77.83,60.38h0.01 M88.91,73.49h0.01 M69.46,36.74h0.01 M59.73,18.37h0.01 M29.86,52.49h0.01 M64.93,69.54h0.01 M82.47,78.07h0.01 M66.23,39.04h0.01 M58.12,19.52h0.01 M29.06,53.06h0.01 M39.53,26.53h0.01 M44.76,13.26h0.01 M22.38,49.93h0.01 M11.19,68.27h0.01 M30.60,34.13h0.01 M15.30,60.37h0.01 M32.65,30.18h0.01 M16.32,58.39h0.01 M8.16,72.50h0.01 M29.08,36.25h0.01 M64.54,61.42h0.01 M82.27,74.01h0.01 M66.14,37.01h0.01 M58.07,18.50h0.01 M54.03,9.25h0.01 M77.02,47.93h0.01 M88.51,67.26h0.01 M44.25,76.93h0.01 M72.13,81.77h0.01 M36.06,84.18h0.01 M43.03,42.09h0.01 M21.52,64.35h0.01 M10.76,75.47h0.01 M55.38,81.04h0.01 M27.69,83.82h0.01 M63.84,85.21h0.01 M31.92,85.90h0.01 M65.96,86.25h0.01 M32.98,86.43h0.01 M41.49,43.21h0.01 M20.75,64.91h0.01 M35.37,32.45h0.01 M67.69,59.53h0.01 M83.84,73.06h0.01 M41.92,79.83h0.01 M45.96,39.92h0.01 M47.98,19.96h0.01 M23.99,53.28h0.01 M62.00,69.94h0.01 M31.00,78.27h0.01 M40.50,39.13h0.01 M20.25,62.87h0.01 M10.12,74.73h0.01 M55.06,80.67h0.01 M27.53,83.63h0.01 M63.77,85.12h0.01 M81.88,85.86h0.01 M40.94,86.23h0.01 M45.47,43.11h0.01 M47.74,21.56h0.01 M48.87,10.78h0.01 M74.43,48.69h0.01 M87.22,67.64h0.01 M68.61,33.82h0.01 M59.30,16.91h0.01 M29.65,51.76h0.01 M14.83,69.18h0.01 M7.41,77.89h0.01 M28.71,38.94h0.01 M14.35,62.77h0.01 M7.18,74.69h0.01 M28.59,37.34h0.01 M14.29,61.97h0.01 M32.15,30.99h0.01 M16.07,58.79h0.01 M58.04,72.70h0.01 M79.02,79.65h0.01 M64.51,39.82h0.01 M32.25,63.21h0.01 M66.13,74.91h0.01 M33.06,80.75h0.01 M41.53,40.38h0.01 M45.77,20.19h0.01 M72.88,53.39h0.01 M86.44,70.00h0.01 M68.22,35.00h0.01 M84.11,60.80h0.01 M92.06,73.70h0.01 M96.03,80.15h0.01 M98.01,83.37h0.01 M49.01,84.99h0.01 M49.50,42.49h0.01 M49.75,21.25h0.01 M24.88,53.92h0.01 M12.44,70.26h0.01 M56.22,78.43h0.01 M78.11,82.52h0.01 M64.05,41.26h0.01 M57.03,20.63h0.01 M53.51,10.31h0.01 M51.76,5.16h0.01 M25.88,45.88h0.01 M12.94,66.24h0.01 M6.47,76.42h0.01 M3.23,81.51h0.01 M51.62,84.05h0.01 M50.81,42.03h0.01 M25.40,64.31h0.01 M12.70,75.46h0.01 M56.35,81.03h0.01 M78.18,83.81h0.01 M89.09,85.21h0.01 M69.54,42.60h0.01 M84.77,64.60h0.01 M67.39,32.30h0.01 M33.69,59.45h0.01 M16.85,73.03h0.01 M33.42,36.51h0.01 M16.71,61.56h0.01 M8.36,74.08h0.01 M54.18,80.34h0.01 M77.09,83.47h0.01 M88.54,85.03h0.01 M44.27,85.82h0.01 M72.14,86.21h0.01 M61.07,43.10h0.01 M55.53,21.55h0.01 M77.77,54.08h0.01 M38.88,70.34h0.01 M44.44,35.17h0.01 M47.22,17.58h0.01 M23.61,52.09h0.01 M36.81,26.05h0.01 M68.40,56.32h0.01 M34.20,71.46h0.01 M42.10,35.73h0.01 M21.05,61.17h0.01 M10.53,73.88h0.01 M30.26,36.94h0.01 M40.13,18.47h0.01 M70.07,52.54h0.01 M35.03,69.57h0.01 M17.52,78.08h0.01 M58.76,82.34h0.01 M29.38,84.47h0.01 M14.69,85.54h0.01 M7.34,86.07h0.01 M3.67,86.33h0.01 M1.84,86.47h0.01 M25.92,43.23h0.01 M37.96,21.62h0.01 M18.98,54.11h0.01 M34.49,27.05h0.01 M42.24,13.53h0.01 M46.12,6.76h0.01 M48.06,3.38h0.01 M49.03,1.69h0.01 M24.52,44.15h0.01 M37.26,22.07h0.01 M68.63,54.34h0.01 M34.31,70.47h0.01 M42.16,35.23h0.01 M71.08,60.92h0.01 M85.54,73.76h0.01 M92.77,80.18h0.01 M71.38,40.09h0.01 M35.69,63.34h0.01 M17.85,74.97h0.01 M58.92,80.79h0.01 M54.46,40.39h0.01 M77.23,63.50h0.01 M38.62,75.05h0.01 M44.31,37.52h0.01 M72.15,62.06h0.01 M36.08,74.33h0.01 M68.04,80.47h0.01 M84.02,83.53h0.01 M92.01,85.07h0.01 M71.00,42.53h0.01 M60.50,21.27h0.01 M80.25,53.93h0.01 M40.13,70.27h0.01 M45.06,35.13h0.01 M47.53,17.57h0.01 M48.77,8.78h0.01 M49.38,4.39h0.01 M24.69,45.50h0.01 M37.35,22.75h0.01 M43.67,11.37h0.01 M21.84,48.99h0.01 M35.92,24.49h0.01 M17.96,55.55h0.01 M58.98,71.07h0.01 M29.49,78.84h0.01 M39.74,39.42h0.01 M44.87,19.71h0.01 M22.44,53.15h0.01 M11.22,69.88h0.01 M5.61,78.24h0.01 M27.80,39.12h0.01 M13.90,62.86h0.01 M56.95,74.73h0.01 M53.48,37.36h0.01 M26.74,61.98h0.01 M63.37,74.29h0.01 M31.68,80.45h0.01 M15.84,83.52h0.01 M7.92,85.06h0.01 M28.96,42.53h0.01 M64.48,64.57h0.01 M57.24,32.28h0.01 M53.62,16.14h0.01 M76.81,51.37h0.01 M88.41,68.99h0.01 M69.20,34.49h0.01 M34.60,60.55h0.01 M67.30,73.57h0.01 M33.65,80.09h0.01 M16.83,83.34h0.01 M8.41,84.97h0.01 M29.21,42.49h0.01 M14.60,64.54h0.01 M7.30,75.57h0.01 M28.65,37.79h0.01 M14.33,62.19h0.01 M57.16,74.40h0.01 M53.58,37.20h0.01 M51.79,18.60h0.01 M50.90,9.30h0.01 M50.45,4.65h0.01 M25.22,45.62h0.01 M12.61,66.11h0.01 M56.31,76.36h0.01 M28.15,81.48h0.01 M64.08,84.04h0.01 M57.04,42.02h0.01 M28.52,64.31h0.01 M14.26,75.45h0.01 M57.13,81.03h0.01 M53.56,40.51h0.01 M26.78,63.56h0.01 M13.39,75.08h0.01 M31.70,37.54h0.01 M65.85,62.07h0.01 M82.92,74.33h0.01 M91.46,80.47h0.01 M70.73,40.23h0.01 M85.37,63.42h0.01 M92.68,75.01h0.01 M46.34,80.80h0.01 M48.17,40.40h0.01 M24.09,63.50h0.01 M12.04,75.05h0.01 M56.02,80.83h0.01 M53.01,40.41h0.01 M76.51,63.51h0.01 M63.25,31.75h0.01 M81.63,59.18h0.01 M65.81,29.59h0.01 M32.91,58.09h0.01 M16.45,72.35h0.01 M33.23,36.17h0.01 M41.61,18.09h0.01 M45.81,9.04h0.01 M22.90,47.82h0.01 M36.45,23.91h0.01 M43.23,11.96h0.01 M21.61,49.28h0.01 M35.81,24.64h0.01 M42.90,12.32h0.01 M71.45,49.46h0.01 M60.73,24.73h0.01 M55.36,12.36h0.01 M27.68,49.48h0.01 M38.84,24.74h0.01 M19.42,55.67h0.01 M9.71,71.14h0.01 M54.86,78.87h0.01 M27.43,82.73h0.01 M13.71,84.67h0.01 M31.86,42.33h0.01 M15.93,64.47h0.01 M32.96,32.23h0.01 M16.48,59.42h0.01 M33.24,29.71h0.01 M41.62,14.85h0.01 M20.81,50.73h0.01 M60.41,68.66h0.01 M55.20,34.33h0.01 M52.60,17.17h0.01 M26.30,51.88h0.01 M63.15,69.24h0.01 M31.58,77.92h0.01 M65.79,82.26h0.01 M82.89,84.43h0.01 M41.45,85.52h0.01 M20.72,86.06h0.01 M35.36,43.03h0.01 M17.68,64.81h0.01 M33.84,32.41h0.01 M41.92,16.20h0.01 M45.96,8.10h0.01 M72.98,47.35h0.01 M36.49,66.98h0.01 M18.25,76.79h0.01 M9.12,81.69h0.01 M4.56,84.15h0.01 M52.28,85.37h0.01 M26.14,85.99h0.01 M63.07,86.29h0.01 M81.54,86.45h0.01 M40.77,86.52h0.01 M20.38,86.56h0.01 M10.19,86.58h0.01 M5.10,86.59h0.01 M2.55,86.60h0.01 M26.27,43.30h0.01 M63.14,64.95h0.01 M81.57,75.77h0.01 M90.78,81.19h0.01 M95.39,83.89h0.01 M47.70,85.25h0.01 M48.85,42.62h0.01 M24.42,64.61h0.01 M37.21,32.31h0.01 M68.61,59.45h0.01 M59.30,29.73h0.01 M54.65,14.86h0.01 M77.33,50.73h0.01 M88.66,68.67h0.01 M44.33,77.63h0.01 M47.17,38.82h0.01 M73.58,62.71h0.01 M36.79,74.65h0.01 M43.40,37.33h0.01 M71.70,61.96h0.01 M85.85,74.28h0.01 M42.92,80.44h0.01 M46.46,40.22h0.01 M23.23,63.41h0.01 M11.62,75.01h0.01 M5.81,80.80h0.01 M27.90,40.40h0.01 M63.95,63.50h0.01 M31.98,75.05h0.01 M15.99,80.83h0.01 M57.99,83.71h0.01 M29.00,85.16h0.01 M64.50,85.88h0.01 M57.25,42.94h0.01 M28.62,64.77h0.01 M39.31,32.38h0.01 M19.66,59.49h0.01 M34.83,29.75h0.01 M17.41,58.17h0.01 M58.71,72.39h0.01 M79.35,79.49h0.01 M89.68,83.05h0.01 M94.84,84.82h0.01 M72.42,42.41h0.01 M36.21,64.51h0.01 M68.10,75.55h0.01 M34.05,81.08h0.01 M67.03,83.84h0.01 M33.51,85.22h0.01 M66.76,85.91h0.01 M33.38,86.25h0.01 M16.69,86.43h0.01 M33.34,43.21h0.01 M16.67,64.91h0.01 M58.34,75.75h0.01 M79.17,81.18h0.01 M89.58,83.89h0.01 M69.79,41.94h0.01 M84.90,64.27h0.01 M42.45,75.44h0.01 M21.22,81.02h0.01 M35.61,40.51h0.01 M67.81,63.55h0.01 M58.90,31.78h0.01 M79.45,59.19h0.01 M89.73,72.89h0.01 M44.86,79.75h0.01 M47.43,39.87h0.01 M23.72,63.24h0.01 M11.86,74.92h0.01 M55.93,80.76h0.01 M77.96,83.68h0.01 M88.98,85.14h0.01 M69.49,42.57h0.01 M59.75,21.28h0.01 M79.87,53.94h0.01 M89.94,70.27h0.01 M94.97,78.44h0.01 M97.48,82.52h0.01 M48.74,84.56h0.01 M74.37,85.58h0.01 M87.19,86.09h0.01 M93.59,86.34h0.01 M96.80,86.47h0.01 M73.40,43.24h0.01 M36.70,64.92h0.01 M43.35,32.46h0.01 M46.67,16.23h0.01 M48.34,8.11h0.01 M74.17,47.36h0.01 M37.08,66.98h0.01 M68.54,76.79h0.01 M84.27,81.69h0.01 M67.14,40.85h0.01 M58.57,20.42h0.01 M79.28,53.51h0.01 M64.64,26.76h0.01 M57.32,13.38h0.01 M28.66,49.99h0.01 M39.33,24.99h0.01 M44.67,12.50h0.01 M72.33,49.55h0.01 M86.17,68.07h0.01 M68.08,34.04h0.01 M59.04,17.02h0.01 M79.52,51.81h0.01 M64.76,25.90h0.01 M82.38,56.25h0.01 M91.19,71.43h0.01 M95.60,79.01h0.01 M97.80,82.81h0.01 M48.90,84.70h0.01 M24.45,85.65h0.01 M62.22,86.13h0.01 M31.11,86.36h0.01 M15.56,86.48h0.01 M7.78,86.54h0.01 M3.89,86.57h0.01 M26.94,43.29h0.01 M38.47,21.64h0.01 M19.24,54.12h0.01 M9.62,70.36h0.01 M54.81,78.48h0.01 M27.40,82.54h0.01 M38.70,41.27h0.01 M44.35,20.64h0.01 M22.18,53.62h0.01 M36.09,26.81h0.01 M68.04,56.70h0.01" stroke-linecap="round" stroke-width="0.7" style="fill:none;stroke:var(--ink);"></path></svg><div class="screenplay"><p class="action">Four thousand, and there it is, and there is no drawing of any kind anywhere in it. Nobody told it to make triangles. It was told to take half of what was left and look again, four thousand times, and the shape is what is left when you do that for long enough.</p><p class="action">The first version had four dots in the middle where the middle is supposed to be empty, and he sat with that for most of an hour before working out that they were the first four, from before it had got where it was going. He throws away the first dozen. He does not throw away the hour.</p></div><div><script type="application/x-scittle">(ns fedoras.sketch
"Editable ClojureScript that draws.
The live cells elsewhere in the book evaluate an expression and print
what it returned, which is fine for a list and useless for a picture.
A sketch cell gives the code a canvas and five things to draw with,
and then gets out of the way: what the reader edits is the same
algorithm that ran on the JVM at build time, in the same language,
and it runs in front of them.
What the page provides, and the scene says so out loud because Reyes
said it in class:
(clear!) wipe it
(ink! \"#1c1f24\") colour
(dot x y) one mark, in world coordinates
(poly [[x y] ...]) a closed outline
(frames! total per f) call (f i) total times, per of them a frame
Nothing else is injected. Everything above the fold in the cell is
the reader's.
WHERE THE CODE IS. All of it is here, in one file read twice. The
build reads the :clj half, which writes the markup and, for each cell,
a header binding the short names to that cell's own canvas or piece of
page. The page reads the :cljs half, because the build ships this file
to it as it stands: the drawing kit the headers call, and the runner
behind every Run button."
#?(:clj (:require [clojure.string :as str]
[fedoras.state :as state]
[scicloj.kindly.v4.kind :as kind])))
;; ---------------------------------------------------------------------
;; The build: headers and markup
;; ---------------------------------------------------------------------
#?(:clj
(do
(defn canvas-header
"The short names a sketch cell may use, bound to its own canvas.
Built as Clojure forms rather than as a string, so it cannot be
unbalanced and can be read back and printed."
[id world-w world-h]
[(list 'def 'C (list 'fedoras.sketch/mount id world-w world-h))
'(def cv (:cv C))
'(def ctx (:ctx C))
'(def CW (:cw C))
'(def CH (:ch C))
'(def SX (:sx C))
'(def SY (:sy C))
'(defn clear! [] (fedoras.sketch/clear! C))
'(defn ink! [c] (fedoras.sketch/ink! C c))
'(defn dot ([x y] (fedoras.sketch/dot C x y)) ([x y s] (fedoras.sketch/dot C x y s)))
'(defn poly [pts] (fedoras.sketch/poly C pts))
'(defn frames! [total per f] (fedoras.sketch/frames! C total per f))
'(defn on-pointer! [f] (fedoras.sketch/on-pointer! C f))
'(def page-ink (fedoras.sketch/page-ink C))
'(clear!)
'(ink! page-ink)
'(fedoras.sketch/line-width! C 0.8)])
(defn page-header
"The names a page cell may use. No canvas: a piece of the page."
[id]
[(list 'def 'root (list '.getElementById 'js/document (str id "-out")))
'(defn html! [s] (set! (.-innerHTML root) s))
'(defn on! [id f]
(let [e (.getElementById js/document id)]
(when e (set! (.-onclick e) (fn [_] (f))))))
'(defn fetch [k]
(try
(let [v (.getItem js/localStorage (str "fedoras." k))]
(when v (read-string v)))
(catch :default _ nil)))
'(defn store! [k v]
(try (.setItem js/localStorage (str "fedoras." k) (pr-str v))
(catch :default _ nil))
v)])
(defn- header-text [forms]
(str/join "\n" (map pr-str (cons '(in-ns 'fedoras.sketch-runner) forms))))
(defn primitives
"What the page hands a cell, printed, so that nothing in the book is
doing something the reader cannot look at."
([] (primitives 100 100))
([world-w world-h]
(kind/code (header-text (canvas-header "the-page" world-w world-h)))))
(defn cell
"An editable ClojureScript sketch with a canvas under it.
(sketch/cell {:id \"chaos\" :label \"CHAOS.CLJS\" :world [100 86.6]}
\"(dot 50 40)\")"
[{:keys [id label world w h rows]
:or {id "sketch" world [100 100] w 420 h 380 rows 16}}
code]
(let [[ww wh] world]
(kind/hiccup
[:div
(state/source "fedoras/sketch.cljc")
[:div.sketch {:id id}
[:div.roll-head
[:span.roll-label (or label "SKETCH")]
[:span.roll-dc (str ww " × " wh)]]
[:textarea {:id (str id "-src") :class "live-src" :rows rows :spellcheck "false"}
(str/trim code)]
[:div.live-bar
[:button.live-run "Run"]]
[:canvas {:id (str id "-canvas") :width w :height h}]
[:pre {:id (str id "-out") :class "live-out"}]]
(state/call 'fedoras.sketch/cell! id (header-text (canvas-header id ww wh)))])))
(defn page
"An editable ClojureScript cell with a piece of page under it instead
of a canvas. The header gives the code five things:
root the div it owns
(html! s) put markup in it
(on! id f) wire a click
(fetch k) read something the reader saved
(store! k v) save something, and it is still there tomorrow
Everything else in the cell belongs to the reader."
[{:keys [id label rows] :or {id "page" rows 20}} code]
(kind/hiccup
[:div
(state/source "fedoras/sketch.cljc")
[:div.sketch {:id id}
[:div.roll-head
[:span.roll-label (or label "PAGE")]
[:span.roll-dc "cljs"]]
[:textarea {:id (str id "-src") :class "live-src" :rows rows :spellcheck "false"}
(str/trim code)]
[:div.live-bar
[:button.live-run "Run"]]
[:div {:id (str id "-out") :class "sketch-page"}]
[:pre {:id (str id "-res") :class "live-out"}]]
(state/call 'fedoras.sketch/cell! id (header-text (page-header id)))]))))
;; ---------------------------------------------------------------------
;; The page: the drawing kit and the runner
;; ---------------------------------------------------------------------
#?(:cljs
(do
(defonce counters
(atom {}))
(defn- counters-for
"The frame counters of one canvas: made the first time it is mounted
and kept for every Run after, so that each press of Run takes the
next number and the loop the last press started sees it and stops."
[id]
(or (get @counters id)
(let [made {:run (atom 0) :i (atom 0)}]
(swap! counters assoc id made)
made)))
(defn mount
"Everything one cell needs, from the id of its canvas and the size of
the world it draws in. Every drawing function below takes the map
this returns."
[id world-w world-h]
(let [cv (.getElementById js/document (str id "-canvas"))
ctx (.getContext cv "2d")
cw (.-width cv)
ch (.-height cv)]
(merge {:cv cv :ctx ctx :cw cw :ch ch
:sx (/ cw world-w)
:sy (/ ch world-h)}
(counters-for id))))
(defn ink!
"Both fill and stroke, because a cell that sets one and not the other
is a cell that draws in two colours by accident."
[{:keys [ctx]} colour]
(set! (.-fillStyle ctx) colour)
(set! (.-strokeStyle ctx) colour))
(defn page-ink
"Whatever colour the surrounding prose is, so a drawing belongs to the
page it is on and follows it into dark mode."
[{:keys [cv]}]
(.-color (js/getComputedStyle cv)))
(defn clear! [{:keys [ctx cw ch]}]
(.clearRect ctx 0 0 cw ch))
(defn dot
([c x y] (dot c x y 1.2))
([{:keys [ctx sx sy ch]} x y size]
(.fillRect ctx (* x sx) (- ch (* y sy)) size size)))
(defn poly
"A closed outline through the points, in world coordinates."
[{:keys [ctx sx sy ch]} pts]
(when (seq pts)
(let [[fx fy] (first pts)]
(.beginPath ctx)
(.moveTo ctx (* fx sx) (- ch (* fy sy)))
(doseq [[x y] (rest pts)]
(.lineTo ctx (* x sx) (- ch (* y sy))))
(.closePath ctx)
(.stroke ctx))))
(defn line-width! [{:keys [ctx]} w]
(set! (.-lineWidth ctx) w))
(defn- tick! [{:keys [run i] :as c} generation total per f]
(when (= generation @run)
(dotimes [_ per]
(when (< @i total) (f @i) (swap! i inc)))
(when (< @i total)
(js/requestAnimationFrame (fn [] (tick! c generation total per f)))))
nil)
(defn frames!
"Call (f i) total times, per of them per frame.
Pressing Run again retires the loop that is already going. Without
that, a cell run twice advances twice per frame and looks broken in a
way nobody can debug from the outside."
[{:keys [run i] :as c} total per f]
(let [generation (swap! run inc)]
(reset! i 0)
(tick! c generation total per f))
nil)
(defn on-pointer!
"Pointer position in world coordinates, which is what a cell wants and
never what the event gives it."
[{:keys [cv sx sy]} f]
(set! (.-onmousemove cv)
(fn [e]
(f (/ (.-offsetX e) sx)
(- (/ (.-height cv) sy) (/ (.-offsetY e) sy))))))
(defonce headers
(atom {}))
(defn- element
[id]
(.getElementById js/document id))
(defn- line-count
[text]
(count (re-seq #"\n" text)))
(defn- error-text
"An error as the reader should see it: the message, and the line of
their own code it came from, when there is one."
[error header-lines]
(let [line (:line (ex-data error))]
(str (or (ex-message error) (str error))
(when (and line (> line header-lines))
(str " (line " (- line header-lines) ")")))))
(defn run-cell!
"Cell `id`'s header, then the reader's code, with what came back
printed under the cell, or the error, counted in the reader's lines."
[id]
(let [header (get @headers id)
out (or (element (str id "-res")) (element (str id "-out")))
source (.-value (element (str id "-src")))]
(set! (.-textContent out)
(try
;; load-string is Scittle's own; plain ClojureScript has none
(let [value #_{:clj-kondo/ignore [:unresolved-symbol]} (load-string (str header "\n" source))]
(if (nil? value) "" (str value)))
(catch :default error
(error-text error (inc (line-count header))))))))
(defn- prepare-canvas!
"Give a sketch cell's canvas its drawing context while the page
loads, so that the first Run draws on a canvas the browser has
already shown once. A context made at the moment of the first
drawing loses that drawing in Firefox: the first frames of the
first Run never appear."
[id]
(when-let [cv (element (str id "-canvas"))]
(.clearRect (.getContext cv "2d") 0 0 (.-width cv) (.-height cv))))
(defn cell!
"Keep cell `id`'s header and wire its Run button, and the first time
the cell is seen, prepare its canvas, if it has one. Only the first
time, because preparing clears, and a canvas that is already drawing
must not be cleared under it."
[id header]
(let [first-time? (not (contains? @headers id))]
(swap! headers assoc id header)
(when-let [button (some-> (element id) (.querySelector ".live-run"))]
(set! (.-onclick button) (fn [_] (run-cell! id))))
(when first-time?
(prepare-canvas! id))))))</script><div class="sketch" id="chaos"><div class="roll-head"><span class="roll-label">CHAOS.CLJS</span><span class="roll-dc">100 × 86.6</span></div><textarea class="live-src" id="chaos-src" rows="16" spellcheck="false">(def corners [[0 0] [100 0] [50 86.6]])
(defn halfway [[x1 y1] [x2 y2]]
[(/ (+ x1 x2) 2) (/ (+ y1 y2) 2)])
(def here (atom [50 40]))
;; 4000 dots, 40 of them a frame
(frames! 4000 40
(fn [i]
(swap! here halfway (rand-nth corners))
(when (> i 12)
(dot (first @here) (second @here)))))</textarea><div class="live-bar"><button class="live-run">Run</button></div><canvas height="380" id="chaos-canvas" width="420"></canvas><pre class="live-out" id="chaos-out"></pre></div><script type="application/x-scittle">(if-let [mount (resolve (quote fedoras.sketch/cell!))] (mount "chaos" "(in-ns (quote fedoras.sketch-runner))\n(def C (fedoras.sketch/mount \"chaos\" 100 86.6))\n(def cv (:cv C))\n(def ctx (:ctx C))\n(def CW (:cw C))\n(def CH (:ch C))\n(def SX (:sx C))\n(def SY (:sy C))\n(defn clear! [] (fedoras.sketch/clear! C))\n(defn ink! [c] (fedoras.sketch/ink! C c))\n(defn dot ([x y] (fedoras.sketch/dot C x y)) ([x y s] (fedoras.sketch/dot C x y s)))\n(defn poly [pts] (fedoras.sketch/poly C pts))\n(defn frames! [total per f] (fedoras.sketch/frames! C total per f))\n(defn on-pointer! [f] (fedoras.sketch/on-pointer! C f))\n(def page-ink (fedoras.sketch/page-ink C))\n(clear!)\n(ink! page-ink)\n(fedoras.sketch/line-width! C 0.8)") (js/console.error "fedoras: fedoras.sketch/cell! is not on this page. Either the file that declares it was never shipped, or the namespace inside it does not match the path it was shipped from."))</script></div><div class="artifact discord"><div class="discord-head"><span class="discord-server">FEDORA SOCIETY</span><span class="discord-channel">#general</span></div><div class="discord-body"><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></span></span><span class="discord-at">11:58 PM</span></p><div class="discord-text"><p><span>got the dots one</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Miles</span></span><span class="discord-at">11:59 PM</span></p><div class="discord-text"><p><span>what was it</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></span></span><span class="discord-at">12:00 AM</span></p><div class="discord-text"><p><span>you go half way to a corner. then half way to another corner</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Derek</span></span><span class="discord-at">12:01 AM</span></p><div class="discord-text"><p><span>and that makes a shape?</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></span></span><span class="discord-at">12:01 AM</span></p><div class="discord-text"><p><span>yeah</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Derek</span></span><span class="discord-at">12:02 AM</span></p><div class="discord-text"><p><span>why</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></span></span><span class="discord-at">12:09 AM</span></p><div class="discord-text"><p><span>idk</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span><span class="pc-name" data-case="pc" data-pc="-first">Owen</span></span></span><span class="discord-at">12:14 AM</span></p><div class="discord-text"><p><span>does anyone know a Bell. football. number 30</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Miles</span></span><span class="discord-at">12:31 AM</span></p><div class="discord-text"><p><span>no</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Derek</span></span><span class="discord-at">12:33 AM</span></p><div class="discord-text"><p><span>no</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Simon</span></span><span class="discord-at">1:02 AM</span></p><div class="discord-text"><p><span>no but i know what youre doing</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Simon</span></span><span class="discord-at">1:02 AM</span></p><div class="discord-text"><p><span>ive got two of them</span></p></div></div><div class="discord-msg"><p class="discord-meta"><span class="discord-who"><span>Victor</span></span><span class="discord-role">PRESIDENT</span><span class="discord-at">8:00 AM</span></p><div class="discord-text"><p><span>Order is what is left when you stop interfering. It's the</span></p><p><span>oldest result there is and they don't teach it because of</span></p><p><span>what it implies.</span></p><p><span>Well done. Bring it Thursday.</span></p></div></div></div></div></div>
```