sparkrun-ui 0.1.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +46 -152
  2. package/bin/sparkrun-ui.mjs +2 -2
  3. package/dist/.next/BUILD_ID +1 -1
  4. package/dist/.next/build-manifest.json +3 -3
  5. package/dist/.next/prerender-manifest.json +3 -3
  6. package/dist/.next/server/app/_global-error.html +1 -1
  7. package/dist/.next/server/app/_global-error.rsc +1 -1
  8. package/dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/dist/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/dist/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/dist/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/dist/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/dist/.next/server/app/_not-found/page.js +1 -1
  14. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/dist/.next/server/app/_not-found.html +1 -1
  17. package/dist/.next/server/app/_not-found.rsc +27 -20
  18. package/dist/.next/server/app/_not-found.segments/_full.segment.rsc +27 -20
  19. package/dist/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  20. package/dist/.next/server/app/_not-found.segments/_index.segment.rsc +11 -9
  21. package/dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  22. package/dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  23. package/dist/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/dist/.next/server/app/benchmarks/[id]/page.js +1 -1
  25. package/dist/.next/server/app/benchmarks/[id]/page.js.nft.json +1 -1
  26. package/dist/.next/server/app/benchmarks/[id]/page_client-reference-manifest.js +1 -1
  27. package/dist/.next/server/app/benchmarks/new/page.js +2 -2
  28. package/dist/.next/server/app/benchmarks/new/page.js.nft.json +1 -1
  29. package/dist/.next/server/app/benchmarks/new/page_client-reference-manifest.js +1 -1
  30. package/dist/.next/server/app/benchmarks/page.js +1 -1
  31. package/dist/.next/server/app/benchmarks/page.js.nft.json +1 -1
  32. package/dist/.next/server/app/benchmarks/page_client-reference-manifest.js +1 -1
  33. package/dist/.next/server/app/chat/page.js +1 -1
  34. package/dist/.next/server/app/chat/page.js.nft.json +1 -1
  35. package/dist/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  36. package/dist/.next/server/app/dashboard/page.js +3 -3
  37. package/dist/.next/server/app/dashboard/page.js.nft.json +1 -1
  38. package/dist/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
  39. package/dist/.next/server/app/index.html +1 -1
  40. package/dist/.next/server/app/index.rsc +25 -19
  41. package/dist/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  42. package/dist/.next/server/app/index.segments/_full.segment.rsc +25 -19
  43. package/dist/.next/server/app/index.segments/_head.segment.rsc +4 -4
  44. package/dist/.next/server/app/index.segments/_index.segment.rsc +11 -9
  45. package/dist/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  46. package/dist/.next/server/app/launch/page.js +1 -1
  47. package/dist/.next/server/app/launch/page.js.nft.json +1 -1
  48. package/dist/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  49. package/dist/.next/server/app/logs/[clusterId]/page.js +1 -1
  50. package/dist/.next/server/app/logs/[clusterId]/page.js.nft.json +1 -1
  51. package/dist/.next/server/app/logs/[clusterId]/page_client-reference-manifest.js +1 -1
  52. package/dist/.next/server/app/monitor/page.js +1 -1
  53. package/dist/.next/server/app/monitor/page.js.nft.json +1 -1
  54. package/dist/.next/server/app/monitor/page_client-reference-manifest.js +1 -1
  55. package/dist/.next/server/app/page.js +1 -1
  56. package/dist/.next/server/app/page.js.nft.json +1 -1
  57. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  58. package/dist/.next/server/app/recipes/page.js +2 -2
  59. package/dist/.next/server/app/recipes/page.js.nft.json +1 -1
  60. package/dist/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  61. package/dist/.next/server/app/rpc/[[...rest]]/route.js.nft.json +1 -1
  62. package/dist/.next/server/chunks/node_modules__pnpm_0jzojku._.js +3 -3
  63. package/dist/.next/server/chunks/ssr/[root-of-the-server]__021wpp6._.js +1 -1
  64. package/dist/.next/server/chunks/ssr/[root-of-the-server]__030qcl1._.js +1 -1
  65. package/dist/.next/server/chunks/ssr/[root-of-the-server]__037oli.._.js +3 -0
  66. package/dist/.next/server/chunks/ssr/{[root-of-the-server]__0vyn26k._.js → [root-of-the-server]__03ntmap._.js} +2 -2
  67. package/dist/.next/server/chunks/ssr/[root-of-the-server]__03qy0wk._.js +3 -0
  68. package/dist/.next/server/chunks/ssr/[root-of-the-server]__08pj2hz._.js +1 -1
  69. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0a.-f32._.js +3 -0
  70. package/dist/.next/server/chunks/ssr/_0-wjfxk._.js +3 -3
  71. package/dist/.next/server/chunks/ssr/_00~gtgv._.js +3 -0
  72. package/dist/.next/server/chunks/ssr/_04vm1q8._.js +3 -0
  73. package/dist/.next/server/chunks/ssr/_06stc30._.js +3 -0
  74. package/dist/.next/server/chunks/ssr/_0_bx_cp._.js +3 -0
  75. package/dist/.next/server/chunks/ssr/_0bsb5yc._.js +3 -0
  76. package/dist/.next/server/chunks/ssr/_0e5gkc4._.js +3 -0
  77. package/dist/.next/server/chunks/ssr/_0f.jwi.._.js +1 -1
  78. package/dist/.next/server/chunks/ssr/{_0e~uzop._.js → _0gfn7bd._.js} +2 -2
  79. package/dist/.next/server/chunks/ssr/_0gz2jj3._.js +3 -0
  80. package/dist/.next/server/chunks/ssr/{_0mbu181._.js → _0j.5_81._.js} +2 -2
  81. package/dist/.next/server/chunks/ssr/_0khf6ok._.js +1 -1
  82. package/dist/.next/server/chunks/ssr/app_components_dashboard_DashboardLive_tsx_10_yvzp._.js +3 -0
  83. package/dist/.next/server/middleware-build-manifest.js +3 -3
  84. package/dist/.next/server/pages/404.html +1 -1
  85. package/dist/.next/server/pages/500.html +1 -1
  86. package/dist/.next/server/server-reference-manifest.js +1 -1
  87. package/dist/.next/server/server-reference-manifest.json +1 -1
  88. package/dist/.next/static/chunks/01f1zms1lqrcy.js +3 -0
  89. package/dist/.next/static/chunks/06p4ryy69hlx0.js +1 -0
  90. package/dist/.next/static/chunks/078_hq0asokwv.js +1 -0
  91. package/dist/.next/static/chunks/09gpk-.a~0mq9.js +1 -0
  92. package/dist/.next/static/chunks/0i69zf2t~3kk4.js +1 -0
  93. package/dist/.next/static/chunks/0l4~8wvcg4igy.js +1 -0
  94. package/dist/.next/static/chunks/0r2z8b.7enu5~.js +1 -0
  95. package/dist/.next/static/chunks/0sgcbb1yforb4.js +1 -0
  96. package/dist/.next/static/chunks/0y8z_lexja5v6.css +3 -0
  97. package/dist/.next/static/chunks/0~w8i~kqjj7e4.js +1 -0
  98. package/dist/.next/static/chunks/124fs9yx_zber.js +1 -0
  99. package/dist/.next/static/chunks/{0~r37q50bdigt.js → 1288h2i-vya_m.js} +1 -1
  100. package/dist/.next/static/chunks/17pbogcj5kwn1.js +1 -0
  101. package/dist/package.json +3 -3
  102. package/package.json +3 -3
  103. package/dist/.next/server/chunks/ssr/[root-of-the-server]__028ih98._.js +0 -3
  104. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0nnr~eq._.js +0 -3
  105. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0yxok2p._.js +0 -3
  106. package/dist/.next/server/chunks/ssr/_0-7rhpg._.js +0 -3
  107. package/dist/.next/server/chunks/ssr/_0.el~h-._.js +0 -3
  108. package/dist/.next/server/chunks/ssr/_0pdnuau._.js +0 -3
  109. package/dist/.next/server/chunks/ssr/_0pequ4j._.js +0 -3
  110. package/dist/.next/server/chunks/ssr/_0pfenvw._.js +0 -3
  111. package/dist/.next/server/chunks/ssr/_0pq.k_j._.js +0 -3
  112. package/dist/.next/server/chunks/ssr/_0xnyewc._.js +0 -3
  113. package/dist/.next/static/chunks/004g~9f.fbvyt.js +0 -1
  114. package/dist/.next/static/chunks/01dgy~d.d336v.css +0 -3
  115. package/dist/.next/static/chunks/01r_epcpirzca.js +0 -1
  116. package/dist/.next/static/chunks/0993.7t31zdad.js +0 -3
  117. package/dist/.next/static/chunks/0dw7w5xmnd8nu.js +0 -1
  118. package/dist/.next/static/chunks/0fyz4fvpgssw6.js +0 -1
  119. package/dist/.next/static/chunks/0mz_ak6g7zqg..js +0 -1
  120. package/dist/.next/static/chunks/0rte~uocghzgq.js +0 -1
  121. package/dist/.next/static/chunks/0zen~uid78k0_.js +0 -1
  122. package/dist/.next/static/chunks/0zw_1x-efbzvx.js +0 -1
  123. package/dist/.next/static/chunks/12.djcikmdvqm.js +0 -1
  124. package/dist/.next/static/chunks/16qvo6uei~0l..js +0 -1
  125. /package/dist/.next/static/{Ep2vQqLmy6LOGWMmAL6fZ → 6eyYzTPHshjxU0hHbw9jq}/_buildManifest.js +0 -0
  126. /package/dist/.next/static/{Ep2vQqLmy6LOGWMmAL6fZ → 6eyYzTPHshjxU0hHbw9jq}/_clientMiddlewareManifest.js +0 -0
  127. /package/dist/.next/static/{Ep2vQqLmy6LOGWMmAL6fZ → 6eyYzTPHshjxU0hHbw9jq}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -12,46 +12,22 @@ browser.
12
12
 
13
13
  ## Features
14
14
 
15
- - **Dashboard** — live-updating view of currently running workloads with a
16
- one-click stop control. Backed by `sparkrun cluster status --json` polled
17
- through an SSE event iterator.
18
- - **Recipes** — browse all recipes from every registry. Filter by registry and
19
- search by name / model / runtime. Hover a recipe to see its description and
20
- VRAM estimate; click for the full `sparkrun recipe show` output.
21
- - **Launch wizard** — 4-step flow: pick a recipe, edit the YAML (with a
22
- CodeMirror editor and a dynamic overrides form that two-way binds to it,
23
- preserving comments), preview the dry-run command, then confirm and fire.
24
- Live validation checks recipe schema, port-in-use against the cluster, and
25
- TCP-probes the port on each target host.
26
- - **Benchmarks** browse benchmark history from `~/.cache/sparkrun/benchmarks`,
27
- open any run to see throughput / TTFR charts derived from
28
- `consolidated.json`, or kick off a new benchmark (recipe + profile +
29
- concurrency + skip-run toggle).
30
- - **Logs** terminal-style viewer streaming `sparkrun logs <cluster_id>`
31
- output (stdout + stderr interleaved) with auto-follow.
32
- - **Cluster monitor** — live per-host CPU / GPU / memory bars and rolling
33
- sparkline history from `sparkrun cluster monitor --json`.
34
-
35
- ## Stack
36
-
37
- - **Next.js 16** App Router (Turbopack)
38
- - **React 19** with Server Components for initial paint and Client Components
39
- for interactive views
40
- - **oRPC** for end-to-end type safety. One router at
41
- `lib/rpc/router.ts`, mounted at `app/rpc/[[...rest]]/route.ts`; RSCs call
42
- procedures directly via `createRouterClient`, client components call the
43
- same procedures over HTTP via `RPCLink`. Live views use oRPC's event
44
- iterators (server-sent events under the hood).
45
- - **Base UI** for unstyled component primitives (Dialog, Select, Combobox,
46
- Tabs, NumberField, Switch, Toast, PreviewCard)
47
- - **Tailwind CSS 4** for styling
48
- - **CodeMirror 6** for the YAML editor with lint markers
49
- - **`yaml`** for comment-preserving Document-API YAML edits
50
- - **zod** for input validation and CLI JSON parsing
51
-
52
- The backend is the `sparkrun` CLI itself, shelled out via
53
- `child_process.spawn`. The UI also reads `~/.cache/sparkrun/{jobs,benchmarks}`
54
- directly when richer state is needed.
15
+ - **Dashboard** — live-updating view of currently running workloads with one-click stop.
16
+ - **Recipes** browse every registry; filter by name / model / runtime.
17
+ - **Launch wizard** pick a recipe, edit YAML with live validation, preview the dry-run command, launch, then tail logs in-place.
18
+ - **Chat** — talk to any running model from the browser; the Send button stays disabled until the workload reports ready.
19
+ - **Benchmarks** browse history, view throughput / TTFR charts, kick off new runs.
20
+ - **Logs** terminal-style live tail with ANSI color rendering.
21
+ - **Cluster monitor** — live per-host CPU / GPU / memory bars and sparkline history.
22
+
23
+ ## Screenshots
24
+
25
+ | | | |
26
+ | :---------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------: |
27
+ | [![Dashboard](docs/screenshots/dashboard.png)](docs/screenshots/dashboard.png) | [![Recipes](docs/screenshots/recipes.png)](docs/screenshots/recipes.png) | [![Launch YAML editor](docs/screenshots/launch-yaml.png)](docs/screenshots/launch-yaml.png) |
28
+ | Dashboard | Recipes | Launch YAML editor |
29
+ | [![Launch — overrides form](docs/screenshots/launch-overrides.png)](docs/screenshots/launch-overrides.png) | [![Launch — logs](docs/screenshots/launch-logs.png)](docs/screenshots/launch-logs.png) | [![Chat](docs/screenshots/chat.jpg)](docs/screenshots/chat.jpg) |
30
+ | Launchoverrides form | Launch logs | Chat |
55
31
 
56
32
  ## Run with npx
57
33
 
@@ -59,7 +35,7 @@ The fastest way to try it. Requires Node 20+ and `sparkrun` already on `$PATH`:
59
35
 
60
36
  ```bash
61
37
  npx sparkrun-ui
62
- # → http://0.0.0.0:3000 (reachable on the LAN; use --host 127.0.0.1 for loopback only)
38
+ # → http://0.0.0.0:5678 (reachable on the LAN; use --host 127.0.0.1 for loopback only)
63
39
  ```
64
40
 
65
41
  Common flags:
@@ -74,30 +50,25 @@ npx sparkrun-ui --sparkrun-bin /opt/sparkrun/bin/sparkrun
74
50
  standalone server that the Docker image uses; the package ships a precompiled
75
51
  bundle so there is no build step on the user's machine.
76
52
 
77
- ## Run with Docker (recommended)
53
+ ## Run with Docker
78
54
 
79
55
  A multi-arch image (`linux/amd64` + `linux/arm64`) is published to
80
56
  [`ghcr.io/mcampa/sparkrun-ui`](https://github.com/mcampa/sparkrun-ui/pkgs/container/sparkrun-ui)
81
57
  on every push to `main`.
82
58
 
83
- **The image does not bundle sparkrun.** Instead it bind-mounts the host's
59
+ **The image does not bundle sparkrun.** It bind-mounts the host's
84
60
  uv-installed sparkrun into the container so the UI always uses the same
85
61
  version you have on the host — no drift, no extra version to keep updated.
86
62
 
87
63
  ### Prerequisites
88
64
 
89
65
  - Sparkrun installed on the host: `uv tool install sparkrun`
90
- - Host Python is **3.12** (this is uv's default for sparkrun; the container
91
- is built for Python 3.12 to match the venv's interpreter ABI). If you're on
92
- a different Python version, see [Python version mismatch](#python-version-mismatch)
93
- below.
94
- - An SSH key that can reach every host in your cluster (sparkrun ssh's to each
95
- host to run `docker ps`, `docker logs`, etc.)
96
- - A saved sparkrun cluster definition. From the host:
97
- `sparkrun cluster create <name> --hosts <ip1>,<ip2>` once.
66
+ - Host Python is **3.12** see [troubleshooting](CONTRIBUTING.md#python-version-mismatch) if not.
67
+ - An SSH key that can reach every host in your cluster.
68
+ - A saved sparkrun cluster definition: `sparkrun cluster create <name> --hosts <ip1>,<ip2>`.
98
69
  - Docker installed on every cluster host (not the UI host).
99
70
 
100
- ### Quick start — single DGX (cluster contains `127.0.0.1`)
71
+ ### Single DGX (cluster contains `127.0.0.1`)
101
72
 
102
73
  ```bash
103
74
  docker run -d --name sparkrun-ui \
@@ -111,25 +82,19 @@ docker run -d --name sparkrun-ui \
111
82
  ghcr.io/mcampa/sparkrun-ui:latest
112
83
  ```
113
84
 
114
- Open <http://localhost:3000>.
85
+ Open <http://localhost:5678>. `--network host` is required when your cluster
86
+ references `127.0.0.1`. See [mount reference](CONTRIBUTING.md#docker-volume-mounts)
87
+ for what each volume does.
115
88
 
116
- Two things to notice:
89
+ ### Multi-host / remote cluster
117
90
 
118
- - `--network host` is required when your cluster references `127.0.0.1` — the
119
- container's loopback otherwise points back at itself, not the host.
120
- - The sparkrun tool dir is mounted at the **same absolute path** inside the
121
- container (`$HOME/.local/share/uv/tools/sparkrun` on both sides). The
122
- shim's shebang hardcodes that path, so the venv resolves correctly.
123
-
124
- ### Quick start — multi-host / remote cluster
125
-
126
- If your sparkrun cluster definition uses LAN IPs (e.g. `192.168.0.40,
127
- 192.168.0.41`), bridge networking works fine:
91
+ If your cluster uses LAN IPs (e.g. `192.168.0.40, 192.168.0.41`), drop
92
+ `--network host` and publish port 5678:
128
93
 
129
94
  ```bash
130
95
  docker run -d --name sparkrun-ui \
131
96
  --restart unless-stopped \
132
- -p 3000:3000 \
97
+ -p 5678:5678 \
133
98
  -v $HOME/.local/bin/sparkrun:/usr/local/bin/sparkrun:ro \
134
99
  -v $HOME/.local/share/uv/tools/sparkrun:$HOME/.local/share/uv/tools/sparkrun:ro \
135
100
  -v $HOME/.ssh:/home/app/.ssh:ro \
@@ -141,109 +106,38 @@ docker run -d --name sparkrun-ui \
141
106
  ### docker compose
142
107
 
143
108
  A ready-made [`docker-compose.yml`](./docker-compose.yml) lives at the repo
144
- root with all the mounts pre-wired. Defaults assume the single-host case:
109
+ root with all the mounts pre-wired:
145
110
 
146
111
  ```bash
147
112
  docker compose up -d
148
113
  ```
149
114
 
150
- ### What the volume mounts do
151
-
152
- | Mount | Purpose |
153
- | ----- | ------- |
154
- | `~/.local/bin/sparkrun` (ro) | Host's sparkrun launcher script |
155
- | `~/.local/share/uv/tools/sparkrun` (ro, same path) | Host's sparkrun venv (Python + site-packages) |
156
- | `~/.ssh` (ro) | SSH private key + known_hosts so sparkrun can reach cluster hosts |
157
- | `~/.config/sparkrun` | Saved clusters, registries config |
158
- | `~/.cache/sparkrun` | Recipe registries, job manifests, benchmark results — shared with the host's `sparkrun` CLI so both see the same state |
159
-
160
- ### Python version mismatch
161
-
162
- If `python3 --version` on the host is not 3.12, the bind-mounted venv won't
163
- work in the container (the C-extension wheels in `site-packages` were built
164
- against the host's Python ABI). Two options:
165
-
166
- 1. Reinstall sparkrun on the host pinning Python 3.12:
167
- `uv tool install --python 3.12 --force sparkrun`
168
- 2. Build the image yourself targeting your Python version: edit `Dockerfile`
169
- and change `FROM python:3.12-slim-bookworm` and the symlink target.
170
-
171
115
  ### Image tags
172
116
 
173
117
  - `latest` — every push to `main`
174
- - `sha-<short>` — every commit (immutable, pin this in production)
118
+ - `sha-<short>` — every commit (immutable; pin this in production)
175
119
  - `vX.Y.Z` / `vX.Y` — release tags
176
120
 
177
- ## Local development
178
-
179
- Without Docker, for hacking on the UI itself:
180
-
181
- ```bash
182
- pnpm install
183
- pnpm dev # binds 0.0.0.0:3000 so LAN clients can reach it
184
- ```
185
-
186
- Open <http://localhost:3000> (or the LAN IP from another machine).
187
-
188
- ### Requirements
189
-
190
- - Node.js 22+
191
- - pnpm 10+
192
- - `sparkrun` CLI on `PATH` (`SPARKRUN_BIN` env var to override)
193
- - A reachable cluster — either the default cluster
194
- (`sparkrun cluster default`) or one resolvable via `--cluster` / `--hosts`
195
-
196
- ### Production build (no Docker)
197
-
198
- ```bash
199
- pnpm build
200
- pnpm start
201
- ```
202
-
203
121
  ## Configuration
204
122
 
205
- - `SPARKRUN_BIN` — path to the sparkrun binary (default: `sparkrun`)
206
- - `next.config.ts` `allowedDevOrigins` accepts any LAN host in dev so HMR
207
- works from other machines
208
-
209
- ## Project layout
210
-
211
- ```
212
- app/
213
- rpc/[[...rest]]/route.ts # oRPC handler mount
214
- dashboard/ # /dashboard — live workloads
215
- recipes/ # /recipes — browse + filter
216
- launch/ # /launch — 4-step wizard
217
- benchmarks/ # /benchmarks — history, detail, new
218
- logs/[clusterId]/ # /logs/<id> — live tail
219
- monitor/ # /monitor — per-host metrics
220
- components/
221
- ui/ # Base UI wrappers (Button, Dialog, ...)
222
- dashboard/ recipes/ launch/ # feature components
223
- benchmarks/ logs/ monitor/
224
-
225
- lib/
226
- rpc/
227
- router.ts # composed router
228
- server.ts # createRouterClient — for RSCs
229
- client.ts # RPCLink + createORPCClient — for client components
230
- procedures/ # one file per feature
231
- sparkrun.ts # spawn helpers (one-shot + streaming)
232
- schemas.ts # zod schemas for CLI JSON shapes
233
- state.ts # ~/.cache/sparkrun/* disk readers
234
- draft.ts # per-draft tempfile lifecycle for the wizard
235
- portCheck.ts # TCP probe for port-in-use validation
236
- ```
123
+ - `--port <port>` / `PORT` — port to listen on (default `5678`)
124
+ - `--host <host>` / `HOSTNAME` interface to bind (default `0.0.0.0`)
125
+ - `--sparkrun-bin <path>` / `SPARKRUN_BIN` — path to the sparkrun binary
126
+ (default: `sparkrun` on `$PATH`)
237
127
 
238
128
  ## Caveats
239
129
 
240
- - Long-running mutations (`run.start`, `benchmarks.run`) are fire-and-forget:
241
- the procedure spawns the CLI detached and returns immediately. The source
242
- of truth for "what's running" stays `sparkrun cluster status`, polled via
243
- `status.stream`.
244
- - No persistence layer — every page reflects current CLI state and the
130
+ - **No auth.** Bind to a trusted network only. The UI has full access to
131
+ the sparkrun CLI on the host machine.
132
+ - **No persistence layer.** Every page reflects current CLI state and the
245
133
  sparkrun cache directly.
246
- - No auth. Bind to a trusted network only.
134
+ - Long-running mutations (benchmarks) are fire-and-forget the
135
+ source of truth for "what's running" stays `sparkrun cluster status`.
136
+
137
+ ## Contributing
138
+
139
+ Hacking on the UI, building from source, troubleshooting the Docker setup —
140
+ all in [CONTRIBUTING.md](CONTRIBUTING.md).
247
141
 
248
142
  ## License
249
143
 
@@ -16,7 +16,7 @@ Usage:
16
16
  npx sparkrun-ui [options]
17
17
 
18
18
  Options:
19
- -p, --port <port> Port to listen on (default: 3000)
19
+ -p, --port <port> Port to listen on (default: 5678)
20
20
  -H, --host <host> Host/interface to bind (default: 0.0.0.0)
21
21
  --sparkrun-bin <path> Path to the sparkrun CLI (default: \`sparkrun\` on PATH)
22
22
  -h, --help Show this message
@@ -52,7 +52,7 @@ if (values.version) {
52
52
  process.exit(0);
53
53
  }
54
54
 
55
- const port = values.port ?? process.env.PORT ?? "3000";
55
+ const port = values.port ?? process.env.PORT ?? "5678";
56
56
  if (!/^\d+$/.test(port) || Number(port) < 1 || Number(port) > 65535) {
57
57
  process.stderr.write(`sparkrun-ui: invalid --port value: ${port}\n`);
58
58
  process.exit(2);
@@ -1 +1 @@
1
- Ep2vQqLmy6LOGWMmAL6fZ
1
+ 6eyYzTPHshjxU0hHbw9jq
@@ -7,9 +7,9 @@
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/Ep2vQqLmy6LOGWMmAL6fZ/_buildManifest.js",
11
- "static/Ep2vQqLmy6LOGWMmAL6fZ/_ssgManifest.js",
12
- "static/Ep2vQqLmy6LOGWMmAL6fZ/_clientMiddlewareManifest.js"
10
+ "static/6eyYzTPHshjxU0hHbw9jq/_buildManifest.js",
11
+ "static/6eyYzTPHshjxU0hHbw9jq/_ssgManifest.js",
12
+ "static/6eyYzTPHshjxU0hHbw9jq/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/03q757hpt3301.js",
@@ -107,8 +107,8 @@
107
107
  "dynamicRoutes": {},
108
108
  "notFoundRoutes": [],
109
109
  "preview": {
110
- "previewModeId": "bd898035d4304a4f5e745bf405259822",
111
- "previewModeSigningKey": "04f7e0a9fc39d82aa3f30d0168c9b904617bf15b5abd1c583c8454f67af6d58f",
112
- "previewModeEncryptionKey": "1fb1941cebf3a95dd400befff54d15d708b814e7a468218ec6b134a039512148"
110
+ "previewModeId": "190cd09fe19321088ccbfd4e09e6a3d7",
111
+ "previewModeSigningKey": "16c3416e388787b11a4342e8407411e2beaf4a0ea5cdade2b469223197bba730",
112
+ "previewModeEncryptionKey": "c08001eb5b5f0b7901962b1f40ff2cd114c2c26ae9a5369fd5fa360aa9f74b1c"
113
113
  }
114
114
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/03q757hpt3301.js"/><script src="/_next/static/chunks/0o0far65u959f.js" async=""></script><script src="/_next/static/chunks/0gwjk38kzji83.js" async=""></script><script src="/_next/static/chunks/12mz0_._155bq.js" async=""></script><script src="/_next/static/chunks/173qvra~fczs6.js" async=""></script><script src="/_next/static/chunks/turbopack-01vtk6cqgo2n6.js" async=""></script><script src="/_next/static/chunks/06k6o5~7u5tj3.js" async=""></script><script src="/_next/static/chunks/0-3wtr85ap-rp.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/03q757hpt3301.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[12224,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\"]\n3:I[67689,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\"]\n4:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"ViewportBoundary\"]\na:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"MetadataBoundary\"]\nc:I[77663,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"Ep2vQqLmy6LOGWMmAL6fZ\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/03q757hpt3301.js"/><script src="/_next/static/chunks/0o0far65u959f.js" async=""></script><script src="/_next/static/chunks/0gwjk38kzji83.js" async=""></script><script src="/_next/static/chunks/12mz0_._155bq.js" async=""></script><script src="/_next/static/chunks/173qvra~fczs6.js" async=""></script><script src="/_next/static/chunks/turbopack-01vtk6cqgo2n6.js" async=""></script><script src="/_next/static/chunks/06k6o5~7u5tj3.js" async=""></script><script src="/_next/static/chunks/0-3wtr85ap-rp.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/03q757hpt3301.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[12224,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\"]\n3:I[67689,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\"]\n4:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"ViewportBoundary\"]\na:I[76779,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"MetadataBoundary\"]\nc:I[77663,[\"/_next/static/chunks/06k6o5~7u5tj3.js\",\"/_next/static/chunks/0-3wtr85ap-rp.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"6eyYzTPHshjxU0hHbw9jq\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  8:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"ViewportBoundary"]
7
7
  a:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"MetadataBoundary"]
8
8
  c:I[77663,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"Ep2vQqLmy6LOGWMmAL6fZ"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"6eyYzTPHshjxU0hHbw9jq"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1,5 +1,5 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"OutletBoundary"]
3
3
  3:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"Ep2vQqLmy6LOGWMmAL6fZ"}
4
+ 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"6eyYzTPHshjxU0hHbw9jq"}
5
5
  4:null
@@ -6,7 +6,7 @@
6
6
  8:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"ViewportBoundary"]
7
7
  a:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"MetadataBoundary"]
8
8
  c:I[77663,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"Ep2vQqLmy6LOGWMmAL6fZ"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"6eyYzTPHshjxU0hHbw9jq"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -2,4 +2,4 @@
2
2
  2:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"ViewportBoundary"]
3
3
  3:I[76779,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"Ep2vQqLmy6LOGWMmAL6fZ"}
5
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"6eyYzTPHshjxU0hHbw9jq"}
@@ -2,4 +2,4 @@
2
2
  2:I[12224,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"default"]
3
3
  3:I[67689,["/_next/static/chunks/06k6o5~7u5tj3.js","/_next/static/chunks/0-3wtr85ap-rp.js"],"default"]
4
4
  4:[]
5
- 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"Ep2vQqLmy6LOGWMmAL6fZ"}
5
+ 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"6eyYzTPHshjxU0hHbw9jq"}
@@ -1 +1 @@
1
- 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"Ep2vQqLmy6LOGWMmAL6fZ"}
1
+ 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"6eyYzTPHshjxU0hHbw9jq"}
@@ -5,7 +5,7 @@ R.c("server/chunks/ssr/01vs_next_dist_esm_build_templates_app-page_023iclp.js")
5
5
  R.c("server/chunks/ssr/[root-of-the-server]__02~3uwy._.js")
6
6
  R.c("server/chunks/ssr/[root-of-the-server]__0gkqj3p._.js")
7
7
  R.c("server/chunks/ssr/node_modules__pnpm_0_rgro2._.js")
8
- R.c("server/chunks/ssr/[root-of-the-server]__0vyn26k._.js")
8
+ R.c("server/chunks/ssr/[root-of-the-server]__03ntmap._.js")
9
9
  R.c("server/chunks/ssr/01vs_next_dist_client_components_0q825-v._.js")
10
10
  R.c("server/chunks/ssr/01vs_next_dist_client_components_builtin_forbidden_0kbt4rj.js")
11
11
  R.c("server/chunks/ssr/01vs_next_dist_client_components_builtin_unauthorized_13xycw8.js")