ca821008e2
Measured on a copy of a real 1.2 GB / 253K-event database, 10 simulated browsers + 10 hooks/s for 90 s: event-loop delay p99 1239 ms → 32 ms (max 2.0 s → 94 ms), 266 failed requests → 0, 74 → 111 requests/s served, server RSS 633 → 346 MB. Entry bundle 975 KB raw → 394 KB (106 KB brotli). Server - /api/analytics: the events-table scans run in the read worker (scoped-stats eventAggregates, read-pool job analyticsEvents); runRead takes maxAgeMs — analytics 10 s, /api/workflows 30 s — keyed by the args - /api/workflows/skill-usage: +event_type and a tool_name range instead of LIKE, so it uses idx_events_tool (784 ms → a few ms) - idx_events_session_type_tool (session_id, event_type, tool_name, created_at) replaces idx_events_session_type: covering reads for session stats, the hook dedupes and the import resume point (1.2 s → 20 ms); 64 MB cache_size and 256 MB mmap_size on both connections - WAL: the server sets wal_autocheckpoint = 0 and checkpoints PASSIVE every DASHBOARD_WAL_CHECKPOINT_MS (5 s) from the read worker's own writable connection; a failed checkpoint restores the automatic one (hook COMMIT p95 109 ms → 15 ms at 100 hooks/s) - tmux: one list-sessions answers a whole GET /api/lanes and the heal beat (liveSessions), shared for 1 s and cleared by this process's new/kill — GET /api/run's sync spawns had blocked 60 s of a 90 s run; the heal beat skips tmux when nothing runs; attach options chained into 2 spawns - hooks: TurnDuration/APIError deduped against one read per hook instead of a query per transcript entry (23 ms/hook on a 763-turn session); one lane scan per hook; hourly upserts skip rows that did not grow; frames are sent after the transaction commits (and after the pane binding); new_event carries its row id; a split pane's (slot 1–9) hooks no longer rebind the lane's session_id - watchdog liveness probe runs ps asynchronously; transcript newline scan via indexOf; startup subagent backfill fingerprints the files it already checked - pty attach: backpressure (pause past 1 MB unsent, resume under 256 KB) - static: hashed assets served from their pre-compressed .br/.gz sibling Client - hidden tabs neither refetch on WS events nor poll (useLiveRefresh, panes, lane cards, git header, changes panel, settings); no per-tab hourly /updates/check (the server already checks) - refetch storms throttled (workspace tree/session list 3 s, /api/run only on a run-key change, notification pane lookup only when shown); WS reconnect jitter; terminal retry backoff 1.5 → 30 s, stops on 1008 - heavier throttles for aggregates (15 s) and detail views; Monitor keepIfSame; GET in-flight dedupe in request() - lazy Dashboard/History, xterm (with the first terminal), lane modals, Sagi (only while enabled); only the active locale loads; Workspace chunk prefetched on a /workspace deep link - Sagi: no work while disabled, pupil via CSS variables, memo avatar - build: .br/.gz siblings, sourcemap hidden; service worker no longer caches /assets/ (cache v3 drops the old one) Tests: scripts/test-server.js drops the GIT_DIR-family variables a hook exports, so a suite run from a linked worktree's pre-commit can no longer commit into the real repository or set core.bare. Docs: ARCHITECTURE, DATABASE, API, DEPLOYMENT, client README, docs/plans/perf/README.md (audit, checklist, results).
807 lines
38 KiB
TypeScript
807 lines
38 KiB
TypeScript
/**
|
|
* @file SagiAvatar.tsx
|
|
* @description Pure presentational SVG mascot - Sagi, a blue superhero pig. Traced
|
|
* from the user-provided mascot.svg (186 anonymous paths, no part grouping), so
|
|
* only the eyes could be safely extracted into their own groups; everything else
|
|
* renders as the original flat artwork. Eye pupils track the cursor and blink via
|
|
* nested `sagi-eye-track` / `sagi-eye-blink` groups. Mood is expressed via a
|
|
* `data-mood` attribute driving whole-mascot CSS transforms (bob/shake/tilt/breathe)
|
|
* in sagi.css, plus zzz/bang/sparkle overlay glyphs layered above the artwork.
|
|
* No data access - fully testable / reusable in isolation.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
/* =============================================================================
|
|
* MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed)
|
|
* =============================================================================
|
|
* **Purpose:** Sagi is the optional on-screen mascot assistant — quips, intents, and lightweight event reactions layered above the dashboard chrome.
|
|
*
|
|
* ## Design constraints
|
|
* - Local-first: no telemetry leaves the machine unless the user configures webhooks.
|
|
* - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that
|
|
* philosophy by degrading gracefully (empty states, stale badges, reconnect loops).
|
|
* - Destructive flows stay behind explicit confirmation modals and server-side gates.
|
|
* - Internationalization: user-visible strings belong in i18n JSON, not literals here.
|
|
*
|
|
* ## Internal dependencies
|
|
* - `./brain`
|
|
*
|
|
* ## Public surface
|
|
* - `SagiAvatar` — exported API; see TSDoc on the symbol for behavior.
|
|
*
|
|
* ## Testing pointers
|
|
* - Prefer colocated `__tests__` with Vitest + Testing Library for UI.
|
|
*
|
|
* ## Related docs
|
|
* - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline.
|
|
* - `skills/file-headers/` — mandatory `@author` header policy.
|
|
* ============================================================================= */
|
|
|
|
import { memo, useEffect, useRef } from "react";
|
|
import type { Mood } from "./brain";
|
|
|
|
interface SagiAvatarProps {
|
|
mood: Mood;
|
|
reducedMotion: boolean;
|
|
size?: number;
|
|
}
|
|
|
|
const MAX_PUPIL_SHIFT = 36; // px in the 1280-unit path coordinate space
|
|
|
|
// Tight window on the artwork instead of the exporter's `0 0 1280 1280` canvas,
|
|
// which padded the mascot with ~330 units of empty space on the left and
|
|
// ~170-240 on the other three sides. Measured bbox over every path is
|
|
// x 331..1114 / y 173..1044; the top is raised to 106 and the width padded out
|
|
// to a square so the mood overlays (zzz / bang / sparkle, which sit above and
|
|
// to the right of the body) stay inside and the box keeps the 1:1 aspect of the
|
|
// square width/height below. Path data and every coordinate constant that
|
|
// references it (MAX_PUPIL_SHIFT above, the eye/mood transform-origins in
|
|
// sagi.css) are untouched — only the window moved.
|
|
const VIEW_BOX = "253.5 106 938 938";
|
|
|
|
// Module-level last-known cursor position, tracked from the moment this module
|
|
// first loads (well before any avatar mounts). This is what makes eye tracking
|
|
// feel *immediate*: as soon as Sagi mounts it aims at wherever the cursor
|
|
// already is, instead of sitting centered until the next mousemove. `null`
|
|
// until the very first pointer event of the page's life.
|
|
let lastCursor: { x: number; y: number } | null = null;
|
|
if (typeof window !== "undefined") {
|
|
const remember = (e: MouseEvent) => {
|
|
lastCursor = { x: e.clientX, y: e.clientY };
|
|
};
|
|
// capture phase + passive so we never interfere with anything else.
|
|
window.addEventListener("mousemove", remember, { capture: true, passive: true });
|
|
window.addEventListener("pointermove", remember as EventListener, {
|
|
capture: true,
|
|
passive: true,
|
|
});
|
|
}
|
|
|
|
// The pupil offset is written as CSS variables on the root, never as state, so
|
|
// following the cursor costs no React render.
|
|
function setPupil(el: SVGSVGElement | null, x: number, y: number) {
|
|
el?.style.setProperty("--sagi-px", `${x}px`);
|
|
el?.style.setProperty("--sagi-py", `${y}px`);
|
|
}
|
|
|
|
// memo: Sagi re-renders on every brain tick; the avatar only on mood/size/motion.
|
|
export const SagiAvatar = memo(function SagiAvatar({
|
|
mood,
|
|
reducedMotion,
|
|
size = 68,
|
|
}: SagiAvatarProps) {
|
|
const rootRef = useRef<SVGSVGElement | null>(null);
|
|
const rafRef = useRef<number>();
|
|
|
|
// Pupils follow the cursor whenever motion is allowed and the eyes are open.
|
|
// (Only `sleeping` closes them by intent; `disconnected` hides the open-eye
|
|
// group via CSS, so tracking there is harmless and keeps eyes pre-aimed for
|
|
// the instant the connection returns.)
|
|
const tracking = !reducedMotion && mood !== "sleeping";
|
|
|
|
useEffect(() => {
|
|
if (!tracking) {
|
|
setPupil(rootRef.current, 0, 0);
|
|
return;
|
|
}
|
|
|
|
const aimAt = (clientX: number, clientY: number) => {
|
|
const el = rootRef.current;
|
|
if (!el) return;
|
|
const r = el.getBoundingClientRect();
|
|
const cx = r.left + r.width / 2;
|
|
const cy = r.top + r.height / 2;
|
|
const dx = clientX - cx;
|
|
const dy = clientY - cy;
|
|
const dist = Math.hypot(dx, dy) || 1;
|
|
// Normalize then clamp to the eye socket range.
|
|
const nx = (dx / dist) * Math.min(1, dist / 240);
|
|
const ny = (dy / dist) * Math.min(1, dist / 240);
|
|
setPupil(el, nx * MAX_PUPIL_SHIFT, ny * MAX_PUPIL_SHIFT);
|
|
};
|
|
|
|
// Immediately aim at the last-known cursor (next frame, so layout is ready)
|
|
// - no waiting for the user to move the mouse first.
|
|
let initRaf = 0;
|
|
if (lastCursor) {
|
|
const c = lastCursor;
|
|
initRaf = requestAnimationFrame(() => aimAt(c.x, c.y));
|
|
}
|
|
|
|
const onMove = (e: MouseEvent) => {
|
|
if (rafRef.current) return;
|
|
rafRef.current = requestAnimationFrame(() => {
|
|
rafRef.current = undefined;
|
|
aimAt(e.clientX, e.clientY);
|
|
});
|
|
};
|
|
window.addEventListener("mousemove", onMove, { passive: true });
|
|
return () => {
|
|
window.removeEventListener("mousemove", onMove);
|
|
if (initRaf) cancelAnimationFrame(initRaf);
|
|
if (rafRef.current) cancelAnimationFrame(rafRef.current);
|
|
rafRef.current = undefined;
|
|
};
|
|
}, [tracking]);
|
|
|
|
return (
|
|
<svg
|
|
ref={rootRef}
|
|
className="sagi-avatar"
|
|
data-mood={mood}
|
|
data-reduced={reducedMotion ? "1" : "0"}
|
|
width={size}
|
|
height={size}
|
|
viewBox={VIEW_BOX}
|
|
role="img"
|
|
aria-label={`Sagi (${mood})`}
|
|
>
|
|
<path
|
|
transform="translate(430,173)"
|
|
d="m0 0h15l11 4 11 7 12 11 7 7 3 4 6-1 25-10 30-9 31-6 26-3 17-1h41l29 3 33 6 25 7 20 7 17 7 7-6 12-12 14-10 9-4 4-1h13l10 3 12 7 13 12 8 5 26 10 8 5 7 8 4 13 1 7v13l-3 23-5 13-7 8-7 3h-8l-8-1 14 24 11 27 7 23 4 22 2 17v40l-3 23-6 24-7 19-9 19-12 19-13 16-11 12-11 10-13 10-13 9-11 7h-2v6l3 3 15 8 16 10 12 9 11 9 18 18 12 17 5 11 4 13 1 7v20l-4 14-7 13-5 7 3 9 16 40 17 39 5 13 2 9v12l-4 14-6 11-9 10-11 9-15 9-7 1-2-2-1-7-1-19-2-10h-14l-12 6-13 11-14 9-11 4-18 2-3 7-7 28-7 23-4 10-6 8-7 6-9 3-6 1h-36l-9-2-6-4-6-7-7-15-9-29-4-1-22 3-14 1h-11l-25-2-19-2-8 25-5 13-6 11-7 6-6 2-7 1h-35l-12-3-6-4-7-7-6-13-11-38-6-21-18-2-11-4-10-6-11-9-11-8-7-3h-15l-2 16-1 20-1 1h-8l-15-9-9-7-9-9-7-11-5-15v-17l5-16 9-19 20-48 8-20v-5l-8-11-5-12-3-14v-11l2-14 5-14 6-11 9-12 11-12 10-10 17-13 15-10 21-12 1-7-24-16-13-10-13-12-12-12-11-14-10-16-8-15-9-22-7-27-3-21-1-18v-13l2-26 4-22 7-25 8-20 8-16 10-18-8 2h-8l-7-3-8-9-4-11-3-20v-19l2-12 4-8 5-6 8-5 25-9 10-6 11-11 11-7z"
|
|
fill="#17519E"
|
|
/>
|
|
<path
|
|
transform="translate(629,184)"
|
|
d="m0 0h33l32 3 28 5 27 7 21 8 25 11 11 6 10 6 12 8 16 12 12 12 12 16 16 16 3 5v2l-2 1 8 16 5 12 5 13 6 25 3 19v38l-2 17-5 23-7 21-7 16-9 16-10 14-9 11-9 10-13 12-17 13-17 11-21 11-25 10-14 5-24 7-25 5-27 4-36 2h-31l-33-3-30-5-27-6-30-10-21-9-16-8-17-10-19-14-12-11-7-6-9-11-7-9-6-10-3-3-6-16-5-18-3-19-2-19v-17l2-24 4-24 5-17 7-21 10-21 11-18 8-12 17-17 10-13 4-5 8-7 13-10 18-12 12-7 26-12 21-8 16-5 33-7 21-3z"
|
|
fill="#17519E"
|
|
/>
|
|
<path
|
|
transform="translate(430,173)"
|
|
d="m0 0h15l11 4 11 7 12 11 7 7 3 4 6-1 25-10 30-9 31-6 26-3 17-1h41l29 3 33 6 25 7 20 7 17 7 7-6 12-12 14-10 9-4 4-1h13l10 3 12 7 13 12 8 5 26 10 8 5 7 8 4 13 1 7v13l-3 23-5 13-7 8-7 3h-8l-8-1 14 24 11 27 7 23 4 22 2 17v40l-3 23-6 24-7 19-9 19-12 19-13 16-11 12-11 10-13 10-13 9-11 7h-2v6l3 3 15 8 16 10 12 9 11 9 18 18 12 17 5 11 4 13 1 7v20l-4 14-7 13-5 7 3 9 16 40 17 39 5 13 2 9v12l-4 14-6 11-9 10-11 9-15 9-7 1-2-2-1-7-1-19-2-10h-14l-12 6-13 11-14 9-11 4-18 2-3 7-7 28-7 23-4 10-6 8-7 6-9 3-6 1h-36l-9-2-6-4-6-7-7-15-9-29-4-1-22 3-14 1h-11l-25-2-19-2-8 25-5 13-6 11-7 6-6 2-7 1h-35l-12-3-6-4-7-7-6-13-11-38-6-21-18-2-11-4-10-6-11-9-11-8-7-3h-15l-2 16-1 20-1 1h-8l-15-9-9-7-9-9-7-11-5-15v-17l5-16 9-19 20-48 8-20v-5l-8-11-5-12-3-14v-11l2-14 5-14 6-11 9-12 11-12 10-10 17-13 15-10 21-12 1-7-24-16-13-10-13-12-12-12-11-14-10-16-8-15-9-22-7-27-3-21-1-18v-13l2-26 4-22 7-25 8-20 8-16 10-18-8 2h-8l-7-3-8-9-4-11-3-20v-19l2-12 4-8 5-6 8-5 25-9 10-6 11-11 11-7zm199 11-32 2-25 4-29 6-30 10-29 13-21 12-14 10-13 10-9 8-10 13-9 10-11 11-12 19-10 18-8 18-5 16-6 21-4 29-1 15v17l4 34 5 19 6 17 2 4 3 3 7 11 11 13 5 6 8 7 10 9 14 10 11 7 17 10 25 11 28 10 24 6 21 4 27 4 25 2h31l36-2 34-5 29-7 22-7 25-10 21-10 16-10 14-10 13-11 12-11 9-10 9-12 9-13 9-17 5-12 7-21 6-29 1-11v-38l-4-24-5-20-7-19-7-15-4-7 2-1-2-5-7-8-11-11-12-16-12-12-19-14-13-8-10-6-17-8-24-10-15-5-23-6-36-6-24-2zm-173 455-21 11-15 10-13 10v2l-4 2-15 15-11 14-6 12-4 12-2 10v16l4 14 7 12 15 15 7 5 6 3 1 3-12-1-2 3v6l5 6 7 4 5 1h13l9-3 12-9 5-42-1-6-6-10-9-12-8-10v-4l6 1 13 13 12-7 3-7 10-30 4-6h3l-1 8-6 18-7 28-5 25-3 19-2 22v22l2 23 4 21 6 16 7 16 8 12 12 16v4l-5-2-9-9-1 3 13 53 9 29 6 10 8 7 5 2 17 2h14l15-2 6-4 6-10 12-36-7-3-17-6-5-2v-3l4-1 39 9 27 3h31l23-3 28-6 7-2 10-1-2 5-24 8-3 2 2 9 9 26 6 11 10 5 27 1 13-1 11-4 7-8 5-12 9-32 8-29 3-17v-3l-4 2-8 8-3 1 3-7 7-9 8-11 8-16 6-15 5-22 2-18v-38l-2-21-6-34-11-40-5-17v-2l4 1 4 6 6 16 5 17 4 4 7 5h4l7-9 6-4 6-1-3 7-9 10-10 15-3 7v9l2 11 2 22 2 5 9 7 9 4h16l10-5 4-4 1-9-1-2-13 1v-4l9-3 9-7 7-8 6-7 7-14 2-7v-22l-4-14-5-12-7-10-9-11-13-13-14-11-13-9-21-12-6-2-12 12-14 11-10 7-14 8-16 8-21 8-29 8-1 4 5 11 4 14 1 20-1 2-14-1-16-5-8-4-5-3-12-11-4-5-5-11-3-7-16 1-4 9-6 12-16 16h3l-8 2-5 2-13 5-8 1-10-1-1-1v-9l2-14 5-16 4-8v-2l-24-7-18-6-18-8-20-11-16-11-12-11-10-9z"
|
|
fill="#06080D"
|
|
/>
|
|
<path
|
|
transform="translate(645,705)"
|
|
d="m0 0 4 1 5 13 5 8 9 9 6 5 20 8 13 4-1 36 28-10 10-2-1 107-30 10-43 14-36 12h-4v-22l-8 3-5 1-1-3v-9l-13 4-34 12-7 1v-14l10-4h3v-41l-36 13h-2l-1-93v-12l1-4 18-6 8-3 1 8 1 1 11 1 9-2 14-5 4-1 5-2-2-1 13-12 4-5 5-10 4-9z"
|
|
fill="#2D3374"
|
|
/>
|
|
<path
|
|
transform="translate(804,692)"
|
|
d="m0 0 2 2 12 42 5 20 5 29 2 21v38l-3 23-5 20-9 21-10 16-8 9-3 5-1 4 5-3 8-8h2l-2 14-4 16-12 45-6 16-7 9-8 4-4 1-16 1-24-1-10-5-7-14-10-29 1-4 19-7 7-2 2-5-14 2-25 6-21 3-8 1h-31l-27-3-30-7-11-2-2 2v2l5 2 17 6 7 3-12 36-6 10-6 4-15 2h-14l-17-2-8-4-8-9-5-12-7-23-13-53 1-3 10 10 4 1-1-5-7-10-9-26-2-5 1-4 4 8 10 10 14 10 17 10 18 8 23 7 23 5 24 3h49l18-2 25-5 17-5 14-6 20-11 12-9 10-9 9-10 12-19 8-17 5-15 5-25 2-20v-44l-5-43-2-13v-7z"
|
|
fill="#0F347E"
|
|
/>
|
|
<path
|
|
transform="translate(887,300)"
|
|
d="m0 0 4 4 6 11 6 9 8 17 7 18 6 22 4 25 1 10v38l-2 18-3 14-7 23-7 17-10 18-6 9-9 13h-2l-2 4h-2l-2 4-16 16h-2l-1 3-16 12-13 8-22 12-21 9-19 7-22 6-18 4-23 4-29 3-19 1h-34l-38-3-25-4-23-5-22-6-20-7-18-8-16-8-12-7-10-7-11-8-11-9-16-16-11-14-15-23-5-11 1-3 9 14 11 13 4 5 8 7 10 9 14 10 11 7 17 10 25 11 28 10 24 6 21 4 27 4 25 2h31l36-2 34-5 29-7 22-7 25-10 21-10 16-10 14-10 13-11 12-11 13-15 14-21 8-15 5-12 7-21 6-29 1-11v-38l-4-24-5-20-7-19-7-15-4-8z"
|
|
fill="#0F347E"
|
|
/>
|
|
<path
|
|
transform="translate(659,735)"
|
|
d="m0 0h3v13l14-4h6l9 4 16 5-1 36 28-10 10-2-1 107-30 10-43 14-36 12h-4v-109l10-4 9-3 1-65z"
|
|
fill="#4BA1C2"
|
|
/>
|
|
<path
|
|
transform="translate(636,416)"
|
|
d="m0 0 17 1 17 4 15 7 10 8 8 9 5 12 1 12-2 10-6 12-10 10-8 5-17 6-8 2h-34l-10-2-13-4-14-9-8-9-5-9-2-8v-15l5-13 10-11 12-8 13-5 16-4z"
|
|
fill="#7ED1DA"
|
|
/>
|
|
<path
|
|
transform="translate(629,184)"
|
|
d="m0 0h33l32 3 28 5 27 7 21 8 25 11 11 6 10 6 12 8 16 12 12 12 12 16 16 16 3 5-1 2-5-3-3-6-6-4-5-7-8-7-10-9-16-12-19-12-27-14-21-8-22-7-30-7-28-4-27-2h-33l-26 2-17 1v2l3 1 2 3v6l-6 9-10 7-12 6-16 5-13 2h-15l-8-3-4-4v-8l2-4-17 8-23 13-14 10-16 12-12 11-14 15-13 18-11 18-10 19-8 21-6 23-5 26-1 6v52l-2-3-3-27v-17l2-24 4-24 5-17 7-21 10-21 11-18 8-12 17-17 10-13 4-5 8-7 13-10 18-12 12-7 26-12 21-8 16-5 33-7 21-3z"
|
|
fill="#70A2CD"
|
|
/>
|
|
<path
|
|
transform="translate(432,181)"
|
|
d="m0 0h12l9 3 13 9 5 4v2h2l7 8 1 5-7 4-16 9-8 6-10 7h-2l2-9 4-16v-10h-3l-3 9-4 13-12 26-7 10-6 8-14 14-11 8-12 4-8-1-6-8-4-10-2-19v-12l2-14 3-6 8-7 10-4 15-5h2l-2 7-1 9h3l2-5 9-17 8-10 13-9z"
|
|
fill="#16519E"
|
|
/>
|
|
<path
|
|
transform="translate(836,181)"
|
|
d="m0 0h12l12 5 11 9 8 10 10 19 2 2 1-7-4-10 9 2 18 7 8 6 3 5 2 9v25l-1 12-5 13-5 6-8 1-11-4-11-7-10-9-8-8-8-14-7-10-8-19-6-19v-2h-3v11l6 24-4-2-18-12-14-8-8-5 4-6 10-11 13-9z"
|
|
fill="#17519E"
|
|
/>
|
|
<g className="sagi-eye sagi-eye-left">
|
|
<g
|
|
className="sagi-eye-track"
|
|
style={{ transform: "translate(var(--sagi-px, 0px), var(--sagi-py, 0px))" }}
|
|
>
|
|
<g className="sagi-eye-blink">
|
|
<path
|
|
transform="translate(503,354)"
|
|
d="m0 0h15l12 4 8 5 8 7 3 4v2h2l5 13v21l-4 11-7 11-7 6-10 6-5 2h-19l-9-2-12-7-10-10-6-12-2-9v-9l2-11 4-9 7-9 8-7 10-5z"
|
|
fill="#020406"
|
|
/>
|
|
<path
|
|
transform="translate(498,338)"
|
|
d="m0 0h13l17 4 15 8v2l4 2 9 10 6 11 4 13v18l-2 13-5 12-3 5h-2l-2 4-7 8-10 7-5 2-8 3-7 2h-16l-13-3-10-4-12-9-5-4-9-13-4-11-2-8v-20l4-14 7-12 9-10 9-7 8-4 9-3zm5 16-12 4-11 8-7 8-4 6-3 9-1 8v9l2 9 6 12 10 10 12 7 9 2h19l12-6 9-7 7-10 4-10 1-3v-21l-5-13h-2l-2-4-6-7-9-6-10-4-4-1z"
|
|
fill="#F9FBFC"
|
|
/>
|
|
<path
|
|
transform="translate(523,371)"
|
|
d="m0 0h9l5 3 2 3v9l-3 5-5 3-9-1-5-6-1-2v-7l5-6z"
|
|
fill="#F6F9FB"
|
|
/>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<g className="sagi-eye sagi-eye-right">
|
|
<g
|
|
className="sagi-eye-track"
|
|
style={{ transform: "translate(var(--sagi-px, 0px), var(--sagi-py, 0px))" }}
|
|
>
|
|
<g className="sagi-eye-blink">
|
|
<path
|
|
transform="translate(764,354)"
|
|
d="m0 0h12l13 4 12 8 9 12 4 11 1 7v9l-2 9-7 14-5 6-11 8-7 3-6 1h-19l-12-5v-2l-5-2-5-5-7-9-4-10-1-4v-19l2-7 9-14 10-8h2v-2l10-4z"
|
|
fill="#020406"
|
|
/>
|
|
<path
|
|
transform="translate(770,338)"
|
|
d="m0 0h10l14 3 10 4 10 7 5 4v2h2l7 10 5 11 2 5 1 9v18l-4 13-5 10-7 9h-2v2l-4 3h-2v2l-10 6-6 1v2l-11 3h-16l-15-3-10-5-10-8-9-10-4-7-5-12-2-9v-19l6-17 8-13h2l1-3h2v-2h2v-2l14-9 12-4zm-6 16-10 2-7 3v2l-5 2-8 7-6 9-3 6-1 5v19l3 10 6 10 6 7 5 3h2v2l12 5h19l9-2 10-6 6-5 6-8 6-13 1-7v-9l-2-10-4-9-6-8-5-5-11-7-11-3z"
|
|
fill="#F9FBFC"
|
|
/>
|
|
<path
|
|
transform="translate(781,371)"
|
|
d="m0 0h10l5 4 1 2v8l-2 5-4 3-7 1-6-3-4-7 1-7 4-5z"
|
|
fill="#F4F8FA"
|
|
/>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<path
|
|
transform="translate(440,824)"
|
|
d="m0 0h2l2 30 2 16 2 6 2 9 6 17 4 8 4 9 5 26v4h-15l-10-4-9-6-9-8-11-7-10-5-16-2 1-17 5-28 5-23 5-18h19l9-3z"
|
|
fill="#3098A7"
|
|
/>
|
|
<path
|
|
transform="translate(839,824)"
|
|
d="m0 0 5 2 12 5 20 1 4 15 6 27 4 24 1 9v10l-16 2-10 5-13 9-10 9-12 6-10 2-9-1 3-17 3-15 7-14 4-10 3-8 5-27z"
|
|
fill="#2F98A7"
|
|
/>
|
|
<path
|
|
transform="translate(898,796)"
|
|
d="m0 0 4 2 8 21 19 45 10 23 4 12v8l-3 11-4 8-9 12-9 8-13 8h-2l-2-27-6-43-5-26-6-25v-5l8-6 3-5 1-5v-14z"
|
|
fill="#3CCCD4"
|
|
/>
|
|
<path
|
|
transform="translate(380,796)"
|
|
d="m0 0 4 2 1 3-1 9 3 10 4 5 5 3-1 10-4 17-5 26-3 16-3 25-2 32-6-2-10-6v-2l-4-2-7-7-9-14-3-9v-17l8-22 7-15 6-13 16-40z"
|
|
fill="#3CCCD4"
|
|
/>
|
|
<path
|
|
transform="translate(844,451)"
|
|
d="m0 0h14l10 4 8 6 7 7 4 9 2 8v8l-3 11-6 9-8 8-8 4-8 2h-12l-13-5-8-7-6-7-4-10-1-3v-12l4-11 6-8 9-8 9-4z"
|
|
fill="#7DD1DA"
|
|
/>
|
|
<path
|
|
transform="translate(424,451)"
|
|
d="m0 0h13l10 4 9 6 7 9 5 12v15l-7 14-7 8-8 5-10 3h-12l-11-4-9-6-7-8-5-11v-17l5-12 9-10 8-5z"
|
|
fill="#7DD1DA"
|
|
/>
|
|
<path
|
|
transform="translate(474,931)"
|
|
d="m0 0 7 6 6 7 3 5 13 11 20 13 12 7 14 7 5 6 2 8-3 16-4 9-5 6-8 2h-24l-6-4-7-8-5-12-7-23-13-53z"
|
|
fill="#17529E"
|
|
/>
|
|
<path
|
|
transform="translate(712,800)"
|
|
d="m0 0h5l1 2v13l-33 11-7 5-5 11v21l2 7 4 1h7l14-5v-14l-16 5v-15l10-5 20-6h4v44l-5 4-30 10h-11l-9-4-5-7-2-5-1-6v-20l2-10 6-12 6-7 10-6z"
|
|
fill="#FEFEFE"
|
|
/>
|
|
<path
|
|
transform="translate(620,740)"
|
|
d="m0 0h2v16l-13 4-11 4-14 4-6 4-1 9 5 2 10-3 10-4 4-1h13l5 7 1 3v13l-1 7-7 10-10 7-20 7-19 6-1 1h-5v-16l16-5 17-6 9-3v-2h2l1-9-1-1h-7l-18 6-5 1h-10v-2l-3-1-4-9v-12l3-10 4-6 11-7 22-8 4-1z"
|
|
fill="#F9FBFC"
|
|
/>
|
|
<path
|
|
transform="translate(776,960)"
|
|
d="m0 0h5l2 3v13l-4 19-2 8-7 25-3 7-4 1-16 1-3-2-11-1-6-9-2-9v-18l3-6 12-10 15-10 10-6z"
|
|
fill="#17519E"
|
|
/>
|
|
<path
|
|
transform="translate(462,629)"
|
|
d="m0 0 4 1 10 5 8 3 11 5 24 7 17 5 23 5 15 2 3 1 15 2 23 1-1 9-1 2-7 2-11-1-20-4-6-2-4 1 10 5 13 4 6 1-5 5-7 6-11-1-23-6-19-8-8-3-10-6-8-4-15-10-14-11-11-11z"
|
|
fill="#3ECDD4"
|
|
/>
|
|
<path
|
|
transform="translate(816,629)"
|
|
d="m0 0h2l-1 5-7 8-13 11-16 11-22 12-8 4-17 6-9 3-21 5h-6l-11-10 3-2 13-3 11-3 7-4v-1h-7l-7 3-22 4h-16l-4-6v-5l2-1 38-3 28-6 26-6 17-5 20-8 12-5z"
|
|
fill="#3FCBD4"
|
|
/>
|
|
<path
|
|
transform="translate(628,410)"
|
|
d="m0 0h26l16 4 12 5 8 4 13 10 7 10 5 13 1 5v15l-4 11-7 10-5 6-13 9-11 5-19 5-9 1h-15l-14-2-17-5-14-7-12-11-8-11-4-13v-11l2-11 7-14 9-9 10-7 15-7 14-4zm8 6-18 3-12 4-12 6-10 8-8 10-4 11v15l3 10 7 11 9 8 10 6 15 5 8 1h34l14-4 13-5 9-7 7-7 6-12 2-10-1-12-5-12-11-12-8-6-14-6-17-4z"
|
|
fill="#030509"
|
|
/>
|
|
<path
|
|
transform="translate(365,737)"
|
|
d="m0 0 4 4 9 17 9 12 11 12 13 9 13 5h8l5-3 3-7h2l2-7h1l-1 16-2 17-12 9-9 3h-13l-9-3-7-6-1-2v-6l3-3 11 1-2-4-8-4-12-11-7-7-7-12-4-14z"
|
|
fill="#10347E"
|
|
/>
|
|
<path
|
|
transform="translate(913,728)"
|
|
d="m0 0h1l1 5v22l-4 12-7 12-15 15-5 4-9 3v4l13-1 1 2-1 9-7 6-7 3h-16l-12-6-7-6-2-15-2-21h2l3 8 4 10 4 3h10l12-5 13-10 7-7 10-13 10-19z"
|
|
fill="#11347E"
|
|
/>
|
|
<path
|
|
transform="translate(564,474)"
|
|
d="m0 0h1l4 13 8 11 7 7 13 8 18 6 9 2 9 1h15l14-2 17-5 13-7 10-8 7-10 5-10 1-4h2l-3 16-7 14-7 9-11 9-14 7-17 4-7 1h-19l-17-3-11-4-12-6-6-4v-2l-4-2-5-5-6-8-5-11-2-9z"
|
|
fill="#10347E"
|
|
/>
|
|
<path
|
|
transform="translate(442,198)"
|
|
d="m0 0h9l-1 3 11 6 8 7h8l-3 2-16 9-8 6-10 7h-2l2-9 4-16v-10h-3l-3 9-4 13-12 26-7 10-6 8-14 14-11 8-12 4-8-1-6-8-3-7 1-3 7 3h11l14-7 11-9 8-7 9-11 9-12 8-16 5-15z"
|
|
fill="#11347E"
|
|
/>
|
|
<path
|
|
transform="translate(611,685)"
|
|
d="m0 0 4 1 1 7-8 6-7 9-1 3h-2v4l8-7 11-10 3-1 3 4v11l-6 8-7 8-9 7-16 6v2l-6 1h-8l2-16 3-10 8-14 7-8 14-9z"
|
|
fill="#3BCED5"
|
|
/>
|
|
<path
|
|
transform="translate(475,693)"
|
|
d="m0 0h1l-1 12-4 22-2 13-2 7-5 33-2 32v16l1 19 4 27 4 15 5 15 7 20-1 2-7-10-8-14-9-24-4-21-2-23v-22l3-29 6-34 7-27 5-17z"
|
|
fill="#71A3CE"
|
|
/>
|
|
<path
|
|
transform="translate(834,200)"
|
|
d="m0 0 6 1 4 5 3 13 8 13 7 10 8 10 7 8 11 9 11 7 8 3h10l6-3 3-3 1 2-5 13-5 6-8 1-11-4-11-7-10-9-8-8-8-14-7-10-8-19-6-19v-2h-3v11l6 24-4-2-18-12-14-8-4-3 10 1 7-7 8-5z"
|
|
fill="#11347E"
|
|
/>
|
|
<path
|
|
transform="translate(666,685)"
|
|
d="m0 0 9 2 11 6 8 8 7 10 4 9 3 9 1 15-10-1-15-6-12-7-5-4-4-7-6-13 1-7 4-2 4 5 3 2v2l5 2 7 6 3 1-4-8-16-16v-5z"
|
|
fill="#3BCDD4"
|
|
/>
|
|
<path
|
|
transform="translate(743,494)"
|
|
d="m0 0 11 2 9 5 6 8 1 7-1 2h-5l-5-7-3-1-2 5-4 5-7 8-7 7-14 10-16 8-15 6-16 4-11 2-13 1h-24l-5-2-2-3 2-3 26-1 24-3 19-5 17-7 15-9 14-12 10-13 1-3-9-2-1-1v-5z"
|
|
fill="#020304"
|
|
/>
|
|
<path
|
|
transform="translate(477,637)"
|
|
d="m0 0h6l7 4 25 8 26 7 25 5 11 2 15 2 23 1-1 9-1 2-7 2-11-1-20-4-6-2-4 1 12 6-4 1-11-4-12-5-17-5-36-14-20-11z"
|
|
fill="#3194A7"
|
|
/>
|
|
<path
|
|
transform="translate(819,643)"
|
|
d="m0 0 5 3-6 7-8 9-16 12-13 9-17 10-10 4-8 4-32 11-1 2 4 14 1 22h-1l-2-20-5-17-4-8 1-4 35-10 19-8 16-8 16-10 14-11z"
|
|
fill="#12347E"
|
|
/>
|
|
<path
|
|
transform="translate(380,796)"
|
|
d="m0 0 4 2 1 3-1 9 2 10-3-2-5-1-1 5h-2l-1 9-11 32-8 19-7 21-3 14 1 5 1 4 3-4v9l-5-5-4-8-2-6v-17l8-22 7-15 6-13 16-40z"
|
|
fill="#80D1DB"
|
|
/>
|
|
<path
|
|
transform="translate(461,643)"
|
|
d="m0 0 7 6 7 7 14 10 13 8 21 11 21 8 29 8 2 1-2 6-4 9h-1l-1-5-30-10-19-8-20-12-12-9-10-9-18-18z"
|
|
fill="#11347E"
|
|
/>
|
|
<path
|
|
transform="translate(898,796)"
|
|
d="m0 0 4 2 8 21 19 45 10 23 4 12v8l-3 11-4 8-2 1 1-9-4-19-10-29-8-21-10-29-2-11h-3l-2-7 1-5z"
|
|
fill="#83D1DB"
|
|
/>
|
|
<path
|
|
transform="translate(625,667)"
|
|
d="m0 0h28l4 2 2 6-1 10-4 8-8 5h-14v-2l-4-1-5-8-1-3v-12z"
|
|
fill="#3CCED5"
|
|
/>
|
|
<path
|
|
transform="translate(733,657)"
|
|
d="m0 0h2v2l24 1-2 2-25 9-8 4-3 1-4-2 4-3h-7l-7 3-22 4h-16l-4-6v-5l2-1 38-3z"
|
|
fill="#499ABE"
|
|
/>
|
|
<path
|
|
transform="translate(823,639)"
|
|
d="m0 0 6 2 26 15 13 10 13 11 12 12 10 13 6 11 4 12-1 11-2-2-5-16-9-13-11-12-8-8-8-6-4-4-13-10-21-14-11-7 2-4z"
|
|
fill="#71A3CE"
|
|
/>
|
|
<path
|
|
transform="translate(575,466)"
|
|
d="m0 0h1l1 13 4 6 4 5 10 6 13 6 21 4h24l20-4 9-4 9-5 9-7 2-3 3 1-6 9-8 8-8 5-17 6-8 2h-34l-10-2-13-4-14-9-8-9-5-9-1-5 1-3z"
|
|
fill="#4F9FC3"
|
|
/>
|
|
<path
|
|
transform="translate(456,639)"
|
|
d="m0 0 5 5-17 10-23 16-13 11-10 9-9 9-12 17-5 10-3 10-3-1 2-12 6-15 7-10 11-13 13-13h2v-2l13-10 17-11z"
|
|
fill="#71A4CE"
|
|
/>
|
|
<path
|
|
transform="translate(645,705)"
|
|
d="m0 0 4 1 5 13 5 8 9 9 6 5 5 2-3 2-11 3h-3v-13l-11 4-1 65-5 1 2-1v-64l2-10-1-12-2-1-18 7h-3l3-9 4-9z"
|
|
fill="#113881"
|
|
/>
|
|
<path
|
|
transform="translate(432,181)"
|
|
d="m0 0h12l9 3 13 9 5 4v2h2l7 8 1 5-3 2h-3l-4-6v-2h-2v-2l-4-2-13-8-7-2h-13l-12 6-9 7-12 11-4 4 2-6 8-14 6-7 13-9z"
|
|
fill="#6DA1CC"
|
|
/>
|
|
<path
|
|
transform="translate(836,181)"
|
|
d="m0 0h12l12 5 11 9 8 10 5 10-1 2-12-12-13-9-10-4h-13l-10 4-10 7-4 4h-2l-2 4-2 2-5-1v-3l9-11 8-7 11-7z"
|
|
fill="#6FA4CD"
|
|
/>
|
|
<path
|
|
transform="translate(474,931)"
|
|
d="m0 0 7 6 6 7 3 20 9 35 9 27 3 5 4 3-5-1-8-7-6-10-7-23-5-19-10-40z"
|
|
fill="#72A7CE"
|
|
/>
|
|
<path
|
|
transform="translate(834,200)"
|
|
d="m0 0 6 1 4 5 3 13 3 5v5h-2l-8-24v-2h-3v11l6 24-4-2-18-12-14-8-4-3 10 1 7-7 8-5z"
|
|
fill="#12347D"
|
|
/>
|
|
<path
|
|
transform="translate(609,450)"
|
|
d="m0 0h6l5 4 3 9v7l-3 9-4 4-6 1-6-5-2-5v-14l3-7z"
|
|
fill="#04060A"
|
|
/>
|
|
<path
|
|
transform="translate(666,450)"
|
|
d="m0 0h6l5 6 2 5v12l-4 8-4 3-6-1-5-5-2-6v-10l3-8z"
|
|
fill="#030408"
|
|
/>
|
|
<path
|
|
transform="translate(816,629)"
|
|
d="m0 0h2l-1 5-7 8-4 3-3-1h-2l-9 4-23 10-7 1-11-1-10-2v-1l25-6 10-3 20-8 12-5z"
|
|
fill="#3396A9"
|
|
/>
|
|
<path
|
|
transform="translate(813,696)"
|
|
d="m0 0h2l6 9 13 12 3 2v2l4 2 6 4 4 2-6 5-5 7-6-1-5-4-4-4-7-23z"
|
|
fill="#11347E"
|
|
/>
|
|
<path
|
|
transform="translate(619,697)"
|
|
d="m0 0 4 4v11l-6 8-7 8-9 7-16 6v2l-6 1h-8l1-4 2-4 2-7h1v9l11-3 9-6 10-8 4-5 3-9v-2l-4 5-9 7-3-1 5-5 14-13z"
|
|
fill="#4C9FC2"
|
|
/>
|
|
<path
|
|
transform="translate(461,704)"
|
|
d="m0 0 3 1-9 29-12 8-7-6-7-7v-1l6-2 6-4 12-11 6-5h2z"
|
|
fill="#12347E"
|
|
/>
|
|
<path
|
|
transform="translate(390,209)"
|
|
d="m0 0h2l-2 7-2 4-13 4-10 6-5 7-3 10-1 28-2-1-2-17v-12l2-14 3-6 8-7 10-4z"
|
|
fill="#6EA2CD"
|
|
/>
|
|
<path
|
|
transform="translate(661,697)"
|
|
d="m0 0 7 6 1 3 5 2 7 6-3 1-6-3h-2l1 5 6 8 5 3 2 4 8 3 11 3v-6l2 1 4 11-10-1-15-6-12-7-5-4-4-7-6-13 1-7z"
|
|
fill="#4EA0C3"
|
|
/>
|
|
<path
|
|
transform="translate(477,637)"
|
|
d="m0 0h6l7 4 25 8 26 7 18 4v1l-41-1-21-8-20-11z"
|
|
fill="#3496AA"
|
|
/>
|
|
<path
|
|
transform="translate(888,209)"
|
|
d="m0 0 9 2 18 7 8 6 3 5 2 9v25l-2 9h-1l-1-22-2-11-5-8-5-4-12-5-7-2-3-5z"
|
|
fill="#6DA2CC"
|
|
/>
|
|
<path
|
|
transform="translate(459,836)"
|
|
d="m0 0h1l4 33 4 17 6 18 7 20-1 2-7-10-8-14-9-24-1-9h1l2-13 1-1z"
|
|
fill="#71A7CE"
|
|
/>
|
|
<path
|
|
transform="translate(651,667)"
|
|
d="m0 0 6 2 2 6-1 10-4 8-8 5h-14v-2l-4-1-5-8-1-5h2l3 4 7 2h8l9-4 2-5v-6z"
|
|
fill="#499FBF"
|
|
/>
|
|
<path
|
|
transform="translate(733,657)"
|
|
d="m0 0h2v2l24 1-2 2-25 9-8 4-3 1-4-2 4-3-9-2-4-2 6-2 4-1-2-1 3-3z"
|
|
fill="#3192A7"
|
|
/>
|
|
<path
|
|
transform="translate(481,250)"
|
|
d="m0 0 7 1 5 4v7l-4 5-6 3h-8l-5-4v-7l5-6z"
|
|
fill="#70A2CD"
|
|
/>
|
|
<path
|
|
transform="translate(636,416)"
|
|
d="m0 0 17 1 12 3-3 2h-26v-2h-9l-1 2-5 1h-8l-2 2v3l-2 2-9 1-12 6-6 7-2-2 7-8 12-8 13-5 16-4z"
|
|
fill="#EEF4F8"
|
|
/>
|
|
<path
|
|
transform="translate(611,685)"
|
|
d="m0 0 4 1 1 7-8 6-7 9-1 3h-2l-1 4-4-2 1-8-3-4 4-5 14-8h2z"
|
|
fill="#479EBF"
|
|
/>
|
|
<path
|
|
transform="translate(585,665)"
|
|
d="m0 0 30 1-1 9-3 1v-2l-5 1-3-1h-11l-17-2-4-3 14-1z"
|
|
fill="#4A9FC0"
|
|
/>
|
|
<path
|
|
transform="translate(419,187)"
|
|
d="m0 0 9 1 2 3-3 3-10 6-14 12-7 8-1-2 8-15 8-10z"
|
|
fill="#6DA5CD"
|
|
/>
|
|
<path
|
|
transform="translate(607,686)"
|
|
d="m0 0h4v2l-16 9-3 5-1 4-3 1-1 5-6 7-5 13-3 10h-1v-10l4-14 8-14 7-8 14-9z"
|
|
fill="#8FCFDC"
|
|
/>
|
|
<path
|
|
transform="translate(886,827)"
|
|
d="m0 0 3 2v9l1 10 2 5 1 9 1 5h2l1 15 3 20 3 19v17h-1l-4-34-5-32-9-39v-5z"
|
|
fill="#6CB7D0"
|
|
/>
|
|
<path transform="translate(560,907)" d="m0 0h2v14l-11 4h-2l-1-4v-9l8-4z" fill="#283477" />
|
|
<path
|
|
transform="translate(664,686)"
|
|
d="m0 0 14 7 4 4v4h2l2 10-3 1-4-6-15-15z"
|
|
fill="#4C9EC1"
|
|
/>
|
|
<path transform="translate(567,856)" d="m0 0h2v14l-9 4h-4v-14z" fill="#273478" />
|
|
<path
|
|
transform="translate(600,727)"
|
|
d="m0 0 3 1 1 3-4 2 1 2-16 6v2l-6 1h-8l1-4 2-4 2-7h1v9l11-3 9-6z"
|
|
fill="#4290B0"
|
|
/>
|
|
<path transform="translate(615,903)" d="m0 0h1v14l-10 4h-3v-13l9-4z" fill="#263478" />
|
|
<path
|
|
transform="translate(661,697)"
|
|
d="m0 0 7 6 1 3 5 2 7 6-3 1-6-3-6 2-4-2-2 1-3-7 1-7z"
|
|
fill="#4FA1C4"
|
|
/>
|
|
<path transform="translate(732,711)" d="m0 0 2 1v12l-8 3h-4l-1-3v-9l7-3z" fill="#49A0C0" />
|
|
<path
|
|
transform="translate(462,629)"
|
|
d="m0 0 4 1 10 5 3 2h-2l-1 2v-2h-4v2l7 7 6 4v2l4 1 1 2 8 4v2l6 2v2l5 2 1 2-6-2-10-7-14-10-12-11-6-7z"
|
|
fill="#67A6CB"
|
|
/>
|
|
<path
|
|
transform="translate(759,651)"
|
|
d="m0 0h11l5 3-1 2-8 3h-8l-10-2-7-1v-1z"
|
|
fill="#3093A7"
|
|
/>
|
|
<path transform="translate(723,761)" d="m0 0h1v14l-9 3h-3v-13l8-3z" fill="#49A0C1" />
|
|
<path
|
|
transform="translate(676,728)"
|
|
d="m0 0 12 6 15 4v-6l2 1 4 11-10-1-15-6-5-5-3-2z"
|
|
fill="#3D9AB2"
|
|
/>
|
|
<path transform="translate(697,671)" d="m0 0h3l9 1-2 2-22 4h-16l-1-5h29z" fill="#338BA5" />
|
|
<path
|
|
transform="translate(625,667)"
|
|
d="m0 0h26v1l-20 1-1 2-1 16-4-2-1-3h-2v-10z"
|
|
fill="#83D1DC"
|
|
/>
|
|
<path
|
|
transform="translate(574,671)"
|
|
d="m0 0 20 2h10l7 1v2l2 1-7 2-11-1-20-4-4-2z"
|
|
fill="#2F86A1"
|
|
/>
|
|
<path transform="translate(630,829)" d="m0 0 1 3v51l-1 15-4 1 2-6v-61z" fill="#0F3882" />
|
|
<path
|
|
transform="translate(816,629)"
|
|
d="m0 0h2l-1 5-7 8-4 3-3-1-1-3-2-2 2-4 13-5z"
|
|
fill="#53A4C5"
|
|
/>
|
|
<path
|
|
transform="translate(607,686)"
|
|
d="m0 0h4v2l-16 9-5 4-5 9h-3l-1 5-4 6-1-3 8-14 7-8 14-9z"
|
|
fill="#E1ECF4"
|
|
/>
|
|
<path
|
|
transform="translate(859,269)"
|
|
d="m0 0 4 2 7 9 14 14 3 5-1 2-5-3-3-6-6-4-5-7-8-7-1-3z"
|
|
fill="#6AA3CC"
|
|
/>
|
|
<path
|
|
transform="translate(563,378)"
|
|
d="m0 0 2 2 2 6 1-8h1v52h-1l-2-19-1-23z"
|
|
fill="#123780"
|
|
/>
|
|
<path
|
|
transform="translate(619,697)"
|
|
d="m0 0 4 4v7h-1l-2-6v3l-2 4h-4v-4l-4 5-9 7-3-1 5-5 14-13z"
|
|
fill="#59A1C5"
|
|
/>
|
|
<path
|
|
transform="translate(390,209)"
|
|
d="m0 0h2l-2 7-2 4-4-1-3-2-5 2-7-2 4-2z"
|
|
fill="#5F9CC6"
|
|
/>
|
|
<path
|
|
transform="translate(898,796)"
|
|
d="m0 0 4 2 6 16-1 5-4-4-2-6h-3l-2-7 1-5z"
|
|
fill="#7FCEDA"
|
|
/>
|
|
<path
|
|
transform="translate(669,422)"
|
|
d="m0 0 5 1 11 5 10 8 4 4-1 2-8-7-7-4-12-1-2-7z"
|
|
fill="#D3EAF1"
|
|
/>
|
|
<path
|
|
transform="translate(673,688)"
|
|
d="m0 0 6 1 9 6 10 11 6 11-1 3-3-4v-3h-2v-2l-3-1-4-6-5-8-6-3-7-4z"
|
|
fill="#DCEDF3"
|
|
/>
|
|
<path
|
|
transform="translate(715,661)"
|
|
d="m0 0h2l1 5-9 1 9 2-6 3-9-1-4-3 6-2v-3z"
|
|
fill="#4497B9"
|
|
/>
|
|
<path
|
|
transform="translate(475,693)"
|
|
d="m0 0h1l-1 12-4 20-2 1v-2h-2l-1 2 1-8z"
|
|
fill="#70B2D0"
|
|
/>
|
|
<path
|
|
transform="translate(619,700)"
|
|
d="m0 0 3 3 1 9-5 6-4 2-1-3-2 1 3-9 5-2-1-5z"
|
|
fill="#328FA7"
|
|
/>
|
|
<path transform="translate(532,655)" d="m0 0 9 1 18 4v1l-41-1-1-2 17-1z" fill="#4E9FC3" />
|
|
<path
|
|
transform="translate(611,685)"
|
|
d="m0 0 4 1v5l-3 1-5 1-1 2-12 6-2-2 8-6 9-5h2z"
|
|
fill="#5FCCD6"
|
|
/>
|
|
<path
|
|
transform="translate(459,836)"
|
|
d="m0 0h1l1 11v10h-2v22l1 6-2-1-3-11 1-4 2-13 1-1z"
|
|
fill="#7DD0DA"
|
|
/>
|
|
<path transform="translate(838,380)" d="m0 0h1v40l-2-2-1-7v-23h1z" fill="#123881" />
|
|
<path
|
|
transform="translate(658,733)"
|
|
d="m0 0 5 1 4 3v3h-2v-3h-2l1 7 1-3 2 1 12 1-3 2-11 3h-3v-13l-4 1z"
|
|
fill="#17509D"
|
|
/>
|
|
<path
|
|
transform="translate(666,685)"
|
|
d="m0 0 9 2-1 2 6 3 8 5 2 4-7-1-6-7-12-6z"
|
|
fill="#7ED2DB"
|
|
/>
|
|
<path transform="translate(604,424)" d="m0 0 2 1-5 5-13 7-6 7-2-2 7-8 12-8z" fill="#D0E9F0" />
|
|
<path transform="translate(739,656)" d="m0 0h10l10 2 4 1-4 2-25-1 1-3z" fill="#45AEC7" />
|
|
<path transform="translate(543,196)" d="m0 0 7 1 21 1-1 2h-30l-2-2z" fill="#7FD0DA" />
|
|
<path
|
|
transform="translate(391,826)"
|
|
d="m0 0 5 2-1 10-4 15-1-4 1-4v-15l-1-3z"
|
|
fill="#7BCCD9"
|
|
/>
|
|
<path transform="translate(441,389)" d="m0 0 3 1v19l-2 10h-1z" fill="#0F357F" />
|
|
<path transform="translate(886,827)" d="m0 0 3 2v9l1 14-2-2-4-17v-5z" fill="#7ACCD8" />
|
|
<path transform="translate(372,716)" d="m0 0 2 1v5l-3 7-2 7-3-1 2-12z" fill="#6AA5CC" />
|
|
<path
|
|
transform="translate(590,700)"
|
|
d="m0 0 2 1-1 5-3 1-1 5-6 7h-2l3-9h3l2-5z"
|
|
fill="#7FD2DB"
|
|
/>
|
|
<path transform="translate(389,859)" d="m0 0 1 3-2 9-2 10-2-2-1-14h2l2-5z" fill="#4C92BB" />
|
|
<path transform="translate(651,667)" d="m0 0 6 2 2 6-1 10-2 2 1-9-3 1-2-8z" fill="#509FC3" />
|
|
<path transform="translate(469,904)" d="m0 0 3 4 2 4 3 1 4 11-1 2-7-10-5-8z" fill="#84C8DA" />
|
|
<path transform="translate(607,686)" d="m0 0h4v2l-16 9-3 3-2-1 5-6z" fill="#EBF4F8" />
|
|
<path transform="translate(780,997)" d="m0 0 1 2 2 1-1 5h2l1 4-4 9h-1z" fill="#16519E" />
|
|
<path transform="translate(776,646)" d="m0 0 2 1-1 2h3v3l-6 2-6-2-5-1 3-2z" fill="#4C9DC0" />
|
|
<path transform="translate(890,850)" d="m0 0 2 3 1 9 1 5h2v11l-2 1-5-27z" fill="#5EA4C8" />
|
|
<path transform="translate(378,932)" d="m0 0h1l-1 22-6-2-2-1v-2l5-1 2-14z" fill="#5392BC" />
|
|
<path
|
|
transform="translate(483,651)"
|
|
d="m0 0 6 2 1 2 8 4v2l6 2v2l5 2 1 2-6-2-10-7-11-8z"
|
|
fill="#65ACCC"
|
|
/>
|
|
<path transform="translate(381,216)" d="m0 0 4 4-19 1-1-3 6-1 6 1z" fill="#7BCFD9" />
|
|
<path
|
|
transform="translate(600,727)"
|
|
d="m0 0 3 1 1 3-4 2 1 2-5 1h-2l-3-1 5-5z"
|
|
fill="#308EA5"
|
|
/>
|
|
<path transform="translate(619,697)" d="m0 0 4 4v7h-1l-2-6v3l-2 4h-4l3-9z" fill="#4E9DC1" />
|
|
<path transform="translate(713,390)" d="m0 0h1l1 24-2-1-1-3v12l-2-3 1-15h1z" fill="#10357F" />
|
|
<path transform="translate(548,684)" d="m0 0h7l2 2 9 3v2l-11-2-9-3z" fill="#4C96BE" />
|
|
<path transform="translate(405,831)" d="m0 0h21l-1 3-20 1-1 2z" fill="#204992" />
|
|
<path transform="translate(608,422)" d="m0 0h5l-2 3v3l-2 2h-8l2-3h2l1-4z" fill="#F5F8FB" />
|
|
<path transform="translate(440,824)" d="m0 0h2v24h-1l-2-19h-5v-2z" fill="#5092BD" />
|
|
<path
|
|
transform="translate(578,680)"
|
|
d="m0 0 10 2 6 1-5 5-5 3v-3l2-1v-2l-8-4z"
|
|
fill="#5BA2C8"
|
|
/>
|
|
<path transform="translate(557,669)" d="m0 0 5 2 10 6 5 2-4 1-11-4-4-2z" fill="#50A1C3" />
|
|
<path transform="translate(354,444)" d="m0 0h1l1 32-2-3-2-21h1z" fill="#63A1C9" />
|
|
<path transform="translate(669,422)" d="m0 0 5 1 4 2 1 4-1 1h-7l-2-7z" fill="#F3F9FA" />
|
|
<path
|
|
transform="translate(700,716)"
|
|
d="m0 0 3 2v2h2l3 9 1 14h-1l-2-12-3-9h-2z"
|
|
fill="#7CCCD9"
|
|
/>
|
|
<path transform="translate(522,674)" d="m0 0h5l6 3v2h3v2l6 1 2 2-9-2-14-6z" fill="#58A2C5" />
|
|
<path
|
|
transform="translate(690,701)"
|
|
d="m0 0h2l3 4v2l5 2 4 8-1 3-3-4v-3h-2v-2l-3-1-4-6z"
|
|
fill="#AADFE6"
|
|
/>
|
|
<path transform="translate(898,796)" d="m0 0 4 2 1 7h-5l-2-3 1-5z" fill="#EEF4F8" />
|
|
<path transform="translate(727,684)" d="m0 0h7v2l-9 3-13 3 3-3 11-3z" fill="#478EB9" />
|
|
<path transform="translate(396,219)" d="m0 0v3l-5 8-4-1-1-2v-7h2l1 5h3l2-5z" fill="#1A357C" />
|
|
<path transform="translate(723,531)" d="m0 0 2 1-10 7-7 4h-2l2-4z" fill="#1D357C" />
|
|
<path transform="translate(822,359)" d="m0 0 5 5 2-3 1 1 1 9 2 6-3-3-7-12z" fill="#153B81" />
|
|
<path transform="translate(699,544)" d="m0 0 4 1-12 5-9 2v-2l12-4z" fill="#1B347B" />
|
|
<path transform="translate(630,829)" d="m0 0 1 3v16h-3v-16z" fill="#103983" />
|
|
<path transform="translate(655,678)" d="m0 0h2v10l-5 4 1-13z" fill="#2F98A8" />
|
|
<path transform="translate(758,673)" d="m0 0h3v2l-10 5-6 1-1-2 10-5z" fill="#549FC3" />
|
|
<path transform="translate(677,746)" d="m0 0h8l5 2-2 2-13-1-1-2z" fill="#6DA1CC" />
|
|
<path transform="translate(690,423)" d="m0 0 5 2 6 3 8 10-2 2-6-8-11-8z" fill="#1F347A" />
|
|
<path transform="translate(537,836)" d="m0 0h1v22l9-1-3 2-7 2z" fill="#0F357F" />
|
|
<path transform="translate(460,781)" d="m0 0h1v16l-1 6-2-2v-15z" fill="#77C5D6" />
|
|
<path transform="translate(622,682)" d="m0 0h2l3 4 3 1 1 4-5 2-4-9z" fill="#4B9DBE" />
|
|
<path transform="translate(623,675)" d="m0 0h4l1 12-5-5z" fill="#3BCED5" />
|
|
<path transform="translate(737,349)" d="m0 0 2 1-4 2v2h-2v2l-4 2v-7l1-1z" fill="#173A80" />
|
|
<path transform="translate(878,289)" d="m0 0 6 5 3 5-1 2-5-3-3-6z" fill="#71B5D1" />
|
|
<path transform="translate(842,210)" d="m0 0h2l4 10 2 4v5h-2l-6-18z" fill="#2A3477" />
|
|
<path transform="translate(379,213)" d="m0 0h2l1 3-6 3-7-2 4-2z" fill="#70A1CD" />
|
|
<path transform="translate(839,824)" d="m0 0 5 2 5 3-2 1-7-1v12h-1z" fill="#5E9DC6" />
|
|
<path transform="translate(803,645)" d="m0 0 2 1-8 7-8 5 2-4h2l2-4z" fill="#75BBD3" />
|
|
<path transform="translate(652,554)" d="m0 0h11l3 2-16 1-5-1v-1z" fill="#1E347A" />
|
|
<path transform="translate(706,678)" d="m0 0 4 1-10 4-10 2 2-3 11-3z" fill="#4895BB" />
|
|
<path transform="translate(455,869)" d="m0 0 4 2v8l1 6-2-1-3-11z" fill="#7ECBD9" />
|
|
<path transform="translate(672,690)" d="m0 0 6 3 4 4v2l-6-2-5-6z" fill="#3CCAD3" />
|
|
<path transform="translate(461,914)" d="m0 0 2 3 1 2v7l-2 5-1-4z" fill="#4C98BE" />
|
|
<path transform="translate(662,711)" d="m0 0 5 2h2l1 4-3 1-2 2-4-8z" fill="#309AA9" />
|
|
<path transform="translate(739,656)" d="m0 0 9 1-4 2-3 1h-7l1-3z" fill="#51A1C4" />
|
|
<path transform="translate(823,639)" d="m0 0 4 2 1 2h-2l-2 4-4-3 2-4z" fill="#588FBC" />
|
|
<path transform="translate(437,205)" d="m0 0h3l-3 12h-3l1-6z" fill="#1E347A" />
|
|
<path transform="translate(575,466)" d="m0 0h1l1 13 1 3-2 3-3-9 1-3z" fill="#6EA3CD" />
|
|
<path transform="translate(836,402)" d="m0 0h1l1 5h1v13l-2-2-1-7z" fill="#0F357F" />
|
|
<path transform="translate(858,832)" d="m0 0h18l-3 2-7 1-8-1z" fill="#244188" />
|
|
<path transform="translate(676,728)" d="m0 0 12 6-1 3h-3l-5-5-3-2z" fill="#399BAF" />
|
|
<path
|
|
transform="translate(630,689)"
|
|
d="m0 0 4 1-1 2h-2l4 5-6-1-2-2 1-4v2l2-2z"
|
|
fill="#6B9FCB"
|
|
/>
|
|
<path transform="translate(343,922)" d="m0 0h3l1 4 3-4v9l-5-5z" fill="#7CCBD9" />
|
|
<path transform="translate(666,685)" d="m0 0 9 2v3l-2 1-8-4z" fill="#88C8D9" />
|
|
<path transform="translate(461,350)" d="m0 0h7l-6 7-3 2 2-4z" fill="#1E347A" />
|
|
<path transform="translate(380,796)" d="m0 0 4 2 1 3h-5v2h-2l1-6z" fill="#DFEFF4" />
|
|
<path transform="translate(611,685)" d="m0 0 4 1v5l-3 1-4-1 1-2h4v-2h-2z" fill="#92D1DE" />
|
|
<path transform="translate(549,443)" d="m0 0 1 4v3h-8l5-5z" fill="#113780" />
|
|
<path transform="translate(608,770)" d="m0 0h8v2l2 1v2l-7-1v-2h-3z" fill="#0B2455" />
|
|
<path transform="translate(467,718)" d="m0 0h3l1 7-2 1v-2h-2l-1 2z" fill="#6FAACF" />
|
|
<path transform="translate(496,660)" d="m0 0 7 2 1 3 5 2 1 2-6-2-8-6z" fill="#70B7D1" />
|
|
<path transform="translate(617,703)" d="m0 0 3 1-1 4-5 1 1-5z" fill="#47A0BF" />
|
|
<path transform="translate(756,510)" d="m0 0 4 1 1 3-5 1-3 3-2-1z" fill="#213479" />
|
|
<path transform="translate(715,476)" d="m0 0h2l-2 11-5 3 2-5z" fill="#1C347B" />
|
|
|
|
{/* mood overlay glyphs - new additions, not extracted from mascot art */}
|
|
<g className="sagi-zzz">
|
|
<text x="990" y="260">
|
|
z
|
|
</text>
|
|
<text x="1075" y="150">
|
|
z
|
|
</text>
|
|
</g>
|
|
<g className="sagi-bang">
|
|
<text x="1020" y="260">
|
|
!
|
|
</text>
|
|
</g>
|
|
<g className="sagi-sparkle">
|
|
<path d="M1050 380 l18 46 l46 18 l-46 18 l-18 46 l-18 -46 l-46 -18 l46 -18 z" />
|
|
</g>
|
|
</svg>
|
|
);
|
|
});
|