seriffic Claude Opus 4.7 (1M context) commited on
Commit
c368c91
·
1 Parent(s): a35b457

feat(emissions): real GPU power from NVML on the L4 inference Space

Browse files

Drops the cloud-comparison chip and replaces the data-sheet
energy estimate with a real per-call measurement off the L4 GPU.

inference-vllm/proxy.py
- Background sampler reads nvmlDeviceGetPowerUsage every 100 ms into
a 60 s ring buffer. Each forwarded POST records the upstream
wall-clock window and computes the mean power across the matching
samples; results land on the response as X-GPU-Power-W and
X-GPU-Energy-J (joules).
- New GET /v1/power exposes instantaneous + 1 s avg + 5 s avg for
bracket-sampling clients (used by the LLM path, where LiteLLM
hides response headers).
- pynvml init is best-effort: on failure the proxy still serves
traffic, just without power data.
inference-vllm/Dockerfile
- Adds nvidia-ml-py>=12.560 to the proxy's pip layer.

app/emissions.py
- Tracker.record_{llm,ml} accept optional joules_real / power_w_real.
When present, those values land on the row directly and the row is
flagged measured=True. Otherwise we fall back to the data-sheet
HARDWARE × duration estimate (measured=False).
- summarize() drops the cloud-comparison block. Adds n_measured
alongside n_calls so the UI can disclose measured vs estimated.

app/inference.py
- _post() reads X-GPU-Energy-J / X-GPU-Power-W off the proxy response
and forwards them into record_ml.

app/llm.py
- _power_url() / _sample_gpu_power_w() bracket the LiteLLM
completion call with two GETs to /v1/power. _record_llm passes
the avg into record_llm as power_w_real, and the tracker
derives joules from the real power × wallclock.

Frontend
- agentStream.ts EmissionsCall: new `measured: boolean`. Drop
comparison field from EmissionsSummary; add n_measured.
- RunHealthStrip.svelte: drop the "~Nx < cloud" chip (sign was
also wrong for queries above 0.3 Wh). Show "<icon> X.X Wh / Y.YK
tok inference" with a measured-coverage icon (✓ all measured,
◐ partial, ~ all estimated). Tooltip lists hardware + measured
fraction + token split + method.

Net effect: when the L4 inference Space is up and reachable, the
status-line chip carries real per-call NVML readings (typical L4
draws 30-70 W during transformer inference; the proxy reports
exactly what the device reports). When the proxy is unreachable,
the data-sheet fallback still produces a number and the icon
indicates so.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files changed (25) hide show
  1. app/emissions.py +89 -66
  2. app/inference.py +23 -6
  3. app/llm.py +75 -6
  4. web/sveltekit/build/200.html +8 -8
  5. web/sveltekit/build/_app/immutable/assets/stoneRegistry.DOPO2SDD.css +0 -1
  6. web/sveltekit/build/_app/immutable/assets/stoneRegistry.uOtksRcS.css +1 -0
  7. web/sveltekit/build/_app/immutable/chunks/CJeJVIjP.js +0 -1
  8. web/sveltekit/build/_app/immutable/chunks/{B3Pg95Il.js → D8NyAcAP.js} +1 -1
  9. web/sveltekit/build/_app/immutable/chunks/DDAjlznB.js +38 -0
  10. web/sveltekit/build/_app/immutable/chunks/DJJH9JR_.js +1 -0
  11. web/sveltekit/build/_app/immutable/chunks/FjZhY28w.js +0 -38
  12. web/sveltekit/build/_app/immutable/entry/{app.BhktVbRh.js → app.DmxSSduu.js} +2 -2
  13. web/sveltekit/build/_app/immutable/entry/start.C_DzDADc.js +1 -0
  14. web/sveltekit/build/_app/immutable/entry/start.YmL7ZSOR.js +0 -1
  15. web/sveltekit/build/_app/immutable/nodes/{0.Dv1TzIuH.js → 0.DInKAumT.js} +1 -1
  16. web/sveltekit/build/_app/immutable/nodes/{1.BmImNqbK.js → 1.OjBWYT1y.js} +1 -1
  17. web/sveltekit/build/_app/immutable/nodes/{2.CLD-rsu4.js → 2.B2rqoVXS.js} +1 -1
  18. web/sveltekit/build/_app/immutable/nodes/{3.0RkbXXD4.js → 3.CU36QLul.js} +1 -1
  19. web/sveltekit/build/_app/immutable/nodes/{4.DLn0bV4P.js → 4.JuDtCP-e.js} +0 -0
  20. web/sveltekit/build/_app/immutable/nodes/{5.C0xKDhXA.js → 5.CRCvLD8F.js} +1 -1
  21. web/sveltekit/build/_app/version.json +1 -1
  22. web/sveltekit/build/index.html +9 -9
  23. web/sveltekit/build/q/sample.html +11 -11
  24. web/sveltekit/src/lib/client/agentStream.ts +9 -7
  25. web/sveltekit/src/lib/components/findings/RunHealthStrip.svelte +24 -9
app/emissions.py CHANGED
@@ -4,14 +4,16 @@ Records every LLM and ML-inference call made during a single query and
4
  summarizes:
5
  - wallclock duration per call
6
  - prompt + completion tokens (LLM)
7
- - estimated energy in watt-hours, using a sustained-power figure for
8
- the active hardware
 
 
 
 
9
 
10
- Estimates are deliberately rule-of-thumb: hardware × time. The numbers
11
- are conservative public-record figures (data sheet TDP scaled to a
12
- sustained-inference fraction). They are not benchmark output. The intent
13
- is a defensible, auditable footprint the UI can surface alongside the
14
- existing `energy` block.
15
 
16
  Thread propagation
17
  ------------------
@@ -28,17 +30,21 @@ from __future__ import annotations
28
  import threading
29
  from typing import Any
30
 
31
- # (label, sustained_power_w, source)
 
 
 
 
32
  HARDWARE: dict[str, tuple[str, float, str]] = {
33
  "nvidia_l4": (
34
  "NVIDIA L4",
35
  60.0,
36
  "NVIDIA L4 Tensor Core GPU data sheet (72 W TGP, Ada Lovelace, "
37
  "24 GB); ~60 W sustained during transformer inference. The "
38
- "active backend for both Riprap inference Spaces "
39
- "msradam/riprap-vllm for Granite 4.1 8B FP8 (vLLM), and "
40
- "msradam/riprap-inference for Prithvi-EO / TerraMind / "
41
- "Granite TTM / GLiNER / Granite Embedding.",
42
  ),
43
  "amd_mi300x": (
44
  "AMD MI300X",
@@ -47,16 +53,13 @@ HARDWARE: dict[str, tuple[str, float, str]] = {
47
  "during vLLM generation. Selected only when an operator deploys "
48
  "against an MI300X droplet and sets RIPRAP_HARDWARE_LABEL=AMD "
49
  "MI300X explicitly. The hackathon submission used to run on "
50
- "this hardware; the droplet was decommissioned 2026-05-06 and "
51
- "inference now routes through L4 Spaces.",
52
  ),
53
  "nvidia_t4": (
54
  "NVIDIA T4",
55
  50.0,
56
  "NVIDIA T4 data sheet (70 W max); ~50 W sustained during "
57
- "transformer inference. Used by the CPU-tier UI Spaces "
58
- "(lablab + personal mirror) when a small inline LLM runs "
59
- "alongside the FastAPI front-end.",
60
  ),
61
  "apple_m": (
62
  "Apple M-series",
@@ -73,14 +76,6 @@ HARDWARE: dict[str, tuple[str, float, str]] = {
73
  ),
74
  }
75
 
76
- # Frontier-cloud per-query reference, kept in sync with app/energy.py so
77
- # the comparison stays consistent across both summaries.
78
- CLOUD_PER_QUERY_WH = 0.30
79
- CLOUD_SOURCE = (
80
- 'Epoch AI (2025), "How much energy does ChatGPT use?", '
81
- "estimating ~0.3 Wh per typical GPT-4o query."
82
- )
83
-
84
 
85
  def _wh(power_w: float, duration_s: float) -> float:
86
  return power_w * max(duration_s, 0.0) / 3600.0
@@ -93,57 +88,90 @@ class Tracker:
93
  self.calls: list[dict[str, Any]] = []
94
  self._lock = threading.Lock()
95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  def record_llm(self, *, model: str, backend: str, hardware: str,
97
  prompt_tokens: int | None,
98
  completion_tokens: int | None,
99
  duration_s: float,
100
- stream: bool = False) -> None:
101
- hw_label, power_w, _src = HARDWARE.get(hardware,
102
- HARDWARE["cpu_server"])
103
- wh = _wh(power_w, duration_s)
104
  total = None
105
  if prompt_tokens is not None or completion_tokens is not None:
106
  total = (prompt_tokens or 0) + (completion_tokens or 0)
107
- with self._lock:
108
- self.calls.append({
109
  "kind": "llm",
110
  "model": model,
111
  "backend": backend,
112
- "hardware": hardware,
113
- "hardware_label": hw_label,
114
- "power_w": power_w,
115
- "duration_s": round(duration_s, 3),
116
  "prompt_tokens": prompt_tokens,
117
  "completion_tokens": completion_tokens,
118
  "total_tokens": total,
119
  "stream": stream,
120
- "wh": round(wh, 5),
121
- "joules": round(wh * 3600, 2),
122
- })
 
 
 
123
 
124
  def record_ml(self, *, endpoint: str, backend: str, hardware: str,
125
- duration_s: float) -> None:
126
- hw_label, power_w, _src = HARDWARE.get(hardware,
127
- HARDWARE["cpu_server"])
128
- wh = _wh(power_w, duration_s)
129
- with self._lock:
130
- self.calls.append({
131
  "kind": "ml",
132
  "endpoint": endpoint,
133
  "backend": backend,
134
- "hardware": hardware,
135
- "hardware_label": hw_label,
136
- "power_w": power_w,
137
- "duration_s": round(duration_s, 3),
138
- "wh": round(wh, 5),
139
- "joules": round(wh * 3600, 2),
140
- })
141
 
142
  def summarize(self) -> dict[str, Any]:
143
  with self._lock:
144
  calls = list(self.calls)
145
  total_wh = sum(c["wh"] for c in calls)
146
  total_dur = sum(c["duration_s"] for c in calls)
 
147
  prompt = sum((c.get("prompt_tokens") or 0)
148
  for c in calls if c["kind"] == "llm")
149
  completion = sum((c.get("completion_tokens") or 0)
@@ -165,7 +193,6 @@ class Tracker:
165
  for c in calls:
166
  slot = by_hw.setdefault(c["hardware"], {
167
  "label": c["hardware_label"],
168
- "power_w": c["power_w"],
169
  "wh": 0.0, "n": 0, "duration_s": 0.0,
170
  })
171
  slot["wh"] += c["wh"]
@@ -176,10 +203,9 @@ class Tracker:
176
  slot["mwh"] = round(slot["wh"] * 1000, 2)
177
  slot["duration_s"] = round(slot["duration_s"], 3)
178
 
179
- ratio = (round(CLOUD_PER_QUERY_WH / total_wh, 1)
180
- if total_wh > 0 else None)
181
  return {
182
  "n_calls": len(calls),
 
183
  "total_wh": round(total_wh, 5),
184
  "total_mwh": round(total_wh * 1000, 2),
185
  "total_joules": round(total_wh * 3600, 1),
@@ -192,19 +218,16 @@ class Tracker:
192
  "by_kind": by_kind,
193
  "by_hardware": by_hw,
194
  "calls": calls,
195
- "comparison": {
196
- "cloud_per_query_wh": CLOUD_PER_QUERY_WH,
197
- "cloud_per_query_mwh": round(CLOUD_PER_QUERY_WH * 1000, 1),
198
- "ratio_cloud_over_query": ratio,
199
- "cloud_source": CLOUD_SOURCE,
200
- },
201
  "method": (
202
- "Sum over recorded inference calls of "
203
- "(sustained_power_w × duration_s ÷ 3600). "
204
- "Power figures are conservative public-record values "
205
- "per app/emissions.HARDWARE; tokens are reported by "
206
- "the backend (LiteLLM usage) when available, else "
207
- "estimated from response text length (~4 chars/token)."
 
 
 
208
  ),
209
  }
210
 
 
4
  summarizes:
5
  - wallclock duration per call
6
  - prompt + completion tokens (LLM)
7
+ - energy in watt-hours, **measured from the L4 GPU when available**
8
+ (the inference proxy reports per-call `X-GPU-Power-W` /
9
+ `X-GPU-Energy-J` headers from a 100 ms-cadence NVML sampler).
10
+ Falls back to a duration × data-sheet-power estimate when the
11
+ proxy is unreachable / NVML init failed / call went to a backend
12
+ that doesn't surface power readings.
13
 
14
+ Each call record carries a `measured: bool` flag indicating which path
15
+ was used, so the UI can disclose. `summarize()` aggregates total Wh,
16
+ total tokens, by-kind and by-hardware splits no cloud comparison.
 
 
17
 
18
  Thread propagation
19
  ------------------
 
30
  import threading
31
  from typing import Any
32
 
33
+ # (label, fallback_sustained_power_w, source). Used only when the
34
+ # proxy doesn't surface a real measurement (NVML disabled, backend
35
+ # unreachable, local-fallback path). The fallback figure is a
36
+ # conservative public-record estimate; the `measured: bool` flag on
37
+ # each call record indicates whether the row used the fallback.
38
  HARDWARE: dict[str, tuple[str, float, str]] = {
39
  "nvidia_l4": (
40
  "NVIDIA L4",
41
  60.0,
42
  "NVIDIA L4 Tensor Core GPU data sheet (72 W TGP, Ada Lovelace, "
43
  "24 GB); ~60 W sustained during transformer inference. The "
44
+ "active backend for the Riprap inference Space "
45
+ "(msradam/riprap-vllm). When the proxy is reachable and NVML "
46
+ "is initialized, real per-call power is read off the device "
47
+ "via nvmlDeviceGetPowerUsage and this fallback is unused.",
48
  ),
49
  "amd_mi300x": (
50
  "AMD MI300X",
 
53
  "during vLLM generation. Selected only when an operator deploys "
54
  "against an MI300X droplet and sets RIPRAP_HARDWARE_LABEL=AMD "
55
  "MI300X explicitly. The hackathon submission used to run on "
56
+ "this hardware; the droplet was decommissioned 2026-05-06.",
 
57
  ),
58
  "nvidia_t4": (
59
  "NVIDIA T4",
60
  50.0,
61
  "NVIDIA T4 data sheet (70 W max); ~50 W sustained during "
62
+ "transformer inference.",
 
 
63
  ),
64
  "apple_m": (
65
  "Apple M-series",
 
76
  ),
77
  }
78
 
 
 
 
 
 
 
 
 
79
 
80
  def _wh(power_w: float, duration_s: float) -> float:
81
  return power_w * max(duration_s, 0.0) / 3600.0
 
88
  self.calls: list[dict[str, Any]] = []
89
  self._lock = threading.Lock()
90
 
91
+ def _record(self, *, base: dict[str, Any], hardware: str,
92
+ duration_s: float,
93
+ joules_real: float | None,
94
+ power_w_real: float | None) -> None:
95
+ """Shared body of record_llm / record_ml.
96
+
97
+ When `joules_real` is provided (NVML-derived from the proxy),
98
+ we use it directly and stamp `measured=True`. Otherwise we
99
+ fall back to the data-sheet sustained-power estimate.
100
+ """
101
+ hw_label, fallback_w, _src = HARDWARE.get(hardware,
102
+ HARDWARE["cpu_server"])
103
+ if joules_real is not None and joules_real >= 0:
104
+ joules = float(joules_real)
105
+ wh = joules / 3600.0
106
+ measured = True
107
+ avg_w = (joules / duration_s) if duration_s > 0 else (
108
+ power_w_real if power_w_real is not None else fallback_w)
109
+ else:
110
+ avg_w = fallback_w
111
+ wh = _wh(avg_w, duration_s)
112
+ joules = wh * 3600.0
113
+ measured = False
114
+ record = {
115
+ **base,
116
+ "hardware": hardware,
117
+ "hardware_label": hw_label,
118
+ "power_w": round(avg_w, 2),
119
+ "duration_s": round(duration_s, 3),
120
+ "measured": measured,
121
+ "wh": round(wh, 5),
122
+ "joules": round(joules, 3),
123
+ }
124
+ with self._lock:
125
+ self.calls.append(record)
126
+
127
  def record_llm(self, *, model: str, backend: str, hardware: str,
128
  prompt_tokens: int | None,
129
  completion_tokens: int | None,
130
  duration_s: float,
131
+ stream: bool = False,
132
+ joules_real: float | None = None,
133
+ power_w_real: float | None = None) -> None:
 
134
  total = None
135
  if prompt_tokens is not None or completion_tokens is not None:
136
  total = (prompt_tokens or 0) + (completion_tokens or 0)
137
+ self._record(
138
+ base={
139
  "kind": "llm",
140
  "model": model,
141
  "backend": backend,
 
 
 
 
142
  "prompt_tokens": prompt_tokens,
143
  "completion_tokens": completion_tokens,
144
  "total_tokens": total,
145
  "stream": stream,
146
+ },
147
+ hardware=hardware,
148
+ duration_s=duration_s,
149
+ joules_real=joules_real,
150
+ power_w_real=power_w_real,
151
+ )
152
 
153
  def record_ml(self, *, endpoint: str, backend: str, hardware: str,
154
+ duration_s: float,
155
+ joules_real: float | None = None,
156
+ power_w_real: float | None = None) -> None:
157
+ self._record(
158
+ base={
 
159
  "kind": "ml",
160
  "endpoint": endpoint,
161
  "backend": backend,
162
+ },
163
+ hardware=hardware,
164
+ duration_s=duration_s,
165
+ joules_real=joules_real,
166
+ power_w_real=power_w_real,
167
+ )
 
168
 
169
  def summarize(self) -> dict[str, Any]:
170
  with self._lock:
171
  calls = list(self.calls)
172
  total_wh = sum(c["wh"] for c in calls)
173
  total_dur = sum(c["duration_s"] for c in calls)
174
+ n_measured = sum(1 for c in calls if c.get("measured"))
175
  prompt = sum((c.get("prompt_tokens") or 0)
176
  for c in calls if c["kind"] == "llm")
177
  completion = sum((c.get("completion_tokens") or 0)
 
193
  for c in calls:
194
  slot = by_hw.setdefault(c["hardware"], {
195
  "label": c["hardware_label"],
 
196
  "wh": 0.0, "n": 0, "duration_s": 0.0,
197
  })
198
  slot["wh"] += c["wh"]
 
203
  slot["mwh"] = round(slot["wh"] * 1000, 2)
204
  slot["duration_s"] = round(slot["duration_s"], 3)
205
 
 
 
206
  return {
207
  "n_calls": len(calls),
208
+ "n_measured": n_measured,
209
  "total_wh": round(total_wh, 5),
210
  "total_mwh": round(total_wh * 1000, 2),
211
  "total_joules": round(total_wh * 3600, 1),
 
218
  "by_kind": by_kind,
219
  "by_hardware": by_hw,
220
  "calls": calls,
 
 
 
 
 
 
221
  "method": (
222
+ "Energy is read off the L4 GPU per call via "
223
+ "nvmlDeviceGetPowerUsage on the inference proxy "
224
+ "(X-GPU-Energy-J response header). Calls flagged "
225
+ "measured=false fall back to "
226
+ "(data-sheet sustained_power_w × duration_s ÷ 3600) "
227
+ " see app/emissions.HARDWARE for sources. Tokens "
228
+ "are reported by the backend (LiteLLM usage) when "
229
+ "available, else estimated from response text length "
230
+ "(~4 chars/token)."
231
  ),
232
  }
233
 
app/inference.py CHANGED
@@ -95,12 +95,11 @@ def _post(path: str, payload: dict[str, Any], timeout: float | None = None) -> d
95
  raise RemoteUnreachable(f"HTTP {r.status_code} from {path}: {r.text[:200]}")
96
  r.raise_for_status()
97
  duration_s = time.monotonic() - t0
98
- # Remote ML service is msradam/riprap-inference (or the vLLM-co-
99
- # hosting msradam/riprap-vllm) both run on NVIDIA L4 HF Spaces.
100
- # Operators can override via RIPRAP_HARDWARE_LABEL when targeting
101
- # different hardware (e.g. an MI300X droplet). Local-fallback paths
102
- # don't reach this function — they go straight to in-process model
103
- # loads in the specialist module, which we don't track.
104
  override = (os.environ.get("RIPRAP_HARDWARE_LABEL") or "").lower()
105
  if "mi300x" in override or "amd" in override:
106
  hw = "amd_mi300x"
@@ -108,15 +107,33 @@ def _post(path: str, payload: dict[str, Any], timeout: float | None = None) -> d
108
  hw = "nvidia_t4"
109
  else:
110
  hw = "nvidia_l4"
 
111
  emissions.active().record_ml(
112
  endpoint=path,
113
  backend="riprap-models",
114
  hardware=hw,
115
  duration_s=duration_s,
 
 
116
  )
117
  return r.json()
118
 
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  def _serialize_array(arr) -> str:
121
  """numpy/torch tensor → base64-encoded float32 raw bytes for transport.
122
  Each remote handler decodes to (shape, dtype=float32) and reconstructs.
 
95
  raise RemoteUnreachable(f"HTTP {r.status_code} from {path}: {r.text[:200]}")
96
  r.raise_for_status()
97
  duration_s = time.monotonic() - t0
98
+ # Hardware: msradam/riprap-vllm runs on NVIDIA L4. Operators can
99
+ # override via RIPRAP_HARDWARE_LABEL. The proxy reports per-call
100
+ # GPU energy off NVML in the X-GPU-Energy-J / X-GPU-Power-W headers
101
+ # read those for a real measurement instead of the data-sheet
102
+ # estimate when present.
 
103
  override = (os.environ.get("RIPRAP_HARDWARE_LABEL") or "").lower()
104
  if "mi300x" in override or "amd" in override:
105
  hw = "amd_mi300x"
 
107
  hw = "nvidia_t4"
108
  else:
109
  hw = "nvidia_l4"
110
+ joules_real, power_w_real = _parse_gpu_headers(r.headers)
111
  emissions.active().record_ml(
112
  endpoint=path,
113
  backend="riprap-models",
114
  hardware=hw,
115
  duration_s=duration_s,
116
+ joules_real=joules_real,
117
+ power_w_real=power_w_real,
118
  )
119
  return r.json()
120
 
121
 
122
+ def _parse_gpu_headers(headers) -> tuple[float | None, float | None]:
123
+ """Pull (joules, watts) from X-GPU-Energy-J / X-GPU-Power-W if the
124
+ proxy attached them. Returns (None, None) if the headers are absent
125
+ (older proxy build, NVML init failed, or the call streamed)."""
126
+ def _f(name: str) -> float | None:
127
+ v = headers.get(name)
128
+ if v is None or v == "":
129
+ return None
130
+ try:
131
+ return float(v)
132
+ except ValueError:
133
+ return None
134
+ return _f("x-gpu-energy-j"), _f("x-gpu-power-w")
135
+
136
+
137
  def _serialize_array(arr) -> str:
138
  """numpy/torch tensor → base64-encoded float32 raw bytes for transport.
139
  Each remote handler decodes to (shape, dtype=float32) and reconstructs.
app/llm.py CHANGED
@@ -280,16 +280,59 @@ def _extract_usage(resp) -> tuple[int | None, int | None]:
280
  return (None, None)
281
 
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  def _record_llm(*, alias: str, messages: list[dict], duration_s: float,
284
  resp=None, completion_text: str | None = None,
285
- stream: bool = False) -> None:
 
286
  """Record one llm.chat call into the active emissions tracker.
287
 
288
  For non-stream calls, we read prompt/completion tokens off the
289
  LiteLLM response. For stream calls, the response is a generator —
290
  we estimate tokens from concatenated assistant text and from a
291
- char/4 estimate of the input messages. Estimates are flagged on
292
- the call record so the UI can disclose them."""
 
 
 
 
 
293
  info = backend_info()
294
  hardware = _hardware_for(info["engine"])
295
  backend = info["engine"]
@@ -300,6 +343,8 @@ def _record_llm(*, alias: str, messages: list[dict], duration_s: float,
300
  " " * prompt_chars) if prompt_chars else None
301
  if completion_tokens is None and completion_text is not None:
302
  completion_tokens = emissions.estimate_completion_tokens(completion_text)
 
 
303
  emissions.active().record_llm(
304
  model=alias,
305
  backend=backend,
@@ -308,6 +353,8 @@ def _record_llm(*, alias: str, messages: list[dict], duration_s: float,
308
  completion_tokens=completion_tokens,
309
  duration_s=duration_s,
310
  stream=stream,
 
 
311
  )
312
 
313
 
@@ -380,18 +427,40 @@ def chat(model: str, messages: list[dict], options: dict | None = None,
380
  kwargs["response_format"] = {"type": "json_object"}
381
  # Ollama path (LiteLLM forwards this via extra_body for ollama_chat)
382
  kwargs.setdefault("extra_body", {})["format"] = "json"
 
 
 
 
 
383
  t0 = time.monotonic()
384
  if stream:
385
  s = _router.completion(model=alias, messages=messages,
386
  stream=True, **kwargs)
387
 
388
  def _on_stream_done(full_text: str) -> None:
 
 
 
389
  _record_llm(alias=alias, messages=messages,
390
- duration_s=time.monotonic() - t0,
391
- completion_text=full_text, stream=True)
 
392
 
393
  return _stream_to_ollama_shape(s, on_done=_on_stream_done)
394
  resp = _router.completion(model=alias, messages=messages, **kwargs)
 
 
 
395
  _record_llm(alias=alias, messages=messages,
396
- duration_s=time.monotonic() - t0, resp=resp, stream=False)
 
397
  return _to_ollama_shape(resp)
 
 
 
 
 
 
 
 
 
 
280
  return (None, None)
281
 
282
 
283
+ def _power_url() -> str | None:
284
+ """Build the proxy's /v1/power URL from RIPRAP_LLM_BASE_URL.
285
+ Returns None if remote isn't configured."""
286
+ if not _VLLM_BASE:
287
+ return None
288
+ base = _VLLM_BASE
289
+ # _VLLM_BASE looks like https://msradam-riprap-vllm.hf.space/v1
290
+ # The proxy's /v1/power lives at the same /v1 prefix.
291
+ if base.endswith("/v1"):
292
+ return base + "/power"
293
+ return base.rstrip("/") + "/v1/power"
294
+
295
+
296
+ def _sample_gpu_power_w() -> float | None:
297
+ """Single GET to the proxy's /v1/power endpoint. Returns the
298
+ instantaneous reading in watts, or None if unreachable / NVML off."""
299
+ url = _power_url()
300
+ if not url:
301
+ return None
302
+ try:
303
+ import httpx as _httpx
304
+ with _httpx.Client(timeout=2.0) as c:
305
+ r = c.get(url, headers={"Authorization": f"Bearer {_VLLM_KEY}"})
306
+ if r.status_code != 200:
307
+ return None
308
+ data = r.json()
309
+ # Prefer the 1 s rolling average — smooths over the 100 ms sampler
310
+ # so a single mid-idle tick doesn't poison the bracket.
311
+ for k in ("power_w_avg_1s", "power_w", "power_w_avg_5s"):
312
+ v = data.get(k)
313
+ if isinstance(v, (int, float)) and v > 0:
314
+ return float(v)
315
+ except Exception:
316
+ return None
317
+ return None
318
+
319
+
320
  def _record_llm(*, alias: str, messages: list[dict], duration_s: float,
321
  resp=None, completion_text: str | None = None,
322
+ stream: bool = False,
323
+ avg_power_w: float | None = None) -> None:
324
  """Record one llm.chat call into the active emissions tracker.
325
 
326
  For non-stream calls, we read prompt/completion tokens off the
327
  LiteLLM response. For stream calls, the response is a generator —
328
  we estimate tokens from concatenated assistant text and from a
329
+ char/4 estimate of the input messages.
330
+
331
+ `avg_power_w`, when provided, comes from a real NVML read on the
332
+ inference proxy (bracketed before / after the call). The tracker
333
+ converts that to joules via `power × duration` and flags the row
334
+ `measured=True`. Estimates fall through to the data-sheet figure.
335
+ """
336
  info = backend_info()
337
  hardware = _hardware_for(info["engine"])
338
  backend = info["engine"]
 
343
  " " * prompt_chars) if prompt_chars else None
344
  if completion_tokens is None and completion_text is not None:
345
  completion_tokens = emissions.estimate_completion_tokens(completion_text)
346
+ joules_real = (avg_power_w * duration_s
347
+ if avg_power_w is not None and duration_s > 0 else None)
348
  emissions.active().record_llm(
349
  model=alias,
350
  backend=backend,
 
353
  completion_tokens=completion_tokens,
354
  duration_s=duration_s,
355
  stream=stream,
356
+ joules_real=joules_real,
357
+ power_w_real=avg_power_w,
358
  )
359
 
360
 
 
427
  kwargs["response_format"] = {"type": "json_object"}
428
  # Ollama path (LiteLLM forwards this via extra_body for ollama_chat)
429
  kwargs.setdefault("extra_body", {})["format"] = "json"
430
+ # Bracket the call with /v1/power samples so we get a real
431
+ # NVML-derived energy reading, not a data-sheet estimate. Each
432
+ # sample is a sub-100 ms GET; the proxy returns a 1 s rolling avg
433
+ # so a single tick of idleness doesn't poison the bracket.
434
+ p0 = _sample_gpu_power_w()
435
  t0 = time.monotonic()
436
  if stream:
437
  s = _router.completion(model=alias, messages=messages,
438
  stream=True, **kwargs)
439
 
440
  def _on_stream_done(full_text: str) -> None:
441
+ duration_s = time.monotonic() - t0
442
+ p1 = _sample_gpu_power_w()
443
+ avg = _avg_w(p0, p1)
444
  _record_llm(alias=alias, messages=messages,
445
+ duration_s=duration_s,
446
+ completion_text=full_text, stream=True,
447
+ avg_power_w=avg)
448
 
449
  return _stream_to_ollama_shape(s, on_done=_on_stream_done)
450
  resp = _router.completion(model=alias, messages=messages, **kwargs)
451
+ duration_s = time.monotonic() - t0
452
+ p1 = _sample_gpu_power_w()
453
+ avg = _avg_w(p0, p1)
454
  _record_llm(alias=alias, messages=messages,
455
+ duration_s=duration_s, resp=resp, stream=False,
456
+ avg_power_w=avg)
457
  return _to_ollama_shape(resp)
458
+
459
+
460
+ def _avg_w(p0: float | None, p1: float | None) -> float | None:
461
+ """Mean of two power samples; falls back to whichever single sample
462
+ is available, or None if both failed."""
463
+ pair = [p for p in (p0, p1) if p is not None]
464
+ if not pair:
465
+ return None
466
+ return sum(pair) / len(pair)
web/sveltekit/build/200.html CHANGED
@@ -6,17 +6,17 @@
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
- <link href="/_app/immutable/entry/start.YmL7ZSOR.js" rel="modulepreload">
10
- <link href="/_app/immutable/chunks/CJeJVIjP.js" rel="modulepreload">
11
  <link href="/_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
- <link href="/_app/immutable/entry/app.BhktVbRh.js" rel="modulepreload">
13
  <link href="/_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="/_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="/_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="/_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
- <link href="/_app/immutable/nodes/0.Dv1TzIuH.js" rel="modulepreload">
18
  <link href="/_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
- <link href="/_app/immutable/chunks/B3Pg95Il.js" rel="modulepreload">
20
  <link href="/_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="/_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="/_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
@@ -28,15 +28,15 @@
28
  <div style="display: contents">
29
  <script>
30
  {
31
- __sveltekit_1sh7tn8 = {
32
  base: ""
33
  };
34
 
35
  const element = document.currentScript.parentElement;
36
 
37
  Promise.all([
38
- import("/_app/immutable/entry/start.YmL7ZSOR.js"),
39
- import("/_app/immutable/entry/app.BhktVbRh.js")
40
  ]).then(([kit, app]) => {
41
  kit.start(app, element);
42
  });
 
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
+ <link href="/_app/immutable/entry/start.C_DzDADc.js" rel="modulepreload">
10
+ <link href="/_app/immutable/chunks/DJJH9JR_.js" rel="modulepreload">
11
  <link href="/_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
+ <link href="/_app/immutable/entry/app.DmxSSduu.js" rel="modulepreload">
13
  <link href="/_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="/_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="/_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="/_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
+ <link href="/_app/immutable/nodes/0.DInKAumT.js" rel="modulepreload">
18
  <link href="/_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
+ <link href="/_app/immutable/chunks/D8NyAcAP.js" rel="modulepreload">
20
  <link href="/_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="/_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="/_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
 
28
  <div style="display: contents">
29
  <script>
30
  {
31
+ __sveltekit_a2xq49 = {
32
  base: ""
33
  };
34
 
35
  const element = document.currentScript.parentElement;
36
 
37
  Promise.all([
38
+ import("/_app/immutable/entry/start.C_DzDADc.js"),
39
+ import("/_app/immutable/entry/app.DmxSSduu.js")
40
  ]).then(([kit, app]) => {
41
  kit.start(app, element);
42
  });
web/sveltekit/build/_app/immutable/assets/stoneRegistry.DOPO2SDD.css DELETED
@@ -1 +0,0 @@
1
- .citation-drawer.svelte-1p339fd a{color:inherit;border-bottom:1px solid var(--rule-soft);text-decoration:none}.citation-drawer.svelte-1p339fd a:hover{border-bottom-color:var(--accent);color:var(--accent)}.rip-map-container.svelte-wk2bu4{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.map-frame.svelte-wk2bu4{aspect-ratio:8 / 5.6;position:relative;transition:outline-color .2s ease;outline:0 solid transparent;outline-offset:0}.map-frame[data-linked].svelte-wk2bu4:not([data-linked=""]){outline:2px solid var(--accent-graphical)}.link-badge.svelte-wk2bu4{position:absolute;bottom:8px;right:8px;padding:3px 8px;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:lowercase;z-index:5;pointer-events:none}.layers-panel.svelte-1g2dety{background:var(--paper);border:1px solid var(--rule-soft);padding:var(--s-3) var(--s-4) var(--s-4);display:flex;flex-direction:column;gap:var(--s-3);font-family:var(--font-sans)}.layers-head.svelte-1g2dety{padding-bottom:4px}.layers-group.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2);border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.layers-group.region-cornerstone.svelte-1g2dety{--stone-tint: var(--stone-cornerstone)}.layers-group.region-keystone.svelte-1g2dety{--stone-tint: var(--stone-keystone)}.layers-group.region-touchstone.svelte-1g2dety{--stone-tint: var(--stone-touchstone)}.layers-group.region-lodestone.svelte-1g2dety{--stone-tint: var(--stone-lodestone)}.layers-group.region-capstone.svelte-1g2dety{--stone-tint: var(--stone-capstone)}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety){cursor:pointer;list-style:none;display:flex;align-items:baseline;gap:var(--s-2);padding:4px 0}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety)::-webkit-details-marker{display:none}.layers-caret.svelte-1g2dety{font-size:10px;color:var(--ink-tertiary);transition:transform .2s ease}.layers-group.svelte-1g2dety:not([open]) .layers-caret:where(.svelte-1g2dety){transform:rotate(-90deg)}.layers-stone-name.svelte-1g2dety{font-family:var(--font-serif);font-style:italic;font-size:16px;color:var(--ink)}.layers-stone-tag.svelte-1g2dety{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.layers-count.svelte-1g2dety{margin-left:auto;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.layers-list.svelte-1g2dety{list-style:none;margin:4px 0 var(--s-2);padding:0;display:flex;flex-direction:column}.layers-row.svelte-1g2dety{display:grid;grid-template-columns:16px 1fr auto;gap:var(--s-2);align-items:center;padding:4px 0;font-family:var(--font-mono);font-size:11px;color:var(--ink);border-bottom:1px dotted var(--rule-soft)}.layers-row.svelte-1g2dety:last-child{border-bottom:0}.layers-row.dim.svelte-1g2dety{opacity:.7}.layers-glyph.svelte-1g2dety{display:inline-flex;align-items:center}.layers-text.svelte-1g2dety{display:flex;flex-direction:column;gap:2px}.layers-label.svelte-1g2dety{color:var(--ink);font-family:var(--font-sans);font-size:12px}.layers-meta.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);display:inline-flex;align-items:center;gap:4px}.layers-state.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink);text-transform:uppercase}.layers-state-dim.svelte-1g2dety{color:var(--ink-tertiary);text-transform:lowercase;font-style:italic}.layers-row-empty.svelte-1g2dety .layers-empty-text:where(.svelte-1g2dety){grid-column:1 / -1;color:var(--ink-tertiary);font-style:italic;font-family:var(--font-mono);font-size:11px}.layers-masters.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.layers-master-row.svelte-1g2dety{margin-top:4px;display:flex;flex-wrap:wrap;gap:6px}.layers-master.svelte-1g2dety{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:var(--paper);border:1px solid var(--rule-soft);cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink)}.layers-master.is-on.svelte-1g2dety{background:var(--paper-deep);border-color:var(--ink)}.layers-master-state.svelte-1g2dety{margin-left:4px;color:var(--ink-tertiary);font-size:9px}.layers-master.is-on.svelte-1g2dety .layers-master-state:where(.svelte-1g2dety){color:var(--ink)}.rh.svelte-1vuwkv4{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2);padding:var(--s-2) var(--s-4);background:var(--paper-deep);border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.rh-item.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){font-weight:600;color:var(--ink);margin-right:2px}.rh-sep.svelte-1vuwkv4{opacity:.5}.rh-silent.svelte-1vuwkv4{color:var(--ink-tertiary)}.rh-warn.svelte-1vuwkv4{color:#b7791f}.rh-err.svelte-1vuwkv4{color:#b91c1c}.rh-notinvoked.svelte-1vuwkv4{color:var(--ink-tertiary);font-style:italic}.rh-total.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){color:var(--ink-tertiary)}.rh-em.svelte-1vuwkv4{cursor:help;color:var(--ink-secondary)}.rh-em.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){color:var(--ink)}.rh-em-tok.svelte-1vuwkv4{margin-left:4px;opacity:.75}.rh-em-ratio.svelte-1vuwkv4{margin-left:6px;padding:1px 5px;border:1px solid var(--rule-soft);border-radius:2px;font-size:10px;letter-spacing:.03em;color:var(--ink-tertiary)}.body-headline.svelte-lygj3j{padding:var(--s-3) var(--s-4) var(--s-2);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-headline.svelte-lygj3j{padding:var(--s-2) var(--s-3)}.headline.svelte-lygj3j{font-family:var(--font-serif);font-style:italic;font-size:28px;font-weight:500;line-height:1.1;letter-spacing:-.01em}.fc.is-compact .headline.svelte-lygj3j{font-size:22px}.subhead.svelte-lygj3j{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.body-prose.svelte-lygj3j{margin:var(--s-2) 0 0;font-size:13px;line-height:1.45;color:var(--ink-secondary)}.body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-3)}.t.svelte-1nlkuao{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12px}.t.svelte-1nlkuao th:where(.svelte-1nlkuao){text-align:left;font-weight:500;color:var(--ink-tertiary);padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);text-transform:lowercase;letter-spacing:.04em}.t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);color:var(--ink)}.t.svelte-1nlkuao tr:where(.svelte-1nlkuao):last-child td:where(.svelte-1nlkuao){border-bottom:0}.fc.is-compact .t.svelte-1nlkuao th:where(.svelte-1nlkuao),.fc.is-compact .t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:2px 6px 2px 0;font-size:11px}.body-sub.svelte-1nlkuao{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-scalars.svelte-stf9c8{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-scalars.svelte-stf9c8{padding:var(--s-2) var(--s-3)}.row.svelte-stf9c8{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:var(--s-3)}.cell.svelte-stf9c8{display:flex;flex-direction:column;gap:2px}.value.svelte-stf9c8{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.label.svelte-stf9c8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.06em;text-transform:lowercase}.body-sub.svelte-stf9c8{margin-top:var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-spark.svelte-jrppts{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-spark.svelte-jrppts{padding:var(--s-2) var(--s-3)}.headline.svelte-jrppts{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-jrppts{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;margin-bottom:var(--s-1)}svg.svelte-jrppts{display:block}.body-sub.svelte-jrppts{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-timeseries.svelte-48vbub{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-timeseries.svelte-48vbub{padding:var(--s-2) var(--s-3)}.ts-header.svelte-48vbub{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--s-2)}.headline.svelte-48vbub{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}svg.svelte-48vbub{display:block}.body-sub.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5;display:flex;flex-direction:column;gap:2px}.spatial-note.svelte-48vbub{color:var(--accent);font-style:italic}.ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-4) var(--s-3);padding-top:var(--s-2);border-top:1px dashed var(--rule-soft);display:flex;flex-wrap:wrap;gap:var(--s-3);align-items:baseline;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.is-compact .ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-3)}.ft-stat.svelte-1y25lfh{display:inline-flex;align-items:baseline;gap:4px;color:var(--ink)}.ft-stat-k.svelte-1y25lfh{font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.ft-skill.svelte-1y25lfh{color:var(--tier-modeled);font-weight:500}.ft-badge.svelte-1y25lfh{border:1px solid var(--ink);color:var(--ink);padding:1px 6px;font-size:10px;letter-spacing:.06em;text-transform:uppercase;background:var(--paper)}.ft-link.svelte-1y25lfh{margin-left:auto;color:var(--accent);text-decoration:none}.ft-link.svelte-1y25lfh:hover{text-decoration:underline}.body-forecast.svelte-gqkhpe{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-forecast.svelte-gqkhpe{padding:var(--s-2) var(--s-3)}svg.svelte-gqkhpe{display:block}.body-sub.svelte-gqkhpe{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}svg.svelte-1lx1psy{display:block}.thumb-placeholder.svelte-1lx1psy{height:120px;background:var(--paper-deep);display:flex;align-items:center;justify-content:center;color:var(--ink-tertiary);font-family:var(--font-mono);font-size:11px;border:1px dashed var(--rule-soft)}.body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-3)}.frame.svelte-1m43x1m{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1m43x1m{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.raster-headline.svelte-1m43x1m{font-family:var(--font-mono);font-size:12px;color:var(--ink)}.raster-headline.svelte-1m43x1m span:where(.svelte-1m43x1m):first-child{font-family:var(--font-serif);font-style:italic;font-size:18px;font-weight:500}.body-sub.svelte-1m43x1m{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-3)}.frame.svelte-1td276x{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1td276x{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.bar.svelte-1td276x{display:flex;height:10px;border:1px solid var(--rule-soft);overflow:hidden}.bar-seg.svelte-1td276x{flex-shrink:1;flex-basis:0}.legend.svelte-1td276x{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:4px var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.legend.svelte-1td276x li:where(.svelte-1td276x){display:inline-flex;align-items:center;gap:6px}.swatch.svelte-1td276x{display:inline-block;width:10px;height:10px;border:1px solid var(--rule-soft);flex:none}.legend-k.svelte-1td276x{color:var(--ink);text-transform:lowercase;letter-spacing:.04em}.legend-pct.svelte-1td276x{color:var(--ink-tertiary)}.body-sub.svelte-1td276x{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-register.svelte-1iup6im{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-register.svelte-1iup6im{padding:var(--s-2) var(--s-3)}.reg-list.svelte-1iup6im{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.reg-row.svelte-1iup6im{display:grid;grid-template-columns:70px 1fr auto;gap:var(--s-2);align-items:baseline;padding:5px 0;border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:12px;line-height:1.4}.reg-row.svelte-1iup6im:last-child{border-bottom:0}.fc.is-compact .reg-row.svelte-1iup6im{padding:3px 0;font-size:11px}.reg-tag.svelte-1iup6im{display:inline-flex;gap:4px;align-items:center;color:var(--ink-tertiary);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.reg-label.svelte-1iup6im{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reg-source.svelte-1iup6im{color:var(--ink-tertiary);font-size:10px;letter-spacing:.05em}.reg-silent.svelte-1iup6im{grid-column:2 / span 2;color:var(--ink-tertiary);font-style:italic}.reg-row.silent.svelte-1iup6im{opacity:.65}.body-sub.svelte-1iup6im{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-comparison.svelte-1swqabu{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-comparison.svelte-1swqabu{padding:var(--s-2) var(--s-3)}.cmp-grid.svelte-1swqabu{display:grid;grid-template-columns:1fr auto 1fr;gap:var(--s-3);align-items:stretch}.cell.svelte-1swqabu{display:flex;flex-direction:column;gap:4px}.cell-tier.svelte-1swqabu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.cell-value.svelte-1swqabu{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.cell-aux.svelte-1swqabu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.divider.svelte-1swqabu{align-self:center;font-family:var(--font-serif);font-style:italic;font-size:14px;color:var(--ink-tertiary);padding-top:18px}.cmp-delta.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink);border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.body-sub.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-meta.svelte-e40scu{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-meta.svelte-e40scu{padding:var(--s-2) var(--s-3)}.meta-list.svelte-e40scu{margin:0;display:grid;grid-template-columns:1fr;gap:4px}.meta-row.svelte-e40scu{display:grid;grid-template-columns:minmax(110px,max-content) 1fr;gap:var(--s-3);padding:3px 0;border-bottom:1px solid var(--rule-soft);align-items:baseline}.meta-row.svelte-e40scu:last-child{border-bottom:0}dt.svelte-e40scu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);text-transform:lowercase;letter-spacing:.04em}dd.svelte-e40scu{margin:0;font-family:var(--font-mono);font-size:12px;color:var(--ink)}.body-sub.svelte-e40scu{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.unknown.svelte-1x6xqhh{padding:var(--s-3) var(--s-4);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.svelte-1nuvnzu{background:var(--paper);border:1px solid var(--rule-soft);display:flex;flex-direction:column;transition:background-color .2s ease,border-color .2s ease,outline-color .2s ease;outline:0 solid transparent;outline-offset:0;color:inherit;text-align:left;font:inherit;padding:0;width:100%;animation:svelte-1nuvnzu-fc-fade-in .36s ease-out both}@keyframes svelte-1nuvnzu-fc-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.fc.is-interactive.svelte-1nuvnzu{cursor:pointer}.fc.svelte-1nuvnzu:hover{background:var(--paper-deep)}.fc.is-linked.svelte-1nuvnzu{outline:2px solid var(--accent-graphical);outline-offset:0}.has-illustrative.svelte-1nuvnzu,.fc-tier-synthetic.svelte-1nuvnzu{border-top:1px dashed var(--tier-synthetic-line)}.fc-head.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-bottom:1px solid var(--rule-soft);background:var(--paper-deep)}.fc.is-compact .fc-head.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-head-source.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:var(--s-2);font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}.fc-head-source-label.svelte-1nuvnzu{cursor:help}.fc-head-vintage.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em}.fc-title.svelte-1nuvnzu{margin:0;padding:var(--s-3) var(--s-4) 0;font-family:var(--font-sans);font-size:14px;font-weight:600;line-height:1.35;color:var(--ink)}.fc.is-compact .fc-title.svelte-1nuvnzu{padding:var(--s-2) var(--s-3) 0;font-size:13px}.fc-foot.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-top:1px solid var(--rule-soft);background:var(--paper-deep);gap:var(--s-3);margin-top:auto}.fc.is-compact .fc-foot.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-foot-cite.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;padding:0;cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--accent)}.fc-foot-cite.svelte-1nuvnzu:hover{color:var(--ink)}.fc-foot-docid.svelte-1nuvnzu{text-transform:uppercase}.fc-foot-docid-mute.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.fc-foot-arrow.svelte-1nuvnzu{font-family:var(--font-mono);font-size:11px}.fc-tier-badge.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.fc-tier-badge-empirical.svelte-1nuvnzu{color:var(--tier-empirical)}.fc-tier-badge-modeled.svelte-1nuvnzu{color:var(--tier-modeled)}.fc-tier-badge-proxy.svelte-1nuvnzu{color:var(--tier-proxy)}.fc-tier-badge-synthetic.svelte-1nuvnzu{color:var(--tier-synthetic)}.tally.svelte-1qqbvs2{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;flex-wrap:wrap}strong.svelte-1qqbvs2{font-weight:600;color:var(--ink)}.silent.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary)}.warn.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b7791f}.err.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b91c1c}.notinvoked.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary);font-style:italic}.sep.svelte-1qqbvs2{color:var(--ink-tertiary);opacity:.6}.prov-tree.svelte-qakefz{list-style:none;margin:0;padding:0;padding-left:calc(var(--depth, 0) * 16px)}.prov-row.svelte-qakefz{display:grid;grid-template-columns:14px max-content max-content 1fr auto;gap:var(--s-2);align-items:baseline;padding:3px 0;font-family:var(--font-mono);font-size:11px;border-bottom:1px dotted var(--rule-soft)}.prov-row.svelte-qakefz:last-child{border-bottom:0}.prov-pip.svelte-qakefz{text-align:center;font-size:10px;line-height:1}.prov-id.svelte-qakefz{color:var(--ink);letter-spacing:.04em;text-transform:lowercase}.prov-tier.svelte-qakefz{display:inline-flex;align-items:center}.prov-name.svelte-qakefz{font-family:var(--font-serif);font-style:italic;font-size:13px;color:var(--ink)}.prov-note.svelte-qakefz{font-family:var(--font-sans);font-size:12px;color:var(--ink-tertiary)}.prov-ms.svelte-qakefz{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.prov-status-silent_by_design.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-warned.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b7791f}.prov-status-errored.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b91c1c}.prov-status-errored.svelte-qakefz .prov-pip:where(.svelte-qakefz){font-weight:700}.prov-status-not_invoked.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-not_invoked.svelte-qakefz .prov-id:where(.svelte-qakefz){color:var(--ink-tertiary);opacity:.6}.prov-children.svelte-qakefz{padding:0}.region.svelte-16iv0n8{border-top:1px solid var(--rule-soft);padding:var(--s-5) 0 var(--s-5);background:transparent}.region.svelte-16iv0n8:first-of-type{border-top:0}.region-head.svelte-16iv0n8{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-4);margin-bottom:var(--s-3);flex-wrap:wrap;border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.region-cornerstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-cornerstone)}.region-keystone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-keystone)}.region-touchstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-touchstone)}.region-lodestone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-lodestone)}.region-capstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-capstone)}.region-head-left.svelte-16iv0n8{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-16iv0n8{margin:0;font-family:var(--font-serif);font-style:italic;font-size:26px;font-weight:500;color:var(--ink);letter-spacing:-.005em;line-height:1.1}.region-role.svelte-16iv0n8{font-family:var(--font-sans);font-size:14px;color:var(--ink-secondary)}.region-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em;margin-left:var(--s-2)}.rail.svelte-16iv0n8{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-16iv0n8>.fc{grid-column:span 4}.rail.svelte-16iv0n8>.fc.fc-register,.rail.svelte-16iv0n8>.fc.fc-timeseries,.rail.svelte-16iv0n8>.fc.fc-timeseries-ft,.rail.svelte-16iv0n8>.fc.fc-forecast,.rail.svelte-16iv0n8>.fc.fc-raster,.rail.svelte-16iv0n8>.fc.fc-raster-pred,.rail.svelte-16iv0n8>.fc.fc-lulc,.rail.svelte-16iv0n8>.fc.fc-comparison{grid-column:span 6}.rail-capstone.svelte-16iv0n8>.fc{grid-column:span 6}@media(max-width:920px){.rail.svelte-16iv0n8{grid-template-columns:repeat(6,1fr)}.rail.svelte-16iv0n8>.fc{grid-column:span 6}}.silent.svelte-16iv0n8{border:1px dashed var(--rule-soft);padding:var(--s-4);display:flex;flex-direction:column;gap:var(--s-2);background:var(--paper-deep)}.silent-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.1em;text-transform:uppercase}.silent-prose.svelte-16iv0n8{margin:0;font-size:13px;color:var(--ink-secondary);line-height:1.5;max-width:var(--measure)}.prov.svelte-16iv0n8{margin-top:var(--s-3)}.prov-toggle.svelte-16iv0n8{background:transparent;border:0;padding:4px 0;cursor:pointer;display:inline-flex;align-items:baseline;gap:var(--s-1);font-family:var(--font-mono);font-size:11px;color:var(--ink-secondary);letter-spacing:.05em}.prov-toggle.svelte-16iv0n8:hover{color:var(--ink)}.prov-caret.svelte-16iv0n8{font-size:10px;color:var(--ink-tertiary)}.prov-meta.svelte-16iv0n8{color:var(--ink-tertiary)}.prov-body.svelte-16iv0n8{margin-top:var(--s-2);padding:var(--s-2) 0;border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft)}.region-grammar.svelte-gwg123{border-top:2px solid var(--ink);padding:var(--s-5) 0}.region-head.svelte-gwg123{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:var(--s-3);margin-bottom:var(--s-3)}.region-head-left.svelte-gwg123{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-gwg123{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.region-role.svelte-gwg123{font-family:var(--font-sans);font-size:13px;color:var(--ink-secondary)}.region-tag.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}.grammar-count.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.rail.svelte-gwg123{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-gwg123>.fc{grid-column:span 4}.rail.svelte-gwg123>.fc.fc-register,.rail.svelte-gwg123>.fc.fc-timeseries,.rail.svelte-gwg123>.fc.fc-forecast,.rail.svelte-gwg123>.fc.fc-raster,.rail.svelte-gwg123>.fc.fc-raster-pred,.rail.svelte-gwg123>.fc.fc-comparison{grid-column:span 6}@media(max-width:920px){.rail.svelte-gwg123{grid-template-columns:repeat(6,1fr)}.rail.svelte-gwg123>.fc{grid-column:span 6}}.findings.svelte-ci42t5{background:var(--paper);color:var(--ink)}.findings-head.svelte-ci42t5{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--s-3);padding:var(--s-3) 0 var(--s-2)}.findings-h2.svelte-ci42t5{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;color:var(--ink)}.findings-tagline.svelte-ci42t5{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}
 
 
web/sveltekit/build/_app/immutable/assets/stoneRegistry.uOtksRcS.css ADDED
@@ -0,0 +1 @@
 
 
1
+ .citation-drawer.svelte-1p339fd a{color:inherit;border-bottom:1px solid var(--rule-soft);text-decoration:none}.citation-drawer.svelte-1p339fd a:hover{border-bottom-color:var(--accent);color:var(--accent)}.rip-map-container.svelte-wk2bu4{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.map-frame.svelte-wk2bu4{aspect-ratio:8 / 5.6;position:relative;transition:outline-color .2s ease;outline:0 solid transparent;outline-offset:0}.map-frame[data-linked].svelte-wk2bu4:not([data-linked=""]){outline:2px solid var(--accent-graphical)}.link-badge.svelte-wk2bu4{position:absolute;bottom:8px;right:8px;padding:3px 8px;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:lowercase;z-index:5;pointer-events:none}.layers-panel.svelte-1g2dety{background:var(--paper);border:1px solid var(--rule-soft);padding:var(--s-3) var(--s-4) var(--s-4);display:flex;flex-direction:column;gap:var(--s-3);font-family:var(--font-sans)}.layers-head.svelte-1g2dety{padding-bottom:4px}.layers-group.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2);border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.layers-group.region-cornerstone.svelte-1g2dety{--stone-tint: var(--stone-cornerstone)}.layers-group.region-keystone.svelte-1g2dety{--stone-tint: var(--stone-keystone)}.layers-group.region-touchstone.svelte-1g2dety{--stone-tint: var(--stone-touchstone)}.layers-group.region-lodestone.svelte-1g2dety{--stone-tint: var(--stone-lodestone)}.layers-group.region-capstone.svelte-1g2dety{--stone-tint: var(--stone-capstone)}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety){cursor:pointer;list-style:none;display:flex;align-items:baseline;gap:var(--s-2);padding:4px 0}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety)::-webkit-details-marker{display:none}.layers-caret.svelte-1g2dety{font-size:10px;color:var(--ink-tertiary);transition:transform .2s ease}.layers-group.svelte-1g2dety:not([open]) .layers-caret:where(.svelte-1g2dety){transform:rotate(-90deg)}.layers-stone-name.svelte-1g2dety{font-family:var(--font-serif);font-style:italic;font-size:16px;color:var(--ink)}.layers-stone-tag.svelte-1g2dety{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.layers-count.svelte-1g2dety{margin-left:auto;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.layers-list.svelte-1g2dety{list-style:none;margin:4px 0 var(--s-2);padding:0;display:flex;flex-direction:column}.layers-row.svelte-1g2dety{display:grid;grid-template-columns:16px 1fr auto;gap:var(--s-2);align-items:center;padding:4px 0;font-family:var(--font-mono);font-size:11px;color:var(--ink);border-bottom:1px dotted var(--rule-soft)}.layers-row.svelte-1g2dety:last-child{border-bottom:0}.layers-row.dim.svelte-1g2dety{opacity:.7}.layers-glyph.svelte-1g2dety{display:inline-flex;align-items:center}.layers-text.svelte-1g2dety{display:flex;flex-direction:column;gap:2px}.layers-label.svelte-1g2dety{color:var(--ink);font-family:var(--font-sans);font-size:12px}.layers-meta.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);display:inline-flex;align-items:center;gap:4px}.layers-state.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink);text-transform:uppercase}.layers-state-dim.svelte-1g2dety{color:var(--ink-tertiary);text-transform:lowercase;font-style:italic}.layers-row-empty.svelte-1g2dety .layers-empty-text:where(.svelte-1g2dety){grid-column:1 / -1;color:var(--ink-tertiary);font-style:italic;font-family:var(--font-mono);font-size:11px}.layers-masters.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.layers-master-row.svelte-1g2dety{margin-top:4px;display:flex;flex-wrap:wrap;gap:6px}.layers-master.svelte-1g2dety{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:var(--paper);border:1px solid var(--rule-soft);cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink)}.layers-master.is-on.svelte-1g2dety{background:var(--paper-deep);border-color:var(--ink)}.layers-master-state.svelte-1g2dety{margin-left:4px;color:var(--ink-tertiary);font-size:9px}.layers-master.is-on.svelte-1g2dety .layers-master-state:where(.svelte-1g2dety){color:var(--ink)}.rh.svelte-1vuwkv4{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2);padding:var(--s-2) var(--s-4);background:var(--paper-deep);border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.rh-item.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){font-weight:600;color:var(--ink);margin-right:2px}.rh-sep.svelte-1vuwkv4{opacity:.5}.rh-silent.svelte-1vuwkv4{color:var(--ink-tertiary)}.rh-warn.svelte-1vuwkv4{color:#b7791f}.rh-err.svelte-1vuwkv4{color:#b91c1c}.rh-notinvoked.svelte-1vuwkv4{color:var(--ink-tertiary);font-style:italic}.rh-total.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){color:var(--ink-tertiary)}.rh-em.svelte-1vuwkv4{cursor:help;color:var(--ink-secondary)}.rh-em.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){color:var(--ink)}.rh-em-tok.svelte-1vuwkv4{margin-left:4px;opacity:.75}.rh-em-icon.svelte-1vuwkv4{margin-right:4px;font-size:10px;color:var(--ink-tertiary)}.body-headline.svelte-lygj3j{padding:var(--s-3) var(--s-4) var(--s-2);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-headline.svelte-lygj3j{padding:var(--s-2) var(--s-3)}.headline.svelte-lygj3j{font-family:var(--font-serif);font-style:italic;font-size:28px;font-weight:500;line-height:1.1;letter-spacing:-.01em}.fc.is-compact .headline.svelte-lygj3j{font-size:22px}.subhead.svelte-lygj3j{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.body-prose.svelte-lygj3j{margin:var(--s-2) 0 0;font-size:13px;line-height:1.45;color:var(--ink-secondary)}.body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-3)}.t.svelte-1nlkuao{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12px}.t.svelte-1nlkuao th:where(.svelte-1nlkuao){text-align:left;font-weight:500;color:var(--ink-tertiary);padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);text-transform:lowercase;letter-spacing:.04em}.t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);color:var(--ink)}.t.svelte-1nlkuao tr:where(.svelte-1nlkuao):last-child td:where(.svelte-1nlkuao){border-bottom:0}.fc.is-compact .t.svelte-1nlkuao th:where(.svelte-1nlkuao),.fc.is-compact .t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:2px 6px 2px 0;font-size:11px}.body-sub.svelte-1nlkuao{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-scalars.svelte-stf9c8{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-scalars.svelte-stf9c8{padding:var(--s-2) var(--s-3)}.row.svelte-stf9c8{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:var(--s-3)}.cell.svelte-stf9c8{display:flex;flex-direction:column;gap:2px}.value.svelte-stf9c8{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.label.svelte-stf9c8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.06em;text-transform:lowercase}.body-sub.svelte-stf9c8{margin-top:var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-spark.svelte-jrppts{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-spark.svelte-jrppts{padding:var(--s-2) var(--s-3)}.headline.svelte-jrppts{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-jrppts{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;margin-bottom:var(--s-1)}svg.svelte-jrppts{display:block}.body-sub.svelte-jrppts{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-timeseries.svelte-48vbub{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-timeseries.svelte-48vbub{padding:var(--s-2) var(--s-3)}.ts-header.svelte-48vbub{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--s-2)}.headline.svelte-48vbub{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}svg.svelte-48vbub{display:block}.body-sub.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5;display:flex;flex-direction:column;gap:2px}.spatial-note.svelte-48vbub{color:var(--accent);font-style:italic}.ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-4) var(--s-3);padding-top:var(--s-2);border-top:1px dashed var(--rule-soft);display:flex;flex-wrap:wrap;gap:var(--s-3);align-items:baseline;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.is-compact .ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-3)}.ft-stat.svelte-1y25lfh{display:inline-flex;align-items:baseline;gap:4px;color:var(--ink)}.ft-stat-k.svelte-1y25lfh{font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.ft-skill.svelte-1y25lfh{color:var(--tier-modeled);font-weight:500}.ft-badge.svelte-1y25lfh{border:1px solid var(--ink);color:var(--ink);padding:1px 6px;font-size:10px;letter-spacing:.06em;text-transform:uppercase;background:var(--paper)}.ft-link.svelte-1y25lfh{margin-left:auto;color:var(--accent);text-decoration:none}.ft-link.svelte-1y25lfh:hover{text-decoration:underline}.body-forecast.svelte-gqkhpe{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-forecast.svelte-gqkhpe{padding:var(--s-2) var(--s-3)}svg.svelte-gqkhpe{display:block}.body-sub.svelte-gqkhpe{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}svg.svelte-1lx1psy{display:block}.thumb-placeholder.svelte-1lx1psy{height:120px;background:var(--paper-deep);display:flex;align-items:center;justify-content:center;color:var(--ink-tertiary);font-family:var(--font-mono);font-size:11px;border:1px dashed var(--rule-soft)}.body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-3)}.frame.svelte-1m43x1m{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1m43x1m{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.raster-headline.svelte-1m43x1m{font-family:var(--font-mono);font-size:12px;color:var(--ink)}.raster-headline.svelte-1m43x1m span:where(.svelte-1m43x1m):first-child{font-family:var(--font-serif);font-style:italic;font-size:18px;font-weight:500}.body-sub.svelte-1m43x1m{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-3)}.frame.svelte-1td276x{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1td276x{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.bar.svelte-1td276x{display:flex;height:10px;border:1px solid var(--rule-soft);overflow:hidden}.bar-seg.svelte-1td276x{flex-shrink:1;flex-basis:0}.legend.svelte-1td276x{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:4px var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.legend.svelte-1td276x li:where(.svelte-1td276x){display:inline-flex;align-items:center;gap:6px}.swatch.svelte-1td276x{display:inline-block;width:10px;height:10px;border:1px solid var(--rule-soft);flex:none}.legend-k.svelte-1td276x{color:var(--ink);text-transform:lowercase;letter-spacing:.04em}.legend-pct.svelte-1td276x{color:var(--ink-tertiary)}.body-sub.svelte-1td276x{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-register.svelte-1iup6im{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-register.svelte-1iup6im{padding:var(--s-2) var(--s-3)}.reg-list.svelte-1iup6im{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.reg-row.svelte-1iup6im{display:grid;grid-template-columns:70px 1fr auto;gap:var(--s-2);align-items:baseline;padding:5px 0;border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:12px;line-height:1.4}.reg-row.svelte-1iup6im:last-child{border-bottom:0}.fc.is-compact .reg-row.svelte-1iup6im{padding:3px 0;font-size:11px}.reg-tag.svelte-1iup6im{display:inline-flex;gap:4px;align-items:center;color:var(--ink-tertiary);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.reg-label.svelte-1iup6im{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reg-source.svelte-1iup6im{color:var(--ink-tertiary);font-size:10px;letter-spacing:.05em}.reg-silent.svelte-1iup6im{grid-column:2 / span 2;color:var(--ink-tertiary);font-style:italic}.reg-row.silent.svelte-1iup6im{opacity:.65}.body-sub.svelte-1iup6im{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-comparison.svelte-1swqabu{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-comparison.svelte-1swqabu{padding:var(--s-2) var(--s-3)}.cmp-grid.svelte-1swqabu{display:grid;grid-template-columns:1fr auto 1fr;gap:var(--s-3);align-items:stretch}.cell.svelte-1swqabu{display:flex;flex-direction:column;gap:4px}.cell-tier.svelte-1swqabu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.cell-value.svelte-1swqabu{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.cell-aux.svelte-1swqabu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.divider.svelte-1swqabu{align-self:center;font-family:var(--font-serif);font-style:italic;font-size:14px;color:var(--ink-tertiary);padding-top:18px}.cmp-delta.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink);border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.body-sub.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-meta.svelte-e40scu{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-meta.svelte-e40scu{padding:var(--s-2) var(--s-3)}.meta-list.svelte-e40scu{margin:0;display:grid;grid-template-columns:1fr;gap:4px}.meta-row.svelte-e40scu{display:grid;grid-template-columns:minmax(110px,max-content) 1fr;gap:var(--s-3);padding:3px 0;border-bottom:1px solid var(--rule-soft);align-items:baseline}.meta-row.svelte-e40scu:last-child{border-bottom:0}dt.svelte-e40scu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);text-transform:lowercase;letter-spacing:.04em}dd.svelte-e40scu{margin:0;font-family:var(--font-mono);font-size:12px;color:var(--ink)}.body-sub.svelte-e40scu{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.unknown.svelte-1x6xqhh{padding:var(--s-3) var(--s-4);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.svelte-1nuvnzu{background:var(--paper);border:1px solid var(--rule-soft);display:flex;flex-direction:column;transition:background-color .2s ease,border-color .2s ease,outline-color .2s ease;outline:0 solid transparent;outline-offset:0;color:inherit;text-align:left;font:inherit;padding:0;width:100%;animation:svelte-1nuvnzu-fc-fade-in .36s ease-out both}@keyframes svelte-1nuvnzu-fc-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.fc.is-interactive.svelte-1nuvnzu{cursor:pointer}.fc.svelte-1nuvnzu:hover{background:var(--paper-deep)}.fc.is-linked.svelte-1nuvnzu{outline:2px solid var(--accent-graphical);outline-offset:0}.has-illustrative.svelte-1nuvnzu,.fc-tier-synthetic.svelte-1nuvnzu{border-top:1px dashed var(--tier-synthetic-line)}.fc-head.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-bottom:1px solid var(--rule-soft);background:var(--paper-deep)}.fc.is-compact .fc-head.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-head-source.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:var(--s-2);font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}.fc-head-source-label.svelte-1nuvnzu{cursor:help}.fc-head-vintage.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em}.fc-title.svelte-1nuvnzu{margin:0;padding:var(--s-3) var(--s-4) 0;font-family:var(--font-sans);font-size:14px;font-weight:600;line-height:1.35;color:var(--ink)}.fc.is-compact .fc-title.svelte-1nuvnzu{padding:var(--s-2) var(--s-3) 0;font-size:13px}.fc-foot.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-top:1px solid var(--rule-soft);background:var(--paper-deep);gap:var(--s-3);margin-top:auto}.fc.is-compact .fc-foot.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-foot-cite.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;padding:0;cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--accent)}.fc-foot-cite.svelte-1nuvnzu:hover{color:var(--ink)}.fc-foot-docid.svelte-1nuvnzu{text-transform:uppercase}.fc-foot-docid-mute.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.fc-foot-arrow.svelte-1nuvnzu{font-family:var(--font-mono);font-size:11px}.fc-tier-badge.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.fc-tier-badge-empirical.svelte-1nuvnzu{color:var(--tier-empirical)}.fc-tier-badge-modeled.svelte-1nuvnzu{color:var(--tier-modeled)}.fc-tier-badge-proxy.svelte-1nuvnzu{color:var(--tier-proxy)}.fc-tier-badge-synthetic.svelte-1nuvnzu{color:var(--tier-synthetic)}.tally.svelte-1qqbvs2{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;flex-wrap:wrap}strong.svelte-1qqbvs2{font-weight:600;color:var(--ink)}.silent.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary)}.warn.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b7791f}.err.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b91c1c}.notinvoked.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary);font-style:italic}.sep.svelte-1qqbvs2{color:var(--ink-tertiary);opacity:.6}.prov-tree.svelte-qakefz{list-style:none;margin:0;padding:0;padding-left:calc(var(--depth, 0) * 16px)}.prov-row.svelte-qakefz{display:grid;grid-template-columns:14px max-content max-content 1fr auto;gap:var(--s-2);align-items:baseline;padding:3px 0;font-family:var(--font-mono);font-size:11px;border-bottom:1px dotted var(--rule-soft)}.prov-row.svelte-qakefz:last-child{border-bottom:0}.prov-pip.svelte-qakefz{text-align:center;font-size:10px;line-height:1}.prov-id.svelte-qakefz{color:var(--ink);letter-spacing:.04em;text-transform:lowercase}.prov-tier.svelte-qakefz{display:inline-flex;align-items:center}.prov-name.svelte-qakefz{font-family:var(--font-serif);font-style:italic;font-size:13px;color:var(--ink)}.prov-note.svelte-qakefz{font-family:var(--font-sans);font-size:12px;color:var(--ink-tertiary)}.prov-ms.svelte-qakefz{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.prov-status-silent_by_design.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-warned.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b7791f}.prov-status-errored.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b91c1c}.prov-status-errored.svelte-qakefz .prov-pip:where(.svelte-qakefz){font-weight:700}.prov-status-not_invoked.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-not_invoked.svelte-qakefz .prov-id:where(.svelte-qakefz){color:var(--ink-tertiary);opacity:.6}.prov-children.svelte-qakefz{padding:0}.region.svelte-16iv0n8{border-top:1px solid var(--rule-soft);padding:var(--s-5) 0 var(--s-5);background:transparent}.region.svelte-16iv0n8:first-of-type{border-top:0}.region-head.svelte-16iv0n8{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-4);margin-bottom:var(--s-3);flex-wrap:wrap;border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.region-cornerstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-cornerstone)}.region-keystone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-keystone)}.region-touchstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-touchstone)}.region-lodestone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-lodestone)}.region-capstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-capstone)}.region-head-left.svelte-16iv0n8{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-16iv0n8{margin:0;font-family:var(--font-serif);font-style:italic;font-size:26px;font-weight:500;color:var(--ink);letter-spacing:-.005em;line-height:1.1}.region-role.svelte-16iv0n8{font-family:var(--font-sans);font-size:14px;color:var(--ink-secondary)}.region-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em;margin-left:var(--s-2)}.rail.svelte-16iv0n8{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-16iv0n8>.fc{grid-column:span 4}.rail.svelte-16iv0n8>.fc.fc-register,.rail.svelte-16iv0n8>.fc.fc-timeseries,.rail.svelte-16iv0n8>.fc.fc-timeseries-ft,.rail.svelte-16iv0n8>.fc.fc-forecast,.rail.svelte-16iv0n8>.fc.fc-raster,.rail.svelte-16iv0n8>.fc.fc-raster-pred,.rail.svelte-16iv0n8>.fc.fc-lulc,.rail.svelte-16iv0n8>.fc.fc-comparison{grid-column:span 6}.rail-capstone.svelte-16iv0n8>.fc{grid-column:span 6}@media(max-width:920px){.rail.svelte-16iv0n8{grid-template-columns:repeat(6,1fr)}.rail.svelte-16iv0n8>.fc{grid-column:span 6}}.silent.svelte-16iv0n8{border:1px dashed var(--rule-soft);padding:var(--s-4);display:flex;flex-direction:column;gap:var(--s-2);background:var(--paper-deep)}.silent-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.1em;text-transform:uppercase}.silent-prose.svelte-16iv0n8{margin:0;font-size:13px;color:var(--ink-secondary);line-height:1.5;max-width:var(--measure)}.prov.svelte-16iv0n8{margin-top:var(--s-3)}.prov-toggle.svelte-16iv0n8{background:transparent;border:0;padding:4px 0;cursor:pointer;display:inline-flex;align-items:baseline;gap:var(--s-1);font-family:var(--font-mono);font-size:11px;color:var(--ink-secondary);letter-spacing:.05em}.prov-toggle.svelte-16iv0n8:hover{color:var(--ink)}.prov-caret.svelte-16iv0n8{font-size:10px;color:var(--ink-tertiary)}.prov-meta.svelte-16iv0n8{color:var(--ink-tertiary)}.prov-body.svelte-16iv0n8{margin-top:var(--s-2);padding:var(--s-2) 0;border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft)}.region-grammar.svelte-gwg123{border-top:2px solid var(--ink);padding:var(--s-5) 0}.region-head.svelte-gwg123{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:var(--s-3);margin-bottom:var(--s-3)}.region-head-left.svelte-gwg123{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-gwg123{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.region-role.svelte-gwg123{font-family:var(--font-sans);font-size:13px;color:var(--ink-secondary)}.region-tag.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}.grammar-count.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.rail.svelte-gwg123{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-gwg123>.fc{grid-column:span 4}.rail.svelte-gwg123>.fc.fc-register,.rail.svelte-gwg123>.fc.fc-timeseries,.rail.svelte-gwg123>.fc.fc-forecast,.rail.svelte-gwg123>.fc.fc-raster,.rail.svelte-gwg123>.fc.fc-raster-pred,.rail.svelte-gwg123>.fc.fc-comparison{grid-column:span 6}@media(max-width:920px){.rail.svelte-gwg123{grid-template-columns:repeat(6,1fr)}.rail.svelte-gwg123>.fc{grid-column:span 6}}.findings.svelte-ci42t5{background:var(--paper);color:var(--ink)}.findings-head.svelte-ci42t5{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--s-3);padding:var(--s-3) 0 var(--s-2)}.findings-h2.svelte-ci42t5{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;color:var(--ink)}.findings-tagline.svelte-ci42t5{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}
web/sveltekit/build/_app/immutable/chunks/CJeJVIjP.js DELETED
@@ -1 +0,0 @@
1
- var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bf as Pe,bg as Vt,ai as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./BTUA7_xE.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class Fe extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Gt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Ge(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${Ft(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return Ce(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ce(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ce(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function Ce(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_1sh7tn8)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_1sh7tn8)==null?void 0:pt.assets)??U??"",rn="1778350475932",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function z(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:C};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof Fe?e.status:500}function cn(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},je={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),je=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>je.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},j={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(C)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_1sh7tn8&&(globalThis.__sveltekit_1sh7tn8.query,globalThis.__sveltekit_1sh7tn8.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[F],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await G({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await G({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:Ct({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:j,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(C)),c.forEach(h=>h==null?void 0:h[1]().catch(C));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(C);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof ze)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await j.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof ze)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:zt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=C,block:d=C,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await G({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await j.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[F]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),j.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){jt({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await G({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),G({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[F]){const r=n.state[F];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await G({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[F]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof ze){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(C),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,j as s};
 
 
web/sveltekit/build/_app/immutable/chunks/{B3Pg95Il.js → D8NyAcAP.js} RENAMED
@@ -1 +1 @@
1
- import{s as e,p as r}from"./CJeJVIjP.js";const t={get error(){return r.error},get params(){return r.params},get status(){return r.status},get url(){return r.url}};e.updated.check;const a=t;export{a as p};
 
1
+ import{s as e,p as r}from"./DJJH9JR_.js";const t={get error(){return r.error},get params(){return r.params},get status(){return r.status},get url(){return r.url}};e.updated.check;const a=t;export{a as p};
web/sveltekit/build/_app/immutable/chunks/DDAjlznB.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{k as Ge,o as Ke,a as c,f as y,s as g,t as we,d as Fe,c as Se,e as Re,b as fe}from"./CWw6qgC_.js";import{h as me,n as Te,j as Ne,bd as Qe,d as Ve,a3 as Ze,aW as Xe,b7 as Je,k as $e,b as et,e as Pe,i as Be,a0 as tt,av as at,p as X,t as C,a as J,s as n,c as r,r as t,aR as se,o as a,al as P,am as ie,ai as rt,be as st,a5 as ke,a4 as Le,f as ee}from"./BTUA7_xE.js";import{B as it,i as L}from"./Bd-v_9Ud.js";import{e as te,i as ce}from"./25_y8TFd.js";import{s as _,a as he,b as ve,c as nt,C as lt}from"./B0XoTt7U.js";import{T as ge,c as ot,b as dt,d as qe}from"./BatqQaKj.js";import{b as vt,_ as ct}from"./CXQd8Y6F.js";import{p as ne}from"./CW0zSL4D.js";import{P as ut}from"./D907np-5.js";function mt(R,e,w,f,M,i){let h=me;me&&Te();var d=null;me&&Ne.nodeType===Qe&&(d=Ne,Te());var p=me?Ne:R,m=new it(p,!1);Ve(()=>{const S=e()||null;var x=S==="svg"?Je:void 0;if(S===null){m.ensure(null,null);return}return m.ensure(S,o=>{if(S){if(d=me?d:Xe(S,x),Ge(d,d),f){me&&Ke(S)&&d.append(document.createComment(""));var s=me?$e(d):d.appendChild(et());me&&(s===null?Pe(!1):Be(s)),f(d,s)}tt.nodes.end=d,o.before(d)}me&&Be(o)}),()=>{}},Ze),at(()=>{}),h&&(Pe(!0),Be(p))}var ht=y('<a target="_blank" rel="noopener noreferrer"> </a>'),gt=y('<li><span class="citation-num"> </span> <div class="citation-body"><div class="citation-line-1"><!> <span class="citation-source"> </span> <span class="citation-vintage"> </span></div> <div class="citation-title"><!></div> <div class="citation-meta"><span class="citation-docid"> </span> <span class="citation-retrieved"> </span></div></div></li>'),ft=y(`<aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label"> </span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
2
+ state, and city sources. No commercial APIs contacted at runtime.</p></div></aside>`);function Hr(R,e){X(e,!0);let w=P(()=>Object.values(e.citations).sort((p,m)=>p.n-m.n));var f=ft(),M=r(f),i=r(M),h=r(i);t(i),se(2),t(M);var d=n(M,2);te(d,21,()=>a(w),p=>p.id,(p,m)=>{var S=gt();let x;var o=r(S),s=r(o);t(o);var l=n(o,2),b=r(l),N=r(b);ge(N,{get tier(){return a(m).tier},size:10,get color(){return`var(--tier-${a(m).tier??""})`}});var u=n(N,2),v=r(u,!0);t(u);var k=n(u,2),A=r(k);t(k),t(b);var E=n(b,2),z=r(E);{var W=T=>{var Y=ht(),G=r(Y,!0);t(Y),C(()=>{_(Y,"href",a(m).url),g(G,a(m).title)}),c(T,Y)},I=P(()=>a(m).url&&a(m).url.startsWith("http")),O=T=>{var Y=we();C(()=>g(Y,a(m).title)),c(T,Y)};L(z,T=>{a(I)?T(W):T(O,-1)})}t(E);var H=n(E,2),U=r(H),D=r(U,!0);t(U);var q=n(U,2),F=r(q);t(q),t(H),t(l),t(S),C(()=>{_(S,"id",`cite-${a(m).id??""}`),x=he(S,1,"citation-item",null,x,{"is-active":ot.active===a(m).id}),g(s,`[${a(m).n??""}]`),g(v,a(m).source),g(A,`v. ${a(m).vintage??""}`),g(D,a(m).docId),g(F,`retr. ${a(m).retrieved??""}`)}),c(p,S)}),t(d),se(2),t(f),C(()=>g(h,`Citations · ${a(w).length??""}`)),c(R,f),J()}const De=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
3
+ <rect width="12" height="12" fill="rgba(42,111,168,0.18)"/>
4
+ <g stroke="#2A6FA8" stroke-width="1.4">
5
+ <line x1="-2" y1="2" x2="14" y2="-14"/>
6
+ <line x1="-2" y1="8" x2="14" y2="-8"/>
7
+ <line x1="-2" y1="14" x2="14" y2="-2"/>
8
+ <line x1="-2" y1="20" x2="14" y2="4"/>
9
+ </g>
10
+ </svg>`,_t=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
11
+ <rect width="12" height="12" fill="rgba(42,111,168,0.16)"/>
12
+ <g stroke="#2A6FA8" stroke-width="1.1">
13
+ <line x1="-2" y1="6" x2="14" y2="-10"/>
14
+ <line x1="-2" y1="14" x2="14" y2="-2"/>
15
+ <line x1="-2" y1="22" x2="14" y2="6"/>
16
+ </g>
17
+ </svg>`;async function yt(R,e){const w=new Blob([R],{type:"image/svg+xml"}),f=URL.createObjectURL(w);try{return await new Promise((i,h)=>{const d=new Image(e,e);d.onload=()=>i(d),d.onerror=p=>h(p),d.src=f})}finally{URL.revokeObjectURL(f)}}async function pt(R){const e=[["syn-stripe-45",De,12],["syn-stripe-45-2x",De,24],["syn-stripe-45-low",_t,12]];for(const[w,f,M]of e)if(!R.hasImage(w))try{const i=await yt(f,M);R.addImage(w,i,{pixelRatio:M/12})}catch(i){console.warn(`syn-stripe registration failed for ${w}`,i)}}var xt=y('<span class="link-badge svelte-wk2bu4" aria-hidden="true"> </span>'),bt=y('<div class="map-frame svelte-wk2bu4"><div role="application" class="rip-map-container svelte-wk2bu4"></div> <!></div>');function jr(R,e){X(e,!0);let w=ne(e,"activeLayers",19,()=>({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),f=ne(e,"linkedKey",3,null),M=Le(null),i=null,h=Le(!1);const d={type:"FeatureCollection",features:[]};function p(l,b){if(!i||!a(h))return;const N=i.getSource(l);N&&N.setData(b??d)}function m(l,b){!i||!a(h)||i.getLayer(l)&&i.setLayoutProperty(l,"visibility",b?"visible":"none")}ie(()=>{p("sandy-empirical",e.sandyEmpirical)}),ie(()=>{p("dep-modeled",e.depModeled)}),ie(()=>{p("syn-prior",e.syntheticPrior)}),ie(()=>{p("proxy-311",e.proxy311)}),ie(()=>{p("register-points",e.registerPoints)}),ie(()=>{p("register-polygons",e.registerPolygons)}),ie(()=>{p("terramind-lulc",e.terramindLulc)}),ie(()=>{p("terramind-buildings",e.terramindBuildings)}),ie(()=>{p("prithvi-live",e.prithviLive)}),ie(()=>{p("ida-hwm",e.idaHwm)}),ie(()=>{m("tier-empirical-fill",w().empirical),m("tier-empirical-line",w().empirical),m("ida-hwm-circle",w().empirical),m("tier-modeled-fill",w().modeled),m("tier-modeled-line",w().modeled),m("tier-synthetic-fill",w().synthetic),m("tier-synthetic-line",w().synthetic),m("terramind-lulc-fill",w().synthetic),m("terramind-lulc-line",w().synthetic),m("terramind-buildings-fill",w().synthetic),m("terramind-buildings-line",w().synthetic),m("prithvi-live-fill",w().modeled),m("prithvi-live-line",w().modeled),m("tier-proxy-dots",w().proxy)}),ie(()=>{!i||!a(h)||i.flyTo({center:[e.address.lon,e.address.lat],zoom:15,essential:!0})}),rt(async()=>{if(!a(M))return;const l=await ct(()=>import("./D4L2lGt1.js").then(b=>b.m),[],import.meta.url);i=new l.Map({container:a(M),style:ut,center:[e.address.lon,e.address.lat],zoom:15,attributionControl:{compact:!0}}),i.addControl(new l.NavigationControl({visualizePitch:!1}),"top-right"),i.addControl(new l.ScaleControl({maxWidth:100,unit:"imperial"}),"bottom-left"),i.on("load",()=>{if(!i)return;window.__riprapMap=i,pt(i);const b=()=>({type:"FeatureCollection",features:[]});i.addSource("sandy-empirical",{type:"geojson",data:e.sandyEmpirical??b()}),i.addSource("dep-modeled",{type:"geojson",data:e.depModeled??b()}),i.addSource("syn-prior",{type:"geojson",data:e.syntheticPrior??b()}),i.addSource("proxy-311",{type:"geojson",data:e.proxy311??b()}),i.addSource("register-points",{type:"geojson",data:e.registerPoints??b()}),i.addSource("register-polygons",{type:"geojson",data:e.registerPolygons??b()}),i.addSource("terramind-lulc",{type:"geojson",data:e.terramindLulc??b()}),i.addSource("terramind-buildings",{type:"geojson",data:e.terramindBuildings??b()}),i.addSource("prithvi-live",{type:"geojson",data:e.prithviLive??b()}),i.addSource("ida-hwm",{type:"geojson",data:e.idaHwm??b()}),i.addSource("queried-address",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[e.address.lon,e.address.lat]},properties:{label:e.address.label}}]}}),i.addLayer({id:"tier-empirical-fill",type:"fill",source:"sandy-empirical",paint:{"fill-color":"#0B5394","fill-opacity":.4}}),i.addLayer({id:"tier-empirical-line",type:"line",source:"sandy-empirical",paint:{"line-color":"#0B5394","line-width":1.5}}),i.addLayer({id:"tier-modeled-fill",type:"fill",source:"dep-modeled",paint:{"fill-color":"#2A6FA8","fill-opacity":.25}}),i.addLayer({id:"tier-modeled-line",type:"line",source:"dep-modeled",paint:{"line-color":"#2A6FA8","line-width":1.5}}),i.addLayer({id:"tier-synthetic-fill",type:"fill",source:"syn-prior",paint:{"fill-pattern":"syn-stripe-45","fill-opacity":.65}}),i.addLayer({id:"tier-synthetic-line",type:"line",source:"syn-prior",paint:{"line-color":"#2A6FA8","line-width":1.5,"line-dasharray":[4,3]}}),i.addLayer({id:"tier-proxy-dots",type:"circle",source:"proxy-311",paint:{"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1.25,"circle-radius":["interpolate",["linear"],["coalesce",["get","count"],1],1,3,5,6,15,9,30,12]}}),i.addLayer({id:"terramind-lulc-fill",type:"fill",source:"terramind-lulc",paint:{"fill-color":["get","fill_color"],"fill-opacity":.25}}),i.addLayer({id:"terramind-lulc-line",type:"line",source:"terramind-lulc",paint:{"line-color":["get","fill_color"],"line-width":.75,"line-opacity":.45,"line-dasharray":[3,2]}}),i.addLayer({id:"terramind-buildings-fill",type:"fill",source:"terramind-buildings",paint:{"fill-color":"#7C3AED","fill-opacity":.15}}),i.addLayer({id:"terramind-buildings-line",type:"line",source:"terramind-buildings",paint:{"line-color":"#7C3AED","line-width":1,"line-opacity":.6,"line-dasharray":[2,2]}}),i.addLayer({id:"prithvi-live-fill",type:"fill",source:"prithvi-live",paint:{"fill-color":"#0D9488","fill-opacity":.2}}),i.addLayer({id:"prithvi-live-line",type:"line",source:"prithvi-live",paint:{"line-color":"#0D9488","line-width":1,"line-opacity":.55}}),i.addLayer({id:"register-polygons-fill",type:"fill",source:"register-polygons",paint:{"fill-color":"#0B5394","fill-opacity":["interpolate",["linear"],["coalesce",["get","pct_inside_sandy"],0],0,.1,25,.2,50,.32,75,.45]}}),i.addLayer({id:"register-polygons-line",type:"line",source:"register-polygons",paint:{"line-color":"#0B5394","line-width":1,"line-opacity":.85}}),i.addLayer({id:"ida-hwm-circle",type:"circle",source:"ida-hwm",paint:{"circle-color":"#D97706","circle-stroke-color":"#F4F6F9","circle-stroke-width":1.5,"circle-radius":["interpolate",["linear"],["coalesce",["get","height_above_gnd_ft"],.5],0,5,1,7,3,9,5,12],"circle-opacity":.92}}),i.on("mouseenter","ida-hwm-circle",()=>{i&&(i.getCanvas().style.cursor="pointer")}),i.on("mouseleave","ida-hwm-circle",()=>{i&&(i.getCanvas().style.cursor="")}),i.on("click","ida-hwm-circle",N=>{var U;if(!i||!((U=N.features)!=null&&U.length))return;const u=N.features[0],v=u.properties??{},k=String(v.site_description??"?"),A=v.elev_ft!=null?`${Number(v.elev_ft).toFixed(1)} ft NAVD88`:"—",E=v.height_above_gnd_ft!=null?`${Number(v.height_above_gnd_ft).toFixed(2)} ft above ground`:"—",z=String(v.hwm_quality??""),W=v.distance_m!=null?`${v.distance_m} m from query`:"",I=`
18
+ <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px; max-width: 220px;">
19
+ <div style="font-weight: 600; color: #D97706; font-size: 11px; letter-spacing: 0.05em; text-transform: uppercase;">Ida 2021 HWM · USGS</div>
20
+ <div style="margin-top: 4px; color: #0F172A; font-size: 12px;">${k}</div>
21
+ <div style="margin-top: 6px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #6B6B6B;">
22
+ elev: ${A}<br>
23
+ mark: ${E}<br>
24
+ ${z?`quality: ${z}<br>`:""}
25
+ ${W}
26
+ </div>
27
+ </div>`,O=new l.Popup({closeButton:!0,offset:12}),H=u.geometry.coordinates;O.setLngLat(H).setHTML(I).addTo(i)}),i.addLayer({id:"register-points-circle",type:"circle",source:"register-points",paint:{"circle-color":["case",["==",["get","inside_sandy_2012"],!0],"#0B5394","#6B6B6B"],"circle-stroke-color":"#F4F6F9","circle-stroke-width":1.25,"circle-radius":["match",["get","kind"],"subway",4,"school",5,"hospital",6,"nycha",7,4],"circle-opacity":.9}}),i.on("mouseenter","register-points-circle",()=>{i&&(i.getCanvas().style.cursor="pointer")}),i.on("mouseleave","register-points-circle",()=>{i&&(i.getCanvas().style.cursor="")}),i.on("click","register-points-circle",N=>{var H;if(!i||!((H=N.features)!=null&&H.length))return;const u=N.features[0],v=u.properties??{},k=String(v.name??"?"),A=String(v.kind??"?"),E=v.inside_sandy_2012===!0||v.inside_sandy_2012==="true",z=String(v.doc_id??""),W=`
28
+ <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
29
+ <div style="font-weight: 600; color: #0F172A;">${k}</div>
30
+ <div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${A}</div>
31
+ <div style="margin-top: 6px;">
32
+ <span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${E?"#0B5394":"#6B6B6B"};">
33
+ inside_sandy_2012=${E}
34
+ </span>
35
+ </div>
36
+ ${z?`<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #005EA2;">[${z}]</div>`:""}
37
+ </div>`,I=new l.Popup({closeButton:!0,offset:12}),O=u.geometry.coordinates;I.setLngLat(O).setHTML(W).addTo(i)}),i.addLayer({id:"queried-halo",type:"circle",source:"queried-address",paint:{"circle-color":"rgba(209, 124, 0, 0.20)","circle-radius":16}}),i.addLayer({id:"queried-pin",type:"circle",source:"queried-address",paint:{"circle-color":"#005EA2","circle-stroke-color":"#F4F6F9","circle-stroke-width":2,"circle-radius":7}}),i.addLayer({id:"queried-label",type:"symbol",source:"queried-address",layout:{"text-field":["get","label"],"text-font":["Open Sans Semibold","Arial Unicode MS Bold"],"text-size":12,"text-offset":[0,-1.6],"text-anchor":"bottom"},paint:{"text-color":"#0F172A","text-halo-color":"#F4F6F9","text-halo-width":1.5}}),ke(h,!0)})}),st(()=>{i==null||i.remove(),i=null});var S=bt(),x=r(S);vt(x,l=>ke(M,l),()=>a(M));var o=n(x,2);{var s=l=>{var b=xt(),N=r(b);t(b),C(()=>g(N,`linked: ${f()??""}`)),c(l,b)};L(o,l=>{f()&&l(s)})}t(S),C(()=>{_(S,"data-linked",f()??""),_(x,"aria-label",`Flood-exposure map for ${e.address.label??""}`)}),c(R,S),J()}const Ee=["cornerstone","keystone","touchstone","lodestone","capstone"],Ae={cornerstone:{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers"},keystone:{name:"Keystone",role:"the asset register",tag:"what's exposed"},touchstone:{name:"Touchstone",role:"the live observer",tag:"what's happening now"},lodestone:{name:"Lodestone",role:"the projector",tag:"what's coming"},capstone:{name:"Capstone",role:"the synthesizer",tag:"writes it all down with citations"}};var wt=y('<span class="layers-count svelte-1g2dety"> </span>'),kt=y('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">no map layers — see Findings cards</span></li>'),St=y('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">not a map layer</span></li>'),Mt=y('<span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span>'),Ct=y('<li><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><!></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety"> </span> <span class="layers-meta svelte-1g2dety"> <!></span></span> <span class="layers-state svelte-1g2dety"><!></span></li>'),Nt=y('<details open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety"> </span> <span class="layers-stone-tag svelte-1g2dety"> </span> <!></summary> <ul class="layers-list svelte-1g2dety"><!></ul></details>'),Bt=y('<button type="button"><!> <span> </span> <span class="layers-master-state svelte-1g2dety"> </span></button>'),Lt=y('<aside class="layers-panel svelte-1g2dety" aria-label="Map layers grouped by Stone"><div class="layers-head svelte-1g2dety"><span class="section-label">Layers · grouped by Stone</span></div> <!> <div class="layers-masters svelte-1g2dety" role="group" aria-label="Master tier toggles"><span class="section-label">Tier toggles</span> <div class="layers-master-row svelte-1g2dety"></div></div></aside>');function Yr(R,e){X(e,!0);const w={cornerstone:[{label:"Sandy Inundation Zone (2012)",source:"NYC OEM",tier:"empirical",wired:!0},{label:"FEMA / DEP scenarios",source:"FEMA · NYC DEP",tier:"modeled",wired:!0},{label:"Ida HWM points (2021)",source:"USGS STN",tier:"empirical",wired:!0},{label:"Microtopography (HAND/TWI)",source:"USGS 3DEP",tier:"proxy",wired:!1}],keystone:[{label:"MTA subway entrances",source:"MTA Open Data",tier:"empirical",wired:!0},{label:"NYCHA developments",source:"NYC OD phvi-damg",tier:"empirical",wired:!0},{label:"DOE schools",source:"NYC DOE Locations",tier:"empirical",wired:!0},{label:"DOH hospitals",source:"NYS DOH vn5v-hh5r",tier:"empirical",wired:!0},{label:"TerraMind Buildings (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!0}],touchstone:[{label:"311 flood complaints",source:"NYC 311",tier:"proxy",wired:!1},{label:"FloodNet sensors",source:"FloodNet NYC",tier:"proxy",wired:!0},{label:"TerraMind LULC (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!0},{label:"Prithvi-NYC-Pluvial flood pred.",source:"msradam/Prithvi-EO-2.0-NYC-Pluvial",tier:"modeled",wired:!0}],lodestone:[],capstone:[]};function f(S){return!!e.active[S.tier]}function M(S){return w[S].length}const i=[{k:"empirical",tier:"empirical",label:"EMP"},{k:"modeled",tier:"modeled",label:"MOD"},{k:"proxy",tier:"proxy",label:"PRX"},{k:"synthetic",tier:"synthetic",label:"SYN"}];var h=Lt(),d=n(r(h),2);te(d,16,()=>Ee,S=>S,(S,x)=>{var o=Nt(),s=r(o),l=n(r(s),2),b=r(l,!0);t(l);var N=n(l,2),u=r(N);t(N);var v=n(N,2);{var k=H=>{var U=wt(),D=r(U,!0);t(U),C(q=>g(D,q),[()=>M(x)]),c(H,U)},A=P(()=>M(x)>0);L(v,H=>{a(A)&&H(k)})}t(s);var E=n(s,2),z=r(E);{var W=H=>{var U=kt();c(H,U)},I=H=>{var U=St();c(H,U)},O=H=>{var U=Se(),D=ee(U);te(D,17,()=>w[x],ce,(q,F)=>{var T=Ct();let Y;var G=r(T),ae=r(G);ge(ae,{get tier(){return a(F).tier},size:11,get color(){return`var(--tier-${a(F).tier??""})`}}),t(G);var Q=n(G,2),Z=r(Q),le=r(Z,!0);t(Z);var pe=n(Z,2),_e=r(pe),$=n(_e);dt($,{get tier(){return a(F).tier},compact:!0}),t(pe),t(Q);var V=n(Q,2),oe=r(V);{var ue=j=>{var K=Mt();c(j,K)},ye=j=>{var K=we("on");c(j,K)},xe=P(()=>f(a(F))),B=j=>{var K=we("off");c(j,K)};L(oe,j=>{a(F).wired?a(xe)?j(ye,1):j(B,-1):j(ue)})}t(V),t(T),C(()=>{Y=he(T,1,"layers-row svelte-1g2dety",null,Y,{dim:!a(F).wired}),g(le,a(F).label),g(_e,`${a(F).source??""} · `)}),c(q,T)}),c(H,U)};L(z,H=>{x==="lodestone"?H(W):x==="capstone"?H(I,1):H(O,-1)})}t(E),t(o),C(()=>{he(o,1,`layers-group region-${x??""}`,"svelte-1g2dety"),g(b,Ae[x].name),g(u,`— ${Ae[x].tag??""}`)}),c(S,o)});var p=n(d,2),m=n(r(p),2);te(m,21,()=>i,S=>S.k,(S,x)=>{var o=Bt();let s;var l=r(o);ge(l,{get tier(){return a(x).tier},size:11,get color(){return`var(--tier-${a(x).tier??""})`}});var b=n(l,2),N=r(b,!0);t(b);var u=n(b,2),v=r(u,!0);t(u),t(o),C(()=>{s=he(o,1,"layers-master svelte-1g2dety",null,s,{"is-on":e.active[a(x).k]}),_(o,"aria-pressed",e.active[a(x).k]),g(N,a(x).label),g(v,e.active[a(x).k]?"ON":"OFF")}),Re("click",o,()=>e.onToggle(a(x).k)),c(S,o)}),t(m),t(p),t(h),c(R,h),J()}Fe(["click"]);var At=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-silent svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> silent</span>',1),Ft=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-warn svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> warned</span>',1),Rt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-err svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> errored</span>',1),Et=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-notinvoked svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> not invoked</span>',1),Tt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> cache</span>',1),Pt=y('<span class="rh-em-tok svelte-1vuwkv4"> </span>'),qt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-em svelte-1vuwkv4"><span class="rh-em-icon svelte-1vuwkv4" aria-hidden="true"> </span> <strong class="svelte-1vuwkv4"> </strong> inference <!></span>',1),Dt=y('<div class="rh svelte-1vuwkv4"><span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> Stones</span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> fired</span> <!> <!> <!> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> </span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> wall-clock</span> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-total svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> registered</span> <!></div>');function It(R,e){X(e,!0);function w(B){return B.flatMap(j=>j.children?[j,...w(j.children)]:[j])}let f=P(()=>e.stones.flatMap(B=>w(B.members))),M=P(()=>a(f).length),i=P(()=>a(f).filter(B=>B.status==="fired"||B.status==="warned").length),h=P(()=>a(f).filter(B=>B.status==="silent_by_design").length),d=P(()=>a(f).filter(B=>B.status==="warned").length),p=P(()=>a(f).filter(B=>B.status==="errored").length),m=P(()=>a(f).filter(B=>B.status==="not_invoked").length),S=P(()=>e.wallSeconds==null?"—":e.wallSeconds<1?`${Math.round(e.wallSeconds*1e3)}ms`:`${e.wallSeconds.toFixed(1)}s`),x=P(()=>{if(!e.emissions||e.emissions.total_wh===0)return null;const B=e.emissions.total_wh;return B<.1?`${e.emissions.total_mwh.toFixed(1)} mWh`:`${B.toFixed(2)} Wh`}),o=P(()=>{var j,K;const B=(K=(j=e.emissions)==null?void 0:j.tokens)==null?void 0:K.total;return B?B>=1e3?`${(B/1e3).toFixed(1)}K tok`:`${B} tok`:null}),s=P(()=>{if(!e.emissions)return null;const B=Object.values(e.emissions.by_hardware).map(j=>j.label);return B.length===1?B[0]:B.join(" + ")}),l=P(()=>e.emissions&&e.emissions.n_calls>0?(e.emissions.n_measured??0)/e.emissions.n_calls:0),b=P(()=>a(x)==null?"":a(l)>=.9?"✓":a(l)>0?"◐":"~"),N=P(()=>{if(!e.emissions)return"";const B=e.emissions.n_measured!=null?`${e.emissions.n_measured}/${e.emissions.n_calls} calls measured on GPU (others use data-sheet estimate)`:"";return[`${e.emissions.n_calls} inference calls — ${e.emissions.total_joules} J total`,a(s)?`Hardware: ${a(s)}`:"",B,e.emissions.tokens.total?`Tokens: ${e.emissions.tokens.prompt??0} prompt + ${e.emissions.tokens.completion??0} completion`:"",e.emissions.method].filter(Boolean).join(`
38
+ `)});var u=Dt(),v=r(u),k=r(v),A=r(k,!0);t(k),se(),t(v);var E=n(v,4),z=r(E),W=r(z,!0);t(z),se(),t(E);var I=n(E,2);{var O=B=>{var j=At(),K=n(ee(j),2),re=r(K),de=r(re,!0);t(re),se(),t(K),C(()=>g(de,a(h))),c(B,j)};L(I,B=>{a(h)>0&&B(O)})}var H=n(I,2);{var U=B=>{var j=Ft(),K=n(ee(j),2),re=r(K),de=r(re,!0);t(re),se(),t(K),C(()=>g(de,a(d))),c(B,j)};L(H,B=>{a(d)>0&&B(U)})}var D=n(H,2);{var q=B=>{var j=Rt(),K=n(ee(j),2),re=r(K),de=r(re,!0);t(re),se(),t(K),C(()=>g(de,a(p))),c(B,j)};L(D,B=>{a(p)>0&&B(q)})}var F=n(D,2);{var T=B=>{var j=Et(),K=n(ee(j),2),re=r(K),de=r(re,!0);t(re),se(),t(K),C(()=>g(de,a(m))),c(B,j)};L(F,B=>{a(m)>0&&B(T)})}var Y=n(F,4),G=r(Y),ae=r(G,!0);t(G);var Q=n(G);t(Y);var Z=n(Y,4),le=r(Z),pe=r(le,!0);t(le),se(),t(Z);var _e=n(Z,2);{var $=B=>{var j=Tt(),K=n(ee(j),2),re=r(K),de=r(re);t(re),se(),t(K),C(be=>g(de,`${be??""}%`),[()=>Math.round(e.cacheHit*100)]),c(B,j)};L(_e,B=>{e.cacheHit!=null&&B($)})}var V=n(_e,4),oe=r(V),ue=r(oe,!0);t(oe),se(),t(V);var ye=n(V,2);{var xe=B=>{var j=qt(),K=n(ee(j),2),re=r(K),de=r(re,!0);t(re);var be=n(re,2),je=r(be,!0);t(be);var Ye=n(be,2);{var We=Me=>{var Ce=Pt(),Ue=r(Ce);t(Ce),C(()=>g(Ue,`/ ${a(o)??""}`)),c(Me,Ce)};L(Ye,Me=>{a(o)&&Me(We)})}t(K),C(()=>{_(K,"title",a(N)),g(de,a(b)),g(je,a(x))}),c(B,j)};L(ye,B=>{a(x)&&B(xe)})}t(u),C(()=>{g(A,e.stones.length),g(W,a(i)),g(ae,e.cards.length),g(Q,` evidence card${e.cards.length===1?"":"s"}`),g(pe,a(S)),g(ue,a(M))}),c(R,u),J()}var zt=y('<div class="subhead svelte-lygj3j"> </div>'),Ot=y('<p class="body-prose svelte-lygj3j"> </p>'),Ht=y('<div class="body body-headline svelte-lygj3j"><div class="headline svelte-lygj3j"> </div> <!> <!></div>');function jt(R,e){X(e,!0);var w=Ht(),f=r(w),M=r(f,!0);t(f);var i=n(f,2);{var h=m=>{var S=zt(),x=r(S,!0);t(S),C(()=>g(x,e.card.subhead)),c(m,S)};L(i,m=>{e.card.subhead&&m(h)})}var d=n(i,2);{var p=m=>{var S=Ot(),x=r(S,!0);t(S),C(()=>g(x,e.card.body)),c(m,S)};L(d,m=>{e.card.body&&m(p)})}t(w),C(()=>{ve(f,`color: var(--tier-${e.card.tier??""});`),g(M,e.card.headline??"")}),c(R,w),J()}var Yt=y('<th class="svelte-1nlkuao"> </th>'),Wt=y('<td class="svelte-1nlkuao"> </td>'),Ut=y('<tr class="svelte-1nlkuao"></tr>'),Gt=y('<div class="body-sub svelte-1nlkuao"> </div>'),Kt=y('<div class="body body-tabular svelte-1nlkuao"><table class="t svelte-1nlkuao"><thead><tr></tr></thead><tbody></tbody></table> <!></div>');function Qt(R,e){X(e,!0);var w=Kt(),f=r(w),M=r(f),i=r(M);te(i,21,()=>e.card.columns??[],ce,(m,S)=>{var x=Yt(),o=r(x,!0);t(x),C(()=>g(o,a(S))),c(m,x)}),t(i),t(M);var h=n(M);te(h,21,()=>e.card.rows??[],ce,(m,S)=>{var x=Ut();te(x,21,()=>a(S),ce,(o,s)=>{var l=Wt(),b=r(l,!0);t(l),C(()=>g(b,a(s))),c(o,l)}),t(x),c(m,x)}),t(h),t(f);var d=n(f,2);{var p=m=>{var S=Gt(),x=r(S,!0);t(S),C(()=>g(x,e.card.sub)),c(m,S)};L(d,m=>{e.card.sub&&m(p)})}t(w),c(R,w),J()}var Vt=y('<div class="cell svelte-stf9c8"><div class="value svelte-stf9c8"> </div> <div class="label svelte-stf9c8"> </div></div>'),Zt=y('<div class="body-sub svelte-stf9c8"> </div>'),Xt=y('<div class="body body-scalars svelte-stf9c8"><div class="row svelte-stf9c8"></div> <!></div>');function Jt(R,e){X(e,!0);var w=Xt(),f=r(w);te(f,21,()=>e.card.scalars??[],ce,(h,d)=>{var p=Vt(),m=r(p),S=r(m,!0);t(m);var x=n(m,2),o=r(x,!0);t(x),t(p),C(()=>{ve(m,`color: var(--tier-${e.card.tier??""});`),g(S,a(d).value),g(o,a(d).label)}),c(h,p)}),t(f);var M=n(f,2);{var i=h=>{var d=Zt(),p=r(d,!0);t(d),C(()=>g(p,e.card.sub)),c(h,d)};L(M,h=>{e.card.sub&&h(i)})}t(w),c(R,w),J()}var $t=y('<div class="headline svelte-jrppts"> </div>'),ea=y('<div class="subhead svelte-jrppts"> </div>'),ta=fe("<rect></rect>"),aa=y('<div class="body-sub svelte-jrppts"> </div>'),ra=y('<div class="body-sub svelte-jrppts"> </div>'),sa=y('<div class="body body-spark svelte-jrppts"><!> <!> <svg width="100%" preserveAspectRatio="none" aria-hidden="true" class="svelte-jrppts"></svg> <!> <!></div>');function ia(R,e){X(e,!0);const w=240,f=38;let M=P(()=>e.card.spark??e.card.histogram??[]),i=P(()=>Math.max(...a(M),1)),h=P(()=>a(M).length),d=P(()=>Math.max(2,w/Math.max(a(h),1)-1.5));var p=sa(),m=r(p);{var S=v=>{var k=$t(),A=r(k,!0);t(k),C(()=>{ve(k,`color: var(--tier-${e.card.tier??""});`),g(A,e.card.headline)}),c(v,k)};L(m,v=>{e.card.headline&&v(S)})}var x=n(m,2);{var o=v=>{var k=ea(),A=r(k,!0);t(k),C(()=>g(A,e.card.subhead)),c(v,k)};L(x,v=>{e.card.subhead&&v(o)})}var s=n(x,2);_(s,"viewBox","0 0 240 38"),_(s,"height",f),te(s,21,()=>a(M),ce,(v,k,A)=>{var E=ta();C(()=>{_(E,"x",A/a(h)*w+.5),_(E,"y",f-a(k)/a(i)*f),_(E,"width",a(d)),_(E,"height",a(k)/a(i)*f),_(E,"fill",`var(--tier-${e.card.tier??""})`)}),c(v,E)}),t(s);var l=n(s,2);{var b=v=>{var k=aa(),A=r(k,!0);t(k),C(()=>g(A,e.card.sparkSub)),c(v,k)};L(l,v=>{e.card.sparkSub&&v(b)})}var N=n(l,2);{var u=v=>{var k=ra(),A=r(k,!0);t(k),C(()=>g(A,e.card.sub)),c(v,k)};L(N,v=>{!e.card.sparkSub&&e.card.sub&&v(u)})}t(p),c(R,p),J()}var na=y('<span class="headline svelte-48vbub"> </span>'),la=y('<span class="subhead svelte-48vbub"> </span>'),oa=y('<span class="spatial-note svelte-48vbub"> </span>'),da=y("<span> </span>"),va=y('<div class="body-sub svelte-48vbub"><!> <!></div>'),ca=y('<div class="body body-timeseries svelte-48vbub"><div class="ts-header svelte-48vbub"><!> <!></div> <svg width="100%" aria-hidden="true" class="svelte-48vbub"><line stroke="#C9C9C5" stroke-width="0.5" stroke-dasharray="2 2"></line><path fill="none" stroke-width="1.4"></path><circle r="3"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle"> </text><text font-size="8" font-family="IBM Plex Mono" fill="#6B6B6B">now</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B"> </text></svg> <!></div>');function Ie(R,e){X(e,!0);const w=240,f=84,M=6,i=P(()=>e.card.timeseries??{hours:96,peak:{x:38,y:47},peakLabel:""}),h=P(()=>m(a(i))),d=P(()=>S(a(h),a(i))),p=P(()=>x(a(h),a(d)));function m(q){const F=[];for(let T=0;T<=q.hours;T++){const Y=6*Math.sin(T/12.42*Math.PI*2),G=38*Math.exp(-Math.pow((T-q.peak.x)/12,2));F.push({x:T,y:Y+G+4})}return F}function S(q,F){const T=Math.max(...q.map(G=>G.y),F.peak.y),Y=Math.min(...q.map(G=>G.y),-10);return{sx:G=>M+G/F.hours*(w-M*2),sy:G=>f-M-14-(G-Y)/(T-Y)*(f-M*2-14)}}function x(q,F){return q.map((T,Y)=>`${Y?"L":"M"} ${F.sx(T.x)} ${F.sy(T.y)}`).join(" ")}var o=ca(),s=r(o),l=r(s);{var b=q=>{var F=na(),T=r(F,!0);t(F),C(()=>{ve(F,`color: var(--tier-${e.card.tier??""});`),g(T,e.card.headline)}),c(q,F)};L(l,q=>{e.card.headline&&q(b)})}var N=n(l,2);{var u=q=>{var F=la(),T=r(F,!0);t(F),C(()=>g(T,e.card.subhead)),c(q,F)};L(N,q=>{e.card.subhead&&q(u)})}t(s);var v=n(s,2);_(v,"viewBox","0 0 240 84"),_(v,"height",f);var k=r(v);_(k,"x1",M),_(k,"x2",w-M);var A=n(k),E=n(A),z=n(E),W=r(z,!0);t(z);var I=n(z);_(I,"x",M),_(I,"y",f-2);var O=n(I);_(O,"x",w-M),_(O,"y",f-2);var H=r(O);t(O),t(v);var U=n(v,2);{var D=q=>{var F=va(),T=r(F);{var Y=Q=>{var Z=oa(),le=r(Z,!0);t(Z),C(()=>g(le,e.card.spatialNote)),c(Q,Z)};L(T,Q=>{e.card.spatialNote&&Q(Y)})}var G=n(T,2);{var ae=Q=>{var Z=da(),le=r(Z,!0);t(Z),C(()=>g(le,e.card.sub)),c(Q,Z)};L(G,Q=>{e.card.sub&&Q(ae)})}t(F),c(q,F)};L(U,q=>{(e.card.spatialNote||e.card.sub)&&q(D)})}t(o),C((q,F,T,Y,G,ae)=>{_(k,"y1",q),_(k,"y2",F),_(A,"d",a(p)),_(A,"stroke",`var(--tier-${e.card.tier??""})`),_(E,"cx",T),_(E,"cy",Y),_(E,"fill",`var(--tier-${e.card.tier??""})`),_(z,"x",G),_(z,"y",ae),_(z,"fill",`var(--tier-${e.card.tier??""})`),g(W,a(i).peakLabel),g(H,`+${a(i).hours??""}h`)},[()=>a(d).sy(0),()=>a(d).sy(0),()=>a(d).sx(a(i).peak.x),()=>a(d).sy(a(i).peak.y),()=>a(d).sx(a(i).peak.x),()=>a(d).sy(a(i).peak.y)-6]),c(R,o),J()}var ua=y('<span class="ft-stat svelte-1y25lfh"><span class="ft-stat-k svelte-1y25lfh">RMSE</span> </span>'),ma=y('<span class="ft-stat ft-skill svelte-1y25lfh"> </span>'),ha=y('<span class="ft-badge svelte-1y25lfh" title="Trained on this hardware"> </span>'),ga=y('<a class="ft-link svelte-1y25lfh" target="_blank" rel="noopener noreferrer">Model card ↗</a>'),fa=y('<!> <div class="ft-footer svelte-1y25lfh"><!> <!> <!> <!></div>',1);function _a(R,e){X(e,!0);var w=fa(),f=ee(w);Ie(f,{get card(){return e.card}});var M=n(f,2),i=r(M);{var h=s=>{var l=ua(),b=n(r(l));t(l),C(()=>g(b,` ${e.card.rmse??""}`)),c(s,l)};L(i,s=>{e.card.rmse&&s(h)})}var d=n(i,2);{var p=s=>{var l=ma(),b=r(l,!0);t(l),C(()=>g(b,e.card.skillVsPersistence)),c(s,l)};L(d,s=>{e.card.skillVsPersistence&&s(p)})}var m=n(d,2);{var S=s=>{var l=ha(),b=r(l,!0);t(l),C(()=>g(b,e.card.hardwareBadge)),c(s,l)};L(m,s=>{e.card.hardwareBadge&&s(S)})}var x=n(m,2);{var o=s=>{var l=ga();C(b=>_(l,"href",b),[()=>e.card.hfModelCard.startsWith("http")?e.card.hfModelCard:`https://${e.card.hfModelCard}`]),c(s,l)};L(x,s=>{e.card.hfModelCard&&s(o)})}t(M),c(R,w),J()}var ya=fe('<circle r="2.2"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle" fill="#6B6B6B"> </text>',1),pa=y('<div class="body-sub svelte-gqkhpe"> </div>'),xa=y('<div class="body body-forecast svelte-gqkhpe"><svg width="100%" aria-hidden="true" class="svelte-gqkhpe"><path fill-opacity="0.18"></path><path fill="none" stroke-width="1.5"></path><!></svg> <!></div>');function ba(R,e){X(e,!0);const w=240,f=88,M=6;let i=P(()=>e.card.forecast??[]),h=P(()=>a(i).map((v,k)=>M+k/Math.max(a(i).length-1,1)*(w-M*2))),d=P(()=>Math.max(...a(i).map(v=>v.high),1));function p(v){return f-M-v/a(d)*(f-M*2-12)}let m=P(()=>a(h).map((v,k)=>`${k?"L":"M"} ${v} ${p(a(i)[k].mid)}`).join(" ")),S=P(()=>{if(!a(i).length)return"";const v=a(h).map((A,E)=>`${A} ${p(a(i)[E].low)}`).join(" L "),k=[...a(h)].reverse().map((A,E)=>`${A} ${p(a(i)[a(i).length-1-E].high)}`).join(" L ");return`M ${v} L ${k} Z`});var x=xa(),o=r(x);_(o,"viewBox","0 0 240 88"),_(o,"height",f);var s=r(o),l=n(s),b=n(l);te(b,17,()=>a(i),ce,(v,k,A)=>{var E=ya(),z=ee(E),W=n(z);_(W,"y",f-1);var I=r(W,!0);t(W),C(O=>{_(z,"cx",a(h)[A]),_(z,"cy",O),_(z,"fill",`var(--tier-${e.card.tier??""})`),_(W,"x",a(h)[A]),g(I,a(k).year)},[()=>p(a(k).mid)]),c(v,E)}),t(o);var N=n(o,2);{var u=v=>{var k=pa(),A=r(k,!0);t(k),C(()=>g(A,e.card.sub)),c(v,k)};L(N,v=>{e.card.sub&&v(u)})}t(x),C(()=>{_(s,"d",a(S)),_(s,"fill",`var(--tier-${e.card.tier??""})`),_(l,"d",a(m)),_(l,"stroke",`var(--tier-${e.card.tier??""})`)}),c(R,x),J()}var wa=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M20 50 Q 60 38 90 56 Q 120 76 150 64 Q 180 50 180 86 Q 130 100 70 96 Q 30 92 20 76 Z" fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7"></path><path d="M40 60 Q 80 54 110 70 Q 140 84 160 78 Q 165 90 130 92 Q 80 90 50 82 Z" fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6"></path><circle cx="120" cy="74" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr · MOD</text></svg>'),ka=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z" fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2"></path><circle cx="120" cy="60" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding · MOD</text></svg>'),Sa=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><defs><pattern id="rt-s2-rgb" x="0" y="0" width="6" height="6" patternUnits="userSpaceOnUse"><rect width="6" height="6" fill="#7A8E6A"></rect><rect x="0" y="0" width="3" height="3" fill="#8D9C7A"></rect><rect x="3" y="3" width="3" height="3" fill="#69795D"></rect></pattern></defs><rect fill="url(#rt-s2-rgb)"></rect><rect x="0" y="55" height="6" fill="#A8A496"></rect><rect x="115" y="0" width="8" fill="#A8A496"></rect><ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65"></ellipse><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">PRITHVI · 0.3%</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text></svg>'),Ma=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><rect x="0" y="0" width="80" height="60" fill="#C66"></rect><rect x="80" y="0" width="60" height="60" fill="#C66"></rect><rect x="140" y="0" width="100" height="38" fill="#C66"></rect><rect x="140" y="38" width="100" height="22" fill="#5B7FB4"></rect><rect x="0" y="60" width="100" height="60" fill="#C66"></rect><rect x="100" y="60" width="50" height="40" fill="#5B8A4A"></rect><rect x="150" y="60" width="50" height="60" fill="#D9C75A"></rect><rect x="200" y="60" width="40" height="60" fill="#C66"></rect><rect x="100" y="100" width="50" height="20" fill="#A89A78"></rect><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">LULC · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text></svg>'),Ca=fe('<rect fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4"></rect>'),Na=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#3A3A38"></rect><!><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">BLDG · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">36.2% built</text></svg>'),Ba=y('<div class="thumb-placeholder svelte-1lx1psy">raster preview</div>');function ze(R,e){var M=Se(),i=ee(M);{var h=o=>{var s=wa();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l),N=r(b);_(N,"x2",240);var u=n(N);_(u,"x2",240);var v=n(u);_(v,"y2",120);var k=n(v);_(k,"y2",120),t(b);var A=n(b,4);_(A,"x",234),_(A,"y",115),t(s),c(o,s)},d=o=>{var s=ka();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l),N=r(b);_(N,"x2",240);var u=n(N);_(u,"x2",240);var v=n(u);_(v,"y2",120);var k=n(v);_(k,"y2",120),t(b);var A=n(b,3);_(A,"x",234),_(A,"y",115),t(s),c(o,s)},p=o=>{var s=Sa();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=n(r(s));_(l,"width",240),_(l,"height",120);var b=n(l);_(b,"width",240);var N=n(b);_(N,"height",120);var u=n(N,3);_(u,"x",234),_(u,"y",115),t(s),c(o,s)},m=o=>{var s=Ma();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l,11);_(b,"x",234),_(b,"y",115),t(s),c(o,s)},S=o=>{var s=Na();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l);te(b,16,()=>[[10,10,28,18],[42,10,30,16],[78,10,40,22],[124,10,32,18],[162,10,30,18],[198,10,32,18],[10,32,28,16],[42,30,30,18],[124,32,32,16],[162,32,30,16],[198,32,32,16],[10,55,28,18],[42,55,30,18],[78,55,40,18],[124,55,32,18],[162,55,30,18],[198,55,32,18],[10,80,28,16],[42,80,30,16],[78,80,40,16],[124,80,32,16],[162,80,30,16],[10,100,28,12],[42,100,30,12],[78,100,40,12]],ce,(u,v)=>{var k=Ca();C(()=>{_(k,"x",v[0]),_(k,"y",v[1]),_(k,"width",v[2]),_(k,"height",v[3])}),c(u,k)});var N=n(b,2);_(N,"x",234),_(N,"y",115),t(s),c(o,s)},x=o=>{var s=Ba();c(o,s)};L(i,o=>{e.kind==="stormwater"?o(h):e.kind==="stormwater-dry"?o(d,1):e.kind==="prithvi"?o(p,2):e.kind==="lulc"?o(m,3):e.kind==="buildings"?o(S,4):o(x,-1)})}c(R,M)}var La=y('<span class="illustrative svelte-1m43x1m" title="Illustrative rendering, not source pixels">illustrative</span>'),Aa=y('<span class="svelte-1m43x1m"> </span>'),Fa=y('<div class="raster-headline svelte-1m43x1m"><span class="svelte-1m43x1m"> </span> <!></div>'),Ra=y('<div class="body-sub svelte-1m43x1m"> </div>'),Ea=y('<div class="body body-raster svelte-1m43x1m"><div class="frame svelte-1m43x1m"><!> <!></div> <!> <!></div>');function Ta(R,e){X(e,!0);var w=Ea(),f=r(w),M=r(f);ze(M,{get kind(){return e.card.rasterKind}});var i=n(M,2);{var h=x=>{var o=La();c(x,o)};L(i,x=>{(e.card.illustrative||e.card.tier==="synthetic")&&x(h)})}t(f);var d=n(f,2);{var p=x=>{var o=Fa(),s=r(o),l=r(s,!0);t(s);var b=n(s,2);{var N=u=>{var v=Aa(),k=r(v);t(v),C(()=>g(k,`· ${e.card.subhead??""}`)),c(u,v)};L(b,u=>{e.card.subhead&&u(N)})}t(o),C(()=>{ve(s,`color: var(--tier-${e.card.tier??""});`),g(l,e.card.headline)}),c(x,o)};L(d,x=>{e.card.headline&&x(p)})}var m=n(d,2);{var S=x=>{var o=Ra(),s=r(o,!0);t(o),C(()=>g(s,e.card.sub)),c(x,o)};L(m,x=>{e.card.sub&&x(S)})}t(w),c(R,w),J()}var Pa=y('<span class="illustrative svelte-1td276x" title="Illustrative rendering, not source pixels">illustrative</span>'),qa=y('<span class="bar-seg svelte-1td276x"></span>'),Da=y('<li class="svelte-1td276x"><span class="swatch svelte-1td276x"></span> <span class="legend-k svelte-1td276x"> </span> <span class="legend-pct svelte-1td276x"> </span></li>'),Ia=y('<div class="bar svelte-1td276x" role="img" aria-label="LULC class mix"></div> <ul class="legend svelte-1td276x"></ul>',1),za=y('<div class="body-sub svelte-1td276x"> </div>'),Oa=y('<div class="body body-lulc svelte-1td276x"><div class="frame svelte-1td276x"><!> <!></div> <!> <!></div>');function Ha(R,e){X(e,!0);let w=P(()=>(e.card.classMix??[]).reduce((o,s)=>o+(s.pct||0),0)||1);var f=Oa(),M=r(f),i=r(M);{let o=P(()=>e.card.rasterKind??"lulc");ze(i,{get kind(){return a(o)}})}var h=n(i,2);{var d=o=>{var s=Pa();c(o,s)};L(h,o=>{(e.card.illustrative||e.card.tier==="synthetic")&&o(d)})}t(M);var p=n(M,2);{var m=o=>{var s=Ia(),l=ee(s);te(l,21,()=>e.card.classMix,N=>N.k,(N,u)=>{var v=qa();let k;C(()=>{_(v,"title",`${a(u).k??""}: ${a(u).pct??""}%`),k=ve(v,"",k,{"flex-grow":a(u).pct/a(w),background:a(u).color})}),c(N,v)}),t(l);var b=n(l,2);te(b,21,()=>e.card.classMix,N=>N.k,(N,u)=>{var v=Da(),k=r(v);let A;var E=n(k,2),z=r(E,!0);t(E);var W=n(E,2),I=r(W);t(W),t(v),C(()=>{A=ve(k,"",A,{background:a(u).color}),g(z,a(u).k),g(I,`${a(u).pct??""}%`)}),c(N,v)}),t(b),c(o,s)};L(p,o=>{var s;(s=e.card.classMix)!=null&&s.length&&o(m)})}var S=n(p,2);{var x=o=>{var s=za(),l=r(s,!0);t(s),C(()=>g(l,e.card.sub)),c(o,s)};L(S,o=>{e.card.sub&&o(x)})}t(f),c(R,f),J()}var ja=y('<span class="reg-label svelte-1iup6im"> </span> <span class="reg-source svelte-1iup6im"> </span>',1),Ya=y('<span class="reg-silent svelte-1iup6im"> </span>'),Wa=y('<li><span class="reg-tag svelte-1iup6im"><!> <span> </span></span> <!></li>'),Ua=y('<div class="body-sub svelte-1iup6im"> </div>'),Ga=y('<div class="body body-register svelte-1iup6im"><ul class="reg-list svelte-1iup6im"></ul> <!></div>');function Ka(R,e){X(e,!0);var w=Ga(),f=r(w);te(f,21,()=>e.card.registers??[],ce,(h,d)=>{var p=Wa();let m;var S=r(p),x=r(S);ge(x,{get tier(){return a(d).tier},size:9,get color(){return`var(--tier-${a(d).tier??""})`}});var o=n(x,2),s=r(o,!0);t(o),t(S);var l=n(S,2);{var b=u=>{var v=ja(),k=ee(v),A=r(k,!0);t(k);var E=n(k,2),z=r(E,!0);t(E),C(()=>{_(k,"title",a(d).detail?`${a(d).label} — ${a(d).detail}`:a(d).label),g(A,a(d).label),g(z,a(d).sourceId??"")}),c(u,v)},N=u=>{var v=Ya(),k=r(v,!0);t(v),C(()=>g(k,a(d).note)),c(u,v)};L(l,u=>{a(d).label?u(b):u(N,-1)})}t(p),C(()=>{m=he(p,1,"reg-row svelte-1iup6im",null,m,{silent:!a(d).label}),_(S,"title",a(d).tier),g(s,a(d).reg)}),c(h,p)}),t(f);var M=n(f,2);{var i=h=>{var d=Ua(),p=r(d,!0);t(d),C(()=>g(p,e.card.sub)),c(h,d)};L(M,h=>{e.card.sub&&h(i)})}t(w),c(R,w),J()}var Qa=y('<div class="cell-aux svelte-1swqabu"> </div>'),Va=y('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Za=y('<div class="cell-aux svelte-1swqabu"> </div>'),Xa=y('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Ja=y('<div class="cmp-delta svelte-1swqabu"> </div>'),$a=y('<div class="body-sub svelte-1swqabu"> </div>'),er=y('<div class="body body-comparison svelte-1swqabu"><div class="cmp-grid svelte-1swqabu"><!> <div class="divider svelte-1swqabu" aria-hidden="true">vs</div> <!></div> <!> <!></div>');function tr(R,e){X(e,!0);var w=er(),f=r(w),M=r(f);{var i=o=>{var s=Va(),l=r(s),b=r(l);ge(b,{get tier(){return e.card.left.tier},size:10,get color(){return`var(--tier-${e.card.left.tier??""})`}});var N=n(b,2),u=r(N,!0);t(N),t(l);var v=n(l,2),k=r(v,!0);t(v);var A=n(v,2);{var E=z=>{var W=Qa(),I=r(W,!0);t(W),C(()=>g(I,e.card.left.aux)),c(z,W)};L(A,z=>{e.card.left.aux&&z(E)})}t(s),C(()=>{g(u,e.card.left.label),ve(v,`color: var(--tier-${e.card.left.tier??""});`),g(k,e.card.left.value)}),c(o,s)};L(M,o=>{e.card.left&&o(i)})}var h=n(M,4);{var d=o=>{var s=Xa(),l=r(s),b=r(l);ge(b,{get tier(){return e.card.right.tier},size:10,get color(){return`var(--tier-${e.card.right.tier??""})`}});var N=n(b,2),u=r(N,!0);t(N),t(l);var v=n(l,2),k=r(v,!0);t(v);var A=n(v,2);{var E=z=>{var W=Za(),I=r(W,!0);t(W),C(()=>g(I,e.card.right.aux)),c(z,W)};L(A,z=>{e.card.right.aux&&z(E)})}t(s),C(()=>{g(u,e.card.right.label),ve(v,`color: var(--tier-${e.card.right.tier??""});`),g(k,e.card.right.value)}),c(o,s)};L(h,o=>{e.card.right&&o(d)})}t(f);var p=n(f,2);{var m=o=>{var s=Ja(),l=r(s,!0);t(s),C(()=>g(l,e.card.delta)),c(o,s)};L(p,o=>{e.card.delta&&o(m)})}var S=n(p,2);{var x=o=>{var s=$a(),l=r(s,!0);t(s),C(()=>g(l,e.card.sub)),c(o,s)};L(S,o=>{e.card.sub&&o(x)})}t(w),c(R,w),J()}var ar=y('<div class="meta-row svelte-e40scu"><dt class="svelte-e40scu"> </dt> <dd class="svelte-e40scu"> </dd></div>'),rr=y('<div class="body-sub svelte-e40scu"> </div>'),sr=y('<div class="body body-meta svelte-e40scu"><dl class="meta-list svelte-e40scu"></dl> <!></div>');function ir(R,e){X(e,!0);var w=sr(),f=r(w);te(f,21,()=>e.card.metaRows??[],ce,(h,d)=>{var p=ar(),m=r(p),S=r(m,!0);t(m);var x=n(m,2),o=r(x,!0);t(x),t(p),C(()=>{g(S,a(d).k),g(o,a(d).v)}),c(h,p)}),t(f);var M=n(f,2);{var i=h=>{var d=rr(),p=r(d,!0);t(d),C(()=>g(p,e.card.sub)),c(h,d)};L(M,h=>{e.card.sub&&h(i)})}t(w),c(R,w),J()}var nr=y('<div class="unknown svelte-1x6xqhh"> </div>');function lr(R,e){X(e,!0);var w=Se(),f=ee(w);{var M=u=>{jt(u,{get card(){return e.card}})},i=u=>{Qt(u,{get card(){return e.card}})},h=u=>{Jt(u,{get card(){return e.card}})},d=u=>{ia(u,{get card(){return e.card}})},p=u=>{Ie(u,{get card(){return e.card}})},m=u=>{_a(u,{get card(){return e.card}})},S=u=>{ba(u,{get card(){return e.card}})},x=u=>{Ta(u,{get card(){return e.card}})},o=u=>{Ha(u,{get card(){return e.card}})},s=u=>{Ka(u,{get card(){return e.card}})},l=u=>{tr(u,{get card(){return e.card}})},b=u=>{ir(u,{get card(){return e.card}})},N=u=>{var v=nr(),k=r(v);t(v),C(()=>g(k,`unknown variant: ${e.card.variant??""}`)),c(u,v)};L(f,u=>{e.card.variant==="headline"?u(M):e.card.variant==="tabular"?u(i,1):e.card.variant==="scalars"?u(h,2):e.card.variant==="spark"||e.card.variant==="histogram"?u(d,3):e.card.variant==="timeseries"?u(p,4):e.card.variant==="timeseries-ft"?u(m,5):e.card.variant==="forecast"?u(S,6):e.card.variant==="raster"||e.card.variant==="raster-pred"?u(x,7):e.card.variant==="lulc"?u(o,8):e.card.variant==="register"?u(s,9):e.card.variant==="comparison"?u(l,10):e.card.variant==="meta"?u(b,11):u(N,-1)})}c(R,w),J()}var or=y('<button type="button" class="fc-foot-cite svelte-1nuvnzu"><span class="fc-foot-docid svelte-1nuvnzu"> </span> <span class="fc-foot-arrow svelte-1nuvnzu" aria-hidden="true">→</span></button>'),dr=y('<span class="fc-foot-docid fc-foot-docid-mute svelte-1nuvnzu"> </span>'),vr=y('<header class="fc-head svelte-1nuvnzu"><div class="fc-head-source svelte-1nuvnzu"><!> <span class="fc-head-source-label svelte-1nuvnzu"> </span></div> <span class="fc-head-vintage svelte-1nuvnzu"> </span></header> <h4 class="fc-title svelte-1nuvnzu"> </h4> <!> <footer class="fc-foot svelte-1nuvnzu"><!> <span><!> <span> </span></span></footer>',1);function Oe(R,e){X(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"linkedKey",3,null),M=P(()=>f()!=null&&e.card.mapLayer!=null&&e.card.mapLayer===f()),i=P(()=>qe[e.card.tier].short),h=P(()=>e.card.mapLayer!=null);function d(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,e.card.mapLayer))}function p(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,null))}function m(s){var l;s.stopPropagation(),e.card.citeId&&((l=e.onCite)==null||l.call(e,e.card.citeId))}function S(s){var l;a(h)&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(l=e.onLink)==null||l.call(e,e.card.mapLayer??null))}var x=Se(),o=ee(x);mt(o,()=>a(h)?"button":"article",!1,(s,l)=>{nt(s,()=>({type:a(h)?"button":void 0,role:a(h)?"button":"article",class:`fc fc-${e.card.variant??""} fc-tier-${e.card.tier??""}`,"aria-labelledby":`fc-${e.card.id}-title`,"aria-label":`${qe[e.card.tier].label} card · ${e.card.title} · ${e.card.source}`,onpointerenter:d,onpointerleave:p,onfocus:d,onblur:p,onkeydown:S,[lt]:{"is-compact":w()==="compact","is-linked":a(M),"is-interactive":a(h),"has-illustrative":e.card.illustrative||e.card.tier==="synthetic"||e.card.variant==="comparison"}}),void 0,void 0,void 0,"svelte-1nuvnzu");var b=vr(),N=ee(b),u=r(N),v=r(u);ge(v,{get tier(){return e.card.tier},size:11,get color(){return`var(--tier-${e.card.tier??""})`}});var k=n(v,2),A=r(k,!0);t(k),t(u);var E=n(u,2),z=r(E);t(E),t(N);var W=n(N,2),I=r(W,!0);t(W);var O=n(W,2);lr(O,{get card(){return e.card}});var H=n(O,2),U=r(H);{var D=ae=>{var Q=or(),Z=r(Q),le=r(Z,!0);t(Z),se(2),t(Q),C(()=>{_(Q,"title",`Open ${e.card.docId} in citation drawer`),g(le,e.card.docId)}),Re("click",Q,m),c(ae,Q)},q=ae=>{var Q=dr(),Z=r(Q,!0);t(Q),C(()=>g(Z,e.card.docId)),c(ae,Q)};L(U,ae=>{e.card.citeId?ae(D):ae(q,-1)})}var F=n(U,2),T=r(F);ge(T,{get tier(){return e.card.tier},size:9,get color(){return`var(--tier-${e.card.tier??""})`}});var Y=n(T,2),G=r(Y,!0);t(Y),t(F),t(H),C(()=>{_(k,"title",e.card.agency),g(A,e.card.source),g(z,`v. ${e.card.vintage??""}`),_(W,"id",`fc-${e.card.id}-title`),g(I,e.card.title),he(F,1,`fc-tier-badge fc-tier-badge-${e.card.tier??""}`,"svelte-1nuvnzu"),_(F,"aria-label",`epistemic tier ${a(i)}`),g(G,a(i))}),c(l,b)}),c(R,x),J()}Fe(["click"]);var cr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="silent svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> silent</span>',1),ur=y('<span class="sep svelte-1qqbvs2">·</span> <span class="warn svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> warn</span>',1),mr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="err svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> errored</span>',1),hr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="notinvoked svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> not invoked</span>',1),gr=y('<span class="tally svelte-1qqbvs2"><span class="cards"> </span> <span class="sep svelte-1qqbvs2">·</span> <span class="fired"><strong class="svelte-1qqbvs2"> </strong> fired</span> <!> <!> <!> <!> <span class="sep svelte-1qqbvs2">·</span> <span class="ms"><strong class="svelte-1qqbvs2"> </strong></span></span>');function fr(R,e){X(e,!0);function w(D){return D.flatMap(q=>q.children?[q,...w(q.children)]:[q])}let f=P(()=>w(e.members)),M=P(()=>a(f).filter(D=>D.status==="fired"||D.status==="warned").length),i=P(()=>a(f).filter(D=>D.status==="silent_by_design").length),h=P(()=>a(f).filter(D=>D.status==="warned").length),d=P(()=>a(f).filter(D=>D.status==="errored").length),p=P(()=>a(f).filter(D=>D.status==="not_invoked").length),m=P(()=>e.members.reduce((D,q)=>Math.max(D,q.ms??0),0));function S(D){return D===0?"—":D<1e3?`${D}ms`:`${(D/1e3).toFixed(1)}s`}var x=gr(),o=r(x),s=r(o);t(o);var l=n(o,4),b=r(l),N=r(b,!0);t(b),se(),t(l);var u=n(l,2);{var v=D=>{var q=cr(),F=n(ee(q),2),T=r(F),Y=r(T,!0);t(T),se(),t(F),C(()=>g(Y,a(i))),c(D,q)};L(u,D=>{a(i)>0&&D(v)})}var k=n(u,2);{var A=D=>{var q=ur(),F=n(ee(q),2),T=r(F),Y=r(T,!0);t(T),se(),t(F),C(()=>g(Y,a(h))),c(D,q)};L(k,D=>{a(h)>0&&D(A)})}var E=n(k,2);{var z=D=>{var q=mr(),F=n(ee(q),2),T=r(F),Y=r(T,!0);t(T),se(),t(F),C(()=>g(Y,a(d))),c(D,q)};L(E,D=>{a(d)>0&&D(z)})}var W=n(E,2);{var I=D=>{var q=hr(),F=n(ee(q),2),T=r(F),Y=r(T,!0);t(T),se(),t(F),C(()=>g(Y,a(p))),c(D,q)};L(W,D=>{a(p)>0&&D(I)})}var O=n(W,4),H=r(O),U=r(H,!0);t(H),t(O),t(x),C(D=>{g(s,`${e.cardCount??""} card${e.cardCount===1?"":"s"}`),g(N,a(M)),g(U,D)},[()=>S(a(m))]),c(R,x),J()}var _r=y('<span class="prov-tier svelte-qakefz"><!></span>'),yr=y('<span class="prov-note svelte-qakefz"> </span>'),pr=y('<span class="prov-ms svelte-qakefz"> </span>'),xr=y('<li class="prov-children svelte-qakefz"><!></li>'),br=y('<li><span class="prov-pip svelte-qakefz" aria-hidden="true"> </span> <span class="prov-id svelte-qakefz"> </span> <!> <span class="prov-name svelte-qakefz"> </span> <!> <!></li> <!>',1),wr=y('<ul class="prov-tree svelte-qakefz"></ul>');function He(R,e){X(e,!0);let w=ne(e,"depth",3,0);function f(h){return{fired:"●",silent_by_design:"○",warned:"▲",errored:"■",not_invoked:"□"}[h]}function M(h){return h.status==="warned"?"#B7791F":h.status==="errored"?"#B91C1C":h.status==="silent_by_design"||h.status==="not_invoked"?"var(--ink-tertiary)":h.tier?`var(--tier-${h.tier})`:"var(--ink)"}var i=wr();te(i,21,()=>e.members,h=>h.id,(h,d)=>{var p=br(),m=ee(p),S=r(m),x=r(S,!0);t(S);var o=n(S,2),s=r(o,!0);t(o);var l=n(o,2);{var b=I=>{var O=_r(),H=r(O);{let U=P(()=>`var(--tier-${a(d).tier})`);ge(H,{get tier(){return a(d).tier},size:9,get color(){return a(U)}})}t(O),c(I,O)};L(l,I=>{a(d).tier&&I(b)})}var N=n(l,2),u=r(N,!0);t(N);var v=n(N,2);{var k=I=>{var O=yr(),H=r(O);t(O),C(()=>g(H,`— ${a(d).note??""}`)),c(I,O)};L(v,I=>{a(d).note&&I(k)})}var A=n(v,2);{var E=I=>{var O=pr(),H=r(O,!0);t(O),C(U=>g(H,U),[()=>a(d).ms<1e3?`${a(d).ms}ms`:`${(a(d).ms/1e3).toFixed(1)}s`]),c(I,O)};L(A,I=>{a(d).ms!=null&&I(E)})}t(m);var z=n(m,2);{var W=I=>{var O=xr(),H=r(O);{let U=P(()=>w()+1);He(H,{get members(){return a(d).children},get depth(){return a(U)}})}t(O),c(I,O)};L(z,I=>{var O;(O=a(d).children)!=null&&O.length&&I(W)})}C((I,O)=>{he(m,1,`prov-row prov-status-${a(d).status??""}`,"svelte-qakefz"),ve(S,`color: ${I??""};`),g(x,O),g(s,a(d).id),g(u,a(d).name)},[()=>M(a(d)),()=>f(a(d).status)]),c(h,p)}),t(i),C(()=>ve(i,`--depth: ${w()??""};`)),c(R,i),J()}var kr=y('<div class="silent svelte-16iv0n8"><span class="silent-tag svelte-16iv0n8">silent</span> <p class="silent-prose svelte-16iv0n8"><!></p></div>'),Sr=y("<div></div>"),Mr=y('<div class="prov-body svelte-16iv0n8"><!></div>'),Cr=y('<section><header class="region-head svelte-16iv0n8"><div class="region-head-left svelte-16iv0n8"><span class="region-num svelte-16iv0n8"> </span> <h3 class="region-name svelte-16iv0n8"> </h3> <span class="region-role svelte-16iv0n8"> </span> <span class="region-tag svelte-16iv0n8"> </span></div> <!></header> <!> <div class="prov svelte-16iv0n8"><button type="button" class="prov-toggle svelte-16iv0n8"><span class="prov-caret svelte-16iv0n8" aria-hidden="true"> </span> <span class="prov-label"> </span> <span class="prov-meta svelte-16iv0n8"> </span></button> <!></div></section>');function Nr(R,e){X(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"provenanceMode",3,"smart"),M=ne(e,"linkedKey",3,null),i=P(()=>Ae[e.stone]),h=P(()=>`${Ee.indexOf(e.stone)+1}`.padStart(2,"0")),d=P(()=>e.stone==="capstone");function p($){return $.flatMap(V=>V.children?[V,...p(V.children)]:[V])}let m=P(()=>p(e.trace.members)),S=P(()=>a(m).length),x=P(()=>a(m).some($=>$.status==="warned"||$.status==="errored"||$.status==="not_invoked")),o=P(()=>f()==="all-expanded"?!0:f()==="all-collapsed"?!1:a(x)),s=Le(null),l=P(()=>a(s)??a(o));ie(()=>{f(),ke(s,null)});var b=Cr(),N=r(b),u=r(N),v=r(u),k=r(v,!0);t(v);var A=n(v,2),E=r(A,!0);t(A);var z=n(A,2),W=r(z);t(z);var I=n(z,2),O=r(I,!0);t(I),t(u);var H=n(u,2);fr(H,{get cardCount(){return e.cards.length},get members(){return e.trace.members}}),t(N);var U=n(N,2);{var D=$=>{var V=kr(),oe=n(r(V),2),ue=r(oe);{var ye=B=>{var j=we("No projection cards landed for this query. Atomic functions still ran (see provenance) and returned silence rather than confabulation.");c(B,j)},xe=B=>{var j=we("No cards for this Stone on this query.");c(B,j)};L(ue,B=>{e.stone==="lodestone"?B(ye):B(xe,-1)})}t(oe),t(V),c($,V)},q=$=>{var V=Sr();let oe;te(V,21,()=>e.cards,ue=>ue.id,(ue,ye)=>{Oe(ue,{get card(){return a(ye)},get density(){return w()},get linkedKey(){return M()},get onCite(){return e.onCite},get onLink(){return e.onLink}})}),t(V),C(()=>oe=he(V,1,"rail svelte-16iv0n8",null,oe,{"rail-capstone":a(d)})),c($,V)};L(U,$=>{e.cards.length===0?$(D):$(q,-1)})}var F=n(U,2),T=r(F),Y=r(T),G=r(Y,!0);t(Y);var ae=n(Y,2),Q=r(ae);t(ae);var Z=n(ae,2),le=r(Z);t(Z),t(T);var pe=n(T,2);{var _e=$=>{var V=Mr(),oe=r(V);He(oe,{get members(){return e.trace.members}}),t(V),C(()=>_(V,"id",`prov-body-${e.stone}`)),c($,V)};L(pe,$=>{a(l)&&$(_e)})}t(F),t(b),C(()=>{he(b,1,`region region-${e.stone??""}`,"svelte-16iv0n8"),_(b,"aria-labelledby",`region-h-${e.stone}`),_(b,"data-stone",e.stone),g(k,a(h)),_(A,"id",`region-h-${e.stone}`),g(E,a(i).name),g(W,`· ${a(i).role??""}`),g(O,a(i).tag),_(T,"aria-expanded",a(l)),_(T,"aria-controls",`prov-body-${e.stone}`),g(G,a(l)?"▾":"▸"),g(Q,`${a(l)?"Hide":"Show"} provenance`),g(le,`· ${a(S)??""} function${a(S)===1?"":"s"}`)}),Re("click",T,()=>ke(s,!a(l))),c(R,b),J()}Fe(["click"]);var Br=y('<section class="region region-grammar svelte-gwg123" aria-label="Card grammar reference"><header class="region-head svelte-gwg123"><div class="region-head-left svelte-gwg123"><span class="region-num svelte-gwg123">SPEC</span> <h3 class="region-name svelte-gwg123">Card grammar</h3> <span class="region-role svelte-gwg123">· every body variant in the system</span> <span class="region-tag svelte-gwg123">stubs, not findings</span></div> <span class="grammar-count svelte-gwg123"> </span></header> <div class="rail svelte-gwg123"></div></section>');function Lr(R,e){let w=ne(e,"density",3,"comfortable");const f=[{id:"grm-headline",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"spec",vintage:"spec",title:"Single big number, scenario-tagged",headline:"Zone AE",subhead:"preliminary FIRM, panel ID",sub:"Use when the answer is one categorical state.",docId:"DS-HEADLINE"},{id:"grm-tabular",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"spec",vintage:"spec",title:"Small table of observations",columns:["id","value","dist."],rows:[["ROW-001","1.2 m","0.18 mi"],["ROW-002","0.9 m","0.32 mi"],["ROW-003","0.7 m","0.41 mi"]],sub:"Use when 3–8 records each carry the same fields.",docId:"DS-TABULAR"},{id:"grm-scalars",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:"spec",vintage:"spec",title:"Trio of scalar readings",scalars:[{value:"0.02 in",label:"precip · 24h"},{value:"11 mph",label:"wind"},{value:"63°F",label:"temp"}],sub:"Use for current-state dashboards.",docId:"DS-SCALARS"},{id:"grm-spark",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"spec",vintage:"spec",title:"Sparkline of recent events",headline:"n events",subhead:"window · peak",spark:[1,2,4,3,7,12,8,5,3,2,4,9,6],docId:"DS-SPARK"},{id:"grm-histogram",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"spec",vintage:"spec",title:"Histogram of binned counts",headline:"n calls",subhead:"window · seasonal note",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],docId:"DS-HIST"},{id:"grm-timeseries",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM",agency:"spec",vintage:"spec",title:"Forecast curve with horizon",headline:"+0.41 m peak",subhead:"+38h · 90% CI",timeseries:{hours:96,peak:{x:38,y:41},peakLabel:"+0.41 m"},spatialNote:"regional",sub:"Spatial-index callout when station ≠ point-of-query.",docId:"DS-TS"},{id:"grm-forecast",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"spec",vintage:"spec",title:"Long-horizon scenario projections",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2100,low:38,mid:71,high:114}],sub:"Use for decadal+ uncertainty cones.",docId:"DS-FCST"},{id:"grm-raster",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"spec",vintage:"spec",title:"Raster snapshot, mapped layer",rasterKind:"stormwater",headline:"ponding",subhead:"scenario · pixel summary",sub:"Use for any 2D model output.",docId:"DS-RASTER"},{id:"grm-rasterpred",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC",agency:"spec",vintage:"spec",title:"Raster prediction, illustrative",rasterKind:"prithvi",headline:"n% flooded",subhead:"model · scene id",illustrative:!0,sub:"Same chrome as raster + illustrative tag.",docId:"DS-RASTERPRED"},{id:"grm-register",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"spec",vintage:"spec",title:"Composite register list",registers:[{reg:"MTA",tier:"empirical",label:"Station entrance",detail:"0.18 mi · 5",sourceId:"MTA-X",note:null},{reg:"NYCHA",tier:"empirical",label:"Development",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-Y",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi"}],sub:"Use when many specialists join into one Stone.",docId:"DS-REGISTER"},{id:"grm-comparison",stone:"keystone",tier:"synthetic",variant:"comparison",source:"EMP × SYN",agency:"spec",vintage:"spec",title:"Documented vs. interpreted",left:{tier:"empirical",label:"documented",value:"31.4%",aux:"n polygons"},right:{tier:"synthetic",label:"interpreted",value:"29.8%",aux:"n polygons"},delta:"Δ = −1.6 pp · agreement strong",sub:"Use to surface model–ground-truth deltas.",docId:"DS-CMP"},{id:"grm-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"spec",vintage:"spec",title:"Capstone reconciliation",metaRows:[{k:"claims",v:"12 / 12 grounded"},{k:"tier mix",v:"EMP 5 · MOD 4 · PRX 2 · SYN 1"},{k:"tier-1 freshness",v:"median 38 d"},{k:"warnings",v:"0"}],sub:"Use to expose the synthesis layer's audit.",docId:"DS-META"}];var M=Br(),i=r(M),h=n(r(i),2),d=r(h);t(h),t(i);var p=n(i,2);te(p,21,()=>f,m=>m.id,(m,S)=>{Oe(m,{get card(){return a(S)},get density(){return w()}})}),t(p),t(M),C(()=>g(d,`${f.length??""} variants`)),c(R,M)}var Ar=y('<section class="findings svelte-ci42t5" aria-label="Findings, grouped by Stone"><header class="findings-head svelte-ci42t5"><h2 class="findings-h2 svelte-ci42t5">Findings · grouped by Stone</h2> <span class="findings-tagline svelte-ci42t5">cards = what each Stone found · provenance collapses below</span></header> <!> <!> <!></section>');function Wr(R,e){X(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"provenanceMode",3,"smart"),M=ne(e,"showGrammar",3,!1),i=ne(e,"linkedKey",3,null),h=P(()=>{const s={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};for(const l of e.data.cards)s[l.stone].push(l);return s}),d=P(()=>{const s={cornerstone:{key:"cornerstone",members:[]},keystone:{key:"keystone",members:[]},touchstone:{key:"touchstone",members:[]},lodestone:{key:"lodestone",members:[]},capstone:{key:"capstone",members:[]}};for(const l of e.data.stones)s[l.key]=l;return s});var p=Ar(),m=n(r(p),2);It(m,{get cards(){return e.data.cards},get stones(){return e.data.stones},get wallSeconds(){return e.data.wallSeconds},get cacheHit(){return e.data.cacheHit},get emissions(){return e.data.emissions}});var S=n(m,2);te(S,16,()=>Ee,s=>s,(s,l)=>{Nr(s,{get stone(){return l},get cards(){return a(h)[l]},get trace(){return a(d)[l]},get density(){return w()},get provenanceMode(){return f()},get linkedKey(){return i()},get onCite(){return e.onCite},get onLink(){return e.onLink}})});var x=n(S,2);{var o=s=>{Lr(s,{get density(){return w()}})};L(x,s=>{M()&&s(o)})}t(p),c(R,p),J()}const Fr={cornerstone:[{id:"CORN-001",name:"sandy_inundation.lookup",stepNames:["sandy","sandy_inundation","sandy_nta"],tier:"empirical",skipReason:"Sandy 2012 inundation: query outside NYC bounds"},{id:"CORN-002",name:"dep_stormwater.lookup",stepNames:["dep","dep_stormwater","dep_extreme_2080_nta","dep_moderate_2050_nta","dep_moderate_current_nta"],tier:"modeled",skipReason:"NYC DEP stormwater scenarios: query outside NYC bounds"},{id:"CORN-003",name:"usgs_hwm.spatial_join",stepNames:["ida_hwm","ida_hwm_2021"],tier:"empirical",skipReason:"USGS Ida HWMs: no marks within 800 m of address"},{id:"CORN-004",name:"prithvi_water.lookup",stepNames:["prithvi","prithvi_eo_v2"],tier:"modeled",skipReason:"Prithvi-EO Ida polygons: no polygons within 500 m"},{id:"CORN-005",name:"microtopo.dem_hand_twi",stepNames:["microtopo","microtopo_lidar","microtopo_nta"],tier:"proxy",skipReason:"USGS 3DEP DEM: query outside NYC raster coverage"}],keystone:[{id:"KEY-001",name:"mta_entrance_exposure",stepNames:["mta_entrances","mta_entrance_exposure"],tier:"empirical",skipReason:"no entrances within radius"},{id:"KEY-002",name:"nycha.development_join",stepNames:["nycha","nycha_development_exposure"],tier:"empirical",skipReason:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe.school_join",stepNames:["doe_schools","doe_school_exposure"],tier:"empirical",skipReason:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh.facility_join",stepNames:["doh_hospitals","doh_hospital_exposure"],tier:"empirical",skipReason:"no acute-care hospitals within 1.0 mi"},{id:"KEY-005",name:"pluto.lot_lookup",stepNames:["pluto_lookup"],tier:"empirical",skipReason:"PLUTO join skipped: queried address not in NYC PLUTO dataset"},{id:"KEY-006",name:"terramind.buildings",stepNames:["terramind_buildings","terramind_synthesis"],tier:"modeled",skipReason:"TerraMind Buildings: no eo_chip available for this address (recent <30% cloud Sentinel-2 missing) or no high-confidence prediction"}],touchstone:[{id:"TCH-001",name:"floodnet.history",stepNames:["floodnet"],tier:"empirical",skipReason:"FloodNet sensor: no deployments within 600 m"},{id:"TCH-002",name:"nyc311.flood_complaints",stepNames:["nyc311","nyc311_nta"],tier:"proxy",skipReason:"NYC 311: no flood-relevant complaints within 200 m"},{id:"TCH-003",name:"nws_obs.metar",stepNames:["nws_obs"],tier:"empirical",skipReason:"NWS hourly METAR: nearest ASOS reports no precipitation"},{id:"TCH-004",name:"noaa_coops.recent",stepNames:["noaa_tides"],tier:"empirical",skipReason:"NOAA tide gauge: nearest station >25 km from address"},{id:"TCH-005",name:"prithvi_nyc_pluvial",stepNames:["prithvi_live","prithvi_eo_live"],tier:"modeled",skipReason:"Prithvi-NYC-Pluvial: no <30% cloud Sentinel-2 chip available in the last 120 d for this address"},{id:"TCH-006",name:"terramind.lulc",stepNames:["terramind_lulc"],tier:"synthetic",skipReason:"TerraMind LULC: eo_chip fetch returned no Sentinel-2 tile for this address"}],lodestone:[{id:"LOD-001",name:"nws_alerts.flood_relevant",stepNames:["nws_alerts"],tier:"modeled",skipReason:"NWS public alerts: no active flood-relevant alerts at this address"},{id:"LOD-002",name:"ttm_battery_surge.zero_shot",stepNames:["ttm_forecast"],tier:"modeled",skipReason:"Granite TTM r2 zero-shot: forecast not interesting (peak |residual| < 0.3 ft)"},{id:"LOD-003",name:"ttm_battery_surge.fine_tune",stepNames:["ttm_battery_surge"],tier:"modeled",skipReason:"Granite TTM Battery fine-tune: forecast not interesting (peak |residual| < 0.3 m)"},{id:"LOD-004",name:"ttm_311_forecast",stepNames:["ttm_311_forecast"],tier:"modeled",skipReason:"NYC 311 weekly forecast: no per-address history to extrapolate"},{id:"LOD-005",name:"floodnet_forecast",stepNames:["floodnet_forecast"],tier:"modeled",skipReason:"FloodNet sensor recurrence: sensor has < silent-floor historical events; forecast omitted"},{id:"LOD-006",name:"npcc4.slr_projection",stepNames:["npcc4_projection"],tier:"modeled",skipReason:"NPCC4 SLR projection: not yet wired into FSM (static reference card on hold)"}],capstone:[{id:"CAP-001",name:"rag.granite_embedding",stepNames:["rag_granite_embedding"],tier:"proxy",skipReason:"Granite Embedding RAG: no policy retrieval (out-of-NYC scope)"},{id:"CAP-002",name:"gliner.typed_extraction",stepNames:["gliner_extract"],tier:"proxy",skipReason:"GLiNER typed extraction: no RAG hits to extract over"},{id:"CAP-003",name:"granite41.compose_briefing",stepNames:["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"],tier:"modeled",skipReason:"Reconciler did not run (no grounded data available)"},{id:"CAP-004",name:"mellea.grounding_check",stepNames:["mellea_grounding"],tier:"modeled",skipReason:"Mellea grounding-check: rolled into reconcile step on this run"}]};function Ur(R,e){const w=Fr[R]??[],f=new Map;for(const h of e)f.set(h.name,h);const M=[],i=new Set;for(const h of w){let d;for(const p of h.stepNames){const m=f.get(p);if(m){d=m,i.add(p);break}}d?M.push({...d,id:h.id,name:h.name,tier:d.tier??h.tier??null}):M.push({id:h.id,name:h.name,status:"not_invoked",tier:h.tier??null,note:h.skipReason})}for(const h of e)i.has(h.name)||M.push(h);return M}export{Hr as C,Wr as F,Yr as M,jr as R,Ur as f};
web/sveltekit/build/_app/immutable/chunks/DJJH9JR_.js ADDED
@@ -0,0 +1 @@
 
 
1
+ var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bf as Pe,bg as Vt,ai as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./BTUA7_xE.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class Fe extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Gt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Ge(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${Ft(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return Ce(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ce(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ce(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function Ce(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_a2xq49)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_a2xq49)==null?void 0:pt.assets)??U??"",rn="1778353518826",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function z(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:C};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof Fe?e.status:500}function cn(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},je={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),je=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>je.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},j={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(C)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_a2xq49&&(globalThis.__sveltekit_a2xq49.query,globalThis.__sveltekit_a2xq49.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[F],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await G({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await G({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:Ct({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:j,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(C)),c.forEach(h=>h==null?void 0:h[1]().catch(C));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(C);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof ze)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await j.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof ze)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:zt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=C,block:d=C,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await G({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await j.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[F]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),j.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){jt({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await G({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),G({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[F]){const r=n.state[F];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await G({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[F]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof ze){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(C),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,j as s};
web/sveltekit/build/_app/immutable/chunks/FjZhY28w.js DELETED
@@ -1,38 +0,0 @@
1
- import{k as Ue,o as Ke,a as c,f as y,s as m,t as we,d as Fe,c as Me,e as Re,b as fe}from"./CWw6qgC_.js";import{h as he,n as Te,j as Ne,bd as Ge,d as Qe,a3 as Ve,aW as Ze,b7 as Xe,k as Je,b as $e,e as qe,i as Be,a0 as et,av as tt,p as $,t as C,a as ee,s as n,c as r,r as t,aR as se,o as a,al as P,am as ie,ai as at,be as rt,a5 as Se,a4 as Le,f as te}from"./BTUA7_xE.js";import{B as st,i as B}from"./Bd-v_9Ud.js";import{e as ae,i as ce}from"./25_y8TFd.js";import{s as _,a as ge,b as ve,c as it,C as nt}from"./B0XoTt7U.js";import{T as me,c as lt,b as ot,d as Pe}from"./BatqQaKj.js";import{b as dt,_ as vt}from"./CXQd8Y6F.js";import{p as ne}from"./CW0zSL4D.js";import{P as ct}from"./D907np-5.js";function ut(R,e,w,f,M,i){let g=he;he&&Te();var d=null;he&&Ne.nodeType===Ge&&(d=Ne,Te());var p=he?Ne:R,h=new st(p,!1);Qe(()=>{const S=e()||null;var x=S==="svg"?Xe:void 0;if(S===null){h.ensure(null,null);return}return h.ensure(S,o=>{if(S){if(d=he?d:Ze(S,x),Ue(d,d),f){he&&Ke(S)&&d.append(document.createComment(""));var s=he?Je(d):d.appendChild($e());he&&(s===null?qe(!1):Be(s)),f(d,s)}et.nodes.end=d,o.before(d)}he&&Be(o)}),()=>{}},Ve),tt(()=>{}),g&&(qe(!0),Be(p))}var ht=y('<a target="_blank" rel="noopener noreferrer"> </a>'),gt=y('<li><span class="citation-num"> </span> <div class="citation-body"><div class="citation-line-1"><!> <span class="citation-source"> </span> <span class="citation-vintage"> </span></div> <div class="citation-title"><!></div> <div class="citation-meta"><span class="citation-docid"> </span> <span class="citation-retrieved"> </span></div></div></li>'),mt=y(`<aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label"> </span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
2
- state, and city sources. No commercial APIs contacted at runtime.</p></div></aside>`);function Hr(R,e){$(e,!0);let w=P(()=>Object.values(e.citations).sort((p,h)=>p.n-h.n));var f=mt(),M=r(f),i=r(M),g=r(i);t(i),se(2),t(M);var d=n(M,2);ae(d,21,()=>a(w),p=>p.id,(p,h)=>{var S=gt();let x;var o=r(S),s=r(o);t(o);var l=n(o,2),b=r(l),N=r(b);me(N,{get tier(){return a(h).tier},size:10,get color(){return`var(--tier-${a(h).tier??""})`}});var u=n(N,2),v=r(u,!0);t(u);var k=n(u,2),L=r(k);t(k),t(b);var T=n(b,2),O=r(T);{var j=F=>{var Y=ht(),Q=r(Y,!0);t(Y),C(()=>{_(Y,"href",a(h).url),m(Q,a(h).title)}),c(F,Y)},I=P(()=>a(h).url&&a(h).url.startsWith("http")),z=F=>{var Y=we();C(()=>m(Y,a(h).title)),c(F,Y)};B(O,F=>{a(I)?F(j):F(z,-1)})}t(T);var H=n(T,2),U=r(H),D=r(U,!0);t(U);var q=n(U,2),E=r(q);t(q),t(H),t(l),t(S),C(()=>{_(S,"id",`cite-${a(h).id??""}`),x=ge(S,1,"citation-item",null,x,{"is-active":lt.active===a(h).id}),m(s,`[${a(h).n??""}]`),m(v,a(h).source),m(L,`v. ${a(h).vintage??""}`),m(D,a(h).docId),m(E,`retr. ${a(h).retrieved??""}`)}),c(p,S)}),t(d),se(2),t(f),C(()=>m(g,`Citations · ${a(w).length??""}`)),c(R,f),ee()}const De=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
3
- <rect width="12" height="12" fill="rgba(42,111,168,0.18)"/>
4
- <g stroke="#2A6FA8" stroke-width="1.4">
5
- <line x1="-2" y1="2" x2="14" y2="-14"/>
6
- <line x1="-2" y1="8" x2="14" y2="-8"/>
7
- <line x1="-2" y1="14" x2="14" y2="-2"/>
8
- <line x1="-2" y1="20" x2="14" y2="4"/>
9
- </g>
10
- </svg>`,ft=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
11
- <rect width="12" height="12" fill="rgba(42,111,168,0.16)"/>
12
- <g stroke="#2A6FA8" stroke-width="1.1">
13
- <line x1="-2" y1="6" x2="14" y2="-10"/>
14
- <line x1="-2" y1="14" x2="14" y2="-2"/>
15
- <line x1="-2" y1="22" x2="14" y2="6"/>
16
- </g>
17
- </svg>`;async function _t(R,e){const w=new Blob([R],{type:"image/svg+xml"}),f=URL.createObjectURL(w);try{return await new Promise((i,g)=>{const d=new Image(e,e);d.onload=()=>i(d),d.onerror=p=>g(p),d.src=f})}finally{URL.revokeObjectURL(f)}}async function yt(R){const e=[["syn-stripe-45",De,12],["syn-stripe-45-2x",De,24],["syn-stripe-45-low",ft,12]];for(const[w,f,M]of e)if(!R.hasImage(w))try{const i=await _t(f,M);R.addImage(w,i,{pixelRatio:M/12})}catch(i){console.warn(`syn-stripe registration failed for ${w}`,i)}}var pt=y('<span class="link-badge svelte-wk2bu4" aria-hidden="true"> </span>'),xt=y('<div class="map-frame svelte-wk2bu4"><div role="application" class="rip-map-container svelte-wk2bu4"></div> <!></div>');function jr(R,e){$(e,!0);let w=ne(e,"activeLayers",19,()=>({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),f=ne(e,"linkedKey",3,null),M=Le(null),i=null,g=Le(!1);const d={type:"FeatureCollection",features:[]};function p(l,b){if(!i||!a(g))return;const N=i.getSource(l);N&&N.setData(b??d)}function h(l,b){!i||!a(g)||i.getLayer(l)&&i.setLayoutProperty(l,"visibility",b?"visible":"none")}ie(()=>{p("sandy-empirical",e.sandyEmpirical)}),ie(()=>{p("dep-modeled",e.depModeled)}),ie(()=>{p("syn-prior",e.syntheticPrior)}),ie(()=>{p("proxy-311",e.proxy311)}),ie(()=>{p("register-points",e.registerPoints)}),ie(()=>{p("register-polygons",e.registerPolygons)}),ie(()=>{p("terramind-lulc",e.terramindLulc)}),ie(()=>{p("terramind-buildings",e.terramindBuildings)}),ie(()=>{p("prithvi-live",e.prithviLive)}),ie(()=>{p("ida-hwm",e.idaHwm)}),ie(()=>{h("tier-empirical-fill",w().empirical),h("tier-empirical-line",w().empirical),h("ida-hwm-circle",w().empirical),h("tier-modeled-fill",w().modeled),h("tier-modeled-line",w().modeled),h("tier-synthetic-fill",w().synthetic),h("tier-synthetic-line",w().synthetic),h("terramind-lulc-fill",w().synthetic),h("terramind-lulc-line",w().synthetic),h("terramind-buildings-fill",w().synthetic),h("terramind-buildings-line",w().synthetic),h("prithvi-live-fill",w().modeled),h("prithvi-live-line",w().modeled),h("tier-proxy-dots",w().proxy)}),ie(()=>{!i||!a(g)||i.flyTo({center:[e.address.lon,e.address.lat],zoom:15,essential:!0})}),at(async()=>{if(!a(M))return;const l=await vt(()=>import("./D4L2lGt1.js").then(b=>b.m),[],import.meta.url);i=new l.Map({container:a(M),style:ct,center:[e.address.lon,e.address.lat],zoom:15,attributionControl:{compact:!0}}),i.addControl(new l.NavigationControl({visualizePitch:!1}),"top-right"),i.addControl(new l.ScaleControl({maxWidth:100,unit:"imperial"}),"bottom-left"),i.on("load",()=>{if(!i)return;window.__riprapMap=i,yt(i);const b=()=>({type:"FeatureCollection",features:[]});i.addSource("sandy-empirical",{type:"geojson",data:e.sandyEmpirical??b()}),i.addSource("dep-modeled",{type:"geojson",data:e.depModeled??b()}),i.addSource("syn-prior",{type:"geojson",data:e.syntheticPrior??b()}),i.addSource("proxy-311",{type:"geojson",data:e.proxy311??b()}),i.addSource("register-points",{type:"geojson",data:e.registerPoints??b()}),i.addSource("register-polygons",{type:"geojson",data:e.registerPolygons??b()}),i.addSource("terramind-lulc",{type:"geojson",data:e.terramindLulc??b()}),i.addSource("terramind-buildings",{type:"geojson",data:e.terramindBuildings??b()}),i.addSource("prithvi-live",{type:"geojson",data:e.prithviLive??b()}),i.addSource("ida-hwm",{type:"geojson",data:e.idaHwm??b()}),i.addSource("queried-address",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[e.address.lon,e.address.lat]},properties:{label:e.address.label}}]}}),i.addLayer({id:"tier-empirical-fill",type:"fill",source:"sandy-empirical",paint:{"fill-color":"#0B5394","fill-opacity":.4}}),i.addLayer({id:"tier-empirical-line",type:"line",source:"sandy-empirical",paint:{"line-color":"#0B5394","line-width":1.5}}),i.addLayer({id:"tier-modeled-fill",type:"fill",source:"dep-modeled",paint:{"fill-color":"#2A6FA8","fill-opacity":.25}}),i.addLayer({id:"tier-modeled-line",type:"line",source:"dep-modeled",paint:{"line-color":"#2A6FA8","line-width":1.5}}),i.addLayer({id:"tier-synthetic-fill",type:"fill",source:"syn-prior",paint:{"fill-pattern":"syn-stripe-45","fill-opacity":.65}}),i.addLayer({id:"tier-synthetic-line",type:"line",source:"syn-prior",paint:{"line-color":"#2A6FA8","line-width":1.5,"line-dasharray":[4,3]}}),i.addLayer({id:"tier-proxy-dots",type:"circle",source:"proxy-311",paint:{"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1.25,"circle-radius":["interpolate",["linear"],["coalesce",["get","count"],1],1,3,5,6,15,9,30,12]}}),i.addLayer({id:"terramind-lulc-fill",type:"fill",source:"terramind-lulc",paint:{"fill-color":["get","fill_color"],"fill-opacity":.25}}),i.addLayer({id:"terramind-lulc-line",type:"line",source:"terramind-lulc",paint:{"line-color":["get","fill_color"],"line-width":.75,"line-opacity":.45,"line-dasharray":[3,2]}}),i.addLayer({id:"terramind-buildings-fill",type:"fill",source:"terramind-buildings",paint:{"fill-color":"#7C3AED","fill-opacity":.15}}),i.addLayer({id:"terramind-buildings-line",type:"line",source:"terramind-buildings",paint:{"line-color":"#7C3AED","line-width":1,"line-opacity":.6,"line-dasharray":[2,2]}}),i.addLayer({id:"prithvi-live-fill",type:"fill",source:"prithvi-live",paint:{"fill-color":"#0D9488","fill-opacity":.2}}),i.addLayer({id:"prithvi-live-line",type:"line",source:"prithvi-live",paint:{"line-color":"#0D9488","line-width":1,"line-opacity":.55}}),i.addLayer({id:"register-polygons-fill",type:"fill",source:"register-polygons",paint:{"fill-color":"#0B5394","fill-opacity":["interpolate",["linear"],["coalesce",["get","pct_inside_sandy"],0],0,.1,25,.2,50,.32,75,.45]}}),i.addLayer({id:"register-polygons-line",type:"line",source:"register-polygons",paint:{"line-color":"#0B5394","line-width":1,"line-opacity":.85}}),i.addLayer({id:"ida-hwm-circle",type:"circle",source:"ida-hwm",paint:{"circle-color":"#D97706","circle-stroke-color":"#F4F6F9","circle-stroke-width":1.5,"circle-radius":["interpolate",["linear"],["coalesce",["get","height_above_gnd_ft"],.5],0,5,1,7,3,9,5,12],"circle-opacity":.92}}),i.on("mouseenter","ida-hwm-circle",()=>{i&&(i.getCanvas().style.cursor="pointer")}),i.on("mouseleave","ida-hwm-circle",()=>{i&&(i.getCanvas().style.cursor="")}),i.on("click","ida-hwm-circle",N=>{var U;if(!i||!((U=N.features)!=null&&U.length))return;const u=N.features[0],v=u.properties??{},k=String(v.site_description??"?"),L=v.elev_ft!=null?`${Number(v.elev_ft).toFixed(1)} ft NAVD88`:"—",T=v.height_above_gnd_ft!=null?`${Number(v.height_above_gnd_ft).toFixed(2)} ft above ground`:"—",O=String(v.hwm_quality??""),j=v.distance_m!=null?`${v.distance_m} m from query`:"",I=`
18
- <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px; max-width: 220px;">
19
- <div style="font-weight: 600; color: #D97706; font-size: 11px; letter-spacing: 0.05em; text-transform: uppercase;">Ida 2021 HWM · USGS</div>
20
- <div style="margin-top: 4px; color: #0F172A; font-size: 12px;">${k}</div>
21
- <div style="margin-top: 6px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #6B6B6B;">
22
- elev: ${L}<br>
23
- mark: ${T}<br>
24
- ${O?`quality: ${O}<br>`:""}
25
- ${j}
26
- </div>
27
- </div>`,z=new l.Popup({closeButton:!0,offset:12}),H=u.geometry.coordinates;z.setLngLat(H).setHTML(I).addTo(i)}),i.addLayer({id:"register-points-circle",type:"circle",source:"register-points",paint:{"circle-color":["case",["==",["get","inside_sandy_2012"],!0],"#0B5394","#6B6B6B"],"circle-stroke-color":"#F4F6F9","circle-stroke-width":1.25,"circle-radius":["match",["get","kind"],"subway",4,"school",5,"hospital",6,"nycha",7,4],"circle-opacity":.9}}),i.on("mouseenter","register-points-circle",()=>{i&&(i.getCanvas().style.cursor="pointer")}),i.on("mouseleave","register-points-circle",()=>{i&&(i.getCanvas().style.cursor="")}),i.on("click","register-points-circle",N=>{var H;if(!i||!((H=N.features)!=null&&H.length))return;const u=N.features[0],v=u.properties??{},k=String(v.name??"?"),L=String(v.kind??"?"),T=v.inside_sandy_2012===!0||v.inside_sandy_2012==="true",O=String(v.doc_id??""),j=`
28
- <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
29
- <div style="font-weight: 600; color: #0F172A;">${k}</div>
30
- <div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${L}</div>
31
- <div style="margin-top: 6px;">
32
- <span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${T?"#0B5394":"#6B6B6B"};">
33
- inside_sandy_2012=${T}
34
- </span>
35
- </div>
36
- ${O?`<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #005EA2;">[${O}]</div>`:""}
37
- </div>`,I=new l.Popup({closeButton:!0,offset:12}),z=u.geometry.coordinates;I.setLngLat(z).setHTML(j).addTo(i)}),i.addLayer({id:"queried-halo",type:"circle",source:"queried-address",paint:{"circle-color":"rgba(209, 124, 0, 0.20)","circle-radius":16}}),i.addLayer({id:"queried-pin",type:"circle",source:"queried-address",paint:{"circle-color":"#005EA2","circle-stroke-color":"#F4F6F9","circle-stroke-width":2,"circle-radius":7}}),i.addLayer({id:"queried-label",type:"symbol",source:"queried-address",layout:{"text-field":["get","label"],"text-font":["Open Sans Semibold","Arial Unicode MS Bold"],"text-size":12,"text-offset":[0,-1.6],"text-anchor":"bottom"},paint:{"text-color":"#0F172A","text-halo-color":"#F4F6F9","text-halo-width":1.5}}),Se(g,!0)})}),rt(()=>{i==null||i.remove(),i=null});var S=xt(),x=r(S);dt(x,l=>Se(M,l),()=>a(M));var o=n(x,2);{var s=l=>{var b=pt(),N=r(b);t(b),C(()=>m(N,`linked: ${f()??""}`)),c(l,b)};B(o,l=>{f()&&l(s)})}t(S),C(()=>{_(S,"data-linked",f()??""),_(x,"aria-label",`Flood-exposure map for ${e.address.label??""}`)}),c(R,S),ee()}const Ee=["cornerstone","keystone","touchstone","lodestone","capstone"],Ae={cornerstone:{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers"},keystone:{name:"Keystone",role:"the asset register",tag:"what's exposed"},touchstone:{name:"Touchstone",role:"the live observer",tag:"what's happening now"},lodestone:{name:"Lodestone",role:"the projector",tag:"what's coming"},capstone:{name:"Capstone",role:"the synthesizer",tag:"writes it all down with citations"}};var bt=y('<span class="layers-count svelte-1g2dety"> </span>'),wt=y('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">no map layers — see Findings cards</span></li>'),kt=y('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">not a map layer</span></li>'),St=y('<span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span>'),Mt=y('<li><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><!></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety"> </span> <span class="layers-meta svelte-1g2dety"> <!></span></span> <span class="layers-state svelte-1g2dety"><!></span></li>'),Ct=y('<details open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety"> </span> <span class="layers-stone-tag svelte-1g2dety"> </span> <!></summary> <ul class="layers-list svelte-1g2dety"><!></ul></details>'),Nt=y('<button type="button"><!> <span> </span> <span class="layers-master-state svelte-1g2dety"> </span></button>'),Bt=y('<aside class="layers-panel svelte-1g2dety" aria-label="Map layers grouped by Stone"><div class="layers-head svelte-1g2dety"><span class="section-label">Layers · grouped by Stone</span></div> <!> <div class="layers-masters svelte-1g2dety" role="group" aria-label="Master tier toggles"><span class="section-label">Tier toggles</span> <div class="layers-master-row svelte-1g2dety"></div></div></aside>');function Yr(R,e){$(e,!0);const w={cornerstone:[{label:"Sandy Inundation Zone (2012)",source:"NYC OEM",tier:"empirical",wired:!0},{label:"FEMA / DEP scenarios",source:"FEMA · NYC DEP",tier:"modeled",wired:!0},{label:"Ida HWM points (2021)",source:"USGS STN",tier:"empirical",wired:!0},{label:"Microtopography (HAND/TWI)",source:"USGS 3DEP",tier:"proxy",wired:!1}],keystone:[{label:"MTA subway entrances",source:"MTA Open Data",tier:"empirical",wired:!0},{label:"NYCHA developments",source:"NYC OD phvi-damg",tier:"empirical",wired:!0},{label:"DOE schools",source:"NYC DOE Locations",tier:"empirical",wired:!0},{label:"DOH hospitals",source:"NYS DOH vn5v-hh5r",tier:"empirical",wired:!0},{label:"TerraMind Buildings (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!0}],touchstone:[{label:"311 flood complaints",source:"NYC 311",tier:"proxy",wired:!1},{label:"FloodNet sensors",source:"FloodNet NYC",tier:"proxy",wired:!0},{label:"TerraMind LULC (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!0},{label:"Prithvi-NYC-Pluvial flood pred.",source:"msradam/Prithvi-EO-2.0-NYC-Pluvial",tier:"modeled",wired:!0}],lodestone:[],capstone:[]};function f(S){return!!e.active[S.tier]}function M(S){return w[S].length}const i=[{k:"empirical",tier:"empirical",label:"EMP"},{k:"modeled",tier:"modeled",label:"MOD"},{k:"proxy",tier:"proxy",label:"PRX"},{k:"synthetic",tier:"synthetic",label:"SYN"}];var g=Bt(),d=n(r(g),2);ae(d,16,()=>Ee,S=>S,(S,x)=>{var o=Ct(),s=r(o),l=n(r(s),2),b=r(l,!0);t(l);var N=n(l,2),u=r(N);t(N);var v=n(N,2);{var k=H=>{var U=bt(),D=r(U,!0);t(U),C(q=>m(D,q),[()=>M(x)]),c(H,U)},L=P(()=>M(x)>0);B(v,H=>{a(L)&&H(k)})}t(s);var T=n(s,2),O=r(T);{var j=H=>{var U=wt();c(H,U)},I=H=>{var U=kt();c(H,U)},z=H=>{var U=Me(),D=te(U);ae(D,17,()=>w[x],ce,(q,E)=>{var F=Mt();let Y;var Q=r(F),re=r(Q);me(re,{get tier(){return a(E).tier},size:11,get color(){return`var(--tier-${a(E).tier??""})`}}),t(Q);var G=n(Q,2),X=r(G),le=r(X,!0);t(X);var _e=n(X,2),be=r(_e),J=n(be);ot(J,{get tier(){return a(E).tier},compact:!0}),t(_e),t(G);var V=n(G,2),oe=r(V);{var ue=K=>{var Z=St();c(K,Z)},ye=K=>{var Z=we("on");c(K,Z)},A=P(()=>f(a(E))),W=K=>{var Z=we("off");c(K,Z)};B(oe,K=>{a(E).wired?a(A)?K(ye,1):K(W,-1):K(ue)})}t(V),t(F),C(()=>{Y=ge(F,1,"layers-row svelte-1g2dety",null,Y,{dim:!a(E).wired}),m(le,a(E).label),m(be,`${a(E).source??""} · `)}),c(q,F)}),c(H,U)};B(O,H=>{x==="lodestone"?H(j):x==="capstone"?H(I,1):H(z,-1)})}t(T),t(o),C(()=>{ge(o,1,`layers-group region-${x??""}`,"svelte-1g2dety"),m(b,Ae[x].name),m(u,`— ${Ae[x].tag??""}`)}),c(S,o)});var p=n(d,2),h=n(r(p),2);ae(h,21,()=>i,S=>S.k,(S,x)=>{var o=Nt();let s;var l=r(o);me(l,{get tier(){return a(x).tier},size:11,get color(){return`var(--tier-${a(x).tier??""})`}});var b=n(l,2),N=r(b,!0);t(b);var u=n(b,2),v=r(u,!0);t(u),t(o),C(()=>{s=ge(o,1,"layers-master svelte-1g2dety",null,s,{"is-on":e.active[a(x).k]}),_(o,"aria-pressed",e.active[a(x).k]),m(N,a(x).label),m(v,e.active[a(x).k]?"ON":"OFF")}),Re("click",o,()=>e.onToggle(a(x).k)),c(S,o)}),t(h),t(p),t(g),c(R,g),ee()}Fe(["click"]);var Lt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-silent svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> silent</span>',1),At=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-warn svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> warned</span>',1),Ft=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-err svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> errored</span>',1),Rt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-notinvoked svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> not invoked</span>',1),Et=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> cache</span>',1),Tt=y('<span class="rh-em-tok svelte-1vuwkv4"> </span>'),qt=y('<span class="rh-em-ratio svelte-1vuwkv4"> </span>'),Pt=y('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-em svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> inference <!> <!></span>',1),Dt=y('<div class="rh svelte-1vuwkv4"><span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> Stones</span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> fired</span> <!> <!> <!> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> </span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> wall-clock</span> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-total svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> registered</span> <!></div>');function It(R,e){$(e,!0);function w(A){return A.flatMap(W=>W.children?[W,...w(W.children)]:[W])}let f=P(()=>e.stones.flatMap(A=>w(A.members))),M=P(()=>a(f).length),i=P(()=>a(f).filter(A=>A.status==="fired"||A.status==="warned").length),g=P(()=>a(f).filter(A=>A.status==="silent_by_design").length),d=P(()=>a(f).filter(A=>A.status==="warned").length),p=P(()=>a(f).filter(A=>A.status==="errored").length),h=P(()=>a(f).filter(A=>A.status==="not_invoked").length),S=P(()=>e.wallSeconds==null?"—":e.wallSeconds<1?`${Math.round(e.wallSeconds*1e3)}ms`:`${e.wallSeconds.toFixed(1)}s`),x=P(()=>{if(!e.emissions||e.emissions.total_wh===0)return null;const A=e.emissions.total_wh;return A<.1?`${e.emissions.total_mwh.toFixed(1)} mWh`:`${A.toFixed(2)} Wh`}),o=P(()=>{var W,K;const A=(K=(W=e.emissions)==null?void 0:W.tokens)==null?void 0:K.total;return A?A>=1e3?`${(A/1e3).toFixed(1)}K tok`:`${A} tok`:null}),s=P(()=>{var A,W;return((W=(A=e.emissions)==null?void 0:A.comparison)==null?void 0:W.ratio_cloud_over_query)??null}),l=P(()=>{if(!e.emissions)return null;const A=Object.values(e.emissions.by_hardware).map(W=>W.label);return A.length===1?A[0]:A.join(" + ")}),b=P(()=>e.emissions?[`${e.emissions.n_calls} inference calls — ${e.emissions.total_joules} J total`,a(l)?`Hardware: ${a(l)}`:"",e.emissions.tokens.total?`Tokens: ${e.emissions.tokens.prompt??0} prompt + ${e.emissions.tokens.completion??0} completion`:"",a(s)!=null?`~${a(s)}× lower than ${e.emissions.comparison.cloud_per_query_mwh} mWh frontier-cloud per-query estimate`:"",e.emissions.method].filter(Boolean).join(`
38
- `):"");var N=Dt(),u=r(N),v=r(u),k=r(v,!0);t(v),se(),t(u);var L=n(u,4),T=r(L),O=r(T,!0);t(T),se(),t(L);var j=n(L,2);{var I=A=>{var W=Lt(),K=n(te(W),2),Z=r(K),de=r(Z,!0);t(Z),se(),t(K),C(()=>m(de,a(g))),c(A,W)};B(j,A=>{a(g)>0&&A(I)})}var z=n(j,2);{var H=A=>{var W=At(),K=n(te(W),2),Z=r(K),de=r(Z,!0);t(Z),se(),t(K),C(()=>m(de,a(d))),c(A,W)};B(z,A=>{a(d)>0&&A(H)})}var U=n(z,2);{var D=A=>{var W=Ft(),K=n(te(W),2),Z=r(K),de=r(Z,!0);t(Z),se(),t(K),C(()=>m(de,a(p))),c(A,W)};B(U,A=>{a(p)>0&&A(D)})}var q=n(U,2);{var E=A=>{var W=Rt(),K=n(te(W),2),Z=r(K),de=r(Z,!0);t(Z),se(),t(K),C(()=>m(de,a(h))),c(A,W)};B(q,A=>{a(h)>0&&A(E)})}var F=n(q,4),Y=r(F),Q=r(Y,!0);t(Y);var re=n(Y);t(F);var G=n(F,4),X=r(G),le=r(X,!0);t(X),se(),t(G);var _e=n(G,2);{var be=A=>{var W=Et(),K=n(te(W),2),Z=r(K),de=r(Z);t(Z),se(),t(K),C(ke=>m(de,`${ke??""}%`),[()=>Math.round(e.cacheHit*100)]),c(A,W)};B(_e,A=>{e.cacheHit!=null&&A(be)})}var J=n(_e,4),V=r(J),oe=r(V,!0);t(V),se(),t(J);var ue=n(J,2);{var ye=A=>{var W=Pt(),K=n(te(W),2),Z=r(K),de=r(Z,!0);t(Z);var ke=n(Z,2);{var je=pe=>{var xe=Tt(),Ce=r(xe);t(xe),C(()=>m(Ce,`/ ${a(o)??""}`)),c(pe,xe)};B(ke,pe=>{a(o)&&pe(je)})}var Ye=n(ke,2);{var We=pe=>{var xe=qt(),Ce=r(xe);t(xe),C(()=>m(Ce,`~${a(s)??""}× < cloud`)),c(pe,xe)};B(Ye,pe=>{a(s)!=null&&pe(We)})}t(K),C(()=>{_(K,"title",a(b)),m(de,a(x))}),c(A,W)};B(ue,A=>{a(x)&&A(ye)})}t(N),C(()=>{m(k,e.stones.length),m(O,a(i)),m(Q,e.cards.length),m(re,` evidence card${e.cards.length===1?"":"s"}`),m(le,a(S)),m(oe,a(M))}),c(R,N),ee()}var zt=y('<div class="subhead svelte-lygj3j"> </div>'),Ot=y('<p class="body-prose svelte-lygj3j"> </p>'),Ht=y('<div class="body body-headline svelte-lygj3j"><div class="headline svelte-lygj3j"> </div> <!> <!></div>');function jt(R,e){$(e,!0);var w=Ht(),f=r(w),M=r(f,!0);t(f);var i=n(f,2);{var g=h=>{var S=zt(),x=r(S,!0);t(S),C(()=>m(x,e.card.subhead)),c(h,S)};B(i,h=>{e.card.subhead&&h(g)})}var d=n(i,2);{var p=h=>{var S=Ot(),x=r(S,!0);t(S),C(()=>m(x,e.card.body)),c(h,S)};B(d,h=>{e.card.body&&h(p)})}t(w),C(()=>{ve(f,`color: var(--tier-${e.card.tier??""});`),m(M,e.card.headline??"")}),c(R,w),ee()}var Yt=y('<th class="svelte-1nlkuao"> </th>'),Wt=y('<td class="svelte-1nlkuao"> </td>'),Ut=y('<tr class="svelte-1nlkuao"></tr>'),Kt=y('<div class="body-sub svelte-1nlkuao"> </div>'),Gt=y('<div class="body body-tabular svelte-1nlkuao"><table class="t svelte-1nlkuao"><thead><tr></tr></thead><tbody></tbody></table> <!></div>');function Qt(R,e){$(e,!0);var w=Gt(),f=r(w),M=r(f),i=r(M);ae(i,21,()=>e.card.columns??[],ce,(h,S)=>{var x=Yt(),o=r(x,!0);t(x),C(()=>m(o,a(S))),c(h,x)}),t(i),t(M);var g=n(M);ae(g,21,()=>e.card.rows??[],ce,(h,S)=>{var x=Ut();ae(x,21,()=>a(S),ce,(o,s)=>{var l=Wt(),b=r(l,!0);t(l),C(()=>m(b,a(s))),c(o,l)}),t(x),c(h,x)}),t(g),t(f);var d=n(f,2);{var p=h=>{var S=Kt(),x=r(S,!0);t(S),C(()=>m(x,e.card.sub)),c(h,S)};B(d,h=>{e.card.sub&&h(p)})}t(w),c(R,w),ee()}var Vt=y('<div class="cell svelte-stf9c8"><div class="value svelte-stf9c8"> </div> <div class="label svelte-stf9c8"> </div></div>'),Zt=y('<div class="body-sub svelte-stf9c8"> </div>'),Xt=y('<div class="body body-scalars svelte-stf9c8"><div class="row svelte-stf9c8"></div> <!></div>');function Jt(R,e){$(e,!0);var w=Xt(),f=r(w);ae(f,21,()=>e.card.scalars??[],ce,(g,d)=>{var p=Vt(),h=r(p),S=r(h,!0);t(h);var x=n(h,2),o=r(x,!0);t(x),t(p),C(()=>{ve(h,`color: var(--tier-${e.card.tier??""});`),m(S,a(d).value),m(o,a(d).label)}),c(g,p)}),t(f);var M=n(f,2);{var i=g=>{var d=Zt(),p=r(d,!0);t(d),C(()=>m(p,e.card.sub)),c(g,d)};B(M,g=>{e.card.sub&&g(i)})}t(w),c(R,w),ee()}var $t=y('<div class="headline svelte-jrppts"> </div>'),ea=y('<div class="subhead svelte-jrppts"> </div>'),ta=fe("<rect></rect>"),aa=y('<div class="body-sub svelte-jrppts"> </div>'),ra=y('<div class="body-sub svelte-jrppts"> </div>'),sa=y('<div class="body body-spark svelte-jrppts"><!> <!> <svg width="100%" preserveAspectRatio="none" aria-hidden="true" class="svelte-jrppts"></svg> <!> <!></div>');function ia(R,e){$(e,!0);const w=240,f=38;let M=P(()=>e.card.spark??e.card.histogram??[]),i=P(()=>Math.max(...a(M),1)),g=P(()=>a(M).length),d=P(()=>Math.max(2,w/Math.max(a(g),1)-1.5));var p=sa(),h=r(p);{var S=v=>{var k=$t(),L=r(k,!0);t(k),C(()=>{ve(k,`color: var(--tier-${e.card.tier??""});`),m(L,e.card.headline)}),c(v,k)};B(h,v=>{e.card.headline&&v(S)})}var x=n(h,2);{var o=v=>{var k=ea(),L=r(k,!0);t(k),C(()=>m(L,e.card.subhead)),c(v,k)};B(x,v=>{e.card.subhead&&v(o)})}var s=n(x,2);_(s,"viewBox","0 0 240 38"),_(s,"height",f),ae(s,21,()=>a(M),ce,(v,k,L)=>{var T=ta();C(()=>{_(T,"x",L/a(g)*w+.5),_(T,"y",f-a(k)/a(i)*f),_(T,"width",a(d)),_(T,"height",a(k)/a(i)*f),_(T,"fill",`var(--tier-${e.card.tier??""})`)}),c(v,T)}),t(s);var l=n(s,2);{var b=v=>{var k=aa(),L=r(k,!0);t(k),C(()=>m(L,e.card.sparkSub)),c(v,k)};B(l,v=>{e.card.sparkSub&&v(b)})}var N=n(l,2);{var u=v=>{var k=ra(),L=r(k,!0);t(k),C(()=>m(L,e.card.sub)),c(v,k)};B(N,v=>{!e.card.sparkSub&&e.card.sub&&v(u)})}t(p),c(R,p),ee()}var na=y('<span class="headline svelte-48vbub"> </span>'),la=y('<span class="subhead svelte-48vbub"> </span>'),oa=y('<span class="spatial-note svelte-48vbub"> </span>'),da=y("<span> </span>"),va=y('<div class="body-sub svelte-48vbub"><!> <!></div>'),ca=y('<div class="body body-timeseries svelte-48vbub"><div class="ts-header svelte-48vbub"><!> <!></div> <svg width="100%" aria-hidden="true" class="svelte-48vbub"><line stroke="#C9C9C5" stroke-width="0.5" stroke-dasharray="2 2"></line><path fill="none" stroke-width="1.4"></path><circle r="3"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle"> </text><text font-size="8" font-family="IBM Plex Mono" fill="#6B6B6B">now</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B"> </text></svg> <!></div>');function Ie(R,e){$(e,!0);const w=240,f=84,M=6,i=P(()=>e.card.timeseries??{hours:96,peak:{x:38,y:47},peakLabel:""}),g=P(()=>h(a(i))),d=P(()=>S(a(g),a(i))),p=P(()=>x(a(g),a(d)));function h(q){const E=[];for(let F=0;F<=q.hours;F++){const Y=6*Math.sin(F/12.42*Math.PI*2),Q=38*Math.exp(-Math.pow((F-q.peak.x)/12,2));E.push({x:F,y:Y+Q+4})}return E}function S(q,E){const F=Math.max(...q.map(Q=>Q.y),E.peak.y),Y=Math.min(...q.map(Q=>Q.y),-10);return{sx:Q=>M+Q/E.hours*(w-M*2),sy:Q=>f-M-14-(Q-Y)/(F-Y)*(f-M*2-14)}}function x(q,E){return q.map((F,Y)=>`${Y?"L":"M"} ${E.sx(F.x)} ${E.sy(F.y)}`).join(" ")}var o=ca(),s=r(o),l=r(s);{var b=q=>{var E=na(),F=r(E,!0);t(E),C(()=>{ve(E,`color: var(--tier-${e.card.tier??""});`),m(F,e.card.headline)}),c(q,E)};B(l,q=>{e.card.headline&&q(b)})}var N=n(l,2);{var u=q=>{var E=la(),F=r(E,!0);t(E),C(()=>m(F,e.card.subhead)),c(q,E)};B(N,q=>{e.card.subhead&&q(u)})}t(s);var v=n(s,2);_(v,"viewBox","0 0 240 84"),_(v,"height",f);var k=r(v);_(k,"x1",M),_(k,"x2",w-M);var L=n(k),T=n(L),O=n(T),j=r(O,!0);t(O);var I=n(O);_(I,"x",M),_(I,"y",f-2);var z=n(I);_(z,"x",w-M),_(z,"y",f-2);var H=r(z);t(z),t(v);var U=n(v,2);{var D=q=>{var E=va(),F=r(E);{var Y=G=>{var X=oa(),le=r(X,!0);t(X),C(()=>m(le,e.card.spatialNote)),c(G,X)};B(F,G=>{e.card.spatialNote&&G(Y)})}var Q=n(F,2);{var re=G=>{var X=da(),le=r(X,!0);t(X),C(()=>m(le,e.card.sub)),c(G,X)};B(Q,G=>{e.card.sub&&G(re)})}t(E),c(q,E)};B(U,q=>{(e.card.spatialNote||e.card.sub)&&q(D)})}t(o),C((q,E,F,Y,Q,re)=>{_(k,"y1",q),_(k,"y2",E),_(L,"d",a(p)),_(L,"stroke",`var(--tier-${e.card.tier??""})`),_(T,"cx",F),_(T,"cy",Y),_(T,"fill",`var(--tier-${e.card.tier??""})`),_(O,"x",Q),_(O,"y",re),_(O,"fill",`var(--tier-${e.card.tier??""})`),m(j,a(i).peakLabel),m(H,`+${a(i).hours??""}h`)},[()=>a(d).sy(0),()=>a(d).sy(0),()=>a(d).sx(a(i).peak.x),()=>a(d).sy(a(i).peak.y),()=>a(d).sx(a(i).peak.x),()=>a(d).sy(a(i).peak.y)-6]),c(R,o),ee()}var ua=y('<span class="ft-stat svelte-1y25lfh"><span class="ft-stat-k svelte-1y25lfh">RMSE</span> </span>'),ha=y('<span class="ft-stat ft-skill svelte-1y25lfh"> </span>'),ga=y('<span class="ft-badge svelte-1y25lfh" title="Trained on this hardware"> </span>'),ma=y('<a class="ft-link svelte-1y25lfh" target="_blank" rel="noopener noreferrer">Model card ↗</a>'),fa=y('<!> <div class="ft-footer svelte-1y25lfh"><!> <!> <!> <!></div>',1);function _a(R,e){$(e,!0);var w=fa(),f=te(w);Ie(f,{get card(){return e.card}});var M=n(f,2),i=r(M);{var g=s=>{var l=ua(),b=n(r(l));t(l),C(()=>m(b,` ${e.card.rmse??""}`)),c(s,l)};B(i,s=>{e.card.rmse&&s(g)})}var d=n(i,2);{var p=s=>{var l=ha(),b=r(l,!0);t(l),C(()=>m(b,e.card.skillVsPersistence)),c(s,l)};B(d,s=>{e.card.skillVsPersistence&&s(p)})}var h=n(d,2);{var S=s=>{var l=ga(),b=r(l,!0);t(l),C(()=>m(b,e.card.hardwareBadge)),c(s,l)};B(h,s=>{e.card.hardwareBadge&&s(S)})}var x=n(h,2);{var o=s=>{var l=ma();C(b=>_(l,"href",b),[()=>e.card.hfModelCard.startsWith("http")?e.card.hfModelCard:`https://${e.card.hfModelCard}`]),c(s,l)};B(x,s=>{e.card.hfModelCard&&s(o)})}t(M),c(R,w),ee()}var ya=fe('<circle r="2.2"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle" fill="#6B6B6B"> </text>',1),pa=y('<div class="body-sub svelte-gqkhpe"> </div>'),xa=y('<div class="body body-forecast svelte-gqkhpe"><svg width="100%" aria-hidden="true" class="svelte-gqkhpe"><path fill-opacity="0.18"></path><path fill="none" stroke-width="1.5"></path><!></svg> <!></div>');function ba(R,e){$(e,!0);const w=240,f=88,M=6;let i=P(()=>e.card.forecast??[]),g=P(()=>a(i).map((v,k)=>M+k/Math.max(a(i).length-1,1)*(w-M*2))),d=P(()=>Math.max(...a(i).map(v=>v.high),1));function p(v){return f-M-v/a(d)*(f-M*2-12)}let h=P(()=>a(g).map((v,k)=>`${k?"L":"M"} ${v} ${p(a(i)[k].mid)}`).join(" ")),S=P(()=>{if(!a(i).length)return"";const v=a(g).map((L,T)=>`${L} ${p(a(i)[T].low)}`).join(" L "),k=[...a(g)].reverse().map((L,T)=>`${L} ${p(a(i)[a(i).length-1-T].high)}`).join(" L ");return`M ${v} L ${k} Z`});var x=xa(),o=r(x);_(o,"viewBox","0 0 240 88"),_(o,"height",f);var s=r(o),l=n(s),b=n(l);ae(b,17,()=>a(i),ce,(v,k,L)=>{var T=ya(),O=te(T),j=n(O);_(j,"y",f-1);var I=r(j,!0);t(j),C(z=>{_(O,"cx",a(g)[L]),_(O,"cy",z),_(O,"fill",`var(--tier-${e.card.tier??""})`),_(j,"x",a(g)[L]),m(I,a(k).year)},[()=>p(a(k).mid)]),c(v,T)}),t(o);var N=n(o,2);{var u=v=>{var k=pa(),L=r(k,!0);t(k),C(()=>m(L,e.card.sub)),c(v,k)};B(N,v=>{e.card.sub&&v(u)})}t(x),C(()=>{_(s,"d",a(S)),_(s,"fill",`var(--tier-${e.card.tier??""})`),_(l,"d",a(h)),_(l,"stroke",`var(--tier-${e.card.tier??""})`)}),c(R,x),ee()}var wa=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M20 50 Q 60 38 90 56 Q 120 76 150 64 Q 180 50 180 86 Q 130 100 70 96 Q 30 92 20 76 Z" fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7"></path><path d="M40 60 Q 80 54 110 70 Q 140 84 160 78 Q 165 90 130 92 Q 80 90 50 82 Z" fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6"></path><circle cx="120" cy="74" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr · MOD</text></svg>'),ka=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z" fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2"></path><circle cx="120" cy="60" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding · MOD</text></svg>'),Sa=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><defs><pattern id="rt-s2-rgb" x="0" y="0" width="6" height="6" patternUnits="userSpaceOnUse"><rect width="6" height="6" fill="#7A8E6A"></rect><rect x="0" y="0" width="3" height="3" fill="#8D9C7A"></rect><rect x="3" y="3" width="3" height="3" fill="#69795D"></rect></pattern></defs><rect fill="url(#rt-s2-rgb)"></rect><rect x="0" y="55" height="6" fill="#A8A496"></rect><rect x="115" y="0" width="8" fill="#A8A496"></rect><ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65"></ellipse><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">PRITHVI · 0.3%</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text></svg>'),Ma=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#E8ECF2"></rect><rect x="0" y="0" width="80" height="60" fill="#C66"></rect><rect x="80" y="0" width="60" height="60" fill="#C66"></rect><rect x="140" y="0" width="100" height="38" fill="#C66"></rect><rect x="140" y="38" width="100" height="22" fill="#5B7FB4"></rect><rect x="0" y="60" width="100" height="60" fill="#C66"></rect><rect x="100" y="60" width="50" height="40" fill="#5B8A4A"></rect><rect x="150" y="60" width="50" height="60" fill="#D9C75A"></rect><rect x="200" y="60" width="40" height="60" fill="#C66"></rect><rect x="100" y="100" width="50" height="20" fill="#A89A78"></rect><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">LULC · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text></svg>'),Ca=fe('<rect fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4"></rect>'),Na=fe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#3A3A38"></rect><!><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">BLDG · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">36.2% built</text></svg>'),Ba=y('<div class="thumb-placeholder svelte-1lx1psy">raster preview</div>');function ze(R,e){var M=Me(),i=te(M);{var g=o=>{var s=wa();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l),N=r(b);_(N,"x2",240);var u=n(N);_(u,"x2",240);var v=n(u);_(v,"y2",120);var k=n(v);_(k,"y2",120),t(b);var L=n(b,4);_(L,"x",234),_(L,"y",115),t(s),c(o,s)},d=o=>{var s=ka();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l),N=r(b);_(N,"x2",240);var u=n(N);_(u,"x2",240);var v=n(u);_(v,"y2",120);var k=n(v);_(k,"y2",120),t(b);var L=n(b,3);_(L,"x",234),_(L,"y",115),t(s),c(o,s)},p=o=>{var s=Sa();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=n(r(s));_(l,"width",240),_(l,"height",120);var b=n(l);_(b,"width",240);var N=n(b);_(N,"height",120);var u=n(N,3);_(u,"x",234),_(u,"y",115),t(s),c(o,s)},h=o=>{var s=Ma();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l,11);_(b,"x",234),_(b,"y",115),t(s),c(o,s)},S=o=>{var s=Na();_(s,"viewBox","0 0 240 120"),_(s,"height",120);var l=r(s);_(l,"width",240),_(l,"height",120);var b=n(l);ae(b,16,()=>[[10,10,28,18],[42,10,30,16],[78,10,40,22],[124,10,32,18],[162,10,30,18],[198,10,32,18],[10,32,28,16],[42,30,30,18],[124,32,32,16],[162,32,30,16],[198,32,32,16],[10,55,28,18],[42,55,30,18],[78,55,40,18],[124,55,32,18],[162,55,30,18],[198,55,32,18],[10,80,28,16],[42,80,30,16],[78,80,40,16],[124,80,32,16],[162,80,30,16],[10,100,28,12],[42,100,30,12],[78,100,40,12]],ce,(u,v)=>{var k=Ca();C(()=>{_(k,"x",v[0]),_(k,"y",v[1]),_(k,"width",v[2]),_(k,"height",v[3])}),c(u,k)});var N=n(b,2);_(N,"x",234),_(N,"y",115),t(s),c(o,s)},x=o=>{var s=Ba();c(o,s)};B(i,o=>{e.kind==="stormwater"?o(g):e.kind==="stormwater-dry"?o(d,1):e.kind==="prithvi"?o(p,2):e.kind==="lulc"?o(h,3):e.kind==="buildings"?o(S,4):o(x,-1)})}c(R,M)}var La=y('<span class="illustrative svelte-1m43x1m" title="Illustrative rendering, not source pixels">illustrative</span>'),Aa=y('<span class="svelte-1m43x1m"> </span>'),Fa=y('<div class="raster-headline svelte-1m43x1m"><span class="svelte-1m43x1m"> </span> <!></div>'),Ra=y('<div class="body-sub svelte-1m43x1m"> </div>'),Ea=y('<div class="body body-raster svelte-1m43x1m"><div class="frame svelte-1m43x1m"><!> <!></div> <!> <!></div>');function Ta(R,e){$(e,!0);var w=Ea(),f=r(w),M=r(f);ze(M,{get kind(){return e.card.rasterKind}});var i=n(M,2);{var g=x=>{var o=La();c(x,o)};B(i,x=>{(e.card.illustrative||e.card.tier==="synthetic")&&x(g)})}t(f);var d=n(f,2);{var p=x=>{var o=Fa(),s=r(o),l=r(s,!0);t(s);var b=n(s,2);{var N=u=>{var v=Aa(),k=r(v);t(v),C(()=>m(k,`· ${e.card.subhead??""}`)),c(u,v)};B(b,u=>{e.card.subhead&&u(N)})}t(o),C(()=>{ve(s,`color: var(--tier-${e.card.tier??""});`),m(l,e.card.headline)}),c(x,o)};B(d,x=>{e.card.headline&&x(p)})}var h=n(d,2);{var S=x=>{var o=Ra(),s=r(o,!0);t(o),C(()=>m(s,e.card.sub)),c(x,o)};B(h,x=>{e.card.sub&&x(S)})}t(w),c(R,w),ee()}var qa=y('<span class="illustrative svelte-1td276x" title="Illustrative rendering, not source pixels">illustrative</span>'),Pa=y('<span class="bar-seg svelte-1td276x"></span>'),Da=y('<li class="svelte-1td276x"><span class="swatch svelte-1td276x"></span> <span class="legend-k svelte-1td276x"> </span> <span class="legend-pct svelte-1td276x"> </span></li>'),Ia=y('<div class="bar svelte-1td276x" role="img" aria-label="LULC class mix"></div> <ul class="legend svelte-1td276x"></ul>',1),za=y('<div class="body-sub svelte-1td276x"> </div>'),Oa=y('<div class="body body-lulc svelte-1td276x"><div class="frame svelte-1td276x"><!> <!></div> <!> <!></div>');function Ha(R,e){$(e,!0);let w=P(()=>(e.card.classMix??[]).reduce((o,s)=>o+(s.pct||0),0)||1);var f=Oa(),M=r(f),i=r(M);{let o=P(()=>e.card.rasterKind??"lulc");ze(i,{get kind(){return a(o)}})}var g=n(i,2);{var d=o=>{var s=qa();c(o,s)};B(g,o=>{(e.card.illustrative||e.card.tier==="synthetic")&&o(d)})}t(M);var p=n(M,2);{var h=o=>{var s=Ia(),l=te(s);ae(l,21,()=>e.card.classMix,N=>N.k,(N,u)=>{var v=Pa();let k;C(()=>{_(v,"title",`${a(u).k??""}: ${a(u).pct??""}%`),k=ve(v,"",k,{"flex-grow":a(u).pct/a(w),background:a(u).color})}),c(N,v)}),t(l);var b=n(l,2);ae(b,21,()=>e.card.classMix,N=>N.k,(N,u)=>{var v=Da(),k=r(v);let L;var T=n(k,2),O=r(T,!0);t(T);var j=n(T,2),I=r(j);t(j),t(v),C(()=>{L=ve(k,"",L,{background:a(u).color}),m(O,a(u).k),m(I,`${a(u).pct??""}%`)}),c(N,v)}),t(b),c(o,s)};B(p,o=>{var s;(s=e.card.classMix)!=null&&s.length&&o(h)})}var S=n(p,2);{var x=o=>{var s=za(),l=r(s,!0);t(s),C(()=>m(l,e.card.sub)),c(o,s)};B(S,o=>{e.card.sub&&o(x)})}t(f),c(R,f),ee()}var ja=y('<span class="reg-label svelte-1iup6im"> </span> <span class="reg-source svelte-1iup6im"> </span>',1),Ya=y('<span class="reg-silent svelte-1iup6im"> </span>'),Wa=y('<li><span class="reg-tag svelte-1iup6im"><!> <span> </span></span> <!></li>'),Ua=y('<div class="body-sub svelte-1iup6im"> </div>'),Ka=y('<div class="body body-register svelte-1iup6im"><ul class="reg-list svelte-1iup6im"></ul> <!></div>');function Ga(R,e){$(e,!0);var w=Ka(),f=r(w);ae(f,21,()=>e.card.registers??[],ce,(g,d)=>{var p=Wa();let h;var S=r(p),x=r(S);me(x,{get tier(){return a(d).tier},size:9,get color(){return`var(--tier-${a(d).tier??""})`}});var o=n(x,2),s=r(o,!0);t(o),t(S);var l=n(S,2);{var b=u=>{var v=ja(),k=te(v),L=r(k,!0);t(k);var T=n(k,2),O=r(T,!0);t(T),C(()=>{_(k,"title",a(d).detail?`${a(d).label} — ${a(d).detail}`:a(d).label),m(L,a(d).label),m(O,a(d).sourceId??"")}),c(u,v)},N=u=>{var v=Ya(),k=r(v,!0);t(v),C(()=>m(k,a(d).note)),c(u,v)};B(l,u=>{a(d).label?u(b):u(N,-1)})}t(p),C(()=>{h=ge(p,1,"reg-row svelte-1iup6im",null,h,{silent:!a(d).label}),_(S,"title",a(d).tier),m(s,a(d).reg)}),c(g,p)}),t(f);var M=n(f,2);{var i=g=>{var d=Ua(),p=r(d,!0);t(d),C(()=>m(p,e.card.sub)),c(g,d)};B(M,g=>{e.card.sub&&g(i)})}t(w),c(R,w),ee()}var Qa=y('<div class="cell-aux svelte-1swqabu"> </div>'),Va=y('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Za=y('<div class="cell-aux svelte-1swqabu"> </div>'),Xa=y('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Ja=y('<div class="cmp-delta svelte-1swqabu"> </div>'),$a=y('<div class="body-sub svelte-1swqabu"> </div>'),er=y('<div class="body body-comparison svelte-1swqabu"><div class="cmp-grid svelte-1swqabu"><!> <div class="divider svelte-1swqabu" aria-hidden="true">vs</div> <!></div> <!> <!></div>');function tr(R,e){$(e,!0);var w=er(),f=r(w),M=r(f);{var i=o=>{var s=Va(),l=r(s),b=r(l);me(b,{get tier(){return e.card.left.tier},size:10,get color(){return`var(--tier-${e.card.left.tier??""})`}});var N=n(b,2),u=r(N,!0);t(N),t(l);var v=n(l,2),k=r(v,!0);t(v);var L=n(v,2);{var T=O=>{var j=Qa(),I=r(j,!0);t(j),C(()=>m(I,e.card.left.aux)),c(O,j)};B(L,O=>{e.card.left.aux&&O(T)})}t(s),C(()=>{m(u,e.card.left.label),ve(v,`color: var(--tier-${e.card.left.tier??""});`),m(k,e.card.left.value)}),c(o,s)};B(M,o=>{e.card.left&&o(i)})}var g=n(M,4);{var d=o=>{var s=Xa(),l=r(s),b=r(l);me(b,{get tier(){return e.card.right.tier},size:10,get color(){return`var(--tier-${e.card.right.tier??""})`}});var N=n(b,2),u=r(N,!0);t(N),t(l);var v=n(l,2),k=r(v,!0);t(v);var L=n(v,2);{var T=O=>{var j=Za(),I=r(j,!0);t(j),C(()=>m(I,e.card.right.aux)),c(O,j)};B(L,O=>{e.card.right.aux&&O(T)})}t(s),C(()=>{m(u,e.card.right.label),ve(v,`color: var(--tier-${e.card.right.tier??""});`),m(k,e.card.right.value)}),c(o,s)};B(g,o=>{e.card.right&&o(d)})}t(f);var p=n(f,2);{var h=o=>{var s=Ja(),l=r(s,!0);t(s),C(()=>m(l,e.card.delta)),c(o,s)};B(p,o=>{e.card.delta&&o(h)})}var S=n(p,2);{var x=o=>{var s=$a(),l=r(s,!0);t(s),C(()=>m(l,e.card.sub)),c(o,s)};B(S,o=>{e.card.sub&&o(x)})}t(w),c(R,w),ee()}var ar=y('<div class="meta-row svelte-e40scu"><dt class="svelte-e40scu"> </dt> <dd class="svelte-e40scu"> </dd></div>'),rr=y('<div class="body-sub svelte-e40scu"> </div>'),sr=y('<div class="body body-meta svelte-e40scu"><dl class="meta-list svelte-e40scu"></dl> <!></div>');function ir(R,e){$(e,!0);var w=sr(),f=r(w);ae(f,21,()=>e.card.metaRows??[],ce,(g,d)=>{var p=ar(),h=r(p),S=r(h,!0);t(h);var x=n(h,2),o=r(x,!0);t(x),t(p),C(()=>{m(S,a(d).k),m(o,a(d).v)}),c(g,p)}),t(f);var M=n(f,2);{var i=g=>{var d=rr(),p=r(d,!0);t(d),C(()=>m(p,e.card.sub)),c(g,d)};B(M,g=>{e.card.sub&&g(i)})}t(w),c(R,w),ee()}var nr=y('<div class="unknown svelte-1x6xqhh"> </div>');function lr(R,e){$(e,!0);var w=Me(),f=te(w);{var M=u=>{jt(u,{get card(){return e.card}})},i=u=>{Qt(u,{get card(){return e.card}})},g=u=>{Jt(u,{get card(){return e.card}})},d=u=>{ia(u,{get card(){return e.card}})},p=u=>{Ie(u,{get card(){return e.card}})},h=u=>{_a(u,{get card(){return e.card}})},S=u=>{ba(u,{get card(){return e.card}})},x=u=>{Ta(u,{get card(){return e.card}})},o=u=>{Ha(u,{get card(){return e.card}})},s=u=>{Ga(u,{get card(){return e.card}})},l=u=>{tr(u,{get card(){return e.card}})},b=u=>{ir(u,{get card(){return e.card}})},N=u=>{var v=nr(),k=r(v);t(v),C(()=>m(k,`unknown variant: ${e.card.variant??""}`)),c(u,v)};B(f,u=>{e.card.variant==="headline"?u(M):e.card.variant==="tabular"?u(i,1):e.card.variant==="scalars"?u(g,2):e.card.variant==="spark"||e.card.variant==="histogram"?u(d,3):e.card.variant==="timeseries"?u(p,4):e.card.variant==="timeseries-ft"?u(h,5):e.card.variant==="forecast"?u(S,6):e.card.variant==="raster"||e.card.variant==="raster-pred"?u(x,7):e.card.variant==="lulc"?u(o,8):e.card.variant==="register"?u(s,9):e.card.variant==="comparison"?u(l,10):e.card.variant==="meta"?u(b,11):u(N,-1)})}c(R,w),ee()}var or=y('<button type="button" class="fc-foot-cite svelte-1nuvnzu"><span class="fc-foot-docid svelte-1nuvnzu"> </span> <span class="fc-foot-arrow svelte-1nuvnzu" aria-hidden="true">→</span></button>'),dr=y('<span class="fc-foot-docid fc-foot-docid-mute svelte-1nuvnzu"> </span>'),vr=y('<header class="fc-head svelte-1nuvnzu"><div class="fc-head-source svelte-1nuvnzu"><!> <span class="fc-head-source-label svelte-1nuvnzu"> </span></div> <span class="fc-head-vintage svelte-1nuvnzu"> </span></header> <h4 class="fc-title svelte-1nuvnzu"> </h4> <!> <footer class="fc-foot svelte-1nuvnzu"><!> <span><!> <span> </span></span></footer>',1);function Oe(R,e){$(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"linkedKey",3,null),M=P(()=>f()!=null&&e.card.mapLayer!=null&&e.card.mapLayer===f()),i=P(()=>Pe[e.card.tier].short),g=P(()=>e.card.mapLayer!=null);function d(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,e.card.mapLayer))}function p(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,null))}function h(s){var l;s.stopPropagation(),e.card.citeId&&((l=e.onCite)==null||l.call(e,e.card.citeId))}function S(s){var l;a(g)&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(l=e.onLink)==null||l.call(e,e.card.mapLayer??null))}var x=Me(),o=te(x);ut(o,()=>a(g)?"button":"article",!1,(s,l)=>{it(s,()=>({type:a(g)?"button":void 0,role:a(g)?"button":"article",class:`fc fc-${e.card.variant??""} fc-tier-${e.card.tier??""}`,"aria-labelledby":`fc-${e.card.id}-title`,"aria-label":`${Pe[e.card.tier].label} card · ${e.card.title} · ${e.card.source}`,onpointerenter:d,onpointerleave:p,onfocus:d,onblur:p,onkeydown:S,[nt]:{"is-compact":w()==="compact","is-linked":a(M),"is-interactive":a(g),"has-illustrative":e.card.illustrative||e.card.tier==="synthetic"||e.card.variant==="comparison"}}),void 0,void 0,void 0,"svelte-1nuvnzu");var b=vr(),N=te(b),u=r(N),v=r(u);me(v,{get tier(){return e.card.tier},size:11,get color(){return`var(--tier-${e.card.tier??""})`}});var k=n(v,2),L=r(k,!0);t(k),t(u);var T=n(u,2),O=r(T);t(T),t(N);var j=n(N,2),I=r(j,!0);t(j);var z=n(j,2);lr(z,{get card(){return e.card}});var H=n(z,2),U=r(H);{var D=re=>{var G=or(),X=r(G),le=r(X,!0);t(X),se(2),t(G),C(()=>{_(G,"title",`Open ${e.card.docId} in citation drawer`),m(le,e.card.docId)}),Re("click",G,h),c(re,G)},q=re=>{var G=dr(),X=r(G,!0);t(G),C(()=>m(X,e.card.docId)),c(re,G)};B(U,re=>{e.card.citeId?re(D):re(q,-1)})}var E=n(U,2),F=r(E);me(F,{get tier(){return e.card.tier},size:9,get color(){return`var(--tier-${e.card.tier??""})`}});var Y=n(F,2),Q=r(Y,!0);t(Y),t(E),t(H),C(()=>{_(k,"title",e.card.agency),m(L,e.card.source),m(O,`v. ${e.card.vintage??""}`),_(j,"id",`fc-${e.card.id}-title`),m(I,e.card.title),ge(E,1,`fc-tier-badge fc-tier-badge-${e.card.tier??""}`,"svelte-1nuvnzu"),_(E,"aria-label",`epistemic tier ${a(i)}`),m(Q,a(i))}),c(l,b)}),c(R,x),ee()}Fe(["click"]);var cr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="silent svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> silent</span>',1),ur=y('<span class="sep svelte-1qqbvs2">·</span> <span class="warn svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> warn</span>',1),hr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="err svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> errored</span>',1),gr=y('<span class="sep svelte-1qqbvs2">·</span> <span class="notinvoked svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> not invoked</span>',1),mr=y('<span class="tally svelte-1qqbvs2"><span class="cards"> </span> <span class="sep svelte-1qqbvs2">·</span> <span class="fired"><strong class="svelte-1qqbvs2"> </strong> fired</span> <!> <!> <!> <!> <span class="sep svelte-1qqbvs2">·</span> <span class="ms"><strong class="svelte-1qqbvs2"> </strong></span></span>');function fr(R,e){$(e,!0);function w(D){return D.flatMap(q=>q.children?[q,...w(q.children)]:[q])}let f=P(()=>w(e.members)),M=P(()=>a(f).filter(D=>D.status==="fired"||D.status==="warned").length),i=P(()=>a(f).filter(D=>D.status==="silent_by_design").length),g=P(()=>a(f).filter(D=>D.status==="warned").length),d=P(()=>a(f).filter(D=>D.status==="errored").length),p=P(()=>a(f).filter(D=>D.status==="not_invoked").length),h=P(()=>e.members.reduce((D,q)=>Math.max(D,q.ms??0),0));function S(D){return D===0?"—":D<1e3?`${D}ms`:`${(D/1e3).toFixed(1)}s`}var x=mr(),o=r(x),s=r(o);t(o);var l=n(o,4),b=r(l),N=r(b,!0);t(b),se(),t(l);var u=n(l,2);{var v=D=>{var q=cr(),E=n(te(q),2),F=r(E),Y=r(F,!0);t(F),se(),t(E),C(()=>m(Y,a(i))),c(D,q)};B(u,D=>{a(i)>0&&D(v)})}var k=n(u,2);{var L=D=>{var q=ur(),E=n(te(q),2),F=r(E),Y=r(F,!0);t(F),se(),t(E),C(()=>m(Y,a(g))),c(D,q)};B(k,D=>{a(g)>0&&D(L)})}var T=n(k,2);{var O=D=>{var q=hr(),E=n(te(q),2),F=r(E),Y=r(F,!0);t(F),se(),t(E),C(()=>m(Y,a(d))),c(D,q)};B(T,D=>{a(d)>0&&D(O)})}var j=n(T,2);{var I=D=>{var q=gr(),E=n(te(q),2),F=r(E),Y=r(F,!0);t(F),se(),t(E),C(()=>m(Y,a(p))),c(D,q)};B(j,D=>{a(p)>0&&D(I)})}var z=n(j,4),H=r(z),U=r(H,!0);t(H),t(z),t(x),C(D=>{m(s,`${e.cardCount??""} card${e.cardCount===1?"":"s"}`),m(N,a(M)),m(U,D)},[()=>S(a(h))]),c(R,x),ee()}var _r=y('<span class="prov-tier svelte-qakefz"><!></span>'),yr=y('<span class="prov-note svelte-qakefz"> </span>'),pr=y('<span class="prov-ms svelte-qakefz"> </span>'),xr=y('<li class="prov-children svelte-qakefz"><!></li>'),br=y('<li><span class="prov-pip svelte-qakefz" aria-hidden="true"> </span> <span class="prov-id svelte-qakefz"> </span> <!> <span class="prov-name svelte-qakefz"> </span> <!> <!></li> <!>',1),wr=y('<ul class="prov-tree svelte-qakefz"></ul>');function He(R,e){$(e,!0);let w=ne(e,"depth",3,0);function f(g){return{fired:"●",silent_by_design:"○",warned:"▲",errored:"■",not_invoked:"□"}[g]}function M(g){return g.status==="warned"?"#B7791F":g.status==="errored"?"#B91C1C":g.status==="silent_by_design"||g.status==="not_invoked"?"var(--ink-tertiary)":g.tier?`var(--tier-${g.tier})`:"var(--ink)"}var i=wr();ae(i,21,()=>e.members,g=>g.id,(g,d)=>{var p=br(),h=te(p),S=r(h),x=r(S,!0);t(S);var o=n(S,2),s=r(o,!0);t(o);var l=n(o,2);{var b=I=>{var z=_r(),H=r(z);{let U=P(()=>`var(--tier-${a(d).tier})`);me(H,{get tier(){return a(d).tier},size:9,get color(){return a(U)}})}t(z),c(I,z)};B(l,I=>{a(d).tier&&I(b)})}var N=n(l,2),u=r(N,!0);t(N);var v=n(N,2);{var k=I=>{var z=yr(),H=r(z);t(z),C(()=>m(H,`— ${a(d).note??""}`)),c(I,z)};B(v,I=>{a(d).note&&I(k)})}var L=n(v,2);{var T=I=>{var z=pr(),H=r(z,!0);t(z),C(U=>m(H,U),[()=>a(d).ms<1e3?`${a(d).ms}ms`:`${(a(d).ms/1e3).toFixed(1)}s`]),c(I,z)};B(L,I=>{a(d).ms!=null&&I(T)})}t(h);var O=n(h,2);{var j=I=>{var z=xr(),H=r(z);{let U=P(()=>w()+1);He(H,{get members(){return a(d).children},get depth(){return a(U)}})}t(z),c(I,z)};B(O,I=>{var z;(z=a(d).children)!=null&&z.length&&I(j)})}C((I,z)=>{ge(h,1,`prov-row prov-status-${a(d).status??""}`,"svelte-qakefz"),ve(S,`color: ${I??""};`),m(x,z),m(s,a(d).id),m(u,a(d).name)},[()=>M(a(d)),()=>f(a(d).status)]),c(g,p)}),t(i),C(()=>ve(i,`--depth: ${w()??""};`)),c(R,i),ee()}var kr=y('<div class="silent svelte-16iv0n8"><span class="silent-tag svelte-16iv0n8">silent</span> <p class="silent-prose svelte-16iv0n8"><!></p></div>'),Sr=y("<div></div>"),Mr=y('<div class="prov-body svelte-16iv0n8"><!></div>'),Cr=y('<section><header class="region-head svelte-16iv0n8"><div class="region-head-left svelte-16iv0n8"><span class="region-num svelte-16iv0n8"> </span> <h3 class="region-name svelte-16iv0n8"> </h3> <span class="region-role svelte-16iv0n8"> </span> <span class="region-tag svelte-16iv0n8"> </span></div> <!></header> <!> <div class="prov svelte-16iv0n8"><button type="button" class="prov-toggle svelte-16iv0n8"><span class="prov-caret svelte-16iv0n8" aria-hidden="true"> </span> <span class="prov-label"> </span> <span class="prov-meta svelte-16iv0n8"> </span></button> <!></div></section>');function Nr(R,e){$(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"provenanceMode",3,"smart"),M=ne(e,"linkedKey",3,null),i=P(()=>Ae[e.stone]),g=P(()=>`${Ee.indexOf(e.stone)+1}`.padStart(2,"0")),d=P(()=>e.stone==="capstone");function p(J){return J.flatMap(V=>V.children?[V,...p(V.children)]:[V])}let h=P(()=>p(e.trace.members)),S=P(()=>a(h).length),x=P(()=>a(h).some(J=>J.status==="warned"||J.status==="errored"||J.status==="not_invoked")),o=P(()=>f()==="all-expanded"?!0:f()==="all-collapsed"?!1:a(x)),s=Le(null),l=P(()=>a(s)??a(o));ie(()=>{f(),Se(s,null)});var b=Cr(),N=r(b),u=r(N),v=r(u),k=r(v,!0);t(v);var L=n(v,2),T=r(L,!0);t(L);var O=n(L,2),j=r(O);t(O);var I=n(O,2),z=r(I,!0);t(I),t(u);var H=n(u,2);fr(H,{get cardCount(){return e.cards.length},get members(){return e.trace.members}}),t(N);var U=n(N,2);{var D=J=>{var V=kr(),oe=n(r(V),2),ue=r(oe);{var ye=W=>{var K=we("No projection cards landed for this query. Atomic functions still ran (see provenance) and returned silence rather than confabulation.");c(W,K)},A=W=>{var K=we("No cards for this Stone on this query.");c(W,K)};B(ue,W=>{e.stone==="lodestone"?W(ye):W(A,-1)})}t(oe),t(V),c(J,V)},q=J=>{var V=Sr();let oe;ae(V,21,()=>e.cards,ue=>ue.id,(ue,ye)=>{Oe(ue,{get card(){return a(ye)},get density(){return w()},get linkedKey(){return M()},get onCite(){return e.onCite},get onLink(){return e.onLink}})}),t(V),C(()=>oe=ge(V,1,"rail svelte-16iv0n8",null,oe,{"rail-capstone":a(d)})),c(J,V)};B(U,J=>{e.cards.length===0?J(D):J(q,-1)})}var E=n(U,2),F=r(E),Y=r(F),Q=r(Y,!0);t(Y);var re=n(Y,2),G=r(re);t(re);var X=n(re,2),le=r(X);t(X),t(F);var _e=n(F,2);{var be=J=>{var V=Mr(),oe=r(V);He(oe,{get members(){return e.trace.members}}),t(V),C(()=>_(V,"id",`prov-body-${e.stone}`)),c(J,V)};B(_e,J=>{a(l)&&J(be)})}t(E),t(b),C(()=>{ge(b,1,`region region-${e.stone??""}`,"svelte-16iv0n8"),_(b,"aria-labelledby",`region-h-${e.stone}`),_(b,"data-stone",e.stone),m(k,a(g)),_(L,"id",`region-h-${e.stone}`),m(T,a(i).name),m(j,`· ${a(i).role??""}`),m(z,a(i).tag),_(F,"aria-expanded",a(l)),_(F,"aria-controls",`prov-body-${e.stone}`),m(Q,a(l)?"▾":"▸"),m(G,`${a(l)?"Hide":"Show"} provenance`),m(le,`· ${a(S)??""} function${a(S)===1?"":"s"}`)}),Re("click",F,()=>Se(s,!a(l))),c(R,b),ee()}Fe(["click"]);var Br=y('<section class="region region-grammar svelte-gwg123" aria-label="Card grammar reference"><header class="region-head svelte-gwg123"><div class="region-head-left svelte-gwg123"><span class="region-num svelte-gwg123">SPEC</span> <h3 class="region-name svelte-gwg123">Card grammar</h3> <span class="region-role svelte-gwg123">· every body variant in the system</span> <span class="region-tag svelte-gwg123">stubs, not findings</span></div> <span class="grammar-count svelte-gwg123"> </span></header> <div class="rail svelte-gwg123"></div></section>');function Lr(R,e){let w=ne(e,"density",3,"comfortable");const f=[{id:"grm-headline",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"spec",vintage:"spec",title:"Single big number, scenario-tagged",headline:"Zone AE",subhead:"preliminary FIRM, panel ID",sub:"Use when the answer is one categorical state.",docId:"DS-HEADLINE"},{id:"grm-tabular",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"spec",vintage:"spec",title:"Small table of observations",columns:["id","value","dist."],rows:[["ROW-001","1.2 m","0.18 mi"],["ROW-002","0.9 m","0.32 mi"],["ROW-003","0.7 m","0.41 mi"]],sub:"Use when 3–8 records each carry the same fields.",docId:"DS-TABULAR"},{id:"grm-scalars",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:"spec",vintage:"spec",title:"Trio of scalar readings",scalars:[{value:"0.02 in",label:"precip · 24h"},{value:"11 mph",label:"wind"},{value:"63°F",label:"temp"}],sub:"Use for current-state dashboards.",docId:"DS-SCALARS"},{id:"grm-spark",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"spec",vintage:"spec",title:"Sparkline of recent events",headline:"n events",subhead:"window · peak",spark:[1,2,4,3,7,12,8,5,3,2,4,9,6],docId:"DS-SPARK"},{id:"grm-histogram",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"spec",vintage:"spec",title:"Histogram of binned counts",headline:"n calls",subhead:"window · seasonal note",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],docId:"DS-HIST"},{id:"grm-timeseries",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM",agency:"spec",vintage:"spec",title:"Forecast curve with horizon",headline:"+0.41 m peak",subhead:"+38h · 90% CI",timeseries:{hours:96,peak:{x:38,y:41},peakLabel:"+0.41 m"},spatialNote:"regional",sub:"Spatial-index callout when station ≠ point-of-query.",docId:"DS-TS"},{id:"grm-forecast",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"spec",vintage:"spec",title:"Long-horizon scenario projections",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2100,low:38,mid:71,high:114}],sub:"Use for decadal+ uncertainty cones.",docId:"DS-FCST"},{id:"grm-raster",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"spec",vintage:"spec",title:"Raster snapshot, mapped layer",rasterKind:"stormwater",headline:"ponding",subhead:"scenario · pixel summary",sub:"Use for any 2D model output.",docId:"DS-RASTER"},{id:"grm-rasterpred",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC",agency:"spec",vintage:"spec",title:"Raster prediction, illustrative",rasterKind:"prithvi",headline:"n% flooded",subhead:"model · scene id",illustrative:!0,sub:"Same chrome as raster + illustrative tag.",docId:"DS-RASTERPRED"},{id:"grm-register",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"spec",vintage:"spec",title:"Composite register list",registers:[{reg:"MTA",tier:"empirical",label:"Station entrance",detail:"0.18 mi · 5",sourceId:"MTA-X",note:null},{reg:"NYCHA",tier:"empirical",label:"Development",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-Y",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi"}],sub:"Use when many specialists join into one Stone.",docId:"DS-REGISTER"},{id:"grm-comparison",stone:"keystone",tier:"synthetic",variant:"comparison",source:"EMP × SYN",agency:"spec",vintage:"spec",title:"Documented vs. interpreted",left:{tier:"empirical",label:"documented",value:"31.4%",aux:"n polygons"},right:{tier:"synthetic",label:"interpreted",value:"29.8%",aux:"n polygons"},delta:"Δ = −1.6 pp · agreement strong",sub:"Use to surface model–ground-truth deltas.",docId:"DS-CMP"},{id:"grm-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"spec",vintage:"spec",title:"Capstone reconciliation",metaRows:[{k:"claims",v:"12 / 12 grounded"},{k:"tier mix",v:"EMP 5 · MOD 4 · PRX 2 · SYN 1"},{k:"tier-1 freshness",v:"median 38 d"},{k:"warnings",v:"0"}],sub:"Use to expose the synthesis layer's audit.",docId:"DS-META"}];var M=Br(),i=r(M),g=n(r(i),2),d=r(g);t(g),t(i);var p=n(i,2);ae(p,21,()=>f,h=>h.id,(h,S)=>{Oe(h,{get card(){return a(S)},get density(){return w()}})}),t(p),t(M),C(()=>m(d,`${f.length??""} variants`)),c(R,M)}var Ar=y('<section class="findings svelte-ci42t5" aria-label="Findings, grouped by Stone"><header class="findings-head svelte-ci42t5"><h2 class="findings-h2 svelte-ci42t5">Findings · grouped by Stone</h2> <span class="findings-tagline svelte-ci42t5">cards = what each Stone found · provenance collapses below</span></header> <!> <!> <!></section>');function Wr(R,e){$(e,!0);let w=ne(e,"density",3,"comfortable"),f=ne(e,"provenanceMode",3,"smart"),M=ne(e,"showGrammar",3,!1),i=ne(e,"linkedKey",3,null),g=P(()=>{const s={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};for(const l of e.data.cards)s[l.stone].push(l);return s}),d=P(()=>{const s={cornerstone:{key:"cornerstone",members:[]},keystone:{key:"keystone",members:[]},touchstone:{key:"touchstone",members:[]},lodestone:{key:"lodestone",members:[]},capstone:{key:"capstone",members:[]}};for(const l of e.data.stones)s[l.key]=l;return s});var p=Ar(),h=n(r(p),2);It(h,{get cards(){return e.data.cards},get stones(){return e.data.stones},get wallSeconds(){return e.data.wallSeconds},get cacheHit(){return e.data.cacheHit},get emissions(){return e.data.emissions}});var S=n(h,2);ae(S,16,()=>Ee,s=>s,(s,l)=>{Nr(s,{get stone(){return l},get cards(){return a(g)[l]},get trace(){return a(d)[l]},get density(){return w()},get provenanceMode(){return f()},get linkedKey(){return i()},get onCite(){return e.onCite},get onLink(){return e.onLink}})});var x=n(S,2);{var o=s=>{Lr(s,{get density(){return w()}})};B(x,s=>{M()&&s(o)})}t(p),c(R,p),ee()}const Fr={cornerstone:[{id:"CORN-001",name:"sandy_inundation.lookup",stepNames:["sandy","sandy_inundation","sandy_nta"],tier:"empirical",skipReason:"Sandy 2012 inundation: query outside NYC bounds"},{id:"CORN-002",name:"dep_stormwater.lookup",stepNames:["dep","dep_stormwater","dep_extreme_2080_nta","dep_moderate_2050_nta","dep_moderate_current_nta"],tier:"modeled",skipReason:"NYC DEP stormwater scenarios: query outside NYC bounds"},{id:"CORN-003",name:"usgs_hwm.spatial_join",stepNames:["ida_hwm","ida_hwm_2021"],tier:"empirical",skipReason:"USGS Ida HWMs: no marks within 800 m of address"},{id:"CORN-004",name:"prithvi_water.lookup",stepNames:["prithvi","prithvi_eo_v2"],tier:"modeled",skipReason:"Prithvi-EO Ida polygons: no polygons within 500 m"},{id:"CORN-005",name:"microtopo.dem_hand_twi",stepNames:["microtopo","microtopo_lidar","microtopo_nta"],tier:"proxy",skipReason:"USGS 3DEP DEM: query outside NYC raster coverage"}],keystone:[{id:"KEY-001",name:"mta_entrance_exposure",stepNames:["mta_entrances","mta_entrance_exposure"],tier:"empirical",skipReason:"no entrances within radius"},{id:"KEY-002",name:"nycha.development_join",stepNames:["nycha","nycha_development_exposure"],tier:"empirical",skipReason:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe.school_join",stepNames:["doe_schools","doe_school_exposure"],tier:"empirical",skipReason:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh.facility_join",stepNames:["doh_hospitals","doh_hospital_exposure"],tier:"empirical",skipReason:"no acute-care hospitals within 1.0 mi"},{id:"KEY-005",name:"pluto.lot_lookup",stepNames:["pluto_lookup"],tier:"empirical",skipReason:"PLUTO join skipped: queried address not in NYC PLUTO dataset"},{id:"KEY-006",name:"terramind.buildings",stepNames:["terramind_buildings","terramind_synthesis"],tier:"modeled",skipReason:"TerraMind Buildings: no eo_chip available for this address (recent <30% cloud Sentinel-2 missing) or no high-confidence prediction"}],touchstone:[{id:"TCH-001",name:"floodnet.history",stepNames:["floodnet"],tier:"empirical",skipReason:"FloodNet sensor: no deployments within 600 m"},{id:"TCH-002",name:"nyc311.flood_complaints",stepNames:["nyc311","nyc311_nta"],tier:"proxy",skipReason:"NYC 311: no flood-relevant complaints within 200 m"},{id:"TCH-003",name:"nws_obs.metar",stepNames:["nws_obs"],tier:"empirical",skipReason:"NWS hourly METAR: nearest ASOS reports no precipitation"},{id:"TCH-004",name:"noaa_coops.recent",stepNames:["noaa_tides"],tier:"empirical",skipReason:"NOAA tide gauge: nearest station >25 km from address"},{id:"TCH-005",name:"prithvi_nyc_pluvial",stepNames:["prithvi_live","prithvi_eo_live"],tier:"modeled",skipReason:"Prithvi-NYC-Pluvial: no <30% cloud Sentinel-2 chip available in the last 120 d for this address"},{id:"TCH-006",name:"terramind.lulc",stepNames:["terramind_lulc"],tier:"synthetic",skipReason:"TerraMind LULC: eo_chip fetch returned no Sentinel-2 tile for this address"}],lodestone:[{id:"LOD-001",name:"nws_alerts.flood_relevant",stepNames:["nws_alerts"],tier:"modeled",skipReason:"NWS public alerts: no active flood-relevant alerts at this address"},{id:"LOD-002",name:"ttm_battery_surge.zero_shot",stepNames:["ttm_forecast"],tier:"modeled",skipReason:"Granite TTM r2 zero-shot: forecast not interesting (peak |residual| < 0.3 ft)"},{id:"LOD-003",name:"ttm_battery_surge.fine_tune",stepNames:["ttm_battery_surge"],tier:"modeled",skipReason:"Granite TTM Battery fine-tune: forecast not interesting (peak |residual| < 0.3 m)"},{id:"LOD-004",name:"ttm_311_forecast",stepNames:["ttm_311_forecast"],tier:"modeled",skipReason:"NYC 311 weekly forecast: no per-address history to extrapolate"},{id:"LOD-005",name:"floodnet_forecast",stepNames:["floodnet_forecast"],tier:"modeled",skipReason:"FloodNet sensor recurrence: sensor has < silent-floor historical events; forecast omitted"},{id:"LOD-006",name:"npcc4.slr_projection",stepNames:["npcc4_projection"],tier:"modeled",skipReason:"NPCC4 SLR projection: not yet wired into FSM (static reference card on hold)"}],capstone:[{id:"CAP-001",name:"rag.granite_embedding",stepNames:["rag_granite_embedding"],tier:"proxy",skipReason:"Granite Embedding RAG: no policy retrieval (out-of-NYC scope)"},{id:"CAP-002",name:"gliner.typed_extraction",stepNames:["gliner_extract"],tier:"proxy",skipReason:"GLiNER typed extraction: no RAG hits to extract over"},{id:"CAP-003",name:"granite41.compose_briefing",stepNames:["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"],tier:"modeled",skipReason:"Reconciler did not run (no grounded data available)"},{id:"CAP-004",name:"mellea.grounding_check",stepNames:["mellea_grounding"],tier:"modeled",skipReason:"Mellea grounding-check: rolled into reconcile step on this run"}]};function Ur(R,e){const w=Fr[R]??[],f=new Map;for(const g of e)f.set(g.name,g);const M=[],i=new Set;for(const g of w){let d;for(const p of g.stepNames){const h=f.get(p);if(h){d=h,i.add(p);break}}d?M.push({...d,id:g.id,name:g.name,tier:d.tier??g.tier??null}):M.push({id:g.id,name:g.name,status:"not_invoked",tier:g.tier??null,note:g.skipReason})}for(const g of e)i.has(g.name)||M.push(g);return M}export{Hr as C,Wr as F,Yr as M,jr as R,Ur as f};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
web/sveltekit/build/_app/immutable/entry/{app.BhktVbRh.js → app.DmxSSduu.js} RENAMED
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.Dv1TzIuH.js","../chunks/CWw6qgC_.js","../chunks/BTUA7_xE.js","../chunks/DxQlA7U2.js","../chunks/Bd-v_9Ud.js","../chunks/CW0zSL4D.js","../chunks/B3Pg95Il.js","../chunks/CJeJVIjP.js","../chunks/DCD6_LXk.js","../chunks/B0XoTt7U.js","../assets/RipMark.ClxF_PAC.css","../chunks/DixtWtwq.js","../assets/0.DiQNUxm-.css","../nodes/1.BmImNqbK.js","../nodes/2.CLD-rsu4.js","../chunks/cDW0xQNP.js","../chunks/25_y8TFd.js","../chunks/CXQd8Y6F.js","../chunks/D907np-5.js","../assets/2.BD53GLFY.css","../nodes/3.0RkbXXD4.js","../chunks/BatqQaKj.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.DLn0bV4P.js","../chunks/FjZhY28w.js","../assets/stoneRegistry.DOPO2SDD.css","../assets/4.C9CQZyPb.css","../nodes/5.C0xKDhXA.js"])))=>i.map(i=>d[i]);
2
- var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(e,t,"read from private field"),r?r.call(e):t.get(e)),p=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),I=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/CXQd8Y6F.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,ah as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,am as dt,ai as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,al as k}from"../chunks/BTUA7_xE.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CWw6qgC_.js";import{B as Ot,i as D}from"../chunks/Bd-v_9Ud.js";import{p as q}from"../chunks/CW0zSL4D.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){p(this,f);p(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});I(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),I(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const St={};var At=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),pt=F("<!> <!>",1);function It(e,t){ct(t,!0);let r=q(t,"components",23,()=>[]),n=q(t,"data_0",3,null),o=q(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=pt(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};D(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};D(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};D(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const Mt=Tt(It),Nt=[()=>b(()=>import("../nodes/0.Dv1TzIuH.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>b(()=>import("../nodes/1.BmImNqbK.js"),__vite__mapDeps([13,1,2,6,7]),import.meta.url),()=>b(()=>import("../nodes/2.CLD-rsu4.js"),__vite__mapDeps([14,1,2,11,15,8,9,5,10,16,7,17,18,19]),import.meta.url),()=>b(()=>import("../nodes/3.0RkbXXD4.js"),__vite__mapDeps([20,1,2,4,16,15,6,7,21,5,3,9,22,23]),import.meta.url),()=>b(()=>import("../nodes/4.DLn0bV4P.js"),__vite__mapDeps([24,1,2,4,6,7,21,16,5,3,9,22,25,17,18,26,11,27]),import.meta.url),()=>b(()=>import("../nodes/5.C0xKDhXA.js"),__vite__mapDeps([28,1,2,21,4,16,5,3,9,22,25,17,18,26]),import.meta.url)],Bt=[],Ft={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},Y={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},Lt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.decode])),Yt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.encode])),Gt=!1,Ht=(e,t)=>Lt[e](t);export{Ht as decode,Lt as decoders,Ft as dictionary,Yt as encoders,Gt as hash,Y as hooks,St as matchers,Nt as nodes,Mt as root,Bt as server_loads};
 
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DInKAumT.js","../chunks/CWw6qgC_.js","../chunks/BTUA7_xE.js","../chunks/DxQlA7U2.js","../chunks/Bd-v_9Ud.js","../chunks/CW0zSL4D.js","../chunks/D8NyAcAP.js","../chunks/DJJH9JR_.js","../chunks/DCD6_LXk.js","../chunks/B0XoTt7U.js","../assets/RipMark.ClxF_PAC.css","../chunks/DixtWtwq.js","../assets/0.DiQNUxm-.css","../nodes/1.OjBWYT1y.js","../nodes/2.B2rqoVXS.js","../chunks/cDW0xQNP.js","../chunks/25_y8TFd.js","../chunks/CXQd8Y6F.js","../chunks/D907np-5.js","../assets/2.BD53GLFY.css","../nodes/3.CU36QLul.js","../chunks/BatqQaKj.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.JuDtCP-e.js","../chunks/DDAjlznB.js","../assets/stoneRegistry.uOtksRcS.css","../assets/4.C9CQZyPb.css","../nodes/5.CRCvLD8F.js"])))=>i.map(i=>d[i]);
2
+ var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(e,t,"read from private field"),r?r.call(e):t.get(e)),p=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),I=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/CXQd8Y6F.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,ah as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,am as dt,ai as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,al as k}from"../chunks/BTUA7_xE.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CWw6qgC_.js";import{B as Ot,i as D}from"../chunks/Bd-v_9Ud.js";import{p as q}from"../chunks/CW0zSL4D.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){p(this,f);p(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});I(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),I(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const St={};var At=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),pt=F("<!> <!>",1);function It(e,t){ct(t,!0);let r=q(t,"components",23,()=>[]),n=q(t,"data_0",3,null),o=q(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=pt(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};D(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};D(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};D(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const Mt=Tt(It),Nt=[()=>b(()=>import("../nodes/0.DInKAumT.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>b(()=>import("../nodes/1.OjBWYT1y.js"),__vite__mapDeps([13,1,2,6,7]),import.meta.url),()=>b(()=>import("../nodes/2.B2rqoVXS.js"),__vite__mapDeps([14,1,2,11,15,8,9,5,10,16,7,17,18,19]),import.meta.url),()=>b(()=>import("../nodes/3.CU36QLul.js"),__vite__mapDeps([20,1,2,4,16,15,6,7,21,5,3,9,22,23]),import.meta.url),()=>b(()=>import("../nodes/4.JuDtCP-e.js"),__vite__mapDeps([24,1,2,4,6,7,21,16,5,3,9,22,25,17,18,26,11,27]),import.meta.url),()=>b(()=>import("../nodes/5.CRCvLD8F.js"),__vite__mapDeps([28,1,2,21,4,16,5,3,9,22,25,17,18,26]),import.meta.url)],Bt=[],Ft={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},Y={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},Lt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.decode])),Yt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.encode])),Gt=!1,Ht=(e,t)=>Lt[e](t);export{Ht as decode,Lt as decoders,Ft as dictionary,Yt as encoders,Gt as hash,Y as hooks,St as matchers,Nt as nodes,Mt as root,Bt as server_loads};
web/sveltekit/build/_app/immutable/entry/start.C_DzDADc.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{l as o,a as r}from"../chunks/DJJH9JR_.js";export{o as load_css,r as start};
web/sveltekit/build/_app/immutable/entry/start.YmL7ZSOR.js DELETED
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/CJeJVIjP.js";export{o as load_css,r as start};
 
 
web/sveltekit/build/_app/immutable/nodes/{0.Dv1TzIuH.js → 0.DInKAumT.js} RENAMED
@@ -1,2 +1,2 @@
1
- import{c as E,a as u,s as M,f as v,d as z,e as H}from"../chunks/CWw6qgC_.js";import{p as O,f as R,o as p,a as $,al as f,s as t,c as o,r as i,t as P,aR as L}from"../chunks/BTUA7_xE.js";import{b as r,s as W}from"../chunks/DxQlA7U2.js";import{i as x}from"../chunks/Bd-v_9Ud.js";import{p as B}from"../chunks/CW0zSL4D.js";import{p as D}from"../chunks/B3Pg95Il.js";import{R as U}from"../chunks/DCD6_LXk.js";import{s as G}from"../chunks/B0XoTt7U.js";import"../chunks/DixtWtwq.js";const V=!0,J=!0,K="never",xe=Object.freeze(Object.defineProperty({__proto__:null,prerender:V,ssr:J,trailingSlash:K},Symbol.toStringTag,{value:"Module"}));var Q=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-step svelte-1bjixce"> </span>',1),X=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-progress svelte-1bjixce"> </span>',1),Z=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-err svelte-1bjixce"> </span>',1),ee=v('<span class="status svelte-1bjixce" aria-live="polite" aria-atomic="true"><span class="status-dot svelte-1bjixce" aria-hidden="true"></span> <span class="status-phase svelte-1bjixce"> </span> <!> <!> <!></span>');function ae(h,l){O(l,!0);const N={geocode:"geocoding",nta_resolve:"resolving NTA",sandy_inundation:"Sandy 2012",dep_stormwater:"DEP scenarios",floodnet:"FloodNet sensors",nyc311:"NYC 311 history",noaa_tides:"NOAA tides",nws_alerts:"NWS alerts",nws_obs:"NWS hourly obs",ttm_forecast:"TTM r2 surge (zero-shot)",ttm_311_forecast:"TTM r2 weekly 311",ttm_battery_surge:"TTM Battery (NYC fine-tune)",floodnet_forecast:"FloodNet recurrence forecast",ida_hwm_2021:"Ida 2021 HWMs",prithvi_eo_v2:"Ida 2021 polygons (baked lookup)",prithvi_eo_live:"Prithvi-NYC-Pluvial v2 segmentation",microtopo_lidar:"LiDAR microtopo",mta_entrance_exposure:"MTA entrances",nycha_development_exposure:"NYCHA developments",doe_school_exposure:"DOE schools",doh_hospital_exposure:"NYS DOH hospitals",terramind_synthesis:"TerraMind v1 synthesis",terramind_lulc:"TerraMind LULC",terramind_buildings:"TerraMind Buildings",eo_chip_fetch:"fetching S2/S1/DEM chip",rag_granite_embedding:"RAG retrieval",gliner_extract:"GLiNER typed extraction"};let T=f(()=>r.phase!=="idle"&&r.phase!=="done"),k=f(()=>{switch(r.phase){case"planning":return"planning intent";case"specialists":return"gathering evidence";case"reconciling":return"reconciling";case"streaming":return r.attempt>1?`writing (reroll ${r.attempt-1})`:"writing briefing";case"error":return"error";default:return""}}),g=f(()=>{const a=r.activeStep;return a?N[a]??a:null}),m=f(()=>{if(r.phase!=="specialists"&&r.phase!=="reconciling")return null;const a=r.firedCount,d=r.totalSpecialists;return d?`${a}/${d}`:a>0?`${a}`:null}),w=f(()=>r.phase==="error"?"err":"live");var A=E(),_=R(A);{var j=a=>{var d=ee(),e=t(o(d),2),C=o(e,!0);i(e);var S=t(e,2);{var s=n=>{var b=Q(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(g))),u(n,b)};x(S,n=>{p(g)&&n(s)})}var c=t(S,2);{var F=n=>{var b=X(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(m))),u(n,b)};x(c,n=>{p(m)&&n(F)})}var Y=t(c,2);{var I=n=>{var b=Z(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,r.errorMessage)),u(n,b)};x(Y,n=>{r.phase==="error"&&r.errorMessage&&n(I)})}i(d),P(()=>{G(d,"data-kind",p(w)),M(C,p(k))}),u(a,d)};x(_,a=>{p(T)&&a(j)})}u(h,A),$()}var re=v('<button type="button" class="app-header-query" aria-label="Edit query"><span class="app-header-query-icon" aria-hidden="true">⌕</span> <span class="app-header-query-text"> </span> <span class="app-header-query-edit">edit</span></button>'),te=v('<button type="button" class="app-header-link app-header-link-button svelte-f1belb" aria-label="Open curated PDF view of completed briefing in new tab">export PDF</button>'),se=v('<header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap — home"><!>riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!> <!></div></div></header>');function ne(h,l){O(l,!0);let N=B(l,"query",3,null);function T(){if(typeof window>"u")return;const s=D.params.queryId??(D.url.pathname==="/q/sample"?"sample":"");s&&window.open(`/print/${encodeURIComponent(s)}`,"_blank","noopener")}var k=se(),g=o(k),m=o(g),w=o(m),A=o(w);U(A,{size:20}),L(),i(w),L(4),i(m);var _=t(m,2),j=o(_);{var a=s=>{var c=re(),F=t(o(c),2),Y=o(F,!0);i(F),L(2),i(c),P(()=>M(Y,N())),H("click",c,function(...I){var n;(n=l.onResetCold)==null||n.apply(this,I)}),u(s,c)};x(j,s=>{N()&&s(a)})}i(_);var d=t(_,2),e=t(o(d),2);{var C=s=>{var c=te();H("click",c,T),u(s,c)};x(e,s=>{r.ready&&s(C)})}var S=t(e,2);ae(S,{}),i(d),i(g),i(k),u(h,k),$()}z(["click"]);var oe=v(`<footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
2
  For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="app-footer-build">All foundation models Apache-2.0 · All data from public-record federal, state, and city sources · No commercial APIs contacted at runtime · Riprap v0.5.0 · build 2026-05-07</p> <p class="app-footer-credits">Dam mark: <a href="https://thenounproject.com/icon/dam-4516918/">"Dam" by Chintuza</a> via the Noun Project, CC-BY 3.0.</p></div></footer>`);function ie(h){var l=oe();u(h,l)}var pe=v('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function le(h){var l=pe();L(4),u(h,l)}var de=v("<!> <!>",1),ce=v('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function ke(h,l){O(l,!0);let N=f(()=>()=>{const e=D.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),T=f(()=>D.url.pathname.startsWith("/print/")),k=f(()=>D.url.pathname==="/"),g=f(()=>p(T)||p(k));var m=ce(),w=R(m);{var A=e=>{var C=de(),S=R(C);le(S);var s=t(S,2);{let c=f(()=>p(N)());ne(s,{get query(){return p(c)},onResetCold:()=>window.location.href="/"})}u(e,C)};x(w,e=>{p(g)||e(A)})}var _=t(w,2),j=o(_);W(j,()=>l.children),i(_);var a=t(_,2);{var d=e=>{ie(e)};x(a,e=>{p(g)||e(d)})}u(h,m),$()}export{ke as component,xe as universal};
 
1
+ import{c as E,a as u,s as M,f as v,d as z,e as H}from"../chunks/CWw6qgC_.js";import{p as O,f as R,o as p,a as $,al as f,s as t,c as o,r as i,t as P,aR as L}from"../chunks/BTUA7_xE.js";import{b as r,s as W}from"../chunks/DxQlA7U2.js";import{i as x}from"../chunks/Bd-v_9Ud.js";import{p as B}from"../chunks/CW0zSL4D.js";import{p as D}from"../chunks/D8NyAcAP.js";import{R as U}from"../chunks/DCD6_LXk.js";import{s as G}from"../chunks/B0XoTt7U.js";import"../chunks/DixtWtwq.js";const V=!0,J=!0,K="never",xe=Object.freeze(Object.defineProperty({__proto__:null,prerender:V,ssr:J,trailingSlash:K},Symbol.toStringTag,{value:"Module"}));var Q=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-step svelte-1bjixce"> </span>',1),X=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-progress svelte-1bjixce"> </span>',1),Z=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-err svelte-1bjixce"> </span>',1),ee=v('<span class="status svelte-1bjixce" aria-live="polite" aria-atomic="true"><span class="status-dot svelte-1bjixce" aria-hidden="true"></span> <span class="status-phase svelte-1bjixce"> </span> <!> <!> <!></span>');function ae(h,l){O(l,!0);const N={geocode:"geocoding",nta_resolve:"resolving NTA",sandy_inundation:"Sandy 2012",dep_stormwater:"DEP scenarios",floodnet:"FloodNet sensors",nyc311:"NYC 311 history",noaa_tides:"NOAA tides",nws_alerts:"NWS alerts",nws_obs:"NWS hourly obs",ttm_forecast:"TTM r2 surge (zero-shot)",ttm_311_forecast:"TTM r2 weekly 311",ttm_battery_surge:"TTM Battery (NYC fine-tune)",floodnet_forecast:"FloodNet recurrence forecast",ida_hwm_2021:"Ida 2021 HWMs",prithvi_eo_v2:"Ida 2021 polygons (baked lookup)",prithvi_eo_live:"Prithvi-NYC-Pluvial v2 segmentation",microtopo_lidar:"LiDAR microtopo",mta_entrance_exposure:"MTA entrances",nycha_development_exposure:"NYCHA developments",doe_school_exposure:"DOE schools",doh_hospital_exposure:"NYS DOH hospitals",terramind_synthesis:"TerraMind v1 synthesis",terramind_lulc:"TerraMind LULC",terramind_buildings:"TerraMind Buildings",eo_chip_fetch:"fetching S2/S1/DEM chip",rag_granite_embedding:"RAG retrieval",gliner_extract:"GLiNER typed extraction"};let T=f(()=>r.phase!=="idle"&&r.phase!=="done"),k=f(()=>{switch(r.phase){case"planning":return"planning intent";case"specialists":return"gathering evidence";case"reconciling":return"reconciling";case"streaming":return r.attempt>1?`writing (reroll ${r.attempt-1})`:"writing briefing";case"error":return"error";default:return""}}),g=f(()=>{const a=r.activeStep;return a?N[a]??a:null}),m=f(()=>{if(r.phase!=="specialists"&&r.phase!=="reconciling")return null;const a=r.firedCount,d=r.totalSpecialists;return d?`${a}/${d}`:a>0?`${a}`:null}),w=f(()=>r.phase==="error"?"err":"live");var A=E(),_=R(A);{var j=a=>{var d=ee(),e=t(o(d),2),C=o(e,!0);i(e);var S=t(e,2);{var s=n=>{var b=Q(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(g))),u(n,b)};x(S,n=>{p(g)&&n(s)})}var c=t(S,2);{var F=n=>{var b=X(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(m))),u(n,b)};x(c,n=>{p(m)&&n(F)})}var Y=t(c,2);{var I=n=>{var b=Z(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,r.errorMessage)),u(n,b)};x(Y,n=>{r.phase==="error"&&r.errorMessage&&n(I)})}i(d),P(()=>{G(d,"data-kind",p(w)),M(C,p(k))}),u(a,d)};x(_,a=>{p(T)&&a(j)})}u(h,A),$()}var re=v('<button type="button" class="app-header-query" aria-label="Edit query"><span class="app-header-query-icon" aria-hidden="true">⌕</span> <span class="app-header-query-text"> </span> <span class="app-header-query-edit">edit</span></button>'),te=v('<button type="button" class="app-header-link app-header-link-button svelte-f1belb" aria-label="Open curated PDF view of completed briefing in new tab">export PDF</button>'),se=v('<header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap — home"><!>riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!> <!></div></div></header>');function ne(h,l){O(l,!0);let N=B(l,"query",3,null);function T(){if(typeof window>"u")return;const s=D.params.queryId??(D.url.pathname==="/q/sample"?"sample":"");s&&window.open(`/print/${encodeURIComponent(s)}`,"_blank","noopener")}var k=se(),g=o(k),m=o(g),w=o(m),A=o(w);U(A,{size:20}),L(),i(w),L(4),i(m);var _=t(m,2),j=o(_);{var a=s=>{var c=re(),F=t(o(c),2),Y=o(F,!0);i(F),L(2),i(c),P(()=>M(Y,N())),H("click",c,function(...I){var n;(n=l.onResetCold)==null||n.apply(this,I)}),u(s,c)};x(j,s=>{N()&&s(a)})}i(_);var d=t(_,2),e=t(o(d),2);{var C=s=>{var c=te();H("click",c,T),u(s,c)};x(e,s=>{r.ready&&s(C)})}var S=t(e,2);ae(S,{}),i(d),i(g),i(k),u(h,k),$()}z(["click"]);var oe=v(`<footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
2
  For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="app-footer-build">All foundation models Apache-2.0 · All data from public-record federal, state, and city sources · No commercial APIs contacted at runtime · Riprap v0.5.0 · build 2026-05-07</p> <p class="app-footer-credits">Dam mark: <a href="https://thenounproject.com/icon/dam-4516918/">"Dam" by Chintuza</a> via the Noun Project, CC-BY 3.0.</p></div></footer>`);function ie(h){var l=oe();u(h,l)}var pe=v('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function le(h){var l=pe();L(4),u(h,l)}var de=v("<!> <!>",1),ce=v('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function ke(h,l){O(l,!0);let N=f(()=>()=>{const e=D.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),T=f(()=>D.url.pathname.startsWith("/print/")),k=f(()=>D.url.pathname==="/"),g=f(()=>p(T)||p(k));var m=ce(),w=R(m);{var A=e=>{var C=de(),S=R(C);le(S);var s=t(S,2);{let c=f(()=>p(N)());ne(s,{get query(){return p(c)},onResetCold:()=>window.location.href="/"})}u(e,C)};x(w,e=>{p(g)||e(A)})}var _=t(w,2),j=o(_);W(j,()=>l.children),i(_);var a=t(_,2);{var d=e=>{ie(e)};x(a,e=>{p(g)||e(d)})}u(h,m),$()}export{ke as component,xe as universal};
web/sveltekit/build/_app/immutable/nodes/{1.BmImNqbK.js → 1.OjBWYT1y.js} RENAMED
@@ -1 +1 @@
1
- import{a as c,f as u,s as e}from"../chunks/CWw6qgC_.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/BTUA7_xE.js";import{p as m}from"../chunks/B3Pg95Il.js";var d=u("<h1> </h1> <p> </p>",1);function k(f,i){v(i,!0);var t=d(),r=l(t),h=p(r,!0);o(r);var a=x(r,2),n=p(a,!0);o(a),_(()=>{var s;e(h,m.status),e(n,(s=m.error)==null?void 0:s.message)}),c(f,t),g()}export{k as component};
 
1
+ import{a as c,f as u,s as e}from"../chunks/CWw6qgC_.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/BTUA7_xE.js";import{p as m}from"../chunks/D8NyAcAP.js";var d=u("<h1> </h1> <p> </p>",1);function k(f,i){v(i,!0);var t=d(),r=l(t),h=p(r,!0);o(r);var a=x(r,2),n=p(a,!0);o(a),_(()=>{var s;e(h,m.status),e(n,(s=m.error)==null?void 0:s.message)}),c(f,t),g()}export{k as component};
web/sveltekit/build/_app/immutable/nodes/{2.CLD-rsu4.js → 2.B2rqoVXS.js} RENAMED
@@ -1,4 +1,4 @@
1
- import{a as m,f as w,d as D,l as I,e as G,s as g}from"../chunks/CWw6qgC_.js";import"../chunks/DixtWtwq.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,am as E,ba as q,bb as X,o as d,bc as ee,af as ae,c,aR as k,r as o,p as P,a5 as N,a as M,a4 as A,s as f,t as T,ai as se,Z as te,ak as re}from"../chunks/BTUA7_xE.js";import{h as ne}from"../chunks/cDW0xQNP.js";import{R as le}from"../chunks/DCD6_LXk.js";import{e as $}from"../chunks/25_y8TFd.js";import{r as ie,a as oe,s as de,b as ce}from"../chunks/B0XoTt7U.js";import{g as B}from"../chunks/CJeJVIjP.js";import{b as ve,_ as pe}from"../chunks/CXQd8Y6F.js";import{P as fe}from"../chunks/D907np-5.js";function ue(e,s,r=s){var t=new WeakSet;U(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=L(e)?C(n):n,r(n),S!==null&&t.add(S),await K(),n!==(n=s())){var u=e.selectionStart,l=e.selectionEnd,v=e.value.length;if(e.value=n??"",l!==null){var i=e.value.length;u===l&&l===v&&i>v?(e.selectionStart=i,e.selectionEnd=i):(e.selectionStart=u,e.selectionEnd=Math.min(l,i))}}}),(Q&&e.defaultValue!==e.value||R(s)==null&&e.value)&&(r(L(e)?C(e.value):e.value),S!==null&&t.add(S)),V(()=>{var a=s();if(e===document.activeElement){var n=S;if(t.has(n))return}L(e)&&a===C(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function L(e){var s=e.type;return s==="number"||s==="range"}function C(e){return e===""?null:+e}function me(e=!1){const s=Z,r=s.l.u;if(!r)return;let t=()=>ee(s.s);if(e){let a=0,n={};const u=ae(()=>{let l=!1;const v=s.s;for(const i in v)v[i]!==n[i]&&(n[i]=v[i],l=!0);return l&&a++,a});t=()=>d(u)}r.b.length&&J(()=>{H(s,t),q(r.b)}),E(()=>{const a=R(()=>r.m.map(X));return()=>{for(const n of a)typeof n=="function"&&n()}}),r.a.length&&E(()=>{H(s,t),q(r.a)})}function H(e,s){if(e.l.s)for(const r of e.l.s)d(r);s()}var we=w('<header class="land-header svelte-1ct2rgk"><span class="riprap-wordmark"><!>riprap</span> <span class="land-header-sep svelte-1ct2rgk">/</span> <span class="land-header-context svelte-1ct2rgk">Flood Exposure Briefing · NYC</span> <nav class="land-header-nav svelte-1ct2rgk"><a href="#methodology" class="svelte-1ct2rgk">Methodology</a> <a href="#sources" class="svelte-1ct2rgk">Sources</a></nav></header>');function he(e){var s=we(),r=c(s),t=c(r);le(t,{size:22}),k(),o(r),k(6),o(s),m(e,s)}var ye=w("<span> </span>"),ge=w('<main class="land-hero svelte-drzq4r"><h1 class="land-hero-h1 svelte-drzq4r"><span class="land-hero-headline svelte-drzq4r">A flood exposure briefing<br/> for <em class="svelte-drzq4r">any place</em> in New York City.</span> <span class="land-hero-deck svelte-drzq4r">Type an address. Get a written briefing where every numeric claim links to its primary public-record source.</span></h1> <form class="land-query svelte-drzq4r" role="search"><span class="land-query-prompt svelte-drzq4r" aria-hidden="true">›</span> <input type="text" placeholder="Address, neighborhood, or BBL. e.g. 80 Pioneer Street, Red Hook" class="land-query-input svelte-drzq4r" aria-label="Query an address, neighborhood, or BBL"/> <button type="submit" class="land-query-submit svelte-drzq4r">Brief this place →</button></form> <div class="land-cycling svelte-drzq4r" aria-live="polite"><span class="land-cycling-label svelte-drzq4r">Try:</span> <button type="button" class="land-cycling-rail svelte-drzq4r" title="Run this example"></button></div></main>');function je(e,s){P(s,!0);const r=["80 Pioneer Street, Red Hook","Coney Island Hospital","PS 188, Lower East Side","Hammels Houses, Rockaway","Bowling Green station","555 W 57th Street"];let t=A(""),a=A(0);E(()=>{if(typeof window>"u")return;const p=setInterval(()=>{N(a,(d(a)+1)%r.length)},2200);return()=>clearInterval(p)});function n(){const p=d(t).trim();p&&B(`/q/${encodeURIComponent(p)}`)}function u(){const p=r[d(a)];B(`/q/${encodeURIComponent(p)}`)}var l=ge(),v=f(c(l),2),i=f(c(v),2);ie(i),k(2),o(v);var j=f(v,2),y=f(c(j),2);$(y,22,()=>r,p=>p,(p,b,F)=>{var h=ye();let x;var _=c(h,!0);o(h),T(()=>{x=oe(h,1,"land-cycling-item svelte-drzq4r",null,x,{"is-active":d(F)===d(a)}),de(h,"aria-hidden",d(F)!==d(a)),g(_,b)}),m(p,h)}),o(y),o(j),o(l),I("submit",v,p=>{p.preventDefault(),n()}),ue(i,()=>d(t),p=>N(t,p)),G("click",y,u),m(e,l),M()}D(["click"]);var be=w('<div class="land-mapmini svelte-1g1r73s" role="img" aria-label="Live mini-map preview of Red Hook flood exposure layers"><div class="land-mapmini-canvas svelte-1g1r73s"></div> <div class="land-mapmini-legend svelte-1g1r73s"><span class="svelte-1g1r73s"><span class="lm-sw lm-sw-emp svelte-1g1r73s"></span>empirical</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-mod svelte-1g1r73s"></span>modeled</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-prx svelte-1g1r73s"></span>proxy</span></div></div>');function _e(e,s){P(s,!0);const r=[-74.0096,40.6776];let t=A(null),a=null;se(()=>{let l=!1;return(async()=>{if(!d(t)||l)return;const v=await pe(()=>import("../chunks/D4L2lGt1.js").then(i=>i.m),[],import.meta.url);l||!d(t)||(a=new v.Map({container:d(t),style:fe,center:r,zoom:14.5,interactive:!1,attributionControl:!1}),a.on("load",()=>{a&&(a.addSource("fema-ae",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]}}),a.addLayer({id:"fema-ae-fill",type:"fill",source:"fema-ae",paint:{"fill-color":"#2A6FA8","fill-opacity":.22}}),a.addLayer({id:"fema-ae-line",type:"line",source:"fema-ae",paint:{"line-color":"#2A6FA8","line-width":1,"line-dasharray":[3,2]}}),a.addSource("hwm-contour",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[[-74.0125,40.679],[-74.0105,40.6792],[-74.008,40.679],[-74.006,40.6786]]}}}),a.addLayer({id:"hwm-contour-line",type:"line",source:"hwm-contour",paint:{"line-color":"#0B5394","line-width":1.4}}),a.addSource("proxy-311",{type:"geojson",data:{type:"FeatureCollection",features:[[-74.0118,40.677],[-74.0114,40.6767],[-74.0121,40.6772]].map(i=>({type:"Feature",properties:{},geometry:{type:"Point",coordinates:i}}))}}),a.addLayer({id:"proxy-311-circle",type:"circle",source:"proxy-311",paint:{"circle-radius":3,"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1}}),a.addSource("floodnet",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:[-74.0103,40.6788]}}}),a.addLayer({id:"floodnet-pin",type:"circle",source:"floodnet",paint:{"circle-radius":4,"circle-color":"#0B5394","circle-stroke-color":"#FFFFFF","circle-stroke-width":1}}),a.addSource("addr",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:r}}}),a.addLayer({id:"addr-ring",type:"circle",source:"addr",paint:{"circle-radius":9,"circle-color":"transparent","circle-stroke-color":"#0F172A","circle-stroke-width":1.4}}),a.addLayer({id:"addr-dot",type:"circle",source:"addr",paint:{"circle-radius":3,"circle-color":"#0F172A"}}))}))})(),()=>{l=!0,a&&(a.remove(),a=null)}});var n=be(),u=c(n);ve(u,l=>N(t,l),()=>d(t)),k(2),o(n),m(e,n),M()}var Se=w(`<section class="land-section svelte-1anw2jf"><div class="land-section-head svelte-1anw2jf"><span class="section-label">What you'll get back</span> <span class="land-section-meta svelte-1anw2jf">A grounded paragraph with citations, not a chatbot answer.</span></div> <div class="land-preview-grid svelte-1anw2jf"><div class="land-preview-pane land-preview-pane-excerpt svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Briefing excerpt</div> <p class="land-preview-body svelte-1anw2jf">The lot sits inside the FEMA <span class="land-preview-cite svelte-1anw2jf">1% AE flood zone <sup class="svelte-1anw2jf">[c3]</sup></span>,
2
  with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
3
  FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM · Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL · 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database · 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 · 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL · panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection · 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook · z14.5 · Carto Positron</div></div></div></section>`);function ke(e){var s=Se(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);_e(a,{}),k(2),o(t),o(r),o(s),m(e,s)}var Fe=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),xe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones · one taxonomy · every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
4
  Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function Le(e,s){P(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs · FEMA NFHL · DEP stormwater · Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA · NYCHA · DOE · DOH · PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors · 311 complaints · NWS · NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 · Granite TTM (zero-shot + NYC fine-tune) · NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer · Mellea grounding-check · WeasyPrint",tint:"var(--stone-capstone)"}];me();var t=xe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=Fe();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),F=c(b,!0);o(b);var h=f(b,2),x=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var z=f(_,2),W=c(z,!0);o(z),o(i),T(Y=>{j=ce(i,"",j,{"--stone-tint":d(l).tint}),g(p,Y),g(F,d(l).name),g(x,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),M()}var Ce=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.6 · NYC OpenData · FEMA NFHL · USGS · NPCC4 · Dam mark by Chintuza, Noun Project (CC-BY)</span></footer>');function Ee(e){var s=Ce();m(e,s)}var Ne=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ae=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function We(e){var s=Ae();ne("1uha8ag",v=>{var i=Ne();te(()=>{re.title="Riprap — Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);he(r);var t=f(r,2),a=c(t);je(a,{});var n=f(a,2);ke(n),o(t);var u=f(t,2);Le(u,{});var l=f(u,2);Ee(l),o(s),m(e,s)}export{We as component};
 
1
+ import{a as m,f as w,d as D,l as I,e as G,s as g}from"../chunks/CWw6qgC_.js";import"../chunks/DixtWtwq.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,am as E,ba as q,bb as X,o as d,bc as ee,af as ae,c,aR as k,r as o,p as P,a5 as N,a as M,a4 as A,s as f,t as T,ai as se,Z as te,ak as re}from"../chunks/BTUA7_xE.js";import{h as ne}from"../chunks/cDW0xQNP.js";import{R as le}from"../chunks/DCD6_LXk.js";import{e as $}from"../chunks/25_y8TFd.js";import{r as ie,a as oe,s as de,b as ce}from"../chunks/B0XoTt7U.js";import{g as B}from"../chunks/DJJH9JR_.js";import{b as ve,_ as pe}from"../chunks/CXQd8Y6F.js";import{P as fe}from"../chunks/D907np-5.js";function ue(e,s,r=s){var t=new WeakSet;U(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=L(e)?C(n):n,r(n),S!==null&&t.add(S),await K(),n!==(n=s())){var u=e.selectionStart,l=e.selectionEnd,v=e.value.length;if(e.value=n??"",l!==null){var i=e.value.length;u===l&&l===v&&i>v?(e.selectionStart=i,e.selectionEnd=i):(e.selectionStart=u,e.selectionEnd=Math.min(l,i))}}}),(Q&&e.defaultValue!==e.value||R(s)==null&&e.value)&&(r(L(e)?C(e.value):e.value),S!==null&&t.add(S)),V(()=>{var a=s();if(e===document.activeElement){var n=S;if(t.has(n))return}L(e)&&a===C(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function L(e){var s=e.type;return s==="number"||s==="range"}function C(e){return e===""?null:+e}function me(e=!1){const s=Z,r=s.l.u;if(!r)return;let t=()=>ee(s.s);if(e){let a=0,n={};const u=ae(()=>{let l=!1;const v=s.s;for(const i in v)v[i]!==n[i]&&(n[i]=v[i],l=!0);return l&&a++,a});t=()=>d(u)}r.b.length&&J(()=>{H(s,t),q(r.b)}),E(()=>{const a=R(()=>r.m.map(X));return()=>{for(const n of a)typeof n=="function"&&n()}}),r.a.length&&E(()=>{H(s,t),q(r.a)})}function H(e,s){if(e.l.s)for(const r of e.l.s)d(r);s()}var we=w('<header class="land-header svelte-1ct2rgk"><span class="riprap-wordmark"><!>riprap</span> <span class="land-header-sep svelte-1ct2rgk">/</span> <span class="land-header-context svelte-1ct2rgk">Flood Exposure Briefing · NYC</span> <nav class="land-header-nav svelte-1ct2rgk"><a href="#methodology" class="svelte-1ct2rgk">Methodology</a> <a href="#sources" class="svelte-1ct2rgk">Sources</a></nav></header>');function he(e){var s=we(),r=c(s),t=c(r);le(t,{size:22}),k(),o(r),k(6),o(s),m(e,s)}var ye=w("<span> </span>"),ge=w('<main class="land-hero svelte-drzq4r"><h1 class="land-hero-h1 svelte-drzq4r"><span class="land-hero-headline svelte-drzq4r">A flood exposure briefing<br/> for <em class="svelte-drzq4r">any place</em> in New York City.</span> <span class="land-hero-deck svelte-drzq4r">Type an address. Get a written briefing where every numeric claim links to its primary public-record source.</span></h1> <form class="land-query svelte-drzq4r" role="search"><span class="land-query-prompt svelte-drzq4r" aria-hidden="true">›</span> <input type="text" placeholder="Address, neighborhood, or BBL. e.g. 80 Pioneer Street, Red Hook" class="land-query-input svelte-drzq4r" aria-label="Query an address, neighborhood, or BBL"/> <button type="submit" class="land-query-submit svelte-drzq4r">Brief this place →</button></form> <div class="land-cycling svelte-drzq4r" aria-live="polite"><span class="land-cycling-label svelte-drzq4r">Try:</span> <button type="button" class="land-cycling-rail svelte-drzq4r" title="Run this example"></button></div></main>');function je(e,s){P(s,!0);const r=["80 Pioneer Street, Red Hook","Coney Island Hospital","PS 188, Lower East Side","Hammels Houses, Rockaway","Bowling Green station","555 W 57th Street"];let t=A(""),a=A(0);E(()=>{if(typeof window>"u")return;const p=setInterval(()=>{N(a,(d(a)+1)%r.length)},2200);return()=>clearInterval(p)});function n(){const p=d(t).trim();p&&B(`/q/${encodeURIComponent(p)}`)}function u(){const p=r[d(a)];B(`/q/${encodeURIComponent(p)}`)}var l=ge(),v=f(c(l),2),i=f(c(v),2);ie(i),k(2),o(v);var j=f(v,2),y=f(c(j),2);$(y,22,()=>r,p=>p,(p,b,F)=>{var h=ye();let x;var _=c(h,!0);o(h),T(()=>{x=oe(h,1,"land-cycling-item svelte-drzq4r",null,x,{"is-active":d(F)===d(a)}),de(h,"aria-hidden",d(F)!==d(a)),g(_,b)}),m(p,h)}),o(y),o(j),o(l),I("submit",v,p=>{p.preventDefault(),n()}),ue(i,()=>d(t),p=>N(t,p)),G("click",y,u),m(e,l),M()}D(["click"]);var be=w('<div class="land-mapmini svelte-1g1r73s" role="img" aria-label="Live mini-map preview of Red Hook flood exposure layers"><div class="land-mapmini-canvas svelte-1g1r73s"></div> <div class="land-mapmini-legend svelte-1g1r73s"><span class="svelte-1g1r73s"><span class="lm-sw lm-sw-emp svelte-1g1r73s"></span>empirical</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-mod svelte-1g1r73s"></span>modeled</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-prx svelte-1g1r73s"></span>proxy</span></div></div>');function _e(e,s){P(s,!0);const r=[-74.0096,40.6776];let t=A(null),a=null;se(()=>{let l=!1;return(async()=>{if(!d(t)||l)return;const v=await pe(()=>import("../chunks/D4L2lGt1.js").then(i=>i.m),[],import.meta.url);l||!d(t)||(a=new v.Map({container:d(t),style:fe,center:r,zoom:14.5,interactive:!1,attributionControl:!1}),a.on("load",()=>{a&&(a.addSource("fema-ae",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]}}),a.addLayer({id:"fema-ae-fill",type:"fill",source:"fema-ae",paint:{"fill-color":"#2A6FA8","fill-opacity":.22}}),a.addLayer({id:"fema-ae-line",type:"line",source:"fema-ae",paint:{"line-color":"#2A6FA8","line-width":1,"line-dasharray":[3,2]}}),a.addSource("hwm-contour",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[[-74.0125,40.679],[-74.0105,40.6792],[-74.008,40.679],[-74.006,40.6786]]}}}),a.addLayer({id:"hwm-contour-line",type:"line",source:"hwm-contour",paint:{"line-color":"#0B5394","line-width":1.4}}),a.addSource("proxy-311",{type:"geojson",data:{type:"FeatureCollection",features:[[-74.0118,40.677],[-74.0114,40.6767],[-74.0121,40.6772]].map(i=>({type:"Feature",properties:{},geometry:{type:"Point",coordinates:i}}))}}),a.addLayer({id:"proxy-311-circle",type:"circle",source:"proxy-311",paint:{"circle-radius":3,"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1}}),a.addSource("floodnet",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:[-74.0103,40.6788]}}}),a.addLayer({id:"floodnet-pin",type:"circle",source:"floodnet",paint:{"circle-radius":4,"circle-color":"#0B5394","circle-stroke-color":"#FFFFFF","circle-stroke-width":1}}),a.addSource("addr",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:r}}}),a.addLayer({id:"addr-ring",type:"circle",source:"addr",paint:{"circle-radius":9,"circle-color":"transparent","circle-stroke-color":"#0F172A","circle-stroke-width":1.4}}),a.addLayer({id:"addr-dot",type:"circle",source:"addr",paint:{"circle-radius":3,"circle-color":"#0F172A"}}))}))})(),()=>{l=!0,a&&(a.remove(),a=null)}});var n=be(),u=c(n);ve(u,l=>N(t,l),()=>d(t)),k(2),o(n),m(e,n),M()}var Se=w(`<section class="land-section svelte-1anw2jf"><div class="land-section-head svelte-1anw2jf"><span class="section-label">What you'll get back</span> <span class="land-section-meta svelte-1anw2jf">A grounded paragraph with citations, not a chatbot answer.</span></div> <div class="land-preview-grid svelte-1anw2jf"><div class="land-preview-pane land-preview-pane-excerpt svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Briefing excerpt</div> <p class="land-preview-body svelte-1anw2jf">The lot sits inside the FEMA <span class="land-preview-cite svelte-1anw2jf">1% AE flood zone <sup class="svelte-1anw2jf">[c3]</sup></span>,
2
  with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
3
  FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM · Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL · 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database · 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 · 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL · panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection · 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook · z14.5 · Carto Positron</div></div></div></section>`);function ke(e){var s=Se(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);_e(a,{}),k(2),o(t),o(r),o(s),m(e,s)}var Fe=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),xe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones · one taxonomy · every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
4
  Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function Le(e,s){P(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs · FEMA NFHL · DEP stormwater · Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA · NYCHA · DOE · DOH · PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors · 311 complaints · NWS · NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 · Granite TTM (zero-shot + NYC fine-tune) · NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer · Mellea grounding-check · WeasyPrint",tint:"var(--stone-capstone)"}];me();var t=xe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=Fe();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),F=c(b,!0);o(b);var h=f(b,2),x=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var z=f(_,2),W=c(z,!0);o(z),o(i),T(Y=>{j=ce(i,"",j,{"--stone-tint":d(l).tint}),g(p,Y),g(F,d(l).name),g(x,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),M()}var Ce=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.6 · NYC OpenData · FEMA NFHL · USGS · NPCC4 · Dam mark by Chintuza, Noun Project (CC-BY)</span></footer>');function Ee(e){var s=Ce();m(e,s)}var Ne=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ae=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function We(e){var s=Ae();ne("1uha8ag",v=>{var i=Ne();te(()=>{re.title="Riprap — Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);he(r);var t=f(r,2),a=c(t);je(a,{});var n=f(a,2);ke(n),o(t);var u=f(t,2);Le(u,{});var l=f(u,2);Ee(l),o(s),m(e,s)}export{We as component};
web/sveltekit/build/_app/immutable/nodes/{3.0RkbXXD4.js → 3.CU36QLul.js} RENAMED
@@ -1,4 +1,4 @@
1
- import{d as ge,c as he,a as v,s as l,e as xe,f as p}from"../chunks/CWw6qgC_.js";import{p as ye,ai as we,f as $e,a as ke,aj as qe,o as e,a5 as F,ak as je,al as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/BTUA7_xE.js";import{i as O}from"../chunks/Bd-v_9Ud.js";import{e as Se}from"../chunks/25_y8TFd.js";import{h as Fe}from"../chunks/cDW0xQNP.js";import{p as Ie}from"../chunks/B3Pg95Il.js";import{B as Me,T as Oe}from"../chunks/BatqQaKj.js";import{l as Te}from"../chunks/DxQlA7U2.js";const Pe=!1,Re=!1,Ue=Object.freeze(Object.defineProperty({__proto__:null,prerender:Pe,ssr:Re},Symbol.toStringTag,{value:"Module"}));var Ae=p(`<div class="empty svelte-uialbm"><h1 class="svelte-uialbm">No briefing snapshot found</h1> <p>Run a briefing first at <a href="/" class="svelte-uialbm">riprap home</a>; once it finishes,
2
  use <strong>export PDF</strong> from the header to open this view.
3
  Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;je.title=`Riprap briefing — ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);Se(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=j=>{var S=Be(),_e=a(S,!0);t(S),M(()=>l(_e,e(o).url)),v(j,S)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,j=>{e(fe)&&j(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing · v0.4.2 · ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` · ${e(i).specialists??""} specialists
4
  · ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
 
1
+ import{d as ge,c as he,a as v,s as l,e as xe,f as p}from"../chunks/CWw6qgC_.js";import{p as ye,ai as we,f as $e,a as ke,aj as qe,o as e,a5 as F,ak as je,al as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/BTUA7_xE.js";import{i as O}from"../chunks/Bd-v_9Ud.js";import{e as Se}from"../chunks/25_y8TFd.js";import{h as Fe}from"../chunks/cDW0xQNP.js";import{p as Ie}from"../chunks/D8NyAcAP.js";import{B as Me,T as Oe}from"../chunks/BatqQaKj.js";import{l as Te}from"../chunks/DxQlA7U2.js";const Pe=!1,Re=!1,Ue=Object.freeze(Object.defineProperty({__proto__:null,prerender:Pe,ssr:Re},Symbol.toStringTag,{value:"Module"}));var Ae=p(`<div class="empty svelte-uialbm"><h1 class="svelte-uialbm">No briefing snapshot found</h1> <p>Run a briefing first at <a href="/" class="svelte-uialbm">riprap home</a>; once it finishes,
2
  use <strong>export PDF</strong> from the header to open this view.
3
  Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;je.title=`Riprap briefing — ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);Se(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=j=>{var S=Be(),_e=a(S,!0);t(S),M(()=>l(_e,e(o).url)),v(j,S)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,j=>{e(fe)&&j(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing · v0.4.2 · ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` · ${e(i).specialists??""} specialists
4
  · ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
web/sveltekit/build/_app/immutable/nodes/{4.DLn0bV4P.js → 4.JuDtCP-e.js} RENAMED
The diff for this file is too large to render. See raw diff
 
web/sveltekit/build/_app/immutable/nodes/{5.C0xKDhXA.js → 5.CRCvLD8F.js} RENAMED
@@ -1 +1 @@
1
- import{d as z,e as V,a as U,f as q,s as j}from"../chunks/CWw6qgC_.js";import{p as Z,am as X,a5 as d,a4 as l,a9 as Q,ai as $,t as J,a as ee,s as r,c as e,o as i,r as t,al as te}from"../chunks/BTUA7_xE.js";import{B as ie}from"../chunks/BatqQaKj.js";import{f as re,R as ae,M as ne,C as se,F as oe}from"../chunks/FjZhY28w.js";import{p as de,b as M}from"../chunks/DxQlA7U2.js";const le=!0,fe=Object.freeze(Object.defineProperty({__proto__:null,prerender:le},Symbol.toStringTag,{value:"Module"})),R="80 Pioneer Street · Red Hook · Brooklyn",y={c1:{id:"c1",n:1,tier:"empirical",source:"USGS",title:"Hurricane Sandy storm tide elevations, NY-NJ Harbor",docId:"USGS-OFR-2013-1234",url:"https://pubs.usgs.gov/of/2013/1234/",vintage:"2013-05",retrieved:"2026-04-28"},c2:{id:"c2",n:2,tier:"empirical",source:"NYC OEM",title:"Hurricane Sandy Inundation Zone (2012)",docId:"NYCOEM-SIZ-2013",url:"https://data.cityofnewyork.us/dataset/sandy-inundation-zone",vintage:"2013-01",retrieved:"2026-04-28"},c3:{id:"c3",n:3,tier:"empirical",source:"FloodNet NYC",title:"Sensor BK-RH-002 — Coffey Park, monthly exceedance",docId:"FN-BK-RH-002",url:"https://floodnet.nyc/sensor/BK-RH-002",vintage:"2026-04",retrieved:"2026-05-02"},c4:{id:"c4",n:4,tier:"modeled",source:"FEMA",title:"Preliminary Flood Insurance Rate Map, panel 36047C0207G",docId:"FEMA-FIRM-36047C0207G",url:"https://msc.fema.gov/portal/search",vintage:"2024-09",retrieved:"2026-04-28"},c5:{id:"c5",n:5,tier:"modeled",source:"NYC DEP",title:"Stormwater Flood Map — Moderate Stormwater Scenario",docId:"NYCDEP-SWFM-2024",url:"https://nyc.gov/stormwater-map",vintage:"2024-06",retrieved:"2026-04-28"},c6:{id:"c6",n:6,tier:"modeled",source:"NPCC4",title:"Sea-level rise projections, 2050 90th percentile",docId:"NPCC4-Ch3-Tbl3.2",url:"https://nyas.org/npcc4",vintage:"2024-03",retrieved:"2026-04-28"},c7:{id:"c7",n:7,tier:"proxy",source:"NYC 311",title:"Flooding service requests, BK CB6 2019–2025",docId:"NYC311-FLD-CB6",url:"https://data.cityofnewyork.us/311",vintage:"2025-12",retrieved:"2026-05-01"},c8:{id:"c8",n:8,tier:"proxy",source:"FEMA NFIP",title:"National Flood Insurance Program claims, tract 36047008500",docId:"NFIP-T36047008500",url:"https://www.fema.gov/openfema",vintage:"2024-12",retrieved:"2026-04-28"},c9:{id:"c9",n:9,tier:"synthetic",source:"TerraMind v1.2",title:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)",docId:"RIPRAP-SYN-20250914",url:"#methodology-synthetic",vintage:"2025-09",retrieved:"2026-05-02"},c10:{id:"c10",n:10,tier:"modeled",source:"NYC DCP",title:"Waterfront Revitalization Program — Coastal Risk Area",docId:"NYCDCP-WRP-2022",url:"https://nyc.gov/dcp/wrp",vintage:"2022-11",retrieved:"2026-04-28"}},x=[{kind:"status",html:'<p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p>'},{kind:"head",n:"01",label:"Status",title:"Coastal-edge, post-Sandy, multi-hazard"},{kind:"prose",parts:[{tier:"empirical",text:"The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88",cite:"c1"},{text:" — within the "},{tier:"empirical",text:"2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery",cite:"c2"},{text:" 2.4 mi to the northwest. "},{tier:"modeled",text:"FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)",cite:"c4"},{text:", a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster."}]},{kind:"head",n:"02",label:"Empirical evidence",tier:"empirical"},{kind:"prose",parts:[{tier:"empirical",text:"FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04",cite:"c3"},{text:", with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. "},{tier:"empirical",text:"USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88",cite:"c1"},{text:", consistent with 0.6–1.9 ft of standing water at the queried address during the storm."}]},{kind:"head",n:"03",label:"Modeled scenarios",tier:"modeled"},{kind:"prose",parts:[{tier:"modeled",text:"DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot",cite:"c5"},{text:", routed by the 1.2% slope toward Imlay St. "},{tier:"modeled",text:"Under NPCC4's 2050 90th-percentile sea-level rise (30 in)",cite:"c6"},{text:", the parcel falls within the projected daily-tidal floodplain by mid-century. "},{tier:"synthetic",text:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation",cite:"c9"},{text:"; treat with appropriate caution."}]},{kind:"head",n:"04",label:"Policy context"},{kind:"prose",parts:[{tier:"proxy",text:"311 flood complaints within the surrounding census tract total 89 calls over 2019���2025, with seasonal clustering in Aug–Oct",cite:"c7"},{text:". "},{tier:"proxy",text:"NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000",cite:"c8"},{text:". "},{tier:"modeled",text:"The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action",cite:"c10"},{text:"."}]}],ce={wallSeconds:14,cacheHit:.92,cards:[{id:"fc-fema",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"Federal Emergency Management Agency",vintage:"2024-09",title:"Preliminary FIRM, panel 36047C0207G",headline:"Zone AE",subhead:"BFE 11 ft NAVD88 · freeboard +4.8 ft",body:"Address sits within the regulatory 1% annual-chance floodplain. Base Flood Elevation 11.0 ft NAVD88; first floor must be at or above this datum for NFIP rating.",docId:"FEMA-FIRM-36047C0207G",citeId:"c4",mapLayer:"fema-ae"},{id:"fc-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"U.S. Geological Survey",vintage:"2013-05",title:"Post-Sandy high-water marks within 500 ft",columns:["id","elev.","dist."],rows:[["HWM-NY-3081","7.4 ft NAVD88","0.18 mi"],["HWM-NY-3082","8.1 ft NAVD88","0.22 mi"],["HWM-NY-3105","6.8 ft NAVD88","0.31 mi"]],sub:"3 marks · max 8.1 ft · surveyed Nov 2012",docId:"USGS-OFR-2013-1234",citeId:"c1",mapLayer:"hwm"},{id:"fc-stormwater",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"NYC Dept. of Environmental Protection",vintage:"2024-06",title:"Stormwater Flood Map · moderate scenario",rasterKind:"stormwater",sub:"2.13 in/hr · ponding ≥4 in W half of lot · routed toward Imlay St",docId:"NYCDEP-SWFM-2024",citeId:"c5",mapLayer:"stormwater"},{id:"fc-register-rh",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:"2026-05",title:"Nearby exposed assets",registers:[{reg:"MTA",tier:"empirical",label:"Smith–9 St subway entrance",detail:"0.34 mi · F · G",sourceId:"MTA-ENT-N048",vintage:"2025-11",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook East Houses",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-RHE",vintage:"2025-Q3",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook West Houses",detail:"0.52 mi · 3,142 res.",sourceId:"NYCHA-RHW",vintage:"2025-Q3",note:null},{reg:"DOE",tier:"empirical",label:"PS 27 Agnes Y. Humphrey",detail:"0.29 mi · 271 K-5",sourceId:"DOE-K027",vintage:"2024-25",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,vintage:null,note:"no acute-care hospital within 1.0 mi (silent)"},{reg:"PLUTO",tier:"empirical",label:"Lot 36047 / 521 / 7",detail:"BIN 3018472 · MX-1",sourceId:"PLUTO-2024v2",vintage:"2024-12",note:null}],sub:"5 of 6 registers fired · 1 silent · joined within 1.0 mi",docId:"RIPRAP-EXP-RH80",citeId:"c-reg-rh",mapLayer:"registers"},{id:"fc-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC sensor network",vintage:"2026-04",title:"Sensor BK-RH-002, monthly above-curb events",headline:"7 events",subhead:"Jun 2024 → Apr 2026 · peak 14.3 cm",spark:[0,0,1,0,2,1,0,0,3,0,1,0,0,0,2,1,0,0,1,0,2,4,1,1],sparkSub:"Sensor located 0.21 mi N at Coffey & Van Brunt. Above-curb depth in cm; events ≥2 cm.",docId:"FN-BK-RH-002",citeId:"c3",mapLayer:"floodnet"},{id:"fc-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests",vintage:"2025-12",title:"Recent 311 flood complaints, BK CB6",headline:"89 calls",subhead:"2019–2025 · seasonal cluster Aug–Oct",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],sparkSub:"Filtered to complaint types: Sewer (Backup), Street Flooding, Catch Basin Clogged. Within 200 m of address.",docId:"NYC311-FLD-CB6",citeId:"c7",mapLayer:"complaints"},{id:"fc-prithvi-pluvial",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:"2026-05-02 · Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:"0.3% flooded",subhead:"no flooding apparent · scene 2026-05-02",sub:"Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.",docId:"PRITHVI-NYC-PLUV-V2-20260502",citeId:"c-prithvi",illustrative:!0,mapLayer:"prithvi-pluvial"},{id:"fc-terramind-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2 · 2024-09-18",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:[{k:"urban",pct:62,color:"#C66"},{k:"water",pct:18,color:"#5B7FB4"},{k:"vegetation",pct:12,color:"#5B8A4A"},{k:"barren",pct:6,color:"#A89A78"},{k:"wetland",pct:2,color:"#D9C75A"}],sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",docId:"TERRAMIND-LULC-20240918",citeId:"c-tm-lulc",illustrative:!0,mapLayer:"terramind-lulc"},{id:"fc-nws",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS KNYC",agency:"NOAA · National Weather Service",vintage:"2026-05-05",title:"Current weather, station KNYC",scalars:[{value:"0.02 in",label:"precip · last 24h"},{value:"67°F",label:"temp · current"},{value:"PC",label:"conditions"}],sub:"Observation timestamp 2026-05-05 14:18 ET. Central Park station; not point-of-query.",docId:"NWS-KNYC",citeId:"c-nws",mapLayer:"nws"},{id:"fc-ttm-surge",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:"+47 cm @ +38h"},headline:"+47 cm",subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Nowcast applies city-wide via NOAA station 8518750. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_zeroshot",citeId:"c-ttm",mapLayer:null},{id:"fc-ttm-surge-ft",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:38,y:53},peakLabel:"+53 cm @ +38h"},headline:"+53 cm",subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Trained on AMD MI300X.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_finetune",citeId:"c-ttm-ft",mapLayer:null,hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"},{id:"fc-npcc4",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"NYC Panel on Climate Change, 4th Assessment",vintage:"2024-03",title:"Sea-level rise projections, Lower NY Harbor",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2080,low:28,mid:49,high:75},{year:2100,low:38,mid:71,high:114}],sub:"inches MSL · 17th–83rd %ile range, median line. Battery tide-gauge baseline.",docId:"NPCC4-Ch3-Tbl3.2",citeId:"c6",mapLayer:null},{id:"fc-mellea-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · grounding check",vintage:"2026-05-05 14:22 ET",title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:"1 reroll"},{k:"grounding checks",v:"4/4 passed"},{k:"citations resolved",v:"4"},{k:"wall-clock",v:"24.0 s"}],sub:"Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.",docId:"RIPRAP-CAP-RH80",citeId:null,mapLayer:null}],stones:[{key:"cornerstone",members:[{id:"CORN-001",name:"sandy_inundation",status:"fired",tier:"empirical",ms:412},{id:"CORN-002",name:"dep_stormwater",status:"fired",tier:"modeled",ms:540},{id:"CORN-003",name:"ida_hwm_2021",status:"fired",tier:"empirical",ms:612},{id:"CORN-004",name:"prithvi_eo_v2",status:"fired",tier:"modeled",ms:980},{id:"CORN-005",name:"microtopo_lidar",status:"fired",tier:"proxy",ms:1240}]},{key:"keystone",members:[{id:"KEY-001",name:"mta_entrance_exposure",status:"silent_by_design",tier:"empirical",ms:30,note:"no entrances within radius"},{id:"KEY-002",name:"nycha_development_exposure",status:"silent_by_design",tier:"empirical",ms:28,note:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe_school_exposure",status:"silent_by_design",tier:"empirical",ms:24,note:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh_hospital_exposure",status:"silent_by_design",tier:"empirical",ms:22,note:"no acute-care hospitals within 1.0 mi"}]},{key:"touchstone",members:[{id:"TCH-001",name:"floodnet",status:"fired",tier:"empirical",ms:285},{id:"TCH-002",name:"nyc311",status:"fired",tier:"proxy",ms:410},{id:"TCH-003",name:"nws_obs",status:"fired",tier:"empirical",ms:240},{id:"TCH-004",name:"noaa_tides",status:"fired",tier:"empirical",ms:196},{id:"TCH-005",name:"prithvi_eo_live",status:"fired",tier:"modeled",ms:4920},{id:"TCH-006",name:"terramind_lulc",status:"fired",tier:"synthetic",ms:2100}]},{key:"lodestone",members:[{id:"LOD-001",name:"nws_alerts",status:"fired",tier:"modeled",ms:110},{id:"LOD-002",name:"ttm_forecast",status:"fired",tier:"modeled",ms:1500},{id:"LOD-003",name:"ttm_battery_surge",status:"fired",tier:"modeled",ms:1480},{id:"LOD-004",name:"floodnet_forecast",status:"silent_by_design",tier:"modeled",ms:14,note:"sensor has only 2 historical events; forecast omitted (silent-floor: 5)"},{id:"LOD-005",name:"ttm_311_forecast",status:"errored",tier:"modeled",ms:0,note:"311 history fetch failed: HTTP 503 at NYC OpenData (3 retries)"}]},{key:"capstone",members:[{id:"CAP-001",name:"rag_granite_embedding",status:"fired",tier:"proxy",ms:410},{id:"CAP-002",name:"gliner_extract",status:"fired",tier:"proxy",ms:280},{id:"CAP-003",name:"reconcile_granite41",status:"fired",tier:"modeled",ms:6240}]}].map(a=>({key:a.key,members:re(a.key,a.members)}))};var me=q('<section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr"> </span></h1> <!></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><!> <!></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom"><section class="app-region app-region-findings" aria-label="Findings"><!></section></div></div></section>');function ye(a,T){Z(T,!0);let c=l(null),F="comfortable",B="smart",b=l(!1);X(()=>{typeof window<"u"&&d(b,new URL(window.location.href).searchParams.get("grammar")==="1")});function Y(o){d(c,o,!0)}function E(o){const s=document.getElementById("region-cites");s&&s.scrollIntoView({behavior:"smooth",block:"start"})}let n=l(Q({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),m=l(0);$(()=>(de({queryId:"sample",queryText:R,intent:"single_address",specialists:9,blocks:x,citations:y,generatedAt:new Date().toISOString(),attempts:1}),M.markReady(),()=>M.reset()));const L={label:"80 Pioneer St",lat:40.6776,lon:-74.0096},C={type:"FeatureCollection",features:[{type:"Feature",properties:{source:"sample-fixture",tier:"synthetic"},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]};var u=me(),N=e(u),p=e(N),h=e(p),g=e(h),D=r(e(g),2);t(g);var v=r(g,2),w=r(e(v)),H=e(w,!0);t(w),t(v);var O=r(v,2);ie(O,{get blocks(){return x},get citations(){return y},streaming:!0,get replayKey(){return i(m)}}),t(h);var I=r(h,2),f=e(I),S=r(e(f),2),k=e(S);ae(k,{get address(){return L},get activeLayers(){return i(n)},get syntheticPrior(){return C},get linkedKey(){return i(c)}});var K=r(k,2);{let o=te(()=>({empirical:0,modeled:0,synthetic:C.features.length,proxy:0}));ne(K,{get active(){return i(n)},get featureCounts(){return i(o)},onToggle:s=>d(n,{...i(n),[s]:!i(n)[s]},!0)})}t(S),t(f);var _=r(f,2),G=e(_);se(G,{get citations(){return y}}),t(_),t(I),t(p);var P=r(p,2),A=e(P),W=e(A);oe(W,{get data(){return ce},density:F,provenanceMode:B,get showGrammar(){return i(b)},get linkedKey(){return i(c)},onLink:Y,onCite:E}),t(A),t(P),t(N),t(u),J(()=>j(H,R)),V("click",D,()=>d(m,i(m)+1)),U(a,u),ee()}z(["click"]);export{ye as component,fe as universal};
 
1
+ import{d as z,e as V,a as U,f as q,s as j}from"../chunks/CWw6qgC_.js";import{p as Z,am as X,a5 as d,a4 as l,a9 as Q,ai as $,t as J,a as ee,s as r,c as e,o as i,r as t,al as te}from"../chunks/BTUA7_xE.js";import{B as ie}from"../chunks/BatqQaKj.js";import{f as re,R as ae,M as ne,C as se,F as oe}from"../chunks/DDAjlznB.js";import{p as de,b as M}from"../chunks/DxQlA7U2.js";const le=!0,fe=Object.freeze(Object.defineProperty({__proto__:null,prerender:le},Symbol.toStringTag,{value:"Module"})),R="80 Pioneer Street · Red Hook · Brooklyn",y={c1:{id:"c1",n:1,tier:"empirical",source:"USGS",title:"Hurricane Sandy storm tide elevations, NY-NJ Harbor",docId:"USGS-OFR-2013-1234",url:"https://pubs.usgs.gov/of/2013/1234/",vintage:"2013-05",retrieved:"2026-04-28"},c2:{id:"c2",n:2,tier:"empirical",source:"NYC OEM",title:"Hurricane Sandy Inundation Zone (2012)",docId:"NYCOEM-SIZ-2013",url:"https://data.cityofnewyork.us/dataset/sandy-inundation-zone",vintage:"2013-01",retrieved:"2026-04-28"},c3:{id:"c3",n:3,tier:"empirical",source:"FloodNet NYC",title:"Sensor BK-RH-002 — Coffey Park, monthly exceedance",docId:"FN-BK-RH-002",url:"https://floodnet.nyc/sensor/BK-RH-002",vintage:"2026-04",retrieved:"2026-05-02"},c4:{id:"c4",n:4,tier:"modeled",source:"FEMA",title:"Preliminary Flood Insurance Rate Map, panel 36047C0207G",docId:"FEMA-FIRM-36047C0207G",url:"https://msc.fema.gov/portal/search",vintage:"2024-09",retrieved:"2026-04-28"},c5:{id:"c5",n:5,tier:"modeled",source:"NYC DEP",title:"Stormwater Flood Map — Moderate Stormwater Scenario",docId:"NYCDEP-SWFM-2024",url:"https://nyc.gov/stormwater-map",vintage:"2024-06",retrieved:"2026-04-28"},c6:{id:"c6",n:6,tier:"modeled",source:"NPCC4",title:"Sea-level rise projections, 2050 90th percentile",docId:"NPCC4-Ch3-Tbl3.2",url:"https://nyas.org/npcc4",vintage:"2024-03",retrieved:"2026-04-28"},c7:{id:"c7",n:7,tier:"proxy",source:"NYC 311",title:"Flooding service requests, BK CB6 2019–2025",docId:"NYC311-FLD-CB6",url:"https://data.cityofnewyork.us/311",vintage:"2025-12",retrieved:"2026-05-01"},c8:{id:"c8",n:8,tier:"proxy",source:"FEMA NFIP",title:"National Flood Insurance Program claims, tract 36047008500",docId:"NFIP-T36047008500",url:"https://www.fema.gov/openfema",vintage:"2024-12",retrieved:"2026-04-28"},c9:{id:"c9",n:9,tier:"synthetic",source:"TerraMind v1.2",title:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)",docId:"RIPRAP-SYN-20250914",url:"#methodology-synthetic",vintage:"2025-09",retrieved:"2026-05-02"},c10:{id:"c10",n:10,tier:"modeled",source:"NYC DCP",title:"Waterfront Revitalization Program — Coastal Risk Area",docId:"NYCDCP-WRP-2022",url:"https://nyc.gov/dcp/wrp",vintage:"2022-11",retrieved:"2026-04-28"}},x=[{kind:"status",html:'<p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p>'},{kind:"head",n:"01",label:"Status",title:"Coastal-edge, post-Sandy, multi-hazard"},{kind:"prose",parts:[{tier:"empirical",text:"The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88",cite:"c1"},{text:" — within the "},{tier:"empirical",text:"2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery",cite:"c2"},{text:" 2.4 mi to the northwest. "},{tier:"modeled",text:"FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)",cite:"c4"},{text:", a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster."}]},{kind:"head",n:"02",label:"Empirical evidence",tier:"empirical"},{kind:"prose",parts:[{tier:"empirical",text:"FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04",cite:"c3"},{text:", with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. "},{tier:"empirical",text:"USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88",cite:"c1"},{text:", consistent with 0.6–1.9 ft of standing water at the queried address during the storm."}]},{kind:"head",n:"03",label:"Modeled scenarios",tier:"modeled"},{kind:"prose",parts:[{tier:"modeled",text:"DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot",cite:"c5"},{text:", routed by the 1.2% slope toward Imlay St. "},{tier:"modeled",text:"Under NPCC4's 2050 90th-percentile sea-level rise (30 in)",cite:"c6"},{text:", the parcel falls within the projected daily-tidal floodplain by mid-century. "},{tier:"synthetic",text:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation",cite:"c9"},{text:"; treat with appropriate caution."}]},{kind:"head",n:"04",label:"Policy context"},{kind:"prose",parts:[{tier:"proxy",text:"311 flood complaints within the surrounding census tract total 89 calls over 2019–2025, with seasonal clustering in Aug–Oct",cite:"c7"},{text:". "},{tier:"proxy",text:"NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000",cite:"c8"},{text:". "},{tier:"modeled",text:"The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action",cite:"c10"},{text:"."}]}],ce={wallSeconds:14,cacheHit:.92,cards:[{id:"fc-fema",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"Federal Emergency Management Agency",vintage:"2024-09",title:"Preliminary FIRM, panel 36047C0207G",headline:"Zone AE",subhead:"BFE 11 ft NAVD88 · freeboard +4.8 ft",body:"Address sits within the regulatory 1% annual-chance floodplain. Base Flood Elevation 11.0 ft NAVD88; first floor must be at or above this datum for NFIP rating.",docId:"FEMA-FIRM-36047C0207G",citeId:"c4",mapLayer:"fema-ae"},{id:"fc-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"U.S. Geological Survey",vintage:"2013-05",title:"Post-Sandy high-water marks within 500 ft",columns:["id","elev.","dist."],rows:[["HWM-NY-3081","7.4 ft NAVD88","0.18 mi"],["HWM-NY-3082","8.1 ft NAVD88","0.22 mi"],["HWM-NY-3105","6.8 ft NAVD88","0.31 mi"]],sub:"3 marks · max 8.1 ft · surveyed Nov 2012",docId:"USGS-OFR-2013-1234",citeId:"c1",mapLayer:"hwm"},{id:"fc-stormwater",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"NYC Dept. of Environmental Protection",vintage:"2024-06",title:"Stormwater Flood Map · moderate scenario",rasterKind:"stormwater",sub:"2.13 in/hr · ponding ≥4 in W half of lot · routed toward Imlay St",docId:"NYCDEP-SWFM-2024",citeId:"c5",mapLayer:"stormwater"},{id:"fc-register-rh",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:"2026-05",title:"Nearby exposed assets",registers:[{reg:"MTA",tier:"empirical",label:"Smith–9 St subway entrance",detail:"0.34 mi · F · G",sourceId:"MTA-ENT-N048",vintage:"2025-11",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook East Houses",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-RHE",vintage:"2025-Q3",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook West Houses",detail:"0.52 mi · 3,142 res.",sourceId:"NYCHA-RHW",vintage:"2025-Q3",note:null},{reg:"DOE",tier:"empirical",label:"PS 27 Agnes Y. Humphrey",detail:"0.29 mi · 271 K-5",sourceId:"DOE-K027",vintage:"2024-25",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,vintage:null,note:"no acute-care hospital within 1.0 mi (silent)"},{reg:"PLUTO",tier:"empirical",label:"Lot 36047 / 521 / 7",detail:"BIN 3018472 · MX-1",sourceId:"PLUTO-2024v2",vintage:"2024-12",note:null}],sub:"5 of 6 registers fired · 1 silent · joined within 1.0 mi",docId:"RIPRAP-EXP-RH80",citeId:"c-reg-rh",mapLayer:"registers"},{id:"fc-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC sensor network",vintage:"2026-04",title:"Sensor BK-RH-002, monthly above-curb events",headline:"7 events",subhead:"Jun 2024 → Apr 2026 · peak 14.3 cm",spark:[0,0,1,0,2,1,0,0,3,0,1,0,0,0,2,1,0,0,1,0,2,4,1,1],sparkSub:"Sensor located 0.21 mi N at Coffey & Van Brunt. Above-curb depth in cm; events ≥2 cm.",docId:"FN-BK-RH-002",citeId:"c3",mapLayer:"floodnet"},{id:"fc-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests",vintage:"2025-12",title:"Recent 311 flood complaints, BK CB6",headline:"89 calls",subhead:"2019–2025 · seasonal cluster Aug–Oct",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],sparkSub:"Filtered to complaint types: Sewer (Backup), Street Flooding, Catch Basin Clogged. Within 200 m of address.",docId:"NYC311-FLD-CB6",citeId:"c7",mapLayer:"complaints"},{id:"fc-prithvi-pluvial",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:"2026-05-02 · Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:"0.3% flooded",subhead:"no flooding apparent · scene 2026-05-02",sub:"Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.",docId:"PRITHVI-NYC-PLUV-V2-20260502",citeId:"c-prithvi",illustrative:!0,mapLayer:"prithvi-pluvial"},{id:"fc-terramind-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2 · 2024-09-18",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:[{k:"urban",pct:62,color:"#C66"},{k:"water",pct:18,color:"#5B7FB4"},{k:"vegetation",pct:12,color:"#5B8A4A"},{k:"barren",pct:6,color:"#A89A78"},{k:"wetland",pct:2,color:"#D9C75A"}],sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",docId:"TERRAMIND-LULC-20240918",citeId:"c-tm-lulc",illustrative:!0,mapLayer:"terramind-lulc"},{id:"fc-nws",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS KNYC",agency:"NOAA · National Weather Service",vintage:"2026-05-05",title:"Current weather, station KNYC",scalars:[{value:"0.02 in",label:"precip · last 24h"},{value:"67°F",label:"temp · current"},{value:"PC",label:"conditions"}],sub:"Observation timestamp 2026-05-05 14:18 ET. Central Park station; not point-of-query.",docId:"NWS-KNYC",citeId:"c-nws",mapLayer:"nws"},{id:"fc-ttm-surge",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:"+47 cm @ +38h"},headline:"+47 cm",subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Nowcast applies city-wide via NOAA station 8518750. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_zeroshot",citeId:"c-ttm",mapLayer:null},{id:"fc-ttm-surge-ft",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:38,y:53},peakLabel:"+53 cm @ +38h"},headline:"+53 cm",subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Trained on AMD MI300X.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_finetune",citeId:"c-ttm-ft",mapLayer:null,hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"},{id:"fc-npcc4",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"NYC Panel on Climate Change, 4th Assessment",vintage:"2024-03",title:"Sea-level rise projections, Lower NY Harbor",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2080,low:28,mid:49,high:75},{year:2100,low:38,mid:71,high:114}],sub:"inches MSL · 17th–83rd %ile range, median line. Battery tide-gauge baseline.",docId:"NPCC4-Ch3-Tbl3.2",citeId:"c6",mapLayer:null},{id:"fc-mellea-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · grounding check",vintage:"2026-05-05 14:22 ET",title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:"1 reroll"},{k:"grounding checks",v:"4/4 passed"},{k:"citations resolved",v:"4"},{k:"wall-clock",v:"24.0 s"}],sub:"Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.",docId:"RIPRAP-CAP-RH80",citeId:null,mapLayer:null}],stones:[{key:"cornerstone",members:[{id:"CORN-001",name:"sandy_inundation",status:"fired",tier:"empirical",ms:412},{id:"CORN-002",name:"dep_stormwater",status:"fired",tier:"modeled",ms:540},{id:"CORN-003",name:"ida_hwm_2021",status:"fired",tier:"empirical",ms:612},{id:"CORN-004",name:"prithvi_eo_v2",status:"fired",tier:"modeled",ms:980},{id:"CORN-005",name:"microtopo_lidar",status:"fired",tier:"proxy",ms:1240}]},{key:"keystone",members:[{id:"KEY-001",name:"mta_entrance_exposure",status:"silent_by_design",tier:"empirical",ms:30,note:"no entrances within radius"},{id:"KEY-002",name:"nycha_development_exposure",status:"silent_by_design",tier:"empirical",ms:28,note:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe_school_exposure",status:"silent_by_design",tier:"empirical",ms:24,note:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh_hospital_exposure",status:"silent_by_design",tier:"empirical",ms:22,note:"no acute-care hospitals within 1.0 mi"}]},{key:"touchstone",members:[{id:"TCH-001",name:"floodnet",status:"fired",tier:"empirical",ms:285},{id:"TCH-002",name:"nyc311",status:"fired",tier:"proxy",ms:410},{id:"TCH-003",name:"nws_obs",status:"fired",tier:"empirical",ms:240},{id:"TCH-004",name:"noaa_tides",status:"fired",tier:"empirical",ms:196},{id:"TCH-005",name:"prithvi_eo_live",status:"fired",tier:"modeled",ms:4920},{id:"TCH-006",name:"terramind_lulc",status:"fired",tier:"synthetic",ms:2100}]},{key:"lodestone",members:[{id:"LOD-001",name:"nws_alerts",status:"fired",tier:"modeled",ms:110},{id:"LOD-002",name:"ttm_forecast",status:"fired",tier:"modeled",ms:1500},{id:"LOD-003",name:"ttm_battery_surge",status:"fired",tier:"modeled",ms:1480},{id:"LOD-004",name:"floodnet_forecast",status:"silent_by_design",tier:"modeled",ms:14,note:"sensor has only 2 historical events; forecast omitted (silent-floor: 5)"},{id:"LOD-005",name:"ttm_311_forecast",status:"errored",tier:"modeled",ms:0,note:"311 history fetch failed: HTTP 503 at NYC OpenData (3 retries)"}]},{key:"capstone",members:[{id:"CAP-001",name:"rag_granite_embedding",status:"fired",tier:"proxy",ms:410},{id:"CAP-002",name:"gliner_extract",status:"fired",tier:"proxy",ms:280},{id:"CAP-003",name:"reconcile_granite41",status:"fired",tier:"modeled",ms:6240}]}].map(a=>({key:a.key,members:re(a.key,a.members)}))};var me=q('<section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr"> </span></h1> <!></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><!> <!></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom"><section class="app-region app-region-findings" aria-label="Findings"><!></section></div></div></section>');function ye(a,T){Z(T,!0);let c=l(null),F="comfortable",B="smart",b=l(!1);X(()=>{typeof window<"u"&&d(b,new URL(window.location.href).searchParams.get("grammar")==="1")});function Y(o){d(c,o,!0)}function E(o){const s=document.getElementById("region-cites");s&&s.scrollIntoView({behavior:"smooth",block:"start"})}let n=l(Q({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),m=l(0);$(()=>(de({queryId:"sample",queryText:R,intent:"single_address",specialists:9,blocks:x,citations:y,generatedAt:new Date().toISOString(),attempts:1}),M.markReady(),()=>M.reset()));const L={label:"80 Pioneer St",lat:40.6776,lon:-74.0096},C={type:"FeatureCollection",features:[{type:"Feature",properties:{source:"sample-fixture",tier:"synthetic"},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]};var u=me(),N=e(u),p=e(N),h=e(p),g=e(h),D=r(e(g),2);t(g);var v=r(g,2),w=r(e(v)),H=e(w,!0);t(w),t(v);var O=r(v,2);ie(O,{get blocks(){return x},get citations(){return y},streaming:!0,get replayKey(){return i(m)}}),t(h);var I=r(h,2),f=e(I),S=r(e(f),2),k=e(S);ae(k,{get address(){return L},get activeLayers(){return i(n)},get syntheticPrior(){return C},get linkedKey(){return i(c)}});var K=r(k,2);{let o=te(()=>({empirical:0,modeled:0,synthetic:C.features.length,proxy:0}));ne(K,{get active(){return i(n)},get featureCounts(){return i(o)},onToggle:s=>d(n,{...i(n),[s]:!i(n)[s]},!0)})}t(S),t(f);var _=r(f,2),G=e(_);se(G,{get citations(){return y}}),t(_),t(I),t(p);var P=r(p,2),A=e(P),W=e(A);oe(W,{get data(){return ce},density:F,provenanceMode:B,get showGrammar(){return i(b)},get linkedKey(){return i(c)},onLink:Y,onCite:E}),t(A),t(P),t(N),t(u),J(()=>j(H,R)),V("click",D,()=>d(m,i(m)+1)),U(a,u),ee()}z(["click"]);export{ye as component,fe as universal};
web/sveltekit/build/_app/version.json CHANGED
@@ -1 +1 @@
1
- {"version":"1778350475932"}
 
1
+ {"version":"1778353518826"}
web/sveltekit/build/index.html CHANGED
@@ -6,21 +6,21 @@
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
- <link href="./_app/immutable/entry/start.YmL7ZSOR.js" rel="modulepreload">
10
- <link href="./_app/immutable/chunks/CJeJVIjP.js" rel="modulepreload">
11
  <link href="./_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
- <link href="./_app/immutable/entry/app.BhktVbRh.js" rel="modulepreload">
13
  <link href="./_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="./_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="./_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="./_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
- <link href="./_app/immutable/nodes/0.Dv1TzIuH.js" rel="modulepreload">
18
  <link href="./_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
- <link href="./_app/immutable/chunks/B3Pg95Il.js" rel="modulepreload">
20
  <link href="./_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="./_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="./_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
23
- <link href="./_app/immutable/nodes/2.CLD-rsu4.js" rel="modulepreload">
24
  <link href="./_app/immutable/chunks/cDW0xQNP.js" rel="modulepreload">
25
  <link href="./_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
26
  <link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
@@ -37,15 +37,15 @@
37
 
38
  <script>
39
  {
40
- __sveltekit_1sh7tn8 = {
41
  base: new URL(".", location).pathname.slice(0, -1)
42
  };
43
 
44
  const element = document.currentScript.parentElement;
45
 
46
  Promise.all([
47
- import("./_app/immutable/entry/start.YmL7ZSOR.js"),
48
- import("./_app/immutable/entry/app.BhktVbRh.js")
49
  ]).then(([kit, app]) => {
50
  kit.start(app, element, {
51
  node_ids: [0, 2],
 
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
+ <link href="./_app/immutable/entry/start.C_DzDADc.js" rel="modulepreload">
10
+ <link href="./_app/immutable/chunks/DJJH9JR_.js" rel="modulepreload">
11
  <link href="./_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
+ <link href="./_app/immutable/entry/app.DmxSSduu.js" rel="modulepreload">
13
  <link href="./_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="./_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="./_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="./_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
+ <link href="./_app/immutable/nodes/0.DInKAumT.js" rel="modulepreload">
18
  <link href="./_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
+ <link href="./_app/immutable/chunks/D8NyAcAP.js" rel="modulepreload">
20
  <link href="./_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="./_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="./_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
23
+ <link href="./_app/immutable/nodes/2.B2rqoVXS.js" rel="modulepreload">
24
  <link href="./_app/immutable/chunks/cDW0xQNP.js" rel="modulepreload">
25
  <link href="./_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
26
  <link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
 
37
 
38
  <script>
39
  {
40
+ __sveltekit_a2xq49 = {
41
  base: new URL(".", location).pathname.slice(0, -1)
42
  };
43
 
44
  const element = document.currentScript.parentElement;
45
 
46
  Promise.all([
47
+ import("./_app/immutable/entry/start.C_DzDADc.js"),
48
+ import("./_app/immutable/entry/app.DmxSSduu.js")
49
  ]).then(([kit, app]) => {
50
  kit.start(app, element, {
51
  node_ids: [0, 2],
web/sveltekit/build/q/sample.html CHANGED
@@ -6,30 +6,30 @@
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
- <link href="../_app/immutable/entry/start.YmL7ZSOR.js" rel="modulepreload">
10
- <link href="../_app/immutable/chunks/CJeJVIjP.js" rel="modulepreload">
11
  <link href="../_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
- <link href="../_app/immutable/entry/app.BhktVbRh.js" rel="modulepreload">
13
  <link href="../_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="../_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="../_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="../_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
- <link href="../_app/immutable/nodes/0.Dv1TzIuH.js" rel="modulepreload">
18
  <link href="../_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
- <link href="../_app/immutable/chunks/B3Pg95Il.js" rel="modulepreload">
20
  <link href="../_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="../_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="../_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
23
- <link href="../_app/immutable/nodes/5.C0xKDhXA.js" rel="modulepreload">
24
  <link href="../_app/immutable/chunks/BatqQaKj.js" rel="modulepreload">
25
  <link href="../_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
26
- <link href="../_app/immutable/chunks/FjZhY28w.js" rel="modulepreload">
27
  <link href="../_app/immutable/chunks/D907np-5.js" rel="modulepreload">
28
 
29
  <link href="../_app/immutable/assets/RipMark.ClxF_PAC.css" rel="stylesheet">
30
  <link href="../_app/immutable/assets/0.DiQNUxm-.css" rel="stylesheet">
31
  <link href="../_app/immutable/assets/Briefing.Dmn9LgiV.css" rel="stylesheet">
32
- <link href="../_app/immutable/assets/stoneRegistry.DOPO2SDD.css" rel="stylesheet">
33
  </head>
34
  <body data-sveltekit-preload-data="hover">
35
  <div style="display: contents"><!--[--><!--[0--><!--[--><!--[0--><a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a><!----> <header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap — home"><svg class="rip-mark svelte-rq15fr" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="20" height="20" fill="currentColor" role="img" aria-label="Riprap"><rect x="2.16669" y="3" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="9.66665" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="16.3333" width="9.99998" height="3.3334"></rect><rect x="2.16669" y="23.00002" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="29.66667" width="9.99998" height="3.33333"></rect><rect x="23.83334" y="23.00002" width="9.99998" height="3.33333"></rect><rect x="23.83334" y="29.66667" width="9.99998" height="3.33333"></rect><path d="M13.83336,3V33h8.33335V11.33335A8.33337,8.33337,0,0,0,13.83336,3Z"></path></svg><!---->riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!--[-1--><!--]--></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!--[-1--><!--]--> <!--[-1--><!--]--><!----></div></div></header><!----><!--]--> <main class="svelte-12qhfyh"><!--[--><section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr">80 Pioneer Street · Red Hook · Brooklyn</span></h1> <div class="briefing-prose" role="log" aria-live="polite" aria-atomic="false" aria-label="Streaming flood-exposure briefing"><!--[--><!--[0--><div class="briefing-status briefing-fade-in svelte-cc2m0h"><!----><p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p><!----></div><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">01</span> <span class="briefing-section-label">Status</span> <!--[-1--><!--]--> <!--[0--><span class="briefing-section-title">Coastal-edge, post-Sandy, multi-hazard</span><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88<!----></span></span><!----><!--[0--><a href="#cite-c1" class="inline-cite" data-cite="c1" aria-label="Citation 1: USGS, Hurricane Sandy storm tide elevations, NY-NJ Harbor"><sup>[1]</sup></a><!--]--><!--]--><!--[-1--><span> — within the </span><!--]--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery<!----></span></span><!----><!--[0--><a href="#cite-c2" class="inline-cite" data-cite="c2" aria-label="Citation 2: NYC OEM, Hurricane Sandy Inundation Zone (2012)"><sup>[2]</sup></a><!--]--><!--]--><!--[-1--><span> 2.4 mi to the northwest. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)<!----></span></span><!----><!--[0--><a href="#cite-c4" class="inline-cite" data-cite="c4" aria-label="Citation 4: FEMA, Preliminary Flood Insurance Rate Map, panel 36047C0207G"><sup>[4]</sup></a><!--]--><!--]--><!--[-1--><span>, a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">02</span> <span class="briefing-section-label">Empirical evidence</span> <!--[0--><span class="briefing-section-tier"><span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04<!----></span></span><!----><!--[0--><a href="#cite-c3" class="inline-cite" data-cite="c3" aria-label="Citation 3: FloodNet NYC, Sensor BK-RH-002 — Coffey Park, monthly exceedance"><sup>[3]</sup></a><!--]--><!--]--><!--[-1--><span>, with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. </span><!--]--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88<!----></span></span><!----><!--[0--><a href="#cite-c1" class="inline-cite" data-cite="c1" aria-label="Citation 1: USGS, Hurricane Sandy storm tide elevations, NY-NJ Harbor"><sup>[1]</sup></a><!--]--><!--]--><!--[-1--><span>, consistent with 0.6–1.9 ft of standing water at the queried address during the storm.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">03</span> <span class="briefing-section-label">Modeled scenarios</span> <!--[0--><span class="briefing-section-tier"><span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot<!----></span></span><!----><!--[0--><a href="#cite-c5" class="inline-cite" data-cite="c5" aria-label="Citation 5: NYC DEP, Stormwater Flood Map — Moderate Stormwater Scenario"><sup>[5]</sup></a><!--]--><!--]--><!--[-1--><span>, routed by the 1.2% slope toward Imlay St. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->Under NPCC4's 2050 90th-percentile sea-level rise (30 in)<!----></span></span><!----><!--[0--><a href="#cite-c6" class="inline-cite" data-cite="c6" aria-label="Citation 6: NPCC4, Sea-level rise projections, 2050 90th percentile"><sup>[6]</sup></a><!--]--><!--]--><!--[-1--><span>, the parcel falls within the projected daily-tidal floodplain by mid-century. </span><!--]--><!--[0--><span class="claim claim-synthetic" data-tier="synthetic"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation<!----></span></span><!----><!--[0--><a href="#cite-c9" class="inline-cite" data-cite="c9" aria-label="Citation 9: TerraMind v1.2, Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)"><sup>[9]</sup></a><!--]--><!--]--><!--[-1--><span>; treat with appropriate caution.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">04</span> <span class="briefing-section-label">Policy context</span> <!--[-1--><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-proxy" data-tier="proxy"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="claim-body"><!---->311 flood complaints within the surrounding census tract total 89 calls over 2019–2025, with seasonal clustering in Aug–Oct<!----></span></span><!----><!--[0--><a href="#cite-c7" class="inline-cite" data-cite="c7" aria-label="Citation 7: NYC 311, Flooding service requests, BK CB6 2019–2025"><sup>[7]</sup></a><!--]--><!--]--><!--[-1--><span>. </span><!--]--><!--[0--><span class="claim claim-proxy" data-tier="proxy"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="claim-body"><!---->NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000<!----></span></span><!----><!--[0--><a href="#cite-c8" class="inline-cite" data-cite="c8" aria-label="Citation 8: FEMA NFIP, National Flood Insurance Program claims, tract 36047008500"><sup>[8]</sup></a><!--]--><!--]--><!--[-1--><span>. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action<!----></span></span><!----><!--[0--><a href="#cite-c10" class="inline-cite" data-cite="c10" aria-label="Citation 10: NYC DCP, Waterfront Revitalization Program — Coastal Risk Area"><sup>[10]</sup></a><!--]--><!--]--><!--[-1--><span>.</span><!--]--><!--]--></p><!--]--><!--]--></div><!----></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><div class="map-frame svelte-wk2bu4" data-linked=""><div role="application" aria-label="Flood-exposure map for 80 Pioneer St" class="rip-map-container svelte-wk2bu4"></div> <!--[-1--><!--]--></div><!----> <aside class="layers-panel svelte-1g2dety" aria-label="Map layers grouped by Stone"><div class="layers-head svelte-1g2dety"><span class="section-label">Layers · grouped by Stone</span></div> <!--[--><details class="layers-group region-cornerstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Cornerstone</span> <span class="layers-stone-tag svelte-1g2dety">— what NYC's ground remembers</span> <!--[0--><span class="layers-count svelte-1g2dety">4</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Sandy Inundation Zone (2012)</span> <span class="layers-meta svelte-1g2dety">NYC OEM · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">FEMA / DEP scenarios</span> <span class="layers-meta svelte-1g2dety">FEMA · NYC DEP · <span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Ida HWM points (2021)</span> <span class="layers-meta svelte-1g2dety">USGS STN · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety dim"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Microtopography (HAND/TWI)</span> <span class="layers-meta svelte-1g2dety">USGS 3DEP · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[0--><span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span><!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-keystone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Keystone</span> <span class="layers-stone-tag svelte-1g2dety">— what's exposed</span> <!--[0--><span class="layers-count svelte-1g2dety">5</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">MTA subway entrances</span> <span class="layers-meta svelte-1g2dety">MTA Open Data · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">NYCHA developments</span> <span class="layers-meta svelte-1g2dety">NYC OD phvi-damg · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">DOE schools</span> <span class="layers-meta svelte-1g2dety">NYC DOE Locations · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">DOH hospitals</span> <span class="layers-meta svelte-1g2dety">NYS DOH vn5v-hh5r · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">TerraMind Buildings (current)</span> <span class="layers-meta svelte-1g2dety">msradam/TerraMind-NYC-Adapters · <span class="tier-badge tier-badge-synthetic svelte-1acpjpp" title="Generated, not observed" style="color: var(--tier-synthetic);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> SYN</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-touchstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Touchstone</span> <span class="layers-stone-tag svelte-1g2dety">— what's happening now</span> <!--[0--><span class="layers-count svelte-1g2dety">4</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety dim"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">311 flood complaints</span> <span class="layers-meta svelte-1g2dety">NYC 311 · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[0--><span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span><!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">FloodNet sensors</span> <span class="layers-meta svelte-1g2dety">FloodNet NYC · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">TerraMind LULC (current)</span> <span class="layers-meta svelte-1g2dety">msradam/TerraMind-NYC-Adapters · <span class="tier-badge tier-badge-synthetic svelte-1acpjpp" title="Generated, not observed" style="color: var(--tier-synthetic);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> SYN</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Prithvi-NYC-Pluvial flood pred.</span> <span class="layers-meta svelte-1g2dety">msradam/Prithvi-EO-2.0-NYC-Pluvial · <span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-lodestone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Lodestone</span> <span class="layers-stone-tag svelte-1g2dety">— what's coming</span> <!--[-1--><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[0--><li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">no map layers — see Findings cards</span></li><!--]--></ul></details><details class="layers-group region-capstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Capstone</span> <span class="layers-stone-tag svelte-1g2dety">— writes it all down with citations</span> <!--[-1--><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[1--><li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">not a map layer</span></li><!--]--></ul></details><!--]--> <div class="layers-masters svelte-1g2dety" role="group" aria-label="Master tier toggles"><span class="section-label">Tier toggles</span> <div class="layers-master-row svelte-1g2dety"><!--[--><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span>EMP</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span>MOD</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span>PRX</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> <span>SYN</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><!--]--></div></div></aside><!----></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label">Citations · 10</span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"><!--[--><li id="cite-c1" class="citation-item"><span class="citation-num">[1]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">USGS</span> <span class="citation-vintage">v. 2013-05</span></div> <div class="citation-title"><!--[0--><a href="https://pubs.usgs.gov/of/2013/1234/" target="_blank" rel="noopener noreferrer">Hurricane Sandy storm tide elevations, NY-NJ Harbor</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">USGS-OFR-2013-1234</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c2" class="citation-item"><span class="citation-num">[2]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">NYC OEM</span> <span class="citation-vintage">v. 2013-01</span></div> <div class="citation-title"><!--[0--><a href="https://data.cityofnewyork.us/dataset/sandy-inundation-zone" target="_blank" rel="noopener noreferrer">Hurricane Sandy Inundation Zone (2012)</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCOEM-SIZ-2013</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c3" class="citation-item"><span class="citation-num">[3]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">FloodNet NYC</span> <span class="citation-vintage">v. 2026-04</span></div> <div class="citation-title"><!--[0--><a href="https://floodnet.nyc/sensor/BK-RH-002" target="_blank" rel="noopener noreferrer">Sensor BK-RH-002 — Coffey Park, monthly exceedance</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">FN-BK-RH-002</span> <span class="citation-retrieved">retr. 2026-05-02</span></div></div></li><li id="cite-c4" class="citation-item"><span class="citation-num">[4]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">FEMA</span> <span class="citation-vintage">v. 2024-09</span></div> <div class="citation-title"><!--[0--><a href="https://msc.fema.gov/portal/search" target="_blank" rel="noopener noreferrer">Preliminary Flood Insurance Rate Map, panel 36047C0207G</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">FEMA-FIRM-36047C0207G</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c5" class="citation-item"><span class="citation-num">[5]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NYC DEP</span> <span class="citation-vintage">v. 2024-06</span></div> <div class="citation-title"><!--[0--><a href="https://nyc.gov/stormwater-map" target="_blank" rel="noopener noreferrer">Stormwater Flood Map — Moderate Stormwater Scenario</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCDEP-SWFM-2024</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c6" class="citation-item"><span class="citation-num">[6]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NPCC4</span> <span class="citation-vintage">v. 2024-03</span></div> <div class="citation-title"><!--[0--><a href="https://nyas.org/npcc4" target="_blank" rel="noopener noreferrer">Sea-level rise projections, 2050 90th percentile</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NPCC4-Ch3-Tbl3.2</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c7" class="citation-item"><span class="citation-num">[7]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span class="citation-source">NYC 311</span> <span class="citation-vintage">v. 2025-12</span></div> <div class="citation-title"><!--[0--><a href="https://data.cityofnewyork.us/311" target="_blank" rel="noopener noreferrer">Flooding service requests, BK CB6 2019–2025</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYC311-FLD-CB6</span> <span class="citation-retrieved">retr. 2026-05-01</span></div></div></li><li id="cite-c8" class="citation-item"><span class="citation-num">[8]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span class="citation-source">FEMA NFIP</span> <span class="citation-vintage">v. 2024-12</span></div> <div class="citation-title"><!--[0--><a href="https://www.fema.gov/openfema" target="_blank" rel="noopener noreferrer">National Flood Insurance Program claims, tract 36047008500</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NFIP-T36047008500</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c9" class="citation-item"><span class="citation-num">[9]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">TerraMind v1.2</span> <span class="citation-vintage">v. 2025-09</span></div> <div class="citation-title"><!--[-1-->Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)<!--]--></div> <div class="citation-meta"><span class="citation-docid">RIPRAP-SYN-20250914</span> <span class="citation-retrieved">retr. 2026-05-02</span></div></div></li><li id="cite-c10" class="citation-item"><span class="citation-num">[10]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NYC DCP</span> <span class="citation-vintage">v. 2022-11</span></div> <div class="citation-title"><!--[0--><a href="https://nyc.gov/dcp/wrp" target="_blank" rel="noopener noreferrer">Waterfront Revitalization Program — Coastal Risk Area</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCDCP-WRP-2022</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><!--]--></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
@@ -38,15 +38,15 @@
38
 
39
  <script>
40
  {
41
- __sveltekit_1sh7tn8 = {
42
  base: new URL("..", location).pathname.slice(0, -1)
43
  };
44
 
45
  const element = document.currentScript.parentElement;
46
 
47
  Promise.all([
48
- import("../_app/immutable/entry/start.YmL7ZSOR.js"),
49
- import("../_app/immutable/entry/app.BhktVbRh.js")
50
  ]).then(([kit, app]) => {
51
  kit.start(app, element, {
52
  node_ids: [0, 5],
 
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
8
  <title>Riprap — flood-exposure briefing</title>
9
+ <link href="../_app/immutable/entry/start.C_DzDADc.js" rel="modulepreload">
10
+ <link href="../_app/immutable/chunks/DJJH9JR_.js" rel="modulepreload">
11
  <link href="../_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
12
+ <link href="../_app/immutable/entry/app.DmxSSduu.js" rel="modulepreload">
13
  <link href="../_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
14
  <link href="../_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
15
  <link href="../_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
16
  <link href="../_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
17
+ <link href="../_app/immutable/nodes/0.DInKAumT.js" rel="modulepreload">
18
  <link href="../_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
19
+ <link href="../_app/immutable/chunks/D8NyAcAP.js" rel="modulepreload">
20
  <link href="../_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
21
  <link href="../_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
22
  <link href="../_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
23
+ <link href="../_app/immutable/nodes/5.CRCvLD8F.js" rel="modulepreload">
24
  <link href="../_app/immutable/chunks/BatqQaKj.js" rel="modulepreload">
25
  <link href="../_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
26
+ <link href="../_app/immutable/chunks/DDAjlznB.js" rel="modulepreload">
27
  <link href="../_app/immutable/chunks/D907np-5.js" rel="modulepreload">
28
 
29
  <link href="../_app/immutable/assets/RipMark.ClxF_PAC.css" rel="stylesheet">
30
  <link href="../_app/immutable/assets/0.DiQNUxm-.css" rel="stylesheet">
31
  <link href="../_app/immutable/assets/Briefing.Dmn9LgiV.css" rel="stylesheet">
32
+ <link href="../_app/immutable/assets/stoneRegistry.uOtksRcS.css" rel="stylesheet">
33
  </head>
34
  <body data-sveltekit-preload-data="hover">
35
  <div style="display: contents"><!--[--><!--[0--><!--[--><!--[0--><a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a><!----> <header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap — home"><svg class="rip-mark svelte-rq15fr" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="20" height="20" fill="currentColor" role="img" aria-label="Riprap"><rect x="2.16669" y="3" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="9.66665" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="16.3333" width="9.99998" height="3.3334"></rect><rect x="2.16669" y="23.00002" width="9.99998" height="3.33333"></rect><rect x="2.16669" y="29.66667" width="9.99998" height="3.33333"></rect><rect x="23.83334" y="23.00002" width="9.99998" height="3.33333"></rect><rect x="23.83334" y="29.66667" width="9.99998" height="3.33333"></rect><path d="M13.83336,3V33h8.33335V11.33335A8.33337,8.33337,0,0,0,13.83336,3Z"></path></svg><!---->riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!--[-1--><!--]--></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!--[-1--><!--]--> <!--[-1--><!--]--><!----></div></div></header><!----><!--]--> <main class="svelte-12qhfyh"><!--[--><section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr">80 Pioneer Street · Red Hook · Brooklyn</span></h1> <div class="briefing-prose" role="log" aria-live="polite" aria-atomic="false" aria-label="Streaming flood-exposure briefing"><!--[--><!--[0--><div class="briefing-status briefing-fade-in svelte-cc2m0h"><!----><p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p><!----></div><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">01</span> <span class="briefing-section-label">Status</span> <!--[-1--><!--]--> <!--[0--><span class="briefing-section-title">Coastal-edge, post-Sandy, multi-hazard</span><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88<!----></span></span><!----><!--[0--><a href="#cite-c1" class="inline-cite" data-cite="c1" aria-label="Citation 1: USGS, Hurricane Sandy storm tide elevations, NY-NJ Harbor"><sup>[1]</sup></a><!--]--><!--]--><!--[-1--><span> — within the </span><!--]--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery<!----></span></span><!----><!--[0--><a href="#cite-c2" class="inline-cite" data-cite="c2" aria-label="Citation 2: NYC OEM, Hurricane Sandy Inundation Zone (2012)"><sup>[2]</sup></a><!--]--><!--]--><!--[-1--><span> 2.4 mi to the northwest. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)<!----></span></span><!----><!--[0--><a href="#cite-c4" class="inline-cite" data-cite="c4" aria-label="Citation 4: FEMA, Preliminary Flood Insurance Rate Map, panel 36047C0207G"><sup>[4]</sup></a><!--]--><!--]--><!--[-1--><span>, a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">02</span> <span class="briefing-section-label">Empirical evidence</span> <!--[0--><span class="briefing-section-tier"><span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04<!----></span></span><!----><!--[0--><a href="#cite-c3" class="inline-cite" data-cite="c3" aria-label="Citation 3: FloodNet NYC, Sensor BK-RH-002 — Coffey Park, monthly exceedance"><sup>[3]</sup></a><!--]--><!--]--><!--[-1--><span>, with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. </span><!--]--><!--[0--><span class="claim claim-empirical" data-tier="empirical"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88<!----></span></span><!----><!--[0--><a href="#cite-c1" class="inline-cite" data-cite="c1" aria-label="Citation 1: USGS, Hurricane Sandy storm tide elevations, NY-NJ Harbor"><sup>[1]</sup></a><!--]--><!--]--><!--[-1--><span>, consistent with 0.6–1.9 ft of standing water at the queried address during the storm.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">03</span> <span class="briefing-section-label">Modeled scenarios</span> <!--[0--><span class="briefing-section-tier"><span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot<!----></span></span><!----><!--[0--><a href="#cite-c5" class="inline-cite" data-cite="c5" aria-label="Citation 5: NYC DEP, Stormwater Flood Map — Moderate Stormwater Scenario"><sup>[5]</sup></a><!--]--><!--]--><!--[-1--><span>, routed by the 1.2% slope toward Imlay St. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->Under NPCC4's 2050 90th-percentile sea-level rise (30 in)<!----></span></span><!----><!--[0--><a href="#cite-c6" class="inline-cite" data-cite="c6" aria-label="Citation 6: NPCC4, Sea-level rise projections, 2050 90th percentile"><sup>[6]</sup></a><!--]--><!--]--><!--[-1--><span>, the parcel falls within the projected daily-tidal floodplain by mid-century. </span><!--]--><!--[0--><span class="claim claim-synthetic" data-tier="synthetic"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation<!----></span></span><!----><!--[0--><a href="#cite-c9" class="inline-cite" data-cite="c9" aria-label="Citation 9: TerraMind v1.2, Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)"><sup>[9]</sup></a><!--]--><!--]--><!--[-1--><span>; treat with appropriate caution.</span><!--]--><!--]--></p><!--]--><!--[1--><div class="briefing-fade-in svelte-cc2m0h"><h3 class="briefing-section-head"><span class="briefing-section-num">04</span> <span class="briefing-section-label">Policy context</span> <!--[-1--><!--]--> <!--[-1--><!--]--></h3><!----></div><!--]--><!--[-1--><p class="briefing-para briefing-fade-in svelte-cc2m0h"><!--[--><!--[0--><span class="claim claim-proxy" data-tier="proxy"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="claim-body"><!---->311 flood complaints within the surrounding census tract total 89 calls over 2019–2025, with seasonal clustering in Aug–Oct<!----></span></span><!----><!--[0--><a href="#cite-c7" class="inline-cite" data-cite="c7" aria-label="Citation 7: NYC 311, Flooding service requests, BK CB6 2019–2025"><sup>[7]</sup></a><!--]--><!--]--><!--[-1--><span>. </span><!--]--><!--[0--><span class="claim claim-proxy" data-tier="proxy"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="claim-body"><!---->NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000<!----></span></span><!----><!--[0--><a href="#cite-c8" class="inline-cite" data-cite="c8" aria-label="Citation 8: FEMA NFIP, National Flood Insurance Program claims, tract 36047008500"><sup>[8]</sup></a><!--]--><!--]--><!--[-1--><span>. </span><!--]--><!--[0--><span class="claim claim-modeled" data-tier="modeled"><span class="claim-glyph" aria-hidden="false"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="claim-body"><!---->The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action<!----></span></span><!----><!--[0--><a href="#cite-c10" class="inline-cite" data-cite="c10" aria-label="Citation 10: NYC DCP, Waterfront Revitalization Program — Coastal Risk Area"><sup>[10]</sup></a><!--]--><!--]--><!--[-1--><span>.</span><!--]--><!--]--></p><!--]--><!--]--></div><!----></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><div class="map-frame svelte-wk2bu4" data-linked=""><div role="application" aria-label="Flood-exposure map for 80 Pioneer St" class="rip-map-container svelte-wk2bu4"></div> <!--[-1--><!--]--></div><!----> <aside class="layers-panel svelte-1g2dety" aria-label="Map layers grouped by Stone"><div class="layers-head svelte-1g2dety"><span class="section-label">Layers · grouped by Stone</span></div> <!--[--><details class="layers-group region-cornerstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Cornerstone</span> <span class="layers-stone-tag svelte-1g2dety">— what NYC's ground remembers</span> <!--[0--><span class="layers-count svelte-1g2dety">4</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Sandy Inundation Zone (2012)</span> <span class="layers-meta svelte-1g2dety">NYC OEM · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">FEMA / DEP scenarios</span> <span class="layers-meta svelte-1g2dety">FEMA · NYC DEP · <span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Ida HWM points (2021)</span> <span class="layers-meta svelte-1g2dety">USGS STN · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety dim"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Microtopography (HAND/TWI)</span> <span class="layers-meta svelte-1g2dety">USGS 3DEP · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[0--><span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span><!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-keystone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Keystone</span> <span class="layers-stone-tag svelte-1g2dety">— what's exposed</span> <!--[0--><span class="layers-count svelte-1g2dety">5</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">MTA subway entrances</span> <span class="layers-meta svelte-1g2dety">MTA Open Data · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">NYCHA developments</span> <span class="layers-meta svelte-1g2dety">NYC OD phvi-damg · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">DOE schools</span> <span class="layers-meta svelte-1g2dety">NYC DOE Locations · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">DOH hospitals</span> <span class="layers-meta svelte-1g2dety">NYS DOH vn5v-hh5r · <span class="tier-badge tier-badge-empirical svelte-1acpjpp" title="Directly measured or observed" style="color: var(--tier-empirical);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> EMP</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">TerraMind Buildings (current)</span> <span class="layers-meta svelte-1g2dety">msradam/TerraMind-NYC-Adapters · <span class="tier-badge tier-badge-synthetic svelte-1acpjpp" title="Generated, not observed" style="color: var(--tier-synthetic);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> SYN</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-touchstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Touchstone</span> <span class="layers-stone-tag svelte-1g2dety">— what's happening now</span> <!--[0--><span class="layers-count svelte-1g2dety">4</span><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[-1--><!--[--><li class="layers-row svelte-1g2dety dim"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">311 flood complaints</span> <span class="layers-meta svelte-1g2dety">NYC 311 · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[0--><span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span><!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">FloodNet sensors</span> <span class="layers-meta svelte-1g2dety">FloodNet NYC · <span class="tier-badge tier-badge-proxy svelte-1acpjpp" title="Indirect indicator" style="color: var(--tier-proxy);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> PRX</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">TerraMind LULC (current)</span> <span class="layers-meta svelte-1g2dety">msradam/TerraMind-NYC-Adapters · <span class="tier-badge tier-badge-synthetic svelte-1acpjpp" title="Generated, not observed" style="color: var(--tier-synthetic);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> SYN</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><li class="layers-row svelte-1g2dety"><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety">Prithvi-NYC-Pluvial flood pred.</span> <span class="layers-meta svelte-1g2dety">msradam/Prithvi-EO-2.0-NYC-Pluvial · <span class="tier-badge tier-badge-modeled svelte-1acpjpp" title="Scenario-based prediction" style="color: var(--tier-modeled);"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> MOD</span><!----></span></span> <span class="layers-state svelte-1g2dety"><!--[1-->on<!--]--></span></li><!--]--><!--]--></ul></details><details class="layers-group region-lodestone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Lodestone</span> <span class="layers-stone-tag svelte-1g2dety">— what's coming</span> <!--[-1--><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[0--><li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">no map layers — see Findings cards</span></li><!--]--></ul></details><details class="layers-group region-capstone svelte-1g2dety" open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety">Capstone</span> <span class="layers-stone-tag svelte-1g2dety">— writes it all down with citations</span> <!--[-1--><!--]--></summary> <ul class="layers-list svelte-1g2dety"><!--[1--><li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">not a map layer</span></li><!--]--></ul></details><!--]--> <div class="layers-masters svelte-1g2dety" role="group" aria-label="Master tier toggles"><span class="section-label">Tier toggles</span> <div class="layers-master-row svelte-1g2dety"><!--[--><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="11" height="11" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span>EMP</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="10" height="10" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span>MOD</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5.5" cy="5.5" r="5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span>PRX</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><button type="button" class="layers-master svelte-1g2dety is-on" aria-pressed="true"><svg width="11" height="11" viewBox="0 0 11 11" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-11" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="10" height="10" fill="url(#rip-stripe-synthetic-11)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> <span>SYN</span> <span class="layers-master-state svelte-1g2dety">ON</span></button><!--]--></div></div></aside><!----></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label">Citations · 10</span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"><!--[--><li id="cite-c1" class="citation-item"><span class="citation-num">[1]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">USGS</span> <span class="citation-vintage">v. 2013-05</span></div> <div class="citation-title"><!--[0--><a href="https://pubs.usgs.gov/of/2013/1234/" target="_blank" rel="noopener noreferrer">Hurricane Sandy storm tide elevations, NY-NJ Harbor</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">USGS-OFR-2013-1234</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c2" class="citation-item"><span class="citation-num">[2]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">NYC OEM</span> <span class="citation-vintage">v. 2013-01</span></div> <div class="citation-title"><!--[0--><a href="https://data.cityofnewyork.us/dataset/sandy-inundation-zone" target="_blank" rel="noopener noreferrer">Hurricane Sandy Inundation Zone (2012)</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCOEM-SIZ-2013</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c3" class="citation-item"><span class="citation-num">[3]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Empirical: directly measured or observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Empirical: directly measured or observed</title><!--[0--><rect x="0" y="0" width="10" height="10" fill="var(--tier-empirical)"></rect><!--]--></svg><!----> <span class="citation-source">FloodNet NYC</span> <span class="citation-vintage">v. 2026-04</span></div> <div class="citation-title"><!--[0--><a href="https://floodnet.nyc/sensor/BK-RH-002" target="_blank" rel="noopener noreferrer">Sensor BK-RH-002 — Coffey Park, monthly exceedance</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">FN-BK-RH-002</span> <span class="citation-retrieved">retr. 2026-05-02</span></div></div></li><li id="cite-c4" class="citation-item"><span class="citation-num">[4]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">FEMA</span> <span class="citation-vintage">v. 2024-09</span></div> <div class="citation-title"><!--[0--><a href="https://msc.fema.gov/portal/search" target="_blank" rel="noopener noreferrer">Preliminary Flood Insurance Rate Map, panel 36047C0207G</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">FEMA-FIRM-36047C0207G</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c5" class="citation-item"><span class="citation-num">[5]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NYC DEP</span> <span class="citation-vintage">v. 2024-06</span></div> <div class="citation-title"><!--[0--><a href="https://nyc.gov/stormwater-map" target="_blank" rel="noopener noreferrer">Stormwater Flood Map — Moderate Stormwater Scenario</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCDEP-SWFM-2024</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c6" class="citation-item"><span class="citation-num">[6]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NPCC4</span> <span class="citation-vintage">v. 2024-03</span></div> <div class="citation-title"><!--[0--><a href="https://nyas.org/npcc4" target="_blank" rel="noopener noreferrer">Sea-level rise projections, 2050 90th percentile</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NPCC4-Ch3-Tbl3.2</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c7" class="citation-item"><span class="citation-num">[7]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span class="citation-source">NYC 311</span> <span class="citation-vintage">v. 2025-12</span></div> <div class="citation-title"><!--[0--><a href="https://data.cityofnewyork.us/311" target="_blank" rel="noopener noreferrer">Flooding service requests, BK CB6 2019–2025</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYC311-FLD-CB6</span> <span class="citation-retrieved">retr. 2026-05-01</span></div></div></li><li id="cite-c8" class="citation-item"><span class="citation-num">[8]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Proxy: indirect indicator" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Proxy: indirect indicator</title><!--[2--><circle cx="5" cy="5" r="4.5" fill="var(--tier-proxy)"></circle><!--]--></svg><!----> <span class="citation-source">FEMA NFIP</span> <span class="citation-vintage">v. 2024-12</span></div> <div class="citation-title"><!--[0--><a href="https://www.fema.gov/openfema" target="_blank" rel="noopener noreferrer">National Flood Insurance Program claims, tract 36047008500</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NFIP-T36047008500</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><li id="cite-c9" class="citation-item"><span class="citation-num">[9]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Synthetic prior: generated, not observed" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Synthetic prior: generated, not observed</title><!--[-1--><defs><pattern id="rip-stripe-synthetic-10" width="3" height="3" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><line x1="0" y1="0" x2="0" y2="3" stroke="var(--tier-synthetic)" stroke-width="1.5"></line></pattern></defs><rect x="0.5" y="0.5" width="9" height="9" fill="url(#rip-stripe-synthetic-10)" stroke="var(--tier-synthetic)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">TerraMind v1.2</span> <span class="citation-vintage">v. 2025-09</span></div> <div class="citation-title"><!--[-1-->Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)<!--]--></div> <div class="citation-meta"><span class="citation-docid">RIPRAP-SYN-20250914</span> <span class="citation-retrieved">retr. 2026-05-02</span></div></div></li><li id="cite-c10" class="citation-item"><span class="citation-num">[10]</span> <div class="citation-body"><div class="citation-line-1"><svg width="10" height="10" viewBox="0 0 10 10" role="img" aria-label="Modeled: scenario-based prediction" style="flex: none; display: inline-block; vertical-align: -0.12em;"><title>Modeled: scenario-based prediction</title><!--[1--><rect x="0.5" y="0.5" width="9" height="9" fill="none" stroke="var(--tier-modeled)" stroke-width="1"></rect><!--]--></svg><!----> <span class="citation-source">NYC DCP</span> <span class="citation-vintage">v. 2022-11</span></div> <div class="citation-title"><!--[0--><a href="https://nyc.gov/dcp/wrp" target="_blank" rel="noopener noreferrer">Waterfront Revitalization Program — Coastal Risk Area</a><!--]--></div> <div class="citation-meta"><span class="citation-docid">NYCDCP-WRP-2022</span> <span class="citation-retrieved">retr. 2026-04-28</span></div></div></li><!--]--></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
 
38
 
39
  <script>
40
  {
41
+ __sveltekit_a2xq49 = {
42
  base: new URL("..", location).pathname.slice(0, -1)
43
  };
44
 
45
  const element = document.currentScript.parentElement;
46
 
47
  Promise.all([
48
+ import("../_app/immutable/entry/start.C_DzDADc.js"),
49
+ import("../_app/immutable/entry/app.DmxSSduu.js")
50
  ]).then(([kit, app]) => {
51
  kit.start(app, element, {
52
  node_ids: [0, 5],
web/sveltekit/src/lib/client/agentStream.ts CHANGED
@@ -68,8 +68,14 @@ export interface EmissionsCall {
68
  backend: string;
69
  hardware: string;
70
  hardware_label: string;
 
 
71
  power_w: number;
72
  duration_s: number;
 
 
 
 
73
  prompt_tokens?: number | null;
74
  completion_tokens?: number | null;
75
  total_tokens?: number | null;
@@ -80,6 +86,8 @@ export interface EmissionsCall {
80
 
81
  export interface EmissionsSummary {
82
  n_calls: number;
 
 
83
  total_wh: number;
84
  total_mwh: number;
85
  total_joules: number;
@@ -91,15 +99,9 @@ export interface EmissionsSummary {
91
  };
92
  by_kind: Record<string, { wh: number; mwh: number; n: number; duration_s: number }>;
93
  by_hardware: Record<string, {
94
- label: string; power_w: number; wh: number; mwh: number; n: number; duration_s: number;
95
  }>;
96
  calls: EmissionsCall[];
97
- comparison: {
98
- cloud_per_query_wh: number;
99
- cloud_per_query_mwh: number;
100
- ratio_cloud_over_query: number | null;
101
- cloud_source: string;
102
- };
103
  method: string;
104
  }
105
 
 
68
  backend: string;
69
  hardware: string;
70
  hardware_label: string;
71
+ /** Power figure used for this row's energy. When measured=true this is
72
+ * the NVML-derived avg watts; otherwise it's the data-sheet fallback. */
73
  power_w: number;
74
  duration_s: number;
75
+ /** True when joules came from a real NVML read on the inference proxy
76
+ * (X-GPU-Energy-J header for ML / bracket-sampled /v1/power for LLM).
77
+ * False = data-sheet × duration estimate. */
78
+ measured: boolean;
79
  prompt_tokens?: number | null;
80
  completion_tokens?: number | null;
81
  total_tokens?: number | null;
 
86
 
87
  export interface EmissionsSummary {
88
  n_calls: number;
89
+ /** Number of calls whose joules came from a real GPU power read. */
90
+ n_measured: number;
91
  total_wh: number;
92
  total_mwh: number;
93
  total_joules: number;
 
99
  };
100
  by_kind: Record<string, { wh: number; mwh: number; n: number; duration_s: number }>;
101
  by_hardware: Record<string, {
102
+ label: string; wh: number; mwh: number; n: number; duration_s: number;
103
  }>;
104
  calls: EmissionsCall[];
 
 
 
 
 
 
105
  method: string;
106
  }
107
 
web/sveltekit/src/lib/components/findings/RunHealthStrip.svelte CHANGED
@@ -46,19 +46,38 @@
46
  if (!t) return null;
47
  return t >= 1000 ? `${(t / 1000).toFixed(1)}K tok` : `${t} tok`;
48
  });
49
- let emRatio = $derived(emissions?.comparison?.ratio_cloud_over_query ?? null);
50
  let emHardware = $derived.by(() => {
51
  if (!emissions) return null;
52
  const labels = Object.values(emissions.by_hardware).map(h => h.label);
53
  return labels.length === 1 ? labels[0] : labels.join(' + ');
54
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  let emTooltip = $derived.by(() => {
56
  if (!emissions) return '';
 
 
 
57
  const lines = [
58
  `${emissions.n_calls} inference calls — ${emissions.total_joules} J total`,
59
  emHardware ? `Hardware: ${emHardware}` : '',
 
60
  emissions.tokens.total ? `Tokens: ${emissions.tokens.prompt ?? 0} prompt + ${emissions.tokens.completion ?? 0} completion` : '',
61
- emRatio != null ? `~${emRatio}× lower than ${emissions.comparison.cloud_per_query_mwh} mWh frontier-cloud per-query estimate` : '',
62
  emissions.method,
63
  ].filter(Boolean);
64
  return lines.join('\n');
@@ -98,9 +117,9 @@
98
  {#if emEnergy}
99
  <span class="rh-sep">·</span>
100
  <span class="rh-item rh-em" title={emTooltip}>
 
101
  <strong>{emEnergy}</strong> inference
102
  {#if emTokens}<span class="rh-em-tok">/ {emTokens}</span>{/if}
103
- {#if emRatio != null}<span class="rh-em-ratio">~{emRatio}× &lt; cloud</span>{/if}
104
  </span>
105
  {/if}
106
  </div>
@@ -137,13 +156,9 @@
137
  }
138
  .rh-em strong { color: var(--ink); }
139
  .rh-em-tok { margin-left: 4px; opacity: 0.75; }
140
- .rh-em-ratio {
141
- margin-left: 6px;
142
- padding: 1px 5px;
143
- border: 1px solid var(--rule-soft);
144
- border-radius: 2px;
145
  font-size: 10px;
146
- letter-spacing: 0.03em;
147
  color: var(--ink-tertiary);
148
  }
149
  </style>
 
46
  if (!t) return null;
47
  return t >= 1000 ? `${(t / 1000).toFixed(1)}K tok` : `${t} tok`;
48
  });
 
49
  let emHardware = $derived.by(() => {
50
  if (!emissions) return null;
51
  const labels = Object.values(emissions.by_hardware).map(h => h.label);
52
  return labels.length === 1 ? labels[0] : labels.join(' + ');
53
  });
54
+ // Fraction of calls that came back with a real NVML reading (vs.
55
+ // data-sheet fallback). Surfaced as a small ✓ / ~ badge so the
56
+ // viewer can tell whether the number is measured or estimated.
57
+ let emMeasuredFrac = $derived(
58
+ emissions && emissions.n_calls > 0
59
+ ? (emissions.n_measured ?? 0) / emissions.n_calls
60
+ : 0
61
+ );
62
+ let emMeasuredIcon = $derived(
63
+ emEnergy == null
64
+ ? ''
65
+ : emMeasuredFrac >= 0.9
66
+ ? '✓' // all (or nearly all) calls measured on GPU
67
+ : emMeasuredFrac > 0
68
+ ? '◐' // partial coverage
69
+ : '~' // pure data-sheet estimate
70
+ );
71
  let emTooltip = $derived.by(() => {
72
  if (!emissions) return '';
73
+ const measuredLine = emissions.n_measured != null
74
+ ? `${emissions.n_measured}/${emissions.n_calls} calls measured on GPU (others use data-sheet estimate)`
75
+ : '';
76
  const lines = [
77
  `${emissions.n_calls} inference calls — ${emissions.total_joules} J total`,
78
  emHardware ? `Hardware: ${emHardware}` : '',
79
+ measuredLine,
80
  emissions.tokens.total ? `Tokens: ${emissions.tokens.prompt ?? 0} prompt + ${emissions.tokens.completion ?? 0} completion` : '',
 
81
  emissions.method,
82
  ].filter(Boolean);
83
  return lines.join('\n');
 
117
  {#if emEnergy}
118
  <span class="rh-sep">·</span>
119
  <span class="rh-item rh-em" title={emTooltip}>
120
+ <span class="rh-em-icon" aria-hidden="true">{emMeasuredIcon}</span>
121
  <strong>{emEnergy}</strong> inference
122
  {#if emTokens}<span class="rh-em-tok">/ {emTokens}</span>{/if}
 
123
  </span>
124
  {/if}
125
  </div>
 
156
  }
157
  .rh-em strong { color: var(--ink); }
158
  .rh-em-tok { margin-left: 4px; opacity: 0.75; }
159
+ .rh-em-icon {
160
+ margin-right: 4px;
 
 
 
161
  font-size: 10px;
 
162
  color: var(--ink-tertiary);
163
  }
164
  </style>