From a85ae730c4bdce207cd92493a77539b223ee0e91 Mon Sep 17 00:00:00 2001 From: gethi Date: Sun, 26 Jul 2026 15:45:28 +0100 Subject: [PATCH 1/2] docs+asset: real-world-map spec + Natural Earth path (public domain) Co-Authored-By: Claude Fable 5 --- .../specs/2026-07-26-real-world-map-design.md | 62 +++++++++++++ scripts/worldmap/convert.py | 88 +++++++++++++++++++ scripts/worldmap/ne_110m_land.equirect.svg | 3 + src/ui/components/worldPath.ts | 12 +++ 4 files changed, 165 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-26-real-world-map-design.md create mode 100644 scripts/worldmap/convert.py create mode 100644 scripts/worldmap/ne_110m_land.equirect.svg create mode 100644 src/ui/components/worldPath.ts diff --git a/docs/superpowers/specs/2026-07-26-real-world-map-design.md b/docs/superpowers/specs/2026-07-26-real-world-map-design.md new file mode 100644 index 0000000..e73ddad --- /dev/null +++ b/docs/superpowers/specs/2026-07-26-real-world-map-design.md @@ -0,0 +1,62 @@ +# nuke — real world map for the Action screen + +**Date:** 2026-07-26 +**Status:** approved in brainstorming (visual companion); pending spec review +**Goal:** Replace the Action screen's abstract blob continents with a recognisable real-world map (real coastlines), leaders pinned at true geographic locations, and Freedonia as an invented island in the mid-Atlantic. Confirmed visually in the companion. + +## 0. Decisions (locked) + +- **Real coastlines, comic-styled.** Actual Natural Earth 110m land (public domain), simplified, drawn in the existing ink-outline / paper-fill / halftone-ocean style — recognisable Earth, not photoreal, not toddler blobs. +- **Real geographic pins.** Every leader sits at true lon/lat via an equirectangular mapping (`x = lon + 180`, `y = 90 - lat`). Freedonia = invented mid-Atlantic island (~40°W, 32°N). Human slots 2–5 take ocean positions. +- **Presentational only.** No engine/gameplay change. Overlays (launch arcs, impact rings, pulses, diplomacy trails, build icons) keep their behaviour — only their coordinate constants rescale to the new map units. + +## 1. Asset & provenance (already in the branch) + +- `src/ui/components/worldPath.ts` — `WORLD_PATH` (single `d`, ~37KB, `fill-rule="evenodd"`) + `WORLD_VIEWBOX = "0 12 360 132"`. Sourced from Natural Earth 110m Land (public domain: "No permission is needed… crediting unnecessary"), converted to `x=lon+180, y=90-lat`, RDP-simplified. Licence/provenance noted in the file header. +- `scripts/worldmap/ne_110m_land.equirect.svg` (source) + `scripts/worldmap/convert.py` (regenerator) kept for reproducibility. + +## 2. WorldMap.tsx changes (`src/ui/components/WorldMap.tsx`) + +### 2.1 Coordinate system +- viewBox: `"0 0 100 85"` → `WORLD_VIEWBOX` (`"0 12 360 132"`). +- `preserveAspectRatio`: `"none"` → `"xMidYMid meet"` (real coastlines must keep their proportions, not stretch). +- Add an ocean background covering the full equirectangular extent so letterboxing (from `meet`) reads as ocean: a `` in the ocean cyan + the existing halftone dot pattern, drawn first. +- Continents: replace the seven hand-authored ``s (+ the separate UK island + its label) with one ``. (UK is now part of the real coastline, so the special-case island path AND the standalone "UK" continent label are removed; UK keeps its country pin like everyone else.) + +### 2.2 COUNTRY_POS → real lon/lat +Rewrite via an `ll(lon, lat)` helper (`{ cx: lon + 180, cy: 90 - lat }`). Values (lon, lat): +- chump USA (-98, 39) · carnage CANADA (-106, 58) · burnem UK (-2, 54) · netanyahoo ISR (34, 31) · khameneverhere IRAN (53, 32) · mileigh-hem ARG (-64, -38) +- player1 Freedonia (-40, 32) — mid-Atlantic +- player2 (-150, 5) Pacific · player3 (78, -28) Indian Ocean · player4 (170, 42) N Pacific · player5 (-25, -45) S Atlantic +Keep the `CountryPos { cx, cy, label? }` shape and AI `label`s (USA/CANADA/UK/ISR/IRAN/ARG) so the render loop is unchanged. + +### 2.3 Freedonia island +Freedonia has no real landmass. Draw a small invented island under player1's pin (a `` blob in `--cyan-soft`, ~6×5 units) so the human isn't floating on open ocean. Only for player1 (and only if player1 is in the cast); other human ocean slots just get their pin/marker (islandless is fine for them, or reuse the same small-island blob — implementer's call, keep it cheap). + +### 2.4 Rescale overlay + marker constants to the 360×132 space +The map units are ~3.6× the old 100-wide space; `meet` keeps units square so one factor applies. Use these (validated in the companion mock): +- Country marker ellipse: `rx` ~5–6 (UK/ISR smaller ~3.5), `ry` ~3–3.4; label `fontSize` ~3.6 (small pins ~3.2). Drop the old `isUK` special-case sizing if no longer needed, or keep a "small pin" set for UK/ISR which sit close together in the Middle East / NW Europe. +- LaunchArc apex: `midY = min(a.cy,b.cy) - 16` (was −18 in the small space); strokeWidths ~1.0 (yellow) / 0.5 (magenta); flight-icon fontSize ~8. +- ImpactRings: outer `rx 13 / ry 8`, inner `rx 16.5 / ry 10` (scaled from 9/5 & 11.5/7); strokeWidths ~0.8 / 0.4. +- Pulse: `r` ~5–6, strokeWidth ~0.5. +- Trail: mid offset ~−10, strokeWidth ~0.5, icon fontSize ~5. +- Build-icon: fontSize ~5, offset ~−7. +Tune by eye against the running app; the companion mock's arc (Iran→Freedonia) already reads correctly at these values. + +## 3. CSS (`WorldMap.module.css` / Action) +- Ensure the map container background is the ocean cyan (or the SVG's own ocean rect fully covers the frame) so `meet` letterbox bars, if any, don't show as ink. Minimal change — likely just confirm `.svg` fills its box and the ocean rect covers the extent. No layout restructure. + +## 4. Testing (`tests/ui/WorldMap.test.tsx`) +- Update assertions tied to the old viewBox / abstract paths / UK special-casing. +- Assert: the real `WORLD_PATH` renders (one big path with `fill-rule="evenodd"`); each cast leader renders a marker + label at its `COUNTRY_POS`; an actor gets the green highlight and a receiver the magenta (existing behaviour) at the new coords; a launch event still renders a `LaunchArc` + `ImpactRings` (overlay wiring intact). Assertions unconditional. +- `npm run typecheck` clean; `npm run test:run` green. + +## 5. Out of scope +- Engine/gameplay, other screens, animation timing (unchanged). +- Per-continent interactivity, zoom/pan, real-time projection maths (static equirectangular only). +- Multi-human island art beyond a shared cheap blob. + +## 6. Constraints +- Product emojis kept. Unconditional test assertions. Every commit typechecks + suite green. +- Keep the Natural Earth licence/provenance comment in `worldPath.ts` intact. +- Deterministic, presentational — no RNG. diff --git a/scripts/worldmap/convert.py b/scripts/worldmap/convert.py new file mode 100644 index 0000000..d25bf97 --- /dev/null +++ b/scripts/worldmap/convert.py @@ -0,0 +1,88 @@ +import json + +d = json.load(open('ne110m.json')) + +def rdp(points, epsilon): + if len(points) < 3: + return points + (x1, y1) = points[0] + (x2, y2) = points[-1] + dx, dy = x2 - x1, y2 - y1 + norm = (dx * dx + dy * dy) ** 0.5 + dmax = 0.0 + idx = 0 + for i in range(1, len(points) - 1): + (x0, y0) = points[i] + if norm == 0: + d = ((x0 - x1) ** 2 + (y0 - y1) ** 2) ** 0.5 + else: + d = abs(dy * x0 - dx * y0 + x2 * y1 - y2 * x1) / norm + if d > dmax: + idx = i + dmax = d + if dmax > epsilon: + left = rdp(points[:idx + 1], epsilon) + right = rdp(points[idx:], epsilon) + return left[:-1] + right + else: + return [points[0], points[-1]] + +def ring_to_pts(ring): + pts = [(lon + 180.0, 90.0 - lat) for lon, lat in ring] + cleaned = [pts[0]] + for p in pts[1:]: + if p != cleaned[-1]: + cleaned.append(p) + return cleaned + +def fmt(v): + return f"{v:g}" + +def pts_to_path(pts, epsilon): + if len(pts) < 3: + return "" + if pts[0] != pts[-1]: + pts = pts + [pts[0]] + simplified = rdp(pts, epsilon) + simplified = [(round(x, 1), round(y, 1)) for x, y in simplified] + if len(simplified) < 4: + return "" + s = "M" + f"{fmt(simplified[0][0])},{fmt(simplified[0][1])}" + for p in simplified[1:]: + s += f"L{fmt(p[0])},{fmt(p[1])}" + s += "Z" + return s + +EPS = 0.15 +MIN_RING_BBOX = 0.0 # degrees^2 area threshold to drop tiny islands; 0 = keep all + +parts = [] +dropped = 0 +for feat in d['features']: + geom = feat['geometry'] + polys = [geom['coordinates']] if geom['type'] == 'Polygon' else geom['coordinates'] + for poly in polys: + for ring in poly: + pts = ring_to_pts(ring) + xs = [p[0] for p in pts]; ys = [p[1] for p in pts] + bbox_area = (max(xs)-min(xs)) * (max(ys)-min(ys)) + if bbox_area < MIN_RING_BBOX: + dropped += 1 + continue + p = pts_to_path(pts, EPS) + if p: + parts.append(p) + +path_d = "".join(parts) +print("epsilon:", EPS, "num rings kept:", len(parts), "dropped:", dropped) +print("path length (chars):", len(path_d)) + +svg = f''' + + +''' + +with open('worldsrc.svg', 'w') as f: + f.write(svg) + +print("svg byte size:", len(svg.encode('utf-8'))) diff --git a/scripts/worldmap/ne_110m_land.equirect.svg b/scripts/worldmap/ne_110m_land.equirect.svg new file mode 100644 index 0000000..7239541 --- /dev/null +++ b/scripts/worldmap/ne_110m_land.equirect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/components/worldPath.ts b/src/ui/components/worldPath.ts new file mode 100644 index 0000000..6a12b84 --- /dev/null +++ b/src/ui/components/worldPath.ts @@ -0,0 +1,12 @@ +// Simplified world coastlines for the Action-screen map. +// Source: Natural Earth 110m Land (naturalearthdata.com), PUBLIC DOMAIN +// ("No permission is needed to use Natural Earth. Crediting the authors is unnecessary.") +// Converted to equirectangular screen coords (x = lon + 180, y = 90 - lat) and +// RDP-simplified. Regenerate via scripts/worldmap/convert.py. +// fill-rule="evenodd" is required (rings include holes). +export const WORLD_PATH = + "M120.4,170L119.8,171L115.5,170.9L113.7,170.3L118.1,170.4L119.4,169.6L120.4,170ZM20.8,169.5L18.9,169.6L17.6,169.3L16.3,168.6L16.9,168.2L18.8,168.4L20.5,169L20.8,169.5ZM134.8,168L136.1,168.5L136.5,169.1L136.7,170L129.5,171L127.1,171L125.8,170.6L126,170.2L128.1,169.9L129,169.6L131.3,168L133.3,167.8L134.8,168ZM58.8,163.5L60.1,163.7L61.3,163.5L59.8,164.1L58.4,164L57.4,163.7L57.6,163.3L58.8,163.5ZM54.4,163.5L56,163.9L52.7,163.5L53.4,163.2L54.4,163.5ZM81,161.9L83.2,162L83.8,162.5L79.2,162.5L78.2,162.3L77.7,161.9L78.3,161.7L81,161.9ZM111.5,161L111.7,161.4L111.2,162.2L108.9,162.5L107.6,162.5L108.1,162.1L105.8,162.4L105,162.1L105,161.7L106.8,161.2L107.9,161.2L108.2,160.7L108.3,159.5L108.8,159L109.7,158.9L110.3,159.3L111.5,161ZM121.4,154.2L121,154.4L119.4,154.3L118,154.8L117.5,155.1L117.4,155.5L117.4,155.9L117.9,156.2L116.3,156.5L114.5,157.6L114.3,158L115.2,158.7L116.8,159.2L118.2,160.7L119.3,163.2L119.2,163.7L118,164.4L116.7,164.6L115.6,165.3L110.2,166.2L109.4,166.6L102.8,166.7L103.1,167.1L104.6,167.3L106.3,167.9L105.2,168.2L103.5,168.1L102.1,168.4L102,169.2L104.6,170.3L120.3,172.4L121.8,173.2L130.2,171.7L137.2,172.1L137.8,171.7L139.2,171.4L141.8,171.3L151.5,170.3L150.3,169.6L150.3,169.3L144.4,169.5L144.1,169.1L144.2,168.3L144.7,168.1L147.8,167.7L151.1,166.7L157.5,166.1L162.5,165.1L164.3,164.5L164.6,164.1L163.5,163.9L164.6,163.1L167.7,162.4L169.7,161.3L172.6,161.7L172.6,161.3L173.1,160.9L174.2,161L174.5,161.4L175.7,161.5L179.3,161.2L179.8,161.6L186.3,160.5L187.7,159.9L188.5,160.1L189.5,160L190.8,160.8L192,160.6L192.4,160.2L193.4,160L194.7,160L195.1,160.4L195.9,160L199.3,159.9L201.5,160.1L202.6,160.7L207.1,160.5L212,159.7L212.8,159.4L213.9,158.5L214.9,158.7L215.3,159L216.2,159.2L217.2,159.2L218.6,159.8L219.7,159.5L220,159.1L222,158.6L226.5,157.6L227.4,157.7L229,157.1L230.8,156.9L230.9,156.5L231.8,156.2L234.5,155.8L236.4,156L237.2,156.2L237.3,156.7L238.7,157.3L239.9,157.4L241.4,158L242.4,158L244.1,157.4L248.9,157.9L249.7,159L249.7,159.2L249.6,159.7L247.8,160.3L247.9,160.7L249.1,160.7L248.9,161.1L247.9,161.9L249.9,162.3L251,162.1L253.1,160.7L253.9,159.9L257.6,159.5L259.1,158.3L262.8,157.2L266.8,157.2L267.5,156.9L268,156.2L268.8,157L269.7,157.2L274.2,157.1L275.8,157.4L278.7,157.1L279.7,157.2L282.8,155.6L284.2,156L286.2,156.9L290.2,156.7L291.7,156.1L293.6,155.9L295.6,156.7L296.7,156.7L299.8,157.3L300.9,157.2L302.3,156.6L303.2,156.5L308.8,156.8L310.8,156.4L314.8,156.2L315.1,155.3L315.7,155.6L316.6,156.8L317.5,157L325.5,156.9L326.2,157.2L326,157.6L326.6,157.9L328.8,158.4L332.5,158.9L333.6,158.9L334.3,158.6L336.8,159.4L339.2,159.6L339.7,160L341.6,160.6L347.3,160.8L351.2,161.7L351.1,162.1L349.3,163.7L346.1,164.4L344.2,165.5L343.6,166.2L343.5,167.1L344.7,168.2L346.6,168.3L347,168.8L341.8,169.2L339.8,170.9L343.7,172.4L348.9,173.3L349.4,173.8L352.3,174L353.2,174.4L356,174.2L360,174.7L360,180L0,180L0,174.7L0.9,174.1L2.7,174.5L4.1,174.1L5.6,174.5L7.1,174.1L10,173.9L13,174.6L21.9,175.4L24.8,175.1L31.5,175.6L36.9,175L37.1,174.6L29.9,174.3L29.1,173.9L26.4,173.7L27.3,172.5L27.1,172L23.2,171.1L27.9,171L29.4,171.3L33.6,170.3L33.2,169.9L30.5,169.4L24.7,169.1L21.9,168L21.6,166.9L23,167.3L26.3,167.1L27.1,167.5L28.7,167.4L32.4,166.6L33.9,166.5L33.5,165.7L33.8,165.4L35.1,165.2L35.7,165.5L38.4,165.1L41.1,165L44.8,164.3L60.3,164.5L62.5,164L63.8,164.2L66.1,163.7L67.7,164.7L68.7,164.4L72.4,165.2L75.1,164.9L79.4,165.3L79.9,164.9L78.7,164.2L77.5,164.1L76.9,163.7L76.3,162.6L80.9,162.9L82.3,163.6L83.7,163.6L87.6,163.2L88.6,163.4L89.9,163.3L90.8,162.6L91.6,163L94,163.1L94.8,163.5L98.5,163.9L99.7,163.1L100.7,163.5L102.1,163.4L103.8,164L105.1,163.9L107.2,163.4L111.1,163L112.6,162.5L112.9,162L112.7,161.6L111.5,160.1L111.5,159.7L112.6,158.1L112.3,157.3L112.7,156.9L117,154.6L118,154.6L122.2,153.3L122.8,153.5L122.4,153.9L121.4,154.2ZM112.2,143.8L113.5,144.4L115,144.7L114.5,145.2L113.5,145.2L113,144.9L112.7,145.3L111.9,145.6L110.8,145.5L107.7,144.5L105.3,142.8L108.9,144.1L109.7,142.9L110.7,142.5L111.4,142.6L112.2,143.8ZM121.5,141.1L122.2,141.6L122,141.9L120.6,142.2L120.2,141.8L119.3,142.3L118.8,141.8L120,141.2L120.8,141.5L121.5,141.1ZM250.3,139.7L248.7,139.8L248.9,138.6L250.5,139.1L250.3,139.7ZM325.4,130.8L326.4,131.1L328.3,130.9L328.4,132.1L328,132.4L327.9,133.2L327.6,132.9L326.9,133.6L326,133.5L324.7,131.2L324.7,130.7L325.4,130.8ZM353,130.9L353.2,131.3L354,130.9L354.2,131.3L354.2,131.8L352.7,133.4L353.1,133.9L352.3,133.9L351.5,134.2L350.6,135.9L349.3,136.6L346.7,136.2L346.5,135.9L347,135.1L348.3,134.1L350.5,133L351.9,131.5L352.1,131L352.8,130.5L353,130.9ZM354.6,126.2L355.3,127.2L355.4,126.5L355.8,126.8L356,127.6L356.8,127.9L357.4,128L358,127.6L358.5,127.7L358,129.2L357.2,129.1L356.9,129.4L357,129.9L356,131.3L355.2,131.7L354.7,131.3L355.2,130.5L354.9,129.9L353.8,129.5L353.9,129.1L354.6,128.8L354.7,127.4L354.3,126.5L352.6,124.5L353,124.5L353.6,125L354.3,125.3L354.6,126.2ZM347.1,112.2L346.7,112.4L345.5,111.7L344,110.1L345,110.5L347.1,112.2ZM358.4,107.3L358.7,107.6L358.6,108.2L357.4,108.2L357.3,107.7L357.7,107.4L358.1,107.5L358.4,107.3ZM359.4,106.8L358.7,107L358.6,106.6L360,106.1L360,106.6L359.4,106.8ZM0.1,106.5L0,106.1L0.2,106L0.1,106.5ZM347.8,106.5L347.5,106.6L347.2,105.9L347.8,106.5ZM347.1,104.9L347.3,105.7L346.8,105.7L346.6,105.4L346.6,104.6L347.1,104.9ZM230.1,103.6L230.5,105.2L230.4,105.7L230.2,106L229.9,105.4L229.7,105.7L229.8,106.9L229.5,107.1L229.4,108L227.1,114.9L225.4,115.6L224,115L223.3,112.1L223.4,111.3L223.9,111.2L224.4,110.1L224.5,109.4L224,107.4L224.4,106.2L226.3,105.8L227.7,104.6L228,104.1L227.9,103.7L228.3,103.8L228.8,103.1L228.9,102.5L229.2,102L230.1,103.6ZM323.6,103.8L323.9,104.5L324.6,104.2L325.4,105L325.5,106.3L325.9,106.9L326.2,107.8L326.1,108.3L326.4,109L328.8,110.4L328.7,110.6L329.3,111.3L329.7,112.3L330.1,112.1L330.5,112.6L330.7,112.4L330.9,113.5L332.9,115.3L333.1,116.1L333.1,117.3L333.6,118.1L332.9,121.6L332.5,122.6L331.7,123L330.3,125.7L330,127.4L329.4,127.8L328.3,127.8L326.3,129L324.9,128.4L325,127.9L323.6,128.8L320.6,128L320,127.4L319.6,126.1L319.1,125.7L318.1,125.6L318.4,125.1L318.2,124.4L317.7,125.1L316.8,125.3L317.9,123.6L317.8,122.9L316.4,124.1L316,124.9L315.2,124.5L315.2,123.9L314.1,122.8L314.3,122.6L311.3,121.5L309.5,121.6L307.1,122.3L306.1,122.2L304.2,123L303.7,123.9L299.9,124L299.3,124.5L299,124.5L298,125.1L296.6,125L295,124.2L295,123.6L295.7,123.3L295.7,121.6L295.2,120.6L295,119.5L294.6,118.5L294.2,118.1L294,117.3L293.3,116.1L293.8,116.5L293.4,115.6L294.2,116.3L294.2,115.8L293.4,114.4L293.8,113.1L293.7,112.5L294.1,111.8L294.2,112.5L294.6,111.8L296.7,110.7L297.4,110.7L299.3,110L300.9,109.7L302.2,108.2L302.3,107.3L303,106.4L303.4,107.3L303.9,107.1L303.5,106.6L303.8,106.1L304.3,106.3L304.4,105.6L305.2,104.7L305.7,104.5L305.7,104.2L306.1,104.3L306.1,104.1L307.1,103.8L308.4,104.9L309.6,105L309.4,104.4L309.9,103.6L310.3,103.4L310.2,103.1L310.6,102.5L311.2,102.2L312.6,102.1L312.6,101.6L311.8,101.3L312.4,101.1L313.6,101.8L315.3,102.2L316.5,101.9L317,102.4L316.3,103.3L316,103.3L316.1,103.7L315.4,104.7L315.5,105L318.3,106.8L319.1,107.1L319.3,107.4L320.2,107.7L320.9,107.4L321.7,105L321.5,103.7L322.1,101L322.5,100.7L322.8,101.2L322.9,101.8L323.5,102.8L323.6,103.8ZM342.1,100.5L342.4,100.8L341.7,100.8L341.3,100.2L342.1,100.5ZM300.7,100.2L300.3,100.3L299,99.6L299.9,99.4L300.8,100L300.7,100.2ZM340.9,99.9L339.8,99.8L339.6,99.6L339.7,99.2L340.4,99.4L340.9,99.9ZM341.7,99.6L341.5,99.8L340.8,98.9L340.6,98.3L340.9,98.3L341.7,99.6ZM304.4,100.1L303.5,100.2L304,99.3L305.1,98.7L307,98.3L307.3,98.4L305.1,99.4L304.4,100.1ZM297.9,98.1L298.3,98.4L298.9,98.3L299.1,98.7L296.7,99L297.1,98.5L297.6,98.4L297.9,98.1ZM302.9,98.1L302.8,98.6L301.3,98.9L299.9,98.8L299.9,98.4L300.7,98.2L301.3,98.5L302.9,98.1ZM339.9,98.3L339.9,98.5L339.1,98.1L338.2,97.4L338.8,97.6L339.9,98.3ZM337.5,97.3L336.9,97.2L336.5,96.6L337.5,97.3ZM288.6,96.8L290.5,96.9L290.8,96.5L292.6,96.9L293,97.6L294.5,97.8L295.7,98.4L294.6,98.8L293.5,98.3L291.5,98.3L288.7,97.6L288.3,97.8L286.5,97.4L286.3,96.9L285.4,96.9L286.1,95.9L287.3,96L288.5,96.4L288.6,96.8ZM314.7,96.2L314.2,96.9L314.1,96.1L314.5,95.4L314.7,96.2ZM335.9,96.8L335.6,96.9L335.2,96.5L334.5,95.1L334.7,95L336,96.5L335.9,96.8ZM332,95.5L331.5,95.6L331.3,95.8L330.2,96.3L328.3,95.7L328.4,95.4L329.8,95.5L330.1,95L330.2,95.5L330.8,95.5L331.6,94.8L331.5,94.2L332.3,94.3L332,95.5ZM307.2,93.5L306.9,93.8L306.2,93.6L306,93.2L307,93.1L307.2,93.5ZM310.5,93.1L310.8,93.9L310,93.4L307.9,93.4L308.1,92.8L309.4,92.8L310.5,93.1ZM333.1,94.5L332.8,94.8L332.4,93.8L330.7,92.7L330.9,92.5L332.2,93.2L333,94L333.1,94.5ZM314.1,91.2L314.4,92.8L315.5,93.4L316.3,92.3L317.4,91.7L318.3,91.7L324.6,93.9L325.8,94.9L326,95.5L327.6,96.1L327.9,96.6L327,96.7L327.2,97.4L328.1,98L328.7,99.1L329.3,99.1L329.3,99.5L330,99.7L329.7,99.9L330.8,100.3L330.7,100.6L330,100.7L329.8,100.4L327.9,100.1L326.6,98.9L326,98.1L324.7,97.6L323.3,98.2L323.4,99L322.6,99.3L321,99.1L320.1,98.3L319.1,98.1L318.9,98.4L317.6,98.4L318,97.6L318.7,97.3L317.9,95.4L316,94.5L315.2,94.5L313.7,93.5L313.4,94L313,94.1L312.8,93.3L312,92.8L313.1,92.5L313.8,92.5L313.7,92.2L312.2,92.2L311.8,91.6L310.9,91.4L310.5,90.9L311.9,90.7L312.4,90.4L314,90.8L314.1,91.2ZM305.2,88.6L304.4,89.6L303.7,89.8L302.7,89.6L300.2,89.8L300,90.5L300.9,91.4L301.5,91L303.3,90.6L303.3,91.1L302.8,90.9L302.4,91.5L301.5,91.9L302.5,93.2L302.3,93.5L303.2,94.7L303.2,95.3L302.6,95.6L302.2,95.3L302.7,94.5L301.7,94.9L301.5,94.6L301.6,94.2L300.9,93.6L301,92.6L300.3,92.9L300.4,95.5L299.8,95.7L299.4,95.4L299.7,94.5L299.5,93.5L299.1,93.5L298.8,92.8L299.2,92.1L300,89.4L300.9,88.7L302.9,89.1L304.1,89.1L305.1,88.4L305.2,88.6ZM308.7,88.9L308.6,89.7L308.1,89.6L308,90.3L308.4,90.8L308.1,90.9L307.7,90.3L307.4,89L307.6,88.2L307.9,87.8L308,88.4L308.6,88.5L308.7,88.9ZM285.8,95.9L284.7,95.9L282.6,94.2L281.4,92.8L280.1,90.7L279.3,89.8L278.6,88.2L277.7,87.5L277.2,86.7L275.4,85L275.3,84.5L277.5,84.8L280.6,87.9L281.7,87.9L283.1,89.4L283.8,89.9L283.4,90.7L284.4,91.1L284.9,92.3L285.6,92.4L286.1,93.1L285.8,95.9ZM297.9,88.2L299,89.1L297.8,89.2L297.5,89.9L297.5,90.8L296.6,91.5L296.1,94L296,93.7L294.9,94.1L294.5,93.5L293.8,93.4L293.3,93.1L292.1,93.5L291.7,93L290.2,92.9L290.1,91.6L289.6,91.3L289.1,90.5L289.1,88.7L289.7,88L290.4,88.3L291.2,88.1L291.4,87.3L293,86.9L294.6,85.1L296.2,83.9L296.7,83.1L297.1,83.1L297.6,83.6L297.7,84L299.2,84.6L299.1,85L298.4,85L298.6,85.5L297.9,85.9L297.3,86.8L298,87.7L297.9,88.2ZM306.4,81.6L306.5,82.8L306.2,83.7L305.8,82.7L305.4,83.2L305.7,84L305.4,84.4L304.2,83.8L303.9,83.1L304.2,82.6L303.6,82.2L303.3,82.6L302.8,82.5L302.1,83.1L301.9,82.8L302.3,82L303.5,81.3L303.8,81.8L304.6,81.5L304.8,81L305.5,81L305.4,80.2L306.2,80.7L306.4,81.6ZM261.2,83.8L260.3,84L259.9,83.2L259.7,81.8L260.1,80.2L260.8,80.7L261.8,82.5L261.6,83.5L261.2,83.8ZM119.1,79.9L118,79.9L118.3,79.6L118.3,79.2L118.9,79.1L119.1,79.1L119.1,79.9ZM304,79.7L303,81L302.4,80.3L302.8,79.7L302.9,79.1L303.5,79.1L303.3,79.7L304.1,78.8L304,79.7ZM298.5,80.7L297.2,81.6L299,79.6L299.5,78.6L299.7,79.4L298.5,80.7ZM301.9,78.1L302.5,78.4L303.1,78.4L303.1,78.8L302,79.6L301.9,78.1ZM305.5,77.8L305.8,79L305,78.7L305.3,79.6L304.8,79.9L304.8,79.2L304.5,79.1L304.3,78.5L304.9,78.6L304.9,78.2L304.3,77.4L305.2,77.5L305.5,77.8ZM301.5,76.9L301.3,77.8L300.3,76.5L301.2,76.6L301.5,76.9ZM301.3,71.5L301.9,71.8L302.2,71.5L302.2,72.2L302.5,72.9L302.3,73.7L301.7,74.1L301.5,74.9L301.7,75.7L302.7,75.7L304,76.2L303.9,76.8L304.2,77L304.1,77.5L302.9,76.4L302.7,76.8L302,76.2L301.1,76.4L300.6,76.1L300.7,75.7L301,75.5L300.7,75.2L300.6,75.6L300.1,75L299.9,73.6L300.3,74L300.4,72.4L300.7,71.5L301.3,71.5ZM114.4,71.8L114.2,72L112.8,72.1L112.8,71.6L113.7,71.5L114.4,71.8ZM103.1,72.1L102.8,72.3L101.7,71.8L102.2,71.5L103.1,71.6L103.8,72.1L103.1,72.1ZM107.4,70.1L108.3,70.3L109.2,70.1L110,70.4L110.2,70.7L110.8,70.7L110.7,71L111.7,71.4L111.3,71.8L110,71.6L109.5,71.8L109.3,71.6L109,71.7L108.6,72.4L108.3,72L107.6,71.8L106.1,72L105.5,71.7L105.6,71.3L107.3,71.6L107.7,71.3L107.2,70.9L107.2,70.5L106.6,70.4L106.8,70.1L107.4,70.1ZM290.3,71.3L289.5,71.8L288.7,71.5L288.6,70.6L289.1,70.2L290.8,69.9L291,70.3L290.3,71.3ZM24.5,70.9L24.3,71.1L24.1,70.9L23.9,70.3L24.1,69.7L25.2,70.5L24.5,70.9ZM23.9,69.4L23.6,69.4L23.3,69.1L23.7,69.1L23.9,69.4ZM22.3,68.7L21.9,68.7L21.7,68.4L22,68.3L22.3,68.7ZM20.7,68L20.2,67.9L20.6,67.8L20.7,68ZM100.3,67.2L100.7,67.6L101.7,67.5L103.5,68.8L104.4,69L104.3,69.3L105.1,69.3L105.8,69.7L105.7,69.9L105,70.1L102.2,70.1L102.9,69.6L101.9,69.3L101.3,68.4L98.2,67.8L97.8,67.6L98.2,67.4L97.2,67.3L95.9,68.1L95,68.1L96.2,67.2L97.7,66.8L99.4,66.9L100.3,67.2ZM102.5,66.2L102.2,66.3L101.6,65.4L101.8,64.8L102.1,64.8L102.5,66.2ZM301.2,67.2L300.7,68L300.2,67.2L300.1,66.4L300.7,65.5L301.5,64.7L302,65L301.2,67.2ZM102.2,63.4L101.1,63.6L101,63.2L102.2,63.2L102.2,63.4ZM103,63.4L102.8,64.1L102.7,63.5L102.2,63L103,63.4ZM314.6,55.9L314.8,56.2L314.2,56.8L313.8,56.5L313.3,56.7L313,57.3L312.4,57L312.4,56.5L312.9,55.9L313.5,56.1L313.9,55.6L314.6,55.9ZM214.6,54.3L213.9,54.8L214,55L213,55.4L212.5,55.3L212.3,54.9L214.6,54.3ZM203.7,54.3L204.2,54.6L206.3,54.7L206.2,55L204.7,55.1L204.7,54.9L203.5,54.7L203.7,54.3ZM195.5,51.8L195.1,53.4L192.4,52.4L192.6,51.9L195.5,51.8ZM189.2,48.8L189.8,49.5L189.7,50.8L189.2,50.8L188.8,51.1L188.4,50.8L188.2,49L188.7,49.1L189.2,48.8ZM321,52.9L320.6,53.7L320.8,54.2L320.3,54.9L319,55.3L317.2,55.4L315.8,56.5L315.1,56.2L315.1,55.4L313.3,55.6L312.2,56.1L311,56.1L312,56.9L311.3,58.5L310.7,59L310.2,58.6L310.4,57.7L309.8,57.4L309.4,56.7L310.4,56.4L310.9,55.8L312.6,54.6L314.6,54.3L315.7,54.5L316.7,52.7L317.4,53.2L319.4,51.8L320.1,50.6L319.9,49.4L320.3,48.8L321.4,48.6L321.9,50L321.9,50.8L321,51.8L321,52.9ZM189.6,47.8L189.2,48.6L188.8,48.4L188.5,47.7L189.4,47L189.6,47.8ZM323.9,45.8L324.6,46L325.3,45.6L325.5,46.7L324.1,47L323.2,48L321.6,47.3L321.1,48.4L320,48.4L319.8,47.4L320.3,46.7L321.4,46.6L322,44.4L323.1,45.5L323.9,45.8ZM116.3,43.4L118,43.6L117.1,44L115.9,43.6L115.6,43.3L116,43L116.3,43.4ZM118.2,40.9L116.4,40.6L115.5,40.1L117.1,40.3L118.2,40.9ZM56.5,41.5L56,41.6L54.3,41.2L53,40.2L51.9,40L51.6,39.5L51.6,39.2L54.2,39.7L55.1,40.5L56.1,40.9L56.5,41.5ZM123.9,39.3L123.2,40.2L123.9,39.8L124.5,40.1L124.2,40.4L125.1,40.7L125.5,40.4L126.5,40.8L126.2,41.5L126.9,41.3L127.4,42.5L126.9,43.3L125.8,43.2L126,42.4L125.8,42.2L124.6,43.1L124,43.1L124.7,42.6L123.7,42.4L120.7,42.4L120.6,42.1L121.2,41.7L120.8,41.5L121.6,40.9L122.6,39.3L123.3,38.7L124.1,38.4L124.6,38.4L123.9,39.3ZM47.3,36L48.3,35.9L48,37L48.8,37.8L48.4,37.8L46.9,36.6L46.8,35.8L47.3,36ZM323.6,39.3L324.7,41L323.2,40.7L322.6,42.1L323.5,43.2L323.5,43.9L322.7,43.3L322.1,44L321.9,41.1L322.2,39L321.6,38.1L321.7,36.7L322.6,36.2L322.2,35.8L322.7,35.6L323.3,37.3L323.2,38.2L323.6,39.3ZM173.2,37.7L171.4,38.3L170,38.2L170.8,37.1L170.3,36.1L172.4,34.9L173.3,34.8L174.3,35.4L173.8,36.1L174,36.8L173.2,37.7ZM192.7,34.4L192.1,35.2L191,34.6L190.9,34.2L192.4,33.9L192.7,34.4ZM27,32.9L26,33.3L25.5,33L25.3,32.5L26.8,32L27.4,32.1L27.9,32.4L27,32.9ZM177,31.4L175.9,32.4L178,32.3L177.8,33.1L176.9,34L177.9,34.1L178.9,35.4L179.6,35.5L180.5,37.1L181.7,37.3L181.6,37.9L181.1,38.2L181.4,38.7L180.6,39.2L177.5,39.5L177,39.3L176.4,39.8L175.5,39.7L174.8,40L174.2,39.8L175.7,38.8L176.6,38.6L175,38.4L174.7,38L175.8,37.7L175.2,37.2L175.4,36.5L176.9,36.6L177.1,36L176.4,35.4L175.2,35.2L174.9,34.9L175.3,34.5L175,34.2L174.4,34.7L174.4,33.7L173.9,33.2L174.2,32.2L175,31.4L177,31.4ZM14.4,30.1L13.8,30.2L12.5,29.8L14.3,29.7L14.4,30.1ZM100.7,27.8L100.3,28.4L99.6,28L100.1,27.6L100.7,27.8ZM98.1,27.3L96.9,27.8L96.2,27.8L96,27.5L96.7,27.1L98.1,27.1L98.1,27.3ZM8.3,26.2L11.3,26.7L10.5,27L9.3,26.6L8.4,26.7L8.2,26.6L8.3,26.2ZM94.8,24.3L95,24.8L95.5,24.6L98.4,25.5L98.4,26L99.2,25.9L99.9,26.3L99,26.6L97.5,26.3L96.9,25.9L94.5,26.9L94.1,26.4L92.8,26.5L93.6,26L94.1,24.3L94.8,24.3ZM165.5,23.5L165.3,24.2L166.4,24.9L165.1,25.6L161.3,26.5L157.2,26L158.2,25.6L156,25.1L157.8,24.9L157.8,24.6L155.7,24.4L156.3,23.7L157.9,23.6L159.4,24.3L160.9,23.7L162.2,24L163.8,23.5L165.5,23.5ZM104.1,22.9L103,22.9L102.8,22.4L103.2,21.9L104.1,21.7L104.9,22L104.9,22.4L104.1,22.9ZM5,23.4L5.7,23.7L5.4,22.9L8.1,23.1L10.1,24L9.1,24.5L7.5,24.6L7.4,25.5L7,25.7L6.1,25.7L4,25.1L3.8,24.6L1.6,24.6L1.1,24.3L1.3,23.9L0.1,24.1L0.6,24.6L0,25L0,21L5.1,22.8L5,23.4ZM84.4,20.9L83.7,21.2L82.4,20.9L81.6,21L80.2,20.6L81.8,19.9L83.4,20.3L84.4,20.9ZM360,19.2L358.9,19.2L358.7,18.9L360,18.5L360,19.2ZM1.3,19.1L0,19.2L0,18.5L2.4,18.7L1.3,19.1ZM89.5,20.5L89.4,21.5L90.8,20.7L92,21.4L91.7,22.1L92.6,22.8L93.7,22.1L94.4,21.2L94.5,20.1L97.4,20.3L98.7,20.8L98.8,21.3L98,21.9L98.7,22.4L98.6,22.9L96.7,23.6L95.3,23.7L94.2,23.4L92.7,25.2L91.5,25.9L90.1,26L89.3,26.4L89.2,27L88.1,27.2L86.8,28L85.8,29.1L85.4,29.9L85.3,31.1L86.8,31.2L87.7,32.9L89.1,32.7L91,33.1L92.7,34L95,34.7L97.7,34.9L97.6,35.7L97.9,36.7L98.6,37.8L100.1,38.8L100.9,38.5L101.4,37.4L100.9,35.9L100.2,35.3L101.8,34.9L102.9,34.2L103.5,33.5L103.4,32.8L102.7,31.9L101.5,31.2L102.7,30.1L101.9,27.7L102.6,27.4L105.3,27.8L106.2,27.6L108.3,28.5L108.6,28.9L110.4,28.9L110.7,31L111.6,31.2L112.4,31.8L113.8,31.2L115.4,29.7L118.6,33L118.2,33.7L120.4,34.8L122.7,35.4L123.1,36.2L123.8,36.4L124.2,36.7L124.3,37.9L122.9,38.6L121.2,38.9L120,39.8L118.3,39.9L113.6,39.8L112.8,40.5L111.5,40.9L108.9,43.2L109.7,43L111.3,41.7L113.4,40.9L114.9,40.8L115.8,41.3L114.9,41.9L115.5,43.8L116.8,44.3L118.5,44.1L119.5,43L119.6,43.7L120.2,44.1L119,44.7L115.8,45.7L114.6,46.5L113.9,46.4L113.8,45.5L115.6,44.7L112.9,44.9L113,45.2L109.9,46.3L109.3,47L109.2,47.7L109.5,48.2L109.9,48.2L109.8,47.9L110.1,48.1L110,48.4L106.3,49.1L107.8,48.9L108.1,49.1L106.7,49.4L106,49.2L105.7,49.5L106,49.6L105.8,50.3L105.1,51.1L104.5,50.5L104.9,51.6L104.1,52.8L104.3,52.1L103.8,51.7L103.7,50.8L103.5,51.3L103.7,51.9L103,51.8L103.7,52.1L103.7,53L104,53.1L104.3,54.4L103.6,55.2L102.6,55.5L101.9,56.1L100.9,56.5L100.8,56.8L99.7,57.5L98.7,58.6L98.5,59.3L98.7,60L99.9,63.1L99.6,64.8L98.8,64.8L98.7,64.4L98.3,64.1L97.1,62.1L97.3,61.4L97.1,60.9L95.9,59.9L94.9,60.4L93.6,59.6L90.8,59.7L90.4,59.8L90.8,60.7L89.8,60.9L89.1,60.9L88.4,60.3L86.2,60.3L85.3,60.5L84.4,61.3L83.4,61.7L82.6,62.6L82.9,64.1L82.3,65.7L82.1,67.6L82.8,69.4L83.7,70.7L84.1,71.2L85.2,71.4L85.6,71.9L88,71.3L89.2,70.7L89.7,69L91.5,68.5L92.9,68.5L93.2,68.7L93.2,69.2L92.4,70.4L92.6,70.5L92.2,71.7L91.7,71.5L91.9,71.7L91.6,73.5L91.1,74.1L91.9,74.3L92.1,74.1L93.1,74.2L95,74L96.6,74.7L96.9,75L96.8,75.7L96.5,76.4L96.5,77.6L96.2,78.9L97.8,81L98.3,81L98.6,81.2L100.4,80.4L101.5,80.6L102.6,81.3L103.2,81.4L104.3,80.6L104.5,79.4L105.1,78.9L105.7,78.9L105.8,78.7L106.6,78.8L108.2,77.6L108.9,77.9L108.6,78.5L108.1,78.6L108.4,79L108.4,79.6L107.9,80.1L108.3,80.9L108.7,80.9L109,80.1L108.6,79.8L108.6,79L109.8,78.6L109.7,78.2L110.1,77.8L110.4,78.5L111.1,78.6L111.8,79.1L111.8,79.4L113.8,79.4L114.3,79.8L115.1,79.9L115.7,79.6L115.7,79.4L118.1,79.3L117.3,79.6L117.6,80.1L118.4,80.1L119.2,80.6L119.3,81.4L119.8,81.4L120.9,82L121.5,82.7L121.5,83.2L121.9,83.2L122.9,84L124.1,84.2L125,84L126,84.2L127.1,84.6L128.2,85.4L128.3,85.8L128.7,85.8L129.5,88.1L130,88.3L130.1,89L129.3,89.8L129.6,90.1L131.4,90.2L131.4,91.2L132.2,90.6L135.1,91.6L135.6,92.1L135.4,92.7L136.6,92.4L138.5,92.9L140,92.9L141.5,93.7L142.8,94.8L144.4,95.1L144.8,95.5L145.3,97.3L144.9,99L143,101L141.6,103L141.3,103.1L141,103.8L141.1,105.7L140.7,107.9L140.4,108.3L140.2,109.6L139.2,110.9L139.1,111.9L138.2,112.4L138,113L136.9,113L135.4,113.4L133.5,114.1L132.4,114.9L131.5,115.9L131.4,116.6L131.5,117.2L131.1,118.7L130.4,119.2L129.3,121L127.7,122.2L127.3,123.2L126.2,124.4L125.1,125L123.8,124.9L122.9,124.4L122.2,124.5L121.6,123.9L121.5,124.4L122.8,125.3L122.6,126L123.3,126.4L123.2,126.9L122.3,128.2L120.8,128.7L117.7,128.8L117.9,130.7L117.3,131L116.2,131.2L115.3,130.8L114.9,131.1L115,132.1L115.7,132.4L116.2,132L116.5,132.6L115.6,132.9L114.8,133.5L114.4,135L113.5,135L112.7,135.6L112.4,136.3L113.4,137L114.4,137.2L114,138.1L112.8,138.7L112.2,139.9L111.3,140.3L110.9,140.7L111.2,141.8L111.8,142.3L110.5,142.3L109.2,142.9L109,143.8L107.4,143.5L105.1,142.3L104.7,141.6L105,141L104.5,140.4L104.4,138.7L104.8,137.7L105.9,136.9L104.4,136.6L105.3,135.8L105.6,134.1L106.8,134.5L107.3,132.4L106.6,132.1L106.3,133.4L105.7,133.2L106.3,129.9L106.8,129.3L106.4,127.2L106.8,127.1L108.6,122.4L108.3,120.9L108.6,120.1L108.5,118.9L109.1,117.6L109.9,111.4L109.8,109.8L109.6,108.3L108.6,107.8L108.5,107.4L106.6,106.4L104,104.6L103.6,103.8L103.7,103.5L100.2,97.2L98.8,96.1L99.1,95.7L98.6,94.7L98.9,94L100.2,92.7L100,92.2L99.6,92.7L99,92.2L99.2,92L99.1,91.1L99.4,90.9L100,89.6L99.9,89.2L101.1,88.6L101,88.3L101.4,88.2L101.3,87.7L101.6,87.4L102.1,87.3L102.9,86.2L102.5,85.9L102.7,85.3L102.5,83.3L101.8,82.5L101.6,81.9L101.8,81.7L100.9,81L100.4,81.1L99.5,81.9L100,82.5L99.1,82.8L98.9,82.2L98.5,82.3L98.3,81.9L97.2,81.7L97.1,81.9L96.5,81.6L96.3,81.3L96.4,80.9L95.4,80.4L95,79.9L94.9,80.4L94.3,80.1L94.3,79.2L94.1,79.1L94.3,78.9L92.3,77.1L92.7,77L92.5,76.7L91.5,76.8L88.8,76.1L86.6,74.4L85.3,73.8L83.4,74.3L79.2,72.8L78.1,72.1L76.5,71.7L75,70.7L74.5,70.1L74.3,69.6L74.6,69.5L74.7,68.6L74,67.2L71.6,64.8L70.7,64.4L70.6,64.2L70.7,63.6L69.6,62.8L69.4,62.1L68.8,62.1L67.8,61L66.8,59.2L66.9,58.8L66.1,58.4L65.2,58.2L65.1,58.6L65.3,59.8L68.4,63.3L69.3,65.7L69.8,65.7L70.6,66.6L70,67.2L69.7,66.6L67.8,65.3L67.7,64L65.5,62.9L64.9,62.3L65.4,62.3L65.8,61.9L65.8,61.4L64.5,60.4L62.7,57L61.6,56.3L61.5,56L59.4,55.4L59.3,54.8L58.3,53.8L57.5,52.2L56.3,51L56.1,50.2L55.6,49.7L55.8,48L55.5,47.2L55.9,46.3L56.1,44.5L55.9,43.1L55.3,41.8L55.4,41.6L56.9,42L57.4,42.9L57.7,42.6L57.2,41L54.4,39.6L52.6,39.2L52,38.3L52.1,37.7L50.9,37.2L50.7,36.4L49.5,35.7L49.5,35.2L48,34.5L47.8,33.6L46.5,32.8L45.9,31.9L43.4,31.8L42.2,31.5L40.1,30.5L37.4,29.9L36,30L32.9,29.1L31.8,29.3L32,30L28.3,30.8L28.1,30.3L28.6,29.3L29.7,29L29.4,28.7L26,30.6L26.7,31.1L25.8,31.9L23.7,32.6L23.4,33L21.9,33.5L21.6,34L15.2,35.6L15.1,35.4L18.2,34.1L19.4,34L22.3,32.4L22.4,31.7L23,31.1L21.8,31.4L21.5,31.2L20.9,31.6L20.3,31.1L20,31.4L19.6,30.9L18,31.3L18.1,30.4L17.5,30L16.2,30.2L14.7,29.5L14.6,28.9L13.9,28.5L15.4,26.9L16.9,26.9L17.7,26.5L18.5,26.5L19.2,26.2L19,25.8L18.5,25.6L19.2,25.2L17.2,25.7L16.5,25.4L15,25.6L13.6,25.3L11.9,24.3L15.5,23.4L16.3,23.4L16.2,23.9L18.3,23.9L17.5,23.3L16.3,22.9L14.6,22L13.2,21.6L13.8,21.1L15.6,21.1L16.8,20.6L17.1,20.1L18.1,19.7L21,19.1L21.9,19.2L23.4,18.6L24.9,18.9L25.7,19.3L26.1,19.1L27.8,19.2L27.7,19.4L29.3,19.6L30.3,19.5L35.1,20L36.4,19.8L43.5,21.1L45.6,20.4L47.1,20.5L50.2,19.8L50.9,20.2L51.6,20L51.9,19.5L52.6,19.6L54.2,20.5L55.6,19.8L55.7,20.6L56.9,20.4L57.3,20.1L58.5,20.2L62.4,21L64.8,21.1L66.1,21.6L64.7,22.1L66.5,22.3L70.1,22L71.1,22.6L72.2,22.1L71.2,21.7L71.8,21.3L73.8,21.2L75.7,22L76.8,21.9L78.5,22.4L81.6,22.2L81.4,21.6L82.3,21.4L83.9,21.8L83.9,22.7L84.5,21.9L85.3,21.9L85.8,20.9L83.5,19.9L83.6,18.8L84.8,18.1L86.1,18.2L87.1,18.7L88.5,19.8L87.6,20.3L89.5,20.5ZM65.8,16.9L65.3,17.3L67.6,17L68.9,17.5L70.1,17L71,17.4L71.8,18.3L72.3,17.9L71.6,16.9L72.5,16.8L73.5,16.9L74.6,17.3L75.5,19L79,20L78.9,20.4L77.3,20.5L77.9,20.9L77.6,21.2L74,20.8L66.7,21.5L66.1,21L64.8,20.7L63.9,20.8L62.7,20L67.6,19.6L65.7,19.4L62.1,19.5L61.6,19.1L63.9,18.7L60.6,18.4L62.1,17.3L64.8,16.7L65.8,16.9ZM75.5,16.6L74.6,17.2L73.1,16.5L74.7,16.4L75.5,16.6ZM103.7,16.9L103.7,17.2L100.5,17.3L99.1,16.7L99.2,16.3L99.6,16.2L101.9,16.3L103.7,16.9ZM93.4,16.8L94.2,17.5L95.1,16.7L97.7,16.2L99.4,17.3L99.3,17.9L101.2,17.6L102.2,17.3L105.8,18.2L105.9,18.7L107.8,18.4L108.8,19.1L111.2,19.5L112.1,19.9L113,20.8L111.2,21.3L115.1,22.2L116.6,23.1L118.1,23.1L117.8,23.8L116.1,25L114.9,24.6L113.3,23.6L112,23.7L111.9,24.3L114.7,25.6L115.3,26.6L115,27.3L111.2,26.3L113.7,27.7L113.8,28.1L109,27.1L107.8,26.6L108.1,26.3L105.2,25.3L105.2,25.6L102.3,25.8L101.4,25.4L102.1,24.7L106,24.5L105.7,24.2L107.3,22.7L107.1,22.3L106.7,21.9L105.2,21.4L103.1,21.1L103.8,20.9L102.7,20.2L101,19.8L100.5,20.1L98.7,20.3L91.3,19.6L90.5,19.2L91.5,18.8L90.1,18.8L89.8,17.8L90.6,16.9L91.6,16.5L94.2,16.2L93.4,16.8ZM79.6,16.2L80.8,16.4L82.6,16.2L82.9,16.5L81.9,17L83.5,17.4L83.3,18.3L81.6,18.7L80.7,18.6L77.5,17.5L77.5,17.2L79.6,17.3L78.5,16.6L79.6,16.2ZM323.6,16.8L319.9,16.6L320.8,16.2L322.1,16.1L323.5,16.5L323.6,16.8ZM86.8,17.2L85.7,18L84.6,17.9L84,17.1L84,16.6L84.5,16.1L85.5,15.9L89.5,16.1L88,17L86.8,17.2ZM59.5,18.6L56.9,19.1L56.4,18.7L54.1,18.1L56.1,16.3L55.1,15.7L58.5,15.6L62.4,15.8L64.5,16.5L60.8,17.5L59.5,18.2L59.5,18.6ZM330.7,14.9L329.6,15.3L326.1,14.8L326.4,14.5L330.7,14.9ZM86.4,15L85.8,15.4L83.2,15.1L83.7,14.6L85.1,14.4L86.4,15ZM325.1,14.4L324.3,15.2L320.6,15.2L319,15.4L317,14.7L317.5,14.1L318.8,13.9L321.5,13.9L325.1,14.4ZM81.5,13.3L82.3,13.7L82.3,14.3L81.8,15L80.2,15.1L79.1,14.9L79.1,14.4L77.5,14.4L77.4,13.7L81.5,13.3ZM71.8,13.8L72.2,14.2L74.1,14L74.3,14.5L73.7,15L66.3,15.6L66.1,15.3L68.2,14.8L63.7,15L62.3,14.8L63.7,13.8L64.6,13.5L67.4,13.9L69.2,14.5L70.9,14.5L69.5,13.6L70.4,13.2L71.5,13.3L71.8,13.8ZM237.5,19.3L233.7,19.2L233.4,18.8L231.6,18.5L231.5,18L232.5,17.8L232.4,17.2L234.4,16.4L233.5,16.3L235.9,15.4L235.6,14.9L241.2,13.7L248.2,13.1L248.9,13.5L248.2,13.8L241.6,14.7L238.5,15.7L235.4,17.6L235.6,18.5L237.5,19.3ZM85.3,12.9L86.4,13.2L88.4,13.2L89.3,13.6L89,13.9L90.8,14.4L93.6,14.5L98.9,14.3L99.9,14.7L100.2,15.1L98.1,15.6L91.8,15.6L87.6,15.2L87.1,14.1L86.1,13.7L84,13.6L82.9,13.2L83.3,12.8L85.3,12.9ZM63.8,12.4L63.7,13.1L62.9,13.5L58.5,14.1L57.1,13.9L60.9,12.5L63.8,12.4ZM287,13L287.2,13.5L288.2,13.3L291.1,13.3L294.1,14.2L293.9,14.7L289.4,15.8L292.1,16.2L293,16L293.5,16.7L294,16.4L295.6,16.2L298.8,16.4L299,16.9L303.2,17L303.3,16.3L307,16.4L308.6,17L309.1,17.6L308.5,18L309.7,18.8L311.3,19.2L312.3,18.2L313.9,18.6L315.6,18.3L317.5,18.7L318.2,18.4L319.9,18.5L319.1,17.6L320.5,17.2L329.5,17.8L330.4,18.4L333,19.2L337,19L339,19.1L339.8,19.5L339.7,20.3L340.9,20.6L342.3,20.4L347.8,20.4L349.6,21.3L350.8,21L350,20.3L350.5,19.9L355.7,20.1L358.6,20.6L360,21L360,25L358.7,25.5L357.4,25.4L358.3,25.9L359.4,27L359.5,27.4L359.2,27.7L357.4,27.5L353.7,28.3L350.7,29.7L350.3,30.1L348.9,29.4L346.3,30.2L345.8,29.8L344.9,30.3L343.5,30.1L343.2,30.8L342,31.8L342.1,32.2L343.2,32.4L343.1,33.8L342.1,33.9L341.7,34.7L342.1,35.1L340.4,35.7L340,36.8L338.5,37L338.2,38.1L336.8,39L335.4,34.6L335.9,33.2L336.8,32.6L336.8,32.2L338.4,31.9L341.9,29.7L343.7,28.9L344.5,27.4L343.3,27.5L342.7,28.4L340.1,29.5L339.3,28.2L336.7,28.6L334.2,30.2L335,30.9L331.3,31.2L331.3,30.5L329.8,30.3L328.5,30.8L325.5,30.7L322.2,31L315.1,35.3L316.7,35.4L317.2,36L318.2,36.2L318.8,35.7L319.9,35.8L321.3,36.9L321.4,37.8L320.6,38.8L320.1,41.6L318.6,43L318.2,43.7L314.9,46.6L313.5,47.2L312.9,47.2L312.3,46.7L310.9,47.4L310.8,47.8L310.4,47.7L310,48.1L309.7,48.4L309.7,49.1L307.5,50.2L307.4,50.8L308.3,51.4L309.5,53.2L309.5,54.4L309.1,54.9L306.5,55.6L306.6,54.3L306.1,53.3L306.9,53.1L306.2,52.3L305.7,52.1L305.3,52.3L304.7,51.9L305.2,51.3L305.3,50.4L304.3,50.1L302.9,50.4L302.1,50.8L301.1,51.1L301.6,50.6L301.4,50.2L302.2,49.6L301.6,49.1L299.6,50.1L299,50.7L298,50.8L297.5,51.3L298.1,51.9L298.9,52.1L298.9,52.6L299.7,52.8L300.8,52.1L302.4,52.5L302.5,53.1L301.1,53.3L300.6,53.9L299.7,54.4L299.2,55.1L300.2,55.6L300.6,56.6L301.9,58.3L301.9,59.1L301.3,59.3L301.5,59.9L302.1,60.2L301.7,61.8L301.1,61.9L298.7,65.5L295.9,67.2L294.8,67.3L294.2,67.8L293.8,67.5L293.2,67.9L290.8,68.6L290.4,69.7L289.9,69.7L289.6,69L289.9,68.6L288.5,68.3L286.7,69.3L285.9,70.2L285.7,70.9L287.4,73.3L288.3,73.9L288.9,74.7L289.3,76.6L289.2,78.3L287.2,79.6L285.2,81.4L284.8,80.8L285.1,80.1L284.3,79.5L283.5,79.4L282.6,77.8L281.7,77.4L280.8,77.4L281,76.6L280.1,76.6L280,77.7L279.2,80L279.2,80.8L279.9,80.8L280.5,82.6L281,83.1L281.6,83.3L283,84.5L283.4,85.1L283.5,87.2L283.9,87.5L284.2,88.7L283.5,88.8L281.4,87.2L280.2,84.7L280.3,84L280.1,83.5L278.5,81.6L278.3,82.2L278.2,81.6L278.6,80.1L278.5,79.3L278.8,78.6L278.4,78L278.5,76.9L278.1,76.4L277.6,73.9L277.2,73.1L275.4,74.3L274.2,74L274.5,72.7L274.3,71.8L273.5,70.6L273.7,70.3L273.1,70.1L272.4,69.3L271.4,67.2L270.5,67.2L270.6,67.6L270.3,68.2L269,67.9L268.9,68.3L267,68.5L267,69.3L266.5,69.8L265.1,70.5L263.9,71.7L262.2,73L262.2,73.4L260.3,74.1L260,74.9L260.3,77L259.9,77.9L259.9,79.6L259.3,79.7L258.9,80.5L259.2,80.8L258.3,81.1L257.5,82L256.6,81.1L255.7,78.7L254.9,77.3L254.4,75.4L253.5,74L252.8,70.8L252.6,68.6L251.2,69.2L250.5,69.1L249.2,67.9L249.6,67.5L249.3,67.2L247.4,66.1L247.1,65.3L246.4,64.6L241.5,64.9L237.4,64.3L237,63L236.5,62.9L234.7,63.5L233.5,63.2L232.5,62.4L231.5,62.1L230.1,59.9L229.6,60L228.9,59.7L228.6,60.1L228,60L228.8,62.3L230.2,63.3L230.1,64.1L230.8,65.2L230.7,64.5L231,64L231.3,63.9L231.6,64.2L231.4,65.4L231.8,66L234,65.9L236.4,63.6L236.4,65.1L236.8,65.8L237.4,66.1L238.7,66.4L239.8,67.7L238.5,69.6L238,69.5L237.8,69.8L237.7,71.1L237.2,71.1L236.6,71.4L236.3,72.1L235.7,72.1L235.3,72.4L235.3,72.8L232.4,73.6L232.2,74.4L229.6,75.3L228.7,76L227.9,76L227.4,76.4L225.6,76.7L225,77.3L223.5,77.4L222.6,74.8L222.8,74.7L222.6,73.2L221.2,71.3L220.9,70.5L219.8,69.7L219.1,68.7L219.1,67.4L218.5,66.3L217.5,65.7L216.9,64.4L215.1,61.9L214.6,61.9L214.9,60.5L213.9,62.4L213.1,61.6L212.4,60.1L212.7,61.3L214.1,63.9L215.7,66.1L215.5,66.2L215.5,66.9L216.9,68L217.5,71.4L218.4,72L219.3,74.1L221.2,75.5L223.3,77.6L223.3,78L222.7,78.3L223.5,78.7L224.1,79.6L224.6,79.6L231.1,78L231,79.4L229.5,83.2L227.7,85.8L226.6,87.1L223.1,89.7L221.6,91.7L220.3,92.6L219.6,94.3L219.2,94.7L218.7,95.9L218.8,96.5L219.4,96.8L219.2,98.5L220.5,100.8L220.8,104.7L220.1,106.1L219.5,106.7L217.4,107.6L214.8,109.8L214.7,110.5L215.4,112.1L215.6,112.1L215.4,113.5L215.6,113.7L215,114.5L212.6,115.7L212.7,116.1L212.9,116.2L212.2,118.8L211.3,119.4L210.1,121.1L208.2,122.8L207.5,123.2L205.9,123.7L205.8,123.9L202.6,123.9L199.6,124.8L198.4,124.1L197.9,122.6L198.2,122.4L198.2,121.7L195.2,117.1L194.4,113.9L194.3,112.1L193.4,110.9L192.6,109L191.8,108.1L191.8,105.8L192.5,103.5L193.6,102L193.7,100.7L192.9,99.2L193.2,98.6L191.9,95L189.4,92.1L188.8,91.1L189.5,89L189.3,88.8L189.8,86.9L189.4,86.3L188.9,86.1L188.5,85.2L186.7,85.8L185.9,85.7L185,84.4L184.3,83.7L181.9,83.9L178,85.3L175.4,84.8L174.2,85L172.5,85.7L171,85.2L168.6,83.2L167.6,82.7L167.1,82.2L166.8,81.1L165.4,79.8L165.2,79.1L163.9,78.5L163.4,77.8L163.2,76.8L163.3,76.4L162.9,75.6L162.4,75.3L162.8,75.1L163.5,73.9L163.5,73.3L163.9,71.9L163.7,69.9L162.9,69L163,68.1L163.7,67.3L164,66.3L164.9,65.5L165.6,63.7L166.2,63.4L166.9,62.4L167.4,62L168.3,61.9L170.4,60.1L170.2,58.8L170.7,57.4L171.3,56.8L173.1,55.9L174.1,54.2L174.8,54.2L175.4,54.7L177.8,54.8L178.8,54.3L179.9,54.1L181.5,53.4L184.8,53.1L185.3,53.3L186.3,52.9L188.4,53.1L189.5,52.6L190.2,52.8L190.2,53.3L191,52.9L191.1,53.1L190.6,53.6L190.6,54.1L190.9,54.3L190.8,55.2L190.1,55.7L190.3,56.2L190.9,56.2L191.1,56.7L191.5,56.9L195.2,57.7L195.7,58.6L199.1,59.7L200.1,59L199.8,58.2L200.1,57.8L201.5,57.2L202.9,57.4L203.2,57.8L204.9,58.1L205.2,58.4L206.5,58.4L208.9,59.1L210.1,58.5L211,58.4L211.7,58.6L212,59.1L212.2,58.7L213.8,59L214.6,58.5L215,57.2L216,55.4L215.9,54.6L216.1,54.2L215.8,53.7L216.2,53.3L214.7,53.2L214,53.8L212.5,53.9L211.7,53.4L210.6,53.3L210.4,53.7L209.7,53.9L208.7,53.3L207.6,53.3L207,52.3L206.3,51.8L206.8,51L206.2,50.5L207.3,49.6L208.8,49.5L209.2,48.8L211.1,48.9L212.3,48.3L213.5,48L215.2,48L218.3,49.1L220.4,49L221.6,48.5L221.7,48L221.5,47.4L216.7,44.8L217.4,44.6L218.2,43.8L217.7,43.4L219.1,43L219.1,42.7L215.8,43.4L215,43.7L215,44.3L215.5,44.6L216.5,44.5L216.3,44.9L215.2,45.1L213.9,45.6L213.3,45.4L213.5,45L212.5,44.7L213.6,44.1L213.3,43.9L211.7,43.7L211.7,43.3L210.7,43.4L209.6,44.7L209.6,45L208.8,45.1L208.6,46.3L208,46.7L207.7,47.4L208.1,48.4L209,48.7L208.8,48.9L207.6,49L206.4,49.8L206.1,49.2L204.9,49.1L203.7,49.3L204.4,49.9L203.9,50L203.3,50L202.8,49.5L202.6,49.7L202.8,50.3L203.4,50.8L203,51L204,51.8L204,52.3L203.1,52.1L203.4,52.6L202.8,52.7L203.2,53.6L202.5,53.6L201.7,53.2L201.1,51.7L200,50.1L199.4,49.7L199.5,48.3L198.9,47.7L196,46.5L195.2,45.8L195.4,45.7L194.9,45.3L194.9,44.9L194.3,44.8L194,45.2L193.7,44.9L193.7,44.5L193.9,44.4L193.1,44.3L192.3,44.6L192.3,45.4L192.6,45.9L193.5,46.4L194,47.2L195.1,48L195.9,48L196.2,48.3L195.9,48.5L197.5,49.1L198.5,49.8L198.3,50.2L197.7,49.7L196.9,49.6L196.4,50.2L197.2,50.6L197.1,51.1L196.6,51.2L196.1,52L195.7,52.1L196.1,51L195.4,50L193.6,48.8L192.9,48.7L192.1,48.3L190.5,47.1L190.2,46.1L188.9,45.6L186.5,46.9L184.6,46.6L183.1,46.9L183,48.1L182.1,48.8L180.8,49L179.7,50.7L180.1,51.3L179.5,51.7L179.3,52.4L178.6,52.6L177.9,53.3L175.6,53.3L174.6,54.1L174.1,54L173.5,53.1L172.5,52.9L172.1,53.2L171.1,53.1L171.2,51.7L170.7,51.6L170.5,51.3L170.6,50.6L171,50.2L171.2,49.2L171,47.4L170.6,47L172,46.3L175.7,46.6L178.1,46.6L178.6,46L178.8,44L177,42.4L175.5,42L175.4,41.3L176.7,41.1L178.4,41.4L178.1,40.2L179,40.7L181.3,39.9L181.6,39.1L183.8,38.4L184.7,36.9L186.1,36.5L186.9,36.5L187.1,36.3L187.9,36.3L188.1,36.5L188.8,36L188.1,34.5L188.1,33.5L188.5,32.9L189.4,32.8L190.6,32.3L190.5,32.8L190.3,33.1L190.4,33.4L190.9,33.5L189.7,34.5L189.9,35.4L191,35.6L190.9,36L192.5,35.5L194.1,36.2L197.6,35.1L198.6,35.3L198.7,35.6L199.7,35.6L199.9,35.1L201.3,34.8L201.1,33.2L201.6,32.6L202.5,32.2L203.3,33L204.1,33L204.4,31.6L204.1,31.7L203.4,31.4L203.3,30.8L205.9,30.4L208,30.5L209.1,30L208.1,29.5L202.9,30.2L202.3,29.6L201.3,29.3L201.5,28.3L201.1,27.4L201.5,26.8L202.4,26.2L205.4,24.9L205.3,24.5L203.9,24L202.2,24.3L201.2,25L201.4,25.6L197.8,27.3L197.1,28.7L198.8,29.9L197.9,31L196.8,31.3L196.4,33L195.9,33.9L194.7,33.8L194.1,34.6L192.9,34.6L192.6,33.7L191,31.1L190.4,30.5L188.4,31.7L187,31.9L185.7,31.4L185,28L185.9,27.4L188.6,26.5L190.5,25.5L194.8,22.2L199.2,20.2L201.4,19.7L203,19.8L204.5,19L208.2,18.8L211.3,19.5L210,19.8L211.1,20.4L212.1,20.1L213.8,20.7L216.5,20.9L220.3,22.1L221.1,22.5L221.1,23.2L220,23.7L218.4,24L213.9,23.2L213.2,23.4L214.8,24.1L214.9,25.6L217,26.2L217.1,25.7L216.5,25.2L217.2,24.9L219.6,25.5L220.4,25.2L219.8,24.5L222.1,23.5L223.9,23.9L224.5,23.2L223.7,22.6L224.2,22L223.5,21.4L226.3,21.7L226.8,22.3L225.6,22.4L225.6,23L226.3,23.3L227.9,23.1L228.1,22.5L233.7,21.1L234.5,21.2L233.5,21.8L234.7,21.9L235.4,21.6L237.3,21.5L238.8,21.1L239.9,21.7L241.1,21.1L240,20.5L240.6,20.1L243.5,20.5L248.5,21.9L249.2,21.4L248.2,20.9L248.1,20.6L246.9,20.5L247.3,20.1L246.7,19L248.5,18.1L249.2,17.2L249.9,17L252.6,17.2L252.8,17.8L251.8,18.6L252.5,18.9L252.8,19.6L252.6,21L253.7,21.6L253.2,22.3L251.3,23.7L252.4,23.8L252.8,23.5L253.9,23.2L254.2,22.7L255.1,22.2L254.5,21.7L254.9,21L253.8,20.9L253.6,20.4L254.4,19.4L253.1,18.6L254.9,17.9L254.7,17.2L255.2,17.1L255.7,17.7L255.3,18.7L256.4,18.8L255.9,18.1L257.6,17.7L259.7,17.7L261.5,18.2L260.6,17.4L260.5,16.4L266.8,16.1L266,15.5L267.2,14.9L268.3,14.9L270.3,14.4L272.9,14.2L273.2,14L275.9,13.9L276.7,14.1L278.9,13.6L280.8,13.6L281,13.1L282,12.7L284.4,12.3L286.1,12.6L284.7,12.9L287,13ZM229.1,48.7L229.6,49.4L230.4,49.7L229.6,49.8L229.2,51L228.9,51.2L229.2,52.4L230.1,52.6L230.8,53.1L232.3,53.3L233.8,53L233.9,51L233.1,50.7L233.4,50L232.7,50L232.9,49.1L233.9,49.4L234.7,49L234,48.4L233.7,47.9L232.9,48.1L232.8,48.9L232.4,48L232.7,47.6L232.5,47.2L231.3,46.9L230.9,46L230.3,45.7L230.3,45.4L231.3,45.5L231.3,44.8L232.2,44.6L233,44.7L233.2,43.8L233,43.1L232,43.2L231.2,43L229.1,43.6L228.6,44.2L227.7,44.4L226.7,45.4L227.6,46.3L227.5,47L229.1,48.7ZM86.2,12.5L83.8,12.4L83.6,12.2L85.6,12.2L86.3,12.4L86.2,12.5ZM69.8,12.3L67.9,12.6L66.5,12.3L67.3,11.9L68.7,11.8L70.1,12L69.8,12.3ZM204.7,12.1L202.5,12.6L200.7,12.3L201.4,12.1L200.8,11.7L202.9,11.5L203.3,11.9L204.7,12.1ZM70.3,11.4L67.5,11.6L68.5,11.2L70.3,11.4ZM84.2,11.9L82.7,12.1L81.9,11.9L81.4,11.5L81.4,11.1L83.2,11.2L84.4,11.6L84.2,11.9ZM79.9,11.7L80.3,12.1L77.1,11.7L74.8,11.6L75.8,11.3L74.6,11.1L74.5,10.7L79.2,11.2L79.9,11.7ZM285.1,11.7L279.4,12.1L281.3,10.8L282.1,10.7L285.4,11.3L285.1,11.7ZM198.3,10.3L201.5,11L199,11.4L198.5,12.2L197.6,12.4L197.1,13.2L195.9,13.2L193.8,12.6L194.7,12.3L193.2,12L191.2,11.1L190.4,10.3L193.2,10L193.7,10.3L195.1,10.3L195.5,10L197,9.9L198.3,10.3ZM205.4,9.6L207.4,9.9L205.9,10.5L203,10.6L200.1,10.4L199.9,10.2L198.5,10.1L197.4,9.7L200.5,9.4L201.9,9.6L202.9,9.3L205.4,9.6ZM231.1,9.5L227.6,10L226.5,9.8L227.1,9.4L224.8,9.4L228.3,9.2L228.5,9.5L230,9.1L231.5,9.3L231.1,9.5ZM279.9,11.1L277.8,11.2L275,11L273.3,10.6L272.5,9.9L271.2,9.7L273.8,9L275.9,8.7L277.9,9.3L280.2,10.2L279.9,11.1ZM93,10.3L94.2,10.7L91,11.7L89.2,11.8L87.1,11.7L86,11.2L86.1,10.9L86.9,10.6L85,10.6L83.9,10.3L83.3,9.8L84.7,9.1L85.7,9L85.3,8.8L87.6,8.7L88.9,9.3L92.2,9.7L93,10.3ZM111.5,6.9L116.3,7.1L118.2,7.4L118.1,7.6L112.3,8.5L114.5,8.5L110.5,9.4L108.8,10.2L103.1,10.7L104.5,10.8L103.8,11L104.6,11.5L100.2,12.8L100.4,13L102.1,13L102.1,13.2L99.4,13.8L96.8,13.5L93.9,13.7L90.5,13.5L90.4,13L92.2,12.8L91.7,12.1L95,12.5L93.7,11.8L92,11.6L92.8,11.2L94.6,11L94.9,10.7L93.5,10.3L93.1,9.7L96.6,9.9L98.2,9.5L92.4,9.5L90.6,9.1L88.6,8.4L88.4,8.1L93,7.7L94.5,7.3L96.8,7.7L97.6,7.1L100.7,6.9L111.5,6.9ZM152.9,6.5L159.2,7.3L157.3,7.7L148.1,7.8L148.6,8L152.1,7.9L155.2,8.2L157.1,7.9L157.9,8.3L156.8,8.8L164.2,8.1L167.2,8.3L167.8,8.7L163.2,9.7L160,9.8L162.3,9.9L160.3,11.2L160.3,12.4L161.5,13L158.3,13.4L160.2,13.9L160.4,14.8L159.3,14.8L160.6,15.7L158.4,15.8L159.6,16.2L159.2,16.5L156.4,16.7L157.7,17.4L157.7,17.8L155.7,17.4L155.2,17.7L156.6,17.9L157.9,18.5L158.2,19.3L156.5,19.5L154.5,18.6L154.8,19.2L153.6,19.8L157.7,19.9L152.3,21.5L148.2,21.9L147.2,22.3L145.8,23.3L143.6,24L140.2,24.5L139.3,25.2L139.3,25.9L138.8,26.5L137.2,27.3L137.6,28.1L136.6,29.9L135.2,30L133.7,29.1L131.7,29.1L130.8,28.6L130.1,27.6L128.4,26.4L127.9,25.7L127.7,24.8L126.3,23.9L126.7,23.2L126,22.8L127,21.6L128.5,21.3L128.9,20.9L129.1,20.1L126.5,20.7L125.3,20.4L125.2,19.7L125.6,19.2L128.6,19.4L126,18.5L125,18.6L124.2,18.3L125.3,17.4L122.7,15.3L121.4,14.9L121.4,14.5L118.7,13.9L111.5,13.9L108.6,13L113.2,12.6L109,12.4L106.7,12L106.8,11.6L114.3,10.6L114.7,10.2L112,9.9L112.8,9.5L117.8,8.7L117.3,8.2L122.8,7.8L125.9,7.8L127,8.1L129.6,7.6L135.5,8.3L133.1,7.8L133.2,7.4L136.6,6.8L140.1,6.8L141.4,6.5L144.9,6.4L152.9,6.5Z"; + +/** Full equirectangular extent is 0 0 360 180; the map crops the ice caps + + * Antarctica band to 0 12 360 132 so the populated latitudes fill the frame. */ +export const WORLD_VIEWBOX = "0 12 360 132"; From 0bc271e4d70f4d1860de56dc446307e7a7c6fd1f Mon Sep 17 00:00:00 2001 From: gethi Date: Sun, 26 Jul 2026 15:51:06 +0100 Subject: [PATCH 2/2] feat(ui): real recognisable world map on the Action screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the abstract blob continents with actual coastlines (Natural Earth 110m land, public domain) in the comic ink/paper/halftone style. Leaders pin at true lon/lat via an equirectangular mapping; Freedonia is an invented mid-Atlantic island, other human slots take ocean spots. viewBox → equirect (cropped past the ice caps), preserveAspectRatio meet, overlay constants rescaled to the new map units (tests updated to match). Co-Authored-By: Claude Fable 5 --- src/ui/components/WorldMap.tsx | 116 +++++++++++++++++++-------------- tests/ui/WorldMap.test.tsx | 10 +-- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/src/ui/components/WorldMap.tsx b/src/ui/components/WorldMap.tsx index 5d871cc..0f9dc27 100644 --- a/src/ui/components/WorldMap.tsx +++ b/src/ui/components/WorldMap.tsx @@ -2,6 +2,7 @@ import type { GameState, LeaderId, ResolutionEvent } from '../../engine/types'; import { isHuman } from '../../engine/state'; import { HUMAN_ACCENTS, PORTRAIT_META, stripFlag } from '../portraits'; import { formatEventText } from '../util/eventText'; +import { WORLD_PATH, WORLD_VIEWBOX } from './worldPath'; import styles from './WorldMap.module.css'; export interface CountryPos { @@ -11,23 +12,29 @@ export interface CountryPos { label?: string; } -/** Map positions — AI values verbatim from the handoff (screens-3.jsx); - * human slots 2–5 are fixed ocean positions (slice-3 spec §5.2). */ +/** Equirectangular screen coords from real lon/lat: x = lon + 180, y = 90 - lat. */ +const ll = (lon: number, lat: number): { cx: number; cy: number } => ({ cx: lon + 180, cy: 90 - lat }); + +/** Leaders pinned at true geographic locations; Freedonia is an invented + * mid-Atlantic island and the other human slots take open-ocean spots. */ export const COUNTRY_POS: Record = { - chump: { cx: 23, cy: 36, label: 'USA' }, - carnage: { cx: 24, cy: 24, label: 'CANADA' }, - burnem: { cx: 44, cy: 13, label: 'UK' }, - netanyahoo: { cx: 58, cy: 40, label: 'ISR' }, - khameneverhere: { cx: 64, cy: 38, label: 'IRAN' }, - 'mileigh-hem': { cx: 33, cy: 78, label: 'ARG' }, - player1: { cx: 22, cy: 50 }, - player2: { cx: 10, cy: 62 }, - player3: { cx: 84, cy: 18 }, - player4: { cx: 90, cy: 68 }, - player5: { cx: 44, cy: 66 }, + chump: { ...ll(-98, 39), label: 'USA' }, + carnage: { ...ll(-106, 58), label: 'CANADA' }, + burnem: { ...ll(-2, 54), label: 'UK' }, + netanyahoo: { ...ll(34, 31), label: 'ISR' }, + khameneverhere: { ...ll(53, 32), label: 'IRAN' }, + 'mileigh-hem': { ...ll(-64, -38), label: 'ARG' }, + player1: ll(-40, 32), // Freedonia — mid-Atlantic + player2: ll(-150, 5), // Pacific + player3: ll(78, -28), // Indian Ocean + player4: ll(170, 42), // North Pacific + player5: ll(-25, -45), // South Atlantic }; -/** The event's actor (green highlight), per slice-3 spec §5.3. */ +/** Small pins for countries that are geographically small / crowded together. */ +const SMALL_PIN = new Set(['burnem', 'netanyahoo']); + +/** The event's actor (green highlight). */ export function actorOf(event: ResolutionEvent): LeaderId | undefined { switch (event.kind) { case 'FactoryBuilt': @@ -49,7 +56,7 @@ export function actorOf(event: ResolutionEvent): LeaderId | undefined { } } -/** The event's receivers (magenta highlights), per slice-3 spec §5.3. */ +/** The event's receivers (magenta highlights). */ export function receiversOf(event: ResolutionEvent): LeaderId[] { switch (event.kind) { case 'PropagandaTransfer': @@ -71,7 +78,7 @@ export function receiversOf(event: ResolutionEvent): LeaderId[] { function launchArcPath(a: CountryPos, b: CountryPos): { d: string; midX: number; midY: number } { const midX = (a.cx + b.cx) / 2; - const midY = Math.min(a.cy, b.cy) - 18; + const midY = Math.min(a.cy, b.cy) - 16; return { d: `M ${a.cx} ${a.cy} Q ${midX} ${midY} ${b.cx} ${b.cy}`, midX, midY }; } @@ -80,9 +87,9 @@ function LaunchArc({ a, b, icon }: { a: CountryPos; b: CountryPos; icon: string const { d, midX, midY } = launchArcPath(a, b); return ( - - - {icon} + + + {icon} ); } @@ -91,25 +98,25 @@ function LaunchArc({ a, b, icon }: { a: CountryPos; b: CountryPos; icon: string function ImpactRings({ p }: { p: CountryPos }) { return ( - - + + ); } /** Green firing pulse circle. */ function Pulse({ p }: { p: CountryPos }) { - return ; + return ; } /** Cyan/green dashed diplomacy trail with an icon at the midpoint. */ function Trail({ a, b, stroke, icon }: { a: CountryPos; b: CountryPos; stroke: string; icon: string }) { const midX = (a.cx + b.cx) / 2; - const midY = (a.cy + b.cy) / 2 - 6; + const midY = (a.cy + b.cy) / 2 - 10; return ( - - {icon} + + {icon} ); } @@ -152,7 +159,7 @@ function Overlay({ event, game }: { event: ResolutionEvent; game: GameState }) { const p = COUNTRY_POS[event.by]; const icon = formatEventText(event, game, 1)?.icon ?? '⚙'; return ( - + {icon} ); @@ -182,28 +189,39 @@ export interface WorldMapProps { event?: ResolutionEvent; } -/** Stylised political-cartoon world map (slice-3 spec §5). - * Pure presentational: continents, cast country highlights, per-event overlays. */ +/** Recognisable real-world map (Natural Earth 110m land, public domain), comic-styled. + * Pure presentational: coastlines, cast country pins at true lon/lat, per-event overlays. */ export default function WorldMap({ game, event }: WorldMapProps) { const actor = event ? actorOf(event) : undefined; const receivers = event ? receiversOf(event) : []; + const freedonia = COUNTRY_POS.player1; return ( - - {/* continents — abstract chunky political-cartoon shapes (verbatim from the handoff) */} - - - - - - - - {/* UK — separate island northwest of Europe */} - - UK - - - {/* country highlights — cast members only */} + + + + + + + {/* ocean — covers the full equirectangular extent so meet-letterboxing reads as sea */} + + + + {/* land — real coastlines, one path (evenodd handles rings) */} + + + {/* Freedonia — invented mid-Atlantic island under the player's pin */} + {game.cast.includes('player1') && ( + + )} + + {/* country pins — cast members only */} {game.cast.map((id) => { const p = COUNTRY_POS[id]; const isActor = actor === id; @@ -216,23 +234,25 @@ export default function WorldMap({ game, event }: WorldMapProps) { ? HUMAN_ACCENTS[id] : PORTRAIT_META[id].color; const label = p.label ?? stripFlag(game.leaders[id].country).toUpperCase(); - const isUK = id === 'burnem'; + const small = SMALL_PIN.has(id); + const rx = small ? 4 : 7; + const ry = small ? 2.6 : 4; return ( diff --git a/tests/ui/WorldMap.test.tsx b/tests/ui/WorldMap.test.tsx index a864668..165bbf5 100644 --- a/tests/ui/WorldMap.test.tsx +++ b/tests/ui/WorldMap.test.tsx @@ -84,9 +84,9 @@ describe('', () => { />, ); expect(container.textContent).toContain('🛡'); - // Impact rings are dashed magenta ellipses rx=9/11.5 — absent on intercepts. - expect(container.querySelector('ellipse[rx="9"]')).toBeNull(); - expect(container.querySelector('ellipse[rx="11.5"]')).toBeNull(); + // Impact rings are dashed magenta ellipses rx=13/17 — absent on intercepts. + expect(container.querySelector('ellipse[rx="13"]')).toBeNull(); + expect(container.querySelector('ellipse[rx="17"]')).toBeNull(); }); it('renders the propaganda trail with the paper icon', () => { @@ -108,7 +108,7 @@ describe('', () => { />, ); expect(container.textContent).toContain('🤝'); - expect(container.querySelector('path[stroke="var(--green)"][stroke-dasharray="0.8 0.6"]')).not.toBeNull(); + expect(container.querySelector('path[stroke="var(--green)"][stroke-dasharray="2 1.5"]')).not.toBeNull(); }); it('renders the build icon above the actor for build events', () => { @@ -126,7 +126,7 @@ describe('', () => { />, ); // Two targets → two sets of impact rings. - expect(container.querySelectorAll('ellipse[rx="9"]')).toHaveLength(2); + expect(container.querySelectorAll('ellipse[rx="13"]')).toHaveLength(2); // Both targets highlighted magenta. expect(markerEllipse(container, 'carnage').getAttribute('fill')).toBe('var(--magenta)'); expect(markerEllipse(container, 'player1').getAttribute('fill')).toBe('var(--magenta)');