whose-turn 1.0.0-alpha.7 → 1.0.0-alpha.9

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 (41) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +28 -16
  3. package/config.example.json +0 -4
  4. package/connectors/github.mjs +24 -0
  5. package/dist/assets/_plugin-vue_export-helper-BbgK5wvS.js +18 -0
  6. package/dist/assets/_plugin-vue_export-helper-BneMU3KP.css +1 -0
  7. package/dist/assets/bem-OtK9ToP0.js +1 -0
  8. package/dist/assets/index-B6grE8kv.css +1 -0
  9. package/dist/assets/index-C3jZLqLJ.js +15 -0
  10. package/dist/assets/report-DUlemvzD.js +1 -0
  11. package/dist/assets/scheme-DCqBrLhv.js +1 -0
  12. package/dist/assets/sheet-Ctd_6q4a.js +1 -0
  13. package/dist/index.html +6 -6
  14. package/dist/report.html +4 -4
  15. package/dist/sheet.html +4 -4
  16. package/lib/api.mjs +70 -24
  17. package/lib/backoff.mjs +13 -0
  18. package/lib/compose.mjs +6 -8
  19. package/lib/config.mjs +102 -15
  20. package/lib/default-table.mjs +1 -0
  21. package/lib/errors.mjs +1 -2
  22. package/lib/facts.mjs +1 -1
  23. package/lib/feedback.mjs +140 -111
  24. package/lib/linear-api.mjs +1 -1
  25. package/lib/notify.mjs +7 -8
  26. package/lib/registry.mjs +32 -5
  27. package/lib/rules.mjs +16 -9
  28. package/lib/table.mjs +1 -0
  29. package/lib/text.mjs +3 -0
  30. package/lib/trace.mjs +6 -6
  31. package/lib/workspace.mjs +63 -15
  32. package/package.json +2 -1
  33. package/server.mjs +17 -8
  34. package/dist/assets/_plugin-vue_export-helper-DeQjDyQ9.js +0 -18
  35. package/dist/assets/_plugin-vue_export-helper-aQHODzfZ.css +0 -1
  36. package/dist/assets/bem-zV6iDqYN.js +0 -1
  37. package/dist/assets/index-BLFgmJcy.js +0 -7
  38. package/dist/assets/index-CTrTp-xu.css +0 -1
  39. package/dist/assets/report-BJ_aC1A7.js +0 -1
  40. package/dist/assets/scheme-BdlolNvz.js +0 -1
  41. package/dist/assets/sheet-q2RQEgOf.js +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  What changed for you in each version of Whose Turn. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [Semantic Versioning](https://semver.org/). The window shows this list under What's new; the ids at the end of an entry are ours and the window leaves them out.
4
4
 
5
+ ## [1.0.0-alpha.9] - 2026-11-04
6
+
7
+ ### Added
8
+ - A report that is fixed but not yet released now reads "Fixed, coming in the next release" on its report page and in the Report sheet, with its own colour, and the change counts as news on the Report button. RMA-321.
9
+ - A workspace you do not need right now can be parked or paused: pick one under In the list in its settings, each choice with a line that says what it does. Either way it leaves the rail, and its sources, marks, to-dos and cache stay. A parked workspace is checked every 15 minutes instead of every poll, and when a check finds something new that is your move it comes back into the rail by itself, with a dot, a line in its feed that says why, and the usual desktop notification. After a restart a parked workspace is checked 15 minutes after its last check, not at once. A paused workspace is not checked at all and comes back only when you restore it. A line at the bottom of the rail, such as "3 hidden" (hover for the split into parked and paused), opens Monitor settings, where each one is listed with its mode and a Restore button. RMA-320, RMA-323.
10
+ - Each workspace now has its own settings, opened with the gear at the top right of its header: name, links, look, sources, rules and Delete workspace, for that workspace only. RMA-304.
11
+ - The gear at the bottom of the rail now opens Monitor settings: desktop notifications on or off, how often to poll, how many days of history to keep, and when to warn about stale or failing sources, with the path of the config file. RMA-304.
12
+ - A + at the end of the workspace list adds a workspace: it opens the same form, empty, and switches to the new workspace when you save. RMA-304.
13
+ - A workspace can turn off the dotted backdrop animal: untick Backdrop animal under Look in its settings, and the plain background stays. RMA-300.
14
+ - The Report button shows a dot and gives a short wiggle now and then when one of the reports has news: a new state or a new answer, and for the maintainer also a new user report. It calms down once you open the Report sheet. The monitor looks at most every ten minutes, and the wiggle is off when your system asks for reduced motion. RMA-311.
15
+ - If you maintain Whose Turn, the Report sheet lists every user report, not only yours, and marks the ones you filed. Everyone else still sees only their own. RMA-306.
16
+ - A ticket in code review now shows the names of the reviewers still asked to review its pull request, instead of just "Reviewer". RMA-298.
17
+
18
+ ### Changed
19
+ - Motion in the window is slower and softer, so panels, rows and dialogs glide instead of snapping. RMA-316.
20
+ - A ticket in code review now lists every reviewer of its pull request, none hidden: the ones still asked to review by name, and the ones who already did with a check for approved or a cross for changes requested. The list wraps onto more lines when it is long, and your own review is left out. RMA-315.
21
+ - The window moves smoothly: panels fold, rows slide in and out, dialogs fade. Turning on Reduce motion in your system settings switches it off. RMA-313.
22
+ - The grip mark on a panel's resize edge is a little larger and darker while you are not pointing at it, so it is easier to find; it is still quiet next to the content. RMA-310.
23
+ - On the folded What changed strip, the number of unread changes now reads from top to bottom, one upright character under another, and the hint about the arrow opens to its left instead of floating over the cards. RMA-309.
24
+ - The edges you can drag to resize a panel now show a small grip mark, and a line and the resize cursor appear when you point at them. The mark stays faint while you are not using it. RMA-303.
25
+ - Folding What changed now shrinks it to a thin strip at the right edge that still shows its title and the number of unread changes, and the other panels take the freed width. Click the strip or its arrow to open it again at the width you had. RMA-301.
26
+ - Handled now asks for the note first: Save or Skip marks the row handled, and closing the window with Escape leaves the row open. RMA-271.
27
+
28
+ ### Fixed
29
+ - A ticket waiting for a release no longer shows as your move; it waits under Waiting on others. RMA-322.
30
+ - Folding and unfolding the workspace header, and the panels, is now one smooth change in height instead of overshooting and jumping back. RMA-318.
31
+ - A panel that was folded when the page loaded now shows its rows when you unfold it, instead of staying empty. RMA-319.
32
+ - Your move no longer keeps growing when it is empty and Recently done has rows. RMA-307.
33
+ - A reassignment in the feed now shows your own name as "you", the same as the Handled trace does. RMA-270.
34
+ - The comment shown with a passed-on row is now read from the feed when you open it, so it is always the full text. Once the comment has dropped out of the feed, only the short line remains. RMA-269.
35
+
36
+ ## [1.0.0-alpha.8] - 2026-11-04
37
+
38
+ ### Added
39
+ - A bell in the status bar, "Notifications on", turns desktop notifications off for the whole monitor and back on. When they are off the button turns red and says "Notifications off", and the choice is kept after a restart. RMA-283.
40
+ - Anyone can now send a report from the Report sheet and see its answer, without connecting anything. A report goes to the maintainer, and the sheet says so. RMA-280.
41
+ - A report now carries only the title and text you write, the monitor version and a short description of your system (OS, Node version, how the monitor was installed, browser, screen and window size, language, time zone, light or dark, app window or tab, and which kinds of source you use, such as github or linear); nothing from your workspaces, tickets, names or links is sent with it. RMA-291.
42
+
43
+ ### Changed
44
+ - The `feedback` settings for a Linear workspace, team, project and key are gone: reports no longer need them, and old values in your config are dropped the next time it is saved. RMA-280.
45
+
46
+ ### Fixed
47
+ - An empty panel, such as Your move with nothing in it, now shrinks to its message instead of keeping the height you once dragged it to. The height comes back when rows appear. RMA-294.
48
+
5
49
  ## [1.0.0-alpha.7] - 2026-11-04
6
50
 
7
51
  ### Fixed
package/README.md CHANGED
@@ -29,7 +29,7 @@ claude plugin install whose-turn@bladeforge
29
29
 
30
30
  ## First run
31
31
 
32
- The window opens on one card: add a source through the settings sheet (the gear at the bottom of the rail). A source needs an account and its filters; a token typed into a secret field goes to the platform's secret store, never into the config file. Claude can set a workspace up too, through the `whose_turn_config` MCP tool. From then on the server polls, the window follows, and the Claude Code plugin reads the same server.
32
+ The window opens on one card: add a source through the workspace settings (the gear at the top right of the workspace header). A source needs an account and its filters; a token typed into a secret field goes to the platform's secret store, never into the config file. Claude can set a workspace up too, through the `whose_turn_config` MCP tool. From then on the server polls, the window follows, and the Claude Code plugin reads the same server.
33
33
 
34
34
  ## Workspaces and connectors
35
35
 
@@ -43,16 +43,21 @@ Nothing that names an employer, an account or a team process lives in this repos
43
43
  | Linux | `$XDG_CONFIG_HOME/whose-turn/config.json`, default `~/.config/whose-turn/config.json` |
44
44
  | Windows | `%APPDATA%\whose-turn\config.json` |
45
45
 
46
- `WHOSE_TURN_DATA` overrides the whole directory, `WHOSE_TURN_CONFIG` the config file alone, `WHOSE_TURN_PORT` the port (it wins over `port` in the config file; `install.sh` and the plugin read both the same way). `WHOSE_TURN_NOTIFY=off` silences desktop notifications, for a second server you run to try something; under a test runner they are always silent. On first run there is no file: the settings sheet (the gear) or Claude through `/api/config` writes it, or copy `config.example.json` there and fill in:
46
+ `WHOSE_TURN_DATA` overrides the whole directory, `WHOSE_TURN_CONFIG` the config file alone, `WHOSE_TURN_PORT` the port (it wins over `port` in the config file; `install.sh` and the plugin read both the same way). `WHOSE_TURN_NOTIFY=off` silences desktop notifications, for a second server you run to try something. On first run there is no file: the workspace settings (the gear at the top right of the workspace), the monitor settings (the gear at the bottom of the rail) or Claude through `/api/config` writes it, or copy `config.example.json` there and fill in:
47
47
 
48
48
  | key | meaning |
49
49
  |---|---|
50
- | `port`, `poll_seconds`, `history_days` | the port, how often to poll, how far back the feed reaches |
50
+ | `port`, `poll_seconds`, `history_days` | the port, how often to poll (default 60), how far back the feed reaches (default 14) |
51
51
  | `stale_minutes`, `failing_polls` | health alerts: no data from any source for this many minutes (default 15), or one source failing this many polls in a row (default 3) |
52
- | `feedback.workspace`, `team`, `project` | where the "to the backlog" button and the `whose_turn_feedback` MCP tool file bugs and improvements about the monitor: a Linear workspace slug, team key and project name; the key with issue-creation rights goes to the secret store under `feedback.token_service` (default `whose-turn-feedback`) and the workspace slug |
53
- | `feedback.assign` | `false` leaves a filed issue unassigned for triage; by default it is assigned to the owner of the feedback key, so it shows up on that person's own dashboard |
52
+
53
+ The four numbers `poll_seconds`, `history_days`, `stale_minutes` and `failing_polls` are editable in the monitor settings (the gear at the bottom of the rail) and through `POST /api/config` with `{settings: {...}}`; a change applies at the next poll with no restart. `port` is not editable there.
54
+
55
+ | key | meaning |
56
+ |---|---|
54
57
  | `feedback.composer` | the user's own agent that turns a remark into an issue: `{command, args}` of a CLI that reads the prompt on stdin and prints JSON (`{title, kind, body}`, or a wrapper with a `result` string that contains it); default `claude -p --output-format json --model claude-haiku-5-5`, so Claude Code on the user's subscription; `codex exec` or anything alike works the same way |
58
+ | `feedback.*` (retired keys) | `workspace`, `team`, `project`, `token_service` and `assign` are dropped from the file the next time the workspace list is saved: reports go through the relay since RMA-280 and need no tracker setup |
55
59
  | `feedback.bug_words` | extra words, in any language, that make the fallback composer (used when the agent CLI gives no usable answer) call a remark a bug; matched as stems at a word start; the English defaults bug, broken, crash, error, fail, wrong always apply |
60
+ | `notifications.desktop` | `false` turns desktop notifications off for the whole monitor, `true` (the default) leaves them on; the bell in the status bar, "Notifications on/off", flips it, and so does `POST /api/notifications` with `{desktop: false}`, which answers `{notifications}`. `WHOSE_TURN_NOTIFY=off` still wins over it. The setting is stored in the config, so it survives a restart, and a change applies at once with no restart (RMA-283) |
56
61
  | `workspaces[].id`, `name` | a short id used in the API and on disk (lowercase letters, digits and hyphens, up to 40, starting with a letter or digit; a missing id becomes `ws<n>`) and the display name |
57
62
  | `workspaces[].key_pattern` | regex for ticket keys in PR titles and to-dos; the default matches any Jira-style key; a pattern that does not compile is refused on save |
58
63
  | `workspaces[].connectors` | an object keyed by type, or a list of `{type, id?, label?, …}` entries when one type appears twice |
@@ -66,10 +71,12 @@ Nothing that names an employer, an account or a team process lives in this repos
66
71
  | `…jira.email` | the account the API token belongs to |
67
72
  | `…jira.token_service` | the secret-store entry holding the token, default `whose-turn-jira` |
68
73
  | `…jira.jql` | which tickets to watch |
74
+ | `workspaces[].hidden` | `parked` or `paused`, or left out for a workspace shown in the rail. Either way the workspace leaves the rail and keeps its sources, marks, to-dos and cache. A parked workspace is polled every 15 minutes instead of every poll interval (after a restart its first check is due 15 minutes after its stored last check, at once when there is none or it is older), through the same loop and the same rate-limit backoff; when a check finds a Your move row that was not there at the previous check, the workspace is unparked in the config (the same write as `POST /api/workspaces/hidden`), comes back into the rail with a dot and a feed line (`returned`) that says so, and a desktop notification follows the usual rules. A paused workspace makes no request and never comes back by itself. Any other value is refused on save, and so is hiding every workspace. It is the "In the list" choice in the workspace settings (Visible, Park, Pause, each with a one-line explanation); Monitor settings and the "n hidden" line (its hint splits parked and paused) at the bottom of the rail list the hidden ones with a Restore button (RMA-320) |
69
75
  | `workspaces[].links` | quick links shown in the header, as `"Label https://…"` strings or `{label, url}`; the repository, the Jira site and the Linear team come from the connectors by themselves, unless one of these links already points at the same site |
70
76
  | `workspaces[].rules` | the team's process, see Rules below; `statuses` groups, `automation_authors` and `question_words` must be lists of strings (statuses non-empty) or the save is refused |
71
77
  | `…connectors.linear.workspace`, `team`, `project` | the Linear workspace slug (the part after linear.app/), and optionally one team key or one project name; the personal API key goes to the secret store under the workspace slug |
72
78
  | `workspaces[].theme.seed` | optional hex colour, `#rrggbb`; the window derives its light and dark Material 3 scheme from it (`lib/palette.mjs`); without it the stylesheet's blue stays |
79
+ | `workspaces[].theme.backdrop` | `false` turns the dot-drawn backdrop animal off for this workspace: the canvas is not rendered at all; default `true`. It is the "Backdrop animal" box under Look in the workspace settings, and `theme` may hold only this key (RMA-300) |
73
80
  | `workspaces[].theme.accent` | optional second hex that sets the tertiary hue; defaults to the seed's hue turned by 80 degrees |
74
81
 
75
82
  A flat config with `github`, `jira` and `rules` at the top level still loads as one workspace named `default`.
@@ -129,7 +136,7 @@ On a 403 or 429 rate limit the poll delay doubles up to 15 minutes, then returns
129
136
 
130
137
  ## Rules: whose turn
131
138
 
132
- Each ticket is joined with its PR by the ticket key in the PR title. The server computes a set of facts per ticket (`pr.checks`, `ticket.status`, `ticket.assignee`, `unanswered_count` and the rest, listed by `GET /api/config` under `facts`) and walks the workspace's rules table: the first row whose conditions hold decides whose turn it is and the next step. The full contract is in [docs/mechanisms/rules-table.md](docs/mechanisms/rules-table.md).
139
+ Each ticket is joined with its PR by the ticket key in the PR title; the rules keep one PR per ticket key per workspace, so a ticket with PRs in two repositories of one workspace shows one of them. A ticket in code review lists every reviewer of its PR instead of "Reviewer": those still requested as plain names (people and teams), then those who already reviewed, `✓ name` for approved and `✗ name` for changes requested, from each person's latest review (a comment-only review shows the name without a mark, a dismissed one is ignored, you are left out). The list wraps in the window and costs no extra request. The server computes a set of facts per ticket (`pr.checks`, `ticket.status`, `ticket.assignee`, `unanswered_count` and the rest, listed by `GET /api/config` under `facts`) and walks the workspace's rules table: the first row whose conditions hold decides whose turn it is and the next step. The full contract is in [docs/mechanisms/rules-table.md](docs/mechanisms/rules-table.md).
133
140
 
134
141
  The default table, in `lib/default-table.mjs`, takes its status words and next-step texts from the workspace's `rules` (defaults in `lib/config.mjs`). In order:
135
142
 
@@ -175,13 +182,13 @@ The monitor also alerts on its own polling: stale data, or a source that keeps f
175
182
 
176
183
  ## API, `127.0.0.1:<port>`
177
184
 
178
- Requests must carry the local `Host`; a POST must be `application/json`. An error is a `google.rpc.Status` envelope: `{"error":{"code","status","message","details":[{"@type":"ErrorInfo","reason"}]}}`; branch on `reason`. The reasons: `NOT_FOUND` (unknown path, 404), `METHOD_NOT_ALLOWED` (405 with an `Allow: GET, POST` header, a method other than GET or POST), `NO_SUCH_WORKSPACE`, `NO_SUCH_TODO`, `CHANGELOG_UNAVAILABLE` (404), `NO_WORKSPACE` (412, a request that needs a workspace while none is configured; `/api/state` still answers 200 with an empty snapshot carrying `problems`, which the first-run card reads), `NOT_CONFIGURED` (412, feedback is not set up), `UPSTREAM_FAILED` (502, Linear failed or answered an error; the HTTP status is in the `ErrorInfo` metadata `upstream_status`), `RATE_LIMITED` (429), `UNKNOWN_ACTION`, `INVALID_BODY`, `INVALID_ARGUMENT` (an empty to-do or remark names the field `text` in a `BadRequest` detail), `INVALID_CONFIG` (400), `UPDATE_IN_PROGRESS` (409, an update is already installing), `UPDATE_UNAVAILABLE` (412, nothing to update: a checkout, or already the latest version), `FORBIDDEN_ORIGIN` (403) and `INTERNAL` (500, a fixed message; the raw exception text appears only in a `DebugInfo` detail when the server runs with `WHOSE_TURN_DEBUG=1`, and always in the server log).
185
+ Requests must carry the local `Host`; a POST must be `application/json`. An error is a `google.rpc.Status` envelope: `{"error":{"code","status","message","details":[{"@type":"ErrorInfo","reason"}]}}`; branch on `reason`. The reasons: `NOT_FOUND` (unknown path, 404), `METHOD_NOT_ALLOWED` (405 with an `Allow: GET, POST` header, a method other than GET or POST), `NO_SUCH_WORKSPACE`, `NO_SUCH_TODO`, `CHANGELOG_UNAVAILABLE` (404), `NO_WORKSPACE` (412, a request that needs a workspace while none is configured; `/api/state` still answers 200 with an empty snapshot carrying `problems`, which the first-run card reads), `UPSTREAM_FAILED` (502, the report relay failed or answered an error; the HTTP status is in the `ErrorInfo` metadata `upstream_status`), `RATE_LIMITED` (429), `UNKNOWN_ACTION`, `INVALID_BODY`, `INVALID_ARGUMENT` (an empty to-do or remark names the field `text` in a `BadRequest` detail; a report the relay refuses is the same reason), `INVALID_CONFIG` (400), `UPDATE_IN_PROGRESS` (409, an update is already installing), `UPDATE_UNAVAILABLE` (412, nothing to update: a checkout, or already the latest version), `FORBIDDEN_ORIGIN` (403) and `INTERNAL` (500, a fixed message; the raw exception text appears only in a `DebugInfo` detail when the server runs with `WHOSE_TURN_DEBUG=1`, and always in the server log).
179
186
 
180
- - `GET /api/workspaces`: `[{id, name, key_pattern, links, connectors:[{id, type, label}], open_moves, theme, theme_seed, failing_sources}]`; `links` are the quick links, `theme` is `{light, dark}`, each a map of CSS variable to value, or `null` without a seed, `theme_seed` is the seed it grows from and `failing_sources` counts the sources with an error. `/api/summary` leaves `theme` out.
187
+ - `GET /api/workspaces`: `[{id, name, key_pattern, links, connectors:[{id, type, label}], open_moves, theme, theme_seed, backdrop, failing_sources, hidden, returned}]`; `hidden` is `parked`, `paused` or empty and `returned` is true while a parked workspace's comeback line is unseen; `links` are the quick links, `theme` is `{light, dark}`, each a map of CSS variable to value, or `null` without a seed, `backdrop` is `false` when the workspace turned its backdrop animal off, `theme_seed` is the seed it grows from and `failing_sources` counts the sources with an error. `/api/summary` leaves `theme` out. `GET /api/state` without `ws` opens the first workspace that is not parked or paused.
181
188
  - `GET /api/state?ws=<id>`: one workspace, default the first: `turn` (the rows, each with `group` (`you`, `others`, `done`, or `gone` for a row the workspace's rules hide, which is never your move), `rank`, `next`, `why`, `url`, `ticket_url`, `source`, `status_group` (`backlog`, `passed`, `code_review`, `qa`, `on_hold` or empty) and `handled`), `counts` (`mine`, `others`, `failing`, `done`: the four header tiles), `feed`, `marks` (`{seen, base, handled: {row_id: iso}, info: {row_id: {note?, auto?, outcome?, event?}}}`; `info` carries the note of a mark, and for an automatic mark `auto: true`, the `outcome` phrase, the feed id of the `event` behind it and a `detail` with the assignee and status changes and the latest comment), `todos` (each with `ticket_url`), `errors`, `health`, `polled_at`, `me` (your name per source), `workspace`, plus `workspaces` and `problems`. With `&full=1` the merged raw collections come too: `tickets`, `comments`, `prs`, `activity`, `asks`, `events`.
182
- - `GET /api/summary`: across all workspaces: `moves` (each with `ws`), `new_events`, `todos`, `polled_at`, `errors`, `health` (`{ok, alerts}`, alerts as text prefixed with the workspace name when there are several), and `workspaces` with the same per workspace, where `health` is `{ok, stale, fresh_at, failing:[{source, polls}], alerts:[{id, text}]}`.
189
+ - `GET /api/summary`: across all workspaces: `moves` (each with `ws`), `new_events`, `todos`, `polled_at`, `errors`, `health` (`{ok, alerts}`, alerts as text prefixed with the workspace name when there are several), and `workspaces` with the same per workspace, each carrying `hidden` (`parked`, `paused` or empty) so a parked or paused workspace is marked as such, where `health` is `{ok, stale, fresh_at, failing:[{source, polls}], alerts:[{id, text}]}`.
183
190
  - `GET /api/changelog`: `{current, versions}`; `versions` is CHANGELOG.md parsed once per start, newest first as written, each `{version, date, sections:[{kind, items:[markdown]}]}` (an `[Unreleased]` block comes first with version `Unreleased` and no date). A package without a readable CHANGELOG.md answers `CHANGELOG_UNAVAILABLE` (404).
184
- - `GET /api/stream`: SSE. One `data:` event per poll per workspace, `{ws, version, polled_at, open_moves}`. The window reloads state when its workspace's `version` changes. The update status arrives as `{update}`, once on connect and on every change.
191
+ - `GET /api/stream`: SSE. One `data:` event per poll per workspace, `{ws, version, polled_at, open_moves, hidden, returned}`. The window reloads state when its workspace's `version` changes. The update status arrives as `{update}`, once on connect and on every change.
185
192
  - `/api/summary` and `/api/state` carry `update: {current, latest, available, state, reason?}`. The server checks `https://registry.npmjs.org/-/package/whose-turn/dist-tags` every ten minutes (ETag-cached) and follows the `latest` dist-tag, which every publish moves (prereleases included during the alpha); `available` is true when that tag names another version and the server runs from the plugin's install, `<data>/app/node_modules/whose-turn`. `state` is `idle`, `installing`, `restarting` or `failed` (with npm's last lines in `reason`). A new version raises one desktop notification. `POST /api/update` runs `npm install --prefix <data>/app --no-audit --no-fund --no-save whose-turn@<version>` and restarts: under the launch agent it exits and the agent starts the new copy; without one it frees the port, starts the new `server.mjs` detached (output to `<data>/server.log`) and exits. A failed install leaves the running copy as it was. A second `POST` while one runs is refused with `UPDATE_IN_PROGRESS`; one with nothing to update with `UPDATE_UNAVAILABLE`. This is the expected, announced way an install stays current, not a silent update.
186
193
  - A read without `ws` answers for the first workspace; a write (`/api/marks`, `/api/todos`, an inbox hand-off) without `ws` is refused with `INVALID_ARGUMENT`, because it would land silently in the wrong workspace (RMA-115).
187
194
  - `POST /api/marks` takes `{ws, seen:[ids], unseen:[ids], base:ms, handled:{row_id: iso|null}, notified:[ids]}`; `seen` and `unseen` must be strings (`unseen` takes ids back out of `seen`, which is how Undo restores Mark all read), `base` a number not in the future, `handled` values ISO dates or null, `notes` a map of row id to one line of at most 200 characters that rides with a handled mark (a note for a row that is not handled is dropped; Undo removes it), else `INVALID_ARGUMENT` names the field. It answers `{marks, turn, counts}`, recomputed, so the window updates without a reload.
@@ -189,10 +196,11 @@ Requests must carry the local `Host`; a POST must be `application/json`. An erro
189
196
  - `POST /api/refresh` polls now.
190
197
  - `GET /api/window` is the size the app window last reported, `{width, height}`, or `{}` before the first report; `POST /api/window` with `{width, height}` (whole pixels, 300 to 10000) stores it in `<data>/window.json`. `open.sh` reads it for `--window-size`.
191
198
  - `POST /api/open` with `{mode: 'app' | 'browser'}` runs `open.sh` (with `--browser` for `browser`) on the machine the server runs on, with `WHOSE_TURN_PORT` set to this server's port; this is what the window's "Open as app" button calls. A second open of the same mode within 5 seconds is refused with `429` and reason `OPEN_TOO_SOON` (`retry_after_seconds` in the detail), so a double click opens one window; the button shows "Opening…" meanwhile.
192
- - `GET /api/feedback` says whether feedback is configured and lists the issues filed from this machine (`<data>/reports.json`, the last hundred) with the state Linear reports for them, read with the feedback key and cached for a minute, so a reporter without a Linear account can follow their reports in the Report sheet and on `/report?id=<identifier>`, the monitor's own page; `GET /api/feedback?id=<identifier>` returns that one report with the comments on its issue as the maintainer's answers and `unanswered` when it was closed without one; `POST /api/feedback` with `{text, ws?, kind_ref?, from?}` lets the server compose the issue from a remark in the user's words (the user's own agent from `feedback.composer`, Claude Code by default; the first line becomes the title when no agent answers), or with `{kind: bug|improvement|idea, title, body?, ws?, kind_ref?: {kind, ref}, from?}` creates a Linear issue in the configured project with the matching label and, when `kind_ref` names a row, a feed item or a workspace, that hand-off context in the description. The reply carries the issue id and url.
199
+ - `GET /api/feedback` lists the reports filed from this machine (`<data>/reports.json`, the last hundred) with the state the report relay gives them, read in one call and cached for a minute (on the maintainer's machine, where the secret store holds an entry `whose-turn-feedback-admin` for the account `relay`, the list is every user report the relay holds, newest first, each marked `mine` when it was filed from this machine, and any listed id opens on `/report`; a missing entry or a refused token gives the plain list, and the token goes only to the relay, never into a response), a report whose state or answer count differs from what the sheet last showed (the snapshot sits in `<data>/reports-seen.json`, rewritten when this list is read) is news: the server looks at the relay at most every ten minutes while the sheet is closed and the stream carries `{report_news: true|false}` to the window, which shows a dot and a short wiggle on Report until the sheet is opened (RMA-311); so a reporter without a Linear account can follow their reports in the Report sheet and on `/report?id=<identifier>`, the monitor's own page; `GET /api/feedback?id=<identifier>` returns that one report with the maintainer's comments as answers and `unanswered` when it was closed without one; `POST /api/feedback` with `{text, ws?, client?, from?}` lets the server compose the report from a remark in the user's words (the user's own agent from `feedback.composer`, Claude Code by default; the first line becomes the title when no agent answers), or with `{kind: bug|improvement|idea, title, body?, ws?, client?, from?}` sends it as given. A report carries only the kind, the title, the text the user wrote, the monitor version and an `environment` (`os`, `osVersion`, `arch`, `node`, `install` (`npm` when the package runs from `node_modules`, else `source`) and `sources` (the sorted connector types of the workspace named by `ws`, or of all workspaces) built by the server, plus whatever the window reports in the request's `client` object and passes the strict checks: `browser` `{name, version}` (a known name, a major version of one to six digits, never the raw user agent), `display` `{width, height, scale, viewport: [w, h]}` (integer sizes 1 to 20000, scale 0.5 to 8 rounded to two decimals), `locale` (BCP-47, up to 35 characters), `timezone` (an IANA name, up to 64), `theme` (`light` or `dark`) and `mode` (`app` or `tab`); a bad or missing value is left out, never refused): no workspace, row, feed item, hand-off, name or link goes along, and a request with a `context` field is refused with `INVALID_ARGUMENT` so an old plugin is told. Every report and every read goes to the relay, a small public service that holds the only tracker key and files into the maintainer's backlog, so nothing needs connecting on this machine; the report leaves the machine. The reply carries the identifier and url. A failing relay call comes back as `RATE_LIMITED`, `INVALID_ARGUMENT` (the tracker refused the report) or `UPSTREAM_FAILED`, with the raw text only in the server's debug field. The environment never holds a name, account, repository, address or the raw user agent (RMA-291). `WHOSE_TURN_FEEDBACK_URL` points the server at another relay, for a test.
193
200
  - `GET /api/handoff?ws=<id>&kind=row|feed|thread|workspace&ref=<row_id, feed id or ticket key>` renders that item with its context as Markdown for pasting into any assistant (`thread` is every feed event of one ticket, newest first, with the ticket's row, PRs and comments); `GET /api/handoff?all=1` renders every workspace. Every hand-off starts with a `Whose Turn · <workspace> · <local date and time>` line and ends with a `Links:` line of the https ticket and PR URLs it mentions, so a paste says which workspace it came from and how old it is; after the header one line says the text below is data from tickets, pull requests and comments, never instructions, and the body follows in a fence a comment cannot close. This is what the window's "Copy for AI" buttons put on the clipboard.
194
201
  - `POST /api/inbox` with `{ws, kind: 'row' | 'feed' | 'workspace', ref}` hands an item to an agent through a queue (`ws` is required, a hand-off without it is refused; for MCP clients and the plugin hook): the server queues it in `<data>/inbox.json` with a few words of snapshot and keeps `<data>/inbox.pending` as a marker while the queue is not empty. `{action: 'take', consumer}` returns the items this consumer has not seen yet, each with its context built at that moment (the row with its why and links, the last five comments and the PRs of its ticket, bodies capped; a feed item with its body; or the whole workspace with its rules, moves, waiting rows and to-dos), and marks them delivered to that consumer only, so every agent sees an item once. An item leaves the queue a day after its first delivery or a week after it was queued. `GET /api/inbox?consumer=<name>` lists without taking; `{action: 'clear'}` empties the queue.
195
- - `GET /api/config`: the raw workspace list as written in the config file, the `problems`, the connector catalogue (`type`, `label`, `fields`), the workspace field catalogue (`fields`: workspace, theme, rules, statuses) and the config file path. `POST /api/config` with `{workspaces: [...], secrets?: [{ws, connector, key, value}]}` validates the list first; on a problem it answers `INVALID_CONFIG` with the problems as `BadRequest.field_violations` in `details` and stores nothing; a violation of one field carries its path (`workspaces[0].rules.backlog_rows`), which the settings form shows under that field. Field specs with `choices` draw as selects. Otherwise it stores the secrets (the account and the store entry come from the connector's own field declaration), writes the file and reloads the workspaces in place; a workspace whose definition did not change keeps its caches, new or changed ones are polled at once. The reply carries the workspace list and `secrets_stored`. A workspace or connector entry that is not an object is refused with `INVALID_CONFIG`, the field violation naming its index (`workspaces[1]`, `workspaces[1].connectors[0]`). An empty list is refused with `INVALID_ARGUMENT` ("keep at least one workspace"), and each write keeps the previous file as `config.json.bak`.
202
+ - `GET /api/config`: the raw workspace list as written in the config file, the `problems`, the connector catalogue (`type`, `label`, `fields`), the workspace field catalogue (`fields`: workspace, theme, rules, statuses), the `notifications` setting, the monitor-wide numbers (`settings`, with their labels in `settings_fields`) and the config file path. `POST /api/config` with `{workspaces: [...], secrets?: [{ws, connector, key, value}]}` validates the list first; on a problem it answers `INVALID_CONFIG` with the problems as `BadRequest.field_violations` in `details` and stores nothing; a violation of one field carries its path (`workspaces[0].rules.backlog_rows`), which the settings form shows under that field. Field specs with `choices` draw as selects. Otherwise it stores the secrets (the account and the store entry come from the connector's own field declaration), writes the file and reloads the workspaces in place; a workspace whose definition did not change keeps its caches, new or changed ones are polled at once. The reply carries the workspace list and `secrets_stored`. A body with `settings: {poll_seconds?, history_days?, stale_minutes?, failing_polls?}` and no `workspaces` writes only those keys (each a positive number, `history_days` and `failing_polls` whole; an unknown key or a bad value is refused with `INVALID_CONFIG`, a violation naming `settings.<key>`, and nothing is stored) and answers `{settings, problems}`. A body with `notifications: {desktop}` and no `workspaces` changes only that setting and answers `{notifications}`; `/api/state` and `/api/summary` report it too. A workspace or connector entry that is not an object is refused with `INVALID_CONFIG`, the field violation naming its index (`workspaces[1]`, `workspaces[1].connectors[0]`). An empty list is refused with `INVALID_ARGUMENT` ("keep at least one workspace"), and each write keeps the previous file as `config.json.bak`.
203
+ - `POST /api/workspaces/hidden` with `{id, hidden}` parks, pauses or restores one workspace: `hidden` is `"parked"`, `"paused"` or `null` (shown again), the rest of its entry stays as it is. An unknown `id` is `NO_SUCH_WORKSPACE`, any other `hidden` is `INVALID_ARGUMENT`, and hiding every workspace is refused with `INVALID_CONFIG` like on `POST /api/config`; nothing is stored then. A workspace coming back is polled at once. It answers `{workspaces}`, the described list. The Restore button in Monitor settings and the rail's hidden line use it; the "In the list" choice in the workspace settings still saves with the sheet's own Save, as part of the same config write.
196
204
  - `POST /api/secrets` with `{service, account, value}` stores a token on its own (Keychain on macOS, a 600-mode file `<data>/secrets/<service>@<account>` elsewhere); it never touches the config.
197
205
  - Both write endpoints are reachable by any local process. A stored token is bound to its service, account and endpoint: a save that would point an existing token at a new endpoint, account or store entry is refused with `INVALID_CONFIG` unless the same request carries the token again, so a process without the token cannot redirect it. See AGENTS.md.
198
206
 
@@ -208,11 +216,15 @@ Open it at `http://127.0.0.1:<port>/` (or with `open.sh` as an app window). One
208
216
 
209
217
  **What changed.** The feed on the right is newest first, grouped by ticket. A ticket that is your move has an amber bar. Unread items are lit until you click them, and "Mark all read" clears them (with Undo). Search filters by any words and opens the matching groups; the source buttons narrow it to one source, "Flat" drops the grouping. Only written things expand, and "Open formatted" shows the comment as it was written.
210
218
 
211
- **Fold, resize, copy, ask.** Every panel folds with the chevron before its title and stays folded. Drag a panel's edge to resize it (arrow keys work on the focused handle, double click resets); the size is kept per workspace and never goes below the header and one full row. The AI button on a row, a ticket thread, a workspace or the top bar copies that context as Markdown for any assistant.
219
+ **Fold, resize, copy, ask.** Every panel folds with the chevron before its title and stays folded; a folded What changed slides to a thin strip at the right edge, with its title and unread count, and gives its width to the main column (a click on the strip opens it again at its stored width). Drag a panel's edge to resize it (arrow keys work on the focused handle, double click resets); the size is kept per workspace and never goes below the header and one full row. The AI button on a row, a ticket thread, a workspace or the top bar copies that context as Markdown for any assistant.
220
+
221
+ **Add a source.** First run shows one card with "Add a source". Later, the gear at the top right of the workspace header opens the workspace settings: that workspace's name, id and links, its look (colours and the backdrop animal), its sources, rules and the read-only whose-turn table, and Delete workspace. Save writes the config; a token goes to the secret store and never into the file. A failing source gets one line in the red banner above the panels, which opens the workspace settings.
222
+
223
+ **Add a workspace.** The "+" at the end of the workspace list in the rail opens the same form, empty; Save adds the workspace and switches to it.
212
224
 
213
- **Add a source.** First run shows one card with "Add a source". Later, the gear at the bottom of the rail opens Settings: the workspaces on the left, one workspace on the right with its sources, rule texts and colours. Save writes the config; a token goes to the secret store and never into the file. A failing source gets one line in the red banner above the panels, which opens Settings.
225
+ **Monitor settings.** The gear at the bottom of the rail holds what belongs to the whole monitor: desktop notifications on or off (the same setting as the bell, saved as you click), `poll_seconds`, `history_days`, `stale_minutes` and `failing_polls`, and the path of the config file, and a list of the parked and paused workspaces, each with its mode and a Restore button.
214
226
 
215
- **Report a problem or a wish.** "Report" in the top bar takes one text field; Send files it in the monitor's own backlog and shows the link, and `/report?id=<issue>` shows the answer.
227
+ **Report a problem or a wish.** "Report" in the top bar takes one text field; Send passes it to the maintainer's tracker (the report leaves your machine; nothing needs connecting) and shows the link, and `/report?id=<issue>` shows the state and the answer. On the maintainer's machine the sheet lists every user report under "All reports" and marks your own.
216
228
 
217
229
  **What's new.** The button above the gear at the bottom of the rail opens a sheet with CHANGELOG.md by version, newest first, the running version marked; a dot on the button says there are versions you have not read since you last opened it, and the "Updated to <version>" chip after an update opens the same sheet.
218
230
 
@@ -242,7 +254,7 @@ The queue is for agents that pull on their own: `POST /api/inbox` hands an item
242
254
 
243
255
  - `npm install` once: it points `core.hooksPath` at `.githooks/`.
244
256
  - The plugin's own code (skill, command, hooks, MCP server) is in BladeForge, `plugins/whose-turn`; a change to what Claude can do lands here as an API change first (ADR 0007).
245
- - Releasing: `main` collects changes and releases nothing. To ship, bump `version` in `package.json`, add the changelog entry, push `main`, then move the `release` branch to it (`git push origin main:release`); nobody pushes a tag. `.github/workflows/release.yml` runs on `release`, sees the new version, checks, builds, publishes to npm under `latest` on every release, prereleases included, plus the channel tag such as `alpha` for a prerelease (npm trusts the workflow through OIDC, no token) then creates the tag `v<version>` and a GitHub Release with the tarball. A push that leaves the version as released does nothing.
257
+ - Releasing: `main` collects changes and releases nothing. To ship, bump `version` in `package.json`, add the changelog entry, push `main`, then move the `release` branch to it (`git push origin main:release`); nobody pushes a tag. `.github/workflows/release.yml` runs on `release`, sees the new version, checks, builds, publishes to npm under `latest` on every release, prereleases included, plus the channel tag such as `alpha` for a prerelease (npm trusts the workflow through OIDC, no token) then creates the tag `v<version>` and a GitHub Release with the tarball. A push that leaves the version as released does nothing. After a release, `node scripts/release-linear.mjs` moves every whose-turn issue in Linear's Ready for release to Done and comments "Shipped in <version>." on each user report among them; it reads the Linear key from the Keychain entry `linear-api-key-write`, takes the version from `package.json` (or `--version <x>`), and only prints its plan until you pass `--apply` (RMA-321).
246
258
  - A checkout never offers the in-app update. To exercise it, lay out a packed copy as `<scratch>/app/node_modules/whose-turn`, start it with `WHOSE_TURN_DATA=<scratch>` and a free `WHOSE_TURN_PORT`, and point two test hooks at stubs: `WHOSE_TURN_REGISTRY` replaces `https://registry.npmjs.org` and `WHOSE_TURN_NPM` names the npm executable `POST /api/update` runs.
247
259
  - `npm run dev` starts the server on port 8766 with data and config in `.users-files/dev/` (gitignored), so nothing touches the real config. It serves the last `npm run build`; for live reloading of the window run `npm run dev:web` next to it and open port 5173, which proxies the API to 8766.
248
260
  - A fresh checkout has no window until `npm run build`; the server then says so on `/` while the API keeps working. A released package ships `dist/` built (RMA-126).
@@ -110,10 +110,6 @@
110
110
  }
111
111
  ],
112
112
  "feedback": {
113
- "workspace": "your-space",
114
- "team": "PROJ",
115
- "project": "monitor",
116
- "token_service": "whose-turn-feedback",
117
113
  "composer": {
118
114
  "command": "claude",
119
115
  "args": [
@@ -68,6 +68,29 @@ const reviewDecision = (reviews) => {
68
68
  return values.has('APPROVED') ? 'APPROVED' : '';
69
69
  };
70
70
 
71
+ const REVIEWER_STATE = { APPROVED: 'approved', CHANGES_REQUESTED: 'changes' };
72
+
73
+ /** Everyone on an open PR's review: the still requested (users and teams) as plain names, then those who reviewed, with their latest state. A comment-only review shows the name without a mark and never replaces an approval or a request for changes, a dismissed review takes that person's state away, and you, the author and bots are left out (RMA-315). */
74
+ const reviewersOf = (pr, reviews, { me, bots }) => {
75
+ const listed = [...(pr.requested_reviewers || []).map((user) => user.login), ...(pr.requested_teams || []).map((team) => team.slug)];
76
+ const latest = new Map();
77
+ for (const review of reviews) {
78
+ const login = review.user?.login;
79
+ if (!login || login === me || login === pr.user?.login || bots.test(login) || listed.includes(login)) {
80
+ continue;
81
+ }
82
+ if (review.state === 'DISMISSED') {
83
+ latest.delete(login);
84
+ continue;
85
+ }
86
+ const state = REVIEWER_STATE[review.state] || '';
87
+ if (state || !latest.has(login)) {
88
+ latest.set(login, state);
89
+ }
90
+ }
91
+ return [...listed.map((name) => ({ name, state: '' })), ...[...latest].map(([name, state]) => ({ name, state }))];
92
+ };
93
+
71
94
  /** A PR's reference in the feed: the repository name and the number, so a PR without a ticket still says where it lives (RMA-167). */
72
95
  const prRef = (repo, number) => `${repo.split('/').pop()}#${number}`;
73
96
 
@@ -105,6 +128,7 @@ const buildPr = async (api, { repo, me, bots, keyOf, sinceIso }, number) => {
105
128
  const row = {
106
129
  pr: number, key, title: pr.title, base: pr.base.ref, state, review: reviewDecision(reviews), checks: checks.state, merged_at: pr.merged_at || '',
107
130
  updated_at: pr.updated_at, url: pr.html_url,
131
+ reviewers: state === 'OPEN' ? reviewersOf(pr, reviews, { me, bots }) : [],
108
132
  last_comment_by: last ? last.who : '', last_comment_at: last ? last.at : '', last_comment_url: last ? last.url : '', last_comment: last ? oneline(last.body, 160) : '',
109
133
  unanswered: Boolean(last && state === 'OPEN' && last.state !== 'APPROVED' && last.at > myLast),
110
134
  };
@@ -0,0 +1,18 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/**
2
+ * @vue/shared v3.5.44
3
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
+ * @license MIT
5
+ **/function ys(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const j={},mt=[],He=()=>{},Sr=()=>!1,Sn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Cn=e=>e.startsWith("onUpdate:"),ee=Object.assign,bs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Yi=Object.prototype.hasOwnProperty,K=(e,t)=>Yi.call(e,t),A=Array.isArray,nt=e=>zt(e)==="[object Map]",vt=e=>zt(e)==="[object Set]",$s=e=>zt(e)==="[object Date]",N=e=>typeof e=="function",X=e=>typeof e=="string",we=e=>typeof e=="symbol",B=e=>e!==null&&typeof e=="object",Cr=e=>(B(e)||N(e))&&N(e.then)&&N(e.catch),wr=Object.prototype.toString,zt=e=>wr.call(e),Xi=e=>zt(e).slice(8,-1),Tr=e=>zt(e)==="[object Object]",wn=e=>X(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Lt=ys(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Zi=/-\w/g,pe=Tn(e=>e.replace(Zi,t=>t.slice(1).toUpperCase())),Qi=/\B([A-Z])/g,Xe=Tn(e=>e.replace(Qi,"-$1").toLowerCase()),En=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Un=Tn(e=>e?`on${En(e)}`:""),le=(e,t)=>!Object.is(e,t),rn=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},Er=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},An=e=>{const t=parseFloat(e);return isNaN(t)?e:t},eo=e=>{const t=X(e)?Number(e):NaN;return isNaN(t)?e:t};let js;const On=()=>js||(js=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function vs(e){if(A(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],r=X(s)?ro(s):vs(s);if(r)for(const i in r)t[i]=r[i]}return t}else if(X(e)||B(e))return e}const to=/;(?![^(]*\))/g,no=/:([^]+)/,so=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function ro(e){const t={};return e.replace(so,n=>n.startsWith("/*")?"":n).split(to).forEach(n=>{if(n){const s=n.split(no);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function xs(e){let t="";if(X(e))t=e;else if(A(e))for(let n=0;n<e.length;n++){const s=xs(e[n]);s&&(t+=s+" ")}else if(B(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const io="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly",oo=ys(io);function Ar(e){return!!e||e===""}function lo(e,t,n){if(e.length!==t.length)return!1;let s=!0;for(let r=0;s&&r<e.length;r++)s=rt(e[r],t[r],n);return s}function Hs(e,t,n){if(e.size!==t.size)return!1;const s=Array.from(t),r=new Uint8Array(s.length);for(const i of e){let o=-1;for(let l=0;l<s.length;l++)if(!r[l]&&rt(i,s[l],n)){o=l;break}if(o<0)return!1;r[o]=1}return!0}function fo(e,t,n){let s=nt(e),r=nt(t);if(s||r||(s=vt(e),r=vt(t),s||r))return s&&r?Hs(e,t,n):!1;const i=Object.keys(e).length,o=Object.keys(t).length;if(i!==o)return!1;for(const l in e){const f=e.hasOwnProperty(l),d=t.hasOwnProperty(l);if(f&&!d||!f&&d||!rt(e[l],t[l],n))return!1}return String(e)===String(t)}function Ks(e,t,n,s){n||(n=[new Map,new Map]);const[r,i]=n;if(r.has(e)||i.has(t))return r.get(e)===t&&i.get(t)===e;r.set(e,t),i.set(t,e);const o=s(e,t,n);return r.delete(e),i.delete(t),o}function rt(e,t,n){if(e===t)return!0;let s=$s(e),r=$s(t);return s||r?s&&r?e.getTime()===t.getTime():!1:(s=we(e),r=we(t),s||r?e===t:(s=A(e),r=A(t),s||r?s&&r?Ks(e,t,n,lo):!1:(s=B(e),r=B(t),s||r?!s||!r?!1:Ks(e,t,n,fo):String(e)===String(t))))}function co(e,t){return e.findIndex(n=>rt(n,t))}const Or=e=>!!(e&&e.__v_isRef===!0),uo=e=>X(e)?e:e==null?"":A(e)||B(e)&&(e.toString===wr||!N(e.toString))?Or(e)?uo(e.value):JSON.stringify(e,Mr,2):String(e),Mr=(e,t)=>Or(t)?Mr(e,t.value):nt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Wn(s,i)+" =>"]=r,n),{})}:vt(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Wn(n))}:we(t)?Wn(t):B(t)&&!A(t)&&!Tr(t)?String(t):t,Wn=(e,t="")=>{var n;return we(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
6
+ * @vue/reactivity v3.5.44
7
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
8
+ * @license MIT
9
+ **/let ne;class Pr{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&ne&&(ne.active?(this.parent=ne,this.index=(ne.scopes||(ne.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const s=this.scopes.slice();for(t=0,n=s.length;t<n;t++)s[t].pause()}for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes){const r=this.scopes.slice();for(t=0,n=r.length;t<n;t++)r[t].resume()}const s=this.effects.slice();for(t=0,n=s.length;t<n;t++)s[t].resume()}}run(t){if(this._active){const n=ne;try{return ne=this,t()}finally{ne=n}}}on(){++this._on===1&&(this.prevScope=ne,ne=this)}off(){if(this._on>0&&--this._on===0){if(ne===this)ne=this.prevScope;else{let t=ne;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n<s;n++)this.effects[n].stop();for(this.effects.length=0,n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){const r=this.scopes.slice();for(n=0,s=r.length;n<s;n++)r[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0}}}function qf(e){return new Pr(e)}function ao(){return ne}function Gf(e,t=!1){ne&&ne.cleanups.push(e)}let Y;const kn=new WeakSet;class Ir{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,ne&&(ne.active?ne.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,kn.has(this)&&(kn.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Nr(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Bs(this),Fr(this);const t=Y,n=Ie;Y=this,Ie=!0;try{return this.fn()}finally{Lr(this),Y=t,Ie=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)ws(t);this.deps=this.depsTail=void 0,Bs(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?kn.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){rs(this)&&this.run()}get dirty(){return rs(this)}}let Rr=0,Dt,Vt;function Nr(e,t=!1){if(e.flags|=8,t){e.next=Vt,Vt=e;return}e.next=Dt,Dt=e}function Ss(){Rr++}function Cs(){if(--Rr>0)return;if(Vt){let t=Vt;for(Vt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Fr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Lr(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),ws(s),ho(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function rs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Dr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Dr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ht)||(e.globalVersion=Ht,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!rs(e))))return;e.flags|=2;const t=e.dep,n=Y,s=Ie;Y=e,Ie=!0;try{Fr(e);const r=e.fn(e._value);(t.version===0||le(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{Y=n,Ie=s,Lr(e),e.flags&=-3}}function ws(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)ws(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ho(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ie=!0;const Vr=[];function Ke(){Vr.push(Ie),Ie=!1}function Be(){const e=Vr.pop();Ie=e===void 0?!0:e}function Bs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Y;Y=void 0;try{t()}finally{Y=n}}}let Ht=0;class po{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Mn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Y||!Ie||Y===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Y)n=this.activeLink=new po(Y,this),Y.deps?(n.prevDep=Y.depsTail,Y.depsTail.nextDep=n,Y.depsTail=n):Y.deps=Y.depsTail=n,$r(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Y.depsTail,n.nextDep=void 0,Y.depsTail.nextDep=n,Y.depsTail=n,Y.deps===n&&(Y.deps=s)}return n}trigger(t){this.version++,Ht++,this.notify(t)}notify(t){Ss();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Cs()}}}function $r(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)$r(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const fn=new WeakMap,yt=Symbol(""),is=Symbol(""),Kt=Symbol("");function ae(e,t,n){if(Ie&&Y){let s=fn.get(e);s||fn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Mn),r.map=s,r.key=n),r.track()}}function ze(e,t,n,s,r,i){const o=fn.get(e);if(!o){Ht++;return}const l=f=>{f&&f.trigger()};if(Ss(),t==="clear")o.forEach(l);else{const f=A(e),d=f&&wn(n);if(f&&n==="length"){const u=Number(s);o.forEach((h,v)=>{(v==="length"||v===Kt||!we(v)&&v>=u)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),d&&l(o.get(Kt)),t){case"add":f?d&&l(o.get("length")):(l(o.get(yt)),nt(e)&&l(o.get(is)));break;case"delete":f||(l(o.get(yt)),nt(e)&&l(o.get(is)));break;case"set":nt(e)&&l(o.get(yt));break}}Cs()}function go(e,t){const n=fn.get(e);return n&&n.get(t)}function St(e){const t=$(e);return t===e||(ae(t,"iterate",Kt),Ce(e))?t:Ue(e)?st(e)?t.map(n=>it(Ae(n))):t.map(it):t.map(Ae)}function Pn(e){return ae(e=$(e),"iterate",Kt),e}function Ve(e,t){return Ue(e)?it(st(e)?Ae(t):t):Ae(t)}const mo={__proto__:null,[Symbol.iterator](){return qn(this,Symbol.iterator,e=>Ve(this,e))},concat(...e){return St(this).concat(...e.map(t=>A(t)?St(t):t))},entries(){return qn(this,"entries",e=>(e[1]=Ve(this,e[1]),e))},every(e,t){return ke(this,"every",e,t,void 0,arguments)},filter(e,t){return ke(this,"filter",e,t,n=>n.map(s=>Ve(this,s)),arguments)},find(e,t){return ke(this,"find",e,t,n=>Ve(this,n),arguments)},findIndex(e,t){return ke(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ke(this,"findLast",e,t,n=>Ve(this,n),arguments)},findLastIndex(e,t){return ke(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ke(this,"forEach",e,t,void 0,arguments)},includes(...e){return Gn(this,"includes",e)},indexOf(...e){return Gn(this,"indexOf",e)},join(e){return St(this).join(e)},lastIndexOf(...e){return Gn(this,"lastIndexOf",e)},map(e,t){return ke(this,"map",e,t,void 0,arguments)},pop(){return Pt(this,"pop")},push(...e){return Pt(this,"push",e)},reduce(e,...t){return Ws(this,"reduce",e,t)},reduceRight(e,...t){return Ws(this,"reduceRight",e,t)},shift(){return Pt(this,"shift")},some(e,t){return ke(this,"some",e,t,void 0,arguments)},splice(...e){return Pt(this,"splice",e)},toReversed(){return St(this).toReversed()},toSorted(e){return St(this).toSorted(e)},toSpliced(...e){return St(this).toSpliced(...e)},unshift(...e){return Pt(this,"unshift",e)},values(){return qn(this,"values",e=>Ve(this,e))}};function qn(e,t,n){const s=Pn(e),r=s[t],i=r.call(s);if(s!==e&&!Ce(e)){if(i[Symbol.toStringTag]==="Array Iterator"){const o=Object.create(Object.getPrototypeOf(i));return o.next=()=>Us(i.next(),n),r!==jr[t]&&Object.defineProperties(o,{return:{get(){const l=i.return;return typeof l=="function"?l.bind(i):l}},throw:{get(){const l=i.throw;return typeof l=="function"?l.bind(i):l}}}),o}i._next=i.next,i.next=()=>Us(i._next(),n)}return i}function Us(e,t){return e.done||(e.value=t(e.value)),e}const jr=Array.prototype;function ke(e,t,n,s,r,i){const o=Pn(e),l=o!==e&&!Ce(e),f=o[t];if(f!==jr[t]){const h=f.apply(e,i);return l?Ae(h):h}let d=n;o!==e&&(l?d=function(h,v){return n.call(this,Ve(e,h),v,e)}:n.length>2&&(d=function(h,v){return n.call(this,h,v,e)}));const u=f.call(o,d,s);return l&&r?r(u):u}function Ws(e,t,n,s){const r=Pn(e),i=r!==e&&!Ce(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(d,u,h){return l&&(l=!1,d=Ve(e,d)),n.call(this,d,Ve(e,u),h,e)}):n.length>3&&(o=function(d,u,h){return n.call(this,d,u,h,e)}));const f=r[t](o,...s);return l?Ve(e,f):f}function Gn(e,t,n){const s=$(e);ae(s,"iterate",Kt);const r=s[t](...n);return(r===-1||r===!1)&&Nn(n[0])?(n[0]=$(n[0]),s[t](...n)):r}function Pt(e,t,n=[]){Ke(),Ss();const s=$(e)[t].apply(e,n);return Cs(),Be(),s}const _o=ys("__proto__,__v_isRef,__isVue"),Hr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(we));function yo(e){we(e)||(e=String(e));const t=$(this);return ae(t,"has",e),t.hasOwnProperty(e)}class Kr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Gr:qr:i?kr:Wr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=A(t);if(!r){let f;if(o&&(f=mo[n]))return f;if(n==="hasOwnProperty")return yo}const l=Reflect.get(t,n,se(t)?t:s);if((we(n)?Hr.has(n):_o(n))||(r||ae(t,"get",n),i))return l;if(se(l)){const f=o&&wn(n)?l:l.value;return r&&B(f)?ls(f):f}return B(l)?r?ls(l):Ts(l):l}}class Br extends Kr{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=A(t)&&wn(n);if(!this._isShallow){const d=Ue(i);if(!Ce(s)&&!Ue(s)&&(i=$(i),s=$(s)),!o&&se(i)&&!se(s))return d||(i.value=s),!0}const l=o?Number(n)<t.length:K(t,n),f=Reflect.set(t,n,s,se(t)?t:r);return t===$(r)&&f&&(l?le(s,i)&&ze(t,"set",n,s):ze(t,"add",n,s)),f}deleteProperty(t,n){const s=K(t,n);t[n];const r=Reflect.deleteProperty(t,n);return r&&s&&ze(t,"delete",n,void 0),r}has(t,n){const s=Reflect.has(t,n);return(!we(n)||!Hr.has(n))&&ae(t,"has",n),s}ownKeys(t){return ae(t,"iterate",A(t)?"length":yt),Reflect.ownKeys(t)}}class Ur extends Kr{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const bo=new Br,vo=new Ur,xo=new Br(!0),So=new Ur(!0),os=e=>e,Qt=e=>Reflect.getPrototypeOf(e);function Co(e,t,n){return function(...s){const r=this.__v_raw,i=$(r),o=nt(i),l=e==="entries"||e===Symbol.iterator&&o,f=e==="keys"&&o,d=r[e](...s),u=n?os:t?it:Ae;return!t&&ae(i,"iterate",f?is:yt),ee(Object.create(d),{next(){const{value:h,done:v}=d.next();return v?{value:h,done:v}:{value:l?[u(h[0]),u(h[1])]:u(h),done:v}}})}}function en(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function wo(e,t){const n={get(r){const i=this.__v_raw,o=$(i),l=$(r);e||(le(r,l)&&ae(o,"get",r),ae(o,"get",l));const{has:f}=Qt(o),d=t?os:e?it:Ae;if(f.call(o,r))return d(i.get(r));if(f.call(o,l))return d(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&ae($(r),"iterate",yt),r.size},has(r){const i=this.__v_raw,o=$(i),l=$(r);return e||(le(r,l)&&ae(o,"has",r),ae(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,f=$(l),d=t?os:e?it:Ae;return!e&&ae(f,"iterate",yt),l.forEach((u,h)=>r.call(i,d(u),d(h),o))}};return ee(n,e?{add:en("add"),set:en("set"),delete:en("delete"),clear:en("clear")}:{add(r){const i=$(this),o=Qt(i),l=$(r),f=!t&&!Ce(r)&&!Ue(r)?l:r;return o.has.call(i,f)||le(r,f)&&o.has.call(i,r)||le(l,f)&&o.has.call(i,l)||(i.add(f),ze(i,"add",f,f)),this},set(r,i){!t&&!Ce(i)&&!Ue(i)&&(i=$(i));const o=$(this),{has:l,get:f}=Qt(o);let d=l.call(o,r);d||(r=$(r),d=l.call(o,r));const u=f.call(o,r);return o.set(r,i),d?le(i,u)&&ze(o,"set",r,i):ze(o,"add",r,i),this},delete(r){const i=$(this),{has:o,get:l}=Qt(i);let f=o.call(i,r);f||(r=$(r),f=o.call(i,r)),l&&l.call(i,r);const d=i.delete(r);return f&&ze(i,"delete",r,void 0),d},clear(){const r=$(this),i=r.size!==0,o=r.clear();return i&&ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Co(r,e,t)}),n}function In(e,t){const n=wo(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_isShallow"?t:r==="__v_raw"?s:Reflect.get(K(n,r)&&r in s?n:s,r,i)}const To={get:In(!1,!1)},Eo={get:In(!1,!0)},Ao={get:In(!0,!1)},Oo={get:In(!0,!0)},Wr=new WeakMap,kr=new WeakMap,qr=new WeakMap,Gr=new WeakMap;function Mo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ts(e){return Ue(e)?e:Rn(e,!1,bo,To,Wr)}function Po(e){return Rn(e,!1,xo,Eo,kr)}function ls(e){return Rn(e,!0,vo,Ao,qr)}function zf(e){return Rn(e,!0,So,Oo,Gr)}function Rn(e,t,n,s,r){if(!B(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const i=r.get(e);if(i)return i;const o=Mo(Xi(e));if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function st(e){return Ue(e)?st(e.__v_raw):!!(e&&e.__v_isReactive)}function Ue(e){return!!(e&&e.__v_isReadonly)}function Ce(e){return!!(e&&e.__v_isShallow)}function Nn(e){return e?!!e.__v_raw:!1}function $(e){const t=e&&e.__v_raw;return t?$(t):e}function Io(e){return!K(e,"__v_skip")&&Object.isExtensible(e)&&Er(e,"__v_skip",!0),e}const Ae=e=>B(e)?Ts(e):e,it=e=>B(e)?ls(e):e;function se(e){return e?e.__v_isRef===!0:!1}function Ro(e){return zr(e,!1)}function No(e){return zr(e,!0)}function zr(e,t){return se(e)?e:new Fo(e,t)}class Fo{constructor(t,n){this.dep=new Mn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:$(t),this._value=n?t:Ae(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ce(t)||Ue(t);t=s?t:$(t),le(t,n)&&(this._rawValue=t,this._value=s?t:Ae(t),this.dep.trigger())}}function Es(e){return se(e)?e.value:e}function Jf(e){return N(e)?e():Es(e)}const Lo={get:(e,t,n)=>t==="__v_raw"?e:Es(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return se(r)&&!se(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Jr(e){return st(e)?e:new Proxy(e,Lo)}class Do{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Mn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Vo(e){return new Do(e)}class $o{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=we(n)?n:String(n),this._raw=$(t);let r=!0,i=t;if(!A(t)||we(this._key)||!wn(this._key))do r=!Nn(i)||Ce(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Es(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&se(this._raw[this._key])){const n=this._object[this._key];if(se(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return go(this._raw,this._key)}}class jo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Yf(e,t,n){return se(e)?e:N(e)?new jo(e):B(e)&&arguments.length>1?Ho(e,t,n):Ro(e)}function Ho(e,t,n){return new $o(e,t,n)}class Ko{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Mn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ht-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Y!==this)return Nr(this,!0),!0}get value(){const t=this.dep.track();return Dr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Bo(e,t,n=!1){let s,r;return N(e)?s=e:(s=e.get,r=e.set),new Ko(s,r,n)}const tn={},cn=new WeakMap;let ht;function Uo(e,t=!1,n=ht){if(n){let s=cn.get(n);s||cn.set(n,s=[]),s.push(e)}}function Wo(e,t,n=j){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:f}=n,d=O=>r?O:Ce(O)||r===!1||r===0?Je(O,1):Je(O);let u,h,v,y,I=!1,E=!1;if(se(e)?(h=()=>e.value,I=Ce(e)):st(e)?(h=()=>d(e),I=!0):A(e)?(E=!0,I=e.some(O=>st(O)||Ce(O)),h=()=>e.map(O=>{if(se(O))return O.value;if(st(O))return d(O);if(N(O))return f?f(O,2):O()})):N(e)?t?h=f?()=>f(e,2):e:h=()=>{if(v){Ke();try{v()}finally{Be()}}const O=ht;ht=u;try{return f?f(e,3,[y]):e(y)}finally{ht=O}}:h=He,t&&r){const O=h,q=r===!0?1/0:r;h=()=>Je(O(),q)}const H=ao(),U=()=>{u.stop(),H&&H.active&&bs(H.effects,u)};if(i&&t){const O=t;t=(...q)=>{try{return O(...q)}finally{U()}}}let L=E?new Array(e.length).fill(tn):tn;const D=O=>{if(!(!(u.flags&1)||!u.dirty&&!O))if(t){const q=u.run();if(O||r||I||(E?q.some((re,ge)=>le(re,L[ge])):le(q,L))){const re=ht;Ke();try{v&&v(),ht=u;const ge=[q,L===tn?void 0:E&&L[0]===tn?[]:L,y];L=q,f?f(t,3,ge):t(...ge)}finally{ht=re,Be()}}}else u.run()};return l&&l(D),u=new Ir(h),u.scheduler=o?()=>o(D,!1):D,y=O=>Uo(O,!1,u),v=u.onStop=()=>{const O=cn.get(u);if(O){if(f)f(O,4);else for(const q of O)q();cn.delete(u)}},t?s?D(!0):L=u.run():o?o(D.bind(null,!0),!0):u.run(),U.pause=u.pause.bind(u),U.resume=u.resume.bind(u),U.stop=U,U}function Je(e,t=1/0,n){if(t<=0||!B(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,se(e))Je(e.value,t,n);else if(A(e))for(let s=0;s<e.length;s++)Je(e[s],t,n);else if(vt(e)||nt(e))e.forEach(s=>{Je(s,t,n)});else if(Tr(e)){for(const s in e)Je(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Je(e[s],t,n)}return e}/**
10
+ * @vue/runtime-core v3.5.44
11
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
12
+ * @license MIT
13
+ **/function Jt(e,t,n,s){try{return s?e(...s):e()}catch(r){Fn(r,t,n)}}function Oe(e,t,n,s){if(N(e)){const r=Jt(e,t,n,s);return r&&Cr(r)&&r.catch(i=>{Fn(i,t,n)}),r}if(A(e)){const r=[];for(let i=0;i<e.length;i++)r.push(Oe(e[i],t,n,s));return r}}function Fn(e,t,n,s=!0){const r=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||j;if(t){let l=t.parent;const f=t.proxy,d=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const u=l.ec;if(u){for(let h=0;h<u.length;h++)if(u[h](e,f,d)===!1)return}l=l.parent}if(i){Ke(),Jt(i,null,10,[e,f,d]),Be();return}}ko(e,n,r,s,o)}function ko(e,t,n,s=!0,r=!1){if(r)throw e;console.error(e)}const _e=[];let Pe=-1;const $e=[];let tt=null,Ct=0;const Yr=Promise.resolve();let un=null;function Xr(e){const t=un||Yr;return e?t.then(this?e.bind(this):e):t}function qo(e){let t=Pe+1,n=_e.length;for(;t<n;){const s=t+n>>>1,r=_e[s],i=Bt(r);i<e||i===e&&r.flags&2?t=s+1:n=s}return t}function As(e){if(!(e.flags&1)){const t=Bt(e),n=_e[_e.length-1];!n||!(e.flags&2)&&t>=Bt(n)?_e.push(e):_e.splice(qo(t),0,e),e.flags|=1,Zr()}}function Zr(){un||(un=Yr.then(ti))}function Go(e){if(!A(e))tt&&e.id===-1?tt.splice(Ct+1,0,e):e.flags&1||($e.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)$e.push(e[t]);Zr()}function Qr(e,t,n,s=Pe+1){for(;s<_e.length;s++){const r=_e[s];if(r&&r.flags&2){if(e&&r.id!==e.uid||t!==void 0&&!(r.id>=t))continue;_e.splice(s,1),s=e?s-1:Pe,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function ei(e,t,n=0){if($e.length){let s=$e,r=0;if(t){s=[];for(let o=0;o<$e.length;o++){const l=$e[o];(l.i!==void 0?!l.i||l.i.uid<n:t.has(l))?$e[r++]=l:s.push(l)}}const i=[...new Set(s)].sort((o,l)=>Bt(o)-Bt(l));if($e.length=r,tt){for(let o=0;o<i.length;o++)tt.push(i[o]);return}for(tt=i,Ct=0;Ct<tt.length;Ct++){const o=tt[Ct];o.flags&4&&(o.flags&=-2),o.flags&8||o(),o.flags&=-2}tt=null,Ct=0}}let zn=!1;function zo(e,t){if(zn){e();return}const n=t===void 0?void 0:new Set($e);e(),zn=!0;try{Qr(void 0,t),ei(void 0,n,t)}finally{zn=!1}}const Bt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function ti(e){try{for(Pe=0;Pe<_e.length;Pe++){const t=_e[Pe];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Jt(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Pe<_e.length;Pe++){const t=_e[Pe];t&&(t.flags&=-2)}Pe=-1,_e.length=0,ei(),un=null,(_e.length||$e.length)&&ti()}}let fe=null,ni=null;function an(e){const t=fe;return fe=e,ni=e&&e.type.__scopeId||null,t}function Jo(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&mn(-1);const i=an(t),o=Ye.length;let l;try{l=e(...r)}finally{for(let f=Ye.length;f>o;f--)Is();an(i),s._d&&mn(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function Xf(e,t){if(fe===null)return e;const n=Kn(fe),s=e.dirs||(e.dirs=[]);for(let r=0;r<t.length;r++){let[i,o,l,f=j]=t[r];i&&(N(i)&&(i={mounted:i,updated:i}),i.deep&&Je(o),s.push({dir:i,instance:n,value:o,oldValue:void 0,arg:l,modifiers:f}))}return e}function ut(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o<r.length;o++){const l=r[o];i&&(l.oldValue=i[o].value);let f=l.dir[s];f&&(Ke(),Oe(f,n,8,[e.el,l,e,t]),Be())}}function Yo(e,t){if(he){let n=he.provides;const s=he.parent&&he.parent.provides;s===n&&(n=he.provides=Object.create(s)),n[e]=t}}function on(e,t,n=!1){const s=xt();if(s||bt){let r=bt?bt._context.provides:s?s.parent==null||s.ce?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(r&&e in r)return r[e];if(arguments.length>1)return n&&N(t)?t.call(s&&s.proxy):t}}function Zf(){return!!(xt()||bt)}const Xo=Symbol.for("v-scx"),Zo=()=>on(Xo);function Qf(e,t){return Ln(e,null,t)}function Qo(e,t){return Ln(e,null,{flush:"sync"})}function Jn(e,t,n){return Ln(e,t,n)}function Ln(e,t,n=j){const{immediate:s,deep:r,flush:i,once:o}=n,l=ee({},n),f=t&&s||!t&&i!=="post";let d;if(Gt){if(i==="sync"){const y=Zo();d=y.__watcherHandles||(y.__watcherHandles=[])}else if(!f){const y=()=>{};return y.stop=He,y.resume=He,y.pause=He,y}}const u=he;l.call=(y,I,E)=>Oe(y,u,I,E);let h=!1;i==="post"?l.scheduler=y=>{y.i=u,ve(y,u&&u.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(y,I)=>{I?y():As(y)}),l.augmentJob=y=>{t&&(y.flags|=4),h&&(y.flags|=2,u&&(y.id=u.uid,y.i=u))};const v=Wo(e,t,l);return Gt&&(d?d.push(v):f&&v()),v}function el(e,t,n){const s=this.proxy,r=X(e)?e.includes(".")?si(s,e):()=>s[e]:e.bind(s,s);let i;N(t)?i=t:(i=t.handler,n=t);const o=Yt(this),l=Ln(r,i.bind(s),n);return o(),l}function si(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r<n.length&&s;r++)s=s[n[r]];return s}}const tl=Symbol("_vte"),Dn=e=>e.__isTeleport,Ee=Symbol("_leaveCb"),It=Symbol("_enterCb");function ri(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ui(()=>{e.isMounted=!0}),di(()=>{e.isUnmounting=!0}),e}const Te=[Function,Array],ii={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Te,onEnter:Te,onAfterEnter:Te,onEnterCancelled:Te,onBeforeLeave:Te,onLeave:Te,onAfterLeave:Te,onLeaveCancelled:Te,onBeforeAppear:Te,onAppear:Te,onAfterAppear:Te,onAppearCancelled:Te},nl={name:"BaseTransition",props:ii,setup(e,{slots:t}){const n=xt(),s=ri();return()=>{const r=t.default&&Os(t.default(),!0),i=r&&r.length?oi(r):n.subTree?Wl():void 0;if(!i)return;const o=$(e),{mode:l}=o;if(s.isLeaving)return Yn(i);const f=dn(i);if(!f)return Yn(i);let d=Ut(f,o,s,n,h=>d=h);f.type!==ce&&ot(f,d);let u=n.subTree&&dn(n.subTree);if(u&&u.type!==ce&&!pt(u,f)&&Wt(n.subTree)){let h=Ut(u,o,s,n);if(ot(u,h),l==="out-in"&&f.type!==ce)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,u=void 0},Yn(i);l==="in-out"&&f.type!==ce?h.delayLeave=(v,y,I)=>{const E=li(s,u);E[String(u.key)]=u,v[Ee]=()=>{y(),v[Ee]=void 0,delete d.delayedLeave,u=void 0},d.delayedLeave=()=>{I(),delete d.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return i}}};function oi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ce){t=n;break}}return t}const sl=nl;function li(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Ut(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:f,onEnter:d,onAfterEnter:u,onEnterCancelled:h,onBeforeLeave:v,onLeave:y,onAfterLeave:I,onLeaveCancelled:E,onBeforeAppear:H,onAppear:U,onAfterAppear:L,onAppearCancelled:D}=t,O=String(e.key),q=li(n,e),re=(F,W)=>{F&&Oe(F,s,9,W)},ge=(F,W)=>{const Z=W[1];re(F,W),A(F)?F.every(T=>T.length<=1)&&Z():F.length<=1&&Z()},be={mode:o,persisted:l,beforeEnter(F){let W=f;if(!n.isMounted)if(i)W=H||f;else return;F[Ee]&&F[Ee](!0);const Z=q[O];if(Z&&pt(e,Z)){let T=Z.el[Ee];if(!T){const G=Wt(Z);T=G&&G.el[Ee]}T&&T()}re(W,[F])},enter(F){if(q[O]===e)return;let W=d,Z=u,T=h;if(!n.isMounted)if(i)W=U||d,Z=L||u,T=D||h;else return;let G=!1;F[It]=We=>{G||(G=!0,We?re(T,[F]):re(Z,[F]),be.delayedLeave&&be.delayedLeave(),F[It]=void 0)};const ue=F[It].bind(null,!1);W?ge(W,[F,ue]):ue()},leave(F,W){const Z=String(e.key);if(F[It]&&F[It](!0),n.isUnmounting)return W();re(v,[F]);let T=!1;F[Ee]=ue=>{T||(T=!0,W(),ue?re(E,[F]):re(I,[F]),F[Ee]=void 0,q[Z]===e&&delete q[Z])};const G=F[Ee].bind(null,!1);q[Z]=e,y?ge(y,[F,G]):G()},clone(F){const W=Ut(F,t,n,s,r);return r&&r(W),W}};return be}function Yn(e){if(Vn(e))return e=lt(e),e.children=null,e}function dn(e){if(!Vn(e))return Dn(e.type)&&e.children?oi(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&N(n.default))return n.default()}}function ot(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;ot(Dn(n.type)&&dn(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===de&&A(e.children)){const n=xi(e.children,!1);n&&ot(n,t)}}function Os(e,t=!1,n){let s=[],r=0;for(let i=0;i<e.length;i++){let o=e[i];const l=n==null?o.key:String(n)+String(o.key!=null?o.key:i);o.type===de?(o.patchFlag&128&&r++,s=s.concat(Os(o.children,t,l))):(t||o.type!==ce)&&s.push(l!=null?lt(o,{key:l}):o)}if(r>1)for(let i=0;i<s.length;i++)s[i].patchFlag=-2;return s}function Wt(e){if(e.component)return Wt(e.component.subTree);if(e.type===de){const t=A(e.children)&&xi(e.children,!1);return t?Wt(t):void 0}if(e.type!==ce)return e}function ec(e,t){return N(e)?ee({name:e.name},t,{setup:e}):e}function fi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function tc(e){const t=xt(),n=No(null);if(t){const r=t.refs===j?t.refs={}:t.refs;Object.defineProperty(r,e,{enumerable:!0,get:()=>n.value,set:i=>n.value=i})}return n}function ks(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const hn=new WeakMap;function $t(e,t,n,s,r=!1){if(A(e)){e.forEach((E,H)=>$t(E,t&&(A(t)?t[H]:t),n,s,r));return}if(wt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&$t(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Kn(s.component):s.el,o=r?null:i,{i:l,r:f}=e,d=t&&t.r,u=l.refs===j?l.refs={}:l.refs,h=l.setupState,v=$(h),y=h===j?Sr:E=>ks(u,E)?!1:K(v,E),I=(E,H)=>!(H&&ks(u,H));if(d!=null&&d!==f){if(qs(t),X(d))u[d]=null,y(d)&&(h[d]=null);else if(se(d)){const E=t;I(d,E.k)&&(d.value=null),E.k&&(u[E.k]=null)}}if(N(f))Jt(f,l,12,[o,u]);else{const E=X(f),H=se(f);if(E||H){const U=()=>{if(e.f){const L=E?y(f)?h[f]:u[f]:I()||!e.k?f.value:u[e.k];if(r)A(L)&&bs(L,i);else if(A(L))L.includes(i)||L.push(i);else if(E)u[f]=[i],y(f)&&(h[f]=u[f]);else{const D=[i];I(f,e.k)&&(f.value=D),e.k&&(u[e.k]=D)}}else E?(u[f]=o,y(f)&&(h[f]=o)):H&&(I(f,e.k)&&(f.value=o),e.k&&(u[e.k]=o))};if(o){const L=()=>{U(),hn.delete(e)};L.id=-1,hn.set(e,L),ve(L,n)}else qs(e),U()}}}function qs(e){const t=hn.get(e);t&&(t.flags|=8,hn.delete(e))}On().requestIdleCallback;On().cancelIdleCallback;const wt=e=>!!e.type.__asyncLoader,Vn=e=>e.type.__isKeepAlive;function rl(e,t){ci(e,"a",t)}function il(e,t){ci(e,"da",t)}function ci(e,t,n=he){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if($n(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Vn(r.parent.vnode)&&ol(s,t,n,r),r=r.parent}}function ol(e,t,n,s){const r=$n(t,e,s,!0);hi(()=>{bs(s[t],r)},n)}function $n(e,t,n=he,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ke();const l=Yt(n),f=Oe(t,n,e,o);return l(),Be(),f});return s?r.unshift(i):r.push(i),i}}const Ze=e=>(t,n=he)=>{(!Gt||e==="sp")&&$n(e,(...s)=>t(...s),n)},ll=Ze("bm"),ui=Ze("m"),fl=Ze("bu"),ai=Ze("u"),di=Ze("bum"),hi=Ze("um"),cl=Ze("sp"),ul=Ze("rtg"),al=Ze("rtc");function dl(e,t=he){$n("ec",e,t)}const hl="components",pi=Symbol.for("v-ndc");function nc(e){return X(e)?pl(hl,e,!1)||e:e||pi}function pl(e,t,n=!0,s=!1){const r=fe||he;if(r){const i=r.type;{const l=Zl(i,!1);if(l&&(l===t||l===pe(t)||l===En(pe(t))))return i}const o=Gs(r[e]||i[e],t)||Gs(r.appContext[e],t);return!o&&s?i:o}}function Gs(e,t){return e&&(e[t]||e[pe(t)]||e[En(pe(t))])}function sc(e,t,n,s){let r;const i=n,o=A(e);if(o||X(e)){const l=o&&st(e);let f=!1,d=!1;l&&(f=!Ce(e),d=Ue(e),e=Pn(e)),r=new Array(e.length);for(let u=0,h=e.length;u<h;u++)r[u]=t(f?d?it(Ae(e[u])):Ae(e[u]):e[u],u,void 0,i)}else if(typeof e=="number")if(!Number.isInteger(e)||e<0)r=[];else{r=new Array(e);for(let l=0;l<e;l++)r[l]=t(l+1,l,void 0,i)}else if(B(e))if(e[Symbol.iterator])r=Array.from(e,(l,f)=>t(l,f,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let f=0,d=l.length;f<d;f++){const u=l[f];r[f]=t(e[u],u,f,i)}}else r=[];return r}function rc(e,t){for(let n=0;n<t.length;n++){const s=t[n];if(A(s))for(let r=0;r<s.length;r++)e[s[r].name]=s[r].fn;else s&&(e[s.name]=s.key?(...r)=>{const i=s.fn(...r);return i&&(i.key=s.key),i}:s.fn)}return e}function ic(e,t,n,s,r,i){if(n==null&&(n={}),fe.ce||fe.parent&&wt(fe.parent)&&fe.parent.ce){const d=n,u=Object.keys(d).length>0;return t!=="default"&&(d.name=t),hs(),ps(de,null,[ye("slot",d,s)],u?-2:64)}let o=e[t];o&&o._c&&(o._d=!1);const l=Ye.length;hs();let f;try{const d=o&&gi(o(n)),u=n.key||i||d&&d.key;f=ps(de,{key:(u&&!we(u)?u:`_${t}`)+(!d&&s?"_fb":"")},d||(s?s():[]),d&&e._===1?64:-2)}catch(d){for(let u=Ye.length;u>l;u--)Is();throw d}finally{o&&o._c&&(o._d=!0)}return!r&&f.scopeId&&(f.slotScopeIds=[f.scopeId+"-s"]),f}function gi(e){return e.some(t=>Tt(t)?!(t.type===ce||t.type===de&&!gi(t.children)):!0)?e:null}const fs=e=>e?$i(e)?Kn(e):fs(e.parent):null,jt=ee(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>fs(e.parent),$root:e=>fs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>_i(e),$forceUpdate:e=>e.f||(e.f=()=>{As(e.update)}),$nextTick:e=>e.n||(e.n=Xr.bind(e.proxy)),$watch:e=>el.bind(e)}),Xn=(e,t)=>e!==j&&!e.__isScriptSetup&&K(e,t),gl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:f}=e;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Xn(s,t))return o[t]=1,s[t];if(r!==j&&K(r,t))return o[t]=2,r[t];if(K(i,t))return o[t]=3,i[t];if(n!==j&&K(n,t))return o[t]=4,n[t];cs&&(o[t]=0)}}const d=jt[t];let u,h;if(d)return t==="$attrs"&&ae(e.attrs,"get",""),d(e);if((u=l.__cssModules)&&(u=u[t]))return u;if(n!==j&&K(n,t))return o[t]=4,n[t];if(h=f.config.globalProperties,K(h,t))return h[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Xn(r,t)?(r[t]=n,!0):s!==j&&K(s,t)?(s[t]=n,!0):K(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let f;return!!(n[l]||e!==j&&l[0]!=="$"&&K(e,l)||Xn(t,l)||K(i,l)||K(s,l)||K(jt,l)||K(r.config.globalProperties,l)||(f=o.__cssModules)&&f[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:K(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function oc(){return ml().attrs}function ml(e){const t=xt();return t.setupContext||(t.setupContext=Hi(t))}function pn(e){return A(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function lc(e,t){return!e||!t?e||t:A(e)&&A(t)?e.concat(t):ee({},pn(e),pn(t))}let cs=!0;function _l(e){const t=_i(e),n=e.proxy,s=e.ctx;cs=!1,t.beforeCreate&&zs(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:f,inject:d,created:u,beforeMount:h,mounted:v,beforeUpdate:y,updated:I,activated:E,deactivated:H,beforeDestroy:U,beforeUnmount:L,destroyed:D,unmounted:O,render:q,renderTracked:re,renderTriggered:ge,errorCaptured:be,serverPrefetch:F,expose:W,inheritAttrs:Z,components:T,directives:G,filters:ue}=t;if(d&&yl(d,s,null),o)for(const Q in o){const J=o[Q];N(J)&&(s[Q]=J.bind(n))}if(r){const Q=r.call(n,n);B(Q)&&(e.data=Ts(Q))}if(cs=!0,i)for(const Q in i){const J=i[Q],ft=N(J)?J.bind(n,n):N(J.get)?J.get.bind(n,n):He,Xt=!N(J)&&N(J.set)?J.set.bind(n):He,ct=ef({get:ft,set:Xt});Object.defineProperty(s,Q,{enumerable:!0,configurable:!0,get:()=>ct.value,set:Me=>ct.value=Me})}if(l)for(const Q in l)mi(l[Q],s,n,Q);if(f){const Q=N(f)?f.call(n):f;Reflect.ownKeys(Q).forEach(J=>{Yo(J,Q[J])})}u&&zs(u,e,"c");function ie(Q,J){A(J)?J.forEach(ft=>Q(ft.bind(n))):J&&Q(J.bind(n))}if(ie(ll,h),ie(ui,v),ie(fl,y),ie(ai,I),ie(rl,E),ie(il,H),ie(dl,be),ie(al,re),ie(ul,ge),ie(di,L),ie(hi,O),ie(cl,F),A(W))if(W.length){const Q=e.exposed||(e.exposed={});W.forEach(J=>{Object.defineProperty(Q,J,{get:()=>n[J],set:ft=>n[J]=ft,enumerable:!0})})}else e.exposed||(e.exposed={});q&&e.render===He&&(e.render=q),Z!=null&&(e.inheritAttrs=Z),T&&(e.components=T),G&&(e.directives=G),F&&fi(e)}function yl(e,t,n=He){A(e)&&(e=us(e));for(const s in e){const r=e[s];let i;B(r)?"default"in r?i=on(r.from||s,r.default,!0):i=on(r.from||s):i=on(r),se(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function zs(e,t,n){Oe(A(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function mi(e,t,n,s){let r=s.includes(".")?si(n,s):()=>n[s];if(X(e)){const i=t[e];N(i)&&Jn(r,i)}else if(N(e))Jn(r,e.bind(n));else if(B(e))if(A(e))e.forEach(i=>mi(i,t,n,s));else{const i=N(e.handler)?e.handler.bind(n):t[e.handler];N(i)&&Jn(r,i,e)}}function _i(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let f;return l?f=l:!r.length&&!n&&!s?f=t:(f={},r.length&&r.forEach(d=>gn(f,d,o,!0)),gn(f,t,o)),B(t)&&i.set(t,f),f}function gn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&gn(e,i,n,!0),r&&r.forEach(o=>gn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=bl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const bl={data:Js,props:Ys,emits:Ys,methods:Nt,computed:Nt,beforeCreate:me,created:me,beforeMount:me,mounted:me,beforeUpdate:me,updated:me,beforeDestroy:me,beforeUnmount:me,destroyed:me,unmounted:me,activated:me,deactivated:me,errorCaptured:me,serverPrefetch:me,components:Nt,directives:Nt,watch:xl,provide:Js,inject:vl};function Js(e,t){return t?e?function(){return ee(N(e)?e.call(this,this):e,N(t)?t.call(this,this):t)}:t:e}function vl(e,t){return Nt(us(e),us(t))}function us(e){if(A(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function me(e,t){return e?[...new Set([].concat(e,t))]:t}function Nt(e,t){return e?ee(Object.create(null),e,t):t}function Ys(e,t){return e?A(e)&&A(t)?[...new Set([...e,...t])]:ee(Object.create(null),pn(e),pn(t??{})):t}function xl(e,t){if(!e)return t;if(!t)return e;const n=ee(Object.create(null),e);for(const s in t)n[s]=me(e[s],t[s]);return n}function yi(){return{app:null,config:{isNativeTag:Sr,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Sl=0;function Cl(e,t){return function(s,r=null){N(s)||(s=ee({},s)),r!=null&&!B(r)&&(r=null);const i=yi(),o=new WeakSet,l=[];let f=!1;const d=i.app={_uid:Sl++,_component:s,_props:r,_container:null,_context:i,_instance:null,version:nf,get config(){return i.config},set config(u){},use(u,...h){return o.has(u)||(u&&N(u.install)?(o.add(u),u.install(d,...h)):N(u)&&(o.add(u),u(d,...h))),d},mixin(u){return i.mixins.includes(u)||i.mixins.push(u),d},component(u,h){return h?(i.components[u]=h,d):i.components[u]},directive(u,h){return h?(i.directives[u]=h,d):i.directives[u]},mount(u,h,v){if(!f){const y=d._ceVNode||ye(s,r);return y.appContext=i,v===!0?v="svg":v===!1&&(v=void 0),e(y,u,v),f=!0,d._container=u,u.__vue_app__=d,Kn(y.component)}},onUnmount(u){l.push(u)},unmount(){f&&(Oe(l,d._instance,16),e(null,d._container),delete d._container.__vue_app__)},provide(u,h){return i.provides[u]=h,d},runWithContext(u){const h=bt;bt=d;try{return u()}finally{bt=h}}};return d}}let bt=null;function fc(e,t,n=j){const s=xt(),r=pe(t),i=Xe(t),o=bi(e,r),l=Vo((f,d)=>{let u,h=j,v;return Qo(()=>{const y=e[r];le(u,y)&&(u=y,d())}),{get(){return f(),n.get?n.get(u):u},set(y){const I=n.set?n.set(y):y;if(!le(I,u)&&!(h!==j&&le(y,h)))return;const E=s.vnode.props,H=!!(E&&(t in E||r in E||i in E)&&(`onUpdate:${t}`in E||`onUpdate:${r}`in E||`onUpdate:${i}`in E));H||(u=y,d()),s.emit(`update:${t}`,I),le(y,h)&&(le(y,I)&&!le(I,v)||H&&h!==j&&!le(I,u))&&d(),h=y,v=I}}});return l[Symbol.iterator]=()=>{let f=0;return{next(){return f<2?{value:f++?o||j:l,done:!1}:{done:!0}}}},l}const bi=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${pe(t)}Modifiers`]||e[`${Xe(t)}Modifiers`];function wl(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||j;let r=n;const i=t.startsWith("update:"),o=i&&bi(s,t.slice(7));o&&(o.trim&&(r=n.map(u=>X(u)?u.trim():u)),o.number&&(r=r.map(An)));let l,f=s[l=Un(t)]||s[l=Un(pe(t))];!f&&i&&(f=s[l=Un(Xe(t))]),f&&Oe(f,e,6,r);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Oe(d,e,6,r)}}const Tl=new WeakMap;function vi(e,t,n=!1){const s=n?Tl:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!N(e)){const f=d=>{const u=vi(d,t,!0);u&&(l=!0,ee(o,u))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!i&&!l?(B(e)&&s.set(e,null),null):(A(i)?i.forEach(f=>o[f]=null):ee(o,i),B(e)&&s.set(e,o),o)}function jn(e,t){return!e||!Sn(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),K(e,t[0].toLowerCase()+t.slice(1))||K(e,Xe(t))||K(e,t))}function Xs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:f,render:d,renderCache:u,props:h,data:v,setupState:y,ctx:I,inheritAttrs:E}=e,H=an(e);let U,L;try{if(n.shapeFlag&4){const O=r||s,q=O;U=je(d.call(q,O,u,h,y,v,I)),L=l}else{const O=t;U=je(O.length>1?O(h,{attrs:l,slots:o,emit:f}):O(h,null)),L=t.props?l:El(l)}}catch(O){Ye.length=0,Fn(O,e,1),U=ye(ce)}let D=U;if(L&&E!==!1){const O=Object.keys(L),{shapeFlag:q}=D;O.length&&q&7&&(i&&O.some(Cn)&&(L=Al(L,i)),D=lt(D,L,!1,!0))}if(n.dirs&&(D=lt(D,null,!1,!0),D.dirs=D.dirs?D.dirs.concat(n.dirs):n.dirs),n.transition){const O=Dn(D.type)&&dn(D)||D;ot(O,n.transition)}return U=D,an(H),U}function xi(e,t=!0){let n;for(let s=0;s<e.length;s++){const r=e[s];if(Tt(r)){if(r.type!==ce||r.children==="v-if"){if(n)return;n=r}}else return}return n}const El=e=>{let t;for(const n in e)(n==="class"||n==="style"||Sn(n))&&((t||(t={}))[n]=e[n]);return t},Al=(e,t)=>{const n={};for(const s in e)(!Cn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ol(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:f}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Zs(s,o,d):!!o;if(f&8){const u=t.dynamicProps;for(let h=0;h<u.length;h++){const v=u[h];if(Si(o,s,v)&&!jn(d,v))return!0}}}else return(r||l)&&(!l||!l.$stable)?!0:s===o?!1:s?o?Zs(s,o,d):!0:!!o;return!1}function Zs(e,t,n){const s=Object.keys(t);if(s.length!==Object.keys(e).length)return!0;for(let r=0;r<s.length;r++){const i=s[r];if(!K(e,i)||Si(t,e,i)&&!jn(n,i))return!0}return!1}function Si(e,t,n){const s=e[n],r=t[n];return n==="style"&&B(s)&&B(r)?!rt(s,r):s!==r}function Ml({vnode:e,parent:t,suspense:n},s){for(;t;){const r=t.subTree;if(r.suspense&&r.suspense.activeBranch===e&&(r.suspense.vnode.el=r.el=s,e=r),r===e)(e=t.vnode).el=s,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=s)}const Ci={},wi=()=>Object.create(Ci),Ti=e=>Object.getPrototypeOf(e)===Ci;function Pl(e,t,n,s=!1){const r={},i=wi();e.propsDefaults=Object.create(null),Ei(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Po(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Il(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=$(r),[f]=e.propsOptions;let d=!1;if((s||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let h=0;h<u.length;h++){let v=u[h];if(jn(e.emitsOptions,v))continue;const y=t[v];if(f)if(K(i,v))y!==i[v]&&(i[v]=y,d=!0);else{const I=pe(v);r[I]=as(f,l,I,y,e,!1)}else y!==i[v]&&(i[v]=y,d=!0)}}}else{Ei(e,t,r,i)&&(d=!0);let u;for(const h in l)(!t||!K(t,h)&&((u=Xe(h))===h||!K(t,u)))&&(f?n&&(n[h]!==void 0||n[u]!==void 0)&&(r[h]=as(f,l,h,void 0,e,!0)):delete r[h]);if(i!==l)for(const h in i)(!t||!K(t,h))&&(delete i[h],d=!0)}d&&ze(e.attrs,"set","")}function Ei(e,t,n,s){const[r,i]=e.propsOptions;let o=!1,l;if(t)for(let f in t){if(Lt(f))continue;const d=t[f];let u;r&&K(r,u=pe(f))?!i||!i.includes(u)?n[u]=d:(l||(l={}))[u]=d:jn(e.emitsOptions,f)||(!(f in s)||d!==s[f])&&(s[f]=d,o=!0)}if(i){const f=$(n),d=l||j;for(let u=0;u<i.length;u++){const h=i[u];n[h]=as(r,f,h,d[h],e,!K(d,h))}}return o}function as(e,t,n,s,r,i){const o=e[n];if(o!=null){const l=K(o,"default");if(l&&s===void 0){const f=o.default;if(o.type!==Function&&!o.skipFactory&&N(f)){const{propsDefaults:d}=r;if(n in d)s=d[n];else{const u=Yt(r);s=d[n]=f.call(null,t),u()}}else s=f;r.ce&&r.ce._setProp(n,s)}o[0]&&(i&&!l?s=!1:o[1]&&(s===""||s===Xe(n))&&(s=!0))}return s}const Rl=new WeakMap;function Ai(e,t,n=!1){const s=n?Rl:t.propsCache,r=s.get(e);if(r)return r;const i=e.props,o={},l=[];let f=!1;if(!N(e)){const u=h=>{f=!0;const[v,y]=Ai(h,t,!0);ee(o,v),y&&l.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!i&&!f)return B(e)&&s.set(e,mt),mt;if(A(i))for(let u=0;u<i.length;u++){const h=pe(i[u]);Qs(h)&&(o[h]=j)}else if(i)for(const u in i){const h=pe(u);if(Qs(h)){const v=i[u],y=o[h]=A(v)||N(v)?{type:v}:ee({},v),I=y.type;let E=!1,H=!0;if(A(I))for(let U=0;U<I.length;++U){const L=I[U],D=N(L)&&L.name;if(D==="Boolean"){E=!0;break}else D==="String"&&(H=!1)}else E=N(I)&&I.name==="Boolean";y[0]=E,y[1]=H,(E||K(y,"default"))&&l.push(h)}}const d=[o,l];return B(e)&&s.set(e,d),d}function Qs(e){return e[0]!=="$"&&!Lt(e)}const Ms=e=>e==="_"||e==="_ctx"||e==="$stable",Ps=e=>A(e)?e.map(je):[je(e)],Nl=(e,t,n)=>{if(t._n)return t;const s=Jo((...r)=>Ps(t(...r)),n);return s._c=!1,s},Oi=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Ms(r))continue;const i=e[r];if(N(i))t[r]=Nl(r,i,s);else if(i!=null){const o=Ps(i);t[r]=()=>o}}},Mi=(e,t)=>{const n=Ps(t);e.slots.default=()=>n},Pi=(e,t,n)=>{for(const s in t)(n||!Ms(s))&&(e[s]=t[s])},Fl=(e,t,n)=>{const s=e.slots=wi();if(e.vnode.shapeFlag&32){const r=t._;r?(Pi(s,t,n),n&&Er(s,"_",r,!0)):Oi(t,s)}else t&&Mi(e,t)},Ll=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=j;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Pi(r,t,n):(i=!t.$stable,Oi(t,r)),o=t}else t&&(Mi(e,t),o={default:1});if(i)for(const l in r)!Ms(l)&&o[l]==null&&delete r[l]},ve=Hl;function Dl(e){return Vl(e)}function Vl(e,t){const n=On();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:f,setText:d,setElementText:u,parentNode:h,nextSibling:v,setScopeId:y=He,insertStaticContent:I}=e,E=(c,a,p,b=null,m=null,_=null,C=void 0,S=null,x=!!a.dynamicChildren)=>{if(c===a)return;c&&!pt(c,a)&&(b=Zt(c),Me(c,m,_,!0),c=null),a.patchFlag===-2&&(x=!1,a.dynamicChildren=null),a.dynamicChildren&&c&&c.dynamicChildren&&c.dynamicChildren.hasOnce&&(a.dynamicChildren===mt&&(a.dynamicChildren=[]),a.dynamicChildren.hasOnce=!0);const{type:g,ref:M,shapeFlag:w}=a;switch(g){case Hn:H(c,a,p,b);break;case ce:U(c,a,p,b);break;case Qn:c==null&&L(a,p,b,C);break;case de:T(c,a,p,b,m,_,C,S,x);break;default:w&1?q(c,a,p,b,m,_,C,S,x):w&6?G(c,a,p,b,m,_,C,S,x):(w&64||w&128)&&g.process(c,a,p,b,m,_,C,S,x,Ot)}M!=null&&m?$t(M,c&&c.ref,_,a||c,!a):M==null&&c&&c.ref!=null&&$t(c.ref,null,_,c,!0)},H=(c,a,p,b)=>{if(c==null)s(a.el=l(a.children),p,b);else{const m=a.el=c.el;a.children!==c.children&&d(m,a.children)}},U=(c,a,p,b)=>{c==null?s(a.el=f(a.children||""),p,b):a.el=c.el},L=(c,a,p,b)=>{[c.el,c.anchor]=I(c.children,a,p,b,c.el,c.anchor)},D=({el:c,anchor:a},p,b)=>{let m;for(;c&&c!==a;)m=v(c),s(c,p,b),c=m;s(a,p,b)},O=({el:c,anchor:a})=>{let p;for(;c&&c!==a;)p=v(c),r(c),c=p;r(a)},q=(c,a,p,b,m,_,C,S,x)=>{if(a.type==="svg"?C="svg":a.type==="math"&&(C="mathml"),c==null)re(a,p,b,m,_,C,S,x);else{const g=c.el&&c.el._isVueCE?c.el:null;try{g&&g._beginPatch(),F(c,a,m,_,C,S,x)}finally{g&&g._endPatch()}}},re=(c,a,p,b,m,_,C,S)=>{let x,g;const{props:M,shapeFlag:w,transition:P,dirs:R}=c;if(x=c.el=o(c.type,_,M&&M.is,M),w&8?u(x,c.children):w&16&&be(c.children,x,null,b,m,Zn(c,_),C,S),R&&ut(c,null,b,"created"),ge(x,c,c.scopeId,C,b),M){for(const z in M)z!=="value"&&!Lt(z)&&i(x,z,null,M[z],_,b);"value"in M&&i(x,"value",null,M.value,_),(g=M.onVnodeBeforeMount)&&Le(g,b,c)}R&&ut(c,null,b,"beforeMount");const V=$l(m,P);V&&P.beforeEnter(x),s(x,a,p),((g=M&&M.onVnodeMounted)||V||R)&&ve(()=>{try{g&&Le(g,b,c),V&&P.enter(x),R&&ut(c,null,b,"mounted")}finally{}},m)},ge=(c,a,p,b,m)=>{if(p&&y(c,p),b)for(let _=0;_<b.length;_++)y(c,b[_]);if(m){let _=m.subTree;if(a===_||Ni(_.type)&&(_.ssContent===a||_.ssFallback===a)){const C=m.vnode;ge(c,C,C.scopeId,C.slotScopeIds,m.parent)}}},be=(c,a,p,b,m,_,C,S,x=0)=>{for(let g=x;g<c.length;g++){const M=c[g]=S?Ge(c[g]):je(c[g]);E(null,M,a,p,b,m,_,C,S)}},F=(c,a,p,b,m,_,C)=>{const S=a.el=c.el;let{patchFlag:x,dynamicChildren:g,dirs:M}=a;x|=c.patchFlag&16;const w=c.props||j,P=a.props||j;let R;if(p&&at(p,!1),(R=P.onVnodeBeforeUpdate)&&Le(R,p,a,c),M&&ut(a,c,p,"beforeUpdate"),p&&at(p,!0),g&&(!c.dynamicChildren||c.dynamicChildren.length!==g.length)&&(x=0,C=!1,g=null),(w.innerHTML&&P.innerHTML==null||w.textContent&&P.textContent==null)&&u(S,""),g?W(c.dynamicChildren,g,S,p,b,Zn(a,m),_):C||J(c,a,S,null,p,b,Zn(a,m),_,!1),x>0){if(x&16)Z(S,w,P,p,m);else if(x&2&&w.class!==P.class&&i(S,"class",null,P.class,m),x&4&&i(S,"style",w.style,P.style,m),x&8){const V=a.dynamicProps;for(let z=0;z<V.length;z++){const k=V[z],te=w[k],oe=P[k];(oe!==te||k==="value")&&i(S,k,te,oe,m,p)}}x&1&&c.children!==a.children&&u(S,a.children)}else!C&&g==null&&Z(S,w,P,p,m);((R=P.onVnodeUpdated)||M)&&ve(()=>{R&&Le(R,p,a,c),M&&ut(a,c,p,"updated")},b)},W=(c,a,p,b,m,_,C)=>{for(let S=0;S<a.length;S++){const x=c[S],g=a[S],M=x.el||ds(x),w=M&&(x.type===de||!pt(x,g)||x.shapeFlag&198)?h(M):p;E(x,g,w,null,b,m,_,C,!0)}},Z=(c,a,p,b,m)=>{if(a!==p){if(a!==j)for(const _ in a)!Lt(_)&&!(_ in p)&&i(c,_,a[_],null,m,b);for(const _ in p){if(Lt(_))continue;const C=p[_],S=a[_];C!==S&&_!=="value"&&i(c,_,S,C,m,b)}"value"in p&&i(c,"value",a.value,p.value,m)}},T=(c,a,p,b,m,_,C,S,x)=>{const g=a.el=c?c.el:l(""),M=a.anchor=c?c.anchor:l("");let{patchFlag:w,dynamicChildren:P,slotScopeIds:R}=a;R&&(S=S?S.concat(R):R),c==null?(s(g,p,b),s(M,p,b),be(a.children||[],p,M,m,_,C,S,x)):w>0&&w&64&&P&&c.dynamicChildren&&c.dynamicChildren.length===P.length?(W(c.dynamicChildren,P,p,m,_,C,S),(a.key!=null||m&&a===m.subTree)&&Ii(c,a,!0)):J(c,a,p,M,m,_,C,S,x)},G=(c,a,p,b,m,_,C,S,x)=>{a.slotScopeIds=S,c==null?a.shapeFlag&512?m.ctx.activate(a,p,b,C,x):ue(a,p,b,m,_,C,x):We(c,a,x)},ue=(c,a,p,b,m,_,C)=>{const S=c.component=zl(c,b,m);if(Vn(c)&&(S.ctx.renderer=Ot),Jl(S,!1,C),S.asyncDep){if(m&&m.registerDep(S,ie,C,_),!c.el){const x=S.subTree=ye(ce);U(null,x,a,p),c.placeholder=x.el}}else ie(S,c,a,p,m,_,C)},We=(c,a,p)=>{const b=a.component=c.component;if(Ol(c,a,p))if(b.asyncDep&&!b.asyncResolved){a.el=c.el,a.placeholder=c.placeholder,Q(b,a,p);return}else b.next=a,b.update();else a.el=c.el,a.placeholder=c.placeholder,b.vnode=a},ie=(c,a,p,b,m,_,C)=>{const S=()=>{if(c.isMounted){let{next:w,bu:P,u:R,parent:V,vnode:z}=c;{const Ne=Ri(c);if(Ne){w&&(w.el=z.el,Q(c,w,C)),Ne.asyncDep.then(()=>{ve(()=>{c.isUnmounted||g()},m)});return}}let k=w,te;at(c,!1),w?(w.el=z.el,Q(c,w,C)):w=z,P&&rn(P),(te=w.props&&w.props.onVnodeBeforeUpdate)&&Le(te,V,w,z),at(c,!0);const oe=Xs(c),Re=c.subTree;c.subTree=oe,E(Re,oe,h(Re.el),Zt(Re),c,m,_),w.el=oe.el,k===null&&Ml(c,oe.el),R&&ve(R,m),(te=w.props&&w.props.onVnodeUpdated)&&ve(()=>Le(te,V,w,z),m)}else{let w;const{el:P,props:R}=a,{bm:V,m:z,parent:k,root:te,type:oe}=c,Re=wt(a);at(c,!1),V&&rn(V),!Re&&(w=R&&R.onVnodeBeforeMount)&&Le(w,k,a),at(c,!0);{te.ce&&te.ce._hasShadowRoot()&&te.ce._injectChildStyle(oe,c.parent?c.parent.type:void 0);const Ne=c.subTree=Xs(c);E(null,Ne,p,b,c,m,_),a.el=Ne.el}if(z&&ve(z,m),!Re&&(w=R&&R.onVnodeMounted)){const Ne=a;ve(()=>Le(w,k,Ne),m)}(a.shapeFlag&256||k&&wt(k.vnode)&&k.vnode.shapeFlag&256)&&c.a&&ve(c.a,m),c.isMounted=!0,a=p=b=null}};c.scope.on();const x=c.effect=new Ir(S);c.scope.off();const g=c.update=x.run.bind(x),M=c.job=x.runIfDirty.bind(x);M.i=c,M.id=c.uid,x.scheduler=()=>As(M),at(c,!0),g()},Q=(c,a,p)=>{a.component=c;const b=c.vnode.props;c.vnode=a,c.next=null,Il(c,a.props,b,p),Ll(c,a.children,p),Ke(),Qr(c),Be()},J=(c,a,p,b,m,_,C,S,x=!1)=>{const g=c&&c.children,M=c?c.shapeFlag:0,w=a.children,{patchFlag:P,shapeFlag:R}=a;if(P>0){if(P&128){Xt(g,w,p,b,m,_,C,S,x);return}else if(P&256){ft(g,w,p,b,m,_,C,S,x);return}}R&8?(M&16&&At(g,m,_),w!==g&&u(p,w)):M&16?R&16?Xt(g,w,p,b,m,_,C,S,x):At(g,m,_,!0):(M&8&&u(p,""),R&16&&be(w,p,b,m,_,C,S,x))},ft=(c,a,p,b,m,_,C,S,x)=>{c=c||mt,a=a||mt;const g=c.length,M=a.length,w=Math.min(g,M);let P;for(P=0;P<w;P++){const R=a[P]=x?Ge(a[P]):je(a[P]);E(c[P],R,p,null,m,_,C,S,x)}g>M?At(c,m,_,!0,!1,w):be(a,p,b,m,_,C,S,x,w)},Xt=(c,a,p,b,m,_,C,S,x)=>{let g=0;const M=a.length;let w=c.length-1,P=M-1;for(;g<=w&&g<=P;){const R=c[g],V=a[g]=x?Ge(a[g]):je(a[g]);if(pt(R,V))E(R,V,p,null,m,_,C,S,x);else break;g++}for(;g<=w&&g<=P;){const R=c[w],V=a[P]=x?Ge(a[P]):je(a[P]);if(pt(R,V))E(R,V,p,null,m,_,C,S,x);else break;w--,P--}if(g>w){if(g<=P){const R=P+1,V=R<M?a[R].el:b;for(;g<=P;)E(null,a[g]=x?Ge(a[g]):je(a[g]),p,V,m,_,C,S,x),g++}}else if(g>P)for(;g<=w;)Me(c[g],m,_,!0),g++;else{const R=g,V=g,z=new Map;for(g=V;g<=P;g++){const xe=a[g]=x?Ge(a[g]):je(a[g]);xe.key!=null&&z.set(xe.key,g)}let k,te=0;const oe=P-V+1;let Re=!1,Ne=0;const Mt=new Array(oe);for(g=0;g<oe;g++)Mt[g]=0;for(g=R;g<=w;g++){const xe=c[g];if(te>=oe){Me(xe,m,_,!0);continue}let Fe;if(xe.key!=null)Fe=z.get(xe.key);else for(k=V;k<=P;k++)if(Mt[k-V]===0&&pt(xe,a[k])){Fe=k;break}Fe===void 0?Me(xe,m,_,!0):(Mt[Fe-V]=g+1,Fe>=Ne?Ne=Fe:Re=!0,E(xe,a[Fe],p,null,m,_,C,S,x),te++)}const Ls=Re?jl(Mt):mt;for(k=Ls.length-1,g=oe-1;g>=0;g--){const xe=V+g,Fe=a[xe],Ds=a[xe+1],Vs=xe+1<M?Ds.el||ds(Ds):b;Mt[g]===0?E(null,Fe,p,Vs,m,_,C,S,x):Re&&(k<0||g!==Ls[k]?ct(Fe,p,Vs,2):k--)}}},ct=(c,a,p,b,m=null)=>{const{el:_,type:C,transition:S,children:x,shapeFlag:g}=c;if(g&6){ct(c.component.subTree,a,p,b);return}if(g&128){c.suspense.move(a,p,b);return}if(g&64){C.move(c,a,p,Ot);return}if(C===de){s(_,a,p);for(let w=0;w<x.length;w++)ct(x[w],a,p,b);s(c.anchor,a,p);return}if(C===Qn){D(c,a,p);return}if(b!==2&&g&1&&S)if(b===0)S.persisted&&!_[Ee]?s(_,a,p):(S.beforeEnter(_),s(_,a,p),ve(()=>S.enter(_),m));else{const{leave:w,delayLeave:P,afterLeave:R}=S,V=()=>{c.ctx.isUnmounted?r(_):s(_,a,p)},z=()=>{const k=_._isLeaving||!!_[Ee];_._isLeaving&&_[Ee](!0),S.persisted&&!k?V():w(_,()=>{V(),R&&R()})};P?P(_,V,z):z()}else s(_,a,p)},Me=(c,a,p,b=!1,m=!1)=>{const{type:_,props:C,ref:S,children:x,dynamicChildren:g,shapeFlag:M,patchFlag:w,dirs:P,cacheIndex:R,memo:V}=c;if((w===-2||g&&g.hasOnce)&&(m=!1),S!=null&&(Ke(),$t(S,null,p,c,!0),Be()),R!=null&&(!c.ctx||c.ctx===a)&&(a.renderCache[R]=void 0),M&256){a.ctx.deactivate(c);return}const z=M&1&&P,k=!wt(c);let te;if(k&&(te=C&&C.onVnodeBeforeUnmount)&&Le(te,a,c),M&6)Ji(c.component,p,b);else{if(M&128){c.suspense.unmount(p,b);return}z&&ut(c,null,a,"beforeUnmount"),M&64?c.type.remove(c,a,p,Ot,b):g&&!g.hasOnce&&(_!==de||w>0&&w&64)?At(g,a,p,!1,!0):(_===de&&w&384||!m&&M&16)&&At(x,a,p),b&&Rs(c)}const oe=V!=null&&R==null;(k&&(te=C&&C.onVnodeUnmounted)||z||oe)&&ve(()=>{te&&Le(te,a,c),z&&ut(c,null,a,"unmounted"),oe&&(c.el=null)},p)},Rs=c=>{const{type:a,el:p,anchor:b,transition:m}=c,_=a===de;if(_&&!m){Ns(p,b);return}if(a===Qn){O(c),m&&!m.persisted&&m.afterLeave&&m.afterLeave();return}const C=_?Wt(c):c,S=()=>{_?h(p)&&Ns(p,b):r(p),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(C&&C.shapeFlag&1&&m&&!m.persisted){const{leave:x,delayLeave:g}=m,M=C.el,w=()=>x(M,S);g?g(M,S,w):w()}else S()},Ns=(c,a)=>{let p;for(;c!==a;)p=v(c),r(c),c=p;r(a)},Ji=(c,a,p)=>{const{bum:b,scope:m,job:_,subTree:C,um:S,m:x,a:g}=c;er(x),er(g),b&&rn(b),m.stop(),_?(_.flags|=8,Me(C,c,a,p)):c.vnode.el&&C&&(C.transition=c.vnode.transition,Me(C,c,a,p)),S&&ve(S,a),ve(()=>{c.isUnmounted=!0},a)},At=(c,a,p,b=!1,m=!1,_=0)=>{for(let C=_;C<c.length;C++)Me(c[C],a,p,b,m)},Zt=c=>{if(c.shapeFlag&6)return Zt(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const a=v(c.anchor||c.el),p=a&&a[tl];return p?v(p):a},Fs=(c,a,p)=>{const b=c&&a._vnode?void 0:c&&c.component?c.component.uid:Gl();zo(()=>{c==null?a._vnode&&Me(a._vnode,null,null,!0):E(a._vnode||null,c,a,null,null,null,p),a._vnode=c},b)},Ot={p:E,um:Me,m:ct,r:Rs,mt:ue,mc:be,pc:J,pbc:W,n:Zt,o:e};return{render:Fs,hydrate:void 0,createApp:Cl(Fs)}}function Zn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function at({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function $l(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ii(e,t,n=!1){const s=e.children,r=t.children;if(A(s)&&A(r))for(let i=0;i<s.length;i++){const o=s[i];let l=r[i];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=r[i]=Ge(r[i]),l.el=o.el),!n&&l.patchFlag!==-2&&Ii(o,l)),l.type===Hn&&(l.patchFlag===-1&&(l=r[i]=Ge(l)),l.el=o.el),l.type===ce&&!l.el&&(l.el=o.el)}}function jl(e){const t=e.slice(),n=[0];let s,r,i,o,l;const f=e.length;for(s=0;s<f;s++){const d=e[s];if(d!==0){if(r=n[n.length-1],e[r]<d){t[s]=r,n.push(s);continue}for(i=0,o=n.length-1;i<o;)l=i+o>>1,e[n[l]]<d?i=l+1:o=l;d<e[n[i]]&&(i>0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ri(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ri(t)}function er(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function ds(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?ds(t.subTree):null}const Ni=e=>e.__isSuspense;function Hl(e,t){t&&t.pendingBranch?A(e)?t.effects.push(...e):t.effects.push(e):Go(e)}const de=Symbol.for("v-fgt"),Hn=Symbol.for("v-txt"),ce=Symbol.for("v-cmt"),Qn=Symbol.for("v-stc"),Ye=[];let Se=null;function hs(e=!1){Ye.push(Se=e?null:[])}function Is(){Ye.pop(),Se=Ye[Ye.length-1]||null}let kt=1;function mn(e,t=!1){kt+=e,e<0&&Se&&t&&(Se.hasOnce=!0)}function Fi(e){return e.dynamicChildren=kt>0?Se||mt:null,Is(),kt>0&&Se&&Se.push(e),e}function cc(e,t,n,s,r,i){return Fi(Di(e,t,n,s,r,i,!0))}function ps(e,t,n,s,r){return Fi(ye(e,t,n,s,r,!0))}function Tt(e){return e?e.__v_isVNode===!0:!1}function pt(e,t){return e.type===t.type&&e.key===t.key}const Li=({key:e})=>e??null,ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?X(e)||se(e)||N(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function Di(e,t=null,n=null,s=0,r=null,i=e===de?0:1,o=!1,l=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Li(t),ref:t&&ln(t),scopeId:ni,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(_n(f,n),i&128&&e.normalize(f)):n&&(f.shapeFlag|=X(n)?8:16),kt>0&&!o&&Se&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&&Se.push(f),f}const ye=Kl;function Kl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===pi)&&(e=ce),Tt(e)){const l=lt(e,t,!0);return n&&_n(l,n),kt>0&&!i&&Se&&(l.shapeFlag&6?Se[Se.indexOf(e)]=l:Se.push(l)),l.patchFlag=-2,l}if(Ql(e)&&(e=e.__vccOpts),t){t=Bl(t);let{class:l,style:f}=t;l&&!X(l)&&(t.class=xs(l)),B(f)&&(Nn(f)&&!A(f)&&(f=ee({},f)),t.style=vs(f))}const o=X(e)?1:Ni(e)?128:Dn(e)?64:B(e)?4:N(e)?2:0;return Di(e,t,n,s,r,o,i,!0)}function Bl(e){return e?Nn(e)||Ti(e)?ee({},e):e:null}function lt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:f}=e,d=t?kl(r||{},t):r,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&Li(d),ref:t&&t.ref?n&&i?A(i)?i.concat(ln(t)):[i,ln(t)]:ln(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&lt(e.ssContent),ssFallback:e.ssFallback&&lt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return f&&s&&ot(u,f.clone(u)),u}function Ul(e=" ",t=0){return ye(Hn,null,e,t)}function Wl(e="",t=!1){return t?(hs(),ps(ce,null,e)):ye(ce,null,e)}function je(e){return e==null||typeof e=="boolean"?ye(ce):A(e)?ye(de,null,e.slice()):Tt(e)?Ge(e):ye(Hn,null,String(e))}function Ge(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:lt(e)}function _n(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(A(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),_n(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Ti(t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(N(t)){if(s&65){_n(e,{default:t});return}t={default:t,_ctx:fe},n=32}else t=String(t),s&64?(n=16,t=[Ul(t)]):n=8;e.children=t,e.shapeFlag|=n}function kl(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const r in s)if(r==="class")t.class!==s.class&&(t.class=xs([t.class,s.class]));else if(r==="style")t.style=vs([t.style,s.style]);else if(Sn(r)){const i=t[r],o=s[r];o&&i!==o&&!(A(i)&&i.includes(o))?t[r]=i?[].concat(i,o):o:o==null&&i==null&&!Cn(r)&&(t[r]=o)}else r!==""&&(t[r]=s[r])}return t}function Le(e,t,n,s=null){Oe(e,t,7,[n,s])}const ql=yi();let Vi=0;function Gl(){return Vi}function zl(e,t,n){const s=e.type,r=(t?t.appContext:e.appContext)||ql,i={uid:Vi++,vnode:e,type:s,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Pr(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ai(s,r),emitsOptions:vi(s,r),emit:null,emitted:null,propsDefaults:j,inheritAttrs:s.inheritAttrs,ctx:j,data:j,props:j,attrs:j,slots:j,refs:j,setupState:j,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=wl.bind(null,i),e.ce&&e.ce(i),i}let he=null;const xt=()=>he||fe;let yn,qt;{const e=On(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};yn=t("__VUE_INSTANCE_SETTERS__",n=>he=n),qt=t("__VUE_SSR_SETTERS__",n=>Gt=n)}const Yt=e=>{const t=he;return yn(e),e.scope.on(),()=>{e.scope.off(),yn(t)}},tr=()=>{he&&he.scope.off(),yn(null)};function $i(e){return e.vnode.shapeFlag&4}let Gt=!1;function Jl(e,t=!1,n=!1){t&&qt(t);const{props:s,children:r}=e.vnode,i=$i(e);Pl(e,s,i,t),Fl(e,r,n||t);const o=i?Yl(e,t):void 0;return t&&qt(!1),o}function Yl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,gl);const{setup:s}=n;if(s){Ke();const r=e.setupContext=s.length>1?Hi(e):null,i=Yt(e),o=Jt(s,e,0,[e.props,r]),l=Cr(o);if(Be(),i(),(l||e.sp)&&!wt(e)&&fi(e),l){if(o.then(tr,tr),t)return o.then(f=>{qt(!0);try{nr(e,f,t)}finally{qt(!1)}}).catch(f=>{Fn(f,e,0)});e.asyncDep=o}else nr(e,o)}else ji(e)}function nr(e,t,n){N(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:B(t)&&(e.setupState=Jr(t)),ji(e)}function ji(e,t,n){const s=e.type;e.render||(e.render=s.render||He);{const r=Yt(e);Ke();try{_l(e)}finally{Be(),r()}}}const Xl={get(e,t){return ae(e,"get",""),e[t]}};function Hi(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Xl),slots:e.slots,emit:e.emit,expose:t}}function Kn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Jr(Io(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in jt)return jt[n](e)},has(t,n){return n in t||n in jt}})):e.proxy}function Zl(e,t=!0){return N(e)?e.displayName||e.name:e.name||t&&e.__name}function Ql(e){return N(e)&&"__vccOpts"in e}const ef=(e,t)=>Bo(e,t,Gt);function tf(e,t,n){try{mn(-1);const s=arguments.length;return s===2?B(t)&&!A(t)?Tt(t)?ye(e,null,[t]):ye(e,t):ye(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Tt(n)&&(n=[n]),ye(e,t,n))}finally{mn(1)}}const nf="3.5.44";/**
14
+ * @vue/runtime-dom v3.5.44
15
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
16
+ * @license MIT
17
+ **/let gs;const sr=typeof window<"u"&&window.trustedTypes;if(sr)try{gs=sr.createPolicy("vue",{createHTML:e=>e})}catch{}const Ki=gs?e=>gs.createHTML(e):e=>e,sf="http://www.w3.org/2000/svg",rf="http://www.w3.org/1998/Math/MathML",qe=typeof document<"u"?document:null,rr=qe&&qe.createElement("template"),of={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?qe.createElementNS(sf,e):t==="mathml"?qe.createElementNS(rf,e):n?qe.createElement(e,{is:n}):qe.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>qe.createTextNode(e),createComment:e=>qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{rr.innerHTML=Ki(s==="svg"?`<svg>${e}</svg>`:s==="mathml"?`<math>${e}</math>`:e);const l=rr.content;if(s==="svg"||s==="mathml"){const f=l.firstChild;for(;f.firstChild;)l.appendChild(f.firstChild);l.removeChild(f)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Qe="transition",Rt="animation",Et=Symbol("_vtc"),Bi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ui=ee({},ii,Bi),lf=e=>(e.displayName="Transition",e.props=Ui,e),uc=lf((e,{slots:t})=>tf(sl,Wi(e),t)),dt=(e,t=[])=>{A(e)?e.forEach(n=>n(...t)):e&&e(...t)},ir=e=>e?A(e)?e.some(t=>t.length>1):e.length>1:!1;function Wi(e){const t={};for(const T in e)T in Bi||(t[T]=e[T]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:f=i,appearActiveClass:d=o,appearToClass:u=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,I=ff(r),E=I&&I[0],H=I&&I[1],{onBeforeEnter:U,onEnter:L,onEnterCancelled:D,onLeave:O,onLeaveCancelled:q,onBeforeAppear:re=U,onAppear:ge=L,onAppearCancelled:be=D}=t,F=(T,G,ue,We)=>{T._enterCancelled=We,et(T,G?u:l),et(T,G?d:o),ue&&ue()},W=(T,G)=>{T._isLeaving=!1,et(T,h),et(T,y),et(T,v),G&&G()},Z=T=>(G,ue)=>{const We=T?ge:L,ie=()=>F(G,T,ue);dt(We,[G,ie]),or(()=>{et(G,T?f:i),De(G,T?u:l),ir(We)||lr(G,s,E,ie)})};return ee(t,{onBeforeEnter(T){dt(U,[T]),De(T,i),De(T,o)},onBeforeAppear(T){dt(re,[T]),De(T,f),De(T,d)},onEnter:Z(!1),onAppear:Z(!0),onLeave(T,G){T._isLeaving=!0;const ue=()=>W(T,G);De(T,h),T._enterCancelled?(De(T,v),ms(T)):(ms(T),De(T,v)),or(()=>{T._isLeaving&&(et(T,h),De(T,y),ir(O)||lr(T,s,H,ue))}),dt(O,[T,ue])},onEnterCancelled(T){F(T,!1,void 0,!0),dt(D,[T])},onAppearCancelled(T){F(T,!0,void 0,!0),dt(be,[T])},onLeaveCancelled(T){W(T),dt(q,[T])}})}function ff(e){if(e==null)return null;if(B(e))return[es(e.enter),es(e.leave)];{const t=es(e);return[t,t]}}function es(e){return eo(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Et]||(e[Et]=new Set)).add(t)}function et(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Et];n&&(n.delete(t),n.size||(e[Et]=void 0))}function or(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let cf=0;function lr(e,t,n,s){const r=e._endId=++cf,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:f}=ki(e,t);if(!o)return s();const d=o+"end";let u=0;const h=()=>{e.removeEventListener(d,v),i()},v=y=>{y.target===e&&++u>=f&&h()};setTimeout(()=>{u<f&&h()},l+1),e.addEventListener(d,v)}function ki(e,t){const n=window.getComputedStyle(e),s=I=>(n[I]||"").split(", "),r=s(`${Qe}Delay`),i=s(`${Qe}Duration`),o=fr(r,i),l=s(`${Rt}Delay`),f=s(`${Rt}Duration`),d=fr(l,f);let u=null,h=0,v=0;t===Qe?o>0&&(u=Qe,h=o,v=i.length):t===Rt?d>0&&(u=Rt,h=d,v=f.length):(h=Math.max(o,d),u=h>0?o>d?Qe:Rt:null,v=u?u===Qe?i.length:f.length:0);const y=u===Qe&&/\b(?:transform|all)(?:,|$)/.test(s(`${Qe}Property`).toString());return{type:u,timeout:h,propCount:v,hasTransform:y}}function fr(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,s)=>cr(n)+cr(e[s])))}function cr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ms(e){return(e?e.ownerDocument:document).body.offsetHeight}function uf(e,t,n){const s=e[Et];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ur=Symbol("_vod"),qi=Symbol("_vsh"),af=Symbol(""),df=/(?:^|;)\s*display\s*:/;function hf(e,t,n){const s=e.style,r=X(n);let i=!1;if(n&&!r){if(t)if(X(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Ft(s,l,"")}else for(const o in t)n[o]==null&&Ft(s,o,"");for(const o in n){o==="display"&&(i=!0);const l=n[o];l!=null?gf(e,o,!X(t)&&t?t[o]:void 0,l)||Ft(s,o,l):Ft(s,o,"")}}else if(r){if(t!==n){const o=s[af];o&&(n+=";"+o),s.cssText=n,i=df.test(n)}}else t&&e.removeAttribute("style");ur in e&&((!r||t!==n)&&(e[ur]=i?s.display:""),e[qi]&&(s.display="none"))}const nn=/\s*!important$/;function Ft(e,t,n){if(A(n))n.forEach(s=>Ft(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))nn.test(n)?e.setProperty(t,n.replace(nn,""),"important"):e.setProperty(t,n);else{const s=pf(e,t);nn.test(n)?e.setProperty(Xe(s),n.replace(nn,""),"important"):e[s]=n}}const ar=["Webkit","Moz","ms"],ts={};function pf(e,t){const n=ts[t];if(n)return n;let s=pe(t);if(s!=="filter"&&s in e)return ts[t]=s;s=En(s);for(let r=0;r<ar.length;r++){const i=ar[r]+s;if(i in e)return ts[t]=i}return t}function gf(e,t,n,s){return e.tagName==="TEXTAREA"&&(t==="width"||t==="height")&&X(s)&&n===s}const dr="http://www.w3.org/1999/xlink";function hr(e,t,n,s,r,i=oo(t)){s&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(dr,t.slice(6,t.length)):e.setAttributeNS(dr,t,n):n==null||i&&!Ar(n)?e.removeAttribute(t):e.setAttribute(t,i?"":we(n)?String(n):n)}function pr(e,t,n,s,r){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Ki(n):n);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const l=i==="OPTION"?e.getAttribute("value")||"":e.value,f=n==null?e.type==="checkbox"?"on":"":String(n);(l!==f||!("_value"in e))&&(e.value=f),n==null&&e.removeAttribute(t),e._value=n;return}let o=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=Ar(n):n==null&&l==="string"?(n="",o=!0):l==="number"&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(r||t)}function gt(e,t,n,s){e.addEventListener(t,n,s)}function mf(e,t,n,s){e.removeEventListener(t,n,s)}const gr=Symbol("_vei");function _f(e,t,n,s,r=null){const i=e[gr]||(e[gr]={}),o=i[t];if(s&&o)o.value=s;else{const[l,f]=vf(t);if(s){const d=i[t]=Cf(s,r);gt(e,l,d,f)}else o&&(mf(e,l,o,f),i[t]=void 0)}}const yf=/(Once|Passive|Capture)$/,bf=/^on:?(?:Once|Passive|Capture)$/;function vf(e){let t,n;for(;(n=e.match(yf))&&!bf.test(e);)t||(t={}),e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===":"?e.slice(3):Xe(e.slice(2)),t]}let ns=0;const xf=Promise.resolve(),Sf=()=>ns||(xf.then(()=>ns=0),ns=Date.now());function Cf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const r=n.value;if(A(r)){const i=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{i.call(s),s._stopped=!0};const o=r.slice(),l=[s];for(let f=0;f<o.length&&!s._stopped;f++){const d=o[f];d&&Oe(d,t,5,l)}}else Oe(r,t,5,[s])};return n.value=e,n.attached=Sf(),n}const mr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,wf=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?uf(e,s,o):t==="style"?hf(e,n,s):Sn(t)?Cn(t)||_f(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Tf(e,t,s,o))?(pr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&hr(e,t,s,o,i,t!=="value")):e._isVueCE&&(Ef(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!X(s)))?pr(e,pe(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),hr(e,t,s,o))};function Tf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&mr(t)&&N(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return mr(t)&&X(n)?!1:t in e}function Ef(e,t){const n=e._def.props;if(!n)return!1;const s=pe(t);return Array.isArray(n)?n.some(r=>pe(r)===s):Object.keys(n).some(r=>pe(r)===s)}const Gi=new WeakMap,zi=new WeakMap,bn=Symbol("_moveCb"),_r=Symbol("_enterCb"),_s=new WeakMap,Af=e=>(delete e.props.mode,e),Of=Af({name:"TransitionGroup",props:ee({},Ui,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=xt(),s=ri();let r,i,o,l;const f=()=>(l===void 0&&(l=r.length>0&&Lf(r[0].el,n.vnode.el,yr(e))),l);return ai(()=>{if(_s.delete(n),!f()){r=[],o=void 0;return}const d=yr(e);r.forEach(Mf);const u=o&&Ff(o,n.vnode.el);o=void 0,r.forEach(v=>Pf(v,u));const h=r.filter(If);ms(n.vnode.el),h.forEach(v=>{const y=v.el,I=y.style;De(y,d),I.transform=I.webkitTransform=I.transitionDuration="";const E=y[bn]=H=>{H&&H.target!==y||(!H||H.propertyName.endsWith("transform"))&&(y.removeEventListener("transitionend",E),y[bn]=null,et(y,d))};y.addEventListener("transitionend",E)}),r=[]}),()=>{const d=$(e),u=Wi(d);let h=d.tag||de;if(r=[],l=void 0,i)for(let v=0;v<i.length;v++){const y=i[v];y.el&&y.el instanceof Element&&!y.el[qi]&&(r.push(y),ot(y,Ut(y,u,s,n)),Gi.set(y,Bn(y.el)))}i=t.default?Os(t.default()):[];for(let v=0;v<i.length;v++){const y=i[v];y.key!=null&&ot(y,Ut(y,u,s,n))}return r.length&&(o=Rf(n),_s.set(n,f)),ye(h,null,i)}}}),ac=Of;function Mf(e){const t=e.el;t[bn]&&t[bn](),t[_r]&&t[_r]()}function yr(e){return e.moveClass||`${e.name||"v"}-move`}function Pf(e,t){zi.set(e,Bn(e.el,t))}function If(e){const t=Gi.get(e),n=zi.get(e),s=t.left-n.left,r=t.top-n.top;if(s||r){const i=e.el,o=i.style,l=i.getBoundingClientRect();let f=1,d=1;return i.offsetWidth&&(f=l.width/i.offsetWidth),i.offsetHeight&&(d=l.height/i.offsetHeight),(!Number.isFinite(f)||f===0)&&(f=1),(!Number.isFinite(d)||d===0)&&(d=1),Math.abs(f-1)<.01&&(f=1),Math.abs(d-1)<.01&&(d=1),o.transform=o.webkitTransform=`translate(${s/f}px,${r/d}px)`,o.transitionDuration="0s",e}}function Bn(e,t){const n=e.getBoundingClientRect();return{left:n.left-(t?t.left:0),top:n.top-(t?t.top:0)}}function Rf(e){let t;for(let n=e.parent;n;n=n.parent){const s=_s.get(n);if(s){const r=Nf(n.vnode.el,e.vnode.el);r&&(t||(t=[])).push(ee(Bn(r),{item:r,willMove:s}))}}return t}function Nf(e,t){const n=e.nodeType===1?e:e.parentNode;for(;t&&t.parentNode!==n;)t=t.parentNode;if(t&&t.nodeType===1)return t}function Ff(e,t){const n=e.find(s=>s.willMove()&&s.item.contains(t));return n&&Bn(n.item,n)}function Lf(e,t,n){const s=e.cloneNode(),r=e[Et];r&&r.forEach(l=>{l.split(/\s+/).forEach(f=>f&&s.classList.remove(f))}),n.split(/\s+/).forEach(l=>l&&s.classList.add(l)),s.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(s);const{hasTransform:o}=ki(s);return i.removeChild(s),o}const vn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return A(t)?n=>rn(t,n):t};function Df(e){e.target.composing=!0}function br(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _t=Symbol("_assign"),sn=Symbol("_initialValue");function ss(e,t,n){return t&&(e=e.trim()),n&&(e=An(e)),e}const dc={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e.parentNode&&(e.type==="text"?e[sn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[sn]=e.defaultValue.replace(/\r\n?/g,`
18
+ `))),e[_t]=vn(r);const i=s||r.props&&r.props.type==="number";gt(e,t?"change":"input",o=>{o.target.composing||e[_t](ss(e.value,n,i))}),(n||i)&&gt(e,"change",()=>{e.value=ss(e.value,n,i)}),t||(gt(e,"compositionstart",Df),gt(e,"compositionend",br),gt(e,"change",br))},mounted(e,{value:t,modifiers:{trim:n,number:s}}){const r=t??"",i=e[sn];delete e[sn],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[_t](ss(e.value,n,s)):e.value=r},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[_t]=vn(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?An(e.value):e.value,f=t??"";if(l===f)return;const d=e.getRootNode();(d instanceof Document||d instanceof ShadowRoot)&&d.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===f)||(e.value=f)}},hc={deep:!0,created(e,{value:t,modifiers:{number:n}},s){e._modelValue=t,gt(e,"change",()=>{const r=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>n?An(xn(f)):xn(f)),i=e.multiple,o=i?vt(e._modelValue)?new Set(r):r:r[0],l=e._pendingValue=[i,i?A(o)?r.slice():r:o];try{e[_t](o)}finally{Xr(()=>{e._pendingValue===l&&(e._pendingValue=void 0)})}}),e[_t]=vn(s)},mounted(e,{value:t}){vr(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[_t]=vn(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Vf(t,n[1],n[0]))&&vr(e,t)}};function Vf(e,t,n){if(!n||A(e))return rt(e,t);if(vt(e)){if(e.size!==t.length)return!1;for(const s of t)if(!e.has(s))return!1;return!0}return!1}function vr(e,t){const n=e.multiple,s=A(t);if(!(n&&!s&&!vt(t))){for(let r=0,i=e.options.length;r<i;r++){const o=e.options[r],l=xn(o);if(n)if(s){const f=typeof l;f==="string"||f==="number"?o.selected=t.some(d=>String(d)===String(l)):o.selected=co(t,l)>-1}else o.selected=t.has(l);else if(rt(xn(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function xn(e){return"_value"in e?e._value:e.value}const $f=["ctrl","shift","alt","meta"],jf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$f.some(n=>e[`${n}Key`]&&!t.includes(n))},pc=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...i)=>{for(let o=0;o<t.length;o++){const l=jf[t[o]];if(l&&l(r,t))return}return e(r,...i)}))},Hf={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},gc=(e,t)=>{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const i=Xe(r.key);if(t.some(o=>o===i||Hf[o]===i))return e(r)}))},Kf=ee({patchProp:wf},of);let xr;function Bf(){return xr||(xr=Dl(Kf))}const mc=((...e)=>{const t=Bf().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wf(s);if(!r)return;const i=t._component;!N(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Uf(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t});function Uf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wf(e){return X(e)?document.querySelector(e):e}const _c=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n};export{mc as $,nc as A,ac as B,ce as C,Xr as D,Jf as E,cc as F,ye as G,de as H,sc as I,pc as J,Di as K,uo as L,Wl as M,xs as N,Ul as O,tc as P,vs as Q,fc as R,lc as S,uc as T,se as U,Xf as V,dc as W,gc as X,Qf as Y,rc as Z,_c as _,ic as a,hc as a0,zf as a1,No as a2,Vo as a3,Yf as a4,ls as a5,Zf as a6,ao as a7,Gf as a8,qf as a9,Ro as b,ef as c,ec as d,ui as e,hi as f,xt as g,il as h,on as i,rl as j,fl as k,ai as l,tf as m,kl as n,di as o,Yo as p,lt as q,Ts as r,Po as s,$ as t,oc as u,hs as v,Jn as w,ps as x,Jo as y,Es as z};
@@ -0,0 +1 @@
1
+ :root{--page-bg: #f3f4f8;--tip-bg: #1f2433;--tip-ink: #e8ecf5;--tip-edge: rgb(255 255 255 / 12%);--tip-shadow: rgb(0 0 0 / 45%);--motion-fast: .32s;--motion-base: .48s;--motion-slow: .64s;--motion-ease: cubic-bezier(.33, 1, .68, 1)}@media(prefers-reduced-motion:reduce){:root{--motion-fast: 0ms;--motion-base: 0ms;--motion-slow: 0ms}}@media(prefers-color-scheme:dark){:root{--page-bg: #0d0f13}}@media(prefers-color-scheme:light){:root{--tip-bg: #fff;--tip-ink: #1d2023;--tip-edge: #d3d6de;--tip-shadow: rgb(0 0 0 / 18%)}}.app{--md-primary: #2c5697;--md-on-primary: #fff;--md-primary-container: #d8e2ff;--md-on-primary-container: #001a41;--md-secondary-container: #dae2f9;--md-on-secondary-container: #131c2b;--md-tertiary-container: #c8f0ec;--md-on-tertiary-container: #00201e;--md-warn-container: #ffdea6;--md-on-warn-container: #271900;--md-error: #ba1a1a;--md-error-container: #ffdad6;--md-on-error-container: #410002;--md-surface: #f9f9ff;--md-s-low: #fff;--md-s: #f1f3f9;--md-s-high: #e7e9f0;--md-s-highest: #e0e2ea;--md-on-surface: #191c20;--md-on-surface-variant: #44474e;--md-outline: #74777f;--md-outline-variant: #d3d6de;--md-state: 25, 28, 32;--state-hover: rgb(var(--md-state), .08);--focus-ring: 2px solid var(--md-primary);--glass: 255, 255, 255;--glass-a: .52;--glass-edge: rgb(255 255 255 / 70%);--glass-hi: rgb(255 255 255 / 90%);--blob-1: rgb(44 86 151 / 30%);--blob-2: rgb(0 169 224 / 22%);--blob-3: rgb(23 223 220 / 16%);--md-font: roboto, inter, -apple-system, blinkmacsystemfont, "Segoe UI", system-ui, sans-serif;--md-r-card: 12px;--md-r-chip: 8px;--new: #5cc8f0;--new-bg: rgb(92 200 240 / 17%);--new-ink: #04222e;--new-edge: rgb(92 200 240 / 28%);--new-glow: rgb(92 200 240 / 45%);--move: #e0a030;--live-on: #2bb673;--live-off: #d6455d;--live-warn: #e0a030;--live-pulse-from: rgb(43 182 115 / 50%);--live-pulse-to: rgb(43 182 115 / 0%);--live-pulse-rest: rgb(43 182 115 / 60%)}@media(prefers-color-scheme:dark){.app{--md-primary: #adc6ff;--md-on-primary: #0f2f60;--md-primary-container: #2b4678;--md-on-primary-container: #d8e2ff;--md-secondary-container: #3e4759;--md-on-secondary-container: #dae2f9;--md-tertiary-container: #1f504c;--md-on-tertiary-container: #b4efe9;--md-warn-container: #5c4300;--md-on-warn-container: #ffdea6;--md-error: #ffb4ab;--md-error-container: #93000a;--md-on-error-container: #ffdad6;--md-surface: #111318;--md-s-low: #1b1e23;--md-s: #1f2227;--md-s-high: #292c32;--md-s-highest: #34373d;--md-on-surface: #e2e2e9;--md-on-surface-variant: #c4c6d0;--md-outline: #8e9099;--md-outline-variant: #3a3d44;--md-state: 226, 226, 233;--glass: 30, 34, 42;--glass-a: .74;--glass-edge: rgb(255 255 255 / 9%);--glass-hi: rgb(255 255 255 / 6%);--blob-1: rgb(44 86 151 / 55%);--blob-2: rgb(0 169 224 / 28%);--blob-3: rgb(23 223 220 / 14%)}}:root,.page,.page__mount,.app{height:100%;margin:0}:where(.page) button{box-sizing:content-box;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;letter-spacing:inherit;word-spacing:inherit;text-align:inherit;text-transform:inherit;text-indent:inherit;text-shadow:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.page{background:var(--page-bg);overflow:hidden}.page--scroll{overflow:auto}.dashboard{position:relative;isolation:isolate;box-sizing:border-box;display:grid;gap:12px;padding:14px;border-radius:20px;font-family:var(--md-font);color:var(--md-on-surface);font-size:14px;line-height:1.43;letter-spacing:.01em}.dashboard:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:20px;pointer-events:none;background:radial-gradient(60% 55% at 12% 8%,var(--blob-1),transparent 70%),radial-gradient(45% 50% at 92% 30%,var(--blob-2),transparent 70%),radial-gradient(55% 60% at 55% 105%,var(--blob-3),transparent 70%)}.dashboard__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;width:100%;height:100%;border-radius:20px;pointer-events:none}.dashboard a{color:var(--md-primary);text-decoration:none}.dashboard a:hover{text-decoration:underline;text-underline-offset:3px}.dashboard a:focus-visible{outline:var(--focus-ring);outline-offset:2px;border-radius:4px}.dashboard a.btn{text-decoration:none}.dashboard__layout{--strip-width: 48px;display:grid;gap:12px;grid-template-columns:minmax(0,1fr) var(--feed-width, 31%);align-items:start}.dashboard__main{display:grid;gap:12px;min-width:0}.dashboard__feed{position:sticky;top:12px;max-height:calc(100vh - 24px);display:flex;flex-direction:column}@media(min-width:901px){.dashboard.dashboard--fit{height:var(--dashboard-height, calc(100vh - 120px) );grid-template-rows:auto minmax(0,1fr);overflow:hidden}.dashboard--fit .dashboard__layout{min-height:0;height:100%;align-items:stretch}.dashboard--fit .dashboard__main{display:flex;flex-direction:column;gap:12px;min-height:0;overflow-y:auto;scrollbar-width:thin}.dashboard--fit .dashboard__main>.island{display:flex;flex-direction:column;min-height:0}.dashboard--fit .dashboard__move{flex:0 1 auto;max-height:60%}.dashboard--fit .dashboard__todo{flex:0 0 auto;max-height:30%}.dashboard--fit .dashboard__waiting{flex:1 1 0}.dashboard--fit .dashboard__main>.island:not(.island--collapsed){min-height:var(--island-floor, 5rem)}.dashboard--fit .dashboard__main>.island--sized:not(.island--collapsed){flex:0 0 var(--island-height);max-height:none}.dashboard--fit .dashboard__main>.dashboard__waiting.island--sized:not(.island--collapsed){flex-grow:1}.dashboard--fit .dashboard__feed{position:static;max-height:none;height:100%;min-height:0}}.dashboard--fit .dashboard__main:has(.dashboard__waiting.island--collapsed) .dashboard__move:not(.island--collapsed,.island--sized){max-height:none;flex:1 1 0}.dashboard--fit .dashboard__main:has(.dashboard__waiting.island--collapsed):has(.dashboard__move.island--collapsed) .dashboard__todo:not(.island--collapsed,.island--sized){max-height:none;flex:1 1 0}.dashboard--fit .dashboard__main>.island--collapsed{flex:0 0 auto;max-height:none}@media(min-width:901px){.dashboard__layout.dashboard__layout--feed-folded{grid-template-columns:minmax(0,1fr) var(--strip-width)}}@media(max-width:900px){.dashboard--fit .dashboard__feed.island--collapsed{height:auto;align-self:start}}@media(max-width:900px){.page{overflow:auto}.dashboard__layout{grid-template-columns:1fr}.dashboard__feed{position:static;max-height:none}}.island{position:relative;min-width:0;overflow:hidden;border:1px solid var(--glass-edge);border-radius:var(--md-r-card);background:rgb(var(--glass),var(--glass-a));-webkit-backdrop-filter:blur(8px) saturate(150%);backdrop-filter:blur(8px) saturate(150%);box-shadow:inset 0 1px 0 var(--glass-hi),0 8px 24px #0000002e}.fold-toggle{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;margin-left:6px;border-radius:50%;cursor:pointer;color:var(--md-on-surface-variant);font-size:18px;line-height:1;transition:transform var(--motion-fast) var(--motion-ease)}.fold-toggle:hover{background:var(--state-hover)}.fold-toggle--folded{transform:rotate(-90deg)}.count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;margin-left:6px;padding:0 6px;border-radius:10px;background:var(--md-s-high);color:var(--md-on-surface-variant);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums}.table{width:100%;border-collapse:collapse;font-size:14px}.table th{text-align:left;font-weight:500;color:var(--md-on-surface-variant);background:var(--md-s-low);font-size:12px;line-height:16px;letter-spacing:.03em;padding:8px 12px;border-bottom:1px solid var(--glass-edge);white-space:nowrap}.table td{padding:12px;border-bottom:1px solid var(--md-outline-variant);vertical-align:top}.table th:first-child,.table td:first-child{padding-left:20px}.table th:last-child,.table td:last-child{padding-right:20px}.table tbody tr:hover td{background:var(--state-hover)}.table tbody:last-of-type tr:last-child td{border-bottom:0}.table__actions-col{width:1%}.table__actions{white-space:nowrap}.table__actions>*{vertical-align:middle}.table__ai{margin-right:6px}@media(min-width:901px){.dashboard--fit .table thead th{position:sticky;top:0;z-index:1}}@media(prefers-reduced-transparency:reduce){.island,.table th{background:var(--md-s-low);-webkit-backdrop-filter:none;backdrop-filter:none}}.pill{display:inline-block;max-width:100%;height:24px;padding:0 10px;overflow:hidden;line-height:24px;text-overflow:ellipsis;border-radius:var(--md-r-chip);font-size:12px;font-weight:500;letter-spacing:.03em;white-space:nowrap;background:var(--md-s-high);color:var(--md-on-surface-variant);transition:background-color var(--motion-fast) var(--motion-ease),color var(--motion-fast) var(--motion-ease)}.pill--bad{background:var(--md-error-container);color:var(--md-on-error-container)}.pill--warn{background:var(--md-warn-container);color:var(--md-on-warn-container)}.pill--hold{background:var(--md-s-highest);color:var(--md-on-surface-variant);box-shadow:inset 0 0 0 1px var(--md-outline)}.pill--ok{background:var(--md-tertiary-container);color:var(--md-on-tertiary-container)}.pill--ready{background:var(--md-primary-container);color:var(--md-on-primary-container)}.pill--info{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.age{display:inline-flex;align-items:center;height:18px;padding:0 6px;border-radius:6px;font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--md-on-surface-variant);background:var(--md-s-high);cursor:help;white-space:nowrap}.age--old{color:var(--md-on-warn-container);background:var(--md-warn-container)}.handled-chip{display:inline-flex;align-items:center;height:18px;padding:0 7px;margin-left:6px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--md-s-highest);color:var(--md-on-surface-variant);vertical-align:middle}.at-you{display:inline-block;padding:1px 7px;border-radius:4px;font-size:11px;font-weight:800;letter-spacing:.03em;background:var(--md-warn-container);color:var(--md-on-warn-container)}.ticket-key{white-space:nowrap;font-variant-numeric:tabular-nums;font-weight:500}.timestamp{color:var(--md-on-surface-variant);white-space:nowrap;font-size:12px;font-variant-numeric:tabular-nums}.ai-hint{font-size:12px;opacity:.8}.hint-icon{display:inline-flex;align-items:center;justify-content:center;flex:none;box-sizing:border-box;width:16px;height:16px;padding:0;border:1px solid var(--md-outline);border-radius:50%;font-size:10px;font-weight:700;line-height:1;text-align:center;color:var(--md-on-surface-variant);cursor:pointer;-webkit-user-select:none;user-select:none}.hint-icon:hover,.hint-icon[aria-expanded=true]{color:var(--md-primary);border-color:var(--md-primary)}.hint-icon:focus-visible{outline:var(--focus-ring);outline-offset:2px}.hint-label{flex:none;padding:0 2px;color:var(--md-on-surface-variant);font-size:12px;text-decoration:underline dotted;text-underline-offset:3px;cursor:help}.hint-label:hover,.hint-label[aria-expanded=true]{color:var(--md-primary)}.hint-label:focus-visible{outline:var(--focus-ring);outline-offset:2px}.hint-row{display:flex;align-items:center;gap:6px;min-width:0}.empty{color:var(--md-on-surface-variant);font-size:14px;margin:12px 0 0;padding-bottom:14px}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}@media(max-width:640px){.hide-narrow{display:none}}.btn{display:inline-flex;align-items:center;height:32px;padding:0 14px;border:1px solid var(--md-outline);border-radius:999px;font-size:13px;font-weight:500;color:var(--md-primary);background:transparent;cursor:pointer;-webkit-user-select:none;user-select:none}.btn--tonal{background:var(--md-secondary-container);color:var(--md-on-secondary-container);border-color:transparent}.btn[aria-disabled=true]{opacity:.38;cursor:default;pointer-events:none}.btn:hover{box-shadow:inset 0 0 0 100px rgb(var(--md-state),.08)}.btn:focus-visible{outline:var(--focus-ring);outline-offset:2px}.btn--danger{color:var(--md-error);border-color:var(--md-error)}.input{font:inherit;font-size:13px;padding:7px 10px;border:1px solid var(--md-outline-variant);border-radius:8px;background:var(--md-s-low);color:var(--md-on-surface)}.input:focus{outline:var(--focus-ring);outline-offset:-1px;border-color:transparent}.input[aria-invalid=true]{border-color:var(--md-error)}.alert{margin:0 4px 8px;padding:8px 12px;border-radius:10px;font-size:13px;font-family:var(--md-font);background:var(--md-error-container);color:var(--md-on-error-container)}.alert__action{margin-left:8px;color:inherit;font-weight:600;text-decoration:underline;cursor:pointer}.alert--inline{margin:0 0 8px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;padding:24px;background:#00000073;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.modal__card{width:min(760px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--glass-edge);border-radius:16px;background:rgb(var(--glass),.9);-webkit-backdrop-filter:blur(24px) saturate(150%);backdrop-filter:blur(24px) saturate(150%);box-shadow:0 24px 64px #00000073}.modal__head{display:flex;align-items:center;gap:12px;padding:16px 20px;border-bottom:1px solid var(--md-outline-variant)}.modal__title{flex:1;min-width:0;margin:0;font-size:18px;font-weight:500}.modal__meta{color:var(--md-on-surface-variant);font-size:12px}.sheet-form{display:flex;flex-direction:column;gap:14px;padding:16px 20px 24px;overflow:auto;font-size:14px}.sheet-form__heading{margin:10px 0 0;font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--md-on-surface-variant)}.tippy-box[data-theme~=wt]{border:1px solid var(--tip-edge);border-radius:10px;background:var(--tip-bg);color:var(--tip-ink);box-shadow:0 12px 32px var(--tip-shadow);font:13px/1.5 Roboto,Inter,-apple-system,system-ui,sans-serif}.tippy-box[data-theme~=wt] .tippy-content{padding:10px 12px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:50vh;overflow:auto}.tippy-box[data-theme~=wt]>.tippy-arrow{color:var(--tip-bg)}
@@ -0,0 +1 @@
1
+ const S=e=>fetch(e).then(t=>t.json(),()=>Promise.reject(new Error("unreachable"))),_=(e,t)=>fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})}).then(n=>n.json(),()=>Promise.reject(new Error("unreachable"))),i=(e,t)=>(e.details||[]).find(n=>n["@type"]===t),A=e=>{var t;return((t=i(e,"BadRequest"))==null?void 0:t.field_violations)||[]},O=e=>{var o,s;const t=i(e,"BadRequest");if(t&&t.field_violations)return t.field_violations.map(d=>d.description);const n=(s=(o=i(e,"ErrorInfo"))==null?void 0:o.metadata)==null?void 0:s.detail;return[n?String(n):e.message]},h=e=>{var t;return((t=i(e,"ErrorInfo"))==null?void 0:t.reason)||""},y=e=>fetch("/api/handoff?"+new URLSearchParams(e)).then(t=>t.ok?t.text():Promise.reject(new Error(String(t.status)))),P=e=>typeof e=="string"&&/^https:\/\//.test(e)?e:"",N=(e,t,n)=>e.some(o=>o.id===t&&o.open_moves!==n)?e.map(o=>o.id===t?{...o,open_moves:n}:o):e,R=(e,t,n={})=>{const o=e.filter(a=>{var r;return a.group==="you"||a.handled&&((r=n[a.row_id])==null?void 0:r.auto)}).map(a=>({row:a,handled:a.group!=="you"||!!a.handled})).sort((a,r)=>a.row.rank-r.row.rank||String(a.row.updated).localeCompare(String(r.row.updated))),s=o.filter(a=>!a.handled).length,d=t==="handled";return{rows:o.filter(a=>a.handled===d),open:s,handled:o.length-s}},l=e=>String(e.status_since||e.updated),v=e=>e.filter(t=>t.group==="done").sort((t,n)=>l(n).localeCompare(l(t))).slice(0,15),D=e=>e.filter(t=>t.group==="others").sort((t,n)=>String(n.updated).localeCompare(String(t.updated))),f=e=>!e.ticket_url&&!!e.pr&&e.pr===e.key,b=e=>e.some(t=>t.pr&&!f(t)),U=e=>e==="failing"?"bad":e==="running"?"warn":e==="passing"?"ok":"",g={code_review:"info",qa:"info",on_hold:"hold"},k=e=>g[e||""]||"",C=e=>({open:"info",ready:"ready",done:"ok",dropped:"warn"})[e||""]||"info",L=(e,t,n=1)=>e.filter(o=>o>t+n).length,u="unreachable",p="No workspace configured. Add one with + in the rail.",c="The local server is not answering",m=c+"; try again once it is back.",j=c+"; your text is kept.",E={NO_WORKSPACE:p,UPSTREAM_FAILED:"The tracker did not answer; try again in a minute.",RATE_LIMITED:"The source is rate-limited; the monitor backs off.",OPEN_TOO_SOON:"The app window is already opening; give it a few seconds.",UPDATE_IN_PROGRESS:"An update is already installing; the monitor restarts when it is done.",UPDATE_UNAVAILABLE:"There is no update to install right now.",INTERNAL:"The local server failed; see its log."},T=(e,t="Not saved")=>E[h(e)]||t+": "+(e.message||"the server refused the change."),B=(e,{refused:t="Not saved",unreachable:n=m}={})=>{if(e instanceof Error)return e.message===u?n:t+": "+e.message;if(!e||typeof e!="object"||Array.isArray(e))return"";const o=e.error;return o?T(o,t):""},I=e=>{const t=Math.round((Date.now()-new Date(e).getTime())/6e4);return isFinite(t)?t<1?"now":t<60?t+"m ago":t<2880?Math.round(t/60)+"h ago":new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric"}):""},M=e=>{const t=(Date.now()-new Date(e??"").getTime())/36e5;return!isFinite(t)||t<0?{text:"",old:!1,hours:0}:{text:t<1?"<1h":t<48?Math.floor(t)+"h":Math.floor(t/24)+"d",old:t>=24,hours:t}},x=e=>e?new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"",q=(e,t)=>t?`${e}--${t}`:"";export{c as S,j as T,B as a,O as b,I as c,U as d,T as e,k as f,S as g,y as h,f as i,x as j,v as k,M as l,q as m,L as n,b as o,_ as p,D as q,h as r,P as s,C as t,A as v,N as w,R as y};