From 2090e8902c65753d3b47de2ee561e3ea16499bfc Mon Sep 17 00:00:00 2001 From: Tim Evans Date: Wed, 17 Jun 2026 11:24:14 +0100 Subject: [PATCH] Blueprint News: engine-agnostic SLA BPN briefing generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reusable framework-free component (core generation engine, seeded procedural SVG art, render layer) plus a standalone app built on it. Produces two separate surfaces per briefing — Player Brief and GM Dossier — in the SLA house style with bundled local fonts. Per-band procedural artwork, deterministic from seed. NPC/monster generation left to a future companion module via a clean seam. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 + README.md | 90 +++++ app/app.css | 216 ++++++++++++ app/app.js | 212 ++++++++++++ art/bpn-art.js | 337 +++++++++++++++++++ assets/fonts/fonts-google.css | 270 +++++++++++++++ assets/fonts/fonts.css | 22 ++ assets/fonts/g-joefinan-0.woff2 | Bin 0 -> 21292 bytes assets/fonts/g-joefinan-1.woff2 | Bin 0 -> 8584 bytes assets/fonts/g-joefinan-2.woff2 | Bin 0 -> 28528 bytes assets/fonts/g-robotomono-3.woff2 | Bin 0 -> 10308 bytes assets/fonts/g-robotomono-4.woff2 | Bin 0 -> 22916 bytes assets/fonts/g-robotomono-5.woff2 | Bin 0 -> 35912 bytes assets/fonts/g-robotomono-6.woff2 | Bin 0 -> 14044 bytes assets/fonts/g-robotomono-7.woff2 | Bin 0 -> 32796 bytes assets/fonts/g-robotomono-8.woff2 | Bin 0 -> 18592 bytes assets/fonts/modesto-condensed-bold.woff2 | Bin 0 -> 20604 bytes assets/fonts/modesto-condensed.woff2 | Bin 0 -> 21712 bytes core/bpn-core.js | 319 ++++++++++++++++++ core/data/colours.js | 156 +++++++++ core/data/frames.js | 362 ++++++++++++++++++++ core/data/tables.js | 208 ++++++++++++ index.html | 86 +++++ render/bpn-render.css | 387 ++++++++++++++++++++++ render/bpn-render.js | 206 ++++++++++++ 25 files changed, 2874 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/app.css create mode 100644 app/app.js create mode 100644 art/bpn-art.js create mode 100644 assets/fonts/fonts-google.css create mode 100644 assets/fonts/fonts.css create mode 100644 assets/fonts/g-joefinan-0.woff2 create mode 100644 assets/fonts/g-joefinan-1.woff2 create mode 100644 assets/fonts/g-joefinan-2.woff2 create mode 100644 assets/fonts/g-robotomono-3.woff2 create mode 100644 assets/fonts/g-robotomono-4.woff2 create mode 100644 assets/fonts/g-robotomono-5.woff2 create mode 100644 assets/fonts/g-robotomono-6.woff2 create mode 100644 assets/fonts/g-robotomono-7.woff2 create mode 100644 assets/fonts/g-robotomono-8.woff2 create mode 100644 assets/fonts/modesto-condensed-bold.woff2 create mode 100644 assets/fonts/modesto-condensed.woff2 create mode 100644 core/bpn-core.js create mode 100644 core/data/colours.js create mode 100644 core/data/frames.js create mode 100644 core/data/tables.js create mode 100644 index.html create mode 100644 render/bpn-render.css create mode 100644 render/bpn-render.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f75d22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +.claude/ +node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..9cfab30 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# Blueprint News + +An engine-agnostic generator for SLA Industries **BPN** (Blue Print News) mission +briefings. It produces two clearly separated surfaces from one briefing: + +- **Player Brief** — the official corporate dispatch the squad is allowed to see. +- **GM Dossier** — the handler-only truth: the twist, the withheld fact, the real + threat read, the levers, and the dice state. + +Every briefing is reproducible from a short **seed**, which also drives the +**procedural SVG artwork** — flat, stencil/propaganda SLA styling, never +photorealistic. Fonts are bundled locally, so it looks identical offline. + +It deliberately owns **no game-engine schema**. NPC and monster *generation* are +left to companion modules; each briefing reserves a clean hand-off seam +(`npcSeam`) carrying archetype keys only. + +## Run the app + +No build step. Serve the folder over HTTP (ES modules need it) and open it: + +```bash +python3 -m http.server 8778 +# then open http://localhost:8778/index.html +``` + +The app: pick a colour band / scenario frame (or leave on *Any* to roll), +**Generate**, toggle **Player / GM / Both**, **Save** to a local library, +**Print** (clean print stylesheet) or **Export HTML** (self-contained file). + +## Architecture — a component, plus an app built on it + +The reusable component is three framework-free ES-module layers with no DOM or +engine dependencies in the core: + +``` +core/ generation engine (pure, deterministic) + bpn-core.js generateBPN(opts) -> resolved BPN object; randomSeed() + data/colours.js the 10 colour bands + d20 issue table + data/frames.js hand-authored scenario frames (with npcSeam hints) + data/tables.js generic SLA flavour tables +art/ + bpn-art.js seeded procedural SVG: crestSVG(), bannerSVG() +render/ + bpn-render.js briefHTML() / dossierHTML() + mount helpers + bpn-render.css the SLA-styled, responsive, print-ready stylesheet +assets/fonts/ bundled Josefin Sans, Roboto Mono, Modesto Condensed +app/ the standalone generator UI (consumes the above) +index.html +``` + +### Using the component in another engine + +```js +import { generateBPN } from "./core/bpn-core.js"; +import { briefHTML, dossierHTML } from "./render/bpn-render.js"; + +const bpn = generateBPN({ seed: "BPN-1A2B-3C4D", colourKey: "red" }); +host.innerHTML = `
${briefHTML(bpn)}
`; // player-facing +gmPanel.innerHTML = `
${dossierHTML(bpn)}
`; // GM-only +``` + +Include `render/bpn-render.css` and `assets/fonts/fonts.css` in the host. The +markup is plain HTML/SVG scoped under `.bpn`, so it drops into a Foundry journal +page, a website, or an Electron app unchanged. + +`generateBPN(opts)` accepts: `seed`, `colourKey`, `frameId`, `squadSize`, and an +`overrides` object to pin any individual field. Same inputs → identical output, +art included. + +### The NPC / monster seam + +Each briefing exposes `bpn.npcSeam = { contactArchetype, threatArchetype, +threatRole }` — archetype keys only, no stats. A future NPC/monster module reads +these to spin up cast members in whatever engine it targets, without this module +ever importing that engine's actor schema. The GM Dossier surfaces the seam +explicitly so the handler knows which cast slots are reserved. + +## Colour bands + +Blue · Yellow · Green · White · Grey · Silver · Jade · Red · Black · Platinum — +each with its own classification, SCL requirement, CBS pay band, media posture, +and render accent. See `core/data/colours.js`. + +## Provenance + +Rebuilt from the strongest parts of the earlier Foundry-bound experiments +(`sla-bpn-dispatch`'s mission engine and player/GM split, the `sla-bpn-toolkit` +data, `sla-briefing-desk`'s output pattern), with every engine call removed and +the real SLA house fonts and palette applied. diff --git a/app/app.css b/app/app.css new file mode 100644 index 0000000..8423e75 --- /dev/null +++ b/app/app.css @@ -0,0 +1,216 @@ +/* Blueprint News — standalone app chrome. + The briefing itself is styled by render/bpn-render.css; this only dresses + the surrounding generator UI (control rail, stage, library) in the same + SLA palette and fonts. */ + +:root { + --bg: #0a0e14; + --rail: #11161f; + --rail-2: #161c26; + --line: #2c333f; + --text: #eef3fa; + --muted: #9fb0c4; + --gold: #d6b24e; + --gold-deep: #b88a24; + --accent: #d05e1a; + --display: "Modesto Condensed", "Josefin Sans", sans-serif; + --head: "Josefin Sans", system-ui, sans-serif; + --mono: "Roboto Mono", ui-monospace, monospace; +} + +* { box-sizing: border-box; } + +html, body { + margin: 0; + min-height: 100%; + background: + radial-gradient(circle at 18% -10%, rgba(208, 94, 26, 0.10), transparent 40%), + linear-gradient(180deg, #0b0f16, #070a0f); + color: var(--text); + font-family: var(--head); + font-size: 16px; +} + +.app { + display: grid; + grid-template-columns: 320px 1fr; + min-height: 100vh; +} + +/* ---------- top wordmark bar ---------- */ +.topbar { + grid-column: 1 / -1; + display: flex; + align-items: center; + gap: 14px; + padding: 12px 22px; + border-bottom: 1px solid var(--line); + background: linear-gradient(180deg, #11161f, #0c1017); +} +.topbar__mark { + font-family: var(--display); + font-weight: 700; + font-size: 1.9rem; + letter-spacing: 0.04em; + text-transform: uppercase; + line-height: 1; +} +.topbar__mark b { color: var(--gold); } +.topbar__tag { + font-family: var(--mono); + font-size: 0.72rem; + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--muted); +} +.topbar__spacer { flex: 1; } +.topbar__hint { font-family: var(--mono); font-size: 0.7rem; color: var(--muted); letter-spacing: 0.08em; } + +/* ---------- control rail ---------- */ +.rail { + border-right: 1px solid var(--line); + background: var(--rail); + padding: 18px; + display: flex; + flex-direction: column; + gap: 16px; + overflow-y: auto; + max-height: calc(100vh - 58px); +} + +.field { display: grid; gap: 6px; } +.field > label { + font-family: var(--mono); + font-size: 0.7rem; + letter-spacing: 0.16em; + text-transform: uppercase; + color: var(--muted); +} +.field input, .field select { + width: 100%; + padding: 9px 11px; + border-radius: 8px; + border: 1px solid var(--line); + background: #0a0e14; + color: var(--text); + font-family: var(--head); + font-size: 0.96rem; +} +.field input:focus, .field select:focus { outline: none; border-color: var(--gold); } +.field--row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } + +.seed-row { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: end; } +.seed-row input { font-family: var(--mono); font-size: 0.86rem; } + +.btn { + border-radius: 8px; + border: 1px solid var(--line); + background: var(--rail-2); + color: var(--text); + font-family: var(--head); + font-weight: 600; + letter-spacing: 0.03em; + padding: 10px 14px; + cursor: pointer; + transition: filter 0.12s, border-color 0.12s; +} +.btn:hover { filter: brightness(1.12); border-color: var(--muted); } +.btn--primary { + border: 1px solid var(--gold-deep); + background: linear-gradient(180deg, var(--gold), var(--gold-deep)); + color: #1a1208; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.06em; +} +.btn--ghost { background: transparent; } +.btn--sm { padding: 8px 10px; font-size: 0.82rem; } +.btn-row { display: flex; gap: 8px; flex-wrap: wrap; } + +.rail__divider { height: 1px; background: var(--line); margin: 2px 0; } +.rail__heading { + font-family: var(--mono); + font-size: 0.7rem; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--gold); + margin: 0; +} + +/* library */ +.library { display: grid; gap: 8px; } +.lib-item { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 8px; + padding: 9px 11px; + border-radius: 8px; + border: 1px solid var(--line); + background: #0a0e14; +} +.lib-item__main { min-width: 0; cursor: pointer; } +.lib-item__title { + font-family: var(--head); + font-weight: 600; + font-size: 0.92rem; + white-space: nowrap; overflow: hidden; text-overflow: ellipsis; +} +.lib-item__meta { font-family: var(--mono); font-size: 0.68rem; color: var(--muted); } +.lib-item__band { + display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 6px; vertical-align: middle; +} +.lib-del { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 1rem; padding: 4px 6px; border-radius: 6px; } +.lib-del:hover { color: var(--danger, #ff5b5b); background: rgba(255,91,91,0.1); } +.lib-empty { font-family: var(--mono); font-size: 0.74rem; color: var(--muted); } + +/* ---------- stage ---------- */ +.stage { + padding: 22px; + overflow-y: auto; + max-height: calc(100vh - 58px); +} + +.viewtoggle { + display: inline-flex; + border: 1px solid var(--line); + border-radius: 999px; + padding: 3px; + margin: 0 auto 18px; + background: var(--rail); + gap: 2px; +} +.viewtoggle button { + border: none; + background: transparent; + color: var(--muted); + font-family: var(--mono); + font-size: 0.74rem; + letter-spacing: 0.12em; + text-transform: uppercase; + padding: 7px 16px; + border-radius: 999px; + cursor: pointer; +} +.viewtoggle button[aria-pressed="true"] { + background: linear-gradient(180deg, var(--gold), var(--gold-deep)); + color: #1a1208; + font-weight: 700; +} +.stage__bar { display: flex; justify-content: center; align-items: center; gap: 14px; flex-wrap: wrap; } + +.output { display: grid; gap: 26px; } + +/* ---------- responsive ---------- */ +@media (max-width: 860px) { + .app { grid-template-columns: 1fr; } + .rail { max-height: none; border-right: none; border-bottom: 1px solid var(--line); } + .stage { max-height: none; } + .topbar__tag, .topbar__hint { display: none; } +} + +@media print { + .topbar, .rail, .stage__bar { display: none !important; } + .app { display: block; } + .stage { padding: 0; max-height: none; overflow: visible; } +} diff --git a/app/app.js b/app/app.js new file mode 100644 index 0000000..34a696e --- /dev/null +++ b/app/app.js @@ -0,0 +1,212 @@ +/* Blueprint News — standalone app. + Thin UI layer over the engine-agnostic component (core + render + art). + Generates briefings, toggles Player / GM / Both, keeps a local library, + and prints / exports. No build step, no dependencies. */ + +import { generateBPN, randomSeed } from "../core/bpn-core.js"; +import { COLOURS } from "../core/data/colours.js"; +import { framesForColour } from "../core/data/frames.js"; +import { renderBrief, renderDossier, renderBoth, briefHTML, dossierHTML } from "../render/bpn-render.js"; + +const LIB_KEY = "bpn-library-v1"; + +const el = { + colour: document.getElementById("f-colour"), + frame: document.getElementById("f-frame"), + squad: document.getElementById("f-squad"), + payment: document.getElementById("f-payment"), + seed: document.getElementById("f-seed"), + generate: document.getElementById("btn-generate"), + reroll: document.getElementById("btn-reroll"), + useSeed: document.getElementById("btn-use-seed"), + copySeed: document.getElementById("btn-copy-seed"), + save: document.getElementById("btn-save"), + print: document.getElementById("btn-print"), + exportHtml: document.getElementById("btn-export"), + library: document.getElementById("library"), + output: document.getElementById("output"), + viewBtns: Array.from(document.querySelectorAll("[data-view]")) +}; + +let current = null; +let view = "player"; + +/* ---------- control population ---------- */ + +function populateColours() { + el.colour.innerHTML = + `` + + COLOURS.map((c) => ``).join(""); +} + +function populateFrames() { + const key = el.colour.value; + if (!key) { + el.frame.innerHTML = ``; + el.frame.disabled = true; + return; + } + el.frame.disabled = false; + el.frame.innerHTML = + `` + + framesForColour(key).map((f) => ``).join(""); +} + +/* ---------- generation ---------- */ + +function optsFromControls(seed) { + return { + seed, + colourKey: el.colour.value || undefined, + frameId: el.frame.value || undefined, + squadSize: Number(el.squad.value) || 4, + overrides: { + paymentType: el.payment.value || "__RANDOM__" + } + }; +} + +function generate(opts) { + current = generateBPN(opts); + el.seed.value = current.seed; + // reflect the resolved band/frame back into the controls + el.colour.value = current.colourKey; + populateFrames(); + el.frame.value = current.gm.frameId || ""; + draw(); +} + +function draw() { + el.output.classList.add("bpn"); + if (!current) return; + if (view === "player") renderBrief(current, el.output); + else if (view === "gm") renderDossier(current, el.output); + else renderBoth(current, el.output); +} + +/* ---------- library ---------- */ + +function loadLibrary() { + try { return JSON.parse(localStorage.getItem(LIB_KEY)) || []; } + catch { return []; } +} + +function saveLibrary(list) { + localStorage.setItem(LIB_KEY, JSON.stringify(list)); +} + +function renderLibrary() { + const list = loadLibrary(); + if (!list.length) { + el.library.innerHTML = `

No saved briefings yet.

`; + return; + } + el.library.innerHTML = list.map((item, i) => { + const band = COLOURS.find((c) => c.key === item.colourKey); + return `
+
+
${escapeAttr(item.label)}
+
${escapeAttr(item.colourKey)} · ${escapeAttr(item.seed)}
+
+ +
`; + }).join(""); +} + +function escapeAttr(s) { + return String(s ?? "").replace(/[<>&"]/g, (c) => ({ "<": "<", ">": ">", "&": "&", '"': """ }[c])); +} + +function saveCurrent() { + if (!current) return; + const list = loadLibrary(); + const item = { + seed: current.seed, + colourKey: current.colourKey, + frameId: current.gm.frameId, + squadSize: current.squadSize, + paymentType: current.reward.paymentType, + label: `${current.colour.label} BPN — ${current.shortTitle}` + }; + // de-dupe by seed + const without = list.filter((x) => x.seed !== item.seed); + without.unshift(item); + saveLibrary(without.slice(0, 60)); + renderLibrary(); +} + +function loadItem(item) { + el.colour.value = item.colourKey || ""; + populateFrames(); + el.frame.value = item.frameId || ""; + el.squad.value = item.squadSize || 4; + el.payment.value = item.paymentType || ""; + generate({ + seed: item.seed, + colourKey: item.colourKey, + frameId: item.frameId, + squadSize: item.squadSize, + overrides: { paymentType: item.paymentType || "__RANDOM__" } + }); +} + +/* ---------- export ---------- */ + +function exportHtml() { + if (!current) return; + const css = document.getElementById("link-render").href; + const fonts = document.getElementById("link-fonts").href; + const doc = ` + +${escapeAttr(current.colour.label)} BPN — ${escapeAttr(current.shortTitle)} + + + +
${briefHTML(current)}${dossierHTML(current)}
`; + const blob = new Blob([doc], { type: "text/html" }); + const a = document.createElement("a"); + a.href = URL.createObjectURL(blob); + a.download = `${current.seed}-${current.colourKey}.html`; + a.click(); + URL.revokeObjectURL(a.href); +} + +/* ---------- wiring ---------- */ + +function setView(next) { + view = next; + el.viewBtns.forEach((b) => b.setAttribute("aria-pressed", String(b.dataset.view === next))); + draw(); +} + +el.colour.addEventListener("change", populateFrames); +el.generate.addEventListener("click", () => generate(optsFromControls(randomSeed()))); +el.reroll.addEventListener("click", () => generate(optsFromControls(randomSeed()))); +el.useSeed.addEventListener("click", () => generate(optsFromControls(el.seed.value.trim() || randomSeed()))); +el.copySeed.addEventListener("click", async () => { + try { await navigator.clipboard.writeText(el.seed.value); el.copySeed.textContent = "Copied"; setTimeout(() => (el.copySeed.textContent = "Copy"), 1200); } catch {} +}); +el.save.addEventListener("click", saveCurrent); +el.print.addEventListener("click", () => window.print()); +el.exportHtml.addEventListener("click", exportHtml); +el.viewBtns.forEach((b) => b.addEventListener("click", () => setView(b.dataset.view))); + +el.library.addEventListener("click", (e) => { + const del = e.target.closest("[data-del]"); + const load = e.target.closest("[data-load]"); + if (del) { + const list = loadLibrary(); + list.splice(Number(del.dataset.del), 1); + saveLibrary(list); + renderLibrary(); + } else if (load) { + loadItem(loadLibrary()[Number(load.dataset.load)]); + } +}); + +/* ---------- boot ---------- */ +populateColours(); +populateFrames(); +renderLibrary(); +setView("player"); +generate(optsFromControls(randomSeed())); diff --git a/art/bpn-art.js b/art/bpn-art.js new file mode 100644 index 0000000..c3f33c7 --- /dev/null +++ b/art/bpn-art.js @@ -0,0 +1,337 @@ +/* Blueprint News — procedural SVG artwork. + * + * Flat, graphic, stencil/propaganda-poster styling: hard angles, heavy blacks, + * a single colour-band accent, halftone and scanline textures. Deliberately + * NOT photorealistic. All shapes derive from the BPN seed, so a given briefing + * always renders the same art while every briefing differs. + * + * Each colour band gets its own SCENE — a foreground motif (sewer arch, transit + * concourse, perimeter wall, vault corridor, …) plus tuned atmosphere and + * lighting — so a Blue street job and a Black covert op never look alike. + * + * No DOM and no engine APIs — each function returns an SVG markup string. + */ + +/* --- seeded rng (local copy so art is usable standalone) ----------------- */ + +function hashSeed(str) { + let h = 2166136261 >>> 0; + const s = String(str); + for (let i = 0; i < s.length; i++) { + h ^= s.charCodeAt(i); + h = Math.imul(h, 16777619); + } + return h >>> 0; +} + +function mulberry32(a) { + return function () { + a |= 0; + a = (a + 0x6d2b79f5) | 0; + let t = Math.imul(a ^ (a >>> 15), 1 | a); + t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +function rngFor(seed, salt) { + return mulberry32(hashSeed(`${seed}::${salt}`)); +} + +const rint = (rng, lo, hi) => Math.floor(rng() * (hi - lo + 1)) + lo; +const rfloat = (rng, lo, hi) => rng() * (hi - lo) + lo; +const r2 = (n) => Math.round(n * 100) / 100; + +/* --- colour helpers ------------------------------------------------------ */ + +function hexToRgb(hex) { + const h = String(hex || "#dce8f9").replace("#", ""); + const n = h.length === 3 ? h.split("").map((c) => c + c).join("") : h; + return { r: parseInt(n.slice(0, 2), 16), g: parseInt(n.slice(2, 4), 16), b: parseInt(n.slice(4, 6), 16) }; +} + +function mix(hex, withHex, t) { + const a = hexToRgb(hex); + const b = hexToRgb(withHex); + const c = (k) => Math.round(a[k] + (b[k] - a[k]) * t); + return `rgb(${c("r")},${c("g")},${c("b")})`; +} + +function rgba(hex, alpha) { + const { r, g, b } = hexToRgb(hex); + return `rgba(${r},${g},${b},${alpha})`; +} + +/* --- per-band scene definitions ----------------------------------------- */ +/* motif: which foreground silhouette to draw. + rain/smog/crowd: atmospheric layer. floodlights/beacons: lighting. + density: building/back-skyline busyness (0 sparse … 1 dense). */ +const SCENES = { + blue: { motif: "tunnel", rain: 0.8, smog: 0, crowd: 0, floodlights: false, beacons: false, density: 0.5 }, + yellow: { motif: "transit", rain: 0, smog: 0.2, crowd: 0.9, floodlights: false, beacons: false, density: 0.7 }, + green: { motif: "wall", rain: 0.5, smog: 0.1, crowd: 0, floodlights: true, beacons: false, density: 0.5 }, + white: { motif: "cordon", rain: 0.2, smog: 0.1, crowd: 0, floodlights: false, beacons: false, density: 0.6 }, + grey: { motif: "gantry", rain: 0, smog: 0.6, crowd: 0, floodlights: false, beacons: false, density: 0.8 }, + silver: { motif: "stage", rain: 0, smog: 0, crowd: 0.7, floodlights: true, beacons: false, density: 0.6 }, + jade: { motif: "canal", rain: 0.3, smog: 0.8, crowd: 0, floodlights: false, beacons: false, density: 0.5 }, + red: { motif: "tower", rain: 0.6, smog: 0.3, crowd: 0, floodlights: true, beacons: true, density: 0.7 }, + black: { motif: "vault", rain: 0, smog: 0, crowd: 0, floodlights: false, beacons: false, density: 0.2 }, + platinum: { motif: "exec", rain: 0, smog: 0.1, crowd: 0, floodlights: false, beacons: false, density: 0.3 } +}; + +/* Mission-focus glyph drawn inside the crest pupil. */ +function focusGlyph(focus = "", accent = "#fff") { + const f = String(focus).toLowerCase(); + const stroke = `stroke="${accent}" stroke-width="3.5" fill="none" stroke-linecap="round" stroke-linejoin="round"`; + if (f.includes("eliminate") || f.includes("hunt") || f.includes("kill")) return ``; + if (f.includes("escort") || f.includes("protect")) return ``; + if (f.includes("retrieve")) return ``; + if (f.includes("investigate") || f.includes("profile")) return ``; + if (f.includes("contain") || f.includes("quarantine")) return ``; + if (f.includes("riot") || f.includes("crowd")) return ``; + return ``; +} + +/* ------------------------------------------------------------------------ */ +/* CREST — the BPN sigil. */ +/* ------------------------------------------------------------------------ */ + +export function crestSVG(bpn, { size = 128 } = {}) { + const accent = bpn?.colour?.accent ?? "#dce8f9"; + const seed = bpn?.seed ?? "BPN"; + const uid = String(seed).replace(/[^A-Za-z0-9]/g, ""); + const rng = rngFor(seed, "crest"); + const dark = "#101722"; + const rim = mix(accent, "#ffffff", 0.12); + const glyph = focusGlyph(bpn?.missionFocus ?? "", mix(accent, "#ffffff", 0.25)); + const rivet = (x, y) => ``; + const ticks = Array.from({ length: 12 }, (_, i) => { + const a = (i / 12) * Math.PI * 2; + const x1 = 64 + Math.cos(a) * 50, y1 = 64 + Math.sin(a) * 50; + const x2 = 64 + Math.cos(a) * (i % 3 === 0 ? 44 : 47), y2 = 64 + Math.sin(a) * (i % 3 === 0 ? 44 : 47); + return ``; + }).join(""); + const jitter = r2(rfloat(rng, -2, 2)); + + return ` + + + + + + + + + ${ticks} + ${rivet(20, 20)}${rivet(108, 20)}${rivet(20, 108)}${rivet(108, 108)} + + + + + ${glyph} + +`; +} + +/* ------------------------------------------------------------------------ */ +/* FOREGROUND MOTIFS — one per scene. Each returns markup positioned within */ +/* a 1200x360 banner space (W,H passed in). */ +/* ------------------------------------------------------------------------ */ + +function litWindowGrid(rng, x, y, w, h, accent, alpha, step = 14) { + const out = []; + for (let wx = x + 6; wx < x + w - 6; wx += step) { + for (let wy = y + 8; wy < y + h - 6; wy += 18) { + if (rng() < 0.32) out.push(``); + } + } + return out.join(""); +} + +const MOTIFS = { + // generic angular skyline used by most street-level scenes + skyline(rng, W, H, accent, density) { + let x = -20; const out = []; + const gap = density > 0.6 ? [2, 8] : [6, 16]; + while (x < W + 20) { + const w = rint(rng, 34, 96), h = rint(rng, H * 0.4, H * 0.82), top = H + 4 - h; + out.push(``); + if (rng() < 0.4) { const mx = x + rint(rng, 6, w - 6); out.push(``); } + out.push(litWindowGrid(rng, x, top, w, H - top, accent, 0.85)); + x += w + rint(rng, gap[0], gap[1]); + } + return out.join(""); + }, + tunnel(rng, W, H, accent) { + const cx = W * rfloat(rng, 0.4, 0.6), out = []; + for (let i = 0; i < 5; i++) { const ry = H * (0.34 + i * 0.11), rx = ry * 1.5; out.push(``); } + out.push(``); + for (let i = 0; i < 26; i++) { const x = rfloat(rng, 0, W); out.push(``); } // water glints + out.push(``); // side pipes + return out.join(""); + }, + transit(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.7)]; + for (let i = 0; i < 6; i++) { const x = (i + 0.5) * (W / 6); out.push(``); if (rng() < 0.8) out.push(``); } // pillars + route boards + return out.join(""); + }, + wall(rng, W, H, accent) { + const out = [], top = H * 0.34; + out.push(``); + for (let x = 0; x < W; x += 64) out.push(``); // plating + for (let x = 0; x < W; x += 64) out.push(``); // battlements + return out.join(""); + }, + cordon(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.6)]; + // diagonal cordon tape across the lower third + for (let k = -1; k <= 1; k += 2) { const y = H * (0.72 + k * 0.06); out.push(``); } + return out.join(""); + }, + gantry(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.8)]; + for (let i = 0; i < 10; i++) { const x = rfloat(rng, 0, W - 70), y = H - rint(rng, 24, 70); out.push(``); } // containers + out.push(``); // gantry crane + return out.join(""); + }, + stage(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.5)]; + out.push(``); // truss + for (let i = 0; i < 5; i++) { const x = W * (0.28 + i * 0.11); out.push(``); } // spotlight cones + return out.join(""); + }, + canal(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.5)]; + out.push(``); // canal + for (let i = 0; i < 7; i++) { const x = rfloat(rng, 30, W - 30); out.push(``); } // hazard barrels + return out.join(""); + }, + tower(rng, W, H, accent) { + const out = [MOTIFS.skyline(rng, W, H, accent, 0.7)]; + const tx = W * rfloat(rng, 0.4, 0.6); + out.push(``); // broadcast tower + out.push(``); + out.push(``); // monorail line + return out.join(""); + }, + vault(rng, W, H, accent) { + const cx = W * 0.5, out = []; + for (let i = 0; i < 6; i++) { const s = 1 - i * 0.15, w = W * 0.5 * s, h = H * 0.9 * s; out.push(``); } // receding corridor + out.push(``); // far door + for (let i = 0; i < 5; i++) out.push(``); // biometric panel + return out.join(""); + }, + exec(rng, W, H, accent) { + const out = []; let x = 40; + while (x < W - 40) { const w = rint(rng, 70, 120), h = rint(rng, H * 0.55, H * 0.95), top = H + 4 - h; out.push(``); out.push(litWindowGrid(rng, x, top, w, H - top, accent, 0.4, 18)); x += w + rint(rng, 40, 90); } + out.push(``); + return out.join(""); + } +}; + +/* ------------------------------------------------------------------------ */ +/* BANNER — the wide hero backdrop, composed from the band's scene. */ +/* ------------------------------------------------------------------------ */ + +export function bannerSVG(bpn, { width = 1200, height = 360 } = {}) { + const accent = bpn?.colour?.accent ?? "#dce8f9"; + const key = bpn?.colourKey ?? "white"; + const seed = bpn?.seed ?? "BPN"; + const uid = String(seed).replace(/[^A-Za-z0-9]/g, ""); + const scene = SCENES[key] ?? SCENES.white; + const rng = rngFor(seed, "banner"); + const dark = "#0b1018"; + const W = width, H = height; + + // hazy back skyline for depth (skip for vault/exec which set their own mood) + let back = ""; + if (!["vault", "exec"].includes(scene.motif)) { + let x = -20; const out = []; + while (x < W + 20) { const w = rint(rng, 40, 96), h = rint(rng, H * 0.28, H * 0.6), top = H * 0.92 - h; out.push(``); x += w + rint(rng, 4, 14); } + back = out.join(""); + } + + const fg = (MOTIFS[scene.motif] ?? MOTIFS.skyline)(rng, W, H, accent, scene.density); + + // searchlight beams + const beams = Array.from({ length: rint(rng, 2, 4) }, () => { const ox = rfloat(rng, 0, W), s = rfloat(rng, 40, 120); return ``; }).join(""); + + // atmosphere layers + let rain = "", smog = "", crowd = ""; + if (scene.rain > 0) rain = Array.from({ length: Math.round(scene.rain * 110) }, () => { const x = rfloat(rng, 0, W), y = rfloat(rng, 0, H), len = rfloat(rng, 3, 11); return ``; }).join(""); + if (scene.smog > 0) smog = Array.from({ length: Math.round(scene.smog * 5) }, (_, i) => ``).join(""); + if (scene.crowd > 0) crowd = Array.from({ length: Math.round(scene.crowd * 90) }, () => { const x = rfloat(rng, 0, W), y = rfloat(rng, H * 0.82, H - 4); return ``; }).join(""); + + // lighting + let floods = "", beaconGlow = ""; + if (scene.floodlights) floods = Array.from({ length: rint(rng, 2, 3) }, () => { const x = rfloat(rng, W * 0.2, W * 0.8); return ``; }).join(""); + if (scene.beacons) beaconGlow = Array.from({ length: rint(rng, 2, 4) }, () => ``).join(""); + + // hazard chevrons for high-alert bands + let hazard = ""; + if (["red", "black", "jade", "green"].includes(key)) { const bandY = H - 16, chev = []; for (let x = -20; x < W + 20; x += 28) chev.push(``); hazard = `${chev.join("")}`; } + + // giant faint Third Eye + const eyeX = rng() < 0.5 ? W * 0.78 : W * 0.22, eyeScale = rfloat(rng, 1.6, 2.2); + const eye = ``; + + return ` + + + + + + + + + + ${beams}${beaconGlow}${smog} + ${eye} + ${back} + ${fg} + ${floods}${crowd}${rain} + ${hazard} + + + +`; +} + +/* ------------------------------------------------------------------------ */ +/* PORTRAIT — a stylised halftone contact silhouette for the brief. */ +/* Flat shoulders + head bust, halftone dot shading, accent rim. Not a face: */ +/* an anonymous corporate ID-photo abstraction, deliberately non-realistic. */ +/* ------------------------------------------------------------------------ */ + +export function portraitSVG(bpn, { size = 120 } = {}) { + const accent = bpn?.colour?.accent ?? "#dce8f9"; + const seed = bpn?.seed ?? "BPN"; + const uid = String(seed).replace(/[^A-Za-z0-9]/g, "") + "p"; + const rng = rngFor(seed, "portrait"); + const dark = "#0c1119"; + // halftone dots over the bust area + const dots = []; + for (let y = 18; y < 120; y += 8) { + for (let x = 12; x < 108; x += 8) { + const d = Math.hypot(x - 60, y - 70); + const p = Math.max(0, 1 - d / 70); + if (rng() < p * 0.7) dots.push(``); + } + } + return ` + + + + + ${dots.join("")} + + + + +`; +} + +/* Convenience: data URI for the crest (handy as an src or journal icon). */ +export function crestDataURI(bpn, opts) { + return `data:image/svg+xml;utf8,${encodeURIComponent(crestSVG(bpn, opts))}`; +} diff --git a/assets/fonts/fonts-google.css b/assets/fonts/fonts-google.css new file mode 100644 index 0000000..512331c --- /dev/null +++ b/assets/fonts/fonts-google.css @@ -0,0 +1,270 @@ +/* vietnamese */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-joefinan-1.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-joefinan-0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-joefinan-2.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-joefinan-1.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-joefinan-0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-joefinan-2.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(g-joefinan-1.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(g-joefinan-0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(g-joefinan-2.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-joefinan-1.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-joefinan-0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Josefin Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-joefinan-2.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-5.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-8.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-6.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-3.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-4.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(g-robotomono-7.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-5.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-8.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-6.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-3.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-4.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(g-robotomono-7.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-5.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-8.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-6.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-3.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-4.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(g-robotomono-7.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/fonts/fonts.css b/assets/fonts/fonts.css new file mode 100644 index 0000000..2b533f6 --- /dev/null +++ b/assets/fonts/fonts.css @@ -0,0 +1,22 @@ +/* Bundled SLA Industries house faces — fully local, no network required. + Josefin Sans (display + UI) and Roboto Mono (data/labels) come from the + rewritten Google CSS; Modesto Condensed (heavy industrial wordmark) is + carried over from the SLA-BRP system. */ + +@import url("fonts-google.css"); + +@font-face { + font-family: "Modesto Condensed"; + src: url("modesto-condensed.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Modesto Condensed"; + src: url("modesto-condensed-bold.woff2") format("woff2"); + font-weight: 700; + font-style: normal; + font-display: swap; +} diff --git a/assets/fonts/g-joefinan-0.woff2 b/assets/fonts/g-joefinan-0.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..30e7717335fb80f9b519ff5692fc7429b8ff9851 GIT binary patch literal 21292 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≫?lT5k+FEKb|eKg{OaKP?G-%QO*b;(r9iw0;IF22La%tap5=@P?6A|}v?*iMk zcZMLR*MTEadYR*>HQh;&(dbf1%PmUF=sG7$saz*dN~bwRx(S>T68|`5*e*L2cvd@A z0#rIR1QbpkKQ2xK2QqOJ?5w_sa-~elM5$&{qEL=#<*JzFDO4t@cj+pb%@MBrs^*?$ zlTKLa#U+MV$i1sIN`;U(lCMSyzp9nDW{kqSTA*6?{8O8vS|!s!oUDKsVb3@Gd7}lI z7ibfxl=RHU{AZf~#EBP2eUY>-{5&>M&Noq{S*5B}s8<<~+jB$36Wm!dibkYUxerA$XDkj= zlM+vW_cpN-Q&s12zQS%)Bb#K-I_%+#YR!5 z9;YM`uVUl1Q*WV+_$lJzrNQjc&Iiy0u%JGokc)s%+mTuJ!PHhrb%j1q$tq^S`{N!oOn735+zA4 z*s)US847V?{nBMH%9K^8(|c)=ib=K{xy)3P1c z3u}%kBRZ&2wT-^71cQ5ZSLB*ImrIFzIT_PO^}k7Md2q>&K{4(cQeOJ5vx+<5^s4pl z3l_g)Ohd8oa_%S(I2pz6ORK_0R7W~lH`6ohaf8Duqr3}(Q>kVrsW>cZa+vE*4j%Hg zRF9!gZ-_a2nEiqe=~}9P{V`k+BG8UT+ESnb;wLaTyRod)uvb*@LPxB01{8Z&A`dad zWi{dfLkibEomSiJ%uT&!?%Oyr(e%aGtDRa(%=og;x}V`^Yv_JWBfacno|FZohmWb* zag;k+u7bwELMcT1GT-z{FO_(JQMt2SB~E+V?DWn&$%e-lYM5LbHK`iq*wEJOkCi*zRqsP5bI{Codbb;VId^;^hQ8QUu^kof z$0;kX^*PVwSkS(`-!6m6vX#CkV9;lqlT9QxO`TArs!r1d6g?tHL?g*LfGap`I~_?MPLc6Djk*gNdhi5dh)=SN|N zvj}uJNi4@Dx^at_oLyX-snZ4^vOZq=r9bVTsz-l1{|*-6qlBa(!(a7#{Yk~jWtE%9 z_{H1%rl-AEA`ECwY0vx4 zrKBvFx8?@$fIyg1U%o8Eot&QQOfOMf_6INL-?bIfNlfUb;3xMD$ nfWX3f8Hc;LCPX;T4*Dir7=b4Ifm?{jg*C$)!kzpJow?yh4B;6- literal 0 HcmV?d00001 diff --git a/assets/fonts/g-joefinan-1.woff2 b/assets/fonts/g-joefinan-1.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..242a7418a41e0dae0bbb48b2a1b728f458815c53 GIT binary patch literal 8584 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 Owg312Q44<4CwB_Gon<-z literal 0 HcmV?d00001 diff --git a/assets/fonts/g-joefinan-2.woff2 b/assets/fonts/g-joefinan-2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..547aed3107a6bcc666311f9b929a02a66f61697b GIT binary patch literal 28528 zcmV)bK&iiXPew8T0RR910B>*r6aWAK0OdFU0B-;Q0RR9100000000000000000000 z0000Qgk>AqKpch~KS)+VQidxAU_Vn-K~#YpCn^Ai2rp_82nzOO++z!aZU8WWz)%4; z0we>6SOg#iiCPDSd<+L0?bHRF6YIHc05JZ(ROi=BxQ&n7aZ$Xzz2``To!X>&Oa8we zH$)We0FCkO!Ayb@!{yjjb=(D!!WgD63oagX!OXV%j}wF?WC&Ku4Nd4)IAGUJ-#{=M z^bKG7ZxlX-rUMh@pOTYXPy2l;Dm#J#QG`J57$zJ@irP2>VlI{mbMo;~s7b0TQW)DKdDrw8BxZcn6bNh4OA{k>F1989@HF_W*FeDTa$uOvrk{V*sQYxjO zV$q>US%rKQjIXHZHwvsmKm7NZeRFRTG3As!qQhI2v-Zph2? zA7lT&wa=6PG4aGpSaL~XelI@VA|bhDl4v3^M7+WtdZ*Tpz!u<0qY+w?Wy^qZ;y7{L z#7T;rE>V~H?&7+)5B`pUm!OwDY}zzX$MEp2{cmPP=Y3P%kBFr~LcuGSDTza)5gOi9 zlDO{=y7|3SOujm_9$J#1NpOi7(mJ%|Y+7y`e7oDei46bS>i^(Wy6vrg5fQHQD!*zY zda{h39T^cZ=mQ5tXlr>s4%jI$#1QjlDsSpJfMVz@Z)~<9>uNJS? z^?m!VV*9^e_U6lSdsTyLjoJvQoSDAr1n#S8Uy%`!8HvRL+pQ*?Sw@yMcw2-Uz5AZ< zgmC)E?ryh17FFfFy8hphVZBJ7u?k{GK&MaqHrS<0)d7_s2>0@mZCTz z+W-E|Ka=Da@|HR4rd|#3o183gmMEPfsJfmCTj6RPpkuYNu2NMh;rEY_0E&xJYK$N|N%;7?m$4knxKOxDtBrj2*GM(iV@(1Yf zMOrhTlz0P&kh@DUb*V3|^til`in6-$c%WbA?0z0)L8Wv@>FOrJA~Z_h?Vrq&d}@)k zE$&oW6&~RtK|)mKWMrHHv?J=TRKJ@m~+iUO6&tI9J`LL$nuRm%$XgqIB&pmEFZ#`qb=)CN_>AvQ^;jY~y_tZP} z&b)2oys>SRe%IVL56u!wtdOH5MTTtHh8-iN(V(D3haLk)dJ->VPmvN8B&$M0)>zj_ zV{MxA#xk~XOR}`{;%FR;%{U%g zaUxBmcG{FWg(z<>riyMkquNvlbU`;HHJ|3!0_Z%NM+xJ#AsgRlWbhlD&lzmT+3|LQ zljLl6Q@llQOT--Ur>DD(K&t>WP4g0)%u969E&GpU_>0k+!Ek zz_oa#$<&uRQ)4PiX(?LyJm+_M_{`I1jjC!2da-0lMz6=nscJYf_MDuTc%BOiNujF_RWLqB0vMk7LnViw-pRQ?@`YE3b<9~dKXK_ES z#hEw}9Z?$?r^Ou05#YdPH?!_+1>WG zw2_6bu#!2(1M*dGBntc=qB-5sghth;I@PF9JCv$e1^k;^>eX{Szc zrF5bqfEmg(*_wX|cY$OELdle{6~~`5BY5WLY|UDoStT2h5k8bmHmv*V4lm_70;!Yl zZ`GoXEW~>eT#omYO%tw2{W7i8r;wH`@-apxoNrqM#&3d9w#Elp)V^d-61`;~k^X>V zIsh}2S*10RMKti{2EvK+QAcWg_6%^ifP8=Ow;Eice50*PbRWfQWz`zt5dH#;xj;B% zo{Yail`uV3nDsmlhiU70mO52#jq$3yH}c9#y;=0^kJsMbUCjF;CcUDA4)Yvg@Vk5q zB>6Y#^7Bv?<50#0&&a*;j(nP`kM%TGeGbR|IZ3s~+gkX8#XOS}X_M z$iIeV-|TW&p*O9H+b*58ATDuFJ|a4^L+|ipJM>h%#9f;qYjYb}M<+Fs1Ejy7RBZQ|1YT0Emn*vfRN@w5O!2k?>(@T0Ke96W9H5ZQBj z5=qF1%4Ah%%CfG;vwMCE)xN(c556#}9iWk|iN_p#GaYqDk0yAk;WpX1GAT)=Fpd-P zkcg78I?fA{Hy35VQ8l!Q-b50z!kTz~bxrlyO}^6I>*`b?D=jI+fl$S5i0|?AmLt{P zr`rMH2&E>Au?1BMQc3%FFIYoRph80mX*gtY$>C9?L>ZreCN0`@=+dLlfQSiG%bBqt zw$dtg>^X4Z%8fe@0oGY>gFs;-M2Z$8R-AarQlv_gVVmvFnZy7jF(45De*vEXj{#>P zMgeO9(*a`v-2n{&r6DZf2v9-043e7oXZ22T}DTBh= zsAWJbMI;LBuXn&NC4oT(vu;8KGcRHXtjcu^Hl|7YHkz-4VL5r^`W`xa1RN+7Nyx2#Vcfj-t zq^1A7ZCQh^w-HMmf_c}RQBF0QNBXM6o(^qm5Aj|8@YWTlVd? z`(+dE`|rzQ@SoU<;kJ#BeIkrlDT}9%mhlRI>d&mOGD$tE%w0a1UMpIgBmiPjm$8Uk z_q=D5k%9pQj?fNN57QCQz(A<54_3r^nJF$a=J;Ivn7{_%R7HxSD+bX&9Ff6@s)Qi~ zr@N*lo?M$1@S#I&y&V$yBVe-NN)wruCJM!xUXOzY9Sm8rusR4!wP5HjjA4*XM#LB% z6Q*Oz6qbureYX=4vxN@9bu>4eGkRRp^)@0!BXmLFiKs^}jEG?pvCJTzNhC9Y6sD3Y z(yBa6pjr(YwYF$raEcbp1flD%r1HrOltfy2Ma#=X^q(eG0GweKN*97HB=h)2R04%V z<^X{OJmCc&%Mo^f(tBCC)^QQeNB4NTq+*Xat6+D!+$p{v+Zp=klRN#@Tdv1~r6f#*h61(3G_p6G^;k%>7Y_&3R;dJZ1b!BCqQ0K1$4#;0Pb5+rAD0w zO~OSLGanV35kc}yaOy^Y@8}ZgB)PlTE=R6iij=B#4)v-t#QG6(L9DMK4}`xUf6NLV zM;s1{!Zene9FIr0fwNwkA#@^Q(7!A_#iV~?2h+}8&Dno1y}}$n%xik(8K8L#*r%OU zd{+p_KRUD2M?nz|iXdjmb{=aAhmOJ1OoLe0fSFcy`2Z`_k?DA;ogl~{Y!(2Ci2;yz zkWYRE6jVr2#S~XkDW#QBR(W;QRZo2lG}K6AO*PX}E3LKDSvTGFm^A-K$070_uu3^S zlOyT!1El)VNSUSuo6TmkTXD6BB5XFB&1SRN7h<#7Y&M(CX3q~Z*XddqnO#FY&3z)6 zEw~rU+`6z)$y;dSi!@UAmusgrbWwAn-ug;iY4dVRs)2&`DMVLJgaOskPS z2WvTU;>=Z`Ai+X}3Kt=IZi{TUw%Gl{g;!fy=QOiE=W@QpLYmcOP9Jb z#}}1W@lYzX$Jsr9qetqE@|w-q$}>ovKh}Nf+I!9AcLhpapdNlj>gw_YN-Szentf5T z_nSDqN9npiP^af2kDy&c3>VHJOUyTav|B?hNjE4 z13Hi;ph}H84MJLUe^tNcf)(N(@~hHbweHmg-vW2(FU0ruf-cEj0}$8?kOEB?0emP* zVo4;GOmZoulD4!mcZMRcV$FsvJFD4qu$Chy&Rhiw5-dcha1o-*IhQ*F5lBA4K>@I7 zci{Ppd&xct1a2VU2I*UKg;2DIBjx2?#66Kw%}6hF>=pAz?-W+OE0~3nM}oj37ht>} zq)psmaPSC-NXQY&W#x?XYecYHG)6-@G5!UmeJPsGhYNE&x(S0xOpE*+H z?jqDku0w^Co}pAmr^mmj?q4WS18SRQNiCTpi((z9SFD<5KWslX_mhI-bYL6mR76g%jg2spoM1N)&96SOd5^^&G zeP=$9mU1mtnG^2xUjGHW*BWcg#G-qX!3%fQW?L zNYPj00=!D^#Jxr80qsV~avntS)(otTr#rqy_BgtgiL$TeDbdYuX8c_-~yE1(2jF>+&c7q9x3OgGWF_ zLQa%S!D4w`%?_0d)d?vlSquul*Fsc_CT6|GL2hYkPZ-*DDs1JWQi5|%msb8(1H7~khvcXN}&F-c<*$0Ur22b}mS zB;&}NQ<}Uklp%U$#2p~?HdSU}!)+zr0AG(gM|P~vHvu9>hq2DK47uA9cCi(1;yRfiyF;M&mbogr zFu157@RY+*Cl3Y#B6}kZIm#06j=;#43-Py?@({r1MGZ5;C4)G2Com==s&Wd%1|`Ug z1I4#ahrI(%u@NoE6%{;GaDrOA1{(l}b%hEbSP+0Y8uyN>1)&fIw{H*sdFHtnUV7y< zOsljzxJOl$H62ZY+0(|z7GXi?hZPv8(E_A_;tN1t*5yXFg4niD00ay|9(X4^&N?yq~u%ciVG&~4@}X0y}uIV z$hO}pd8V9qU5lFzxf&{mmAkCWKGXl6cinMKzFkK3yQff=e*gkV3^+i103`t-3=kLy z`2Wj1DB2%N_lL3rp!@(hcrYA37s3V3_^ zZGC%g;noMdEGm1ag+=dE3E|0<7K8KD!6@ojNv9QGq>GM_6GZdy6}8@QP1qhR#Mzc|viOwXLTi5H0GmY^Ukh&&F43ravqs1fRdo8h#mMbs*4 z6X#~HI4|xhpI6>jv0VN@#eB&E>5#0FPxiL@{3r)-u$Y1~=WPqfw9`BWP z1b`O;y2c0>1QU;tF+1)yh=u?VAsmD&7+eWCB&}e)rxK@31k~Piqg%eh3SL#y^xrdh z0&0i>AR)mh@ z@MFN-4*z2#ndIeBU-Es=1~N>;Z6rBHp%eOH6z0NB;nuL@070Zh#;^mx51)vIWBj3> zVZa%NYqTC(p||PwJ@rR7pdtW`^&tWOkNsQtYyY+WJl-k*`1d*R@Kpd0@0}Z&TQwJ) zgC7r2{Zv==Ys?O)?Ec#s&%PVXTRgFx#FtB zrl31VFIf9-(I5X7m0I0b?<4UYq{r~<3jQt8$(!9-kNkvm3hT>>Q!d1az_xsz(a-r2?})Bm}IalC2t7@3{+@PrAA2IC7O&GGO~<0 z9h+FQw1O=wHdb2A*;^rX-rqgl!R!#3Tudq0gNx2@?TuSrRT1;MOA%q5$%BN~CDOyx%G$DXEl1 zZCiB55>x4SODk^yeuLl+AoL}G85>Y1**w0|O#+;R_Gmbz=r~8Likymk8iC^gu3r`; z6cqHAH4mE}9ANARf)8A79A}I`K?K7z#D*==;vi32DI3jX(Il3oYahn4dQ0O&bdIO} zdys7~o#FC#h8JnCQw=YZ6lveMl{ixAeQ?sH)z4D)cdA(eM@uX`nGI*g=%!e^!ge8X zFrp~jBB;D(Dwn3wc#8xrc5UqI38Z}ELe-&tp=t&}FlCJAp`%UAP|5AdFiH@D(6>5b zzptKVsHt-YCAdslCuv^1f~YAl2tt$gRWD}uH$w=`M9Y`P9`xhfX#4@d4cQ?$cR$N%quALB2D*DZ*?6v1AN~$KYs>( zO_SX1Yj*_5u()8B_9Y38%NBqfxg-#Jafbz=gec$9kFY1H$|rudd{RY0F zvJypHiAT7{!>l1e+{N#&Vj%OWHI2w1$%TK^XD|#!p*J`53=2XzIb3_B4M|m;*AMJW zW&?f2+v^EE??zN~8kOG8t&i82;!#}(7yK}Zf>L3rTDWX`?!~^nuQceLVko%IRY&eg zAw%3~JH(k?I_qSLR7ZPI{5Y?w538T3+>SYGdCkkkYeK}~oU-}q=Yg*dW1j`ZW%Q|a z^`FDYP%OkE#i0d-%4pC)a|n5gK%*(Waq7|mvH@bb<}hjH`}Lg4Ms5PClfjSbx}a*x zhfXw?h3byE-YSBe`H!i*E?F!{tCsgEo;znWmBW&eSt&&^JF6An!#hh|s5qMke}X_} zSGvMoD2f3Ui^Z9Dmfg`6rxG=!;yyeGVNgtpE`faHY2H%83*O2?EqtpG-{bV`B65zL zAebvChsRp48I>+Cp3{XaR%rWEXSjde#Uy&7ap8fI_-d*Y744h3mk+L;$Cx}?pL(vj z56^z<;1%K_Re+9VEYa{gy$M|_NRR+u6fPt~ALnU` zWh}sGjqG|J(Zlh;^+u3KWdmQxMbGm^o5|wa8Q|m@?+oAfj_mg~ygz8!`%MMbxWsSA zK5P6d+OEf#9`(kfc@WX(r?{&EJQcN3^TqM5Oxtgqg!0{YYATX>G#ImB0KjNS6&&4{ zjx}73oRNH-+Bnkgt24iI9RdfBJF+uxl zXLaOB1TnN1*~ zvv}F}E&g~<(?ixJhSD{=WKtsCjf}3hpzI>x^9okwpA*&yU>5Lrlz1}r@GyQtBQIcO zlI3ugHmzvj(L$en{HoW|r+9~E=9kyKL~Va|VZCWX4ux_fFt~K&(ionLrjx43VUcMa-lz>H<-=EJete!Uk5Xz)e0xtZ|a2m4STN{%$f9UTR1 z=7Zzj-d0ctts4S74uqk96&uu(;J~!rwWU_R>+qD)J~F=fH#7SUbvO(F^RX^75+CH{p5n}QT$GZwe;~4U2M6YP}5V7%b78EE0kSv1tPOGt>&-m z?s!~^$z*$XJ(QfD9tiJPpfKr?&#t35 z&k4p{_H)_Y-Eua$WC{T0b^1{91vyik<(E3DD1VuL?`87LckRc%1LS&M5#51D)JfvL zZv7C&GmEzpO2)LjTee@WR#ZdK>!zaN%B0v>SOY@0J5KVF5%*h|=I<_o*OX2_bvQE4 zO+bozD)k1%Db(k{MAp|V4cg!&=y~ogFL0$aal*VNQ2U@de?A*4gZ#B~U^?=-V;Vju zd5VA?zl@E+-a0aMp8?m~tIxw5^s?WEVxM@1&&40Gux$xNbm}HZw=ICA8?dALa5(ES z*8Cioqp9_&_}JFP=xlnKFrC;_$tK-(>9^EXU(Q<4Ap%V1V`34(K2)yCu3~EpH(T34$-4czSbAyS|(eQWqOw2kOO9a^4TE>bB)$ zGLUwPYWh2QvjGlAbi5wVh=D4XMFp2^NG3`jca(T8y&iba?&cbp@EI$0yayR8Cd;N! zO&n)eD|qBKS1K<1tNV|2G%t1Pob(fGf};9pPV{9ohDM$7rDJDv6@159d9AShA4Lp3 z{!i}Z?uxXa4NQ&=!fg!{M0p0_wZ((75z&eL+y|c!UL%AQKx1J8$xgjAu<=vUpc9G( za8$)T5f&RxKUweH6l~?w^8%@r+|Fh?qoR4*X7{%!%)2}wO8d|$+hVo&2DUwqkNLyQ z#(dW}8zi&Rtvh`)5{q|~YU`lZ_}%7J>Fg*K!PC+vAQ?XzerrRfUq9-IGh-cXt1Rw| z!jtahXiGD>Dq_u8kguu0XJUP^uJ1PD#1F-8o>6t8LKE?`EF@l55E6E~P2Z zHO}60`u@VfYVQF9bc0g?P|ta)!1&_MI`%VQ?ZzN5Ge}NXmvsYgvW|D+?Wi zo*ZqFsI;f{s z^9%1wHaklCRQ@T?MY-TOo6oc3K{s%B zB`tu?s(`G=T+=IYOo@lS)bW(IoYy7f4p@x!iyYya`^+_(=PO<1+T{KZuDHsz`!S4{ zj099*k!-Zqq>pRgcX(?KC^$~*V0&TO`y+32fYTUs zWsb}hvFh68uTx+$DlRw~a@UdlhkG=x!ZSweX+yG=SAoS?`Tw7&c=^+BJb3h(dr8yI za@Sg6Ii5Hq|3}Mj7hCri4G}m%e6POAnRaEk43~B`)g|7DI0bF_CwsPRF?B-b&1u~n zEd+iLOw%NlW*g{q24(G?T&i;VHt9_EIJ(z9m7O+>Ay^n_We~2Q&Vg&Qa$hM5z%8A-$lTJ`y|8%-V=P$O8) z^Lgl7;VI6KU>EADQ#+Jlon9o)#!y3?vWS63amF0dTDSqshy~(ikgm4p6IC{&p~-Hr zGZdr#G4FE7U2-C3F~yn-;{TP0m!mbxkwA+=;l-QA30N;4Ops+yBCk6SOixL z5T20Uw2e#|8pjfk=+8})*rM7PswGV^@{yO8oSfulHzdb97ZuiKEF4YmqW1E}8egBU zx)XmmSe(GAK+J-ZF%nIn1b_ldj-5%^e*WyBAUkK-o?BObNHsvX=GSwC8+yR+!9eH;=#X}iuknVA)w~oG`UHA?4OUCn(itQB z%5#mzqAk)nx{7EM@n;Gg29C$gSZJ=!DuN4YQNuI^?`I(J1N2_;l8ntpe*YhQ{yroU!XL1=Ipm#-wsZ>9w&?w^!BVuT z?w6o-CS#Ve*%pcu3`=ENNUet=VKro?&c3jMiX>*_0yC5#)+4WvJeSfnz!(Hdd8sb0 zinpXwniwKzk~r}{X!|H$TnwMX5JjRWP#|c9Eb#}YMJ!qvrw>s9Ld5^>DJk9Z2l z6>h1spl7WXaUpNRqo9q%cC>Kj;#^9qyvsUPks-;=&D-Gd`sd`VWZ zt}A`ENvl*Gv4iCHfW9X}4?ErZY9)@lZhyp%)x|6}rY%cbt8jdlaa6Ti*fLkP!Nr3<^C2JH2(?*BJ78Ili zZ->0qV21hk9o&;kiW`UM(hgACa%}O8V+ruzcV-9&h3wBDoD)M!`U(u@gOiuG_lmb( zDSn76UL_fOYDahZ*2f`x;ETTahCVwnu|srj1o%c(9I2imQ%qg-|A^x33R%_D;(fBD z&urm%&kw8EqtM(B0}~X=?4jEe1h?n6yQkP-^svyS(Yg$n&goR>Q6Kt~e4#&MiJ;TA zcV+VnsuNmu)h)g{3lsD@)P~(aN6Vn)I9*jwZFHPLuXAx)eM4!qPKnC6Tdg`~RH>0; zD$N}-u#B)Og7LH~mOGt_Wu9yg?e=7{UAe5msa($0KGiMc!DdJ9W)K3wOjW8=v-(^f z3?UEKz@m6#31`J1F!>|N$Sq|SQ$&^Lr~DGj`_$VKwN?G-yLKZo#?TZe>~xGk($?DA zk=*d&K{Y=Jfqlhu?CT0|ONYIpjw;^F*}A(~4vnZT9@-jI80y+cGV6$RX5zAT3Gtpt ztAYS`pdfJ;O$4(#AAlbyY_~eVxlVvTByE4yqt8lgWg0p~5{(3jCmV5Eb-JctxdJMs z`sf^#jkQs9o7Ku@vkdr4GOudA0=BSYEWcn$w*QLP^3{tY^WXCv$)c3CjbVmWqPEk! zs1%MTNfK}59*RsMc#NK9pyd4ooGw<`QBgDYa6TJ|&STmb$DF^#*ljQ>T`nz(x^zm; zU?5zJ&UsmV)MB+}+Zn5^jbXA@h_IxR1W7d!MCw>Hk!->#GKpJ~BvXqAoea%8aXZh` zOpv#O#b?X7mC4oG*$&%gYoB}AY3G9WbzO^=cJ#mKXFj^v-}&*gXT^=XQ$6{X5)C4e zKnXHM5KRn2G^YsQQtYz8)hLMGd+F3tQ;ewo{Ffgej65KGy6D}h&o2egkL0rH-O!vY ze|WO=VtTdVC!zLZx#XT#S%W)AcM6UUY`Tvg3#7@{S(*{ib*3V0vryCp!M7@~bYhMNha-6s}=SEWSJ@TPDqa za{ZG|>&u;&LHCY{A@)RWqEw160IGAI(H&d7kHamx{m1~VIxzMD1m7@#A@dE&`oIhU zE1BYvCMeYFlde-22Wx7m^`8Ue`ZOAP8iguN4+*|@cCX<;gLMlmpKx{ob)MD;D)k|i z_OOaKQw!9+@Td*k&TTG<_dR*8kA!;FKsFbV3A-F-c{psIP9hZe6({&X`!$^Go0|{? zwJa$j5z=}^N2X(`3{tZf>S8CqZ3paS=gh)Dvp4TVV+?!l?Sl((w~fGJF*B}rSBsCs z2e9b_Dr|-#(~Nrc(SKLolVJ)K<$?848os2t6PH@a(I~F-R6Qa1#M6a~a_K%(3@pQ>fmdkOceyj(!LOOU_%s&=;WKSSd!2784gzN$Iy*=MCbr9H-Mb*PYXzHs= zfp-P2I)rRA!FRc3y*)zle`h?&`Q~O`;tKYd-`jXY2JeRSH%-va)}7EP@TBTAdspi& z=rq`?+HJlV+IApgfp-i!mdhc>ykiSi>jh-iEt5G+#xP%Tpx$ey@5+`K9B$N*CdBzA7T`w3JQ&b`N6 z$;nn^dxIml09*068%h4YFj&CrA;BLqxAZR~@1zam-y2HN>ynYZ%l0;q6<11N*NEhL zwG=F&J*g4weayS;mV)%b1gXdCQ;`?B_p8f4f+;zozGymy%SCl_Bd5;xFL;WBu>NnwUJ>V%dvRko&;z7=UJG*C#>l zgTHSNU}v8bojUiE^7jz=3eWV?fc{oX8boU@f(!=v_3nwome5l{6+N9anWBPPYggW3H+idzD%gW%8X|b$s(Gz9ouba|Bt{*tiOb*Ny0~!%Re;6imCX)ri=`o&E~M70{W<3{AIM=L-3N z0c=Dh3JG@1Z(qn2qXv&pgBZM(x8Hj6#Y6U}zgGIr=fJB#&Py(&yes?!%OVfyo|JYUWC@G#Vc@bP`LIVgAFr!E?fS?b4%f7nvDjRIbV`?Wn1|#du z=^eJ_%H97vTL0I+k=~N2Ie;K|QudC`D;|dRDB)?;6I82PewRslS>qPzHS9zP>f(-Gw%1lyxnAafhX6p296qhLuq;|N7o1B)HF{5124h zAc!DkGp8QfF(*J)15EFCg6~#= zg@M>jip457`Z<+{y|6mOpF{pY7ebB|`v_#iGfH@sI=r0EoAT?EI%+crU&O`z+OYQMr) zEK~H)w+E^}nGgxkbm#PgJp;pmGQ*!rvZY4B!w<|l`2Xzo`mkv(7Z2#9{{Tw7$uEKb z@8yM8Bt@c4ccc7jaQ~Y1SGe+7Yr+L8c?59D)E%(>v2^${>IBfjxtUE6@cR9!|I^AG zj{nTF^NzHoXI-D*_-xJ=V9CMv=D+?n+9E`z-#HO9yFW!8gTwLnaT0m2bM~16J zu3Ib|`ONLSzZ4OtKN^L)KOdvyKRQ?Jz@J}<9Hdd@IOtW!K_71%upb^fAGZGi-EVi8 z?_OBa&wu|K;PA(tpy{8|dtw7WIsrw2Wuegt)Vnx=`cxB$W(4*;+CU(7KSmvV22s2q z4m0z?*kw%aO{#LL`;gq6gqEuM7o4WhQPmb^O9St;p9EiKe>%N zWQN7id9VWYwyPmh_kSG{14_0Pqf4LKgbAWFiM6_W4N*mNt|}k(4EXm^drwpYxdf4k zd^;=tbL!L6jPw3jd7AJp&VK?_61oHmE(65d=V>xP0iZ@i>;@{J2856b`Tg09V;{Dn zeF++%#(EqH%cYE1s0PiFREt-4Dhy3PTu82z*GN#tq{USCiAcn;PRK_LKs9JWN-&A^ zm2DldPz{=kPsI?Z$`ONUJ)N=F1~NbjBEd`$O?gC0lmm%oE;K{4(A?G&Fkncmity&~ z9O&?ekqqs|OG8J2#Oyv181@|$4T(S?#zj&MXYB=$0a6fYP#qssZf|Lwgcm{vNNqF{ zLEoX>_S_&HBcKxdE9@55P3zXqyy*k6e0@B^nqZ{HK*6gv3wTYOH18Vo{+Ua-R*ogl z=PH`POLK+0|3N~Hv_>-X6Ff5~b~RpjB-j|7CnwD3`+5>5oJBA)qihY1lcUleytYbqDGz6 zFVj_OTiVsZPWEmusM{scHR>a&&#n)s-&9{keZT9k-4cI1{Y4GO>Ce$W=>AjpV$ZI| z4UHqog!!tbK8BTFXs%*@)AxMea?{#<_LJBjX{lwu#r|f%<9@kyFZUkqbKDOG{yeZa z_&$LMU(z1jJ}$Pz4~lOSKOufg{LP3i{krtak*7z__DwOB@5`Sge@RzxSHApd`TJv8 zflHxvJAN$`6u!cGKqX` zVoYAsI@3wh!>0e4UN?P;)}s-$6&*lVqj#WBnJdgT^K$c1^W)~1Fd?SFG^O~P|M*(S zGU!Aq0RS@s!UT!m#UOpfVBfGhwRr3!=<@}{$ej2qJcyoWLQ=o5{7tX>-E(%%edAxl z;51)ALC~9N)~y2{%fJ3#t|%nM%5^niw4Pl^r%Vy7J@TKs0z7-a6vVS}DFMjht#%x$sL~vfnM+qU>#%Jb z=Bu9Vzj=Sq1r@j``sha;&-_30)9qij^ry6%YH1ldYBqnj719Qds$qZ&MOB%F%dinp z7AXx)i5uHiYekYKrYM89sp0lT0f@|6Be0`TX;8FUEf8BnHrHE~e%Hl{8%w?X3Nk6Q$0!zlN*_20KuYw8le^ zKqM^|S?jk1Sy9u>xZ3h4zTeLV)x5Ag{Hn=fDzpe>bDmL*{lLUUI{i*B>8o)*01}~Q ziW$&#v77`EvVq_E)>g&HeV>)vDOIN8kVmf0zyL!om;uGBw?Q8;W7S{++8+0}ZHA(( zlA@&GCJEfi3R=PA)&x8YL>62OsrQJU!h$S`I^QZoOHT`r);7;MDEMM6cVdWtcy|@r z?De6;BIvO|j!=fKtVtb;4=EJ#h&-eI|6(_D+q;y!dUK^kXNlhjMO6GG&wzT9CS!Wj zSArNI$B69gUw~ZY`*)YhhMt;_N&wUJ0Mtc2(;-G z&e{MuSsMWs@-O@MT_7O5Ow~`a|HWlxJv{LO8{lk+1l+){{NmC5BOvKxrR zV$q<| zw`myUI*R@sMDKn)h@z+uz=@n6Z!-~T!f(3DUg}XN&Yph${lG)NKrEJRfWIr)g_?a% zs8rV&1Ca%S7*FL&nYk7v3W!)+ek}$HvxjQy02E&eP&JK@te3;$&WHmPzOE%L2JzNHZ6UoL8hPf8 zI~Qy4IhUYr`4+~sbSMcP8i`nI`F(0dh3Y*H2hY#89`4Zx6To?VrrUdbCctdvZ~M6N zEoiZY(ZJ<8BVP=N*IXDL*F>;OjpJ!1{K|D5mM2cNJNx@Go@Y)B_%wWe5!2jEOMDt~ zFex5Q^U8sdHGHt8iuI}nYeuu?gHC%`F};JlsE~@)bST0hGn-)i-DCq?Vw3+(Y>u0W?dw!Vviw~R> z?$@f-EhJkcrPi$|osK@W`@5f5F>HppW>0lqP*l&xrnzS4D$9r?vC+=xz=CHj^;Xx# zPI^#^b3- zRBM{-7<(nTgmIrZT6IDd75f)0oSg?`O&iqJjV@T6uI5{NqMDX8VV`%oXsF!z8kZ4d z1i`*Qz?xJ1$&1_6yw`ESNZ<+`lq&)`oAqIh4eq!+RtheWEJJc*zhpKY%YFUW84!=` z93@JyL3y&O>8w99*;oxj_uA;fb~x0MR%1VeMCvE^DP^{}^w3*Fs1R7IVN1KfSd&n1 z>Rn%FbMSdZOkClBTy|5kXewNLrSbEZf7Wp%bft5U4};Qt=z#^FjSxlp#sy2oraP-( zHY3XAJpTBN@RjCfF!>ijxQaF0khtNV94*u|#0*WWAkVc1<)C*OoU#zT z7`ly>=ZC-tE+PfY_Q0Mnj3$kT?tr4HY1tHmc-rz}uc~!vDG_T~Ek=v3pWkMHb0H^z zj@4P!6f-sl>wxcy!|BQ;@XH9GKjj5oOWN&$1n`0H{X`#}4^#|VDL-ZFaw{CVXGQaS zdAZ17VyBh2H)r|>PF=uxXBb40jFf;ViW!2VPzsy!1S7UbV5H#7X8)*n`1(fxo!zR| z8bAT706{@`aD^7QE{M=pDW^b2;v2`KIT~-RbG)GGhHCA?Iv%IZfqMQz^d&rG3Ih2N zq5KF~BbD}*s-BYfR1_6s*wqN*BKrW=$LicjU|3|+3fA2g@cLk(!a|R9Id$34f0Dny zKmL{)I#>mOMCaB8wn`oD#u8ibB-syZvNkstGjh6ZUoOqK|HA{#=#B+|AidC_NsP!67p8$hjKL5PVnCV&N2@4|0=rKFdao8}rcFe}X=^AAJ2 z`lIk7^|J-@58vbY`@jw6=|`e{^r7hK-ytsPhTxUT4j`(~fo)9hpFAK%D-U9o8I~*+ znsNHR^6oMtU|5hpf2c`}sOMWGwO%#-+Vbvs-YNFX)05o;qi3dSZCVR=O^l}%(61I} zhb*#LDb9(}NT-3#g8ZK*Pu^D`Q4F46dn_B_sNwcX1z(tl`ApG*-gd!6t+I7& zk;2$$@_MJO7^SWlSq!8=jl4m~#1%FD!=5XpIbNx4$ivK#sqb3op<-fVWAuv*oELJ+ zko6lpEqyw7k40u$6z?|vSzy7OMWJ)CMx?A@CvqpD(ph2iE;-rVZM4(FPbP&{*nBm; zET6tL8lG{wn#0WKp0w3Ss}bQ|#LVX*8fJG-ilEk2QiK?3lvhc%?|8FM`dA;JE5rbw zF7lbX`E6r992&wW#ZT2immWHpP&5N(YKYxZ7(&nkVl(J%PkM?_`@TsT8z@S0^te}K z;%nQo4LC5EN*wF*7>XCd6fKN6X-$iDq2$))Xd`1Rp=Rhvd$}v2365d#4gnf3<$mZ0y=%#5l_vbmq$E+L&z)|?$*D(^NFeem!XMw^9WM>V)I*y%v9AK!?p*N`B z>$%U`{fsA}N=|UNVd|}IU|U6i%jBdO_w#ckm*%*~@N+CDry}tz3zi^{h)+%ly?1ls zsPF`DF~0~7L9f~8mcl_Sj_<^vboVw=hHD|`v72w^gY$W3xMg}@ZqvrNd!_y`2Xj+` z9L3uf&;zjRD@bXPAO{`E!7)N2MP$lwAPI$>;>Ku$e$$Yq!+x+8KN-oZ0y+-5@|?R{ zJ{^u9Qz#fmYq8G5Cz2vF8gBRU$aL3{t;P!!ru8q^cc&LN?6p!!Cq>6S*&#BZpI+#O z`%h5BbB}1LOY4GnU7KzTinkR z8~#D4Mgva2ZI|YU@(b18cz0Q6)~c!i#m<@ZP4EzWI5cr{EAJ)-Wxn%h+(W-xr@U|G zvF!=33d7ccsQpj_*OR~C$~5B!v+M++1z_gL2@mJqLaSCOkg zr7;npgHYDFgrdog8Qp8&kEwAyEYL7BxQb~_1x-@h3wumnR84X7(w`dRCW<}y6o=Vq zeD8LdjRZ!SBJIq}SbZE#99OwxGc(Yo*?lumG6g#tYc|wTy}N^=&I_+(eV%ddb@a;V z9sVFq91}NRP1B~dzH-VXG#2T`p7gUDxGtrzQ{1^VL;<=cdS#iGI?z6m(3F~NG1;x;HT zg_MqunzJ`M9ro;XqIaMsj*82-MH^=mtWg0CUn>n@x^)6!Y}$SxQWl>Ytn;R6D6B18 zt+Qjz86sO_v{rv$7vX0kTV#X+0oj!`$0=W_v<`4d*wjhH@xEYy)Uvibzv=ZcO_xc0 z!r!BGc%v^uz65Ih<8>sxs@FVzCy3EG;ukUfm}H|GiMiljw-h5Cuzjn z8UORq`BaG=9)2k};7k^RwH=r7X@G@WZCk@BVQ*GK{G1>a`oiL9aD#jHS$R|IbePjM z*^q*4iFCuJA~Ke-%L0!D9BUy$4eUgI54{LK&($!fOy(nIr;lN9cnVve`;>@dFadq$ z_=DEriXxE(bvP!@lK=}%gz?5UvGt;kG~09ClZcH)XV>HbQtAS;*By*erK6!5aoq!} zUZO~IW`nFTN{UxEs+KATQl@wbCm7ib%gY60L(A)x?QI098{?ag8O7o|Q_k`ud%2#5 z7lfjAu4Cd@e*<&aI69~`hM-aAjG*0N);V&8h zBee$tZraxZ5VPYLyYxj5x6`PMrByt|?u5lVd;juM{LV_YWZF-R+=yYUH|bI8D=@X3 z!wE@nZ3n0WW<>cM4v#y`b|Dfv&k+Uu{UqG=C87a3rfYetrCBwWS0ps`gh7T;UHEU6o1Hp}b9!i3;) z3oH@I)y8(c`mkl4T>>}p;q@G^T)RxukH?cs_8v$c2$D*_5VM8T<1~9cJRkj?`Ek_v zGz1mA+Ofi&Us^|!!O%8?8+Tx^;meNA3voF~;BrGxRacGP=`=+$^%F_0i@-#Dg$xZ` zt#GZvKQ<4lme|I=%U(S{S-QTgb}xaj?_6$dK{{8?&Z7>;9XdIA+xuc1mCrsqpLjK= zGy1dg_BcQmvKOZon!4e**g(dyueT9`6w0#J;5jL3;qnTq7xSD}+2k_uG}|l&0|F2_ z?HQY!rvAgT@k|iJ1j7|@ZJ}Dky>A3B2FGF(74ER2rIF=AP1g~&3v*Mcz;mdk3M_hB zw4P!Er6y<^2&qvPYjv;nFFBYGe+dZ-Zowq|2m0_sNi+o-P`x%qpiXQiJ+Zo#}-R-Jd44}MesXp0d>R7oF zE8Y?A6z`-!>mNqer4}o@o{gYKL%LGbu5+}7L5RCFc+VRd6Ibq+3@A`izBR`7K>#4<@OI*tXN)r8!VFY-lM))WV?UW&z@*N`4n zS1<7?@UNLuf5Knf>Vvp^o{46z!*-VJ)a~MjAh|6dJO%GIHTgOof!A{Z#>8d|2r|3A zN>L`10v~d&OXe6A!Wdyolr9Go?}F=`{;52<^1B6a10?&2omt2x&m`CxL{K7>A_kAU zYdYImw?%?Ml0LMioufS7DEG^*v{0_z$Nya;5O-&vJh*z?hCP6I2Cjwc zyV7Ps@Zl=B0bz6X@+3@_x4{ii631N7m8U`z9?J?cei*K64>yrkG+;JDqShGqh@oC_ z<3$YzlW&u~aLIE4mb}_#%(Ux)IDk!ue^;njX{@$ti=Qvgw#sjzLlTj!I zq@_fD^@wz3Tuw*72L4<^19olb&2(cfbg4`xg~A1E8LGhSynM3t;6ZOA7dj3AqjtX} zIVWeKZYfa3(b0Kzmw>}rDj($zr^AdWon^@n=L-Pwc#pVpgMhN!ZTIEL^HsA8Q`j`m z_AtYyvEMY$5AIgX!BrOILk&k1Z1CQ_Uw9RDZ2;+}r zEgcy7S08B~xQu)2>4tDS9yrVGGE54*hMJVbb%qnbHNKx5wN>@SlG{yR5kif@Rn*fQ zo3|{?g`7(54hd*IDf|f_nP_qsF7m6vcQfBNl6o+ZLd>IU49TU80MhS}YGLXf46k?c zfZpOVtLx_**C>2RY>dWsz_&bbgLEbbuBkyxHJr-sEJmGi*f(<%;Gj;hFK{HG0A(@L zp-&Q_OyGxswmYy4t2UW#eVKX!kPM-EhmnhpiAiLfW|7T&OQQ8okdE9aP5r)~tRRuHk|-xWZe{Nu7kES9#=mj?F)G4uvv;^`eD4~6M9}2Rv0c|N zCpBDOww5bTRBcbyH4O-yRNZj4-UvK-WZfYJI4$nsP-3Gqjc~E$;L(hxkY7}NBp^HqE-=tU488{u zc#!gt4W4$KM<{j9^S*v=^cBmkK=D2`&^grV73u+lRZpKQqre%a;yC}eFHyM2E0+lO z>Ri|H1Du565=ywA*r_O|PstC%GiLCe!onhkJ&E`bE_z= z;P2+8{{e(Ax7($Uf7(_Z2lVke{p|4MmL~G!ps-VEcBWIw70FIt46-O#3jE_u5A+yUI zp}G1Lp$kH*QhFV%j-Au51nTMzW-+>OZl5!sg1vc4m+vCod0Nbu|^X6nTP^a#l&{oFF!8}g^1>$%eJ@6BE3H9gQ|#xYS)+jdzGw>Qnx*Fylv1g08DWa z@&fYdNN(orz|*3xJ~``I0ZzRAzTnY+IWJ8%ak`)3+}=kYa>v1Dl?UaaBCWU`duW+I zc@Ip(G@1Hb2lkDwY?;Hhc|}VuWH^V$0OGDVBD`i78wlk#oe8cewvr_BQaCQ8`2Bcu zR5<{BIo7n=e&1Cx8%ty;o|m;ZtAK|4l;kM+LUg9_XkF`1_wR4|FFn~(-*|8z`(y8( zT&GeXn|h^)&}k=`Ev-Y(^#l$%WXL2j>5gEPM=x@s=vei;Q|)C*2O$-nQks6N*Gfr# z_=O>IA+_}#NjRd|;G4md%`;+s7cN$-Z*YFaq{Z1$=&=aTB6!Vf4%N=F1*ExwzUFUk z?VTs;4<4LH7q296d^@{2+k2!uSH4UgU}I_#O3DZcV&z;^dz1YRR1`c^M(mlP;kVo%j6!$dW@|yIR+rW=tnaQt)h?G2a-smlJGDfnZnlR= zQHBN>?b$tQz*Jbws-e0om4Esk|E)^&b%(>+8LUu(QAjJzyIucU&QQ>m=c2BwPhov1-43#FWvBN>~iX6z;m2 zNzQ7x&5~4>$$Tjee=W&cue2qhCzoz#jW9Tak+D9`dCJ9L4fe)S&Xa7YH%f4cf2=*H z_G-eGpQhH*yzbi#^O&X|$y7me$bF{`TC@0Us&HtYj$}O-V*MmdG4=i>#K3y9`@ZQN zM78lAFWnulr(NmfNOE(Y>0If_noNar+8@cDVCrNC8I+}{)z~!G?eg$LWKK{3oaRL7 zsl;<222%DsCuv_Kve-SaANl*L2eiapH4p;@og_FSX1&vAu1AcM3mZU>K~)VqeqIiL z{=w64zbH`q6Ynfi1aoz-bRhW;AF}Q=Y!b3!H%lgmP)N7NCUhg(Rp&5?+>58NIB&<| zGzesoq$ZXsnmLgKaId9nQ8QY$Mjr1w&)Wk$#1WN%f`z+uQ`nMDdGitT4&n51nVpk_ zGdix0#uDdJ3aC{O3UUA?DU*|})}QkP0c4p-svL%^0yrcdng$Brgoi!1V7Di%jf|_y z<_t=NETJ50D?v;{gBm_Q(`uq!d)jT6_Pfo?(#tOutn1o4fd5fj1Nsf!TvdZ>*60z`HO3fSK}}~wb*unav{D0Y zYLNuWiau2pNj28csyAEVcpSCFj`uCc*2=L+-0K$SR_$)d!>vsJXa#(US( zs=JHyc>nn~7fFZGL6Bcp*4AfF5KZtI>lw?5q;7WkAiEe5VvTLWxpd@i{> zD3aJq%|$xYaNSx5#?LTg#KjaGbSY^{V>=Bw$q&yXX*;Y^(YX?_fTawD|WYmj*Ks`v< z*`BDm{G+)eD(bpN=c};Q|9D=?nDj36aJ&}VZf+yZypVN_ZP!IS!aA&$cO(yl7=_+x z6>P*-5>3{20GD}J!eHuJT1?8ZxUSNoRWBRuKtA|;gPK0Y z4zF*nKT)cev>r=vF=P3rln(~R4ohZx_`2POyGebzVb-Z+mNh3^S+7hkWbgMebyD#o zN^B-bs!EwpKc|j~qp)@ZhU+<~TX;GcJxVF$X)P02vPy<5FaqlS?DeRI7hwI_yC1_pDcRHnkroixj|vT6K*EP*37iAvfrK$COFX-E>j&B zQ0=rxk}n)91d&jbWkI+8!q(DXY7S<-t&`$%3fG#kU^oMHghHK=uIk8+)$b(K)G&3pdmrxhte&9gN_z;%T0a-Z=fzjiByY z;G4al@SBY3t-uht#kb-wDf9w$ndy3eYoZ}q-+SvHGR6W<7!?fO2gYd&)NGE9Hh#FVFj(gJ)_mTH zdisqHSTq_3@0K=XSX~^{VbK{*f~dAamvA(I;dIA@U;hRu`|#Nb(D@Yz-P&Ab@atXy zDUuePsxHak=#q4xKzWcdWh>5U`*9*>oiU&4V@WX*HRt6{+n9CEJ|j4RB!T>EuVAei zw@@%uP1tlA)s&;MsbMTVmns(H>zhkg&up&8nSJ+02{ouK&>-TlVU_FpEzm&tu)!Sc zt#$*d+$eSH0&*XE_wNGmz*811Lkpp*{X?(|4lm3$hnGoHULUiI;Or&%&RlW5av2Vm z?}EF*0_&F^{(mopuu_)5z%p70QHx#hYwv8=M;<3w3l3mIGn7P{Ak!D)HlGG_O5dqg?|r6S;=#$IF0jJ9^KvJZPn~_rl8HxUa{A%pnb2pIAc;TJ= z{oSU2-!#T)jh`WYTaZ6 zE1B6;F491W!VPjO<)g>{g#ULHql9bW6`7IdJd=II&UP}fs#~t@XR;X<#}N`Wnyu!T z*kY*Aq8TfCCKW9PGc;;z-1;e3`DvK;+_pACyd`y*IHpWxO42;FTqpLd>)x(bXRoag zkfllIs^?>QZI^;d&Dt|sn-)!KR>RH&nVti?f!KQICu8%B%wnlp1))pzfT!R4n7R1i zHH1^X?w`LXwhw%76ct0?CeNl3jh#`J@q_DR3&}A;17RTLDI`R$u~rj4US^#)nQCY% z1MQUeiw-9`AKR#ie9l}H&l_eHhN&pDU5_~ zZDvKXL?le-?7ST$#&bCDf*I#N@mIcI4JPeJ{|funivZYpd8W0v{Qpr`K-s$we5ZWd zug_r`X4|Da9y|**$sdFWu4Bv+3pW^59h@E*+$eM`oking*GN(at?u_^`NFY0X9R@a^?n#g6uOM)Q)tSzk(N!s*iXtc$9o^H=d_hK1a|vvyoeg_p=G57MlPo!@Pg=U-feU zJcIB&<^#f7fWdS7>kD7#9)!XfdW@cd920CqPg+|A6BHH++kQ-SFv@Lv@)(fY&=8<~`-**4@rNNg0q^Pl!(@4amo!=P4rj(ET#OsV6nFa((#8$c~Qx-0yH7*Irqd=x) zof&i#-OOp6kF7k(m0l>(K(VUYoSYaL&D+K$Le>E`5Kk0ox|9=7W?5PquSw-nr9NYO zBAc_9Ujg9fm11LqyLi#ucIitR;7`eql$<(;JNhqa4s>AisZ(UH?HtSaMgR&#A6p~n zxhUl;ODtWFJb6tRW-8|!^*^i$(WhcjGkYQ_>09|JvJBys;(G{~`Xh=%VKw1^J%v^x zgHwBj?I`PH?=W9J#Kx#qmBwxl;kJqYo|zj08@(xFhNHmbm04c!-`E|GNwLm7X`Or;G-?ByvADr^;k!gPldS4PNx)%j zux)j~NOpp~4|VfGCd5D@l*4ej>pB=pf>{=OE52xqz%a0hA*TBH4na!t**HY7s+_p4 zXKBD-@`A^peNiK17zToJbWBPq)V%T}7ErsgP9xhJXj<5@S5p(C#ltj#EZ)Up7e`lA z_CCp4rqrjpdB-%^?dln08v!z!bT~hd_t&nJU9Xt+N$nz%2zYGKs%zKbRnGn0GQUb5 z8O()jm9ze|aB5I15l6JOrnNQS(-8^qo{_~(^;YAbPer{3D#l#rvSrKrLLea9`pq{r zZ)Uo0XIk4-r2KYDCz_2_pvVZ``_{vJQ_j#3P^K2FvD^LOjv;nFY^9WQa#RXQG78jy z*ZVnHH%D^ne-`_M?$zyCX>vb2BtDuKrb^*wDt(-!QYVrjlwrxwtbNXmiO9P@EZjbY2`yc z*&Ots{a_e&UPFgF26r*)VN8Mir>Ov?nO_f^7 zy$JAh$yg>Q)Gu$TYco=sw<8PochobgP+D87)K<~u($NJ(9Ly2iF-23XjnTTH+W}Iq z${m#Kpna-Tffn7&e`qF`W7t}*VuI;K)<9aqymGkkzM1DxQ4n53G#QRlj65L$MJ4$c zlg$x9pbJG4E0>C37%EP;??B(<{~JngkH7Ts^!2^K&Tg1t+)!(%Dfv(YPsA#3v*toq z)Lu376SvTk&P3SQ6hA&z9#Rlr`zlTfJuLc2Jy%g~0ASsOm$~wE3rnoUE9(Dfcn} zBz=&R%jWzaG8;zRm(5`og5u__fz}^jtql!`@T1G;=;`z`7UCK4fNJQdJeBN)4JO9L zi@6w+QdGuPLV<5~^|MdxuRYQ_a&em12=7_y;5Mv!;MzlXpjoDh`-|3_FS0r>KN%Hq zl9tjZmoJamp3^d2wzl?+Uzs8qXCTwz#Y?TYft`5FufiAbCT0T9+q4V)X?1*=i(eu9 zgTSgVQ6{BE37641l`2i$E|q0V#8Qb&rGms3`Kzy5J~A0wc)-?er#4mFt_}*%Xh=~s z$S@*+S<#Nr4SJXa`*~0ZR|i!9^WF$-U@DvYD<>IW**`;44|nEF|DIK6+PS%xWGt!gzc34v zAlGglFR=-0@|M!dol8}U;^Oh~p@H^ZYy8+TaRea{sjUIU1DVIaC@Wf>W-;EcF_REB z7D0oScJ{8`tnwJG`apjyeubZNu9`X$?omU#RC><3Dpjw)$XPG}{pj+&%jX}D@@6wm zy}&}3qQFU@2qIHH_AAPq+Jrtf4@L)TpFy8s{LV{4BK&6SU+?k@D=#&Qc$)CH8#(e- zpHD1Xpj{2nK?duTWdKVVhrA)1ayMl5dmm( z3Rr8GL(sWb6%Z}bUA7j~~5lbJ~_(Y!I76==+J&>b%vD3Z<}fYXya0{hZ>lqDh6esR%~@qi!vb?wbBs2%VAL6 zk;=1yy1Ww3X9p5-LDZfi){} zh+D!wY2^6sr?2Kr8ig@fSnA7|<+fj&SQR~5(WXTM46t7eJp=$_L&|U)u)~PrI+RO; zhbfc=UvlE^#g!e1g%X?#03|4K>yc%GI$ssNW5f=s5_C|jh50;5NpOYcVJ^oS6Ta4Cn+M0Co)c4oME*+s)CByT{6~fMV_IuK7KC4URq&i_q}Hmc-1{$Q zqYPCcCwZ|$U;!mQ8)+GOm)e=p#bgmH=M+_8VgVl9%=+fHa2vQBDfL}UCBM7i2kDf-Z8(P`=mii-QC=IqapdR(mMAXl)TWPV zNBQXQ1pkL0CwGHCu#taWIXRC;q=(?uc4C!5RD?LlsFrG-*op-e#);@Eu^1V2kI%dS z?xPB(XSSq$SSR*G7j>h#P0)5sXCSiM{#>|Uy56~g6R`-QhNVaK(}Wlqb8@c&6t z+PWkK_+R}TQ9eDImRWh<1Iv~+odMZuuifmmO?T0l&$0G2Bw}rzloK5& zd~u_FD(F@bF^k|Oh@J)lpji3J(P_7!Zp%L`&UgvH zmER7y1Au$SXRZvZVZZC04geMy00^Mo552%KVYqYQEpHHTet(ZHppId^>v81}^0NZT z^x?P(-9hq-X{rYjK^%IFH;RwYZDXvbSf++zr-G*eXl^JiFIYX5%bQ1isEn@i<14H=(Y$Tk`O>ue*8 zB0^7M<~z9?!Bm!J^O)TmPC{+O7_HETWkEiMZgxK6Oblu9*xcI};$}H3W*Wz_Lb**Su}4}Z#COFwM&>Ko z1F)Nmgiiskz7YtC?lf%7lF5IAsBi5n;5VKw%=$oMrypivnVgg}Ey{ zcSr(M2HF6~2*?7c0;mWm45&sCvJS1r3_9VY3vd#YF!GEc zNjUlThXsT8J{ZEMLRqB{4Piq@6@@|tN)#)VE66Lh;Ye0o$w^*Iq@bnZNl{8t7GEk7 zNR{0lc;ucvX03AHL;pst*}mHPk)Gu}vt#rZ4$fPcN`_{pB@9>ylARVA)LXRLxq*=_ zOrO-6s_cP1o8JaAGt30Q#b{+PcB5?Y2 zMBJCOSZ9Bxt1I^Wdr@0vhlDL#Iu1*XS=b#VW>6*3iGvGPEkzU6#o>udKde-rpDB_q v-Yfipda1DZJ8}OAkOLvg4pX`?8&WjEX<}5=lymOs|I>!_hYSAyV}joecyRq6 literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-3.woff2 b/assets/fonts/g-robotomono-3.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2c06834bebb15cfe5d38170c8c2b890d78dfbfe6 GIT binary patch literal 10308 zcmV-KD7)8pPew8T0RR9104PKN5&!@I0801(04Lf20RR9100000000000000000000 z0000SG(SjIK~gUUU_Vn-K~#YpCmsNSSTAZ32nw@ctON^!9sn@HC;>JCBm;sT1Rw>7 z7zc_R3 zyc#es^}JN?spvaUsU3Khx5dxM`-Mm+@I&?_UFF!dmAud z6Gn|1^e`CoHlha%7}cXn_=p%F@E}+XIv|!JEJai zafsEqO;`?BE8~XOtP5^fK`608tg)$6mu^$^MR@przm~t8nN8IoWQJ4;g}DB>h-lg& zlJV6Lu~ul5Tu~XzlGcw+?%)@yZcxvl_7G{u3;J$P+NV8l2|+|s8zk+fbH~>@0Rn(q z6#pUQxo2T9V7#=Zq6l~^E0l%6TbEH;0z3c!WB{N}000C4Kp%jvPDk6C_LyUG;6Sdf z@^?@G<%|}C`p{Vp=`nI@&;@`Y#0L@jVH^YJMFfHbYuGKA*+&8T0L|_g(8Xl{kY{V) zObzv|bQo7a&$WPUxyY+b>h6HqFQf^G7DLvS@DnLno`?vwXM>es9b6FVkv)($#$fR~ z0K0WUrWt*L!B#9@Yd>*f5(En^fPtze%00yJ%j@sAgDB1tOA`q+C=4V`_i{E9$j*)} zz(+>Ka^a&hNQg}v=Cg|f10sb7Vvx)a-)lm1#{V^flR=t?AuU=nk9B+h0Px68?Yt)M zwqIKHZru)iFmq$kLlc32uN&as)9-9Rz(+F1XU2knHDK`3V`0;yO`i@PE+e`Oa2Q&^ zn9#PgU=Uq2xJ#J16Xsk12!d>9W(`%!1rDqb#g8VnH6Yq0B5FbmX7(J^f(U>_L~V%0 z5gBB$1BHfOkC?a~O?2p1&? zC5X}U-?sB6o4bh(H8q(`fxws{($&*7*TA)TJR?K0uC6W5Ucj^BS(C|(D$T?f(~u^h z9VVGZCfjBj@@mK01Y$Y9j7W-0OCea}<8g9l^>HrBD$j6p;6#n5B8!KX^=FLRt+0zP-=liX962B87x$ben7=8{Ms14 zP8D`T6{CU(qdmo1va6#+(|E*ny33$b#qYd6wK5LUW?K^xZ5ual5}z0s#{AYyyGCpA zWvVJ2yS&M+S9`GRAW(GyUXwzk)#7Xd^^GA?J?$=6RD7cTjNKm0_)fwV<7OGujmnN) z!@=XoxZRen%ynb7yT?#{r`(Bgf`GOgt_M|V#s)g4RS>l}`PSGK6vgyR-!nv86qt&u z`97z|if8rMrR?#sSj0Y=@(mR0iD|X+EC9g9rCV4FEV8Mrw8XlbMAPkiVmr5G|L9@e z^_$ZY>LspN$iWQhDK4H>Nlx<7l}#{k>gJQy2lMSY_KhJ5POcl3-y}6t*+kh+Sc~Vy z#1`N+F>PkP`^x&~1Ti~CYmgS$UypOy_F|c290(S|NkrDF0G0h_;S{Sr_^Jj|-R) zRh+ZAAr+MVIu)j46uan`T-7>9Fd-~QQoZ8l7ebm5v zq9ADFcdJ0rahUrocN|KTk>_c zH!wCY;Oj0~(?h7m{Ddm2j3VDi-a2~R@EFJCiFm^Dcp_;z5x48I-JZRsIx9rQG>us9 z_&dMbV*A-8wK;h9Cr^!AnA}1@JNIJXViVVE1$6~t*g9JPKX1g774O5Qq(XHQ~jJG_K zFxz#W9lli{{@Ej%ml#9D)gleBO;cSWr#~%W;vsrefJa!-;`SM#_Oh zmCF`(o~}Mo4L!G#q0hxDy0?NRu zEhA*WCkDC{rHan7&Xm%WE(p+GyAx!39s0q%;K;hwtN#!sCjKs3T^3olp4MwO)Vj3( zmW_HvF8KF>t0Px~z8CvGca!k)v1g9imZD4tsWihuJUkGC{%Fb5J0XW> zHq#gzi#2fZNHxLnu5yUKd<~arkbJ&dhH1b(Ye~cLNm;EtLH($;j%E zy9Bugd0smB3n#+#SCM6jI6SE)#$5WvJfJ2zMON%>>1_H7H0iXDt#X!^#VwL_pY+3vd(p#85?gHI25|N)H>)-%@M13ykD=(PoYM@t@1rD4)zY- zAHB36H)Qkp;8}AO+7sd8=i={j6iSMrM0Cu>-_?IlWEC`%z<=x7 zohZxdqFvl7snhCL{3;0CMX-YIosazCq>m_Tf9?X$^1oxef+AAn+D$vFyk5GedZeGM z{-N=3g*eqK(e2Z)Q8$X_9~T5#_|?Y5$5+c8>}7&eitZ%4+pghDO2o2=s-Og6kj>eU zt!P68x!S3q-FjWhE?12hL!-eFkXhVn9cew(s*W3x=DGGZrJkoJ^{nx?HCFZ(pfYg^ya+_DiC@3@^~w19r?k(^^CG5Yu2jFGKlh-F{Dag;;u z0+y@9-r$&fFLLZt<|q3}&&w-_Oy?-X;_7 zK*x4Bw{}OT4n2Rz&GO*|e$3HT2}45(V4Aa_KC$vpBG~BOT?+wwm&)Zk1WryNw>`h(-R9yvpHq=nf|l=;<+#``$o^v$67|8i;6fVX6-@odJ@wx zZT3IMdQNH??@yL-EX}sW2mT6Pswdi%qio9VkwekbUw*0})*zu{iK(5?XRn4ra|tEM zP~>8@Oh-q+eR6IP#Ot4!QQAx?XaC*;hikn*V;3%9VD|Z?Iptip3f)^q%qTg#f5Cn^ zkAbc7Y}v?$Z6irK8|Zdoqex5ZdJ{*UUYpP^YhyjF!k zkYQ}hqx~VY2`xw}H1hE&G)fA=AMq^lYKN_9vamKI0sgNnQ^SiY=Qk^2ce1r~I2;ih z+$jTey!%SO9Ld=>0v={ftt(r>)3UEw4>vK%6j)`NXySU!LYwfyq#|Qq-^XOMqWUz` zU85EVKA7=EzitUI4N55qjMk;xGB1g0F61#XxlkT*o-1F2u&Ca z1xF8?zcE`{W8wWuD0FnVrdNVe4l zMlod0LJQY+%&C}+;}3otama*0L5KIrh&>d}LHlwsVwYoz2HSnRRGJl2KSYvPMipe1(6Q&9(vgsDcEF|0l zPKciWGg@t{;~Enpa{_Ec%={D?l9_e*On)xMg#WWZ$efJ{|Em-x*W>~d{@<4fnTs&t z|9F{@$;wR%NeX!B-Mn%LgPzNy z!+dKa4h&XP@pp3Qh)I6T#GuIuL9(sRGpgPMpha}KKaVhIG}%cO)olO^X_v(qG-ww* z(FnE!B-`pK0~myZg$Abxt`ZyiHv{2tZ(u|J@fhK72Z*6|sP+a2+!|u2tp(w5SBatU zJHVhrJHyACL+W?cUxN-|m~x`YT`}l+gw>I5XokdA1Rno!XjT@5umyrjYxvp-L|+0) zr~1gx*mF4`pNJ6j0rHTDLQ`hu69Mq@;ca1t&0&$#;c|G1W?*=qOf(CACDa;qb^g)* zueRO;SW>=p&({DpSM4GT&tjZQrmYPIKE&km3GXRj1s>Ksw<&Nl$!!PyOp<;n)F-p_ zji7!`C6A2FQG{%qb~tQy;OLj8#^amo5HSMa%hUWTK1&G4m@*K@vfAAtP@ukxJLXaIhNAUB%3x%Ckf&+&4H<+XB# z73Gcn>wmfAg+;CfTq6g5g15H`eS{P+5s z*iW1$t`YZ$r^E;1pE)tPOmn7?DPcx3Q<(Y8@0e?tzcDv4yP3nx5#}iKU*;rpn&m8Q zmNCngC1Uxo!dZ!|9M)1+Evt#Onbpl2W}ReRVclU(u->zJ6-JC@D(cuEN}3X@HEFd? zza!2Qm=cS^$?ELJN!f(TQKK7h*YD|a?wIH)dqXCY;IixZJZ`^ym4I$xa;o;sv zwl$GT{C%ai==X~mCSDe*rp4oKBxoQC9Au#CrW$kR_Tur}_*##wlh#Th^2zD5MvLhz z^AM9z{XvpVFWFQh#ae$uKmdLSJ9IB@pqyczSe(;@@C{ZK4PGR|?S1-FFJ7@m8+?}bses1QsZL{KBx) z>G67fadWO$s-59XV3I#eO!EO{17IDOqKFnD7%0&nE)9T+`& zI4w=?=gLJ7i7HU3v@5Qwa6}w%+749}z=Z&sRHt7_};7D+a@wNMDQegAfgVv2A>+D?YMx zwzfH!A>p#}FF)E>G`GV1KQ1j(S2Y1?<3}lP9gnh_q8pZX1FWtkH=W&dSV_v7S@Xr# zOanzth>_L+m}vqyjrb_Xz=q@*hx{L^>&KKg(Az2dvjwtIwwK^U{ncQPL_4^v0wqfz z`0P5S zE)4{^0sM$I8vqQ#fZ44b_MM5vFO_Zbf=r7OuZvO3H(k>L@m*-^-pvVU7nBO50Txq# zV)jB3`62jP_=A3(rBpG{^82lE+0Kdj*-`}nYd-$gO>aHj#|M_(s<`{;CY2OMRlVIm zA7>aMjp4op1yJ~ATdYGf1ZoqErWDV!EG-g4s7c*pZvLIFf@1OZ{5T@Dth~G|HA12f z>^6Q^(UGl0-eCzIrD>L=`G9dgG}OhVjglQ|%tT}cy9gg=9?oB>`tLFv9g2`K*gZ8~ zUX-jyvqxD8OrUR7dz8F`WxQ)y9DO(>>VLp7f{O(jwy6!bHq;FQCIS(=Y(_vF6sbTI z`glaO{e630Kc zu%&#ZyMf!1y4S>5m?mLEa%ZQ54DbT?DjB?Vq`n}k!~3sxWM{Ryosvu>4>VD;cSs!q zc+30D_r~E&GV2d9R><|=c~~5dDK8m^`+Kn^*M?g{LW6^Xp6rB8?|Jt$I!-Nb%+MrD z3*4~21tXNRFzTa_)H7!$srF#T7Yn82`PL4oi28sS!hrvuGz%H%ldDCJGk}c9+eLst z?Fo3#dVqvz6zv&UIc&9C9cF>=dx14y*y>PRtGAz!U#jnB)Eis#^7HfJ!UFw6x~`D$ zZVcM4{QM*m9Eh1Z|0#8DplS7<$jna9j&^i^k!xbZmadKtVd(!Uz!*XlGMR!vUDx&B zE1Udpvyw{jmv{RO9qsKM-TO}a2Nc87(oo-B_YQE~1T+-#Nxnn%`}p<+SBlk^ykra3 zjjf@fFF-><$CW{90n9-YH1$&a#PwkzCo}<84_2=Dt~AstV@f=35h{oBlILeV4lG}s z>GIFy7OW+ampTorJxNM>CyJcf*sp&Zlod1r*N?DS|HU+EhlCAw6ve+%h~v#lNJ6@OPMrnNm99+wF|-aQa&AFi(Dxbmr6lZ6J_FN0FoO3Hj1<+mn(R)ZGEg0vQ-(!=9QZv1j7|?FPpZxooATbv z)>^beSqF{u=jURWpK_cUY@0o4tGq67_tuMF8k(}yznW#gtAqo(I71lwCwl8{ONAvpc24-OplvVNP$vuzw;pweqlJ3>E^whdenrEvP zWTm@7;cVn0kGoP_)T?Hf(P7=;+FvlymS6FW< ze4QybAN^S?bGZgfVHVGwch+YyD%itUW}yihpH9Kd z8d$|&qtMdio+t`rN1fFO@UKXj948@@i)UCQ7JjRjMfWvR*Kab^qpeJ9V|+qFe1J;^ z*x|ktlCH*yzJj^0o*tBN%N78TT&tQQx=m)r<^N$Em`v)_R*pNLB_NKb?4{v^=@v3U zEiyQnyqRU(N)A-#T(@M!=ipDV$(o!mbt3)^b+aw!t2HaRNf|Ax%0wcWX||tDK1F>o zx%&jJ%426;C|;_kPDhfmnI97IJF;DeCJ>tu9wG*3f4Ni8ld^MIQnZWO7*Xf~bZY$~ z*qDv3mwDam4eCJe<+s`$r28*`JZcV@A&s9dG!|&Kj<6Y751LhpVf2x=jO(quDT}Ku z+u*pSFw4#$U;?ufY53{Ku8?FNXfDblW(TkD9b(z!j*N^{4~fs*^Ez~+zQKVJa66&o z0)O}oPQ~VYc(;DS$qg{qh%@yyM8{y5@u^yE`-HsLK%XTwI(NM+03uODIk3F3{VJmj zq6%J=rS6b!KlQu)uaH7w8v;c+93L8Tj{>WwXrj}sl^`ZCMsjvwLDU>x4^E7>#Dsa2 zXqcF!so90LutY+}1qC!mv({)09*$VQAgh`d8Z#`f8m0r$G<0P@ISRKG zJLL3u7eW?kG>TDew_h;0@{asxLI3q#!7c?Og}z<&(0`nxf+TP-`tlkD5tvjIs8o+) zO4~OsqU~kNU9+C8gc>Y_4UQ^VJbp~Txdl01z=+E6Y*H@O&|~R=)V_SNbXn9@2EAM( zeuPd#SZu9Z^VuD@89{E*-7;x@qMf}dkUcL+b2RYO-+}ekhcT^KU=wr`Z6`vGX?Pov{<(QJj9UC(?9UDGP! zB>6E`d~v)v74^XD+ect6ra%U=1x_A7HM~FTDewf(d;{XcOThv+FoP?;M~kD=Y Z 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 WT|-k#JMa8f4USh(qs=w}0002hN7P{e literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-4.woff2 b/assets/fonts/g-robotomono-4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..532a888acc56caa2a15d60310419a08c19861bf9 GIT binary patch literal 22916 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-5.woff2 b/assets/fonts/g-robotomono-5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b02e2d6c7f8901f3eb05af80a2a83cfdc6d0aa4e GIT binary patch literal 35912 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 ArvLx| literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-6.woff2 b/assets/fonts/g-robotomono-6.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ae2f9eb07f5bcc4cd04837e7b81e981a6ec0e290 GIT binary patch literal 14044 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 O-^LyLpW0vt0002rdp!XF literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-7.woff2 b/assets/fonts/g-robotomono-7.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bfa169c30067c4d08aa76dfb11f28526d169c9ea GIT binary patch literal 32796 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/g-robotomono-8.woff2 b/assets/fonts/g-robotomono-8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8a15f5c1ebe002a1e4946b17672cce6f7344d40e GIT binary patch literal 18592 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/modesto-condensed-bold.woff2 b/assets/fonts/modesto-condensed-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..642c594f24ef6c4981a9cce53beedaa320730a7f GIT binary patch literal 20604 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/modesto-condensed.woff2 b/assets/fonts/modesto-condensed.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bf6a617c445c42490694d8fc3b3a283b879012e5 GIT binary patch literal 21712 zcmV)EK)}CuPew8T0RR91094Qb6951J0MaA?090cD1poj500000000000000000000 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 0; + const s = String(str); + for (let i = 0; i < s.length; i++) { + h ^= s.charCodeAt(i); + h = Math.imul(h, 16777619); + } + return h >>> 0; +} + +function mulberry32(a) { + return function () { + a |= 0; + a = (a + 0x6d2b79f5) | 0; + let t = Math.imul(a ^ (a >>> 15), 1 | a); + t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +function makeRng(seed) { + return mulberry32(hashSeed(seed)); +} + +/** A fresh human-friendly seed, e.g. "BPN-7F3A-21C9". Uses Math.random by + * design — call this once at the app layer, then everything downstream is + * deterministic from the returned string. */ +export function randomSeed() { + const block = () => Math.floor(Math.random() * 0xffff).toString(16).toUpperCase().padStart(4, "0"); + return `BPN-${block()}-${block()}`; +} + +/* ---- small helpers ------------------------------------------------------ */ + +function pick(rng, arr) { + return Array.isArray(arr) && arr.length ? arr[Math.floor(rng() * arr.length)] : ""; +} + +function rollDie(rng, faces) { + return Math.floor(rng() * faces) + 1; +} + +function pad(n, width = 3) { + return String(n).padStart(width, "0"); +} + +function take(value, fallback = "") { + const v = String(value ?? "").trim(); + return v || String(fallback ?? "").trim(); +} + +function clampSquad(value) { + const n = Number(value ?? 4); + if (!Number.isFinite(n)) return 4; + return Math.max(1, Math.min(8, Math.round(n))); +} + +function formatScl(value = 0) { + const n = Number(value ?? 0); + if (!Number.isFinite(n)) return "+0.0"; + const fixed = Math.abs(n) >= 1 ? n.toFixed(1) : n.toFixed(2); + const trimmed = fixed.replace(/\.?0+$/, ""); + return `${n >= 0 ? "+" : ""}${trimmed}`; +} + +/* ---- reward / SCL maths ------------------------------------------------- */ + +function creditsFromRange(range = { min: 0, max: 0 }, tier = "mid") { + const min = Number(range?.min ?? 0); + const max = range?.max == null ? null : Number(range.max); + if (!Number.isFinite(min)) return 0; + if (max === null || !Number.isFinite(max)) { + if (tier === "low") return Math.round(min); + if (tier === "mid") return Math.round(min * 1.15); + return Math.round(min * 1.35); + } + if (tier === "low") return Math.round(min); + if (tier === "high") return Math.round(max); + return Math.round((min + max) / 2); +} + +function tierFromRoll(roll = 1) { + if (roll <= 2) return "low"; + if (roll <= 4) return "mid"; + return "high"; +} + +function mediaFromRoll(roll = 1) { + if (roll <= 1) return "None"; + if (roll <= 3) return "Station Analysis"; + if (roll <= 5) return "Third Eye News"; + return "GoreZone / Contract Circuit Special"; +} + +function rewardPackage(rng, colour, input) { + const paymentTypeRoll = rollDie(rng, 6); + const cbsTierRoll = rollDie(rng, 6); + const sclTierRoll = rollDie(rng, 6); + const mediaRoll = rollDie(rng, 6); + const financierRoll = rollDie(rng, 6); + + const squadSize = clampSquad(input.squadSize); + const paymentType = input.paymentType && input.paymentType !== "__RANDOM__" + ? String(input.paymentType) + : (paymentTypeRoll <= 4 ? "Per Squad" : "Per Operative"); + const cbsTier = tierFromRoll(cbsTierRoll); + const sclTier = tierFromRoll(sclTierRoll); + + const grossPerOp = creditsFromRange(colour.cbsPerOpRange, cbsTier); + const grossPerSquad = creditsFromRange(colour.cbsPerSquadRange, cbsTier); + const grossContractValue = paymentType === "Per Operative" ? grossPerOp * squadSize : grossPerSquad; + + const financierCutPercent = input.financierCutPercent + ? Number(input.financierCutPercent) + : (financierRoll <= 2 ? 10 : financierRoll <= 4 ? 15 : 20); + const netContract = Math.max(0, Math.round(grossContractValue * (1 - financierCutPercent / 100))); + const takeHomeEach = Math.max(1, Math.floor(netContract / squadSize)); + + const sclByTier = { + low: Number(colour.sclRange?.min ?? 0.1), + mid: Number(colour.sclRange?.typical ?? colour.sclRange?.min ?? 0.1), + high: Number(colour.sclRange?.max ?? colour.sclRange?.typical ?? 0.2) + }; + + return { + paymentType, + squadSize, + grossContractValue, + netContract, + takeHomeEach, + financierCutPercent, + cbsBandOp: `${colour.cbsPerOpRange?.min ?? 0}c - ${colour.cbsPerOpRange?.max ?? "?"}c`, + cbsBandSquad: `${colour.cbsPerSquadRange?.min ?? 0}c - ${colour.cbsPerSquadRange?.max ?? "?"}c`, + sclIncrease: formatScl(sclByTier[sclTier] ?? sclByTier.mid), + mediaCoverage: input.mediaCoverage && input.mediaCoverage !== "__RANDOM__" + ? String(input.mediaCoverage) + : mediaFromRoll(mediaRoll), + notes: `Financier cut assumed at ${financierCutPercent}%. Take-home is after the financier slice, split across ${squadSize} Operatives.`, + rolls: { paymentType: paymentTypeRoll, cbsTier: cbsTierRoll, sclTier: sclTierRoll, media: mediaRoll, financier: financierRoll } + }; +} + +/* ---- derived prose ------------------------------------------------------ */ + +function objectiveFromFocus(focusText = "") { + const t = String(focusText ?? "").toLowerCase(); + if (t.includes("eliminate")) return "Neutralise the designated threat and confirm status."; + if (t.includes("escort") || t.includes("protect")) return "Keep the protected asset moving and alive through the full route."; + if (t.includes("retrieve")) return "Recover the designated item, data, or specimen intact and preserve chain of custody."; + if (t.includes("investigate")) return "Identify culprit(s), secure evidence, and produce an admissible corporate finding."; + if (t.includes("contain") || t.includes("quarantine")) return "Lock the threat down before it jumps sectors."; + if (t.includes("riot") || t.includes("crowd")) return "Restore order without losing the public narrative."; + if (t.includes("hunt")) return "Track, isolate, and capture or terminate the named target."; + if (t.includes("clean up")) return "Recover all traces of the prior SLA incident before public disclosure."; + if (t.includes("sabotage") || t.includes("destroy")) return "Disable the objective and leave a believable false story behind."; + return "Complete the assigned contract objective and report all outcomes."; +} + +function cleanupDirective(colourKey = "blue") { + const k = String(colourKey ?? "blue").toLowerCase(); + const map = { + blue: "Restore basic street function and hand the site back looking manageable.", + yellow: "Protect the recovered asset's chain of custody at all times.", + green: "Confirm every kill and leave nothing twitching for the cameras.", + white: "Return with evidence, witnesses, and a narrative command can sign off on.", + grey: "Keep the paperwork clean and the department's name out of the fallout.", + silver: "Keep public optics sponsor-safe from briefing to extraction.", + jade: "Seal contamination and route all samples through Karma only.", + red: "Stabilise the zone first, then explain it to the cameras.", + black: "Remove traces, minimise witnesses, and suppress operational signatures.", + platinum: "Preserve classification and return all material to Head Office only." + }; + return map[k] ?? "Recover evidence, suppress compromising exposure, and file a command-ready debrief."; +} + +/** Trim trailing whitespace/punctuation so clauses join cleanly. */ +function trimEnd(s = "") { + return String(s).replace(/[.\s]+$/, ""); +} + +/** Lowercase only the first letter — keeps acronyms (SLA) and names (DarkNight). */ +function lcFirst(s = "") { + const v = String(s); + return v.charAt(0).toLowerCase() + v.slice(1); +} + +function buildMissionBrief(b) { + const objective = lcFirst(trimEnd(objectiveFromFocus(b.missionFocus))); + const loc = trimEnd(b.location); + const opp = lcFirst(trimEnd(b.opposition)); + return [ + `${b.issuingDepartment} has issued ${b.bpnId}, a ${b.colour.label.toUpperCase()} ${b.colour.type.toLowerCase()} contract.`, + `${b.contact.name} — ${b.contact.role} — wants the squad to ${objective}.`, + `Operational spine: ${loc}.`, + `${b.hook}`, + `Expect ${opp}.`, + `Media posture is ${b.reward.mediaCoverage.toLowerCase()}; command expects a clean narrative.` + ].join(" "); +} + +/* ---- public API --------------------------------------------------------- */ + +/** + * Resolve a complete BPN from inputs. + * @param {object} opts + * @param {string} [opts.seed] Reproducibility seed; one is generated if absent. + * @param {string} [opts.colourKey] Force a colour band; otherwise rolled on the d20 table. + * @param {string} [opts.frameId] Force a scenario frame within the band. + * @param {object} [opts.overrides] Any field to pin to a specific value (e.g. {location: "..."}). + * @param {number} [opts.squadSize] Default 4. + */ +export function generateBPN(opts = {}) { + const seed = take(opts.seed, randomSeed()); + const rng = makeRng(seed); + const ov = opts.overrides ?? {}; + + // Colour band: forced, or rolled on the d20 issue table. + let colour; + let colourRoll = 0; + if (opts.colourKey) { + colour = colourByKey(opts.colourKey); + } else { + colourRoll = rollDie(rng, 20); + const row = COLOUR_ROLL_TABLE.find((r) => colourRoll >= r.min && colourRoll <= r.max) ?? COLOUR_ROLL_TABLE[0]; + colour = colourByKey(row.key); + } + + // Scenario frame within the band. + const frames = framesForColour(colour.key); + const frame = (opts.frameId && frames.find((f) => f.id === opts.frameId)) || pick(rng, frames); + + const reward = rewardPackage(rng, colour, { squadSize: opts.squadSize ?? ov.squadSize, ...ov }); + + const contactName = take( + ov.contactName, + `${pick(rng, TABLES.contactFirstNames)} ${pick(rng, TABLES.contactLastNames)}` + ); + + const hookFallback = frame.colourMissionIdea || pick(rng, COLOUR_MISSION_IDEAS[colour.key] ?? []); + + const bpn = { + seed, + bpnId: take(ov.bpnId, `${colour.label.toUpperCase().slice(0, 2)}-${pad(rollDie(rng, 999))}-${pad(rollDie(rng, 999))}`), + shortTitle: take(ov.shortTitle, frame.shortTitle), + colourKey: colour.key, + colour, + issuingDepartment: take(ov.issuingDepartment, frame.issuingDepartment || pick(rng, TABLES.issuingDepartments)), + squadSize: reward.squadSize, + sclRequirement: take(ov.sclRequirement, colour.sclReq), + + contact: { + name: contactName, + role: take(ov.contactRole, frame.contactRole), + location: take(ov.contactLocation, frame.contactLocation) + }, + + missionFocus: take(ov.missionFocus, frame.missionFocus || pick(rng, TABLES.missionFocus)), + hook: take(ov.hook, hookFallback), + objective: objectiveFromFocus(take(ov.missionFocus, frame.missionFocus)), + location: take(ov.location, frame.location || pick(rng, TABLES.locations)), + atmosphere: take(ov.atmosphere, frame.atmosphere || pick(rng, TABLES.atmospheres)), + opposition: take(ov.opposition, frame.opposition || pick(rng, TABLES.opposition)), + civilianFaction: take(ov.civilianFaction, frame.civilianFaction || pick(rng, TABLES.civilianFactions)), + extraObjective: take(ov.extraObjective, frame.extraObjective || pick(rng, TABLES.extraObjectives)), + cleanupDirective: cleanupDirective(colour.key), + + reward: { + paymentType: reward.paymentType, + grossContract: `${reward.grossContractValue}c (${reward.paymentType})`, + grossContractValue: reward.grossContractValue, + takeHomeEach: `${reward.takeHomeEach}c each`, + financierCut: `${reward.financierCutPercent}%`, + financierCutPercent: reward.financierCutPercent, + sclIncrease: reward.sclIncrease, + mediaCoverage: reward.mediaCoverage, + cbsBandOp: reward.cbsBandOp, + cbsBandSquad: reward.cbsBandSquad + }, + + // Seam for a future NPC/monster module: archetype keys only, no stat schema. + npcSeam: { + contactArchetype: frame.contactArchetype ?? null, + threatArchetype: frame.threatArchetype ?? null, + threatRole: frame.threatRole ?? null + }, + + // GM-only truth. The renderer keeps this on a separate surface. + gm: { + complication: take(ov.complication, frame.complication || pick(rng, TABLES.complications)), + localTwist: take(ov.localTwist, frame.localTwist || pick(rng, TABLES.localTwists)), + oppositionAttitude: take(ov.oppositionAttitude, frame.oppositionAttitude || pick(rng, TABLES.oppositionAttitudes)), + escalationEvent: take(ov.escalationEvent, frame.escalationEvent || pick(rng, TABLES.escalationEvents)), + threatLead: take(ov.threatLead, frame.threatRole), + threatCountLabel: take(ov.threatCountLabel, frame.threatCountLabel), + financierNote: reward.notes, + frameId: frame.id, + rolls: { colour: colourRoll, ...reward.rolls } + } + }; + + bpn.missionBrief = take(ov.missionBrief, buildMissionBrief(bpn)); + return bpn; +} diff --git a/core/data/colours.js b/core/data/colours.js new file mode 100644 index 0000000..b4ee944 --- /dev/null +++ b/core/data/colours.js @@ -0,0 +1,156 @@ +/* SLA Industries BPN colour bands — the spine of the whole system. + Pure data, no engine or DOM dependencies. Each band carries its + classification, pay/SCL/media profile, and a render accent. */ + +export const COLOURS = [ + { + key: "blue", + label: "Blue", + type: "Street Maintenance", + summary: "Street maintenance and dirty clean-up contracts.", + details: "Sewer clearances, vermin extermination, infrastructure support, and low-end evictions.", + sclReq: "10 - 9", + sclRange: { min: 0.05, typical: 0.1, max: 0.2 }, + cbsPerOpRange: { min: 50, max: 150 }, + cbsPerSquadRange: { min: 100, max: 300 }, + mediaCoverage: "Rare / None", + accent: "#57b3ff" + }, + { + key: "yellow", + label: "Yellow", + type: "Retrieval", + summary: "Recover a person, item, data package, or specimen.", + details: "Primary objective is bring it back, often issued by Housing, Cloak, or Karma.", + sclReq: "10 - 9", + sclRange: { min: 0.05, typical: 0.1, max: 0.2 }, + cbsPerOpRange: { min: 100, max: 200 }, + cbsPerSquadRange: { min: 200, max: 400 }, + mediaCoverage: "Station Analysis / None", + accent: "#ffdb6e" + }, + { + key: "green", + label: "Green", + type: "Cloak / Extermination", + summary: "Combat-focused extermination and suppression assignments.", + details: "Kill or capture designated threats before they escalate into full emergency response.", + sclReq: "10 - 8", + sclRange: { min: 0.1, typical: 0.1, max: 0.3 }, + cbsPerOpRange: { min: 100, max: 250 }, + cbsPerSquadRange: { min: 200, max: 500 }, + mediaCoverage: "Station Analysis / Third Eye", + accent: "#78d48f" + }, + { + key: "white", + label: "White", + type: "Investigation", + summary: "Detective and analytical assignments.", + details: "Evidence-led cases with witness work, profiling, and pattern analysis.", + sclReq: "10 - 7", + sclRange: { min: 0.1, typical: 0.1, max: 0.3 }, + cbsPerOpRange: { min: 150, max: 300 }, + cbsPerSquadRange: { min: 250, max: 500 }, + mediaCoverage: "Third Eye / Station Analysis", + accent: "#dce8f9" + }, + { + key: "grey", + label: "Grey", + type: "Departmental Enforcement / Corporate", + summary: "Internal enforcement and politically sensitive corporate work.", + details: "Escort, asset protection, audit support, and departmentally awkward clean-ups.", + sclReq: "9 - 7", + sclRange: { min: 0.1, typical: 0.2, max: 0.3 }, + cbsPerOpRange: { min: 200, max: 400 }, + cbsPerSquadRange: { min: 300, max: 600 }, + mediaCoverage: "Station Analysis", + accent: "#9da6b3" + }, + { + key: "silver", + label: "Silver", + type: "Diplomatic / Escort / PR", + summary: "High-profile, social, and reputation-sensitive contracts.", + details: "VIP escort, public appearances, negotiations, and camera-facing operations.", + sclReq: "9 - 6", + sclRange: { min: 0.1, typical: 0.2, max: 0.4 }, + cbsPerOpRange: { min: 200, max: 500 }, + cbsPerSquadRange: { min: 300, max: 800 }, + mediaCoverage: "Third Eye / GoreZone", + accent: "#d7dee8" + }, + { + key: "jade", + label: "Jade", + type: "Environmental / Biohazard", + summary: "Containment and neutralisation of biological and chemical threats.", + details: "Biohazard incidents, toxic leaks, mutations, and containment failures.", + sclReq: "9 - 6", + sclRange: { min: 0.1, typical: 0.2, max: 0.4 }, + cbsPerOpRange: { min: 250, max: 500 }, + cbsPerSquadRange: { min: 400, max: 800 }, + mediaCoverage: "Third Eye / Contract Circuit", + accent: "#41d0a3" + }, + { + key: "red", + label: "Red", + type: "Emergency Response", + summary: "Crisis-response and red-alert operations.", + details: "Riots, terror incidents, major failures, and high-risk live-response deployments.", + sclReq: "10 - 5", + sclRange: { min: 0.1, typical: 0.2, max: 0.5 }, + cbsPerOpRange: { min: 200, max: 500 }, + cbsPerSquadRange: { min: 300, max: 1000 }, + mediaCoverage: "Third Eye / GoreZone", + accent: "#ff6f6f" + }, + { + key: "black", + label: "Black", + type: "Covert / Black Ops", + summary: "Classified, deniable, and often off-record operations.", + details: "Assassination, sabotage, deep infiltration, and disavowed clean-up actions.", + sclReq: "7 - 4", + sclRange: { min: 0.2, typical: 0.4, max: 0.7 }, + cbsPerOpRange: { min: 500, max: 1000 }, + cbsPerSquadRange: { min: 800, max: 2000 }, + mediaCoverage: "None (classified)", + accent: "#9a7cff" + }, + { + key: "platinum", + label: "Platinum", + type: "Head Office / Top Secret", + summary: "Highest-level Head Office operations.", + details: "World-shaping, deeply classified, and politically lethal assignments.", + sclReq: "5 - 1", + sclRange: { min: 0.3, typical: 0.5, max: 1.0 }, + cbsPerOpRange: { min: 1000, max: null }, + cbsPerSquadRange: { min: 1500, max: null }, + mediaCoverage: "Classified / Special", + accent: "#f5f0d7" + } +]; + +/* d20 issue table — how often each band lands when rolled randomly. */ +export const COLOUR_ROLL_TABLE = [ + { min: 1, max: 4, key: "blue" }, + { min: 5, max: 7, key: "yellow" }, + { min: 8, max: 9, key: "green" }, + { min: 10, max: 12, key: "white" }, + { min: 13, max: 13, key: "grey" }, + { min: 14, max: 14, key: "silver" }, + { min: 15, max: 15, key: "jade" }, + { min: 16, max: 17, key: "red" }, + { min: 18, max: 19, key: "black" }, + { min: 20, max: 20, key: "platinum" } +]; + +export const COLOUR_BY_KEY = Object.fromEntries(COLOURS.map((c) => [c.key, c])); + +export function colourByKey(key = "white") { + return COLOUR_BY_KEY[String(key ?? "white").toLowerCase()] ?? COLOUR_BY_KEY.white; +} diff --git a/core/data/frames.js b/core/data/frames.js new file mode 100644 index 0000000..eecaecd --- /dev/null +++ b/core/data/frames.js @@ -0,0 +1,362 @@ +/* Hand-authored scenario frames, two or more per colour band. Each frame is a + coherent, ready-to-run BPN: player-facing situation plus the GM's true + pressure point and twist. The `contactArchetype` / `threatArchetype` fields + are deliberately retained as a seam — a future NPC/monster module can read + them to spin up stat blocks without this module owning any engine schema. */ + +export const FRAMES = { + blue: [ + { + id: "blue-pump-clearance", + shortTitle: "Pump Ghosts", + missionFocus: "Eliminate a threat before it reaches public view.", + colourMissionIdea: "Clear Carrien from a sewer pumping station before repair crews go live on-site.", + location: "Sewer network and maintenance tunnels beneath a low-SCL tenement arc.", + atmosphere: "Oppressive rain above ground, ankle-deep runoff below, and every tunnel echoing with machine throb.", + opposition: "Carrien packs and one nest-alpha using the flooded access galleries.", + oppositionAttitude: "Are starving, territorial, and driven to charge anything making light or noise.", + civilianFaction: "Maintenance workers trying to keep the block from flooding into the hab levels.", + extraObjective: "Recover one intact sample of the contamination feeding the nest.", + escalationEvent: "If the pumps stay offline too long, the whole block begins to flood and civilians panic upward.", + complication: "The maintenance foreman has been selling access schematics to scavengers and will try to hide it.", + localTwist: "The contamination is not accidental; someone seeded the tunnels to force a redevelopment contract.", + issuingDepartment: "Mort Department / Ops Control", + contactRole: "Shift Maintenance Controller", + contactArchetype: "controller", + contactLocation: "A barricaded relay room overlooking the lower pump shafts.", + threatArchetype: "carrien", + threatRole: "Nest Alpha", + threatCountLabel: "One alpha and a fast-moving pack." + }, + { + id: "blue-eviction-cleanout", + shortTitle: "Residue Notice", + missionFocus: "Clean up an old SLA operational mess.", + colourMissionIdea: "Evict squatters and secure a condemned recycler before demolition crews arrive.", + location: "A half-powered recycling depot in a condemned housing strip.", + atmosphere: "Chemical fog hangs low and the whole block stinks of hot metal, wet plaster, and old blood.", + opposition: "A desperate street gang holding the depot plus a few terrified scavenger families inside the same shell.", + oppositionAttitude: "Talk hard, posture for cameras, but are ready to fold if offered one way out.", + civilianFaction: "Neighbourhood residents who want the gang gone but do not trust SLA to distinguish them from the problem.", + extraObjective: "Keep the recycler's core machinery functional for sponsor inspection.", + escalationEvent: "A scavenger fire starts in the upper catwalks, pushing everyone toward the same exit lanes.", + complication: "The depot contains evidence from an earlier SLA kill-team visit that nobody filed correctly.", + localTwist: "The original paperwork deliberately misclassified the site so a corporate shell company could seize it cheaply.", + issuingDepartment: "Department-M / Internal Containment", + contactRole: "Department-M Disposal Clerk", + contactArchetype: "analyst", + contactLocation: "A mobile command kiosk parked behind a portable blast shield.", + threatArchetype: "ganger", + threatRole: "Depot Gang Boss", + threatCountLabel: "One loud boss and half a dozen badly coordinated shooters." + } + ], + yellow: [ + { + id: "yellow-prototype-recovery", + shortTitle: "Cold Return", + missionFocus: "Retrieve an item or specimen intact.", + colourMissionIdea: "Recover a stolen prototype before it disappears into the black-market chain.", + location: "A transit interchange feeding into a hidden market spine.", + atmosphere: "Packed concourses, vendor noise, flashing route boards, and too many bodies to easily track the courier.", + opposition: "A retrieval crew working for organised crime with local route control and fast bikes on standby.", + oppositionAttitude: "Would rather run than fight, but will kill witnesses if boxed in.", + civilianFaction: "Black-market traders who know the unofficial routes and sell them to whoever pays first.", + extraObjective: "Bring back the data case unopened and verifiably untampered.", + escalationEvent: "The courier network triggers a station lockdown and reroutes all civilian flow through the kill zone.", + complication: "The package is still broadcasting, making every interested party converge on the same target.", + localTwist: "The prototype is bait; Head Office actually wants the retrieval crew followed back to a higher-value buyer.", + issuingDepartment: "Cloak Tactical Oversight", + contactRole: "Independent Financier", + contactArchetype: "fixer", + contactLocation: "A quiet cafe mezzanine overlooking the station's arrivals board.", + threatArchetype: "retrieval-crew", + threatRole: "Courier Handler", + threatCountLabel: "One handler, two bike-runners, and a sniper looking after the exchange." + } + ], + green: [ + { + id: "green-cannibal-perimeter", + shortTitle: "Wall Bite", + missionFocus: "Eliminate a threat before it reaches public view.", + colourMissionIdea: "Hit a breach team before it can break through the Cannibal Sector perimeter and trigger a broadcast panic.", + location: "The Cannibal Sector perimeter wall and the service roads wrapped around it.", + atmosphere: "Sirens, floodlights, wet concrete, and the constant thump of distant impact on the wall plating.", + opposition: "Cannibal raiders with improvised breaching charges and a local guide inside the city side.", + oppositionAttitude: "Are committed, feral, and keen to take someone back with them if the breach fails.", + civilianFaction: "A transient cluster of freight workers trapped near the service roads during lockdown.", + extraObjective: "Capture one living raider who can identify the city-side collaborator.", + escalationEvent: "A secondary breach warning forces Shiver units to peel away, leaving the squad exposed.", + complication: "The internal guide is wearing a legitimate contractor pass and can blend into evac traffic.", + localTwist: "The breach is a distraction for an unrelated extraction happening two gates away.", + issuingDepartment: "Shiver Command Liaison Desk", + contactRole: "Perimeter Shiver Sergeant", + contactArchetype: "shiver", + contactLocation: "An armoured checkpoint container bolted to the inner wall road.", + threatArchetype: "raider", + threatRole: "Breacher Chief", + threatCountLabel: "A brutal lead breacher with a fast assault cell behind him." + }, + { + id: "green-kill-order", + shortTitle: "Dead Feed", + missionFocus: "Hunt a named hostile and confirm status.", + colourMissionIdea: "Stop a contract killer before the second murder finishes the media pattern.", + location: "A rain-soaked rooftop district threaded with service bridges and maintenance lifts.", + atmosphere: "Visibility is broken by rain, neon reflections, and intermittent drone spotlights.", + opposition: "A professional killer with a two-person support team and pre-positioned escape routes.", + oppositionAttitude: "Remain cool, efficient, and willing to trade casualties for a clean getaway window.", + civilianFaction: "A cluster of thrill-streamers trying to capture the chase from nearby rooftops.", + extraObjective: "Recover the killer's weapon package and comms slate intact.", + escalationEvent: "The support team remotely kills the lights and forces the pursuit onto unsecured skybridges.", + complication: "The target has a face the public already knows, making collateral narrative control much harder.", + localTwist: "The supposed contract is only the visible layer; the true target is hidden among the responding authorities.", + issuingDepartment: "Mort Department / Ops Control", + contactRole: "Veteran Desk Op", + contactArchetype: "detective", + contactLocation: "A temporary command room in a shuttered rooftop transit office.", + threatArchetype: "killer", + threatRole: "Named Contract Killer", + threatCountLabel: "One surgical hitter backed by two disciplined support shooters." + } + ], + white: [ + { + id: "white-serial-pattern", + shortTitle: "Witness Static", + missionFocus: "Investigate a crime scene with political fallout.", + colourMissionIdea: "Link a string of identical killings before the murderer reaches a protected witness.", + location: "A residential block, its adjoining monorail stop, and the forensic seal around the newest murder scene.", + atmosphere: "The block is unnaturally quiet, everyone is watching from behind cheap screens, and Shivers are over-managing the cordon.", + opposition: "A serial killer cell staging scenes to manipulate a bigger investigation.", + oppositionAttitude: "Enjoy the attention, leave deliberate clues, and want the squad to see the pattern too late.", + civilianFaction: "Residents terrified of speaking after seeing just enough to know SLA is already late.", + extraObjective: "Secure the witness and move them somewhere the killer cannot predict.", + escalationEvent: "An old evidence trail suddenly points at a different scene and splits available manpower.", + complication: "The witness's own statement is incomplete because they are protecting someone inside the block.", + localTwist: "The killer is recreating an older SLA-blacklisted case and expects the same official cover-up.", + issuingDepartment: "Mort Department / Ops Control", + contactRole: "Case Liaison Detective", + contactArchetype: "detective", + contactLocation: "A sealed witness room improvised from a laundrette office.", + threatArchetype: "killer", + threatRole: "Pattern Cell Leader", + threatCountLabel: "A lead killer with one cleanup partner and one obsessed documentarian." + }, + { + id: "white-ammo-sabotage", + shortTitle: "Spent Truth", + missionFocus: "Retrieve data or recordings without contamination.", + colourMissionIdea: "Trace sabotaged SLA ammunition back through the supply chain before anyone realises how deep it goes.", + location: "A corporate ammo depot, a Shiver evidence locker, and a low-grade loading district in between.", + atmosphere: "Power flickers every few minutes, loading servitors keep stuttering mid-task, and everybody is too tense to blink.", + opposition: "Corporate security and one inside accountant trying to erase the trail before it reaches Head Office.", + oppositionAttitude: "Prefer intimidation and paperwork pressure, but will switch to lethal containment if exposed.", + civilianFaction: "Dock loaders who know the movement pattern of every crate but do not trust official investigators.", + extraObjective: "Recover one clean crate and one tampered crate for comparison testing.", + escalationEvent: "Depot lockdown procedures seal the archive level and begin deleting local logs.", + complication: "The inside accountant is cooperating because their family is already off the board if they stop.", + localTwist: "The sabotage was designed to make a specific squad fail publicly rather than to broadly poison supply.", + issuingDepartment: "Department-M / Internal Containment", + contactRole: "Corporate Asset Auditor", + contactArchetype: "analyst", + contactLocation: "A dark logistics office above the depot loading floor.", + threatArchetype: "corpsec", + threatRole: "Security Overseer", + threatCountLabel: "One hard-edged overseer and a disciplined internal security team." + } + ], + grey: [ + { + id: "grey-audit-escort", + shortTitle: "Quiet Ledger", + missionFocus: "Protect or escort a cargo asset.", + colourMissionIdea: "Keep an audit convoy moving while everyone who profited from the missing cargo tries to erase the proof.", + location: "An industrial spine road running between bonded warehouses and a secure internal archive.", + atmosphere: "The sector is all sodium light, surveillance masts, and thin excuses from everyone in a suit.", + opposition: "Departmentally protected smugglers, hired heavies, and one executive aide running the cover story.", + oppositionAttitude: "Would rather pressure, delay, and redirect than openly trade fire in company view.", + civilianFaction: "Warehouse staff who know something is wrong but fear losing the only stable work they have.", + extraObjective: "Keep the audit chain unbroken from seizure to final archive.", + escalationEvent: "A sponsor legal team arrives and tries to freeze the whole operation with paperwork.", + complication: "The archive itself contains evidence implicating the issuing department.", + localTwist: "The convoy is only half the story; the real theft walked out days ago wearing a department badge.", + issuingDepartment: "Department-M / Internal Containment", + contactRole: "Departmental Enforcement Liaison", + contactArchetype: "corporate", + contactLocation: "An armoured office container chained to the convoy lead truck.", + threatArchetype: "corpsec", + threatRole: "Internal Security Chief", + threatCountLabel: "One security chief and a quiet detail of professional enforcers." + } + ], + silver: [ + { + id: "silver-live-escort", + shortTitle: "Smile Cut", + missionFocus: "Protect or escort a person through a hostile district.", + colourMissionIdea: "Keep a sponsor-backed public figure alive without letting the cameras see how close the job gets.", + location: "A ribbon of sponsor venues, red-carpet choke points, and one ugly service corridor nobody told the cameras about.", + atmosphere: "Flash lamps, branded drones, crowd heat, and just enough panic underneath the applause to be dangerous.", + opposition: "A stalker cell, freelance agitators, and one rival sponsor fixer hoping to turn the event into a scandal.", + oppositionAttitude: "Would prefer embarrassment over blood but are ready to escalate if the window closes.", + civilianFaction: "Fans and paid attendees packed too tightly to separate cleanly from the real threat.", + extraObjective: "Protect the sponsor narrative as much as the body being moved.", + escalationEvent: "A live-feed malfunction dumps backstage footage into the public stream and sends the route sideways.", + complication: "The VIP is hiding a personal agenda and keeps deviating from the protected path.", + localTwist: "The entire appearance is bait designed to expose who inside the sponsor chain is leaking movement plans.", + issuingDepartment: "Media Relations / Sponsor Operations", + contactRole: "Media Fixer", + contactArchetype: "media", + contactLocation: "A mobile control booth hidden behind the main broadcast gantry.", + threatArchetype: "security", + threatRole: "Hostile Fixer", + threatCountLabel: "One well-dressed operator with hired hands embedded in the crowd." + } + ], + jade: [ + { + id: "jade-containment", + shortTitle: "Wet Bloom", + missionFocus: "Contain or quarantine an outbreak or Ebb event.", + colourMissionIdea: "Lock down a contaminated block before the spill crosses into the transit grid.", + location: "A mixed-use block connected to drainage canals and a damaged med-lab service annex.", + atmosphere: "Filtered alarms, chemical stink, and a wet sheen on every surface that might be alive.", + opposition: "Mutated survivors, a failed lab asset, and one containment officer already planning to burn the evidence.", + oppositionAttitude: "Act unpredictably and spike between blind panic and sudden aggression.", + civilianFaction: "A street clinic trying to keep the least infected residents alive long enough to evacuate.", + extraObjective: "Secure one uncontaminated sample for Karma analysis.", + escalationEvent: "Containment seals begin dropping floor by floor, isolating parts of the squad from one another.", + complication: "The official quarantine map is wrong and funnels civilians toward the hottest zone.", + localTwist: "The contamination profile matches a programme nobody admits still exists.", + issuingDepartment: "Karma Hazard Response", + contactRole: "Field Scientist", + contactArchetype: "scientist", + contactLocation: "A decontamination vestibule made from two bolted ambulance trailers.", + threatArchetype: "stormer", + threatRole: "Mutated Lab Asset", + threatCountLabel: "One unstable asset and several contaminated survivors acting around it." + } + ], + red: [ + { + id: "red-monorail-hostage", + shortTitle: "Dead Platform", + missionFocus: "Protect or escort a person through a hostile district.", + colourMissionIdea: "Board a hijacked monorail, cut the threat out, and stop a public disaster before it multiplies.", + location: "A moving monorail line, two sealed stations, and the service deck beneath the track.", + atmosphere: "Screaming brakes, emergency klaxons, static over public address, and media drones already racing the train.", + opposition: "A terror cell with improvised explosives and a hardline trigger operator.", + oppositionAttitude: "Need the spectacle as much as the tactical win and will kill quickly if denied it.", + civilianFaction: "Hostages trapped inside the train with just enough courage to help if guided correctly.", + extraObjective: "Keep the train itself intact enough for a survivor extraction.", + escalationEvent: "A secondary device threatens the inbound station and splits command priorities.", + complication: "One hostage is secretly tied to the cell and is feeding them squad movement.", + localTwist: "The train was chosen because someone important is riding under a false manifest.", + issuingDepartment: "Shiver Command Liaison Desk", + contactRole: "Transit Crisis Controller", + contactArchetype: "controller", + contactLocation: "A sealed signal room with live route telemetry and too many shouting department heads.", + threatArchetype: "riot", + threatRole: "Cell Trigger Man", + threatCountLabel: "One detonation lead, two shooters, and a train full of leverage." + }, + { + id: "red-broadcast-retake", + shortTitle: "Signal Mercy", + missionFocus: "Eliminate a threat before it reaches public view.", + colourMissionIdea: "Retake a broadcast tower before the final message turns a bad district into a citywide panic.", + location: "A media tower, its control floors, and the access streets packed with fleeing civilians.", + atmosphere: "Emergency beacons, dropped live feeds, smoke in the ventilation stacks, and every screen in Mort pointing at the same problem.", + opposition: "An extremist crew with tower access and stolen media credentials.", + oppositionAttitude: "Expect to die but want the audience to watch it happen in the right order.", + civilianFaction: "Panicking evacuees clogging the lower service roads and making every clean shot harder.", + extraObjective: "Recover the message core and identify who green-lit tower access.", + escalationEvent: "Backup transmitters spin up on a timer and broaden the threat window.", + complication: "The tower engineer who can shut the system down has been wounded and hidden by the crowd.", + localTwist: "The message is less propaganda than data dump, and one department in SLA wants it to air.", + issuingDepartment: "Media Relations / Sponsor Operations", + contactRole: "Broadcast Security Captain", + contactArchetype: "shiver", + contactLocation: "A lower-floor security post running on emergency battery.", + threatArchetype: "security", + threatRole: "Tower Seizure Lead", + threatCountLabel: "One charismatic lead and a handful of committed technical shooters." + } + ], + black: [ + { + id: "black-silent-vault", + shortTitle: "Mute Entry", + missionFocus: "Retrieve data or recordings without contamination.", + colourMissionIdea: "Slip into a sealed vault, lift one file set, and leave the archive looking untouched.", + location: "A corporate research vault buried under a routine logistics floor.", + atmosphere: "Cold air, sound-dampened corridors, biometric locks, and too much silence to trust.", + opposition: "Internal black security and one compartmentalised watcher who does not know the whole job.", + oppositionAttitude: "Stay disciplined, silent, and willing to erase the evidence of their own failure.", + civilianFaction: "Night-shift technicians who do not understand the stakes but know every route in the building.", + extraObjective: "Remove a second innocuous-looking archive block that actually matters more than the main objective.", + escalationEvent: "A silent alarm brings in an internal response team with orders to close the floor permanently.", + complication: "The file set is mirrored to a live observer station and cannot simply be taken.", + localTwist: "The client is not paying for the theft; they are paying to confirm what Head Office already suspects.", + issuingDepartment: "Head Office Special Assignments", + contactRole: "Darkfinder Case Officer", + contactArchetype: "corporate", + contactLocation: "A blackout-safe service apartment three blocks from the target tower.", + threatArchetype: "blackops", + threatRole: "Vault Warden", + threatCountLabel: "One silent warden and a two-person ghost response team." + }, + { + id: "black-disavowed-burn", + shortTitle: "Ash Ledger", + missionFocus: "Sabotage or destroy a target off the books.", + colourMissionIdea: "Burn a deniable site and seed the right false evidence before anyone asks why it existed.", + location: "A shell company warehouse wrapped around an unlisted lab basement.", + atmosphere: "Generator hum, shuttered loading bays, and an air that already feels abandoned on purpose.", + opposition: "Contract cleaners and one site supervisor prepared for a final-burn contingency.", + oppositionAttitude: "Know the site is disposable and only care about buying enough time to erase the real trail.", + civilianFaction: "Nearby dock crews who heard there was money in tonight's unusual overtime orders.", + extraObjective: "Leave one trail leading toward a rival corporate culprit.", + escalationEvent: "A chemical fire spreads faster than expected and starts opening parts of the hidden basement.", + complication: "One asset inside the site is still alive and worth far more than the building.", + localTwist: "The false evidence you were told to plant matches a previous cover story almost word for word.", + issuingDepartment: "Head Office Special Assignments", + contactRole: "Freelance Financier", + contactArchetype: "fixer", + contactLocation: "A remote comms booth patched through a dead sponsor office.", + threatArchetype: "blackops", + threatRole: "Cleanup Supervisor", + threatCountLabel: "One hard cleanup lead, one torch specialist, and a final-burn team." + } + ], + platinum: [ + { + id: "platinum-head-office", + shortTitle: "Quiet Crown", + missionFocus: "Protect or escort a person through a hostile district.", + colourMissionIdea: "Extract a Head Office asset who knows too much without revealing the extraction is even happening.", + location: "A sealed executive sector stitched into an older transit artery beneath it.", + atmosphere: "Too clean above, too secret below, and everyone on-site acting as if the wrong word could kill them.", + opposition: "A compartmentalised internal response team and one asset handler trying to rewrite the operation in real time.", + oppositionAttitude: "Never shout, rarely miss, and assume everyone around them is expendable.", + civilianFaction: "None officially, though a handful of overlooked service workers are trapped inside the machinery.", + extraObjective: "Return every mission record to Head Office only.", + escalationEvent: "Command changes the extraction route mid-run, implying compromise at the original pickup.", + complication: "The protected asset is deciding whether the squad is the rescue team or the last cleanup team they will ever see.", + localTwist: "The extraction itself is cover for a private conversation one Head Office director wants another never to hear.", + issuingDepartment: "Head Office Special Assignments", + contactRole: "Head Office Courier", + contactArchetype: "corporate", + contactLocation: "A private transit berth accessible only by dead-route credentials.", + threatArchetype: "blackops", + threatRole: "Executive Recovery Lead", + threatCountLabel: "One elite retrieval leader and a pair of immaculate shadow operators." + } + ] +}; + +export function framesForColour(key = "white") { + return FRAMES[String(key ?? "white").toLowerCase()] ?? FRAMES.white; +} diff --git a/core/data/tables.js b/core/data/tables.js new file mode 100644 index 0000000..afcd44d --- /dev/null +++ b/core/data/tables.js @@ -0,0 +1,208 @@ +/* Generic SLA flavour tables used to fill any gaps a scenario frame + leaves open, and to drive fully-random briefings. Pure data. */ + +export const TABLES = { + missionFocus: [ + "Eliminate a threat before it reaches public view.", + "Capture a target alive for interrogation.", + "Protect or escort a person through a hostile district.", + "Protect or escort a cargo asset.", + "Retrieve an item or specimen intact.", + "Retrieve data or recordings without contamination.", + "Investigate a crime scene with political fallout.", + "Profile and locate a serial killer before media lock-on.", + "Contain or quarantine an outbreak or Ebb event.", + "Crowd control and riot suppression under cameras.", + "Hunt a named hostile and confirm status.", + "Clean up an old SLA operational mess." + ], + + locations: [ + "Downtown backstreets.", + "Sewer network and maintenance tunnels.", + "Industrial sector and power spine.", + "Residential block or tenement arc.", + "Transit system and monorail stations.", + "Cannibal Sector perimeter.", + "Corporate laboratory or asset vault.", + "Nightclub and entertainment block.", + "Broadcast tower and media hub.", + "Hospital, triage zone, or Karma lab." + ], + + opposition: [ + "Street gang with light arms and local lookouts.", + "Organised crime syndicate with political backing.", + "Serial killer cell already moving to a second target.", + "DarkNight agents with a deniable brief.", + "Carrien pack using service tunnels.", + "Rogue biogenetic asset or escaped Stormer variant.", + "Rival SLA squad chasing the same payout.", + "Corrupt Shivers protecting the wrong people.", + "Cultists, Sh'ien influence, or Ebb residue.", + "Corporate security with strict no-survivor orders." + ], + + complications: [ + "The issuing department withheld one critical fact.", + "Third Eye goes live before the squad enters the zone.", + "A witness can identify one operative by name.", + "The target is embedded in civilians.", + "The package is alive and unstable.", + "Transit lockdown traps everyone inside the district.", + "The real employer is not the signatory on the BPN.", + "L.A.D. response in the zone is unreliable.", + "Communications are jammed or intercepted.", + "The BPN is partly a ratings play dressed up as emergency work." + ], + + contactRoles: [ + "Shiver precinct liaison", + "Mort Department dispatcher", + "Department-M observer", + "Corporate asset handler", + "Embedded media fixer", + "Sector security captain", + "Karma field scientist", + "Independent financier", + "Freelance financier", + "Darkfinder case officer" + ], + + contactFirstNames: [ + "Anika", "Blaine", "Caro", "Drex", "Ephra", "Fenn", "Galia", "Havel", + "Iona", "Jarek", "Kiva", "Luther", "Mara", "Nikol", "Orin", "Petra" + ], + + contactLastNames: [ + "Voss", "Kane", "Talon", "Mercer", "Sloane", "Varik", "Drahl", "Kessler", + "Morn", "Black", "Harrow", "Vale", "Kestral", "Renn", "Soren", "Yarrow" + ], + + civilianFactions: [ + "Local residents trying to keep their block standing.", + "Black-market traders who know the unofficial routes.", + "A fan club for a specific operative or squad.", + "A semi-legal street clinic with decent gear and bad ties.", + "Displaced refugees from a devastated sector.", + "A corporate outreach team doing smiling PR work." + ], + + oppositionAttitudes: [ + "Underestimate the squad and get cocky.", + "Are terrified of SLA but cornered and desperate.", + "See the squad as expendable obstacles, not people.", + "Are only in it for the money.", + "Hope to cut a deal or run rather than die.", + "Use the squad as a distraction for a bigger move." + ], + + atmospheres: [ + "Oppressive rain, thunder, and ankle-deep water in the streets.", + "Chemical smog and neon halos around every light source.", + "Rolling blackouts, flicker failures, and generator hum.", + "Industrial noise and heavy machine vibration.", + "Crowded streets with sale events or festivals in progress.", + "Curfew with Shivers on every corner and everyone watching." + ], + + localTwists: [ + "The district is regarded as cursed by locals.", + "A recent promo shoot left half-finished set pieces everywhere.", + "A minor celebrity is present and drawing attention.", + "Surveillance coverage is patchy or disabled.", + "Someone is independently live-streaming the operation.", + "A rival squad failed a BPN here recently and left damage behind." + ], + + extraObjectives: [ + "Capture at least one enemy alive for interrogation.", + "Recover specific data intact with no EMP or overkill.", + "Ensure a particular building remains undamaged.", + "Plant a tracking device unnoticed.", + "Secure a specific piece of gear for a sponsor.", + "Ensure that no civilians witness one critical event." + ], + + escalationEvents: [ + "Opposition reinforcements arrive mid-operation.", + "The environment becomes more dangerous: fire, flood, or collapse.", + "Media crews show up and start reframing the mission.", + "A key NPC flees, forcing an ugly pursuit.", + "Communications fail at the worst possible moment.", + "A supposedly neutral faction chooses a side." + ], + + issuingDepartments: [ + "Mort Department / Ops Control", + "Department-M / Internal Containment", + "Shiver Command Liaison Desk", + "Karma Hazard Response", + "Cloak Tactical Oversight", + "Media Relations / Sponsor Operations", + "Head Office Special Assignments" + ], + + mediaOptions: [ + "None", + "Rare / None", + "Station Analysis", + "Third Eye News", + "GoreZone / Contract Circuit Special", + "Classified / Special" + ] +}; + +/* Per-colour mission hooks — short pitched ideas keyed by band. */ +export const COLOUR_MISSION_IDEAS = { + blue: [ + "Clear out Carrien and secure the pump station before repairs begin.", + "Survey a derelict subway spur and mark safe lanes for clean-up crews.", + "Evict a low-level gang from a recycling depot without wrecking the machinery." + ], + yellow: [ + "Recover a stolen prototype before it disappears through the black market.", + "Locate a missing departmental courier and return the carried drives intact.", + "Retrieve a captured informant before rivals extract anything useful." + ], + green: [ + "Neutralise a threat before it can trigger full emergency escalation.", + "Sweep a district after repeated monster sightings and stop the panic source.", + "Guard a prisoner transfer while hostile assets try to reclaim the cargo." + ], + white: [ + "Uncover who is issuing forged BPNs to lure squads into ambushes.", + "Trace sabotaged SLA-manufactured ammo back to the source.", + "Link a string of identical killings across multiple sectors." + ], + grey: [ + "Protect engineers installing surveillance hardware in a tense district.", + "Assist a corporate audit team investigating missing shipments.", + "Guard a prototype vehicle during a live test run." + ], + silver: [ + "Escort a diplomatic envoy without provoking a public incident.", + "Keep a sponsor-backed appearance alive while controlling optics.", + "Secure a high-profile interview venue before the cameras roll." + ], + jade: [ + "Contain a biohazard leak in a mixed-use block and secure samples.", + "Neutralise a mutated outbreak before it reaches transport lines.", + "Lock down a failed research ward and extract surviving technicians." + ], + red: [ + "Board a hijacked monorail in motion and rescue the hostages.", + "Retake a broadcast tower seized by extremists.", + "Stabilise a district where fires, looters, and panic are all spreading." + ], + black: [ + "Infiltrate a sealed compound, remove a target, and leave no public trace.", + "Sabotage a rival operation and redirect blame elsewhere.", + "Extract records from an internal vault while command denies the mission exists." + ], + platinum: [ + "Recover a lost prototype before anyone realises it escaped.", + "Investigate an off-limits sector where sensors keep going dark.", + "Quietly remove an inconvenient public hero from the board." + ] +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3bec7e --- /dev/null +++ b/index.html @@ -0,0 +1,86 @@ + + + + + + Blueprint News — SLA BPN Generator + + + + + +
+
+
BLUEPRINT NEWS
+
SLA Industries · Contract Dispatch Grid
+
+
Player Brief & GM Dossier · engine-agnostic
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + + diff --git a/render/bpn-render.css b/render/bpn-render.css new file mode 100644 index 0000000..ef4d960 --- /dev/null +++ b/render/bpn-render.css @@ -0,0 +1,387 @@ +/* Blueprint News — render layer styling. + * + * SLA Industries house look: heavy condensed uppercase titles, Roboto Mono + * data labels, dark slate panels, a single colour-band accent per brief, thin + * accent rules with inset glow, Third-Eye crest, stamp / redaction motifs. + * + * Two clearly distinct surfaces: + * .bpn-brief — the official corporate dispatch the squad is allowed to see + * .bpn-dossier — the handler-only truth behind it (darker, "RESTRICTED") + * + * Sizing is rem-based and tuned for legibility on a small running laptop: + * body copy never drops below ~15px and stays high-contrast. Everything is + * scoped under .bpn so it can drop into any host without bleeding. */ + +.bpn { + /* fonts */ + --bpn-display: "Modesto Condensed", "Josefin Sans", "Oswald", sans-serif; + --bpn-head: "Josefin Sans", system-ui, sans-serif; + --bpn-body: "Josefin Sans", system-ui, sans-serif; + --bpn-mono: "Roboto Mono", ui-monospace, monospace; + + /* palette (from the SLA-BRP system) */ + --bpn-bg: #0d1117; + --bpn-panel: #161c26; + --bpn-panel-2: #1f2632; + --bpn-line: #3a4250; + --bpn-text: #eef3fa; + --bpn-muted: #9fb0c4; + --bpn-cream: #f4efe5; + --bpn-gold: #d6b24e; + --bpn-gold-deep: #b88a24; + --bpn-danger: #ff5b5b; + + /* per-brief accent is set inline from the colour band */ + --bpn-accent: #dce8f9; + + color: var(--bpn-text); + font-family: var(--bpn-body); + font-size: 16px; + line-height: 1.55; + -webkit-font-smoothing: antialiased; +} + +.bpn *, +.bpn *::before, +.bpn *::after { box-sizing: border-box; } + +/* ---------- shared atoms ------------------------------------------------- */ + +.bpn-eyebrow { + font-family: var(--bpn-mono); + font-size: 0.74rem; + letter-spacing: 0.22em; + text-transform: uppercase; + color: color-mix(in srgb, var(--bpn-accent) 70%, var(--bpn-muted)); + margin: 0; +} + +.bpn-label { + display: block; + font-family: var(--bpn-mono); + font-size: 0.78rem; + letter-spacing: 0.14em; + text-transform: uppercase; + color: color-mix(in srgb, var(--bpn-accent) 50%, var(--bpn-muted)); + margin-bottom: 4px; +} + +.bpn-value { color: var(--bpn-text); font-size: 1rem; } + +.bpn-card { + position: relative; + padding: 14px 16px; + border-radius: 10px; + background: linear-gradient(180deg, var(--bpn-panel-2), var(--bpn-panel)); + border: 1px solid var(--bpn-line); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); +} + +.bpn-card::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 3px; + border-radius: 10px 0 0 10px; + background: linear-gradient(180deg, var(--bpn-accent), transparent); + opacity: 0.85; +} + +.bpn-grid { + display: grid; + gap: 12px; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); +} + +/* ---------- the document shell ------------------------------------------- */ + +.bpn-doc { + max-width: 920px; + margin: 0 auto; + border-radius: 14px; + overflow: hidden; + border: 1px solid var(--bpn-line); + background: var(--bpn-bg); + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45); +} + +/* ===================== PLAYER BRIEF ===================== */ + +.bpn-brief .bpn-hero { + position: relative; + min-height: 200px; + display: flex; + align-items: flex-end; + padding: 20px 22px; + isolation: isolate; +} + +.bpn-brief .bpn-hero__art { + position: absolute; + inset: 0; + z-index: -1; +} +.bpn-brief .bpn-hero__art svg { width: 100%; height: 100%; display: block; } + +.bpn-brief .bpn-hero::after { + content: ""; + position: absolute; + inset: 0; + z-index: -1; + background: linear-gradient(0deg, rgba(7, 10, 16, 0.92) 8%, rgba(7, 10, 16, 0.35) 60%, transparent); +} + +.bpn-hero__crest { + width: 92px; + height: 92px; + flex: 0 0 auto; + margin-right: 18px; + filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.5)); +} +.bpn-hero__crest svg { width: 100%; height: 100%; display: block; } + +.bpn-hero__copy { min-width: 0; } + +.bpn-hero__band { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 3px 12px; + border-radius: 999px; + background: color-mix(in srgb, var(--bpn-accent) 22%, #0c1119); + border: 1px solid color-mix(in srgb, var(--bpn-accent) 60%, transparent); + font-family: var(--bpn-mono); + font-size: 0.72rem; + letter-spacing: 0.2em; + text-transform: uppercase; + color: color-mix(in srgb, var(--bpn-accent) 40%, #ffffff); + margin-bottom: 8px; +} +.bpn-hero__band b { color: color-mix(in srgb, var(--bpn-accent) 70%, #ffffff); } + +.bpn-hero__title { + font-family: var(--bpn-display); + font-weight: 700; + font-size: clamp(2.1rem, 6vw, 3.4rem); + line-height: 0.92; + letter-spacing: 0.02em; + text-transform: uppercase; + margin: 0; + color: #fff; + text-shadow: 0 2px 14px rgba(0, 0, 0, 0.6); +} + +.bpn-hero__sub { + margin: 6px 0 0; + font-family: var(--bpn-head); + color: var(--bpn-cream); + font-size: 1.02rem; + opacity: 0.92; +} + +/* the corner "issued" stamp */ +.bpn-stamp { + position: absolute; + top: 14px; + right: 16px; + z-index: 1; + font-family: var(--bpn-mono); + font-size: 0.64rem; + letter-spacing: 0.18em; + text-transform: uppercase; + text-align: right; + color: color-mix(in srgb, var(--bpn-accent) 55%, #fff); +} +.bpn-stamp b { + display: block; + padding: 2px 8px; + margin-top: 4px; + border: 1.5px solid color-mix(in srgb, var(--bpn-accent) 60%, transparent); + border-radius: 4px; + transform: rotate(-3deg); +} + +/* fact strip under the hero */ +.bpn-facts { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1px; + background: var(--bpn-line); + border-bottom: 1px solid var(--bpn-line); +} +.bpn-facts > div { + background: var(--bpn-panel); + padding: 12px 14px; +} +.bpn-facts .bpn-value { + font-family: var(--bpn-mono); + font-weight: 700; + font-size: 1.06rem; + color: color-mix(in srgb, var(--bpn-accent) 22%, var(--bpn-text)); +} + +.bpn-body { padding: 20px 22px 24px; display: grid; gap: 18px; } + +.bpn-section__title { + font-family: var(--bpn-head); + font-weight: 700; + font-size: 1.12rem; + letter-spacing: 0.04em; + text-transform: uppercase; + margin: 0 0 4px; + padding-bottom: 6px; + border-bottom: 1px solid var(--bpn-line); + color: color-mix(in srgb, var(--bpn-accent) 30%, var(--bpn-text)); +} + +.bpn-brief-text { + font-size: 1.05rem; + line-height: 1.6; + color: var(--bpn-text); +} + +.bpn-objective { + border-left: 3px solid var(--bpn-accent); + padding: 10px 14px; + background: color-mix(in srgb, var(--bpn-accent) 8%, transparent); + border-radius: 0 8px 8px 0; +} + +.bpn-contact { + display: grid; + grid-template-columns: 120px 1fr; + gap: 16px; + align-items: center; + padding: 14px 16px; + border-radius: 10px; + background: linear-gradient(180deg, var(--bpn-panel-2), var(--bpn-panel)); + border: 1px solid var(--bpn-line); +} +.bpn-contact__ident { width: 120px; height: 120px; } +.bpn-contact__ident svg { width: 100%; height: 100%; display: block; } +.bpn-contact__detail { display: grid; gap: 3px; } +.bpn-contact__name { + font-family: var(--bpn-head); + font-weight: 700; + font-size: 1.25rem; + color: color-mix(in srgb, var(--bpn-accent) 22%, var(--bpn-text)); +} +.bpn-contact__pos { color: var(--bpn-muted); font-size: 0.95rem; margin-top: 4px; } + +.bpn-footer { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 12px; + padding: 16px 22px; + border-top: 1px solid var(--bpn-line); + background: var(--bpn-panel); + font-family: var(--bpn-mono); +} +.bpn-footer .bpn-value { font-family: var(--bpn-head); font-size: 0.96rem; } + +/* ===================== GM DOSSIER ===================== */ + +.bpn-dossier .bpn-doc { box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55); } + +.bpn-dossier__banner { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 20px; + background: + repeating-linear-gradient(45deg, rgba(255, 91, 91, 0.16) 0 12px, transparent 12px 24px), + #1a0f12; + border-bottom: 2px solid var(--bpn-danger); +} +.bpn-dossier__banner .bpn-eye { + width: 26px; height: 26px; flex: 0 0 auto; +} +.bpn-dossier__banner h2 { + margin: 0; + font-family: var(--bpn-display); + font-size: 1.5rem; + letter-spacing: 0.06em; + text-transform: uppercase; + color: #ffd9d9; +} +.bpn-dossier__banner .bpn-eyebrow { color: #ff9b9b; margin-left: auto; } + +.bpn-dossier .bpn-body { padding: 18px 20px 22px; } + +.bpn-reveal { + position: relative; + padding: 14px 16px 14px 18px; + border-radius: 10px; + background: linear-gradient(180deg, #221a22, #161019); + border: 1px solid #4a2b3a; +} +.bpn-reveal::before { + content: ""; + position: absolute; inset: 0 auto 0 0; width: 3px; + background: var(--bpn-danger); + border-radius: 10px 0 0 10px; +} +.bpn-reveal .bpn-label { color: #ff9b9b; } + +.bpn-twist { border-color: #6a2b2b; } +.bpn-twist .bpn-label { color: var(--bpn-danger); } + +.bpn-threat-read { + display: grid; + grid-template-columns: auto 1fr; + gap: 4px 14px; + font-family: var(--bpn-mono); + font-size: 0.92rem; +} +.bpn-threat-read dt { color: var(--bpn-muted); letter-spacing: 0.08em; text-transform: uppercase; font-size: 0.72rem; align-self: center; } +.bpn-threat-read dd { margin: 0; color: var(--bpn-text); } + +/* NPC seam — clearly flagged as the hand-off point for the future module */ +.bpn-seam { + border: 1px dashed var(--bpn-line); + border-radius: 10px; + padding: 12px 14px; + background: rgba(255, 255, 255, 0.02); +} +.bpn-seam .bpn-eyebrow { color: var(--bpn-gold); } +.bpn-seam code { + font-family: var(--bpn-mono); + font-size: 0.86rem; + color: var(--bpn-gold); + background: rgba(214, 178, 78, 0.1); + padding: 1px 6px; + border-radius: 4px; +} + +.bpn-rolls { + font-family: var(--bpn-mono); + font-size: 0.78rem; + color: var(--bpn-muted); + letter-spacing: 0.04em; +} + +/* ---------- responsive: small running laptop ----------------------------- */ + +@media (max-width: 720px) { + .bpn { font-size: 15px; } + .bpn-facts { grid-template-columns: repeat(2, 1fr); } + .bpn-hero__crest { width: 64px; height: 64px; margin-right: 12px; } + .bpn-brief .bpn-hero { min-height: 150px; padding: 16px; } + .bpn-stamp { display: none; } + .bpn-contact { grid-template-columns: 88px 1fr; gap: 12px; } + .bpn-contact__ident { width: 88px; height: 88px; } +} + +@media (max-width: 420px) { + .bpn-facts { grid-template-columns: 1fr 1fr; } + .bpn-hero__title { font-size: clamp(1.8rem, 9vw, 2.4rem); } +} + +/* ---------- print / PDF export ------------------------------------------- */ + +@media print { + .bpn { font-size: 12pt; } + .bpn-doc { box-shadow: none; border: 1px solid #000; max-width: 100%; } + .bpn-doc, .bpn-brief, .bpn-dossier { break-inside: avoid; } + .bpn-dossier { margin-top: 18px; } +} diff --git a/render/bpn-render.js b/render/bpn-render.js new file mode 100644 index 0000000..796a4cb --- /dev/null +++ b/render/bpn-render.js @@ -0,0 +1,206 @@ +/* Blueprint News — render layer. + * + * Turns a BPN object (from core) into the two separate surfaces: + * - the Player Brief: the official corporate dispatch + * - the GM Dossier: the handler-only truth + * + * Pure DOM + string building, framework-free. Functions come in two flavours: + * briefHTML(bpn) / dossierHTML(bpn) -> markup strings (export, embedding) + * renderBrief(bpn, el) / renderDossier(bpn, el) -> mount into an element + * + * The host page must include render/bpn-render.css and the bundled fonts.css. + */ + +import { crestSVG, bannerSVG, portraitSVG } from "../art/bpn-art.js"; + +function esc(value) { + return String(value ?? "").replace(/[&<>"']/g, (c) => ( + { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c] + )); +} + +/* The SLA "Third Eye" mark, used on the GM banner. */ +function thirdEyeSVG(colour = "#ff5b5b") { + return ``; +} + +function fact(label, value) { + return `
${esc(label)}${esc(value)}
`; +} + +function card(label, value) { + return `
${esc(label)}${esc(value)}
`; +} + +/* ---------------- PLAYER BRIEF ---------------- */ + +export function briefHTML(bpn, { art = true } = {}) { + const c = bpn.colour; + const banner = art ? bannerSVG(bpn, { width: 1200, height: 360 }) : ""; + const crest = crestSVG(bpn, { size: 184 }); + + return `
+
+
+ +
Issued by${esc(bpn.issuingDepartment)}
+
${crest}
+
+ ${esc(c.label)} BPN · ${esc(c.type)} +

${esc(bpn.shortTitle)}

+

${esc(c.summary)}

+
+
+ +
+ ${fact("BPN ID", bpn.bpnId)} + ${fact("SCL Requirement", bpn.sclRequirement)} + ${fact("Gross Contract", bpn.reward.grossContract)} + ${fact("Est. Take-home", bpn.reward.takeHomeEach)} +
+ +
+
+

Mission Brief

+

${esc(bpn.missionBrief)}

+
+ +
+

Objectives

+
Primary${esc(bpn.objective)}
+
Secondary${esc(bpn.extraObjective)}
+
+ +
+

Operational Picture

+
+ ${card("Location", bpn.location)} + ${card("Atmosphere", bpn.atmosphere)} + ${card("Declared Opposition", bpn.opposition)} + ${card("Mission Focus", bpn.missionFocus)} +
+
+ +
+

On-site Contact & Pressures

+
+
${portraitSVG(bpn, { size: 120 })}
+
+ Primary Contact + ${esc(bpn.contact.name)} + ${esc(bpn.contact.role)} + ${esc(bpn.contact.location)} +
+
+
+ ${card("Civilian Pressure", bpn.civilianFaction)} + ${card("Operational Hook", bpn.hook)} +
+
+
+ +
+ ${fact("Media Posture", bpn.reward.mediaCoverage)} + ${fact("Squad Size", `${bpn.squadSize} Operatives`)} + ${fact("SCL Increase", bpn.reward.sclIncrease)} + ${fact("Cleanup Directive", bpn.cleanupDirective)} +
+
+
`; +} + +/* ---------------- GM DOSSIER ---------------- */ + +export function dossierHTML(bpn) { + const c = bpn.colour; + const g = bpn.gm; + const seam = bpn.npcSeam; + const r = g.rolls ?? {}; + + const seamRow = (seam.contactArchetype || seam.threatArchetype) + ? `
+

NPC / Monster Hand-off

+

This brief reserves two cast slots for the companion NPC module:

+

+ Contact archetype ${esc(seam.contactArchetype ?? "—")} — ${esc(bpn.contact.name)}, ${esc(bpn.contact.role)}.
+ Threat archetype ${esc(seam.threatArchetype ?? "—")} — ${esc(seam.threatRole ?? g.threatLead ?? "—")}. +

+
` + : ""; + + return `
+
+
+ ${thirdEyeSVG("#ff5b5b")} +

GM Dossier — ${esc(bpn.shortTitle)}

+ Restricted · Handler Eyes Only +
+ +
+
+
+ Operational Twist + ${esc(g.localTwist)} +
+
+ Withheld Fact + ${esc(g.complication)} +
+
+ +
+

True Threat Read

+
+
+
Lead
${esc(g.threatLead || "—")}
+
Numbers
${esc(g.threatCountLabel || "—")}
+
Attitude
${esc(g.oppositionAttitude)}
+
+
+
+ +
+

Levers & Escalation

+
+ ${card("Escalation Trigger", g.escalationEvent)} + ${card("Civilian Lever", bpn.civilianFaction)} + ${card("Financier Reality", g.financierNote)} + ${card("CBS Bands", `${bpn.reward.cbsBandOp} per Op / ${bpn.reward.cbsBandSquad} per Squad`)} +
+
+ + ${seamRow} + +

Seed ${esc(bpn.seed)} · frame ${esc(g.frameId)} · rolls: colour ${esc(r.colour ?? 0)}, pay ${esc(r.paymentType ?? 0)}, CBS ${esc(r.cbsTier ?? 0)}, SCL ${esc(r.sclTier ?? 0)}, media ${esc(r.media ?? 0)}, financier ${esc(r.financier ?? 0)}.

+
+
+
`; +} + +/* ---------------- mount helpers ---------------- */ + +export function renderBrief(bpn, el, opts) { + const root = typeof el === "string" ? document.querySelector(el) : el; + if (!root) return; + root.classList.add("bpn"); + root.innerHTML = briefHTML(bpn, opts); +} + +export function renderDossier(bpn, el) { + const root = typeof el === "string" ? document.querySelector(el) : el; + if (!root) return; + root.classList.add("bpn"); + root.innerHTML = dossierHTML(bpn); +} + +/* Render both surfaces into one element (used for the print / "both" view). */ +export function renderBoth(bpn, el, opts) { + const root = typeof el === "string" ? document.querySelector(el) : el; + if (!root) return; + root.classList.add("bpn"); + root.innerHTML = briefHTML(bpn, opts) + dossierHTML(bpn); +}