- {{ row.depth === 0 && !row.route.path ? '(root)' : '/' + row.route.path }}
+ {{ row.label }}
+ @if (row.nesting) {
+ , {{ row.nesting }}
+ }
@if (row.route.outlet !== 'primary') {
{{ row.route.outlet }}
}
@@ -350,9 +356,11 @@ export class RouteCurrent {
readonly rows = computed(() => {
const rows: RouteRow[] = [];
- const visit = (route: ActiveRoute, depth: number) => {
- rows.push({ route, depth });
- for (const child of route.children) visit(child, depth + 1);
+ const visit = (route: ActiveRoute, depth: number, parent?: string) => {
+ const label = depth === 0 && !route.path ? '(root)' : '/' + route.path;
+ const nesting = parent === undefined ? undefined : `level ${depth + 1}, child of ${parent}`;
+ rows.push({ route, depth, label, nesting });
+ for (const child of route.children) visit(child, depth + 1, label);
};
const root = this.page().snapshot?.root;
if (root) visit(root, 0);
diff --git a/app/src/pages/store-inspector.ts b/app/src/pages/store-inspector.ts
index 25e7d81b..882a00b2 100644
--- a/app/src/pages/store-inspector.ts
+++ b/app/src/pages/store-inspector.ts
@@ -20,6 +20,8 @@ import { actionAllowed, actionBlockedMessage, panelConfig } from '../devtools-co
import { LimitNote } from '../ui/limit-note';
import { Select, type SelectOption } from '../ui/select';
import {
+ changeCountText,
+ moreChangesText,
pretty,
sameNgrxLog,
short,
@@ -387,12 +389,7 @@ const CLASSIC_KINDS = new Set([
@if (entry.origin) {
{{ entry.origin }}
}
- {{
- entry.diff.length === 0
- ? 'no change'
- : entry.diff.length +
- (entry.diff.length === 1 ? ' change' : ' changes')
- }}
+ {{ changesLabel(entry) }}
·
{{ formatTime(entry.timestamp) }}
@if (entry.durationMs !== undefined) {
@@ -634,6 +631,9 @@ const CLASSIC_KINDS = new Set([
}
+ @if (selected.diffTruncated) {
+ {{ moreChanges(selected.diffTruncated) }}
+ }
} @else {
The state did not change.
}
@@ -2110,6 +2110,10 @@ export class StoreInspector {
return ORIGIN_TEXT[origin] ?? origin;
}
+ readonly changesLabel = changeCountText;
+
+ readonly moreChanges = moreChangesText;
+
opLabel(op: string) {
return op === 'add' ? 'added' : op === 'remove' ? 'removed' : 'changed';
}
diff --git a/app/src/pages/store-types.ts b/app/src/pages/store-types.ts
index e8a5413e..120d77f3 100644
--- a/app/src/pages/store-types.ts
+++ b/app/src/pages/store-types.ts
@@ -103,6 +103,29 @@ export interface NgrxLogEntry {
/** `source: 'signal-store'` only: the event that this state change was correlated with. */
causedByEvent?: { type: string; payload?: unknown };
unrestorable?: 'dropped' | 'not-recorded';
+ /**
+ * How many more changes the state went through than `diff` holds (it keeps at most 50).
+ * The page counts up to {@link DIFF_MORE_CAP}, so at the cap it is a lower bound.
+ */
+ diffTruncated?: number;
+}
+
+/** The most changes the page counts past a full diff (`NGRX_DIFF_MORE_CAP` in the package). */
+export const DIFF_MORE_CAP = 1000;
+
+/** "12 more changes not shown", or "1000+ more changes not shown" at the cap. */
+export function moreChangesText(count: number): string {
+ const n = count >= DIFF_MORE_CAP ? `${DIFF_MORE_CAP}+` : String(count);
+ return `${n} more ${count === 1 ? 'change' : 'changes'} not shown`;
+}
+
+/** The change count of a log entry, counting the rows left out of a long diff. */
+export function changeCountText(entry: Pick): string {
+ const more = entry.diffTruncated ?? 0;
+ const total = entry.diff.length + more;
+ if (total === 0) return 'no change';
+ const n = more >= DIFF_MORE_CAP ? `${total}+` : String(total);
+ return `${n} ${total === 1 ? 'change' : 'changes'}`;
}
export interface NgrxPage {
diff --git a/apps/docs/src/content/agents/resources.md b/apps/docs/src/content/agents/resources.md
index c6b8d3c8..71e4fdda 100644
--- a/apps/docs/src/content/agents/resources.md
+++ b/apps/docs/src/content/agents/resources.md
@@ -58,7 +58,7 @@ The injector hierarchy the page last reported, with the providers at each level.
### ngrx-store
-Each `@ngrx/signals` store on the page: state, computed values, methods, and the component fields that reference it. It also holds the `@ngrx/store` state and the change log, with a state diff per entry. The log records method calls, `patchState` writes, dispatched actions and restores. An `@ngrx/store` action has an `origin`: `dispatch`, `effect` or `reactive`. `classic.paused` is `true` while a restore holds `@ngrx/store` on a past state. An `@ngrx/store` entry with `unrestorable` cannot be restored: `dropped` means Store DevTools no longer holds the action (it was dropped past `maxAge`, or the history was committed, reset or imported), and `not-recorded` means Store DevTools never recorded it. `dropped` counts the older log entries removed at [`limits.changeLog`](../getting-started/configuration.md#limits).
+Each `@ngrx/signals` store on the page: state, computed values, methods, and the component fields that reference it. It also holds the `@ngrx/store` state and the change log, with a state diff per entry. A diff holds up to 50 changes, and `diffTruncated` counts the ones left out, up to 1000. The log records method calls, `patchState` writes, dispatched actions and restores. An `@ngrx/store` action has an `origin`: `dispatch`, `effect` or `reactive`. `classic.paused` is `true` while a restore holds `@ngrx/store` on a past state. An `@ngrx/store` entry with `unrestorable` cannot be restored: `dropped` means Store DevTools no longer holds the action (it was dropped past `maxAge`, or the history was committed, reset or imported), and `not-recorded` means Store DevTools never recorded it. `dropped` counts the older log entries removed at [`limits.changeLog`](../getting-started/configuration.md#limits).
### forms
diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md
index e24f1f32..345fc244 100644
--- a/apps/docs/src/content/agents/tools.md
+++ b/apps/docs/src/content/agents/tools.md
@@ -194,7 +194,7 @@ With `storeId`, the full state of one store: state, computed values, `withEntiti
### signal-store-history
-The change log for a page's stores, oldest first: `@ngrx/signals` state diffs (method calls and `patchState` writes, each with a per-key diff), classic `@ngrx/store` actions, and `@ngrx/signals/events` dispatched events. A method-call entry carries a duration in milliseconds. With `watchState` registered, it is the time from the start of the method to that patch; without it, the time the whole call took. A signal-store entry carries the event that caused it when the change happened while that event was being dispatched.
+The change log for a page's stores, oldest first: `@ngrx/signals` state diffs (method calls and `patchState` writes, each with a per-key diff), classic `@ngrx/store` actions, and `@ngrx/signals/events` dispatched events. A method-call entry carries a duration in milliseconds. With `watchState` registered, it is the time from the start of the method to that patch; without it, the time the whole call took. A signal-store entry carries the event that caused it when the change happened while that event was being dispatched. Each entry lists up to 50 changes; when there were more, it ends with how many were left out, such as `12 more changes not shown`.
| Argument | Required | Value |
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -208,11 +208,11 @@ All router tools read the page, except `explain-render-mode`, which also reads y
### Read the current route
-| Tool | What it answers | Arguments |
-| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
-| `inspect-route` | The current route: URL, query params, fragment, title, the navigation in flight, the active route tree (component, params, data, guards, resolvers) and the outlet tree with each outlet's `routerOutletData`. With `selector`, the route a component was rendered for, or whether a link is active. | `selector`: component class, element tag or link text |
-| `explain-navigation` | Recent navigations, newest first: who started each one, redirects and loops with the cause of each hop, per-phase timing, guard and resolver verdicts, lazy loads, and the cancel or error reason in plain language. | `url`, `id`, `limit` (1 to 50, default 5), `perf` |
-| `export-navigation` | A markdown repro of one navigation, with router options, any loop it is part of and the relevant slice of the route config. Defaults to the latest one that did not succeed. | `id` |
+| Tool | What it answers | Arguments |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
+| `inspect-route` | The current route: URL, query params, fragment, title, the navigation in flight, the active route tree (component, params, data, guards, resolvers) and the outlet tree with each outlet's `routerOutletData`. With `selector`, the route a component was rendered for, or whether a link is active. | `selector`: component class, element tag or link text |
+| `explain-navigation` | Recent navigations, newest first: who started each one, redirects and loops with the cause of each hop, per-phase timing, guard and resolver verdicts, lazy loads, and the cancel or error reason in plain language. | `url`, `id`, `limit` (1 to `limits.navigations`, default 5), `perf` |
+| `export-navigation` | A markdown repro of one navigation, with router options, any loop it is part of and the relevant slice of the route config. Defaults to the latest one that did not succeed. | `id` |
Use `explain-navigation` for "why was I redirected". Pass `perf: true` for "why is navigation slow": it lists the slowest navigations and preloads.
@@ -335,6 +335,8 @@ When a write goes through a native `` (`mode: user`, the default for `fi
`form-action` accepts these actions: `set-value`, `mark-touched`, `mark-untouched`, `mark-dirty`, `mark-pristine`, `touch-all`, `revalidate`, `reset`, `enable`, `disable`, `submit`, `focus`, `focus-first-invalid`, `store-as-global`, `snapshot`, `restore` and `instrument`.
+`form-action` and `fill-form` always act on the form `form` names. `store-as-global` does not overwrite a `$form` or `$control` that the page defined itself, unless you pass `force`.
+
`snapshot` keeps a copy of the form value, so it refuses a form whose value cannot be cloned, such as a control that holds a function. `inspect-forms` with `includeValues: false` also leaves out uncommitted input, model drift and metadata.
@@ -460,7 +462,7 @@ These tools cover *Analog apps. Most read your source. Some also read what the V
### Lint
-`analog-lint` finds Analog mistakes: two files for one URL, a missing default export, a layout without `router-outlet`, bad API method suffixes, prerender entries that match nothing, and frontmatter errors. It also reports live problems, like a `load()` fetched twice, a server function read that runs again after hydration, or a restart needed. No arguments.
+`analog-lint` finds Analog mistakes: two files for one URL, a missing default export, a layout without `router-outlet`, bad API method suffixes, prerender entries that match nothing, and frontmatter errors. It also reports live problems, like a `load()` fetched twice, a server function read that runs again after hydration, or a restart needed. Hydration errors and restart hints come from one page: pass `page` to pick it, or leave it out for the most recent. If no page with that id sends Analog data, the answer says so and lists the pages that do.
analog-server-calls and analog-call-api need the Vite plugin . The plugin records the calls and knows the dev server address.
diff --git a/apps/docs/src/content/getting-started/configuration.md b/apps/docs/src/content/getting-started/configuration.md
index e839ed36..be3629b5 100644
--- a/apps/docs/src/content/getting-started/configuration.md
+++ b/apps/docs/src/content/getting-started/configuration.md
@@ -148,6 +148,8 @@ Actions are the writes that the panel and agents make to your app or the server.
Pass `actions: false` to block every action, or an object to block some. Keys you leave out of the object stay on.
+`actions.forms` leaves the panel's **Record details** and **Store as global** on. They don't change the form: **Record details** wraps form methods to record who called them, and **Store as global** sets `$form` and `$control` in the page console only when the page has not defined them itself.
+
The server refuses a blocked action. The panel disables its controls and shows a note that names the option, for example: **Navigating and clearing navigations is turned off in the devtools config (actions.router).**
### Redaction
diff --git a/apps/docs/src/content/inspectors/analog.md b/apps/docs/src/content/inspectors/analog.md
index dc02ae57..263dfd0d 100644
--- a/apps/docs/src/content/inspectors/analog.md
+++ b/apps/docs/src/content/inspectors/analog.md
@@ -84,7 +84,7 @@ Markdown files under `src/content`, with title, URL, slug, date and file. The ta
### Lint
-Checks grouped by rule, each with a fix. Each card lists where the rule fired and the detail for that spot, like the hydration error text, the failing request or both files of a duplicate URL:
+Checks grouped by rule, each with a fix. The count on the tab adds up errors and warnings and turns red when there is an error. Info findings, like a route outside the API prefix, are not counted. Hydration errors and restart hints come from the page the panel is open on. Each card lists where the rule fired and the detail for that spot, like the hydration error text, the failing request or both files of a duplicate URL:
- Two files for one URL, and sibling `[param]` files.
- Missing default exports, and layouts without ``.
@@ -186,7 +186,7 @@ The tab reads every `routeRules` entry in `vite.config`. A rule like `/blog/**`
| `pangular:analog-render-modes` | | The render mode of each page, and what the last request did. |
| `pangular:analog-prerender-plan` | | The prerender plan. |
| `pangular:analog-content` | `filter` | Markdown files with slug, frontmatter, route and parse errors. |
-| `pangular:analog-lint` | | The Analog checks. |
+| `pangular:analog-lint` | `page` | The Analog checks. |
`analog-current-page` is the only place that shows the `load()` data a page received. See [Tools](../agents/tools.md).
diff --git a/apps/docs/src/content/inspectors/forms.md b/apps/docs/src/content/inspectors/forms.md
index 39473a31..0a72308a 100644
--- a/apps/docs/src/content/inspectors/forms.md
+++ b/apps/docs/src/content/inspectors/forms.md
@@ -9,7 +9,7 @@ description: Every form on the page with each field's state and errors, a change
# Forms
-The Forms tab reads the forms of the running page, in development builds only. It covers Signal Forms, reactive forms and template-driven forms. Actions you run from the tab go back to the page and run there.
+The Forms tab reads the forms of the running page, in development builds only. It covers Signal Forms, reactive forms and template-driven forms. Actions you run from the tab go back to the page and run there. Forms inside open shadow roots, such as `ViewEncapsulation.ShadowDom` components, are included.
## What it shows
@@ -64,7 +64,7 @@ Each error says where it comes from:
### Field details
-Click a field to open its details below the table. Click the field again, or **Close**, to hide them. From there, set a value, or click **Focus**, **Touch**, **Revalidate** or **Store as global**. **Store as global** stores the form as `$form`, and the field as `$control`, in the page console.
+Click a field to open its details below the table. Click the field again, or **Close**, to hide them. From there, set a value, or click **Focus**, **Touch**, **Revalidate** or **Store as global**. **Store as global** stores the form as `$form`, and the field as `$control`, in the page console. If the page defined `$form` or `$control` itself, it refuses and leaves them as they are.
### Timeline view
@@ -179,7 +179,7 @@ You can also open a form from its component in the [Components tab](./components
## Agent tools
-`form` is a form id like `Checkout.form@ab12`, or part of its label. `path` is a dotted field path, like `address.city`. A literal dot in a control key is written `\.` and a literal backslash `\\`, so the control keyed `a.b` has the path `a\.b`. An empty key is written `\e`, so it is never confused with the whole form, whose path is empty. The panel and the tool output show the same escaped form.
+`form` is a form id like `Checkout.form@ab12`, or part of its label. A form keeps its id while it is on the page. A form that is destroyed and created again, for example when you leave a route and come back, gets the same id back. `~2`, `~3` and so on tell apart forms with the same label that are on the page at the same time. `path` is a dotted field path, like `address.city`. A literal dot in a control key is written `\.` and a literal backslash `\\`, so the control keyed `a.b` has the path `a\.b`. An empty key is written `\e`, so it is never confused with the whole form, whose path is empty. The panel and the tool output show the same escaped form.
### Read tools
@@ -220,6 +220,8 @@ In the tab, the button turns into **Confirm reset**, **Confirm submit** or **Con
The actions don't write secret fields unless you unmask them. See [Access and redaction](../security.md#opt-fields-in-or-out). For Signal Forms, they skip hidden, readonly and rule-disabled fields too. They write disabled reactive fields only with `force`.
+In `user` mode, a write to a `date`, `datetime-local`, `time`, `month` or `week` input takes a value in the input's own format, like `2026-03-14`, or a date or timestamp, which is written in UTC like Signal Forms does. A value that is not a date fails and leaves the field as it was.
+
### WebMCP is best effort
`experimentalWebMcpTool` is experimental in Angular. The overlay wraps `modelContext.registerTool` when it loads, so it records registrations and calls from then on. The overlay has no hook that runs before your app. For a tool registered earlier, it reads the browser's tool list when the browser offers one (`getTools()` or `listTools()`), and the block says **registered before the inspector attached**. Calls to those tools are not recorded. If the browser offers no tool list, a form that registered before the overlay loaded shows no **WebMCP tool** block. To see every registration and call, register the form after the overlay loads, for example on a route you open later. The overlay links a tool to its form by its input schema, or by the form an agent call submits. A tool it cannot link shows in the `inspect-forms` output under **WebMCP**.
diff --git a/apps/docs/src/content/inspectors/ngrx-store.md b/apps/docs/src/content/inspectors/ngrx-store.md
index 8ba8edf6..1a87bbcd 100644
--- a/apps/docs/src/content/inspectors/ngrx-store.md
+++ b/apps/docs/src/content/inspectors/ngrx-store.md
@@ -45,7 +45,7 @@ Signal stores get a **Change log**. The classic Store gets an **Action log**. Ea
| `effect` | An NgRx effect. Effects send their actions through `Store.next`. |
| `reactive` | `store.dispatch(() => action)`, which dispatches again when a signal changes. |
-Open an entry to see its arguments, or the action and its **Origin** for the classic Store, and a **State diff** with the value before and after each change. The diff lists up to 50 changes. A method-call entry also shows its **Duration**, in milliseconds. An entry caused by a dispatched event shows the event under **Caused by event**. An action entry also has **Dispatch again**. **Copy** next to **State diff** copies that entry's diff in the same format as **State**, one object per change with its `path`, `op`, `before` and `after`. An entry that changed nothing has no diff to copy.
+Open an entry to see its arguments, or the action and its **Origin** for the classic Store, and a **State diff** with the value before and after each change. The diff lists up to 50 changes. When there were more, a line under it says how many are not shown, for example **12 more changes not shown**, and the entry's change count includes them. The overlay counts up to 1000 more, so a larger change reads **1000+ more changes not shown**. A method-call entry also shows its **Duration**, in milliseconds. An entry caused by a dispatched event shows the event under **Caused by event**. An action entry also has **Dispatch again**. **Copy** next to **State diff** copies that entry's diff in the same format as **State**, one object per change with its `path`, `op`, `before` and `after`. An entry that changed nothing has no diff to copy.
Entry numbers start at 1 again when the app reloads. So when the app reloads, or the selected page closes and the tab shows another one, the open entry closes and a pending **Restore** confirmation is cancelled.
diff --git a/apps/docs/src/content/inspectors/router.md b/apps/docs/src/content/inspectors/router.md
index 04d5675a..510630bc 100644
--- a/apps/docs/src/content/inspectors/router.md
+++ b/apps/docs/src/content/inspectors/router.md
@@ -89,8 +89,8 @@ How the router is set up (`provideRouter`, `forRoot or other` or `unknown`), the
Route config mistakes, each with a fix:
- Unreachable routes after `**`, and duplicate paths.
-- A `:param` that shadows a literal path.
-- Empty-path redirects without `pathMatch: 'full'`, and redirect cycles.
+- A `:param` that shadows a later literal path. This includes a `:param` route with children or `loadChildren`, because when the URL ends at it the router matches it with no child and never reaches the literal route.
+- Empty-path redirects with `pathMatch: 'prefix'`, which redirect every URL, and redirect cycles.
- Redirect loops seen at runtime (rule `redirect-loop`), with the hops and the guards involved.
- Deprecated class guards and `canLoad`.
- Lazy chunks downloaded before a rejecting `canActivate`.
@@ -184,18 +184,18 @@ Without that recording, the guards listed for a navigation are candidates: the `
## Agent tools
-| Tool or resource | What it does |
-| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `pangular:explain-navigation` | Why a navigation failed or redirected, with any loop and the cause of each hop. Pass `url` or `id` to narrow it, `limit` for more than the last 5, or `perf` for the slowest ones. |
-| `pangular:inspect-route` | The route the page is on. Pass `selector` (a component class, tag or link text) for the route a component was rendered for, or a link state. |
-| `pangular:list-routes` | The live config with source files and example URLs. `match` predicts a URL, `audit` lists the guards of each page. |
-| `pangular:lint-routes` | The lint findings, including redirect loops seen at runtime. |
-| `pangular:router-config` | The setup, including whether guard recording is on. |
-| `pangular:export-navigation` | A markdown repro, with any loop the navigation is part of. Defaults to the latest navigation that did not succeed. |
-| `pangular:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
-| `pangular:get-routes` | Routes from your source files. |
-| `pangular:navigate` | Acts on the router: `navigate`, `abort`, `replay`, `probe`, `instrument` and `resolve-lazy`. |
-| `pangular:router` (resource) | The active route tree and recent navigations of each page. |
+| Tool or resource | What it does |
+| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:explain-navigation` | Why a navigation failed or redirected, with any loop and the cause of each hop. Pass `url` or `id` to narrow it, `limit` for more than the last 5 (up to `limits.navigations`), or `perf` for the slowest ones. |
+| `pangular:inspect-route` | The route the page is on. Pass `selector` (a component class, tag or link text) for the route a component was rendered for, or a link state. |
+| `pangular:list-routes` | The live config with source files and example URLs. `match` predicts a URL, `audit` lists the guards of each page. |
+| `pangular:lint-routes` | The lint findings, including redirect loops seen at runtime. |
+| `pangular:router-config` | The setup, including whether guard recording is on. |
+| `pangular:export-navigation` | A markdown repro, with any loop the navigation is part of. Defaults to the latest navigation that did not succeed. |
+| `pangular:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
+| `pangular:get-routes` | Routes from your source files. |
+| `pangular:navigate` | Acts on the router: `navigate`, `abort`, `replay`, `probe`, `instrument` and `resolve-lazy`. |
+| `pangular:router` (resource) | The active route tree and recent navigations of each page. |
`navigate` only accepts same-origin relative URLs that start with `/`. `resolve-lazy` needs a `routeId`. With [`actions.router`](../getting-started/configuration.md#actions) set to `false`, the tool refuses `navigate`, `abort`, `replay` and `probe`, and keeps `instrument` and `resolve-lazy`. See [Tools](../agents/tools.md).
diff --git a/extension/ui/assets/browser-agent-rpc-BXhoSh1z-wXf_92mg.js b/extension/ui/assets/browser-agent-rpc-BXhoSh1z-cHO-LORY.js
similarity index 93%
rename from extension/ui/assets/browser-agent-rpc-BXhoSh1z-wXf_92mg.js
rename to extension/ui/assets/browser-agent-rpc-BXhoSh1z-cHO-LORY.js
index 7587748b..40ecd8af 100644
--- a/extension/ui/assets/browser-agent-rpc-BXhoSh1z-wXf_92mg.js
+++ b/extension/ui/assets/browser-agent-rpc-BXhoSh1z-cHO-LORY.js
@@ -1 +1 @@
-import{t as e}from"./index-Df-QuzS6.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a).catch(()=>{}))}))},s=a(o),l=e.events.on(`connection:status`,e=>{e===`connected`&&o()});return o(),()=>{n=!0,s(),l()}}export{l as setupBrowserAgentRpcBridge};
\ No newline at end of file
+import{t as e}from"./index-ji3r8IwJ.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a).catch(()=>{}))}))},s=a(o),l=e.events.on(`connection:status`,e=>{e===`connected`&&o()});return o(),()=>{n=!0,s(),l()}}export{l as setupBrowserAgentRpcBridge};
\ No newline at end of file
diff --git a/extension/ui/assets/index-Df-QuzS6.js b/extension/ui/assets/index-ji3r8IwJ.js
similarity index 86%
rename from extension/ui/assets/index-Df-QuzS6.js
rename to extension/ui/assets/index-ji3r8IwJ.js
index 64d2eb82..09c3d804 100644
--- a/extension/ui/assets/index-Df-QuzS6.js
+++ b/extension/ui/assets/index-ji3r8IwJ.js
@@ -5,7 +5,7 @@
`):``,this.name=`UnsubscriptionError`,this.errors=t}});function mr(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var hr=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var e,t,n,r,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a){if(this._parentage=null,Array.isArray(a))try{for(var o=cr(a),s=o.next();!s.done;s=o.next())s.value.remove(this)}catch(t){e={error:t}}finally{try{s&&!s.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}else a.remove(this)}var c=this.initialTeardown;if(dr(c))try{c()}catch(e){i=e instanceof pr?e.errors:[e]}var l=this._finalizers;if(l){this._finalizers=null;try{for(var u=cr(l),d=u.next();!d.done;d=u.next()){var f=d.value;try{vr(f)}catch(e){i??=[],e instanceof pr?i=ur(ur([],lr(i)),lr(e.errors)):i.push(e)}}}catch(e){n={error:e}}finally{try{d&&!d.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}}if(i)throw new pr(i)}},e.prototype.add=function(t){if(t&&t!==this){if(this.closed)vr(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=this._finalizers??[]).push(t)}}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&mr(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&mr(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e}(),gr=hr.EMPTY;function _r(e){return e instanceof hr||e&&`closed`in e&&dr(e.remove)&&dr(e.add)&&dr(e.unsubscribe)}function vr(e){dr(e)?e():e.unsubscribe()}var yr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},br={setTimeout:function(e,t){var n=[...arguments].slice(2),r=br.delegate;return r?.setTimeout?r.setTimeout.apply(r,ur([e,t],lr(n))):setTimeout.apply(void 0,ur([e,t],lr(n)))},clearTimeout:function(e){return(br.delegate?.clearTimeout||clearTimeout)(e)},delegate:void 0};function xr(e){br.setTimeout(function(){var t=yr.onUnhandledError;if(t)t(e);else throw e})}function Sr(){}var Cr=(function(){return Er(`C`,void 0,void 0)})();function wr(e){return Er(`E`,void 0,e)}function Tr(e){return Er(`N`,e,void 0)}function Er(e,t,n){return{kind:e,value:t,error:n}}var Dr=null;function Or(e){if(yr.useDeprecatedSynchronousErrorHandling){var t=!Dr;if(t&&(Dr={errorThrown:!1,error:null}),e(),t){var n=Dr,r=n.errorThrown,i=n.error;if(Dr=null,r)throw i}}else e()}function kr(e){yr.useDeprecatedSynchronousErrorHandling&&Dr&&(Dr.errorThrown=!0,Dr.error=e)}var Ar=function(e){sr(t,e);function t(t){var n=e.call(this)||this;return n.isStopped=!1,t?(n.destination=t,_r(t)&&t.add(n)):n.destination=Rr,n}return t.create=function(e,t,n){return new Pr(e,t,n)},t.prototype.next=function(e){this.isStopped?Lr(Tr(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?Lr(wr(e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?Lr(Cr,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){try{this.destination.error(e)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(hr),jr=Function.prototype.bind;function Mr(e,t){return jr.call(e,t)}var Nr=function(){function e(e){this.partialObserver=e}return e.prototype.next=function(e){var t=this.partialObserver;if(t.next)try{t.next(e)}catch(e){Fr(e)}},e.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(e){Fr(e)}else Fr(e)},e.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(e){Fr(e)}},e}(),Pr=function(e){sr(t,e);function t(t,n,r){var i=e.call(this)||this,a;if(dr(t)||!t)a={next:t??void 0,error:n??void 0,complete:r??void 0};else{var o;i&&yr.useDeprecatedNextContext?(o=Object.create(t),o.unsubscribe=function(){return i.unsubscribe()},a={next:t.next&&Mr(t.next,o),error:t.error&&Mr(t.error,o),complete:t.complete&&Mr(t.complete,o)}):a=t}return i.destination=new Nr(a),i}return t}(Ar);function Fr(e){yr.useDeprecatedSynchronousErrorHandling?kr(e):xr(e)}function Ir(e){throw e}function Lr(e,t){var n=yr.onStoppedNotification;n&&br.setTimeout(function(){return n(e,t)})}var Rr={closed:!0,next:Sr,error:Ir,complete:Sr},zr=(function(){return typeof Symbol==`function`&&Symbol.observable||`@@observable`})();function Br(e){return e}function Vr(e){return e.length===0?Br:e.length===1?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}}var Hr=function(){function e(e){e&&(this._subscribe=e)}return e.prototype.lift=function(t){var n=new e;return n.source=this,n.operator=t,n},e.prototype.subscribe=function(e,t,n){var r=this,i=Gr(e)?e:new Pr(e,t,n);return Or(function(){var e=r,t=e.operator,n=e.source;i.add(t?t.call(i,n):n?r._subscribe(i):r._trySubscribe(i))}),i},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},e.prototype.forEach=function(e,t){var n=this;return t=Ur(t),new t(function(t,r){var i=new Pr({next:function(t){try{e(t)}catch(e){r(e),i.unsubscribe()}},error:r,complete:t});n.subscribe(i)})},e.prototype._subscribe=function(e){return this.source?.subscribe(e)},e.prototype[zr]=function(){return this},e.prototype.pipe=function(){return Vr([...arguments])(this)},e.prototype.toPromise=function(e){var t=this;return e=Ur(e),new e(function(e,n){var r;t.subscribe(function(e){return r=e},function(e){return n(e)},function(){return e(r)})})},e.create=function(t){return new e(t)},e}();function Ur(e){return e??yr.Promise??Promise}function Wr(e){return e&&dr(e.next)&&dr(e.error)&&dr(e.complete)}function Gr(e){return e&&e instanceof Ar||Wr(e)&&_r(e)}function Kr(e){return dr(e?.lift)}function qr(e){return function(t){if(Kr(t))return t.lift(function(t){try{return e(t,this)}catch(e){this.error(e)}});throw TypeError(`Unable to lift unknown Observable type`)}}function Jr(e,t,n,r,i){return new Yr(e,t,n,r,i)}var Yr=function(e){sr(t,e);function t(t,n,r,i,a,o){var s=e.call(this,t)||this;return s.onFinalize=a,s.shouldUnsubscribe=o,s._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,s._error=i?function(e){try{i(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,s._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,s}return t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&((t=this.onFinalize)==null||t.call(this))}},t}(Ar),Xr=fr(function(e){return function(){e(this),this.name=`ObjectUnsubscribedError`,this.message=`object unsubscribed`}}),Zr=function(e){sr(t,e);function t(){var t=e.call(this)||this;return t.closed=!1,t.currentObservers=null,t.observers=[],t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return t.prototype.lift=function(e){var t=new Qr(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new Xr},t.prototype.next=function(e){var t=this;Or(function(){var n,r;if(t._throwIfClosed(),!t.isStopped){t.currentObservers||=Array.from(t.observers);try{for(var i=cr(t.currentObservers),a=i.next();!a.done;a=i.next())a.value.next(e)}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}}})},t.prototype.error=function(e){var t=this;Or(function(){if(t._throwIfClosed(),!t.isStopped){t.hasError=t.isStopped=!0,t.thrownError=e;for(var n=t.observers;n.length;)n.shift().error(e)}})},t.prototype.complete=function(){var e=this;Or(function(){if(e._throwIfClosed(),!e.isStopped){e.isStopped=!0;for(var t=e.observers;t.length;)t.shift().complete()}})},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null},Object.defineProperty(t.prototype,"observed",{get:function(){return this.observers?.length>0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,i=n.isStopped,a=n.observers;return r||i?gr:(this.currentObservers=null,a.push(e),new hr(function(){t.currentObservers=null,mr(a,e)}))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,i=t.isStopped;n?e.error(r):i&&e.complete()},t.prototype.asObservable=function(){var e=new Hr;return e.source=this,e},t.create=function(e,t){return new Qr(e,t)},t}(Hr),Qr=function(e){sr(t,e);function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return t.prototype.next=function(e){var t,n;(n=(t=this.destination)?.next)==null||n.call(t,e)},t.prototype.error=function(e){var t,n;(n=(t=this.destination)?.error)==null||n.call(t,e)},t.prototype.complete=function(){var e,t;(t=(e=this.destination)?.complete)==null||t.call(e)},t.prototype._subscribe=function(e){return this.source?.subscribe(e)??gr},t}(Zr),$r=function(e){sr(t,e);function t(t){var n=e.call(this)||this;return n._value=t,n}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var n=e.prototype._subscribe.call(this,t);return!n.closed&&t.next(this._value),n},t.prototype.getValue=function(){var e=this,t=e.hasError,n=e.thrownError,r=e._value;if(t)throw n;return this._throwIfClosed(),r},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(Zr);function ei(e,t){return qr(function(n,r){var i=0;n.subscribe(Jr(r,function(n){r.next(e.call(t,n,i++))}))})}var ti=`https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss`,T=class extends Error{code;constructor(e,t){super(ri(e,t)),this.code=e}};function ni(e){return`NG0${Math.abs(e)}`}function ri(e,t){return`${ni(e)}${t?`: `+t:``}`}function ii(e){for(let t in e)if(e[t]===ii)return t;throw Error(``)}function ai(e){if(typeof e==`string`)return e;if(Array.isArray(e))return`[${e.map(ai).join(`, `)}]`;if(e==null)return``+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return``+n;let r=n.indexOf(`
`);return r>=0?n.slice(0,r):n}function oi(e,t){return e?t?`${e} ${t}`:e:t||``}var si=ii({__forward_ref__:ii});function ci(e){return e.__forward_ref__=ci,e}function li(e){return ui(e)?e():e}function ui(e){return typeof e==`function`&&Object.hasOwn(e,si)&&e.__forward_ref__===ci}function di(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function fi(e){return pi(e,gi)}function pi(e,t){return Object.hasOwn(e,t)&&e[t]||null}function mi(e){return(e?.[gi]??null)||null}function hi(e){return e&&Object.hasOwn(e,_i)?e[_i]:null}var gi=ii({ɵprov:ii}),_i=ii({ɵinj:ii}),vi=class{_desc;ngMetadataName=`InjectionToken`;ɵprov;constructor(e,t){this._desc=e,this.ɵprov=void 0,typeof t==`number`?this.__NG_ELEMENT_ID__=t:t!==void 0&&(this.ɵprov=di({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function yi(e){return e&&!!e.ɵproviders}var bi=ii({ɵcmp:ii}),xi=ii({ɵdir:ii}),Si=ii({ɵpipe:ii}),Ci=ii({ɵfac:ii}),wi=ii({__NG_ELEMENT_ID__:ii}),Ti=ii({__NG_ENV_ID__:ii});function Ei(e){return ki(e,`@Component`),e[bi]||null}function Di(e){return ki(e,`@Directive`),e[xi]||null}function Oi(e){return ki(e,`@Pipe`),e[Si]||null}function ki(e,t){if(e==null)throw new T(-919,!1)}function Ai(e){return typeof e==`string`?e:e==null?``:String(e)}var ji=ii({ngErrorCode:ii}),Mi=ii({ngErrorMessage:ii}),Ni=ii({ngTokenPath:ii});function Pi(e,t){return Ii(``,-200,t)}function Fi(e,t){throw new T(-201,!1)}function Ii(e,t,n){let r=new T(t,e);return r[ji]=t,r[Mi]=e,n&&(r[Ni]=n),r}function Li(e){return e[ji]}var Ri;function zi(){return Ri}function Bi(e){let t=Ri;return Ri=e,t}function Vi(e,t,n){let r=fi(e);if(r&&r.providedIn==`root`)return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Fi(e,``)}var Hi=globalThis,Ui={},Wi=`__NG_DI_FLAG__`,Gi=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=Ji(t)||0;try{return this.injector.get(e,n&8?null:Ui,n)}catch(e){if(er(e))return e;throw e}}};function Ki(e,t=0){let n=Zn();if(n===void 0)throw new T(-203,!1);if(n===null)return Vi(e,void 0,t);{let r=Yi(t),i=n.retrieve(e,r);if(er(i)){if(r.optional)return null;throw i}return i}}function qi(e,t=0){return(zi()||Ki)(li(e),t)}function E(e,t){return qi(e,Ji(t))}function Ji(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function Yi(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function Xi(e){let t=[];for(let n=0;nArray.isArray(e)?ta(e,t):t(e))}function na(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ra(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ia(e,t,n,r){let i=e.length;if(i==t)e.push(n,r);else if(i===1)e.push(r,e[0]),e[0]=n;else{for(i--,e.push(e[i-1],e[i]);i>t;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function aa(e,t,n){let r=sa(e,t);return r>=0?e[r|1]=n:(r=~r,ia(e,r,t,n)),r}function oa(e,t){let n=sa(e,t);if(n>=0)return e[n|1]}function sa(e,t){return ca(e,t,1)}function ca(e,t,n){let r=0,i=e.length>>n;for(;i!==r;){let a=r+(i-r>>1),o=e[a<t?i=a:r=a+1}return~(i<{n.push(e)};return ta(t,e=>{let t=e;va(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&_a(i,a),n}function _a(e,t){for(let n=0;n{t(e,r)})}}function va(e,t,n,r){if(e=li(e),!e)return!1;let i=null,a=hi(e),o=!a&&Ei(e);if(!a&&!o){let t=e.ngModule;if(a=hi(t),a)i=t;else return!1}else if(o&&!o.standalone)return!1;else i=e;let s=r.has(i);if(o){if(s)return!1;if(r.add(i),o.dependencies){let e=typeof o.dependencies==`function`?o.dependencies():o.dependencies;for(let i of e)va(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{ta(a.imports,i=>{va(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&_a(e,t)}if(!s){let e=Qi(i)||(()=>new i);t({provide:i,useFactory:e,deps:ua},i),t({provide:pa,useValue:i,multi:!0},i),t({provide:da,useValue:()=>qi(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;ya(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function ya(e,t){for(let n of e)yi(n)&&(n=n.ɵproviders),Array.isArray(n)?ya(n,t):t(n)}var ba=ii({provide:String,useValue:ii});function xa(e){return typeof e==`object`&&!!e&&ba in e}function Sa(e){return!!(e&&e.useExisting)}function Ca(e){return!!(e&&e.useFactory)}function wa(e){return typeof e==`function`}var Ta=new vi(``),Ea={},Da={},Oa=void 0;function ka(){return Oa===void 0&&(Oa=new ma),Oa}var Aa=class{},ja=class extends Aa{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,t,n,r){super(),this.parent=t,this.source=n,this.scopes=r,Va(e,e=>this.processProvider(e)),this.records.set(fa,La(void 0,this)),r.has(`environment`)&&this.records.set(Aa,La(void 0,this));let i=this.records.get(Ta);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(pa,ua,{self:!0}))}retrieve(e,t){let n=Ji(t)||0;try{return this.get(e,Ui,n)}catch(e){if(er(e))return e;throw e}}destroy(){Ia(this),this._destroyed=!0;let e=w(null);try{for(let e of this._ngOnDestroyHooks)e.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let t of e)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),w(e)}}onDestroy(e){return Ia(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){Ia(this);let t=Qn(this),n=Bi(void 0);try{return e()}finally{Qn(t),Bi(n)}}get(e,t=Ui,n){if(Ia(this),Object.hasOwn(e,Ti))return e[Ti](this);let r=Ji(n),i=Qn(this),a=Bi(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=Ba(e)&&fi(e);t=n&&this.injectableDefInScope(n)?La(Ma(e),Ea):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?ka():this.parent;return t=r&8&&t===Ui?null:t,n.get(e,t)}catch(e){let t=Li(e);throw t===-200||t===-201?new T(t,null):e}finally{Bi(a),Qn(i)}}resolveInjectorInitializers(){let e=w(null),t=Qn(this),n=Bi(void 0);try{let e=this.get(da,ua,{self:!0});for(let t of e)t()}finally{Qn(t),Bi(n),w(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=li(e);let t=wa(e)?e:li(e&&e.provide),n=Pa(e);if(!wa(e)&&e.multi===!0){let n=this.records.get(t);n||(n=La(void 0,Ea,!0),n.factory=()=>Xi(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=w(null);try{if(t.value===Da)throw Pi(``);return t.value===Ea&&(t.value=Da,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&za(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{w(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=li(e.providedIn);return typeof t==`string`?t===`any`||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(e){let t=this._onDestroyHooks.indexOf(e);t!==-1&&this._onDestroyHooks.splice(t,1)}};function Ma(e){let t=fi(e),n=t===null?Qi(e):t.factory;if(n!==null)return n;if(e instanceof vi)throw new T(-204,!1);if(e instanceof Function)return Na(e);throw new T(-204,!1)}function Na(e){if(e.length>0)throw new T(-204,!1);let t=mi(e);return t===null?()=>new e:()=>t.factory(e)}function Pa(e){return xa(e)?La(void 0,e.useValue):La(Fa(e),Ea)}function Fa(e,t,n){let r;if(wa(e)){let t=li(e);return Qi(t)||Ma(t)}if(xa(e))r=()=>li(e.useValue);else if(Ca(e))r=()=>e.useFactory(...Xi(e.deps||[]));else if(Sa(e))r=(t,n)=>qi(li(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=li(e&&(e.useClass||e.provide));if(Ra(e))r=()=>new t(...Xi(e.deps));else return Qi(t)||Ma(t)}return r}function Ia(e){if(e.destroyed)throw new T(-205,!1)}function La(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Ra(e){return!!e.deps}function za(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function Ba(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function Va(e,t){for(let n of e)Array.isArray(n)?Va(n,t):n&&yi(n)?Va(n.ɵproviders,t):t(n)}function Ha(e,t){let n;e instanceof ja?(Ia(e),n=e):n=new Gi(e);let r=Qn(n),i=Bi(void 0);try{return t()}finally{Qn(r),Bi(i)}}function Ua(){return zi()!==void 0||Zn()!=null}var Wa=1;function Ga(e){return Array.isArray(e)&&typeof e[Wa]==`object`}function Ka(e){return Array.isArray(e)&&e[Wa]===!0}function qa(e){return!!(e.flags&4)}function Ja(e){return e.componentOffset>-1}function Ya(e){return(e.flags&1)==1}function Xa(e){return!!e.template}function Za(e){return!!(e[2]&512)}function Qa(e){return(e[2]&256)==256}var $a=(function(e){return e[e.NONE=0]=`NONE`,e[e.HTML=1]=`HTML`,e[e.STYLE=2]=`STYLE`,e[e.SCRIPT=3]=`SCRIPT`,e[e.URL=4]=`URL`,e[e.RESOURCE_URL=5]=`RESOURCE_URL`,e[e.ATTRIBUTE_NO_BINDING=6]=`ATTRIBUTE_NO_BINDING`,e})($a||{}),eo=`math`;function to(e){for(;Array.isArray(e);)e=e[0];return e}function no(e,t){return to(t[e])}function ro(e,t){return to(t[e.index])}function io(e,t){return e.data[t]}function ao(e,t){return e[t]}function oo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function so(e,t){let n=t[e];return Ga(n)?n:n[0]}function co(e){return(e[2]&128)==128}function lo(e){return Ka(e[3])}function uo(e,t){return t==null?null:e[t]}function fo(e){e[17]=0}function po(e){e[2]&1024||(e[2]|=1024,co(e)&&_o(e))}function mo(e,t){for(;e>0;)t=t[14],e--;return t}function ho(e){return!!(e[2]&9216||e[24]?.dirty)}function go(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),ho(e)&&_o(e)}function _o(e){e[10].changeDetectionScheduler?.notify(0);let t=bo(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!co(t)));)t=bo(t)}function vo(e,t){if(Qa(e))throw new T(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function yo(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function bo(e){let t=e[3];return Ka(t)?t[3]:t}function xo(e){return e[7]??=[]}function So(e){return e.cleanup??=[]}function Co(e,t,n,r){let i=xo(t);i.push(n),e.firstCreatePass&&So(e).push(r,i.length-1)}var wo={lFrame:as(null),bindingsEnabled:!0,skipHydrationRootTNode:null},To=!1;function Eo(){return wo.lFrame.elementDepthCount}function Do(){wo.lFrame.elementDepthCount++}function Oo(){wo.lFrame.elementDepthCount--}function ko(){return wo.bindingsEnabled}function Ao(){return wo.skipHydrationRootTNode!==null}function jo(e){return wo.skipHydrationRootTNode===e}function Mo(){wo.skipHydrationRootTNode=null}function D(){return wo.lFrame.lView}function No(){return wo.lFrame.tView}function O(e){return wo.lFrame.contextLView=e,e[8]}function k(e){return wo.lFrame.contextLView=null,e}function Po(){let e=Fo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Fo(){return wo.lFrame.currentTNode}function Io(){let e=wo.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Lo(e,t){let n=wo.lFrame;n.currentTNode=e,n.isParent=t}function Ro(){return wo.lFrame.isParent}function zo(){wo.lFrame.isParent=!1}function Bo(){return wo.lFrame.contextLView}function Vo(){return To}function Ho(e){let t=To;return To=e,t}function Uo(){let e=wo.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Wo(){return wo.lFrame.bindingIndex}function Go(e){return wo.lFrame.bindingIndex=e}function Ko(){return wo.lFrame.bindingIndex++}function qo(e){let t=wo.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Jo(){return wo.lFrame.inI18n}function Yo(e,t){let n=wo.lFrame;n.bindingIndex=n.bindingRootIndex=e,Zo(t)}function Xo(){return wo.lFrame.currentDirectiveIndex}function Zo(e){wo.lFrame.currentDirectiveIndex=e}function Qo(e){let t=wo.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function $o(){return wo.lFrame.currentQueryIndex}function es(e){wo.lFrame.currentQueryIndex=e}function ts(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ns(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=ts(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=wo.lFrame=is();return r.currentTNode=t,r.lView=e,!0}function rs(e){let t=is(),n=e[1];wo.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function is(){let e=wo.lFrame,t=e===null?null:e.child;return t===null?as(e):t}function as(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function os(){let e=wo.lFrame;return wo.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ss=os;function cs(){let e=os();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function ls(e){return(wo.lFrame.contextLView=mo(e,wo.lFrame.contextLView))[8]}function us(){return wo.lFrame.selectedIndex}function ds(e){wo.lFrame.selectedIndex=e}function fs(){let e=wo.lFrame;return io(e.tView,e.selectedIndex)}function A(){wo.lFrame.currentNamespace=`svg`}function ps(){ms()}function ms(){wo.lFrame.currentNamespace=null}function hs(){return wo.lFrame.currentNamespace}var gs=!0;function _s(){return gs}function vs(e){gs=e}function ys(e,t=null,n=null,r){let i=bs(e,t,n,r);return i.resolveInjectorInitializers(),i}function bs(e,t=null,n=null,r,i=new Set){return new ja([n||ua,ha(e)],t||ka(),null,i)}var xs=class e{static THROW_IF_NOT_FOUND=Ui;static NULL=new ma;static create(e,t){if(Array.isArray(e))return ys({name:``},t,e,``);{let t=e.name??``;return ys({name:t},e.parent,e.providers,t)}}static ɵprov=di({token:e,providedIn:`any`,factory:()=>qi(fa)});static __NG_ELEMENT_ID__=-1},Ss=new vi(``),Cs=class{static __NG_ELEMENT_ID__=Ts;static __NG_ENV_ID__=e=>e},ws=class extends Cs{_lView;constructor(e){super(),this._lView=e}get destroyed(){return Qa(this._lView)}onDestroy(e){let t=this._lView;return vo(t,e),()=>yo(t,e)}};function Ts(){return new ws(D())}var Es=new vi(``),Ds=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new $r(!1);debugTaskTracker=E(Es,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new Hr(e=>{e.next(!1),e.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),this.debugTaskTracker?.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.debugTaskTracker?.remove(e),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Os=class extends Zr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,Ua()&&(this.destroyRef=E(Cs,{optional:!0})??void 0,this.pendingTasks=E(Ds,{optional:!0})??void 0)}emit(e){let t=w(null);try{super.next(e)}finally{w(t)}}subscribe(e,t,n){let r=e,i=t||(()=>null),a=n;if(e&&typeof e==`object`){let t=e;r=t.next?.bind(t),i=t.error?.bind(t),a=t.complete?.bind(t)}this.__isAsync&&(i=this.wrapInTimeout(i),r&&=this.wrapInTimeout(r),a&&=this.wrapInTimeout(a));let o=super.subscribe({next:r,error:i,complete:a});return e instanceof hr&&e.add(o),o}wrapInTimeout(e){return t=>{let n=this.pendingTasks?.add();setTimeout(()=>{try{e(t)}finally{n!==void 0&&this.pendingTasks?.remove(n)}})}}};function ks(...e){}function As(e){let t,n;function r(){e=ks;try{n!==void 0&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch{}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==`function`&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function js(e){return queueMicrotask(()=>e()),()=>{e=ks}}var Ms=`isAngularZone`,Ns=`isAngularZone_ID`,Ps=0,Fs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Os(!1);onMicrotaskEmpty=new Os(!1);onStable=new Os(!1);onError=new Os(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new T(908,!1);Zone.assertZonePatched();let a=this;a._nesting=0,a._outer=a._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(a._inner=a._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(a._inner=a._inner.fork(Zone.longStackTraceZoneSpec)),a.shouldCoalesceEventChangeDetection=!r&&n,a.shouldCoalesceRunChangeDetection=r,a.callbackScheduled=!1,a.scheduleInRootZone=i,zs(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(Ms)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new T(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new T(909,!1)}run(e,t,n){return this._inner.run(e,t,n)}runTask(e,t,n,r){let i=this._inner,a=i.scheduleEventTask(`NgZoneEvent: `+r,e,Is,ks,ks);try{return i.runTask(a,t,n)}finally{i.cancelTask(a)}}runGuarded(e,t,n){return this._inner.runGuarded(e,t,n)}runOutsideAngular(e){return this._outer.run(e)}},Is={};function Ls(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Rs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){As(()=>{e.callbackScheduled=!1,Bs(e),e.isCheckStableRunning=!0,Ls(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Bs(e)}function zs(e){let t=()=>{Rs(e)},n=Ps++;e._inner=e._inner.fork({name:`angular`,properties:{[Ms]:!0,[Ns]:n,[Ns+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Ws(s))return n.invokeTask(i,a,o,s);try{return Vs(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Hs(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Vs(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Gs(s)&&t(),Hs(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,Bs(e),Ls(e)):i.change==`macroTask`&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(t,n,r,i)=>(t.handleError(r,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}function Bs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Vs(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Hs(e){e._nesting--,Ls(e)}var Us=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Os;onMicrotaskEmpty=new Os;onStable=new Os;onError=new Os;run(e,t,n){return e.apply(t,n)}runGuarded(e,t,n){return e.apply(t,n)}runOutsideAngular(e){return e()}runTask(e,t,n,r){return e.apply(t,n)}};function Ws(e){return Ks(e,`__ignore_ng_zone__`)}function Gs(e){return Ks(e,`__scheduler_tick__`)}function Ks(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var qs=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},Js=new vi(``,{factory:()=>{let e=E(Fs),t=E(Aa),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(qs),n.handleError(r))})}}}),Ys={provide:da,useValue:()=>{E(qs,{optional:!0})},multi:!0};function j(e,t){let[n,r,i]=Hn(e,t?.equal),a=n;return a[dn],a.set=r,a.update=i,a.asReadonly=Xs.bind(a),a}function Xs(){let e=this[dn];if(e.readonlyFn===void 0){let t=()=>this();t[dn]=e,e.readonlyFn=t}return e.readonlyFn}var Zs=new vi(``,{factory:()=>Qs}),Qs=`ng`,$s=new vi(``),ec=new vi(``,{providedIn:`platform`,factory:()=>`unknown`}),tc=new vi(``,{factory:()=>E(Ss).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),nc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=rc}return e})();function rc(){return new nc(D(),Po())}var ic=class{},ac=new vi(``,{factory:()=>!0}),oc=new vi(``),sc=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>new cc})}return e})(),cc=class{dirtyEffectCount=0;queues=new Map;add(e){this.enqueue(e),this.schedule(e)}schedule(e){e.dirty&&this.dirtyEffectCount++}remove(e){let t=e.zone,n=this.queues.get(t);n.has(e)&&(n.delete(e),e.dirty&&this.dirtyEffectCount--)}enqueue(e){let t=e.zone;this.queues.has(t)||this.queues.set(t,new Set);let n=this.queues.get(t);n.has(e)||n.add(e)}flush(){for(;this.dirtyEffectCount>0;){let e=!1;for(let[t,n]of this.queues)e||=t===null?this.flushQueue(n):t.run(()=>this.flushQueue(n));e||(this.dirtyEffectCount=0)}}flushQueue(e){let t=!1;for(let n of e)n.dirty&&(this.dirtyEffectCount--,t=!0,n.run());return t}},lc=class{[dn];constructor(e){this[dn]=e}destroy(){this[dn].destroy()}};function uc(e,t){let n=t?.injector??E(xs),r=t?.manualCleanup===!0?null:n.get(Cs),i,a=n.get(nc,null,{optional:!0}),o=n.get(ic);return a===null?i=hc(e,n.get(sc),o):(i=mc(a.view,o,e),r instanceof ws&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new lc(i)}var dc={...Jn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Ho(!1);try{Yn(this)}finally{Ho(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=w(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],w(e)}}},fc={...dc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},pc={...dc,consumerMarkedDirty(){this.view[2]|=8192,_o(this.view),this.notifier.notify(13)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function mc(e,t,n){let r=Object.create(pc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=gc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function hc(e,t,n){let r=Object.create(fc);return r.fn=gc(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<`u`?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function gc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function _c(e){return typeof e==`function`&&e[dn]!==void 0}function vc(e){return _c(e)&&typeof e.set==`function`}var yc=Symbol(`InputSignalNode#UNSET`),bc={...Kn,transformFn:void 0,applyValueToInputSignal(e,t){Wn(e,t)}};function xc(e){return{toString:e}.toString()}var Sc=(function(e){return e[e.TemplateCreateStart=0]=`TemplateCreateStart`,e[e.TemplateCreateEnd=1]=`TemplateCreateEnd`,e[e.TemplateUpdateStart=2]=`TemplateUpdateStart`,e[e.TemplateUpdateEnd=3]=`TemplateUpdateEnd`,e[e.LifecycleHookStart=4]=`LifecycleHookStart`,e[e.LifecycleHookEnd=5]=`LifecycleHookEnd`,e[e.OutputStart=6]=`OutputStart`,e[e.OutputEnd=7]=`OutputEnd`,e[e.BootstrapApplicationStart=8]=`BootstrapApplicationStart`,e[e.BootstrapApplicationEnd=9]=`BootstrapApplicationEnd`,e[e.BootstrapComponentStart=10]=`BootstrapComponentStart`,e[e.BootstrapComponentEnd=11]=`BootstrapComponentEnd`,e[e.ChangeDetectionStart=12]=`ChangeDetectionStart`,e[e.ChangeDetectionEnd=13]=`ChangeDetectionEnd`,e[e.ChangeDetectionSyncStart=14]=`ChangeDetectionSyncStart`,e[e.ChangeDetectionSyncEnd=15]=`ChangeDetectionSyncEnd`,e[e.AfterRenderHooksStart=16]=`AfterRenderHooksStart`,e[e.AfterRenderHooksEnd=17]=`AfterRenderHooksEnd`,e[e.ComponentStart=18]=`ComponentStart`,e[e.ComponentEnd=19]=`ComponentEnd`,e[e.DeferBlockStateStart=20]=`DeferBlockStateStart`,e[e.DeferBlockStateEnd=21]=`DeferBlockStateEnd`,e[e.DynamicComponentStart=22]=`DynamicComponentStart`,e[e.DynamicComponentEnd=23]=`DynamicComponentEnd`,e[e.HostBindingsUpdateStart=24]=`HostBindingsUpdateStart`,e[e.HostBindingsUpdateEnd=25]=`HostBindingsUpdateEnd`,e})(Sc||{}),Cc=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function wc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Tc=null,Ec=(()=>{Tc=Oc;let e=()=>Oc;return e.ngInherit=!0,e})();function Dc(){return Tc}function Oc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Ac),kc}function kc(){let e=Mc(this),t=e?.current;if(t){let n=e.previous;if(n===la)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Ac(e,t,n,r,i){let a=this.declaredInputs[r],o=Mc(e)||Nc(e,{previous:la,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Cc(l&&l.currentValue,n,c===la),wc(e,t,i,n)}var jc=`__ngSimpleChanges__`;function Mc(e){return Object.hasOwn(e,jc)&&e[jc]||null}function Nc(e,t){return e[jc]=t}var Pc=[],Fc=function(e,t=null,n){for(let r=0;r=r)break}else t[c]<0&&(e[17]+=65536),(s>14>16&&(e[2]&3)===t&&(e[2]+=16384,Hc(o,a)):Hc(o,a)}var Wc=-1,Gc=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,t,n,r){this.factory=e,this.name=r,this.canSeeViewProviders=t,this.injectImpl=n}};function Kc(e){return!!(e.flags&8)}function qc(e){return!!(e.flags&16)}function Jc(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function nl(e,t){let n=tl(e),r=t;for(;n>0;)r=r[14],n--;return r}var rl=!0;function il(e){let t=rl;return rl=e,t}var al=255,ol=5,sl=0,cl={};function ll(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,wi)&&(r=n[wi]),r??=n[wi]=sl++;let i=r&al,a=1<>ol)]|=a}function ul(e,t){let n=fl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,dl(r.data,e),dl(t,null),dl(r.blueprint,null));let i=pl(e,t),a=e.injectorIndex;if($c(i)){let e=el(i),n=nl(i,t),r=n[1].data;for(let i=0;i<8;i++)t[a+i]=n[e+i]|r[e+i]}return t[a+8]=i,a}function dl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function fl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function pl(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,i=t;for(;i!==null;){if(r=Ol(i),r===null)return Wc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Wc}function ml(e,t,n){ll(e,t,n)}function hl(e,t,n){if(n&8||e!==void 0)return e;Fi(t,`NodeInjector`)}function gl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=Bi(void 0);try{return i?i.get(t,r,n&8):Vi(t,r,n&8)}finally{Bi(a)}}return hl(r,t,n)}function _l(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Dl(e,t,n,r,cl);if(i!==cl)return i}let i=vl(e,t,n,r,cl);if(i!==cl)return i}return gl(t,n,r,i)}function vl(e,t,n,r,i){let a=Sl(n);if(typeof a==`function`){if(!ns(t,e,r))return r&1?hl(i,n,r):gl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Fi(n);else return e}finally{ss()}}else if(typeof a==`number`){let i=null,o=fl(e,t),s=Wc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?pl(e,t):t[o+8],s===Wc||!wl(r,!1)?o=-1:(i=t[1],o=el(s),t=nl(s,t)));o!==-1;){let e=t[1];if(Cl(a,o,e.data)){let e=yl(o,t,n,i,r,c);if(e!==cl)return e}s=t[o+8],s!==Wc&&wl(r,t[1].data[o+8]===c)&&Cl(a,o,t)?(i=e,o=el(s),t=nl(s,t)):o=-1}}return i}function yl(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=bl(s,o,n,r==null?Ja(s)&&rl:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?cl:xl(t,o,c,s,i)}function bl(e,t,n,r,i){let a=e.providerIndexes,o=t.data,s=a&1048575,c=e.directiveStart,l=e.directiveEnd,u=a>>20,d=r?s:s+u,f=i?s+u:l;for(let e=d;e=c&&t.type===n)return e}if(i){let e=o[c];if(e&&Xa(e)&&e.type===n)return c}return null}function xl(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Gc){let s=a;if(s.resolving)throw Pi(``);let c=il(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?Bi(s.injectImpl):null;ns(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Ic(n,o[n],t)}finally{l!==null&&Bi(l),il(c),s.resolving=!1,ss()}}return a}function Sl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,wi)?e[wi]:void 0;return typeof t==`number`?t>=0?t&al:El:t}function Cl(e,t,n){let r=1<>ol)]&r)}function wl(e,t){return!(e&2)&&!(e&1&&t)}var Tl=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return _l(this._tNode,this._lView,e,Ji(n),t)}};function El(){return new Tl(Po(),D())}function Dl(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!Za(o);){let e=vl(a,o,n,r|2,cl);if(e!==cl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,cl,r);if(t!==cl)return t}t=Ol(o),o=o[14]}a=t}return i}function Ol(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function kl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function Al(){return jl(Po(),D())}function jl(e,t){return new Ml(ro(e,t))}var Ml=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=Al}return e})();function Nl(e){return e instanceof Ml?e.nativeElement:e}function Pl(){return this._results[Symbol.iterator]()}var Fl=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new Zr}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,t){return this._results.reduce(e,t)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,t){this.dirty=!1;let n=ea(e);(this._changesDetected=!$i(this._results,n,t))&&(this._results=n,this.length=n.length,this.last=n[this.length-1],this.first=n[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=Pl};function Il(e){return(e.flags&128)==128}var Ll=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Ll||{}),Rl=new Map,zl=0;function Bl(){return zl++}function Vl(e){Rl.set(e[19],e)}function Hl(e){Rl.delete(e[19])}var Ul=`__ngContext__`;function Wl(e,t){Ga(t)?(e[Ul]=t[19],Vl(t)):e[Ul]=t}function Gl(e){return ql(e[12])}function Kl(e){return ql(e[4])}function ql(e){for(;e!==null&&!Ka(e);)e=e[4];return e}var Jl=void 0;function Yl(e){Jl=e}function Xl(){if(Jl!==void 0)return Jl;if(typeof document<`u`)return document;throw new T(210,!1)}var Zl=!1,Ql=new vi(``,{factory:()=>Zl}),$l=new WeakMap;function eu(e,t){if(typeof e!=`object`||!e)return;let n=$l.get(e);n||(n=new WeakSet,$l.set(e,n)),n.add(t)}function tu(e){return(e.flags&32)==32}var nu=()=>null;function ru(e,t,n=!1){return nu(e,t,n)}function iu(e,t){let n=e.contentQueries;if(n!==null){let r=w(null);try{for(let r=0;r|^->||--!>|)/g,gu=`$1`;function _u(e){return e.replace(mu,e=>e.replace(hu,gu))}function vu(e,t){return e.createText(t)}function yu(e,t,n){e.setValue(t,n)}function bu(e,t){return e.createComment(_u(t))}function xu(e,t,n){return e.createElement(t,n)}function Su(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Cu(e,t,n){e.appendChild(t,n)}function wu(e,t,n,r,i){r===null?Cu(e,t,n):Su(e,t,n,r,i)}function Tu(e,t,n,r){e.removeChild(null,t,n,r)}function Eu(e,t,n){e.setAttribute(t,`style`,n)}function Du(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Ou(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&Jc(e,t,r),i!==null&&Du(e,t,i),a!==null&&Eu(e,t,a)}function ku(e){let t=Au();return t?t.sanitize($a.URL,e)||``:uu(e,`URL`)?lu(e):pu(Ai(e))}function Au(){let e=D();return e&&e[10].sanitizer}function ju(e){return e.ownerDocument.defaultView}function Mu(e){return e.ownerDocument}function Nu(e,t,n){let r=e.length;for(;;){let i=e.indexOf(t,n);if(i===-1)return i;if(i===0||e.charCodeAt(i-1)<=32){let n=t.length;if(i+n===r||e.charCodeAt(i+n)<=32)return i}n=i+1}}var Pu=`ng-template`;function Fu(e,t,n,r){let i=0;if(r){for(;i-1){let e;for(;++ia?``:i[u+1].toLowerCase(),r&2&&l!==e){if(zu(r))return!1;o=!0}}}}}return zu(r)||o}function zu(e){return!(e&1)}function Bu(e,t,n,r){if(t===null)return-1;let i=0;if(r||!n){let n=!1;for(;i-1)for(n++;n0?`="`+t+`"`:``)+`]`}else r&8?i+=`.`+o:r&4&&(i+=` `+o)}else i!==``&&!zu(o)&&(t+=Wu(a,i),i=``),r=o,a||=!zu(r);n++}return i!==``&&(t+=Wu(a,i)),t}function Ku(e){return e.map(Gu).join(`,`)}function qu(e){let t=[],n=[],r=1,i=2;for(;r!1});function $u(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function ed(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function td(e){let t=ed(e,`transition-property`),n=ed(e,`transition-duration`),r=ed(e,`transition-delay`),i={propertyName:``,duration:0,animationName:void 0};for(let e=0;ei.duration&&(i.propertyName=t[e],i.duration=a)}return i}function nd(e){let t=ed(e,`animation-name`),n=ed(e,`animation-delay`),r=ed(e,`animation-duration`),i=ed(e,`animation-iteration-count`),a={animationName:``,propertyName:void 0,duration:0};for(let e=0;ea.duration&&s!==`infinite`&&(a.animationName=t[e],a.duration=o)}return a}function rd(e,t){return e!==void 0&&e.duration>t.duration}function id(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function ad(e){let t=e.effect?.getTiming();if(t===void 0)return;let n=typeof t.duration==`number`?t.duration:0,r=(t.delay??0)+n,i=e.playbackRate;return i!==void 0&&i!==0&&i!==1&&(r/=Math.abs(i)),r}function od(e,t){let n=getComputedStyle(e),r=nd(n),i=td(n),a=r.duration>i.duration?r:i;rd(t.get(e),a)||id(a)&&t.set(e,a)}function sd(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?od(e,t):cd(e,t,r)}function cd(e,t,n){let r={animationName:void 0,propertyName:void 0,duration:0};for(let e of n){if(e.effect?.getTiming()?.iterations===1/0)continue;let t=ad(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}rd(t.get(e),r)||id(r)&&t.set(e,r)}var ld=new Set,ud=!1,dd=1,fd=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function pd(e){return e[9].get(Qu,ud)}function md(e,t,n){let r=gd.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else gd.set(e,{classList:t,cleanupFns:n})}function hd(e){let t=gd.get(e);if(t){for(let e of t.cleanupFns)e();gd.delete(e)}_d.delete(e)}var gd=new WeakMap,_d=new WeakMap,vd=new WeakMap;function yd(e){return e?e[14]??e:null}var bd=new WeakSet;function xd(e,t,n){let r=vd.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=yd(n);for(let e=r.length-1;e>=0;e--){let{el:n,declarationView:s}=r[e],c=n.parentNode;n===t?(r.splice(e,1),bd.add(n),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}}))):(a&&n===a||c&&i&&c!==i&&(o===null||s===null||o===s))&&(r.splice(e,1),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}})),n.parentNode?.removeChild(n))}}function Sd(e,t,n){let r=yd(n),i=vd.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):vd.set(e,[{el:t,declarationView:r}])}function Cd(e){let t=e[26]??={};return t.enter??=new Map}function wd(e){let t=typeof e==`function`?e():e,n=Array.isArray(t)?t:null;return typeof t==`string`&&(n=t.trim().split(/\s+/).filter(e=>e)),n}function Td(e){return e.composedPath?e.composedPath()[0]:e.target}function Ed(e,t){let n=_d.get(t);if(n===void 0)return!0;if(t!==Td(e))return!1;let r=e.animation;if(r){let e=ad(r);if(e!==void 0&&e+dd{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Nd=[0,1,2,3],Pd=(()=>{class e{ngZone=E(Fs);scheduler=E(ic);errorHandler=E(qs,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){E(kd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Fc(Sc.AfterRenderHooksStart),this.executing=!0;for(let e of Nd)for(let t of this.sequences)if(!t.erroredOrDestroyed&&t.hooks[e])try{t.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let n=t.hooks[e];return n(t.pipelinedValue)},t.snapshot))}catch(e){t.erroredOrDestroyed=!0,this.errorHandler?.handleError(e)}this.executing=!1;for(let e of this.sequences)e.afterRun(),e.once&&(this.sequences.delete(e),e.destroy());for(let e of this.deferredRegistrations)this.sequences.add(e);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&Fc(Sc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),_o(t),t[2]|=8192)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,t){return t?t.run(Od.AFTER_NEXT_RENDER,e):e()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fd=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,t,n,r,i,a=null){this.impl=e,this.hooks=t,this.view=n,this.once=r,this.snapshot=a,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[25];e&&(this.view[25]=e.filter(e=>e!==this))}};function Id(e,t){let n=t?.injector??E(xs);return jd(`NgAfterNextRender`),Rd(e,n,t,!0)}function Ld(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Rd(e,t,n,r){let i=t.get(Md);i.impl??=t.get(Pd);let a=t.get(kd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(Cs),s=t.get(nc,null,{optional:!0}),c=new Fd(i.impl,Ld(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var zd=new vi(``,{factory:()=>{let e=E(Aa),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function Bd(e,t,n){let r=e.get(zd);if(Array.isArray(t))for(let e of t)r.queue.add(e),n?.detachedLeaveAnimationFns?.push(e);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function Vd(e,t){let n=e.get(zd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Hd(e,t){let n=e.get(zd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Ud(e){let t=e.get(zd);t.isScheduled||=(Id(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Wd(e){let t=e.get(zd);t.scheduler=Ud,t.scheduler(e)}function Gd(e,t){for(let[n,r]of t)Bd(e,r.animateFns)}function Kd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&Gd(r,i)}function qd(e,t,n,r){try{n.get(fa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Vd(n,i.enter.get(t.index).animateFns);let a=Jd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];Xd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&ld.add(e[19]),Bd(n,()=>Yd(e,t,i||void 0,a,r),i||void 0)}function Jd(e,t,n){let r=new Map,i=n?.leave;if(i&&i.has(t.index)&&r.set(t.index,i.get(t.index)),e&&i)for(let[n,a]of i){if(r.has(n))continue;let i=e[1].data[n].parent;for(;i;){if(i===t){r.set(n,a);break}i=i.parent}}return r}function Yd(e,t,n,r,i){let a=[];if(n&&n.leave)for(let[e]of r){if(!n.leave.has(e))continue;let t=n.leave.get(e);for(let e of t.animateFns){let{promise:t}=e();a.push(t)}n.detachedLeaveAnimationFns=void 0}if(e&&Xd(e,t,a),a.length>0){let t=n||e?.[26];if(t){let n=t.running;n&&a.push(n),t.running=Promise.allSettled(a),Qd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&ld.delete(e[19]),i(!0)})}else e&&ld.delete(e[19]),i(!1)}function Xd(e,t,n){if(t.type&12){let r=e[t.index];if(Ka(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,ld.delete(e[19])),n(!0)})}function $d(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;Ka(i)?c=i:Ga(i)&&(l=!0,i=i[0]);let u=to(i);e===0&&r!==null?(Kd(s,r,a,n),o==null?Cu(t,r,u):Su(t,r,u,o||null,!0)):e===1&&r!==null?(Kd(s,r,a,n),Su(t,r,u,o||null,!0),xd(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Sd(a,u,s),bd.delete(u),qd(s,a,n,e=>{if(bd.has(u)){bd.delete(u);return}Tu(t,u,l,e)})):e===3&&(bd.delete(u),qd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Cf(t,e,n,c,a,r,o)}}function ef(e,t){nf(e,t),t[0]=null,t[5]=null}function tf(e,t,n,r,i,a){r[0]=i,r[5]=t,bf(e,r,n,1,i,a)}function nf(e,t){t[10].changeDetectionScheduler?.notify(9),bf(e,t,t[11],2,null,null)}function rf(e){let t=e[12];if(!t)return sf(e[1],e);for(;t;){let n=null;if(Ga(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)Ga(t)&&sf(t[1],t),t=t[3];t===null&&(t=e),Ga(t)&&sf(t[1],t),n=t&&t[4]}t=n}}function af(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function of(e,t){if(Qa(t))return;let n=t[11];n.destroyNode&&bf(e,t,n,3,null,null),rf(t)}function sf(e,t){if(Qa(t))return;let n=w(null);try{t[2]&=-129,t[2]|=256,t[24]&&En(t[24]),lf(e,t),cf(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&Ka(t[3])){n!==t[3]&&af(n,t);let r=t[18];r!==null&&r.detachView(e)}Hl(t)}finally{w(n)}}function cf(e,t){let n=e.cleanup,r=t[7];if(n!==null)for(let e=0;e=0?r[t]():r[-t].unsubscribe(),e+=2}else{let t=r[n[e+1]];n[e].call(t)}r!==null&&(t[7]=null);let i=t[21];if(i!==null){t[21]=null;for(let e=0;e27&&Nf(e,t,27,!1),Fc(o?Sc.TemplateUpdateStart:Sc.TemplateCreateStart,i,n),n(r,i)}finally{ds(a),Fc(o?Sc.TemplateUpdateEnd:Sc.TemplateCreateEnd,i,n)}}function Lf(e,t,n){Wf(e,t,n),(n.flags&64)==64&&Gf(e,t,n)}function Rf(e,t,n=ro){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a{_o(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function hp(e){let t=e[24]??Object.create(gp);return t.lView=e,t}var gp={...pn,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=bo(e.lView);for(;t&&!_p(t[1]);)t=bo(t);t&&po(t)},consumerOnSignalRead(){this.lView[24]=this}};function _p(e){return e.type!==2}function vp(e){if(e[23]===null)return;let t=!0;for(;t;){let n=!1;for(let t of e[23])if(t.dirty&&(n=!0,t.zone===null||Zone.current===t.zone?t.run():t.zone.run(()=>t.run()),e[23]===null))return;t=n&&!!(e[2]&8192)}}var yp=100;function bp(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{xp(e,t)}finally{n.end?.()}}function xp(e,t){let n=Vo();try{Ho(!0),Dp(e,t);let n=0;for(;ho(e);){if(n===yp)throw new T(103,!1);n++,Dp(e,1)}}finally{Ho(n)}}function Sp(e,t,n,r){if(Qa(t))return;let i=t[2];rs(t);let a=!0,o=null,s=null;_p(e)?(s=dp(t),o=xn(s)):fn()===null?(a=!1,s=hp(t),o=xn(s)):t[24]&&=(En(t[24]),null);try{fo(t),Go(e.bindingStartIndex),n!==null&&If(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Rc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&zc(t,n,0,null),Bc(t,0)}if(wp(t),vp(t),Cp(t,0),e.contentQueries!==null&&iu(e,t),a){let n=e.contentCheckHooks;n!==null&&Rc(t,n)}else{let n=e.contentHooks;n!==null&&zc(t,n,1),Bc(t,1)}kp(e,t);let o=e.components;o!==null&&Op(t,o,0);let s=e.viewQuery;if(s!==null&&au(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Rc(t,n)}else{let n=e.viewHooks;n!==null&&zc(t,n,2),Bc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}lp(t),t[2]&=-73}catch(e){throw _o(t),e}finally{s!==null&&(Cn(s,o),a&&pp(s)),cs()}}function Cp(e,t){for(let n=Gl(e);n!==null;n=Kl(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ra(e,10+t);ef(r[1],r);let o=a[18];o!==null&&o.detachView(a[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Ip(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(Fp(e,n),ra(t,n))}this._attachedToViewContainer=!1}of(this._lView[1],this._lView)}onDestroy(e){vo(this._lView,e)}markForCheck(){Ap(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){go(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,bp(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new T(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=Za(this._lView),t=this._lView[16];t!==null&&!e&&af(t,this._lView),nf(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new T(902,!1);this._appRef=e;let t=Za(this._lView),n=this._lView[16];n!==null&&!t&&Lp(n,this._lView),go(this._lView)}},zp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=Bp;constructor(e,t,n){this._declarationLView=e,this._declarationTContainer=t,this.elementRef=n}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,t){return this.createEmbeddedViewImpl(e,t)}createEmbeddedViewImpl(e,t,n){return new Rp(ap(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function Bp(){return Vp(Po(),D())}function Vp(e,t){return e.type&4?new zp(t,e,jl(e,t)):null}function Hp(e,t,n,r,i){let a=e.data[t];if(a===null)a=Up(e,t,n,r,i),Jo()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Io();a.injectorIndex=e===null?-1:e.injectorIndex}return Lo(a,!0),a}function Up(e,t,n,r,i){let a=Fo(),o=Ro(),s=o?a:a&&a.parent,c=e.data[t]=Gp(e,s,n,t,r,i);return Wp(e,c,a,o),c}function Wp(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function Gp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Ao()&&(s|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:o,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:s,providerIndexes:0,value:i,namespace:hs(),attrs:a,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function Kp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?qp(e,n):r.push(e);e[6]=r}function qp(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,Yp=()=>null;function Xp(e,t){return Jp(e,t)}function Zp(e,t,n){return Yp(e,t,n)}var Qp=class{},$p=class{},em=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>null})}return e})();function tm(e){return e.debugInfo?.className||e.type.name||null}var nm={},rm=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,nm,n);return r!==nm||t===nm?r:this.parentInjector.get(e,t,n)}};function im(e,t,n){return e[t]=n}function am(e,t){return e[t]}function om(e,t,n){if(n===Ju)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function sm(e,t,n,r){let i=om(e,t,n);return om(e,t+1,r)||i}function cm(e,t,n,r,i){let a=sm(e,t,n,r);return om(e,t+2,i)||a}function lm(e,t,n,r,i,a){let o=sm(e,t,n,r);return sm(e,t+2,i,a)||o}function um(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&eu(i,a),Ap(Ja(e)?so(e.index,t):t,5);let o=t[8],s=dm(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=dm(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function dm(e,t,n,r){let i=w(null);try{return Fc(Sc.OutputStart,t,n),n(r)!==!1}catch(t){return $f(e,t),!1}finally{Fc(Sc.OutputEnd,t,n),w(i)}}function fm(e,t,n,r,i,a,o,s){let c=Ya(e),l=!1,u=null;if(!r&&c&&(u=mm(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=ro(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);pm(a)||hm(r?t=>r(to(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function pm(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function mm(e,t,n,r){let i=e.cleanup;if(i!=null)for(let e=0;er?n[r]:null}typeof a==`string`&&(e+=2)}return null}function hm(e,t,n,r,i,a,o){let s=t.firstCreatePass?So(t):null,c=xo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function gm(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);hm(e.index,s,t,i,a,c,!0)}var _m=Symbol(`BINDING`),vm=new vi(``);function ym(e,t,n){let r=n?e.styles:null,i=n?e.classes:null,a=0;if(t!==null)for(let e=0;e0&&(n.directiveToIndex=new Map);for(let c=0;c0;){let n=e[--t];if(typeof n==`number`&&n<0)return n}return 0}function Nm(e,t,n){if(n){if(t.exportAs)for(let r=0;r{let[n,r,i]=e[t],a={propName:n,templateName:t,isSignal:(r&Pf.SignalBased)!==0};return i&&(a.transform=i),a})}function Vm(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Hm(e,t,n){let r=t instanceof Aa?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new rm(n,r):n}function Um(e){let t=e.get($p,null);if(t===null)throw new T(407,!1);return{rendererFactory:t,sanitizer:e.get(em,null),changeDetectionScheduler:e.get(ic,null),ngReflect:!1,tracingService:e.get(kd,null,{optional:!0})}}function Wm(e,t,n){let r=Km(e);return xu(t,r,r===`svg`?`svg`:r===`math`?eo:n)}function Gm(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new T(905,!1)}function Km(e){return(e.selectors[0][0]||`div`).toLowerCase()}var qm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Bm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Vm(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=Ku(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Fc(Sc.DynamicComponentStart);let s=w(null);try{let s=this.componentDef,c=Hm(s,r||this.ngModule,e),l=Um(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(tm(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{w(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Jm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?zf(l,r,s.encapsulation,t):Wm(s,l,o??null);Gm(u);let d=t.get(vm,null),f=Ym(u,()=>t.get(Ss,null)??Xl());d&&d.addHost(f);let p=a?.some(Zm)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Zm)),m=Of(null,c,null,512|Af(s),null,null,e,l,t,null,ru(u,t,!0));d&&Rm&&f instanceof ShadowRoot&&vo(m,()=>{d.removeHost(f)}),m[27]=u,rs(m);let h=null;try{let e=Fm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),Wl(u,m),Lf(c,m,e),ou(c,e,m),Im(c,e),n!==void 0&&$m(e,this.ngContentSelectors,n),h=so(e.index,m),m[8]=h[8],rp(c,m,null)}catch(e){throw h!==null&&Hl(h),Hl(m),e}finally{Fc(Sc.DynamicComponentEnd),cs()}return new Qm(this.componentType,m,!!p)}};function Jm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:qu(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[_m].requiredVars,e.create&&(e.targetIdx=0,(a??=[]).push(e)),e.update&&(e.targetIdx=0,(o??=[]).push(e));if(r)for(let e=0;e{if(n&1&&e)for(let t of e)t.create();if(n&2&&t)for(let e of t)e.update()}}function Zm(e){let t=e[_m].kind;return t===`input`||t===`twoWay`}var Qm=class extends Qp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=io(t[1],27),this.location=jl(this._tNode,t),this.instance=so(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new Rp(t,void 0),this.componentType=e}setInput(e,t){this._hasInputBindings;let n=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),t))return;let r=this._rootLView;ep(n,r[1],r,e,t),this.previousInputValues.set(e,t),Ap(so(n.index,r),1)}get injector(){return new Tl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function $m(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=th}return e})();function th(){return ah(Po(),D())}var nh=class e extends eh{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return jl(this._hostTNode,this._hostLView)}get injector(){return new Tl(this._hostTNode,this._hostLView)}get parentInjector(){let e=pl(this._hostTNode,this._hostLView);if($c(e)){let t=nl(e,this._hostLView),n=el(e),r=t[1].data[n+8];return new Tl(r,t)}return new Tl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=rh(this._lContainer);return t!==null&&t[e]||null}get length(){return this._lContainer.length-10}createEmbeddedView(e,t,n){let r,i;typeof n==`number`?r=n:n!=null&&(r=n.index,i=n.injector);let a=Xp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,op(this._hostTNode,a)),o}createComponent(e,t,n,r,i,a,o){let s,c=t||{};s=c.index,n=c.injector,r=c.projectableNodes,i=c.environmentInjector||c.ngModuleRef,a=c.directives,o=c.bindings;let l=new qm(Ei(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Aa,null);e&&(i=e)}let d=Ei(l.componentType??{}),f=Xp(this._lContainer,d?.id??null),p=f?.firstChild??null,m=l.create(u,r,p,i,a,o,this._getHostElementNamespace());return this.insertImpl(m.hostView,s,op(this._hostTNode,f)),m}_getHostElementNamespace(){if(this._hostTNode.type&2){let e=this._hostTNode.parent??this._hostLView[5];return e!==null&&e.type&2&&typeof e.value==`string`&&e.value.toLowerCase()===`foreignobject`?null:e?.namespace??null}return this._hostTNode.namespace}insert(e,t){return this.insertImpl(e,t,!0)}insertImpl(t,n,r){let i=t._lView;if(lo(i)){let n=this.indexOf(t);if(n!==-1)this.detach(n);else{let n=i[3],r=new e(n,n[5],n[3]);r.detach(r.indexOf(t))}}let a=this._adjustIndex(n),o=this._lContainer;return Np(o,i,a,r),t.attachToViewContainerRef(),na(ih(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=rh(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);n&&(ra(ih(this._lContainer),t),of(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);return n&&ra(ih(this._lContainer),t)!=null?new Rp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function rh(e){return e[8]}function ih(e){return e[8]||=[]}function ah(e,t){let n,r=t[e.index];return Ka(r)?n=r:(n=jp(r,t,null,e),t[e.index]=n,Mf(t,n)),sh(n,t,e,r),new nh(n,e,t)}function oh(e,t){let n=e[11],r=n.createComment(``),i=ro(t,e);return Su(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var sh=uh,ch=()=>!1;function lh(e,t,n){return ch(e,t,n)}function uh(e,t,n,r){if(e[7])return;let i;i=n.type&8?to(r):oh(t,n),e[7]=i}var dh=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},fh=class e{queries;constructor(e=[]){this.queries=e}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries===null?n.length:t.contentQueries[0],i=[];for(let e=0;e0)r.push(o[e/2]);else{let i=a[e+1],o=t[-n];for(let e=10;ee.trim())}function Eh(e,t,n){e.queries===null&&(e.queries=new mh),e.queries.track(new hh(t,n))}function Dh(e,t){return e.queries.getByIndex(t)}function Oh(e,t){let n=e[1],r=Dh(n,t);return r.crossesNgTemplate?xh(n,e,t,[]):bh(n,e,r,t)}function kh(e,t,n){let r,i=Mn(()=>{r._dirtyCounter();let n=Nh(r,e);if(t&&n===void 0)throw new T(-951,!1);return n});return r=i[dn],r._dirtyCounter=j(0),r._flatValue=void 0,i}function Ah(e){return kh(!0,!1,e)}function jh(e){return kh(!0,!0,e)}function Mh(e,t){let n=e[dn];n._lView=D(),n._queryIndex=t,n._queryList=Sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function Nh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:ua;let i=Sh(n,r),a=Oh(n,r);return i.reset(a,Nl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function Ph(e){return!!e&&typeof e.then==`function`}function Fh(e){return!!e&&typeof e.subscribe==`function`}var Ih=class{},Lh=class extends Ih{injector;instance=null;constructor(e){super();let t=new ja([...e.providers,{provide:Ih,useValue:this}],e.parent||ka(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Rh(e,t,n=null){return new Lh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var zh=(()=>{class e{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let t=ga(!1,e.type),n=t.length>0?Rh([t],this._injector,``):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static ɵprov=di({token:e,providedIn:`environment`,factory:()=>new e(qi(Aa))})}return e})();function Bh(e){return xc(()=>{let t=Kh(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Ll.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(zh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||su.Emulated,styles:e.styles||ua,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&jd(`NgStandalone`),qh(n);let r=e.dependencies;return n.directiveDefs=Jh(r,Vh),n.pipeDefs=Jh(r,Oi),n.id=Yh(n),n})}function Vh(e){return Ei(e)||Di(e)}function Hh(e,t){if(e==null)return la;let n={};for(let r in e)if(Object.hasOwn(e,r)){let i=e[r],a,o,s,c;Array.isArray(i)?(s=i[0],a=i[1],o=i[2]??a,c=i[3]||null):(a=i,o=i,s=Pf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Uh(e){if(e==null)return la;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Wh(e){return xc(()=>{let t=Kh(e);return qh(t),t})}function Gh(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Kh(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||la,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||ua,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Hh(e.inputs,t),outputs:Uh(e.outputs),debugInfo:null}}function qh(e){e.features?.forEach(t=>t(e))}function Jh(e,t){return e?()=>{let n=typeof e==`function`?e():e,r=[];for(let e of n){let n=t(e);n!==null&&r.push(n)}return r}:null}function Yh(e){let t=0,n=typeof e.consts==`function`?``:e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let e of r.join(`|`))t=Math.imul(31,t)+e.charCodeAt(0)<<0;return t+=2147483648,`c`+t}var Xh=new vi(``),Zh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=E(Xh,{optional:!0})??[];injector=E(xs);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=Ha(this.injector,t);if(Ph(n))e.push(n);else if(Fh(n)){let t=new Promise((e,t)=>{n.subscribe({complete:e,error:t})});e.push(t)}}let t=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{t()}).catch(e=>{this.reject(e)}),e.length===0&&t(),this.initialized=!0}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function Qh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=Zc(e.mergedAttrs,e.attrs);let t=e.tView=Tf(2,e,i,a,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),t.queries=n.queries.embeddedTView(e))}s&&(e.flags|=s),Lo(e,!1);let c=ng(n,t,e,r);_s()&&hf(n,t,c,e),Wl(c,t);let l=jp(c,t,c,e);t[r+27]=l,Mf(t,l),lh(l,e,t)}function $h(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=Hp(t,d,4,o||null,s||null),ko()&&xm(t,e,f,uo(t.consts,l),qf),Lc(t,f)):f=t.data[d],Qh(f,e,t,n,r,i,a,c),Ya(f)&&Lf(t,e,f),l!=null&&Rf(e,f,u),f}function eg(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=Hp(t,d,4,o||null,s||null),l!=null){let e=uo(t.consts,l);f.localNames=[];for(let t=0;t{throw new T(600,``)})}var sg=10,cg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=E(Js);afterRenderManager=E(Md);zonelessEnabled=E(ac);rootEffectScheduler=E(sc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Zr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=E(Ds);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(ei(e=>!e))}constructor(){E(kd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=E(Aa);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=xs.NULL){return this._injector.get(Fs).run(()=>{if(Fc(Sc.BootstrapComponentStart),!this._injector.get(Zh).done)throw new T(405,``);let r=Ei(e),i=this._injector.get(Ih),a=new qm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=lg(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(ig,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),ug(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Fc(Sc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Fc(Sc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(Od.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Fc(Sc.ChangeDetectionEnd),new T(101,!1);let e=w(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,w(e),this.afterTick.next(),Fc(Sc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get($p,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++ho(e))){this.dirtyFlags|=2;return}this.dirtyFlags&=-8}attachView(e){let t=e;this._views.push(t),t.attachToAppRef(this)}detachView(e){let t=e;ug(this._views,t),t.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView);try{this.tick()}catch(e){this.internalErrorHandler(e)}this.components.push(e),this._injector.get(ag,[]).forEach(t=>t(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>ug(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new T(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function lg(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function ug(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function N(e,t,n,r){let i=D();return om(i,Ko(),t)&&(No(),Jf(fs(),i,e,t,n,r)),N}function dg(e){if(jd(`NgAnimateEnter`),!fd)return dg;let t=D();if(pd(t))return dg;let n=Po(),r=t[9].get(Fs);return Dd(Cd(t),n,()=>fg(t,n,e,r)),Wd(t[9]),Gd(t[9],Cd(t)),dg}function fg(e,t,n,r){let i=ro(t,e),a=e[11],o=wd(n),s=[],c=!1,l=e=>{if(Td(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{Td(e)===i&&(Ed(e,i)&&(c=!0),pg(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),md(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(sd(i,_d,fd),!_d.has(i))){for(let e of o)a.removeClass(i,e);hd(i)}})})}}function pg(e,t,n){let r=gd.get(t);if(Td(e)===t&&r&&Ed(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);hd(t)}}var mg=class{destroy(e){}updateValue(e,t){}swap(e,t){let n=Math.min(e,t),r=Math.max(e,t),i=this.detach(r);if(r-n>1){let e=this.detach(n);this.attach(n,i),this.attach(r,e)}else this.attach(n,i)}move(e,t){this.attach(t,this.detach(e))}};function hg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function gg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){w(r);let c=t.length-1;for(w(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=hg(o,r,o,l,n);if(u!==0){u<0&&e.updateValue(o,l),o++;continue}let d=e.at(s),f=t[c],p=hg(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),h=n(s,d),g=n(o,l);if(Object.is(g,h)){let t=n(c,f);Object.is(t,m)?(e.swap(o,s),e.updateValue(s,f),c--,s--):e.move(s,o),e.updateValue(o,l),o++;continue}if(i??=new bg,a??=yg(e,o,s,n),_g(e,i,o,g))e.updateValue(o,l),o++,s++;else if(a.has(g))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)vg(e,i,n,o,t[o]),o++}else if(t!=null){w(r);let c=t[Symbol.iterator]();w(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=hg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new bg,a??=yg(e,o,s,n);let u=n(o,r);if(_g(e,i,o,u))e.updateValue(o,r),o++,s++,l=c.next();else if(!a.has(u))e.attach(o,e.create(o,r)),o++,s++,l=c.next();else{let r=n(o,t);i.set(r,e.detach(o)),s--}}}for(;!l.done;)vg(e,i,n,e.length,l.value),l=c.next()}for(;o<=s;)e.destroy(e.detach(s--));i?.forEach(t=>{e.destroy(t)})}function _g(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function vg(e,t,n,r,i){if(_g(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function yg(e,t,n,r){let i=new Set;for(let a=t;a<=n;a++)i.add(r(a,e.at(a)));return i}var bg=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let t=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(t)?(this.kvMap.set(e,this._vMap.get(t)),this._vMap.delete(t)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,t){if(this.kvMap.has(e)){let n=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let r=this._vMap;for(;r.has(n);)n=r.get(n);r.set(n,t)}else this.kvMap.set(e,t)}forEach(e){for(let[t,n]of this.kvMap)if(e(n,t),this._vMap!==void 0){let r=this._vMap;for(;r.has(n);)n=r.get(n),e(n,t)}}};function P(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=D(),l=No();return eg(c,l,e,t,n,r,i,uo(l.consts,a),256,o,s),xg}function xg(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=D(),l=No();return eg(c,l,e,t,n,r,i,uo(l.consts,a),512,o,s),xg}function F(e,t){jd(`NgControlFlow`);let n=D(),r=Ko(),i=n[r]===Ju?-1:n[r],a=i===-1?void 0:Dg(n,27+i);if(om(n,r,e)){let r=w(null);try{if(a!==void 0&&Pp(a,0),e!==-1){let r=27+e,i=Dg(n,r),a=Mg(n[1],r),o=Zp(i,a,n);Np(i,ap(n,a,t,{dehydratedView:o}),0,op(a,o))}}finally{w(r)}}else if(a!==void 0){let e=Mp(a,0);e!==void 0&&(e[8]=t)}}var Sg=class{lContainer;$implicit;$index;constructor(e,t,n){this.lContainer=e,this.$implicit=t,this.$index=n}get $count(){return this.lContainer.length-10}};function Cg(e){return e}function wg(e,t){return t}var Tg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function I(e,t,n,r,i,a,o,s,c,l,u,d,f){jd(`NgControlFlow`);let p=D(),m=No(),h=c!==void 0,g=D(),_=new Tg(h,s?o.bind(g[15][8]):o);g[27+e]=_,eg(p,m,e+1,t,n,r,i,uo(m.consts,a),256),h&&eg(p,m,e+2,c,l,u,d,uo(m.consts,f),512)}var Eg=class extends mg{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,t,n){super(),this.lContainer=e,this.hostLView=t,this.templateTNode=n}get length(){return this.lContainer.length-10}at(e){return this.getLView(e)[8].$implicit}attach(e,t){let n=t[6];this.needsIndexUpdate||=e!==this.length,Np(this.lContainer,t,e,op(this.templateTNode,n)),Og(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,kg(this.lContainer,e),Ag(this.lContainer,e)}create(e,t){let n=Xp(this.lContainer,this.templateTNode.tView.ssrId);return ap(this.hostLView,this.templateTNode,new Sg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){of(e[1],e)}updateValue(e,t){this.getLView(e)[8].$implicit=t}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e0){let e=n[9];Hd(e,r),ld.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function kg(e,t){if(e.length<=10)return;let n=e[10+t],r=n?n[26]:void 0;r&&r.leave&&r.leave.size>0&&(r.detachedLeaveAnimationFns=[])}function Ag(e,t){return Fp(e,t)}function jg(e,t){return Mp(e,t)}function Mg(e,t){return io(e,t)}function R(e,t,n){let r=D();return om(r,Ko(),t)&&(No(),Vf(fs(),r,e,t,r[11],n)),R}function Ng(e,t,n,r,i){ep(t,e,n,i?`class`:`style`,r)}function z(e,t,n,r){let i=D(),a=i[1],o=e+27,s=a.firstCreatePass?Fm(o,i,2,t,qf,ko(),n,r):a.data[o];if(Ja(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(tm(o),()=>(Pg(e,t,i,s,r),z))}}return Pg(e,t,i,s,r),z}function Pg(e,t,n,r,i){if(Zf(r,n,e,t,Ig),Ya(r)){let e=n[1];Lf(e,n,r),ou(e,r,n)}i!=null&&Rf(n,r)}function B(){let e=No(),t=Qf(Po());return e.firstCreatePass&&Im(e,t),jo(t)&&Mo(),Oo(),t.classesWithoutHost!=null&&Kc(t)&&Ng(e,t,D(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&qc(t)&&Ng(e,t,D(),t.stylesWithoutHost,!1),B}function V(e,t,n,r){return z(e,t,n,r),B(),V}function H(e,t,n,r){let i=D(),a=i[1],o=e+27,s=a.firstCreatePass?Lm(o,a,2,t,n,r):a.data[o];return Zf(s,i,e,t,Ig),r!=null&&Rf(i,s),H}function U(){return jo(Qf(Po()))&&Mo(),Oo(),U}function Fg(e,t,n,r){return H(e,t,n,r),U(),Fg}var Ig=(e,t,n,r,i)=>(vs(!0),xu(t[11],r,hs()));function Lg(e,t,n){let r=D(),i=r[1],a=e+27,o=i.firstCreatePass?Fm(a,r,8,`ng-container`,qf,ko(),t,n):i.data[a];if(Zf(o,r,e,`ng-container`,Bg),Ya(o)){let e=r[1];Lf(e,r,o),ou(e,o,r)}return n!=null&&Rf(r,o),Lg}function Rg(){let e=No(),t=Qf(Po());return e.firstCreatePass&&Im(e,t),Rg}function zg(e,t,n){return Lg(e,t,n),Rg(),zg}var Bg=(e,t,n,r,i)=>(vs(!0),bu(t[11],``));function W(){return D()}function Vg(e,t,n){let r=D();return om(r,Ko(),t)&&(No(),Hf(fs(),r,e,t,r[11],n)),Vg}var Hg=void 0;function Ug(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Wg=[`en`,[[`a`,`p`],[`AM`,`PM`]],[[`AM`,`PM`]],[[`S`,`M`,`T`,`W`,`T`,`F`,`S`],[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`]],Hg,[[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],Hg,[[`B`,`A`],[`BC`,`AD`],[`Before Christ`,`Anno Domini`]],0,[6,0],[`M/d/yy`,`MMM d, y`,`MMMM d, y`,`EEEE, MMMM d, y`],[`h:mm a`,`h:mm:ss a`,`h:mm:ss a z`,`h:mm:ss a zzzz`],[`{1}, {0}`,Hg,Hg,Hg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ug],Gg=Object.create(null);function Kg(e){let t=Yg(e),n=qg(t);if(n)return n;let r=t.split(`-`)[0];if(n=qg(r),n)return n;if(r===`en`)return Wg;throw new T(701,!1)}function qg(e){if(!(e in Gg)){let t=Hi.ng&&Hi.ng.common&&Hi.ng.common.locales&&Hi.ng.common.locales[e];return t!==void 0&&(Gg[e]=t),t}return Gg[e]}var Jg={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencyCode:15,CurrencySymbol:16,CurrencyName:17,Currencies:18,Directionality:19,PluralCase:20,ExtraData:21};function Yg(e){return e.toLowerCase().replace(/_/g,`-`)}var Xg=`en-US`;function Zg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function G(e,t,n){let r=D(),i=No(),a=Po();return $g(i,r,r[11],a,e,t,n),G}function Qg(e,t,n){let r=D(),i=No(),a=Po();return(a.type&3||n)&&fm(a,i,r,n,r[11],e,t,um(a,r,t)),Qg}function $g(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=um(r,t,a),fm(r,e,t,o,n,i,a,c)&&(s=!1)),s){let e=r.outputs?.[i],n=r.hostDirectiveOutputs?.[i];if(n&&n.length)for(let e=0;e>17&32767}function a_(e){return(e&2)==2}function o_(e,t){return e&131071|t<<17}function s_(e){return e|2}function c_(e){return(e&131068)>>2}function l_(e,t){return e&-131069|t<<2}function u_(e){return(e&1)==1}function d_(e){return e|1}function f_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=i_(o),c=c_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||sa(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=i_(e[s+1]);e[r+1]=r_(t,s),t!==0&&(e[t+1]=l_(e[t+1],r)),e[s+1]=o_(e[s+1],r)}else e[r+1]=r_(s,0),s!==0&&(e[s+1]=l_(e[s+1],r)),s=r}else e[r+1]=r_(c,0),s===0?s=r:e[c+1]=l_(e[c+1],r),c=r;l&&(e[r+1]=s_(e[r+1])),m_(e,u,r,!0),m_(e,u,r,!1),p_(t,u,e,r,a),o=r_(s,c),a?t.classBindings=o:t.styleBindings=o}function p_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&sa(a,t)>=0&&(n[r+1]=d_(n[r+1]))}function m_(e,t,n,r){let i=e[n+1],a=t===null,o=r?i_(i):c_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];h_(n,t)&&(s=!0,e[o+1]=r?d_(i):s_(i)),o=r?i_(i):c_(i)}s&&(e[n+1]=r?s_(i):d_(i))}function h_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?sa(e,t)>=0:!1}var g_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function __(e){return e.substring(g_.key,g_.keyEnd)}function v_(e){return b_(e),y_(e,x_(e,0,g_.textEnd))}function y_(e,t){let n=g_.textEnd;return n===t?-1:(t=g_.keyEnd=S_(e,g_.key=t,n),x_(e,t,n))}function b_(e){g_.key=0,g_.keyEnd=0,g_.value=0,g_.valueEnd=0,g_.textEnd=e.length}function x_(e,t,n){for(;t32;)t++;return t}function C_(e,t,n){return E_(e,t,n,!1),C_}function q(e,t){return E_(e,t,null,!0),q}function w_(e){D_(L_,T_,e,!0)}function T_(e,t){for(let n=v_(t);n>=0;n=y_(t,n))aa(e,__(t),!0)}function E_(e,t,n,r){let i=D(),a=No(),o=qo(2);if(a.firstUpdatePass&&k_(a,e,o,r),t!==Ju&&om(i,o,t)){let s=a.data[us()];z_(a,s,i,i[11],e,i[o+1]=H_(t,n),r,o)}}function D_(e,t,n,r){let i=No(),a=qo(2);i.firstUpdatePass&&k_(i,null,a,r);let o=D();if(n!==Ju&&om(o,a,n)){let s=i.data[us()];if(U_(s,r)&&!O_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=oi(e,n||``)),Ng(i,s,o,n,r)}else R_(i,s,o,o[11],o[a+1],o[a+1]=I_(e,t,n),r,a)}}function O_(e,t){return t>=e.expandoStartIndex}function k_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[us()],o=O_(e,n);U_(a,r)&&t===null&&!o&&(t=!1),t=A_(i,a,t,r),f_(i,a,t,n,o,r)}}function A_(e,t,n,r){let i=Qo(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=P_(null,e,t,n,r),n=F_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=P_(i,e,t,n,r),a===null){let n=j_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=P_(null,e,t,n[1],r),n=F_(n,t.attrs,r),M_(e,t,r,n))}else a=N_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function j_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(c_(r)!==0)return e[i_(r)]}function M_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[i_(i)]=r}function N_(e,t,n){let r,i=t.directiveEnd;for(let a=1+t.directiveStylingLast;a0;){let t=e[i],a=Array.isArray(t),c=a?t[1]:t,l=c===null,u=n[i+1];u===Ju&&(u=l?ua:void 0);let d=l?oa(u,r):c===r?u:void 0;if(a&&!V_(d)&&(d=oa(t,r)),V_(d)&&(s=d,o))return s;let f=e[i+1];i=o?i_(f):c_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=oa(e,r))}return s}function V_(e){return e!==void 0}function H_(e,t){return e==null||e===``||(typeof t==`string`?e=lu(e)+t:typeof e==`object`&&(e=ai(lu(e)))),e}function U_(e,t){return!!(e.flags&(t?8:16))}function J(e,t=``){let n=D(),r=No(),i=e+27,a=r.firstCreatePass?Hp(r,i,1,t,null):r.data[i],o=W_(r,n,a,t);n[i]=o,_s()&&hf(r,n,o,a),Lo(a,!1)}var W_=(e,t,n,r)=>(vs(!0),vu(t[11],r));function G_(e,t,n,r=``){return om(e,Ko(),n)?t+Ai(n)+r:Ju}function K_(e,t,n,r,i,a=``){let o=sm(e,Wo(),n,i);return qo(2),o?t+Ai(n)+r+Ai(i)+a:Ju}function q_(e,t,n,r,i,a,o,s=``){let c=cm(e,Wo(),n,i,o);return qo(3),c?t+Ai(n)+r+Ai(i)+a+Ai(o)+s:Ju}function J_(e,t,n,r,i,a,o,s,c,l=``){let u=lm(e,Wo(),n,i,o,c);return qo(4),u?t+Ai(n)+r+Ai(i)+a+Ai(o)+s+Ai(c)+l:Ju}function Y(e){return X(``,e),Y}function X(e,t,n){let r=D(),i=G_(r,e,t,n);return i!==Ju&&Z_(r,us(),i),X}function Z(e,t,n,r,i){let a=D(),o=K_(a,e,t,n,r,i);return o!==Ju&&Z_(a,us(),o),Z}function Y_(e,t,n,r,i,a,o){let s=D(),c=q_(s,e,t,n,r,i,a,o);return c!==Ju&&Z_(s,us(),c),Y_}function X_(e,t,n,r,i,a,o,s,c){let l=D(),u=J_(l,e,t,n,r,i,a,o,s,c);return u!==Ju&&Z_(l,us(),u),X_}function Z_(e,t,n){let r=no(t,e);yu(e[11],r,n)}function Q_(e,t,n){vc(t)&&(t=t());let r=D();return om(r,Ko(),t)&&(No(),Vf(fs(),r,e,t,r[11],n)),Q_}function $_(e,t){let n=vc(e);return n&&e.set(t),n}function ev(e,t){let n=D(),r=No(),i=Po();return $g(r,n,n[11],i,e,t),ev}var tv={};function nv(e){jd(`NgLet`);let t=No(),n=D(),r=e+27;return Lo(Hp(t,r,128,null,null),!1),oo(t,n,r,tv),nv}function rv(e){return oo(No(),D(),us(),e),e}function iv(e){let t=ao(Bo(),27+e);if(t===tv)throw new T(314,!1);return t}function av(e,t,n=``){return G_(D(),e,t,n)}function ov(e,t){let n=Uo()+e,r=D();return r[n]===Ju?im(r,n,t()):am(r,n)}function sv(e,t,n){return lv(D(),Uo(),e,t,n)}function cv(e,t){let n=e[t];return n===Ju?void 0:n}function lv(e,t,n,r,i,a){let o=t+n;return om(e,o,i)?im(e,o+1,a?r.call(a,i):r(i)):cv(e,o+1)}function uv(e,t,n,r,i,a,o){let s=t+n;return sm(e,s,i,a)?im(e,s+2,o?r.call(o,i,a):r(i,a)):cv(e,s+2)}function dv(e,t){let n=No(),r,i=e+27;n.firstCreatePass?(r=fv(t,n.pipeRegistry),n.data[i]=r,r.onDestroy&&(n.destroyHooks??=[]).push(i,r.onDestroy)):r=n.data[i];let a=r.factory||(r.factory=Qi(r.type,!0)),o=Bi(bm);try{let e=il(!1),t=a();return il(e),oo(n,D(),i,t),t}finally{Bi(o)}}function fv(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function pv(e,t,n){let r=e+27,i=D(),a=ao(i,r);return hv(i,r)?lv(i,Uo(),t,a.transform,n,a):a.transform(n)}function mv(e,t,n,r){let i=e+27,a=D(),o=ao(a,i);return hv(a,i)?uv(a,Uo(),t,o.transform,n,r,o):o.transform(n,r)}function hv(e,t){return e[1].data[t].pure}function gv(e,t){return Vp(e,t)}var _v=(()=>{class e{applicationErrorHandler=E(Js);appRef=E(cg);taskService=E(Ds);ngZone=E(Fs);zonelessEnabled=E(ac);tracing=E(kd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new hr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ns):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(E(oc,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let e=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(e);return}this.switchToMicrotaskScheduler(),this.taskService.remove(e)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let e=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})})}notify(e){if(!this.zonelessEnabled&&e===5)return;switch(e){case 0:case 2:this.appRef.dirtyFlags|=2;break;case 3:case 4:case 5:case 1:this.appRef.dirtyFlags|=4;break;case 6:this.appRef.dirtyFlags|=2;break;case 12:this.appRef.dirtyFlags|=16;break;case 13:this.appRef.dirtyFlags|=2;break;case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let t=this.useMicrotaskScheduler?js:As;this.pendingRenderTaskId=this.taskService.add(),this.cancelScheduledCallback=this.scheduleInRootZone?Zone.root.run(()=>t(()=>this.tick())):this.ngZone.runOutsideAngular(()=>t(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(`isAngularZone_ID`+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(e){this.applicationErrorHandler(e)}finally{this.taskService.remove(e),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function vv(){return[{provide:ic,useExisting:_v},{provide:Fs,useClass:Us},{provide:ac,useValue:!0}]}function yv(){return typeof $localize<`u`&&$localize.locale||`en-US`}var bv=new vi(``,{factory:()=>E(bv,{optional:!0,skipSelf:!0})||yv()}),xv=class{destroyed=!1;listeners=null;errorHandler=E(qs,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=E(Cs);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new T(953,!1);return(this.listeners??=[]).push(e),{unsubscribe:()=>{let t=this.listeners?this.listeners.indexOf(e):-1;t>-1&&(this.isEmitting?(this.hasNullListeners=!0,this.listeners[t]=null):this.listeners.splice(t,1))}}}emit(e){if(this.destroyed){console.warn(ri(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=w(null);try{for(let t of this.listeners)try{t!==null&&t(e)}catch(e){this.errorHandler?.handleError(e)}}finally{this.hasNullListeners&&(this.hasNullListeners=!1,this.listeners&&Sv(this.listeners)),w(t),this.isEmitting=!1}}};function Sv(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function Q(e,t){return Mn(e,t?.equal)}function Cv(e){return ar(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var wv=e=>e;function Tv(e,t){return typeof e==`function`?Ev(tr(e,wv,t?.equal),t?.debugName,t?.set):Ev(tr(e.source,e.computation,e.equal),e.debugName,e.set)}function Ev(e,t,n){let r=e[dn],i=e;if(n!==void 0){let t=e=>nr(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Cv(e)),t)}else i.set=e=>nr(r,e),i.update=e=>rr(r,e);return i.asReadonly=Xs.bind(e),i}function Dv(e,t){let n=Object.create(bc);n.value=e,n.transformFn=t?.transform;function r(){if(mn(n),n.value===yc)throw new T(-950,null);return n.value}return r[dn]=n,r}function Ov(e){return new xv}function kv(e,t){return Dv(e,t)}function Av(e){return Dv(yc,e)}var $=(kv.required=Av,kv);function jv(e,t){let n=Object.create(bc),r=new xv;n.value=e;function i(){return mn(n),Mv(n.value),n.value}return i[dn]=n,i.asReadonly=Xs.bind(i),i.set=e=>{n.equal(n.value,e)||(Wn(n,e),r.emit(e))},i.update=e=>{Mv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function Mv(e){if(e===yc)throw new T(952,!1)}function Nv(e,t){return jv(e,t)}function Pv(e){return jv(yc,e)}var Fv=(Nv.required=Pv,Nv);function Iv(e,t){return Ah(t)}function Lv(e,t){return jh(t)}var Rv=(Iv.required=Lv,Iv),zv=new vi(``),Bv=new vi(``);function Vv(e){return!e.moduleRef}function Hv(e){let t=Vv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Fs);return n.run(()=>{Vv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Js),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),Vv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(zv);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(zv);n.add(t),e.moduleRef.onDestroy(()=>{ug(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return Wv(r,n,()=>{let n=t.get(Ds),r=n.add(),i=t.get(Zh);return i.runInitializers(),i.donePromise.then(()=>{if(Zg(t.get(bv,Xg)||`en-US`),!t.get(Bv,!0))return Vv(e)?t.get(cg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Vv(e)){let n=t.get(cg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return Uv?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var Uv;function Wv(e,t,n){try{let r=n();return Ph(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Gv=null;function Kv(e=[],t){return xs.create({name:t,providers:[{provide:Ta,useValue:`platform`},{provide:zv,useValue:new Set([()=>Gv=null])},...e]})}function qv(e=[]){if(Gv)return Gv;let t=Kv(e);return Gv=t,og(),Jv(t),t}function Jv(e){let t=e.get($s,null);Ha(e,()=>{t?.forEach(e=>e())})}function Yv(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Fc(Sc.BootstrapApplicationStart);try{let e=i?.injector??qv(r);return Hv({r3Injector:new Lh({providers:[vv(),Ys,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Fc(Sc.BootstrapApplicationEnd)}}var Xv=Symbol(`NOT_SET`),Zv=new Set,Qv={...Kn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Xv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(mn(r),r.value),r.signal[dn]=r,r.registerCleanupFn=e=>(r.cleanup??=new Set).add(e),this.nodes[e]=r,this.hooks[e]=e=>r.phaseFn(e)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();super.destroy();for(let e of this.nodes)if(e)try{for(let t of e.cleanup??Zv)t()}finally{En(e)}}};function ey(e,t){let n=t?.injector??E(xs),r=n.get(ic),i=n.get(Md),a=n.get(kd,null,{optional:!0});i.impl??=n.get(Pd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(nc,null,{optional:!0}),c=new $v(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var ty=null;function ny(){return ty}function ry(e){ty??=e}var iy=class{},ay=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(ay||{}),oy=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(oy||{}),sy=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(sy||{}),cy={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};function ly(e){return Kg(e)[Jg.LocaleId]}function uy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.DayPeriodsFormat],r[Jg.DayPeriodsStandalone]],t),n)}function dy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.DaysFormat],r[Jg.DaysStandalone]],t),n)}function fy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.MonthsFormat],r[Jg.MonthsStandalone]],t),n)}function py(e,t){let n=Kg(e)[Jg.Eras];return xy(n,t)}function my(e,t){return xy(Kg(e)[Jg.DateFormat],t)}function hy(e,t){return xy(Kg(e)[Jg.TimeFormat],t)}function gy(e,t){let n=Kg(e)[Jg.DateTimeFormat];return xy(n,t)}function _y(e,t){let n=Kg(e),r=n[Jg.NumberSymbols][t];if(r===void 0){if(t===cy.CurrencyDecimal)return n[Jg.NumberSymbols][cy.Decimal];if(t===cy.CurrencyGroup)return n[Jg.NumberSymbols][cy.Group]}return r}function vy(e){if(!e[Jg.ExtraData])throw new T(2303,!1)}function yy(e){let t=Kg(e);return vy(t),(t[Jg.ExtraData][2]||[]).map(e=>typeof e==`string`?Sy(e):[Sy(e[0]),Sy(e[1])])}function by(e,t,n){let r=Kg(e);return vy(r),xy(xy([r[Jg.ExtraData][0],r[Jg.ExtraData][1]],t)||[],n)||[]}function xy(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new T(2304,!1)}function Sy(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Cy=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,wy=Object.create(null),Ty=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,Ey=256;function Dy(e,t,n,r){let i=Xy(e);Oy(t),t=Ay(n,t)||t;let a=[],o;for(;t;)if(o=Ty.exec(t),o){a=a.concat(o.slice(1));let e=a.pop();if(!e)break;t=e}else{a.push(t);break}let s=i.getTimezoneOffset();r&&(s=qy(r,s),i=Yy(i,r));let c=``;return a.forEach(e=>{let t=Ky(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function Oy(e){if(e.length>Ey)throw new T(2300,!1)}function ky(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Ay(e,t){let n=ly(e);if(wy[n]??=Object.create(null),wy[n][t])return wy[n][t];let r=``;switch(t){case`shortDate`:r=my(e,sy.Short);break;case`mediumDate`:r=my(e,sy.Medium);break;case`longDate`:r=my(e,sy.Long);break;case`fullDate`:r=my(e,sy.Full);break;case`shortTime`:r=hy(e,sy.Short);break;case`mediumTime`:r=hy(e,sy.Medium);break;case`longTime`:r=hy(e,sy.Long);break;case`fullTime`:r=hy(e,sy.Full);break;case`short`:let t=Ay(e,`shortTime`),n=Ay(e,`shortDate`);r=jy(gy(e,sy.Short),[t,n]);break;case`medium`:let i=Ay(e,`mediumTime`),a=Ay(e,`mediumDate`);r=jy(gy(e,sy.Medium),[i,a]);break;case`long`:let o=Ay(e,`longTime`),s=Ay(e,`longDate`);r=jy(gy(e,sy.Long),[o,s]);break;case`full`:let c=Ay(e,`fullTime`),l=Ay(e,`fullDate`);r=jy(gy(e,sy.Full),[c,l])}return r&&(wy[n][t]=r),r}function jy(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function My(e,t,n=`-`,r,i){let a=``;(e<0||i&&e<=0)&&(i?e=-e+1:(e=-e,a=n));let o=String(e);for(;o.length0||s>-n)&&(s+=n),e===3)s===0&&n===-12&&(s=12);else if(e===6)return Ny(s,t);let c=_y(o,cy.MinusSign);return My(s,t,c,r,i)}}function Fy(e,t){switch(e){case 0:return t.getFullYear();case 1:return t.getMonth();case 2:return t.getDate();case 3:return t.getHours();case 4:return t.getMinutes();case 5:return t.getSeconds();case 6:return t.getMilliseconds();case 7:return t.getDay();default:throw new T(2301,!1)}}function Iy(e,t,n=ay.Format,r=!1){return function(i,a){return Ly(i,a,e,t,n,r)}}function Ly(e,t,n,r,i,a){switch(n){case 2:return fy(t,i,r)[e.getMonth()];case 1:return dy(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=yy(t),a=by(t,i,r),s=e.findIndex(e=>{if(Array.isArray(e)){let[t,r]=e,i=n>=t.hours&&o>=t.minutes,a=n0?Math.floor(i/60):Math.ceil(i/60);switch(e){case 0:return(i>=0?`+`:``)+My(o,2,a)+My(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+My(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+My(o,2,a)+`:`+My(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+My(o,2,a)+`:`+My(Math.abs(i%60),2,a);default:throw new T(2310,!1)}}}var zy=0,By=4;function Vy(e){let t=ky(e,zy,1).getDay();return ky(e,0,1+(t<=By?By:11)-t)}function Hy(e){let t=e.getDay(),n=t===0?-3:By-t;return ky(e.getFullYear(),e.getMonth(),e.getDate()+n)}function Uy(e,t=!1){return function(n,r){let i;if(t){let e=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,t=n.getDate();i=1+Math.floor((t+e)/7)}else{let e=Hy(n),t=Vy(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return My(i,e,_y(r,cy.MinusSign))}}function Wy(e,t=!1){return function(n,r){return My(Hy(n).getFullYear(),e,_y(r,cy.MinusSign),t)}}var Gy=Object.create(null);function Ky(e){if(Gy[e])return Gy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Iy(3,oy.Abbreviated);break;case`GGGG`:t=Iy(3,oy.Wide);break;case`GGGGG`:t=Iy(3,oy.Narrow);break;case`y`:t=Py(0,1,0,!1,!0);break;case`yy`:t=Py(0,2,0,!0,!0);break;case`yyy`:t=Py(0,3,0,!1,!0);break;case`yyyy`:t=Py(0,4,0,!1,!0);break;case`Y`:t=Wy(1);break;case`YY`:t=Wy(2,!0);break;case`YYY`:t=Wy(3);break;case`YYYY`:t=Wy(4);break;case`M`:case`L`:t=Py(1,1,1);break;case`MM`:case`LL`:t=Py(1,2,1);break;case`MMM`:t=Iy(2,oy.Abbreviated);break;case`MMMM`:t=Iy(2,oy.Wide);break;case`MMMMM`:t=Iy(2,oy.Narrow);break;case`LLL`:t=Iy(2,oy.Abbreviated,ay.Standalone);break;case`LLLL`:t=Iy(2,oy.Wide,ay.Standalone);break;case`LLLLL`:t=Iy(2,oy.Narrow,ay.Standalone);break;case`w`:t=Uy(1);break;case`ww`:t=Uy(2);break;case`W`:t=Uy(1,!0);break;case`d`:t=Py(2,1);break;case`dd`:t=Py(2,2);break;case`c`:case`cc`:t=Py(7,1);break;case`ccc`:t=Iy(1,oy.Abbreviated,ay.Standalone);break;case`cccc`:t=Iy(1,oy.Wide,ay.Standalone);break;case`ccccc`:t=Iy(1,oy.Narrow,ay.Standalone);break;case`cccccc`:t=Iy(1,oy.Short,ay.Standalone);break;case`E`:case`EE`:case`EEE`:t=Iy(1,oy.Abbreviated);break;case`EEEE`:t=Iy(1,oy.Wide);break;case`EEEEE`:t=Iy(1,oy.Narrow);break;case`EEEEEE`:t=Iy(1,oy.Short);break;case`a`:case`aa`:case`aaa`:t=Iy(0,oy.Abbreviated);break;case`aaaa`:t=Iy(0,oy.Wide);break;case`aaaaa`:t=Iy(0,oy.Narrow);break;case`b`:case`bb`:case`bbb`:t=Iy(0,oy.Abbreviated,ay.Standalone,!0);break;case`bbbb`:t=Iy(0,oy.Wide,ay.Standalone,!0);break;case`bbbbb`:t=Iy(0,oy.Narrow,ay.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Iy(0,oy.Abbreviated,ay.Format,!0);break;case`BBBB`:t=Iy(0,oy.Wide,ay.Format,!0);break;case`BBBBB`:t=Iy(0,oy.Narrow,ay.Format,!0);break;case`h`:t=Py(3,1,-12);break;case`hh`:t=Py(3,2,-12);break;case`H`:t=Py(3,1);break;case`HH`:t=Py(3,2);break;case`m`:t=Py(4,1);break;case`mm`:t=Py(4,2);break;case`s`:t=Py(5,1);break;case`ss`:t=Py(5,2);break;case`S`:t=Py(6,1);break;case`SS`:t=Py(6,2);break;case`SSS`:t=Py(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=Ry(0);break;case`ZZZZZ`:t=Ry(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=Ry(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=Ry(2);break;default:return null}return Gy[e]=t,t}function qy(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function Jy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function Yy(e,t,n){let r=e.getTimezoneOffset();return Jy(e,-1*(qy(t,r)-r))}function Xy(e){if(Qy(e))return e;if(typeof e==`number`&&!isNaN(e))return new Date(e);if(typeof e==`string`){if(e=e.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(e)){let[t,n=1,r=1]=e.split(`-`).map(e=>+e);return ky(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Cy))return Zy(n)}let t=new Date(e);if(!Qy(t))throw new T(2311,!1);return t}function Zy(e){let t=new Date(0),n=0,r=0,i=e[8]?t.setUTCFullYear:t.setFullYear,a=e[8]?t.setUTCHours:t.setHours;e[9]&&(n=Number(e[9]+e[10]),r=Number(e[9]+e[11])),i.call(t,Number(e[1]),Number(e[2])-1,Number(e[3]));let o=Number(e[4]||0)-n,s=Number(e[5]||0)-r,c=Number(e[6]||0),l=Math.floor(parseFloat(`0.`+(e[7]||0))*1e3);return a.call(t,o,s,c,l),t}function Qy(e){return e instanceof Date&&!isNaN(e.valueOf())}var $y=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=E(xs);constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let e=this._viewContainerRef;if(this._viewRef&&e.remove(e.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let t=this._createContextForwardProxy();this._viewRef=e.createEmbeddedView(this.ngTemplateOutlet,t,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===`outlet`?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,t,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,t,n):!1,get:(e,t,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,t,n)}})}static ɵfac=function(t){return new(t||e)(bm(eh))};static ɵdir=Wh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Ec]})}return e})();function eb(e,t){return new T(2100,!1)}var tb=`mediumDate`,nb=new vi(``),rb=new vi(``),ib=(()=>{class e{locale;defaultTimezone;defaultOptions;constructor(e,t,n){this.locale=e,this.defaultTimezone=t,this.defaultOptions=n}transform(t,n,r,i){if(t==null||t===``||t!==t)return null;try{let e=n??this.defaultOptions?.dateFormat??tb,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Dy(t,e,i||this.locale,a)}catch(t){throw eb(e,t.message)}}static ɵfac=function(t){return new(t||e)(bm(bv,16),bm(nb,24),bm(rb,24))};static ɵpipe=Gh({name:`date`,type:e,pure:!0})}return e})(),ab=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=Gh({name:`json`,type:e,pure:!1})}return e})();function ob(e,t){t=encodeURIComponent(t);for(let n of e.split(`;`)){let e=n.indexOf(`=`),[r,i]=e==-1?[n,``]:[n.slice(0,e),n.slice(e+1)];if(r.trim()!==t)continue;let a=i;try{a=decodeURIComponent(i)}catch{}return a.length>1&&a[0]===`"`&&a[a.length-1]===`"`&&(a=a.slice(1,-1)),a}return null}var sb=`browser`,cb=class{_doc;constructor(e){this._doc=e}manager},lb=(()=>{class e extends cb{constructor(e){super(e)}supports(e){return!0}addEventListener(e,t,n,r){return e.addEventListener(t,n,r),()=>this.removeEventListener(e,t,n,r)}removeEventListener(e,t,n,r){return e.removeEventListener(t,n,r)}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),ub=new vi(``),db=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(e,t){this._zone=t,e.forEach(e=>{e.manager=this});let n=e.filter(e=>!(e instanceof lb));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof lb);r&&this._plugins.push(r)}addEventListener(e,t,n,r){return this._findPluginFor(t).addEventListener(e,t,n,r)}getZone(){return this._zone}_findPluginFor(e){let t=this._eventNameToPlugin.get(e);if(t)return t;if(t=this._plugins.find(t=>t.supports(e)),!t)throw new T(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(qi(ub),qi(Fs))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),fb=`ng-app-id`;function pb(e){for(let t of e)t.remove()}function mb(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function hb(e,t,n,r){let i=e.head?.querySelectorAll(`style[${fb}="${t}"],link[${fb}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(fb),e instanceof HTMLLinkElement?r.set(e.href.slice(e.href.lastIndexOf(`/`)+1),{usage:0,elements:[e]}):e.textContent&&n.set(e.textContent,{usage:0,elements:[e]});return!0}function gb(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var _b=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(e,t,n,r={}){this.doc=e,this.appId=t,this.nonce=n,hb(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,mb);t?.forEach(e=>this.addUsage(e,this.external,gb))}removeStyles(e,t){for(let t of e)this.removeUsage(t,this.inline);t?.forEach(e=>this.removeUsage(e,this.external))}addUsage(e,t,n){let r=t.get(e);r?r.usage++:t.set(e,{usage:1,elements:[...this.hosts].map(t=>this.addElement(t,n(e,this.doc)))})}removeUsage(e,t){let n=t.get(e);n&&(n.usage--,n.usage<=0&&(pb(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])pb(e);this.hosts.clear()}addHost(e){if(!this.hosts.has(e)){this.hosts.add(e);for(let[t,{elements:n}]of this.inline)n.push(this.addElement(e,mb(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,gb(t,this.doc)))}}removeHost(e){this.hosts.delete(e);for(let t of[...this.inline.values(),...this.external.values()]){let n=[];for(let r of t.elements)r.parentNode===e?r.remove():n.push(r);t.elements=n}}addElement(e,t){return this.nonce&&t.setAttribute(`nonce`,this.nonce),e.appendChild(t)}static ɵfac=function(t){return new(t||e)(qi(Ss),qi(Zs),qi(tc,8),qi(ec))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),vb={svg:`http://www.w3.org/2000/svg`,xhtml:`http://www.w3.org/1999/xhtml`,xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`,xmlns:`http://www.w3.org/2000/xmlns/`,math:`http://www.w3.org/1998/Math/MathML`},yb=/%COMP%/g,bb=`%COMP%`,xb=`_nghost-${bb}`,Sb=`_ngcontent-${bb}`,Cb=!0,wb=new vi(``,{factory:()=>Cb}),Tb=new vi(``);function Eb(e){return Sb.replace(yb,e)}function Db(e){return xb.replace(yb,e)}function Ob(e,t){return t.map(t=>t.replace(yb,e))}var kb=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;cssVarNamespace;constructor(e,t,n,r,i,a,o=null,s=null,c=null){this.eventManager=e,this.sharedStylesHost=t,this.appId=n,this.removeStylesOnCompDestroy=r,this.doc=i,this.ngZone=a,this.nonce=o,this.tracingService=s,this.cssVarNamespace=c??``,this.defaultRenderer=new Ab(e,i,a,this.tracingService,this.cssVarNamespace)}createRenderer(e,t){if(!e||!t)return this.defaultRenderer;let n=this.getOrCreateRenderer(e,t);return n instanceof Pb?n.applyToHost(e):n instanceof Nb&&n.applyStyles(),n}getOrCreateRenderer(e,t){let n=this.rendererByCompId,r=n.get(t.id);if(!r){let i=this.doc,a=this.ngZone,o=this.eventManager,s=this.sharedStylesHost,c=this.removeStylesOnCompDestroy,l=this.tracingService;switch(t.encapsulation){case su.Emulated:r=new Pb(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case su.ShadowDom:return new Mb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case su.ExperimentalIsolatedShadowDom:return new Mb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new Nb(o,s,t,c,i,a,l,this.cssVarNamespace)}n.set(t.id,r)}return r}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static ɵfac=function(t){return new(t||e)(qi(db),qi(vm),qi(Zs),qi(wb),qi(Ss),qi(Fs),qi(tc),qi(kd,8),qi(Tb,8))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),Ab=class{eventManager;doc;ngZone;tracingService;cssVarNamespace;data=Object.create(null);throwOnSyntheticProps=!0;constructor(e,t,n,r,i=``){this.eventManager=e,this.doc=t,this.ngZone=n,this.tracingService=r,this.cssVarNamespace=i}destroy(){}destroyNode=null;createElement(e,t){return t?this.doc.createElementNS(vb[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(jb(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=jb(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new T(-5106,!1);r.insertBefore(t,n)}}removeChild(e,t){t.remove()}selectRootElement(e,t){let n=typeof e==`string`?this.doc.querySelector(e):e;if(!n)throw new T(-5104,!1);return t||(n.textContent=``),n}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,t,n,r){if(r){t=r+`:`+t;let i=vb[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=vb[n];r?e.removeAttributeNS(r,t):e.removeAttribute(`${n}:${t}`)}else e.removeAttribute(t)}addClass(e,t){e.classList.add(t)}removeClass(e,t){e.classList.remove(t)}setStyle(e,t,n,r){let i=t.startsWith(`--`);i&&(t=t.replace(`%NS%`,this.cssVarNamespace)),i||r&(Yu.DashCase|Yu.Important)?e.style.setProperty(t,n,r&Yu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Yu.DashCase?e.style.removeProperty(t):e.style[t]=``}setProperty(e,t,n){e!=null&&(e[t]=n)}setValue(e,t){e.nodeValue=t}listen(e,t,n,r){if(typeof e==`string`&&(e=ny().getGlobalEventTarget(this.doc,e),!e))throw new T(-5102,!1);let i=this.decoratePreventDefault(n);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(e,t,i)),this.eventManager.addEventListener(e,t,i,r)}decoratePreventDefault(e){return t=>{if(t===`__ngUnwrap__`)return e;e(t)===!1&&t.preventDefault()}}};function jb(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var Mb=class extends Ab{hostEl;sharedStylesHost;shadowRoot;constructor(e,t,n,r,i,a,o,s,c){super(e,r,i,o,s),this.hostEl=t,this.sharedStylesHost=c,this.shadowRoot=t.attachShadow({mode:`open`}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=Ob(n.id,l).map(e=>e.replace(/%NS%/g,s));for(let e of l){let t=document.createElement(`style`);a&&t.setAttribute(`nonce`,a),t.textContent=e,this.shadowRoot.appendChild(t)}let u=n.getExternalStyles?.();if(u)for(let e of u){let t=gb(e,r);a&&t.setAttribute(`nonce`,a),this.shadowRoot.appendChild(t)}}nodeOrShadowRoot(e){return e===this.hostEl?this.shadowRoot:e}appendChild(e,t){return super.appendChild(this.nodeOrShadowRoot(e),t)}insertBefore(e,t,n){return super.insertBefore(this.nodeOrShadowRoot(e),t,n)}removeChild(e,t){return super.removeChild(null,t)}parentNode(e){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(e)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},Nb=class extends Ab{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(e,t,n,r,i,a,o,s,c){super(e,i,a,o,s),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r;let l=n.styles,u=c?Ob(c,l):l;this.styles=u.map(e=>e.replace(/%NS%/g,s)),this.styleUrls=n.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&ld.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Pb=class extends Nb{contentAttr;hostAttr;constructor(e,t,n,r,i,a,o,s,c){let l=r+`-`+n.id;super(e,t,n,i,a,o,s,c,l),this.contentAttr=Eb(l),this.hostAttr=Db(l)}applyToHost(e){this.applyStyles(),this.setAttribute(e,this.hostAttr,``)}createElement(e,t){let n=super.createElement(e,t);return super.setAttribute(n,this.contentAttr,``),n}},Fb=class e extends iy{supportsDOMEvents=!0;static makeCurrent(){ry(new e)}onAndCancel(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}dispatchEvent(e,t){e.dispatchEvent(t)}remove(e){e.remove()}createElement(e,t){return t||=this.getDefaultDocument(),t.createElement(e)}createHtmlDocument(){return document.implementation.createHTMLDocument(`fakeTitle`)}getDefaultDocument(){return document}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}isShadowRoot(e){return e instanceof DocumentFragment}getGlobalEventTarget(e,t){return t===`window`?window:t===`document`?e:t===`body`?e.body:null}getBaseHref(e){let t=Lb();return t==null?null:Rb(t)}resetBaseElement(){Ib=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return ob(document.cookie,e)}},Ib=null;function Lb(){return Ib||=document.head.querySelector(`base`),Ib?Ib.getAttribute(`href`):null}function Rb(e){return new URL(e,document.baseURI).pathname}var zb=[`alt`,`control`,`meta`,`shift`],Bb={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},Vb={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},Hb=(()=>{class e extends cb{constructor(e){super(e)}supports(t){return e.parseEventName(t)!=null}addEventListener(t,n,r,i){let a=e.parseEventName(n),o=e.eventCallback(a.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>ny().onAndCancel(t,a.domEventName,o,i))}static parseEventName(t){let n=t.toLowerCase().split(`.`),r=n.shift();if(n.length===0||r!==`keydown`&&r!==`keyup`)return null;let i=e._normalizeKey(n.pop()),a=``,o=n.indexOf(`code`);if(o>-1&&(n.splice(o,1),a=`code.`),zb.forEach(e=>{let t=n.indexOf(e);t>-1&&(n.splice(t,1),a+=e+`.`)}),a+=i,n.length!=0||i.length===0)return null;let s={};return s.domEventName=r,s.fullKey=a,s}static matchEventFullKeyCode(e,t){let n=Bb[e.key]||e.key,r=``;return t.indexOf(`code.`)>-1&&(n=e.code,r=`code.`),n==null||!n?!1:(n=n.toLowerCase(),n===` `?n=`space`:n===`.`&&(n=`dot`),zb.forEach(t=>{if(t!==n){let n=Vb[t];n(e)&&(r+=t+`.`)}}),r+=n,r===t)}static eventCallback(t,n,r){return i=>{e.matchEventFullKeyCode(i,t)&&r.runGuarded(()=>n(i))}}static _normalizeKey(e){return e===`esc`?`escape`:e}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})();async function Ub(e,t,n){return Yv({rootComponent:e,...Wb(t,n)})}function Wb(e,t){return{platformRef:t?.platformRef,appProviders:[...Yb,...e?.providers??[]],platformProviders:Jb}}function Gb(){Fb.makeCurrent()}function Kb(){return new qs}function qb(){return Yl(document),document}var Jb=[{provide:ec,useValue:sb},{provide:$s,useValue:Gb,multi:!0},{provide:Ss,useFactory:qb}],Yb=[{provide:Ta,useValue:`root`},{provide:qs,useFactory:Kb},{provide:ub,useClass:lb,multi:!0},{provide:ub,useClass:Hb,multi:!0},kb,{provide:vm,useClass:_b},{provide:_b,useExisting:vm},db,{provide:$p,useExisting:kb},[]];function Xb(e,t){let n=`\x1B[${e}m`,r=`\x1B[${t}m`;return((e,...t)=>{if(Array.isArray(e)&&`raw`in e){let i=e,a=``;for(let e=0;e{let r=new ex({code:i,why:Qb(a.why,e),fix:Qb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:Qb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function rx(e){return t=>{let n=`${e.bold(e.red(`[${t.name}]`))} ${t.message}`,r=[];return t.fix&&r.push(`${e.dim(`fix:`)} ${t.fix}`),t.sources?.length&&r.push(`${e.dim(`sources:`)} ${t.sources.join(`, `)}`),t.docs&&r.push(`${e.dim(`see:`)} ${e.cyan(t.docs)}`),r.length===0?n:[n,...r.map((t,n)=>`${e.dim(n{e=n,t=r}),resolve:e,reject:t}}var lx=Math.random.bind(Math),ux=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function dx(e=21){let t=``,n=e;for(;n--;)t+=ux[lx()*64|0];return t}var fx=6e4,px=e=>e,mx=px,{clearTimeout:hx,setTimeout:gx}=globalThis;function _x(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=px,deserialize:s=mx,resolver:c,bind:l=`rpc`,timeout:u=fx,proxify:d=!0}=t,f=!1,p=new Map,m,h;async function g(e,r,i,a){if(f)throw Error(`[birpc] rpc is closed, cannot call "${e}"`);let s={m:e,a:r,t:`q`};a&&(s.o=!0);let c=async e=>n(o(e));if(i){await c(s);return}if(m)try{await m}finally{m=void 0}let{promise:l,resolve:d,reject:g}=cx(),_=dx();s.i=_;let ee;async function v(n=s){return u>=0&&(ee=gx(()=>{try{if(t.onTimeoutError?.call(h,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}p.delete(_)},u),typeof ee==`object`&&(ee=ee.unref?.())),p.set(_,{resolve:d,reject:g,timeoutId:ee,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(h,s,v,d):await v()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{hx(ee),p.delete(_)}return l}let _={$call:(e,...t)=>g(e,t,!1),$callOptional:(e,...t)=>g(e,t,!1,!0),$callEvent:(e,...t)=>g(e,t,!0),$callRaw:e=>g(e.method,e.args,e.event,e.optional),$rejectPendingCalls:v,get $closed(){return f},get $meta(){return t.meta},$close:ee,$functions:e};h=d?new Proxy({},{get(t,n){if(Object.hasOwn(_,n))return _[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>g(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>g(n,e,!1);return i.asEvent=r,i}}):_;function ee(e){f=!0,p.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),p.clear(),i(te)}function v(e){let t=Array.from(p.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return p.clear(),t}async function te(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(h,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?h:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(h,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(h,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(h,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(hx(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(te),h}function vx(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var yx=Object.freeze({type:`object`,additionalProperties:!0});function bx(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return yx}return yx}function xx(e){if(!e||e.length===0)return{type:`object`,properties:{}};let t={},n=[];for(let r=0;rn[`arg${t}`]);if(`arg0`in n){let e=[];for(;`arg${e.length}`in n;)e.push(n[`arg${e.length}`]);return e}return Object.keys(n).length===0?[]:void 0}function Cx(e,t){return Sx(e,t)??[e]}function wx(e){return typeof e==`string`?`'${e}'`:new Ox().serialize(e)}var Tx=` _-,;:!?.'"()[]{}@*/\\%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Ex=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Tx.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Dx(e,t){if(e===t)return 0;let n=Math.min(e.length,t.length),r=0;for(let i=0;ia?-1:1)}return e.length===t.length?r:e.lengththis.compare(e[0],t[0])),r=`${e}{`;for(let e=0;ethis.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e})(),kx=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Ax=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],jx=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Mx=[],Nx=class{_data=new Px;_hash=new Px([...kx]);_nDataBytes=0;_minBufferSize=0;finalize(e){e&&this._append(e);let t=this._nDataBytes*8,n=this._data.sigBytes*8;return this._data.words[n>>>5]|=128<<24-n%32,this._data.words[(n+64>>>9<<4)+14]=Math.floor(t/4294967296),this._data.words[(n+64>>>9<<4)+15]=t,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(e,t){let n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7];for(let n=0;n<64;n++){if(n<16)Mx[n]=e[t+n]|0;else{let e=Mx[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Mx[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Mx[n]=t+Mx[n-7]+i+Mx[n-16]}let d=s&c^~s&l,f=r&i^r&a^i&a,p=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=(s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25),h=u+m+d+Ax[n]+Mx[n],g=p+f;u=l,l=c,c=s,s=o+h|0,o=a,a=i,i=r,r=h+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+s|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+u|0}_append(e){typeof e==`string`&&(e=Px.fromUtf8(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes}_process(e){let t,n=this._data.sigBytes/64;n=e?Math.ceil(n):Math.max((n|0)-this._minBufferSize,0);let r=n*16,i=Math.min(r*4,this._data.sigBytes);if(r){for(let e=0;e>>2]|=(n.charCodeAt(e)&255)<<24-e%4*8;return new e(i,r)}toBase64(){let e=[];for(let t=0;t>>2]>>>24-t%4*8&255,r=this.words[t+1>>>2]>>>24-(t+1)%4*8&255,i=this.words[t+2>>>2]>>>24-(t+2)%4*8&255,a=n<<16|r<<8|i;for(let n=0;n<4&&t*8+n*6>>6*(3-n)&63))}return e.join(``)}concat(e){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let t=0;t>>2]>>>24-t%4*8&255;this.words[this.sigBytes+t>>>2]|=n<<24-(this.sigBytes+t)%4*8}else for(let t=0;t>>2]=e.words[t>>>2];this.sigBytes+=e.sigBytes}};function Fx(e){return new Nx().finalize(e).toBase64()}function Ix(e){return Fx(wx(e))}function Lx(e){return Ix(e)}function Rx(){let e={};function t(t,...n){let r=e[t]||[];for(let e=0,t=r.length;e{e[t]=e[t]?.filter(e=>n!==e)}}function i(e,t){let n=r(e,((...e)=>(n(),t(...e))));return n}return{_listeners:e,emit:t,emitOnce:n,on:r,once:i}}var zx=/^[\w+.-]{2,}:\/\//;function Bx(e){return e.endsWith(`/`)?e:`${e}/`}function Vx(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function Hx(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?Bx(n)+e.replace(/^\.?\//,``):e);return n}function Ux(e,t){if(!t||t===`/`||zx.test(e))return e;let n=Vx(t);return e.startsWith(n)?e:Hx(n,e)}function Wx(e,t){let n=e.match(zx);return t+(n?e.slice(n[0].length):e)}var Gx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Kx(e=21){let t=``,n=e;for(;n--;)t+=Gx[Math.random()*64|0];return t}var qx=Symbol.for(`immer-nothing`),Jx=Symbol.for(`immer-draftable`),Yx=Symbol.for(`immer-state`),Xx=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},`This object has been frozen and should not be mutated`,function(e){return`Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? `+e},`An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.`,`Immer forbids circular references`,"The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},`Object.defineProperty() cannot be used on an Immer draft`,`Object.setPrototypeOf() cannot be used on an Immer draft`,`Immer only supports deleting array indices`,`Immer only supports setting array indices and the 'length' property`,function(e){return`'original' expects a draft, got: ${e}`}];function Zx(e,...t){{let n=Xx[e],r=xS(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var Qx=Object,$x=Qx.getPrototypeOf,eS=`constructor`,tS=`prototype`,nS=`configurable`,rS=`enumerable`,iS=`writable`,aS=`value`,oS=e=>!!e&&!!e[Yx];function sS(e){return e?uS(e)||_S(e)||!!e[Jx]||!!e[eS]?.[Jx]||vS(e)||yS(e):!1}var cS=Qx[tS][eS].toString(),lS=new WeakMap;function uS(e){if(!e||!bS(e))return!1;let t=$x(e);if(t===null||t===Qx[tS])return!0;let n=Qx.hasOwnProperty.call(t,eS)&&t[eS];if(n===Object)return!0;if(!xS(n))return!1;let r=lS.get(n);return r===void 0&&(r=Function.toString.call(n),lS.set(n,r)),r===cS}function dS(e,t,n=!0){fS(e)===0?(n?Reflect.ownKeys(e):Qx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function fS(e){let t=e[Yx];return t?t.type_:_S(e)?1:vS(e)?2:yS(e)?3:0}var pS=(e,t,n=fS(e))=>n===2?e.has(t):Qx[tS].hasOwnProperty.call(e,t),mS=(e,t,n=fS(e))=>n===2?e.get(t):e[t],hS=(e,t,n,r=fS(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function gS(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var _S=Array.isArray,vS=e=>e instanceof Map,yS=e=>e instanceof Set,bS=e=>typeof e==`object`,xS=e=>typeof e==`function`,SS=e=>typeof e==`boolean`;function CS(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var wS=e=>bS(e)?e?.[Yx]:null,TS=e=>e.copy_||e.base_,ES=e=>e.modified_?e.copy_:e.base_;function DS(e,t){if(vS(e))return new Map(e);if(yS(e))return new Set(e);if(_S(e))return Array[tS].slice.call(e);let n=uS(e);if(t===!0||t===`class_only`&&!n){let t=Qx.getOwnPropertyDescriptors(e);delete t[Yx];let n=Reflect.ownKeys(t);for(let r=0;r1&&Qx.defineProperties(e,{set:AS,add:AS,clear:AS,delete:AS}),Qx.freeze(e),t&&dS(e,(e,t)=>{OS(t,!0)},!1),e)}function kS(){Zx(2)}var AS={[aS]:kS};function jS(e){return e===null||!bS(e)||Qx.isFrozen(e)}var MS=`MapSet`,NS=`Patches`,PS=`ArrayMethods`,FS={};function IS(e){let t=FS[e];return t||Zx(0,e),t}var LS=e=>!!FS[e];function RS(e,t){FS[e]||(FS[e]=t)}var zS,BS=()=>zS,VS=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:LS(MS)?IS(MS):void 0,arrayMethodsPlugin_:LS(PS)?IS(PS):void 0});function HS(e,t){t&&(e.patchPlugin_=IS(NS),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function US(e){WS(e),e.drafts_.forEach(KS),e.drafts_=null}function WS(e){e===zS&&(zS=e.parent_)}var GS=e=>zS=VS(zS,e);function KS(e){let t=e[Yx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function qS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[Yx].modified_&&(US(t),Zx(4)),sS(e)&&(e=JS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[Yx].base_,e,t)}else e=JS(t,n);return YS(t,e,!0),US(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===qx?void 0:e}function JS(e,t){if(jS(t))return t;let n=t[Yx];if(!n)return rC(t,e.handledSet_,e);if(!ZS(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);tC(n,e)}return n.copy_}function YS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&OS(t,n)}function XS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var ZS=(e,t)=>e.scope_===t,QS=[];function $S(e,t,n,r){let i=TS(e),a=e.type_;if(r!==void 0&&mS(i,r,a)===t){hS(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;dS(i,(e,n)=>{if(oS(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??QS;for(let e of o)hS(i,e,n,a)}function eC(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!ZS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=ES(i);$S(e,i.draft_??i,a,n),tC(i,r)})}function tC(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}XS(e)}}function nC(e,t,n){let{scope_:r}=e;if(oS(n)){let i=n[Yx];ZS(i,r)&&i.callbacks_.push(function(){fC(e),$S(e,n,ES(i),t)})}else sS(n)&&e.callbacks_.push(function(){let i=TS(e);e.type_===3?i.has(n)&&rC(n,r.handledSet_,r):mS(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&rC(mS(e.copy_,t,e.type_),r.handledSet_,r)})}function rC(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||oS(e)||t.has(e)||!sS(e)||jS(e)?e:(t.add(e),dS(e,(r,i)=>{if(oS(i)){let t=i[Yx];ZS(t,n)&&(hS(e,r,ES(t),e.type_),XS(t))}else sS(i)&&rC(i,t,n)}),e)}function iC(e,t){let n=_S(e),r={type_:+!!n,scope_:t?t.scope_:BS(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=aC;n&&(i=[r],a=oC);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var aC={get(e,t){if(t===Yx)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=TS(e);if(!pS(i,t,e.type_))return lC(e,i,t);let a=i[t];if(e.finalized_||!sS(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&CS(t))return a;if(a===sC(e.base_,t)||cC(e,t,a)){fC(e);let n=e.type_===1?+t:t,r=mC(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in TS(e)},ownKeys(e){return Reflect.ownKeys(TS(e))},set(e,t,n){let r=uC(TS(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=sC(TS(e),t),i=r?.[Yx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(gS(n,r)&&(n!==void 0||pS(e.base_,t,e.type_)))return!0;fC(e),dC(e)}return e.copy_[t]===n&&(n!==void 0||pS(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),nC(e,t,n),!0)},deleteProperty(e,t){return fC(e),sC(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),dC(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=TS(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[iS]:!0,[nS]:e.type_!==1||t!==`length`,[rS]:r[rS],[aS]:n[t]}},defineProperty(){Zx(11)},getPrototypeOf(e){return $x(e.base_)},setPrototypeOf(){Zx(12)}},oC={};for(let e in aC){let t=aC[e];oC[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}oC.deleteProperty=function(e,t){return isNaN(parseInt(t))&&Zx(13),oC.set.call(this,e,t,void 0)},oC.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&Zx(14),aC.set.call(this,e[0],t,n,e[0])};function sC(e,t){let n=e[Yx];return(n?TS(n):e)[t]}function cC(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!sS(n)||n[Yx]?!1:e.baseRefs_.has(n)}function lC(e,t,n){let r=uC(t,n);return r?aS in r?r[aS]:r.get?.call(e.draft_):void 0}function uC(e,t){if(!(t in e))return;let n=$x(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=$x(n)}}function dC(e){e.modified_||(e.modified_=!0,e.parent_&&dC(e.parent_))}function fC(e){e.copy_||=(e.assigned_=new Map,DS(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var pC=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(xS(e)&&!xS(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}xS(t)||Zx(6),n!==void 0&&!xS(n)&&Zx(7);let r;if(sS(e)){let i=GS(this),a=mC(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?US(i):WS(i)}return HS(i,n),qS(r,i)}if(!e||!bS(e)){if(r=t(e),r===void 0&&(r=e),r===qx&&(r=void 0),this.autoFreeze_&&OS(r,!0),n){let t=[],i=[];IS(NS).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}Zx(1,e)},this.produceWithPatches=(e,t)=>{if(xS(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},SS(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),SS(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),SS(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){sS(e)||Zx(8),oS(e)&&(e=hC(e));let t=GS(this),n=mC(t,e,void 0);return n[Yx].isManual_=!0,WS(t),n}finishDraft(e,t){let n=e&&e[Yx];(!n||!n.isManual_)&&Zx(9);let{scope_:r}=n;return HS(r,t),qS(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=IS(NS).applyPatches_;return oS(e)?r(e,t):this.produce(e,e=>r(e,t))}};function mC(e,t,n,r){let[i,a]=vS(t)?IS(MS).proxyMap_(t,n):yS(t)?IS(MS).proxySet_(t,n):iC(t,n);return(n?.scope_??BS()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?eC(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function hC(e){return oS(e)||Zx(10,e),gC(e)}function gC(e){if(!sS(e)||jS(e))return e;let t=e[Yx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=DS(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=DS(e,!0);return dS(n,(e,t)=>{hS(n,e,gC(t))},r),t&&(t.finalized_=!1),n}function _C(){Xx.push(`Sets cannot have "replace" patches.`,function(e){return`Unsupported patch operation: `+e},function(e){return`Cannot apply patch, path doesn't resolve: `+e},`Patching reserved attributes like __proto__, prototype and constructor is not allowed`);function e(n,r=[]){if(n.key_!==void 0){let e=n.parent_.copy_??n.parent_.base_,t=wS(mS(e,n.key_)),i=mS(e,n.key_);if(i===void 0||i!==n.draft_&&i!==n.base_&&i!==n.copy_||t!=null&&t.base_!==n.base_)return null;let a=n.parent_.type_===3,o;if(a){let e=n.parent_;o=Array.from(e.drafts_.keys()).indexOf(n.key_)}else o=n.key_;if(!(a&&e.size>o||pS(e,o)))return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e{let u=mS(o,e,c),f=mS(s,e,c),p=l?pS(o,e)?n:`add`:r;if(u===f&&p===n)return;let m=t.concat(e);i.push(p===r?{op:p,path:m}:{op:p,path:m,value:d(f)}),a.push(p===`add`?{op:r,path:m}:p===r?{op:`add`,path:m,value:d(u)}:{op:n,path:m,value:d(u)})})}function s(e,t,n,i){let{base_:a,copy_:o}=e,s=0;a.forEach(e=>{if(!o.has(e)){let a=t.concat([s]);n.push({op:r,path:a,value:e}),i.unshift({op:`add`,path:a,value:e})}s++}),s=0,o.forEach(e=>{if(!a.has(e)){let a=t.concat([s]);n.push({op:`add`,path:a,value:e}),i.unshift({op:r,path:a,value:e})}s++})}function c(e,t,r){let{patches_:i,inversePatches_:a}=r;i.push({op:n,path:[],value:t===qx?void 0:t}),a.push({op:n,path:[],value:e})}function l(e,t){return t.forEach(t=>{let{path:i,op:a}=t,o=e;for(let e=0;e[e,u(t)]));if(yS(e))return new Set(Array.from(e).map(u));let t=Object.create($x(e));for(let n in e)t[n]=u(e[n]);return pS(e,Jx)&&(t[Jx]=e[Jx]),t}function d(e){return oS(e)?u(e):e}RS(NS,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var vC=new pC,yC=vC.produce,bC=vC.produceWithPatches.bind(vC),xC=vC.applyPatches.bind(vC),SC=1e3;function CC(e,t){if(e.add(t),e.size>SC){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function wC(e){let{enablePatches:t=!1}=e;t&&_C();let n=Rx(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=Kx())=>{i.has(t)||(_C(),r=xC(r,e),CC(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=Kx())=>{if(!i.has(a)){if(CC(i,a),t){let[t,i]=bC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=yC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var TC=typeof self==`object`?self:globalThis,EC=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),DC=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function OC(e,t){let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o)e[r(t)]=r(n);return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o,r=EC.has(e)?TC[e]:void 0;return n(new(r??TC.Error)(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}}if(typeof a==`string`&&DC.has(a))return n(new TC[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function kC(e){return OC(new Map,e)(0)}var AC=``,{toString:jC}={},{keys:MC}=Object;function NC(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=jC.call(e).slice(8,-1);switch(n){case`Array`:return[1,AC];case`Object`:return[2,AC];case`Date`:return[3,AC];case`RegExp`:return[4,AC];case`Map`:return[5,AC];case`Set`:return[6,AC];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function PC([e,t]){return e===0&&(t===`function`||t===`symbol`)}function FC(e,t,n,r){let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=r=>{if(n.has(r))return n.get(r);let[o,s]=NC(r);switch(o){case 0:{let t=r;switch(s){case`bigint`:o=8,t=r.toString();break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize ${s}`);t=null;break;case`undefined`:return i([-1],r)}return i([o,t],r)}case 1:{if(s){let e=r;return s===`DataView`?e=new Uint8Array(r.buffer):s===`ArrayBuffer`&&(e=new Uint8Array(r)),i([s,[...e]],r)}let e=[],t=i([o,e],r);for(let t of r)e.push(a(t));return t}case 2:{if(s)switch(s){case`BigInt`:return i([s,r.toString()],r);case`Boolean`:case`Number`:case`String`:return i([s,r.valueOf()],r)}if(t&&`toJSON`in r)return a(r.toJSON());let n=[],c=i([o,n],r);for(let t of MC(r))(e||!PC(NC(r[t])))&&n.push([a(t),a(r[t])]);return c}case 3:return i([o,r.toISOString()],r);case 4:{let{source:e,flags:t}=r;return i([o,{source:e,flags:t}],r)}case 5:{let t=[],n=i([o,t],r);for(let[n,i]of r)(e||!(PC(NC(n))||PC(NC(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!PC(NC(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function IC(e,t={}){let n=[];return FC(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:LC,stringify:RC}=JSON,zC={json:!0,lossy:!0};function BC(e){return kC(LC(e))}function VC(e){return RC(IC(e,zC))}function HC(e){return kC(e)}function UC(e){return VC(e)}function WC(e){return BC(e)}var GC=256,KC=class extends Error{name=`StreamClosedError`};function qC(e={}){let t=e.id??Kx(),n=Math.max(0,e.replayWindow??0),r=Rx(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new KC(`Cannot write to a closed stream "${t}"`);s+=1,n>0&&(a.push({seq:s,chunk:e}),a.length>n&&(a.length-n===1?a.shift():a.splice(0,a.length-n))),r.emit(`chunk`,s,e)}function l(e){if(o)return;o=!0;let t=YC(e);i.abort(e),r.emit(`end`,t)}function u(){o||(o=!0,i.signal.aborted||i.abort(`stream closed`),r.emit(`end`,void 0))}function d(e){o||i.signal.aborted||i.abort(e??`aborted`)}let f=new WritableStream({write(e){c(e)},close(){u()},abort(e){l(e)}});return{id:t,signal:i.signal,get closed(){return o},get lastSeq(){return s},write:c,error:l,close:u,abort:d,writable:f,events:r,buffer:a}}function JC(e={}){let t=e.id??Kx(),n=Math.max(1,e.highWaterMark??GC),r=[],i=0,a=!1,o=!1,s,c,l,u;function d(){if(c){if(r.length>0){let e=r.shift(),t=c;c=void 0,t.resolve({value:e,done:!1});return}if(a){let e=c;if(c=void 0,s){let t=Error(s.message);t.name=s.name,e.reject(t)}else e.resolve({value:void 0,done:!0})}}}function f(){if(l){for(;r.length>0;){let e=r.shift();try{l.enqueue(e)}catch{break}}if(a&&l){try{if(s){let e=Error(s.message);e.name=s.name,l.error(e)}else l.close()}catch{}l=void 0}}}function p(t,s){if(!(a||o)&&!(t<=i)){if(i=t,r.push(s),r.length>n){let t=r.length-n;r.splice(0,t),e.onOverflow?.(t)}d(),u&&f()}}function m(e){a||(a=!0,s=e,d(),u&&f())}function h(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function g(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){h()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return g()},cancel:h,_push:p,_end:m,[Symbol.asyncIterator](){return{next(){if(r.length>0)return Promise.resolve({value:r.shift(),done:!1});if(a){if(s){let e=Error(s.message);return e.name=s.name,Promise.reject(e)}return Promise.resolve({value:void 0,done:!0})}return new Promise((e,t)=>{c={resolve:e,reject:t}})},return(){return h(),Promise.resolve({value:void 0,done:!0})}}}}}function YC(e){if(e instanceof Error)return{name:e.name||`Error`,message:e.message};if(typeof e==`string`)return{name:`Error`,message:e};try{return{name:`Error`,message:JSON.stringify(e)}}catch{return{name:`Error`,message:String(e)}}}var XC=128;function ZC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,XC)}var QC=`modulepreload`,$C=function(e,t){return new URL(e,t).href},ew={},tw=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=$C(t,n),t=s(t),t in ew)return;ew[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:QC,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},nw=`__connection.json`,rw=`__DEVFRAME_CONNECTION__`,iw=`x-birpc-session`,aw=`__rpc-dump/index.json`,ow=`devframe:services`,sw=`devframe_otp`,cw=`devframe_auth_token`;ix.postMessage.remoteAssetsError;var lw=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Lx(e))}updateOptions(e){this.options={...this.options,...e}}cached(e,t){let n=this.cacheMap.get(e);if(n)return n.get(this.keySerializer(t))}has(e,t){return this.cacheMap.get(e)?.has(this.keySerializer(t))??!1}apply(e,t){let n=this.cacheMap.get(e.m)||new Map;n.set(this.keySerializer(e.a),t),this.cacheMap.set(e.m,n)}validate(e){return this.options.functions.includes(e)}clear(e){e?this.cacheMap.delete(e):this.cacheMap.clear()}},uw=sx({docsBase:`https://devfra.me/errors`,codes:{DF0019:{why:e=>`RPC function "${e.name}" has \`agent\` set but \`jsonSerializable\` is \`false\`; MCP requires JSON-serializable data.`,fix:"Remove `jsonSerializable: false`, or remove `agent` to keep it RPC-only."},DF0020:{why:e=>`RPC function "${e.name}" declares \`jsonSerializable: true\` but the value at "${e.path}" is a ${e.type}.`,fix:"Either drop `jsonSerializable: true` (falls back to structured-clone) or change the value to a JSON-safe shape."},DF0021:{why:e=>`RPC function "${e.name}" is already registered`,fix:"Use the `force` parameter to overwrite an existing registration."},DF0022:{why:e=>`RPC function "${e.name}" is not registered. Use register() to add new functions.`},DF0023:{why:e=>`RPC function "${e.name}" is not registered`},DF0024:{why:e=>`Either handler or setup function must be provided for RPC function "${e.name}"`},DF0025:{why:e=>`Function "${e.name}" not found in dump store`},DF0026:{why:e=>`No dump match for "${e.name}" with args: ${e.args}`},DF0027:{why:e=>`Function "${e.name}" with type "${e.type}" cannot have dump configuration. Only "static" and "query" types support dumps.`},DF0028:{why:e=>`Function "${e.name}" with type "${e.type}" cannot use \`snapshot: true\`. Only "query" functions support this sugar; "static" functions have equivalent default behavior already.`,fix:"Remove `snapshot: true`, or change the function type to `query`."},DF0043:{why:e=>`RPC function "${e.name}" received an invalid argument at position ${e.index}: ${e.issues}`,fix:"Pass a value that satisfies the `args` schema declared for this function."},DF0044:{why:e=>`RPC function "${e.name}" returned a value that failed its \`returns\` schema: ${e.issues}`,fix:"Make the handler return a value that satisfies the `returns` schema, or relax the schema."}}});function dw(e){if(e.agent&&e.jsonSerializable===!1)throw uw.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function fw(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function pw(e){return e.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `)}async function mw(e,t,n){let r=n.slice();if(!t||t.length===0)return r;for(let r=0;r{n.get(t)===r&&n.delete(t)}),n.set(t,r)),await r}if(!e.__promise){let n=Promise.resolve(e.setup(t));n.catch(()=>{e.__promise===n&&(e.__promise=void 0)}),e.__promise=n}return await e.__promise}async function _w(e,t){let n=e.handler;if(!n){let r=await gw(e,t);if(!r.handler)throw uw.DF0024({name:e.name});n=r.handler}let r=e.args,i=e.returns;if(!r&&!i)return n;let a=n;return async(...t)=>{let n=await mw(e.name,r,t),o=await a(...n);return await hw(e.name,i,o)}}var vw=class{context;definitions=new Map;functions;_onChanged=[];constructor(e){this.context=e;let t=this.definitions,n=this;this.functions=new Proxy({},{get(e,r){let i=t.get(r);if(i)return _w(i,n.context)},has(e,n){return t.has(n)},getOwnPropertyDescriptor(e,n){return{value:t.get(n)?.handler,configurable:!0,enumerable:!0}},ownKeys(){return Array.from(t.keys())}})}register(e,t=!1){if(this.definitions.has(e.name)&&!t)throw uw.DF0021({name:e.name});dw(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}update(e,t=!1){if(!this.definitions.has(e.name)&&!t)throw uw.DF0022({name:e.name});dw(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}onChanged(e){return this._onChanged.push(e),()=>{let t=this._onChanged.indexOf(e);t!==-1&&this._onChanged.splice(t,1)}}async getHandler(e){return await _w(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw uw.DF0023({name:String(e)});return{args:t.args,returns:t.returns}}has(e){return this.definitions.has(e)}get(e){return this.definitions.get(e)}list(){return Array.from(this.definitions.keys())}};function yw(e,t=``){return JSON.stringify(e,function(e,n){let r=this,i=r==null?n:r[e];if(i===void 0){if(Array.isArray(r))throw xw(t,`undefined`,r,e);return n}return i!==null&&bw(i,r,e,t),n})}function bw(e,t,n,r){if(typeof e==`bigint`)throw xw(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw xw(r,`Map`,t,n);if(e instanceof Set)throw xw(r,`Set`,t,n);if(e instanceof Date)throw xw(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw xw(r,e.constructor?.name??`class instance`,t,n)}function xw(e,t,n,r){let i=Sw(n,r);return uw.DF0020({name:e||``,type:t,path:i})}function Sw(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var Cw=`__DEVFRAME_CONNECTION_META__`,ww=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function Tw(e){let t=[()=>window?.[e],()=>globalThis?.[e],()=>parent.window?.[e]];for(let e of t)try{let t=e();if(t)return t}catch{}}function Ew(){return Tw(rw)}function Dw(){return Tw(Cw)}function Ow(e){if(e)return e;try{let e=localStorage.getItem(ww);if(e)return e}catch{}return Tw(ww)}function kw(e){globalThis[rw]=e,globalThis[Cw]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&Aw(e.authToken)}function Aw(e){try{localStorage.setItem(ww,e)}catch{}globalThis[ww]=e;let t=Ew();t&&(globalThis[rw]={...t,authToken:e})}function jw(e){let t=Ux(nw,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function Mw(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function Nw(){let e=Ew();if(e)return Mw(e,Ow()??e.authToken??e.connectionMeta.authToken);let t=Dw();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??jw(`./`),authToken:Ow(t.authToken)}}async function Pw(e={}){if(e.connection){let t=Mw(e.connection,Ow(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return kw(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:jw(t[0]??`./`),authToken:Ow(e.authToken??e.connectionMeta.authToken)};return kw(n),n}let n=Nw();if(n){let t=Mw(n,Ow(e.authToken??n.authToken??n.connectionMeta.authToken));return kw(t),t}let r=[];for(let n of t){let t=Ux(nw,n),i=jw(n);try{let n=await fetch(t);if(!n.ok)throw Error(`Failed to fetch connection meta from ${i}: ${n.status}`);let r=await n.json(),a=n.url||i,o={connectionMeta:r,metaBaseUrl:r.baseUrl?new URL(r.baseUrl,a).href:a,authToken:Ow(e.authToken??r.authToken)};return kw(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var Fw=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function Iw(e=sw){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function Lw(e){try{let t=new URL(globalThis.location.href),n=new URLSearchParams(t.hash.replace(/^#/,``));if(!n.has(e))return;n.delete(e),t.hash=n.toString(),globalThis.history?.replaceState(globalThis.history.state,``,t.href)}catch{}}function Rw(e=sw){let t=Iw(e);return t&&Lw(e),t}async function zw(e,t={}){let n=Rw(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function Bw(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(ow,{initialValue:{}}).then(e=>(t=e.value(),e.on(`updated`,e=>{t=e}),e)),r);return i(),{state:i,has:e=>e in t,keys:()=>Object.keys(t),get:r=>{let i=t[r];if(!i)return;let a=n.get(i);return a||(a={...i,rpc:e.scope(i.scope).rpc},n.set(i,a)),a}}}function Vw(e){let t=new Map,n=new Map,r=new Map,i=new Set,a=e.connectionMeta.backend===`static`;function o(e,t){let n=r.get(e);return n&&typeof n==`object`&&!Array.isArray(n)&&typeof t==`object`&&!Array.isArray(t)?{...n,...t}:t}e.client.register({name:ix.broadcast.clientStateUpdated,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.mutate(()=>o(e,n),r)}}),e.client.register({name:ix.broadcast.clientStatePatch,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.patch(n,r)}});function s(t,n){let r=[];return r.push(n.on(`updated`,(n,r,i)=>{a||(r?e.callEvent(`devframe:rpc:server-state:patch`,t,r,i):e.callEvent(`devframe:rpc:server-state:set`,t,n,i))})),()=>{for(let e of r)e()}}return{keys:()=>Array.from(t.keys()),onKeyAdded(e){return i.add(e),()=>{i.delete(e)}},delete(e){let i=n.get(e);n.delete(e);let a=t.delete(e);return r.delete(e),i?.(),a},get:async(c,l)=>{if(l?.initialValue!==void 0&&r.set(c,l.initialValue),t.has(c))return t.get(c);let u=wC({initialValue:l?.initialValue,enablePatches:!1});async function d(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,c),l?.initialValue!==void 0){t.set(c,u);for(let e of i)e(c);return e.call(`devframe:rpc:server-state:get`,c).then(e=>{e!==void 0&&u.mutate(()=>o(c,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(c,s(c,u)),u}{let r=await e.call(`devframe:rpc:server-state:get`,c);u.mutate(()=>o(c,r)),t.set(c,u);for(let e of i)e(c);return n.set(c,s(c,u)),u}}return new Promise(t=>{if(e.isTrusted)d().then(t);else{t(u);let n=!1;e.events.on(ix.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var Hw=new Map;function Uw(e=Hw){let t=new Map;return{serialize:n=>{let r;return n.t===`q`?r=n.m:(r=t.get(n.i),t.delete(n.i)),!(n.t===`s`&&`e`in n)&&r&&e.get(r)?.jsonSerializable===!0?yw(n,r??``):`s:${UC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?WC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function Ww(){}function Gw(e){let t=e.search(/\n\n|\r\n\r\n/);if(!(t<0))return{frame:e.slice(0,t),rest:e.slice(t+(e[t]===`\r`?4:2))}}function Kw(e){let t=`message`,n=[];for(let r of e.split(/\r?\n/))r.startsWith(`:`)||(r.startsWith(`event:`)?t=r.slice(6).trimStart():r.startsWith(`data:`)&&n.push(r.slice(5).replace(/^ /,``)));return{event:t,data:n}}function qw(e){let{onConnected:t=Ww,onError:n=Ww,onDisconnected:r=Ww,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${cw}=${encodeURIComponent(e.authToken)}`);let s=Uw(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function h(e){l||(l=!0,p(e),n(e),r())}function g(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function _(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function ee(e){let t=e.getReader();d=t;let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;for(r+=n.decode(i,{stream:!0});;){let e=Gw(r);if(!e)break;r=e.rest;let{event:t,data:n}=Kw(e.frame);n.length>0&&_(t,n.join(`
-`))}}g()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await ee(e.body)}catch(e){if(c.signal.aborted){g();return}h(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[iw]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function Jw(e,t){let{channel:n,rpcOptions:r={}}=t;return _x(e,{...n,timeout:-1,...r,proxify:!1})}function Yw(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,c=!1,l=`connecting`,u=null,d=Promise.withResolvers();function f(e,t=null){if(t?u=t:e===`connected`&&(u=null),e===l)return;let n=l;l=e,i.emit(ix.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function h(){return l===`disconnected`||l===`error`?new Fw(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new Fw(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function g(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(ix.client.error,e,t),r(e))}};function l(){a=!0,p.delete(c),o&&clearTimeout(o)}p.add(c),s>0&&(o=setTimeout(()=>{c.reject(new Fw(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(l(),n(e))},e=>{if(a)return;l();let n=e instanceof Error?e:Error(String(e));i.emit(ix.client.error,n,t),r(n)})})}let _=new Map;for(let e of r.jsonSerializableMethods??[])_.set(e,{jsonSerializable:!0});let ee=e.createChannel({definitions:_,onError(e){f(`error`,e),i.emit(ix.client.connectionError,e),m(new Fw(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new Fw(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),v=Jw(a.functions,{channel:ee,rpcOptions:o});a.register({name:ix.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new Fw(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e),m(e),i.emit(ix.client.isTrustedUpdated,!1)}});let te=n;async function ne(e){te=e;let t=await v.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new Fw(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e)}return i.emit(ix.client.isTrustedUpdated,c),t.isTrusted}async function re(e){let t=(await v.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(te=t,c=!0,d.resolve(!0),f(`connected`),i.emit(ix.client.isTrustedUpdated,!0)),t}async function ie(e={}){await v.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function ae(){return c?!0:ne(te??``)}async function oe(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:ae,requestTrustWithToken:ne,requestTrustWithCode:re,requestAuthCode:ie,ensureTrusted:oe,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(ix.client.error,t,String(e[0]));return}return v.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$callOptional(...e),t)},close:()=>{ee.close()}}}function Xw(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function Zw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=Xw(n.sse,r??`./`,location);return Yw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>qw({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function Qw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:$w(r)?Qw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function $w(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function eT(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function tT(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function nT(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function rT(e){if(e.error)throw Qw(e.error);return e.output}function iT(e){return e.some(e=>e!=null)}function aT(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function oT(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?HC(e):e}function a(e,t){return i(aT(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return nT(r)?rT(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(eT(r)){if(iT(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(tT(r)){let e=Lx(n),i=r.records[e];if(i)return rT(await s(i,r.serialization));if(r.fallback)return rT(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!iT(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function sT(e){let t=oT(await e.fetchJsonFromBases(aw),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var cT=``;function lT(e,t){return`${e}${cT}${t}`}function uT(e){let t=new Map,n=new Map;e.client.register({name:ix.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(lT(e,n))?._push(r,i)}}),e.client.register({name:ix.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=lT(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:ix.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=lT(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(ix.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(cT);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=lT(n,r),o=t.get(a);if(o)return o;let s=JC({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(ix.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=lT(t,r),a=n.get(i);if(a)return a;let o=qC({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function dT(){}var fT=new Map;function pT(e){let t=e.url;e.authToken&&(t=`${t}?${cw}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=dT,onError:i=dT,onDisconnected:a=dT,definitions:o=fT}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=Uw(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function mT(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return Wx(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function hT(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=mT(n.websocket,r??`./`,location);return Yw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>pT({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function gT(e){return e.includes(`:`)}function _T(e,t){return gT(t)?t:`${e}:${t}`}function vT(e){return{async get(t){return(await e()).value()[t]},async set(t,n){(await e()).mutate(e=>{e[t]=n})},async delete(t){(await e()).mutate(e=>{delete e[t]})},async all(){return(await e()).value()},async onChange(t){return(await e()).on(`updated`,e=>t(e))}}}function yT(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=e.sharedState.get(r,{initialValue:{}}),i}return vT(a)}function bT(e,t){return{global:yT(e,t,`global`),project:yT(e,t,`project`)}}function xT(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(gT(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(_T(t,n),...r)),callEvent:((n,...r)=>e.callEvent(_T(t,n),...r)),callOptional:((n,...r)=>e.callOptional(_T(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(_T(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(_T(t,n),r,i),upload:(n,r)=>e.streaming.upload(_T(t,n),r)}},settings:bT(e,t),scope:e.scope}}function ST(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function CT(e,t={}){let n=t.modelContext??ST();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=ZC(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=vx(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:xx(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>wT(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function wT(e,t,n){try{let r=Cx(n,e.args?.length);return{content:[{type:`text`,text:TT(await(await _w(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:ET(e)}]}}}function TT(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function ET(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function DT(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function OT(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Rx(),a=Array.isArray(t)?t:[t],o=await Pw(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new lw({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new vw(f),m=e.webmcp===!1?void 0:CT(p),h,g=!1;async function _(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(Ux(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ee={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){if(await n.onRequest?.call(this,e,t,i),r&&d?.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);d.apply(e,n)}else await t(e)}}},v=DT(e.transport??`auto`,s),te=v===`static`?await sT({fetchJsonFromBases:_}):v===`sse`?Zw({...ee,sseOptions:e.sseOptions}):hT({...ee,wsOptions:e.wsOptions}),ne;try{ne=new BroadcastChannel(`devframe-auth`)}catch{}let re,ie=!1;function ae(e){return((...t)=>ie||!re?e(...t):re.then(()=>e(...t)))}function oe(){g=!0;try{h?.(),m?.()}finally{try{ne?.close()}finally{te.close?.()}}}let se={events:i,get isTrusted(){return te.isTrusted},get status(){return te.status},get connectionError(){return te.connectionError},get transport(){return te.transport??v},get connection(){return o},connectionMeta:s,ensureTrusted:te.ensureTrusted,requestTrust:te.requestTrust,requestTrustWithToken:async e=>(Aw(e),o={...o,authToken:e},te.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await te.requestTrustWithCode(e);if(!t)return!1;Aw(t),o={...o,authToken:t};try{ne?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>te.requestAuthCode(e),call:ae(te.call),callEvent:ae(te.callEvent),callOptional:ae(te.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:oe};se.sharedState=Vw(se),se.streaming=uT(se),se.services=Bw(se);let ce=new Map;se.scope=(e=>{if(!e)return se;let t=ce.get(e);return t||(t=xT(se,e),ce.set(e,t)),t}),f.rpc=se;function le(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ue(){if(e.simpleAuth!==!1&&le()&&typeof globalThis.prompt==`function`)for(await se.requestAuthCode().catch(()=>{});!se.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await se.requestTrustWithCode(t))return}}async function de(){let t=await te.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await zw(se,{param:n}):!1;t||r||se.isTrusted||await ue()}return re=de().then(()=>{ie=!0},()=>{ie=!0}),s.mcp&&tw(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-BXhoSh1z-wXf_92mg.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(se))}).catch(()=>{}),ne&&(ne.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&se.requestTrustWithToken(e.data.authToken)}),se}var kT=OT,AT=[`components`,`injectors`,`signals`,`ngrx`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`],jT=[`forms`,`router`,`ngrx`,`http`,`analog`],MT={refreshMs:{default:3e3,min:500,max:8e3},navigations:{default:50,min:5,max:500},formTimeline:{default:200,min:10,max:2e3},httpCalls:{default:200,min:10,max:2e3},changeLog:{default:200,min:10,max:2e3},cdCycles:{default:200,min:10,max:2e3},capacitorCalls:{default:200,min:10,max:2e3}},NT={"opted-out":`the request sets transferCache: false`,post:`POST requests are left out unless includePostRequests is set`,method:`only GET, HEAD and POST requests are cached`,"auth-headers":`it sends an Authorization, Proxy-Authorization or Cookie header`,credentials:`it sends credentials (withCredentials or credentials: include/same-origin)`,"no-cache-request":`the request asks for no-store, no-cache or private`,"no-cache-response":`the response has Cache-Control no-store, no-cache or private`,"set-cookie":`the response sets a cookie`,error:`failed responses are not stored`,mocked:`a fault rule answered before the transfer cache ran`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},PT=[[200,`OK`],[201,`Created`],[202,`Accepted`],[203,`Non-Authoritative Information`],[204,`No Content`],[205,`Reset Content`],[206,`Partial Content`],[207,`Multi-Status`],[208,`Already Reported`],[226,`IM Used`],[300,`Multiple Choices`],[301,`Moved Permanently`],[302,`Found`],[303,`See Other`],[304,`Not Modified`],[307,`Temporary Redirect`],[308,`Permanent Redirect`],[400,`Bad Request`],[401,`Unauthorized`],[402,`Payment Required`],[403,`Forbidden`],[404,`Not Found`],[405,`Method Not Allowed`],[406,`Not Acceptable`],[407,`Proxy Authentication Required`],[408,`Request Timeout`],[409,`Conflict`],[410,`Gone`],[411,`Length Required`],[412,`Precondition Failed`],[413,`Content Too Large`],[414,`URI Too Long`],[415,`Unsupported Media Type`],[416,`Range Not Satisfiable`],[417,`Expectation Failed`],[418,`I'm a Teapot`],[421,`Misdirected Request`],[422,`Unprocessable Content`],[423,`Locked`],[424,`Failed Dependency`],[425,`Too Early`],[426,`Upgrade Required`],[428,`Precondition Required`],[429,`Too Many Requests`],[431,`Request Header Fields Too Large`],[451,`Unavailable For Legal Reasons`],[499,`Client Closed Request`],[500,`Internal Server Error`],[501,`Not Implemented`],[502,`Bad Gateway`],[503,`Service Unavailable`],[504,`Gateway Timeout`],[505,`HTTP Version Not Supported`],[506,`Variant Also Negotiates`],[507,`Insufficient Storage`],[508,`Loop Detected`],[510,`Not Extended`],[511,`Network Authentication Required`],[520,`Web Server Returned an Unknown Error`],[521,`Web Server Is Down`],[522,`Connection Timed Out`],[523,`Origin Is Unreachable`],[524,`A Timeout Occurred`]];function FT(e){return PT.some(([t])=>t===e)}var IT=`pangular`;function LT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function RT(e,t){return typeof e==`boolean`?e:t}var zT=100,BT=100;function VT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=BT);return[...new Set(t)].slice(0,zT)}function HT(e,t){let{default:n,min:r,max:i}=MT[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function UT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function WT(e){let t=LT(e),n=LT(t.agent),r=LT(t.inspectors),i=LT(n.tools),a=LT(t.actions),o=RT(t.actions,!0),s=LT(t.redaction),c=LT(t.limits),l=UT(AT,e=>RT(r[e],!0));return{inspectors:l,agent:{readOnly:RT(n.readOnly,!1),tools:UT(AT,e=>l[e]&&RT(i[e],!0))},actions:UT(jT,e=>l[e]&&RT(a[e],o)),redaction:{secretNames:VT(s.secretNames),unmask:VT(s.unmask)},limits:Object.fromEntries(Object.keys(MT).map(e=>[e,HT(c[e],e)]))}}function GT(e){let t=e?.configs;return WT(t?.[IT])}function KT(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and clearing HTTP calls`,analog:`Calling API routes`}[e]} is turned off in the devtools config (actions.${e}).`}var qT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`},JT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`},YT={refreshMs:e=>`poll every ${e} ms`,navigations:e=>`${e} navigations`,formTimeline:e=>`${e} form events`,httpCalls:e=>`${e} HTTP calls`,changeLog:e=>`${e} NgRx changes`,cdCycles:e=>`${e} change detection cycles`,capacitorCalls:e=>`${e} Capacitor plugin calls`};function XT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=AT.filter(t=>e.inspectors[t]);return n(`Inspectors off`,AT.filter(t=>!e.inspectors[t]).map(e=>qT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>qT[e])),n(`Blocked actions`,jT.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>JT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(MT).filter(t=>e.limits[t]!==MT[t].default).map(t=>YT[t](e.limits[t]))),t}var ZT=`pangular-page-id`,QT=null;function $T(e){QT=e}function eE(){if(QT)return QT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(ZT)||null)}catch{return null}}function tE(e,t){if(t.chosen&&e[t.chosen])return t.chosen;if(t.host)return t.host;if(t.previous&&e[t.previous])return t.previous;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n?.pageId??null}function nE(e,t){return e?t?e.pages?.[t]??null:e:null}function rE(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function iE(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function aE(e,t,n){return iE(e,t,n).then(e=>e,()=>null)}function oE(e){return e?.connectionMeta.backend===`static`}function sE(e){let t=()=>{let t=e()?.scope(`pangular`).rpc;t&&(t.callEvent(`request-page-highlight`,null),t.callEvent(`request-form-highlight`,null))};return addEventListener(`pagehide`,t),()=>{removeEventListener(`pagehide`,t),t()}}function cE(e){return e.split(`@`)[1]??``}var lE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},uE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},dE=aE,fE={key:`name looks secret`,"input-type":`password input`,autocomplete:`autocomplete is a secret kind`,marker:`marked as mask`,parent:`inside a secret group`,config:`listed in mask`};function pE(e){return fE[e]??e}var mE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function hE(e,t){return await dE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function gE(e){return`${e.ok?e.message??`Done.`:e.error??`Failed.`}${e.skipped?.length?` Skipped: ${e.skipped.map(e=>`${e.path} (${e.reason})`).join(`, `)}.`:``}${e.status?` Status: ${e.status}.`:``}`}var _E=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function vE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(_E,(e,t)=>t??(e===`**`?``:e))}function yE(e){return GT(e?.connectionMeta)}function bE(e,t){return yE(e).actions[t]}var xE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`};function SE(e,t){let n=xE[e];return!n||t.inspectors[n]}function CE(e,t){e&1&&(A(),Fg(0,`rect`,4)(1,`rect`,5)(2,`rect`,6)(3,`rect`,7))}function wE(e,t){e&1&&(A(),Fg(0,`path`,8)(1,`path`,9)(2,`path`,10))}function TE(e,t){e&1&&(A(),Fg(0,`circle`,11)(1,`path`,12)(2,`circle`,13))}function EE(e,t){e&1&&(A(),Fg(0,`path`,1))}function DE(e,t){e&1&&(A(),Fg(0,`path`,14)(1,`path`,15)(2,`path`,16)(3,`path`,17))}function OE(e,t){e&1&&(A(),Fg(0,`ellipse`,18)(1,`path`,19)(2,`path`,20))}function kE(e,t){e&1&&(A(),Fg(0,`rect`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function AE(e,t){e&1&&(A(),Fg(0,`circle`,25)(1,`path`,26)(2,`path`,27))}function jE(e,t){e&1&&(A(),Fg(0,`path`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31)(4,`circle`,32))}function ME(e,t){e&1&&(A(),Fg(0,`path`,2))}function NE(e,t){e&1&&(A(),Fg(0,`path`,3))}var PE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:12,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`fill`,`currentColor`,`stroke`,`none`,`transform`,`translate(1.8 1.8) scale(0.85)`,`d`,`M24 3.7l-5.766 5.766 5.725 5.736-3.713 3.712L5.073 3.742 8.786.03l5.736 5.726L20.284 0 24 3.7zM.029 8.785l3.713-3.713 15.173 15.173-3.713 3.714-5.732-5.726L3.7 24 0 20.285l5.754-5.764L.029 8.785z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M3 12h18`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`]],template:function(e,t){if(e&1&&(A(),H(0,`svg`,0),P(1,CE,4,0)(2,wE,3,0)(3,TE,3,0)(4,EE,1,0,`:svg:path`,1)(5,DE,4,0)(6,OE,3,0)(7,kE,4,0)(8,AE,3,0)(9,jE,5,0)(10,ME,1,0,`:svg:path`,2)(11,NE,1,0,`:svg:path`,3),U()),e&2){let e;M(),F((e=t.name())===`dashboard`?1:e===`components`?2:e===`routes`?3:e===`signals`?4:e===`injectors`?5:e===`store`?6:e===`forms`?7:e===`network`?8:e===`pipes`?9:e===`analog`?10:e===`capacitor`?11:-1)}},styles:[`[_nghost-%COMP%] {
+`))}}g()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await ee(e.body)}catch(e){if(c.signal.aborted){g();return}h(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[iw]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function Jw(e,t){let{channel:n,rpcOptions:r={}}=t;return _x(e,{...n,timeout:-1,...r,proxify:!1})}function Yw(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,c=!1,l=`connecting`,u=null,d=Promise.withResolvers();function f(e,t=null){if(t?u=t:e===`connected`&&(u=null),e===l)return;let n=l;l=e,i.emit(ix.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function h(){return l===`disconnected`||l===`error`?new Fw(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new Fw(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function g(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(ix.client.error,e,t),r(e))}};function l(){a=!0,p.delete(c),o&&clearTimeout(o)}p.add(c),s>0&&(o=setTimeout(()=>{c.reject(new Fw(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(l(),n(e))},e=>{if(a)return;l();let n=e instanceof Error?e:Error(String(e));i.emit(ix.client.error,n,t),r(n)})})}let _=new Map;for(let e of r.jsonSerializableMethods??[])_.set(e,{jsonSerializable:!0});let ee=e.createChannel({definitions:_,onError(e){f(`error`,e),i.emit(ix.client.connectionError,e),m(new Fw(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new Fw(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),v=Jw(a.functions,{channel:ee,rpcOptions:o});a.register({name:ix.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new Fw(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e),m(e),i.emit(ix.client.isTrustedUpdated,!1)}});let te=n;async function ne(e){te=e;let t=await v.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new Fw(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e)}return i.emit(ix.client.isTrustedUpdated,c),t.isTrusted}async function re(e){let t=(await v.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(te=t,c=!0,d.resolve(!0),f(`connected`),i.emit(ix.client.isTrustedUpdated,!0)),t}async function ie(e={}){await v.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function ae(){return c?!0:ne(te??``)}async function oe(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:ae,requestTrustWithToken:ne,requestTrustWithCode:re,requestAuthCode:ie,ensureTrusted:oe,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(ix.client.error,t,String(e[0]));return}return v.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$callOptional(...e),t)},close:()=>{ee.close()}}}function Xw(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function Zw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=Xw(n.sse,r??`./`,location);return Yw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>qw({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function Qw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:$w(r)?Qw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function $w(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function eT(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function tT(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function nT(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function rT(e){if(e.error)throw Qw(e.error);return e.output}function iT(e){return e.some(e=>e!=null)}function aT(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function oT(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?HC(e):e}function a(e,t){return i(aT(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return nT(r)?rT(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(eT(r)){if(iT(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(tT(r)){let e=Lx(n),i=r.records[e];if(i)return rT(await s(i,r.serialization));if(r.fallback)return rT(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!iT(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function sT(e){let t=oT(await e.fetchJsonFromBases(aw),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var cT=``;function lT(e,t){return`${e}${cT}${t}`}function uT(e){let t=new Map,n=new Map;e.client.register({name:ix.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(lT(e,n))?._push(r,i)}}),e.client.register({name:ix.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=lT(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:ix.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=lT(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(ix.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(cT);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=lT(n,r),o=t.get(a);if(o)return o;let s=JC({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(ix.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=lT(t,r),a=n.get(i);if(a)return a;let o=qC({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function dT(){}var fT=new Map;function pT(e){let t=e.url;e.authToken&&(t=`${t}?${cw}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=dT,onError:i=dT,onDisconnected:a=dT,definitions:o=fT}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=Uw(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function mT(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return Wx(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function hT(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=mT(n.websocket,r??`./`,location);return Yw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>pT({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function gT(e){return e.includes(`:`)}function _T(e,t){return gT(t)?t:`${e}:${t}`}function vT(e){return{async get(t){return(await e()).value()[t]},async set(t,n){(await e()).mutate(e=>{e[t]=n})},async delete(t){(await e()).mutate(e=>{delete e[t]})},async all(){return(await e()).value()},async onChange(t){return(await e()).on(`updated`,e=>t(e))}}}function yT(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=e.sharedState.get(r,{initialValue:{}}),i}return vT(a)}function bT(e,t){return{global:yT(e,t,`global`),project:yT(e,t,`project`)}}function xT(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(gT(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(_T(t,n),...r)),callEvent:((n,...r)=>e.callEvent(_T(t,n),...r)),callOptional:((n,...r)=>e.callOptional(_T(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(_T(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(_T(t,n),r,i),upload:(n,r)=>e.streaming.upload(_T(t,n),r)}},settings:bT(e,t),scope:e.scope}}function ST(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function CT(e,t={}){let n=t.modelContext??ST();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=ZC(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=vx(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:xx(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>wT(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function wT(e,t,n){try{let r=Cx(n,e.args?.length);return{content:[{type:`text`,text:TT(await(await _w(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:ET(e)}]}}}function TT(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function ET(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function DT(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function OT(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Rx(),a=Array.isArray(t)?t:[t],o=await Pw(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new lw({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new vw(f),m=e.webmcp===!1?void 0:CT(p),h,g=!1;async function _(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(Ux(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ee={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){if(await n.onRequest?.call(this,e,t,i),r&&d?.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);d.apply(e,n)}else await t(e)}}},v=DT(e.transport??`auto`,s),te=v===`static`?await sT({fetchJsonFromBases:_}):v===`sse`?Zw({...ee,sseOptions:e.sseOptions}):hT({...ee,wsOptions:e.wsOptions}),ne;try{ne=new BroadcastChannel(`devframe-auth`)}catch{}let re,ie=!1;function ae(e){return((...t)=>ie||!re?e(...t):re.then(()=>e(...t)))}function oe(){g=!0;try{h?.(),m?.()}finally{try{ne?.close()}finally{te.close?.()}}}let se={events:i,get isTrusted(){return te.isTrusted},get status(){return te.status},get connectionError(){return te.connectionError},get transport(){return te.transport??v},get connection(){return o},connectionMeta:s,ensureTrusted:te.ensureTrusted,requestTrust:te.requestTrust,requestTrustWithToken:async e=>(Aw(e),o={...o,authToken:e},te.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await te.requestTrustWithCode(e);if(!t)return!1;Aw(t),o={...o,authToken:t};try{ne?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>te.requestAuthCode(e),call:ae(te.call),callEvent:ae(te.callEvent),callOptional:ae(te.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:oe};se.sharedState=Vw(se),se.streaming=uT(se),se.services=Bw(se);let ce=new Map;se.scope=(e=>{if(!e)return se;let t=ce.get(e);return t||(t=xT(se,e),ce.set(e,t)),t}),f.rpc=se;function le(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ue(){if(e.simpleAuth!==!1&&le()&&typeof globalThis.prompt==`function`)for(await se.requestAuthCode().catch(()=>{});!se.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await se.requestTrustWithCode(t))return}}async function de(){let t=await te.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await zw(se,{param:n}):!1;t||r||se.isTrusted||await ue()}return re=de().then(()=>{ie=!0},()=>{ie=!0}),s.mcp&&tw(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-BXhoSh1z-cHO-LORY.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(se))}).catch(()=>{}),ne&&(ne.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&se.requestTrustWithToken(e.data.authToken)}),se}var kT=OT,AT=[`components`,`injectors`,`signals`,`ngrx`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`],jT=[`forms`,`router`,`ngrx`,`http`,`analog`],MT={refreshMs:{default:3e3,min:500,max:8e3},navigations:{default:50,min:5,max:500},formTimeline:{default:200,min:10,max:2e3},httpCalls:{default:200,min:10,max:2e3},changeLog:{default:200,min:10,max:2e3},cdCycles:{default:200,min:10,max:2e3},capacitorCalls:{default:200,min:10,max:2e3}},NT={"opted-out":`the request sets transferCache: false`,post:`POST requests are left out unless includePostRequests is set`,method:`only GET, HEAD and POST requests are cached`,"auth-headers":`it sends an Authorization, Proxy-Authorization or Cookie header`,credentials:`it sends credentials (withCredentials or credentials: include/same-origin)`,"no-cache-request":`the request asks for no-store, no-cache or private`,"no-cache-response":`the response has Cache-Control no-store, no-cache or private`,"set-cookie":`the response sets a cookie`,error:`failed responses are not stored`,mocked:`a fault rule answered before the transfer cache ran`,"cache-off-or-filter":`the transfer cache is off, or its filter (or another withHttpTransferCacheOptions setting) left it out`},PT=[[200,`OK`],[201,`Created`],[202,`Accepted`],[203,`Non-Authoritative Information`],[204,`No Content`],[205,`Reset Content`],[206,`Partial Content`],[207,`Multi-Status`],[208,`Already Reported`],[226,`IM Used`],[300,`Multiple Choices`],[301,`Moved Permanently`],[302,`Found`],[303,`See Other`],[304,`Not Modified`],[307,`Temporary Redirect`],[308,`Permanent Redirect`],[400,`Bad Request`],[401,`Unauthorized`],[402,`Payment Required`],[403,`Forbidden`],[404,`Not Found`],[405,`Method Not Allowed`],[406,`Not Acceptable`],[407,`Proxy Authentication Required`],[408,`Request Timeout`],[409,`Conflict`],[410,`Gone`],[411,`Length Required`],[412,`Precondition Failed`],[413,`Content Too Large`],[414,`URI Too Long`],[415,`Unsupported Media Type`],[416,`Range Not Satisfiable`],[417,`Expectation Failed`],[418,`I'm a Teapot`],[421,`Misdirected Request`],[422,`Unprocessable Content`],[423,`Locked`],[424,`Failed Dependency`],[425,`Too Early`],[426,`Upgrade Required`],[428,`Precondition Required`],[429,`Too Many Requests`],[431,`Request Header Fields Too Large`],[451,`Unavailable For Legal Reasons`],[499,`Client Closed Request`],[500,`Internal Server Error`],[501,`Not Implemented`],[502,`Bad Gateway`],[503,`Service Unavailable`],[504,`Gateway Timeout`],[505,`HTTP Version Not Supported`],[506,`Variant Also Negotiates`],[507,`Insufficient Storage`],[508,`Loop Detected`],[510,`Not Extended`],[511,`Network Authentication Required`],[520,`Web Server Returned an Unknown Error`],[521,`Web Server Is Down`],[522,`Connection Timed Out`],[523,`Origin Is Unreachable`],[524,`A Timeout Occurred`]];function FT(e){return PT.some(([t])=>t===e)}var IT=`pangular`;function LT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function RT(e,t){return typeof e==`boolean`?e:t}var zT=100,BT=100;function VT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=BT);return[...new Set(t)].slice(0,zT)}function HT(e,t){let{default:n,min:r,max:i}=MT[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function UT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function WT(e){let t=LT(e),n=LT(t.agent),r=LT(t.inspectors),i=LT(n.tools),a=LT(t.actions),o=RT(t.actions,!0),s=LT(t.redaction),c=LT(t.limits),l=UT(AT,e=>RT(r[e],!0));return{inspectors:l,agent:{readOnly:RT(n.readOnly,!1),tools:UT(AT,e=>l[e]&&RT(i[e],!0))},actions:UT(jT,e=>l[e]&&RT(a[e],o)),redaction:{secretNames:VT(s.secretNames),unmask:VT(s.unmask)},limits:Object.fromEntries(Object.keys(MT).map(e=>[e,HT(c[e],e)]))}}function GT(e){let t=e?.configs;return WT(t?.[IT])}function KT(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and clearing HTTP calls`,analog:`Calling API routes`}[e]} is turned off in the devtools config (actions.${e}).`}var qT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`},JT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`},YT={refreshMs:e=>`poll every ${e} ms`,navigations:e=>`${e} navigations`,formTimeline:e=>`${e} form events`,httpCalls:e=>`${e} HTTP calls`,changeLog:e=>`${e} NgRx changes`,cdCycles:e=>`${e} change detection cycles`,capacitorCalls:e=>`${e} Capacitor plugin calls`};function XT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=AT.filter(t=>e.inspectors[t]);return n(`Inspectors off`,AT.filter(t=>!e.inspectors[t]).map(e=>qT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>qT[e])),n(`Blocked actions`,jT.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>JT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(MT).filter(t=>e.limits[t]!==MT[t].default).map(t=>YT[t](e.limits[t]))),t}var ZT=`pangular-page-id`,QT=null;function $T(e){QT=e}function eE(){if(QT)return QT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(ZT)||null)}catch{return null}}function tE(e,t){if(t.chosen&&e[t.chosen])return t.chosen;if(t.host)return t.host;if(t.previous&&e[t.previous])return t.previous;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n?.pageId??null}function nE(e,t){return e?t?e.pages?.[t]??null:e:null}function rE(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function iE(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function aE(e,t,n){return iE(e,t,n).then(e=>e,()=>null)}function oE(e){return e?.connectionMeta.backend===`static`}function sE(e){let t=()=>{let t=e()?.scope(`pangular`).rpc;t&&(t.callEvent(`request-page-highlight`,null),t.callEvent(`request-form-highlight`,null))};return addEventListener(`pagehide`,t),()=>{removeEventListener(`pagehide`,t),t()}}function cE(e){return e.split(`@`)[1]??``}var lE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},uE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},dE=aE,fE={key:`name looks secret`,"input-type":`password input`,autocomplete:`autocomplete is a secret kind`,marker:`marked as mask`,parent:`inside a secret group`,config:`listed in mask`};function pE(e){return fE[e]??e}var mE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function hE(e,t){return await dE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function gE(e){return`${e.ok?e.message??`Done.`:e.error??`Failed.`}${e.skipped?.length?` Skipped: ${e.skipped.map(e=>`${e.path} (${e.reason})`).join(`, `)}.`:``}${e.status?` Status: ${e.status}.`:``}`}var _E=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function vE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(_E,(e,t)=>t??(e===`**`?``:e))}function yE(e){return GT(e?.connectionMeta)}function bE(e,t){return yE(e).actions[t]}var xE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`};function SE(e,t){let n=xE[e];return!n||t.inspectors[n]}function CE(e,t){e&1&&(A(),Fg(0,`rect`,4)(1,`rect`,5)(2,`rect`,6)(3,`rect`,7))}function wE(e,t){e&1&&(A(),Fg(0,`path`,8)(1,`path`,9)(2,`path`,10))}function TE(e,t){e&1&&(A(),Fg(0,`circle`,11)(1,`path`,12)(2,`circle`,13))}function EE(e,t){e&1&&(A(),Fg(0,`path`,1))}function DE(e,t){e&1&&(A(),Fg(0,`path`,14)(1,`path`,15)(2,`path`,16)(3,`path`,17))}function OE(e,t){e&1&&(A(),Fg(0,`ellipse`,18)(1,`path`,19)(2,`path`,20))}function kE(e,t){e&1&&(A(),Fg(0,`rect`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function AE(e,t){e&1&&(A(),Fg(0,`circle`,25)(1,`path`,26)(2,`path`,27))}function jE(e,t){e&1&&(A(),Fg(0,`path`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31)(4,`circle`,32))}function ME(e,t){e&1&&(A(),Fg(0,`path`,2))}function NE(e,t){e&1&&(A(),Fg(0,`path`,3))}var PE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:12,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`fill`,`currentColor`,`stroke`,`none`,`transform`,`translate(1.8 1.8) scale(0.85)`,`d`,`M24 3.7l-5.766 5.766 5.725 5.736-3.713 3.712L5.073 3.742 8.786.03l5.736 5.726L20.284 0 24 3.7zM.029 8.785l3.713-3.713 15.173 15.173-3.713 3.714-5.732-5.726L3.7 24 0 20.285l5.754-5.764L.029 8.785z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M3 12h18`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`]],template:function(e,t){if(e&1&&(A(),H(0,`svg`,0),P(1,CE,4,0)(2,wE,3,0)(3,TE,3,0)(4,EE,1,0,`:svg:path`,1)(5,DE,4,0)(6,OE,3,0)(7,kE,4,0)(8,AE,3,0)(9,jE,5,0)(10,ME,1,0,`:svg:path`,2)(11,NE,1,0,`:svg:path`,3),U()),e&2){let e;M(),F((e=t.name())===`dashboard`?1:e===`components`?2:e===`routes`?3:e===`signals`?4:e===`injectors`?5:e===`store`?6:e===`forms`?7:e===`network`?8:e===`pipes`?9:e===`analog`?10:e===`capacitor`?11:-1)}},styles:[`[_nghost-%COMP%] {
display: inline-flex;
flex-shrink: 0;
}`]})},FE=(e,t)=>t.tab,IE=(e,t)=>t.label;function LE(e,t){e&1&&J(0),e&2&&X(` `,K().meta()?.projectName,` `)}function RE(e,t){e&1&&J(0,` Project details unavailable `)}function zE(e,t){e&1&&J(0,` Loading… `)}function BE(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`pangular build`),B(),J(3,` again to rebuild the report. `))}function VE(e,t){e&1&&J(0,` Check that the dev server is running, then reload the panel. `)}function HE(e,t){if(e&1&&(z(0,`p`,4),P(1,BE,4,0)(2,VE,1,0),B()),e&2){let e=K();M(),F(e.staticReport()?1:2)}}function UE(e,t){e&1&&(z(0,`li`,6)(1,`span`),J(2,`Analog`),B(),J(3),B()),e&2&&(M(3),Y(t))}function WE(e,t){e&1&&(z(0,`li`)(1,`span`),J(2,`Change detection`),B(),J(3),B()),e&2&&(M(3),Y(t))}function GE(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K().$implicit,t=K();M(),Y(t.cards()[e.tab]?.value),M(2),Y(t.cards()[e.tab]?.sub)}}function KE(e,t){e&1&&(z(0,`span`,19),J(1,`–`),B(),z(2,`span`,18),J(3,`Count unavailable`),B())}function qE(e,t){e&1&&(V(0,`span`,20),z(1,`span`,18),J(2,`Counting…`),B())}function JE(e,t){if(e&1){let e=W();z(0,`button`,11),G(`click`,function(){let t=O(e).$implicit;return k(K().navigate.emit(t.tab))}),z(1,`span`,12)(2,`span`,13),V(3,`app-tab-icon`,14),B(),z(4,`span`,15),J(5,`→`),B()(),z(6,`span`,16),J(7),B(),P(8,GE,4,2)(9,KE,4,0)(10,qE,3,0),B()}if(e&2){let e,n=t.$implicit,r=t.$index,i=K().stateOf(n.tab);C_(`animation-delay`,60*r,`ms`),N(`aria-busy`,i===`loading`),M(3),R(`name`,n.tab),M(4),Y(n.label),M(),F((e=i)===`ready`?8:e===`error`?9:10)}}function YE(e,t){e&1&&(z(0,`p`),J(1,`Loading…`),B())}function XE(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2),B(),z(3,`dd`),J(4),B()()),e&2){let e=t.$implicit;M(2),Y(e.label),M(2),Y(e.value)}}function ZE(e,t){if(e&1&&(z(0,`dl`),I(1,XE,5,2,`div`,null,IE),B()),e&2){let e=K();M(),L(e.configItems())}}function QE(e,t){e&1&&(z(0,`p`),J(1,`Defaults`),B())}var $E=[{tab:`components`,label:`Components`},{tab:`routes`,label:`Routes`},{tab:`signals`,label:`Signals`},{tab:`injectors`,label:`Injectors`},{tab:`store`,label:`NgRx declarations`},{tab:`pipes`,label:`Pipes`},{tab:`forms`,label:`Forms`},{tab:`network`,label:`SSR & HTTP`}];function eD(e){return $E.filter(t=>SE(t.tab,e))}var tD={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function nD(e){return e&&Object.hasOwn(tD,e)?tD[e]:null}var rD=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),iD={action:[`action`,`actions`],reducer:[`reducer`,`reducers`],effect:[`effect`,`effects`],selector:[`selector`,`selectors`],feature:[`feature`,`features`],"store-setup":[`setup call`,`setup calls`],"signal-store":[`signal store`,`signal stores`],"signal-state":[`signal state`,`signal states`],"signal-method":[`signal method`,`signal methods`]};function aD(e,t,n){return`${e} ${e===1?t:n}`}function oD(e,t){for(let n of e??[])t(n),oD(n.children,t)}function sD(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`discovered in source`};let t=e.filter(e=>e.kind===`directive`).length;return{value:e.length-t,sub:`components · ${aD(t,`directive`,`directives`)}`}}function cD(e){if(!e.some(e=>e.kind))return{value:e.length,sub:`route entries in source`};let t=e.filter(e=>e.kind===`redirect`).length;return{value:new Set(e.filter(e=>e.kind===`page`).map(e=>e.fullPath??e.path??``)).size,sub:`navigable paths · ${aD(t,`redirect`,`redirects`)}`}}function lD(e){let t=new Map;for(let n of e)n.kind&&t.set(n.kind,(t.get(n.kind)??0)+1);if(!t.size)return{value:e.length,sub:`declarations in source`};let n=[...t].sort((e,t)=>t[1]-e[1]).map(([e,t])=>{let[n,r]=iD[e]??[e,e];return aD(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function uD(e,t){let n=e?.forms??[],r=t?n.filter(e=>cE(e.id)===t):n;if(!r.length)return{value:0,sub:`no forms on the page yet`};let i=r.filter(e=>e.root?.status===`INVALID`).length;return{value:r.length,sub:`${r.length===1?`form`:`forms`} · ${i} invalid`}}function dD(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function fD(e,t){let n=e?.pages??[],r=t?n.find(e=>e.pageId===t)??null:n.reduce((e,t)=>!e||t.reportedAt>e.reportedAt?t:e,null),i=t&&!r?[]:e?.serverCalls??[],a=r?.initialUrl,o=[...a?i.filter(e=>!e.pageUrl||e.pageUrl===a):i,...r?.calls??[]];if(!o.length)return{value:0,sub:`no calls recorded yet`};let s=o.filter(dD).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var pD=class e{rpc=$(null);navigate=Ov();staticReport=Q(()=>oE(this.rpc()));meta=j(null);config=Q(()=>yE(this.rpc()));stats=Q(()=>this.rpc()?eD(this.config()):[]);configItems=Q(()=>XT(this.config()));metaState=j(`loading`);states=j({});rows=j({});injectorTree=j(null);signalGraph=j(null);formsState=j(null);httpState=j(null);pageId=eE();destroyRef=E(Cs);stopLive=[];zone=Q(()=>nD(nE(this.injectorTree(),this.pageId)?.zone));liveInjectors=Q(()=>{let e=nE(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return oD(e.roots,r),oD(e.environment,r),{injectors:t,providers:n}});liveSignals=Q(()=>{let e=rE(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>rD.has(e.kind??``)).length:null});cards=Q(()=>{let e=this.rows(),t={};if(e.components&&(t.components=sD(e.components)),e.routes&&(t.routes=cD(e.routes)),e.store&&(t.store=lD(e.store)),e.pipes){let n=e.pipes.filter(e=>e.builtin).length;t.pipes={value:e.pipes.length-n,sub:n?`custom pipes · ${n} built-in in use`:`custom pipes in source`}}let n=this.liveSignals();n===null?e.signals&&(t.signals={value:e.signals.length,sub:`signal declarations in source`}):t.signals={value:n,sub:e.signals?`live on the page · ${e.signals.length} declared in source`:`live on the page`};let r=this.liveInjectors();r?t.injectors={value:r.injectors,sub:`live injectors · ${aD(r.providers,`provider`,`providers`)}`}:e.injectors&&(t.injectors={value:e.injectors.filter(e=>e.type!==`injection`).length,sub:`provider declarations in source`});let i=this.formsState();i&&(t.forms=uD(i,this.pageId));let a=this.httpState();return a&&(t.network=fD(a,this.pageId)),t});constructor(){uc(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`pangular`);this.metaState.set(`loading`),this.states.set({}),this.rows.set({}),this.formsState.set(null),this.httpState.set(null),t.rpc.call(`build-meta`).then(e=>{this.meta.set(e),this.metaState.set(`ready`)}).catch(()=>this.metaState.set(`error`));let n=yE(e),r=e=>SE(e,n);r(`components`)&&this.load(t.rpc.call(`get-components`),`components`),r(`routes`)&&this.load(t.rpc.call(`get-routes`),`routes`),r(`signals`)&&this.load(t.rpc.call(`get-signals`),`signals`),r(`injectors`)&&this.load(t.rpc.call(`get-providers`),`injectors`),r(`store`)&&this.load(t.rpc.call(`get-ngrx-store`),`store`),r(`pipes`)&&this.load(t.rpc.call(`get-pipes`),`pipes`),this.watchLive(e,n)}),this.destroyRef.onDestroy(()=>this.unwatch())}stateOf(e){return(e===`signals`?this.liveSignals():e===`injectors`?this.liveInjectors():null)===null?this.states()[e]??`loading`:`ready`}load(e,t){let n=e=>this.states.update(n=>({...n,[t]:e}));e.then(e=>{this.rows.update(n=>({...n,[t]:Array.isArray(e)?e:[]})),n(`ready`)}).catch(()=>n(`error`))}async watchLive(e,t){this.unwatch();let n=e.scope(`pangular`).rpc,r=async(t,r,i)=>{let a=e=>i&&this.states.update(t=>({...t,[i]:e}));try{let i=await n.sharedState(t);if(this.destroyRef.destroyed||this.rpc()!==e)return;r(i.value()),a(`ready`),this.stopLive.push(i.on(`updated`,e=>r(e)))}catch{if(this.destroyRef.destroyed||this.rpc()!==e)return;r(null),a(`error`)}};await Promise.all([t.inspectors.injectors&&r(`injector-tree`,e=>this.injectorTree.set(e)),t.inspectors.signals&&r(`signal-graph`,e=>this.signalGraph.set(e)),SE(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),SE(`network`,t)&&r(`http`,e=>this.httpState.set(e??{}),`network`)])}unwatch(){for(let e of this.stopLive.splice(0))e()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:33,vars:14,consts:[[`aria-labelledby`,`project-title`,1,`project`],[1,`project-head`],[1,`eyebrow`],[`id`,`project-title`],[1,`hint`],[1,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[`type`,`button`,1,`stat`,3,`click`],[1,`top`],[1,`icon`],[3,`name`],[`aria-hidden`,`true`,1,`go`],[1,`label`],[1,`big`],[1,`sub`],[1,`big`,`muted`],[`aria-hidden`,`true`,1,`big`,`skeleton`]],template:function(e,t){if(e&1&&(z(0,`section`,0)(1,`div`,1)(2,`p`,2),J(3,`Project`),B(),z(4,`h2`,3),P(5,LE,1,1)(6,RE,1,0)(7,zE,1,0),B(),P(8,HE,3,1,`p`,4),B(),z(9,`ul`,5)(10,`li`)(11,`span`),J(12,`Angular`),B(),J(13),B(),z(14,`li`)(15,`span`),J(16,`TypeScript`),B(),J(17),B(),z(18,`li`)(19,`span`),J(20,`SSR`),B(),J(21),B(),P(22,UE,4,1,`li`,6),P(23,WE,4,1,`li`),B()(),z(24,`div`,7),I(25,JE,11,6,`button`,8,FE),B(),z(27,`section`,9)(28,`h2`,10),J(29,`Configuration`),B(),P(30,YE,2,0,`p`)(31,ZE,3,0,`dl`)(32,QE,2,0,`p`),B()),e&2){let e,n,r;N(`aria-busy`,t.metaState()===`loading`),M(4),q(`muted`,t.metaState()!==`ready`),M(),F((e=t.metaState())===`ready`?5:e===`error`?6:7),M(3),F(t.metaState()===`error`?8:-1),M(),q(`pending`,t.metaState()===`loading`),M(4),Y(t.meta()?.angularVersion??`…`),M(4),Y(t.meta()?.typescript??`…`),M(4),Y(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),M(),F((n=t.meta()?.analog)?22:-1,n),M(),F((r=t.zone())?23:-1,r),M(2),L(t.stats()),M(2),N(`aria-busy`,!t.rpc()),M(3),F(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[PE],styles:[`[_nghost-%COMP%] {
@@ -1500,7 +1500,7 @@ pre[_ngcontent-%COMP%] {
.inline-detail[_ngcontent-%COMP%] .show-form[_ngcontent-%COMP%] {
margin: 0 16px;
-}`]})};function Nk(e){return e.line?`${e.file}:${e.line}`:e.file}function Pk(e,t){let n=t.filter(t=>t.fullPath===e.fullPath&&t.redirectTo!==void 0==(e.redirectTo!==void 0));return n.find(t=>!!e.component&&t.component===e.component)??n.find(t=>!t.component||!e.component)}var Fk=aE;function Ik(e){return e.startsWith(`/`)&&!e.startsWith(`//`)&&!/^\/*[a-z][a-z0-9+.-]*:/i.test(e)&&!e.includes(`[redacted]`)&&e.length<=2e3}var Lk=`Could not reach the page.`;async function Rk(e,t,n){return await Fk(e,`request-router-action`,{pageId:t,request:n})??{error:`Could not reach the page.`}}function zk(e){return e===`succeeded`?`good`:e===`redirected`||e===`pending`||e===`skipped`?`warn`:e===`cancelled`||e===`failed`?`bad`:``}var Bk=()=>[],Vk=(e,t)=>t[0],Hk=(e,t)=>t.input;function Uk(e,t){if(e&1&&(H(0,`p`,3),J(1,` The browser shows `),H(2,`code`),J(3),U(),J(4,`, not the router URL (skipLocationChange, browserUrl, a failed navigation or code that changed history). `),U()),e&2){let e=K();M(3),Y(e.browserUrl)}}function Wk(e,t){if(e&1&&(H(0,`p`,12),J(1),U()),e&2){let e=K(3);M(),Y(e.navigationOff)}}function Gk(e,t){if(e&1){let e=W();H(0,`div`,8),Fg(1,`span`,9),H(2,`span`,10),J(3,`Navigating to `),H(4,`code`),J(5),U(),J(6),U(),H(7,`button`,11),Qg(`click`,function(){return O(e),k(K(2).abort())}),J(8,` Abort `),U()(),P(9,Wk,2,1,`p`,12)}if(e&2){let e=t,n=K(2);M(5),Y(e.url),M(),X(` (#`,e.id,`)`),M(),Vg(`disabled`,!n.navigationAllowed()),N(`aria-describedby`,n.navigationAllowed()?null:`route-current-writes-off`),M(2),F(n.navigationAllowed()?-1:9)}}function Kk(e,t){if(e&1&&(H(0,`p`,4),J(1),U()),e&2){let e=K(2);M(),Y(e.message())}}function qk(e,t){if(e&1&&(H(0,`dt`),J(1,`Document title`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.title)}}function Jk(e,t){if(e&1&&(H(0,`dt`),J(1,`Query params`),U(),H(2,`dd`)(3,`code`),J(4),dv(5,`json`),U()()),e&2){let e=K();M(4),Y(pv(5,1,e.queryParams))}}function Yk(e,t){if(e&1&&(H(0,`dt`),J(1,`Fragment`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.fragment)}}function Xk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.outlet)}}function Zk(e,t){e&1&&(H(0,`span`,14),J(1,`lazy`),U())}function Qk(e,t){if(e&1&&(H(0,`div`,15),J(1),U()),e&2){let e=K().$implicit;M(),Z(` title `,e.route.title,``,e.route.ownTitle===!1?` (inherited)`:``,` `)}}function $k(e,t){if(e&1&&(H(0,`code`,16),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.component)}}function eA(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function tA(e,t){e&1&&(H(0,`span`,14),J(1,`inherited`),U())}function nA(e,t){if(e&1&&(H(0,`div`,17)(1,`code`),J(2),dv(3,`json`),U(),P(4,tA,2,0,`span`,14),U()),e&2){let e=t.$implicit,n=K().$implicit;M(2),Z(``,e[0],`: `,pv(3,3,e[1])),M(2),F(n.route.paramSources?.[e[0]]===`inherited`?4:-1)}}function rA(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function iA(e,t){e&1&&(H(0,`span`,14),J(1),U()),e&2&&(M(),Y(t))}function aA(e,t){if(e&1&&(H(0,`div`,18)(1,`code`),J(2),dv(3,`json`),U(),P(4,iA,2,1,`span`,14),U()),e&2){let e,n=t.$implicit,r=K().$implicit;M(2),Z(``,n[0],`: `,pv(3,3,n[1])),M(2),F((e=r.route.dataSources?.[n[0]])?4:-1,e)}}function oA(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function sA(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function cA(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function lA(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function uA(e,t){if(e&1&&(H(0,`tr`)(1,`td`,13),J(2),P(3,Xk,2,1,`span`,14),P(4,Zk,2,0,`span`,14),P(5,Qk,2,2,`div`,15),U(),H(6,`td`),P(7,$k,2,1,`code`,16)(8,eA,4,0),U(),H(9,`td`),I(10,nA,5,5,`div`,17,Vk,!1,rA,4,0),U(),H(13,`td`),I(14,aA,5,5,`div`,18,Vk,!1,oA,4,0),U(),H(17,`td`),I(18,sA,2,1,`span`,14,wg),I(20,cA,2,1,`span`,14,wg),P(22,lA,4,0),U()()),e&2){let e=t.$implicit,n=K(2);M(),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.depth===0&&!e.route.path?`(root)`:`/`+e.route.path,` `),M(),F(e.route.outlet===`primary`?-1:3),M(),F(e.route.lazy?4:-1),M(),F(e.route.title?5:-1),M(2),F(e.route.component?7:8),M(3),L(n.entries(e.route.params)),M(4),L(n.entries(e.route.data)),M(4),L(n.guardList(e.route)),M(2),L(e.route.resolvers??ov(10,Bk)),M(2),F(!n.guardList(e.route).length&&!e.route.resolvers?.length?22:-1)}}function dA(e,t){if(e&1){let e=W();H(0,`button`,26),Qg(`click`,function(){O(e);let t=K(2).$implicit,n=K(3);return k(n.showComponent.emit({pageId:n.page().pageId,id:t.outlet.devtoolsId}))}),J(1,` Show in Components`),H(2,`span`,20),J(3),U()()}if(e&2){let e=K(2).$implicit;M(3),X(`: `,e.outlet.component??e.outlet.element??`routed component`)}}function fA(e,t){if(e&1&&(H(0,`code`),J(1),U(),J(2,` for `),H(3,`code`),J(4),U(),P(5,dA,4,1,`button`,25)),e&2){let e=K().$implicit,t=K(3);M(),Y(e.outlet.component??`?`),M(3),Y(e.outlet.route??`?`),M(),F(e.outlet.devtoolsId&&t.componentsOn()?5:-1)}}function pA(e,t){e&1&&(H(0,`span`,23),J(1,`not activated`),U())}function mA(e,t){e&1&&(H(0,`span`,14),J(1,`detached by reuse strategy`),U())}function hA(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Z(`input `,e.input,` ← `,e.source)}}function gA(e,t){if(e&1&&(H(0,`span`,24),J(1,`routerOutletData `),H(2,`code`),J(3),U()()),e&2){let e=K().$implicit;M(3),Y(e.outlet.data)}}function _A(e,t){if(e&1&&(H(0,`li`)(1,`span`,14),J(2),U(),P(3,fA,6,3)(4,pA,2,0,`span`,23),P(5,mA,2,0,`span`,14),I(6,hA,2,2,`span`,14,Hk),P(8,gA,4,1,`span`,24),U()),e&2){let e=t.$implicit,n=K(3);C_(`padding-left`,10+e.depth*16,`px`),M(2),Y(e.outlet.outlet),M(),F(e.outlet.activated?3:4),M(2),F(e.outlet.detached?5:-1),M(),L(n.boundInputs(e.outlet)),M(2),F(e.outlet.data===void 0?-1:8)}}function vA(e,t){if(e&1&&(H(0,`h3`),J(1,`Outlets`),U(),H(2,`ul`,21),I(3,_A,9,6,`li`,22,Cg),U()),e&2){let e=K(2);M(3),L(e.outletRows())}}function yA(e,t){if(e&1&&(H(0,`p`,1)(1,`span`,2),J(2,`URL`),U(),H(3,`code`),J(4),U()(),P(5,Uk,5,1,`p`,3),P(6,Gk,10,5),P(7,Kk,2,1,`p`,4),H(8,`dl`,5),P(9,qk,4,1),P(10,Jk,6,3),P(11,Yk,5,1),U(),H(12,`h3`),J(13,`Active routes`),U(),H(14,`div`,6)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,7),J(19,`Route`),U(),H(20,`th`,7),J(21,`Component`),U(),H(22,`th`,7),J(23,`Params`),U(),H(24,`th`,7),J(25,`Data`),U(),H(26,`th`,7),J(27,`Guards and resolvers`),U()()(),H(28,`tbody`),I(29,uA,23,11,`tr`,null,Cg),U()()(),P(31,vA,5,0)),e&2){let e,n=t,r=K();M(4),Y(n.url),M(),F(n.urlDrift&&n.browserUrl?5:-1),M(),F((e=n.pending)?6:-1,e),M(),F(r.message()?7:-1),M(2),F(n.title?9:-1),M(),F(r.hasKeys(n.queryParams)?10:-1),M(),F(n.fragment?11:-1),M(18),L(r.rows()),M(2),F(r.outletRows().length?31:-1)}}function bA(e,t){e&1&&(H(0,`div`,0)(1,`p`,27),J(2,`This page reports no Router.`),U(),H(3,`p`,23),J(4,` Add `),H(5,`code`),J(6,`provideRouter()`),U(),J(7,` to the app config and navigate once to see the active routes here. `),U()())}var xA=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);componentsOn=Q(()=>yE(this.rpc()).inspectors.components);showComponent=Ov();pageId=Q(()=>this.page().pageId);message=Tv({source:this.pageId,computation:()=>``});rows=Q(()=>{let e=[],t=(n,r)=>{e.push({route:n,depth:r});for(let e of n.children)t(e,r+1)},n=this.page().snapshot?.root;return n&&t(n,0),e});outletRows=Q(()=>{let e=[],t=(n,r)=>{for(let i of n)e.push({outlet:i,depth:r}),i.children&&t(i.children,r+1)};return t(this.page().outlets??[],0),e});hasKeys(e){return Object.keys(e).length>0}entries(e){return Object.entries(e)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}boundInputs(e){return(e.inputs??[]).filter(e=>e.source!==`unset`)}async abort(){let e=this.pageId(),t=await Rk(this.rpc(),e,{action:`abort`});e===this.pageId()&&this.message.set(t.error?String(t.error):`Aborted navigation #${t.aborted}.`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-current`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},outputs:{showComponent:`showComponent`},decls:2,vars:1,consts:[[1,`empty`],[1,`url`],[1,`url-label`],[`role`,`note`,1,`note`],[`role`,`status`,1,`muted`],[1,`facts`],[`role`,`region`,`aria-label`,`Active routes`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[`role`,`status`,1,`pending`],[`aria-hidden`,`true`,1,`pulse`],[1,`pending-text`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`route-current-writes-off`,1,`muted`],[1,`path`],[1,`tag`],[1,`sub`],[1,`component`],[1,`entry`],[1,`entry`,`data`],[`aria-hidden`,`true`,1,`nil`],[1,`visually-hidden`],[1,`outlets`],[3,`padding-left`],[1,`muted`],[1,`outlet-data`],[`type`,`button`,1,`small`,`show-component`],[`type`,`button`,1,`small`,`show-component`,3,`click`],[1,`empty-title`]],template:function(e,t){if(e&1&&P(0,yA,32,8)(1,bA,8,0,`div`,0),e&2){let e;F((e=t.page().snapshot)?0:1,e)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})};function Nk(e){return e.line?`${e.file}:${e.line}`:e.file}function Pk(e,t){let n=t.filter(t=>t.fullPath===e.fullPath&&t.redirectTo!==void 0==(e.redirectTo!==void 0));return n.find(t=>!!e.component&&t.component===e.component)??n.find(t=>!t.component||!e.component)}var Fk=aE;function Ik(e){return e.startsWith(`/`)&&!e.startsWith(`//`)&&!/^\/*[a-z][a-z0-9+.-]*:/i.test(e)&&!e.includes(`[redacted]`)&&e.length<=2e3}var Lk=`Could not reach the page.`;async function Rk(e,t,n){return await Fk(e,`request-router-action`,{pageId:t,request:n})??{error:`Could not reach the page.`}}function zk(e){return e===`succeeded`?`good`:e===`redirected`||e===`pending`||e===`skipped`?`warn`:e===`cancelled`||e===`failed`?`bad`:``}var Bk=()=>[],Vk=(e,t)=>t[0],Hk=(e,t)=>t.input;function Uk(e,t){if(e&1&&(H(0,`p`,3),J(1,` The browser shows `),H(2,`code`),J(3),U(),J(4,`, not the router URL (skipLocationChange, browserUrl, a failed navigation or code that changed history). `),U()),e&2){let e=K();M(3),Y(e.browserUrl)}}function Wk(e,t){if(e&1&&(H(0,`p`,12),J(1),U()),e&2){let e=K(3);M(),Y(e.navigationOff)}}function Gk(e,t){if(e&1){let e=W();H(0,`div`,8),Fg(1,`span`,9),H(2,`span`,10),J(3,`Navigating to `),H(4,`code`),J(5),U(),J(6),U(),H(7,`button`,11),Qg(`click`,function(){return O(e),k(K(2).abort())}),J(8,` Abort `),U()(),P(9,Wk,2,1,`p`,12)}if(e&2){let e=t,n=K(2);M(5),Y(e.url),M(),X(` (#`,e.id,`)`),M(),Vg(`disabled`,!n.navigationAllowed()),N(`aria-describedby`,n.navigationAllowed()?null:`route-current-writes-off`),M(2),F(n.navigationAllowed()?-1:9)}}function Kk(e,t){if(e&1&&(H(0,`p`,4),J(1),U()),e&2){let e=K(2);M(),Y(e.message())}}function qk(e,t){if(e&1&&(H(0,`dt`),J(1,`Document title`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.title)}}function Jk(e,t){if(e&1&&(H(0,`dt`),J(1,`Query params`),U(),H(2,`dd`)(3,`code`),J(4),dv(5,`json`),U()()),e&2){let e=K();M(4),Y(pv(5,1,e.queryParams))}}function Yk(e,t){if(e&1&&(H(0,`dt`),J(1,`Fragment`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.fragment)}}function Xk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=K().$implicit;M(),X(`, `,e.nesting)}}function Zk(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.outlet)}}function Qk(e,t){e&1&&(H(0,`span`,15),J(1,`lazy`),U())}function $k(e,t){if(e&1&&(H(0,`div`,16),J(1),U()),e&2){let e=K().$implicit;M(),Z(` title `,e.route.title,``,e.route.ownTitle===!1?` (inherited)`:``,` `)}}function eA(e,t){if(e&1&&(H(0,`code`,17),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.component)}}function tA(e,t){e&1&&(H(0,`span`,20),J(1,`–`),U(),H(2,`span`,14),J(3,`none`),U())}function nA(e,t){e&1&&(H(0,`span`,15),J(1,`inherited`),U())}function rA(e,t){if(e&1&&(H(0,`div`,18)(1,`code`),J(2),dv(3,`json`),U(),P(4,nA,2,0,`span`,15),U()),e&2){let e=t.$implicit,n=K().$implicit;M(2),Z(``,e[0],`: `,pv(3,3,e[1])),M(2),F(n.route.paramSources?.[e[0]]===`inherited`?4:-1)}}function iA(e,t){e&1&&(H(0,`span`,20),J(1,`–`),U(),H(2,`span`,14),J(3,`none`),U())}function aA(e,t){e&1&&(H(0,`span`,15),J(1),U()),e&2&&(M(),Y(t))}function oA(e,t){if(e&1&&(H(0,`div`,19)(1,`code`),J(2),dv(3,`json`),U(),P(4,aA,2,1,`span`,15),U()),e&2){let e,n=t.$implicit,r=K().$implicit;M(2),Z(``,n[0],`: `,pv(3,3,n[1])),M(2),F((e=r.route.dataSources?.[n[0]])?4:-1,e)}}function sA(e,t){e&1&&(H(0,`span`,20),J(1,`–`),U(),H(2,`span`,14),J(3,`none`),U())}function cA(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function lA(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function uA(e,t){e&1&&(H(0,`span`,20),J(1,`–`),U(),H(2,`span`,14),J(3,`none`),U())}function dA(e,t){if(e&1&&(H(0,`tr`)(1,`td`,13),J(2),P(3,Xk,2,1,`span`,14),P(4,Zk,2,1,`span`,15),P(5,Qk,2,0,`span`,15),P(6,$k,2,2,`div`,16),U(),H(7,`td`),P(8,eA,2,1,`code`,17)(9,tA,4,0),U(),H(10,`td`),I(11,rA,5,5,`div`,18,Vk,!1,iA,4,0),U(),H(14,`td`),I(15,oA,5,5,`div`,19,Vk,!1,sA,4,0),U(),H(18,`td`),I(19,cA,2,1,`span`,15,wg),I(21,lA,2,1,`span`,15,wg),P(23,uA,4,0),U()()),e&2){let e=t.$implicit,n=K(2);M(),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.label,` `),M(),F(e.nesting?3:-1),M(),F(e.route.outlet===`primary`?-1:4),M(),F(e.route.lazy?5:-1),M(),F(e.route.title?6:-1),M(2),F(e.route.component?8:9),M(3),L(n.entries(e.route.params)),M(4),L(n.entries(e.route.data)),M(4),L(n.guardList(e.route)),M(2),L(e.route.resolvers??ov(11,Bk)),M(2),F(!n.guardList(e.route).length&&!e.route.resolvers?.length?23:-1)}}function fA(e,t){if(e&1){let e=W();H(0,`button`,26),Qg(`click`,function(){O(e);let t=K(2).$implicit,n=K(3);return k(n.showComponent.emit({pageId:n.page().pageId,id:t.outlet.devtoolsId}))}),J(1,` Show in Components`),H(2,`span`,14),J(3),U()()}if(e&2){let e=K(2).$implicit;M(3),X(`: `,e.outlet.component??e.outlet.element??`routed component`)}}function pA(e,t){if(e&1&&(H(0,`code`),J(1),U(),J(2,` for `),H(3,`code`),J(4),U(),P(5,fA,4,1,`button`,25)),e&2){let e=K().$implicit,t=K(3);M(),Y(e.outlet.component??`?`),M(3),Y(e.outlet.route??`?`),M(),F(e.outlet.devtoolsId&&t.componentsOn()?5:-1)}}function mA(e,t){e&1&&(H(0,`span`,23),J(1,`not activated`),U())}function hA(e,t){e&1&&(H(0,`span`,15),J(1,`detached by reuse strategy`),U())}function gA(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=t.$implicit;M(),Z(`input `,e.input,` ← `,e.source)}}function _A(e,t){if(e&1&&(H(0,`span`,24),J(1,`routerOutletData `),H(2,`code`),J(3),U()()),e&2){let e=K().$implicit;M(3),Y(e.outlet.data)}}function vA(e,t){if(e&1&&(H(0,`li`)(1,`span`,15),J(2),U(),P(3,pA,6,3)(4,mA,2,0,`span`,23),P(5,hA,2,0,`span`,15),I(6,gA,2,2,`span`,15,Hk),P(8,_A,4,1,`span`,24),U()),e&2){let e=t.$implicit,n=K(3);C_(`padding-left`,10+e.depth*16,`px`),M(2),Y(e.outlet.outlet),M(),F(e.outlet.activated?3:4),M(2),F(e.outlet.detached?5:-1),M(),L(n.boundInputs(e.outlet)),M(2),F(e.outlet.data===void 0?-1:8)}}function yA(e,t){if(e&1&&(H(0,`h3`),J(1,`Outlets`),U(),H(2,`ul`,21),I(3,vA,9,6,`li`,22,Cg),U()),e&2){let e=K(2);M(3),L(e.outletRows())}}function bA(e,t){if(e&1&&(H(0,`p`,1)(1,`span`,2),J(2,`URL`),U(),H(3,`code`),J(4),U()(),P(5,Uk,5,1,`p`,3),P(6,Gk,10,5),P(7,Kk,2,1,`p`,4),H(8,`dl`,5),P(9,qk,4,1),P(10,Jk,6,3),P(11,Yk,5,1),U(),H(12,`h3`),J(13,`Active routes`),U(),H(14,`div`,6)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,7),J(19,`Route`),U(),H(20,`th`,7),J(21,`Component`),U(),H(22,`th`,7),J(23,`Params`),U(),H(24,`th`,7),J(25,`Data`),U(),H(26,`th`,7),J(27,`Guards and resolvers`),U()()(),H(28,`tbody`),I(29,dA,24,12,`tr`,null,Cg),U()()(),P(31,yA,5,0)),e&2){let e,n=t,r=K();M(4),Y(n.url),M(),F(n.urlDrift&&n.browserUrl?5:-1),M(),F((e=n.pending)?6:-1,e),M(),F(r.message()?7:-1),M(2),F(n.title?9:-1),M(),F(r.hasKeys(n.queryParams)?10:-1),M(),F(n.fragment?11:-1),M(18),L(r.rows()),M(2),F(r.outletRows().length?31:-1)}}function xA(e,t){e&1&&(H(0,`div`,0)(1,`p`,27),J(2,`This page reports no Router.`),U(),H(3,`p`,23),J(4,` Add `),H(5,`code`),J(6,`provideRouter()`),U(),J(7,` to the app config and navigate once to see the active routes here. `),U()())}var SA=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);componentsOn=Q(()=>yE(this.rpc()).inspectors.components);showComponent=Ov();pageId=Q(()=>this.page().pageId);message=Tv({source:this.pageId,computation:()=>``});rows=Q(()=>{let e=[],t=(n,r,i)=>{let a=r===0&&!n.path?`(root)`:`/`+n.path,o=i===void 0?void 0:`level ${r+1}, child of ${i}`;e.push({route:n,depth:r,label:a,nesting:o});for(let e of n.children)t(e,r+1,a)},n=this.page().snapshot?.root;return n&&t(n,0),e});outletRows=Q(()=>{let e=[],t=(n,r)=>{for(let i of n)e.push({outlet:i,depth:r}),i.children&&t(i.children,r+1)};return t(this.page().outlets??[],0),e});hasKeys(e){return Object.keys(e).length>0}entries(e){return Object.entries(e)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}boundInputs(e){return(e.inputs??[]).filter(e=>e.source!==`unset`)}async abort(){let e=this.pageId(),t=await Rk(this.rpc(),e,{action:`abort`});e===this.pageId()&&this.message.set(t.error?String(t.error):`Aborted navigation #${t.aborted}.`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-current`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},outputs:{showComponent:`showComponent`},decls:2,vars:1,consts:[[1,`empty`],[1,`url`],[1,`url-label`],[`role`,`note`,1,`note`],[`role`,`status`,1,`muted`],[1,`facts`],[`role`,`region`,`aria-label`,`Active routes`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[`role`,`status`,1,`pending`],[`aria-hidden`,`true`,1,`pulse`],[1,`pending-text`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`route-current-writes-off`,1,`muted`],[1,`path`],[1,`visually-hidden`],[1,`tag`],[1,`sub`],[1,`component`],[1,`entry`],[1,`entry`,`data`],[`aria-hidden`,`true`,1,`nil`],[1,`outlets`],[3,`padding-left`],[1,`muted`],[1,`outlet-data`],[`type`,`button`,1,`small`,`show-component`],[`type`,`button`,1,`small`,`show-component`,3,`click`],[1,`empty-title`]],template:function(e,t){if(e&1&&P(0,bA,32,8)(1,xA,8,0,`div`,0),e&2){let e;F((e=t.page().snapshot)?0:1,e)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -1933,7 +1933,7 @@ h3[_ngcontent-%COMP%] {
display: block;
color: var(--%NS%text-2);
font-size: 12px;
-}`]})};function SA(e,t){if(e&1&&(H(0,`span`,8),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().error,` error(s)`)}}function CA(e,t){if(e&1&&(H(0,`span`,9),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().warning,` warning(s)`)}}function wA(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().info,` info`)}}function TA(e,t){if(e&1&&(H(0,`span`,3),P(1,SA,2,1,`span`,8),P(2,CA,2,1,`span`,9),P(3,wA,2,1,`span`,10),U()),e&2){let e=K();M(),F(e.counts().error?1:-1),M(),F(e.counts().warning?2:-1),M(),F(e.counts().info?3:-1)}}function EA(e,t){if(e&1){let e=W();H(0,`div`,4)(1,`p`,11),J(2,`The route checks could not run.`),U(),H(3,`p`,2),J(4,`The devtools server did not answer. Check that it is still running.`),U(),H(5,`button`,1),Qg(`click`,function(){return O(e),k(K().run())}),J(6,`Retry`),U()()}}function DA(e,t){e&1&&(H(0,`p`,5),J(1,`Checking…`),U())}function OA(e,t){e&1&&J(0,` This page runs in events-only mode: it has no debug utils (a production build or an unusual setup), so it cannot report its route config. `)}function kA(e,t){e&1&&J(0,` The page has not reported its route config yet. It appears after the app finishes bootstrapping. `)}function AA(e,t){e&1&&J(0,` No page with a router is connected. `)}function jA(e,t){if(e&1&&(H(0,`div`,6)(1,`p`,11),J(2,`No checks ran.`),U(),H(3,`p`,2),P(4,OA,1,0)(5,kA,1,0)(6,AA,1,0),U()()),e&2){let e;M(4),F((e=t)===`events-only`?4:e===`no-config`?5:6)}}function MA(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,10),J(3),U(),H(4,`code`,13),J(5),U(),H(6,`code`,14),J(7),U()(),H(8,`p`,15),J(9),U(),H(10,`p`,16)(11,`span`,17),J(12,`Fix`),U(),H(13,`span`,18),J(14),H(15,`span`,2),J(16),U()()()()),e&2){let e=t.$implicit,n=K(2);N(`data-severity`,e.severity),M(2),N(`data-tone`,n.severityTone(e.severity)),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y(e.route),M(2),Y(e.message),M(5),X(``,e.fix,` `),M(2),X(`(Angular `,e.angular===`throws`?`throws`:e.angular===`warns`?`warns`:`does not warn`,`)`)}}function NA(e,t){if(e&1&&(H(0,`ul`,7),I(1,MA,17,8,`li`,null,Cg),U()),e&2){let e=K();N(`aria-busy`,e.checking()),M(),L(e.findings())}}function PA(e,t){e&1&&(H(0,`div`,6)(1,`span`,19),A(),H(2,`svg`,20),Fg(3,`path`,21),U()(),ps(),H(4,`p`,11),J(5,`No route config problems found.`),U(),H(6,`p`,2),J(7,`The check runs again after each navigation or config change.`),U()())}var FA=class e{page=$.required();rpc=$(null);result=j(null);failed=j(!1);checking=j(!1);findings=Q(()=>{let e=this.result();return e?.checked?e.findings:[]});notChecked=Q(()=>{let e=this.result();return e&&!e.checked?e.reason:null});counts=Q(()=>{let e={error:0,warning:0,info:0};for(let t of this.findings())e[t.severity]++;return e});key=Q(()=>{let e=this.page(),t=e.navigations[e.navigations.length-1],n=JSON.stringify((e.links??[]).map(e=>[e.text,e.href,e.linkActive!==void 0,e.ariaCurrent===void 0])),r=`${e.setup?.mode}/${e.setup?.features?.componentInputBinding}`;return`${e.pageId}:${e.generation}:${t?.id}:${t?.outcome}:${n}:${r}`});seq=0;checkedPage=null;constructor(){uc(()=>{this.key(),Cv(()=>void this.run())})}severityTone(e){return e===`error`?`bad`:e===`warning`?`warn`:``}async run(){let e=++this.seq,t=this.page().pageId;t!==this.checkedPage&&this.result.set(null),this.checking.set(!0);let n=await Fk(this.rpc(),`router-lint`,t);e===this.seq&&(this.checking.set(!1),this.failed.set(!n),n&&(this.result.set(n),this.checkedPage=t))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-lint`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:11,vars:4,consts:[[1,`toolbar`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`],[1,`summary`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`findings`],[`data-tone`,`bad`,1,`badge`],[`data-tone`,`warn`,1,`badge`],[1,`badge`],[1,`empty-title`],[1,`head`],[1,`rule`],[1,`route`],[1,`message`],[1,`fix`],[1,`fix-label`],[1,`fix-text`],[`aria-hidden`,`true`,1,`ok-mark`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`]],template:function(e,t){if(e&1&&(H(0,`div`,0)(1,`button`,1),Qg(`click`,function(){return t.run()}),J(2),U(),H(3,`span`,2),J(4,`Checks the live config, links and recent navigations. Lazy routes that have not loaded are skipped.`),U(),P(5,TA,4,3,`span`,3),U(),P(6,EA,7,0,`div`,4)(7,DA,2,0,`p`,5)(8,jA,7,1,`div`,6)(9,NA,3,1,`ul`,7)(10,PA,8,0,`div`,6)),e&2){let e;M(),N(`aria-busy`,t.checking()),M(),X(` `,t.checking()?`Checking…`:`Check again`,` `),M(3),F(t.result()?.checked&&t.findings().length?5:-1),M(),F(t.failed()?6:t.result()?(e=t.notChecked())?8:t.findings().length?9:10:7,e)}},styles:[`.muted[_ngcontent-%COMP%] {
+}`]})};function CA(e,t){if(e&1&&(H(0,`span`,8),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().error,` error(s)`)}}function wA(e,t){if(e&1&&(H(0,`span`,9),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().warning,` warning(s)`)}}function TA(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().info,` info`)}}function EA(e,t){if(e&1&&(H(0,`span`,3),P(1,CA,2,1,`span`,8),P(2,wA,2,1,`span`,9),P(3,TA,2,1,`span`,10),U()),e&2){let e=K();M(),F(e.counts().error?1:-1),M(),F(e.counts().warning?2:-1),M(),F(e.counts().info?3:-1)}}function DA(e,t){if(e&1){let e=W();H(0,`div`,4)(1,`p`,11),J(2,`The route checks could not run.`),U(),H(3,`p`,2),J(4,`The devtools server did not answer. Check that it is still running.`),U(),H(5,`button`,1),Qg(`click`,function(){return O(e),k(K().run())}),J(6,`Retry`),U()()}}function OA(e,t){e&1&&(H(0,`p`,5),J(1,`Checking…`),U())}function kA(e,t){e&1&&J(0,` This page runs in events-only mode: it has no debug utils (a production build or an unusual setup), so it cannot report its route config. `)}function AA(e,t){e&1&&J(0,` The page has not reported its route config yet. It appears after the app finishes bootstrapping. `)}function jA(e,t){e&1&&J(0,` No page with a router is connected. `)}function MA(e,t){if(e&1&&(H(0,`div`,6)(1,`p`,11),J(2,`No checks ran.`),U(),H(3,`p`,2),P(4,kA,1,0)(5,AA,1,0)(6,jA,1,0),U()()),e&2){let e;M(4),F((e=t)===`events-only`?4:e===`no-config`?5:6)}}function NA(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,10),J(3),U(),H(4,`code`,13),J(5),U(),H(6,`code`,14),J(7),U()(),H(8,`p`,15),J(9),U(),H(10,`p`,16)(11,`span`,17),J(12,`Fix`),U(),H(13,`span`,18),J(14),H(15,`span`,2),J(16),U()()()()),e&2){let e=t.$implicit,n=K(2);N(`data-severity`,e.severity),M(2),N(`data-tone`,n.severityTone(e.severity)),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y(e.route),M(2),Y(e.message),M(5),X(``,e.fix,` `),M(2),X(`(Angular `,e.angular===`throws`?`throws`:e.angular===`warns`?`warns`:`does not warn`,`)`)}}function PA(e,t){if(e&1&&(H(0,`ul`,7),I(1,NA,17,8,`li`,null,Cg),U()),e&2){let e=K();N(`aria-busy`,e.checking()),M(),L(e.findings())}}function FA(e,t){e&1&&(H(0,`div`,6)(1,`span`,19),A(),H(2,`svg`,20),Fg(3,`path`,21),U()(),ps(),H(4,`p`,11),J(5,`No route config problems found.`),U(),H(6,`p`,2),J(7,`The check runs again after each navigation or config change.`),U()())}var IA=class e{page=$.required();rpc=$(null);result=j(null);failed=j(!1);checking=j(!1);findings=Q(()=>{let e=this.result();return e?.checked?e.findings:[]});notChecked=Q(()=>{let e=this.result();return e&&!e.checked?e.reason:null});counts=Q(()=>{let e={error:0,warning:0,info:0};for(let t of this.findings())e[t.severity]++;return e});key=Q(()=>{let e=this.page(),t=e.navigations[e.navigations.length-1],n=JSON.stringify((e.links??[]).map(e=>[e.text,e.href,e.linkActive!==void 0,e.ariaCurrent===void 0])),r=`${e.setup?.mode}/${e.setup?.features?.componentInputBinding}`;return`${e.pageId}:${e.generation}:${t?.id}:${t?.outcome}:${n}:${r}`});seq=0;checkedPage=null;constructor(){uc(()=>{this.key(),Cv(()=>void this.run())})}severityTone(e){return e===`error`?`bad`:e===`warning`?`warn`:``}async run(){let e=++this.seq,t=this.page().pageId;t!==this.checkedPage&&this.result.set(null),this.checking.set(!0);let n=await Fk(this.rpc(),`router-lint`,t);e===this.seq&&(this.checking.set(!1),this.failed.set(!n),n&&(this.result.set(n),this.checkedPage=t))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-lint`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:11,vars:4,consts:[[1,`toolbar`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`],[1,`summary`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`findings`],[`data-tone`,`bad`,1,`badge`],[`data-tone`,`warn`,1,`badge`],[1,`badge`],[1,`empty-title`],[1,`head`],[1,`rule`],[1,`route`],[1,`message`],[1,`fix`],[1,`fix-label`],[1,`fix-text`],[`aria-hidden`,`true`,1,`ok-mark`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`]],template:function(e,t){if(e&1&&(H(0,`div`,0)(1,`button`,1),Qg(`click`,function(){return t.run()}),J(2),U(),H(3,`span`,2),J(4,`Checks the live config, links and recent navigations. Lazy routes that have not loaded are skipped.`),U(),P(5,EA,4,3,`span`,3),U(),P(6,DA,7,0,`div`,4)(7,OA,2,0,`p`,5)(8,MA,7,1,`div`,6)(9,PA,3,1,`ul`,7)(10,FA,8,0,`div`,6)),e&2){let e;M(),N(`aria-busy`,t.checking()),M(),X(` `,t.checking()?`Checking…`:`Check again`,` `),M(3),F(t.result()?.checked&&t.findings().length?5:-1),M(),F(t.failed()?6:t.result()?(e=t.notChecked())?8:t.findings().length?9:10:7,e)}},styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -2355,7 +2355,7 @@ h3[_ngcontent-%COMP%] {
.fix[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%] {
font-size: 12px;
-}`]})},IA=(e,t)=>t.name,LA=(e,t)=>t[0];function RA(e,t){e&1&&(H(0,`p`,1),J(1,` Events-only mode: this build has no debug utils (production build or unusual setup), so the route config, lint and actions are limited. `),U())}function zA(e,t){if(e&1&&(H(0,`dt`),J(1,`Angular`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.angularVersion)}}function BA(e,t){if(e&1&&(H(0,`dt`),J(1,`Base href`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.baseHref)}}function VA(e,t){if(e&1&&(H(0,`dt`),J(1,`Hydration`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),X(``,e.hydrated,` component(s) hydrated from server HTML`)}}function HA(e,t){if(e&1&&(H(0,`tr`)(1,`td`,5)(2,`code`),J(3),U()(),H(4,`td`)(5,`code`),J(6),U()(),H(7,`td`,6)(8,`span`,7),J(9),U()()()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),Y(e.value),M(2),N(`data-tone`,e.set?`warn`:``),M(),Y(e.set?`set`:`default`)}}function UA(e,t){if(e&1&&(H(0,`li`)(1,`span`,7),J(2),U()()),e&2){let e=t.$implicit;M(),N(`data-tone`,e[1]===`off`?``:`good`),M(),Z(``,e[0],`: `,e[1])}}function WA(e,t){if(e&1&&(H(0,`h3`),J(1,`Features`),U(),H(2,`ul`,8),I(3,UA,3,3,`li`,null,LA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.features))}}function GA(e,t){if(e&1&&(H(0,`dt`),J(1),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=t.$implicit;M(),Y(e[0]),M(3),Y(e[1])}}function KA(e,t){if(e&1&&(H(0,`h3`),J(1,`Strategies`),U(),H(2,`dl`,2),I(3,GA,5,2,null,null,LA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.strategies))}}function qA(e,t){if(e&1&&(P(0,RA,2,0,`p`,1),H(1,`dl`,2)(2,`dt`),J(3,`Set up with`),U(),H(4,`dd`),J(5),U(),P(6,zA,4,1),P(7,BA,5,1),P(8,VA,4,1),U(),H(9,`h3`),J(10,`Options`),U(),H(11,`div`,3)(12,`table`)(13,`thead`)(14,`tr`)(15,`th`,4),J(16,`Option`),U(),H(17,`th`,4),J(18,`Value`),U(),H(19,`th`,4),J(20,`Source`),U()()(),H(21,`tbody`),I(22,HA,10,4,`tr`,null,IA),U()()(),P(24,WA,5,0),P(25,KA,5,0)),e&2){let e=t,n=K();F(e.mode===`events-only`?0:-1),M(5),Z(` `,e.setupKind,``,e.routers>1?`, `+e.routers+` routers on the page`:``,` `),M(),F(e.angularVersion?6:-1),M(),F(e.baseHref?7:-1),M(),F(e.hydrated?8:-1),M(14),L(e.options),M(2),F(n.entries(e.features).length?24:-1),M(),F(n.entries(e.strategies).length?25:-1)}}function JA(e,t){e&1&&(H(0,`div`,0)(1,`p`,9),J(2,`The page has not reported its router setup yet.`),U(),H(3,`p`,10),J(4,` It appears after the app finishes bootstrapping. Reload the app if it stays empty. `),U()())}var YA=class e{page=$.required();entries(e){return Object.entries(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-setup`]],inputs:{page:[1,`page`]},decls:2,vars:1,consts:[[1,`empty`],[`role`,`note`,1,`note`],[1,`facts`],[`role`,`region`,`aria-label`,`Router options`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`name`],[1,`source`],[1,`badge`],[1,`chips`],[1,`empty-title`],[1,`muted`]],template:function(e,t){if(e&1&&P(0,qA,26,8)(1,JA,5,0,`div`,0),e&2){let e;F((e=t.page().setup)?0:1,e)}},styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},LA=(e,t)=>t.name,RA=(e,t)=>t[0];function zA(e,t){e&1&&(H(0,`p`,1),J(1,` Events-only mode: this build has no debug utils (production build or unusual setup), so the route config, lint and actions are limited. `),U())}function BA(e,t){if(e&1&&(H(0,`dt`),J(1,`Angular`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.angularVersion)}}function VA(e,t){if(e&1&&(H(0,`dt`),J(1,`Base href`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.baseHref)}}function HA(e,t){if(e&1&&(H(0,`dt`),J(1,`Hydration`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),X(``,e.hydrated,` component(s) hydrated from server HTML`)}}function UA(e,t){if(e&1&&(H(0,`tr`)(1,`td`,5)(2,`code`),J(3),U()(),H(4,`td`)(5,`code`),J(6),U()(),H(7,`td`,6)(8,`span`,7),J(9),U()()()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),Y(e.value),M(2),N(`data-tone`,e.set?`warn`:``),M(),Y(e.set?`set`:`default`)}}function WA(e,t){if(e&1&&(H(0,`li`)(1,`span`,7),J(2),U()()),e&2){let e=t.$implicit;M(),N(`data-tone`,e[1]===`off`?``:`good`),M(),Z(``,e[0],`: `,e[1])}}function GA(e,t){if(e&1&&(H(0,`h3`),J(1,`Features`),U(),H(2,`ul`,8),I(3,WA,3,3,`li`,null,RA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.features))}}function KA(e,t){if(e&1&&(H(0,`dt`),J(1),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=t.$implicit;M(),Y(e[0]),M(3),Y(e[1])}}function qA(e,t){if(e&1&&(H(0,`h3`),J(1,`Strategies`),U(),H(2,`dl`,2),I(3,KA,5,2,null,null,RA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.strategies))}}function JA(e,t){if(e&1&&(P(0,zA,2,0,`p`,1),H(1,`dl`,2)(2,`dt`),J(3,`Set up with`),U(),H(4,`dd`),J(5),U(),P(6,BA,4,1),P(7,VA,5,1),P(8,HA,4,1),U(),H(9,`h3`),J(10,`Options`),U(),H(11,`div`,3)(12,`table`)(13,`thead`)(14,`tr`)(15,`th`,4),J(16,`Option`),U(),H(17,`th`,4),J(18,`Value`),U(),H(19,`th`,4),J(20,`Source`),U()()(),H(21,`tbody`),I(22,UA,10,4,`tr`,null,LA),U()()(),P(24,GA,5,0),P(25,qA,5,0)),e&2){let e=t,n=K();F(e.mode===`events-only`?0:-1),M(5),Z(` `,e.setupKind,``,e.routers>1?`, `+e.routers+` routers on the page`:``,` `),M(),F(e.angularVersion?6:-1),M(),F(e.baseHref?7:-1),M(),F(e.hydrated?8:-1),M(14),L(e.options),M(2),F(n.entries(e.features).length?24:-1),M(),F(n.entries(e.strategies).length?25:-1)}}function YA(e,t){e&1&&(H(0,`div`,0)(1,`p`,9),J(2,`The page has not reported its router setup yet.`),U(),H(3,`p`,10),J(4,` It appears after the app finishes bootstrapping. Reload the app if it stays empty. `),U()())}var XA=class e{page=$.required();entries(e){return Object.entries(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-setup`]],inputs:{page:[1,`page`]},decls:2,vars:1,consts:[[1,`empty`],[`role`,`note`,1,`note`],[1,`facts`],[`role`,`region`,`aria-label`,`Router options`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`name`],[1,`source`],[1,`badge`],[1,`chips`],[1,`empty-title`],[1,`muted`]],template:function(e,t){if(e&1&&P(0,JA,26,8)(1,YA,5,0,`div`,0),e&2){let e;F((e=t.page().setup)?0:1,e)}},styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -2686,7 +2686,7 @@ h3[_ngcontent-%COMP%] {
.facts[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {
color: var(--%NS%text-strong);
-}`]})},XA=(e,t)=>t.id,ZA=(e,t)=>t.phase;function QA(e,t){if(e&1&&(z(0,`p`,8),J(1),B()),e&2){let e=K();M(),Y(e.message())}}function $A(e,t){if(e&1&&(z(0,`p`,9),J(1),B()),e&2){let e=K();M(),Y(e.navigationOff)}}function ej(e,t){e&1&&(z(0,`span`,18),J(1,`→`),B(),z(2,`span`,19),J(3,`then`),B())}function tj(e,t){if(e&1&&(P(0,ej,4,0),z(1,`code`),J(2),B()),e&2){let e=t.$implicit,n=t.$index;F(n===0?-1:0),M(2),Y(e)}}function nj(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),z(3,`span`,18),J(4,` → `),B(),z(5,`span`,19),J(6,` to `),B(),z(7,`code`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.from),M(6),Y(e.to),M(),X(`: `,n.hopCause(e),` `)}}function rj(e,t){if(e&1&&(z(0,`div`,13)(1,`p`,14)(2,`span`,15),J(3),B(),I(4,tj,3,2,null,null,Cg),B(),z(6,`ol`,16),I(7,nj,10,3,`li`,null,Cg),B(),z(9,`p`,17),J(10),B()()),e&2){let e=t.$implicit,n=K(2);M(3),Y(n.loopTitle(e)),M(),L(e.cycle),M(3),L(e.hops),M(3),Y(n.loopMeta(e))}}function ij(e,t){if(e&1&&(z(0,`section`,11)(1,`h3`,12),J(2),B(),I(3,rj,11,2,`div`,13,Cg),B()),e&2){let e=K();M(2),X(` `,e.loops().length===1?`Loop detected`:e.loops().length+` loops detected`,` `),M(),L(e.loops())}}function aj(e,t){if(e&1&&(z(0,`span`),V(1,`i`),J(2),B()),e&2){let e=t.$implicit,n=K(2);M(),C_(`background`,n.color(e)),M(),Y(e)}}function oj(e,t){if(e&1&&(z(0,`time`),J(1),B()),e&2){let e=K().$implicit,t=K(2);M(),Y(t.time(e.startedAt))}}function sj(e,t){if(e&1&&(z(0,`span`,18),J(1,`→`),B(),z(2,`span`,19),J(3,`redirected to`),B(),z(4,`code`,27),J(5),B()),e&2){let e=K().$implicit;M(5),Y(e.finalUrl)}}function cj(e,t){if(e&1&&(z(0,`span`,30),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.endedAt===void 0&&e.outcome!==`pending`?`before Pangular Inspector connected`:`started before Pangular Inspector connected`)}}function lj(e,t){if(e&1&&(z(0,`span`,31),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.phases?.total,`ms`)}}function uj(e,t){if(e&1&&(z(0,`span`,31),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.endedAt-e.startedAt,`ms`)}}function dj(e,t){e&1&&(z(0,`span`,32),J(1,`probe`),B())}function fj(e,t){if(e&1&&(z(0,`span`,15),J(1,`loop`),z(2,`span`,19),J(3),B()()),e&2){let e=t,n=K(3);M(3),Z(`: part of `,n.loopTitle(e),` `,e.cycle.join(` then `))}}function pj(e,t){if(e&1&&V(0,`span`),e&2){let e=t.$implicit,n=K(4);C_(`width`,e.width,`%`)(`background`,n.color(e.phase)),N(`title`,e.phase+` `+e.ms+`ms`)}}function mj(e,t){if(e&1&&(z(0,`div`,33),I(1,pj,1,5,`span`,39,ZA),B()),e&2){let e=K().$implicit,t=K(2);N(`aria-label`,t.barLabel(e)),M(),L(t.bars(e))}}function hj(e,t){if(e&1&&(z(0,`dt`),J(1,`From`),B(),z(2,`dd`)(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.from)}}function gj(e,t){if(e&1&&(z(0,`dt`),J(1,`Started by`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.caller,` (`,e.trigger,`)`)}}function _j(e,t){if(e&1&&(z(0,`dt`),J(1,`Extras`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.extras?.join(`, `))}}function vj(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirect of`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`#`,e.redirectedFrom)}}function yj(e,t){if(e&1&&(z(0,`div`),J(1,` This navigation: `),z(2,`code`),J(3),B(),J(4,` to `),z(5,`code`),J(6),B(),J(7),B()),e&2){let e=t.$implicit,n=K(4);M(3),Y(e.from),M(3),Y(e.to),M(),X(`, `,n.hopCause(e),` `)}}function bj(e,t){if(e&1&&(z(0,`dt`),J(1,`Loop`),B(),z(2,`dd`,40),J(3),I(4,yj,8,3,`div`,null,Cg),B()),e&2){let e=t,n=K().$implicit,r=K(2);M(3),X(` `,e.cycle.join(` → `),` `),M(),L(r.hopsOf(e,n))}}function xj(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirects to`),B(),z(2,`dd`)(3,`code`),J(4),B(),J(5),B()),e&2){let e=K().$implicit;M(4),Y(e.redirectTo),M(),X(` (`,e.redirectKind,`) `)}}function Sj(e,t){if(e&1&&(z(0,`dt`),J(1,`Guards`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Z(``,e.guards.names.join(`, `)||`none`,`: `,t.guardResult(e))}}function Cj(e,t){if(e&1&&(z(0,`div`)(1,`code`),J(2),B(),J(3),z(4,`code`),J(5),B(),J(6,`: `),z(7,`strong`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(e.guard),M(),X(` `,e.kind,` on `),M(2),Y(e.route),M(2),q(`bad`,n.isBad(e.result)),M(),Y(e.result),M(),X(` (`,e.ms,`ms) `)}}function wj(e,t){if(e&1&&(z(0,`dt`),J(1,`Runs`),B(),z(2,`dd`),I(3,Cj,10,7,`div`,null,Cg),B()),e&2){let e=K().$implicit;M(3),L(e.runs)}}function Tj(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` leaving `,e.checked.deactivate.join(`, `),`; `)}}function Ej(e,t){if(e&1&&(z(0,`dt`),J(1,`Checked`),B(),z(2,`dd`),P(3,Tj,1,1),J(4),B()),e&2){let e=K().$implicit;M(3),F(e.checked.deactivate.length?3:-1),M(),X(` entering `,e.checked.activate.join(`, `)||`nothing new`,` `)}}function Dj(e,t){if(e&1&&(z(0,`dt`),J(1,`Resolvers`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.resolvers?.names?.join(`, `))}}function Oj(e,t){if(e&1&&(z(0,`dt`),J(1,`Lazy loaded`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.lazyLoaded?.join(`, `))}}function kj(e,t){if(e&1&&(z(0,`dt`),J(1,`Reused`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(` `,e.reused?.join(`, `),` (component kept, only inputs and params change) `)}}function Aj(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.requests.count,` request(s): `,e.requests.urls.join(`, `))}}function jj(e,t){if(e&1&&(z(0,`dt`),J(1,`Scroll`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.scroll)}}function Mj(e,t){if(e&1&&(z(0,`dt`),J(1,`Title after`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.title)}}function Nj(e,t){if(e&1&&(z(0,`dt`),J(1,`Warnings`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.warnings?.join(` · `))}}function Pj(e,t){if(e&1&&(z(0,`dt`),J(1,`Reason`),B(),z(2,`dd`,40),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Y(t.reasonText(e))}}function Fj(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`,40),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorCode)}}function Ij(e,t){if(e&1&&(z(0,`dt`),J(1,`Error handler`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorHandler)}}function Lj(e,t){if(e&1&&(z(0,`dt`),J(1,`Earlier`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(``,e.earlier,` navigation(s) before Pangular Inspector connected`)}}function Rj(e,t){if(e&1&&(z(0,`p`,38),J(1,` Replay is off: the URL is redacted or not relative. `),B()),e&2){let e=K().$implicit;R(`id`,av(`replay-note-`,e.id))}}function zj(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,25),P(2,oj,2,1,`time`),z(3,`span`,26),J(4),B(),z(5,`code`,27),J(6),B(),P(7,sj,6,1),z(8,`span`,28)(9,`span`,29),J(10),B(),P(11,cj,2,1,`span`,30)(12,lj,2,1,`span`,31)(13,uj,2,1,`span`,31),P(14,dj,2,0,`span`,32),P(15,fj,4,2,`span`,15),B()(),P(16,mj,3,1,`div`,33),z(17,`dl`,34),P(18,hj,5,1),P(19,gj,4,2),P(20,_j,4,1),P(21,vj,4,1),P(22,bj,6,1),P(23,xj,6,2),P(24,Sj,4,2),P(25,wj,5,0),P(26,Ej,5,2),P(27,Dj,4,1),P(28,Oj,4,1),P(29,kj,4,1),P(30,Aj,4,2),P(31,jj,4,1),P(32,Mj,4,1),P(33,Nj,4,1),P(34,Pj,4,1),P(35,Fj,4,1),P(36,Ij,4,1),P(37,Lj,4,1),B(),z(38,`div`,35)(39,`button`,36),G(`click`,function(){let t=O(e).$implicit;return k(K(2).replay(t))}),J(40,` Replay `),B(),z(41,`button`,37),G(`click`,function(){let t=O(e).$implicit;return k(K(2).copy(t))}),J(42,` Copy repro `),B(),P(43,Rj,2,2,`p`,38),B()()}if(e&2){let e,n,r=t.$implicit,i=K(2);q(`in-loop`,!!i.loopOf(r)),M(2),F(r.beforeConnect?-1:2),M(2),X(`#`,r.id),M(2),Y(r.url),M(),F(r.finalUrl&&r.finalUrl!==r.url?7:-1),M(2),N(`data-tone`,i.tone(r.outcome)),M(),Y(r.outcome),M(),F(r.beforeConnect?11:r.phases?.total===void 0?r.endedAt===void 0?-1:13:12),M(3),F(r.probe?14:-1),M(),F((e=i.loopOf(r))?15:-1,e),M(),F(i.bars(r).length?16:-1),M(2),F(r.from?18:-1),M(),F(r.caller?19:-1),M(),F(r.extras?.length?20:-1),M(),F(r.redirectedFrom===void 0?-1:21),M(),F((n=i.loopOf(r))?22:-1,n),M(),F(r.redirectTo?23:-1),M(),F(r.guards&&(r.guards.names.length||r.guards.passed===!1)?24:-1),M(),F(r.runs?.length?25:-1),M(),F(r.checked&&(r.checked.activate.length||r.checked.deactivate.length)?26:-1),M(),F(r.resolvers?.names?.length?27:-1),M(),F(r.lazyLoaded?.length?28:-1),M(),F(r.reused?.length?29:-1),M(),F(r.requests?30:-1),M(),F(r.scroll?31:-1),M(),F(r.title?32:-1),M(),F(r.warnings?.length?33:-1),M(),F(r.reason||r.code?34:-1),M(),F(r.errorCode?35:-1),M(),F(r.errorHandler?36:-1),M(),F(r.earlier?37:-1),M(2),R(`disabled`,!i.navigationAllowed()||!i.replayable(r)),N(`aria-describedby`,i.replayNote(r))(`aria-label`,`Replay navigation `+r.id),M(2),N(`aria-label`,`Copy repro for navigation `+r.id),M(2),F(i.replayable(r)?-1:43)}}function Bj(e,t){if(e&1&&(z(0,`div`,20)(1,`span`,21),J(2),B(),z(3,`div`,22),I(4,aj,3,3,`span`,null,wg),B()(),z(6,`ol`,23),I(7,zj,44,37,`li`,24,XA),B()),e&2){let e=K();M(2),Z(``,e.items().length,` of `,e.page().navigations.length,` navigation(s)`),M(2),L(e.phases),M(3),L(e.items())}}function Vj(e,t){if(e&1){let e=W();z(0,`div`,41)(1,`p`,42),J(2,`No navigations match the current filters.`),B(),z(3,`p`,30),J(4),B(),z(5,`button`,37),G(`click`,function(){O(e);let t=K(2),n=n_(2);return t.clearFilters(),k(n.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2);M(4),X(` `,e.page().navigations.length,` navigation(s) are hidden. Clear the filters to see them. `)}}function Hj(e,t){e&1&&(z(0,`div`,41)(1,`p`,42),J(2,`No navigations since Pangular Inspector connected.`),B(),z(3,`p`,30),J(4,`Earlier ones are not visible. Click a link in the app to record one.`),B()())}function Uj(e,t){e&1&&P(0,Vj,7,1,`div`,41)(1,Hj,5,0,`div`,41),e&2&&F(+!K().page().navigations.length)}var Wj=[`recognize`,`guards`,`resolve`,`activate`],Gj={recognize:`#60a5fa`,guards:`#f59e0b`,resolve:`#2dd4bf`,activate:`#34d399`},Kj=class e{page=$.required();rpc=$(null);maxNavigations=Q(()=>yE(this.rpc()).limits.navigations);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);phases=Wj;pageId=Q(()=>this.page().pageId);filter=Tv({source:this.pageId,computation:()=>``});onlyProblems=Tv({source:this.pageId,computation:()=>!1});message=Tv({source:this.pageId,computation:()=>``});loops=Q(()=>this.page().loops??[]);loopById=Q(()=>{let e=new Map;for(let t of this.loops())for(let n of t.ids)e.set(n,t);return e});items=Q(()=>{let e=this.filter().toLowerCase();return[...this.page().navigations].reverse().filter(t=>(!e||t.url.toLowerCase().includes(e)||!!t.finalUrl?.toLowerCase().includes(e))&&(!this.onlyProblems()||this.isProblem(t)))});isProblem(e){return e.probe?!1:![`succeeded`,`pending`].includes(e.outcome)||this.loopById().has(e.id)}loopOf(e){return this.loopById().get(e.id)}loopTitle(e){return e.kind===`burst`?`navigation loop`:`redirect loop`}hopsOf(e,t){return e.hops.filter(e=>e.id===t.id)}hopCause(e){return e.via===`navigate`?`#${e.id} started by ${e.by??`code`}`:`${e.via===`redirectTo`?`config`:`${e.via} redirect`}${e.by?` ${e.by}`:e.via===`redirectTo`?` redirectTo`:``} in #${e.id}`}loopMeta(e){let t=e.ids.length>1?`Navigations #${e.ids[0]} to #${e.ids[e.ids.length-1]}`:`Navigation #${e.ids[0]}`,n=e.bounces>1?`, came back ${e.bounces} times`:``,r=e.guards.length?` Guards involved: ${e.guards.join(`, `)}.`:``;return`${t}${n}; ${e.end}.${r}`}reasonText(e){return[e.code,e.reason].filter(Boolean).join(`: `)}clearFilters(){this.filter.set(``),this.onlyProblems.set(!1)}tone(e){return zk(e)}color(e){return Gj[e]}bars(e){let t=e.phases?.total;return t?Wj.filter(t=>(e.phases?.[t]??0)>0).map(n=>({phase:n,ms:e.phases[n],width:Math.max(1,e.phases[n]/t*100)})):[]}barLabel(e){return`Phases: ${this.bars(e).map(e=>`${e.phase} ${e.ms}ms`).join(`, `)}`}guardResult(e){let t=e.guards?.passed;return t===!0?`passed`:t===!1?e.outcome===`redirected`?`redirected`:`blocked`:e.outcome===`pending`?`running`:`did not finish, navigation ${e.outcome}`}isBad(e){return e===`false`||/^(UrlTree|RedirectCommand|threw)/.test(e)}time=zD;instrumentSeq=0;async toggleInstrument(e){let t=e.target,n=t.checked,r=this.pageId(),i=++this.instrumentSeq,a=await Rk(this.rpc(),r,{action:`instrument`,on:n});if(i===this.instrumentSeq){if(r!==this.pageId()){t.checked=!!this.page().instrumented;return}if(a.error){t.checked=!!this.page().instrumented,this.message.set(String(a.error));return}this.message.set(n?`Recording each guard and resolver.`:`Stopped recording guards and resolvers.`)}}replayable(e){return Ik(e.url)}replayNote(e){return this.navigationAllowed()?this.replayable(e)?null:`replay-note-${e.id}`:`route-timeline-writes-off`}async replay(e){this.message.set(`Replaying #${e.id}…`);let t=this.pageId(),n=await Rk(this.rpc(),t,{action:`replay`,id:e.id});if(t!==this.pageId())return;if(n.error){this.message.set(String(n.error));return}let r=n.replay;this.message.set(`Replay of #${e.id}: ${r?.outcome??`unknown`}${n.same?` (same as before)`:` (different from before)`}.`)}async copy(e){let t=this.pageId(),n=await Fk(this.rpc(),`router-export`,{pageId:t,id:e.id});if(t===this.pageId()){if(!n){this.message.set(`Could not build the repro.`);return}try{await navigator.clipboard.writeText(n),t===this.pageId()&&this.message.set(`Copied a markdown repro of #${e.id}.`)}catch{t===this.pageId()&&this.message.set(`The clipboard is not available here.`)}}}async clearNavigations(){let e=this.rpc(),t=this.pageId(),n=`Clearing navigations…`;this.message.set(n);let r;try{if(!e)throw Error(`No connection`);await iE(e,`clear-router-navigations`,t),r=`Navigations cleared.`}catch{r=`Could not clear the navigations.`}t===this.pageId()?this.message.set(r):this.message()===n&&this.message.set(``)}exportJson(){let e=new Blob([JSON.stringify(this.page().navigations,null,2)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`navigations-${this.page().pageId}.json`,n.click(),URL.revokeObjectURL(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-timeline`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:21,vars:12,consts:[[`filterInput`,``],[1,`toolbar`],[`type`,`search`,`aria-label`,`Filter navigations by URL`,`placeholder`,`Filter by URL`,1,`field`,3,`input`,`keydown.escape`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`small`,`export`,3,`click`],[`type`,`button`,`aria-label`,`Clear navigations`,1,`small`,3,`click`,`disabled`],[`role`,`status`,1,`visually-hidden`],[`aria-hidden`,`true`,1,`message`],[`id`,`route-timeline-writes-off`,1,`message`],[`what`,`navigations`,`limit`,`navigations`,3,`dropped`,`max`],[`aria-labelledby`,`loops-heading`,1,`loops`],[`id`,`loops-heading`],[1,`loop`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`hops`],[1,`muted`,`loop-meta`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[1,`meta-row`],[1,`muted`,`count`],[`aria-hidden`,`true`,1,`legend`],[1,`navs`],[3,`in-loop`],[1,`head`],[1,`id`],[1,`url`],[1,`meta`],[1,`badge`],[1,`muted`],[1,`muted`,`ms`],[1,`tag`],[`role`,`img`,1,`bar`],[1,`details`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`,`replay-note`,3,`id`],[3,`width`,`background`],[1,`reason`],[1,`empty`],[1,`empty-title`]],template:function(e,t){e&1&&(z(0,`div`,1)(1,`input`,2,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),z(3,`label`,3)(4,`input`,4),G(`change`,function(e){return t.onlyProblems.set(e.target.checked)}),B(),J(5,` Only problems `),B(),z(6,`label`,3)(7,`input`,4),G(`change`,function(e){return t.toggleInstrument(e)}),B(),J(8,` Record each guard and resolver `),B(),z(9,`button`,5),G(`click`,function(){return t.exportJson()}),J(10,`Export JSON`),B(),z(11,`button`,6),G(`click`,function(){return t.clearNavigations()}),J(12,` Clear `),B()(),z(13,`p`,7),J(14),B(),P(15,QA,2,1,`p`,8),P(16,$A,2,1,`p`,9),V(17,`app-limit-note`,10),P(18,ij,5,1,`section`,11),P(19,Bj,9,2)(20,Uj,2,1)),e&2&&(M(),R(`value`,t.filter()),M(3),R(`checked`,t.onlyProblems()),M(3),R(`checked`,t.page().instrumented),M(4),R(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-timeline-writes-off`),M(3),Y(t.message()),M(),F(t.message()?15:-1),M(),F(t.navigationAllowed()?-1:16),M(),R(`dropped`,t.page().dropped??0)(`max`,t.maxNavigations()),M(),F(t.loops().length?18:-1),M(),F(t.items().length?19:20))},dependencies:[WD],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},ZA=(e,t)=>t.id,QA=(e,t)=>t.phase;function $A(e,t){if(e&1&&(z(0,`p`,8),J(1),B()),e&2){let e=K();M(),Y(e.message())}}function ej(e,t){if(e&1&&(z(0,`p`,9),J(1),B()),e&2){let e=K();M(),Y(e.navigationOff)}}function tj(e,t){e&1&&(z(0,`span`,18),J(1,`→`),B(),z(2,`span`,19),J(3,`then`),B())}function nj(e,t){if(e&1&&(P(0,tj,4,0),z(1,`code`),J(2),B()),e&2){let e=t.$implicit,n=t.$index;F(n===0?-1:0),M(2),Y(e)}}function rj(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),z(3,`span`,18),J(4,` → `),B(),z(5,`span`,19),J(6,` to `),B(),z(7,`code`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.from),M(6),Y(e.to),M(),X(`: `,n.hopCause(e),` `)}}function ij(e,t){if(e&1&&(z(0,`div`,13)(1,`p`,14)(2,`span`,15),J(3),B(),I(4,nj,3,2,null,null,Cg),B(),z(6,`ol`,16),I(7,rj,10,3,`li`,null,Cg),B(),z(9,`p`,17),J(10),B()()),e&2){let e=t.$implicit,n=K(2);M(3),Y(n.loopTitle(e)),M(),L(e.cycle),M(3),L(e.hops),M(3),Y(n.loopMeta(e))}}function aj(e,t){if(e&1&&(z(0,`section`,11)(1,`h3`,12),J(2),B(),I(3,ij,11,2,`div`,13,Cg),B()),e&2){let e=K();M(2),X(` `,e.loops().length===1?`Loop detected`:e.loops().length+` loops detected`,` `),M(),L(e.loops())}}function oj(e,t){if(e&1&&(z(0,`span`),V(1,`i`),J(2),B()),e&2){let e=t.$implicit,n=K(2);M(),C_(`background`,n.color(e)),M(),Y(e)}}function sj(e,t){if(e&1&&(z(0,`time`),J(1),B()),e&2){let e=K().$implicit,t=K(2);M(),Y(t.time(e.startedAt))}}function cj(e,t){if(e&1&&(z(0,`span`,18),J(1,`→`),B(),z(2,`span`,19),J(3,`redirected to`),B(),z(4,`code`,27),J(5),B()),e&2){let e=K().$implicit;M(5),Y(e.finalUrl)}}function lj(e,t){if(e&1&&(z(0,`span`,30),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.endedAt===void 0&&e.outcome!==`pending`?`before Pangular Inspector connected`:`started before Pangular Inspector connected`)}}function uj(e,t){if(e&1&&(z(0,`span`,31),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.phases?.total,`ms`)}}function dj(e,t){if(e&1&&(z(0,`span`,31),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.endedAt-e.startedAt,`ms`)}}function fj(e,t){e&1&&(z(0,`span`,32),J(1,`probe`),B())}function pj(e,t){if(e&1&&(z(0,`span`,15),J(1,`loop`),z(2,`span`,19),J(3),B()()),e&2){let e=t,n=K(3);M(3),Z(`: part of `,n.loopTitle(e),` `,e.cycle.join(` then `))}}function mj(e,t){if(e&1&&V(0,`span`),e&2){let e=t.$implicit,n=K(4);C_(`width`,e.width,`%`)(`background`,n.color(e.phase)),N(`title`,e.phase+` `+e.ms+`ms`)}}function hj(e,t){if(e&1&&(z(0,`div`,33),I(1,mj,1,5,`span`,39,QA),B()),e&2){let e=K().$implicit,t=K(2);N(`aria-label`,t.barLabel(e)),M(),L(t.bars(e))}}function gj(e,t){if(e&1&&(z(0,`dt`),J(1,`From`),B(),z(2,`dd`)(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.from)}}function _j(e,t){if(e&1&&(z(0,`dt`),J(1,`Started by`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.caller,` (`,e.trigger,`)`)}}function vj(e,t){if(e&1&&(z(0,`dt`),J(1,`Extras`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.extras?.join(`, `))}}function yj(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirect of`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`#`,e.redirectedFrom)}}function bj(e,t){if(e&1&&(z(0,`div`),J(1,` This navigation: `),z(2,`code`),J(3),B(),J(4,` to `),z(5,`code`),J(6),B(),J(7),B()),e&2){let e=t.$implicit,n=K(4);M(3),Y(e.from),M(3),Y(e.to),M(),X(`, `,n.hopCause(e),` `)}}function xj(e,t){if(e&1&&(z(0,`dt`),J(1,`Loop`),B(),z(2,`dd`,40),J(3),I(4,bj,8,3,`div`,null,Cg),B()),e&2){let e=t,n=K().$implicit,r=K(2);M(3),X(` `,e.cycle.join(` → `),` `),M(),L(r.hopsOf(e,n))}}function Sj(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirects to`),B(),z(2,`dd`)(3,`code`),J(4),B(),J(5),B()),e&2){let e=K().$implicit;M(4),Y(e.redirectTo),M(),X(` (`,e.redirectKind,`) `)}}function Cj(e,t){if(e&1&&(z(0,`dt`),J(1,`Guards`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Z(``,e.guards.names.join(`, `)||`none`,`: `,t.guardResult(e))}}function wj(e,t){if(e&1&&(z(0,`div`)(1,`code`),J(2),B(),J(3),z(4,`code`),J(5),B(),J(6,`: `),z(7,`strong`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(e.guard),M(),X(` `,e.kind,` on `),M(2),Y(e.route),M(2),q(`bad`,n.isBad(e.result)),M(),Y(e.result),M(),X(` (`,e.ms,`ms) `)}}function Tj(e,t){if(e&1&&(z(0,`dt`),J(1,`Runs`),B(),z(2,`dd`),I(3,wj,10,7,`div`,null,Cg),B()),e&2){let e=K().$implicit;M(3),L(e.runs)}}function Ej(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` leaving `,e.checked.deactivate.join(`, `),`; `)}}function Dj(e,t){if(e&1&&(z(0,`dt`),J(1,`Checked`),B(),z(2,`dd`),P(3,Ej,1,1),J(4),B()),e&2){let e=K().$implicit;M(3),F(e.checked.deactivate.length?3:-1),M(),X(` entering `,e.checked.activate.join(`, `)||`nothing new`,` `)}}function Oj(e,t){if(e&1&&(z(0,`dt`),J(1,`Resolvers`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.resolvers?.names?.join(`, `))}}function kj(e,t){if(e&1&&(z(0,`dt`),J(1,`Lazy loaded`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.lazyLoaded?.join(`, `))}}function Aj(e,t){if(e&1&&(z(0,`dt`),J(1,`Reused`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(` `,e.reused?.join(`, `),` (component kept, only inputs and params change) `)}}function jj(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.requests.count,` request(s): `,e.requests.urls.join(`, `))}}function Mj(e,t){if(e&1&&(z(0,`dt`),J(1,`Scroll`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.scroll)}}function Nj(e,t){if(e&1&&(z(0,`dt`),J(1,`Title after`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.title)}}function Pj(e,t){if(e&1&&(z(0,`dt`),J(1,`Warnings`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.warnings?.join(` · `))}}function Fj(e,t){if(e&1&&(z(0,`dt`),J(1,`Reason`),B(),z(2,`dd`,40),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Y(t.reasonText(e))}}function Ij(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`,40),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorCode)}}function Lj(e,t){if(e&1&&(z(0,`dt`),J(1,`Error handler`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorHandler)}}function Rj(e,t){if(e&1&&(z(0,`dt`),J(1,`Earlier`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(``,e.earlier,` navigation(s) before Pangular Inspector connected`)}}function zj(e,t){if(e&1&&(z(0,`p`,38),J(1,` Replay is off: the URL is redacted or not relative. `),B()),e&2){let e=K().$implicit;R(`id`,av(`replay-note-`,e.id))}}function Bj(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,25),P(2,sj,2,1,`time`),z(3,`span`,26),J(4),B(),z(5,`code`,27),J(6),B(),P(7,cj,6,1),z(8,`span`,28)(9,`span`,29),J(10),B(),P(11,lj,2,1,`span`,30)(12,uj,2,1,`span`,31)(13,dj,2,1,`span`,31),P(14,fj,2,0,`span`,32),P(15,pj,4,2,`span`,15),B()(),P(16,hj,3,1,`div`,33),z(17,`dl`,34),P(18,gj,5,1),P(19,_j,4,2),P(20,vj,4,1),P(21,yj,4,1),P(22,xj,6,1),P(23,Sj,6,2),P(24,Cj,4,2),P(25,Tj,5,0),P(26,Dj,5,2),P(27,Oj,4,1),P(28,kj,4,1),P(29,Aj,4,1),P(30,jj,4,2),P(31,Mj,4,1),P(32,Nj,4,1),P(33,Pj,4,1),P(34,Fj,4,1),P(35,Ij,4,1),P(36,Lj,4,1),P(37,Rj,4,1),B(),z(38,`div`,35)(39,`button`,36),G(`click`,function(){let t=O(e).$implicit;return k(K(2).replay(t))}),J(40,` Replay `),B(),z(41,`button`,37),G(`click`,function(){let t=O(e).$implicit;return k(K(2).copy(t))}),J(42,` Copy repro `),B(),P(43,zj,2,2,`p`,38),B()()}if(e&2){let e,n,r=t.$implicit,i=K(2);q(`in-loop`,!!i.loopOf(r)),M(2),F(r.beforeConnect?-1:2),M(2),X(`#`,r.id),M(2),Y(r.url),M(),F(r.finalUrl&&r.finalUrl!==r.url?7:-1),M(2),N(`data-tone`,i.tone(r.outcome)),M(),Y(r.outcome),M(),F(r.beforeConnect?11:r.phases?.total===void 0?r.endedAt===void 0?-1:13:12),M(3),F(r.probe?14:-1),M(),F((e=i.loopOf(r))?15:-1,e),M(),F(i.bars(r).length?16:-1),M(2),F(r.from?18:-1),M(),F(r.caller?19:-1),M(),F(r.extras?.length?20:-1),M(),F(r.redirectedFrom===void 0?-1:21),M(),F((n=i.loopOf(r))?22:-1,n),M(),F(r.redirectTo?23:-1),M(),F(r.guards&&(r.guards.names.length||r.guards.passed===!1)?24:-1),M(),F(r.runs?.length?25:-1),M(),F(r.checked&&(r.checked.activate.length||r.checked.deactivate.length)?26:-1),M(),F(r.resolvers?.names?.length?27:-1),M(),F(r.lazyLoaded?.length?28:-1),M(),F(r.reused?.length?29:-1),M(),F(r.requests?30:-1),M(),F(r.scroll?31:-1),M(),F(r.title?32:-1),M(),F(r.warnings?.length?33:-1),M(),F(r.reason||r.code?34:-1),M(),F(r.errorCode?35:-1),M(),F(r.errorHandler?36:-1),M(),F(r.earlier?37:-1),M(2),R(`disabled`,!i.navigationAllowed()||!i.replayable(r)),N(`aria-describedby`,i.replayNote(r))(`aria-label`,`Replay navigation `+r.id),M(2),N(`aria-label`,`Copy repro for navigation `+r.id),M(2),F(i.replayable(r)?-1:43)}}function Vj(e,t){if(e&1&&(z(0,`div`,20)(1,`span`,21),J(2),B(),z(3,`div`,22),I(4,oj,3,3,`span`,null,wg),B()(),z(6,`ol`,23),I(7,Bj,44,37,`li`,24,ZA),B()),e&2){let e=K();M(2),Z(``,e.items().length,` of `,e.page().navigations.length,` navigation(s)`),M(2),L(e.phases),M(3),L(e.items())}}function Hj(e,t){if(e&1){let e=W();z(0,`div`,41)(1,`p`,42),J(2,`No navigations match the current filters.`),B(),z(3,`p`,30),J(4),B(),z(5,`button`,37),G(`click`,function(){O(e);let t=K(2),n=n_(2);return t.clearFilters(),k(n.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2);M(4),X(` `,e.page().navigations.length,` navigation(s) are hidden. Clear the filters to see them. `)}}function Uj(e,t){e&1&&(z(0,`div`,41)(1,`p`,42),J(2,`No navigations since Pangular Inspector connected.`),B(),z(3,`p`,30),J(4,`Earlier ones are not visible. Click a link in the app to record one.`),B()())}function Wj(e,t){e&1&&P(0,Hj,7,1,`div`,41)(1,Uj,5,0,`div`,41),e&2&&F(+!K().page().navigations.length)}var Gj=[`recognize`,`guards`,`resolve`,`activate`],Kj={recognize:`#60a5fa`,guards:`#f59e0b`,resolve:`#2dd4bf`,activate:`#34d399`},qj=class e{page=$.required();rpc=$(null);maxNavigations=Q(()=>yE(this.rpc()).limits.navigations);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);phases=Gj;pageId=Q(()=>this.page().pageId);filter=Tv({source:this.pageId,computation:()=>``});onlyProblems=Tv({source:this.pageId,computation:()=>!1});message=Tv({source:this.pageId,computation:()=>``});loops=Q(()=>this.page().loops??[]);loopById=Q(()=>{let e=new Map;for(let t of this.loops())for(let n of t.ids)e.set(n,t);return e});items=Q(()=>{let e=this.filter().toLowerCase();return[...this.page().navigations].reverse().filter(t=>(!e||t.url.toLowerCase().includes(e)||!!t.finalUrl?.toLowerCase().includes(e))&&(!this.onlyProblems()||this.isProblem(t)))});isProblem(e){return e.probe?!1:![`succeeded`,`pending`].includes(e.outcome)||this.loopById().has(e.id)}loopOf(e){return this.loopById().get(e.id)}loopTitle(e){return e.kind===`burst`?`navigation loop`:`redirect loop`}hopsOf(e,t){return e.hops.filter(e=>e.id===t.id)}hopCause(e){return e.via===`navigate`?`#${e.id} started by ${e.by??`code`}`:`${e.via===`redirectTo`?`config`:`${e.via} redirect`}${e.by?` ${e.by}`:e.via===`redirectTo`?` redirectTo`:``} in #${e.id}`}loopMeta(e){let t=e.ids.length>1?`Navigations #${e.ids[0]} to #${e.ids[e.ids.length-1]}`:`Navigation #${e.ids[0]}`,n=e.bounces>1?`, came back ${e.bounces} times`:``,r=e.guards.length?` Guards involved: ${e.guards.join(`, `)}.`:``;return`${t}${n}; ${e.end}.${r}`}reasonText(e){return[e.code,e.reason].filter(Boolean).join(`: `)}clearFilters(){this.filter.set(``),this.onlyProblems.set(!1)}tone(e){return zk(e)}color(e){return Kj[e]}bars(e){let t=e.phases?.total;return t?Gj.filter(t=>(e.phases?.[t]??0)>0).map(n=>({phase:n,ms:e.phases[n],width:Math.max(1,e.phases[n]/t*100)})):[]}barLabel(e){return`Phases: ${this.bars(e).map(e=>`${e.phase} ${e.ms}ms`).join(`, `)}`}guardResult(e){let t=e.guards?.passed;return t===!0?`passed`:t===!1?e.outcome===`redirected`?`redirected`:`blocked`:e.outcome===`pending`?`running`:`did not finish, navigation ${e.outcome}`}isBad(e){return e===`false`||/^(UrlTree|RedirectCommand|threw)/.test(e)}time=zD;instrumentSeq=0;async toggleInstrument(e){let t=e.target,n=t.checked,r=this.pageId(),i=++this.instrumentSeq,a=await Rk(this.rpc(),r,{action:`instrument`,on:n});if(i===this.instrumentSeq){if(r!==this.pageId()){t.checked=!!this.page().instrumented;return}if(a.error){t.checked=!!this.page().instrumented,this.message.set(String(a.error));return}this.message.set(n?`Recording each guard and resolver.`:`Stopped recording guards and resolvers.`)}}replayable(e){return Ik(e.url)}replayNote(e){return this.navigationAllowed()?this.replayable(e)?null:`replay-note-${e.id}`:`route-timeline-writes-off`}async replay(e){this.message.set(`Replaying #${e.id}…`);let t=this.pageId(),n=await Rk(this.rpc(),t,{action:`replay`,id:e.id});if(t!==this.pageId())return;if(n.error){this.message.set(String(n.error));return}let r=n.replay;this.message.set(`Replay of #${e.id}: ${r?.outcome??`unknown`}${n.same?` (same as before)`:` (different from before)`}.`)}async copy(e){let t=this.pageId(),n=await Fk(this.rpc(),`router-export`,{pageId:t,id:e.id});if(t===this.pageId()){if(!n){this.message.set(`Could not build the repro.`);return}try{await navigator.clipboard.writeText(n),t===this.pageId()&&this.message.set(`Copied a markdown repro of #${e.id}.`)}catch{t===this.pageId()&&this.message.set(`The clipboard is not available here.`)}}}async clearNavigations(){let e=this.rpc(),t=this.pageId(),n=`Clearing navigations…`;this.message.set(n);let r;try{if(!e)throw Error(`No connection`);await iE(e,`clear-router-navigations`,t),r=`Navigations cleared.`}catch{r=`Could not clear the navigations.`}t===this.pageId()?this.message.set(r):this.message()===n&&this.message.set(``)}exportJson(){let e=new Blob([JSON.stringify(this.page().navigations,null,2)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`navigations-${this.page().pageId}.json`,n.click(),URL.revokeObjectURL(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-timeline`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:21,vars:12,consts:[[`filterInput`,``],[1,`toolbar`],[`type`,`search`,`aria-label`,`Filter navigations by URL`,`placeholder`,`Filter by URL`,1,`field`,3,`input`,`keydown.escape`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`small`,`export`,3,`click`],[`type`,`button`,`aria-label`,`Clear navigations`,1,`small`,3,`click`,`disabled`],[`role`,`status`,1,`visually-hidden`],[`aria-hidden`,`true`,1,`message`],[`id`,`route-timeline-writes-off`,1,`message`],[`what`,`navigations`,`limit`,`navigations`,3,`dropped`,`max`],[`aria-labelledby`,`loops-heading`,1,`loops`],[`id`,`loops-heading`],[1,`loop`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`hops`],[1,`muted`,`loop-meta`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[1,`meta-row`],[1,`muted`,`count`],[`aria-hidden`,`true`,1,`legend`],[1,`navs`],[3,`in-loop`],[1,`head`],[1,`id`],[1,`url`],[1,`meta`],[1,`badge`],[1,`muted`],[1,`muted`,`ms`],[1,`tag`],[`role`,`img`,1,`bar`],[1,`details`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`,`replay-note`,3,`id`],[3,`width`,`background`],[1,`reason`],[1,`empty`],[1,`empty-title`]],template:function(e,t){e&1&&(z(0,`div`,1)(1,`input`,2,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),z(3,`label`,3)(4,`input`,4),G(`change`,function(e){return t.onlyProblems.set(e.target.checked)}),B(),J(5,` Only problems `),B(),z(6,`label`,3)(7,`input`,4),G(`change`,function(e){return t.toggleInstrument(e)}),B(),J(8,` Record each guard and resolver `),B(),z(9,`button`,5),G(`click`,function(){return t.exportJson()}),J(10,`Export JSON`),B(),z(11,`button`,6),G(`click`,function(){return t.clearNavigations()}),J(12,` Clear `),B()(),z(13,`p`,7),J(14),B(),P(15,$A,2,1,`p`,8),P(16,ej,2,1,`p`,9),V(17,`app-limit-note`,10),P(18,aj,5,1,`section`,11),P(19,Vj,9,2)(20,Wj,2,1)),e&2&&(M(),R(`value`,t.filter()),M(3),R(`checked`,t.onlyProblems()),M(3),R(`checked`,t.page().instrumented),M(4),R(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-timeline-writes-off`),M(3),Y(t.message()),M(),F(t.message()?15:-1),M(),F(t.navigationAllowed()?-1:16),M(),R(`dropped`,t.page().dropped??0)(`max`,t.maxNavigations()),M(),F(t.loops().length?18:-1),M(),F(t.items().length?19:20))},dependencies:[WD],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -3270,7 +3270,7 @@ time[_ngcontent-%COMP%] {
.export[_ngcontent-%COMP%] {
margin-left: 0;
}
-}`]})},qj=[`urlInput`],Jj=()=>[],Yj=(e,t)=>t.node.id;function Xj(e,t){if(e&1&&(J(0,` with `),H(1,`code`),J(2),dv(3,`json`),U()),e&2){K(2);let e=iv(0);M(2),Y(pv(3,1,e.params))}}function Zj(e,t){if(e&1&&(H(0,`span`,19),J(1,`match`),U(),J(2,` Matches `),H(3,`code`,20),J(4),U(),P(5,Xj,4,3)),e&2){K();let e=iv(0),t=K();M(4),Y(t.chainText(e)),M(),F(t.hasKeys(e.params)?5:-1)}}function Qj(e,t){if(e&1&&(J(0,` Nearest: `),H(1,`code`),J(2),U()),e&2){K(2);let e=iv(0);M(2),Y(e.nearest.join(`, `))}}function $j(e,t){if(e&1&&(H(0,`span`,21),J(1,`no match`),U(),J(2,` Matches no route (NG04002). `),P(3,Qj,3,1)),e&2){K();let e=iv(0);M(3),F(e.nearest.length?3:-1)}}function eM(e,t){if(e&1&&(H(0,`div`,18),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function tM(e,t){if(e&1&&(nv(0),H(1,`div`,8)(2,`span`,17),J(3,`Result for `),H(4,`code`),J(5),U(),J(6,`:`),U(),P(7,Zj,6,2)(8,$j,4,1),I(9,eM,2,1,`div`,18,wg),U()),e&2){let e=t,n=rv(e.result);M(),N(`data-matched`,n.matched),M(4),Y(e.url),M(2),F(n.matched?7:8),M(2),L(n.notes)}}function nM(e,t){if(e&1&&(H(0,`p`,9),J(1),U()),e&2){let e=K();M(),Y(e.message())}}function rM(e,t){if(e&1&&(H(0,`p`,11),J(1),U()),e&2){let e=K();M(),Y(e.navigationOff)}}function iM(e,t){if(e&1&&(H(0,`span`,22),J(1),U(),J(2,`. `)),e&2){let e=K(2);M(),Y(e.countText())}}function aM(e,t){e&1&&J(0),e&2&&X(` `,K(2).rows().length,` route(s). `)}function oM(e,t){e&1&&J(0),e&2&&X(` `,t,` route(s) left out: the page lists at most 200 routes per level and 1000 in total. `)}function sM(e,t){if(e&1&&(H(0,`p`,14),J(1),P(2,iM,3,1)(3,aM,1,1),J(4,` Lazy routes show their children once loaded. `),P(5,oM,1,1),U()),e&2){let e,t=K();M(),X(` Generation `,t.page().generation,` · `),M(),F(t.filter()?2:3),M(3),F((e=t.page().configTruncated)?5:-1,e)}}function cM(e,t){if(e&1&&(H(0,`div`,15)(1,`p`,23),J(2),U(),H(3,`p`,18),J(4),U()()),e&2){let e=K();M(2),X(` `,e.page().setup?.mode===`events-only`?`This build has no debug utils, so the live config cannot be read.`:`The page has not reported its route config yet.`,` `),M(2),X(` `,e.page().setup?.mode===`events-only`?`Run the app with the development build to inspect the live config.`:`It appears once the router initializes. Navigate in the app if it stays empty.`,` `)}}function lM(e,t){if(e&1){let e=W();H(0,`div`,15)(1,`p`,23),J(2,`No routes match the filter.`),U(),H(3,`p`,18),J(4,`Try a shorter path or a component name.`),U(),H(5,`button`,24),Qg(`click`,function(){O(e);let t=K(),n=n_(16);return t.setFilter(``),k(n.focus())}),J(6,` Clear filter `),U()()}}function uM(e,t){e&1&&(H(0,`span`,28),J(1,`active`),U())}function dM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=K().$implicit;M(),X(`lazy `,e.node.lazy)}}function fM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=K().$implicit;M(),X(`outlet `,e.node.outlet)}}function pM(e,t){if(e&1&&(H(0,`span`,29)(1,`span`,26),J(2,`declared in `),U(),J(3),U()),e&2){let e=K().$implicit;M(3),Y(e.source)}}function mM(e,t){if(e&1&&(H(0,`span`,30),J(1,`redirect `),H(2,`span`,35),J(3,`→`),U(),H(4,`code`),J(5),U()()),e&2){let e=K().$implicit;M(5),Y(e.node.redirectTo)}}function hM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.component??(e.node.lazy===`unloaded`?`lazy, not loaded yet`:e.node.kind),` `)}}function gM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function _M(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function vM(e,t){e&1&&(H(0,`span`,36),J(1,`–`),U(),H(2,`span`,26),J(3,`none`),U())}function yM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.title,` `)}}function bM(e,t){e&1&&(H(0,`span`,36),J(1,`–`),U(),H(2,`span`,26),J(3,`none`),U())}function xM(e,t){if(e&1){let e=W();H(0,`input`,38),Qg(`input`,function(t){let n=O(e).$implicit,r=K(2).$implicit;return k(K(2).setParam(r.node.id,n,t.target.value))}),U()}if(e&2){let e=t.$implicit,n=K(2).$implicit,r=K(2);Vg(`placeholder`,e)(`value`,r.paramValues()[n.node.id]?.[e]??``),N(`aria-label`,e+` for `+n.node.fullPath)(`aria-invalid`,r.isInvalid(n.node,e)?`true`:null)(`aria-describedby`,r.isInvalid(n.node,e)?`route-tree-row-result`:null)}}function SM(e,t){if(e&1){let e=W();I(0,xM,1,5,`input`,37,wg),H(2,`button`,7),Qg(`click`,function(){O(e);let t=K().$implicit,n=n_(1);return k(K(2).navigate(t.node,n))}),J(3,` Go `),U()}if(e&2){let e=K().$implicit,t=K(2);L(t.params(e.node)),M(2),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`)(`aria-label`,`Navigate to `+e.node.fullPath)}}function CM(e,t){if(e&1){let e=W();H(0,`button`,24),Qg(`click`,function(){O(e);let t=K().$implicit;return k(K(2).resolveLazy(t.node))}),J(1,` Read lazy `),U()}if(e&2){let e=K().$implicit;N(`aria-label`,`Read lazy routes of `+e.node.fullPath)}}function wM(e,t){if(e&1&&(H(0,`tr`,34)(1,`td`,39)(2,`p`,40),J(3),U()()()),e&2){let e=K(3);M(3),Y(e.rowResult()?.text)}}function TM(e,t){if(e&1&&(H(0,`tr`,null,2)(2,`td`,27),J(3),P(4,uM,2,0,`span`,28),P(5,dM,2,1,`span`,28),P(6,fM,2,1,`span`,28),P(7,pM,4,1,`span`,29),U(),H(8,`td`),P(9,mM,6,1,`span`,30)(10,hM,1,1),U(),H(11,`td`),I(12,gM,2,1,`span`,28,Cg),I(14,_M,2,1,`span`,28,wg),P(16,vM,4,0),U(),H(17,`td`),P(18,yM,1,1)(19,bM,4,0),U(),H(20,`td`,31)(21,`div`,32),P(22,SM,4,3),P(23,CM,2,1,`button`,33),U()()(),P(24,wM,4,1,`tr`,34)),e&2){let e=t.$implicit,n=K(2);q(`active`,n.isActive(e.node)),M(2),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.node.fullPath,` `),M(),F(n.isActive(e.node)?4:-1),M(),F(e.node.lazy?5:-1),M(),F(e.node.outlet?6:-1),M(),F(e.source?7:-1),M(2),F(e.node.redirectTo===void 0?10:9),M(3),L(n.guardList(e.node)),M(2),L(e.node.resolvers??ov(15,Jj)),M(2),F(!n.guardList(e.node).length&&!e.node.resolvers?.length?16:-1),M(2),F(e.node.title?18:19),M(4),F(n.canNavigate(e.node)?22:-1),M(),F(e.node.kind===`lazy`&&e.node.lazy===`unloaded`?23:-1),M(),F(n.rowResult()?.id===e.node.id?24:-1)}}function EM(e,t){if(e&1&&(H(0,`div`,16)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,25),J(5,`Path`),U(),H(6,`th`,25),J(7,`Target`),U(),H(8,`th`,25),J(9,`Guards and resolvers`),U(),H(10,`th`,25),J(11,`Title`),U(),H(12,`th`,25)(13,`span`,26),J(14,`Actions`),U()()()(),H(15,`tbody`),I(16,TM,25,16,null,null,Yj),U()()()),e&2){let e=K();M(16),L(e.rows())}}function DM(e,t){return`${e} of ${t} ${t===1?`route`:`routes`}`}var OM=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);sources=$([]);filter=j(``);testUrl=j(``);pageId=Q(()=>this.page().pageId);match=Tv({source:this.pageId,computation:()=>null});message=Tv({source:this.pageId,computation:()=>``});rowResult=Tv({source:this.pageId,computation:()=>null});paramValues=Tv({source:this.pageId,computation:()=>({})});checkedRow=Tv({source:this.pageId,computation:()=>null});filterAnnouncement=Tv({source:this.pageId,computation:()=>``});predictSeq=0;announceFlip=!1;probeSeq=0;urlInput=Rv(`urlInput`);active=Q(()=>new Set(this.page().activeIds??[]));rows=Q(()=>{let e=this.filter().toLowerCase(),t=this.sources(),n=[],r=(i,a)=>{for(let o of i){let i=Pk(o,t),s=i&&Nk(i);(!e||o.fullPath.toLowerCase().includes(e)||o.component?.toLowerCase().includes(e)||s?.toLowerCase().includes(e))&&n.push({node:o,depth:a,source:s}),o.children&&r(o.children,a+1)}};return r(this.page().config??[],0),n});total=Q(()=>{let e=t=>t.reduce((t,n)=>t+1+e(n.children??[]),0);return e(this.page().config??[])});countText=Q(()=>DM(this.rows().length,this.total()));setFilter(e){this.filter.set(e);let t=this.rows().length,n=e?t?`${DM(t,this.total())} match.`:`No routes match.`:``;this.announceFlip=!this.announceFlip,this.filterAnnouncement.set(n&&(this.announceFlip?`${n}\u00a0`:n))}hasKeys(e){return Object.keys(e).length>0}isActive(e){return this.active().has(e.id)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}params(e){return(e.fullPath.match(/:([A-Za-z0-9_]+)/g)??[]).map(e=>e.slice(1))}canNavigate(e){return e.redirectTo===void 0&&!e.matcher&&!e.outlet&&!e.fullPath.includes(`**`)&&(!!e.component||e.kind===`component`||e.kind===`lazy`)}setParam(e,t,n){this.paramValues.update(r=>({...r,[e]:{...r[e],[t]:n}}))}missingParams(e){let t=this.paramValues()[e.id]??{};return this.params(e).filter(e=>!t[e])}isInvalid(e,t){return this.checkedRow()===e.id&&!this.paramValues()[e.id]?.[t]}chainText(e){return e.chain.map(e=>e.fullPath).join(` → `)}editUrl(e){this.testUrl.set(e),this.predictSeq++,this.probeSeq++,this.match.set(null),this.message.set(``)}askForUrl(e){this.match.set(null),this.message.set(`Type a URL to ${e}, for example /users/42.`),this.urlInput()?.nativeElement.focus()}async predict(){let e=this.testUrl().trim(),t=++this.predictSeq;if(!e){this.askForUrl(`predict`);return}let n=this.pageId(),r=await Fk(this.rpc(),`router-match`,{pageId:n,url:e});t===this.predictSeq&&n===this.pageId()&&(this.match.set(r&&{url:e,result:r}),r?this.message()===`Could not reach the page.`&&this.message.set(``):this.message.set(Lk))}async probe(){let e=this.testUrl().trim(),t=++this.probeSeq;if(!e){this.askForUrl(`probe`);return}this.message.set(`Running the real matcher in the app…`);let n=this.pageId(),r=await Rk(this.rpc(),n,{action:`probe`,url:e});if(t===this.probeSeq&&n===this.pageId()){if(r.error){this.message.set(String(r.error));return}this.message.set(r.matched?`The app recognized ${e} and its canMatch guards passed. The probe stopped before canActivate guards and resolvers, so those did not run. See the probe entry in Navigations.`:typeof r.redirectedTo==`string`?`A canMatch guard or the navigation error handler redirected ${e} to ${r.redirectedTo}. The probe stopped that navigation before it rendered anything.`:`The app could not recognize ${e}: ${String(r.reason??``)}`)}}async navigate(e,t){let n=this.missingParams(e);if(n.length){this.checkedRow.set(e.id),this.rowResult.set({id:e.id,text:`Fill in ${n.map(e=>`:${e}`).join(`, `)} to navigate.`}),Array.from(t?.querySelectorAll(`input.param`)??[]).find(e=>!e.value)?.focus();return}this.checkedRow.set(null),this.rowResult.set({id:e.id,text:`Navigating to ${e.fullPath}…`});let r=this.pageId(),i=await Rk(this.rpc(),r,{action:`navigate`,pattern:e.fullPath,params:this.paramValues()[e.id]??{}});r===this.pageId()&&this.rowResult.set({id:e.id,text:i.error?String(i.error):`Navigation #${i.id}: ${i.outcome}${i.finalUrl?` at ${i.finalUrl}`:``}.`})}async resolveLazy(e){let t=this.pageId(),n=await Rk(this.rpc(),t,{action:`resolve-lazy`,id:e.id});if(t!==this.pageId())return;if(n.error){this.rowResult.set({id:e.id,text:String(n.error)});return}let r=n.routes??[];this.rowResult.set({id:e.id,text:`${e.fullPath} declares ${r.length} route(s): ${r.map(e=>`/${e.path}`).join(`, `)}. The router loads them for real on the first navigation that needs them.`})}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-tree`]],viewQuery:function(e,t){e&1&&e_(t.urlInput,qj,5),e&2&&t_()},inputs:{page:[1,`page`],rpc:[1,`rpc`],sources:[1,`sources`]},decls:23,vars:11,consts:[[`urlInput`,``],[`filterInput`,``],[`rowEl`,``],[1,`test`,3,`submit`],[`for`,`test-url`],[`id`,`test-url`,`type`,`text`,`placeholder`,`/users/42`,1,`field`,3,`input`,`value`],[`type`,`submit`,1,`small`,`primary`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`role`,`status`,1,`result`],[`role`,`status`,1,`message`],[`role`,`status`,1,`visually-hidden`],[`id`,`route-tree-writes-off`,1,`message`],[1,`filter-row`],[`type`,`search`,`aria-label`,`Filter routes`,`placeholder`,`Filter by path, component or file`,1,`field`,`filter`,3,`input`,`keydown.escape`,`value`],[1,`muted`,`summary`],[1,`empty`],[`role`,`region`,`aria-label`,`Live route config`,`tabindex`,`0`,1,`table-scroll`],[1,`for`],[1,`muted`],[`data-tone`,`good`,1,`badge`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`count`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`scope`,`col`],[1,`visually-hidden`],[1,`path`],[1,`tag`],[1,`src`],[1,`redirect`],[1,`actions`],[1,`actions-inner`],[`type`,`button`,1,`small`],[1,`row-result`],[`aria-hidden`,`true`],[`aria-hidden`,`true`,1,`nil`],[`type`,`text`,1,`field`,`param`,3,`placeholder`,`value`],[`type`,`text`,1,`field`,`param`,3,`input`,`placeholder`,`value`],[`colspan`,`5`],[`id`,`route-tree-row-result`]],template:function(e,t){if(e&1){let e=W();H(0,`form`,3),Qg(`submit`,function(n){return O(e),n.preventDefault(),k(t.predict())}),H(1,`label`,4),J(2,`Test a URL`),U(),H(3,`input`,5,0),Qg(`input`,function(e){return t.editUrl(e.target.value)}),U(),H(5,`button`,6),J(6,`Predict`),U(),H(7,`button`,7),Qg(`click`,function(){return t.probe()}),J(8,` Probe in app `),U()(),P(9,tM,11,4,`div`,8),P(10,nM,2,1,`p`,9),H(11,`p`,10),J(12),U(),P(13,rM,2,1,`p`,11),H(14,`div`,12)(15,`input`,13,1),Qg(`input`,function(e){return t.setFilter(e.target.value)})(`keydown.escape`,function(){return t.setFilter(``)}),U(),P(17,sM,6,3,`p`,14),U(),H(18,`p`,10),J(19),U(),P(20,cM,5,2,`div`,15)(21,lM,7,0,`div`,15)(22,EM,18,0,`div`,16)}if(e&2){let e;M(3),Vg(`value`,t.testUrl()),M(4),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`),M(2),F((e=t.match())?9:-1,e),M(),F(t.message()?10:-1),M(2),Y(t.rowResult()?.text),M(),F(t.navigationAllowed()?-1:13),M(2),Vg(`value`,t.filter()),M(2),F(t.page().config?17:-1),M(2),Y(t.filterAnnouncement()),M(),F(t.page().config?t.rows().length?22:21:20)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},Jj=[`urlInput`],Yj=()=>[],Xj=(e,t)=>t.node.id;function Zj(e,t){if(e&1&&(J(0,` with `),H(1,`code`),J(2),dv(3,`json`),U()),e&2){K(2);let e=iv(0);M(2),Y(pv(3,1,e.params))}}function Qj(e,t){if(e&1&&(H(0,`span`,19),J(1,`match`),U(),J(2,` Matches `),H(3,`code`,20),J(4),U(),P(5,Zj,4,3)),e&2){K();let e=iv(0),t=K();M(4),Y(t.chainText(e)),M(),F(t.hasKeys(e.params)?5:-1)}}function $j(e,t){if(e&1&&(J(0,` Nearest: `),H(1,`code`),J(2),U()),e&2){K(2);let e=iv(0);M(2),Y(e.nearest.join(`, `))}}function eM(e,t){if(e&1&&(H(0,`span`,21),J(1,`no match`),U(),J(2,` Matches no route (NG04002). `),P(3,$j,3,1)),e&2){K();let e=iv(0);M(3),F(e.nearest.length?3:-1)}}function tM(e,t){if(e&1&&(H(0,`div`,18),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function nM(e,t){if(e&1&&(nv(0),H(1,`div`,8)(2,`span`,17),J(3,`Result for `),H(4,`code`),J(5),U(),J(6,`:`),U(),P(7,Qj,6,2)(8,eM,4,1),I(9,tM,2,1,`div`,18,wg),U()),e&2){let e=t,n=rv(e.result);M(),N(`data-matched`,n.matched),M(4),Y(e.url),M(2),F(n.matched?7:8),M(2),L(n.notes)}}function rM(e,t){if(e&1&&(H(0,`p`,9),J(1),U()),e&2){let e=K();M(),Y(e.message())}}function iM(e,t){if(e&1&&(H(0,`p`,11),J(1),U()),e&2){let e=K();M(),Y(e.navigationOff)}}function aM(e,t){if(e&1&&(H(0,`span`,22),J(1),U(),J(2,`. `)),e&2){let e=K(2);M(),Y(e.countText())}}function oM(e,t){e&1&&J(0),e&2&&X(` `,K(2).rows().length,` route(s). `)}function sM(e,t){e&1&&J(0),e&2&&X(` `,t,` route(s) left out: the page lists at most 200 routes per level and 1000 in total. `)}function cM(e,t){if(e&1&&(H(0,`p`,14),J(1),P(2,aM,3,1)(3,oM,1,1),J(4,` Lazy routes show their children once loaded. `),P(5,sM,1,1),U()),e&2){let e,t=K();M(),X(` Generation `,t.page().generation,` · `),M(),F(t.filter()?2:3),M(3),F((e=t.page().configTruncated)?5:-1,e)}}function lM(e,t){if(e&1&&(H(0,`div`,15)(1,`p`,23),J(2),U(),H(3,`p`,18),J(4),U()()),e&2){let e=K();M(2),X(` `,e.page().setup?.mode===`events-only`?`This build has no debug utils, so the live config cannot be read.`:`The page has not reported its route config yet.`,` `),M(2),X(` `,e.page().setup?.mode===`events-only`?`Run the app with the development build to inspect the live config.`:`It appears once the router initializes. Navigate in the app if it stays empty.`,` `)}}function uM(e,t){if(e&1){let e=W();H(0,`div`,15)(1,`p`,23),J(2,`No routes match the filter.`),U(),H(3,`p`,18),J(4,`Try a shorter path or a component name.`),U(),H(5,`button`,24),Qg(`click`,function(){O(e);let t=K(),n=n_(16);return t.setFilter(``),k(n.focus())}),J(6,` Clear filter `),U()()}}function dM(e,t){e&1&&(H(0,`span`,28),J(1,`active`),U())}function fM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=K().$implicit;M(),X(`lazy `,e.node.lazy)}}function pM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=K().$implicit;M(),X(`outlet `,e.node.outlet)}}function mM(e,t){if(e&1&&(H(0,`span`,29)(1,`span`,26),J(2,`declared in `),U(),J(3),U()),e&2){let e=K().$implicit;M(3),Y(e.source)}}function hM(e,t){if(e&1&&(H(0,`span`,30),J(1,`redirect `),H(2,`span`,35),J(3,`→`),U(),H(4,`code`),J(5),U()()),e&2){let e=K().$implicit;M(5),Y(e.node.redirectTo)}}function gM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.component??(e.node.lazy===`unloaded`?`lazy, not loaded yet`:e.node.kind),` `)}}function _M(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function vM(e,t){if(e&1&&(H(0,`span`,28),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function yM(e,t){e&1&&(H(0,`span`,36),J(1,`–`),U(),H(2,`span`,26),J(3,`none`),U())}function bM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.title,` `)}}function xM(e,t){e&1&&(H(0,`span`,36),J(1,`–`),U(),H(2,`span`,26),J(3,`none`),U())}function SM(e,t){if(e&1){let e=W();H(0,`input`,38),Qg(`input`,function(t){let n=O(e).$implicit,r=K(2).$implicit;return k(K(2).setParam(r.node.id,n,t.target.value))}),U()}if(e&2){let e=t.$implicit,n=K(2).$implicit,r=K(2);Vg(`placeholder`,e)(`value`,r.paramValues()[n.node.id]?.[e]??``),N(`aria-label`,e+` for `+n.node.fullPath)(`aria-invalid`,r.isInvalid(n.node,e)?`true`:null)(`aria-describedby`,r.isInvalid(n.node,e)?`route-tree-row-result`:null)}}function CM(e,t){if(e&1){let e=W();I(0,SM,1,5,`input`,37,wg),H(2,`button`,7),Qg(`click`,function(){O(e);let t=K().$implicit,n=n_(1);return k(K(2).navigate(t.node,n))}),J(3,` Go `),U()}if(e&2){let e=K().$implicit,t=K(2);L(t.params(e.node)),M(2),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`)(`aria-label`,`Navigate to `+e.node.fullPath)}}function wM(e,t){if(e&1){let e=W();H(0,`button`,24),Qg(`click`,function(){O(e);let t=K().$implicit;return k(K(2).resolveLazy(t.node))}),J(1,` Read lazy `),U()}if(e&2){let e=K().$implicit;N(`aria-label`,`Read lazy routes of `+e.node.fullPath)}}function TM(e,t){if(e&1&&(H(0,`tr`,34)(1,`td`,39)(2,`p`,40),J(3),U()()()),e&2){let e=K(3);M(3),Y(e.rowResult()?.text)}}function EM(e,t){if(e&1&&(H(0,`tr`,null,2)(2,`td`,27),J(3),P(4,dM,2,0,`span`,28),P(5,fM,2,1,`span`,28),P(6,pM,2,1,`span`,28),P(7,mM,4,1,`span`,29),U(),H(8,`td`),P(9,hM,6,1,`span`,30)(10,gM,1,1),U(),H(11,`td`),I(12,_M,2,1,`span`,28,Cg),I(14,vM,2,1,`span`,28,wg),P(16,yM,4,0),U(),H(17,`td`),P(18,bM,1,1)(19,xM,4,0),U(),H(20,`td`,31)(21,`div`,32),P(22,CM,4,3),P(23,wM,2,1,`button`,33),U()()(),P(24,TM,4,1,`tr`,34)),e&2){let e=t.$implicit,n=K(2);q(`active`,n.isActive(e.node)),M(2),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.node.fullPath,` `),M(),F(n.isActive(e.node)?4:-1),M(),F(e.node.lazy?5:-1),M(),F(e.node.outlet?6:-1),M(),F(e.source?7:-1),M(2),F(e.node.redirectTo===void 0?10:9),M(3),L(n.guardList(e.node)),M(2),L(e.node.resolvers??ov(15,Yj)),M(2),F(!n.guardList(e.node).length&&!e.node.resolvers?.length?16:-1),M(2),F(e.node.title?18:19),M(4),F(n.canNavigate(e.node)?22:-1),M(),F(e.node.kind===`lazy`&&e.node.lazy===`unloaded`?23:-1),M(),F(n.rowResult()?.id===e.node.id?24:-1)}}function DM(e,t){if(e&1&&(H(0,`div`,16)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,25),J(5,`Path`),U(),H(6,`th`,25),J(7,`Target`),U(),H(8,`th`,25),J(9,`Guards and resolvers`),U(),H(10,`th`,25),J(11,`Title`),U(),H(12,`th`,25)(13,`span`,26),J(14,`Actions`),U()()()(),H(15,`tbody`),I(16,EM,25,16,null,null,Xj),U()()()),e&2){let e=K();M(16),L(e.rows())}}function OM(e,t){return`${e} of ${t} ${t===1?`route`:`routes`}`}var kM=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>bE(this.rpc(),`router`));navigationOff=KT(`router`);sources=$([]);filter=j(``);testUrl=j(``);pageId=Q(()=>this.page().pageId);match=Tv({source:this.pageId,computation:()=>null});message=Tv({source:this.pageId,computation:()=>``});rowResult=Tv({source:this.pageId,computation:()=>null});paramValues=Tv({source:this.pageId,computation:()=>({})});checkedRow=Tv({source:this.pageId,computation:()=>null});filterAnnouncement=Tv({source:this.pageId,computation:()=>``});predictSeq=0;announceFlip=!1;probeSeq=0;urlInput=Rv(`urlInput`);active=Q(()=>new Set(this.page().activeIds??[]));rows=Q(()=>{let e=this.filter().toLowerCase(),t=this.sources(),n=[],r=(i,a)=>{for(let o of i){let i=Pk(o,t),s=i&&Nk(i);(!e||o.fullPath.toLowerCase().includes(e)||o.component?.toLowerCase().includes(e)||s?.toLowerCase().includes(e))&&n.push({node:o,depth:a,source:s}),o.children&&r(o.children,a+1)}};return r(this.page().config??[],0),n});total=Q(()=>{let e=t=>t.reduce((t,n)=>t+1+e(n.children??[]),0);return e(this.page().config??[])});countText=Q(()=>OM(this.rows().length,this.total()));setFilter(e){this.filter.set(e);let t=this.rows().length,n=e?t?`${OM(t,this.total())} match.`:`No routes match.`:``;this.announceFlip=!this.announceFlip,this.filterAnnouncement.set(n&&(this.announceFlip?`${n}\u00a0`:n))}hasKeys(e){return Object.keys(e).length>0}isActive(e){return this.active().has(e.id)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}params(e){return(e.fullPath.match(/:([A-Za-z0-9_]+)/g)??[]).map(e=>e.slice(1))}canNavigate(e){return e.redirectTo===void 0&&!e.matcher&&!e.outlet&&!e.fullPath.includes(`**`)&&(!!e.component||e.kind===`component`||e.kind===`lazy`)}setParam(e,t,n){this.paramValues.update(r=>({...r,[e]:{...r[e],[t]:n}}))}missingParams(e){let t=this.paramValues()[e.id]??{};return this.params(e).filter(e=>!t[e])}isInvalid(e,t){return this.checkedRow()===e.id&&!this.paramValues()[e.id]?.[t]}chainText(e){return e.chain.map(e=>e.fullPath).join(` → `)}editUrl(e){this.testUrl.set(e),this.predictSeq++,this.probeSeq++,this.match.set(null),this.message.set(``)}askForUrl(e){this.match.set(null),this.message.set(`Type a URL to ${e}, for example /users/42.`),this.urlInput()?.nativeElement.focus()}async predict(){let e=this.testUrl().trim(),t=++this.predictSeq;if(!e){this.askForUrl(`predict`);return}let n=this.pageId(),r=await Fk(this.rpc(),`router-match`,{pageId:n,url:e});t===this.predictSeq&&n===this.pageId()&&(this.match.set(r&&{url:e,result:r}),r?this.message()===`Could not reach the page.`&&this.message.set(``):this.message.set(Lk))}async probe(){let e=this.testUrl().trim(),t=++this.probeSeq;if(!e){this.askForUrl(`probe`);return}this.message.set(`Running the real matcher in the app…`);let n=this.pageId(),r=await Rk(this.rpc(),n,{action:`probe`,url:e});if(t===this.probeSeq&&n===this.pageId()){if(r.error){this.message.set(String(r.error));return}this.message.set(r.matched?`The app recognized ${e} and its canMatch guards passed. The probe stopped before canActivate guards and resolvers, so those did not run. See the probe entry in Navigations.`:typeof r.redirectedTo==`string`?`A canMatch guard or the navigation error handler redirected ${e} to ${r.redirectedTo}. The probe stopped that navigation before it rendered anything.`:`The app could not recognize ${e}: ${String(r.reason??``)}`)}}async navigate(e,t){let n=this.missingParams(e);if(n.length){this.checkedRow.set(e.id),this.rowResult.set({id:e.id,text:`Fill in ${n.map(e=>`:${e}`).join(`, `)} to navigate.`}),Array.from(t?.querySelectorAll(`input.param`)??[]).find(e=>!e.value)?.focus();return}this.checkedRow.set(null),this.rowResult.set({id:e.id,text:`Navigating to ${e.fullPath}…`});let r=this.pageId(),i=await Rk(this.rpc(),r,{action:`navigate`,pattern:e.fullPath,params:this.paramValues()[e.id]??{}});r===this.pageId()&&this.rowResult.set({id:e.id,text:i.error?String(i.error):`Navigation #${i.id}: ${i.outcome}${i.finalUrl?` at ${i.finalUrl}`:``}.`})}async resolveLazy(e){let t=this.pageId(),n=await Rk(this.rpc(),t,{action:`resolve-lazy`,id:e.id});if(t!==this.pageId())return;if(n.error){this.rowResult.set({id:e.id,text:String(n.error)});return}let r=n.routes??[];this.rowResult.set({id:e.id,text:`${e.fullPath} declares ${r.length} route(s): ${r.map(e=>`/${e.path}`).join(`, `)}. The router loads them for real on the first navigation that needs them.`})}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-tree`]],viewQuery:function(e,t){e&1&&e_(t.urlInput,Jj,5),e&2&&t_()},inputs:{page:[1,`page`],rpc:[1,`rpc`],sources:[1,`sources`]},decls:23,vars:11,consts:[[`urlInput`,``],[`filterInput`,``],[`rowEl`,``],[1,`test`,3,`submit`],[`for`,`test-url`],[`id`,`test-url`,`type`,`text`,`placeholder`,`/users/42`,1,`field`,3,`input`,`value`],[`type`,`submit`,1,`small`,`primary`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`role`,`status`,1,`result`],[`role`,`status`,1,`message`],[`role`,`status`,1,`visually-hidden`],[`id`,`route-tree-writes-off`,1,`message`],[1,`filter-row`],[`type`,`search`,`aria-label`,`Filter routes`,`placeholder`,`Filter by path, component or file`,1,`field`,`filter`,3,`input`,`keydown.escape`,`value`],[1,`muted`,`summary`],[1,`empty`],[`role`,`region`,`aria-label`,`Live route config`,`tabindex`,`0`,1,`table-scroll`],[1,`for`],[1,`muted`],[`data-tone`,`good`,1,`badge`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`count`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`scope`,`col`],[1,`visually-hidden`],[1,`path`],[1,`tag`],[1,`src`],[1,`redirect`],[1,`actions`],[1,`actions-inner`],[`type`,`button`,1,`small`],[1,`row-result`],[`aria-hidden`,`true`],[`aria-hidden`,`true`,1,`nil`],[`type`,`text`,1,`field`,`param`,3,`placeholder`,`value`],[`type`,`text`,1,`field`,`param`,3,`input`,`placeholder`,`value`],[`colspan`,`5`],[`id`,`route-tree-row-result`]],template:function(e,t){if(e&1){let e=W();H(0,`form`,3),Qg(`submit`,function(n){return O(e),n.preventDefault(),k(t.predict())}),H(1,`label`,4),J(2,`Test a URL`),U(),H(3,`input`,5,0),Qg(`input`,function(e){return t.editUrl(e.target.value)}),U(),H(5,`button`,6),J(6,`Predict`),U(),H(7,`button`,7),Qg(`click`,function(){return t.probe()}),J(8,` Probe in app `),U()(),P(9,nM,11,4,`div`,8),P(10,rM,2,1,`p`,9),H(11,`p`,10),J(12),U(),P(13,iM,2,1,`p`,11),H(14,`div`,12)(15,`input`,13,1),Qg(`input`,function(e){return t.setFilter(e.target.value)})(`keydown.escape`,function(){return t.setFilter(``)}),U(),P(17,cM,6,3,`p`,14),U(),H(18,`p`,10),J(19),U(),P(20,lM,5,2,`div`,15)(21,uM,7,0,`div`,15)(22,DM,18,0,`div`,16)}if(e&2){let e;M(3),Vg(`value`,t.testUrl()),M(4),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`),M(2),F((e=t.match())?9:-1,e),M(),F(t.message()?10:-1),M(2),Y(t.rowResult()?.text),M(),F(t.navigationAllowed()?-1:13),M(2),Vg(`value`,t.filter()),M(2),F(t.page().config?17:-1),M(2),Y(t.filterAnnouncement()),M(),F(t.page().config?t.rows().length?22:21:20)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -3753,7 +3753,7 @@ tr.active[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child {
.filter[_ngcontent-%COMP%] {
flex-basis: 100%;
}
-}`]})},kM=(e,t)=>t.id;function AM(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return O(e),k(K(2).pageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function jM(e,t){e&1&&P(0,AM,4,2,`div`,4),e&2&&F(K().pages().length>1?0:-1)}function MM(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,7),J(2,`Could not load the live router state.`),B(),z(3,`p`,8),J(4,` Check that the dev server with Pangular Inspector is still running, then retry. `),B(),z(5,`button`,9),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function NM(e,t){e&1&&(z(0,`p`,2),J(1,`Loading the live router state…`),B())}function PM(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K(3);M(),Y(e.problems()),M(2),X(`, `,e.problems(),` problem navigations`)}}function FM(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selected.set(t.id))}),J(1),P(2,PM,4,2),B()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`router-tab-`+e.id),N(`aria-selected`,e.id===n.selected())(`aria-controls`,`router-panel-`+e.id)(`tabindex`,e.id===n.selected()?0:-1),M(),X(` `,e.label,` `),M(),F(e.id===`navigations`&&n.problems()>0?2:-1)}}function IM(e,t){if(e&1){let e=W();z(0,`app-route-current`,19),G(`showComponent`,function(t){return O(e),k(K(2).showComponent.emit(t))}),B()}if(e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function LM(e,t){if(e&1&&V(0,`app-route-timeline`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function RM(e,t){if(e&1&&V(0,`app-route-tree`,14),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())(`sources`,t.sources())}}function zM(e,t){e&1&&V(0,`app-route-setup`,15),e&2&&R(`page`,K())}function BM(e,t){if(e&1&&V(0,`app-route-lint`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function VM(e,t){if(e&1){let e=W();z(0,`div`,10),G(`keydown`,function(t){return O(e),k(K().onKey(t))}),I(1,FM,3,6,`button`,11,kM),B(),z(3,`div`,12),P(4,IM,1,2,`app-route-current`,13)(5,LM,1,2,`app-route-timeline`,13)(6,RM,1,3,`app-route-tree`,14)(7,zM,1,1,`app-route-setup`,15)(8,BM,1,2,`app-route-lint`,13),B()}if(e&2){let e,t=K();M(),L(t.tabs),M(2),R(`id`,`router-panel-`+t.selected()),N(`aria-labelledby`,`router-tab-`+t.selected()),M(),F((e=t.selected())===`current`?4:e===`navigations`?5:e===`routes`?6:e===`setup`?7:e===`lint`?8:-1)}}function HM(e,t){e&1&&(z(0,`div`,3)(1,`p`,7),J(2,`No page is reporting router state yet.`),B(),z(3,`p`,8),J(4,` Open the app in a browser. This view updates as soon as a page connects. `),B()())}var UM=[{id:`current`,label:`Current`},{id:`navigations`,label:`Navigations`},{id:`routes`,label:`Routes`},{id:`setup`,label:`Setup`},{id:`lint`,label:`Lint`}],WM=class e{rpc=$(null);sources=$([]);showComponent=Ov();tabs=UM;selected=j(`current`);pages=j([]);hostPageId=eE();loading=j(!0);failed=j(!1);pageId=Tv({source:this.pages,computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:this.hostPageId?e.find(e=>e.pageId===this.hostPageId)?.pageId??null:e.find(e=>e.snapshot)?.pageId??e[0]?.pageId??null});unsubscribe=null;destroyRef=E(Cs);page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.pageId())??(this.hostPageId?null:e[0])??null});problems=Q(()=>(this.page()?.navigations??[]).filter(e=>!e.probe&&[`failed`,`cancelled`,`redirected`].includes(e.outcome)).length);constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{this.pages.set(e?.pages??[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.snapshot?.url??e.pageId,hint:e.pageId})));onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.selected()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.selected.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#router-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-live-route`]],inputs:{rpc:[1,`rpc`],sources:[1,`sources`]},outputs:{showComponent:`showComponent`},decls:8,vars:2,consts:[[1,`section-head`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`page-pick`],[`id`,`live-route-page-label`,1,`page-label`],[`labelledBy`,`live-route-page-label`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`retry`,3,`click`],[`role`,`tablist`,`aria-label`,`Router views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`page`,`rpc`],[3,`page`,`rpc`,`sources`],[3,`page`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[`aria-hidden`,`true`,1,`count`],[1,`visually-hidden`],[3,`showComponent`,`page`,`rpc`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`h2`),J(2,`Live router`),B(),P(3,jM,1,1),B(),P(4,MM,7,0,`div`,1)(5,NM,2,0,`p`,2)(6,VM,9,3)(7,HM,5,0,`div`,3)),e&2){let e,n;M(3),F((e=t.page())?3:-1,e),M(),F(t.failed()?4:t.loading()?5:(n=t.page())?6:7,n)}},dependencies:[xA,FA,YA,Kj,OM,jD],styles:[`[_nghost-%COMP%] {
+}`]})},AM=(e,t)=>t.id;function jM(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return O(e),k(K(2).pageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function MM(e,t){e&1&&P(0,jM,4,2,`div`,4),e&2&&F(K().pages().length>1?0:-1)}function NM(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,7),J(2,`Could not load the live router state.`),B(),z(3,`p`,8),J(4,` Check that the dev server with Pangular Inspector is still running, then retry. `),B(),z(5,`button`,9),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function PM(e,t){e&1&&(z(0,`p`,2),J(1,`Loading the live router state…`),B())}function FM(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K(3);M(),Y(e.problems()),M(2),X(`, `,e.problems(),` problem navigations`)}}function IM(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selected.set(t.id))}),J(1),P(2,FM,4,2),B()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`router-tab-`+e.id),N(`aria-selected`,e.id===n.selected())(`aria-controls`,`router-panel-`+e.id)(`tabindex`,e.id===n.selected()?0:-1),M(),X(` `,e.label,` `),M(),F(e.id===`navigations`&&n.problems()>0?2:-1)}}function LM(e,t){if(e&1){let e=W();z(0,`app-route-current`,19),G(`showComponent`,function(t){return O(e),k(K(2).showComponent.emit(t))}),B()}if(e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function RM(e,t){if(e&1&&V(0,`app-route-timeline`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function zM(e,t){if(e&1&&V(0,`app-route-tree`,14),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())(`sources`,t.sources())}}function BM(e,t){e&1&&V(0,`app-route-setup`,15),e&2&&R(`page`,K())}function VM(e,t){if(e&1&&V(0,`app-route-lint`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function HM(e,t){if(e&1){let e=W();z(0,`div`,10),G(`keydown`,function(t){return O(e),k(K().onKey(t))}),I(1,IM,3,6,`button`,11,AM),B(),z(3,`div`,12),P(4,LM,1,2,`app-route-current`,13)(5,RM,1,2,`app-route-timeline`,13)(6,zM,1,3,`app-route-tree`,14)(7,BM,1,1,`app-route-setup`,15)(8,VM,1,2,`app-route-lint`,13),B()}if(e&2){let e,t=K();M(),L(t.tabs),M(2),R(`id`,`router-panel-`+t.selected()),N(`aria-labelledby`,`router-tab-`+t.selected()),M(),F((e=t.selected())===`current`?4:e===`navigations`?5:e===`routes`?6:e===`setup`?7:e===`lint`?8:-1)}}function UM(e,t){e&1&&(z(0,`div`,3)(1,`p`,7),J(2,`No page is reporting router state yet.`),B(),z(3,`p`,8),J(4,` Open the app in a browser. This view updates as soon as a page connects. `),B()())}var WM=[{id:`current`,label:`Current`},{id:`navigations`,label:`Navigations`},{id:`routes`,label:`Routes`},{id:`setup`,label:`Setup`},{id:`lint`,label:`Lint`}],GM=class e{rpc=$(null);sources=$([]);showComponent=Ov();tabs=WM;selected=j(`current`);pages=j([]);hostPageId=eE();loading=j(!0);failed=j(!1);pageId=Tv({source:this.pages,computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:this.hostPageId?e.find(e=>e.pageId===this.hostPageId)?.pageId??null:e.find(e=>e.snapshot)?.pageId??e[0]?.pageId??null});unsubscribe=null;destroyRef=E(Cs);page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.pageId())??(this.hostPageId?null:e[0])??null});problems=Q(()=>(this.page()?.navigations??[]).filter(e=>!e.probe&&[`failed`,`cancelled`,`redirected`].includes(e.outcome)).length);constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{this.pages.set(e?.pages??[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.snapshot?.url??e.pageId,hint:e.pageId})));onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.selected()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.selected.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#router-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-live-route`]],inputs:{rpc:[1,`rpc`],sources:[1,`sources`]},outputs:{showComponent:`showComponent`},decls:8,vars:2,consts:[[1,`section-head`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`page-pick`],[`id`,`live-route-page-label`,1,`page-label`],[`labelledBy`,`live-route-page-label`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`retry`,3,`click`],[`role`,`tablist`,`aria-label`,`Router views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`page`,`rpc`],[3,`page`,`rpc`,`sources`],[3,`page`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[`aria-hidden`,`true`,1,`count`],[1,`visually-hidden`],[3,`showComponent`,`page`,`rpc`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`h2`),J(2,`Live router`),B(),P(3,MM,1,1),B(),P(4,NM,7,0,`div`,1)(5,PM,2,0,`p`,2)(6,HM,9,3)(7,UM,5,0,`div`,3)),e&2){let e,n;M(3),F((e=t.page())?3:-1,e),M(),F(t.failed()?4:t.loading()?5:(n=t.page())?6:7,n)}},dependencies:[SA,IA,XA,qj,kM,jD],styles:[`[_nghost-%COMP%] {
display: grid;
gap: 16px;
min-width: 0;
@@ -3918,7 +3918,7 @@ h2[_ngcontent-%COMP%] {
line-height: 16px;
text-align: center;
font-variant-numeric: tabular-nums;
-}`]})};function GM(e,t){e&1&&J(0,` The Routes tab above shows what the router uses. `)}function KM(e,t){if(e&1){let e=W();z(0,`button`,13),G(`click`,function(){O(e);let t=K();return k(t.expanded.set(!t.expanded()))}),J(1),B()}if(e&2){let e=K();N(`aria-expanded`,e.expanded()),M(),X(` `,e.expanded()?`Hide table`:`Show table`,` `)}}function qM(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`pangular build`),B(),J(3,` again to rebuild the report. `))}function JM(e,t){e&1&&J(0,` Check that the dev server is running, then refresh. `)}function YM(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,14),J(2,`Could not scan the route files.`),B(),z(3,`p`,15),P(4,qM,4,0)(5,JM,1,0),B()()),e&2){let e=K();M(4),F(e.staticReport()?4:5)}}function XM(e,t){e&1&&(z(0,`p`,12),J(1,`Scanning routes…`),B())}function ZM(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,14),J(2,`No routes match the filter.`),B(),z(3,`p`,15),J(4,`Search by path, component, guard, title or file name.`),B(),z(5,`button`,10),G(`click`,function(){O(e);let t=K(2),n=n_(12);return t.filter.set(``),k(n.focus())}),J(6,` Clear filter `),B()()}}function QM(e,t){e&1&&(z(0,`div`,16)(1,`p`,14),J(2,`No routes found.`),B(),z(3,`p`,15),J(4,` Routes are read from `),z(5,`code`),J(6,`*.routes.ts`),B(),J(7,` and `),z(8,`code`),J(9,`*routing.module.ts`),B(),J(10,` files, the files they lazy load, plus Analog pages. Add one and refresh. `),B()())}function $M(e,t){e&1&&P(0,ZM,7,0,`div`,16)(1,QM,11,0,`div`,16),e&2&&F(+!K().routes().length)}function eN(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function tN(e,t){if(e&1&&(z(0,`span`,22)(1,`span`,25),J(2,`→`),B(),z(3,`span`,26),J(4,`redirects to`),B(),J(5),B()),e&2){let e=K().$implicit;M(5),X(` `,e.redirectTo)}}function nN(e,t){if(e&1&&(z(0,`code`,23),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function rN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function iN(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function aN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function oN(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.title,` `)}}function sN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function cN(e,t){if(e&1&&(z(0,`tr`)(1,`td`,20),J(2),P(3,eN,2,1,`span`,21),B(),z(4,`td`),P(5,tN,6,1,`span`,22)(6,nN,2,1,`code`,23)(7,rN,4,0),B(),z(8,`td`),I(9,iN,2,1,`span`,21,Cg,!1,aN,4,0),B(),z(12,`td`),P(13,oN,1,1)(14,sN,4,0),B(),z(15,`td`,24),J(16),B()()),e&2){let e=t.$implicit,n=K(2);M(2),X(` `,e.fullPath,` `),M(),F(e.kind===`page`?-1:3),M(2),F(e.redirectTo===void 0?e.component?6:7:5),M(4),L(n.checks(e)),M(4),F(e.title?13:14),M(3),Y(n.location(e))}}function lN(e,t){if(e&1&&(z(0,`p`,17),J(1),B(),z(2,`div`,18)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,19),J(7,`Path`),B(),z(8,`th`,19),J(9,`Component / Target`),B(),z(10,`th`,19),J(11,`Guards and resolvers`),B(),z(12,`th`,19),J(13,`Title`),B(),z(14,`th`,19),J(15,`Declared in`),B()()(),z(16,`tbody`),I(17,cN,17,6,`tr`,null,Cg),B()()()),e&2){let e=K();M(),Y_(` `,e.filtered().length,` of `,e.routes().length,` route entries, `,e.navigable(),` navigable `),M(16),L(e.filtered())}}var uN=class e{rpc=$(null);showComponent=Ov();staticReport=Q(()=>oE(this.rpc()));routes=j([]);filter=j(``);loading=j(!1);error=j(!1);live=Rv(WM);liveHasConfig=Q(()=>!!this.live()?.page()?.config);expanded=Tv(()=>!this.liveHasConfig());navigable=Q(()=>this.filtered().filter(e=>e.kind===`page`).length);filtered=Q(()=>{let e=this.filter().toLowerCase().trim(),t=this.routes();return e?t.filter(t=>t.fullPath.toLowerCase().includes(e)||t.component&&t.component.toLowerCase().includes(e)||t.redirectTo&&t.redirectTo.toLowerCase().includes(e)||t.title&&t.title.toLowerCase().includes(e)||this.checks(t).some(t=>t.toLowerCase().includes(e))||t.file.toLowerCase().includes(e)):t});constructor(){uc(()=>{this.rpc()&&this.refresh()})}checks(e){return[...Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`)),...(e.resolvers??[]).map(e=>`resolve ${e}`)]}location(e){return Nk(e)}onFilterInput(e){let t=e.target;this.filter.set(t?.value??``)}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.error.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`get-routes`);this.routes.set(t)}catch{this.error.set(!0)}finally{this.loading.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-inspector`]],viewQuery:function(e,t){e&1&&e_(t.live,WM,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},outputs:{showComponent:`showComponent`},decls:19,vars:9,consts:[[`filterInput`,``],[3,`showComponent`,`rpc`,`sources`],[`aria-labelledby`,`config-heading`,1,`config`],[1,`section-head`],[`id`,`config-heading`],[1,`muted`,`hint`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`],[`id`,`config-body`,1,`config-body`,3,`hidden`],[1,`toolbar`],[`type`,`search`,`aria-label`,`Filter source routes`,`placeholder`,`Filter routes…`,1,`field`,3,`input`,`keydown.escape`,`value`],[`type`,`button`,1,`small`,3,`click`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`,3,`click`],[1,`empty-title`],[1,`muted`],[1,`empty`],[1,`muted`,`count`],[`role`,`region`,`aria-label`,`Source route config table`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`path`],[1,`tag`],[1,`redirect`],[1,`component`],[1,`file`],[`aria-hidden`,`true`],[1,`visually-hidden`],[`aria-hidden`,`true`,1,`nil`]],template:function(e,t){e&1&&(z(0,`app-live-route`,1),G(`showComponent`,function(e){return t.showComponent.emit(e)}),B(),z(1,`section`,2)(2,`div`,3)(3,`h2`,4),J(4,`Source route config`),B(),z(5,`span`,5),J(6,` Read from your source files. `),P(7,GM,1,0),B(),P(8,KM,2,2,`button`,6),B(),z(9,`div`,7)(10,`div`,8)(11,`input`,9,0),G(`input`,function(e){return t.onFilterInput(e)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),z(13,`button`,10),G(`click`,function(){return t.refresh()}),J(14),B()(),P(15,YM,6,1,`div`,11)(16,XM,2,0,`p`,12)(17,$M,2,1)(18,lN,19,3),B()()),e&2&&(R(`rpc`,t.rpc())(`sources`,t.routes()),M(7),F(t.liveHasConfig()?7:-1),M(),F(t.liveHasConfig()?8:-1),M(),R(`hidden`,!t.expanded()),M(2),R(`value`,t.filter()),M(2),N(`aria-busy`,t.loading()),M(),X(` `,t.loading()?`Scanning…`:`Refresh`,` `),M(),F(t.error()?15:t.loading()&&t.routes().length===0?16:t.filtered().length===0?17:18))},dependencies:[WM],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})};function KM(e,t){e&1&&J(0,` The Routes tab above shows what the router uses. `)}function qM(e,t){if(e&1){let e=W();z(0,`button`,13),G(`click`,function(){O(e);let t=K();return k(t.expanded.set(!t.expanded()))}),J(1),B()}if(e&2){let e=K();N(`aria-expanded`,e.expanded()),M(),X(` `,e.expanded()?`Hide table`:`Show table`,` `)}}function JM(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`pangular build`),B(),J(3,` again to rebuild the report. `))}function YM(e,t){e&1&&J(0,` Check that the dev server is running, then refresh. `)}function XM(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,14),J(2,`Could not scan the route files.`),B(),z(3,`p`,15),P(4,JM,4,0)(5,YM,1,0),B()()),e&2){let e=K();M(4),F(e.staticReport()?4:5)}}function ZM(e,t){e&1&&(z(0,`p`,12),J(1,`Scanning routes…`),B())}function QM(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,14),J(2,`No routes match the filter.`),B(),z(3,`p`,15),J(4,`Search by path, component, guard, title or file name.`),B(),z(5,`button`,10),G(`click`,function(){O(e);let t=K(2),n=n_(12);return t.filter.set(``),k(n.focus())}),J(6,` Clear filter `),B()()}}function $M(e,t){e&1&&(z(0,`div`,16)(1,`p`,14),J(2,`No routes found.`),B(),z(3,`p`,15),J(4,` Routes are read from `),z(5,`code`),J(6,`*.routes.ts`),B(),J(7,` and `),z(8,`code`),J(9,`*routing.module.ts`),B(),J(10,` files, the files they lazy load, plus Analog pages. Add one and refresh. `),B()())}function eN(e,t){e&1&&P(0,QM,7,0,`div`,16)(1,$M,11,0,`div`,16),e&2&&F(+!K().routes().length)}function tN(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function nN(e,t){if(e&1&&(z(0,`span`,22)(1,`span`,25),J(2,`→`),B(),z(3,`span`,26),J(4,`redirects to`),B(),J(5),B()),e&2){let e=K().$implicit;M(5),X(` `,e.redirectTo)}}function rN(e,t){if(e&1&&(z(0,`code`,23),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function iN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function aN(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function oN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function sN(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.title,` `)}}function cN(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function lN(e,t){if(e&1&&(z(0,`tr`)(1,`td`,20),J(2),P(3,tN,2,1,`span`,21),B(),z(4,`td`),P(5,nN,6,1,`span`,22)(6,rN,2,1,`code`,23)(7,iN,4,0),B(),z(8,`td`),I(9,aN,2,1,`span`,21,Cg,!1,oN,4,0),B(),z(12,`td`),P(13,sN,1,1)(14,cN,4,0),B(),z(15,`td`,24),J(16),B()()),e&2){let e=t.$implicit,n=K(2);M(2),X(` `,e.fullPath,` `),M(),F(e.kind===`page`?-1:3),M(2),F(e.redirectTo===void 0?e.component?6:7:5),M(4),L(n.checks(e)),M(4),F(e.title?13:14),M(3),Y(n.location(e))}}function uN(e,t){if(e&1&&(z(0,`p`,17),J(1),B(),z(2,`div`,18)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,19),J(7,`Path`),B(),z(8,`th`,19),J(9,`Component / Target`),B(),z(10,`th`,19),J(11,`Guards and resolvers`),B(),z(12,`th`,19),J(13,`Title`),B(),z(14,`th`,19),J(15,`Declared in`),B()()(),z(16,`tbody`),I(17,lN,17,6,`tr`,null,Cg),B()()()),e&2){let e=K();M(),Y_(` `,e.filtered().length,` of `,e.routes().length,` route entries, `,e.navigable(),` navigable `),M(16),L(e.filtered())}}var dN=class e{rpc=$(null);showComponent=Ov();staticReport=Q(()=>oE(this.rpc()));routes=j([]);filter=j(``);loading=j(!1);error=j(!1);live=Rv(GM);liveHasConfig=Q(()=>!!this.live()?.page()?.config);expanded=Tv(()=>!this.liveHasConfig());navigable=Q(()=>this.filtered().filter(e=>e.kind===`page`).length);filtered=Q(()=>{let e=this.filter().toLowerCase().trim(),t=this.routes();return e?t.filter(t=>t.fullPath.toLowerCase().includes(e)||t.component&&t.component.toLowerCase().includes(e)||t.redirectTo&&t.redirectTo.toLowerCase().includes(e)||t.title&&t.title.toLowerCase().includes(e)||this.checks(t).some(t=>t.toLowerCase().includes(e))||t.file.toLowerCase().includes(e)):t});constructor(){uc(()=>{this.rpc()&&this.refresh()})}checks(e){return[...Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`)),...(e.resolvers??[]).map(e=>`resolve ${e}`)]}location(e){return Nk(e)}onFilterInput(e){let t=e.target;this.filter.set(t?.value??``)}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.error.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`get-routes`);this.routes.set(t)}catch{this.error.set(!0)}finally{this.loading.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-inspector`]],viewQuery:function(e,t){e&1&&e_(t.live,GM,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},outputs:{showComponent:`showComponent`},decls:19,vars:9,consts:[[`filterInput`,``],[3,`showComponent`,`rpc`,`sources`],[`aria-labelledby`,`config-heading`,1,`config`],[1,`section-head`],[`id`,`config-heading`],[1,`muted`,`hint`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`],[`id`,`config-body`,1,`config-body`,3,`hidden`],[1,`toolbar`],[`type`,`search`,`aria-label`,`Filter source routes`,`placeholder`,`Filter routes…`,1,`field`,3,`input`,`keydown.escape`,`value`],[`type`,`button`,1,`small`,3,`click`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`,3,`click`],[1,`empty-title`],[1,`muted`],[1,`empty`],[1,`muted`,`count`],[`role`,`region`,`aria-label`,`Source route config table`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`path`],[1,`tag`],[1,`redirect`],[1,`component`],[1,`file`],[`aria-hidden`,`true`],[1,`visually-hidden`],[`aria-hidden`,`true`,1,`nil`]],template:function(e,t){e&1&&(z(0,`app-live-route`,1),G(`showComponent`,function(e){return t.showComponent.emit(e)}),B(),z(1,`section`,2)(2,`div`,3)(3,`h2`,4),J(4,`Source route config`),B(),z(5,`span`,5),J(6,` Read from your source files. `),P(7,KM,1,0),B(),P(8,qM,2,2,`button`,6),B(),z(9,`div`,7)(10,`div`,8)(11,`input`,9,0),G(`input`,function(e){return t.onFilterInput(e)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),z(13,`button`,10),G(`click`,function(){return t.refresh()}),J(14),B()(),P(15,XM,6,1,`div`,11)(16,ZM,2,0,`p`,12)(17,eN,2,1)(18,uN,19,3),B()()),e&2&&(R(`rpc`,t.rpc())(`sources`,t.routes()),M(7),F(t.liveHasConfig()?7:-1),M(),F(t.liveHasConfig()?8:-1),M(),R(`hidden`,!t.expanded()),M(2),R(`value`,t.filter()),M(2),N(`aria-busy`,t.loading()),M(),X(` `,t.loading()?`Scanning…`:`Refresh`,` `),M(),F(t.error()?15:t.loading()&&t.routes().length===0?16:t.filtered().length===0?17:18))},dependencies:[GM],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
font-size: 13px;
line-height: 1.5;
@@ -4299,7 +4299,7 @@ h2[_ngcontent-%COMP%] {
font-family: var(--%NS%font-mono);
font-size: 12px;
overflow-wrap: anywhere;
-}`]})},dN=[`filterInput`],fN=e=>({id:e,label:`Status history`}),pN=e=>({id:e,label:`Value history`}),mN=(e,t)=>t.kind,hN=(e,t)=>t.name+t.file+t.line,gN=(e,t)=>t.epoch,_N=(e,t)=>t.id;function vN(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,14),J(2,`Page`),B(),z(3,`app-select`,15),G(`valueChange`,function(t){return O(e),k(K().selectPage(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.pageOptions())(`value`,e.shownPageId())}}function yN(e,t){if(e&1){let e=W();z(0,`div`,5)(1,`span`,16),J(2,`Graph of`),B(),z(3,`app-select`,17),G(`valueChange`,function(t){return O(e),k(K().pickComponent(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.componentOptions())(`value`,e.pickerValue())}}function bN(e,t){if(e&1&&(z(0,`span`,20),J(1),B()),e&2){let e=K(2);M(),Y(e.sourceNote(e.graph().source))}}function xN(e,t){if(e&1&&(z(0,`p`,7)(1,`span`,18),J(2),B(),z(3,`span`,19),J(4),B(),P(5,bN,2,1,`span`,20),B()),e&2){let e=t,n=K();M(2),Y(e.name),M(2),Y(e.path),M(),F(n.graph().source?5:-1)}}function SN(e,t){if(e&1&&(z(0,`p`,7)(1,`span`,18),J(2),B(),z(3,`span`,20),J(4,`environment injector`),B()()),e&2){let e=K();M(2),Y(e.injectorLabel(t))}}function CN(e,t){e&1&&(z(0,`p`,8),J(1,` The picked component or injector is gone or has no signal graph, so this shows another one. `),B())}function wN(e,t){e&1&&J(0,` The effects registered on this injector and the signals they read. A signal that no effect reads is not part of the graph. Pick a kind to filter. `)}function TN(e,t){e&1&&J(0,` The live signal graph of one component. Only signals that its template or an effect has read appear here; a signal nothing has read yet is not part of the graph. Pick a kind to filter. `)}function EN(e,t){e&1&&J(0,` Every signal, computed and effect found in your source. Pick a kind to filter. `)}function DN(e,t){e&1&&(z(0,`p`,8),J(1,` The live signal graph needs Angular 20.1 or later. This list comes from a source scan. `),B())}function ON(e,t){e&1&&(z(0,`p`,8),J(1,` The signal write hook did not load. Value history shows sampled values only, with no exact set entries. `),B())}function kN(e,t){if(e&1&&(z(0,`p`,8),J(1),B()),e&2){let e=K();M(),Z(` Showing `,e.graph().nodes.length,` of `,t,` signals. The rest and their edges are left out. `)}}function AN(e,t){if(e&1){let e=W();z(0,`button`,21),G(`click`,function(){let t=O(e).$implicit,n=K(2);return k(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,24),z(2,`span`,25),J(3),B(),z(4,`span`,22),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.kind),M(2),Y(e.count)}}function jN(e,t){if(e&1){let e=W();z(0,`div`,10)(1,`button`,21),G(`click`,function(){return O(e),k(K().kind.set(null))}),J(2,` All `),z(3,`span`,22),J(4),B()(),I(5,AN,6,7,`button`,23,mN),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.kindTotal()),M(),L(e.kindChips())}}function MN(e,t){e&1&&(z(0,`div`,11),V(1,`span`,26),z(2,`p`,27),J(3,`Scanning source for signals…`),B()())}function NN(e,t){e&1&&(z(0,`div`,12)(1,`p`,27),J(2,`No signals found.`),B(),z(3,`p`,28),J(4,` No `),z(5,`code`),J(6,`signal()`),B(),J(7,`, `),z(8,`code`),J(9,`computed()`),B(),J(10,` or `),z(11,`code`),J(12,`effect()`),B(),J(13,` calls were found in your source. To see the live graph, run Angular 20.1 or later with the overlay connected and select a component. `),B()())}function PN(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`in <`,e.component,`>`)}}function FN(e,t){if(e&1&&(z(0,`div`,31)(1,`div`,33)(2,`span`,34),J(3),B(),z(4,`span`,35),J(5),B()(),z(6,`div`,36)(7,`span`,37),J(8),B(),P(9,PN,4,1),B()()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.name),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.component?9:-1)}}function IN(e,t){if(e&1){let e=W();z(0,`div`,32)(1,`p`,27),J(2,`No signals match.`),B(),z(3,`p`,28),J(4,`Try a different name or kind.`),B(),z(5,`button`,39),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(6,`Clear filters`),B()()}}function LN(e,t){if(e&1&&(z(0,`p`,29),J(1,`Signals from source scan (static analysis):`),B(),z(2,`div`,30),I(3,FN,10,8,`div`,31,hN,!1,IN,7,0,`div`,32),B()),e&2){let e=K();M(3),L(e.filteredSourceSignals())}}function RN(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.missed,` earlier not captured`)}}function zN(e,t){if(e&1&&(z(0,`li`)(1,`span`,43)(2,`time`),J(3),dv(4,`date`),B(),z(5,`span`,44),J(6),B(),z(7,`span`),J(8),B(),P(9,RN,2,1,`span`,45),B(),z(10,`pre`),J(11),dv(12,`json`),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(mv(4,7,e.at,`HH:mm:ss.SSS`)),M(2),w_(`source-`+e.source),M(),Y(n.sourceLabel(e.source)),M(2),X(`epoch `,e.epoch),M(),F(e.missed?9:-1),M(2),Y(pv(12,10,e.value))}}function BN(e,t){if(e&1&&(z(0,`h4`,40),J(1),B(),z(2,`p`,41),J(3),B(),z(4,`ol`,42),I(5,zN,13,12,`li`,null,gN),B()),e&2){let e=K(),t=e.id,n=e.label,r=K();R(`id`,`history-heading-`+t),M(),Y(n),M(2),Y(r.historySummary(t)),M(),N(`aria-labelledby`,`history-heading-`+t),M(),L(r.selectedHistory())}}function VN(e,t){e&1&&P(0,BN,7,4),e&2&&F(K().selectedHistory().length?0:-1)}function HN(e,t){if(e&1&&(z(0,`span`,54),J(1),B()),e&2){let e=K().$implicit;w_(`tone-`+K(2).statusTone(e.status)),M(),Y(e.status)}}function UN(e,t){if(e&1&&(z(0,`span`,50),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function WN(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.error))}}function GN(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function KN(e,t){e&1&&(z(0,`p`,28),J(1,` This resource has no name. Pass `),z(2,`code`),J(3,`debugName`),B(),J(4,` to `),z(5,`code`),J(6,`resource()`),B(),J(7,` or `),z(8,`code`),J(9,`httpResource()`),B(),J(10,` to name it here. `),B())}function qN(e,t){if(e&1&&(z(0,`dt`),J(1,`Loading`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.isLoading?`yes`:`no`)}}function JN(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP status`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.statusCode)}}function YN(e,t){if(e&1&&(z(0,`dt`),J(1,`Params`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Params of `+e.name),M(),Y(pv(5,2,e.params))}}function XN(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Value of `+e.name),M(),Y(pv(5,2,e.value))}}function ZN(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Error of `+e.name),M(),Y(pv(5,2,e.error))}}function QN(e,t){if(e&1&&(z(0,`li`)(1,`span`,59),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function $N(e,t){if(e&1&&(z(0,`ul`,40),I(1,QN,5,4,`li`,null,_N),B()),e&2){let e=K(2).$implicit,t=K(2);R(`id`,`resource-internals-`+e.id),M(),L(t.internalsOf(e))}}function eP(e,t){if(e&1){let e=W();z(0,`div`,53)(1,`h3`,55),J(2),B(),P(3,KN,11,0,`p`,28),z(4,`dl`)(5,`dt`),J(6,`Status`),B(),z(7,`dd`),J(8),B(),P(9,qN,4,1),P(10,JN,4,1),P(11,YN,6,4),P(12,XN,6,4),P(13,ZN,6,4),B(),zg(14,56),z(15,`button`,57),G(`click`,function(){O(e);let t=K(3);return k(t.showInternals.set(!t.showInternals()))}),J(16),B(),P(17,$N,3,1,`ul`,40),B()}if(e&2){let e=K().$implicit,t=K(2),n=n_(22);R(`id`,`signal-detail-`+e.id),M(2),Y(e.name),M(),F(e.named?-1:3),M(5),Y(e.status??`unknown`),M(),F(e.isLoading===void 0?-1:9),M(),F(e.statusCode===void 0?-1:10),M(),F(e.params===void 0?-1:11),M(),F(e.value===void 0?-1:12),M(),F(e.error===void 0?-1:13),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,sv(16,fN,e.id)),M(),N(`aria-expanded`,t.showInternals())(`aria-controls`,`resource-internals-`+e.id),M(),Z(` `,t.showInternals()?`Hide`:`Show`,` internal signals (`,e.nodeIds.length,`) `),M(),F(t.showInternals()?17:-1)}}function tP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,48),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.id))}),z(2,`span`,33)(3,`span`,34),J(4,`resource`),B(),z(5,`span`,35),J(6),B(),P(7,HN,2,3,`span`,49),P(8,UN,2,2,`span`,50),V(9,`span`,51),B(),P(10,WN,3,3,`span`,52)(11,GN,3,3,`span`,52),B(),P(12,eP,18,18,`div`,53),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(`resource`)),M(3),Y(n.name),M(),F(n.status?7:-1),M(),F((e=n.changes)?8:-1,e),M(2),F(n.error===void 0?n.value===void 0?-1:11:10),M(2),F(r.selectedId()===n.id?12:-1)}}function nP(e,t){if(e&1&&(z(0,`h2`,46),J(1,`Resources`),B(),z(2,`ul`,47),I(3,tP,13,12,`li`,null,_N),B()),e&2){let e=K();M(3),L(e.filteredResources())}}function rP(e,t){if(e&1&&(z(0,`span`,50),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function iP(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function aP(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Deps: `,t.getDependencies(e).length)}}function oP(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Consumers: `,t.getConsumers(e).length)}}function sP(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(4);M(3),N(`aria-label`,`Value of `+(e.selectedNode().label??`signal`)),M(),Y(pv(5,2,e.selectedNode().value))}}function cP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,63),G(`click`,function(){let t=O(e).$implicit;return k(K(5).jumpTo(t))}),z(2,`span`,59),J(3),B(),z(4,`span`,60),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function lP(e,t){if(e&1&&(z(0,`h4`),J(1,`Dependencies (producers)`),B(),z(2,`ul`),I(3,cP,6,5,`li`,null,_N),B()),e&2){let e=K(4);M(3),L(e.getDependencies(e.selectedNode()))}}function uP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,63),G(`click`,function(){let t=O(e).$implicit;return k(K(5).jumpTo(t))}),z(2,`span`,59),J(3),B(),z(4,`span`,60),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function dP(e,t){if(e&1&&(z(0,`h4`),J(1,`Consumers`),B(),z(2,`ul`),I(3,uP,6,5,`li`,null,_N),B()),e&2){let e=K(4);M(3),L(e.getConsumers(e.selectedNode()))}}function fP(e,t){e&1&&(z(0,`p`,28),J(1),B()),e&2&&(M(),Y(t))}function pP(e,t){if(e&1&&(z(0,`div`,53)(1,`h3`,55),J(2),B(),z(3,`dl`)(4,`dt`),J(5,`Kind`),B(),z(6,`dd`),J(7),B(),z(8,`dt`),J(9,`Epoch`),B(),z(10,`dd`),J(11),B(),P(12,sP,6,4),B(),P(13,lP,5,0),P(14,dP,5,0),P(15,fP,2,1,`p`,28),zg(16,56),B()),e&2){let e,t=K().$implicit,n=K(2),r=n_(22);R(`id`,`signal-detail-`+t.id),M(2),Y(n.selectedNode().label??n.selectedNode().id),M(5),Y(n.selectedNode().kind),M(4),Y(n.selectedNode().epoch),M(),F(n.selectedNode().value===void 0?-1:12),M(),F(n.getDependencies(n.selectedNode()).length?13:-1),M(),F(n.getConsumers(n.selectedNode()).length?14:-1),M(),F((e=n.writeHint())?15:-1,e),M(),R(`ngTemplateOutlet`,r)(`ngTemplateOutletContext`,sv(10,pN,t.id))}}function mP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,48),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.id))}),z(2,`span`,33)(3,`span`,34),J(4),B(),z(5,`span`,35),J(6),B(),P(7,rP,2,2,`span`,50),V(8,`span`,51),B(),P(9,iP,3,3,`span`,52),z(10,`span`,36)(11,`span`),J(12),B(),P(13,aP,4,1),P(14,oP,4,1),B()(),P(15,pP,17,12,`div`,53),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(n.kind)),M(),Y(n.kind),M(2),Y(n.label??`(unnamed)`),M(),F((e=r.changeCount(n.id))?7:-1,e),M(2),F(n.value===void 0?-1:9),M(3),X(`Epoch: `,n.epoch),M(),F(r.getDependencies(n).length?13:-1),M(),F(r.getConsumers(n).length?14:-1),M(),F(r.selectedId()===n.id&&r.selectedNode()?15:-1)}}function hP(e,t){if(e&1){let e=W();z(0,`button`,39),G(`click`,function(){return O(e),k(K(3).clearFilters())}),J(1,`Clear filters`),B()}}function gP(e,t){if(e&1&&(z(0,`li`,62)(1,`p`,27),J(2),B(),z(3,`p`,28),J(4),B(),P(5,hP,2,0,`button`,64),B()),e&2){let e=K(2);M(2),X(` `,e.hasAnySignals()?`No signals match.`:`No signals in this graph.`,` `),M(2),X(` `,e.hasAnySignals()?`Try a different name or kind.`:`Select a component that reads signals, or interact with the page to create some.`,` `),M(),F(e.hasAnySignals()?5:-1)}}function _P(e,t){if(e&1&&(z(0,`h2`,46),J(1,`Signals`),B(),z(2,`ul`,61),I(3,mP,16,15,`li`,null,_N,!1,gP,6,3,`li`,62),B()),e&2){let e=K();M(3),L(e.filteredNodes())}}var vP=`follow`;function yP(e){return Object.keys(e.pages).length?e.pages:e.graph?{[e.graph.pageId??``]:e.graph}:{}}var bP=`env:`,xP=50,SP={selected:`picked`,routed:`rendered by the router`,root:`first component with signals`},CP={write:`set`,sample:`sampled`,initial:`initial`},wP={resolved:`ok`,local:`ok`,loading:`warn`,reloading:`warn`,error:`danger`},TP={signal:`#facc15`,computed:`#60a5fa`,linkedSignal:`#34d399`,effect:`#fb923c`,template:`#94a3b8`,afterRenderEffectPhase:`#f472b6`,childSignalProp:`#fef08a`,"input (signal)":`#f59e0b`,"input.required (signal)":`#f59e0b`,"output (signal)":`#ec4899`,"model (signal)":`#14b8a6`,"model.required (signal)":`#14b8a6`,"viewChild (signal)":`#a3e635`,"viewChild.required (signal)":`#a3e635`,"viewChildren (signal)":`#a3e635`,"contentChild (signal)":`#fda4af`,"contentChild.required (signal)":`#fda4af`,"contentChildren (signal)":`#fda4af`,resource:`#06b6d4`,unknown:`#a1a1aa`},EP=class e{rpc=$(null);destroyRef=E(Cs);host=E(Ml);filterInput=Rv(`filterInput`);injector=E(xs);pageId=eE();cleanups=[];treePages=j({});graphState=j({graph:null,pages:{}});chosenPageId=j(null);announcement=j(``);graphPages=Q(()=>yP(this.graphState()));shownPageId=Tv({source:()=>({pages:this.graphPages(),newest:this.graphState().graph?.pageId??null,chosen:this.chosenPageId()}),computation:({pages:e,newest:t,chosen:n},r)=>{let i={};for(let n of Object.keys(e))i[n]={pageId:n,reportedAt:+(n===t)};return tE(i,{chosen:n,host:this.pageId,previous:r?.value??null})}});reported=Q(()=>{let e=this.shownPageId();return e===null?null:this.graphPages()[e]??null});unsupported=Q(()=>!!this.reported()?.unsupported);graph=Q(()=>{let e=this.reported();return e?.unsupported?null:e});graphOwner=Q(()=>{let e=this.graph();return e?`${e.pageId??``}|${e.component?.id??e.injector?.id??``}`:null});pickedByPage=j({});picked=Q(()=>this.pickedByPage()[this.targetPageId()??``]??null);pageOptions=Q(()=>{if(this.pageId)return[];let e=this.treePages();return Object.keys(this.graphPages()).map(t=>{let n=e[t];return{value:t,label:n?.title||n?.url||`Page ${t}`,hint:n?.url}})});showInternals=j(!1);sourceSignals=j([]);sourceLoaded=j(!1);filter=j(``);resources=Q(()=>this.graph()?.resources??[]);internalIds=Q(()=>new Set(this.resources().flatMap(e=>e.nodeIds)));visibleNodes=Q(()=>{let e=this.internalIds();return(this.graph()?.nodes??[]).filter(t=>!e.has(t.id))});hasAnySignals=Q(()=>this.visibleNodes().length+this.resources().length>0);kindCounts=Q(()=>{let e=this.graph()?[...this.visibleNodes().map(e=>e.kind),...this.resources().map(()=>`resource`)]:this.sourceSignals().map(e=>e.kind),t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return[...t].map(([e,t])=>({kind:e,count:t}))});kind=Tv({source:this.graphOwner,computation:(e,t)=>{let n=t?.value??null;return n&&Cv(this.kindCounts).some(e=>e.kind===n)?n:null}});kindChips=Q(()=>{let e=this.kindCounts(),t=this.kind();return t&&!e.some(e=>e.kind===t)?[...e,{kind:t,count:0}]:e});kindTotal=Q(()=>this.kindCounts().reduce((e,t)=>e+t.count,0));selectedId=Tv({source:this.graphOwner,computation:()=>null});selectedNode=Q(()=>this.graph()?.nodes.find(e=>e.id===this.selectedId())??null);jumpedPast=j(null);jumpNote=Q(()=>{let e=this.jumpedPast();return!e||this.filter()||this.kind()||this.selectedId()!==e.id?``:`Cleared the filters to show ${e.label}.`});selectedHistory=Q(()=>{let e=this.selectedId();return e?[...this.graph()?.history?.[e]??[]].reverse():[]});writeHint=Q(()=>{let e=this.selectedNode(),t=this.graph();if(!e||!t||t.writeHook===!1||e.kind!==`signal`&&e.kind!==`linkedSignal`)return``;if(!e.label)return`This signal has no name, so its history holds sampled values only. Pass a debugName in its options, for example signal(0, { debugName: 'count' }).`;let n=t.history?.[e.id]??[];return n.some(e=>e.source===`write`)||!n.some(e=>e.source===`sample`)?``:`Every change here was sampled. Writes are matched by name, kind, version and value, so another live signal with the same name and value can hide them.`});kindLegend=Object.entries(TP).map(([e,t])=>({kind:e,color:t}));filteredResources=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return t&&t!==`resource`?[]:this.resources().filter(t=>!e||t.name.toLowerCase().includes(e)||e.length>=3&&`resource`.startsWith(e))});filteredNodes=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.visibleNodes().filter(n=>(!t||n.kind===t)&&(!e||(n.label??``).toLowerCase().includes(e)||n.kind.toLowerCase().includes(e))).sort((e,t)=>e.id.localeCompare(t.id,void 0,{numeric:!0}))});filteredSourceSignals=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.sourceSignals().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.toLowerCase().includes(e)||n.file.toLowerCase().includes(e)))});targetPageId=Q(()=>this.pageId??(this.shownPageId()||null)??this.graph()?.pageId??this.latestTreePage()?.pageId??null);latestTreePage=Q(()=>{let e=null;for(let[t,n]of Object.entries(this.treePages())){let r=n.reportedAt??0;(!e||r>e.reportedAt)&&(e={pageId:t,reportedAt:r})}return e});componentOptions=Q(()=>{let e=this.targetPageId(),t=(e?this.treePages()[e]?.roots:void 0)??[],n=[],r=e=>{for(let t of e)n.push(t),r(t.children)};r(t);let i=this.graph()?.environments??[];if(!n.length&&!i.length)return[];let a=new Map;for(let e of n)a.set(e.name,(a.get(e.name)??0)+1);let o=new Map,s=[{value:vP,label:`Follow the routed component`,hint:`automatic`},...i.map(e=>({value:bP+e.id,label:this.injectorLabel(e),hint:`injector`}))];for(let e of n){let t=(o.get(e.name)??0)+1;o.set(e.name,t),s.push({value:e.id,label:(a.get(e.name)??0)>1?`${e.name} #${t}`:e.name,hint:`<${e.tag}>`})}return s});pickerValue=Q(()=>{let e=this.picked();return e&&this.componentOptions().some(t=>t.value===e)?e:vP});constructor(){uc(()=>{let e=this.rpc();e&&(this.loadSignalGraph(e),this.loadSourceSignals(e))}),this.destroyRef.onDestroy(()=>{for(let e of this.cleanups.splice(0))e()})}async loadSignalGraph(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`pangular`);try{let e=await t.rpc.sharedState(`signal-graph`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=t?.pages&&typeof t.pages==`object`?t.pages:{},r={graph:t?.graph??null,pages:n};this.notePageGone(yP(r)),this.graphState.set(r)};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.graphState.set({graph:null,pages:{}})}try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.treePages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.treePages.set({})}}notePageGone(e){let t=Object.keys(this.graphPages()).filter(t=>!e[t]);t.length&&this.pickedByPage.update(e=>{let n={...e};for(let e of t)delete n[e];return n});let n=this.chosenPageId();if(!n||e[n])return;let r=this.pageOptions().find(e=>e.value===n)?.label??`The chosen page`;this.chosenPageId.set(null),this.announcement.set(`${r} closed, so this shows another page.`)}selectPage(e){if(!e||e===this.shownPageId())return;this.chosenPageId.set(e);let t=this.pageOptions().find(t=>t.value===e)?.label??e;this.announcement.set(`Showing the signal graph of ${t}.`)}pickComponent(e){let t=e&&e!==vP?e:null,n=this.targetPageId()??void 0;this.pickedByPage.update(e=>{let r={...e};return t?r[n??``]=t:delete r[n??``],r});let r=this.rpc();if(!r)return;let i=t?.startsWith(bP)?{pageId:n,env:t.slice(4)}:{pageId:n,id:t};r.scope(`pangular`).rpc.call(`select-signal-target`,i).catch(()=>{})}injectorLabel(e){return e.name===`Root`?`Root services`:e.name}sourceNote(e){return SP[e]}async loadSourceSignals(e){let t=e.scope(`pangular`);try{let e=await t.rpc.call(`get-signals`);this.sourceSignals.set(e)}catch{}finally{this.sourceLoaded.set(!0)}}clearFilters(){this.resetFilters(),this.filterInput()?.nativeElement.focus()}resetFilters(){this.filter.set(``),this.kind.set(null)}select(e){this.selectedId.set(this.selectedId()===e?null:e),this.showInternals.set(!1)}jumpTo(e){let t=this.resources().find(t=>t.nodeIds.includes(e.id)),n=t?.id??e.id,r=t?!this.filteredResources().some(e=>e.id===n):!this.filteredNodes().some(e=>e.id===n);r&&this.resetFilters(),this.jumpedPast.set(r?{id:n,label:t?.name??e.label??e.id}:null),this.selectedId.set(n),this.showInternals.set(!!t),Id(()=>{let e=[...this.host.nativeElement.querySelectorAll(`.node-card[data-card]`)].find(e=>e.dataset.card===n);e?.scrollIntoView?.({block:`nearest`}),e?.focus({preventScroll:!0})},{injector:this.injector})}changeCount(e){let t=this.graph(),n=t?.nodes.find(t=>t.id===e)?.changes??t?.resources?.find(t=>t.id===e)?.changes;return n===void 0?(t?.history?.[e]??[]).reduce((e,t)=>e+(t.source===`initial`?0:1+(t.missed??0)),0):n}historySummary(e){let t=this.changeCount(e),n=this.graph()?.history?.[e]?.length??0;return t?`${`${t} ${t===1?`change`:`changes`} recorded`}${n>=xP&&t>=n?`, showing the last ${n}`:``}, newest first.`:`No changes recorded yet. The entry below is the value seen first.`}statusTone(e){return wP[e]??`neutral`}internalsOf(e){let t=new Set(e.nodeIds);return(this.graph()?.nodes??[]).filter(e=>t.has(e.id))}sourceLabel(e){return CP[e]}kindColor(e){return TP[e]??TP.unknown}relations=Q(()=>{let e=new Map,t=this.graph();if(!t)return e;for(let n of t.nodes)e.set(n.id,{deps:[],consumers:[]});for(let n of t.edges){let r=t.nodes[n.producer],i=t.nodes[n.consumer];r&&i&&(e.get(i.id)?.deps.push(r),e.get(r.id)?.consumers.push(i))}return e});getDependencies(e){return this.relations().get(e.id)?.deps??[]}getConsumers(e){return this.relations().get(e.id)?.consumers??[]}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-signal-inspector`]],viewQuery:function(e,t){e&1&&e_(t.filterInput,dN,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:27,vars:17,consts:[[`filterInput`,``],[`historyTpl`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter by name or kind…`,`aria-label`,`Filter signals by name or kind`,3,`input`,`keydown.escape`,`value`],[1,`picker`,`page-picker`],[1,`picker`],[`role`,`status`,1,`sr-only`],[1,`showing`],[`role`,`status`,1,`fallback`],[1,`intro`],[`role`,`group`,`aria-label`,`Filter by kind`,1,`kinds`],[`role`,`status`,1,`empty`],[1,`empty`],[`role`,`status`,1,`jump-note`],[`id`,`signals-page-label`,1,`label-key`],[`labelledBy`,`signals-page-label`,3,`valueChange`,`options`,`value`],[`id`,`signals-component-label`,1,`label-key`],[`labelledBy`,`signals-component-label`,3,`valueChange`,`options`,`value`],[1,`showing-name`],[1,`mono`],[1,`source-note`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[`aria-hidden`,`true`,1,`dot`],[1,`chip-text`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`hint`],[1,`source-label`],[1,`nodes`],[1,`node-card`],[`role`,`status`,1,`empty`,`compact`],[1,`node-header`],[1,`kind-badge`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[`aria-hidden`,`true`,1,`sep`],[`type`,`button`,1,`reset`,3,`click`],[3,`id`],[1,`history-summary`],[`tabindex`,`0`,1,`history`,`scroll-box`],[1,`history-meta`],[1,`source-tag`],[1,`missed`],[1,`list-heading`],[`role`,`list`,1,`nodes`,`resources`],[`type`,`button`,1,`node-card`,3,`click`],[1,`status-tag`,3,`class`],[1,`changed-badge`],[`aria-hidden`,`true`,1,`chevron`],[1,`node-value`],[1,`detail-panel`,3,`id`],[1,`status-tag`],[1,`detail-title`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`type`,`button`,1,`reset`,`internals-toggle`,3,`click`],[`role`,`region`,`tabindex`,`0`,1,`scroll-box`],[1,`kind-badge`,`sm`],[1,`rel-label`],[`role`,`list`,1,`nodes`],[1,`empty`,`compact`],[`type`,`button`,1,`rel-link`,3,`click`],[`type`,`button`,1,`reset`]],template:function(e,t){if(e&1&&(z(0,`div`,2)(1,`input`,3,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),P(3,vN,4,2,`div`,4),P(4,yN,4,2,`div`,5),B(),z(5,`p`,6),J(6),B(),P(7,xN,6,3,`p`,7)(8,SN,5,1,`p`,7),P(9,CN,2,0,`p`,8),z(10,`p`,9),P(11,wN,1,0)(12,TN,1,0)(13,EN,1,0),B(),P(14,DN,2,0,`p`,8),P(15,ON,2,0,`p`,8),P(16,kN,2,2,`p`,8),P(17,jN,7,4,`div`,10),P(18,MN,4,0,`div`,11),P(19,NN,14,0,`div`,12),P(20,LN,6,1),tg(21,VN,1,1,`ng-template`,null,1,gv),z(23,`p`,13),J(24),B(),P(25,nP,5,0),P(26,_P,6,1)),e&2){let e,n;M(),R(`value`,t.filter()),M(2),F(t.pageOptions().length>1?3:-1),M(),F(t.componentOptions().length?4:-1),M(2),Y(t.announcement()),M(),F((e=t.graph()?.component)?7:(e=t.graph()?.injector)?8:-1,e),M(2),F(t.graph()&&t.picked()&&t.graph().source!==`selected`?9:-1),M(2),F(t.graph()?.injector?11:t.graph()?12:13),M(3),F(t.unsupported()?14:-1),M(),F(t.graph()?.writeHook===!1?15:-1),M(),F((n=t.graph()?.nodeCount)?16:-1,n),M(),F(t.kindChips().length?17:-1),M(),F(!t.graph()&&!t.sourceLoaded()?18:-1),M(),F(!t.graph()&&t.sourceLoaded()&&t.sourceSignals().length===0?19:-1),M(),F(!t.graph()&&t.sourceSignals().length>0?20:-1),M(4),Y(t.jumpNote()),M(),F(t.graph()&&t.filteredResources().length?25:-1),M(),F(t.graph()&&(t.visibleNodes().length||!t.filteredResources().length)?26:-1)}},dependencies:[$y,jD,ib,ab],styles:[`[_nghost-%COMP%] {
+}`]})},fN=[`filterInput`],pN=e=>({id:e,label:`Status history`}),mN=e=>({id:e,label:`Value history`}),hN=(e,t)=>t.kind,gN=(e,t)=>t.name+t.file+t.line,_N=(e,t)=>t.epoch,vN=(e,t)=>t.id;function yN(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,14),J(2,`Page`),B(),z(3,`app-select`,15),G(`valueChange`,function(t){return O(e),k(K().selectPage(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.pageOptions())(`value`,e.shownPageId())}}function bN(e,t){if(e&1){let e=W();z(0,`div`,5)(1,`span`,16),J(2,`Graph of`),B(),z(3,`app-select`,17),G(`valueChange`,function(t){return O(e),k(K().pickComponent(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.componentOptions())(`value`,e.pickerValue())}}function xN(e,t){if(e&1&&(z(0,`span`,20),J(1),B()),e&2){let e=K(2);M(),Y(e.sourceNote(e.graph().source))}}function SN(e,t){if(e&1&&(z(0,`p`,7)(1,`span`,18),J(2),B(),z(3,`span`,19),J(4),B(),P(5,xN,2,1,`span`,20),B()),e&2){let e=t,n=K();M(2),Y(e.name),M(2),Y(e.path),M(),F(n.graph().source?5:-1)}}function CN(e,t){if(e&1&&(z(0,`p`,7)(1,`span`,18),J(2),B(),z(3,`span`,20),J(4,`environment injector`),B()()),e&2){let e=K();M(2),Y(e.injectorLabel(t))}}function wN(e,t){e&1&&(z(0,`p`,8),J(1,` The picked component or injector is gone or has no signal graph, so this shows another one. `),B())}function TN(e,t){e&1&&J(0,` The effects registered on this injector and the signals they read. A signal that no effect reads is not part of the graph. Pick a kind to filter. `)}function EN(e,t){e&1&&J(0,` The live signal graph of one component. Only signals that its template or an effect has read appear here; a signal nothing has read yet is not part of the graph. Pick a kind to filter. `)}function DN(e,t){e&1&&J(0,` Every signal, computed and effect found in your source. Pick a kind to filter. `)}function ON(e,t){e&1&&(z(0,`p`,8),J(1,` The live signal graph needs Angular 20.1 or later. This list comes from a source scan. `),B())}function kN(e,t){e&1&&(z(0,`p`,8),J(1,` The signal write hook did not load. Value history shows sampled values only, with no exact set entries. `),B())}function AN(e,t){if(e&1&&(z(0,`p`,8),J(1),B()),e&2){let e=K();M(),Z(` Showing `,e.graph().nodes.length,` of `,t,` signals. The rest and their edges are left out. `)}}function jN(e,t){if(e&1){let e=W();z(0,`button`,21),G(`click`,function(){let t=O(e).$implicit,n=K(2);return k(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,24),z(2,`span`,25),J(3),B(),z(4,`span`,22),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.kind),M(2),Y(e.count)}}function MN(e,t){if(e&1){let e=W();z(0,`div`,10)(1,`button`,21),G(`click`,function(){return O(e),k(K().kind.set(null))}),J(2,` All `),z(3,`span`,22),J(4),B()(),I(5,jN,6,7,`button`,23,hN),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.kindTotal()),M(),L(e.kindChips())}}function NN(e,t){e&1&&(z(0,`div`,11),V(1,`span`,26),z(2,`p`,27),J(3,`Scanning source for signals…`),B()())}function PN(e,t){e&1&&(z(0,`div`,12)(1,`p`,27),J(2,`No signals found.`),B(),z(3,`p`,28),J(4,` No `),z(5,`code`),J(6,`signal()`),B(),J(7,`, `),z(8,`code`),J(9,`computed()`),B(),J(10,` or `),z(11,`code`),J(12,`effect()`),B(),J(13,` calls were found in your source. To see the live graph, run Angular 20.1 or later with the overlay connected and select a component. `),B()())}function FN(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`in <`,e.component,`>`)}}function IN(e,t){if(e&1&&(z(0,`div`,31)(1,`div`,33)(2,`span`,34),J(3),B(),z(4,`span`,35),J(5),B()(),z(6,`div`,36)(7,`span`,37),J(8),B(),P(9,FN,4,1),B()()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.name),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.component?9:-1)}}function LN(e,t){if(e&1){let e=W();z(0,`div`,32)(1,`p`,27),J(2,`No signals match.`),B(),z(3,`p`,28),J(4,`Try a different name or kind.`),B(),z(5,`button`,39),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(6,`Clear filters`),B()()}}function RN(e,t){if(e&1&&(z(0,`p`,29),J(1,`Signals from source scan (static analysis):`),B(),z(2,`div`,30),I(3,IN,10,8,`div`,31,gN,!1,LN,7,0,`div`,32),B()),e&2){let e=K();M(3),L(e.filteredSourceSignals())}}function zN(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.missed,` earlier not captured`)}}function BN(e,t){if(e&1&&(z(0,`li`)(1,`span`,43)(2,`time`),J(3),dv(4,`date`),B(),z(5,`span`,44),J(6),B(),z(7,`span`),J(8),B(),P(9,zN,2,1,`span`,45),B(),z(10,`pre`),J(11),dv(12,`json`),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(mv(4,7,e.at,`HH:mm:ss.SSS`)),M(2),w_(`source-`+e.source),M(),Y(n.sourceLabel(e.source)),M(2),X(`epoch `,e.epoch),M(),F(e.missed?9:-1),M(2),Y(pv(12,10,e.value))}}function VN(e,t){if(e&1&&(z(0,`h4`,40),J(1),B(),z(2,`p`,41),J(3),B(),z(4,`ol`,42),I(5,BN,13,12,`li`,null,_N),B()),e&2){let e=K(),t=e.id,n=e.label,r=K();R(`id`,`history-heading-`+t),M(),Y(n),M(2),Y(r.historySummary(t)),M(),N(`aria-labelledby`,`history-heading-`+t),M(),L(r.selectedHistory())}}function HN(e,t){e&1&&P(0,VN,7,4),e&2&&F(K().selectedHistory().length?0:-1)}function UN(e,t){if(e&1&&(z(0,`span`,54),J(1),B()),e&2){let e=K().$implicit;w_(`tone-`+K(2).statusTone(e.status)),M(),Y(e.status)}}function WN(e,t){if(e&1&&(z(0,`span`,50),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function GN(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.error))}}function KN(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function qN(e,t){e&1&&(z(0,`p`,28),J(1,` This resource has no name. Pass `),z(2,`code`),J(3,`debugName`),B(),J(4,` to `),z(5,`code`),J(6,`resource()`),B(),J(7,` or `),z(8,`code`),J(9,`httpResource()`),B(),J(10,` to name it here. `),B())}function JN(e,t){if(e&1&&(z(0,`dt`),J(1,`Loading`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.isLoading?`yes`:`no`)}}function YN(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP status`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.statusCode)}}function XN(e,t){if(e&1&&(z(0,`dt`),J(1,`Params`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Params of `+e.name),M(),Y(pv(5,2,e.params))}}function ZN(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Value of `+e.name),M(),Y(pv(5,2,e.value))}}function QN(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Error of `+e.name),M(),Y(pv(5,2,e.error))}}function $N(e,t){if(e&1&&(z(0,`li`)(1,`span`,59),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function eP(e,t){if(e&1&&(z(0,`ul`,40),I(1,$N,5,4,`li`,null,vN),B()),e&2){let e=K(2).$implicit,t=K(2);R(`id`,`resource-internals-`+e.id),M(),L(t.internalsOf(e))}}function tP(e,t){if(e&1){let e=W();z(0,`div`,53)(1,`h3`,55),J(2),B(),P(3,qN,11,0,`p`,28),z(4,`dl`)(5,`dt`),J(6,`Status`),B(),z(7,`dd`),J(8),B(),P(9,JN,4,1),P(10,YN,4,1),P(11,XN,6,4),P(12,ZN,6,4),P(13,QN,6,4),B(),zg(14,56),z(15,`button`,57),G(`click`,function(){O(e);let t=K(3);return k(t.showInternals.set(!t.showInternals()))}),J(16),B(),P(17,eP,3,1,`ul`,40),B()}if(e&2){let e=K().$implicit,t=K(2),n=n_(22);R(`id`,`signal-detail-`+e.id),M(2),Y(e.name),M(),F(e.named?-1:3),M(5),Y(e.status??`unknown`),M(),F(e.isLoading===void 0?-1:9),M(),F(e.statusCode===void 0?-1:10),M(),F(e.params===void 0?-1:11),M(),F(e.value===void 0?-1:12),M(),F(e.error===void 0?-1:13),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,sv(16,pN,e.id)),M(),N(`aria-expanded`,t.showInternals())(`aria-controls`,`resource-internals-`+e.id),M(),Z(` `,t.showInternals()?`Hide`:`Show`,` internal signals (`,e.nodeIds.length,`) `),M(),F(t.showInternals()?17:-1)}}function nP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,48),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.id))}),z(2,`span`,33)(3,`span`,34),J(4,`resource`),B(),z(5,`span`,35),J(6),B(),P(7,UN,2,3,`span`,49),P(8,WN,2,2,`span`,50),V(9,`span`,51),B(),P(10,GN,3,3,`span`,52)(11,KN,3,3,`span`,52),B(),P(12,tP,18,18,`div`,53),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(`resource`)),M(3),Y(n.name),M(),F(n.status?7:-1),M(),F((e=n.changes)?8:-1,e),M(2),F(n.error===void 0?n.value===void 0?-1:11:10),M(2),F(r.selectedId()===n.id?12:-1)}}function rP(e,t){if(e&1&&(z(0,`h2`,46),J(1,`Resources`),B(),z(2,`ul`,47),I(3,nP,13,12,`li`,null,vN),B()),e&2){let e=K();M(3),L(e.filteredResources())}}function iP(e,t){if(e&1&&(z(0,`span`,50),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function aP(e,t){if(e&1&&(z(0,`span`,52),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function oP(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Deps: `,t.getDependencies(e).length)}}function sP(e,t){if(e&1&&(z(0,`span`,38),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Consumers: `,t.getConsumers(e).length)}}function cP(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,58),J(4),dv(5,`json`),B()()),e&2){let e=K(4);M(3),N(`aria-label`,`Value of `+(e.selectedNode().label??`signal`)),M(),Y(pv(5,2,e.selectedNode().value))}}function lP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,63),G(`click`,function(){let t=O(e).$implicit;return k(K(5).jumpTo(t))}),z(2,`span`,59),J(3),B(),z(4,`span`,60),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function uP(e,t){if(e&1&&(z(0,`h4`),J(1,`Dependencies (producers)`),B(),z(2,`ul`),I(3,lP,6,5,`li`,null,vN),B()),e&2){let e=K(4);M(3),L(e.getDependencies(e.selectedNode()))}}function dP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,63),G(`click`,function(){let t=O(e).$implicit;return k(K(5).jumpTo(t))}),z(2,`span`,59),J(3),B(),z(4,`span`,60),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function fP(e,t){if(e&1&&(z(0,`h4`),J(1,`Consumers`),B(),z(2,`ul`),I(3,dP,6,5,`li`,null,vN),B()),e&2){let e=K(4);M(3),L(e.getConsumers(e.selectedNode()))}}function pP(e,t){e&1&&(z(0,`p`,28),J(1),B()),e&2&&(M(),Y(t))}function mP(e,t){if(e&1&&(z(0,`div`,53)(1,`h3`,55),J(2),B(),z(3,`dl`)(4,`dt`),J(5,`Kind`),B(),z(6,`dd`),J(7),B(),z(8,`dt`),J(9,`Epoch`),B(),z(10,`dd`),J(11),B(),P(12,cP,6,4),B(),P(13,uP,5,0),P(14,fP,5,0),P(15,pP,2,1,`p`,28),zg(16,56),B()),e&2){let e,t=K().$implicit,n=K(2),r=n_(22);R(`id`,`signal-detail-`+t.id),M(2),Y(n.selectedNode().label??n.selectedNode().id),M(5),Y(n.selectedNode().kind),M(4),Y(n.selectedNode().epoch),M(),F(n.selectedNode().value===void 0?-1:12),M(),F(n.getDependencies(n.selectedNode()).length?13:-1),M(),F(n.getConsumers(n.selectedNode()).length?14:-1),M(),F((e=n.writeHint())?15:-1,e),M(),R(`ngTemplateOutlet`,r)(`ngTemplateOutletContext`,sv(10,mN,t.id))}}function hP(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,48),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.id))}),z(2,`span`,33)(3,`span`,34),J(4),B(),z(5,`span`,35),J(6),B(),P(7,iP,2,2,`span`,50),V(8,`span`,51),B(),P(9,aP,3,3,`span`,52),z(10,`span`,36)(11,`span`),J(12),B(),P(13,oP,4,1),P(14,sP,4,1),B()(),P(15,mP,17,12,`div`,53),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(n.kind)),M(),Y(n.kind),M(2),Y(n.label??`(unnamed)`),M(),F((e=r.changeCount(n.id))?7:-1,e),M(2),F(n.value===void 0?-1:9),M(3),X(`Epoch: `,n.epoch),M(),F(r.getDependencies(n).length?13:-1),M(),F(r.getConsumers(n).length?14:-1),M(),F(r.selectedId()===n.id&&r.selectedNode()?15:-1)}}function gP(e,t){if(e&1){let e=W();z(0,`button`,39),G(`click`,function(){return O(e),k(K(3).clearFilters())}),J(1,`Clear filters`),B()}}function _P(e,t){if(e&1&&(z(0,`li`,62)(1,`p`,27),J(2),B(),z(3,`p`,28),J(4),B(),P(5,gP,2,0,`button`,64),B()),e&2){let e=K(2);M(2),X(` `,e.hasAnySignals()?`No signals match.`:`No signals in this graph.`,` `),M(2),X(` `,e.hasAnySignals()?`Try a different name or kind.`:`Select a component that reads signals, or interact with the page to create some.`,` `),M(),F(e.hasAnySignals()?5:-1)}}function vP(e,t){if(e&1&&(z(0,`h2`,46),J(1,`Signals`),B(),z(2,`ul`,61),I(3,hP,16,15,`li`,null,vN,!1,_P,6,3,`li`,62),B()),e&2){let e=K();M(3),L(e.filteredNodes())}}var yP=`follow`;function bP(e){return Object.keys(e.pages).length?e.pages:e.graph?{[e.graph.pageId??``]:e.graph}:{}}var xP=`env:`,SP=50,CP={selected:`picked`,routed:`rendered by the router`,root:`first component with signals`},wP={write:`set`,sample:`sampled`,initial:`initial`},TP={resolved:`ok`,local:`ok`,loading:`warn`,reloading:`warn`,error:`danger`},EP={signal:`#facc15`,computed:`#60a5fa`,linkedSignal:`#34d399`,effect:`#fb923c`,template:`#94a3b8`,afterRenderEffectPhase:`#f472b6`,childSignalProp:`#fef08a`,"input (signal)":`#f59e0b`,"input.required (signal)":`#f59e0b`,"output (signal)":`#ec4899`,"model (signal)":`#14b8a6`,"model.required (signal)":`#14b8a6`,"viewChild (signal)":`#a3e635`,"viewChild.required (signal)":`#a3e635`,"viewChildren (signal)":`#a3e635`,"contentChild (signal)":`#fda4af`,"contentChild.required (signal)":`#fda4af`,"contentChildren (signal)":`#fda4af`,resource:`#06b6d4`,unknown:`#a1a1aa`},DP=class e{rpc=$(null);destroyRef=E(Cs);host=E(Ml);filterInput=Rv(`filterInput`);injector=E(xs);pageId=eE();cleanups=[];treePages=j({});graphState=j({graph:null,pages:{}});chosenPageId=j(null);announcement=j(``);graphPages=Q(()=>bP(this.graphState()));shownPageId=Tv({source:()=>({pages:this.graphPages(),newest:this.graphState().graph?.pageId??null,chosen:this.chosenPageId()}),computation:({pages:e,newest:t,chosen:n},r)=>{let i={};for(let n of Object.keys(e))i[n]={pageId:n,reportedAt:+(n===t)};return tE(i,{chosen:n,host:this.pageId,previous:r?.value??null})}});reported=Q(()=>{let e=this.shownPageId();return e===null?null:this.graphPages()[e]??null});unsupported=Q(()=>!!this.reported()?.unsupported);graph=Q(()=>{let e=this.reported();return e?.unsupported?null:e});graphOwner=Q(()=>{let e=this.graph();return e?`${e.pageId??``}|${e.component?.id??e.injector?.id??``}`:null});pickedByPage=j({});picked=Q(()=>this.pickedByPage()[this.targetPageId()??``]??null);pageOptions=Q(()=>{if(this.pageId)return[];let e=this.treePages();return Object.keys(this.graphPages()).map(t=>{let n=e[t];return{value:t,label:n?.title||n?.url||`Page ${t}`,hint:n?.url}})});showInternals=j(!1);sourceSignals=j([]);sourceLoaded=j(!1);filter=j(``);resources=Q(()=>this.graph()?.resources??[]);internalIds=Q(()=>new Set(this.resources().flatMap(e=>e.nodeIds)));visibleNodes=Q(()=>{let e=this.internalIds();return(this.graph()?.nodes??[]).filter(t=>!e.has(t.id))});hasAnySignals=Q(()=>this.visibleNodes().length+this.resources().length>0);kindCounts=Q(()=>{let e=this.graph()?[...this.visibleNodes().map(e=>e.kind),...this.resources().map(()=>`resource`)]:this.sourceSignals().map(e=>e.kind),t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return[...t].map(([e,t])=>({kind:e,count:t}))});kind=Tv({source:this.graphOwner,computation:(e,t)=>{let n=t?.value??null;return n&&Cv(this.kindCounts).some(e=>e.kind===n)?n:null}});kindChips=Q(()=>{let e=this.kindCounts(),t=this.kind();return t&&!e.some(e=>e.kind===t)?[...e,{kind:t,count:0}]:e});kindTotal=Q(()=>this.kindCounts().reduce((e,t)=>e+t.count,0));selectedId=Tv({source:this.graphOwner,computation:()=>null});selectedNode=Q(()=>this.graph()?.nodes.find(e=>e.id===this.selectedId())??null);jumpedPast=j(null);jumpNote=Q(()=>{let e=this.jumpedPast();return!e||this.filter()||this.kind()||this.selectedId()!==e.id?``:`Cleared the filters to show ${e.label}.`});selectedHistory=Q(()=>{let e=this.selectedId();return e?[...this.graph()?.history?.[e]??[]].reverse():[]});writeHint=Q(()=>{let e=this.selectedNode(),t=this.graph();if(!e||!t||t.writeHook===!1||e.kind!==`signal`&&e.kind!==`linkedSignal`)return``;if(!e.label)return`This signal has no name, so its history holds sampled values only. Pass a debugName in its options, for example signal(0, { debugName: 'count' }).`;let n=t.history?.[e.id]??[];return n.some(e=>e.source===`write`)||!n.some(e=>e.source===`sample`)?``:`Every change here was sampled. Writes are matched by name, kind, version and value, so another live signal with the same name and value can hide them.`});kindLegend=Object.entries(EP).map(([e,t])=>({kind:e,color:t}));filteredResources=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return t&&t!==`resource`?[]:this.resources().filter(t=>!e||t.name.toLowerCase().includes(e)||e.length>=3&&`resource`.startsWith(e))});filteredNodes=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.visibleNodes().filter(n=>(!t||n.kind===t)&&(!e||(n.label??``).toLowerCase().includes(e)||n.kind.toLowerCase().includes(e))).sort((e,t)=>e.id.localeCompare(t.id,void 0,{numeric:!0}))});filteredSourceSignals=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.sourceSignals().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.toLowerCase().includes(e)||n.file.toLowerCase().includes(e)))});targetPageId=Q(()=>this.pageId??(this.shownPageId()||null)??this.graph()?.pageId??this.latestTreePage()?.pageId??null);latestTreePage=Q(()=>{let e=null;for(let[t,n]of Object.entries(this.treePages())){let r=n.reportedAt??0;(!e||r>e.reportedAt)&&(e={pageId:t,reportedAt:r})}return e});componentOptions=Q(()=>{let e=this.targetPageId(),t=(e?this.treePages()[e]?.roots:void 0)??[],n=[],r=e=>{for(let t of e)n.push(t),r(t.children)};r(t);let i=this.graph()?.environments??[];if(!n.length&&!i.length)return[];let a=new Map;for(let e of n)a.set(e.name,(a.get(e.name)??0)+1);let o=new Map,s=[{value:yP,label:`Follow the routed component`,hint:`automatic`},...i.map(e=>({value:xP+e.id,label:this.injectorLabel(e),hint:`injector`}))];for(let e of n){let t=(o.get(e.name)??0)+1;o.set(e.name,t),s.push({value:e.id,label:(a.get(e.name)??0)>1?`${e.name} #${t}`:e.name,hint:`<${e.tag}>`})}return s});pickerValue=Q(()=>{let e=this.picked();return e&&this.componentOptions().some(t=>t.value===e)?e:yP});constructor(){uc(()=>{let e=this.rpc();e&&(this.loadSignalGraph(e),this.loadSourceSignals(e))}),this.destroyRef.onDestroy(()=>{for(let e of this.cleanups.splice(0))e()})}async loadSignalGraph(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`pangular`);try{let e=await t.rpc.sharedState(`signal-graph`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=t?.pages&&typeof t.pages==`object`?t.pages:{},r={graph:t?.graph??null,pages:n};this.notePageGone(bP(r)),this.graphState.set(r)};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.graphState.set({graph:null,pages:{}})}try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.treePages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.treePages.set({})}}notePageGone(e){let t=Object.keys(this.graphPages()).filter(t=>!e[t]);t.length&&this.pickedByPage.update(e=>{let n={...e};for(let e of t)delete n[e];return n});let n=this.chosenPageId();if(!n||e[n])return;let r=this.pageOptions().find(e=>e.value===n)?.label??`The chosen page`;this.chosenPageId.set(null),this.announcement.set(`${r} closed, so this shows another page.`)}selectPage(e){if(!e||e===this.shownPageId())return;this.chosenPageId.set(e);let t=this.pageOptions().find(t=>t.value===e)?.label??e;this.announcement.set(`Showing the signal graph of ${t}.`)}pickComponent(e){let t=e&&e!==yP?e:null,n=this.targetPageId()??void 0;this.pickedByPage.update(e=>{let r={...e};return t?r[n??``]=t:delete r[n??``],r});let r=this.rpc();if(!r)return;let i=t?.startsWith(xP)?{pageId:n,env:t.slice(4)}:{pageId:n,id:t};r.scope(`pangular`).rpc.call(`select-signal-target`,i).catch(()=>{})}injectorLabel(e){return e.name===`Root`?`Root services`:e.name}sourceNote(e){return CP[e]}async loadSourceSignals(e){let t=e.scope(`pangular`);try{let e=await t.rpc.call(`get-signals`);this.sourceSignals.set(e)}catch{}finally{this.sourceLoaded.set(!0)}}clearFilters(){this.resetFilters(),this.filterInput()?.nativeElement.focus()}resetFilters(){this.filter.set(``),this.kind.set(null)}select(e){this.selectedId.set(this.selectedId()===e?null:e),this.showInternals.set(!1)}jumpTo(e){let t=this.resources().find(t=>t.nodeIds.includes(e.id)),n=t?.id??e.id,r=t?!this.filteredResources().some(e=>e.id===n):!this.filteredNodes().some(e=>e.id===n);r&&this.resetFilters(),this.jumpedPast.set(r?{id:n,label:t?.name??e.label??e.id}:null),this.selectedId.set(n),this.showInternals.set(!!t),Id(()=>{let e=[...this.host.nativeElement.querySelectorAll(`.node-card[data-card]`)].find(e=>e.dataset.card===n);e?.scrollIntoView?.({block:`nearest`}),e?.focus({preventScroll:!0})},{injector:this.injector})}changeCount(e){let t=this.graph(),n=t?.nodes.find(t=>t.id===e)?.changes??t?.resources?.find(t=>t.id===e)?.changes;return n===void 0?(t?.history?.[e]??[]).reduce((e,t)=>e+(t.source===`initial`?0:1+(t.missed??0)),0):n}historySummary(e){let t=this.changeCount(e),n=this.graph()?.history?.[e]?.length??0;return t?`${`${t} ${t===1?`change`:`changes`} recorded`}${n>=SP&&t>=n?`, showing the last ${n}`:``}, newest first.`:`No changes recorded yet. The entry below is the value seen first.`}statusTone(e){return TP[e]??`neutral`}internalsOf(e){let t=new Set(e.nodeIds);return(this.graph()?.nodes??[]).filter(e=>t.has(e.id))}sourceLabel(e){return wP[e]}kindColor(e){return EP[e]??EP.unknown}relations=Q(()=>{let e=new Map,t=this.graph();if(!t)return e;for(let n of t.nodes)e.set(n.id,{deps:[],consumers:[]});for(let n of t.edges){let r=t.nodes[n.producer],i=t.nodes[n.consumer];r&&i&&(e.get(i.id)?.deps.push(r),e.get(r.id)?.consumers.push(i))}return e});getDependencies(e){return this.relations().get(e.id)?.deps??[]}getConsumers(e){return this.relations().get(e.id)?.consumers??[]}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-signal-inspector`]],viewQuery:function(e,t){e&1&&e_(t.filterInput,fN,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:27,vars:17,consts:[[`filterInput`,``],[`historyTpl`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter by name or kind…`,`aria-label`,`Filter signals by name or kind`,3,`input`,`keydown.escape`,`value`],[1,`picker`,`page-picker`],[1,`picker`],[`role`,`status`,1,`sr-only`],[1,`showing`],[`role`,`status`,1,`fallback`],[1,`intro`],[`role`,`group`,`aria-label`,`Filter by kind`,1,`kinds`],[`role`,`status`,1,`empty`],[1,`empty`],[`role`,`status`,1,`jump-note`],[`id`,`signals-page-label`,1,`label-key`],[`labelledBy`,`signals-page-label`,3,`valueChange`,`options`,`value`],[`id`,`signals-component-label`,1,`label-key`],[`labelledBy`,`signals-component-label`,3,`valueChange`,`options`,`value`],[1,`showing-name`],[1,`mono`],[1,`source-note`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[`aria-hidden`,`true`,1,`dot`],[1,`chip-text`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`hint`],[1,`source-label`],[1,`nodes`],[1,`node-card`],[`role`,`status`,1,`empty`,`compact`],[1,`node-header`],[1,`kind-badge`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[`aria-hidden`,`true`,1,`sep`],[`type`,`button`,1,`reset`,3,`click`],[3,`id`],[1,`history-summary`],[`tabindex`,`0`,1,`history`,`scroll-box`],[1,`history-meta`],[1,`source-tag`],[1,`missed`],[1,`list-heading`],[`role`,`list`,1,`nodes`,`resources`],[`type`,`button`,1,`node-card`,3,`click`],[1,`status-tag`,3,`class`],[1,`changed-badge`],[`aria-hidden`,`true`,1,`chevron`],[1,`node-value`],[1,`detail-panel`,3,`id`],[1,`status-tag`],[1,`detail-title`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`type`,`button`,1,`reset`,`internals-toggle`,3,`click`],[`role`,`region`,`tabindex`,`0`,1,`scroll-box`],[1,`kind-badge`,`sm`],[1,`rel-label`],[`role`,`list`,1,`nodes`],[1,`empty`,`compact`],[`type`,`button`,1,`rel-link`,3,`click`],[`type`,`button`,1,`reset`]],template:function(e,t){if(e&1&&(z(0,`div`,2)(1,`input`,3,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),P(3,yN,4,2,`div`,4),P(4,bN,4,2,`div`,5),B(),z(5,`p`,6),J(6),B(),P(7,SN,6,3,`p`,7)(8,CN,5,1,`p`,7),P(9,wN,2,0,`p`,8),z(10,`p`,9),P(11,TN,1,0)(12,EN,1,0)(13,DN,1,0),B(),P(14,ON,2,0,`p`,8),P(15,kN,2,0,`p`,8),P(16,AN,2,2,`p`,8),P(17,MN,7,4,`div`,10),P(18,NN,4,0,`div`,11),P(19,PN,14,0,`div`,12),P(20,RN,6,1),tg(21,HN,1,1,`ng-template`,null,1,gv),z(23,`p`,13),J(24),B(),P(25,rP,5,0),P(26,vP,6,1)),e&2){let e,n;M(),R(`value`,t.filter()),M(2),F(t.pageOptions().length>1?3:-1),M(),F(t.componentOptions().length?4:-1),M(2),Y(t.announcement()),M(),F((e=t.graph()?.component)?7:(e=t.graph()?.injector)?8:-1,e),M(2),F(t.graph()&&t.picked()&&t.graph().source!==`selected`?9:-1),M(2),F(t.graph()?.injector?11:t.graph()?12:13),M(3),F(t.unsupported()?14:-1),M(),F(t.graph()?.writeHook===!1?15:-1),M(),F((n=t.graph()?.nodeCount)?16:-1,n),M(),F(t.kindChips().length?17:-1),M(),F(!t.graph()&&!t.sourceLoaded()?18:-1),M(),F(!t.graph()&&t.sourceLoaded()&&t.sourceSignals().length===0?19:-1),M(),F(!t.graph()&&t.sourceSignals().length>0?20:-1),M(4),Y(t.jumpNote()),M(),F(t.graph()&&t.filteredResources().length?25:-1),M(),F(t.graph()&&(t.visibleNodes().length||!t.filteredResources().length)?26:-1)}},dependencies:[$y,jD,ib,ab],styles:[`[_nghost-%COMP%] {
display: block;
min-width: 0;
color: var(--%NS%text);
@@ -5053,7 +5053,7 @@ button.node-card[_ngcontent-%COMP%] {
dd[_ngcontent-%COMP%] + dt[_ngcontent-%COMP%] {
margin-top: 8px;
}
-}`]})},DP=[`queryInput`],OP=(e,t)=>t.node.injector.id,kP=(e,t)=>t.id,AP=(e,t)=>t.from+t.token+e,jP=(e,t)=>t.token+e,MP=(e,t)=>t.type,NP=(e,t)=>t.token+t.file+t.line;function PP(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return O(e),k(K(2).selectPage(t))}),B()()}if(e&2){let e=K(2);M(3),R(`options`,e.pageOptions())(`value`,e.shownPageId())}}function FP(e,t){e&1&&P(0,PP,4,2,`div`,4),e&2&&F(K().pageOptions().length>1?0:-1)}function IP(e,t){if(e&1){let e=W();z(0,`label`,18)(1,`input`,19),G(`change`,function(){O(e);let t=K(2);return k(t.componentsOnly.set(!t.componentsOnly()))}),B(),J(2,` Components only `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.componentsOnly())}}function LP(e,t){e&1&&(z(0,`span`,20),J(1),B()),e&2&&(M(),X(`Change detection: `,t))}function RP(e,t){e&1&&(z(0,`p`,21),A(),z(1,`svg`,30),V(2,`circle`,31)(3,`path`,32),B(),ps(),z(4,`span`)(5,`strong`),J(6,`This page has more than 2000 element injectors.`),B(),J(7,` Only the first 2000 are shown, so a lookup path or a provider can point to one that is not listed. `),B()())}function zP(e,t){if(e&1){let e=W();z(0,`button`,36),G(`click`,function(){let t=O(e).$implicit;return k(K(3).reveal(t.id))}),V(1,`span`,37),z(2,`span`,38),J(3),B(),z(4,`span`,39),J(5),B()()}if(e&2){let e=t.$implicit,n=K(3);M(),C_(`background`,n.tone(e.kind)),M(2),Y(e.label),M(2),Y(e.tokens)}}function BP(e,t){e&1&&(z(0,`span`,35),J(1),B()),e&2&&(M(),X(`+`,t,` more`))}function VP(e,t){if(e&1&&(z(0,`div`,22)(1,`span`,33),J(2,`Provided by`),B(),I(3,zP,6,4,`button`,34,kP),P(5,BP,2,1,`span`,35),B()),e&2){let e,t=K(2);M(3),L(t.providedBy()),M(2),F((e=t.providedByMore())?5:-1,e)}}function HP(e,t){if(e&1){let e=W();z(0,`div`,23),J(1),z(2,`button`,40),G(`click`,function(){return O(e),k(K(2).clearQuery())}),J(3,`Clear search`),B()()}if(e&2){let e=K(2);M(),X(` Nothing here matches “`,e.query().trim(),`”. `)}}function UP(e,t){e&1&&J(0,` None of them provide anything themselves. `)}function WP(e,t){e&1&&J(0,` Turn off “Components only” to see directives. `)}function GP(e,t){e&1&&J(0,` Try a different search. `)}function KP(e,t){if(e&1&&(z(0,`div`,25)(1,`p`,41),J(2,`No injectors to show`),B(),z(3,`p`,42),P(4,UP,1,0)(5,WP,1,0)(6,GP,1,0),B()()),e&2){let e=K(2);M(4),F(e.onlyProviding()?4:e.componentsOnly()&&e.view()===`element`?5:6)}}function qP(e,t){if(e&1){let e=W();z(0,`span`,53),G(`click`,function(t){O(e);let n=K().$implicit;return k(K(2).toggle(n.node.injector.id,t))}),A(),z(1,`svg`,54),V(2,`path`,55),B()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function JP(e,t){e&1&&V(0,`span`,45)}function YP(e,t){if(e&1&&(z(0,`span`,49),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.injector.component)}}function XP(e,t){if(e&1&&(z(0,`span`,49),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.injector.directives.join(`, `))}}function ZP(e,t){if(e&1&&(z(0,`span`,51),A(),z(1,`svg`,30),V(2,`path`,56),B(),ps(),z(3,`span`,47),J(4,`injects`),B(),J(5),B()),e&2){let e=K().$implicit;N(`title`,e.node.dependencies.length+` injected`),M(5),X(` `,e.node.dependencies.length,` `)}}function QP(e,t){if(e&1&&(z(0,`span`,52),A(),z(1,`svg`,30),V(2,`path`,57),B(),ps(),z(3,`span`,47),J(4,`provides`),B(),J(5),B()),e&2){let e=K().$implicit;N(`title`,e.node.injector.providerCount+` provided`),M(5),X(` `,e.node.injector.providerCount,` `)}}function $P(e,t){if(e&1){let e=W();z(0,`div`,43),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.node.injector.id))})(`focus`,function(){let t=O(e).$implicit,n=K(2);return n.focusId.set(t.node.injector.id),k(n.highlight(t.node))})(`blur`,function(){return O(e),k(K(2).highlight(null))})(`mouseenter`,function(){let t=O(e).$implicit;return k(K(2).highlight(t.node))})(`mouseleave`,function(){return O(e),k(K(2).highlight(null))}),P(1,qP,3,2,`span`,44)(2,JP,1,0,`span`,45),z(3,`span`,46),J(4),B(),z(5,`span`,47),J(6),B(),z(7,`span`,48),J(8),B(),P(9,YP,2,1,`span`,49)(10,XP,2,1,`span`,49),z(11,`span`,50),P(12,ZP,6,2,`span`,51),P(13,QP,6,2,`span`,52),B()()}if(e&2){let e=t.$implicit,n=K(2);C_(`--%NS%depth`,e.depth),q(`selected`,n.selected()?.injector?.id===e.node.injector.id),N(`aria-level`,e.depth+1)(`aria-expanded`,e.hasChildren?e.expanded:null)(`aria-selected`,n.selected()?.injector?.id===e.node.injector.id)(`tabindex`,n.rovingId()===e.node.injector.id?0:-1)(`data-id`,e.node.injector.id),M(),F(e.hasChildren?1:2),M(2),C_(`--%NS%tone`,n.tone(n.kind(e.node))),N(`title`,n.kind(e.node)),M(),Y(n.kind(e.node)[0].toUpperCase()),M(2),Y(n.kind(e.node)),M(2),Y(n.label(e.node)),M(),F(e.node.injector.component?9:e.node.injector.directives?.length?10:-1),M(3),F((e.node.dependencies?.length??0)>0?12:-1),M(),F(e.node.injector.providerCount>0?13:-1)}}function eF(e,t){if(e&1){let e=W();z(0,`button`,10),G(`click`,function(){let t=O(e);return k(K(3).reveal(t.node.injector.id))}),J(1),B()}if(e&2){let e=K(3);M(),X(` Show `,e.label(t.node),` `)}}function tF(e,t){if(e&1&&(z(0,`section`,28)(1,`header`,58)(2,`h2`,59),J(3),B()(),z(4,`div`,60)(5,`p`,42),J(6,` This injector is no longer on the page. Its component or directive was destroyed. `),B(),P(7,eF,2,1,`button`,61),B()()),e&2){let e,n=K(2);M(3),Y(t),M(4),F((e=n.rows()[0])?7:-1,e)}}function nF(e,t){if(e&1&&(z(0,`li`),J(1),B()),e&2){let e=t.$implicit;q(`is-component`,e===K(2).injector.component),M(),Y(e)}}function rF(e,t){if(e&1&&(z(0,`ul`,63),I(1,nF,2,3,`li`,70,wg),B()),e&2){let e=K();M(),L(e.injector.directives)}}function iF(e,t){if(e&1&&(z(0,`span`,71),V(1,`span`,37),J(2,` Null injector `),z(3,`span`,73),J(4,`throws NullInjectorError`),B()()),e&2){let e=K(4);M(),C_(`background`,e.tone(`null`))}}function aF(e,t){if(e&1&&(z(0,`span`,75),J(1),z(2,`span`,47),J(3),B()()),e&2){let e=K(2).$implicit;M(),X(` `,e.providers,` `),M(2),Y(e.providers===1?`provider`:`providers`)}}function oF(e,t){if(e&1){let e=W();z(0,`button`,74),G(`click`,function(){O(e);let t=K().$implicit;return k(K(3).reveal(t.id))}),V(1,`span`,37),z(2,`span`,38),J(3),B(),P(4,aF,4,2,`span`,75),B()}if(e&2){let e=K().$implicit,t=K(3);M(),C_(`background`,t.tone(e.kind)),M(2),Y(e.label),M(),F(e.providers?4:-1)}}function sF(e,t){if(e&1&&(z(0,`li`),P(1,iF,5,2,`span`,71)(2,oF,5,4,`button`,72),B()),e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`current`,n===0),M(),F(e.id===r.nullId?1:2)}}function cF(e,t){e&1&&(z(0,`p`,65),J(1,`Only services this injector has already created are listed.`),B())}function lF(e,t){if(e&1&&(z(0,`span`,81),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function uF(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`for `,e.from)}}function dF(e,t){if(e&1){let e=W();z(0,`button`,86),G(`click`,function(){let t=O(e);return k(K(6).reveal(t))}),V(1,`span`,37),J(2,` from `),z(3,`span`,38),J(4),B()()}if(e&2){let e=t,n=K(6);M(),C_(`background`,n.tone(n.kindById(e))),M(3),Y(n.labelById(e))}}function fF(e,t){e&1&&(z(0,`span`,84),J(1,`optional, not provided`),B())}function pF(e,t){e&1&&(z(0,`span`,85),J(1,`not provided anywhere`),B())}function mF(e,t){if(e&1&&(z(0,`li`,78)(1,`div`,79)(2,`span`,80),J(3),B(),I(4,lF,2,1,`span`,81,wg),B(),z(6,`div`,82),P(7,uF,2,1,`span`),P(8,dF,5,3,`button`,83)(9,fF,2,0,`span`,84)(10,pF,2,0,`span`,85),B()()),e&2){let e,n=t.$implicit,r=K(3);q(`hit`,K(2).matches(n.token)),M(3),Y(n.token),M(),L(n.flags),M(3),F(r.injector.type!==`element`||r.injector.directives&&r.injector.directives.length>1?7:-1),M(),F((e=n.providedBy)?8:n.flags.includes(`optional`)?9:10,e)}}function hF(e,t){if(e&1&&(z(0,`ul`,76),I(1,mF,11,5,`li`,77,AP),B()),e&2){let e=K(2);M(),L(e.dependencies)}}function gF(e,t){e&1&&(z(0,`p`,69),J(1,`Nothing is injected through the constructor or inject().`),B())}function _F(e,t){e&1&&(z(0,`p`,69),J(1,`No service created here has injected anything yet.`),B())}function vF(e,t){if(e&1&&(z(0,`div`,64)(1,`h3`),J(2),z(3,`span`,11),J(4),B()(),P(5,cF,2,0,`p`,65),P(6,hF,3,0,`ul`,76)(7,gF,2,0,`p`,69)(8,_F,2,0,`p`,69),B()),e&2){let e=K();M(2),X(` `,e.injector.type===`element`?`Injected here`:`Injected by its services`,` `),M(2),Y(e.dependencies?.length??0),M(),F(e.injector.type===`element`?-1:5),M(),F(e.dependencies?.length?6:e.injector.type===`element`?7:8)}}function yF(e,t){e&1&&(z(0,`span`,81),J(1,`viewProviders`),B())}function bF(e,t){e&1&&(z(0,`span`,81),J(1,`multi`),B())}function xF(e,t){if(e&1&&(z(0,`div`,82),J(1),B()),e&2){let e=K().$implicit;M(),X(`via `,e.importPath.join(` › `))}}function SF(e,t){if(e&1&&(z(0,`li`,88)(1,`div`,79)(2,`span`,80),J(3),B(),z(4,`span`,89),J(5),B(),P(6,yF,2,0,`span`,81),P(7,bF,2,0,`span`,81),B(),P(8,xF,2,1,`div`,82),B()),e&2){let e=t.$implicit,n=K(4);q(`hit`,n.matches(e.token)),M(3),Y(e.token),M(2),Y(e.type===`unknown`?`provider`:`use`+n.capital(e.type)),M(),F(e.isViewProvider?6:-1),M(),F(e.multi?7:-1),M(),F(e.importPath?.length?8:-1)}}function CF(e,t){if(e&1&&(z(0,`ul`,68),I(1,SF,9,7,`li`,87,jP),B()),e&2){let e=K();M(),L(e.providers)}}function wF(e,t){e&1&&J(0,` No providers or viewProviders on this element. `)}function TF(e,t){e&1&&J(0,` This injector has no providers of its own. `)}function EF(e,t){if(e&1&&(z(0,`p`,69),P(1,wF,1,0)(2,TF,1,0),B()),e&2){let e=K();M(),F(e.injector.type===`element`?1:2)}}function DF(e,t){if(e&1&&(z(0,`section`,29)(1,`header`,58)(2,`span`,62),J(3),B(),z(4,`h2`,59),J(5),B(),P(6,rF,3,0,`ul`,63),B(),z(7,`div`,64)(8,`h3`),J(9,`Lookup path`),B(),z(10,`p`,65),J(11,`Angular asks these injectors in order until one has the token.`),B(),z(12,`ol`,66),I(13,sF,3,3,`li`,67,kP),B()(),P(15,vF,9,4,`div`,64),z(16,`div`,64)(17,`h3`),J(18,` Provides `),z(19,`span`,11),J(20),B()(),P(21,CF,3,0,`ul`,68)(22,EF,3,1,`p`,69),B()()),e&2){let e=t,n=K(2);M(2),C_(`--%NS%tone`,n.tone(n.kind(e))),M(),Y(n.kind(e)),M(2),Y(n.label(e)),M(),F(e.injector.directives?.length?6:-1),M(7),L(n.path()),M(2),F(e.injector.type===`element`||e.dependencies?15:-1),M(5),Y(e.providers.length),M(),F(e.providers.length?21:22)}}function OF(e,t){if(e&1){let e=W();z(0,`p`,7),J(1,` Every component and directive gets an injector. When it asks for a token, Angular walks up this tree, then through the environment injectors, until something provides it. `),B(),z(2,`div`,8)(3,`div`,9)(4,`button`,10),G(`click`,function(){return O(e),k(K().setView(`element`))}),J(5,` Elements `),z(6,`span`,11),J(7),B()(),z(8,`button`,10),G(`click`,function(){return O(e),k(K().setView(`environment`))}),J(9,` Environment `),z(10,`span`,11),J(11),B()()(),z(12,`div`,12),A(),z(13,`svg`,13),V(14,`circle`,14)(15,`path`,15),B(),ps(),z(16,`input`,16,1),G(`input`,function(t){return O(e),k(K().query.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K().query.set(``))}),B()(),zg(18,17),P(19,IP,3,1,`label`,18),z(20,`label`,18)(21,`input`,19),G(`change`,function(){O(e);let t=K();return k(t.onlyProviding.set(!t.onlyProviding()))}),B(),J(22,` With providers `),B(),P(23,LP,2,1,`span`,20),B(),P(24,RP,8,0,`p`,21),P(25,VP,6,1,`div`,22)(26,HP,4,1,`div`,23),z(27,`div`,24),P(28,KP,7,1,`div`,25),z(29,`div`,26),G(`keydown`,function(t){return O(e),k(K().onTreeKey(t))}),I(30,$P,14,19,`div`,27,OP),B(),P(32,tF,8,2,`section`,28)(33,DF,23,8,`section`,29),B()}if(e&2){let e,t,n=K(),r=n_(3);M(4),q(`active`,n.view()===`element`),N(`aria-pressed`,n.view()===`element`),M(3),Y(n.elementCount()),M(),q(`active`,n.view()===`environment`),N(`aria-pressed`,n.view()===`environment`),M(3),Y(n.environmentCount()),M(5),R(`value`,n.query()),M(2),R(`ngTemplateOutlet`,r),M(),F(n.view()===`element`?19:-1),M(2),R(`checked`,n.onlyProviding()),M(2),F((e=n.zone())?23:-1,e),M(),F(n.truncated()?24:-1),M(),F(n.providedBy().length?25:n.query().trim()&&!n.rows().length?26:-1),M(3),F(n.rows().length?-1:28),M(),R(`hidden`,!n.rows().length),N(`aria-label`,n.view()===`element`?`Element injectors`:`Environment injectors`),M(),L(n.rows()),M(2),F((t=n.gone())?32:(t=n.selected())?33:-1,t)}}function kF(e,t){e&1&&(z(0,`div`,3),V(1,`span`,90),z(2,`p`,41),J(3,`Loading dependency injection data…`),B()())}function AF(e,t){if(e&1&&(z(0,`div`,8),zg(1,17),B()),e&2){K(2);let e=n_(3);M(),R(`ngTemplateOutlet`,e)}}function jF(e,t){e&1&&(P(0,AF,2,1,`div`,8),z(1,`div`,25)(2,`p`,41),J(3,`No DI data found`),B(),z(4,`p`,42),J(5,` Open the app in a browser with the devtools connected to see its live injectors. No providers, injectables or inject() calls were found in the source either. `),B()()),e&2&&F(K().pageOptions().length>1?0:-1)}function MF(e,t){if(e&1){let e=W();z(0,`div`,25)(1,`p`,41),J(2),B(),z(3,`p`,42),J(4,`Try part of a token name or a file path.`),B(),z(5,`button`,10),G(`click`,function(){return O(e),k(K(2).clearQuery())}),J(6,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No providers match “`,e.query(),`”`)}}function NF(e,t){if(e&1&&(z(0,`span`,100),J(1),B()),e&2){let e=K().$implicit;M(),X(`providedIn: `,e.providedIn)}}function PF(e,t){if(e&1&&(z(0,`span`,102),J(1),B()),e&2){let e=K().$implicit;M(),X(`as `,e.source)}}function FF(e,t){if(e&1&&(z(0,`li`,97)(1,`div`,98)(2,`span`,99),J(3),B(),P(4,NF,2,1,`span`,100),B(),z(5,`div`,101)(6,`span`,66),J(7),B(),P(8,PF,2,1,`span`,102),B()()),e&2){let e=t.$implicit;M(3),Y(e.token),M(),F(e.providedIn?4:-1),M(3),Z(``,e.file,`:`,e.line),M(),F(e.source!==`class`&&e.source!==`providers array`?8:-1)}}function IF(e,t){if(e&1&&(z(0,`section`,94)(1,`h2`),J(2),z(3,`span`,95),J(4),B()(),z(5,`ul`,96),I(6,FF,9,5,`li`,97,NP),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.label,` `),M(2),Y(e.items.length),M(2),L(e.items)}}function LF(e,t){if(e&1&&(z(0,`div`,93),I(1,IF,8,2,`section`,94,MP),B()),e&2){let e=K(2);M(),L(e.groupedProviders())}}function RF(e,t){if(e&1){let e=W();z(0,`div`,8)(1,`div`,12),A(),z(2,`svg`,13),V(3,`circle`,14)(4,`path`,15),B(),ps(),z(5,`input`,91,1),G(`input`,function(t){return O(e),k(K().query.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K().query.set(``))}),B()(),zg(7,17),z(8,`span`,92),J(9),B()(),z(10,`p`,21),A(),z(11,`svg`,30),V(12,`circle`,31)(13,`path`,32),B(),ps(),z(14,`span`)(15,`strong`),J(16,`DI from source scan (static analysis).`),B(),J(17,` Connect the overlay on Angular 20 or later to see the live injector tree. `),B()(),P(18,MF,7,1,`div`,25)(19,LF,3,0,`div`,93)}if(e&2){let e=K(),t=n_(3);M(5),R(`value`,e.query()),M(2),R(`ngTemplateOutlet`,t),M(2),Z(` `,e.sourceMatchCount(),` of `,e.sourceProviders().length,` `),M(9),F(e.groupedProviders().length===0?18:19)}}var zF=`inj-null`,BF=12,VF=600,HF={component:`var(--accent-text)`,directive:`var(--directive)`,environment:`var(--ok-text)`,null:`var(--text-3)`};function UF(e){return e.injector.type===`element`?e.injector.component?`component`:`directive`:`environment`}function WF(e){return e.injector.type===`element`?`<${e.injector.name}>`:e.injector.name}function GF(e){return Array.isArray(e)}var KF=class e{rpc=$(null);injector=E(xs);nullId=zF;hostPage=eE();treeState=j(null);pageTitles=j({});chosenPageId=j(null);treePages=Q(()=>{let e=this.treeState();if(!e)return{};let t=e.pages&&typeof e.pages==`object`?e.pages:{};return Object.keys(t).length||this.hostPage?t:{"":e}});shownPageId=Tv({source:()=>({pages:this.treePages(),chosen:this.chosenPageId()}),computation:({pages:e,chosen:t},n)=>{let r={};for(let[t,n]of Object.entries(e))r[t]={pageId:t,reportedAt:typeof n?.reportedAt==`number`?n.reportedAt:0};return tE(r,{chosen:t,host:this.hostPage,previous:n?.value??null})}});shownPage=Q(()=>{let e=this.shownPageId();return e===null?null:this.treePages()[e]??null});roots=Q(()=>{let e=this.shownPage()?.roots;return GF(e)?e:[]});environment=Q(()=>{let e=this.shownPage()?.environment;return GF(e)?e:[]});truncated=Q(()=>this.shownPage()?.truncated===!0);zone=Q(()=>{let e=this.shownPage()?.zone;return typeof e==`string`?nD(e):null});multiPage=Q(()=>!this.hostPage&&Object.keys(this.treePages()).length>1);pageOptions=Q(()=>{if(!this.multiPage())return[];let e=this.pageTitles();return Object.keys(this.treePages()).map(t=>{let n=e[t];return{value:t,label:n?.title||n?.url||`Page ${t}`,hint:n?.url}})});pageKey=Q(()=>this.shownPageId()??``);perPage(e){let t=new Map;return Tv({source:this.pageKey,computation:(n,r)=>(r&&t.set(r.source,r.value),t.has(n)?t.get(n):e())})}sourceProviders=j([]);loaded=j(!1);view=j(`element`);query=j(``);queryInput=Rv(`queryInput`);onlyProviding=j(!1);componentsOnly=j(!0);collapsed=this.perPage(()=>new Set);selectedId=this.perPage(()=>null);focusId=this.perPage(()=>null);announcement=j(``);selectedLabel=this.perPage(()=>null);wasGone=!1;index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.injector.id,a),i&&t.set(a.injector.id,i),n(a.children,a.injector.id)};return n(this.roots(),null),n(this.environment(),null),{map:e,parents:t}});elementCount=Q(()=>this.count(this.roots()));environmentCount=Q(()=>this.count(this.environment()));visible=Q(()=>{let e=this.view()===`element`?this.roots():this.environment();this.view()===`element`&&this.componentsOnly()&&(e=this.prune(e,e=>!!e.injector.component)),this.onlyProviding()&&(e=this.prune(e,e=>e.providers.length>0));let t=this.normalizedQuery();return t&&(e=this.prune(e,e=>this.nodeMatches(e,t))),e});rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.normalizedQuery(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.injector.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.visible(),0),e});selected=Q(()=>{let e=this.selectedId();return e?this.index().map.get(e)??null:this.rows()[0]?.node??null});gone=Q(()=>{let e=this.selectedId();return e&&!this.index().map.has(e)?this.selectedLabel()??`The injector`:null});rovingId=Q(()=>{let e=this.rows(),t=this.focusId()??this.selected()?.injector.id;return t&&e.some(e=>e.node.injector.id===t)?t:e[0]?.node.injector.id??null});path=Q(()=>{let e=this.selected();if(!e)return[];let{map:t,parents:n}=this.index(),r=e.injector.path??[];if(!r.length){r=[e.injector.id];let t=n.get(e.injector.id);for(;t;)r.push(t),t=n.get(t);r.push(zF)}return r.map(e=>{let n=t.get(e);return{id:e,label:n?WF(n):e===zF?`Null injector`:`Not listed`,kind:n?UF(n):`null`,providers:n?.providers.length??0}})});providerHits=Q(()=>{let e=this.normalizedQuery();if(!e)return[];let t=[];for(let n of this.index().map.values()){let r=n.providers.filter(t=>t.token.toLowerCase().includes(e));r.length&&t.push({id:n.injector.id,label:WF(n),kind:UF(n),tokens:r.map(e=>e.token).join(`, `)})}return t});providedBy=Q(()=>this.providerHits().slice(0,BF));providedByMore=Q(()=>Math.max(0,this.providerHits().length-BF));groupedProviders=Q(()=>{let e=this.normalizedQuery(),t=e?this.sourceProviders().filter(t=>t.token.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):this.sourceProviders(),n=[{type:`root-provider`,label:`Root Providers (provide*)`,items:[]},{type:`injectable`,label:`Injectable Services`,items:[]},{type:`injection`,label:`inject() Calls`,items:[]},{type:`provider`,label:`Component Providers`,items:[]}];for(let e of t)n.find(t=>t.type===e.type)?.items.push(e);return n.filter(e=>e.items.length>0)});sourceMatchCount=Q(()=>this.groupedProviders().reduce((e,t)=>e+t.items.length,0));searchSummary=Q(()=>{let e=this.query().trim();if(!e)return``;let t=this.providerHits().length;return t===1?`1 injector provides “${e}”.`:t>1?`${t} injectors provide “${e}”.`:this.rows().length?`No injector provides “${e}”.`:`Nothing here matches “${e}”.`});normalizedQuery=Q(()=>this.query().trim().toLowerCase());destroyRef=E(Cs);stopTree=null;treeLoad=0;lastSearchMessage=``;constructor(){uc(e=>{let t=this.searchSummary();if(!t){this.lastSearchMessage=``;return}if(t===this.lastSearchMessage)return;let n=setTimeout(()=>{this.lastSearchMessage=t,this.announcement.set(t)},VF);e(()=>clearTimeout(n))}),uc(()=>{let e=this.rpc();e&&(this.loadInjectorTree(e),this.loadSourceProviders(e))}),uc(e=>{let t=this.rpc();if(!t||!this.multiPage())return;let n=!0,r=null;e(()=>{n=!1,r?.()}),t.scope(`pangular`).rpc.sharedState(`component-tree`).then(e=>{if(!n)return;let t=e=>{let t=e?.pages;this.pageTitles.set(t&&typeof t==`object`?t:{})};t(e.value()),r=e.on(`updated`,t)}).catch(()=>{})}),this.destroyRef.onDestroy(()=>{this.stopTree?.(),this.highlight(null)})}clearQuery(){this.query.set(``),this.queryInput()?.nativeElement.focus()}label(e){return WF(e)}kind(e){return UF(e)}tone(e){return HF[e]??HF.null}kindById(e){let t=this.index().map.get(e);return t?UF(t):`null`}labelById(e){let t=this.index().map.get(e);return t?WF(t):e===zF?`Null injector`:`not listed`}capital(e){return e.charAt(0).toUpperCase()+e.slice(1)}matches(e){let t=this.normalizedQuery();return!!t&&e.toLowerCase().includes(t)}setView(e){this.view()!==e&&(this.view.set(e),this.choose(null),this.focusId.set(null))}select(e){this.choose(e),this.focusId.set(e)}choose(e){let t=e?this.index().map.get(e):void 0;this.selectedId.set(e),this.selectedLabel.set(t?WF(t):null),this.wasGone=!1}syncGone(){let e=this.gone()!==null;if(e&&!this.wasGone){let e=`The selected injector is no longer on the page.`;this.announcement.update(t=>t===e?`${e}\u00a0`:e)}this.wasGone=e}selectPage(e){if(!e||e===this.shownPageId())return;this.chosenPageId.set(e),this.wasGone=this.gone()!==null;let t=this.pageOptions().find(t=>t.value===e)?.label??e;this.announcement.set(`Showing the injectors of ${t}.`)}notePageGone(e){let t=this.chosenPageId();if(!t||e?.[t])return;let n=this.pageOptions().find(e=>e.value===t)?.label??`The chosen page`;this.chosenPageId.set(null),this.announcement.set(`${n} closed, so this shows another page.`),this.wasGone=!0}toggle(e,t){t?.stopPropagation(),!this.normalizedQuery()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}reveal(e){let t=this.index().map.get(e);if(!t)return;this.setView(t.injector.type===`element`?`element`:`environment`);let{parents:n}=this.index();this.collapsed.update(t=>{let r=new Set(t),i=n.get(e);for(;i;)r.delete(i),i=n.get(i);return r}),this.onlyProviding()&&t.providers.length===0&&this.onlyProviding.set(!1),t.injector.type===`element`&&!t.injector.component&&this.componentsOnly.set(!1),this.select(e),Id(()=>this.focusRow(e,!1),{injector:this.injector})}highlight(e){let t=this.rpc();if(!t)return;let n=e?.injector.type===`element`?e.injector.selector??null:null,r=n?{pageId:this.shownPageId()||null,selector:n}:null;t.scope(`pangular`).rpc.call(`request-page-highlight`,r).catch(()=>{})}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=this.rovingId(),r=t.findIndex(e=>e.node.injector.id===n),i=Math.max(r,0),a=t[i],o=-1;switch(e.key){case`ArrowDown`:o=Math.min(i+1,t.length-1);break;case`ArrowUp`:o=Math.max(i-1,0);break;case`Home`:o=0;break;case`End`:o=t.length-1;break;case`ArrowRight`:a.hasChildren&&!a.expanded?this.toggle(a.node.injector.id):a.hasChildren&&(o=i+1);break;case`ArrowLeft`:if(a.hasChildren&&a.expanded&&!this.normalizedQuery())this.toggle(a.node.injector.id);else{let e=this.index().parents.get(a.node.injector.id);o=t.findIndex(t=>t.node.injector.id===e)}break;case`Enter`:case` `:this.select(a.node.injector.id);break;default:return}if(e.preventDefault(),o>=0){let e=t[o].node.injector.id;this.focusId.set(e),this.choose(e),queueMicrotask(()=>this.focusRow(e,!0))}}focusRow(e,t){let n=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);n&&(t&&n.focus(),n.scrollIntoView({block:`nearest`}))}clearTree(){this.stopTree?.(),this.stopTree=null}async loadInjectorTree(e){let t=++this.treeLoad;this.clearTree();let n=e.scope(`pangular`),r;try{r=await n.rpc.sharedState(`injector-tree`)}catch{return}if(this.destroyRef.destroyed||this.rpc()!==e||t!==this.treeLoad)return;let i=e=>{let t=e&&typeof e==`object`?e:null;this.notePageGone(t?.pages),this.treeState.set(t),this.syncGone()};i(r.value()),this.clearTree(),this.stopTree=r.on(`updated`,i)}async loadSourceProviders(e){let t=e.scope(`pangular`);try{this.sourceProviders.set(await t.rpc.call(`get-providers`))}catch{this.sourceProviders.set([])}finally{this.loaded.set(!0)}}count(e){return e.reduce((e,t)=>e+1+this.count(t.children),0)}nodeMatches(e,t){let n=e.injector;return n.name.toLowerCase().includes(t)||!!n.component?.toLowerCase().includes(t)||!!n.directives?.some(e=>e.toLowerCase().includes(t))||e.providers.some(e=>e.token.toLowerCase().includes(t))||!!e.dependencies?.some(e=>e.token.toLowerCase().includes(t))}prune(e,t){let n=[];for(let r of e){let e=this.prune(r.children,t);(t(r)||e.length)&&n.push({...r,children:e})}return n}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-di-inspector`]],viewQuery:function(e,t){e&1&&e_(t.queryInput,DP,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:8,vars:2,consts:[[`pagePicker`,``],[`queryInput`,``],[`role`,`status`,1,`sr-only`],[`role`,`status`,1,`state`],[1,`page-picker`],[`id`,`di-page-label`,1,`label-key`],[`labelledBy`,`di-page-label`,3,`valueChange`,`options`,`value`],[1,`intro`],[1,`toolbar`],[`role`,`group`,`aria-label`,`Injector tree`,1,`segmented`],[`type`,`button`,3,`click`],[1,`pill`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a token, component or injector…`,`aria-label`,`Find a token, component or injector`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[3,`ngTemplateOutlet`],[1,`checkbox`],[`type`,`checkbox`,3,`change`,`checked`],[1,`total`],[1,`notice`],[1,`where`],[1,`where`,`muted`],[1,`layout`],[1,`state`],[`role`,`tree`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`di-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`di-detail-title`,1,`detail`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[1,`where-label`],[`type`,`button`,1,`chip`],[1,`more`],[`type`,`button`,1,`chip`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`mono`],[1,`chip-tokens`],[`type`,`button`,1,`link`,3,`click`],[1,`state-title`],[1,`state-hint`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[`aria-hidden`,`true`,1,`kind`],[1,`sr-only`],[1,`name`,`mono`],[1,`sub`],[1,`meta`],[1,`count`],[1,`count`,`provides`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[`d`,`M12 5v14M5 12l7 7 7-7`],[`d`,`M21 8 12 3 3 8v8l9 5 9-5z`],[1,`detail-head`],[`id`,`di-detail-title`,1,`mono`],[1,`state`,`compact`],[`type`,`button`],[1,`badge`],[`aria-label`,`Classes on this element`,1,`classes`],[1,`block`],[1,`hint`],[1,`path`],[3,`current`],[1,`providers`],[1,`empty-line`],[3,`is-component`],[1,`step`,`null`],[`type`,`button`,1,`step`],[1,`hint-inline`],[`type`,`button`,1,`step`,3,`click`],[1,`step-count`],[1,`deps`],[1,`dep`,3,`hit`],[1,`dep`],[1,`dep-main`],[1,`token`,`mono`],[1,`flag`],[1,`dep-meta`],[`type`,`button`,1,`from`],[1,`from`,`absent`],[1,`from`,`missing`],[`type`,`button`,1,`from`,3,`click`],[1,`provider`,3,`hit`],[1,`provider`],[1,`flag`,`kind-flag`],[`aria-hidden`,`true`,1,`spinner`],[`type`,`search`,`placeholder`,`Filter by token or file…`,`aria-label`,`Filter by token or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`total`],[1,`source-providers`],[1,`provider-group`],[1,`section-count`],[`role`,`list`,1,`provider-list`],[1,`provider-card`],[1,`provider-header`],[1,`token`],[1,`provided-in`],[1,`provider-meta`],[1,`as`]],template:function(e,t){e&1&&(z(0,`p`,2),J(1),B(),tg(2,FP,1,1,`ng-template`,null,0,gv),P(4,OF,34,19)(5,kF,4,0,`div`,3)(6,jF,6,1)(7,RF,20,5)),e&2&&(M(),Y(t.announcement()),M(3),F(t.roots().length>0?4:t.loaded()?t.sourceProviders().length===0?6:7:5))},dependencies:[$y,jD],styles:[`[_nghost-%COMP%] {
+}`]})},OP=[`queryInput`],kP=(e,t)=>t.node.injector.id,AP=(e,t)=>t.id,jP=(e,t)=>t.from+t.token+e,MP=(e,t)=>t.token+e,NP=(e,t)=>t.type,PP=(e,t)=>t.token+t.file+t.line;function FP(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return O(e),k(K(2).selectPage(t))}),B()()}if(e&2){let e=K(2);M(3),R(`options`,e.pageOptions())(`value`,e.shownPageId())}}function IP(e,t){e&1&&P(0,FP,4,2,`div`,4),e&2&&F(K().pageOptions().length>1?0:-1)}function LP(e,t){if(e&1){let e=W();z(0,`label`,18)(1,`input`,19),G(`change`,function(){O(e);let t=K(2);return k(t.componentsOnly.set(!t.componentsOnly()))}),B(),J(2,` Components only `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.componentsOnly())}}function RP(e,t){e&1&&(z(0,`span`,20),J(1),B()),e&2&&(M(),X(`Change detection: `,t))}function zP(e,t){e&1&&(z(0,`p`,21),A(),z(1,`svg`,30),V(2,`circle`,31)(3,`path`,32),B(),ps(),z(4,`span`)(5,`strong`),J(6,`This page has more than 2000 element injectors.`),B(),J(7,` Only the first 2000 are shown, so a lookup path or a provider can point to one that is not listed. `),B()())}function BP(e,t){if(e&1){let e=W();z(0,`button`,36),G(`click`,function(){let t=O(e).$implicit;return k(K(3).reveal(t.id))}),V(1,`span`,37),z(2,`span`,38),J(3),B(),z(4,`span`,39),J(5),B()()}if(e&2){let e=t.$implicit,n=K(3);M(),C_(`background`,n.tone(e.kind)),M(2),Y(e.label),M(2),Y(e.tokens)}}function VP(e,t){e&1&&(z(0,`span`,35),J(1),B()),e&2&&(M(),X(`+`,t,` more`))}function HP(e,t){if(e&1&&(z(0,`div`,22)(1,`span`,33),J(2,`Provided by`),B(),I(3,BP,6,4,`button`,34,AP),P(5,VP,2,1,`span`,35),B()),e&2){let e,t=K(2);M(3),L(t.providedBy()),M(2),F((e=t.providedByMore())?5:-1,e)}}function UP(e,t){if(e&1){let e=W();z(0,`div`,23),J(1),z(2,`button`,40),G(`click`,function(){return O(e),k(K(2).clearQuery())}),J(3,`Clear search`),B()()}if(e&2){let e=K(2);M(),X(` Nothing here matches “`,e.query().trim(),`”. `)}}function WP(e,t){e&1&&J(0,` None of them provide anything themselves. `)}function GP(e,t){e&1&&J(0,` Turn off “Components only” to see directives. `)}function KP(e,t){e&1&&J(0,` Try a different search. `)}function qP(e,t){if(e&1&&(z(0,`div`,25)(1,`p`,41),J(2,`No injectors to show`),B(),z(3,`p`,42),P(4,WP,1,0)(5,GP,1,0)(6,KP,1,0),B()()),e&2){let e=K(2);M(4),F(e.onlyProviding()?4:e.componentsOnly()&&e.view()===`element`?5:6)}}function JP(e,t){if(e&1){let e=W();z(0,`span`,53),G(`click`,function(t){O(e);let n=K().$implicit;return k(K(2).toggle(n.node.injector.id,t))}),A(),z(1,`svg`,54),V(2,`path`,55),B()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function YP(e,t){e&1&&V(0,`span`,45)}function XP(e,t){if(e&1&&(z(0,`span`,49),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.injector.component)}}function ZP(e,t){if(e&1&&(z(0,`span`,49),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.injector.directives.join(`, `))}}function QP(e,t){if(e&1&&(z(0,`span`,51),A(),z(1,`svg`,30),V(2,`path`,56),B(),ps(),z(3,`span`,47),J(4,`injects`),B(),J(5),B()),e&2){let e=K().$implicit;N(`title`,e.node.dependencies.length+` injected`),M(5),X(` `,e.node.dependencies.length,` `)}}function $P(e,t){if(e&1&&(z(0,`span`,52),A(),z(1,`svg`,30),V(2,`path`,57),B(),ps(),z(3,`span`,47),J(4,`provides`),B(),J(5),B()),e&2){let e=K().$implicit;N(`title`,e.node.injector.providerCount+` provided`),M(5),X(` `,e.node.injector.providerCount,` `)}}function eF(e,t){if(e&1){let e=W();z(0,`div`,43),G(`click`,function(){let t=O(e).$implicit;return k(K(2).select(t.node.injector.id))})(`focus`,function(){let t=O(e).$implicit,n=K(2);return n.focusId.set(t.node.injector.id),k(n.highlight(t.node))})(`blur`,function(){return O(e),k(K(2).highlight(null))})(`mouseenter`,function(){let t=O(e).$implicit;return k(K(2).highlight(t.node))})(`mouseleave`,function(){return O(e),k(K(2).highlight(null))}),P(1,JP,3,2,`span`,44)(2,YP,1,0,`span`,45),z(3,`span`,46),J(4),B(),z(5,`span`,47),J(6),B(),z(7,`span`,48),J(8),B(),P(9,XP,2,1,`span`,49)(10,ZP,2,1,`span`,49),z(11,`span`,50),P(12,QP,6,2,`span`,51),P(13,$P,6,2,`span`,52),B()()}if(e&2){let e=t.$implicit,n=K(2);C_(`--%NS%depth`,e.depth),q(`selected`,n.selected()?.injector?.id===e.node.injector.id),N(`aria-level`,e.depth+1)(`aria-expanded`,e.hasChildren?e.expanded:null)(`aria-selected`,n.selected()?.injector?.id===e.node.injector.id)(`tabindex`,n.rovingId()===e.node.injector.id?0:-1)(`data-id`,e.node.injector.id),M(),F(e.hasChildren?1:2),M(2),C_(`--%NS%tone`,n.tone(n.kind(e.node))),N(`title`,n.kind(e.node)),M(),Y(n.kind(e.node)[0].toUpperCase()),M(2),Y(n.kind(e.node)),M(2),Y(n.label(e.node)),M(),F(e.node.injector.component?9:e.node.injector.directives?.length?10:-1),M(3),F((e.node.dependencies?.length??0)>0?12:-1),M(),F(e.node.injector.providerCount>0?13:-1)}}function tF(e,t){if(e&1){let e=W();z(0,`button`,10),G(`click`,function(){let t=O(e);return k(K(3).reveal(t.node.injector.id))}),J(1),B()}if(e&2){let e=K(3);M(),X(` Show `,e.label(t.node),` `)}}function nF(e,t){if(e&1&&(z(0,`section`,28)(1,`header`,58)(2,`h2`,59),J(3),B()(),z(4,`div`,60)(5,`p`,42),J(6,` This injector is no longer on the page. Its component or directive was destroyed. `),B(),P(7,tF,2,1,`button`,61),B()()),e&2){let e,n=K(2);M(3),Y(t),M(4),F((e=n.rows()[0])?7:-1,e)}}function rF(e,t){if(e&1&&(z(0,`li`),J(1),B()),e&2){let e=t.$implicit;q(`is-component`,e===K(2).injector.component),M(),Y(e)}}function iF(e,t){if(e&1&&(z(0,`ul`,63),I(1,rF,2,3,`li`,70,wg),B()),e&2){let e=K();M(),L(e.injector.directives)}}function aF(e,t){if(e&1&&(z(0,`span`,71),V(1,`span`,37),J(2,` Null injector `),z(3,`span`,73),J(4,`throws NullInjectorError`),B()()),e&2){let e=K(4);M(),C_(`background`,e.tone(`null`))}}function oF(e,t){if(e&1&&(z(0,`span`,75),J(1),z(2,`span`,47),J(3),B()()),e&2){let e=K(2).$implicit;M(),X(` `,e.providers,` `),M(2),Y(e.providers===1?`provider`:`providers`)}}function sF(e,t){if(e&1){let e=W();z(0,`button`,74),G(`click`,function(){O(e);let t=K().$implicit;return k(K(3).reveal(t.id))}),V(1,`span`,37),z(2,`span`,38),J(3),B(),P(4,oF,4,2,`span`,75),B()}if(e&2){let e=K().$implicit,t=K(3);M(),C_(`background`,t.tone(e.kind)),M(2),Y(e.label),M(),F(e.providers?4:-1)}}function cF(e,t){if(e&1&&(z(0,`li`),P(1,aF,5,2,`span`,71)(2,sF,5,4,`button`,72),B()),e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`current`,n===0),M(),F(e.id===r.nullId?1:2)}}function lF(e,t){e&1&&(z(0,`p`,65),J(1,`Only services this injector has already created are listed.`),B())}function uF(e,t){if(e&1&&(z(0,`span`,81),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function dF(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`for `,e.from)}}function fF(e,t){if(e&1){let e=W();z(0,`button`,86),G(`click`,function(){let t=O(e);return k(K(6).reveal(t))}),V(1,`span`,37),J(2,` from `),z(3,`span`,38),J(4),B()()}if(e&2){let e=t,n=K(6);M(),C_(`background`,n.tone(n.kindById(e))),M(3),Y(n.labelById(e))}}function pF(e,t){e&1&&(z(0,`span`,84),J(1,`optional, not provided`),B())}function mF(e,t){e&1&&(z(0,`span`,85),J(1,`not provided anywhere`),B())}function hF(e,t){if(e&1&&(z(0,`li`,78)(1,`div`,79)(2,`span`,80),J(3),B(),I(4,uF,2,1,`span`,81,wg),B(),z(6,`div`,82),P(7,dF,2,1,`span`),P(8,fF,5,3,`button`,83)(9,pF,2,0,`span`,84)(10,mF,2,0,`span`,85),B()()),e&2){let e,n=t.$implicit,r=K(3);q(`hit`,K(2).matches(n.token)),M(3),Y(n.token),M(),L(n.flags),M(3),F(r.injector.type!==`element`||r.injector.directives&&r.injector.directives.length>1?7:-1),M(),F((e=n.providedBy)?8:n.flags.includes(`optional`)?9:10,e)}}function gF(e,t){if(e&1&&(z(0,`ul`,76),I(1,hF,11,5,`li`,77,jP),B()),e&2){let e=K(2);M(),L(e.dependencies)}}function _F(e,t){e&1&&(z(0,`p`,69),J(1,`Nothing is injected through the constructor or inject().`),B())}function vF(e,t){e&1&&(z(0,`p`,69),J(1,`No service created here has injected anything yet.`),B())}function yF(e,t){if(e&1&&(z(0,`div`,64)(1,`h3`),J(2),z(3,`span`,11),J(4),B()(),P(5,lF,2,0,`p`,65),P(6,gF,3,0,`ul`,76)(7,_F,2,0,`p`,69)(8,vF,2,0,`p`,69),B()),e&2){let e=K();M(2),X(` `,e.injector.type===`element`?`Injected here`:`Injected by its services`,` `),M(2),Y(e.dependencies?.length??0),M(),F(e.injector.type===`element`?-1:5),M(),F(e.dependencies?.length?6:e.injector.type===`element`?7:8)}}function bF(e,t){e&1&&(z(0,`span`,81),J(1,`viewProviders`),B())}function xF(e,t){e&1&&(z(0,`span`,81),J(1,`multi`),B())}function SF(e,t){if(e&1&&(z(0,`div`,82),J(1),B()),e&2){let e=K().$implicit;M(),X(`via `,e.importPath.join(` › `))}}function CF(e,t){if(e&1&&(z(0,`li`,88)(1,`div`,79)(2,`span`,80),J(3),B(),z(4,`span`,89),J(5),B(),P(6,bF,2,0,`span`,81),P(7,xF,2,0,`span`,81),B(),P(8,SF,2,1,`div`,82),B()),e&2){let e=t.$implicit,n=K(4);q(`hit`,n.matches(e.token)),M(3),Y(e.token),M(2),Y(e.type===`unknown`?`provider`:`use`+n.capital(e.type)),M(),F(e.isViewProvider?6:-1),M(),F(e.multi?7:-1),M(),F(e.importPath?.length?8:-1)}}function wF(e,t){if(e&1&&(z(0,`ul`,68),I(1,CF,9,7,`li`,87,MP),B()),e&2){let e=K();M(),L(e.providers)}}function TF(e,t){e&1&&J(0,` No providers or viewProviders on this element. `)}function EF(e,t){e&1&&J(0,` This injector has no providers of its own. `)}function DF(e,t){if(e&1&&(z(0,`p`,69),P(1,TF,1,0)(2,EF,1,0),B()),e&2){let e=K();M(),F(e.injector.type===`element`?1:2)}}function OF(e,t){if(e&1&&(z(0,`section`,29)(1,`header`,58)(2,`span`,62),J(3),B(),z(4,`h2`,59),J(5),B(),P(6,iF,3,0,`ul`,63),B(),z(7,`div`,64)(8,`h3`),J(9,`Lookup path`),B(),z(10,`p`,65),J(11,`Angular asks these injectors in order until one has the token.`),B(),z(12,`ol`,66),I(13,cF,3,3,`li`,67,AP),B()(),P(15,yF,9,4,`div`,64),z(16,`div`,64)(17,`h3`),J(18,` Provides `),z(19,`span`,11),J(20),B()(),P(21,wF,3,0,`ul`,68)(22,DF,3,1,`p`,69),B()()),e&2){let e=t,n=K(2);M(2),C_(`--%NS%tone`,n.tone(n.kind(e))),M(),Y(n.kind(e)),M(2),Y(n.label(e)),M(),F(e.injector.directives?.length?6:-1),M(7),L(n.path()),M(2),F(e.injector.type===`element`||e.dependencies?15:-1),M(5),Y(e.providers.length),M(),F(e.providers.length?21:22)}}function kF(e,t){if(e&1){let e=W();z(0,`p`,7),J(1,` Every component and directive gets an injector. When it asks for a token, Angular walks up this tree, then through the environment injectors, until something provides it. `),B(),z(2,`div`,8)(3,`div`,9)(4,`button`,10),G(`click`,function(){return O(e),k(K().setView(`element`))}),J(5,` Elements `),z(6,`span`,11),J(7),B()(),z(8,`button`,10),G(`click`,function(){return O(e),k(K().setView(`environment`))}),J(9,` Environment `),z(10,`span`,11),J(11),B()()(),z(12,`div`,12),A(),z(13,`svg`,13),V(14,`circle`,14)(15,`path`,15),B(),ps(),z(16,`input`,16,1),G(`input`,function(t){return O(e),k(K().query.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K().query.set(``))}),B()(),zg(18,17),P(19,LP,3,1,`label`,18),z(20,`label`,18)(21,`input`,19),G(`change`,function(){O(e);let t=K();return k(t.onlyProviding.set(!t.onlyProviding()))}),B(),J(22,` With providers `),B(),P(23,RP,2,1,`span`,20),B(),P(24,zP,8,0,`p`,21),P(25,HP,6,1,`div`,22)(26,UP,4,1,`div`,23),z(27,`div`,24),P(28,qP,7,1,`div`,25),z(29,`div`,26),G(`keydown`,function(t){return O(e),k(K().onTreeKey(t))}),I(30,eF,14,19,`div`,27,kP),B(),P(32,nF,8,2,`section`,28)(33,OF,23,8,`section`,29),B()}if(e&2){let e,t,n=K(),r=n_(3);M(4),q(`active`,n.view()===`element`),N(`aria-pressed`,n.view()===`element`),M(3),Y(n.elementCount()),M(),q(`active`,n.view()===`environment`),N(`aria-pressed`,n.view()===`environment`),M(3),Y(n.environmentCount()),M(5),R(`value`,n.query()),M(2),R(`ngTemplateOutlet`,r),M(),F(n.view()===`element`?19:-1),M(2),R(`checked`,n.onlyProviding()),M(2),F((e=n.zone())?23:-1,e),M(),F(n.truncated()?24:-1),M(),F(n.providedBy().length?25:n.query().trim()&&!n.rows().length?26:-1),M(3),F(n.rows().length?-1:28),M(),R(`hidden`,!n.rows().length),N(`aria-label`,n.view()===`element`?`Element injectors`:`Environment injectors`),M(),L(n.rows()),M(2),F((t=n.gone())?32:(t=n.selected())?33:-1,t)}}function AF(e,t){e&1&&(z(0,`div`,3),V(1,`span`,90),z(2,`p`,41),J(3,`Loading dependency injection data…`),B()())}function jF(e,t){if(e&1&&(z(0,`div`,8),zg(1,17),B()),e&2){K(2);let e=n_(3);M(),R(`ngTemplateOutlet`,e)}}function MF(e,t){e&1&&(P(0,jF,2,1,`div`,8),z(1,`div`,25)(2,`p`,41),J(3,`No DI data found`),B(),z(4,`p`,42),J(5,` Open the app in a browser with the devtools connected to see its live injectors. No providers, injectables or inject() calls were found in the source either. `),B()()),e&2&&F(K().pageOptions().length>1?0:-1)}function NF(e,t){if(e&1){let e=W();z(0,`div`,25)(1,`p`,41),J(2),B(),z(3,`p`,42),J(4,`Try part of a token name or a file path.`),B(),z(5,`button`,10),G(`click`,function(){return O(e),k(K(2).clearQuery())}),J(6,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No providers match “`,e.query(),`”`)}}function PF(e,t){if(e&1&&(z(0,`span`,100),J(1),B()),e&2){let e=K().$implicit;M(),X(`providedIn: `,e.providedIn)}}function FF(e,t){if(e&1&&(z(0,`span`,102),J(1),B()),e&2){let e=K().$implicit;M(),X(`as `,e.source)}}function IF(e,t){if(e&1&&(z(0,`li`,97)(1,`div`,98)(2,`span`,99),J(3),B(),P(4,PF,2,1,`span`,100),B(),z(5,`div`,101)(6,`span`,66),J(7),B(),P(8,FF,2,1,`span`,102),B()()),e&2){let e=t.$implicit;M(3),Y(e.token),M(),F(e.providedIn?4:-1),M(3),Z(``,e.file,`:`,e.line),M(),F(e.source!==`class`&&e.source!==`providers array`?8:-1)}}function LF(e,t){if(e&1&&(z(0,`section`,94)(1,`h2`),J(2),z(3,`span`,95),J(4),B()(),z(5,`ul`,96),I(6,IF,9,5,`li`,97,PP),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.label,` `),M(2),Y(e.items.length),M(2),L(e.items)}}function RF(e,t){if(e&1&&(z(0,`div`,93),I(1,LF,8,2,`section`,94,NP),B()),e&2){let e=K(2);M(),L(e.groupedProviders())}}function zF(e,t){if(e&1){let e=W();z(0,`div`,8)(1,`div`,12),A(),z(2,`svg`,13),V(3,`circle`,14)(4,`path`,15),B(),ps(),z(5,`input`,91,1),G(`input`,function(t){return O(e),k(K().query.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K().query.set(``))}),B()(),zg(7,17),z(8,`span`,92),J(9),B()(),z(10,`p`,21),A(),z(11,`svg`,30),V(12,`circle`,31)(13,`path`,32),B(),ps(),z(14,`span`)(15,`strong`),J(16,`DI from source scan (static analysis).`),B(),J(17,` Connect the overlay on Angular 20 or later to see the live injector tree. `),B()(),P(18,NF,7,1,`div`,25)(19,RF,3,0,`div`,93)}if(e&2){let e=K(),t=n_(3);M(5),R(`value`,e.query()),M(2),R(`ngTemplateOutlet`,t),M(2),Z(` `,e.sourceMatchCount(),` of `,e.sourceProviders().length,` `),M(9),F(e.groupedProviders().length===0?18:19)}}var BF=`inj-null`,VF=12,HF=600,UF={component:`var(--accent-text)`,directive:`var(--directive)`,environment:`var(--ok-text)`,null:`var(--text-3)`};function WF(e){return e.injector.type===`element`?e.injector.component?`component`:`directive`:`environment`}function GF(e){return e.injector.type===`element`?`<${e.injector.name}>`:e.injector.name}function KF(e){return Array.isArray(e)}var qF=class e{rpc=$(null);injector=E(xs);nullId=BF;hostPage=eE();treeState=j(null);pageTitles=j({});chosenPageId=j(null);treePages=Q(()=>{let e=this.treeState();if(!e)return{};let t=e.pages&&typeof e.pages==`object`?e.pages:{};return Object.keys(t).length||this.hostPage?t:{"":e}});shownPageId=Tv({source:()=>({pages:this.treePages(),chosen:this.chosenPageId()}),computation:({pages:e,chosen:t},n)=>{let r={};for(let[t,n]of Object.entries(e))r[t]={pageId:t,reportedAt:typeof n?.reportedAt==`number`?n.reportedAt:0};return tE(r,{chosen:t,host:this.hostPage,previous:n?.value??null})}});shownPage=Q(()=>{let e=this.shownPageId();return e===null?null:this.treePages()[e]??null});roots=Q(()=>{let e=this.shownPage()?.roots;return KF(e)?e:[]});environment=Q(()=>{let e=this.shownPage()?.environment;return KF(e)?e:[]});truncated=Q(()=>this.shownPage()?.truncated===!0);zone=Q(()=>{let e=this.shownPage()?.zone;return typeof e==`string`?nD(e):null});multiPage=Q(()=>!this.hostPage&&Object.keys(this.treePages()).length>1);pageOptions=Q(()=>{if(!this.multiPage())return[];let e=this.pageTitles();return Object.keys(this.treePages()).map(t=>{let n=e[t];return{value:t,label:n?.title||n?.url||`Page ${t}`,hint:n?.url}})});pageKey=Q(()=>this.shownPageId()??``);perPage(e){let t=new Map;return Tv({source:this.pageKey,computation:(n,r)=>(r&&t.set(r.source,r.value),t.has(n)?t.get(n):e())})}sourceProviders=j([]);loaded=j(!1);view=j(`element`);query=j(``);queryInput=Rv(`queryInput`);onlyProviding=j(!1);componentsOnly=j(!0);collapsed=this.perPage(()=>new Set);selectedId=this.perPage(()=>null);focusId=this.perPage(()=>null);announcement=j(``);selectedLabel=this.perPage(()=>null);wasGone=!1;index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.injector.id,a),i&&t.set(a.injector.id,i),n(a.children,a.injector.id)};return n(this.roots(),null),n(this.environment(),null),{map:e,parents:t}});elementCount=Q(()=>this.count(this.roots()));environmentCount=Q(()=>this.count(this.environment()));visible=Q(()=>{let e=this.view()===`element`?this.roots():this.environment();this.view()===`element`&&this.componentsOnly()&&(e=this.prune(e,e=>!!e.injector.component)),this.onlyProviding()&&(e=this.prune(e,e=>e.providers.length>0));let t=this.normalizedQuery();return t&&(e=this.prune(e,e=>this.nodeMatches(e,t))),e});rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.normalizedQuery(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.injector.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.visible(),0),e});selected=Q(()=>{let e=this.selectedId();return e?this.index().map.get(e)??null:this.rows()[0]?.node??null});gone=Q(()=>{let e=this.selectedId();return e&&!this.index().map.has(e)?this.selectedLabel()??`The injector`:null});rovingId=Q(()=>{let e=this.rows(),t=this.focusId()??this.selected()?.injector.id;return t&&e.some(e=>e.node.injector.id===t)?t:e[0]?.node.injector.id??null});path=Q(()=>{let e=this.selected();if(!e)return[];let{map:t,parents:n}=this.index(),r=e.injector.path??[];if(!r.length){r=[e.injector.id];let t=n.get(e.injector.id);for(;t;)r.push(t),t=n.get(t);r.push(BF)}return r.map(e=>{let n=t.get(e);return{id:e,label:n?GF(n):e===BF?`Null injector`:`Not listed`,kind:n?WF(n):`null`,providers:n?.providers.length??0}})});providerHits=Q(()=>{let e=this.normalizedQuery();if(!e)return[];let t=[];for(let n of this.index().map.values()){let r=n.providers.filter(t=>t.token.toLowerCase().includes(e));r.length&&t.push({id:n.injector.id,label:GF(n),kind:WF(n),tokens:r.map(e=>e.token).join(`, `)})}return t});providedBy=Q(()=>this.providerHits().slice(0,VF));providedByMore=Q(()=>Math.max(0,this.providerHits().length-VF));groupedProviders=Q(()=>{let e=this.normalizedQuery(),t=e?this.sourceProviders().filter(t=>t.token.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):this.sourceProviders(),n=[{type:`root-provider`,label:`Root Providers (provide*)`,items:[]},{type:`injectable`,label:`Injectable Services`,items:[]},{type:`injection`,label:`inject() Calls`,items:[]},{type:`provider`,label:`Component Providers`,items:[]}];for(let e of t)n.find(t=>t.type===e.type)?.items.push(e);return n.filter(e=>e.items.length>0)});sourceMatchCount=Q(()=>this.groupedProviders().reduce((e,t)=>e+t.items.length,0));searchSummary=Q(()=>{let e=this.query().trim();if(!e)return``;let t=this.providerHits().length;return t===1?`1 injector provides “${e}”.`:t>1?`${t} injectors provide “${e}”.`:this.rows().length?`No injector provides “${e}”.`:`Nothing here matches “${e}”.`});normalizedQuery=Q(()=>this.query().trim().toLowerCase());destroyRef=E(Cs);stopTree=null;treeLoad=0;lastSearchMessage=``;constructor(){uc(e=>{let t=this.searchSummary();if(!t){this.lastSearchMessage=``;return}if(t===this.lastSearchMessage)return;let n=setTimeout(()=>{this.lastSearchMessage=t,this.announcement.set(t)},HF);e(()=>clearTimeout(n))}),uc(()=>{let e=this.rpc();e&&(this.loadInjectorTree(e),this.loadSourceProviders(e))}),uc(e=>{let t=this.rpc();if(!t||!this.multiPage())return;let n=!0,r=null;e(()=>{n=!1,r?.()}),t.scope(`pangular`).rpc.sharedState(`component-tree`).then(e=>{if(!n)return;let t=e=>{let t=e?.pages;this.pageTitles.set(t&&typeof t==`object`?t:{})};t(e.value()),r=e.on(`updated`,t)}).catch(()=>{})}),this.destroyRef.onDestroy(()=>{this.stopTree?.(),this.highlight(null)})}clearQuery(){this.query.set(``),this.queryInput()?.nativeElement.focus()}label(e){return GF(e)}kind(e){return WF(e)}tone(e){return UF[e]??UF.null}kindById(e){let t=this.index().map.get(e);return t?WF(t):`null`}labelById(e){let t=this.index().map.get(e);return t?GF(t):e===BF?`Null injector`:`not listed`}capital(e){return e.charAt(0).toUpperCase()+e.slice(1)}matches(e){let t=this.normalizedQuery();return!!t&&e.toLowerCase().includes(t)}setView(e){this.view()!==e&&(this.view.set(e),this.choose(null),this.focusId.set(null))}select(e){this.choose(e),this.focusId.set(e)}choose(e){let t=e?this.index().map.get(e):void 0;this.selectedId.set(e),this.selectedLabel.set(t?GF(t):null),this.wasGone=!1}syncGone(){let e=this.gone()!==null;if(e&&!this.wasGone){let e=`The selected injector is no longer on the page.`;this.announcement.update(t=>t===e?`${e}\u00a0`:e)}this.wasGone=e}selectPage(e){if(!e||e===this.shownPageId())return;this.chosenPageId.set(e),this.wasGone=this.gone()!==null;let t=this.pageOptions().find(t=>t.value===e)?.label??e;this.announcement.set(`Showing the injectors of ${t}.`)}notePageGone(e){let t=this.chosenPageId();if(!t||e?.[t])return;let n=this.pageOptions().find(e=>e.value===t)?.label??`The chosen page`;this.chosenPageId.set(null),this.announcement.set(`${n} closed, so this shows another page.`),this.wasGone=!0}toggle(e,t){t?.stopPropagation(),!this.normalizedQuery()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}reveal(e){let t=this.index().map.get(e);if(!t)return;this.setView(t.injector.type===`element`?`element`:`environment`);let{parents:n}=this.index();this.collapsed.update(t=>{let r=new Set(t),i=n.get(e);for(;i;)r.delete(i),i=n.get(i);return r}),this.onlyProviding()&&t.providers.length===0&&this.onlyProviding.set(!1),t.injector.type===`element`&&!t.injector.component&&this.componentsOnly.set(!1),this.select(e),Id(()=>this.focusRow(e,!1),{injector:this.injector})}highlight(e){let t=this.rpc();if(!t)return;let n=e?.injector.type===`element`?e.injector.selector??null:null,r=n?{pageId:this.shownPageId()||null,selector:n}:null;t.scope(`pangular`).rpc.call(`request-page-highlight`,r).catch(()=>{})}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=this.rovingId(),r=t.findIndex(e=>e.node.injector.id===n),i=Math.max(r,0),a=t[i],o=-1;switch(e.key){case`ArrowDown`:o=Math.min(i+1,t.length-1);break;case`ArrowUp`:o=Math.max(i-1,0);break;case`Home`:o=0;break;case`End`:o=t.length-1;break;case`ArrowRight`:a.hasChildren&&!a.expanded?this.toggle(a.node.injector.id):a.hasChildren&&(o=i+1);break;case`ArrowLeft`:if(a.hasChildren&&a.expanded&&!this.normalizedQuery())this.toggle(a.node.injector.id);else{let e=this.index().parents.get(a.node.injector.id);o=t.findIndex(t=>t.node.injector.id===e)}break;case`Enter`:case` `:this.select(a.node.injector.id);break;default:return}if(e.preventDefault(),o>=0){let e=t[o].node.injector.id;this.focusId.set(e),this.choose(e),queueMicrotask(()=>this.focusRow(e,!0))}}focusRow(e,t){let n=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);n&&(t&&n.focus(),n.scrollIntoView({block:`nearest`}))}clearTree(){this.stopTree?.(),this.stopTree=null}async loadInjectorTree(e){let t=++this.treeLoad;this.clearTree();let n=e.scope(`pangular`),r;try{r=await n.rpc.sharedState(`injector-tree`)}catch{return}if(this.destroyRef.destroyed||this.rpc()!==e||t!==this.treeLoad)return;let i=e=>{let t=e&&typeof e==`object`?e:null;this.notePageGone(t?.pages),this.treeState.set(t),this.syncGone()};i(r.value()),this.clearTree(),this.stopTree=r.on(`updated`,i)}async loadSourceProviders(e){let t=e.scope(`pangular`);try{this.sourceProviders.set(await t.rpc.call(`get-providers`))}catch{this.sourceProviders.set([])}finally{this.loaded.set(!0)}}count(e){return e.reduce((e,t)=>e+1+this.count(t.children),0)}nodeMatches(e,t){let n=e.injector;return n.name.toLowerCase().includes(t)||!!n.component?.toLowerCase().includes(t)||!!n.directives?.some(e=>e.toLowerCase().includes(t))||e.providers.some(e=>e.token.toLowerCase().includes(t))||!!e.dependencies?.some(e=>e.token.toLowerCase().includes(t))}prune(e,t){let n=[];for(let r of e){let e=this.prune(r.children,t);(t(r)||e.length)&&n.push({...r,children:e})}return n}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-di-inspector`]],viewQuery:function(e,t){e&1&&e_(t.queryInput,OP,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:8,vars:2,consts:[[`pagePicker`,``],[`queryInput`,``],[`role`,`status`,1,`sr-only`],[`role`,`status`,1,`state`],[1,`page-picker`],[`id`,`di-page-label`,1,`label-key`],[`labelledBy`,`di-page-label`,3,`valueChange`,`options`,`value`],[1,`intro`],[1,`toolbar`],[`role`,`group`,`aria-label`,`Injector tree`,1,`segmented`],[`type`,`button`,3,`click`],[1,`pill`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a token, component or injector…`,`aria-label`,`Find a token, component or injector`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[3,`ngTemplateOutlet`],[1,`checkbox`],[`type`,`checkbox`,3,`change`,`checked`],[1,`total`],[1,`notice`],[1,`where`],[1,`where`,`muted`],[1,`layout`],[1,`state`],[`role`,`tree`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`di-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`di-detail-title`,1,`detail`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[1,`where-label`],[`type`,`button`,1,`chip`],[1,`more`],[`type`,`button`,1,`chip`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`mono`],[1,`chip-tokens`],[`type`,`button`,1,`link`,3,`click`],[1,`state-title`],[1,`state-hint`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[`aria-hidden`,`true`,1,`kind`],[1,`sr-only`],[1,`name`,`mono`],[1,`sub`],[1,`meta`],[1,`count`],[1,`count`,`provides`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[`d`,`M12 5v14M5 12l7 7 7-7`],[`d`,`M21 8 12 3 3 8v8l9 5 9-5z`],[1,`detail-head`],[`id`,`di-detail-title`,1,`mono`],[1,`state`,`compact`],[`type`,`button`],[1,`badge`],[`aria-label`,`Classes on this element`,1,`classes`],[1,`block`],[1,`hint`],[1,`path`],[3,`current`],[1,`providers`],[1,`empty-line`],[3,`is-component`],[1,`step`,`null`],[`type`,`button`,1,`step`],[1,`hint-inline`],[`type`,`button`,1,`step`,3,`click`],[1,`step-count`],[1,`deps`],[1,`dep`,3,`hit`],[1,`dep`],[1,`dep-main`],[1,`token`,`mono`],[1,`flag`],[1,`dep-meta`],[`type`,`button`,1,`from`],[1,`from`,`absent`],[1,`from`,`missing`],[`type`,`button`,1,`from`,3,`click`],[1,`provider`,3,`hit`],[1,`provider`],[1,`flag`,`kind-flag`],[`aria-hidden`,`true`,1,`spinner`],[`type`,`search`,`placeholder`,`Filter by token or file…`,`aria-label`,`Filter by token or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`total`],[1,`source-providers`],[1,`provider-group`],[1,`section-count`],[`role`,`list`,1,`provider-list`],[1,`provider-card`],[1,`provider-header`],[1,`token`],[1,`provided-in`],[1,`provider-meta`],[1,`as`]],template:function(e,t){e&1&&(z(0,`p`,2),J(1),B(),tg(2,IP,1,1,`ng-template`,null,0,gv),P(4,kF,34,19)(5,AF,4,0,`div`,3)(6,MF,6,1)(7,zF,20,5)),e&2&&(M(),Y(t.announcement()),M(3),F(t.roots().length>0?4:t.loaded()?t.sourceProviders().length===0?6:7:5))},dependencies:[$y,jD],styles:[`[_nghost-%COMP%] {
--%NS%directive: #7cb4ff;
display: block;
color: var(--%NS%text);
@@ -5965,11 +5965,11 @@ button[_ngcontent-%COMP%] {
.provider-meta[_ngcontent-%COMP%] .as[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
-}`]})};function qF(e,t){if(e.pageId!==t.pageId)return!1;let n=e.log.at(-1);if(!n)return!0;let r=t.log.at(-1);if(!r||r.seqe.seq===n.seq);return!i||i.timestamp===n.timestamp}var JF=`@type`,YF=new Set([`undefined`,`number`,`bigint`,`symbol`,`function`,`Date`,`RegExp`,`Error`,`Element`,`Map`,`Set`]);function XF(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&JF in e&&YF.has(e[JF])}function ZF(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function QF(e,t=``){if(e===null)return`null`;if(typeof e==`string`)return JSON.stringify(e);if(typeof e!=`object`)return String(e);let n=t+` `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+QF(e,n)).join(`,
-`)}\n${t}]`:`[]`;if(XF(e)){let r=e;switch(r[JF]){case`undefined`:return`undefined`;case`Date`:return`Date(${r.value})`;case`bigint`:return`${r.value}n`;case`symbol`:return`Symbol(${r.value})`;case`function`:return`ƒ ${r.name}()`;case`Error`:return`${r.name??`Error`}: ${r.message}`;case`Element`:return`<${r.value}>`;case`Map`:{let e=r.entries??[];if(!e.length)return`Map(${r.size}) {}`;let i=e.map(([e,t])=>`${n}${QF(e,n)} => ${QF(t,n)}`);return`Map(${r.size}) {\n${i.join(`,
-`)}\n${t}}`}case`Set`:{let e=r.values??[];return e.length?`Set(${r.size}) {\n${e.map(e=>n+QF(e,n)).join(`,
-`)}\n${t}}`:`Set(${r.size}) {}`}default:return String(r.value??r[JF])}}let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${ZF(e)}: ${QF(t,n)}`).join(`,
-`)}\n${t}}`:`{}`}function $F(e,t=120){let n=QF(e).replace(/\s*\n\s*/g,` `);return n.length>t?`${n.slice(0,t-1)}…`:n}var eI=[`eventDetailHeading`],tI=[`cancelButton`],nI=[`restoreButton`],rI=[`stateTree`],iI=[`filterInput`],aI=[`latestButton`],oI=e=>({selected:e,headingLevel:5,idPrefix:`ngrx-change`}),sI=e=>({selected:e,headingLevel:3,idPrefix:`ngrx-event`}),cI=(e,t)=>t.id,lI=(e,t)=>t.seq,uI=(e,t)=>t.key,dI=(e,t)=>t.name,fI=(e,t)=>t.idsKey,pI=(e,t)=>t.path,mI=(e,t)=>t.kind,hI=(e,t)=>t.name+t.file+t.line;function gI(e,t){if(e&1){let e=W();z(0,`span`,24),J(1,`Page`),B(),z(2,`app-select`,25),G(`valueChange`,function(t){return O(e),k(K().selectPage(t))}),B()}if(e&2){let e=K();M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function _I(e,t){if(e&1&&(z(0,`span`,14),J(1),B()),e&2){let e=K();M(),Y(e.liveStores().length)}}function vI(e,t){if(e&1){let e=W();z(0,`div`,15)(1,`p`,26),J(2,`Could not load the live store state.`),B(),z(3,`p`,27),J(4,`Check that the dev server with Pangular Inspector is still running.`),B(),z(5,`button`,28),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function yI(e,t){e&1&&(z(0,`div`,16)(1,`p`,26),J(2,`No page is reporting NgRx state yet.`),B(),z(3,`p`,27),J(4,` Open the app in a browser. Stores show up here as soon as the page creates them. `),B()())}function bI(e,t){e&1&&(z(0,`p`,26),J(1,`No signal store instance on this page yet.`),B(),z(2,`p`,27),J(3,` A `),z(4,`code`),J(5,`signalStore`),B(),J(6,` is created the first time something injects it. Navigate to a page that uses the store and it appears here. `),B())}function xI(e,t){e&1&&(z(0,`p`,26),J(1,`The @ngrx/store Store was not found on this page.`),B(),z(2,`p`,27),J(3,` Check that `),z(4,`code`),J(5,`provideStore()`),B(),J(6,` or `),z(7,`code`),J(8,`StoreModule.forRoot()`),B(),J(9,` is part of the providers of the running app. `),B())}function SI(e,t){e&1&&(z(0,`p`,26),J(1,`This page has no NgRx store.`),B(),z(2,`p`,27),J(3,` Stores from `),z(4,`code`),J(5,`@ngrx/signals`),B(),J(6,` (`),z(7,`code`),J(8,`signalStore`),B(),J(9,`, `),z(10,`code`),J(11,`signalState`),B(),J(12,`) and `),z(13,`code`),J(14,`@ngrx/store`),B(),J(15,` are listed here once the app creates them. `),B())}function CI(e,t){if(e&1&&(z(0,`div`,16),P(1,bI,7,0)(2,xI,10,0)(3,SI,16,0),B()),e&2){let e=K();M(),F(e.usesSignals()?1:e.usesClassic()?2:3)}}function wI(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,32),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectStore(t.id))}),z(2,`span`,33),V(3,`span`,34),z(4,`span`,35),J(5),B()(),z(6,`span`,36),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.id===n.store()?.id),N(`aria-pressed`,e.id===n.store()?.id),M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.label),M(2),X_(` `,n.kindLabel(e.kind),` · `,e.scope,` · `,n.changeCount(e.id),` `,n.changeCount(e.id)===1?`change`:`changes`,` `)}}function TI(e,t){e&1&&(z(0,`li`,30),J(1,`No stores match this filter.`),B())}function EI(e,t){if(e&1&&(z(0,`span`,40),J(1),B()),e&2){let e=t;R(`title`,e),M(),Y(e)}}function DI(e,t){if(e&1&&(z(0,`span`,39),J(1),B()),e&2){let e=K();M(),Y(e.classic.devtools?`Store DevTools on`:`Store DevTools off`)}}function OI(e,t){if(e&1&&(z(0,`code`),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function kI(e,t){if(e&1&&(z(0,`p`,41),J(1,` Referenced by `),I(2,OI,3,2,null,null,wg),B()),e&2){let e=K();M(2),L(e.signal.references)}}function AI(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function jI(e,t){if(e&1){let e=W();z(0,`div`,42)(1,`p`)(2,`strong`),J(3,`Viewing a past state.`),B(),J(4,` New actions are logged but do not change the state until you go back to the latest state. `),B(),z(5,`button`,56,3),G(`click`,function(){return O(e),k(K(3).backToLatest())}),J(7,` Back to latest `),B(),P(8,AI,2,1,`p`,57),B()}if(e&2){let e=K(3);M(5),R(`disabled`,e.busy()||!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-latest-off`),M(3),F(e.canRestore()?-1:8)}}function MI(e,t){if(e&1&&(z(0,`dt`),J(1),B(),z(2,`dd`)(3,`code`,65),J(4),B()()),e&2){let e=t.$implicit;M(),Y(e.key),M(2),R(`title`,e.full),M(),Y(e.value)}}function NI(e,t){if(e&1&&(z(0,`dl`,60),I(1,MI,5,3,null,null,uI),B()),e&2){let e=K(4);M(),L(e.computedEntries())}}function PI(e,t){e&1&&(z(0,`p`,61),J(1,`No computed signals.`),B())}function FI(e,t){e&1&&(z(0,`span`,67),J(1,`signalMethod`),B())}function II(e,t){e&1&&(z(0,`span`,67),J(1,`rxMethod`),B())}function LI(e,t){if(e&1&&(z(0,`li`,66),J(1),P(2,FI,2,0,`span`,67)(3,II,2,0,`span`,67),z(4,`span`,68),J(5),B()()),e&2){let e=t.$implicit,n=K(5);M(),X(` `,e.name,` `),M(),F(e.signalMethod?2:e.rx?3:-1),M(3),Y_(``,e.calls,` `,e.calls===1?`call`:`calls`,``,n.methodDuration(e))}}function RI(e,t){if(e&1&&(z(0,`ul`,63),I(1,LI,6,5,`li`,66,dI),B()),e&2){let e=K();M(),L(e.methods)}}function zI(e,t){e&1&&(z(0,`p`,61),J(1,`No methods.`),B())}function BI(e,t){if(e&1&&(z(0,`li`,66),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function VI(e,t){if(e&1&&(z(0,`li`,75),J(1),B()),e&2){let e=K().$implicit;R(`title`,K(5).entityOverflowTitle(e.ids,e.count)),M(),X(` +`,e.count-30,` more `)}}function HI(e,t){if(e&1&&(z(0,`code`,65),J(1),B()),e&2){let e=K(2).$implicit,t=K(5);R(`title`,t.prettyText(e.selected)),M(),Y(t.shortText(e.selected))}}function UI(e,t){e&1&&(z(0,`span`,61),J(1,`None selected`),B())}function WI(e,t){if(e&1&&(z(0,`dl`,60)(1,`dt`),J(2,`Selected`),B(),z(3,`dd`),P(4,HI,2,2,`code`,65)(5,UI,2,0,`span`,61),B()()),e&2){let e=K().$implicit;M(4),F(e.selected===void 0?5:4)}}function GI(e,t){if(e&1&&(z(0,`div`,71)(1,`div`,72)(2,`span`,66),J(3),B(),z(4,`span`,73),J(5),B()(),z(6,`ul`,74),I(7,BI,2,1,`li`,66,wg),P(9,VI,2,2,`li`,75),B(),P(10,WI,6,1,`dl`,60),B()),e&2){let e=t.$implicit,n=K(5);M(3),Y(e.collection??`entities`),M(2),Z(``,e.count,` `,e.count===1?`entity`:`entities`),M(),N(`aria-label`,(e.collection??`entities`)+` ids`),M(),L(n.entityIds(e.ids)),M(2),F(e.count>30?9:-1),M(),F(e.selectedId===void 0?-1:10)}}function KI(e,t){if(e&1&&(z(0,`section`,64)(1,`h4`,69),J(2,`Entities`),B(),z(3,`div`,70),I(4,GI,11,6,`div`,71,fI),B()()),e&2){let e=K();M(4),L(e.entities)}}function qI(e,t){if(e&1&&(z(0,`section`,58)(1,`h4`,59),J(2,`Computed`),B(),P(3,NI,3,0,`dl`,60)(4,PI,2,0,`p`,61),z(5,`h4`,62),J(6,`Methods`),B(),P(7,RI,3,0,`ul`,63)(8,zI,2,0,`p`,61),B(),P(9,KI,6,0,`section`,64)),e&2){let e=t,n=K(3);M(3),F(n.computedEntries().length?3:4),M(4),F(e.methods.length?7:8),M(2),F(e.entities?.length?9:-1)}}function JI(e,t){if(e&1&&(z(0,`span`,80),J(1),B()),e&2){let e=t;R(`title`,`Caused by `+K(4).kindLabel(`event`)+`: `+e.type),M(),Y(e.type)}}function YI(e,t){if(e&1&&(z(0,`span`,67),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function XI(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` · `,K(3).formatDuration(e.durationMs),` `)}}function ZI(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,76),G(`click`,function(){let t=O(e).$implicit;return k(K(3).selectChange(t.seq))}),z(2,`span`,77),J(3),B(),z(4,`span`,78)(5,`span`,79),J(6),B(),P(7,JI,2,2,`span`,80),B(),z(8,`span`,81),P(9,YI,2,1,`span`,67),J(10),P(11,XI,1,1),B()()()}if(e&2){let e,n=t.$implicit,r=K(3);M(),q(`selected`,n.seq===r.selectedChangeSeq()),N(`aria-pressed`,n.seq===r.selectedChangeSeq())(`aria-controls`,n.seq===r.selectedChangeSeq()?`ngrx-change-detail`:null),M(2),X(`#`,n.seq),M(2),R(`title`,n.type),M(),Y(n.type),M(),F((e=n.causedByEvent)?7:-1,e),M(2),F(n.origin?9:-1),M(),Z(` `,n.diff.length===0?`no change`:n.diff.length+(n.diff.length===1?` change`:` changes`),` · `,r.formatTime(n.timestamp),` `),M(),F(n.durationMs===void 0?-1:11)}}function QI(e,t){e&1&&J(0,` No entries match this filter. `)}function $I(e,t){e&1&&J(0,` No actions dispatched since the page connected. `)}function eL(e,t){e&1&&J(0,` No state changes yet. Method calls and patchState writes that change the state are recorded here. `)}function tL(e,t){if(e&1&&(z(0,`li`,30),P(1,QI,1,0)(2,$I,1,0)(3,eL,1,0),B()),e&2){let e=K(),t=K(2);M(),F(t.filter()?1:e.classic?2:3)}}function nL(e,t){if(e&1&&(z(0,`div`,54),zg(1,82),B()),e&2){K(3);let e=n_(20);M(),R(`ngTemplateOutlet`,e)(`ngTemplateOutletContext`,sv(2,oI,t))}}function rL(e,t){if(e&1&&V(0,`option`,87),e&2){let e=t.$implicit;R(`value`,e)}}function iL(e,t){if(e&1&&(z(0,`p`,93),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function aL(e,t){if(e&1){let e=W();z(0,`section`,55)(1,`h4`,83),J(2,`Dispatch an action`),B(),z(3,`form`,84),G(`submit`,function(t){return O(e),k(K(3).dispatchAction(t))}),z(4,`label`)(5,`span`),J(6,`Type`),B(),z(7,`input`,85),G(`input`,function(t){return O(e),k(K(3).dispatchType.set(t.target.value))}),B()(),z(8,`datalist`,86),I(9,rL,1,1,`option`,87,wg),B(),z(11,`label`)(12,`span`),J(13,`Payload `),z(14,`span`,88),J(15,`(JSON object, optional)`),B()(),z(16,`textarea`,89),G(`input`,function(t){return O(e),k(K(3).dispatchPayload.set(t.target.value))}),B()(),z(17,`p`,90),J(18),B(),z(19,`div`,91)(20,`button`,92),J(21,` Dispatch `),B()(),P(22,iL,2,1,`p`,93),B()()}if(e&2){let e=K(3);M(7),R(`value`,e.dispatchType()),M(2),L(e.actionTypes()),M(7),R(`value`,e.dispatchPayload()),N(`aria-invalid`,e.payloadError()?`true`:null),M(2),Y(e.payloadError()),M(2),R(`disabled`,e.busy()||!e.canRestore()||!e.dispatchRequest()),N(`aria-describedby`,e.canRestore()?null:`store-dispatch-off`),M(2),F(e.canRestore()?-1:22)}}function oL(e,t){if(e&1){let e=W();z(0,`div`,31)(1,`div`,37)(2,`h3`),J(3),B(),z(4,`div`,38)(5,`span`,39),J(6),B(),z(7,`span`,39),J(8),B(),P(9,EI,2,2,`span`,40),P(10,DI,2,1,`span`,39),B(),P(11,kI,4,0,`p`,41),B(),P(12,jI,9,3,`div`,42),z(13,`div`,43)(14,`section`,44)(15,`div`,45)(16,`h4`,46),J(17,`State`),B(),z(18,`button`,47),G(`click`,function(){return O(e),k(K(2).copyState())}),J(19,` Copy `),B()(),z(20,`pre`,48,2),J(22),B()(),P(23,qI,10,3),B(),z(24,`section`,49)(25,`h4`,50),J(26),z(27,`span`,14),J(28),B()(),V(29,`app-limit-note`,51),z(30,`div`,52)(31,`ul`,53),I(32,ZI,12,12,`li`,null,lI,!1,tL,4,1,`li`,30),B(),P(35,nL,2,4,`div`,54),B()(),P(36,aL,23,7,`section`,55),B()}if(e&2){let e,n,r,i=t,a=K(2);M(3),Y(i.label),M(3),Y(a.kindLabel(i.kind)),M(2),X(`scope: `,i.scope),M(),F((e=i.signal?.declaredIn)?9:-1,e),M(),F(i.classic?10:-1),M(),F(i.signal?.references?.length?11:-1),M(),F(i.classic?.paused?12:-1),M(10),Y(a.stateText()),M(),F((n=i.signal)?23:-1,n),M(3),X(` `,i.classic?`Action log`:`Change log`,` `),M(2),Y(a.storeLog().length),M(),R(`dropped`,a.page()?.dropped??0)(`max`,a.maxLog()),M(2),N(`aria-label`,i.classic?`Actions`:`Changes`),M(),L(a.storeLog()),M(3),F((r=a.changeEntry())?35:-1,r),M(),F(i.classic?36:-1)}}function sL(e,t){if(e&1&&(z(0,`div`,17)(1,`ul`,29),I(2,wI,8,10,`li`,null,cI,!1,TI,2,0,`li`,30),B(),P(5,oL,37,17,`div`,31),B()),e&2){let e,t=K();M(2),L(t.filteredStores()),M(3),F((e=t.store())?5:-1,e)}}function cL(e,t){if(e&1&&(z(0,`code`,100),J(1),B()),e&2){let e=K().$implicit,t=K(2);R(`title`,t.prettyText(e.payload)),M(),Y(t.shortText(e.payload))}}function lL(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,98),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectEvent(t.seq))}),V(2,`span`,34),z(3,`span`,99),J(4),B(),P(5,cL,2,2,`code`,100),z(6,`span`,101),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.seq===n.selectedEventSeq()),N(`aria-pressed`,e.seq===n.selectedEventSeq())(`aria-controls`,e.seq===n.selectedEventSeq()?`ngrx-event-detail`:null),M(),C_(`background`,n.kindColor(`event`)),M(),R(`title`,e.eventType??e.type),M(),Y(e.eventType??e.type),M(),F(e.payload===void 0?-1:5),M(2),Y(n.formatTime(e.timestamp))}}function uL(e,t){e&1&&(z(0,`li`,30),J(1,`No events match this filter.`),B())}function dL(e,t){if(e&1&&(z(0,`div`,97,4),zg(2,82),B()),e&2){K(2);let e=n_(20);M(2),R(`ngTemplateOutlet`,e)(`ngTemplateOutletContext`,sv(2,sI,t))}}function fL(e,t){if(e&1&&(z(0,`section`,19)(1,`div`,12)(2,`h2`,94),J(3,`Events`),B(),z(4,`span`,14),J(5),B()(),z(6,`p`,95),J(7,` Events dispatched through @ngrx/signals/events, across every store on this page. `),B(),z(8,`ul`,96),I(9,lL,8,10,`li`,null,lI,!1,uL,2,0,`li`,30),B(),P(12,dL,3,4,`div`,97),B()),e&2){let e,t=K();M(5),Y(t.pageEvents().length),M(4),L(t.pageEvents()),M(3),F((e=t.eventEntry())?12:-1,e)}}function pL(e,t){if(e&1&&(z(0,`dt`),J(1,`Origin`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().selected,t=K();M(3),Y(t.originText(e.origin))}}function mL(e,t){if(e&1&&(z(0,`dt`),J(1,`Duration`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().selected,t=K();M(3),Y(t.formatDuration(e.durationMs))}}function hL(e,t){if(e&1&&(z(0,`dt`),J(1,`Action`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.action))}}function gL(e,t){if(e&1&&(z(0,`dt`),J(1,`Arguments`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.args))}}function _L(e,t){if(e&1&&(z(0,`dt`),J(1,`Payload`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.payload))}}function vL(e,t){if(e&1&&(z(0,`pre`,106),J(1),B()),e&2){let e=K(),t=K(2);M(),Y(t.prettyText(e.payload))}}function yL(e,t){if(e&1&&(z(0,`dt`),J(1,`Caused by event`),B(),z(2,`dd`)(3,`code`,107),J(4),B(),P(5,vL,2,1,`pre`,106),B()),e&2){let e=t;M(4),Y(e.type),M(),F(e.payload===void 0?-1:5)}}function bL(e,t){if(e&1){let e=W();z(0,`button`,112),G(`click`,function(){O(e);let t=K(2).selected;return k(K().copyDiff(t))}),J(1,` Copy `),B()}if(e&2){let e=K(2).selected;N(`aria-label`,`Copy the state diff of #`+e.seq)}}function xL(e,t){if(e&1&&(z(0,`code`,117),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),Y(t.shortText(e.before))}}function SL(e,t){e&1&&(z(0,`span`,119),J(1,`→`),B(),z(2,`span`,120),J(3,`became`),B())}function CL(e,t){if(e&1&&(z(0,`code`,118),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),Y(t.shortText(e.after))}}function wL(e,t){if(e&1&&(z(0,`li`)(1,`span`,114),J(2),B(),z(3,`code`,115),J(4),B(),z(5,`span`,116),P(6,xL,2,1,`code`,117),P(7,SL,4,0),P(8,CL,2,1,`code`,118),B()()),e&2){let e=t.$implicit,n=K(4);w_(`diff-row `+e.op),M(2),Y(n.opLabel(e.op)),M(2),Y(e.path),M(2),F(e.op===`add`?-1:6),M(),F(e.op===`change`?7:-1),M(),F(e.op===`remove`?-1:8)}}function TL(e,t){if(e&1&&(z(0,`ul`,111),I(1,wL,9,7,`li`,113,pI),B()),e&2){let e=K(2).selected;M(),L(e.diff)}}function EL(e,t){e&1&&(z(0,`p`,61),J(1,`The state did not change.`),B())}function DL(e,t){if(e&1&&(z(0,`div`,108)(1,`div`,109),J(2,`State diff`),B(),P(3,bL,2,1,`button`,110),B(),P(4,TL,3,0,`ul`,111)(5,EL,2,0,`p`,61)),e&2){let e=K(),t=e.selected,n=e.headingLevel;M(),N(`aria-level`,n+1),M(2),F(t.diff.length?3:-1),M(),F(t.diff.length?4:5)}}function OL(e,t){if(e&1&&J(0),e&2){let e=K(2).selected;X(` Store DevTools jumps the app state to the state right after action #`,e.seq,`. Until you go back to the latest state, new actions are logged but do not change the state. `)}}function kL(e,t){if(e&1&&J(0),e&2){let e=K(3).selected;Z(` This sets every state key of `,t.label,` back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function AL(e,t){if(e&1&&J(0),e&2){let e=K(3).selected;X(` This sets every state key of the store back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function jL(e,t){if(e&1&&P(0,kL,1,2)(1,AL,1,1),e&2){let e;F((e=K(3).store())?0:1,e)}}function ML(e,t){if(e&1){let e=W();z(0,`div`,121),G(`keydown.escape`,function(t){return O(e),k(K(2).cancelRestore(t))}),z(1,`p`,122),P(2,OL,1,1)(3,jL,2,1),B(),z(4,`div`,91)(5,`button`,56),G(`click`,function(){O(e);let t=K().selected;return k(K().restore(t.seq,t.source===`store`))}),J(6,` Restore `),B(),z(7,`button`,28,5),G(`click`,function(){return O(e),k(K(2).cancelRestore())}),J(9,` Cancel `),B()()()}if(e&2){let e=K(),t=e.selected,n=e.idPrefix,r=K();N(`aria-labelledby`,n+`-confirm-text`),M(),R(`id`,n+`-confirm-text`),M(),F(t.source===`store`?2:3),M(3),R(`disabled`,r.busy())}}function NL(e,t){if(e&1){let e=W();z(0,`button`,127,6),G(`click`,function(){O(e);let t=K(2).selected;return k(K().askRestore(t.seq))}),J(2,` Restore this state `),B()}if(e&2){let e=K(2).idPrefix,t=K();R(`disabled`,!t.canRestore()),N(`aria-describedby`,t.canRestore()?null:e+`-writes-off`)}}function PL(e,t){if(e&1){let e=W();z(0,`button`,128),G(`click`,function(){O(e);let t=K(2).selected;return k(K().dispatchAgain(t.seq))}),J(1,` Dispatch again `),B()}if(e&2){let e=K(2).idPrefix,t=K();R(`disabled`,t.busy()||!t.canRestore()),N(`aria-describedby`,t.canRestore()?null:e+`-writes-off`)}}function FL(e,t){if(e&1&&(z(0,`p`,126),J(1),B()),e&2){let e=K(2).idPrefix,t=K();R(`id`,e+`-writes-off`),M(),Y(t.restoreOff)}}function IL(e,t){if(e&1&&(z(0,`div`,123),P(1,NL,3,2,`button`,124),P(2,PL,2,2,`button`,125),B(),P(3,FL,2,2,`p`,126)),e&2){let e=K().selected,t=K();M(),F(e.restorable?1:-1),M(),F(t.canAgain(e)?2:-1),M(),F(t.canRestore()?-1:3)}}function LL(e,t){e&1&&(J(0,` Store DevTools no longer holds this action, so this state cannot be restored. It was dropped past `),z(1,`code`),J(2,`maxAge`),B(),J(3,`, or the Store DevTools history was committed, reset or imported. `))}function RL(e,t){e&1&&(J(0,` Store DevTools never recorded this action, so this state cannot be restored. An `),z(1,`code`),J(2,`actionsBlocklist`),B(),J(3,`, `),z(4,`code`),J(5,`actionsSafelist`),B(),J(6,` or `),z(7,`code`),J(8,`predicate`),B(),J(9,` option filtered it out, or recording was paused. `))}function zL(e,t){e&1&&(J(0,` Time travel for @ngrx/store needs `),z(1,`code`),J(2,`provideStoreDevtools()`),B(),J(3,`. Without it, entries cannot be restored. `))}function BL(e,t){if(e&1&&(z(0,`p`,105),P(1,LL,4,0)(2,RL,10,0)(3,zL,4,0),B()),e&2){let e=K().selected;M(),F(e.unrestorable===`dropped`?1:e.unrestorable===`not-recorded`?2:3)}}function VL(e,t){if(e&1&&(z(0,`section`,102)(1,`div`,103),J(2),B(),z(3,`dl`,60)(4,`dt`),J(5,`Time`),B(),z(6,`dd`),J(7),B(),P(8,pL,4,1),P(9,mL,4,1),P(10,hL,5,1),P(11,gL,5,1),P(12,_L,5,1),P(13,yL,6,2),B(),P(14,DL,6,3),P(15,ML,10,4,`div`,104),P(16,IL,4,3),P(17,BL,4,1,`p`,105),B()),e&2){let e,n=t.selected,r=t.headingLevel,i=t.idPrefix,a=K();N(`aria-labelledby`,i+`-entry-heading`),M(),R(`id`,i+`-entry-heading`),N(`aria-level`,r),M(),Z(` #`,n.seq,` `,n.type,` `),M(5),Y(a.formatTime(n.timestamp)),M(),F(n.origin?8:-1),M(),F(n.durationMs===void 0?-1:9),M(),F(n.action===void 0?-1:10),M(),F(n.args?.length?11:-1),M(),F(n.source===`event`&&n.payload!==void 0?12:-1),M(),F((e=n.causedByEvent)?13:-1,e),M(),F(n.source===`event`?-1:14),M(),F(n.restorable&&a.confirmSeq()===n.seq?15:-1),M(),F(a.confirmSeq()!==n.seq&&(n.restorable||a.canAgain(n))?16:-1),M(),F(!n.restorable&&n.source===`store`?17:-1)}}function HL(e,t){if(e&1&&(z(0,`span`,14),J(1),B()),e&2){let e=K();M(),Y(e.sourceEntries().length)}}function UL(e,t){e&1&&(z(0,`div`,22),V(1,`span`,129),z(2,`p`,26),J(3,`Scanning source for NgRx declarations…`),B()())}function WL(e,t){e&1&&(z(0,`div`,23)(1,`p`,26),J(2,`No NgRx declarations found in source.`),B(),z(3,`p`,27),J(4,` The scan looks for `),z(5,`code`),J(6,`signalStore`),B(),J(7,`, `),z(8,`code`),J(9,`signalState`),B(),J(10,`, `),z(11,`code`),J(12,`signalMethod`),B(),J(13,`, `),z(14,`code`),J(15,`createAction`),B(),J(16,`, `),z(17,`code`),J(18,`createReducer`),B(),J(19,`, `),z(20,`code`),J(21,`createEffect`),B(),J(22,`, `),z(23,`code`),J(24,`createSelector`),B(),J(25,` and `),z(26,`code`),J(27,`createFeature`),B(),J(28,`. `),B()())}function GL(e,t){if(e&1){let e=W();z(0,`button`,131),G(`click`,function(){let t=O(e).$implicit,n=K(2);return k(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,34),z(2,`span`,136),J(3),B(),z(4,`span`,132),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(n.kindLabel(e.kind)),M(2),Y(e.count)}}function KL(e,t){if(e&1&&(z(0,`p`,141),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function qL(e,t){if(e&1&&(z(0,`li`,135)(1,`div`,137),V(2,`span`,34),z(3,`span`,138),J(4),B(),z(5,`span`,39),J(6),B()(),z(7,`div`,139)(8,`span`,140),J(9),B()(),P(10,KL,2,1,`p`,141),B()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.name),M(2),Y(n.kindLabel(e.kind)),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.detail?10:-1)}}function JL(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,22)(2,`p`,26),J(3,`No declarations match.`),B(),z(4,`button`,28),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(5,`Clear filters`),B()()()}}function YL(e,t){if(e&1){let e=W();z(0,`div`,130)(1,`button`,131),G(`click`,function(){return O(e),k(K().kind.set(null))}),J(2,` All `),z(3,`span`,132),J(4),B()(),I(5,GL,6,7,`button`,133,mI),B(),z(7,`ul`,134),I(8,qL,11,8,`li`,135,hI,!1,JL,6,0,`li`),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.sourceEntries().length),M(),L(e.groupedEntries()),M(3),L(e.filteredEntries())}}var XL={action:`#f59e0b`,reducer:`#a78bfa`,effect:`#fb923c`,selector:`#60a5fa`,feature:`#34d399`,"store-setup":`#94a3b8`,"signal-store":`#e879f9`,"signal-state":`#22d3ee`,"signal-method":`#fb7185`,store:`#a78bfa`,event:`var(--warn)`},ZL={"signal-store":`signalStore`,"signal-state":`signalState`,"signal-method":`signalMethod`,"store-setup":`store setup`,store:`@ngrx/store`,event:`event`},QL={dispatch:`store.dispatch(action)`,effect:`NgRx effect (Store.next)`,reactive:`store.dispatch(() => action)`};function $L(e){if(!e.trim())return{};let t;try{t=JSON.parse(e)}catch{return{error:`The payload is not valid JSON.`}}return!t||typeof t!=`object`||Array.isArray(t)?{error:`The payload must be a JSON object, like {"id": 7}.`}:Object.prototype.hasOwnProperty.call(t,`type`)?{error:`The payload cannot have a "type" key. Put the action type in the Type field.`}:{payload:t}}var eR=new Set([`action`,`reducer`,`effect`,`selector`,`feature`,`store-setup`]),tR=class e{rpc=$(null);canRestore=Q(()=>bE(this.rpc(),`ngrx`));restoreOff=KT(`ngrx`);filter=j(``);kind=j(null);sourceEntries=j([]);sourceLoaded=j(!1);pages=j([]);failed=j(!1);selectedPageId=j(null);hostPageId=eE();maxLog=Q(()=>yE(this.rpc()).limits.changeLog);selectedStoreId=j(null);focusEventSeq=j(null);eventDetailHeading=Rv(`eventDetailHeading`);busy=j(!1);focusLatest=j(!1);focusConfirm=j(null);cancelButton=Rv(`cancelButton`);restoreButton=Rv(`restoreButton`);stateTree=Rv(`stateTree`);filterInput=Rv(`filterInput`);latestButton=Rv(`latestButton`);message=j(``);destroyRef=E(Cs);unsubscribe=null;page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.selectedPageId())??e.find(e=>e.pageId===this.hostPageId)??e[0]??null});logKey=Q(()=>{let e=this.page();return{pageId:e?.pageId??null,log:e?.log??[]}});logSession=Tv({source:this.logKey,computation:(e,t)=>t?qF(t.source,e)?t.value:t.value+1:0});selectedChangeSeq=Tv({source:this.logSession,computation:()=>null});selectedEventSeq=Tv({source:this.logSession,computation:()=>null});confirmSeq=Tv({source:this.logSession,computation:()=>null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url,hint:e.url})));liveStores=Q(()=>{let e=this.page();if(!e)return[];let t=e.stores.map(e=>({id:e.id,label:e.name??e.references[0]??e.className,kind:e.kind,scope:e.scope,signal:e}));return e.classic&&t.push({id:`store`,label:`Store`,kind:`store`,scope:e.classic.scope,classic:e.classic}),t});filteredStores=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.liveStores().filter(t=>t.label.toLowerCase().includes(e)||t.kind.includes(e)||(t.signal?.stateKeys??[]).some(t=>t.toLowerCase().includes(e))||(this.page()?.log??[]).some(n=>n.storeId===t.id&&n.type.toLowerCase().includes(e))):this.liveStores()});store=Q(()=>{let e=this.liveStores();return e.find(e=>e.id===this.selectedStoreId())??e[0]??null});stateText=Q(()=>{let e=this.store();return e?QF(e.signal?e.signal.state:e.classic?.state):``});computedEntries=Q(()=>Object.entries(this.store()?.signal?.computed??{}).map(([e,t])=>({key:e,value:$F(t,160),full:QF(t)})));storeLog=Q(()=>{let e=this.store()?.id,t=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(n=>n.storeId===e&&(!t||n.type.toLowerCase().includes(t)||this.storeMatches(t))).reverse()});hasEvents=Q(()=>(this.page()?.log??[]).some(e=>e.source===`event`));pageEvents=Q(()=>{let e=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(t=>t.source===`event`&&(!e||t.type.toLowerCase().includes(e))).slice().reverse()});changeEntry=Q(()=>{let e=this.selectedChangeSeq();return e===null?null:this.storeLog().find(t=>t.seq===e)??null});eventEntry=Q(()=>{let e=this.selectedEventSeq();return e===null?null:this.pageEvents().find(t=>t.seq===e)??null});dispatchType=j(``);dispatchPayload=j(``);actionTypes=Q(()=>{let e=new Set;for(let t of this.sourceEntries())for(let n of t.types??[])e.add(n);for(let t of this.page()?.log??[])t.source===`store`&&t.action!==void 0&&e.add(t.type);return[...e].sort().slice(0,200)});payloadError=Q(()=>$L(this.dispatchPayload()).error??``);dispatchRequest=Q(()=>{let e=this.dispatchType().trim(),{payload:t,error:n}=$L(this.dispatchPayload());return!e||n?null:{type:`dispatch`,action:e,...t?{payload:t}:{}}});usesSignals=Q(()=>this.sourceEntries().some(e=>e.kind===`signal-store`||e.kind===`signal-state`));usesClassic=Q(()=>this.sourceEntries().some(e=>eR.has(e.kind)));filteredEntries=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind();return this.sourceEntries().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.includes(e)||(n.detail??``).toLowerCase().includes(e)))});groupedEntries=Q(()=>{let e=new Map;for(let t of this.sourceEntries())e.set(t.kind,(e.get(t.kind)??0)+1);return[...e.entries()].map(([e,t])=>({kind:e,count:t}))});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),ey(()=>{let e=this.latestButton();e&&this.focusLatest()&&!this.busy()&&(this.focusLatest.set(!1),e.nativeElement.focus())}),uc(()=>{let e=this.focusConfirm(),t=e===`cancel`?this.cancelButton():this.restoreButton();e&&t&&(this.focusConfirm.set(null),t.nativeElement.focus())}),ey(()=>{let e=this.focusEventSeq(),t=this.eventDetailHeading();e!==null&&t&&(this.focusEventSeq.set(null),t.nativeElement.focus())}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}storeMatches(e){let t=this.store();return!!t&&t.label.toLowerCase().includes(e)}async load(e){this.failed.set(!1),iE(e,`get-ngrx-store`).then(e=>this.sourceEntries.set(Array.isArray(e)?e:[])).catch(()=>this.sourceEntries.set([])).finally(()=>this.sourceLoaded.set(!0));try{let t=await e.scope(`pangular`).rpc.sharedState(`ngrx-store`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.pages.set(Array.isArray(t?.pages)?t.pages:[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}}retry(){let e=this.rpc();e&&this.load(e)}selectPage(e){this.selectedPageId.set(e),this.selectedStoreId.set(null),this.selectedChangeSeq.set(null),this.selectedEventSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectStore(e){this.selectedStoreId.set(e),this.selectedChangeSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectChange(e){this.selectedChangeSeq.set(this.selectedChangeSeq()===e?null:e),this.confirmSeq.set(null),this.message.set(``)}copyState(){return this.copyText(this.stateText())}copyDiff(e){return this.copyText(QF(e.diff))}async copyText(e){try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}askRestore(e){this.confirmSeq.set(e),this.focusConfirm.set(`cancel`)}cancelRestore(e){e?.preventDefault(),this.confirmSeq.set(null),this.focusConfirm.set(`restore`)}async restore(e,t){let n=this.page();if(!n)return;this.busy.set(!0),this.focusLatest.set(!1);let r=!1;try{let i=await iE(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:{type:`restore`,seq:e}});this.message.set(i?.error??i?.message??`Restored.`),r=t&&!i?.error&&!!i?.paused}catch{this.message.set(`Could not reach the page to restore the state.`)}finally{this.busy.set(!1),this.confirmSeq.set(null),this.focusLatest.set(r),r||this.stateTree()?.nativeElement.focus()}}selectEvent(e){let t=this.selectedEventSeq()===e?null:e;this.selectedEventSeq.set(t),t!==null&&this.focusEventSeq.set(t)}async backToLatest(){let e=this.page();if(e){this.busy.set(!0);try{let t=await iE(this.rpc(),`request-ngrx-action`,{pageId:e.pageId,request:{type:`latest`}});this.focusLatest.set(!1),this.stateTree()?.nativeElement.focus(),this.message.set(t?.error??t?.message??`Back on the latest state.`)}catch{this.message.set(`Could not reach the page to go back to the latest state.`)}finally{this.busy.set(!1)}}}canAgain(e){return e.source===`store`&&e.action!==void 0}async dispatchAction(e){e.preventDefault();let t=this.dispatchRequest();t&&await this.send(t,`Could not reach the page to dispatch the action.`)}dispatchAgain(e){return this.send({type:`dispatch-again`,seq:e},`Could not reach the page to dispatch the action again.`)}async send(e,t){let n=this.page();if(!n||this.busy())return;let r=this.logSession();this.busy.set(!0);try{let t=await iE(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:e});this.message.set(t?.error??t?.message??`Dispatched.`),t?.entry&&this.logSession()===r&&(this.selectedStoreId.set(`store`),this.selectedChangeSeq.set(t.entry.seq))}catch{this.message.set(t)}finally{this.busy.set(!1)}}clearFilters(){this.filter.set(``),this.kind.set(null),this.filterInput()?.nativeElement.focus()}changeCount(e){return(this.page()?.log??[]).filter(t=>t.storeId===e).length}entityIds(e){return e.slice(0,30)}entityOverflowTitle(e,t){let n=e.slice(30).join(`, `);return t>e.length?`${n} (first ${e.length} of ${t} shown)`:n}kindColor(e){return XL[e]??`var(--text-3)`}kindLabel(e){return ZL[e]??e}originText(e){return QL[e]??e}opLabel(e){return e===`add`?`added`:e===`remove`?`removed`:`changed`}prettyText(e){return QF(e)}shortText(e){return $F(e)}formatTime=zD;formatDuration(e){return e<=0?`<1ms`:`${Math.round(e)}ms`}methodDuration(e){let t=[];return e.avgDurationMs!==void 0&&t.push(`avg ${this.formatDuration(e.avgDurationMs)}`),e.lastDurationMs!==void 0&&t.push(`last ${this.formatDuration(e.lastDurationMs)}`),t.length?` · ${t.join(` · `)}`:``}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-store-inspector`]],viewQuery:function(e,t){e&1&&e_(t.eventDetailHeading,eI,5)(t.cancelButton,tI,5)(t.restoreButton,nI,5)(t.stateTree,rI,5)(t.filterInput,iI,5)(t.latestButton,aI,5),e&2&&t_(6)},inputs:{rpc:[1,`rpc`]},decls:29,vars:11,consts:[[`filterInput`,``],[`entryDetailTpl`,``],[`stateTree`,``],[`latestButton`,``],[`eventDetailHeading`,``],[`cancelButton`,``],[`restoreButton`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter stores, changes and declarations…`,`aria-label`,`Filter stores, changes and source declarations`,3,`input`,`keydown.escape`,`value`],[1,`status`],[`aria-hidden`,`true`,1,`live-dot`],[`aria-labelledby`,`ngrx-live-heading`,1,`block`],[1,`section-head`],[`id`,`ngrx-live-heading`],[1,`pill`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`live-layout`],[`role`,`status`,1,`message`],[`aria-labelledby`,`ngrx-events-heading`,1,`block`],[`aria-labelledby`,`ngrx-source-heading`,1,`block`],[`id`,`ngrx-source-heading`],[`role`,`status`,1,`empty`,`compact`],[1,`empty`,`compact`],[`id`,`ngrx-page-label`,1,`visually-hidden`],[`labelledBy`,`ngrx-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`hint`],[`type`,`button`,1,`btn`,3,`click`],[`aria-label`,`Stores on this page`,1,`store-list`],[1,`muted`,`pad`],[1,`store-detail`],[`type`,`button`,1,`store-item`,3,`click`],[1,`store-top`],[`aria-hidden`,`true`,1,`dot`],[1,`store-name`],[1,`store-meta`],[1,`detail-head`],[1,`chips`],[1,`chip`],[1,`chip`,`mono`,3,`title`],[1,`refs`],[1,`paused`],[1,`facts`],[`aria-labelledby`,`ngrx-state-heading`,1,`fact`],[1,`fact-head`],[`id`,`ngrx-state-heading`],[`type`,`button`,`aria-label`,`Copy state`,1,`btn`,`copy`,3,`click`],[`tabindex`,`0`,`aria-labelledby`,`ngrx-state-heading`,1,`tree`],[`aria-labelledby`,`ngrx-log-heading`,1,`log`],[`id`,`ngrx-log-heading`],[`what`,`changes on this page`,`limit`,`changeLog`,3,`dropped`,`max`],[1,`log-layout`],[1,`log-list`],[`id`,`ngrx-change-detail`],[`aria-labelledby`,`ngrx-dispatch-heading`,1,`dispatch`],[`type`,`button`,1,`btn`,`primary`,3,`click`,`disabled`],[`id`,`store-latest-off`,1,`hint`,`small`],[`aria-labelledby`,`ngrx-computed-heading`,1,`fact`],[`id`,`ngrx-computed-heading`],[1,`kv`],[1,`muted`],[`id`,`ngrx-methods-heading`,1,`spaced`],[`aria-labelledby`,`ngrx-methods-heading`,1,`methods`],[`aria-labelledby`,`ngrx-entities-heading`,1,`fact`],[3,`title`],[1,`chip`,`mono`],[1,`tag`],[1,`calls`],[`id`,`ngrx-entities-heading`],[1,`entities`],[1,`entity-group`],[1,`entity-head`],[1,`entity-count`],[1,`chips`,`entity-ids`],[1,`chip`,`more`,3,`title`],[`type`,`button`,1,`log-item`,3,`click`],[1,`seq`],[1,`log-type-row`],[1,`log-type`,3,`title`],[1,`tag`,3,`title`],[1,`log-meta`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`id`,`ngrx-dispatch-heading`],[1,`dispatch-form`,3,`submit`],[`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`list`,`ngrx-action-types`,`placeholder`,`e.g. [Cart] Add Item`,3,`input`,`value`],[`id`,`ngrx-action-types`],[3,`value`],[1,`optional`],[`rows`,`3`,`spellcheck`,`false`,`placeholder`,`e.g. {"id": 7}`,`aria-describedby`,`ngrx-payload-error`,3,`input`,`value`],[`id`,`ngrx-payload-error`,1,`field-error`],[1,`actions`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`id`,`store-dispatch-off`,1,`hint`,`small`],[`id`,`ngrx-events-heading`],[1,`intro`],[`aria-label`,`Dispatched events`,1,`events-list`],[`id`,`ngrx-event-detail`,`tabindex`,`-1`,1,`event-detail-focus`],[`type`,`button`,1,`event-item`,3,`click`],[1,`event-type`,`mono`,3,`title`],[1,`event-payload`,3,`title`],[1,`event-time`],[1,`entry`],[`role`,`heading`,1,`entry-heading`,3,`id`],[`role`,`group`,1,`confirm`],[1,`hint`,`small`],[1,`code`],[1,`mono`],[1,`sub-head`],[`role`,`heading`,1,`sub`],[`type`,`button`,1,`btn`,`copy`],[1,`diff`],[`type`,`button`,1,`btn`,`copy`,3,`click`],[3,`class`],[1,`op`],[1,`path`],[1,`values`],[1,`before`],[1,`after`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[`role`,`group`,1,`confirm`,3,`keydown.escape`],[3,`id`],[1,`entry-actions`],[`type`,`button`,1,`btn`,`restore`,3,`disabled`],[`type`,`button`,1,`btn`,3,`disabled`],[1,`hint`,`small`,3,`id`],[`type`,`button`,1,`btn`,`restore`,3,`click`,`disabled`],[`type`,`button`,1,`btn`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`spinner`],[`role`,`group`,`aria-label`,`Filter declarations by kind`,1,`kinds`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[1,`nodes`],[1,`node-card`],[1,`chip-text`],[1,`node-header`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[1,`detail`]],template:function(e,t){e&1&&(z(0,`div`,7)(1,`input`,8,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),P(3,gI,3,2),z(4,`span`,9),V(5,`span`,10),J(6),B()(),z(7,`section`,11)(8,`div`,12)(9,`h2`,13),J(10,`Live stores`),B(),P(11,_I,2,1,`span`,14),B(),P(12,vI,7,0,`div`,15)(13,yI,5,0,`div`,16)(14,CI,4,1,`div`,16)(15,sL,6,2,`div`,17),z(16,`p`,18),J(17),B()(),P(18,fL,13,3,`section`,19),tg(19,VL,18,16,`ng-template`,null,1,gv),z(21,`section`,20)(22,`div`,12)(23,`h2`,21),J(24,`Source declarations`),B(),P(25,HL,2,1,`span`,14),B(),P(26,UL,4,0,`div`,22)(27,WL,29,0,`div`,23)(28,YL,11,5),B()),e&2&&(M(),R(`value`,t.filter()),M(2),F(t.pages().length>1?3:-1),M(),q(`on`,!!t.page()),M(2),X(` `,t.page()?`Live`:`No page connected`,` `),M(5),F(t.liveStores().length?11:-1),M(),F(t.failed()?12:t.page()?t.liveStores().length?15:14:13),M(5),Y(t.message()),M(),F(t.hasEvents()?18:-1),M(7),F(t.sourceEntries().length?25:-1),M(),F(t.sourceLoaded()?t.sourceEntries().length===0?27:28:26))},dependencies:[WD,jD,$y],styles:[`[_nghost-%COMP%] {
+}`]})},JF=1e3;function YF(e){return`${e>=1e3?`${JF}+`:String(e)} more ${e===1?`change`:`changes`} not shown`}function XF(e){let t=e.diffTruncated??0,n=e.diff.length+t;return n===0?`no change`:`${t>=1e3?`${n}+`:String(n)} ${n===1?`change`:`changes`}`}function ZF(e,t){if(e.pageId!==t.pageId)return!1;let n=e.log.at(-1);if(!n)return!0;let r=t.log.at(-1);if(!r||r.seqe.seq===n.seq);return!i||i.timestamp===n.timestamp}var QF=`@type`,$F=new Set([`undefined`,`number`,`bigint`,`symbol`,`function`,`Date`,`RegExp`,`Error`,`Element`,`Map`,`Set`]);function eI(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&QF in e&&$F.has(e[QF])}function tI(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function nI(e,t=``){if(e===null)return`null`;if(typeof e==`string`)return JSON.stringify(e);if(typeof e!=`object`)return String(e);let n=t+` `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+nI(e,n)).join(`,
+`)}\n${t}]`:`[]`;if(eI(e)){let r=e;switch(r[QF]){case`undefined`:return`undefined`;case`Date`:return`Date(${r.value})`;case`bigint`:return`${r.value}n`;case`symbol`:return`Symbol(${r.value})`;case`function`:return`ƒ ${r.name}()`;case`Error`:return`${r.name??`Error`}: ${r.message}`;case`Element`:return`<${r.value}>`;case`Map`:{let e=r.entries??[];if(!e.length)return`Map(${r.size}) {}`;let i=e.map(([e,t])=>`${n}${nI(e,n)} => ${nI(t,n)}`);return`Map(${r.size}) {\n${i.join(`,
+`)}\n${t}}`}case`Set`:{let e=r.values??[];return e.length?`Set(${r.size}) {\n${e.map(e=>n+nI(e,n)).join(`,
+`)}\n${t}}`:`Set(${r.size}) {}`}default:return String(r.value??r[QF])}}let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${tI(e)}: ${nI(t,n)}`).join(`,
+`)}\n${t}}`:`{}`}function rI(e,t=120){let n=nI(e).replace(/\s*\n\s*/g,` `);return n.length>t?`${n.slice(0,t-1)}…`:n}var iI=[`eventDetailHeading`],aI=[`cancelButton`],oI=[`restoreButton`],sI=[`stateTree`],cI=[`filterInput`],lI=[`latestButton`],uI=e=>({selected:e,headingLevel:5,idPrefix:`ngrx-change`}),dI=e=>({selected:e,headingLevel:3,idPrefix:`ngrx-event`}),fI=(e,t)=>t.id,pI=(e,t)=>t.seq,mI=(e,t)=>t.key,hI=(e,t)=>t.name,gI=(e,t)=>t.idsKey,_I=(e,t)=>t.path,vI=(e,t)=>t.kind,yI=(e,t)=>t.name+t.file+t.line;function bI(e,t){if(e&1){let e=W();z(0,`span`,24),J(1,`Page`),B(),z(2,`app-select`,25),G(`valueChange`,function(t){return O(e),k(K().selectPage(t))}),B()}if(e&2){let e=K();M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function xI(e,t){if(e&1&&(z(0,`span`,14),J(1),B()),e&2){let e=K();M(),Y(e.liveStores().length)}}function SI(e,t){if(e&1){let e=W();z(0,`div`,15)(1,`p`,26),J(2,`Could not load the live store state.`),B(),z(3,`p`,27),J(4,`Check that the dev server with Pangular Inspector is still running.`),B(),z(5,`button`,28),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function CI(e,t){e&1&&(z(0,`div`,16)(1,`p`,26),J(2,`No page is reporting NgRx state yet.`),B(),z(3,`p`,27),J(4,` Open the app in a browser. Stores show up here as soon as the page creates them. `),B()())}function wI(e,t){e&1&&(z(0,`p`,26),J(1,`No signal store instance on this page yet.`),B(),z(2,`p`,27),J(3,` A `),z(4,`code`),J(5,`signalStore`),B(),J(6,` is created the first time something injects it. Navigate to a page that uses the store and it appears here. `),B())}function TI(e,t){e&1&&(z(0,`p`,26),J(1,`The @ngrx/store Store was not found on this page.`),B(),z(2,`p`,27),J(3,` Check that `),z(4,`code`),J(5,`provideStore()`),B(),J(6,` or `),z(7,`code`),J(8,`StoreModule.forRoot()`),B(),J(9,` is part of the providers of the running app. `),B())}function EI(e,t){e&1&&(z(0,`p`,26),J(1,`This page has no NgRx store.`),B(),z(2,`p`,27),J(3,` Stores from `),z(4,`code`),J(5,`@ngrx/signals`),B(),J(6,` (`),z(7,`code`),J(8,`signalStore`),B(),J(9,`, `),z(10,`code`),J(11,`signalState`),B(),J(12,`) and `),z(13,`code`),J(14,`@ngrx/store`),B(),J(15,` are listed here once the app creates them. `),B())}function DI(e,t){if(e&1&&(z(0,`div`,16),P(1,wI,7,0)(2,TI,10,0)(3,EI,16,0),B()),e&2){let e=K();M(),F(e.usesSignals()?1:e.usesClassic()?2:3)}}function OI(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,32),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectStore(t.id))}),z(2,`span`,33),V(3,`span`,34),z(4,`span`,35),J(5),B()(),z(6,`span`,36),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.id===n.store()?.id),N(`aria-pressed`,e.id===n.store()?.id),M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.label),M(2),X_(` `,n.kindLabel(e.kind),` · `,e.scope,` · `,n.changeCount(e.id),` `,n.changeCount(e.id)===1?`change`:`changes`,` `)}}function kI(e,t){e&1&&(z(0,`li`,30),J(1,`No stores match this filter.`),B())}function AI(e,t){if(e&1&&(z(0,`span`,40),J(1),B()),e&2){let e=t;R(`title`,e),M(),Y(e)}}function jI(e,t){if(e&1&&(z(0,`span`,39),J(1),B()),e&2){let e=K();M(),Y(e.classic.devtools?`Store DevTools on`:`Store DevTools off`)}}function MI(e,t){if(e&1&&(z(0,`code`),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function NI(e,t){if(e&1&&(z(0,`p`,41),J(1,` Referenced by `),I(2,MI,3,2,null,null,wg),B()),e&2){let e=K();M(2),L(e.signal.references)}}function PI(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function FI(e,t){if(e&1){let e=W();z(0,`div`,42)(1,`p`)(2,`strong`),J(3,`Viewing a past state.`),B(),J(4,` New actions are logged but do not change the state until you go back to the latest state. `),B(),z(5,`button`,56,3),G(`click`,function(){return O(e),k(K(3).backToLatest())}),J(7,` Back to latest `),B(),P(8,PI,2,1,`p`,57),B()}if(e&2){let e=K(3);M(5),R(`disabled`,e.busy()||!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-latest-off`),M(3),F(e.canRestore()?-1:8)}}function II(e,t){if(e&1&&(z(0,`dt`),J(1),B(),z(2,`dd`)(3,`code`,65),J(4),B()()),e&2){let e=t.$implicit;M(),Y(e.key),M(2),R(`title`,e.full),M(),Y(e.value)}}function LI(e,t){if(e&1&&(z(0,`dl`,60),I(1,II,5,3,null,null,mI),B()),e&2){let e=K(4);M(),L(e.computedEntries())}}function RI(e,t){e&1&&(z(0,`p`,61),J(1,`No computed signals.`),B())}function zI(e,t){e&1&&(z(0,`span`,67),J(1,`signalMethod`),B())}function BI(e,t){e&1&&(z(0,`span`,67),J(1,`rxMethod`),B())}function VI(e,t){if(e&1&&(z(0,`li`,66),J(1),P(2,zI,2,0,`span`,67)(3,BI,2,0,`span`,67),z(4,`span`,68),J(5),B()()),e&2){let e=t.$implicit,n=K(5);M(),X(` `,e.name,` `),M(),F(e.signalMethod?2:e.rx?3:-1),M(3),Y_(``,e.calls,` `,e.calls===1?`call`:`calls`,``,n.methodDuration(e))}}function HI(e,t){if(e&1&&(z(0,`ul`,63),I(1,VI,6,5,`li`,66,hI),B()),e&2){let e=K();M(),L(e.methods)}}function UI(e,t){e&1&&(z(0,`p`,61),J(1,`No methods.`),B())}function WI(e,t){if(e&1&&(z(0,`li`,66),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function GI(e,t){if(e&1&&(z(0,`li`,75),J(1),B()),e&2){let e=K().$implicit;R(`title`,K(5).entityOverflowTitle(e.ids,e.count)),M(),X(` +`,e.count-30,` more `)}}function KI(e,t){if(e&1&&(z(0,`code`,65),J(1),B()),e&2){let e=K(2).$implicit,t=K(5);R(`title`,t.prettyText(e.selected)),M(),Y(t.shortText(e.selected))}}function qI(e,t){e&1&&(z(0,`span`,61),J(1,`None selected`),B())}function JI(e,t){if(e&1&&(z(0,`dl`,60)(1,`dt`),J(2,`Selected`),B(),z(3,`dd`),P(4,KI,2,2,`code`,65)(5,qI,2,0,`span`,61),B()()),e&2){let e=K().$implicit;M(4),F(e.selected===void 0?5:4)}}function YI(e,t){if(e&1&&(z(0,`div`,71)(1,`div`,72)(2,`span`,66),J(3),B(),z(4,`span`,73),J(5),B()(),z(6,`ul`,74),I(7,WI,2,1,`li`,66,wg),P(9,GI,2,2,`li`,75),B(),P(10,JI,6,1,`dl`,60),B()),e&2){let e=t.$implicit,n=K(5);M(3),Y(e.collection??`entities`),M(2),Z(``,e.count,` `,e.count===1?`entity`:`entities`),M(),N(`aria-label`,(e.collection??`entities`)+` ids`),M(),L(n.entityIds(e.ids)),M(2),F(e.count>30?9:-1),M(),F(e.selectedId===void 0?-1:10)}}function XI(e,t){if(e&1&&(z(0,`section`,64)(1,`h4`,69),J(2,`Entities`),B(),z(3,`div`,70),I(4,YI,11,6,`div`,71,gI),B()()),e&2){let e=K();M(4),L(e.entities)}}function ZI(e,t){if(e&1&&(z(0,`section`,58)(1,`h4`,59),J(2,`Computed`),B(),P(3,LI,3,0,`dl`,60)(4,RI,2,0,`p`,61),z(5,`h4`,62),J(6,`Methods`),B(),P(7,HI,3,0,`ul`,63)(8,UI,2,0,`p`,61),B(),P(9,XI,6,0,`section`,64)),e&2){let e=t,n=K(3);M(3),F(n.computedEntries().length?3:4),M(4),F(e.methods.length?7:8),M(2),F(e.entities?.length?9:-1)}}function QI(e,t){if(e&1&&(z(0,`span`,80),J(1),B()),e&2){let e=t;R(`title`,`Caused by `+K(4).kindLabel(`event`)+`: `+e.type),M(),Y(e.type)}}function $I(e,t){if(e&1&&(z(0,`span`,67),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function eL(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` · `,K(3).formatDuration(e.durationMs),` `)}}function tL(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,76),G(`click`,function(){let t=O(e).$implicit;return k(K(3).selectChange(t.seq))}),z(2,`span`,77),J(3),B(),z(4,`span`,78)(5,`span`,79),J(6),B(),P(7,QI,2,2,`span`,80),B(),z(8,`span`,81),P(9,$I,2,1,`span`,67),J(10),P(11,eL,1,1),B()()()}if(e&2){let e,n=t.$implicit,r=K(3);M(),q(`selected`,n.seq===r.selectedChangeSeq()),N(`aria-pressed`,n.seq===r.selectedChangeSeq())(`aria-controls`,n.seq===r.selectedChangeSeq()?`ngrx-change-detail`:null),M(2),X(`#`,n.seq),M(2),R(`title`,n.type),M(),Y(n.type),M(),F((e=n.causedByEvent)?7:-1,e),M(2),F(n.origin?9:-1),M(),Z(` `,r.changesLabel(n),` · `,r.formatTime(n.timestamp),` `),M(),F(n.durationMs===void 0?-1:11)}}function nL(e,t){e&1&&J(0,` No entries match this filter. `)}function rL(e,t){e&1&&J(0,` No actions dispatched since the page connected. `)}function iL(e,t){e&1&&J(0,` No state changes yet. Method calls and patchState writes that change the state are recorded here. `)}function aL(e,t){if(e&1&&(z(0,`li`,30),P(1,nL,1,0)(2,rL,1,0)(3,iL,1,0),B()),e&2){let e=K(),t=K(2);M(),F(t.filter()?1:e.classic?2:3)}}function oL(e,t){if(e&1&&(z(0,`div`,54),zg(1,82),B()),e&2){K(3);let e=n_(20);M(),R(`ngTemplateOutlet`,e)(`ngTemplateOutletContext`,sv(2,uI,t))}}function sL(e,t){if(e&1&&V(0,`option`,87),e&2){let e=t.$implicit;R(`value`,e)}}function cL(e,t){if(e&1&&(z(0,`p`,93),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function lL(e,t){if(e&1){let e=W();z(0,`section`,55)(1,`h4`,83),J(2,`Dispatch an action`),B(),z(3,`form`,84),G(`submit`,function(t){return O(e),k(K(3).dispatchAction(t))}),z(4,`label`)(5,`span`),J(6,`Type`),B(),z(7,`input`,85),G(`input`,function(t){return O(e),k(K(3).dispatchType.set(t.target.value))}),B()(),z(8,`datalist`,86),I(9,sL,1,1,`option`,87,wg),B(),z(11,`label`)(12,`span`),J(13,`Payload `),z(14,`span`,88),J(15,`(JSON object, optional)`),B()(),z(16,`textarea`,89),G(`input`,function(t){return O(e),k(K(3).dispatchPayload.set(t.target.value))}),B()(),z(17,`p`,90),J(18),B(),z(19,`div`,91)(20,`button`,92),J(21,` Dispatch `),B()(),P(22,cL,2,1,`p`,93),B()()}if(e&2){let e=K(3);M(7),R(`value`,e.dispatchType()),M(2),L(e.actionTypes()),M(7),R(`value`,e.dispatchPayload()),N(`aria-invalid`,e.payloadError()?`true`:null),M(2),Y(e.payloadError()),M(2),R(`disabled`,e.busy()||!e.canRestore()||!e.dispatchRequest()),N(`aria-describedby`,e.canRestore()?null:`store-dispatch-off`),M(2),F(e.canRestore()?-1:22)}}function uL(e,t){if(e&1){let e=W();z(0,`div`,31)(1,`div`,37)(2,`h3`),J(3),B(),z(4,`div`,38)(5,`span`,39),J(6),B(),z(7,`span`,39),J(8),B(),P(9,AI,2,2,`span`,40),P(10,jI,2,1,`span`,39),B(),P(11,NI,4,0,`p`,41),B(),P(12,FI,9,3,`div`,42),z(13,`div`,43)(14,`section`,44)(15,`div`,45)(16,`h4`,46),J(17,`State`),B(),z(18,`button`,47),G(`click`,function(){return O(e),k(K(2).copyState())}),J(19,` Copy `),B()(),z(20,`pre`,48,2),J(22),B()(),P(23,ZI,10,3),B(),z(24,`section`,49)(25,`h4`,50),J(26),z(27,`span`,14),J(28),B()(),V(29,`app-limit-note`,51),z(30,`div`,52)(31,`ul`,53),I(32,tL,12,12,`li`,null,pI,!1,aL,4,1,`li`,30),B(),P(35,oL,2,4,`div`,54),B()(),P(36,lL,23,7,`section`,55),B()}if(e&2){let e,n,r,i=t,a=K(2);M(3),Y(i.label),M(3),Y(a.kindLabel(i.kind)),M(2),X(`scope: `,i.scope),M(),F((e=i.signal?.declaredIn)?9:-1,e),M(),F(i.classic?10:-1),M(),F(i.signal?.references?.length?11:-1),M(),F(i.classic?.paused?12:-1),M(10),Y(a.stateText()),M(),F((n=i.signal)?23:-1,n),M(3),X(` `,i.classic?`Action log`:`Change log`,` `),M(2),Y(a.storeLog().length),M(),R(`dropped`,a.page()?.dropped??0)(`max`,a.maxLog()),M(2),N(`aria-label`,i.classic?`Actions`:`Changes`),M(),L(a.storeLog()),M(3),F((r=a.changeEntry())?35:-1,r),M(),F(i.classic?36:-1)}}function dL(e,t){if(e&1&&(z(0,`div`,17)(1,`ul`,29),I(2,OI,8,10,`li`,null,fI,!1,kI,2,0,`li`,30),B(),P(5,uL,37,17,`div`,31),B()),e&2){let e,t=K();M(2),L(t.filteredStores()),M(3),F((e=t.store())?5:-1,e)}}function fL(e,t){if(e&1&&(z(0,`code`,100),J(1),B()),e&2){let e=K().$implicit,t=K(2);R(`title`,t.prettyText(e.payload)),M(),Y(t.shortText(e.payload))}}function pL(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,98),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectEvent(t.seq))}),V(2,`span`,34),z(3,`span`,99),J(4),B(),P(5,fL,2,2,`code`,100),z(6,`span`,101),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.seq===n.selectedEventSeq()),N(`aria-pressed`,e.seq===n.selectedEventSeq())(`aria-controls`,e.seq===n.selectedEventSeq()?`ngrx-event-detail`:null),M(),C_(`background`,n.kindColor(`event`)),M(),R(`title`,e.eventType??e.type),M(),Y(e.eventType??e.type),M(),F(e.payload===void 0?-1:5),M(2),Y(n.formatTime(e.timestamp))}}function mL(e,t){e&1&&(z(0,`li`,30),J(1,`No events match this filter.`),B())}function hL(e,t){if(e&1&&(z(0,`div`,97,4),zg(2,82),B()),e&2){K(2);let e=n_(20);M(2),R(`ngTemplateOutlet`,e)(`ngTemplateOutletContext`,sv(2,dI,t))}}function gL(e,t){if(e&1&&(z(0,`section`,19)(1,`div`,12)(2,`h2`,94),J(3,`Events`),B(),z(4,`span`,14),J(5),B()(),z(6,`p`,95),J(7,` Events dispatched through @ngrx/signals/events, across every store on this page. `),B(),z(8,`ul`,96),I(9,pL,8,10,`li`,null,pI,!1,mL,2,0,`li`,30),B(),P(12,hL,3,4,`div`,97),B()),e&2){let e,t=K();M(5),Y(t.pageEvents().length),M(4),L(t.pageEvents()),M(3),F((e=t.eventEntry())?12:-1,e)}}function _L(e,t){if(e&1&&(z(0,`dt`),J(1,`Origin`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().selected,t=K();M(3),Y(t.originText(e.origin))}}function vL(e,t){if(e&1&&(z(0,`dt`),J(1,`Duration`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().selected,t=K();M(3),Y(t.formatDuration(e.durationMs))}}function yL(e,t){if(e&1&&(z(0,`dt`),J(1,`Action`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.action))}}function bL(e,t){if(e&1&&(z(0,`dt`),J(1,`Arguments`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.args))}}function xL(e,t){if(e&1&&(z(0,`dt`),J(1,`Payload`),B(),z(2,`dd`)(3,`pre`,106),J(4),B()()),e&2){let e=K().selected,t=K();M(4),Y(t.prettyText(e.payload))}}function SL(e,t){if(e&1&&(z(0,`pre`,106),J(1),B()),e&2){let e=K(),t=K(2);M(),Y(t.prettyText(e.payload))}}function CL(e,t){if(e&1&&(z(0,`dt`),J(1,`Caused by event`),B(),z(2,`dd`)(3,`code`,107),J(4),B(),P(5,SL,2,1,`pre`,106),B()),e&2){let e=t;M(4),Y(e.type),M(),F(e.payload===void 0?-1:5)}}function wL(e,t){if(e&1){let e=W();z(0,`button`,111),G(`click`,function(){O(e);let t=K(2).selected;return k(K().copyDiff(t))}),J(1,` Copy `),B()}if(e&2){let e=K(2).selected;N(`aria-label`,`Copy the state diff of #`+e.seq)}}function TL(e,t){if(e&1&&(z(0,`code`,117),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),Y(t.shortText(e.before))}}function EL(e,t){e&1&&(z(0,`span`,119),J(1,`→`),B(),z(2,`span`,120),J(3,`became`),B())}function DL(e,t){if(e&1&&(z(0,`code`,118),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),Y(t.shortText(e.after))}}function OL(e,t){if(e&1&&(z(0,`li`)(1,`span`,114),J(2),B(),z(3,`code`,115),J(4),B(),z(5,`span`,116),P(6,TL,2,1,`code`,117),P(7,EL,4,0),P(8,DL,2,1,`code`,118),B()()),e&2){let e=t.$implicit,n=K(4);w_(`diff-row `+e.op),M(2),Y(n.opLabel(e.op)),M(2),Y(e.path),M(2),F(e.op===`add`?-1:6),M(),F(e.op===`change`?7:-1),M(),F(e.op===`remove`?-1:8)}}function kL(e,t){if(e&1&&(z(0,`p`,61),J(1),B()),e&2){let e=K(3).selected,t=K();M(),Y(t.moreChanges(e.diffTruncated))}}function AL(e,t){if(e&1&&(z(0,`ul`,112),I(1,OL,9,7,`li`,113,_I),B(),P(3,kL,2,1,`p`,61)),e&2){let e=K(2).selected;M(),L(e.diff),M(2),F(e.diffTruncated?3:-1)}}function jL(e,t){e&1&&(z(0,`p`,61),J(1,`The state did not change.`),B())}function ML(e,t){if(e&1&&(z(0,`div`,108)(1,`div`,109),J(2,`State diff`),B(),P(3,wL,2,1,`button`,110),B(),P(4,AL,4,1)(5,jL,2,0,`p`,61)),e&2){let e=K(),t=e.selected,n=e.headingLevel;M(),N(`aria-level`,n+1),M(2),F(t.diff.length?3:-1),M(),F(t.diff.length?4:5)}}function NL(e,t){if(e&1&&J(0),e&2){let e=K(2).selected;X(` Store DevTools jumps the app state to the state right after action #`,e.seq,`. Until you go back to the latest state, new actions are logged but do not change the state. `)}}function PL(e,t){if(e&1&&J(0),e&2){let e=K(3).selected;Z(` This sets every state key of `,t.label,` back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function FL(e,t){if(e&1&&J(0),e&2){let e=K(3).selected;X(` This sets every state key of the store back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function IL(e,t){if(e&1&&P(0,PL,1,2)(1,FL,1,1),e&2){let e;F((e=K(3).store())?0:1,e)}}function LL(e,t){if(e&1){let e=W();z(0,`div`,121),G(`keydown.escape`,function(t){return O(e),k(K(2).cancelRestore(t))}),z(1,`p`,122),P(2,NL,1,1)(3,IL,2,1),B(),z(4,`div`,91)(5,`button`,56),G(`click`,function(){O(e);let t=K().selected;return k(K().restore(t.seq,t.source===`store`))}),J(6,` Restore `),B(),z(7,`button`,28,5),G(`click`,function(){return O(e),k(K(2).cancelRestore())}),J(9,` Cancel `),B()()()}if(e&2){let e=K(),t=e.selected,n=e.idPrefix,r=K();N(`aria-labelledby`,n+`-confirm-text`),M(),R(`id`,n+`-confirm-text`),M(),F(t.source===`store`?2:3),M(3),R(`disabled`,r.busy())}}function RL(e,t){if(e&1){let e=W();z(0,`button`,127,6),G(`click`,function(){O(e);let t=K(2).selected;return k(K().askRestore(t.seq))}),J(2,` Restore this state `),B()}if(e&2){let e=K(2).idPrefix,t=K();R(`disabled`,!t.canRestore()),N(`aria-describedby`,t.canRestore()?null:e+`-writes-off`)}}function zL(e,t){if(e&1){let e=W();z(0,`button`,128),G(`click`,function(){O(e);let t=K(2).selected;return k(K().dispatchAgain(t.seq))}),J(1,` Dispatch again `),B()}if(e&2){let e=K(2).idPrefix,t=K();R(`disabled`,t.busy()||!t.canRestore()),N(`aria-describedby`,t.canRestore()?null:e+`-writes-off`)}}function BL(e,t){if(e&1&&(z(0,`p`,126),J(1),B()),e&2){let e=K(2).idPrefix,t=K();R(`id`,e+`-writes-off`),M(),Y(t.restoreOff)}}function VL(e,t){if(e&1&&(z(0,`div`,123),P(1,RL,3,2,`button`,124),P(2,zL,2,2,`button`,125),B(),P(3,BL,2,2,`p`,126)),e&2){let e=K().selected,t=K();M(),F(e.restorable?1:-1),M(),F(t.canAgain(e)?2:-1),M(),F(t.canRestore()?-1:3)}}function HL(e,t){e&1&&(J(0,` Store DevTools no longer holds this action, so this state cannot be restored. It was dropped past `),z(1,`code`),J(2,`maxAge`),B(),J(3,`, or the Store DevTools history was committed, reset or imported. `))}function UL(e,t){e&1&&(J(0,` Store DevTools never recorded this action, so this state cannot be restored. An `),z(1,`code`),J(2,`actionsBlocklist`),B(),J(3,`, `),z(4,`code`),J(5,`actionsSafelist`),B(),J(6,` or `),z(7,`code`),J(8,`predicate`),B(),J(9,` option filtered it out, or recording was paused. `))}function WL(e,t){e&1&&(J(0,` Time travel for @ngrx/store needs `),z(1,`code`),J(2,`provideStoreDevtools()`),B(),J(3,`. Without it, entries cannot be restored. `))}function GL(e,t){if(e&1&&(z(0,`p`,105),P(1,HL,4,0)(2,UL,10,0)(3,WL,4,0),B()),e&2){let e=K().selected;M(),F(e.unrestorable===`dropped`?1:e.unrestorable===`not-recorded`?2:3)}}function KL(e,t){if(e&1&&(z(0,`section`,102)(1,`div`,103),J(2),B(),z(3,`dl`,60)(4,`dt`),J(5,`Time`),B(),z(6,`dd`),J(7),B(),P(8,_L,4,1),P(9,vL,4,1),P(10,yL,5,1),P(11,bL,5,1),P(12,xL,5,1),P(13,CL,6,2),B(),P(14,ML,6,3),P(15,LL,10,4,`div`,104),P(16,VL,4,3),P(17,GL,4,1,`p`,105),B()),e&2){let e,n=t.selected,r=t.headingLevel,i=t.idPrefix,a=K();N(`aria-labelledby`,i+`-entry-heading`),M(),R(`id`,i+`-entry-heading`),N(`aria-level`,r),M(),Z(` #`,n.seq,` `,n.type,` `),M(5),Y(a.formatTime(n.timestamp)),M(),F(n.origin?8:-1),M(),F(n.durationMs===void 0?-1:9),M(),F(n.action===void 0?-1:10),M(),F(n.args?.length?11:-1),M(),F(n.source===`event`&&n.payload!==void 0?12:-1),M(),F((e=n.causedByEvent)?13:-1,e),M(),F(n.source===`event`?-1:14),M(),F(n.restorable&&a.confirmSeq()===n.seq?15:-1),M(),F(a.confirmSeq()!==n.seq&&(n.restorable||a.canAgain(n))?16:-1),M(),F(!n.restorable&&n.source===`store`?17:-1)}}function qL(e,t){if(e&1&&(z(0,`span`,14),J(1),B()),e&2){let e=K();M(),Y(e.sourceEntries().length)}}function JL(e,t){e&1&&(z(0,`div`,22),V(1,`span`,129),z(2,`p`,26),J(3,`Scanning source for NgRx declarations…`),B()())}function YL(e,t){e&1&&(z(0,`div`,23)(1,`p`,26),J(2,`No NgRx declarations found in source.`),B(),z(3,`p`,27),J(4,` The scan looks for `),z(5,`code`),J(6,`signalStore`),B(),J(7,`, `),z(8,`code`),J(9,`signalState`),B(),J(10,`, `),z(11,`code`),J(12,`signalMethod`),B(),J(13,`, `),z(14,`code`),J(15,`createAction`),B(),J(16,`, `),z(17,`code`),J(18,`createReducer`),B(),J(19,`, `),z(20,`code`),J(21,`createEffect`),B(),J(22,`, `),z(23,`code`),J(24,`createSelector`),B(),J(25,` and `),z(26,`code`),J(27,`createFeature`),B(),J(28,`. `),B()())}function XL(e,t){if(e&1){let e=W();z(0,`button`,131),G(`click`,function(){let t=O(e).$implicit,n=K(2);return k(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,34),z(2,`span`,136),J(3),B(),z(4,`span`,132),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(n.kindLabel(e.kind)),M(2),Y(e.count)}}function ZL(e,t){if(e&1&&(z(0,`p`,141),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function QL(e,t){if(e&1&&(z(0,`li`,135)(1,`div`,137),V(2,`span`,34),z(3,`span`,138),J(4),B(),z(5,`span`,39),J(6),B()(),z(7,`div`,139)(8,`span`,140),J(9),B()(),P(10,ZL,2,1,`p`,141),B()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.name),M(2),Y(n.kindLabel(e.kind)),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.detail?10:-1)}}function $L(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,22)(2,`p`,26),J(3,`No declarations match.`),B(),z(4,`button`,28),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(5,`Clear filters`),B()()()}}function eR(e,t){if(e&1){let e=W();z(0,`div`,130)(1,`button`,131),G(`click`,function(){return O(e),k(K().kind.set(null))}),J(2,` All `),z(3,`span`,132),J(4),B()(),I(5,XL,6,7,`button`,133,vI),B(),z(7,`ul`,134),I(8,QL,11,8,`li`,135,yI,!1,$L,6,0,`li`),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.sourceEntries().length),M(),L(e.groupedEntries()),M(3),L(e.filteredEntries())}}var tR={action:`#f59e0b`,reducer:`#a78bfa`,effect:`#fb923c`,selector:`#60a5fa`,feature:`#34d399`,"store-setup":`#94a3b8`,"signal-store":`#e879f9`,"signal-state":`#22d3ee`,"signal-method":`#fb7185`,store:`#a78bfa`,event:`var(--warn)`},nR={"signal-store":`signalStore`,"signal-state":`signalState`,"signal-method":`signalMethod`,"store-setup":`store setup`,store:`@ngrx/store`,event:`event`},rR={dispatch:`store.dispatch(action)`,effect:`NgRx effect (Store.next)`,reactive:`store.dispatch(() => action)`};function iR(e){if(!e.trim())return{};let t;try{t=JSON.parse(e)}catch{return{error:`The payload is not valid JSON.`}}return!t||typeof t!=`object`||Array.isArray(t)?{error:`The payload must be a JSON object, like {"id": 7}.`}:Object.prototype.hasOwnProperty.call(t,`type`)?{error:`The payload cannot have a "type" key. Put the action type in the Type field.`}:{payload:t}}var aR=new Set([`action`,`reducer`,`effect`,`selector`,`feature`,`store-setup`]),oR=class e{rpc=$(null);canRestore=Q(()=>bE(this.rpc(),`ngrx`));restoreOff=KT(`ngrx`);filter=j(``);kind=j(null);sourceEntries=j([]);sourceLoaded=j(!1);pages=j([]);failed=j(!1);selectedPageId=j(null);hostPageId=eE();maxLog=Q(()=>yE(this.rpc()).limits.changeLog);selectedStoreId=j(null);focusEventSeq=j(null);eventDetailHeading=Rv(`eventDetailHeading`);busy=j(!1);focusLatest=j(!1);focusConfirm=j(null);cancelButton=Rv(`cancelButton`);restoreButton=Rv(`restoreButton`);stateTree=Rv(`stateTree`);filterInput=Rv(`filterInput`);latestButton=Rv(`latestButton`);message=j(``);destroyRef=E(Cs);unsubscribe=null;page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.selectedPageId())??e.find(e=>e.pageId===this.hostPageId)??e[0]??null});logKey=Q(()=>{let e=this.page();return{pageId:e?.pageId??null,log:e?.log??[]}});logSession=Tv({source:this.logKey,computation:(e,t)=>t?ZF(t.source,e)?t.value:t.value+1:0});selectedChangeSeq=Tv({source:this.logSession,computation:()=>null});selectedEventSeq=Tv({source:this.logSession,computation:()=>null});confirmSeq=Tv({source:this.logSession,computation:()=>null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url,hint:e.url})));liveStores=Q(()=>{let e=this.page();if(!e)return[];let t=e.stores.map(e=>({id:e.id,label:e.name??e.references[0]??e.className,kind:e.kind,scope:e.scope,signal:e}));return e.classic&&t.push({id:`store`,label:`Store`,kind:`store`,scope:e.classic.scope,classic:e.classic}),t});filteredStores=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.liveStores().filter(t=>t.label.toLowerCase().includes(e)||t.kind.includes(e)||(t.signal?.stateKeys??[]).some(t=>t.toLowerCase().includes(e))||(this.page()?.log??[]).some(n=>n.storeId===t.id&&n.type.toLowerCase().includes(e))):this.liveStores()});store=Q(()=>{let e=this.liveStores();return e.find(e=>e.id===this.selectedStoreId())??e[0]??null});stateText=Q(()=>{let e=this.store();return e?nI(e.signal?e.signal.state:e.classic?.state):``});computedEntries=Q(()=>Object.entries(this.store()?.signal?.computed??{}).map(([e,t])=>({key:e,value:rI(t,160),full:nI(t)})));storeLog=Q(()=>{let e=this.store()?.id,t=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(n=>n.storeId===e&&(!t||n.type.toLowerCase().includes(t)||this.storeMatches(t))).reverse()});hasEvents=Q(()=>(this.page()?.log??[]).some(e=>e.source===`event`));pageEvents=Q(()=>{let e=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(t=>t.source===`event`&&(!e||t.type.toLowerCase().includes(e))).slice().reverse()});changeEntry=Q(()=>{let e=this.selectedChangeSeq();return e===null?null:this.storeLog().find(t=>t.seq===e)??null});eventEntry=Q(()=>{let e=this.selectedEventSeq();return e===null?null:this.pageEvents().find(t=>t.seq===e)??null});dispatchType=j(``);dispatchPayload=j(``);actionTypes=Q(()=>{let e=new Set;for(let t of this.sourceEntries())for(let n of t.types??[])e.add(n);for(let t of this.page()?.log??[])t.source===`store`&&t.action!==void 0&&e.add(t.type);return[...e].sort().slice(0,200)});payloadError=Q(()=>iR(this.dispatchPayload()).error??``);dispatchRequest=Q(()=>{let e=this.dispatchType().trim(),{payload:t,error:n}=iR(this.dispatchPayload());return!e||n?null:{type:`dispatch`,action:e,...t?{payload:t}:{}}});usesSignals=Q(()=>this.sourceEntries().some(e=>e.kind===`signal-store`||e.kind===`signal-state`));usesClassic=Q(()=>this.sourceEntries().some(e=>aR.has(e.kind)));filteredEntries=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind();return this.sourceEntries().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.includes(e)||(n.detail??``).toLowerCase().includes(e)))});groupedEntries=Q(()=>{let e=new Map;for(let t of this.sourceEntries())e.set(t.kind,(e.get(t.kind)??0)+1);return[...e.entries()].map(([e,t])=>({kind:e,count:t}))});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),ey(()=>{let e=this.latestButton();e&&this.focusLatest()&&!this.busy()&&(this.focusLatest.set(!1),e.nativeElement.focus())}),uc(()=>{let e=this.focusConfirm(),t=e===`cancel`?this.cancelButton():this.restoreButton();e&&t&&(this.focusConfirm.set(null),t.nativeElement.focus())}),ey(()=>{let e=this.focusEventSeq(),t=this.eventDetailHeading();e!==null&&t&&(this.focusEventSeq.set(null),t.nativeElement.focus())}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}storeMatches(e){let t=this.store();return!!t&&t.label.toLowerCase().includes(e)}async load(e){this.failed.set(!1),iE(e,`get-ngrx-store`).then(e=>this.sourceEntries.set(Array.isArray(e)?e:[])).catch(()=>this.sourceEntries.set([])).finally(()=>this.sourceLoaded.set(!0));try{let t=await e.scope(`pangular`).rpc.sharedState(`ngrx-store`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.pages.set(Array.isArray(t?.pages)?t.pages:[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}}retry(){let e=this.rpc();e&&this.load(e)}selectPage(e){this.selectedPageId.set(e),this.selectedStoreId.set(null),this.selectedChangeSeq.set(null),this.selectedEventSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectStore(e){this.selectedStoreId.set(e),this.selectedChangeSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectChange(e){this.selectedChangeSeq.set(this.selectedChangeSeq()===e?null:e),this.confirmSeq.set(null),this.message.set(``)}copyState(){return this.copyText(this.stateText())}copyDiff(e){return this.copyText(nI(e.diff))}async copyText(e){try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}askRestore(e){this.confirmSeq.set(e),this.focusConfirm.set(`cancel`)}cancelRestore(e){e?.preventDefault(),this.confirmSeq.set(null),this.focusConfirm.set(`restore`)}async restore(e,t){let n=this.page();if(!n)return;this.busy.set(!0),this.focusLatest.set(!1);let r=!1;try{let i=await iE(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:{type:`restore`,seq:e}});this.message.set(i?.error??i?.message??`Restored.`),r=t&&!i?.error&&!!i?.paused}catch{this.message.set(`Could not reach the page to restore the state.`)}finally{this.busy.set(!1),this.confirmSeq.set(null),this.focusLatest.set(r),r||this.stateTree()?.nativeElement.focus()}}selectEvent(e){let t=this.selectedEventSeq()===e?null:e;this.selectedEventSeq.set(t),t!==null&&this.focusEventSeq.set(t)}async backToLatest(){let e=this.page();if(e){this.busy.set(!0);try{let t=await iE(this.rpc(),`request-ngrx-action`,{pageId:e.pageId,request:{type:`latest`}});this.focusLatest.set(!1),this.stateTree()?.nativeElement.focus(),this.message.set(t?.error??t?.message??`Back on the latest state.`)}catch{this.message.set(`Could not reach the page to go back to the latest state.`)}finally{this.busy.set(!1)}}}canAgain(e){return e.source===`store`&&e.action!==void 0}async dispatchAction(e){e.preventDefault();let t=this.dispatchRequest();t&&await this.send(t,`Could not reach the page to dispatch the action.`)}dispatchAgain(e){return this.send({type:`dispatch-again`,seq:e},`Could not reach the page to dispatch the action again.`)}async send(e,t){let n=this.page();if(!n||this.busy())return;let r=this.logSession();this.busy.set(!0);try{let t=await iE(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:e});this.message.set(t?.error??t?.message??`Dispatched.`),t?.entry&&this.logSession()===r&&(this.selectedStoreId.set(`store`),this.selectedChangeSeq.set(t.entry.seq))}catch{this.message.set(t)}finally{this.busy.set(!1)}}clearFilters(){this.filter.set(``),this.kind.set(null),this.filterInput()?.nativeElement.focus()}changeCount(e){return(this.page()?.log??[]).filter(t=>t.storeId===e).length}entityIds(e){return e.slice(0,30)}entityOverflowTitle(e,t){let n=e.slice(30).join(`, `);return t>e.length?`${n} (first ${e.length} of ${t} shown)`:n}kindColor(e){return tR[e]??`var(--text-3)`}kindLabel(e){return nR[e]??e}originText(e){return rR[e]??e}changesLabel=XF;moreChanges=YF;opLabel(e){return e===`add`?`added`:e===`remove`?`removed`:`changed`}prettyText(e){return nI(e)}shortText(e){return rI(e)}formatTime=zD;formatDuration(e){return e<=0?`<1ms`:`${Math.round(e)}ms`}methodDuration(e){let t=[];return e.avgDurationMs!==void 0&&t.push(`avg ${this.formatDuration(e.avgDurationMs)}`),e.lastDurationMs!==void 0&&t.push(`last ${this.formatDuration(e.lastDurationMs)}`),t.length?` · ${t.join(` · `)}`:``}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-store-inspector`]],viewQuery:function(e,t){e&1&&e_(t.eventDetailHeading,iI,5)(t.cancelButton,aI,5)(t.restoreButton,oI,5)(t.stateTree,sI,5)(t.filterInput,cI,5)(t.latestButton,lI,5),e&2&&t_(6)},inputs:{rpc:[1,`rpc`]},decls:29,vars:11,consts:[[`filterInput`,``],[`entryDetailTpl`,``],[`stateTree`,``],[`latestButton`,``],[`eventDetailHeading`,``],[`cancelButton`,``],[`restoreButton`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter stores, changes and declarations…`,`aria-label`,`Filter stores, changes and source declarations`,3,`input`,`keydown.escape`,`value`],[1,`status`],[`aria-hidden`,`true`,1,`live-dot`],[`aria-labelledby`,`ngrx-live-heading`,1,`block`],[1,`section-head`],[`id`,`ngrx-live-heading`],[1,`pill`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`live-layout`],[`role`,`status`,1,`message`],[`aria-labelledby`,`ngrx-events-heading`,1,`block`],[`aria-labelledby`,`ngrx-source-heading`,1,`block`],[`id`,`ngrx-source-heading`],[`role`,`status`,1,`empty`,`compact`],[1,`empty`,`compact`],[`id`,`ngrx-page-label`,1,`visually-hidden`],[`labelledBy`,`ngrx-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`hint`],[`type`,`button`,1,`btn`,3,`click`],[`aria-label`,`Stores on this page`,1,`store-list`],[1,`muted`,`pad`],[1,`store-detail`],[`type`,`button`,1,`store-item`,3,`click`],[1,`store-top`],[`aria-hidden`,`true`,1,`dot`],[1,`store-name`],[1,`store-meta`],[1,`detail-head`],[1,`chips`],[1,`chip`],[1,`chip`,`mono`,3,`title`],[1,`refs`],[1,`paused`],[1,`facts`],[`aria-labelledby`,`ngrx-state-heading`,1,`fact`],[1,`fact-head`],[`id`,`ngrx-state-heading`],[`type`,`button`,`aria-label`,`Copy state`,1,`btn`,`copy`,3,`click`],[`tabindex`,`0`,`aria-labelledby`,`ngrx-state-heading`,1,`tree`],[`aria-labelledby`,`ngrx-log-heading`,1,`log`],[`id`,`ngrx-log-heading`],[`what`,`changes on this page`,`limit`,`changeLog`,3,`dropped`,`max`],[1,`log-layout`],[1,`log-list`],[`id`,`ngrx-change-detail`],[`aria-labelledby`,`ngrx-dispatch-heading`,1,`dispatch`],[`type`,`button`,1,`btn`,`primary`,3,`click`,`disabled`],[`id`,`store-latest-off`,1,`hint`,`small`],[`aria-labelledby`,`ngrx-computed-heading`,1,`fact`],[`id`,`ngrx-computed-heading`],[1,`kv`],[1,`muted`],[`id`,`ngrx-methods-heading`,1,`spaced`],[`aria-labelledby`,`ngrx-methods-heading`,1,`methods`],[`aria-labelledby`,`ngrx-entities-heading`,1,`fact`],[3,`title`],[1,`chip`,`mono`],[1,`tag`],[1,`calls`],[`id`,`ngrx-entities-heading`],[1,`entities`],[1,`entity-group`],[1,`entity-head`],[1,`entity-count`],[1,`chips`,`entity-ids`],[1,`chip`,`more`,3,`title`],[`type`,`button`,1,`log-item`,3,`click`],[1,`seq`],[1,`log-type-row`],[1,`log-type`,3,`title`],[1,`tag`,3,`title`],[1,`log-meta`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`id`,`ngrx-dispatch-heading`],[1,`dispatch-form`,3,`submit`],[`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`list`,`ngrx-action-types`,`placeholder`,`e.g. [Cart] Add Item`,3,`input`,`value`],[`id`,`ngrx-action-types`],[3,`value`],[1,`optional`],[`rows`,`3`,`spellcheck`,`false`,`placeholder`,`e.g. {"id": 7}`,`aria-describedby`,`ngrx-payload-error`,3,`input`,`value`],[`id`,`ngrx-payload-error`,1,`field-error`],[1,`actions`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`id`,`store-dispatch-off`,1,`hint`,`small`],[`id`,`ngrx-events-heading`],[1,`intro`],[`aria-label`,`Dispatched events`,1,`events-list`],[`id`,`ngrx-event-detail`,`tabindex`,`-1`,1,`event-detail-focus`],[`type`,`button`,1,`event-item`,3,`click`],[1,`event-type`,`mono`,3,`title`],[1,`event-payload`,3,`title`],[1,`event-time`],[1,`entry`],[`role`,`heading`,1,`entry-heading`,3,`id`],[`role`,`group`,1,`confirm`],[1,`hint`,`small`],[1,`code`],[1,`mono`],[1,`sub-head`],[`role`,`heading`,1,`sub`],[`type`,`button`,1,`btn`,`copy`],[`type`,`button`,1,`btn`,`copy`,3,`click`],[1,`diff`],[3,`class`],[1,`op`],[1,`path`],[1,`values`],[1,`before`],[1,`after`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[`role`,`group`,1,`confirm`,3,`keydown.escape`],[3,`id`],[1,`entry-actions`],[`type`,`button`,1,`btn`,`restore`,3,`disabled`],[`type`,`button`,1,`btn`,3,`disabled`],[1,`hint`,`small`,3,`id`],[`type`,`button`,1,`btn`,`restore`,3,`click`,`disabled`],[`type`,`button`,1,`btn`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`spinner`],[`role`,`group`,`aria-label`,`Filter declarations by kind`,1,`kinds`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[1,`nodes`],[1,`node-card`],[1,`chip-text`],[1,`node-header`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[1,`detail`]],template:function(e,t){e&1&&(z(0,`div`,7)(1,`input`,8,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B(),P(3,bI,3,2),z(4,`span`,9),V(5,`span`,10),J(6),B()(),z(7,`section`,11)(8,`div`,12)(9,`h2`,13),J(10,`Live stores`),B(),P(11,xI,2,1,`span`,14),B(),P(12,SI,7,0,`div`,15)(13,CI,5,0,`div`,16)(14,DI,4,1,`div`,16)(15,dL,6,2,`div`,17),z(16,`p`,18),J(17),B()(),P(18,gL,13,3,`section`,19),tg(19,KL,18,16,`ng-template`,null,1,gv),z(21,`section`,20)(22,`div`,12)(23,`h2`,21),J(24,`Source declarations`),B(),P(25,qL,2,1,`span`,14),B(),P(26,JL,4,0,`div`,22)(27,YL,29,0,`div`,23)(28,eR,11,5),B()),e&2&&(M(),R(`value`,t.filter()),M(2),F(t.pages().length>1?3:-1),M(),q(`on`,!!t.page()),M(2),X(` `,t.page()?`Live`:`No page connected`,` `),M(5),F(t.liveStores().length?11:-1),M(),F(t.failed()?12:t.page()?t.liveStores().length?15:14:13),M(5),Y(t.message()),M(),F(t.hasEvents()?18:-1),M(7),F(t.sourceEntries().length?25:-1),M(),F(t.sourceLoaded()?t.sourceEntries().length===0?27:28:26))},dependencies:[WD,jD,$y],styles:[`[_nghost-%COMP%] {
display: grid;
gap: 24px;
min-width: 0;
@@ -6975,7 +6975,7 @@ textarea[aria-invalid=true][_ngcontent-%COMP%] {
.kv[_ngcontent-%COMP%] {
grid-template-columns: minmax(0, 1fr);
}
-}`]})},nR=[`heading`];function rR(e,t){if(e&1){let e=W();H(0,`div`,6)(1,`p`,9),J(2,`Could not explain this field. The devtools server did not answer.`),U(),H(3,`button`,11),Qg(`click`,function(){return O(e),k(K().retry())}),J(4,`Try again`),U()()}}function iR(e,t){if(e&1&&(H(0,`pre`,7),J(1),U()),e&2){let e=K();N(`aria-busy`,e.text()===null?`true`:null),M(),Y(e.text()??`Loading…`)}}function aR(e,t){if(e&1){let e=W();H(0,`div`,8)(1,`label`,15),J(2),U(),H(3,`input`,16),Qg(`input`,function(t){return O(e),k(K().draft.set(t.target.value))})(`keydown.enter`,function(){return O(e),k(K().setValue())}),U(),H(4,`button`,17),Qg(`click`,function(){return O(e),k(K().setValue())}),J(5,` Set `),U()()}if(e&2){let e=K();M(2),X(`New value for `,e.node().path),M(),Vg(`value`,e.draft()),M(),Vg(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`field-writes-off`)}}function oR(e,t){if(e&1&&(H(0,`p`,9),J(1),H(2,`a`,18),J(3,`How to unmask it`),U()()),e&2){let e=K();M(),X(` No Set editor: this field is redacted (`,e.redactLabel(e.node().redacted),`). `),M(),Vg(`href`,e.unmaskDocsUrl,ku)}}function sR(e,t){if(e&1&&(H(0,`p`,13),J(1),U()),e&2){let e=K();M(),Y(e.writesOff)}}var cR=class e{form=$.required();node=$.required();version=$(0);rpc=$(null);closed=Ov();canWrite=Q(()=>bE(this.rpc(),`forms`));writesOff=KT(`forms`);redactLabel=pE;unmaskDocsUrl=mE;target=Q(()=>`${this.form().id}|${this.node().path}`);text=Tv({source:this.target,computation:()=>null});failed=Tv({source:this.target,computation:()=>!1});attempt=j(0);heading=Rv.required(`heading`);host=E(Ml);draft=Tv({source:this.target,computation:()=>``});message=Tv({source:this.target,computation:()=>``});constructor(){uc(()=>{let e=this.form().id,t=this.node().path;this.version(),this.attempt();let n=this.rpc();Cv(()=>this.load(n,e,t))}),ey(()=>{this.target();let e=Cv(this.heading).nativeElement;this.host.nativeElement.scrollIntoView?.({block:`nearest`}),e.focus({preventScroll:!0})})}async load(e,t,n){if(!e)return;let r=await dE(e,`forms-explain`,{kind:`field`,form:t,path:n});if(this.form().id===t&&this.node().path===n){if(r===null){this.failed.set(!0);return}this.failed.set(!1),this.text.set(vE(r))}}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async act(e){let t=this.form().id,n=this.node().path,r=await hE(this.rpc(),{action:e,formId:t,path:n});this.form().id===t&&this.node().path===n&&this.message.set(r.expression?`${gE(r)} ${r.expression}`:gE(r))}async setValue(){let e=this.form().id,t=this.node().path,n=await hE(this.rpc(),{action:`set-value`,formId:e,path:t,value:this.draft(),coerce:!0,mode:`user`});this.form().id===e&&this.node().path===t&&this.message.set(gE(n))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-field-detail`]],viewQuery:function(e,t){e&1&&e_(t.heading,nR,5),e&2&&t_()},hostAttrs:[`role`,`region`,`aria-labelledby`,`forms-field-heading`],inputs:{form:[1,`form`],node:[1,`node`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{closed:`closed`},decls:26,vars:11,consts:[[`heading`,``],[1,`head`],[1,`section-label`],[`id`,`forms-field-heading`,`tabindex`,`-1`],[1,`tag`],[`type`,`button`,1,`small`,`close`,3,`click`],[`role`,`alert`,1,`failed`],[1,`explain`],[1,`editor`],[1,`muted`],[`role`,`group`,`aria-label`,`Field actions`,1,`row`],[`type`,`button`,1,`small`,3,`click`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`field-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`for`,`field-value`,1,`sr-only`],[`id`,`field-value`,`type`,`text`,`placeholder`,`New value, read as the current value's type`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field-input`,3,`input`,`keydown.enter`,`value`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&(H(0,`div`,1)(1,`span`,2),J(2,`Field`),U(),H(3,`h3`,3,0),J(5),U(),H(6,`span`,4),J(7),U(),H(8,`button`,5),Qg(`click`,function(){return t.closed.emit()}),J(9,` Close `),U()(),P(10,rR,5,0,`div`,6)(11,iR,2,2,`pre`,7),P(12,aR,6,4,`div`,8)(13,oR,4,2,`p`,9),H(14,`div`,10)(15,`button`,11),Qg(`click`,function(){return t.act(`focus`)}),J(16,`Focus`),U(),H(17,`button`,12),Qg(`click`,function(){return t.act(`mark-touched`)}),J(18,` Touch `),U(),H(19,`button`,12),Qg(`click`,function(){return t.act(`revalidate`)}),J(20,` Revalidate `),U(),H(21,`button`,11),Qg(`click`,function(){return t.act(`store-as-global`)}),J(22,`Store as global`),U()(),P(23,sR,2,1,`p`,13),H(24,`p`,14),J(25),U()),e&2&&(M(5),Y(t.node().path||`(form)`),M(2),Y(t.node().type),M(),N(`aria-label`,`Close details for `+(t.node().path||`the form`)),M(2),F(t.failed()?10:11),M(2),F(t.node().type===`control`&&!t.node().redacted?12:t.node().type===`control`?13:-1),M(5),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(2),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(4),F(t.canWrite()?-1:23),M(2),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},sR=[`heading`];function cR(e,t){if(e&1){let e=W();H(0,`div`,6)(1,`p`,9),J(2,`Could not explain this field. The devtools server did not answer.`),U(),H(3,`button`,11),Qg(`click`,function(){return O(e),k(K().retry())}),J(4,`Try again`),U()()}}function lR(e,t){if(e&1&&(H(0,`pre`,7),J(1),U()),e&2){let e=K();N(`aria-busy`,e.text()===null?`true`:null),M(),Y(e.text()??`Loading…`)}}function uR(e,t){if(e&1){let e=W();H(0,`div`,8)(1,`label`,15),J(2),U(),H(3,`input`,16),Qg(`input`,function(t){return O(e),k(K().draft.set(t.target.value))})(`keydown.enter`,function(){return O(e),k(K().setValue())}),U(),H(4,`button`,17),Qg(`click`,function(){return O(e),k(K().setValue())}),J(5,` Set `),U()()}if(e&2){let e=K();M(2),X(`New value for `,e.node().path),M(),Vg(`value`,e.draft()),M(),Vg(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`field-writes-off`)}}function dR(e,t){if(e&1&&(H(0,`p`,9),J(1),H(2,`a`,18),J(3,`How to unmask it`),U()()),e&2){let e=K();M(),X(` No Set editor: this field is redacted (`,e.redactLabel(e.node().redacted),`). `),M(),Vg(`href`,e.unmaskDocsUrl,ku)}}function fR(e,t){if(e&1&&(H(0,`p`,13),J(1),U()),e&2){let e=K();M(),Y(e.writesOff)}}var pR=class e{form=$.required();node=$.required();version=$(0);rpc=$(null);closed=Ov();canWrite=Q(()=>bE(this.rpc(),`forms`));writesOff=KT(`forms`);redactLabel=pE;unmaskDocsUrl=mE;target=Q(()=>`${this.form().id}|${this.node().path}`);text=Tv({source:this.target,computation:()=>null});failed=Tv({source:this.target,computation:()=>!1});attempt=j(0);heading=Rv.required(`heading`);host=E(Ml);draft=Tv({source:this.target,computation:()=>``});message=Tv({source:this.target,computation:()=>``});constructor(){uc(()=>{let e=this.form().id,t=this.node().path;this.version(),this.attempt();let n=this.rpc();Cv(()=>this.load(n,e,t))}),ey(()=>{this.target();let e=Cv(this.heading).nativeElement;this.host.nativeElement.scrollIntoView?.({block:`nearest`}),e.focus({preventScroll:!0})})}async load(e,t,n){if(!e)return;let r=await dE(e,`forms-explain`,{kind:`field`,form:t,path:n});if(this.form().id===t&&this.node().path===n){if(r===null){this.failed.set(!0);return}this.failed.set(!1),this.text.set(vE(r))}}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async act(e){let t=this.form().id,n=this.node().path,r=await hE(this.rpc(),{action:e,formId:t,path:n});this.form().id===t&&this.node().path===n&&this.message.set(r.expression?`${gE(r)} ${r.expression}`:gE(r))}async setValue(){let e=this.form().id,t=this.node().path,n=await hE(this.rpc(),{action:`set-value`,formId:e,path:t,value:this.draft(),coerce:!0,mode:`user`});this.form().id===e&&this.node().path===t&&this.message.set(gE(n))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-field-detail`]],viewQuery:function(e,t){e&1&&e_(t.heading,sR,5),e&2&&t_()},hostAttrs:[`role`,`region`,`aria-labelledby`,`forms-field-heading`],inputs:{form:[1,`form`],node:[1,`node`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{closed:`closed`},decls:26,vars:11,consts:[[`heading`,``],[1,`head`],[1,`section-label`],[`id`,`forms-field-heading`,`tabindex`,`-1`],[1,`tag`],[`type`,`button`,1,`small`,`close`,3,`click`],[`role`,`alert`,1,`failed`],[1,`explain`],[1,`editor`],[1,`muted`],[`role`,`group`,`aria-label`,`Field actions`,1,`row`],[`type`,`button`,1,`small`,3,`click`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`field-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`for`,`field-value`,1,`sr-only`],[`id`,`field-value`,`type`,`text`,`placeholder`,`New value, read as the current value's type`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field-input`,3,`input`,`keydown.enter`,`value`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&(H(0,`div`,1)(1,`span`,2),J(2,`Field`),U(),H(3,`h3`,3,0),J(5),U(),H(6,`span`,4),J(7),U(),H(8,`button`,5),Qg(`click`,function(){return t.closed.emit()}),J(9,` Close `),U()(),P(10,cR,5,0,`div`,6)(11,lR,2,2,`pre`,7),P(12,uR,6,4,`div`,8)(13,dR,4,2,`p`,9),H(14,`div`,10)(15,`button`,11),Qg(`click`,function(){return t.act(`focus`)}),J(16,`Focus`),U(),H(17,`button`,12),Qg(`click`,function(){return t.act(`mark-touched`)}),J(18,` Touch `),U(),H(19,`button`,12),Qg(`click`,function(){return t.act(`revalidate`)}),J(20,` Revalidate `),U(),H(21,`button`,11),Qg(`click`,function(){return t.act(`store-as-global`)}),J(22,`Store as global`),U()(),P(23,fR,2,1,`p`,13),H(24,`p`,14),J(25),U()),e&2&&(M(5),Y(t.node().path||`(form)`),M(2),Y(t.node().type),M(),N(`aria-label`,`Close details for `+(t.node().path||`the form`)),M(2),F(t.failed()?10:11),M(2),F(t.node().type===`control`&&!t.node().redacted?12:t.node().type===`control`?13:-1),M(5),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(2),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(4),F(t.canWrite()?-1:23),M(2),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
}
@@ -7316,7 +7316,7 @@ h3[_ngcontent-%COMP%]:focus-visible {
.status[_ngcontent-%COMP%]:empty {
height: 0;
margin: -12px 0 0;
-}`]})};function lR(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,4),J(2,`Could not explain this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,2),Qg(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),U()()}}function uR(e,t){if(e&1&&(H(0,`section`,5)(1,`h3`,6),J(2,`Submit`),U(),H(3,`pre`,7),J(4),U()(),H(5,`section`,8)(6,`h3`,9),J(7,`Payload`),U(),H(8,`pre`,7),J(9),U()()),e&2){let e=K();M(3),N(`aria-busy`,e.submit()===null?`true`:null),M(),Y(e.submit()??`Loading…`),M(4),N(`aria-busy`,e.payload()===null?`true`:null),M(),Y(e.payload()??`Loading…`)}}function dR(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,3),J(2,`Could not check this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,4),Qg(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),U()()}}function fR(e,t){e&1&&(H(0,`div`,1),Fg(1,`span`,5),H(2,`p`),J(3,`Checking the form for problems…`),U()())}function pR(e,t){e&1&&(H(0,`div`,2)(1,`span`,6),A(),H(2,`svg`,7),Fg(3,`path`,8),U()(),ps(),H(4,`p`,3),J(5,`No problems found`),U(),H(6,`p`),J(7,`For generic accessibility checks, run axe on the page.`),U()())}function mR(e,t){if(e&1){let e=W();H(0,`span`,15),J(1,`at `),H(2,`button`,19),Qg(`click`,function(){let t=O(e);return k(K(3).showField.emit(t))}),H(3,`span`,20),J(4,`Show field `),U(),H(5,`code`),J(6),U()()()}e&2&&(M(6),Y(t))}function hR(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,13),J(3),U(),H(4,`code`,14),J(5),U(),P(6,mR,7,1,`span`,15),U(),H(7,`p`,16),J(8),U(),H(9,`p`,17)(10,`span`,18),J(11,`Fix`),U(),J(12),U()()),e&2){let e,n=t.$implicit;N(`data-severity`,n.severity),M(2),N(`data-tone`,n.severity===`info`?``:n.severity===`error`?`bad`:`warn`),M(),Y(n.severity),M(2),Y(n.rule),M(),F((e=n.path)?6:-1,e),M(2),Y(n.message),M(4),X(` `,n.fix)}}function gR(e,t){if(e&1&&(H(0,`p`,9)(1,`span`,10),J(2),U(),J(3),U(),H(4,`ul`,11),I(5,hR,13,7,`li`,null,Cg),U()),e&2){let e=K();M(2),Y(e.findings().length),M(),X(` `,e.findings().length===1?`finding`:`findings`,` `),M(2),L(e.findings())}}var _R=class e{formId=$.required();version=$(0);rpc=$(null);submit=Tv({source:this.formId,computation:()=>null});payload=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});message=j(``);attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let[n,r]=await Promise.all([dE(t,`forms-explain`,{kind:`submit`,form:e}),dE(t,`forms-explain`,{kind:`payload`,form:e})]);if(this.formId()===e){if(n===null||r===null){this.failed.set(!0);return}this.failed.set(!1),this.submit.set(vE(n)),this.payload.set(vE(r))}})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async copyFixture(){let e=(await dE(this.rpc(),`forms-explain`,{kind:`fixture`,form:this.formId()})??``).match(/```ts\n([\s\S]*)```\s*$/)?.[1];if(!e){this.message.set(`No test fixture is available for this form.`);return}try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`Clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-submit`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:7,vars:2,consts:[[`role`,`alert`,1,`empty-state`],[1,`fixture`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`status`],[1,`empty-title`],[`aria-labelledby`,`forms-submit-title`,1,`block`],[`id`,`forms-submit-title`,1,`section-label`],[1,`explain`],[`aria-labelledby`,`forms-payload-title`,1,`block`],[`id`,`forms-payload-title`,1,`section-label`]],template:function(e,t){e&1&&(P(0,lR,7,0,`div`,0)(1,uR,10,4),H(2,`div`,1)(3,`button`,2),Qg(`click`,function(){return t.copyFixture()}),J(4,`Copy test fixture`),U(),H(5,`span`,3),J(6),U()()),e&2&&(F(+!t.failed()),M(6),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] {
+}`]})};function mR(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,4),J(2,`Could not explain this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,2),Qg(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),U()()}}function hR(e,t){if(e&1&&(H(0,`section`,5)(1,`h3`,6),J(2,`Submit`),U(),H(3,`pre`,7),J(4),U()(),H(5,`section`,8)(6,`h3`,9),J(7,`Payload`),U(),H(8,`pre`,7),J(9),U()()),e&2){let e=K();M(3),N(`aria-busy`,e.submit()===null?`true`:null),M(),Y(e.submit()??`Loading…`),M(4),N(`aria-busy`,e.payload()===null?`true`:null),M(),Y(e.payload()??`Loading…`)}}function gR(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,3),J(2,`Could not check this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,4),Qg(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),U()()}}function _R(e,t){e&1&&(H(0,`div`,1),Fg(1,`span`,5),H(2,`p`),J(3,`Checking the form for problems…`),U()())}function vR(e,t){e&1&&(H(0,`div`,2)(1,`span`,6),A(),H(2,`svg`,7),Fg(3,`path`,8),U()(),ps(),H(4,`p`,3),J(5,`No problems found`),U(),H(6,`p`),J(7,`For generic accessibility checks, run axe on the page.`),U()())}function yR(e,t){if(e&1){let e=W();H(0,`span`,15),J(1,`at `),H(2,`button`,19),Qg(`click`,function(){let t=O(e);return k(K(3).showField.emit(t))}),H(3,`span`,20),J(4,`Show field `),U(),H(5,`code`),J(6),U()()()}e&2&&(M(6),Y(t))}function bR(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,13),J(3),U(),H(4,`code`,14),J(5),U(),P(6,yR,7,1,`span`,15),U(),H(7,`p`,16),J(8),U(),H(9,`p`,17)(10,`span`,18),J(11,`Fix`),U(),J(12),U()()),e&2){let e,n=t.$implicit;N(`data-severity`,n.severity),M(2),N(`data-tone`,n.severity===`info`?``:n.severity===`error`?`bad`:`warn`),M(),Y(n.severity),M(2),Y(n.rule),M(),F((e=n.path)?6:-1,e),M(2),Y(n.message),M(4),X(` `,n.fix)}}function xR(e,t){if(e&1&&(H(0,`p`,9)(1,`span`,10),J(2),U(),J(3),U(),H(4,`ul`,11),I(5,bR,13,7,`li`,null,Cg),U()),e&2){let e=K();M(2),Y(e.findings().length),M(),X(` `,e.findings().length===1?`finding`:`findings`,` `),M(2),L(e.findings())}}var SR=class e{formId=$.required();version=$(0);rpc=$(null);submit=Tv({source:this.formId,computation:()=>null});payload=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});message=j(``);attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let[n,r]=await Promise.all([dE(t,`forms-explain`,{kind:`submit`,form:e}),dE(t,`forms-explain`,{kind:`payload`,form:e})]);if(this.formId()===e){if(n===null||r===null){this.failed.set(!0);return}this.failed.set(!1),this.submit.set(vE(n)),this.payload.set(vE(r))}})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async copyFixture(){let e=(await dE(this.rpc(),`forms-explain`,{kind:`fixture`,form:this.formId()})??``).match(/```ts\n([\s\S]*)```\s*$/)?.[1];if(!e){this.message.set(`No test fixture is available for this form.`);return}try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`Clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-submit`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:7,vars:2,consts:[[`role`,`alert`,1,`empty-state`],[1,`fixture`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`status`],[1,`empty-title`],[`aria-labelledby`,`forms-submit-title`,1,`block`],[`id`,`forms-submit-title`,1,`section-label`],[1,`explain`],[`aria-labelledby`,`forms-payload-title`,1,`block`],[`id`,`forms-payload-title`,1,`section-label`]],template:function(e,t){e&1&&(P(0,mR,7,0,`div`,0)(1,hR,10,4),H(2,`div`,1)(3,`button`,2),Qg(`click`,function(){return t.copyFixture()}),J(4,`Copy test fixture`),U(),H(5,`span`,3),J(6),U()()),e&2&&(F(+!t.failed()),M(6),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
}
@@ -7588,7 +7588,7 @@ code[_ngcontent-%COMP%] {
flex-wrap: wrap;
gap: 8px 12px;
align-items: center;
-}`]})},vR=class e{formId=$.required();version=$(0);rpc=$(null);showField=Ov();findings=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let n=await dE(t,`forms-lint`,{form:e});this.formId()===e&&(this.failed.set(n===null),n&&this.findings.set(n))})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-lint`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{showField:`showField`},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty-state`],[`role`,`status`,1,`empty-state`],[1,`empty-state`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-hidden`,`true`,1,`ok-icon`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`],[1,`summary`],[1,`tabular`],[1,`findings`],[1,`meta`],[1,`tag`,`severity`],[1,`rule`],[1,`muted`,`path`],[1,`message`],[1,`fix`],[1,`fix-label`],[`type`,`button`,1,`summary-link`,3,`click`],[1,`sr-only`]],template:function(e,t){e&1&&P(0,dR,7,0,`div`,0)(1,fR,4,0,`div`,1)(2,pR,8,0,`div`,2)(3,gR,7,2),e&2&&F(t.failed()?0:t.findings()===null?1:t.findings().length?3:2)},styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},CR=class e{formId=$.required();version=$(0);rpc=$(null);showField=Ov();findings=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let n=await dE(t,`forms-lint`,{form:e});this.formId()===e&&(this.failed.set(n===null),n&&this.findings.set(n))})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-lint`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{showField:`showField`},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty-state`],[`role`,`status`,1,`empty-state`],[1,`empty-state`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-hidden`,`true`,1,`ok-icon`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`],[1,`summary`],[1,`tabular`],[1,`findings`],[1,`meta`],[1,`tag`,`severity`],[1,`rule`],[1,`muted`,`path`],[1,`message`],[1,`fix`],[1,`fix-label`],[`type`,`button`,1,`summary-link`,3,`click`],[1,`sr-only`]],template:function(e,t){e&1&&P(0,gR,7,0,`div`,0)(1,_R,4,0,`div`,1)(2,vR,8,0,`div`,2)(3,xR,7,2),e&2&&F(t.failed()?0:t.findings()===null?1:t.findings().length?3:2)},styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
}
@@ -7944,7 +7944,7 @@ code[_ngcontent-%COMP%] {
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
-}`]})},yR=[`pathInput`],bR=()=>[],xR=(e,t)=>t.formId+`#`+t.seq;function SR(e,t){e&1&&V(0,`span`,6)}function CR(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,21),G(`change`,function(){let t=O(e).$implicit;return k(K().filter.set(t))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K();M(),R(`value`,e)(`checked`,e===n.filter()),M(),X(` `,e,` `)}}function wR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.outcome===`ran`?``:`bad`),M(),Y(e.outcome)}}function TR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;M(),X(`×`,e.count)}}function ER(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function DR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.ms>1e3?`warn`:``),M(),X(`pending `,e.ms,`ms`)}}function OR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.renders>20?`warn`:``),M(),Z(``,e.renders,` renders: `,(e.rendered??ov(3,bR)).join(`, `))}}function kR(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),z(2,`span`,30),J(3,`→`),B(),z(4,`span`,9),J(5,`changed to`),B()),e&2){let e=K(2).$implicit;M(),Y(e.prev)}}function AR(e,t){if(e&1&&(z(0,`div`,27),P(1,kR,6,1),J(2),B()),e&2){let e=K().$implicit;M(),F(e.prev===void 0?-1:1),M(),X(` `,e.detail,` `)}}function jR(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;M(),X(`from `,e.caller)}}function MR(e,t){if(e&1&&(z(0,`li`)(1,`time`),J(2),B(),z(3,`div`,22)(4,`div`,23)(5,`code`,24),J(6),B(),z(7,`span`,25),J(8),B(),P(9,wR,2,2,`span`,26),P(10,TR,2,1,`span`,26),P(11,ER,2,1,`span`,26),P(12,DR,2,2,`span`,26),P(13,OR,2,4,`span`,26),B(),P(14,AR,3,2,`div`,27),P(15,jR,2,1,`span`,28),B()()),e&2){let e=t.$implicit,n=K(2);N(`data-type`,e.type),M(),N(`datetime`,n.iso(e.timestamp)),M(),Y(n.time(e.timestamp)),M(4),Y(e.path||`(form)`),M(2),Y(e.type),M(),F(e.outcome?9:-1),M(),F(e.count&&e.count>1?10:-1),M(),F(e.origin?11:-1),M(),F(e.ms===void 0?-1:12),M(),F(e.renders?13:-1),M(),F(e.prev!==void 0||e.detail?14:-1),M(),F(e.caller?15:-1)}}function NR(e,t){if(e&1&&(z(0,`ol`,19),I(1,MR,16,12,`li`,null,xR),B()),e&2){let e=K();M(),L(e.shown())}}function PR(e,t){if(e&1){let e=W();z(0,`div`,20)(1,`p`,31),J(2,`No events match these filters`),B(),z(3,`p`),J(4,`Change the path, type or origin, or interact with the form to record more.`),B(),z(5,`button`,32),G(`click`,function(){return O(e),k(K().clearFilters())}),J(6,`Clear filters`),B()()}}function FR(e,t){e&1&&(z(0,`div`,20)(1,`p`,31),J(2,`No changes yet`),B(),z(3,`p`),J(4,`Type into the form to see them here.`),B()())}var IR=[`all`,`user`,`code`,`agent`,`devtools`],LR=[`value`,`status`,`touched`,`dirty`,`submit`,`reset`,`added`,`removed`,`moved`,`validators`],RR=class e{events=$.required();recording=$(!1);record=Ov();toggle(e){let t=e.target;t.checked=this.recording(),this.record.emit(!this.recording())}origins=IR;filter=j(`all`);pathFilter=j(``);typeFilter=j(`all`);pathInput=Rv(`pathInput`);typeOptions=Q(()=>{let e=new Set(this.events().map(e=>e.type)),t=this.typeFilter();t&&t!==`all`&&e.add(t);let n=LR.filter(t=>e.has(t)),r=[...e].filter(e=>!LR.includes(e)).sort();return[{value:`all`,label:`All types`},...[...n,...r].map(e=>({value:e,label:e}))]});matching=Q(()=>{let e=this.filter(),t=this.typeFilter()??`all`,n=this.pathFilter().trim().toLowerCase();return this.events().filter(r=>(e===`all`||r.origin===e)&&(t===`all`||r.type===t)&&(!n||r.path.toLowerCase().includes(n)))});shown=Q(()=>this.matching().slice(-100).reverse());filtered=Q(()=>this.filter()!==`all`||(this.typeFilter()??`all`)!==`all`||!!this.pathFilter().trim());summary=Q(()=>{let e=this.events().length,t=this.matching().length,n=e=>e===1?`event`:`events`,r=this.filtered()?` matching ${n(t)}`:` ${n(t)}`;return t>100?`Showing the latest 100 of ${t}${r}`:this.filtered()?`${t} of ${e} ${n(e)}`:`${e} ${n(e)}`});filterStatus=Q(()=>(this.filter(),this.typeFilter(),this.pathFilter(),Cv(()=>this.summary())));clearFilters(){this.pathFilter.set(``),this.typeFilter.set(`all`),this.filter.set(`all`),this.pathInput()?.nativeElement.focus()}iso(e){return new Date(e).toISOString()}time=zD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-timeline`]],viewQuery:function(e,t){e&1&&e_(t.pathInput,yR,5),e&2&&t_()},inputs:{events:[1,`events`],recording:[1,`recording`]},outputs:{record:`record`},decls:29,vars:10,consts:[[`pathInput`,``],[1,`toolbar`],[1,`record`],[`type`,`checkbox`,3,`change`,`checked`],[1,`record-text`],[1,`record-title`],[`aria-hidden`,`true`,1,`rec-dot`],[1,`record-hint`],[1,`chips`],[1,`sr-only`],[1,`filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Filter by field path…`,`aria-label`,`Filter by field path`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Event type`,3,`valueChange`,`options`,`value`],[1,`total`],[`role`,`status`,1,`sr-only`],[1,`events`],[1,`empty-state`],[`type`,`radio`,`name`,`timeline-origin`,3,`change`,`value`,`checked`],[1,`body`],[1,`line`],[1,`path`],[1,`event-type`],[1,`tag`],[1,`detail`],[1,`caller`],[1,`prev`],[`aria-hidden`,`true`,1,`arrow`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`]],template:function(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`label`,2)(2,`input`,3),G(`change`,function(e){return t.toggle(e)}),B(),z(3,`span`,4)(4,`span`,5),P(5,SR,1,0,`span`,6),J(6,` Record details `),B(),z(7,`span`,7),J(8,`Record calling code, validator changes and renders per keystroke`),B()()(),z(9,`fieldset`,8)(10,`legend`,9),J(11,`Show changes from`),B(),I(12,CR,3,3,`label`,null,wg),B()(),z(14,`div`,10)(15,`div`,11),A(),z(16,`svg`,12),V(17,`circle`,13)(18,`path`,14),B(),ps(),z(19,`input`,15,0),G(`input`,function(e){return t.pathFilter.set(e.target.value)})(`keydown.escape`,function(){return t.pathFilter.set(``)}),B()(),z(21,`app-select`,16),ev(`valueChange`,function(n){return O(e),$_(t.typeFilter,n)||(t.typeFilter=n),k(n)}),B(),z(22,`span`,17),J(23),B(),z(24,`span`,18),J(25),B()(),P(26,NR,3,0,`ol`,19)(27,PR,7,0,`div`,20)(28,FR,5,0,`div`,20)}e&2&&(M(),q(`on`,t.recording()),M(),R(`checked`,t.recording()),M(3),F(t.recording()?5:-1),M(7),L(t.origins),M(7),R(`value`,t.pathFilter()),M(2),R(`options`,t.typeOptions()),Q_(`value`,t.typeFilter),M(2),Y(t.summary()),M(2),Y(t.filterStatus()),M(),F(t.shown().length?26:t.events().length?27:28))},dependencies:[jD],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},wR=[`pathInput`],TR=()=>[],ER=(e,t)=>t.formId+`#`+t.seq;function DR(e,t){e&1&&V(0,`span`,6)}function OR(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,21),G(`change`,function(){let t=O(e).$implicit;return k(K().filter.set(t))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K();M(),R(`value`,e)(`checked`,e===n.filter()),M(),X(` `,e,` `)}}function kR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.outcome===`ran`?``:`bad`),M(),Y(e.outcome)}}function AR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;M(),X(`×`,e.count)}}function jR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function MR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.ms>1e3?`warn`:``),M(),X(`pending `,e.ms,`ms`)}}function NR(e,t){if(e&1&&(z(0,`span`,26),J(1),B()),e&2){let e=K().$implicit;N(`data-tone`,e.renders>20?`warn`:``),M(),Z(``,e.renders,` renders: `,(e.rendered??ov(3,TR)).join(`, `))}}function PR(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),z(2,`span`,30),J(3,`→`),B(),z(4,`span`,9),J(5,`changed to`),B()),e&2){let e=K(2).$implicit;M(),Y(e.prev)}}function FR(e,t){if(e&1&&(z(0,`div`,27),P(1,PR,6,1),J(2),B()),e&2){let e=K().$implicit;M(),F(e.prev===void 0?-1:1),M(),X(` `,e.detail,` `)}}function IR(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;M(),X(`from `,e.caller)}}function LR(e,t){if(e&1&&(z(0,`li`)(1,`time`),J(2),B(),z(3,`div`,22)(4,`div`,23)(5,`code`,24),J(6),B(),z(7,`span`,25),J(8),B(),P(9,kR,2,2,`span`,26),P(10,AR,2,1,`span`,26),P(11,jR,2,1,`span`,26),P(12,MR,2,2,`span`,26),P(13,NR,2,4,`span`,26),B(),P(14,FR,3,2,`div`,27),P(15,IR,2,1,`span`,28),B()()),e&2){let e=t.$implicit,n=K(2);N(`data-type`,e.type),M(),N(`datetime`,n.iso(e.timestamp)),M(),Y(n.time(e.timestamp)),M(4),Y(e.path||`(form)`),M(2),Y(e.type),M(),F(e.outcome?9:-1),M(),F(e.count&&e.count>1?10:-1),M(),F(e.origin?11:-1),M(),F(e.ms===void 0?-1:12),M(),F(e.renders?13:-1),M(),F(e.prev!==void 0||e.detail?14:-1),M(),F(e.caller?15:-1)}}function RR(e,t){if(e&1&&(z(0,`ol`,19),I(1,LR,16,12,`li`,null,ER),B()),e&2){let e=K();M(),L(e.shown())}}function zR(e,t){if(e&1){let e=W();z(0,`div`,20)(1,`p`,31),J(2,`No events match these filters`),B(),z(3,`p`),J(4,`Change the path, type or origin, or interact with the form to record more.`),B(),z(5,`button`,32),G(`click`,function(){return O(e),k(K().clearFilters())}),J(6,`Clear filters`),B()()}}function BR(e,t){e&1&&(z(0,`div`,20)(1,`p`,31),J(2,`No changes yet`),B(),z(3,`p`),J(4,`Type into the form to see them here.`),B()())}var VR=[`all`,`user`,`code`,`agent`,`devtools`],HR=[`value`,`status`,`touched`,`dirty`,`submit`,`reset`,`added`,`removed`,`moved`,`validators`],UR=class e{events=$.required();recording=$(!1);record=Ov();toggle(e){let t=e.target;t.checked=this.recording(),this.record.emit(!this.recording())}origins=VR;filter=j(`all`);pathFilter=j(``);typeFilter=j(`all`);pathInput=Rv(`pathInput`);typeOptions=Q(()=>{let e=new Set(this.events().map(e=>e.type)),t=this.typeFilter();t&&t!==`all`&&e.add(t);let n=HR.filter(t=>e.has(t)),r=[...e].filter(e=>!HR.includes(e)).sort();return[{value:`all`,label:`All types`},...[...n,...r].map(e=>({value:e,label:e}))]});matching=Q(()=>{let e=this.filter(),t=this.typeFilter()??`all`,n=this.pathFilter().trim().toLowerCase();return this.events().filter(r=>(e===`all`||r.origin===e)&&(t===`all`||r.type===t)&&(!n||r.path.toLowerCase().includes(n)))});shown=Q(()=>this.matching().slice(-100).reverse());filtered=Q(()=>this.filter()!==`all`||(this.typeFilter()??`all`)!==`all`||!!this.pathFilter().trim());summary=Q(()=>{let e=this.events().length,t=this.matching().length,n=e=>e===1?`event`:`events`,r=this.filtered()?` matching ${n(t)}`:` ${n(t)}`;return t>100?`Showing the latest 100 of ${t}${r}`:this.filtered()?`${t} of ${e} ${n(e)}`:`${e} ${n(e)}`});filterStatus=Q(()=>(this.filter(),this.typeFilter(),this.pathFilter(),Cv(()=>this.summary())));clearFilters(){this.pathFilter.set(``),this.typeFilter.set(`all`),this.filter.set(`all`),this.pathInput()?.nativeElement.focus()}iso(e){return new Date(e).toISOString()}time=zD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-timeline`]],viewQuery:function(e,t){e&1&&e_(t.pathInput,wR,5),e&2&&t_()},inputs:{events:[1,`events`],recording:[1,`recording`]},outputs:{record:`record`},decls:29,vars:10,consts:[[`pathInput`,``],[1,`toolbar`],[1,`record`],[`type`,`checkbox`,3,`change`,`checked`],[1,`record-text`],[1,`record-title`],[`aria-hidden`,`true`,1,`rec-dot`],[1,`record-hint`],[1,`chips`],[1,`sr-only`],[1,`filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Filter by field path…`,`aria-label`,`Filter by field path`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Event type`,3,`valueChange`,`options`,`value`],[1,`total`],[`role`,`status`,1,`sr-only`],[1,`events`],[1,`empty-state`],[`type`,`radio`,`name`,`timeline-origin`,3,`change`,`value`,`checked`],[1,`body`],[1,`line`],[1,`path`],[1,`event-type`],[1,`tag`],[1,`detail`],[1,`caller`],[1,`prev`],[`aria-hidden`,`true`,1,`arrow`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`]],template:function(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`label`,2)(2,`input`,3),G(`change`,function(e){return t.toggle(e)}),B(),z(3,`span`,4)(4,`span`,5),P(5,DR,1,0,`span`,6),J(6,` Record details `),B(),z(7,`span`,7),J(8,`Record calling code, validator changes and renders per keystroke`),B()()(),z(9,`fieldset`,8)(10,`legend`,9),J(11,`Show changes from`),B(),I(12,OR,3,3,`label`,null,wg),B()(),z(14,`div`,10)(15,`div`,11),A(),z(16,`svg`,12),V(17,`circle`,13)(18,`path`,14),B(),ps(),z(19,`input`,15,0),G(`input`,function(e){return t.pathFilter.set(e.target.value)})(`keydown.escape`,function(){return t.pathFilter.set(``)}),B()(),z(21,`app-select`,16),ev(`valueChange`,function(n){return O(e),$_(t.typeFilter,n)||(t.typeFilter=n),k(n)}),B(),z(22,`span`,17),J(23),B(),z(24,`span`,18),J(25),B()(),P(26,RR,3,0,`ol`,19)(27,zR,7,0,`div`,20)(28,BR,5,0,`div`,20)}e&2&&(M(),q(`on`,t.recording()),M(),R(`checked`,t.recording()),M(3),F(t.recording()?5:-1),M(7),L(t.origins),M(7),R(`value`,t.pathFilter()),M(2),R(`options`,t.typeOptions()),Q_(`value`,t.typeFilter),M(2),Y(t.summary()),M(2),Y(t.filterStatus()),M(),F(t.shown().length?26:t.events().length?27:28))},dependencies:[jD],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
}
@@ -8537,7 +8537,7 @@ time[_ngcontent-%COMP%] {
justify-content: center;
padding: 0 8px;
}
-}`]})},zR=(e,t)=>t.path;function BR(e,t){e&1&&(H(0,`span`,6),J(1,`duplicate name`),U())}function VR(e,t){if(e&1&&(H(0,`p`,7),J(1),U()),e&2){let e=K();M(),Y(e.description)}}function HR(e,t){if(e&1&&(H(0,`p`,8),J(1),U()),e&2){let e=K();M(),Y(e.error)}}function UR(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),J(3),U()),e&2){let e=t.$implicit;M(2),Y(e.path),M(),X(` is `,e.reason,` `)}}function WR(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,`Angular could not infer an input schema. These fields block it:`),U(),H(3,`ul`),I(4,UR,4,2,`li`,null,zR),U()()),e&2){let e=K();M(4),L(e.blocking)}}function GR(e,t){e&1&&(H(0,`span`,12),J(1,`required`),U())}function KR(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),P(3,GR,2,0,`span`,12),U()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e),M(),F(n.isRequired(e)?3:-1)}}function qR(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,`Inputs`),U(),H(3,`ul`,11),I(4,KR,4,2,`li`,null,wg),U()()),e&2){let e=K();M(4),L(e.inputs)}}function JR(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),J(3),U()),e&2){let e=t.$implicit;M(2),Y(e.path),M(),X(` is now `,e.now?`required`:`optional`,` `)}}function YR(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,` Required changed since registration. Angular reads it once, so agents still see the old schema: `),U(),H(3,`ul`),I(4,JR,4,2,`li`,null,zR),U()()),e&2){let e=K();M(4),L(e.requiredChanged)}}function XR(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K().$implicit;M(),X(``,e.ms,` ms`)}}function ZR(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K().$implicit;M(),X(`fields `,e.fields.join(`, `))}}function QR(e,t){if(e&1&&(H(0,`pre`,13),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function $R(e,t){if(e&1&&(H(0,`li`)(1,`time`),J(2),dv(3,`date`),U(),H(4,`span`,5),J(5),U(),P(6,XR,2,1,`span`,10),P(7,ZR,2,1,`span`,10),P(8,QR,2,1,`pre`,13),U()),e&2){let e=t.$implicit,n=K(3);M(),N(`datetime`,n.iso(e.at)),M(),Y(mv(3,7,e.at,`HH:mm:ss`)),M(2),N(`data-state`,e.outcome),M(),Y(n.outcome(e.outcome)),M(),F(e.ms===void 0?-1:6),M(),F(e.fields?.length?7:-1),M(),F(e.detail?8:-1)}}function ez(e,t){if(e&1&&(H(0,`ul`),I(1,$R,9,10,`li`,null,Cg),U()),e&2){let e=K();M(),L(e.calls)}}function tz(e,t){e&1&&(H(0,`p`,10),J(1,` Calls are not recorded for a tool registered before the inspector attached. `),U())}function nz(e,t){e&1&&(H(0,`p`,10),J(1,`No agent has called this tool since the inspector attached.`),U())}function rz(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,2)(2,`h3`,3),J(3,`WebMCP tool`),U(),H(4,`code`,4),J(5),U(),H(6,`span`,5),J(7),U(),P(8,BR,2,0,`span`,6),U(),P(9,VR,2,1,`p`,7),P(10,HR,2,1,`p`,8),P(11,WR,6,0,`div`,9),P(12,qR,6,0,`div`,9),P(13,YR,6,0,`div`,9),H(14,`div`,9)(15,`p`,10),J(16,`Recent calls`),U(),P(17,ez,3,0,`ul`)(18,tz,2,0,`p`,10)(19,nz,2,0,`p`,10),U()()),e&2){let e=t,n=K();M(5),Y(e.name),M(),N(`data-state`,e.status),M(),Y(n.statusText()),M(),F(e.duplicate?8:-1),M(),F(e.description?9:-1),M(),F(e.status===`failed`&&e.error&&e.error!==`schema`?10:-1),M(),F(e.blocking?.length?11:-1),M(),F(e.inputs?.length?12:-1),M(),F(e.requiredChanged?.length?13:-1),M(4),F(e.calls?.length?17:e.seen===`list`?18:19)}}function iz(e,t){e&1&&(H(0,`p`,1),J(1,` This app uses `),H(2,`code`),J(3,`provideExperimentalWebMcpForms()`),U(),J(4,`, but the browser has no `),H(5,`code`),J(6,`modelContext`),U(),J(7,`, so Angular registers no WebMCP tool for this form. `),U())}var az={running:`running`,submitted:`submitted`,failed:`submit failed`,done:`done`,threw:`threw`},oz=class e{tool=$();page=$();signalForm=$(!1);statusText=Q(()=>{let e=this.tool();return e?e.status===`failed`?`not registered`:e.status===`registering`?`registering`:e.seen===`list`?`registered before the inspector attached`:`registered`:``});noModelContext=Q(()=>{let e=this.page();return this.signalForm()&&!!e&&!e.modelContext&&!!e.provided});isRequired(e){let t=e.slice(0,e.lastIndexOf(`:`));return this.tool()?.required?.includes(t)??!1}outcome(e){return az[e]??e}iso(e){return new Date(e).toISOString()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-webmcp`]],inputs:{tool:[1,`tool`],page:[1,`page`],signalForm:[1,`signalForm`]},decls:2,vars:1,consts:[[`aria-labelledby`,`forms-webmcp-title`,1,`webmcp`],[1,`note`],[1,`head`],[`id`,`forms-webmcp-title`,1,`section-label`],[1,`name`],[1,`state`],[`data-state`,`failed`,1,`state`],[1,`description`],[1,`problem`],[1,`group`],[1,`muted`],[1,`inputs`],[1,`tag`],[1,`detail`]],template:function(e,t){if(e&1&&P(0,rz,20,10,`section`,0)(1,iz,8,0,`p`,1),e&2){let e;F((e=t.tool())?0:t.noModelContext()?1:-1,e)}},dependencies:[ib],styles:[`[_nghost-%COMP%] {
+}`]})},WR=(e,t)=>t.path;function GR(e,t){e&1&&(H(0,`span`,6),J(1,`duplicate name`),U())}function KR(e,t){if(e&1&&(H(0,`p`,7),J(1),U()),e&2){let e=K();M(),Y(e.description)}}function qR(e,t){if(e&1&&(H(0,`p`,8),J(1),U()),e&2){let e=K();M(),Y(e.error)}}function JR(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),J(3),U()),e&2){let e=t.$implicit;M(2),Y(e.path),M(),X(` is `,e.reason,` `)}}function YR(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,`Angular could not infer an input schema. These fields block it:`),U(),H(3,`ul`),I(4,JR,4,2,`li`,null,WR),U()()),e&2){let e=K();M(4),L(e.blocking)}}function XR(e,t){e&1&&(H(0,`span`,12),J(1,`required`),U())}function ZR(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),P(3,XR,2,0,`span`,12),U()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e),M(),F(n.isRequired(e)?3:-1)}}function QR(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,`Inputs`),U(),H(3,`ul`,11),I(4,ZR,4,2,`li`,null,wg),U()()),e&2){let e=K();M(4),L(e.inputs)}}function $R(e,t){if(e&1&&(H(0,`li`)(1,`code`),J(2),U(),J(3),U()),e&2){let e=t.$implicit;M(2),Y(e.path),M(),X(` is now `,e.now?`required`:`optional`,` `)}}function ez(e,t){if(e&1&&(H(0,`div`,9)(1,`p`,10),J(2,` Required changed since registration. Angular reads it once, so agents still see the old schema: `),U(),H(3,`ul`),I(4,$R,4,2,`li`,null,WR),U()()),e&2){let e=K();M(4),L(e.requiredChanged)}}function tz(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K().$implicit;M(),X(``,e.ms,` ms`)}}function nz(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K().$implicit;M(),X(`fields `,e.fields.join(`, `))}}function rz(e,t){if(e&1&&(H(0,`pre`,13),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function iz(e,t){if(e&1&&(H(0,`li`)(1,`time`),J(2),dv(3,`date`),U(),H(4,`span`,5),J(5),U(),P(6,tz,2,1,`span`,10),P(7,nz,2,1,`span`,10),P(8,rz,2,1,`pre`,13),U()),e&2){let e=t.$implicit,n=K(3);M(),N(`datetime`,n.iso(e.at)),M(),Y(mv(3,7,e.at,`HH:mm:ss`)),M(2),N(`data-state`,e.outcome),M(),Y(n.outcome(e.outcome)),M(),F(e.ms===void 0?-1:6),M(),F(e.fields?.length?7:-1),M(),F(e.detail?8:-1)}}function az(e,t){if(e&1&&(H(0,`ul`),I(1,iz,9,10,`li`,null,Cg),U()),e&2){let e=K();M(),L(e.calls)}}function oz(e,t){e&1&&(H(0,`p`,10),J(1,` Calls are not recorded for a tool registered before the inspector attached. `),U())}function sz(e,t){e&1&&(H(0,`p`,10),J(1,`No agent has called this tool since the inspector attached.`),U())}function cz(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,2)(2,`h3`,3),J(3,`WebMCP tool`),U(),H(4,`code`,4),J(5),U(),H(6,`span`,5),J(7),U(),P(8,GR,2,0,`span`,6),U(),P(9,KR,2,1,`p`,7),P(10,qR,2,1,`p`,8),P(11,YR,6,0,`div`,9),P(12,QR,6,0,`div`,9),P(13,ez,6,0,`div`,9),H(14,`div`,9)(15,`p`,10),J(16,`Recent calls`),U(),P(17,az,3,0,`ul`)(18,oz,2,0,`p`,10)(19,sz,2,0,`p`,10),U()()),e&2){let e=t,n=K();M(5),Y(e.name),M(),N(`data-state`,e.status),M(),Y(n.statusText()),M(),F(e.duplicate?8:-1),M(),F(e.description?9:-1),M(),F(e.status===`failed`&&e.error&&e.error!==`schema`?10:-1),M(),F(e.blocking?.length?11:-1),M(),F(e.inputs?.length?12:-1),M(),F(e.requiredChanged?.length?13:-1),M(4),F(e.calls?.length?17:e.seen===`list`?18:19)}}function lz(e,t){e&1&&(H(0,`p`,1),J(1,` This app uses `),H(2,`code`),J(3,`provideExperimentalWebMcpForms()`),U(),J(4,`, but the browser has no `),H(5,`code`),J(6,`modelContext`),U(),J(7,`, so Angular registers no WebMCP tool for this form. `),U())}var uz={running:`running`,submitted:`submitted`,failed:`submit failed`,done:`done`,threw:`threw`},dz=class e{tool=$();page=$();signalForm=$(!1);statusText=Q(()=>{let e=this.tool();return e?e.status===`failed`?`not registered`:e.status===`registering`?`registering`:e.seen===`list`?`registered before the inspector attached`:`registered`:``});noModelContext=Q(()=>{let e=this.page();return this.signalForm()&&!!e&&!e.modelContext&&!!e.provided});isRequired(e){let t=e.slice(0,e.lastIndexOf(`:`));return this.tool()?.required?.includes(t)??!1}outcome(e){return uz[e]??e}iso(e){return new Date(e).toISOString()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-webmcp`]],inputs:{tool:[1,`tool`],page:[1,`page`],signalForm:[1,`signalForm`]},decls:2,vars:1,consts:[[`aria-labelledby`,`forms-webmcp-title`,1,`webmcp`],[1,`note`],[1,`head`],[`id`,`forms-webmcp-title`,1,`section-label`],[1,`name`],[1,`state`],[`data-state`,`failed`,1,`state`],[1,`description`],[1,`problem`],[1,`group`],[1,`muted`],[1,`inputs`],[1,`tag`],[1,`detail`]],template:function(e,t){if(e&1&&P(0,cz,20,10,`section`,0)(1,lz,8,0,`p`,1),e&2){let e;F((e=t.tool())?0:t.noModelContext()?1:-1,e)}},dependencies:[ib],styles:[`[_nghost-%COMP%] {
display: contents;
}
@@ -8657,7 +8657,7 @@ li[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] + *[_ngcontent-%COMP%] {
font-size: 12px;
white-space: pre-wrap;
overflow-wrap: anywhere;
-}`]})},sz=()=>[],cz=(e,t)=>t.id,lz=(e,t)=>t.node.path;function uz(e,t){e&1&&(z(0,`div`,1),V(1,`span`,5),z(2,`p`),J(3,`Connecting to the devtools server…`),B()())}function dz(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`,6),J(2,`Could not load forms`),B(),z(3,`p`,7),J(4,` The devtools server did not answer. Check that the app is running, then try again. `),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),B()()}}function fz(e,t){e&1&&(z(0,`div`,1),V(1,`span`,5),z(2,`p`),J(3,`Loading forms…`),B()())}function pz(e,t){e&1&&(z(0,`div`,3)(1,`p`,6),J(2,`No forms on the page yet`),B(),z(3,`p`,7),J(4,` Open a page that renders a form. Signal Forms, reactive and template-driven forms all show up here, in development builds. `),B()())}function mz(e,t){if(e&1){let e=W();z(0,`div`,3)(1,`p`,6),J(2,`No forms on this page`),B(),z(3,`p`,7),J(4),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K().allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}if(e&2){let e=K();M(4),Z(` Other connected tabs report `,e.forms().length,` `,e.forms().length===1?`form`:`forms`,`. `)}}function hz(e,t){if(e&1){let e=W();z(0,`label`,12)(1,`input`,16),G(`change`,function(t){return O(e),k(K(2).allPages.set(t.target.checked))}),B(),J(2,` All pages `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.allPages())}}function gz(e,t){e&1&&(z(0,`span`,23),J(1),z(2,`span`,22),J(3,` errors`),B()()),e&2&&(M(),Y(t))}function _z(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,17),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectForm(t.id))}),V(2,`span`,18),z(3,`span`,19),J(4),B(),z(5,`span`,20),J(6),z(7,`span`,21),J(8),B(),z(9,`span`,22),J(10),B()(),P(11,gz,4,1,`span`,23),B()()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`active`,n.id===r.selected()?.id),N(`aria-current`,n.id===r.selected()?.id?`true`:null),M(),N(`data-status`,n.root.status),M(),N(`title`,n.label),M(),Y(n.label),M(2),X(``,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),X(`, `,n.root.status),M(),F((e=r.counts().get(n.id)?.errors)?11:-1,e)}}function vz(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`h2`,24),J(2),B(),z(3,`p`,25),J(4,` This form is no longer on the page. It comes back here if the page renders it again. `),B(),z(5,`button`,8),G(`click`,function(){O(e);let t=K(2);return k(t.selectForm(t.visible()[0].id))}),J(6),B()()}if(e&2){let e=K(2);M(2),Y(t),M(4),X(` Show `,e.visible()[0].label,` `)}}function yz(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`h2`,24),J(2),B(),z(3,`p`,7),J(4,`This form is on another page. Tick "All pages" to see it again.`),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K(2).allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}e&2&&(M(2),Y(t))}function bz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K();M(),Y(e.submitted?`submitted`:`not submitted`)}}function xz(e,t){e&1&&(z(0,`span`),J(1,`submitting`),B())}function Sz(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,47),G(`click`,function(){let t=O(e).$implicit;return k(K(4).showField(t.path))}),z(2,`span`,22),J(3,`Show field `),B(),z(4,`code`),J(5),B(),z(6,`span`,22),J(7,`:`),B(),J(8),z(9,`code`,48),J(10),B()()()}if(e&2){let e=t.$implicit;M(5),Y(e.path||`(form)`),M(3),X(` `,e.message,` `),M(2),Y(e.kind)}}function Cz(e,t){if(e&1&&(z(0,`details`,31)(1,`summary`),J(2),B(),z(3,`ul`),I(4,Sz,11,3,`li`,null,Cg),B()()),e&2){let e=K();M(2),X(`Error summary (`,e.errorSummary.length,`)`),M(2),L(e.errorSummary)}}function wz(e,t){if(e&1){let e=W();z(0,`button`,35),G(`click`,function(){return O(e),k(K(3).confirmAct(`restore`))}),J(1),B()}if(e&2){let e=K(3);q(`armed`,e.armed()===`restore`),R(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`forms-writes-off`)(`title`,`Restore `+e.snapshot()),M(),X(` `,e.armed()===`restore`?`Confirm restore`:`Restore `+e.snapshot(),` `)}}function Tz(e,t){if(e&1&&(z(0,`p`,41),J(1),B()),e&2){let e=K(3);M(),Y(e.writesOff)}}function Ez(e,t){if(e&1){let e=W();z(0,`button`,49),G(`click`,function(){let t=O(e).$implicit;return k(K(3).tab_.set(t.id))}),J(1),B()}if(e&2){let e=t.$implicit,n=K(3);R(`id`,`forms-tab-`+e.id),N(`aria-selected`,e.id===n.tab_())(`aria-controls`,`forms-panel-`+e.id)(`tabindex`,e.id===n.tab_()?0:-1),M(),X(` `,e.label,` `)}}function Dz(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,16),G(`change`,function(){let t=O(e).$implicit;return k(K(4).toggleChip(t.id))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K(4);M(),R(`checked`,n.active().has(e.id)),M(),X(` `,e.label,` `)}}function Oz(e,t){if(e&1&&(z(0,`div`,7),J(1,` typed `),z(2,`code`),J(3),dv(4,`json`),B(),J(5,`, not in the model yet `),B()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.uncommitted))}}function kz(e,t){if(e&1&&(z(0,`div`,7),J(1,` resets to `),z(2,`code`),J(3),dv(4,`json`),B()()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.defaultValue))}}function Az(e,t){if(e&1&&(z(0,`code`),J(1),dv(2,`json`),B(),P(3,Oz,6,3,`div`,7),P(4,kz,5,3,`div`,7)),e&2){let e=K().$implicit;M(),Y(pv(2,3,e.node.value)),M(2),F(e.node.uncommitted===void 0?-1:3),M(),F(e.node.defaultValue===void 0?-1:4)}}function jz(e,t){e&1&&(z(0,`span`,7),J(1,`not created yet`),B())}function Mz(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;N(`data-status`,e.node.status),M(),Y(e.node.status)}}function Nz(e,t){e&1&&(z(0,`span`),J(1,`touched`),B())}function Pz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.changed===!1?`dirty, unchanged`:`dirty`)}}function Fz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`not validated (`,e.node.skipped,`)`)}}function Iz(e,t){if(e&1&&(z(0,`span`,65),J(1),B()),e&2){let e=K().$implicit;M(),X(`stale: `,e.node.stale.join(`, `))}}function Lz(e,t){e&1&&(z(0,`span`,65),J(1,`view out of sync`),B())}function Rz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),X(`redacted: `,t.redactLabel(e.node.redacted))}}function zz(e,t){e&1&&(z(0,`span`),J(1,`required`),B())}function Bz(e,t){e&1&&(z(0,`span`),J(1,`readonly`),B())}function Vz(e,t){e&1&&(z(0,`span`),J(1,`hidden`),B())}function Hz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`updates on `,e.node.updateOn)}}function Uz(e,t){e&1&&(z(0,`span`),J(1,`debouncing`),B())}function Wz(e,t){e&1&&(z(0,`span`),J(1,`validators`),B())}function Gz(e,t){e&1&&(z(0,`span`),J(1,`async validator`),B())}function Kz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function qz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.accessor)}}function Jz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`name `,e.node.name)}}function Yz(e,t){if(e&1&&(z(0,`span`),J(1),dv(2,`json`),B()),e&2){let e=t.$implicit;M(),X(`metadata `,pv(2,1,e))}}function Xz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),X(`disabled: `,e)}}function Zz(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit;M(),X(`at `,e.params.path)}}function Qz(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.sourceText(e))}}function $z(e,t){if(e&1&&(z(0,`div`),J(1),z(2,`code`,48),J(3),B(),P(4,Zz,2,1,`span`,68),P(5,Qz,2,1,`span`,68),B()),e&2){let e=t.$implicit,n=K().$implicit,r=K(4);M(),X(` `,r.errorText(n.node,e),` `),M(2),Y(e.kind),M(),F(e.kind===`standardSchema`&&e.params?.path?4:-1),M(),F(e.source?5:-1)}}function eB(e,t){e&1&&(z(0,`div`,67),J(1,`not shown to the user`),B())}function tB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,69),J(2),B()()),e&2){let e=K().$implicit;M(),C_(`padding-left`,28+e.depth*16,`px`),M(),Z(` `,e.node.truncated,` more fields under `,e.node.path||`the form`,` not shown `)}}function nB(e,t){if(e&1){let e=W();z(0,`tr`,58),G(`mouseenter`,function(){let t=O(e).$implicit,n=K(2);return k(K(2).highlight(n.id,t.node.path))})(`mouseleave`,function(){return O(e),k(K(4).highlight(null,``))}),z(1,`th`,59)(2,`button`,60),G(`focus`,function(){let t=O(e).$implicit,n=K(2);return k(K(2).highlight(n.id,t.node.path))})(`blur`,function(){return O(e),k(K(4).highlight(null,``))})(`click`,function(){let t=O(e).$implicit;return k(K(4).toggleField(t.node.path))}),J(3),B(),z(4,`span`,61),J(5),B()(),z(6,`td`,62),P(7,Az,5,5),B(),z(8,`td`,63),P(9,jz,2,0,`span`,7)(10,Mz,2,2,`span`,29),B(),z(11,`td`,64),P(12,Nz,2,0,`span`),P(13,Pz,2,1,`span`),P(14,Fz,2,1,`span`),P(15,Iz,2,1,`span`,65),P(16,Lz,2,0,`span`,65),P(17,Rz,2,1,`span`),P(18,zz,2,0,`span`),P(19,Bz,2,0,`span`),P(20,Vz,2,0,`span`),P(21,Hz,2,1,`span`),P(22,Uz,2,0,`span`),P(23,Wz,2,0,`span`),P(24,Gz,2,0,`span`),I(25,Kz,2,1,`span`,null,wg),P(27,qz,2,1,`span`),P(28,Jz,2,1,`span`),I(29,Yz,3,3,`span`,null,Cg),I(31,Xz,2,1,`span`,null,Cg),B(),z(33,`td`,66),I(34,$z,6,4,`div`,null,Cg),P(36,eB,2,0,`div`,67),B()(),P(37,tB,3,4,`tr`)}if(e&2){let e=t.$implicit,n=K(4);q(`invalid`,e.node.errors.length),M(),C_(`padding-left`,12+e.depth*16,`px`),M(),N(`aria-label`,`Show details for `+(e.node.path||`the form`))(`aria-pressed`,e.node.path===n.fieldPath())(`title`,e.node.path||`(form)`),M(),X(` `,e.node.key||`(form)`,` `),M(2),Y(e.node.type),M(2),F(e.node.type===`control`?7:-1),M(2),F(e.node.materialized===!1?9:10),M(3),F(e.node.touched?12:-1),M(),F(e.node.dirty?13:-1),M(),F(e.node.skipped?14:-1),M(),F(e.node.stale?.length?15:-1),M(),F(e.node.dom?.drift===void 0?-1:16),M(),F(e.node.redacted?17:-1),M(),F(e.node.required?18:-1),M(),F(e.node.readonly?19:-1),M(),F(e.node.hidden?20:-1),M(),F(e.node.updateOn?21:-1),M(),F(e.node.debouncing?22:-1),M(),F(e.node.validators?.sync?23:-1),M(),F(e.node.validators?.async?24:-1),M(),L(n.constraintList(e.node)),M(2),F(e.node.accessor?27:-1),M(),F(e.node.name?28:-1),M(),L(e.node.metadata??ov(28,sz)),M(2),L(e.node.disabledReasons??ov(29,sz)),M(3),L(e.node.errors),M(2),F(e.node.errors.length&&e.node.dom?.errorShown===!1?36:-1),M(),F(e.node.truncated?37:-1)}}function rB(e,t){e&1&&J(0),e&2&&X(` No field path matches "`,K(5).filter(),`". `)}function iB(e,t){e&1&&J(0,` No field matches the selected filters. `)}function aB(e,t){if(e&1){let e=W();z(0,`button`,8),G(`click`,function(){O(e),K(2);let t=n_(2);return k(K(3).clearFilters(t))}),J(1,` Clear filters `),B()}}function oB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,70)(2,`p`),P(3,rB,1,1)(4,iB,1,0),B(),P(5,aB,2,0,`button`,71),B()()),e&2){let e=K(4);M(3),F(e.filter()?3:4),M(2),F(e.filtering()?5:-1)}}function sB(e,t){if(e&1){let e=W();z(0,`app-forms-field-detail`,72),G(`closed`,function(){return O(e),k(K(4).closeField())}),B()}if(e&2){let e=K(2),n=K(2);R(`form`,e)(`node`,t)(`version`,n.version())(`rpc`,n.rpc())}}function cB(e,t){if(e&1){let e=W();z(0,`div`,50)(1,`input`,51,0),G(`input`,function(t){return O(e),k(K(3).onFilter(t))})(`keydown.escape`,function(){return O(e),k(K(3).filter.set(``))}),B(),z(3,`fieldset`,52)(4,`legend`,22),J(5,`Show only fields that are`),B(),I(6,Dz,3,2,`label`,null,cz),B()(),z(8,`p`,53),J(9),B(),z(10,`div`,54)(11,`table`,55)(12,`thead`)(13,`tr`)(14,`th`,56),J(15,`Field`),B(),z(16,`th`,56),J(17,`Value`),B(),z(18,`th`,56),J(19,`Status`),B(),z(20,`th`,56),J(21,`State`),B(),z(22,`th`,56),J(23,`Errors`),B()()(),z(24,`tbody`),I(25,nB,38,30,null,null,lz,!1,oB,6,2,`tr`),B()()(),P(28,sB,1,4,`app-forms-field-detail`,57)}if(e&2){let e,t=K(3);M(),R(`value`,t.filter()),M(5),L(t.chips),M(3),Y(t.filterStatus()),M(16),L(t.rows()),M(3),F((e=t.selectedNode())?28:-1,e)}}function lB(e,t){if(e&1){let e=W();V(0,`app-limit-note`,73),z(1,`app-forms-timeline`,74),G(`record`,function(t){return O(e),k(K(3).setRecording(t))}),B()}if(e&2){let e=K(3);R(`dropped`,e.droppedEvents())(`max`,e.maxEvents()),M(),R(`events`,e.selectedEvents())(`recording`,e.recording())}}function uB(e,t){if(e&1&&V(0,`app-forms-submit`,46),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function dB(e,t){if(e&1){let e=W();z(0,`app-forms-lint`,75),G(`showField`,function(t){return O(e),k(K(3).showField(t))}),B()}if(e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function fB(e,t){if(e&1){let e=W();z(0,`section`,15)(1,`div`,26)(2,`h2`,24),J(3),B(),z(4,`p`,27),J(5),z(6,`code`),J(7),B()()(),z(8,`div`,28)(9,`span`,29),J(10),B(),z(11,`span`),J(12),B(),z(13,`span`),J(14),B(),P(15,bz,2,1,`span`),P(16,xz,2,0,`span`),z(17,`span`,30)(18,`b`),J(19),B(),J(20,` fields · `),z(21,`b`),J(22),B(),J(23,` errors`),B()(),P(24,Cz,6,1,`details`,31),V(25,`app-forms-webmcp`,32),z(26,`div`,33)(27,`div`,34)(28,`button`,35),G(`click`,function(){return O(e),k(K(2).act(`touch-all`))}),J(29,` Touch all `),B(),z(30,`button`,35),G(`click`,function(){return O(e),k(K(2).act(`revalidate`))}),J(31,` Revalidate `),B(),z(32,`button`,8),G(`click`,function(){return O(e),k(K(2).act(`focus-first-invalid`))}),J(33,` Focus first invalid `),B(),z(34,`button`,8),G(`click`,function(){O(e);let t=K(2);return k(t.picking()?t.cancelPick():t.pick())}),J(35),B(),V(36,`span`,36),z(37,`button`,8),G(`click`,function(){return O(e),k(K(2).act(`snapshot`))}),J(38,`Snapshot`),B(),P(39,wz,2,6,`button`,37),V(40,`span`,38),z(41,`button`,39),G(`click`,function(){return O(e),k(K(2).confirmAct(`reset`))}),J(42),B(),z(43,`button`,40),G(`click`,function(){return O(e),k(K(2).confirmAct(`submit`))}),J(44),B()(),P(45,Tz,2,1,`p`,41),z(46,`p`,42),J(47),B()(),z(48,`div`,43),G(`keydown`,function(t){return O(e),k(K(2).onKey(t))}),I(49,Ez,2,5,`button`,44,cz),B(),z(51,`div`,45),P(52,cB,29,4)(53,lB,2,4)(54,uB,1,3,`app-forms-submit`,46)(55,dB,1,3,`app-forms-lint`,46),B()()}if(e&2){let e,n=t,r=K(2);M(3),Y(n.label),M(2),X(` `,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),N(`data-status`,n.root.status),M(),Y(n.root.status),M(2),Y(n.root.dirty?`dirty`:`pristine`),M(2),Y(n.root.touched?`touched`:`untouched`),M(),F(n.submitted===void 0?-1:15),M(),F(n.root.submitting?16:-1),M(3),Y(r.counts().get(n.id)?.fields),M(2),q(`has-errors`,r.counts().get(n.id)?.errors),M(),Y(r.counts().get(n.id)?.errors),M(2),F(n.errorSummary?.length?24:-1),M(),R(`tool`,n.webMcp)(`page`,r.webMcpPage(n.id))(`signalForm`,n.kind===`signal`),M(3),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(2),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(4),q(`on`,r.picking()),N(`aria-pressed`,!!r.picking()),M(),X(` `,r.picking()?`Cancel picking`:`Pick field on page`,` `),M(4),F(r.snapshot()?39:-1),M(2),q(`armed`,r.armed()===`reset`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`reset`?`Confirm reset`:`Reset`,` `),M(),q(`armed`,r.armed()===`submit`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`submit`?`Confirm submit`:`Submit`,` `),M(),F(r.canWrite()?-1:45),M(2),Y(r.message()),M(2),L(r.tabs),M(2),R(`id`,`forms-panel-`+r.tab_()),N(`aria-labelledby`,`forms-tab-`+r.tab_()),M(),F((e=r.tab_())===`fields`?52:e===`timeline`?53:e===`submit`?54:e===`lint`?55:-1)}}function pB(e,t){if(e&1&&(z(0,`div`,4)(1,`div`,9)(2,`h2`,10),J(3,` Forms `),z(4,`span`,11),J(5),B()(),P(6,hz,3,1,`label`,12),z(7,`ul`,13),I(8,_z,12,10,`li`,null,cz),B()(),P(10,vz,7,2,`section`,14)(11,yz,7,1,`section`,14)(12,fB,56,41,`section`,15),B()),e&2){let e,t=K();M(5),Y(t.visible().length),M(),F(t.hostPageId&&(t.allPages()||t.otherPages())?6:-1),M(2),L(t.visible()),M(2),F((e=t.missing())?10:(e=t.hidden())?11:(e=t.selected())?12:-1,e)}}var mB=[{id:`fields`,label:`Fields`},{id:`timeline`,label:`Timeline`},{id:`submit`,label:`Submit`},{id:`lint`,label:`Lint`}],hB=[{id:`invalid`,label:`Invalid`},{id:`dirty`,label:`Dirty`},{id:`touched`,label:`Touched`},{id:`disabled`,label:`Disabled`},{id:`hidden-error`,label:`Error not shown`}];function gB(e,t){switch(t){case`invalid`:return e.errors.length>0;case`dirty`:return e.dirty&&e.type===`control`;case`touched`:return e.touched&&e.type===`control`;case`disabled`:return e.status===`DISABLED`;case`hidden-error`:return e.dom?.errorShown===!1}}function _B(e){return e.errors.length+(e.children??[]).reduce((e,t)=>e+_B(t),0)}function vB(e){return e.children?e.children.reduce((e,t)=>e+vB(t),0):+(e.type===`control`&&e.materialized!==!1)}var yB=class e{rpc=$(null);focus=$(null);canWrite=Q(()=>bE(this.rpc(),`forms`));redactLabel=pE;writesOff=KT(`forms`);focusHandled=Ov();forms=j([]);webMcp=j([]);events=j([]);loading=j(!0);failed=j(!1);selectedId=j(null);selectedLabel=j(null);hostPageId=eE();allPages=j(!1);visible=Q(()=>{let e=this.forms(),t=this.hostPageId;return t&&!this.allPages()?e.filter(e=>cE(e.id)===t):e});otherPages=Q(()=>this.forms().some(e=>cE(e.id)!==this.hostPageId));instrumented=j([]);recording=Q(()=>{let e=this.selected()?.id??``;return this.instrumented().some(t=>e.endsWith(`@${t}`))});filter=j(``);tabs=mB;chips=hB;tab_=j(`fields`);active=j(new Set);filtering=Q(()=>!!this.filter()||this.active().size>0);filterStatus=j(``);version=j(0);message=j(``);webMcpPage(e){let t=cE(e);return this.webMcp().find(e=>e.pageId===t)}picking=j(null);pickSeq=0;unsubscribe=null;destroyRef=E(Cs);host=E(Ml);injector=E(xs);counts=Q(()=>new Map(this.visible().map(e=>[e.id,{fields:vB(e.root),errors:_B(e.root)}])));chosen=Q(()=>{let e=this.selectedId();if(e===null)return null;let t=this.forms(),n=this.selectedLabel(),r=cE(e);return t.find(t=>t.id===e)??t.find(e=>e.label===n&&cE(e.id)===r)??null});selected=Q(()=>{let e=this.visible();if(this.selectedId()===null)return e[0]??null;let t=this.chosen();return t&&e.includes(t)?t:null});missing=Q(()=>this.selectedId()!==null&&!this.chosen()&&this.visible().length?this.selectedLabel()??this.selectedId():null);hidden=Q(()=>{let e=this.chosen();return e&&!this.selected()&&this.visible().length?e.label:null});selectedFormId=Q(()=>this.selected()?.id??null);fieldPath=Tv({source:this.selectedFormId,computation:()=>null});armed=Tv({source:this.selectedFormId,computation:()=>null});snapshot=Tv({source:this.selectedFormId,computation:()=>null});rows=Q(()=>{let e=this.selected();if(!e)return[];let t=this.filter().toLowerCase(),n=Array.from(this.active()),r=[],i=(e,a)=>{let o=r.length,s=(!t||e.path.toLowerCase().includes(t))&&n.every(t=>gB(e,t));for(let t of e.children??[])s=i(t,a+1)||s;return s&&r.splice(o,0,{node:e,depth:a}),s};return i(e.root,0),r});selectedNode=Q(()=>{let e=this.fieldPath(),t=this.selected();if(e===null||!t)return null;let n=t=>t.path===e?t:(t.children??[]).map(n).find(Boolean)??null;return n(t.root)});dropped=j({});droppedEvents=Q(()=>{let e=this.selected()?.id;return e?this.dropped()[cE(e)]??0:0});maxEvents=Q(()=>yE(this.rpc()).limits.formTimeline);selectedEvents=Q(()=>{let e=this.selected()?.id;return this.events().filter(t=>t.formId===e)});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.focus();e&&Cv(()=>{this.selectForm(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),this.highlight(null,``)})}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`forms`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.forms.set(t?.forms??[]),this.events.set(t?.events??[]),this.instrumented.set(t?.instrumented??[]),this.dropped.set(t?.dropped??{}),this.webMcp.set(t?.webMcp??[]),this.version.update(e=>e+1)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}async pick(){let e=this.selected();if(!e)return;let t=++this.pickSeq;this.picking.set(e.id),this.message.set(`Click a field in the app. Press Escape or Cancel picking to stop.`);let n=await hE(this.rpc(),{action:`pick`,formId:e.id});if(t!==this.pickSeq)return;this.picking.set(null);let r=n;if(!n.ok||!r.formId){this.message.set(gE(n));return}this.selectForm(r.formId),this.tab_.set(`fields`),this.fieldPath.set(r.path??``),this.message.set(`Picked ${r.path||`(form)`}.`)}cancelPick(){let e=this.picking();e&&hE(this.rpc(),{action:`cancel-pick`,formId:e})}async setRecording(e){let t=this.selected();if(!t)return;let n=await hE(this.rpc(),{action:`instrument`,formId:t.id,value:e});this.message.set(gE(n))}selectForm(e){this.hostPageId&&cE(e)&&cE(e)!==this.hostPageId&&this.allPages.set(!0),this.selectedId.set(e),this.selectedLabel.set(this.forms().find(t=>t.id===e)?.label??null),this.filter.set(``),this.fieldPath.set(null),this.snapshot.set(null),this.armed.set(null)}toggleField(e){this.fieldPath.update(t=>t===e?null:e)}closeField(){let e=this.host.nativeElement,t=e.querySelector(`button.field[aria-pressed="true"]`)??e.querySelector(`.table-scroll`);this.fieldPath.set(null),t?.focus()}showField(e){this.tab_.set(`fields`);let t=()=>this.rows().some(t=>t.node.path===e);t()||this.filter.set(``),t()||this.active.set(new Set),this.fieldPath.set(e),Id(()=>{let e=this.host.nativeElement;e.querySelector(`button.field[aria-pressed="true"]`)?.scrollIntoView?.({block:`nearest`}),(e.querySelector(`#forms-field-heading`)??e.querySelector(`.table-scroll`))?.focus()},{injector:this.injector})}toggleChip(e){this.active.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}async act(e,t={}){let n=this.selected();if(!n)return;this.armed.set(null);let r=await hE(this.rpc(),{action:e,formId:n.id,...t});r.snapshot&&this.selected()?.id===n.id&&this.snapshot.set(r.snapshot),this.message.set(gE(r))}confirmAct(e){if(this.armed()!==e){this.armed.set(e),this.message.set(`Press "Confirm ${e}" to ${e} the form in the app.`);return}this.act(e,{confirm:!0,snapshot:this.snapshot()??void 0})}onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.tab_()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.tab_.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#forms-tab-${t[r]}`)?.focus())}sourceText(e){let t=uE[e.source??``]??e.source??``;return e.from===void 0?t:`${t} on ${e.from||`the form`}`}clearFilters(e){this.filter.set(``),this.active.set(new Set);let t=this.rows().length,n=`Filters cleared. Showing ${t} ${t===1?`field`:`fields`}.`;this.filterStatus.update(e=>e===n?`${n}\u00a0`:n),e.focus()}onFilter(e){this.filter.set(e.target.value)}highlight(e,t){let n=this.rpc();n&&n.scope(`pangular`).rpc.callEvent(`request-form-highlight`,e?{formId:e,path:t}:null)}kindLabel(e){return lE[e]}constraintList(e){return Object.entries(e.constraints??{}).map(([e,t])=>`${e} ${t}`)}errorText(e,t){return/^[a-z]/.test(t.message)?`${e.key||`The form`} ${t.message}`:t.message}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-inspector`]],hostBindings:function(e,t){e&1&&G(`keydown.escape`,function(){return t.cancelPick()})},inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{focusHandled:`focusHandled`},decls:6,vars:1,consts:[[`fieldFilter`,``],[`role`,`status`,1,`empty`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`layout`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`small`,3,`click`],[1,`sidebar`],[`id`,`forms-list-heading`,1,`list-heading`],[1,`list-count`],[1,`page-toggle`],[`aria-labelledby`,`forms-list-heading`,1,`form-list`],[`aria-labelledby`,`forms-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`forms-detail-title`,1,`detail`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`form-item`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`label`],[1,`kind`],[1,`id`],[1,`sr-only`],[1,`count`],[`id`,`forms-detail-title`],[`role`,`status`,1,`muted`],[1,`detail-head`],[1,`detail-meta`],[1,`summary`],[1,`badge`],[1,`totals`],[1,`error-summary`],[3,`tool`,`page`,`signalForm`],[1,`action-bar`],[`role`,`group`,`aria-label`,`Form actions`,1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`divider`],[`type`,`button`,1,`small`,3,`armed`,`disabled`],[`aria-hidden`,`true`,1,`spacer`],[`type`,`button`,1,`small`,`danger`,3,`click`,`disabled`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`id`,`forms-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`role`,`tablist`,`aria-label`,`Form views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`formId`,`version`,`rpc`],[`type`,`button`,1,`summary-link`,3,`click`],[1,`kind-tag`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`filters`],[`type`,`search`,`placeholder`,`Filter fields by path`,`aria-label`,`Filter fields by path`,`autocomplete`,`off`,`spellcheck`,`false`,1,`filter`,3,`input`,`keydown.escape`,`value`],[1,`chips`],[`role`,`status`,1,`sr-only`],[`role`,`region`,`aria-label`,`Fields`,`tabindex`,`0`,1,`table-scroll`],[1,`fields`],[`scope`,`col`],[3,`form`,`node`,`version`,`rpc`],[3,`mouseenter`,`mouseleave`],[`scope`,`row`,1,`name`],[`type`,`button`,1,`field`,3,`focus`,`blur`,`click`],[1,`type`],[1,`value`],[1,`status-cell`],[1,`flags`],[1,`warn`],[1,`errors`],[1,`unseen`],[1,`source`],[`colspan`,`5`,1,`muted`,`truncated`],[`colspan`,`5`,1,`no-match`],[`type`,`button`,1,`small`],[3,`closed`,`form`,`node`,`version`,`rpc`],[`what`,`form events on this page`,`limit`,`formTimeline`,3,`dropped`,`max`],[3,`record`,`events`,`recording`],[3,`showField`,`formId`,`version`,`rpc`]],template:function(e,t){e&1&&P(0,uz,4,0,`div`,1)(1,dz,7,0,`div`,2)(2,fz,4,0,`div`,1)(3,pz,5,0,`div`,3)(4,mz,7,2,`div`,3)(5,pB,13,3,`div`,4),e&2&&F(t.rpc()?t.failed()?1:t.loading()?2:t.forms().length?t.visible().length?5:4:3:0)},dependencies:[cR,RR,_R,vR,oz,WD,ab],styles:[`.muted[_ngcontent-%COMP%] {
+}`]})},fz=()=>[],pz=(e,t)=>t.id,mz=(e,t)=>t.node.path;function hz(e,t){e&1&&(z(0,`div`,1),V(1,`span`,5),z(2,`p`),J(3,`Connecting to the devtools server…`),B()())}function gz(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`,6),J(2,`Could not load forms`),B(),z(3,`p`,7),J(4,` The devtools server did not answer. Check that the app is running, then try again. `),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Try again`),B()()}}function _z(e,t){e&1&&(z(0,`div`,1),V(1,`span`,5),z(2,`p`),J(3,`Loading forms…`),B()())}function vz(e,t){e&1&&(z(0,`div`,3)(1,`p`,6),J(2,`No forms on the page yet`),B(),z(3,`p`,7),J(4,` Open a page that renders a form. Signal Forms, reactive and template-driven forms all show up here, in development builds. `),B()())}function yz(e,t){if(e&1){let e=W();z(0,`div`,3)(1,`p`,6),J(2,`No forms on this page`),B(),z(3,`p`,7),J(4),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K().allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}if(e&2){let e=K();M(4),Z(` Other connected tabs report `,e.forms().length,` `,e.forms().length===1?`form`:`forms`,`. `)}}function bz(e,t){if(e&1){let e=W();z(0,`label`,12)(1,`input`,16),G(`change`,function(t){return O(e),k(K(2).allPages.set(t.target.checked))}),B(),J(2,` All pages `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.allPages())}}function xz(e,t){e&1&&(z(0,`span`,23),J(1),z(2,`span`,22),J(3,` errors`),B()()),e&2&&(M(),Y(t))}function Sz(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,17),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectForm(t.id))}),V(2,`span`,18),z(3,`span`,19),J(4),B(),z(5,`span`,20),J(6),z(7,`span`,21),J(8),B(),z(9,`span`,22),J(10),B()(),P(11,xz,4,1,`span`,23),B()()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`active`,n.id===r.selected()?.id),N(`aria-current`,n.id===r.selected()?.id?`true`:null),M(),N(`data-status`,n.root.status),M(),N(`title`,n.label),M(),Y(n.label),M(2),X(``,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),X(`, `,n.root.status),M(),F((e=r.counts().get(n.id)?.errors)?11:-1,e)}}function Cz(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`h2`,24),J(2),B(),z(3,`p`,25),J(4,` This form is no longer on the page. It comes back here if the page renders it again. `),B(),z(5,`button`,8),G(`click`,function(){O(e);let t=K(2);return k(t.selectForm(t.visible()[0].id))}),J(6),B()()}if(e&2){let e=K(2);M(2),Y(t),M(4),X(` Show `,e.visible()[0].label,` `)}}function wz(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`h2`,24),J(2),B(),z(3,`p`,7),J(4,`This form is on another page. Tick "All pages" to see it again.`),B(),z(5,`button`,8),G(`click`,function(){return O(e),k(K(2).allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}e&2&&(M(2),Y(t))}function Tz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K();M(),Y(e.submitted?`submitted`:`not submitted`)}}function Ez(e,t){e&1&&(z(0,`span`),J(1,`submitting`),B())}function Dz(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,47),G(`click`,function(){let t=O(e).$implicit;return k(K(4).showField(t.path))}),z(2,`span`,22),J(3,`Show field `),B(),z(4,`code`),J(5),B(),z(6,`span`,22),J(7,`:`),B(),J(8),z(9,`code`,48),J(10),B()()()}if(e&2){let e=t.$implicit;M(5),Y(e.path||`(form)`),M(3),X(` `,e.message,` `),M(2),Y(e.kind)}}function Oz(e,t){if(e&1&&(z(0,`details`,31)(1,`summary`),J(2),B(),z(3,`ul`),I(4,Dz,11,3,`li`,null,Cg),B()()),e&2){let e=K();M(2),X(`Error summary (`,e.errorSummary.length,`)`),M(2),L(e.errorSummary)}}function kz(e,t){if(e&1){let e=W();z(0,`button`,35),G(`click`,function(){return O(e),k(K(3).confirmAct(`restore`))}),J(1),B()}if(e&2){let e=K(3);q(`armed`,e.armed()===`restore`),R(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`forms-writes-off`)(`title`,`Restore `+e.snapshot()),M(),X(` `,e.armed()===`restore`?`Confirm restore`:`Restore `+e.snapshot(),` `)}}function Az(e,t){if(e&1&&(z(0,`p`,41),J(1),B()),e&2){let e=K(3);M(),Y(e.writesOff)}}function jz(e,t){if(e&1){let e=W();z(0,`button`,49),G(`click`,function(){let t=O(e).$implicit;return k(K(3).tab_.set(t.id))}),J(1),B()}if(e&2){let e=t.$implicit,n=K(3);R(`id`,`forms-tab-`+e.id),N(`aria-selected`,e.id===n.tab_())(`aria-controls`,`forms-panel-`+e.id)(`tabindex`,e.id===n.tab_()?0:-1),M(),X(` `,e.label,` `)}}function Mz(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,16),G(`change`,function(){let t=O(e).$implicit;return k(K(4).toggleChip(t.id))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K(4);M(),R(`checked`,n.active().has(e.id)),M(),X(` `,e.label,` `)}}function Nz(e,t){if(e&1&&(z(0,`div`,7),J(1,` typed `),z(2,`code`),J(3),dv(4,`json`),B(),J(5,`, not in the model yet `),B()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.uncommitted))}}function Pz(e,t){if(e&1&&(z(0,`div`,7),J(1,` resets to `),z(2,`code`),J(3),dv(4,`json`),B()()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.defaultValue))}}function Fz(e,t){if(e&1&&(z(0,`code`),J(1),dv(2,`json`),B(),P(3,Nz,6,3,`div`,7),P(4,Pz,5,3,`div`,7)),e&2){let e=K().$implicit;M(),Y(pv(2,3,e.node.value)),M(2),F(e.node.uncommitted===void 0?-1:3),M(),F(e.node.defaultValue===void 0?-1:4)}}function Iz(e,t){e&1&&(z(0,`span`,7),J(1,`not created yet`),B())}function Lz(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;N(`data-status`,e.node.status),M(),Y(e.node.status)}}function Rz(e,t){e&1&&(z(0,`span`),J(1,`touched`),B())}function zz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.changed===!1?`dirty, unchanged`:`dirty`)}}function Bz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`not validated (`,e.node.skipped,`)`)}}function Vz(e,t){if(e&1&&(z(0,`span`,65),J(1),B()),e&2){let e=K().$implicit;M(),X(`stale: `,e.node.stale.join(`, `))}}function Hz(e,t){e&1&&(z(0,`span`,65),J(1,`view out of sync`),B())}function Uz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),X(`redacted: `,t.redactLabel(e.node.redacted))}}function Wz(e,t){e&1&&(z(0,`span`),J(1,`required`),B())}function Gz(e,t){e&1&&(z(0,`span`),J(1,`readonly`),B())}function Kz(e,t){e&1&&(z(0,`span`),J(1,`hidden`),B())}function qz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`updates on `,e.node.updateOn)}}function Jz(e,t){e&1&&(z(0,`span`),J(1,`debouncing`),B())}function Yz(e,t){e&1&&(z(0,`span`),J(1,`validators`),B())}function Xz(e,t){e&1&&(z(0,`span`),J(1,`async validator`),B())}function Zz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function Qz(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.accessor)}}function $z(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`name `,e.node.name)}}function eB(e,t){if(e&1&&(z(0,`span`),J(1),dv(2,`json`),B()),e&2){let e=t.$implicit;M(),X(`metadata `,pv(2,1,e))}}function tB(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),X(`disabled: `,e)}}function nB(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit;M(),X(`at `,e.params.path)}}function rB(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.sourceText(e))}}function iB(e,t){if(e&1&&(z(0,`div`),J(1),z(2,`code`,48),J(3),B(),P(4,nB,2,1,`span`,68),P(5,rB,2,1,`span`,68),B()),e&2){let e=t.$implicit,n=K().$implicit,r=K(4);M(),X(` `,r.errorText(n.node,e),` `),M(2),Y(e.kind),M(),F(e.kind===`standardSchema`&&e.params?.path?4:-1),M(),F(e.source?5:-1)}}function aB(e,t){e&1&&(z(0,`div`,67),J(1,`not shown to the user`),B())}function oB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,69),J(2),B()()),e&2){let e=K().$implicit;M(),C_(`padding-left`,28+e.depth*16,`px`),M(),Z(` `,e.node.truncated,` more fields under `,e.node.path||`the form`,` not shown `)}}function sB(e,t){if(e&1){let e=W();z(0,`tr`,58),G(`mouseenter`,function(){let t=O(e).$implicit,n=K(2);return k(K(2).highlight(n.id,t.node.path))})(`mouseleave`,function(){return O(e),k(K(4).highlight(null,``))}),z(1,`th`,59)(2,`button`,60),G(`focus`,function(){let t=O(e).$implicit,n=K(2);return k(K(2).highlight(n.id,t.node.path))})(`blur`,function(){return O(e),k(K(4).highlight(null,``))})(`click`,function(){let t=O(e).$implicit;return k(K(4).toggleField(t.node.path))}),J(3),B(),z(4,`span`,61),J(5),B()(),z(6,`td`,62),P(7,Fz,5,5),B(),z(8,`td`,63),P(9,Iz,2,0,`span`,7)(10,Lz,2,2,`span`,29),B(),z(11,`td`,64),P(12,Rz,2,0,`span`),P(13,zz,2,1,`span`),P(14,Bz,2,1,`span`),P(15,Vz,2,1,`span`,65),P(16,Hz,2,0,`span`,65),P(17,Uz,2,1,`span`),P(18,Wz,2,0,`span`),P(19,Gz,2,0,`span`),P(20,Kz,2,0,`span`),P(21,qz,2,1,`span`),P(22,Jz,2,0,`span`),P(23,Yz,2,0,`span`),P(24,Xz,2,0,`span`),I(25,Zz,2,1,`span`,null,wg),P(27,Qz,2,1,`span`),P(28,$z,2,1,`span`),I(29,eB,3,3,`span`,null,Cg),I(31,tB,2,1,`span`,null,Cg),B(),z(33,`td`,66),I(34,iB,6,4,`div`,null,Cg),P(36,aB,2,0,`div`,67),B()(),P(37,oB,3,4,`tr`)}if(e&2){let e=t.$implicit,n=K(4);q(`invalid`,e.node.errors.length),M(),C_(`padding-left`,12+e.depth*16,`px`),M(),N(`aria-label`,`Show details for `+(e.node.path||`the form`))(`aria-pressed`,e.node.path===n.fieldPath())(`title`,e.node.path||`(form)`),M(),X(` `,e.node.key||`(form)`,` `),M(2),Y(e.node.type),M(2),F(e.node.type===`control`?7:-1),M(2),F(e.node.materialized===!1?9:10),M(3),F(e.node.touched?12:-1),M(),F(e.node.dirty?13:-1),M(),F(e.node.skipped?14:-1),M(),F(e.node.stale?.length?15:-1),M(),F(e.node.dom?.drift===void 0?-1:16),M(),F(e.node.redacted?17:-1),M(),F(e.node.required?18:-1),M(),F(e.node.readonly?19:-1),M(),F(e.node.hidden?20:-1),M(),F(e.node.updateOn?21:-1),M(),F(e.node.debouncing?22:-1),M(),F(e.node.validators?.sync?23:-1),M(),F(e.node.validators?.async?24:-1),M(),L(n.constraintList(e.node)),M(2),F(e.node.accessor?27:-1),M(),F(e.node.name?28:-1),M(),L(e.node.metadata??ov(28,fz)),M(2),L(e.node.disabledReasons??ov(29,fz)),M(3),L(e.node.errors),M(2),F(e.node.errors.length&&e.node.dom?.errorShown===!1?36:-1),M(),F(e.node.truncated?37:-1)}}function cB(e,t){e&1&&J(0),e&2&&X(` No field path matches "`,K(5).filter(),`". `)}function lB(e,t){e&1&&J(0,` No field matches the selected filters. `)}function uB(e,t){if(e&1){let e=W();z(0,`button`,8),G(`click`,function(){O(e),K(2);let t=n_(2);return k(K(3).clearFilters(t))}),J(1,` Clear filters `),B()}}function dB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,70)(2,`p`),P(3,cB,1,1)(4,lB,1,0),B(),P(5,uB,2,0,`button`,71),B()()),e&2){let e=K(4);M(3),F(e.filter()?3:4),M(2),F(e.filtering()?5:-1)}}function fB(e,t){if(e&1){let e=W();z(0,`app-forms-field-detail`,72),G(`closed`,function(){return O(e),k(K(4).closeField())}),B()}if(e&2){let e=K(2),n=K(2);R(`form`,e)(`node`,t)(`version`,n.version())(`rpc`,n.rpc())}}function pB(e,t){if(e&1){let e=W();z(0,`div`,50)(1,`input`,51,0),G(`input`,function(t){return O(e),k(K(3).onFilter(t))})(`keydown.escape`,function(){return O(e),k(K(3).filter.set(``))}),B(),z(3,`fieldset`,52)(4,`legend`,22),J(5,`Show only fields that are`),B(),I(6,Mz,3,2,`label`,null,pz),B()(),z(8,`p`,53),J(9),B(),z(10,`div`,54)(11,`table`,55)(12,`thead`)(13,`tr`)(14,`th`,56),J(15,`Field`),B(),z(16,`th`,56),J(17,`Value`),B(),z(18,`th`,56),J(19,`Status`),B(),z(20,`th`,56),J(21,`State`),B(),z(22,`th`,56),J(23,`Errors`),B()()(),z(24,`tbody`),I(25,sB,38,30,null,null,mz,!1,dB,6,2,`tr`),B()()(),P(28,fB,1,4,`app-forms-field-detail`,57)}if(e&2){let e,t=K(3);M(),R(`value`,t.filter()),M(5),L(t.chips),M(3),Y(t.filterStatus()),M(16),L(t.rows()),M(3),F((e=t.selectedNode())?28:-1,e)}}function mB(e,t){if(e&1){let e=W();V(0,`app-limit-note`,73),z(1,`app-forms-timeline`,74),G(`record`,function(t){return O(e),k(K(3).setRecording(t))}),B()}if(e&2){let e=K(3);R(`dropped`,e.droppedEvents())(`max`,e.maxEvents()),M(),R(`events`,e.selectedEvents())(`recording`,e.recording())}}function hB(e,t){if(e&1&&V(0,`app-forms-submit`,46),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function gB(e,t){if(e&1){let e=W();z(0,`app-forms-lint`,75),G(`showField`,function(t){return O(e),k(K(3).showField(t))}),B()}if(e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function _B(e,t){if(e&1){let e=W();z(0,`section`,15)(1,`div`,26)(2,`h2`,24),J(3),B(),z(4,`p`,27),J(5),z(6,`code`),J(7),B()()(),z(8,`div`,28)(9,`span`,29),J(10),B(),z(11,`span`),J(12),B(),z(13,`span`),J(14),B(),P(15,Tz,2,1,`span`),P(16,Ez,2,0,`span`),z(17,`span`,30)(18,`b`),J(19),B(),J(20,` fields · `),z(21,`b`),J(22),B(),J(23,` errors`),B()(),P(24,Oz,6,1,`details`,31),V(25,`app-forms-webmcp`,32),z(26,`div`,33)(27,`div`,34)(28,`button`,35),G(`click`,function(){return O(e),k(K(2).act(`touch-all`))}),J(29,` Touch all `),B(),z(30,`button`,35),G(`click`,function(){return O(e),k(K(2).act(`revalidate`))}),J(31,` Revalidate `),B(),z(32,`button`,8),G(`click`,function(){return O(e),k(K(2).act(`focus-first-invalid`))}),J(33,` Focus first invalid `),B(),z(34,`button`,8),G(`click`,function(){O(e);let t=K(2);return k(t.picking()?t.cancelPick():t.pick())}),J(35),B(),V(36,`span`,36),z(37,`button`,8),G(`click`,function(){return O(e),k(K(2).act(`snapshot`))}),J(38,`Snapshot`),B(),P(39,kz,2,6,`button`,37),V(40,`span`,38),z(41,`button`,39),G(`click`,function(){return O(e),k(K(2).confirmAct(`reset`))}),J(42),B(),z(43,`button`,40),G(`click`,function(){return O(e),k(K(2).confirmAct(`submit`))}),J(44),B()(),P(45,Az,2,1,`p`,41),z(46,`p`,42),J(47),B()(),z(48,`div`,43),G(`keydown`,function(t){return O(e),k(K(2).onKey(t))}),I(49,jz,2,5,`button`,44,pz),B(),z(51,`div`,45),P(52,pB,29,4)(53,mB,2,4)(54,hB,1,3,`app-forms-submit`,46)(55,gB,1,3,`app-forms-lint`,46),B()()}if(e&2){let e,n=t,r=K(2);M(3),Y(n.label),M(2),X(` `,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),N(`data-status`,n.root.status),M(),Y(n.root.status),M(2),Y(n.root.dirty?`dirty`:`pristine`),M(2),Y(n.root.touched?`touched`:`untouched`),M(),F(n.submitted===void 0?-1:15),M(),F(n.root.submitting?16:-1),M(3),Y(r.counts().get(n.id)?.fields),M(2),q(`has-errors`,r.counts().get(n.id)?.errors),M(),Y(r.counts().get(n.id)?.errors),M(2),F(n.errorSummary?.length?24:-1),M(),R(`tool`,n.webMcp)(`page`,r.webMcpPage(n.id))(`signalForm`,n.kind===`signal`),M(3),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(2),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(4),q(`on`,r.picking()),N(`aria-pressed`,!!r.picking()),M(),X(` `,r.picking()?`Cancel picking`:`Pick field on page`,` `),M(4),F(r.snapshot()?39:-1),M(2),q(`armed`,r.armed()===`reset`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`reset`?`Confirm reset`:`Reset`,` `),M(),q(`armed`,r.armed()===`submit`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`submit`?`Confirm submit`:`Submit`,` `),M(),F(r.canWrite()?-1:45),M(2),Y(r.message()),M(2),L(r.tabs),M(2),R(`id`,`forms-panel-`+r.tab_()),N(`aria-labelledby`,`forms-tab-`+r.tab_()),M(),F((e=r.tab_())===`fields`?52:e===`timeline`?53:e===`submit`?54:e===`lint`?55:-1)}}function vB(e,t){if(e&1&&(z(0,`div`,4)(1,`div`,9)(2,`h2`,10),J(3,` Forms `),z(4,`span`,11),J(5),B()(),P(6,bz,3,1,`label`,12),z(7,`ul`,13),I(8,Sz,12,10,`li`,null,pz),B()(),P(10,Cz,7,2,`section`,14)(11,wz,7,1,`section`,14)(12,_B,56,41,`section`,15),B()),e&2){let e,t=K();M(5),Y(t.visible().length),M(),F(t.hostPageId&&(t.allPages()||t.otherPages())?6:-1),M(2),L(t.visible()),M(2),F((e=t.missing())?10:(e=t.hidden())?11:(e=t.selected())?12:-1,e)}}var yB=[{id:`fields`,label:`Fields`},{id:`timeline`,label:`Timeline`},{id:`submit`,label:`Submit`},{id:`lint`,label:`Lint`}],bB=[{id:`invalid`,label:`Invalid`},{id:`dirty`,label:`Dirty`},{id:`touched`,label:`Touched`},{id:`disabled`,label:`Disabled`},{id:`hidden-error`,label:`Error not shown`}];function xB(e,t){switch(t){case`invalid`:return e.errors.length>0;case`dirty`:return e.dirty&&e.type===`control`;case`touched`:return e.touched&&e.type===`control`;case`disabled`:return e.status===`DISABLED`;case`hidden-error`:return e.dom?.errorShown===!1}}function SB(e){return e.errors.length+(e.children??[]).reduce((e,t)=>e+SB(t),0)}function CB(e){return e.children?e.children.reduce((e,t)=>e+CB(t),0):+(e.type===`control`&&e.materialized!==!1)}var wB=class e{rpc=$(null);focus=$(null);canWrite=Q(()=>bE(this.rpc(),`forms`));redactLabel=pE;writesOff=KT(`forms`);focusHandled=Ov();forms=j([]);webMcp=j([]);events=j([]);loading=j(!0);failed=j(!1);selectedId=j(null);selectedLabel=j(null);hostPageId=eE();allPages=j(!1);visible=Q(()=>{let e=this.forms(),t=this.hostPageId;return t&&!this.allPages()?e.filter(e=>cE(e.id)===t):e});otherPages=Q(()=>this.forms().some(e=>cE(e.id)!==this.hostPageId));instrumented=j([]);recording=Q(()=>{let e=this.selected()?.id??``;return this.instrumented().some(t=>e.endsWith(`@${t}`))});filter=j(``);tabs=yB;chips=bB;tab_=j(`fields`);active=j(new Set);filtering=Q(()=>!!this.filter()||this.active().size>0);filterStatus=j(``);version=j(0);message=j(``);webMcpPage(e){let t=cE(e);return this.webMcp().find(e=>e.pageId===t)}picking=j(null);pickSeq=0;unsubscribe=null;destroyRef=E(Cs);host=E(Ml);injector=E(xs);counts=Q(()=>new Map(this.visible().map(e=>[e.id,{fields:CB(e.root),errors:SB(e.root)}])));chosen=Q(()=>{let e=this.selectedId();if(e===null)return null;let t=this.forms(),n=this.selectedLabel(),r=cE(e);return t.find(t=>t.id===e)??t.find(e=>e.label===n&&cE(e.id)===r)??null});selected=Q(()=>{let e=this.visible();if(this.selectedId()===null)return e[0]??null;let t=this.chosen();return t&&e.includes(t)?t:null});missing=Q(()=>this.selectedId()!==null&&!this.chosen()&&this.visible().length?this.selectedLabel()??this.selectedId():null);hidden=Q(()=>{let e=this.chosen();return e&&!this.selected()&&this.visible().length?e.label:null});selectedFormId=Q(()=>this.selected()?.id??null);fieldPath=Tv({source:this.selectedFormId,computation:()=>null});armed=Tv({source:this.selectedFormId,computation:()=>null});snapshot=Tv({source:this.selectedFormId,computation:()=>null});rows=Q(()=>{let e=this.selected();if(!e)return[];let t=this.filter().toLowerCase(),n=Array.from(this.active()),r=[],i=(e,a)=>{let o=r.length,s=(!t||e.path.toLowerCase().includes(t))&&n.every(t=>xB(e,t));for(let t of e.children??[])s=i(t,a+1)||s;return s&&r.splice(o,0,{node:e,depth:a}),s};return i(e.root,0),r});selectedNode=Q(()=>{let e=this.fieldPath(),t=this.selected();if(e===null||!t)return null;let n=t=>t.path===e?t:(t.children??[]).map(n).find(Boolean)??null;return n(t.root)});dropped=j({});droppedEvents=Q(()=>{let e=this.selected()?.id;return e?this.dropped()[cE(e)]??0:0});maxEvents=Q(()=>yE(this.rpc()).limits.formTimeline);selectedEvents=Q(()=>{let e=this.selected()?.id;return this.events().filter(t=>t.formId===e)});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.focus();e&&Cv(()=>{this.selectForm(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),this.highlight(null,``)})}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`forms`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.forms.set(t?.forms??[]),this.events.set(t?.events??[]),this.instrumented.set(t?.instrumented??[]),this.dropped.set(t?.dropped??{}),this.webMcp.set(t?.webMcp??[]),this.version.update(e=>e+1)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}async pick(){let e=this.selected();if(!e)return;let t=++this.pickSeq;this.picking.set(e.id),this.message.set(`Click a field in the app. Press Escape or Cancel picking to stop.`);let n=await hE(this.rpc(),{action:`pick`,formId:e.id});if(t!==this.pickSeq)return;this.picking.set(null);let r=n;if(!n.ok||!r.formId){this.message.set(gE(n));return}this.selectForm(r.formId),this.tab_.set(`fields`),this.fieldPath.set(r.path??``),this.message.set(`Picked ${r.path||`(form)`}.`)}cancelPick(){let e=this.picking();e&&hE(this.rpc(),{action:`cancel-pick`,formId:e})}async setRecording(e){let t=this.selected();if(!t)return;let n=await hE(this.rpc(),{action:`instrument`,formId:t.id,value:e});this.message.set(gE(n))}selectForm(e){this.hostPageId&&cE(e)&&cE(e)!==this.hostPageId&&this.allPages.set(!0),this.selectedId.set(e),this.selectedLabel.set(this.forms().find(t=>t.id===e)?.label??null),this.filter.set(``),this.fieldPath.set(null),this.snapshot.set(null),this.armed.set(null)}toggleField(e){this.fieldPath.update(t=>t===e?null:e)}closeField(){let e=this.host.nativeElement,t=e.querySelector(`button.field[aria-pressed="true"]`)??e.querySelector(`.table-scroll`);this.fieldPath.set(null),t?.focus()}showField(e){this.tab_.set(`fields`);let t=()=>this.rows().some(t=>t.node.path===e);t()||this.filter.set(``),t()||this.active.set(new Set),this.fieldPath.set(e),Id(()=>{let e=this.host.nativeElement;e.querySelector(`button.field[aria-pressed="true"]`)?.scrollIntoView?.({block:`nearest`}),(e.querySelector(`#forms-field-heading`)??e.querySelector(`.table-scroll`))?.focus()},{injector:this.injector})}toggleChip(e){this.active.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}async act(e,t={}){let n=this.selected();if(!n)return;this.armed.set(null);let r=await hE(this.rpc(),{action:e,formId:n.id,...t});r.snapshot&&this.selected()?.id===n.id&&this.snapshot.set(r.snapshot),this.message.set(gE(r))}confirmAct(e){if(this.armed()!==e){this.armed.set(e),this.message.set(`Press "Confirm ${e}" to ${e} the form in the app.`);return}this.act(e,{confirm:!0,snapshot:this.snapshot()??void 0})}onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.tab_()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.tab_.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#forms-tab-${t[r]}`)?.focus())}sourceText(e){let t=uE[e.source??``]??e.source??``;return e.from===void 0?t:`${t} on ${e.from||`the form`}`}clearFilters(e){this.filter.set(``),this.active.set(new Set);let t=this.rows().length,n=`Filters cleared. Showing ${t} ${t===1?`field`:`fields`}.`;this.filterStatus.update(e=>e===n?`${n}\u00a0`:n),e.focus()}onFilter(e){this.filter.set(e.target.value)}highlight(e,t){let n=this.rpc();n&&n.scope(`pangular`).rpc.callEvent(`request-form-highlight`,e?{formId:e,path:t}:null)}kindLabel(e){return lE[e]}constraintList(e){return Object.entries(e.constraints??{}).map(([e,t])=>`${e} ${t}`)}errorText(e,t){return/^[a-z]/.test(t.message)?`${e.key||`The form`} ${t.message}`:t.message}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-inspector`]],hostBindings:function(e,t){e&1&&G(`keydown.escape`,function(){return t.cancelPick()})},inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{focusHandled:`focusHandled`},decls:6,vars:1,consts:[[`fieldFilter`,``],[`role`,`status`,1,`empty`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`layout`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`small`,3,`click`],[1,`sidebar`],[`id`,`forms-list-heading`,1,`list-heading`],[1,`list-count`],[1,`page-toggle`],[`aria-labelledby`,`forms-list-heading`,1,`form-list`],[`aria-labelledby`,`forms-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`forms-detail-title`,1,`detail`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`form-item`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`label`],[1,`kind`],[1,`id`],[1,`sr-only`],[1,`count`],[`id`,`forms-detail-title`],[`role`,`status`,1,`muted`],[1,`detail-head`],[1,`detail-meta`],[1,`summary`],[1,`badge`],[1,`totals`],[1,`error-summary`],[3,`tool`,`page`,`signalForm`],[1,`action-bar`],[`role`,`group`,`aria-label`,`Form actions`,1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`divider`],[`type`,`button`,1,`small`,3,`armed`,`disabled`],[`aria-hidden`,`true`,1,`spacer`],[`type`,`button`,1,`small`,`danger`,3,`click`,`disabled`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`id`,`forms-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`role`,`tablist`,`aria-label`,`Form views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`formId`,`version`,`rpc`],[`type`,`button`,1,`summary-link`,3,`click`],[1,`kind-tag`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`filters`],[`type`,`search`,`placeholder`,`Filter fields by path`,`aria-label`,`Filter fields by path`,`autocomplete`,`off`,`spellcheck`,`false`,1,`filter`,3,`input`,`keydown.escape`,`value`],[1,`chips`],[`role`,`status`,1,`sr-only`],[`role`,`region`,`aria-label`,`Fields`,`tabindex`,`0`,1,`table-scroll`],[1,`fields`],[`scope`,`col`],[3,`form`,`node`,`version`,`rpc`],[3,`mouseenter`,`mouseleave`],[`scope`,`row`,1,`name`],[`type`,`button`,1,`field`,3,`focus`,`blur`,`click`],[1,`type`],[1,`value`],[1,`status-cell`],[1,`flags`],[1,`warn`],[1,`errors`],[1,`unseen`],[1,`source`],[`colspan`,`5`,1,`muted`,`truncated`],[`colspan`,`5`,1,`no-match`],[`type`,`button`,1,`small`],[3,`closed`,`form`,`node`,`version`,`rpc`],[`what`,`form events on this page`,`limit`,`formTimeline`,3,`dropped`,`max`],[3,`record`,`events`,`recording`],[3,`showField`,`formId`,`version`,`rpc`]],template:function(e,t){e&1&&P(0,hz,4,0,`div`,1)(1,gz,7,0,`div`,2)(2,_z,4,0,`div`,1)(3,vz,5,0,`div`,3)(4,yz,7,2,`div`,3)(5,vB,13,3,`div`,4),e&2&&F(t.rpc()?t.failed()?1:t.loading()?2:t.forms().length?t.visible().length?5:4:3:0)},dependencies:[pR,UR,SR,CR,dz,WD,ab],styles:[`.muted[_ngcontent-%COMP%] {
color: var(--%NS%text-2);
}
@@ -9706,7 +9706,7 @@ code[_ngcontent-%COMP%] {
.divider[_ngcontent-%COMP%] {
display: none;
}
-}`]})},bB=[`filterInput`],xB=(e,t)=>t.file+t.name,SB=(e,t)=>t.file+`:`+t.line,CB=(e,t)=>t.name;function wB(e,t){e&1&&(z(0,`p`,14),A(),z(1,`svg`,27),V(2,`circle`,28)(3,`path`,29),B(),ps(),z(4,`span`),J(5),B()()),e&2&&(M(5),Y(t))}function TB(e,t){if(e&1&&(z(0,`p`,14),A(),z(1,`svg`,27),V(2,`circle`,28)(3,`path`,29),B(),ps(),z(4,`span`)(5,`strong`),J(6),B(),J(7,` Pipe prototypes are patched in the inspected page to count calls and keep the last input and output. Stop recording when you are done. `),B()()),e&2){let e=K();M(6),X(`Recording on `,e.instrumentedPages().length,` page(s).`)}}function EB(e,t){e&1&&(z(0,`div`,15),V(1,`span`,30),z(2,`p`,31),J(3,`Scanning pipes…`),B()())}function DB(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,31),J(2,`Couldn't load pipes`),B(),z(3,`p`,32),J(4,`The devtools server did not answer. Check that it is running.`),B(),z(5,`button`,33),G(`click`,function(){return O(e),k(K().refresh())}),J(6,`Try again`),B()()}}function OB(e,t){e&1&&(z(0,`div`,17)(1,`p`,31),J(2,`No pipes found`),B(),z(3,`p`,32),J(4,` No @Pipe classes were found in the source, and no template uses a built-in pipe yet. `),B()())}function kB(e,t){e&1&&(z(0,`span`,44),J(1,`stale?`),B())}function AB(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){K();let e=iv(0);M(),X(``,e.instanceCount,` live`)}}function jB(e,t){e&1&&(z(0,`span`,46),J(1,`built-in`),B())}function MB(e,t){e&1&&(z(0,`span`,46),J(1,`NgModule`),B())}function NB(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),X(`+`,(e.usageCount??1)-1,` more`)}}function PB(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),Z(``,e.usageCount,` `,e.usageCount===1?`use`:`uses`)}}function FB(e,t){if(e&1){let e=W();nv(0),z(1,`li`)(2,`button`,39),G(`click`,function(){let t=O(e).$implicit;return k(K(3).select(t))})(`mouseenter`,function(){O(e);let t=iv(0);return k(K(3).highlightPipe(t))})(`mouseleave`,function(){return O(e),k(K(3).highlight(null))})(`focus`,function(){O(e);let t=iv(0);return k(K(3).highlightPipe(t))})(`blur`,function(){return O(e),k(K(3).highlight(null))}),z(3,`span`,40)(4,`span`,41),J(5),B(),z(6,`span`,42),J(7),B()(),z(8,`span`,43),P(9,kB,2,0,`span`,44),P(10,AB,2,1,`span`,45),P(11,jB,2,0,`span`,46),P(12,MB,2,0,`span`,46),z(13,`span`,46),J(14),B()(),z(15,`span`,47),J(16),P(17,NB,2,1,`span`,48)(18,PB,2,2,`span`,48),B()()()}if(e&2){let e=t.$implicit,n=K(3),r=rv(n.liveFor(e.name));M(2),q(`selected`,n.isSelected(e)),N(`aria-current`,n.isSelected(e)||null),M(3),Y(e.name),M(2),Y(e.className),M(2),F(r?.stale?9:-1),M(),F(r?10:-1),M(),F(e.builtin?11:-1),M(),F(e.isStandalone?-1:12),M(),q(`impure`,!e.isPure),M(),Y(e.isPure?`pure`:`impure`),M(2),Z(` `,e.file,`:`,e.line,` `),M(),F(e.builtin&&(e.usageCount??0)>1?17:!e.builtin&&e.usageCount?18:-1)}}function IB(e,t){if(e&1){let e=W();z(0,`ul`,38),G(`keydown`,function(t){return O(e),k(K(2).onListKey(t))}),I(1,FB,19,16,`li`,null,xB),B()}if(e&2){let e=K(2);M(),L(e.filtered())}}function LB(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(3).filter().trim(),`” in this view. `)}function RB(e,t){e&1&&J(0,` None of the pipes fit this filter. `)}function zB(e,t){if(e&1){let e=W();z(0,`div`,36)(1,`p`,31),J(2,`No pipes match`),B(),z(3,`p`,32),P(4,LB,1,1)(5,RB,1,0),B(),z(6,`button`,33),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(7,`Clear filters`),B()()}if(e&2){let e=K(2);M(4),F(e.filter().trim()?4:5)}}function BB(e,t){e&1&&(z(0,`span`,46),J(1,`built-in`),B())}function VB(e,t){if(e&1&&(z(0,`dt`),J(1,`File`),B(),z(2,`dd`,52),J(3),B()),e&2){let e=K();M(3),Z(``,e.file,`:`,e.line)}}function HB(e,t){if(e&1&&(z(0,`li`,52),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e.file,`:`,e.line)}}function UB(e,t){if(e&1&&(z(0,`div`,51)(1,`h3`),J(2,` Used in templates `),z(3,`span`,22),J(4),B()(),z(5,`ul`,54),I(6,HB,2,2,`li`,52,SB),B()()),e&2){let e=K();M(4),Y(e.usageCount),M(2),L(e.usages)}}function WB(e,t){e&1&&(z(0,`p`,55)(1,`span`,44),J(2,`experimental`),B(),J(3,` This pure pipe got an argument whose contents changed while its reference stayed the same, so it may be showing a stale value. `),B())}function GB(e,t){if(e&1){let e=W();z(0,`button`,60),G(`click`,function(){let t=O(e);return k(K(5).highlight(t,!0))})(`mouseenter`,function(){let t=O(e);return k(K(5).highlight(t))})(`mouseleave`,function(){return O(e),k(K(5).highlight(null))})(`focus`,function(){let t=O(e);return k(K(5).highlight(t))})(`blur`,function(){return O(e),k(K(5).highlight(null))}),z(1,`span`,52),J(2),B(),z(3,`span`,61),J(4),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.name+` on the page`),M(2),Y(e.name),M(2),Y(e.count)}}function KB(e,t){if(e&1&&(z(0,`span`,59)(1,`span`,52),J(2),B(),z(3,`span`,61),J(4),B()()),e&2){let e=K().$implicit;M(2),Y(e.name),M(2),Y(e.count)}}function qB(e,t){if(e&1&&(z(0,`li`),P(1,GB,5,3,`button`,58)(2,KB,5,2,`span`,59),B()),e&2){let e,n=t.$implicit;M(),F((e=n.targets?.[0])?1:2,e)}}function JB(e,t){if(e&1&&(z(0,`dt`),J(1,`Time`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(),t=K(4);M(3),Y_(` `,t.ms(e.totalMs),` total, `,t.ms(e.totalMs/e.callCount),` average, `,t.ms(e.maxMs??0),` slowest `)}}function YB(e,t){if(e&1&&(z(0,`span`,62),J(1),B()),e&2){let e=K(2);M(),Y(e.lastError)}}function XB(e,t){if(e&1&&(z(0,`dt`),J(1,`Errors`),B(),z(2,`dd`),J(3),P(4,YB,2,1,`span`,62),B()),e&2){let e=K();M(3),X(` `,e.errorCount,` `),M(),F(e.lastError?4:-1)}}function ZB(e,t){if(e&1){let e=W();z(0,`button`,60),G(`click`,function(){let t=O(e);return k(K(7).highlight(t,!0))})(`mouseenter`,function(){let t=O(e);return k(K(7).highlight(t))})(`mouseleave`,function(){return O(e),k(K(7).highlight(null))})(`focus`,function(){let t=O(e);return k(K(7).highlight(t))})(`blur`,function(){return O(e),k(K(7).highlight(null))}),z(1,`span`,52),J(2),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(2),Y(e.component)}}function QB(e,t){if(e&1&&(z(0,`span`,59)(1,`span`,52),J(2),B()()),e&2){let e=K().$implicit;M(2),Y(e.component)}}function $B(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit,t=K(6);M(),Y(t.ms(e.totalMs))}}function eV(e,t){if(e&1&&(z(0,`span`,65),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.lastCaller)}}function tV(e,t){if(e&1&&(z(0,`li`,63),P(1,ZB,3,2,`button`,58)(2,QB,3,1,`span`,59),z(3,`span`,62),J(4),z(5,`span`,64),J(6),B(),P(7,$B,2,1,`span`,64),B(),P(8,eV,2,1,`span`,65),B()),e&2){let e,n=t.$implicit,r=K(6);M(),F((e=n.target)?1:2,e),M(3),Z(` `,r.describe(n.lastArgs),` → `,r.describe(n.lastResult),` `),M(2),X(``,n.callCount,`×`),M(),F(n.totalMs===void 0?-1:7),M(),F(n.lastCaller?8:-1)}}function nV(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(2);M(),Z(` Showing `,e.instances.length,` of `,e.instanceTotal,` instances. `)}}function rV(e,t){if(e&1&&(z(0,`dt`),J(1,`Per instance`),B(),z(2,`dd`)(3,`ul`,54),I(4,tV,9,6,`li`,63,Cg),B(),P(6,nV,2,2,`p`,57),B()),e&2){let e=K();M(4),L(e.instances),M(2),F(e.instanceTotal?6:-1)}}function iV(e,t){if(e&1&&(z(0,`dt`),J(1,`Last caller`),B(),z(2,`dd`,62),J(3),B()),e&2){let e=K();M(3),Y(e.lastCaller)}}function aV(e,t){if(e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`),J(3),B(),P(4,JB,4,3),P(5,XB,5,2),z(6,`dt`),J(7,`Last input`),B(),z(8,`dd`,62),J(9),B(),z(10,`dt`),J(11,`Last output`),B(),z(12,`dd`,62),J(13),B(),P(14,rV,7,1),P(15,iV,4,1)),e&2){let e=t,n=K(4);M(3),Y(e.callCount),M(),F(e.totalMs===void 0?-1:4),M(),F(e.errorCount?5:-1),M(4),Y(n.describe(e.lastArgs)),M(4),Y(n.describe(e.lastResult)),M(),F(e.instances?.length?14:-1),M(),F(e.lastCaller?15:-1)}}function oV(e,t){e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`,66),J(3,`None recorded yet.`),B())}function sV(e,t){e&1&&(z(0,`p`,57),J(1,` The stale check is off for this pipe: it couldn't read the compiled template, which happens in minified builds. `),B())}function cV(e,t){e&1&&(z(0,`p`,57),J(1,`Turn on “Record calls” to see call counts and values.`),B())}function lV(e,t){if(e&1&&(P(0,WB,4,0,`p`,55),z(1,`dl`)(2,`dt`),J(3,`Instances`),B(),z(4,`dd`),J(5),B(),z(6,`dt`),J(7,`Used by`),B(),z(8,`dd`)(9,`ul`,56),I(10,qB,3,1,`li`,null,CB),B()(),P(12,aV,16,7)(13,oV,4,0),B(),P(14,sV,2,0,`p`,57),P(15,cV,2,0,`p`,57)),e&2){let e,n=t,r=K(3);F(n.stale?0:-1),M(5),Y(n.instanceCount),M(5),L(n.components),M(2),F((e=n.call)?12:r.instrumenting()?13:-1,e),M(2),F(n.staleCheck===`unavailable`?14:-1),M(),F(!n.call&&!r.instrumenting()?15:-1)}}function uV(e,t){e&1&&(z(0,`p`,53),J(1,` Not in use on the connected page. Open a view that uses it, or connect the app. `),B())}function dV(e,t){if(e&1&&(z(0,`header`,49)(1,`h2`,50),J(2),B(),z(3,`span`,46),J(4),B(),P(5,BB,2,0,`span`,46),B(),z(6,`div`,51)(7,`h3`),J(8,`Declaration`),B(),z(9,`dl`)(10,`dt`),J(11,`Class`),B(),z(12,`dd`,52),J(13),B(),z(14,`dt`),J(15,`Source`),B(),z(16,`dd`),J(17),B(),P(18,VB,4,2),z(19,`dt`),J(20,`Standalone`),B(),z(21,`dd`),J(22),B(),z(23,`dt`),J(24,`Pure`),B(),z(25,`dd`),J(26),B()()(),P(27,UB,8,1,`div`,51),z(28,`div`,51)(29,`h3`),J(30,`Live on the page`),B(),P(31,lV,16,5)(32,uV,2,0,`p`,53),B()),e&2){let e,n=t,r=K(2);M(2),Y(n.name),M(),q(`impure`,!n.isPure),M(),Y(n.isPure?`pure`:`impure`),M(),F(n.builtin?5:-1),M(8),Y(n.className),M(4),Y(n.builtin?`@angular/common`:`This project`),M(),F(n.builtin?-1:18),M(4),Y(n.isStandalone?`Yes`:`No, declared in an NgModule`),M(4),X(` `,n.isPure?`Yes, reruns only when an input changes`:`No, reruns on every check`,` `),M(),F(n.usages?.length?27:-1),M(4),F((e=r.liveFor(n.name))?31:32,e)}}function fV(e,t){e&1&&(z(0,`h2`,67),J(1,`Pipe details`),B(),z(2,`div`,68)(3,`p`,31),J(4,`Pick a pipe`),B(),z(5,`p`,32),J(6,` See where it is declared, which components use it and what it last returned. `),B()())}function pV(e,t){if(e&1&&(z(0,`div`,18)(1,`div`,34),P(2,IB,3,0,`ul`,35)(3,zB,8,1,`div`,36),B(),z(4,`section`,37),P(5,dV,33,12)(6,fV,7,0),B()()),e&2){let e,t=K();M(2),F(t.filtered().length?2:3),M(3),F((e=t.selected())?5:6,e)}}function mV(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(2);M(),Z(`Showing `,e.async().length,` of `,t,` subscriptions.`)}}function hV(e,t){if(e&1){let e=W();z(0,`button`,76),G(`click`,function(){let t=O(e);return k(K(3).highlight(t))})(`focus`,function(){let t=O(e);return k(K(3).highlight(t))})(`blur`,function(){return O(e),k(K(3).highlight(null))}),J(1),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(),X(` `,e.component,` `)}}function gV(e,t){if(e&1&&(z(0,`span`,74),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function _V(e,t){e&1&&(z(0,`span`,46),J(1,`no source`),B())}function vV(e,t){e&1&&(z(0,`span`,44),J(1,`duplicate subscription`),B())}function yV(e,t){e&1&&(z(0,`span`,44),J(1,`resubscribing`),B())}function bV(e,t){if(e&1){let e=W();z(0,`li`,72),G(`mouseenter`,function(){let t=O(e).$implicit;return k(K(2).highlight(t.target))})(`mouseleave`,function(){return O(e),k(K(2).highlight(null))}),P(1,hV,2,2,`button`,73)(2,gV,2,1,`span`,74),P(3,_V,2,0,`span`,46),P(4,vV,2,0,`span`,44),P(5,yV,2,0,`span`,44),z(6,`span`,75),J(7),B()()}if(e&2){let e,n=t.$implicit;M(),F((e=n.target)?1:2,e),M(2),F(n.hasSource?-1:3),M(),F(n.duplicate?4:-1),M(),F(n.resubscribing?5:-1),M(2),Y(n.latestValue??`no value yet`)}}function xV(e,t){if(e&1&&(z(0,`section`,19)(1,`h2`,69),J(2,` Async subscriptions `),z(3,`span`,22),J(4),B()(),z(5,`p`,57),J(6,` Each `),z(7,`span`,52),J(8,`| async`),B(),J(9,` subscribes on its own. Two on the same source mean the work runs twice. A source that changes on every check, like `),z(10,`span`,52),J(11,`getData() | async`),B(),J(12,`, resubscribes each time. `),B(),P(13,mV,2,2,`p`,57),z(14,`ul`,70),I(15,bV,8,5,`li`,71,Cg),B()()),e&2){let e,t=K();M(4),Y(t.async().length),M(9),F((e=t.asyncTotal())?13:-1,e),M(2),L(t.async())}}function SV(e,t){e&1&&(z(0,`span`,22),J(1),B()),e&2&&(M(),Y(t.length))}function CV(e,t){e&1&&(z(0,`p`,23),J(1,`Couldn't run the lint check. Try Refresh.`),B())}function wV(e,t){e&1&&(z(0,`p`,24),J(1,`Checking…`),B())}function TV(e,t){e&1&&(z(0,`p`,25),J(1,`No problems found.`),B())}function EV(e,t){if(e&1){let e=W();z(0,`button`,86),G(`click`,function(){O(e),K();let t=iv(6);return k(K(2).showPipe(t))}),z(1,`span`,87),J(2,`Show pipe `),B(),J(3),B()}if(e&2){let e=K().$implicit;M(3),X(``,e.pipe,` `)}}function DV(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.pipe,` `)}}function OV(e,t){if(e&1&&(z(0,`li`,77)(1,`div`,78)(2,`span`,79),J(3),B(),z(4,`code`,80),J(5),B(),nv(6),z(7,`span`,81),P(8,EV,4,1,`button`,82)(9,DV,1,1),J(10),B()(),z(11,`p`,83),J(12),B(),z(13,`p`,84)(14,`span`,85),J(15,`Fix`),B(),J(16),B()()),e&2){let e=t.$implicit;M(2),N(`data-tone`,e.severity),M(),Y(e.severity),M(2),Y(e.rule),M();let n=rv(K(2).pipeFor(e));M(2),F(n?8:9),M(2),Z(` · `,e.file,`:`,e.line,` `),M(2),Y(e.message),M(4),X(` `,e.fix)}}function kV(e,t){if(e&1&&(z(0,`ul`,26),I(1,OV,17,9,`li`,77,Cg),B()),e&2){let e=K();M(),L(e.lint())}}var AV=5e3,jV=[{value:`all`,label:`All pipes`},{value:`custom`,label:`Custom`},{value:`builtin`,label:`Built-in`},{value:`impure`,label:`Impure`},{value:`live`,label:`On the page`}],MV=class e{destroyRef=E(Cs);host=E(Ml);injector=E(xs);filterInput=Rv(`filterInput`);rpc=$(null);kindOptions=jV;pipes=j([]);filter=j(``);kind=j(`all`);loading=j(!1);loadFailed=j(!1);selected=j(null);live=j([]);async=j([]);asyncTotal=j(void 0);lint=j(null);lintFailed=j(!1);instrumentedPages=j([]);instrumenting=Q(()=>this.instrumentedPages().length>0);pendingRecord=j(null);recordMessage=j(null);recordLabel=Q(()=>{let e=this.pendingRecord();return e===null?this.instrumenting()?`Stop recording`:`Record calls`:e?`Starting…`:`Stopping…`});pendingTimer;liveByName=Q(()=>new Map(this.live().map(e=>[e.name,e])));filtered=Q(()=>{let e=this.filter(),t=this.kind()??`all`;return this.pipes().filter(n=>this.fitsKind(n,t)&&this.fitsQuery(n,e))});pipesByName=Q(()=>{let e=new Map;for(let t of this.pipes())e.set(t.name,[...e.get(t.name)??[],t]);return e});unsubscribe;constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.loadLive(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.pendingTimer),this.highlight(null)})}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.loadFailed.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`get-pipes`);this.pipes.set(t);let n=this.selected();if(n){let e=t.find(e=>e.name===n.name&&e.file===n.file);this.selected.set(e??null)}}catch{this.loadFailed.set(!0)}finally{this.loading.set(!1)}this.loadLint(e)}}async loadLint(e){this.lintFailed.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`pipe-lint`);this.lint.set(t)}catch{this.lintFailed.set(!0)}}async loadLive(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=eE(),r=(n?t?.pages?.find(e=>e.pageId===n):void 0)??t;this.live.set(r?.pipes??[]),this.async.set(r?.async??[]),this.asyncTotal.set(r?.asyncTotal);let i=t?.instrumented??[];this.instrumentedPages.set(i),this.pendingRecord()===i.length>0&&this.settleRecord(null)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}async toggleInstrument(){let e=this.rpc();if(!e||this.pendingRecord()!==null)return;let t=!this.instrumenting();this.recordMessage.set(null),this.pendingRecord.set(t);let n;try{let r=t?{pageId:eE()??void 0,on:t}:{on:t};n=await e.scope(`pangular`).rpc.call(`request-instrument-pipes`,r)}catch{this.settleRecord(`Couldn't reach the devtools server. Try again.`);return}if(this.pendingRecord()===t){if(n?.pages===0){this.settleRecord(`No page is connected. Open your app in the browser with the devtools running, then record again.`);return}clearTimeout(this.pendingTimer),this.pendingTimer=setTimeout(()=>{this.pendingRecord()===t&&this.settleRecord(t?`No page confirmed recording. Reload the app and try again.`:`No page confirmed it stopped recording. Reload the app to stop it.`)},AV)}}settleRecord(e){clearTimeout(this.pendingTimer),this.pendingRecord.set(null),e!==null&&this.recordMessage.set(e)}liveFor(e){return this.liveByName().get(e)}ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}describe(e){if(Array.isArray(e))return e.map(e=>this.describe(e)).join(`, `);if(typeof e==`string`)return e.length>80?`${e.slice(0,80)}…`:e;try{let t=JSON.stringify(e);return t&&t.length>120?`${t.slice(0,120)}…`:t??String(e)}catch{return String(e)}}isSelected(e){let t=this.selected();return t!==null&&t.name===e.name&&t.file===e.file}select(e){this.selected.set(this.isSelected(e)?null:e)}pipeFor(e){let t=this.pipesByName().get(e.pipe);return t?.length?t.find(t=>t.file===e.file)??t[0]:null}showPipe(e){this.fitsQuery(e,this.filter())||this.filter.set(``),this.fitsKind(e,this.kind()??`all`)||this.kind.set(`all`),this.selected.set(e),Id(()=>{let e=this.host.nativeElement;e.querySelector(`.row.selected`)?.scrollIntoView?.({block:`nearest`}),e.querySelector(`#pipe-detail-title`)?.focus()},{injector:this.injector})}fitsKind(e,t){return t===`custom`?!e.builtin:t===`builtin`?!!e.builtin:t===`impure`?!e.isPure:t!==`live`||this.liveByName().has(e.name)}fitsQuery(e,t){let n=t.trim().toLowerCase();return!n||e.name.toLowerCase().includes(n)||e.className.toLowerCase().includes(n)||e.file.toLowerCase().includes(n)}clearFilters(){this.filter.set(``),this.kind.set(`all`),this.filterInput()?.nativeElement.focus()}highlightPipe(e){this.highlight(e?.components.find(e=>e.targets?.length)?.targets?.[0])}highlight(e,t=!1){let n=this.rpc();n&&n.scope(`pangular`).rpc.call(`request-page-highlight`,e?{...e,...t?{reveal:t}:{}}:null).catch(()=>{})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-pipe-row]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-pipes-inspector`]],viewQuery:function(e,t){e&1&&e_(t.filterInput,bB,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:33,vars:18,consts:[[`filterInput`,``],[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a pipe, class or file…`,`aria-label`,`Find a pipe, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show pipes`,3,`valueChange`,`options`,`value`],[`aria-live`,`polite`,1,`total`],[1,`actions`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,1,`record`,3,`click`],[`aria-hidden`,`true`,1,`rec-dot`],[`role`,`status`,1,`notice`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[1,`state`],[1,`layout`],[`aria-labelledby`,`async-title`,1,`section`],[`aria-labelledby`,`lint-title`,1,`section`],[`id`,`lint-title`],[1,`pill`],[`role`,`alert`,1,`empty-line`],[`role`,`status`,1,`empty-line`],[1,`empty-line`,`ok`],[1,`findings`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[`aria-hidden`,`true`,1,`spinner`],[1,`state-title`],[1,`state-hint`],[`type`,`button`,3,`click`],[1,`list-wrap`],[`aria-label`,`Pipes`,1,`pipe-list`],[`role`,`status`,1,`state`,`compact`],[`id`,`pipe-detail`,`aria-labelledby`,`pipe-detail-title`,1,`detail`],[`aria-label`,`Pipes`,1,`pipe-list`,3,`keydown`],[`type`,`button`,`data-pipe-row`,``,`aria-controls`,`pipe-detail`,1,`row`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`row-main`],[1,`name`,`mono`],[1,`sub`,`mono`],[1,`row-meta`],[1,`chip`,`warn`],[1,`chip`,`live`],[1,`chip`],[1,`row-file`,`mono`],[1,`more`],[1,`detail-head`],[`id`,`pipe-detail-title`,`tabindex`,`-1`,1,`mono`],[1,`block`],[1,`mono`],[1,`empty-line`],[1,`sites`],[`role`,`note`,1,`warning`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`component`],[1,`component`],[`type`,`button`,1,`component`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`count`],[1,`mono`,`value`],[1,`instance`],[1,`calls`],[1,`mono`,`value`,`caller`],[1,`muted`],[`id`,`pipe-detail-title`,1,`visually-hidden`],[1,`state`,`compact`],[`id`,`async-title`],[1,`async-list`],[1,`async-row`],[1,`async-row`,3,`mouseenter`,`mouseleave`],[`type`,`button`,1,`component-name`,`mono`],[1,`mono`,`component-name`],[1,`mono`,`value`,`latest`],[`type`,`button`,1,`component-name`,`mono`,3,`click`,`focus`,`blur`],[1,`finding`],[1,`finding-head`],[1,`severity`],[1,`mono`,`rule`],[1,`where`,`mono`],[`type`,`button`,1,`pipe-link`],[1,`finding-message`],[1,`finding-fix`],[1,`fix-label`],[`type`,`button`,1,`pipe-link`,3,`click`],[1,`sr-only`]],template:function(e,t){if(e&1){let e=W();z(0,`p`,1),J(1,` Pipes declared in your source and the built-in pipes your templates use. Live data shows which components use each pipe on the page; turn on recording to capture calls and the last input and output. `),B(),z(2,`div`,2)(3,`div`,3),A(),z(4,`svg`,4),V(5,`circle`,5)(6,`path`,6),B(),ps(),z(7,`input`,7,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B()(),z(9,`app-select`,8),ev(`valueChange`,function(n){return O(e),$_(t.kind,n)||(t.kind=n),k(n)}),B(),z(10,`span`,9),J(11),B(),z(12,`div`,10)(13,`button`,11),G(`click`,function(){return t.refresh()}),J(14,`Refresh`),B(),z(15,`button`,12),G(`click`,function(){return t.toggleInstrument()}),V(16,`span`,13),J(17),B()()(),P(18,wB,6,1,`p`,14),P(19,TB,8,1,`p`,14),P(20,EB,4,0,`div`,15)(21,DB,7,0,`div`,16)(22,OB,5,0,`div`,17)(23,pV,7,2,`div`,18),P(24,xV,17,2,`section`,19),z(25,`section`,20)(26,`h2`,21),J(27,` Lint `),P(28,SV,2,1,`span`,22),B(),P(29,CV,2,0,`p`,23)(30,wV,2,0,`p`,24)(31,TV,2,0,`p`,25)(32,kV,3,0,`ul`,26),B()}if(e&2){let e,n;M(7),R(`value`,t.filter()),M(2),R(`options`,t.kindOptions),Q_(`value`,t.kind),M(2),Z(``,t.filtered().length,` of `,t.pipes().length),M(2),R(`disabled`,t.loading()),M(2),q(`on`,t.instrumenting()),N(`aria-pressed`,t.instrumenting())(`aria-busy`,t.pendingRecord()!==null)(`aria-disabled`,t.pendingRecord()!==null),M(2),X(` `,t.recordLabel(),` `),M(),F((e=t.recordMessage())?18:-1,e),M(),F(t.instrumenting()?19:-1),M(),F(t.loading()&&t.pipes().length===0?20:t.loadFailed()&&t.pipes().length===0?21:t.pipes().length===0?22:23),M(4),F(t.async().length>0?24:-1),M(4),F((n=t.lint())?28:-1,n),M(),F(t.lintFailed()?29:t.lint()===null?30:t.lint().length?32:31)}},dependencies:[jD],styles:[`[_nghost-%COMP%] {
+}`]})},TB=[`filterInput`],EB=(e,t)=>t.file+t.name,DB=(e,t)=>t.file+`:`+t.line,OB=(e,t)=>t.name;function kB(e,t){e&1&&(z(0,`p`,14),A(),z(1,`svg`,27),V(2,`circle`,28)(3,`path`,29),B(),ps(),z(4,`span`),J(5),B()()),e&2&&(M(5),Y(t))}function AB(e,t){if(e&1&&(z(0,`p`,14),A(),z(1,`svg`,27),V(2,`circle`,28)(3,`path`,29),B(),ps(),z(4,`span`)(5,`strong`),J(6),B(),J(7,` Pipe prototypes are patched in the inspected page to count calls and keep the last input and output. Stop recording when you are done. `),B()()),e&2){let e=K();M(6),X(`Recording on `,e.instrumentedPages().length,` page(s).`)}}function jB(e,t){e&1&&(z(0,`div`,15),V(1,`span`,30),z(2,`p`,31),J(3,`Scanning pipes…`),B()())}function MB(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,31),J(2,`Couldn't load pipes`),B(),z(3,`p`,32),J(4,`The devtools server did not answer. Check that it is running.`),B(),z(5,`button`,33),G(`click`,function(){return O(e),k(K().refresh())}),J(6,`Try again`),B()()}}function NB(e,t){e&1&&(z(0,`div`,17)(1,`p`,31),J(2,`No pipes found`),B(),z(3,`p`,32),J(4,` No @Pipe classes were found in the source, and no template uses a built-in pipe yet. `),B()())}function PB(e,t){e&1&&(z(0,`span`,44),J(1,`stale?`),B())}function FB(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){K();let e=iv(0);M(),X(``,e.instanceCount,` live`)}}function IB(e,t){e&1&&(z(0,`span`,46),J(1,`built-in`),B())}function LB(e,t){e&1&&(z(0,`span`,46),J(1,`NgModule`),B())}function RB(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),X(`+`,(e.usageCount??1)-1,` more`)}}function zB(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),Z(``,e.usageCount,` `,e.usageCount===1?`use`:`uses`)}}function BB(e,t){if(e&1){let e=W();nv(0),z(1,`li`)(2,`button`,39),G(`click`,function(){let t=O(e).$implicit;return k(K(3).select(t))})(`mouseenter`,function(){O(e);let t=iv(0);return k(K(3).highlightPipe(t))})(`mouseleave`,function(){return O(e),k(K(3).highlight(null))})(`focus`,function(){O(e);let t=iv(0);return k(K(3).highlightPipe(t))})(`blur`,function(){return O(e),k(K(3).highlight(null))}),z(3,`span`,40)(4,`span`,41),J(5),B(),z(6,`span`,42),J(7),B()(),z(8,`span`,43),P(9,PB,2,0,`span`,44),P(10,FB,2,1,`span`,45),P(11,IB,2,0,`span`,46),P(12,LB,2,0,`span`,46),z(13,`span`,46),J(14),B()(),z(15,`span`,47),J(16),P(17,RB,2,1,`span`,48)(18,zB,2,2,`span`,48),B()()()}if(e&2){let e=t.$implicit,n=K(3),r=rv(n.liveFor(e.name));M(2),q(`selected`,n.isSelected(e)),N(`aria-current`,n.isSelected(e)||null),M(3),Y(e.name),M(2),Y(e.className),M(2),F(r?.stale?9:-1),M(),F(r?10:-1),M(),F(e.builtin?11:-1),M(),F(e.isStandalone?-1:12),M(),q(`impure`,!e.isPure),M(),Y(e.isPure?`pure`:`impure`),M(2),Z(` `,e.file,`:`,e.line,` `),M(),F(e.builtin&&(e.usageCount??0)>1?17:!e.builtin&&e.usageCount?18:-1)}}function VB(e,t){if(e&1){let e=W();z(0,`ul`,38),G(`keydown`,function(t){return O(e),k(K(2).onListKey(t))}),I(1,BB,19,16,`li`,null,EB),B()}if(e&2){let e=K(2);M(),L(e.filtered())}}function HB(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(3).filter().trim(),`” in this view. `)}function UB(e,t){e&1&&J(0,` None of the pipes fit this filter. `)}function WB(e,t){if(e&1){let e=W();z(0,`div`,36)(1,`p`,31),J(2,`No pipes match`),B(),z(3,`p`,32),P(4,HB,1,1)(5,UB,1,0),B(),z(6,`button`,33),G(`click`,function(){return O(e),k(K(2).clearFilters())}),J(7,`Clear filters`),B()()}if(e&2){let e=K(2);M(4),F(e.filter().trim()?4:5)}}function GB(e,t){e&1&&(z(0,`span`,46),J(1,`built-in`),B())}function KB(e,t){if(e&1&&(z(0,`dt`),J(1,`File`),B(),z(2,`dd`,52),J(3),B()),e&2){let e=K();M(3),Z(``,e.file,`:`,e.line)}}function qB(e,t){if(e&1&&(z(0,`li`,52),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e.file,`:`,e.line)}}function JB(e,t){if(e&1&&(z(0,`div`,51)(1,`h3`),J(2,` Used in templates `),z(3,`span`,22),J(4),B()(),z(5,`ul`,54),I(6,qB,2,2,`li`,52,DB),B()()),e&2){let e=K();M(4),Y(e.usageCount),M(2),L(e.usages)}}function YB(e,t){e&1&&(z(0,`p`,55)(1,`span`,44),J(2,`experimental`),B(),J(3,` This pure pipe got an argument whose contents changed while its reference stayed the same, so it may be showing a stale value. `),B())}function XB(e,t){if(e&1){let e=W();z(0,`button`,60),G(`click`,function(){let t=O(e);return k(K(5).highlight(t,!0))})(`mouseenter`,function(){let t=O(e);return k(K(5).highlight(t))})(`mouseleave`,function(){return O(e),k(K(5).highlight(null))})(`focus`,function(){let t=O(e);return k(K(5).highlight(t))})(`blur`,function(){return O(e),k(K(5).highlight(null))}),z(1,`span`,52),J(2),B(),z(3,`span`,61),J(4),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.name+` on the page`),M(2),Y(e.name),M(2),Y(e.count)}}function ZB(e,t){if(e&1&&(z(0,`span`,59)(1,`span`,52),J(2),B(),z(3,`span`,61),J(4),B()()),e&2){let e=K().$implicit;M(2),Y(e.name),M(2),Y(e.count)}}function QB(e,t){if(e&1&&(z(0,`li`),P(1,XB,5,3,`button`,58)(2,ZB,5,2,`span`,59),B()),e&2){let e,n=t.$implicit;M(),F((e=n.targets?.[0])?1:2,e)}}function $B(e,t){if(e&1&&(z(0,`dt`),J(1,`Time`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(),t=K(4);M(3),Y_(` `,t.ms(e.totalMs),` total, `,t.ms(e.totalMs/e.callCount),` average, `,t.ms(e.maxMs??0),` slowest `)}}function eV(e,t){if(e&1&&(z(0,`span`,62),J(1),B()),e&2){let e=K(2);M(),Y(e.lastError)}}function tV(e,t){if(e&1&&(z(0,`dt`),J(1,`Errors`),B(),z(2,`dd`),J(3),P(4,eV,2,1,`span`,62),B()),e&2){let e=K();M(3),X(` `,e.errorCount,` `),M(),F(e.lastError?4:-1)}}function nV(e,t){if(e&1){let e=W();z(0,`button`,60),G(`click`,function(){let t=O(e);return k(K(7).highlight(t,!0))})(`mouseenter`,function(){let t=O(e);return k(K(7).highlight(t))})(`mouseleave`,function(){return O(e),k(K(7).highlight(null))})(`focus`,function(){let t=O(e);return k(K(7).highlight(t))})(`blur`,function(){return O(e),k(K(7).highlight(null))}),z(1,`span`,52),J(2),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(2),Y(e.component)}}function rV(e,t){if(e&1&&(z(0,`span`,59)(1,`span`,52),J(2),B()()),e&2){let e=K().$implicit;M(2),Y(e.component)}}function iV(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit,t=K(6);M(),Y(t.ms(e.totalMs))}}function aV(e,t){if(e&1&&(z(0,`span`,65),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.lastCaller)}}function oV(e,t){if(e&1&&(z(0,`li`,63),P(1,nV,3,2,`button`,58)(2,rV,3,1,`span`,59),z(3,`span`,62),J(4),z(5,`span`,64),J(6),B(),P(7,iV,2,1,`span`,64),B(),P(8,aV,2,1,`span`,65),B()),e&2){let e,n=t.$implicit,r=K(6);M(),F((e=n.target)?1:2,e),M(3),Z(` `,r.describe(n.lastArgs),` → `,r.describe(n.lastResult),` `),M(2),X(``,n.callCount,`×`),M(),F(n.totalMs===void 0?-1:7),M(),F(n.lastCaller?8:-1)}}function sV(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(2);M(),Z(` Showing `,e.instances.length,` of `,e.instanceTotal,` instances. `)}}function cV(e,t){if(e&1&&(z(0,`dt`),J(1,`Per instance`),B(),z(2,`dd`)(3,`ul`,54),I(4,oV,9,6,`li`,63,Cg),B(),P(6,sV,2,2,`p`,57),B()),e&2){let e=K();M(4),L(e.instances),M(2),F(e.instanceTotal?6:-1)}}function lV(e,t){if(e&1&&(z(0,`dt`),J(1,`Last caller`),B(),z(2,`dd`,62),J(3),B()),e&2){let e=K();M(3),Y(e.lastCaller)}}function uV(e,t){if(e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`),J(3),B(),P(4,$B,4,3),P(5,tV,5,2),z(6,`dt`),J(7,`Last input`),B(),z(8,`dd`,62),J(9),B(),z(10,`dt`),J(11,`Last output`),B(),z(12,`dd`,62),J(13),B(),P(14,cV,7,1),P(15,lV,4,1)),e&2){let e=t,n=K(4);M(3),Y(e.callCount),M(),F(e.totalMs===void 0?-1:4),M(),F(e.errorCount?5:-1),M(4),Y(n.describe(e.lastArgs)),M(4),Y(n.describe(e.lastResult)),M(),F(e.instances?.length?14:-1),M(),F(e.lastCaller?15:-1)}}function dV(e,t){e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`,66),J(3,`None recorded yet.`),B())}function fV(e,t){e&1&&(z(0,`p`,57),J(1,` The stale check is off for this pipe: it couldn't read the compiled template, which happens in minified builds. `),B())}function pV(e,t){e&1&&(z(0,`p`,57),J(1,`Turn on “Record calls” to see call counts and values.`),B())}function mV(e,t){if(e&1&&(P(0,YB,4,0,`p`,55),z(1,`dl`)(2,`dt`),J(3,`Instances`),B(),z(4,`dd`),J(5),B(),z(6,`dt`),J(7,`Used by`),B(),z(8,`dd`)(9,`ul`,56),I(10,QB,3,1,`li`,null,OB),B()(),P(12,uV,16,7)(13,dV,4,0),B(),P(14,fV,2,0,`p`,57),P(15,pV,2,0,`p`,57)),e&2){let e,n=t,r=K(3);F(n.stale?0:-1),M(5),Y(n.instanceCount),M(5),L(n.components),M(2),F((e=n.call)?12:r.instrumenting()?13:-1,e),M(2),F(n.staleCheck===`unavailable`?14:-1),M(),F(!n.call&&!r.instrumenting()?15:-1)}}function hV(e,t){e&1&&(z(0,`p`,53),J(1,` Not in use on the connected page. Open a view that uses it, or connect the app. `),B())}function gV(e,t){if(e&1&&(z(0,`header`,49)(1,`h2`,50),J(2),B(),z(3,`span`,46),J(4),B(),P(5,GB,2,0,`span`,46),B(),z(6,`div`,51)(7,`h3`),J(8,`Declaration`),B(),z(9,`dl`)(10,`dt`),J(11,`Class`),B(),z(12,`dd`,52),J(13),B(),z(14,`dt`),J(15,`Source`),B(),z(16,`dd`),J(17),B(),P(18,KB,4,2),z(19,`dt`),J(20,`Standalone`),B(),z(21,`dd`),J(22),B(),z(23,`dt`),J(24,`Pure`),B(),z(25,`dd`),J(26),B()()(),P(27,JB,8,1,`div`,51),z(28,`div`,51)(29,`h3`),J(30,`Live on the page`),B(),P(31,mV,16,5)(32,hV,2,0,`p`,53),B()),e&2){let e,n=t,r=K(2);M(2),Y(n.name),M(),q(`impure`,!n.isPure),M(),Y(n.isPure?`pure`:`impure`),M(),F(n.builtin?5:-1),M(8),Y(n.className),M(4),Y(n.builtin?`@angular/common`:`This project`),M(),F(n.builtin?-1:18),M(4),Y(n.isStandalone?`Yes`:`No, declared in an NgModule`),M(4),X(` `,n.isPure?`Yes, reruns only when an input changes`:`No, reruns on every check`,` `),M(),F(n.usages?.length?27:-1),M(4),F((e=r.liveFor(n.name))?31:32,e)}}function _V(e,t){e&1&&(z(0,`h2`,67),J(1,`Pipe details`),B(),z(2,`div`,68)(3,`p`,31),J(4,`Pick a pipe`),B(),z(5,`p`,32),J(6,` See where it is declared, which components use it and what it last returned. `),B()())}function vV(e,t){if(e&1&&(z(0,`div`,18)(1,`div`,34),P(2,VB,3,0,`ul`,35)(3,WB,8,1,`div`,36),B(),z(4,`section`,37),P(5,gV,33,12)(6,_V,7,0),B()()),e&2){let e,t=K();M(2),F(t.filtered().length?2:3),M(3),F((e=t.selected())?5:6,e)}}function yV(e,t){if(e&1&&(z(0,`p`,57),J(1),B()),e&2){let e=K(2);M(),Z(`Showing `,e.async().length,` of `,t,` subscriptions.`)}}function bV(e,t){if(e&1){let e=W();z(0,`button`,76),G(`click`,function(){let t=O(e);return k(K(3).highlight(t))})(`focus`,function(){let t=O(e);return k(K(3).highlight(t))})(`blur`,function(){return O(e),k(K(3).highlight(null))}),J(1),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(),X(` `,e.component,` `)}}function xV(e,t){if(e&1&&(z(0,`span`,74),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function SV(e,t){e&1&&(z(0,`span`,46),J(1,`no source`),B())}function CV(e,t){e&1&&(z(0,`span`,44),J(1,`duplicate subscription`),B())}function wV(e,t){e&1&&(z(0,`span`,44),J(1,`resubscribing`),B())}function TV(e,t){if(e&1){let e=W();z(0,`li`,72),G(`mouseenter`,function(){let t=O(e).$implicit;return k(K(2).highlight(t.target))})(`mouseleave`,function(){return O(e),k(K(2).highlight(null))}),P(1,bV,2,2,`button`,73)(2,xV,2,1,`span`,74),P(3,SV,2,0,`span`,46),P(4,CV,2,0,`span`,44),P(5,wV,2,0,`span`,44),z(6,`span`,75),J(7),B()()}if(e&2){let e,n=t.$implicit;M(),F((e=n.target)?1:2,e),M(2),F(n.hasSource?-1:3),M(),F(n.duplicate?4:-1),M(),F(n.resubscribing?5:-1),M(2),Y(n.latestValue??`no value yet`)}}function EV(e,t){if(e&1&&(z(0,`section`,19)(1,`h2`,69),J(2,` Async subscriptions `),z(3,`span`,22),J(4),B()(),z(5,`p`,57),J(6,` Each `),z(7,`span`,52),J(8,`| async`),B(),J(9,` subscribes on its own. Two on the same source mean the work runs twice. A source that changes on every check, like `),z(10,`span`,52),J(11,`getData() | async`),B(),J(12,`, resubscribes each time. `),B(),P(13,yV,2,2,`p`,57),z(14,`ul`,70),I(15,TV,8,5,`li`,71,Cg),B()()),e&2){let e,t=K();M(4),Y(t.async().length),M(9),F((e=t.asyncTotal())?13:-1,e),M(2),L(t.async())}}function DV(e,t){e&1&&(z(0,`span`,22),J(1),B()),e&2&&(M(),Y(t.length))}function OV(e,t){e&1&&(z(0,`p`,23),J(1,`Couldn't run the lint check. Try Refresh.`),B())}function kV(e,t){e&1&&(z(0,`p`,24),J(1,`Checking…`),B())}function AV(e,t){e&1&&(z(0,`p`,25),J(1,`No problems found.`),B())}function jV(e,t){if(e&1){let e=W();z(0,`button`,86),G(`click`,function(){O(e),K();let t=iv(6);return k(K(2).showPipe(t))}),z(1,`span`,87),J(2,`Show pipe `),B(),J(3),B()}if(e&2){let e=K().$implicit;M(3),X(``,e.pipe,` `)}}function MV(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.pipe,` `)}}function NV(e,t){if(e&1&&(z(0,`li`,77)(1,`div`,78)(2,`span`,79),J(3),B(),z(4,`code`,80),J(5),B(),nv(6),z(7,`span`,81),P(8,jV,4,1,`button`,82)(9,MV,1,1),J(10),B()(),z(11,`p`,83),J(12),B(),z(13,`p`,84)(14,`span`,85),J(15,`Fix`),B(),J(16),B()()),e&2){let e=t.$implicit;M(2),N(`data-tone`,e.severity),M(),Y(e.severity),M(2),Y(e.rule),M();let n=rv(K(2).pipeFor(e));M(2),F(n?8:9),M(2),Z(` · `,e.file,`:`,e.line,` `),M(2),Y(e.message),M(4),X(` `,e.fix)}}function PV(e,t){if(e&1&&(z(0,`ul`,26),I(1,NV,17,9,`li`,77,Cg),B()),e&2){let e=K();M(),L(e.lint())}}var FV=5e3,IV=[{value:`all`,label:`All pipes`},{value:`custom`,label:`Custom`},{value:`builtin`,label:`Built-in`},{value:`impure`,label:`Impure`},{value:`live`,label:`On the page`}],LV=class e{destroyRef=E(Cs);host=E(Ml);injector=E(xs);filterInput=Rv(`filterInput`);rpc=$(null);kindOptions=IV;pipes=j([]);filter=j(``);kind=j(`all`);loading=j(!1);loadFailed=j(!1);selected=j(null);live=j([]);async=j([]);asyncTotal=j(void 0);lint=j(null);lintFailed=j(!1);instrumentedPages=j([]);instrumenting=Q(()=>this.instrumentedPages().length>0);pendingRecord=j(null);recordMessage=j(null);recordLabel=Q(()=>{let e=this.pendingRecord();return e===null?this.instrumenting()?`Stop recording`:`Record calls`:e?`Starting…`:`Stopping…`});pendingTimer;liveByName=Q(()=>new Map(this.live().map(e=>[e.name,e])));filtered=Q(()=>{let e=this.filter(),t=this.kind()??`all`;return this.pipes().filter(n=>this.fitsKind(n,t)&&this.fitsQuery(n,e))});pipesByName=Q(()=>{let e=new Map;for(let t of this.pipes())e.set(t.name,[...e.get(t.name)??[],t]);return e});unsubscribe;constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.loadLive(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.pendingTimer),this.highlight(null)})}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.loadFailed.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`get-pipes`);this.pipes.set(t);let n=this.selected();if(n){let e=t.find(e=>e.name===n.name&&e.file===n.file);this.selected.set(e??null)}}catch{this.loadFailed.set(!0)}finally{this.loading.set(!1)}this.loadLint(e)}}async loadLint(e){this.lintFailed.set(!1);try{let t=await e.scope(`pangular`).rpc.call(`pipe-lint`);this.lint.set(t)}catch{this.lintFailed.set(!0)}}async loadLive(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=eE(),r=(n?t?.pages?.find(e=>e.pageId===n):void 0)??t;this.live.set(r?.pipes??[]),this.async.set(r?.async??[]),this.asyncTotal.set(r?.asyncTotal);let i=t?.instrumented??[];this.instrumentedPages.set(i),this.pendingRecord()===i.length>0&&this.settleRecord(null)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}async toggleInstrument(){let e=this.rpc();if(!e||this.pendingRecord()!==null)return;let t=!this.instrumenting();this.recordMessage.set(null),this.pendingRecord.set(t);let n;try{let r=t?{pageId:eE()??void 0,on:t}:{on:t};n=await e.scope(`pangular`).rpc.call(`request-instrument-pipes`,r)}catch{this.settleRecord(`Couldn't reach the devtools server. Try again.`);return}if(this.pendingRecord()===t){if(n?.pages===0){this.settleRecord(`No page is connected. Open your app in the browser with the devtools running, then record again.`);return}clearTimeout(this.pendingTimer),this.pendingTimer=setTimeout(()=>{this.pendingRecord()===t&&this.settleRecord(t?`No page confirmed recording. Reload the app and try again.`:`No page confirmed it stopped recording. Reload the app to stop it.`)},FV)}}settleRecord(e){clearTimeout(this.pendingTimer),this.pendingRecord.set(null),e!==null&&this.recordMessage.set(e)}liveFor(e){return this.liveByName().get(e)}ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}describe(e){if(Array.isArray(e))return e.map(e=>this.describe(e)).join(`, `);if(typeof e==`string`)return e.length>80?`${e.slice(0,80)}…`:e;try{let t=JSON.stringify(e);return t&&t.length>120?`${t.slice(0,120)}…`:t??String(e)}catch{return String(e)}}isSelected(e){let t=this.selected();return t!==null&&t.name===e.name&&t.file===e.file}select(e){this.selected.set(this.isSelected(e)?null:e)}pipeFor(e){let t=this.pipesByName().get(e.pipe);return t?.length?t.find(t=>t.file===e.file)??t[0]:null}showPipe(e){this.fitsQuery(e,this.filter())||this.filter.set(``),this.fitsKind(e,this.kind()??`all`)||this.kind.set(`all`),this.selected.set(e),Id(()=>{let e=this.host.nativeElement;e.querySelector(`.row.selected`)?.scrollIntoView?.({block:`nearest`}),e.querySelector(`#pipe-detail-title`)?.focus()},{injector:this.injector})}fitsKind(e,t){return t===`custom`?!e.builtin:t===`builtin`?!!e.builtin:t===`impure`?!e.isPure:t!==`live`||this.liveByName().has(e.name)}fitsQuery(e,t){let n=t.trim().toLowerCase();return!n||e.name.toLowerCase().includes(n)||e.className.toLowerCase().includes(n)||e.file.toLowerCase().includes(n)}clearFilters(){this.filter.set(``),this.kind.set(`all`),this.filterInput()?.nativeElement.focus()}highlightPipe(e){this.highlight(e?.components.find(e=>e.targets?.length)?.targets?.[0])}highlight(e,t=!1){let n=this.rpc();n&&n.scope(`pangular`).rpc.call(`request-page-highlight`,e?{...e,...t?{reveal:t}:{}}:null).catch(()=>{})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-pipe-row]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-pipes-inspector`]],viewQuery:function(e,t){e&1&&e_(t.filterInput,TB,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:33,vars:18,consts:[[`filterInput`,``],[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a pipe, class or file…`,`aria-label`,`Find a pipe, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show pipes`,3,`valueChange`,`options`,`value`],[`aria-live`,`polite`,1,`total`],[1,`actions`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,1,`record`,3,`click`],[`aria-hidden`,`true`,1,`rec-dot`],[`role`,`status`,1,`notice`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[1,`state`],[1,`layout`],[`aria-labelledby`,`async-title`,1,`section`],[`aria-labelledby`,`lint-title`,1,`section`],[`id`,`lint-title`],[1,`pill`],[`role`,`alert`,1,`empty-line`],[`role`,`status`,1,`empty-line`],[1,`empty-line`,`ok`],[1,`findings`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[`aria-hidden`,`true`,1,`spinner`],[1,`state-title`],[1,`state-hint`],[`type`,`button`,3,`click`],[1,`list-wrap`],[`aria-label`,`Pipes`,1,`pipe-list`],[`role`,`status`,1,`state`,`compact`],[`id`,`pipe-detail`,`aria-labelledby`,`pipe-detail-title`,1,`detail`],[`aria-label`,`Pipes`,1,`pipe-list`,3,`keydown`],[`type`,`button`,`data-pipe-row`,``,`aria-controls`,`pipe-detail`,1,`row`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`row-main`],[1,`name`,`mono`],[1,`sub`,`mono`],[1,`row-meta`],[1,`chip`,`warn`],[1,`chip`,`live`],[1,`chip`],[1,`row-file`,`mono`],[1,`more`],[1,`detail-head`],[`id`,`pipe-detail-title`,`tabindex`,`-1`,1,`mono`],[1,`block`],[1,`mono`],[1,`empty-line`],[1,`sites`],[`role`,`note`,1,`warning`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`component`],[1,`component`],[`type`,`button`,1,`component`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`count`],[1,`mono`,`value`],[1,`instance`],[1,`calls`],[1,`mono`,`value`,`caller`],[1,`muted`],[`id`,`pipe-detail-title`,1,`visually-hidden`],[1,`state`,`compact`],[`id`,`async-title`],[1,`async-list`],[1,`async-row`],[1,`async-row`,3,`mouseenter`,`mouseleave`],[`type`,`button`,1,`component-name`,`mono`],[1,`mono`,`component-name`],[1,`mono`,`value`,`latest`],[`type`,`button`,1,`component-name`,`mono`,3,`click`,`focus`,`blur`],[1,`finding`],[1,`finding-head`],[1,`severity`],[1,`mono`,`rule`],[1,`where`,`mono`],[`type`,`button`,1,`pipe-link`],[1,`finding-message`],[1,`finding-fix`],[1,`fix-label`],[`type`,`button`,1,`pipe-link`,3,`click`],[1,`sr-only`]],template:function(e,t){if(e&1){let e=W();z(0,`p`,1),J(1,` Pipes declared in your source and the built-in pipes your templates use. Live data shows which components use each pipe on the page; turn on recording to capture calls and the last input and output. `),B(),z(2,`div`,2)(3,`div`,3),A(),z(4,`svg`,4),V(5,`circle`,5)(6,`path`,6),B(),ps(),z(7,`input`,7,0),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B()(),z(9,`app-select`,8),ev(`valueChange`,function(n){return O(e),$_(t.kind,n)||(t.kind=n),k(n)}),B(),z(10,`span`,9),J(11),B(),z(12,`div`,10)(13,`button`,11),G(`click`,function(){return t.refresh()}),J(14,`Refresh`),B(),z(15,`button`,12),G(`click`,function(){return t.toggleInstrument()}),V(16,`span`,13),J(17),B()()(),P(18,kB,6,1,`p`,14),P(19,AB,8,1,`p`,14),P(20,jB,4,0,`div`,15)(21,MB,7,0,`div`,16)(22,NB,5,0,`div`,17)(23,vV,7,2,`div`,18),P(24,EV,17,2,`section`,19),z(25,`section`,20)(26,`h2`,21),J(27,` Lint `),P(28,DV,2,1,`span`,22),B(),P(29,OV,2,0,`p`,23)(30,kV,2,0,`p`,24)(31,AV,2,0,`p`,25)(32,PV,3,0,`ul`,26),B()}if(e&2){let e,n;M(7),R(`value`,t.filter()),M(2),R(`options`,t.kindOptions),Q_(`value`,t.kind),M(2),Z(``,t.filtered().length,` of `,t.pipes().length),M(2),R(`disabled`,t.loading()),M(2),q(`on`,t.instrumenting()),N(`aria-pressed`,t.instrumenting())(`aria-busy`,t.pendingRecord()!==null)(`aria-disabled`,t.pendingRecord()!==null),M(2),X(` `,t.recordLabel(),` `),M(),F((e=t.recordMessage())?18:-1,e),M(),F(t.instrumenting()?19:-1),M(),F(t.loading()&&t.pipes().length===0?20:t.loadFailed()&&t.pipes().length===0?21:t.pipes().length===0?22:23),M(4),F(t.async().length>0?24:-1),M(4),F((n=t.lint())?28:-1,n),M(),F(t.lintFailed()?29:t.lint()===null?30:t.lint().length?32:31)}},dependencies:[jD],styles:[`[_nghost-%COMP%] {
display: block;
color: var(--%NS%text);
font-size: 13px;
@@ -10445,7 +10445,7 @@ button.pipe-link[_ngcontent-%COMP%]:focus-visible {
.spinner[_ngcontent-%COMP%] {
animation: none;
}
-}`]})},NV=()=>[],PV=()=>[`/`],FV=(e,t)=>t.id,IV=(e,t)=>t.route.id,LV=(e,t)=>t[0],RV=(e,t)=>t.file+t.method,zV=(e,t)=>t.path,BV=(e,t)=>t.mode,VV=(e,t)=>t.file,HV=(e,t)=>t.rule;function UV(e,t){if(e&1){let e=W();z(0,`div`,0)(1,`h2`,3),J(2,`Could not read the project.`),B(),z(3,`p`,4),J(4,` Check that the dev server with Pangular Inspector is still running, then retry. `),B(),z(5,`button`,5),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function WV(e,t){e&1&&(z(0,`div`,1),V(1,`span`,6),z(2,`span`),J(3,`Reading the project…`),B()())}function GV(e,t){e&1&&(z(0,`div`,2)(1,`h2`,3),J(2,`This app is not an Analog app.`),B(),z(3,`p`,4),J(4,` Add `),z(5,`code`),J(6,`pangular()`),B(),J(7,` from `),z(8,`code`),J(9,`@pangular-inspector/devtools/vite`),B(),J(10,` next to `),z(11,`code`),J(12,`analog()`),B(),J(13,` in vite.config.ts and run the Analog dev server. `),B()())}function KV(e,t){if(e&1&&(z(0,`div`,11)(1,`span`,9),J(2,`Open in the browser`),B(),z(3,`span`,15),J(4),B()()),e&2){let e=t;M(3),R(`title`,e.url),M(),Y(e.url)}}function qV(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=O(e).$implicit;return k(K(2).view.set(t.id))}),J(1),z(2,`span`,17),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`analog-tab-`+e.id),N(`aria-selected`,e.id===n.view())(`aria-controls`,`analog-panel-`+e.id)(`tabindex`,e.id===n.view()?0:-1),M(),X(` `,e.label,` `),M(),N(`data-tone`,e.tone),M(),Y(e.count)}}function JV(e,t){e&1&&(z(0,`div`,26),J(1),B()),e&2&&(M(),Y(t))}function YV(e,t){if(e&1&&(z(0,`li`)(1,`span`,31),J(2),B(),z(3,`span`,34),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(2),Y(n.short(e.file)??e.fullPath),M(),N(`data-kind`,e.kind),M(),Y(e.kind)}}function XV(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e[0],` = `,e[1])}}function ZV(e,t){if(e&1&&(z(0,`div`,33),I(1,XV,2,2,`span`,35,LV),B()),e&2){let e=K(2),t=K(3);M(),L(t.paramList(e.match.params))}}function QV(e,t){if(e&1&&(z(0,`strong`,31),J(1),B(),J(2,` renders `),z(3,`ol`,32),I(4,YV,5,3,`li`,null,FV),B(),P(6,ZV,3,0,`div`,33)),e&2){let e=K(),t=K(3);M(),Y(e.url),M(3),L(e.match.chain),M(2),F(t.paramList(e.match.params).length?6:-1)}}function $V(e,t){if(e&1&&(z(0,`li`)(1,`span`,31),J(2),B(),z(3,`span`,4),J(4),B()()),e&2){let e=t.$implicit,n=K(6);M(2),Y(n.short(e.file)??e.path),M(2),Y(e.reason)}}function eH(e,t){if(e&1&&(z(0,`ul`,36),I(1,$V,5,2,`li`,null,Cg),B()),e&2){let e=K(2);M(),L(e.match.rejected.slice(0,5))}}function tH(e,t){if(e&1&&(z(0,`strong`,31),J(1),B(),J(2,` matches no file route. Angular throws NG04002 "Cannot match any routes". `),P(3,eH,3,0,`ul`,36)),e&2){let e=K();M(),Y(e.url),M(2),F(e.match.rejected.length?3:-1)}}function nH(e,t){if(e&1&&(z(0,`div`,27),P(1,QV,7,2)(2,tH,4,2),B()),e&2){let e=t;N(`data-tone`,e.match.matched?`good`:`bad`),M(),F(e.match.matched?1:2)}}function rH(e,t){e&1&&(z(0,`span`,38),J(1,`└`),B())}function iH(e,t){e&1&&(z(0,`span`,40),J(1,`open`),B())}function aH(e,t){if(e&1&&(z(0,`span`,41)(1,`span`,45),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.route.file)),M(),Y(t.base(e.route.file))}}function oH(e,t){e&1&&(z(0,`span`,4),J(1,`folder only`),B())}function sH(e,t){if(e&1&&(z(0,`span`,43),J(1),B()),e&2){let e=t.$implicit;M(),X(``,e,`()`)}}function cH(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){let e=K().$implicit;M(),X(`"`,e.route.title,`"`)}}function lH(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=K().$implicit;M(),Y(e)}}function uH(e,t){if(e&1&&P(0,lH,2,1,`span`,35),e&2){let e=t.$implicit;F(e===`title`?-1:0)}}function dH(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`div`,37),P(3,rH,2,0,`span`,38),z(4,`span`,39),J(5),B(),z(6,`span`,34),J(7),B(),P(8,iH,2,0,`span`,40),B()(),z(9,`td`),P(10,aH,4,2,`span`,41)(11,oH,2,0,`span`,4),B(),z(12,`td`)(13,`div`,42),I(14,sH,2,1,`span`,43,wg),B()(),z(16,`td`),P(17,cH,2,1,`span`,44),I(18,uH,1,1,null,null,wg),B()()),e&2){let e=t.$implicit,n=K(3);q(`open`,n.isOpen(e.route))(`dim`,e.route.kind===`group`||e.route.kind===`implicit`),M(2),C_(`padding-left`,e.depth*16,`px`),M(),F(e.depth?3:-1),M(2),Y(e.route.fullPath),M(),N(`data-kind`,e.route.kind),M(),Y(n.kindText(e.route)),M(),F(n.isOpen(e.route)?8:-1),M(2),F(e.route.file?10:11),M(4),L(n.serverExports(e.route)),M(3),F(e.route.title?17:-1),M(),L(e.route.routeMeta??ov(13,NV))}}function fH(e,t){e&1&&J(0,` No route matches the filter. Try part of a path or a file name. `)}function pH(e,t){e&1&&J(0,` No file routes yet. Add a .page.ts file under src/app/pages. `)}function mH(e,t){if(e&1&&(z(0,`tr`)(1,`td`,46),P(2,fH,1,0)(3,pH,1,0),B()()),e&2){let e=K(3);M(2),F(e.filter().trim()?2:3)}}function hH(e,t){if(e&1){let e=W();z(0,`div`,18)(1,`form`,19),G(`submit`,function(t){O(e);let n=K(2);return t.preventDefault(),k(n.explain())}),z(2,`label`,20),J(3,`Test a URL`),B(),z(4,`input`,21),G(`input`,function(t){return O(e),k(K(2).testUrl.set(t.target.value))}),B(),z(5,`button`,22),J(6),B()(),z(7,`label`,23),J(8,`Filter routes`),B(),z(9,`input`,24),G(`input`,function(t){return O(e),k(K(2).filter.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K(2).filter.set(``))}),B()(),z(10,`div`,25),P(11,JV,2,1,`div`,26)(12,nH,3,2,`div`,27),B(),z(13,`div`,28)(14,`table`)(15,`thead`)(16,`tr`)(17,`th`,29),J(18,`Route`),B(),z(19,`th`,29),J(20,`File`),B(),z(21,`th`,29),J(22,`Data`),B(),z(23,`th`,29),J(24,`Route meta`),B()()(),z(25,`tbody`),I(26,dH,20,14,`tr`,30,IV,!1,mH,4,1,`tr`),B()()()}if(e&2){let e,t=K(2);M(4),R(`value`,t.testUrl()),M(),R(`disabled`,t.explaining()),M(),X(` `,t.explaining()?`Explaining…`:`Explain`,` `),M(3),R(`value`,t.filter()),M(2),F((e=t.explainError())?11:(e=t.explained())?12:-1,e),M(15),L(t.routeRows())}}function gH(e,t){if(e&1&&(z(0,`span`,31),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function _H(e,t){if(e&1&&(z(0,`div`,47)(1,`strong`),J(2,`load() ran twice`),B(),J(3,` for `),I(4,gH,3,2,null,null,wg),J(6,` : once while server rendering, again in the browser. TransferState did not serve the server result. `),B()),e&2){let e=K(3);M(4),L(e.duplicates())}}function vH(e,t){if(e&1&&(z(0,`span`,31),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function yH(e,t){if(e&1&&(z(0,`div`,47)(1,`strong`),J(2,`Server function read ran twice`),B(),J(3,`: `),I(4,vH,3,2,null,null,wg),J(6,` ran while server rendering, then again in the browser. The browser did not use the TransferState seed. `),B()),e&2){let e=K(3);M(4),L(e.refetchedFns())}}function bH(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,79),G(`change`,function(){let t=O(e).$implicit;return k(K(3).kind.set(t))}),B(),J(2),z(3,`span`,4),J(4),B()()}if(e&2){let e=t.$implicit,n=K(3);q(`on`,n.kind()===e),M(),R(`checked`,n.kind()===e),N(`data-kind`,e),M(),X(` `,n.kindLabel(e),` `),M(2),Y(n.kindCount(e))}}function xH(e,t){if(e&1&&J(0),e&2){let e=K(4);Z(` Showing the newest `,e.shownCount(),` of `,e.matchingCalls().length,`. `)}}function SH(e,t){e&1&&J(0),e&2&&X(` The dev server keeps only the newest `,K(4).maxServerCalls,` calls and drops older ones. `)}function CH(e,t){if(e&1&&(z(0,`p`,65),P(1,xH,1,2),P(2,SH,1,1),B()),e&2){let e=K(3);M(),F(e.shownCount()1?6:-1),M(2),Y(e.summary),M(2),L(e.items),M(5),X(` `,e.fix),M(2),Y(e.rule)}}function FU(e,t){if(e&1&&(z(0,`p`,4),J(1),B(),z(2,`ul`,112),I(3,PU,18,8,`li`,null,HV),B()),e&2){let e=K(3);M(),Z(` `,e.findings().length,` issue(s) in `,e.lintCards().length,` group(s). Each card says what is wrong, where, and how to fix it. `),M(2),L(e.lintCards())}}function IU(e,t){e&1&&(z(0,`div`,111)(1,`strong`),J(2,`No Analog problems found.`),B(),J(3,` Routes, server files, prerender config and content all check out. `),B())}function LU(e,t){e&1&&P(0,FU,5,2)(1,IU,4,0,`div`,111),e&2&&F(+!K(2).findings().length)}function RU(e,t){if(e&1){let e=W();z(0,`section`,7)(1,`div`,8)(2,`span`,9),J(3,`Analog`),B(),z(4,`span`,10),J(5),B()(),z(6,`div`,8)(7,`span`,9),J(8,`Pages`),B(),z(9,`span`,10),J(10),B()(),z(11,`div`,8)(12,`span`,9),J(13,`API routes`),B(),z(14,`span`,10),J(15),B()(),z(16,`div`,8)(17,`span`,9),J(18,`Server calls`),B(),z(19,`span`,10),J(20),B()(),z(21,`div`,8)(22,`span`,9),J(23,`Issues`),B(),z(24,`span`,10),J(25),B()(),P(26,KV,5,2,`div`,11),B(),z(27,`div`,12),G(`keydown`,function(t){return O(e),k(K().onKey(t))}),I(28,qV,4,7,`button`,13,FV),B(),z(30,`div`,14),P(31,hH,29,6)(32,QH,65,21)(33,SU,18,3)(34,OU,2,1)(35,LU,2,1),B()}if(e&2){let e,t,n=K();M(5),Y(n.project().version||`unknown`),M(5),Y(n.pageCount()),M(5),Y(n.project().api.length),M(5),Y(n.allCalls().length),M(),N(`data-tone`,n.findings().length?`warn`:`good`),M(4),Y(n.findings().length),M(),F((e=n.page())?26:-1,e),M(2),L(n.views()),M(2),R(`id`,`analog-panel-`+n.view()),N(`aria-labelledby`,`analog-tab-`+n.view()),M(),F((t=n.view())===`routes`?31:t===`server`?32:t===`render`?33:t===`content`?34:t===`lint`?35:-1)}}var zU={"scan-error":{title:`A folder could not be read`,summary:`Its files are missing from routes, API routes and lint results.`},"duplicate-url":{title:`Two files serve the same URL`,summary:`Only one of them is reachable; the other never renders.`},"sibling-params":{title:`Two dynamic pages in one folder`,summary:`Both are [param] pages at the same level, so the first one always wins.`},"missing-default-export":{title:`Page has no default export`,summary:`Analog needs the component as the default export, so the page renders nothing.`},"redirect-with-component":{title:`Redirect page also exports a component`,summary:`The redirect runs first, so the component never shows.`},"redirect-path-match":{title:`Redirect matches too much`,summary:`An empty-path redirect without pathMatch "full" catches every URL below it.`},"layout-without-outlet":{title:`Layout has no router-outlet`,summary:`The layout has child pages, but without they never render.`},"server-without-load":{title:`.server.ts without load or action`,summary:`The server file exports no load, action or server function, so Analog calls nothing.`},"orphan-server-file":{title:`.server.ts without a page`,summary:`No page file sits next to it, so its load never runs.`},"api-method-suffix":{title:`Unknown method suffix on an API file`,summary:`The suffix is not an HTTP method, so it becomes part of the URL.`},"duplicate-api-route":{title:`Two handlers for one API route`,summary:`Two files answer the same method and path.`},"api-outside-prefix":{title:`Server route outside the API prefix`,summary:`During vite dev only routes under the prefix reach Nitro.`},"prerender-unknown-route":{title:`Prerender entry matches no page`,summary:`prerender.routes lists a path that no page file serves.`},"prerender-missing-root":{title:`Home page is not prerendered`,summary:`static is on, but prerender.routes leaves out /.`},"content-frontmatter":{title:`Broken frontmatter`,summary:`The markdown frontmatter cannot be read.`},"duplicate-slug":{title:`Two posts share a slug`,summary:`injectContent picks one of them at random.`},"content-shadows-page":{title:`Markdown file takes over a page`,summary:`Files under src/content are routes too, so these URLs render the markdown file instead of the [param] page.`},"load-fetched-twice":{title:`load() runs twice`,summary:`These pages fetched their data while rendering on the server and again in the browser.`},"fn-fetched-twice":{title:`Server function read runs twice`,summary:`These reads ran while rendering on the server and again in the browser right after hydration.`},"restart-needed":{title:`New pages need a restart`,summary:`These page files exist, but the running router does not know them yet.`},"hydration-error":{title:`Hydration error`,summary:`The browser DOM did not match the server HTML.`},"api-not-found":{title:`API call failed with 404 or 405`,summary:`A request hit a path or method that no server route handles.`}},BU=200,VU=new Set([`missing-default-export`,`redirect-with-component`,`redirect-path-match`,`layout-without-outlet`,`server-without-load`,`orphan-server-file`,`load-fetched-twice`,`restart-needed`,`prerender-missing-root`]),HU={ssr:`SSR`,ssg:`Prerendered`,client:`Client only`,cached:`Cached`,redirect:`Redirect`},UU={all:`All`,page:`Pages`,load:`load()`,action:`Actions`,fn:`Server fn`,api:`API`},WU={success:`succeeded`,redirect:`redirected`,invalid:`validation errors`,error:`failed`},GU={success:`good`,redirect:`info`,invalid:`warn`,error:`bad`};function KU(e,t=0,n=[]){for(let r of e)n.push({route:r,depth:t}),KU(r.children,t+1,n);return n}var qU=class e{rpc=$(null);canCall=Q(()=>bE(this.rpc(),`analog`));callsOff=KT(`analog`);kinds=[`all`,`page`,`load`,`action`,`fn`,`api`];methods=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];methodOptions=this.methods.map(e=>({value:e,label:e}));view=j(`routes`);project=j(null);loadFailed=j(!1);state=j({});findings=j([]);renderRows=j([]);plan=j(null);filter=j(``);testUrl=j(``);explained=j(null);explainError=j(``);explaining=j(!1);kind=j(`all`);method=j(`GET`);apiPath=j(``);apiBody=j(``);confirmSend=j(!1);response=j(null);sending=j(!1);needsConfirm=Q(()=>this.method()!==`GET`&&!this.confirmSend());canSend=Q(()=>this.canCall()&&!this.sending()&&!this.needsConfirm());sendHintId=Q(()=>this.canCall()?this.needsConfirm()?`analog-confirm-hint`:null:`analog-calls-off`);unsubscribe=null;refreshTimer;refreshRun=0;destroyRef=E(Cs);host=E(Ml);hostPageId=eE();page=Q(()=>{let e=this.state().pages??[];return(this.hostPageId?e.find(e=>e.pageId===this.hostPageId):e[0])??null});openFiles=Q(()=>new Set((this.page()?.chain??[]).map(e=>e.file)));allCalls=Q(()=>this.state().calls??[]);maxServerCalls=BU;callQuery=j(``);failedOnly=j(!1);callsMessage=j(``);callFiltered=Q(()=>!!this.callQuery().trim()||this.failedOnly());matchingCalls=Q(()=>{let e=this.kind(),t=this.callQuery().trim().toLowerCase(),n=this.failedOnly();return this.allCalls().filter(r=>(e===`all`||r.kind===e)&&(!n||this.isFailed(r))&&(!t||this.callText(r).includes(t)))});calls=Q(()=>this.matchingCalls().slice(-150).reverse());shownCount=Q(()=>this.calls().length);serverFull=Q(()=>this.allCalls().length>=BU);allRoutes=Q(()=>KU(this.project()?.routes??[]));pageCount=Q(()=>this.allRoutes().filter(e=>e.route.file&&e.route.kind!==`layout`).length);routeRows=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.allRoutes().filter(t=>t.route.fullPath.toLowerCase().includes(e)||!!t.route.file?.toLowerCase().includes(e)):this.allRoutes()});serverFns=Q(()=>this.project()?.serverFns??[]);fnById=Q(()=>new Map(this.serverFns().map(e=>[e.id,e])));refetchedFns=Q(()=>Array.from(new Set((this.state().refetches??[]).map(e=>this.fnById().get(e.id)?.name??e.id))));duplicates=Q(()=>Array.from(new Set((this.state().duplicates??[]).map(e=>e.route))));modeCounts=Q(()=>[`ssr`,`ssg`,`cached`,`client`,`redirect`].map(e=>({mode:e,label:HU[e],count:this.renderRows().filter(t=>t.mode===e).length})).filter(e=>e.count));lintCards=Q(()=>{let e={error:0,warning:1,info:2},t=new Map;for(let e of this.findings()){let n=t.get(e.rule);if(!n){let r=zU[e.rule];n={rule:e.rule,severity:e.severity,title:r?.title??e.rule,summary:r?.summary??e.message,fix:e.fix,items:[]},t.set(e.rule,n)}let r=VU.has(e.rule)||e.message===n.summary?void 0:e.message;n.items.some(t=>t.file===e.file&&t.path===e.path&&t.message===r)||n.items.push({file:e.file,path:e.path,message:r})}return Array.from(t.values()).sort((t,n)=>e[t.severity]-e[n.severity])});views=Q(()=>{let e=this.findings().length;return[{id:`routes`,label:`Routes`,count:this.pageCount(),tone:``},{id:`server`,label:`Server`,count:this.allCalls().length,tone:``},{id:`render`,label:`Render`,count:this.renderRows().length,tone:``},{id:`content`,label:`Content`,count:this.project()?.content.length??0,tone:``},{id:`lint`,label:`Lint`,count:e,tone:e?`warn`:``}]});constructor(){uc(()=>{let e=this.rpc();e&&Cv(()=>void this.load(e))}),uc(()=>{let e=this.view();this.state(),Cv(()=>this.scheduleRefresh(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.refreshTimer)})}async load(e){let t=await aE(e,`analog-project`);if(!this.destroyRef.destroyed){this.project.set(t),this.loadFailed.set(t===null);try{let t=await e.scope(`pangular`).rpc.sharedState(`analog`);if(this.destroyRef.destroyed)return;let n=e=>this.state.set(e??{});n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.state.set({})}this.destroyRef.destroyed||await this.refresh(this.view())}}retry(){let e=this.rpc();e&&(this.loadFailed.set(!1),this.load(e))}scheduleRefresh(e){clearTimeout(this.refreshTimer),this.refreshTimer=setTimeout(()=>void this.refresh(e),300)}async refresh(e){let t=this.rpc();if(!t)return;let n=++this.refreshRun,[r,i]=await Promise.all([aE(t,`analog-lint`),aE(t,`analog-render`)]);if(n===this.refreshRun&&(this.findings.set(r??[]),this.renderRows.set(i?.rows??[]),this.plan.set(i?.plan??null),e===`routes`||e===`content`||this.project()===null)){let e=await aE(t,`analog-project`);e&&n===this.refreshRun&&(this.project.set(e),this.loadFailed.set(!1))}}isOpen(e){return!!e.file&&this.openFiles().has(e.file)}kindText(e){return e.catchAll?e.catchAll===`optional`?`optional catch-all`:`catch-all`:e.kind===`implicit`?`folder`:e.kind}serverExports(e){return(e.serverExports??[]).filter(e=>e===`load`||e===`action`)}short(e){return e?.replace(/^\/src\/app\//,``).replace(/^\//,``)}dir(e){let t=this.short(e)??e;return t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)+1):``}base(e){return e.slice(e.lastIndexOf(`/`)+1)}paramList(e){return Object.entries(e)}kindLabel(e){return UU[e]}kindCount(e){return e===`all`?this.allCalls().length:this.allCalls().filter(t=>t.kind===e).length}modeLabel(e){return HU[e]}mismatch(e){return!e.last?.render||e.mode===`redirect`?!1:e.mode===`client`?e.last.render!==`client`:e.last.render===`client`}fnOf(e){return e.kind===`fn`&&e.route?this.fnById().get(e.route):void 0}fnCalls(e){return this.allCalls().filter(t=>t.kind===`fn`&&t.route===e).length}outcomeLabel(e){return WU[e]}outcomeTone(e){return GU[e]}statusClass(e){return e>=500||e===0?`bad`:e>=400?`warn`:`good`}tone(e){return e===`error`?`bad`:e===`warning`?`warn`:`info`}shadowed(e){return this.findings().find(t=>t.rule===`content-shadows-page`&&t.file===e)?.message.match(/(\/\S+\.page\.ts)/)?.[1]}contentUrl(e){return this.allRoutes().find(t=>t.route.file===e)?.route.fullPath}pretty(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}time=zD;tryApi(e){this.method.set(e.method===`ANY`?`GET`:e.method),this.apiPath.set(e.path.replace(/:(\w+)/g,`1`).replace(`**`,`x`)),this.response.set(null),queueMicrotask(()=>document.getElementById(`api-path`)?.focus())}isFailed(e){return!e.status||e.status>=400||e.outcome===`error`}callText(e){let t=this.fnOf(e);return[e.url,e.route,t?.name,t?.file].filter(Boolean).join(` `).toLowerCase()}clearCallFilters(){this.callQuery.set(``),this.failedOnly.set(!1),this.kind.set(`all`),queueMicrotask(()=>this.host.nativeElement.querySelector(`#analog-call-search`)?.focus())}async clearCalls(){let e=this.rpc();try{if(!e)throw Error(`No devtools server`);await iE(e,`analog-clear-calls`),this.callsMessage.set(`Calls cleared.`),queueMicrotask(()=>this.host.nativeElement.querySelector(`input[name="analog-kind"]:checked`)?.focus())}catch{this.callsMessage.set(`Could not clear the calls.`)}}async explain(){let e=this.testUrl().trim();if(!e){this.explained.set(null),this.explainError.set(`Type a URL to explain, for example /products/42.`);return}this.explaining.set(!0),this.explainError.set(``);try{let t=await iE(this.rpc(),`analog-explain-url`,e);if(!t)throw Error(`The devtools server did not answer`);this.explained.set({url:e,match:t})}catch(t){let n=String(t?.message||`The devtools server did not answer`);this.explained.set(null),this.explainError.set(`Could not explain ${e}. ${n.replace(/\.?$/,`.`)}`)}finally{this.explaining.set(!1)}}async send(){let e=this.apiPath().trim();if(!e||this.sending()||this.needsConfirm())return;let t;if(this.method()!==`GET`&&this.apiBody().trim())try{t=JSON.parse(this.apiBody())}catch{this.response.set({error:`The body is not valid JSON.`});return}this.response.set(null),this.sending.set(!0);try{let n=await aE(this.rpc(),`analog-call-api`,{method:this.method(),path:e,body:t,confirm:this.confirmSend()});this.response.set(n??{error:`No answer from the devtools server.`})}finally{this.sending.set(!1)}}onKey(e){let t=this.views().map(e=>e.id),n=t.indexOf(this.view()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.view.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#analog-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-analog-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty`],[`role`,`status`,1,`loading`],[1,`empty`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`btn`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-label`,`Analog summary`,1,`summary`],[1,`stat`],[1,`label`],[1,`value`],[1,`stat`,`wide`],[`role`,`tablist`,`aria-label`,`Analog views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[1,`value`,`mono`,3,`title`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`count`],[1,`toolbar`],[1,`inline`,`explain`,3,`submit`],[`for`,`analog-url`],[`id`,`analog-url`,`type`,`text`,`placeholder`,`/products/42`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`for`,`route-filter`,1,`sr-only`],[`id`,`route-filter`,`type`,`search`,`placeholder`,`Filter by path or file`,1,`field`,`filter`,3,`input`,`keydown.escape`,`value`],[`role`,`status`,1,`explain-result`],[`data-tone`,`bad`,1,`callout`],[1,`callout`],[`role`,`region`,`aria-label`,`File routes`,`tabindex`,`0`,1,`table-wrap`],[`scope`,`col`],[3,`open`,`dim`],[1,`mono`],[1,`chain`],[1,`chips`],[1,`pill`],[1,`chip`,`mono`],[1,`plain`],[1,`route`],[`aria-hidden`,`true`,1,`guide`],[1,`mono`,`path`],[1,`pill`,`live`],[1,`file`],[1,`meta`],[`data-kind`,`load`,1,`pill`],[1,`chip`],[1,`dir`],[`colspan`,`4`,1,`empty-row`],[`data-tone`,`warn`,`role`,`note`,1,`callout`],[`id`,`analog-calls-heading`],[1,`calls-bar`],[1,`segmented`],[1,`sr-only`],[3,`on`],[1,`calls-actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`,`disabled`],[`role`,`status`,1,`calls-message`],[`role`,`group`,`aria-label`,`Filter the server calls`,1,`call-filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`id`,`analog-call-search`,`type`,`search`,`placeholder`,`Find a URL, path or function…`,`aria-label`,`Find a URL, path or function`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,3,`input`,`keydown.escape`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`aria-live`,`polite`,1,`total`],[1,`note`],[`role`,`region`,`aria-label`,`Server calls`,`tabindex`,`0`,1,`table-wrap`],[`role`,`status`,1,`empty-box`,`no-match`],[1,`empty-box`],[`role`,`region`,`aria-label`,`API routes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`,`playground`,3,`submit`],[1,`row`],[`ariaLabel`,`Method`,1,`method-select`,3,`valueChange`,`options`,`value`],[`for`,`api-path`,1,`sr-only`],[`id`,`api-path`,`type`,`text`,`placeholder`,`/api/v1/products`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`id`,`analog-calls-off`,1,`muted`],[`id`,`analog-confirm-hint`,1,`muted`],[`role`,`status`,1,`muted`],[`role`,`status`,1,`response`],[`type`,`radio`,`name`,`analog-kind`,1,`sr-only`,3,`change`,`checked`],[`scope`,`col`,1,`num`],[1,`muted`,`nowrap`],[1,`request`],[1,`method`],[1,`mono`,`url`],[1,`status`],[1,`num`,`nowrap`],[1,`mono`,`muted`],[1,`code`],[1,`empty-lead`],[1,`empty-actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`],[1,`actions`],[`role`,`region`,`aria-label`,`Server functions`,`tabindex`,`0`,1,`table-wrap`],[1,`num`,`tnum`],[`for`,`api-body`],[`id`,`api-body`,`rows`,`3`,`placeholder`,`{"name": "Ada"}`,1,`field`,`mono`,3,`input`,`value`],[1,`check`,`confirm-send`],[`data-status`,`bad`,1,`status`],[`role`,`region`,`aria-label`,`Render modes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`],[1,`muted`,`small`],[1,`muted`,`small`,`tnum`],[`data-tone`,`warn`,1,`pill`],[1,`facts`],[1,`tnum`],[`data-tone`,`warn`,1,`chip`,`mono`],[`data-tone`,`bad`,1,`chip`,`mono`],[`role`,`region`,`aria-label`,`Content files`,`tabindex`,`0`,1,`table-wrap`],[1,`muted`,`nowrap`,`tnum`],[`data-tone`,`bad`,1,`pill`],[`data-tone`,`good`,`role`,`status`,1,`callout`],[1,`findings`],[1,`finding-head`],[1,`finding-title`],[1,`where`],[1,`fix`],[1,`rule`,`mono`],[1,`detail`]],template:function(e,t){e&1&&P(0,UV,7,0,`div`,0)(1,WV,4,0,`div`,1)(2,GV,14,0,`div`,2)(3,RU,36,10),e&2&&F(t.project()===null&&t.loadFailed()?0:t.project()===null?1:t.project().analog?3:2)},dependencies:[jD],styles:[`@charset "UTF-8";
+}`]})},RV=()=>[],zV=()=>[`/`],BV=(e,t)=>t.id,VV=(e,t)=>t.route.id,HV=(e,t)=>t[0],UV=(e,t)=>t.file+t.method,WV=(e,t)=>t.path,GV=(e,t)=>t.mode,KV=(e,t)=>t.file,qV=(e,t)=>t.rule;function JV(e,t){if(e&1){let e=W();z(0,`div`,0)(1,`h2`,3),J(2,`Could not read the project.`),B(),z(3,`p`,4),J(4,` Check that the dev server with Pangular Inspector is still running, then retry. `),B(),z(5,`button`,5),G(`click`,function(){return O(e),k(K().retry())}),J(6,`Retry`),B()()}}function YV(e,t){e&1&&(z(0,`div`,1),V(1,`span`,6),z(2,`span`),J(3,`Reading the project…`),B()())}function XV(e,t){e&1&&(z(0,`div`,2)(1,`h2`,3),J(2,`This app is not an Analog app.`),B(),z(3,`p`,4),J(4,` Add `),z(5,`code`),J(6,`pangular()`),B(),J(7,` from `),z(8,`code`),J(9,`@pangular-inspector/devtools/vite`),B(),J(10,` next to `),z(11,`code`),J(12,`analog()`),B(),J(13,` in vite.config.ts and run the Analog dev server. `),B()())}function ZV(e,t){if(e&1&&(z(0,`div`,11)(1,`span`,9),J(2,`Open in the browser`),B(),z(3,`span`,15),J(4),B()()),e&2){let e=t;M(3),R(`title`,e.url),M(),Y(e.url)}}function QV(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=O(e).$implicit;return k(K(2).view.set(t.id))}),J(1),z(2,`span`,17),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`analog-tab-`+e.id),N(`aria-selected`,e.id===n.view())(`aria-controls`,`analog-panel-`+e.id)(`tabindex`,e.id===n.view()?0:-1),M(),X(` `,e.label,` `),M(),N(`data-tone`,e.tone),M(),Y(e.count)}}function $V(e,t){e&1&&(z(0,`div`,26),J(1),B()),e&2&&(M(),Y(t))}function eH(e,t){if(e&1&&(z(0,`li`)(1,`span`,31),J(2),B(),z(3,`span`,34),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(2),Y(n.short(e.file)??e.fullPath),M(),N(`data-kind`,e.kind),M(),Y(e.kind)}}function tH(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e[0],` = `,e[1])}}function nH(e,t){if(e&1&&(z(0,`div`,33),I(1,tH,2,2,`span`,35,HV),B()),e&2){let e=K(2),t=K(3);M(),L(t.paramList(e.match.params))}}function rH(e,t){if(e&1&&(z(0,`strong`,31),J(1),B(),J(2,` renders `),z(3,`ol`,32),I(4,eH,5,3,`li`,null,BV),B(),P(6,nH,3,0,`div`,33)),e&2){let e=K(),t=K(3);M(),Y(e.url),M(3),L(e.match.chain),M(2),F(t.paramList(e.match.params).length?6:-1)}}function iH(e,t){if(e&1&&(z(0,`li`)(1,`span`,31),J(2),B(),z(3,`span`,4),J(4),B()()),e&2){let e=t.$implicit,n=K(6);M(2),Y(n.short(e.file)??e.path),M(2),Y(e.reason)}}function aH(e,t){if(e&1&&(z(0,`ul`,36),I(1,iH,5,2,`li`,null,Cg),B()),e&2){let e=K(2);M(),L(e.match.rejected.slice(0,5))}}function oH(e,t){if(e&1&&(z(0,`strong`,31),J(1),B(),J(2,` matches no file route. Angular throws NG04002 "Cannot match any routes". `),P(3,aH,3,0,`ul`,36)),e&2){let e=K();M(),Y(e.url),M(2),F(e.match.rejected.length?3:-1)}}function sH(e,t){if(e&1&&(z(0,`div`,27),P(1,rH,7,2)(2,oH,4,2),B()),e&2){let e=t;N(`data-tone`,e.match.matched?`good`:`bad`),M(),F(e.match.matched?1:2)}}function cH(e,t){e&1&&(z(0,`span`,38),J(1,`└`),B())}function lH(e,t){e&1&&(z(0,`span`,40),J(1,`open`),B())}function uH(e,t){if(e&1&&(z(0,`span`,41)(1,`span`,45),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.route.file)),M(),Y(t.base(e.route.file))}}function dH(e,t){e&1&&(z(0,`span`,4),J(1,`folder only`),B())}function fH(e,t){if(e&1&&(z(0,`span`,43),J(1),B()),e&2){let e=t.$implicit;M(),X(``,e,`()`)}}function pH(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){let e=K().$implicit;M(),X(`"`,e.route.title,`"`)}}function mH(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=K().$implicit;M(),Y(e)}}function hH(e,t){if(e&1&&P(0,mH,2,1,`span`,35),e&2){let e=t.$implicit;F(e===`title`?-1:0)}}function gH(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`div`,37),P(3,cH,2,0,`span`,38),z(4,`span`,39),J(5),B(),z(6,`span`,34),J(7),B(),P(8,lH,2,0,`span`,40),B()(),z(9,`td`),P(10,uH,4,2,`span`,41)(11,dH,2,0,`span`,4),B(),z(12,`td`)(13,`div`,42),I(14,fH,2,1,`span`,43,wg),B()(),z(16,`td`),P(17,pH,2,1,`span`,44),I(18,hH,1,1,null,null,wg),B()()),e&2){let e=t.$implicit,n=K(3);q(`open`,n.isOpen(e.route))(`dim`,e.route.kind===`group`||e.route.kind===`implicit`),M(2),C_(`padding-left`,e.depth*16,`px`),M(),F(e.depth?3:-1),M(2),Y(e.route.fullPath),M(),N(`data-kind`,e.route.kind),M(),Y(n.kindText(e.route)),M(),F(n.isOpen(e.route)?8:-1),M(2),F(e.route.file?10:11),M(4),L(n.serverExports(e.route)),M(3),F(e.route.title?17:-1),M(),L(e.route.routeMeta??ov(13,RV))}}function _H(e,t){e&1&&J(0,` No route matches the filter. Try part of a path or a file name. `)}function vH(e,t){e&1&&J(0,` No file routes yet. Add a .page.ts file under src/app/pages. `)}function yH(e,t){if(e&1&&(z(0,`tr`)(1,`td`,46),P(2,_H,1,0)(3,vH,1,0),B()()),e&2){let e=K(3);M(2),F(e.filter().trim()?2:3)}}function bH(e,t){if(e&1){let e=W();z(0,`div`,18)(1,`form`,19),G(`submit`,function(t){O(e);let n=K(2);return t.preventDefault(),k(n.explain())}),z(2,`label`,20),J(3,`Test a URL`),B(),z(4,`input`,21),G(`input`,function(t){return O(e),k(K(2).testUrl.set(t.target.value))}),B(),z(5,`button`,22),J(6),B()(),z(7,`label`,23),J(8,`Filter routes`),B(),z(9,`input`,24),G(`input`,function(t){return O(e),k(K(2).filter.set(t.target.value))})(`keydown.escape`,function(){return O(e),k(K(2).filter.set(``))}),B()(),z(10,`div`,25),P(11,$V,2,1,`div`,26)(12,sH,3,2,`div`,27),B(),z(13,`div`,28)(14,`table`)(15,`thead`)(16,`tr`)(17,`th`,29),J(18,`Route`),B(),z(19,`th`,29),J(20,`File`),B(),z(21,`th`,29),J(22,`Data`),B(),z(23,`th`,29),J(24,`Route meta`),B()()(),z(25,`tbody`),I(26,gH,20,14,`tr`,30,VV,!1,yH,4,1,`tr`),B()()()}if(e&2){let e,t=K(2);M(4),R(`value`,t.testUrl()),M(),R(`disabled`,t.explaining()),M(),X(` `,t.explaining()?`Explaining…`:`Explain`,` `),M(3),R(`value`,t.filter()),M(2),F((e=t.explainError())?11:(e=t.explained())?12:-1,e),M(15),L(t.routeRows())}}function xH(e,t){if(e&1&&(z(0,`span`,31),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function SH(e,t){if(e&1&&(z(0,`div`,47)(1,`strong`),J(2,`load() ran twice`),B(),J(3,` for `),I(4,xH,3,2,null,null,wg),J(6,` : once while server rendering, again in the browser. TransferState did not serve the server result. `),B()),e&2){let e=K(3);M(4),L(e.duplicates())}}function CH(e,t){if(e&1&&(z(0,`span`,31),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function wH(e,t){if(e&1&&(z(0,`div`,47)(1,`strong`),J(2,`Server function read ran twice`),B(),J(3,`: `),I(4,CH,3,2,null,null,wg),J(6,` ran while server rendering, then again in the browser. The browser did not use the TransferState seed. `),B()),e&2){let e=K(3);M(4),L(e.refetchedFns())}}function TH(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,79),G(`change`,function(){let t=O(e).$implicit;return k(K(3).kind.set(t))}),B(),J(2),z(3,`span`,4),J(4),B()()}if(e&2){let e=t.$implicit,n=K(3);q(`on`,n.kind()===e),M(),R(`checked`,n.kind()===e),N(`data-kind`,e),M(),X(` `,n.kindLabel(e),` `),M(2),Y(n.kindCount(e))}}function EH(e,t){if(e&1&&J(0),e&2){let e=K(4);Z(` Showing the newest `,e.shownCount(),` of `,e.matchingCalls().length,`. `)}}function DH(e,t){e&1&&J(0),e&2&&X(` The dev server keeps only the newest `,K(4).maxServerCalls,` calls and drops older ones. `)}function OH(e,t){if(e&1&&(z(0,`p`,65),P(1,EH,1,2),P(2,DH,1,1),B()),e&2){let e=K(3);M(),F(e.shownCount()1?6:-1),M(2),Y(e.summary),M(2),L(e.items),M(5),X(` `,e.fix),M(2),Y(e.rule)}}function BU(e,t){if(e&1&&(z(0,`p`,4),J(1),B(),z(2,`ul`,112),I(3,zU,18,8,`li`,null,qV),B()),e&2){let e=K(3);M(),Z(` `,e.findings().length,` issue(s) in `,e.lintCards().length,` group(s). Each card says what is wrong, where, and how to fix it. `),M(2),L(e.lintCards())}}function VU(e,t){e&1&&(z(0,`div`,111)(1,`strong`),J(2,`No Analog problems found.`),B(),J(3,` Routes, server files, prerender config and content all check out. `),B())}function HU(e,t){e&1&&P(0,BU,5,2)(1,VU,4,0,`div`,111),e&2&&F(+!K(2).findings().length)}function UU(e,t){if(e&1){let e=W();z(0,`section`,7)(1,`div`,8)(2,`span`,9),J(3,`Analog`),B(),z(4,`span`,10),J(5),B()(),z(6,`div`,8)(7,`span`,9),J(8,`Pages`),B(),z(9,`span`,10),J(10),B()(),z(11,`div`,8)(12,`span`,9),J(13,`API routes`),B(),z(14,`span`,10),J(15),B()(),z(16,`div`,8)(17,`span`,9),J(18,`Server calls`),B(),z(19,`span`,10),J(20),B()(),z(21,`div`,8)(22,`span`,9),J(23,`Issues`),B(),z(24,`span`,10),J(25),B()(),P(26,ZV,5,2,`div`,11),B(),z(27,`div`,12),G(`keydown`,function(t){return O(e),k(K().onKey(t))}),I(28,QV,4,7,`button`,13,BV),B(),z(30,`div`,14),P(31,bH,29,6)(32,rU,65,21)(33,DU,18,3)(34,NU,2,1)(35,HU,2,1),B()}if(e&2){let e,t,n=K();M(5),Y(n.project().version||`unknown`),M(5),Y(n.pageCount()),M(5),Y(n.project().api.length),M(5),Y(n.allCalls().length),M(),N(`data-tone`,n.lintTone()||`good`),M(4),Y(n.lintCount().errors+n.lintCount().warnings),M(),F((e=n.page())?26:-1,e),M(2),L(n.views()),M(2),R(`id`,`analog-panel-`+n.view()),N(`aria-labelledby`,`analog-tab-`+n.view()),M(),F((t=n.view())===`routes`?31:t===`server`?32:t===`render`?33:t===`content`?34:t===`lint`?35:-1)}}var WU={"scan-error":{title:`A folder could not be read`,summary:`Its files are missing from routes, API routes and lint results.`},"duplicate-url":{title:`Two files serve the same URL`,summary:`Only one of them is reachable; the other never renders.`},"sibling-params":{title:`Two dynamic pages in one folder`,summary:`Both are [param] pages at the same level, so the first one always wins.`},"missing-default-export":{title:`Page has no default export`,summary:`Analog needs the component as the default export, so the page renders nothing.`},"redirect-with-component":{title:`Redirect page also exports a component`,summary:`The redirect runs first, so the component never shows.`},"redirect-path-match":{title:`Redirect matches too much`,summary:`An empty-path redirect without pathMatch "full" catches every URL below it.`},"layout-without-outlet":{title:`Layout has no router-outlet`,summary:`The layout has child pages, but without they never render.`},"server-without-load":{title:`.server.ts without load or action`,summary:`The server file exports no load, action or server function, so Analog calls nothing.`},"orphan-server-file":{title:`.server.ts without a page`,summary:`No page file sits next to it, so its load never runs.`},"api-method-suffix":{title:`Unknown method suffix on an API file`,summary:`The suffix is not an HTTP method, so it becomes part of the URL.`},"duplicate-api-route":{title:`Two handlers for one API route`,summary:`Two files answer the same method and path.`},"api-outside-prefix":{title:`Server route outside the API prefix`,summary:`During vite dev only routes under the prefix reach Nitro.`},"prerender-unknown-route":{title:`Prerender entry matches no page`,summary:`prerender.routes lists a path that no page file serves.`},"prerender-missing-root":{title:`Home page is not prerendered`,summary:`static is on, but prerender.routes leaves out /.`},"content-frontmatter":{title:`Broken frontmatter`,summary:`The markdown frontmatter cannot be read.`},"duplicate-slug":{title:`Two posts share a slug`,summary:`injectContent picks one of them at random.`},"content-shadows-page":{title:`Markdown file takes over a page`,summary:`Files under src/content are routes too, so these URLs render the markdown file instead of the [param] page.`},"load-fetched-twice":{title:`load() runs twice`,summary:`These pages fetched their data while rendering on the server and again in the browser.`},"fn-fetched-twice":{title:`Server function read runs twice`,summary:`These reads ran while rendering on the server and again in the browser right after hydration.`},"restart-needed":{title:`New pages need a restart`,summary:`These page files exist, but the running router does not know them yet.`},"hydration-error":{title:`Hydration error`,summary:`The browser DOM did not match the server HTML.`},"api-not-found":{title:`API call failed with 404 or 405`,summary:`A request hit a path or method that no server route handles.`}},GU=200,KU=new Set([`missing-default-export`,`redirect-with-component`,`redirect-path-match`,`layout-without-outlet`,`server-without-load`,`orphan-server-file`,`load-fetched-twice`,`restart-needed`,`prerender-missing-root`]),qU={ssr:`SSR`,ssg:`Prerendered`,client:`Client only`,cached:`Cached`,redirect:`Redirect`},JU={all:`All`,page:`Pages`,load:`load()`,action:`Actions`,fn:`Server fn`,api:`API`},YU={success:`succeeded`,redirect:`redirected`,invalid:`validation errors`,error:`failed`},XU={success:`good`,redirect:`info`,invalid:`warn`,error:`bad`};function ZU(e,t=0,n=[]){for(let r of e)n.push({route:r,depth:t}),ZU(r.children,t+1,n);return n}var QU=class e{rpc=$(null);canCall=Q(()=>bE(this.rpc(),`analog`));callsOff=KT(`analog`);kinds=[`all`,`page`,`load`,`action`,`fn`,`api`];methods=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];methodOptions=this.methods.map(e=>({value:e,label:e}));view=j(`routes`);project=j(null);loadFailed=j(!1);state=j({});findings=j([]);renderRows=j([]);plan=j(null);filter=j(``);testUrl=j(``);explained=j(null);explainError=j(``);explaining=j(!1);kind=j(`all`);method=j(`GET`);apiPath=j(``);apiBody=j(``);confirmSend=j(!1);response=j(null);sending=j(!1);needsConfirm=Q(()=>this.method()!==`GET`&&!this.confirmSend());canSend=Q(()=>this.canCall()&&!this.sending()&&!this.needsConfirm());sendHintId=Q(()=>this.canCall()?this.needsConfirm()?`analog-confirm-hint`:null:`analog-calls-off`);unsubscribe=null;refreshTimer;refreshRun=0;destroyRef=E(Cs);host=E(Ml);hostPageId=eE();page=Q(()=>{let e=this.state().pages??[];return(this.hostPageId?e.find(e=>e.pageId===this.hostPageId):e[0])??null});openFiles=Q(()=>new Set((this.page()?.chain??[]).map(e=>e.file)));allCalls=Q(()=>this.state().calls??[]);maxServerCalls=GU;callQuery=j(``);failedOnly=j(!1);callsMessage=j(``);callFiltered=Q(()=>!!this.callQuery().trim()||this.failedOnly());matchingCalls=Q(()=>{let e=this.kind(),t=this.callQuery().trim().toLowerCase(),n=this.failedOnly();return this.allCalls().filter(r=>(e===`all`||r.kind===e)&&(!n||this.isFailed(r))&&(!t||this.callText(r).includes(t)))});calls=Q(()=>this.matchingCalls().slice(-150).reverse());shownCount=Q(()=>this.calls().length);serverFull=Q(()=>this.allCalls().length>=GU);allRoutes=Q(()=>ZU(this.project()?.routes??[]));pageCount=Q(()=>this.allRoutes().filter(e=>e.route.file&&e.route.kind!==`layout`).length);routeRows=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.allRoutes().filter(t=>t.route.fullPath.toLowerCase().includes(e)||!!t.route.file?.toLowerCase().includes(e)):this.allRoutes()});serverFns=Q(()=>this.project()?.serverFns??[]);fnById=Q(()=>new Map(this.serverFns().map(e=>[e.id,e])));refetchedFns=Q(()=>Array.from(new Set((this.state().refetches??[]).map(e=>this.fnById().get(e.id)?.name??e.id))));duplicates=Q(()=>Array.from(new Set((this.state().duplicates??[]).map(e=>e.route))));modeCounts=Q(()=>[`ssr`,`ssg`,`cached`,`client`,`redirect`].map(e=>({mode:e,label:qU[e],count:this.renderRows().filter(t=>t.mode===e).length})).filter(e=>e.count));lintCards=Q(()=>{let e={error:0,warning:1,info:2},t=new Map;for(let e of this.findings()){let n=t.get(e.rule);if(!n){let r=WU[e.rule];n={rule:e.rule,severity:e.severity,title:r?.title??e.rule,summary:r?.summary??e.message,fix:e.fix,items:[]},t.set(e.rule,n)}let r=KU.has(e.rule)||e.message===n.summary?void 0:e.message;n.items.some(t=>t.file===e.file&&t.path===e.path&&t.message===r)||n.items.push({file:e.file,path:e.path,message:r})}return Array.from(t.values()).sort((t,n)=>e[t.severity]-e[n.severity])});lintCount=Q(()=>{let e=this.findings();return{errors:e.filter(e=>e.severity===`error`).length,warnings:e.filter(e=>e.severity===`warning`).length}});lintTone=Q(()=>{let{errors:e,warnings:t}=this.lintCount();return e?`bad`:t?`warn`:``});views=Q(()=>{let{errors:e,warnings:t}=this.lintCount();return[{id:`routes`,label:`Routes`,count:this.pageCount(),tone:``},{id:`server`,label:`Server`,count:this.allCalls().length,tone:``},{id:`render`,label:`Render`,count:this.renderRows().length,tone:``},{id:`content`,label:`Content`,count:this.project()?.content.length??0,tone:``},{id:`lint`,label:`Lint`,count:e+t,tone:this.lintTone()}]});constructor(){uc(()=>{let e=this.rpc();e&&Cv(()=>void this.load(e))}),uc(()=>{let e=this.view();this.state(),Cv(()=>this.scheduleRefresh(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.refreshTimer)})}async load(e){let t=await aE(e,`analog-project`);if(!this.destroyRef.destroyed){this.project.set(t),this.loadFailed.set(t===null);try{let t=await e.scope(`pangular`).rpc.sharedState(`analog`);if(this.destroyRef.destroyed)return;let n=e=>this.state.set(e??{});n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.state.set({})}this.destroyRef.destroyed||await this.refresh(this.view())}}retry(){let e=this.rpc();e&&(this.loadFailed.set(!1),this.load(e))}scheduleRefresh(e){clearTimeout(this.refreshTimer),this.refreshTimer=setTimeout(()=>void this.refresh(e),300)}async refresh(e){let t=this.rpc();if(!t)return;let n=++this.refreshRun,[r,i]=await Promise.all([aE(t,`analog-lint`,this.hostPageId??void 0),aE(t,`analog-render`)]);if(n===this.refreshRun&&(this.findings.set(r??[]),this.renderRows.set(i?.rows??[]),this.plan.set(i?.plan??null),e===`routes`||e===`content`||this.project()===null)){let e=await aE(t,`analog-project`);e&&n===this.refreshRun&&(this.project.set(e),this.loadFailed.set(!1))}}isOpen(e){return!!e.file&&this.openFiles().has(e.file)}kindText(e){return e.catchAll?e.catchAll===`optional`?`optional catch-all`:`catch-all`:e.kind===`implicit`?`folder`:e.kind}serverExports(e){return(e.serverExports??[]).filter(e=>e===`load`||e===`action`)}short(e){return e?.replace(/^\/src\/app\//,``).replace(/^\//,``)}dir(e){let t=this.short(e)??e;return t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)+1):``}base(e){return e.slice(e.lastIndexOf(`/`)+1)}paramList(e){return Object.entries(e)}kindLabel(e){return JU[e]}kindCount(e){return e===`all`?this.allCalls().length:this.allCalls().filter(t=>t.kind===e).length}modeLabel(e){return qU[e]}mismatch(e){return!e.last?.render||e.mode===`redirect`?!1:e.mode===`client`?e.last.render!==`client`:e.last.render===`client`}fnOf(e){return e.kind===`fn`&&e.route?this.fnById().get(e.route):void 0}fnCalls(e){return this.allCalls().filter(t=>t.kind===`fn`&&t.route===e).length}outcomeLabel(e){return YU[e]}outcomeTone(e){return XU[e]}statusClass(e){return e>=500||e===0?`bad`:e>=400?`warn`:`good`}tone(e){return e===`error`?`bad`:e===`warning`?`warn`:`info`}shadowed(e){return this.findings().find(t=>t.rule===`content-shadows-page`&&t.file===e)?.relatedFile}contentUrl(e){return this.allRoutes().find(t=>t.route.file===e)?.route.fullPath}pretty(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}time=zD;tryApi(e){this.method.set(e.method===`ANY`?`GET`:e.method),this.apiPath.set(e.path.replace(/:(\w+)/g,`1`).replace(`**`,`x`)),this.response.set(null),queueMicrotask(()=>document.getElementById(`api-path`)?.focus())}isFailed(e){return!e.status||e.status>=400||e.outcome===`error`}callText(e){let t=this.fnOf(e);return[e.url,e.route,t?.name,t?.file].filter(Boolean).join(` `).toLowerCase()}clearCallFilters(){this.callQuery.set(``),this.failedOnly.set(!1),this.kind.set(`all`),queueMicrotask(()=>this.host.nativeElement.querySelector(`#analog-call-search`)?.focus())}async clearCalls(){let e=this.rpc();try{if(!e)throw Error(`No devtools server`);await iE(e,`analog-clear-calls`),this.callsMessage.set(`Calls cleared.`),queueMicrotask(()=>this.host.nativeElement.querySelector(`input[name="analog-kind"]:checked`)?.focus())}catch{this.callsMessage.set(`Could not clear the calls.`)}}async explain(){let e=this.testUrl().trim();if(!e){this.explained.set(null),this.explainError.set(`Type a URL to explain, for example /products/42.`);return}this.explaining.set(!0),this.explainError.set(``);try{let t=await iE(this.rpc(),`analog-explain-url`,e);if(!t)throw Error(`The devtools server did not answer`);this.explained.set({url:e,match:t})}catch(t){let n=String(t?.message||`The devtools server did not answer`);this.explained.set(null),this.explainError.set(`Could not explain ${e}. ${n.replace(/\.?$/,`.`)}`)}finally{this.explaining.set(!1)}}async send(){let e=this.apiPath().trim();if(!e||this.sending()||this.needsConfirm())return;let t;if(this.method()!==`GET`&&this.apiBody().trim())try{t=JSON.parse(this.apiBody())}catch{this.response.set({error:`The body is not valid JSON.`});return}this.response.set(null),this.sending.set(!0);try{let n=await aE(this.rpc(),`analog-call-api`,{method:this.method(),path:e,body:t,confirm:this.confirmSend()});this.response.set(n??{error:`No answer from the devtools server.`})}finally{this.sending.set(!1)}}onKey(e){let t=this.views().map(e=>e.id),n=t.indexOf(this.view()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.view.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#analog-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-analog-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty`],[`role`,`status`,1,`loading`],[1,`empty`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`btn`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-label`,`Analog summary`,1,`summary`],[1,`stat`],[1,`label`],[1,`value`],[1,`stat`,`wide`],[`role`,`tablist`,`aria-label`,`Analog views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[1,`value`,`mono`,3,`title`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`count`],[1,`toolbar`],[1,`inline`,`explain`,3,`submit`],[`for`,`analog-url`],[`id`,`analog-url`,`type`,`text`,`placeholder`,`/products/42`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`for`,`route-filter`,1,`sr-only`],[`id`,`route-filter`,`type`,`search`,`placeholder`,`Filter by path or file`,1,`field`,`filter`,3,`input`,`keydown.escape`,`value`],[`role`,`status`,1,`explain-result`],[`data-tone`,`bad`,1,`callout`],[1,`callout`],[`role`,`region`,`aria-label`,`File routes`,`tabindex`,`0`,1,`table-wrap`],[`scope`,`col`],[3,`open`,`dim`],[1,`mono`],[1,`chain`],[1,`chips`],[1,`pill`],[1,`chip`,`mono`],[1,`plain`],[1,`route`],[`aria-hidden`,`true`,1,`guide`],[1,`mono`,`path`],[1,`pill`,`live`],[1,`file`],[1,`meta`],[`data-kind`,`load`,1,`pill`],[1,`chip`],[1,`dir`],[`colspan`,`4`,1,`empty-row`],[`data-tone`,`warn`,`role`,`note`,1,`callout`],[`id`,`analog-calls-heading`],[1,`calls-bar`],[1,`segmented`],[1,`sr-only`],[3,`on`],[1,`calls-actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`,`disabled`],[`role`,`status`,1,`calls-message`],[`role`,`group`,`aria-label`,`Filter the server calls`,1,`call-filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`id`,`analog-call-search`,`type`,`search`,`placeholder`,`Find a URL, path or function…`,`aria-label`,`Find a URL, path or function`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,3,`input`,`keydown.escape`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`aria-live`,`polite`,1,`total`],[1,`note`],[`role`,`region`,`aria-label`,`Server calls`,`tabindex`,`0`,1,`table-wrap`],[`role`,`status`,1,`empty-box`,`no-match`],[1,`empty-box`],[`role`,`region`,`aria-label`,`API routes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`,`playground`,3,`submit`],[1,`row`],[`ariaLabel`,`Method`,1,`method-select`,3,`valueChange`,`options`,`value`],[`for`,`api-path`,1,`sr-only`],[`id`,`api-path`,`type`,`text`,`placeholder`,`/api/v1/products`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`id`,`analog-calls-off`,1,`muted`],[`id`,`analog-confirm-hint`,1,`muted`],[`role`,`status`,1,`muted`],[`role`,`status`,1,`response`],[`type`,`radio`,`name`,`analog-kind`,1,`sr-only`,3,`change`,`checked`],[`scope`,`col`,1,`num`],[1,`muted`,`nowrap`],[1,`request`],[1,`method`],[1,`mono`,`url`],[1,`status`],[1,`num`,`nowrap`],[1,`mono`,`muted`],[1,`code`],[1,`empty-lead`],[1,`empty-actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`],[1,`actions`],[`role`,`region`,`aria-label`,`Server functions`,`tabindex`,`0`,1,`table-wrap`],[1,`num`,`tnum`],[`for`,`api-body`],[`id`,`api-body`,`rows`,`3`,`placeholder`,`{"name": "Ada"}`,1,`field`,`mono`,3,`input`,`value`],[1,`check`,`confirm-send`],[`data-status`,`bad`,1,`status`],[`role`,`region`,`aria-label`,`Render modes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`],[1,`muted`,`small`],[1,`muted`,`small`,`tnum`],[`data-tone`,`warn`,1,`pill`],[1,`facts`],[1,`tnum`],[`data-tone`,`warn`,1,`chip`,`mono`],[`data-tone`,`bad`,1,`chip`,`mono`],[`role`,`region`,`aria-label`,`Content files`,`tabindex`,`0`,1,`table-wrap`],[1,`muted`,`nowrap`,`tnum`],[`data-tone`,`bad`,1,`pill`],[`data-tone`,`good`,`role`,`status`,1,`callout`],[1,`findings`],[1,`finding-head`],[1,`finding-title`],[1,`where`],[1,`fix`],[1,`rule`,`mono`],[1,`detail`]],template:function(e,t){e&1&&P(0,JV,7,0,`div`,0)(1,YV,4,0,`div`,1)(2,XV,14,0,`div`,2)(3,UU,36,10),e&2&&F(t.project()===null&&t.loadFailed()?0:t.project()===null?1:t.project().analog?3:2)},dependencies:[jD],styles:[`@charset "UTF-8";
[_nghost-%COMP%] {
--%NS%good: var(--%NS%ok);
--%NS%bad: var(--%NS%danger);
@@ -10635,6 +10635,10 @@ code[_ngcontent-%COMP%] {
color: var(--%NS%ok);
}
+.stat[data-tone=bad][_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {
+ color: var(--%NS%danger-text);
+}
+
.tabs[_ngcontent-%COMP%] {
display: inline-flex;
flex-wrap: wrap;
@@ -10697,6 +10701,12 @@ code[_ngcontent-%COMP%] {
color: var(--%NS%warn-text);
}
+.count[data-tone=bad][_ngcontent-%COMP%],
+[role=tab][aria-selected=true][_ngcontent-%COMP%] .count[data-tone=bad][_ngcontent-%COMP%] {
+ background: color-mix(in srgb, var(--%NS%danger) 12%, transparent);
+ color: var(--%NS%danger-text);
+}
+
.panel[_ngcontent-%COMP%] {
display: grid;
gap: 16px;
@@ -11783,7 +11793,7 @@ h2[_ngcontent-%COMP%] {
color: var(--%NS%text-strong);
font-size: 15px;
font-weight: 600;
-}`]})},JU=(e,t)=>t.id,YU=(e,t)=>t.id+t.kind,XU=(e,t)=>t.side+t.id,ZU=(e,t)=>t.key;function QU(e,t){e&1&&(z(0,`div`,0),V(1,`span`,67),z(2,`span`),J(3,`Loading…`),B()())}function $U(e,t){e&1&&(z(0,`div`,1)(1,`strong`),J(2,`Could not reach the devtools server.`),B(),z(3,`span`),J(4,`Check that the app's dev server is running with the devtools plugin, then reopen this panel.`),B()())}function eW(e,t){e&1&&(z(0,`span`,80),J(1,`this page`),B())}function tW(e,t){e&1&&(z(0,`span`,81),J(1,`overridden`),B())}function nW(e,t){e&1&&(z(0,`span`,82),J(1,`aborted`),B())}function rW(e,t){if(e&1){let e=W();z(0,`tr`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectedRequestId.set(t.id))}),z(1,`td`,73)(2,`button`,74)(3,`span`,75),J(4),B(),J(5),B()(),z(6,`td`,76),V(7,`span`,77),J(8),B(),z(9,`td`),J(10),B(),z(11,`td`,78),J(12),B(),z(13,`td`,78),J(14),B(),z(15,`td`)(16,`div`,79),P(17,eW,2,0,`span`,80),P(18,tW,2,0,`span`,81),P(19,nW,2,0,`span`,82),B()()()}if(e&2){let e=t.$implicit,n=K(2);q(`selected`,n.selectedRequest()?.id===e.id),M(2),R(`title`,e.url),N(`aria-pressed`,n.selectedRequest()?.id===e.id),M(2),Y(e.method),M(),X(` `,e.url,` `),M(),q(`ok`,n.statusTone(e.status)===`ok`)(`redirect`,n.statusTone(e.status)===`redirect`)(`bad`,n.statusTone(e.status)===`bad`),M(2),X(``,e.status,` `),M(2),Y(n.renderModeLabel(e.renderMode)),M(2),X(``,e.renderMs,` ms`),M(2),Z(``,e.fetches,` (`,e.fetchMs,` ms)`),M(3),F(e.id===n.selected()?.ssrRequestId?17:-1),M(),F(e.overrides?.length?18:-1),M(),F(e.aborted?19:-1)}}function iW(e,t){e&1&&(z(0,`p`,56),J(1),z(2,`code`),J(3,`ssrMiddleware`),B(),J(4,` saw it, so the render mode can't be read and TransferState edits can't apply. Mount `),z(5,`code`),J(6,`ssrMiddleware`),B(),J(7,` after `),z(8,`code`),J(9,`compression()`),B(),J(10,`. `),B()),e&2&&(M(),X(` The body was already compressed (`,t,`) when `))}function aW(e,t){if(e&1&&(z(0,`span`,87),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.note)}}function oW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,81),J(2),B(),z(3,`span`),J(4),B(),P(5,aW,2,1,`span`,87),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(n.overrideLabel(e.kind)),M(2),Y(e.applied?`applied`:`not applied`),M(),F(e.note?5:-1)}}function sW(e,t){if(e&1&&(z(0,`h3`),J(1,`Overrides from the panel`),B(),z(2,`p`,56),J(3,` This response was changed on purpose, so it is not what the app sends on its own. `),B(),I(4,oW,6,3,`p`,86,YU)),e&2){let e=K();M(4),L(e.overrides)}}function cW(e,t){if(e&1&&(J(0,` to `),z(1,`code`),J(2),B()),e&2){let e=K().$implicit;M(2),Y(e.finalUrl)}}function lW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Guards`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(3),q(`bad`,t.guardVerdict(e)===`rejected`),M(),Z(` `,t.msLabel(e.guards.ms),``,t.guardVerdict(e)?`, `+t.guardVerdict(e):``,` `)}}function uW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Resolvers`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(4),Y(t.msLabel(e.resolvers.ms))}}function dW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Navigation total`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit;M(4),X(``,e.durationMs,` ms`)}}function fW(e,t){if(e&1&&(z(0,`p`,56),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.reason)}}function pW(e,t){if(e&1&&(z(0,`dl`,88)(1,`div`)(2,`dt`),J(3,`Navigation`),B(),z(4,`dd`)(5,`code`),J(6),B(),P(7,cW,3,1),J(8),B()(),P(9,lW,5,4,`div`),P(10,uW,5,1,`div`),P(11,dW,5,1,`div`),B(),P(12,fW,2,1,`p`,56)),e&2){let e=t.$implicit;M(6),Y(e.url),M(),F(e.finalUrl?7:-1),M(),X(` (`,e.outcome,`) `),M(),F(e.guards?9:-1),M(),F(e.resolvers?10:-1),M(),F(e.durationMs===void 0?-1:11),M(),F(e.reason?12:-1)}}function mW(e,t){if(e&1&&(z(0,`h3`),J(1,`Router during the render`),B(),I(2,pW,13,7,null,null,Cg)),e&2){let e=K();M(2),L(e.navigations)}}function hW(e,t){e&1&&(z(0,`span`,80),J(1,`cached`),B())}function gW(e,t){if(e&1&&(z(0,`span`,90),J(1,`not cached`),B()),e&2){let e=K().$implicit;R(`title`,K(3).skipText(e.cacheSkip))}}function _W(e,t){if(e&1&&(z(0,`p`,91),J(1),B()),e&2){let e=K().$implicit,t=K(3);M(),X(`Not cached: `,t.skipText(e.cacheSkip),`.`)}}function vW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,75),J(2),B(),z(3,`span`,89),J(4),B(),z(5,`span`,76),J(6),B(),z(7,`span`,87),J(8),B(),P(9,hW,2,0,`span`,80)(10,gW,2,1,`span`,90),B(),P(11,_W,2,1,`p`,91)),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.method),M(),R(`title`,e.url),M(),Y(e.url),M(),q(`ok`,n.callTone(e)===`ok`)(`bad`,n.callTone(e)===`bad`),M(),Y(n.statusLabel(e)),M(2),X(``,e.durationMs,` ms`),M(),F(e.cacheStored?9:e.cacheSkip?10:-1),M(2),F(!e.cacheStored&&e.cacheSkip?11:-1)}}function yW(e,t){e&1&&(z(0,`p`,56),J(1,`The render made no HttpClient calls.`),B())}function bW(e,t){e&1&&(z(0,`p`,91),J(1),B()),e&2&&(M(),X(`Why: `,t,`.`))}function xW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,75),J(2),B(),z(3,`span`,89),J(4),B(),z(5,`span`,82),J(6,`cache miss`),B()(),P(7,bW,2,1,`p`,91)),e&2){let e,n=t.$implicit,r=K(4);M(2),Y(n.method),M(),R(`title`,n.url),M(),Y(n.url),M(3),F((e=r.refetchReason(n))?7:-1,e)}}function SW(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`p`,56),J(3,` These calls ran on the server and again after hydration instead of reading the transfer cache. `),B(),I(4,xW,8,4,null,null,JU)),e&2){let e=K(3);M(),X(`Fetched again in the browser (`,e.refetched().length,`)`),M(3),L(e.refetched())}}function CW(e,t){e&1&&(z(0,`p`,85),J(1,`No server call ran again in the browser.`),B())}function wW(e,t){if(e&1&&(z(0,`div`,71)(1,`h3`,83),J(2),z(3,`code`),J(4),B()(),z(5,`dl`,84)(6,`div`)(7,`dt`),J(8,`Request id`),B(),z(9,`dd`)(10,`code`),J(11),B()()(),z(12,`div`)(13,`dt`),J(14,`Render`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Total`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`Sent`),B(),z(25,`dd`),J(26),B()(),z(27,`div`)(28,`dt`),J(29,`Browser page`),B(),z(30,`dd`),J(31),B()()(),P(32,iW,11,1,`p`,56),P(33,sW,6,0),P(34,mW,4,0),z(35,`h3`),J(36),B(),I(37,vW,12,11,null,null,JU,!1,yW,2,0,`p`,56),P(40,SW,6,1)(41,CW,2,0,`p`,85),B()),e&2){let e,n=t,r=K(2);M(2),X(` `,n.method,` `),M(2),Y(n.url),M(7),Y(n.id),M(5),X(``,n.renderMs,` ms`),M(5),X(``,n.durationMs,` ms`),M(5),X(``,n.bytes,` B`),M(5),Y(r.requestPage()?.title||r.requestPage()?.url||`not connected`),M(),F((e=r.compressedWith(n))?32:-1,e),M(),F(n.overrides?.length?33:-1),M(),F(n.navigations?.length?34:-1),M(2),X(`Server calls (`,r.requestCalls().length,`)`),M(),L(r.requestCalls()),M(3),F(r.refetched().length?40:r.requestPage()&&r.requestCalls().length?41:-1)}}function TW(e,t){if(e&1&&(z(0,`div`,26)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,68),J(5,`Request`),B(),z(6,`th`,68),J(7,`Status`),B(),z(8,`th`,68),J(9,`Render mode`),B(),z(10,`th`,69),J(11,`Render`),B(),z(12,`th`,69),J(13,`Server calls`),B(),z(14,`th`,68),J(15,`Notes`),B()()(),z(16,`tbody`),I(17,rW,20,20,`tr`,70,JU),B()()(),P(19,wW,42,13,`div`,71)),e&2){let e,t=K();M(17),L(t.requests()),M(2),F((e=t.selectedRequest())?19:-1,e)}}function EW(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No SSR requests traced.`),B(),z(3,`p`,56),J(4,` Add `),z(5,`code`),J(6,`app.use(devtools.ssrMiddleware)`),B(),J(7,` before the Angular handler in `),z(8,`code`),J(9,`server.ts`),B(),J(10,`, then load a server rendered page. `),B()())}function DW(e,t){e&1&&(z(0,`span`,92),J(1,`transfer cache`),B())}function OW(e,t){if(e&1&&(z(0,`span`,92),J(1),B()),e&2){let e=K().$implicit;M(),X(`delayed `,e.delayMs,` ms`)}}function kW(e,t){e&1&&(z(0,`span`,81),J(1,`mocked`),B())}function AW(e,t){e&1&&(z(0,`span`,82),J(1,`faulted`),B())}function jW(e,t){if(e&1&&(z(0,`span`,95),J(1,`rule `),z(2,`code`),J(3),B()()),e&2){let e=t;R(`title`,`Matched rule: `+e),M(3),Y(e)}}function MW(e,t){if(e&1){let e=W();z(0,`tr`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).openCall(t.id))}),z(1,`td`)(2,`span`,92),J(3),B()(),z(4,`td`,75),J(5),B(),z(6,`td`,73)(7,`button`,93),J(8),B()(),z(9,`td`,94),J(10),B(),z(11,`td`,76),V(12,`span`,77),J(13),B(),z(14,`td`,78),J(15),B(),z(16,`td`)(17,`div`,79),P(18,DW,2,0,`span`,92),P(19,OW,2,1,`span`,92),P(20,kW,2,0,`span`,81),P(21,AW,2,0,`span`,82),P(22,jW,4,2,`span`,95),B()()()}if(e&2){let e,n=t.$implicit,r=K(2);q(`selected`,r.selectedCall()?.id===n.id),M(2),q(`server`,n.side===`server`),M(),Y(n.side===`server`?`SSR`:`Client`),M(2),Y(n.method),M(2),R(`title`,n.url),N(`data-call-id`,n.id)(`aria-pressed`,r.selectedCall()?.id===n.id)(`aria-controls`,r.selectedCall()?`call-preview`:null),M(),X(` `,n.url,` `),M(),R(`title`,n.pageUrl??``),M(),X(` `,n.pageUrl??``,` `),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(2),X(``,r.statusLabel(n),` `),M(2),X(``,n.durationMs,` ms`),M(3),F(n.cacheHit?18:-1),M(),F(n.delayMs?19:-1),M(),F(n.mocked?20:-1),M(),F(n.faulted?21:-1),M(),F((e=r.rulePatternOf(n))?22:-1,e)}}function NW(e,t){if(e&1&&(z(0,`div`,26)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,68),J(5,`Side`),B(),z(6,`th`,68),J(7,`Method`),B(),z(8,`th`,68),J(9,`URL`),B(),z(10,`th`,68),J(11,`Page`),B(),z(12,`th`,68),J(13,`Status`),B(),z(14,`th`,69),J(15,`Time`),B(),z(16,`th`,68),J(17,`Notes`),B()()(),z(18,`tbody`),I(19,MW,23,26,`tr`,70,XU),B()()()),e&2){let e=K();M(19),L(e.visibleCalls())}}function PW(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(2).callQuery().trim(),`” with these filters. `)}function FW(e,t){e&1&&J(0),e&2&&X(` None of the `,K(2).timeline().length,` requests fit these filters. `)}function IW(e,t){if(e&1){let e=W();z(0,`div`,27)(1,`p`),J(2,`No requests match.`),B(),z(3,`p`,56),P(4,PW,1,1)(5,FW,1,1),B(),z(6,`div`,96)(7,`button`,97),G(`click`,function(){return O(e),k(K().clearCallFilters())}),J(8,`Clear filters`),B()()()}if(e&2){let e=K();M(4),F(e.callQuery().trim()?4:5)}}function LW(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No requests yet.`),B(),z(3,`p`,56),J(4,` Add `),z(5,`code`),J(6,`withPangular()`),B(),J(7,` to `),z(8,`code`),J(9,`provideHttpClient`),B(),J(10,`, then load a page of the app. `),B()())}function RW(e,t){if(e&1){let e=W();z(0,`button`,104),G(`click`,function(){O(e);let t=K();return k(K().copyPreview(t))}),J(1,` Copy `),B()}if(e&2){let e=K();N(`aria-label`,`Copy the response of `+e.method+` `+e.url)}}function zW(e,t){e&1&&(z(0,`p`,106),J(1,` Matched rule `),z(2,`code`),J(3),B()()),e&2&&(M(3),Y(t))}function BW(e,t){if(e&1){let e=W();z(0,`div`,98),G(`keydown.escape`,function(){return O(e),k(K().closePreview())}),z(1,`div`,99)(2,`h3`,100),J(3,`Response preview`),B(),z(4,`div`,101),P(5,RW,2,1,`button`,102),z(6,`button`,103),G(`click`,function(){let t=O(e);return k(K().mockCall(t))}),J(7,` Mock this request `),B(),z(8,`button`,104),G(`click`,function(){return O(e),k(K().closePreview())}),J(9,`Close`),B()()(),z(10,`p`,105)(11,`span`,75),J(12),B(),z(13,`span`,76),J(14),B(),z(15,`span`,89),J(16),B()(),P(17,zW,4,1,`p`,106),z(18,`pre`,107),J(19),B()()}if(e&2){let e,n=t,r=K();M(5),F(!n.error&&n.preview?5:-1),M(),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`http-writes-off`),M(6),Y(n.method),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(),Y(r.statusLabel(n)),M(),R(`title`,n.url),M(),Y(n.url),M(),F((e=r.rulePatternOf(n))?17:-1,e),M(),q(`error`,!!n.error&&!n.cancelled),N(`aria-label`,n.error?`Response error`:`Response body`),M(),Y(n.error??r.previewText(n)??`(no body)`)}}function VW(e,t){if(e&1&&(z(0,`p`,31),J(1),B()),e&2){let e=K();M(),Y(e.writesOff)}}function HW(e,t){e&1&&(z(0,`p`,46),J(1,` SSR mocks are not transferred to the client: the browser requests the URL again and gets the real response unless the rule also applies on the client. `),B())}function UW(e,t){e&1&&(z(0,`span`),J(1,`passthrough`),B())}function WW(e,t){if(e&1&&(z(0,`span`,76),J(1),B()),e&2){let e=K().$implicit,t=K();q(`ok`,t.statusTone(e.status)===`ok`)(`redirect`,t.statusTone(e.status)===`redirect`)(`bad`,t.statusTone(e.status)===`bad`),M(),Y(e.status)}}function GW(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.delayMs,` ms`)}}function KW(e,t){e&1&&(z(0,`span`),J(1,`mock body`),B())}function qW(e,t){e&1&&(z(0,`p`,115),J(1,` The SSR mock is not written to TransferState, so the browser requests this URL again. `),B())}function JW(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,108)(2,`input`,109),G(`change`,function(){let t=O(e).$implicit;return k(K().toggleRule(t.id))}),B(),z(3,`code`,110)(4,`span`,111),J(5),B(),J(6),B()(),z(7,`button`,112),G(`click`,function(){let t=O(e).$implicit;return k(K().removeRule(t.id))}),J(8,` Remove `),B(),z(9,`span`,113)(10,`span`),J(11),B(),P(12,UW,2,0,`span`)(13,WW,2,7,`span`,114),P(14,GW,2,1,`span`),P(15,KW,2,0,`span`),B(),P(16,qW,2,0,`p`,115),B()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Enable rule for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(e.method||`ANY`),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Remove rule for `+e.pattern),M(4),Y(n.targetLabel(e.target)),M(),F(e.status===void 0?12:13),M(2),F(e.delayMs?14:-1),M(),F(e.body?15:-1),M(),F(n.mocksOnServer(e)?16:-1)}}function YW(e,t){e&1&&(z(0,`li`,53),J(1,`No rules. SSR rules apply on the next page load.`),B())}function XW(e,t){if(e&1){let e=W();z(0,`p`,61),J(1,` Throws while the server renders, so it needs `),z(2,`code`),J(3,`providePangularHttp()`),B(),J(4,` and a page the engine renders. Prerendered files served as static files skip it. `),B(),z(5,`label`),J(6,` Error message `),z(7,`input`,116),G(`input`,function(t){return O(e),k(K().patchOverride(`message`,t))}),B()()}if(e&2){let e=K();M(7),R(`value`,e.overrideDraft().message)}}function ZW(e,t){e&1&&J(0,` For a cached HTTP response this is the whole cache record, not only the response body. `)}function QW(e,t){e&1&&(z(0,`p`,120),J(1,` Filled in from the TransferState payload. The value starts empty because the panel only shows a redacted copy, so type the JSON the server should send. `),P(2,ZW,1,0),B()),e&2&&(M(2),F(t===`http`?2:-1))}function $W(e,t){if(e&1){let e=W();z(0,`label`),J(1,` TransferState key `),z(2,`input`,117),G(`input`,function(t){return O(e),k(K().patchOverride(`key`,t))}),B()(),z(3,`label`)(4,`span`),J(5,`New JSON value `),z(6,`span`,33),J(7,`(empty removes the entry)`),B()(),z(8,`textarea`,118),G(`input`,function(t){return O(e),k(K().patchOverride(`value`,t))}),B()(),z(9,`p`,119),J(10),B(),P(11,QW,3,1,`p`,120)}if(e&2){let e,t=K();M(2),R(`value`,t.overrideDraft().key),M(6),R(`value`,t.overrideDraft().value),N(`aria-invalid`,t.overrideValueError()?`true`:null)(`aria-describedby`,t.overrideFromPayload()?`override-value-error override-value-note`:`override-value-error`),M(2),Y(t.overrideValueError()),M(),F((e=t.overrideFromPayload())?11:-1,e)}}function eG(e,t){e&1&&(z(0,`p`,61),J(1,` Serves `),z(2,`code`),J(3,`index.csr.html`),B(),J(4,` instead of rendering. Needs `),z(5,`code`),J(6,`browserDistFolder`),B(),J(7,` in `),z(8,`code`),J(9,`initPangularHub()`),B(),J(10,`. `),B())}function tG(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.message)}}function nG(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Z(``,e.value===void 0?`remove`:`set`,` `,e.key)}}function rG(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,108)(2,`input`,109),G(`change`,function(){let t=O(e).$implicit;return k(K().toggleOverride(t.id))}),B(),z(3,`code`,110)(4,`span`,111),J(5),B(),J(6),B()(),z(7,`button`,121),G(`click`,function(){let t=O(e).$implicit;return k(K().removeOverride(t.id))}),J(8,` Remove `),B(),z(9,`span`,113),P(10,tG,2,1,`span`),P(11,nG,2,2,`span`),B()()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-label`,`Enable `+n.overrideLabel(e.kind)+` for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(n.overrideLabel(e.kind)),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-label`,`Remove `+n.overrideLabel(e.kind)+` for `+e.pattern),M(3),F(e.message?10:-1),M(),F(e.key?11:-1)}}function iG(e,t){e&1&&(z(0,`li`,53),J(1,`No overrides.`),B())}function aG(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`DOM nodes hydrated`),B(),z(3,`dd`),J(4),B()(),z(5,`div`)(6,`dt`),J(7,`DOM nodes skipped`),B(),z(8,`dd`),J(9),B()(),z(10,`div`)(11,`dt`),J(12,`Mismatched components`),B(),z(13,`dd`),J(14),B()()),e&2){let e=t;M(4),Y(e.hydrated),M(5),Y(e.skipped),M(4),q(`bad`,e.mismatched>0),M(),Y(e.mismatched)}}function oG(e,t){if(e&1&&(z(0,`span`,123)(1,`span`,124),J(2,`Expected`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.expected)}}function sG(e,t){if(e&1&&(z(0,`span`,123)(1,`span`,124),J(2,`Actual`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.actual)}}function cG(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),P(3,oG,5,1,`span`,123),P(4,sG,5,1,`span`,123),B()),e&2){let e=t.$implicit;M(2),Y(`<`+e.component+`>`),M(),F(e.expected?3:-1),M(),F(e.actual?4:-1)}}function lG(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`ul`,122),I(3,cG,5,3,`li`,null,Cg),B()),e&2){let e=K();M(),X(`Mismatches (`,e.mismatches.length,`)`),M(2),L(e.mismatches)}}function uG(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B()()),e&2){let e=t.$implicit;M(2),Y(e)}}function dG(e,t){if(e&1&&(z(0,`h3`),J(1,`ngSkipHydration hosts`),B(),z(2,`ul`,125),I(3,uG,3,1,`li`,null,Cg),B()),e&2){let e=K();M(3),L(e.skipHydrationHosts)}}function fG(e,t){e&1&&(z(0,`h3`),J(1,`Warnings`),B(),z(2,`p`,56),J(3,` Not captured: add `),z(4,`code`),J(5,`providePangularHttp()`),B(),J(6,` to the app providers. `),B())}function pG(e,t){if(e&1&&(z(0,`pre`,126),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function mG(e,t){e&1&&(z(0,`p`,85),J(1,`No hydration warnings.`),B())}function hG(e,t){if(e&1&&(z(0,`h3`),J(1),B(),I(2,pG,2,1,`pre`,126,Cg,!1,mG,2,0,`p`,85)),e&2){let e=K();M(),X(`Warnings (`,e.warnings.length,`)`),M(),L(e.warnings)}}function gG(e,t){if(e&1&&(z(0,`dl`,84)(1,`div`)(2,`dt`),J(3,`Enabled`),B(),z(4,`dd`)(5,`span`,92),J(6),B()()(),z(7,`div`)(8,`dt`),J(9,`Hydrated components`),B(),z(10,`dd`),J(11),B()(),z(12,`div`)(13,`dt`),J(14,`Hydrated nodes`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Skipped components`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`App stable after`),B(),z(25,`dd`),J(26),B()(),z(27,`div`)(28,`dt`),J(29,`Incremental defer blocks`),B(),z(30,`dd`),J(31),B()(),P(32,aG,15,5),B(),P(33,lG,5,1),P(34,dG,5,0),P(35,fG,7,0)(36,hG,5,2)),e&2){let e,n=t;M(5),q(`on`,n.enabled)(`off-tag`,!n.enabled),M(),Y(n.enabled?`yes`:`no (client render only)`),M(5),Y(n.hydratedComponents??`n/a`),M(5),Y(n.hydratedNodes??`n/a`),M(5),Y(n.componentsSkippedHydration??`n/a`),M(5),Y(n.stableMs===void 0?`n/a`:n.stableMs+` ms`),M(5),Y(n.deferBlocksWithIncrementalHydration??`n/a`),M(),F((e=n.nodes)?32:-1,e),M(),F(n.mismatches?.length?33:-1),M(),F(n.skipHydrationHosts.length?34:-1),M(),F(n.warningsCaptured===!1?35:36)}}function _G(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No hydration data for this page.`),B(),z(3,`p`,56),J(4,`Open a server rendered page of the app to see its stats.`),B()())}function vG(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No TransferState script: this page was not server rendered.`),B()())}function yG(e,t){if(e&1&&(z(0,`p`,128),J(1),B()),e&2){let e=K(2);M(),Y(e.error)}}function bG(e,t){e&1&&(z(0,`span`,92),J(1),B()),e&2&&(M(),Y(t))}function xG(e,t){if(e&1&&(z(0,`span`,92),J(1),B(),z(2,`span`,131),J(3),B()),e&2){let e=t,n=K().$implicit,r=K(3);q(`server`,r.statusTone(e.status)===`ok`)(`fault`,r.statusTone(e.status)===`bad`),M(),X(`HTTP `,e.status),M(2),Y(e.url??n.key)}}function SG(e,t){if(e&1&&(z(0,`span`,131),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.key)}}function CG(e,t){if(e&1){let e=W();z(0,`button`,104),G(`click`,function(){O(e);let t=K().$implicit;return k(K(3).editEntry(t))}),J(1,` Edit in SSR overrides `),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Edit in SSR overrides, key `+e.key)}}function wG(e,t){if(e&1){let e=W();z(0,`details`)(1,`summary`),V(2,`span`,130),P(3,bG,2,1,`span`,92),P(4,xG,4,6)(5,SG,2,1,`span`,131),z(6,`span`,132),J(7),B()(),z(8,`div`,133)(9,`span`,134),J(10,`Key`),B(),z(11,`code`,135),J(12),B(),z(13,`div`,136)(14,`button`,104),G(`click`,function(){let t=O(e).$implicit;return k(K(3).copyKey(t.key))}),J(15,` Copy `),B(),P(16,CG,2,1,`button`,102),B()(),z(17,`pre`,137),J(18),dv(19,`json`),B()()}if(e&2){let e,n,r=t.$implicit,i=K(3);M(3),F((e=i.payloadLabel(r))?3:-1,e),M(),F((n=r.http)?4:5,n),M(3),X(``,r.size,` B`),M(5),Y(r.key),M(2),N(`aria-label`,`Copy key `+r.key),M(2),F(i.canEditEntry(r)?16:-1),M(),N(`aria-label`,`Value of `+r.key),M(),Y(pv(19,8,r.value))}}function TG(e,t){if(e&1&&(z(0,`p`,127),J(1),B(),P(2,yG,2,1,`p`,128),z(3,`div`,129),I(4,wG,20,10,`details`,null,ZU),B()),e&2){let e=K();M(),Y_(` `,e.entries.length,` entr`,e.entries.length===1?`y`:`ies`,`, `,e.size,` bytes `),M(),F(e.error?2:-1),M(2),L(e.entries)}}function EG(e,t){e&1&&P(0,vG,3,0,`div`,11)(1,TG,6,4),e&2&&F(+!!t.found)}function DG(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`Open a page of the app to see its payload.`),B()())}var OG={kind:`render-error`,pattern:``,message:``,key:``,value:``},kG={"render-error":`Render error`,"client-render":`Client render`,"state-edit":`TransferState edit`},AG={server:`Server`,prerender:`Prerender`,client:`Client`,redirect:`Redirect`,"not-rendered":`Not rendered`,unknown:`Unknown`},jG={pattern:``,method:``,target:`both`,status:``,delayMs:``,body:``};function MG(e){try{let t=new URL(e,`http://x`);return t.pathname+t.search}catch{return e}}var NG=/\[redacted\]|%5Bredacted%5D/gi;function PG(e){return(/^([a-z][a-z\d+.-]*:|\/\/)/i.test(e)?MG(e):e).replace(NG,`*`)}function FG(e){let t=VD(e);if(t!==null)return t;try{return JSON.parse(e),e.trim()}catch{return null}}var IG=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];function LG(e){try{return new URL(e,`http://x`).pathname}catch{return``}}function RG(e){let t=LG(e);return t===`/`?``:t}var zG=/\[redacted\]|%5Bredacted%5D/i,BG=200,VG=50,HG=500,UG=1e5,WG=[{value:``,label:`None`},...PT.map(([e,t])=>({value:String(e),label:`${e} ${t}`}))],GG=class e{rpc=$(null);canWrite=Q(()=>bE(this.rpc(),`http`));writesOff=KT(`http`);loading=j(!1);failed=j(!1);serverCalls=j([]);pages=j([]);payloads=j({});serverDropped=j(0);requests=j([]);rules=j([]);overrides=j([]);overrideDraft=j({...OG});overrideFromPayload=j(null);overrideKindOptions=[{value:`render-error`,label:`Render error`},{value:`client-render`,label:`Force Client render`},{value:`state-edit`,label:`Edit TransferState entry`}];overrideValueError=Q(()=>{let e=this.overrideDraft().value.trim();if(!e)return``;try{return JSON.parse(e),``}catch{return`The value must be valid JSON.`}});overrideReady=Q(()=>{let e=this.overrideDraft();return!e.pattern.trim()||this.overrides().length>=20?!1:e.kind!==`state-edit`||!!e.key.trim()&&!this.overrideValueError()});hostPageId=eE();selectedPageId=Tv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId)?.pageId??e[0]?.pageId??null});selectedCallId=j(null);draft=j({...jG});message=j(``);bodyPlaceholder=`{ "error": "Service unavailable" }`;statusOptions=WG;unsubscribe=[];destroyRef=E(Cs);injector=E(xs);host=E(Ml);selected=Q(()=>this.pages().find(e=>e.pageId===this.selectedPageId())??null);pageRequestId=Q(()=>this.selected()?.ssrRequestId??null);selectedRequestId=Tv(()=>this.pageRequestId());selectedPayload=Q(()=>{let e=this.selectedPageId();return e?this.payloads()[e]??null:null});maxCalls=Q(()=>yE(this.rpc()).limits.httpCalls);droppedCalls=Q(()=>(this.selected()?.dropped??0)+this.serverDropped());pageServerCalls=Q(()=>{let e=this.selected()?.initialUrl;return e?this.serverCalls().filter(t=>!t.pageUrl||t.pageUrl===e):this.serverCalls()});timeline=Q(()=>[...this.pageServerCalls(),...this.selected()?.calls??[]].sort((e,t)=>t.at-e.at));callQuery=j(``);sideFilter=j(`all`);failedOnly=j(!1);sideOptions=[{value:`all`,label:`All sides`},{value:`server`,label:`SSR`},{value:`client`,label:`Client`}];visibleCalls=Q(()=>{let e=this.callQuery().trim().toLowerCase(),t=this.sideFilter()??`all`,n=this.failedOnly();return this.timeline().filter(r=>(t===`all`||r.side===t)&&(!n||this.isFailed(r))&&(!e||`${r.method} ${r.url}`.toLowerCase().includes(e)||`${r.method} ${MG(r.url)}`.toLowerCase().includes(e)))});filterStatus=Q(()=>{this.callQuery(),this.sideFilter(),this.failedOnly(),this.filterFlip=!this.filterFlip;let e=Cv(()=>`${this.visibleCalls().length} of ${this.timeline().length}`);return this.filterFlip?`${e}\u00a0`:e});filterFlip=!0;selectedCall=Q(()=>this.visibleCalls().find(e=>e.id===this.selectedCallId())??null);selectedRequest=Q(()=>this.requests().find(e=>e.id===this.selectedRequestId())??null);requestCalls=Q(()=>{let e=this.selectedRequest()?.id;return e?this.serverCalls().filter(t=>t.requestId===e):[]});requestPage=Q(()=>{let e=this.selectedRequest()?.id;return e?this.pages().find(t=>t.ssrRequestId===e)??null:null});refetched=Q(()=>{let e=this.selectedRequest(),t=this.requestPage();if(!e||!t)return[];let n=new Set(this.requestCalls().filter(e=>e.status).map(e=>`${e.method} ${MG(e.url)}`));return t.calls.filter(t=>t.side===`client`&&!t.cacheHit&&!t.mocked&&t.at>=e.at&&n.has(`${t.method} ${MG(t.url)}`))});draftMocksOnServer=Q(()=>{let e=this.draftRule();return!!e&&this.mocksOnServer(e)});draftRule=Q(()=>{let e=this.draft(),t=e.pattern.trim();if(!t||t.length>HG||this.bodyError()||this.rules().length>=VG)return null;let n=e.body.trim(),r=Math.min(Math.max(Math.round(Number(e.delayMs))||0,0),1e4),i=e.status.trim()?Number(e.status):n?200:void 0;return i!==void 0&&!FT(i)||i===void 0&&!r?null:{pattern:t,enabled:!0,target:e.target,...e.method?{method:e.method}:{},...i===void 0?{}:{status:i},...r?{delayMs:r}:{},...n?{body:n}:{}}});draftHint=Q(()=>{let e=this.draft();return this.rules().length>=VG?`You can add up to ${VG} rules. Remove one to add another.`:e.pattern.trim()?e.pattern.trim().length>HG?`The URL pattern is limited to ${HG} characters.`:this.bodyError()?``:e.status.trim()&&!FT(Number(e.status))?`Pick a status from the list.`:this.draftRule()?!e.status.trim()&&e.body.trim()?`With no status, the mock body returns 200.`:``:`Set a status, a delay or a mock body.`:`Enter a URL pattern to add a rule.`});bodyError=Q(()=>{let e=this.draft().body.trim();if(!e)return``;if(e.length>UG)return`The mock body is limited to ${UG} characters.`;try{return JSON.parse(e),``}catch{return`The mock body must be valid JSON.`}});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.stopListening())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=e.scope(`pangular`).rpc,[n,r]=await Promise.all([t.sharedState(`http`),t.sharedState(`http-payloads`)]);if(this.destroyRef.destroyed)return;let i=e=>{let t=e;this.serverCalls.set(t?.serverCalls??[]),this.serverDropped.set(t?.serverDropped??0),this.requests.set([...t?.requests??[]].reverse()),this.pages.set(t?.pages??[]),this.rules.set(t?.rules??[]),this.overrides.set(t?.ssrOverrides??[])},a=e=>this.payloads.set(e?.pages??{});i(n.value()),a(r.value()),this.stopListening(),this.unsubscribe=[n.on(`updated`,i),r.on(`updated`,a)]}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}guardVerdict(e){return e.guards?.passed===!1?e.outcome===`redirected`?`redirected`:`rejected`:``}msLabel(e){return e===void 0?`n/a`:`${e} ms`}skipText(e){return NT[e]??``}refetchReason(e){let t=`${e.method} ${MG(e.url)}`,n=this.requestCalls().filter(e=>`${e.method} ${MG(e.url)}`===t),r=n[0];return r?.cacheSkip&&n.every(e=>e.cacheSkip===r.cacheSkip)?this.skipText(r.cacheSkip):``}compressedWith(e){if(e.compressedBeforeTrace)return e.headers[`content-encoding`]??`unknown encoding`}renderModeLabel(e){return AG[e]??`Unknown`}statusLabel(e){return e.cancelled?`cancelled`:e.status?String(e.status):`ERR`}callTone(e){return e.cancelled?`neutral`:this.statusTone(e.status)}isFailed(e){return!!e.cancelled||!e.status||e.status>=400}clearCallFilters(){this.callQuery.set(``),this.sideFilter.set(`all`),this.failedOnly.set(!1),this.host.nativeElement.querySelector(`#timeline-search`)?.focus()}rulePatternOf(e){return e.rulePattern?e.rulePattern:e.ruleId?this.rules().find(t=>t.id===e.ruleId)?.pattern??null:null}openCall(e){this.selectedCallId.set(e),Id(()=>this.host.nativeElement.querySelector(`#preview-heading`)?.focus(),{injector:this.injector})}previewText(e){if(e.preview!==void 0)return VD(e.preview)??e.preview}async copyPreview(e){let t=this.previewText(e);if(t)try{await navigator.clipboard.writeText(t),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}mockCall(e){let t=e.method.toUpperCase(),n=PG(e.url),r=e.error||!e.preview?null:FG(e.preview);this.draft.set({...jG,pattern:n,method:t,body:r??``});let i=`${t} ${n}`;this.message.set(r?`Filled in a rule for ${i} with the preview as its body. Check it, then add the rule.`:e.preview&&!e.error?`Filled in a rule for ${i}. The preview is not complete JSON, so it is not used as the body.`:`Filled in a rule for ${i}. Set a status, a delay or a body, then add the rule.`),Id(()=>this.host.nativeElement.querySelector(`#rule-pattern`)?.focus(),{injector:this.injector})}closePreview(){let e=this.selectedCallId();this.selectedCallId.set(null),e&&[...this.host.nativeElement.querySelectorAll(`button[data-call-id]`)].find(t=>t.dataset.callId===e)?.focus()}stopListening(){for(let e of this.unsubscribe.splice(0))e()}statusTone(e){return e===void 0?`neutral`:e===0||e>=400?`bad`:e>=300?`redirect`:e>=200?`ok`:`neutral`}mocksOnServer(e){return e.target!==`client`&&e.status!==void 0&&e.status<400}payloadLabel(e){return e.source===`hydration`?`hydration annotations`:e.fn?`Analog server function ${e.fn.name??e.fn.id}`:e.source===`analog`?`Analog`:null}targetLabel(e){return e===`both`?`SSR + client`:e===`server`?`SSR only`:`Client only`}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url})));methodOptions=Q(()=>{let e=this.draft().method;return[{value:``,label:`Any`},...(e&&!IG.includes(e)?[...IG,e]:IG).map(e=>({value:e,label:e}))]});targetOptions=[{value:`both`,label:`SSR + client`},{value:`server`,label:`SSR only`},{value:`client`,label:`Client only`}];selectPage(e){e&&this.selectedPageId.set(e),this.selectedCallId.set(null),this.overrideFromPayload.set(null)}setDraft(e,t){this.draft.update(n=>({...n,[e]:t}))}patch(e,t){let n=t.target.value;this.draft.update(t=>({...t,[e]:n}))}async addRule(e){e.preventDefault();let t=this.draftRule();if(!t)return;let n={id:`r${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,...t};await this.saveRules([...this.rules(),n],`Rule added.`,n)&&(this.draft.set({...jG}),this.host.nativeElement.querySelector(`#rule-pattern`)?.focus())}toggleRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Rule updated.`,t)}async removeRule(e){let t=this.rules().findIndex(t=>t.id===e);if(t<0)return;let n=this.rules().filter(t=>t.id!==e);await this.saveRules(n,`Rule removed.`,this.rules()[t])&&this.focusAfterRemove(`[data-remove-rule]`,t,`#rule-list-heading`)}async clearCalls(){try{await iE(this.rpc(),`clear-http-calls`),this.selectedCallId.set(null),this.message.set(`Timeline cleared.`)}catch{this.message.set(`Could not clear the timeline.`)}}overrideLabel(e){return kG[e]??e}setOverrideDraft(e,t){this.overrideDraft.update(n=>({...n,[e]:t})),e===`kind`&&t!==`state-edit`&&this.overrideFromPayload.set(null)}patchOverride(e,t){let n=t.target.value;this.overrideDraft.update(t=>({...t,[e]:n})),e===`key`&&this.overrideFromPayload.set(null)}async copyKey(e){try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}canEditEntry(e){let{key:t}=e;return this.canWrite()&&!!t&&t===t.trim()&&t.length<=BG&&!zG.test(t)}editEntry(e){if(!this.canEditEntry(e))return;let t=this.selected();this.overrideDraft.set({...OG,kind:`state-edit`,pattern:t?RG(t.initialUrl??t.url):``,key:e.key}),this.overrideFromPayload.set(e.http?`http`:`other`),this.message.set(`Editing the TransferState entry in SSR overrides.`),Id(()=>{let e=this.host.nativeElement.querySelector(this.overrideDraft().pattern?`#override-value`:`#override-pattern`);e?.scrollIntoView?.({block:`center`}),e?.focus()},{injector:this.injector})}async addOverride(e){if(e.preventDefault(),!this.overrideReady())return;let t=this.overrideDraft(),n={id:`o${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,kind:t.kind,pattern:t.pattern.trim(),enabled:!0,...t.kind===`render-error`&&t.message.trim()?{message:t.message.trim()}:{},...t.kind===`state-edit`?{key:t.key.trim()}:{},...t.kind===`state-edit`&&t.value.trim()?{value:t.value.trim()}:{}};await this.saveOverrides([...this.overrides(),n],`Override added. Reload the page.`)&&(this.overrideDraft.set({...OG,kind:t.kind}),this.overrideFromPayload.set(null),this.host.nativeElement.querySelector(`#override-pattern`)?.focus())}toggleOverride(e){this.saveOverrides(this.overrides().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Override updated. Reload the page.`)}async removeOverride(e){let t=this.overrides().findIndex(t=>t.id===e);if(t<0)return;let n=this.overrides().filter(t=>t.id!==e);await this.saveOverrides(n,`Override removed.`)&&this.focusAfterRemove(`[data-remove-override]`,t,`#override-list-heading`)}focusAfterRemove(e,t,n){Id(()=>{let r=this.host.nativeElement,i=r.querySelectorAll(e);(i[Math.min(t,i.length-1)]??r.querySelector(n))?.focus()},{injector:this.injector})}announce(e){if(this.message()!==e){this.message.set(e);return}this.message.set(``),Id(()=>{this.message()===``&&this.message.set(e)},{injector:this.injector})}async saveOverrides(e,t){try{let n=await iE(this.rpc(),`set-ssr-overrides`,e);return this.overrides.set(Array.isArray(n)?n:e),this.announce(t),!0}catch{return this.message.set(`Could not save the overrides.`),!1}}async saveRules(e,t,n){try{let r=await iE(this.rpc(),`set-http-rules`,e);return this.rules.set(Array.isArray(r)?r:e),this.announce(n.target===`client`?t:`${t} Reload the page to apply it to SSR.`),!0}catch{return this.message.set(`Could not save the rules.`),!1}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-network-inspector`]],inputs:{rpc:[1,`rpc`]},decls:128,vars:54,consts:[[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`,`error`],[1,`toolbar`],[1,`page-picker`],[`id`,`page-picker-label`],[`labelledBy`,`page-picker-label`,`emptyText`,`No connected page`,`placeholder`,`No connected page`,3,`valueChange`,`options`,`value`],[`type`,`button`,3,`click`,`disabled`],[`role`,`status`,1,`message`],[1,`grid`],[`aria-labelledby`,`ssr-heading`,1,`panel`,`wide`],[`id`,`ssr-heading`],[1,`empty`],[`aria-labelledby`,`timeline-heading`,1,`panel`,`wide`],[`id`,`timeline-heading`],[`what`,`HTTP calls`,`limit`,`httpCalls`,3,`dropped`,`max`],[`role`,`group`,`aria-label`,`Filter the HTTP timeline`,1,`filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`id`,`timeline-search`,`type`,`search`,`placeholder`,`Find a URL or method…`,`aria-label`,`Find a URL or method`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Side`,1,`side-filter`,3,`valueChange`,`options`,`value`],[1,`inline`,`failed-toggle`],[`type`,`checkbox`,3,`change`,`checked`],[1,`total`],[`role`,`status`,1,`sr-only`],[1,`table-wrap`],[`role`,`status`,1,`empty`,`no-match`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`],[`aria-labelledby`,`rules-heading`,1,`panel`],[`id`,`rules-heading`],[`id`,`http-writes-off`,1,`muted`,`small`],[`id`,`rule-form`,1,`rule-form`,3,`submit`],[1,`hint`],[`id`,`rule-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /api/products`,3,`input`,`value`],[1,`row`],[1,`field-group`],[`id`,`rule-method-label`],[`labelledBy`,`rule-method-label`,3,`valueChange`,`options`,`value`],[`id`,`rule-target-label`],[`labelledBy`,`rule-target-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`id`,`rule-status-label`],[`labelledBy`,`rule-status-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`0`,`max`,`10000`,`placeholder`,`0`,3,`input`,`value`],[`rows`,`3`,`spellcheck`,`false`,`aria-describedby`,`body-error`,3,`input`,`placeholder`,`value`],[`id`,`body-error`,1,`field-error`],[`id`,`rule-ssr-note`,1,`muted`,`small`],[`id`,`rule-hint`,1,`muted`,`small`],[1,`form-actions`],[`type`,`submit`,3,`disabled`],[`id`,`rule-list-heading`,`tabindex`,`-1`,1,`rules-heading`],[1,`rules`],[3,`off`],[1,`empty-rule`],[`aria-labelledby`,`overrides-heading`,1,`panel`],[`id`,`overrides-heading`],[1,`muted`,`small`],[1,`rule-form`,3,`submit`],[`id`,`override-kind-label`],[`labelledBy`,`override-kind-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`id`,`override-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /examples/ssr`,3,`input`,`value`],[`id`,`override-kind-help`,1,`muted`,`small`],[`id`,`override-list-heading`,`tabindex`,`-1`,1,`rules-heading`],[`aria-labelledby`,`hydration-heading`,1,`panel`],[`id`,`hydration-heading`],[`aria-labelledby`,`payload-heading`,1,`panel`,`wide`],[`id`,`payload-heading`],[`aria-hidden`,`true`,1,`spinner`],[`scope`,`col`],[`scope`,`col`,1,`num`],[3,`selected`],[`id`,`ssr-detail`,`role`,`region`,`aria-labelledby`,`ssr-detail-heading`,1,`preview`],[3,`click`],[1,`url`],[`type`,`button`,`aria-controls`,`ssr-detail`,1,`link`,3,`title`],[1,`method`],[1,`status`],[`aria-hidden`,`true`,1,`dot`],[1,`num`],[1,`notes`],[1,`tag`,`server`],[1,`tag`,`mock`],[1,`tag`,`fault`],[`id`,`ssr-detail-heading`],[1,`stats`],[1,`muted`,`small`,`ok-note`],[1,`request-call`],[1,`muted`],[1,`stats`,`nav-stats`],[1,`preview-url`,3,`title`],[1,`tag`,3,`title`],[1,`muted`,`small`,`skip-reason`],[1,`tag`],[`type`,`button`,1,`link`,3,`title`],[1,`page-url`,3,`title`],[1,`tag`,`rule-ref`,3,`title`],[1,`empty-actions`],[`type`,`button`,3,`click`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`,3,`keydown.escape`],[1,`preview-head`],[`id`,`preview-heading`,`tabindex`,`-1`],[1,`preview-actions`],[`type`,`button`,1,`ghost`],[`type`,`button`,`aria-controls`,`rule-form`,1,`ghost`,3,`click`,`disabled`],[`type`,`button`,1,`ghost`,3,`click`],[1,`preview-meta`],[1,`preview-rule`],[`tabindex`,`0`,`role`,`region`,1,`preview-body`],[1,`inline`],[`type`,`checkbox`,3,`change`,`checked`,`disabled`],[1,`rule-pattern`,3,`title`],[1,`rule-method`],[`type`,`button`,`data-remove-rule`,``,1,`link`,`remove`,3,`click`,`disabled`],[1,`rule-meta`],[1,`status`,3,`ok`,`redirect`,`bad`],[1,`rule-note`],[`spellcheck`,`false`,`placeholder`,`Simulated render error`,`aria-describedby`,`override-kind-help`,3,`input`,`value`],[`id`,`override-key`,`spellcheck`,`false`,`autocomplete`,`off`,3,`input`,`value`],[`id`,`override-value`,`rows`,`3`,`spellcheck`,`false`,3,`input`,`value`],[`id`,`override-value-error`,1,`field-error`],[`id`,`override-value-note`,1,`muted`,`small`],[`type`,`button`,`data-remove-override`,``,1,`link`,`remove`,3,`click`,`disabled`],[1,`plain`,`mismatches`],[1,`mismatch-row`],[1,`mismatch-label`],[1,`plain`],[1,`warn`],[1,`muted`,`small`,`summary-line`],[`role`,`alert`,1,`bad`],[1,`entries`],[`aria-hidden`,`true`,1,`chevron`],[1,`entry-key`],[1,`entry-size`],[1,`entry-key-row`],[1,`entry-key-label`],[1,`entry-key-text`],[1,`entry-actions`],[`tabindex`,`0`,`role`,`region`]],template:function(e,t){if(e&1&&(P(0,QU,4,0,`div`,0)(1,$U,5,0,`div`,1),z(2,`div`,2)(3,`div`,3)(4,`span`,4),J(5,`Page`),B(),z(6,`app-select`,5),G(`valueChange`,function(e){return t.selectPage(e)}),B()(),z(7,`button`,6),G(`click`,function(){return t.clearCalls()}),J(8,` Clear timeline `),B(),z(9,`p`,7),J(10),B()(),z(11,`div`,8)(12,`section`,9)(13,`h2`,10),J(14),B(),P(15,TW,20,1)(16,EW,11,0,`div`,11),B(),z(17,`section`,12)(18,`h2`,13),J(19),B(),V(20,`app-limit-note`,14),z(21,`div`,15)(22,`div`,16),A(),z(23,`svg`,17),V(24,`circle`,18)(25,`path`,19),B(),ps(),z(26,`input`,20),G(`input`,function(e){return t.callQuery.set(e.target.value)})(`keydown.escape`,function(){return t.callQuery.set(``)}),B()(),z(27,`app-select`,21),ev(`valueChange`,function(e){return $_(t.sideFilter,e)||(t.sideFilter=e),e}),B(),z(28,`label`,22)(29,`input`,23),G(`change`,function(e){return t.failedOnly.set(e.target.checked)}),B(),J(30,` Failed only `),B(),z(31,`span`,24),J(32),B(),z(33,`span`,25),J(34),B()(),P(35,NW,21,0,`div`,26)(36,IW,9,1,`div`,27)(37,LW,11,0,`div`,11),P(38,BW,20,18,`div`,28),B(),z(39,`section`,29)(40,`h2`,30),J(41,`Fault injection`),B(),P(42,VW,2,1,`p`,31),z(43,`form`,32),G(`submit`,function(e){return t.addRule(e)}),z(44,`label`)(45,`span`),J(46,`URL pattern `),z(47,`span`,33),J(48,`(substring or * glob, ^ anchors the path)`),B()(),z(49,`input`,34),G(`input`,function(e){return t.patch(`pattern`,e)}),B()(),z(50,`div`,35)(51,`div`,36)(52,`span`,37),J(53,`Method`),B(),z(54,`app-select`,38),G(`valueChange`,function(e){return t.setDraft(`method`,e??``)}),B()(),z(55,`div`,36)(56,`span`,39),J(57,`Apply on`),B(),z(58,`app-select`,40),G(`valueChange`,function(e){return t.setDraft(`target`,e??`both`)}),B()()(),z(59,`div`,35)(60,`div`,36)(61,`span`,41),J(62,`Status`),B(),z(63,`app-select`,42),G(`valueChange`,function(e){return t.setDraft(`status`,e??``)}),B()(),z(64,`label`),J(65,` Delay (ms) `),z(66,`input`,43),G(`input`,function(e){return t.patch(`delayMs`,e)}),B()()(),z(67,`label`)(68,`span`),J(69,`Mock JSON body `),z(70,`span`,33),J(71,`(optional)`),B()(),z(72,`textarea`,44),G(`input`,function(e){return t.patch(`body`,e)}),B()(),z(73,`p`,45),J(74),B(),P(75,HW,2,0,`p`,46),z(76,`p`,47),J(77),B(),z(78,`div`,48)(79,`button`,49),J(80,` Add rule `),B()()(),z(81,`h3`,50),J(82),B(),z(83,`ul`,51),I(84,JW,17,17,`li`,52,JU,!1,YW,2,0,`li`,53),B()(),z(87,`section`,54)(88,`h2`,55),J(89,`SSR overrides`),B(),z(90,`p`,56),J(91,` Development only. These change what the server sends for matching pages, from the next full page load, and the request is marked `),z(92,`strong`),J(93,`overridden`),B(),J(94,`. `),B(),z(95,`form`,57),G(`submit`,function(e){return t.addOverride(e)}),z(96,`div`,36)(97,`span`,58),J(98,`Override`),B(),z(99,`app-select`,59),G(`valueChange`,function(e){return t.setOverrideDraft(`kind`,e??`render-error`)}),B()(),z(100,`label`)(101,`span`),J(102,`Page pattern `),z(103,`span`,33),J(104,`(substring or * glob, ^ anchors the path)`),B()(),z(105,`input`,60),G(`input`,function(e){return t.patchOverride(`pattern`,e)}),B()(),P(106,XW,8,1)(107,$W,12,6)(108,eG,11,0,`p`,61),z(109,`div`,48)(110,`button`,49),J(111,` Add override `),B()()(),z(112,`h3`,62),J(113),B(),z(114,`ul`,51),I(115,rG,12,12,`li`,52,JU,!1,iG,2,0,`li`,53),B()(),z(118,`section`,63)(119,`h2`,64),J(120,`Hydration`),B(),P(121,gG,37,14)(122,_G,5,0,`div`,11),B(),z(123,`section`,65)(124,`h2`,66),J(125,`TransferState payload`),B(),P(126,EG,2,1)(127,DG,3,0,`div`,11),B()()),e&2){let e,n,r,i;F(t.loading()?0:t.failed()?1:-1),M(6),R(`options`,t.pageOptions())(`value`,t.selected()?.pageId??null),M(),R(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),Y(t.message()),M(4),X(`SSR requests (`,t.requests().length,`)`),M(),F(t.requests().length?15:16),M(4),X(`HTTP timeline (`,t.timeline().length,`)`),M(),R(`dropped`,t.droppedCalls())(`max`,t.maxCalls()),M(),q(`no-calls`,!t.timeline().length),M(5),R(`value`,t.callQuery()),M(),R(`options`,t.sideOptions),Q_(`value`,t.sideFilter),M(2),R(`checked`,t.failedOnly()),M(3),Z(``,t.visibleCalls().length,` of `,t.timeline().length),M(2),Y(t.filterStatus()),M(),F(t.visibleCalls().length?35:t.timeline().length?36:37),M(3),F((e=t.selectedCall())?38:-1,e),M(4),F(t.canWrite()?-1:42),M(7),R(`value`,t.draft().pattern),M(5),R(`options`,t.methodOptions())(`value`,t.draft().method),M(4),R(`describedBy`,t.draftMocksOnServer()?`rule-ssr-note`:``)(`options`,t.targetOptions)(`value`,t.draft().target),M(5),R(`describedBy`,t.draftMocksOnServer()?`rule-ssr-note`:``)(`options`,t.statusOptions)(`value`,t.draft().status),M(3),R(`value`,t.draft().delayMs),M(6),R(`placeholder`,t.bodyPlaceholder)(`value`,t.draft().body),N(`aria-invalid`,t.bodyError()?`true`:null),M(2),Y(t.bodyError()),M(),F(t.draftMocksOnServer()?75:-1),M(2),Y(t.draftHint()),M(2),R(`disabled`,!t.canWrite()||!t.draftRule()),N(`aria-describedby`,t.canWrite()?`rule-hint`:`http-writes-off`),M(3),X(` Rules (`,t.rules().length,`) `),M(2),L(t.rules()),M(15),R(`describedBy`,t.overrideDraft().kind===`state-edit`?``:`override-kind-help`)(`options`,t.overrideKindOptions)(`value`,t.overrideDraft().kind),M(6),R(`value`,t.overrideDraft().pattern),M(),F((n=t.overrideDraft().kind)===`render-error`?106:n===`state-edit`?107:n===`client-render`?108:-1),M(4),R(`disabled`,!t.canWrite()||!t.overrideReady()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),X(` Overrides (`,t.overrides().length,`) `),M(2),L(t.overrides()),M(6),F((r=t.selected()?.hydration)?121:122,r),M(5),F((i=t.selectedPayload())?126:127,i)}},dependencies:[WD,jD,ab],styles:[`@charset "UTF-8";
+}`]})},$U=(e,t)=>t.id,eW=(e,t)=>t.id+t.kind,tW=(e,t)=>t.side+t.id,nW=(e,t)=>t.key;function rW(e,t){e&1&&(z(0,`div`,0),V(1,`span`,67),z(2,`span`),J(3,`Loading…`),B()())}function iW(e,t){e&1&&(z(0,`div`,1)(1,`strong`),J(2,`Could not reach the devtools server.`),B(),z(3,`span`),J(4,`Check that the app's dev server is running with the devtools plugin, then reopen this panel.`),B()())}function aW(e,t){e&1&&(z(0,`span`,80),J(1,`this page`),B())}function oW(e,t){e&1&&(z(0,`span`,81),J(1,`overridden`),B())}function sW(e,t){e&1&&(z(0,`span`,82),J(1,`aborted`),B())}function cW(e,t){if(e&1){let e=W();z(0,`tr`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).selectedRequestId.set(t.id))}),z(1,`td`,73)(2,`button`,74)(3,`span`,75),J(4),B(),J(5),B()(),z(6,`td`,76),V(7,`span`,77),J(8),B(),z(9,`td`),J(10),B(),z(11,`td`,78),J(12),B(),z(13,`td`,78),J(14),B(),z(15,`td`)(16,`div`,79),P(17,aW,2,0,`span`,80),P(18,oW,2,0,`span`,81),P(19,sW,2,0,`span`,82),B()()()}if(e&2){let e=t.$implicit,n=K(2);q(`selected`,n.selectedRequest()?.id===e.id),M(2),R(`title`,e.url),N(`aria-pressed`,n.selectedRequest()?.id===e.id),M(2),Y(e.method),M(),X(` `,e.url,` `),M(),q(`ok`,n.statusTone(e.status)===`ok`)(`redirect`,n.statusTone(e.status)===`redirect`)(`bad`,n.statusTone(e.status)===`bad`),M(2),X(``,e.status,` `),M(2),Y(n.renderModeLabel(e.renderMode)),M(2),X(``,e.renderMs,` ms`),M(2),Z(``,e.fetches,` (`,e.fetchMs,` ms)`),M(3),F(e.id===n.selected()?.ssrRequestId?17:-1),M(),F(e.overrides?.length?18:-1),M(),F(e.aborted?19:-1)}}function lW(e,t){e&1&&(z(0,`p`,56),J(1),z(2,`code`),J(3,`ssrMiddleware`),B(),J(4,` saw it, so the render mode can't be read and TransferState edits can't apply. Mount `),z(5,`code`),J(6,`ssrMiddleware`),B(),J(7,` after `),z(8,`code`),J(9,`compression()`),B(),J(10,`. `),B()),e&2&&(M(),X(` The body was already compressed (`,t,`) when `))}function uW(e,t){if(e&1&&(z(0,`span`,87),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.note)}}function dW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,81),J(2),B(),z(3,`span`),J(4),B(),P(5,uW,2,1,`span`,87),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(n.overrideLabel(e.kind)),M(2),Y(e.applied?`applied`:`not applied`),M(),F(e.note?5:-1)}}function fW(e,t){if(e&1&&(z(0,`h3`),J(1,`Overrides from the panel`),B(),z(2,`p`,56),J(3,` This response was changed on purpose, so it is not what the app sends on its own. `),B(),I(4,dW,6,3,`p`,86,eW)),e&2){let e=K();M(4),L(e.overrides)}}function pW(e,t){if(e&1&&(J(0,` to `),z(1,`code`),J(2),B()),e&2){let e=K().$implicit;M(2),Y(e.finalUrl)}}function mW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Guards`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(3),q(`bad`,t.guardVerdict(e)===`rejected`),M(),Z(` `,t.msLabel(e.guards.ms),``,t.guardVerdict(e)?`, `+t.guardVerdict(e):``,` `)}}function hW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Resolvers`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(4),Y(t.msLabel(e.resolvers.ms))}}function gW(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`Navigation total`),B(),z(3,`dd`),J(4),B()()),e&2){let e=K().$implicit;M(4),X(``,e.durationMs,` ms`)}}function _W(e,t){if(e&1&&(z(0,`p`,56),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.reason)}}function vW(e,t){if(e&1&&(z(0,`dl`,88)(1,`div`)(2,`dt`),J(3,`Navigation`),B(),z(4,`dd`)(5,`code`),J(6),B(),P(7,pW,3,1),J(8),B()(),P(9,mW,5,4,`div`),P(10,hW,5,1,`div`),P(11,gW,5,1,`div`),B(),P(12,_W,2,1,`p`,56)),e&2){let e=t.$implicit;M(6),Y(e.url),M(),F(e.finalUrl?7:-1),M(),X(` (`,e.outcome,`) `),M(),F(e.guards?9:-1),M(),F(e.resolvers?10:-1),M(),F(e.durationMs===void 0?-1:11),M(),F(e.reason?12:-1)}}function yW(e,t){if(e&1&&(z(0,`h3`),J(1,`Router during the render`),B(),I(2,vW,13,7,null,null,Cg)),e&2){let e=K();M(2),L(e.navigations)}}function bW(e,t){e&1&&(z(0,`span`,80),J(1,`cached`),B())}function xW(e,t){if(e&1&&(z(0,`span`,90),J(1,`not cached`),B()),e&2){let e=K().$implicit;R(`title`,K(3).skipText(e.cacheSkip))}}function SW(e,t){if(e&1&&(z(0,`p`,91),J(1),B()),e&2){let e=K().$implicit,t=K(3);M(),X(`Not cached: `,t.skipText(e.cacheSkip),`.`)}}function CW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,75),J(2),B(),z(3,`span`,89),J(4),B(),z(5,`span`,76),J(6),B(),z(7,`span`,87),J(8),B(),P(9,bW,2,0,`span`,80)(10,xW,2,1,`span`,90),B(),P(11,SW,2,1,`p`,91)),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.method),M(),R(`title`,e.url),M(),Y(e.url),M(),q(`ok`,n.callTone(e)===`ok`)(`bad`,n.callTone(e)===`bad`),M(),Y(n.statusLabel(e)),M(2),X(``,e.durationMs,` ms`),M(),F(e.cacheStored?9:e.cacheSkip?10:-1),M(2),F(!e.cacheStored&&e.cacheSkip?11:-1)}}function wW(e,t){e&1&&(z(0,`p`,56),J(1,`The render made no HttpClient calls.`),B())}function TW(e,t){e&1&&(z(0,`p`,91),J(1),B()),e&2&&(M(),X(`Why: `,t,`.`))}function EW(e,t){if(e&1&&(z(0,`p`,86)(1,`span`,75),J(2),B(),z(3,`span`,89),J(4),B(),z(5,`span`,82),J(6,`cache miss`),B()(),P(7,TW,2,1,`p`,91)),e&2){let e,n=t.$implicit,r=K(4);M(2),Y(n.method),M(),R(`title`,n.url),M(),Y(n.url),M(3),F((e=r.refetchReason(n))?7:-1,e)}}function DW(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`p`,56),J(3,` These calls ran on the server and again after hydration instead of reading the transfer cache. `),B(),I(4,EW,8,4,null,null,$U)),e&2){let e=K(3);M(),X(`Fetched again in the browser (`,e.refetched().length,`)`),M(3),L(e.refetched())}}function OW(e,t){e&1&&(z(0,`p`,85),J(1,`No server call ran again in the browser.`),B())}function kW(e,t){if(e&1&&(z(0,`div`,71)(1,`h3`,83),J(2),z(3,`code`),J(4),B()(),z(5,`dl`,84)(6,`div`)(7,`dt`),J(8,`Request id`),B(),z(9,`dd`)(10,`code`),J(11),B()()(),z(12,`div`)(13,`dt`),J(14,`Render`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Total`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`Sent`),B(),z(25,`dd`),J(26),B()(),z(27,`div`)(28,`dt`),J(29,`Browser page`),B(),z(30,`dd`),J(31),B()()(),P(32,lW,11,1,`p`,56),P(33,fW,6,0),P(34,yW,4,0),z(35,`h3`),J(36),B(),I(37,CW,12,11,null,null,$U,!1,wW,2,0,`p`,56),P(40,DW,6,1)(41,OW,2,0,`p`,85),B()),e&2){let e,n=t,r=K(2);M(2),X(` `,n.method,` `),M(2),Y(n.url),M(7),Y(n.id),M(5),X(``,n.renderMs,` ms`),M(5),X(``,n.durationMs,` ms`),M(5),X(``,n.bytes,` B`),M(5),Y(r.requestPage()?.title||r.requestPage()?.url||`not connected`),M(),F((e=r.compressedWith(n))?32:-1,e),M(),F(n.overrides?.length?33:-1),M(),F(n.navigations?.length?34:-1),M(2),X(`Server calls (`,r.requestCalls().length,`)`),M(),L(r.requestCalls()),M(3),F(r.refetched().length?40:r.requestPage()&&r.requestCalls().length?41:-1)}}function AW(e,t){if(e&1&&(z(0,`div`,26)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,68),J(5,`Request`),B(),z(6,`th`,68),J(7,`Status`),B(),z(8,`th`,68),J(9,`Render mode`),B(),z(10,`th`,69),J(11,`Render`),B(),z(12,`th`,69),J(13,`Server calls`),B(),z(14,`th`,68),J(15,`Notes`),B()()(),z(16,`tbody`),I(17,cW,20,20,`tr`,70,$U),B()()(),P(19,kW,42,13,`div`,71)),e&2){let e,t=K();M(17),L(t.requests()),M(2),F((e=t.selectedRequest())?19:-1,e)}}function jW(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No SSR requests traced.`),B(),z(3,`p`,56),J(4,` Add `),z(5,`code`),J(6,`app.use(devtools.ssrMiddleware)`),B(),J(7,` before the Angular handler in `),z(8,`code`),J(9,`server.ts`),B(),J(10,`, then load a server rendered page. `),B()())}function MW(e,t){e&1&&(z(0,`span`,92),J(1,`transfer cache`),B())}function NW(e,t){if(e&1&&(z(0,`span`,92),J(1),B()),e&2){let e=K().$implicit;M(),X(`delayed `,e.delayMs,` ms`)}}function PW(e,t){e&1&&(z(0,`span`,81),J(1,`mocked`),B())}function FW(e,t){e&1&&(z(0,`span`,82),J(1,`faulted`),B())}function IW(e,t){if(e&1&&(z(0,`span`,95),J(1,`rule `),z(2,`code`),J(3),B()()),e&2){let e=t;R(`title`,`Matched rule: `+e),M(3),Y(e)}}function LW(e,t){if(e&1){let e=W();z(0,`tr`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).openCall(t.id))}),z(1,`td`)(2,`span`,92),J(3),B()(),z(4,`td`,75),J(5),B(),z(6,`td`,73)(7,`button`,93),J(8),B()(),z(9,`td`,94),J(10),B(),z(11,`td`,76),V(12,`span`,77),J(13),B(),z(14,`td`,78),J(15),B(),z(16,`td`)(17,`div`,79),P(18,MW,2,0,`span`,92),P(19,NW,2,1,`span`,92),P(20,PW,2,0,`span`,81),P(21,FW,2,0,`span`,82),P(22,IW,4,2,`span`,95),B()()()}if(e&2){let e,n=t.$implicit,r=K(2);q(`selected`,r.selectedCall()?.id===n.id),M(2),q(`server`,n.side===`server`),M(),Y(n.side===`server`?`SSR`:`Client`),M(2),Y(n.method),M(2),R(`title`,n.url),N(`data-call-id`,n.id)(`aria-pressed`,r.selectedCall()?.id===n.id)(`aria-controls`,r.selectedCall()?`call-preview`:null),M(),X(` `,n.url,` `),M(),R(`title`,n.pageUrl??``),M(),X(` `,n.pageUrl??``,` `),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(2),X(``,r.statusLabel(n),` `),M(2),X(``,n.durationMs,` ms`),M(3),F(n.cacheHit?18:-1),M(),F(n.delayMs?19:-1),M(),F(n.mocked?20:-1),M(),F(n.faulted?21:-1),M(),F((e=r.rulePatternOf(n))?22:-1,e)}}function RW(e,t){if(e&1&&(z(0,`div`,26)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,68),J(5,`Side`),B(),z(6,`th`,68),J(7,`Method`),B(),z(8,`th`,68),J(9,`URL`),B(),z(10,`th`,68),J(11,`Page`),B(),z(12,`th`,68),J(13,`Status`),B(),z(14,`th`,69),J(15,`Time`),B(),z(16,`th`,68),J(17,`Notes`),B()()(),z(18,`tbody`),I(19,LW,23,26,`tr`,70,tW),B()()()),e&2){let e=K();M(19),L(e.visibleCalls())}}function zW(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(2).callQuery().trim(),`” with these filters. `)}function BW(e,t){e&1&&J(0),e&2&&X(` None of the `,K(2).timeline().length,` requests fit these filters. `)}function VW(e,t){if(e&1){let e=W();z(0,`div`,27)(1,`p`),J(2,`No requests match.`),B(),z(3,`p`,56),P(4,zW,1,1)(5,BW,1,1),B(),z(6,`div`,96)(7,`button`,97),G(`click`,function(){return O(e),k(K().clearCallFilters())}),J(8,`Clear filters`),B()()()}if(e&2){let e=K();M(4),F(e.callQuery().trim()?4:5)}}function HW(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No requests yet.`),B(),z(3,`p`,56),J(4,` Add `),z(5,`code`),J(6,`withPangular()`),B(),J(7,` to `),z(8,`code`),J(9,`provideHttpClient`),B(),J(10,`, then load a page of the app. `),B()())}function UW(e,t){if(e&1){let e=W();z(0,`button`,104),G(`click`,function(){O(e);let t=K();return k(K().copyPreview(t))}),J(1,` Copy `),B()}if(e&2){let e=K();N(`aria-label`,`Copy the response of `+e.method+` `+e.url)}}function WW(e,t){e&1&&(z(0,`p`,106),J(1,` Matched rule `),z(2,`code`),J(3),B()()),e&2&&(M(3),Y(t))}function GW(e,t){if(e&1){let e=W();z(0,`div`,98),G(`keydown.escape`,function(){return O(e),k(K().closePreview())}),z(1,`div`,99)(2,`h3`,100),J(3,`Response preview`),B(),z(4,`div`,101),P(5,UW,2,1,`button`,102),z(6,`button`,103),G(`click`,function(){let t=O(e);return k(K().mockCall(t))}),J(7,` Mock this request `),B(),z(8,`button`,104),G(`click`,function(){return O(e),k(K().closePreview())}),J(9,`Close`),B()()(),z(10,`p`,105)(11,`span`,75),J(12),B(),z(13,`span`,76),J(14),B(),z(15,`span`,89),J(16),B()(),P(17,WW,4,1,`p`,106),z(18,`pre`,107),J(19),B()()}if(e&2){let e,n=t,r=K();M(5),F(!n.error&&n.preview?5:-1),M(),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`http-writes-off`),M(6),Y(n.method),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(),Y(r.statusLabel(n)),M(),R(`title`,n.url),M(),Y(n.url),M(),F((e=r.rulePatternOf(n))?17:-1,e),M(),q(`error`,!!n.error&&!n.cancelled),N(`aria-label`,n.error?`Response error`:`Response body`),M(),Y(n.error??r.previewText(n)??`(no body)`)}}function KW(e,t){if(e&1&&(z(0,`p`,31),J(1),B()),e&2){let e=K();M(),Y(e.writesOff)}}function qW(e,t){e&1&&(z(0,`p`,46),J(1,` SSR mocks are not transferred to the client: the browser requests the URL again and gets the real response unless the rule also applies on the client. `),B())}function JW(e,t){e&1&&(z(0,`span`),J(1,`passthrough`),B())}function YW(e,t){if(e&1&&(z(0,`span`,76),J(1),B()),e&2){let e=K().$implicit,t=K();q(`ok`,t.statusTone(e.status)===`ok`)(`redirect`,t.statusTone(e.status)===`redirect`)(`bad`,t.statusTone(e.status)===`bad`),M(),Y(e.status)}}function XW(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.delayMs,` ms`)}}function ZW(e,t){e&1&&(z(0,`span`),J(1,`mock body`),B())}function QW(e,t){e&1&&(z(0,`p`,115),J(1,` The SSR mock is not written to TransferState, so the browser requests this URL again. `),B())}function $W(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,108)(2,`input`,109),G(`change`,function(){let t=O(e).$implicit;return k(K().toggleRule(t.id))}),B(),z(3,`code`,110)(4,`span`,111),J(5),B(),J(6),B()(),z(7,`button`,112),G(`click`,function(){let t=O(e).$implicit;return k(K().removeRule(t.id))}),J(8,` Remove `),B(),z(9,`span`,113)(10,`span`),J(11),B(),P(12,JW,2,0,`span`)(13,YW,2,7,`span`,114),P(14,XW,2,1,`span`),P(15,ZW,2,0,`span`),B(),P(16,QW,2,0,`p`,115),B()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Enable rule for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(e.method||`ANY`),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Remove rule for `+e.pattern),M(4),Y(n.targetLabel(e.target)),M(),F(e.status===void 0?12:13),M(2),F(e.delayMs?14:-1),M(),F(e.body?15:-1),M(),F(n.mocksOnServer(e)?16:-1)}}function eG(e,t){e&1&&(z(0,`li`,53),J(1,`No rules. SSR rules apply on the next page load.`),B())}function tG(e,t){if(e&1){let e=W();z(0,`p`,61),J(1,` Throws while the server renders, so it needs `),z(2,`code`),J(3,`providePangularHttp()`),B(),J(4,` and a page the engine renders. Prerendered files served as static files skip it. `),B(),z(5,`label`),J(6,` Error message `),z(7,`input`,116),G(`input`,function(t){return O(e),k(K().patchOverride(`message`,t))}),B()()}if(e&2){let e=K();M(7),R(`value`,e.overrideDraft().message)}}function nG(e,t){e&1&&J(0,` For a cached HTTP response this is the whole cache record, not only the response body. `)}function rG(e,t){e&1&&(z(0,`p`,120),J(1,` Filled in from the TransferState payload. The value starts empty because the panel only shows a redacted copy, so type the JSON the server should send. `),P(2,nG,1,0),B()),e&2&&(M(2),F(t===`http`?2:-1))}function iG(e,t){if(e&1){let e=W();z(0,`label`),J(1,` TransferState key `),z(2,`input`,117),G(`input`,function(t){return O(e),k(K().patchOverride(`key`,t))}),B()(),z(3,`label`)(4,`span`),J(5,`New JSON value `),z(6,`span`,33),J(7,`(empty removes the entry)`),B()(),z(8,`textarea`,118),G(`input`,function(t){return O(e),k(K().patchOverride(`value`,t))}),B()(),z(9,`p`,119),J(10),B(),P(11,rG,3,1,`p`,120)}if(e&2){let e,t=K();M(2),R(`value`,t.overrideDraft().key),M(6),R(`value`,t.overrideDraft().value),N(`aria-invalid`,t.overrideValueError()?`true`:null)(`aria-describedby`,t.overrideFromPayload()?`override-value-error override-value-note`:`override-value-error`),M(2),Y(t.overrideValueError()),M(),F((e=t.overrideFromPayload())?11:-1,e)}}function aG(e,t){e&1&&(z(0,`p`,61),J(1,` Serves `),z(2,`code`),J(3,`index.csr.html`),B(),J(4,` instead of rendering. Needs `),z(5,`code`),J(6,`browserDistFolder`),B(),J(7,` in `),z(8,`code`),J(9,`initPangularHub()`),B(),J(10,`. `),B())}function oG(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.message)}}function sG(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Z(``,e.value===void 0?`remove`:`set`,` `,e.key)}}function cG(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,108)(2,`input`,109),G(`change`,function(){let t=O(e).$implicit;return k(K().toggleOverride(t.id))}),B(),z(3,`code`,110)(4,`span`,111),J(5),B(),J(6),B()(),z(7,`button`,121),G(`click`,function(){let t=O(e).$implicit;return k(K().removeOverride(t.id))}),J(8,` Remove `),B(),z(9,`span`,113),P(10,oG,2,1,`span`),P(11,sG,2,2,`span`),B()()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-label`,`Enable `+n.overrideLabel(e.kind)+` for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(n.overrideLabel(e.kind)),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-label`,`Remove `+n.overrideLabel(e.kind)+` for `+e.pattern),M(3),F(e.message?10:-1),M(),F(e.key?11:-1)}}function lG(e,t){e&1&&(z(0,`li`,53),J(1,`No overrides.`),B())}function uG(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`DOM nodes hydrated`),B(),z(3,`dd`),J(4),B()(),z(5,`div`)(6,`dt`),J(7,`DOM nodes skipped`),B(),z(8,`dd`),J(9),B()(),z(10,`div`)(11,`dt`),J(12,`Mismatched components`),B(),z(13,`dd`),J(14),B()()),e&2){let e=t;M(4),Y(e.hydrated),M(5),Y(e.skipped),M(4),q(`bad`,e.mismatched>0),M(),Y(e.mismatched)}}function dG(e,t){if(e&1&&(z(0,`span`,123)(1,`span`,124),J(2,`Expected`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.expected)}}function fG(e,t){if(e&1&&(z(0,`span`,123)(1,`span`,124),J(2,`Actual`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.actual)}}function pG(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),P(3,dG,5,1,`span`,123),P(4,fG,5,1,`span`,123),B()),e&2){let e=t.$implicit;M(2),Y(`<`+e.component+`>`),M(),F(e.expected?3:-1),M(),F(e.actual?4:-1)}}function mG(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`ul`,122),I(3,pG,5,3,`li`,null,Cg),B()),e&2){let e=K();M(),X(`Mismatches (`,e.mismatches.length,`)`),M(2),L(e.mismatches)}}function hG(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B()()),e&2){let e=t.$implicit;M(2),Y(e)}}function gG(e,t){if(e&1&&(z(0,`h3`),J(1,`ngSkipHydration hosts`),B(),z(2,`ul`,125),I(3,hG,3,1,`li`,null,Cg),B()),e&2){let e=K();M(3),L(e.skipHydrationHosts)}}function _G(e,t){e&1&&(z(0,`h3`),J(1,`Warnings`),B(),z(2,`p`,56),J(3,` Not captured: add `),z(4,`code`),J(5,`providePangularHttp()`),B(),J(6,` to the app providers. `),B())}function vG(e,t){if(e&1&&(z(0,`pre`,126),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function yG(e,t){e&1&&(z(0,`p`,85),J(1,`No hydration warnings.`),B())}function bG(e,t){if(e&1&&(z(0,`h3`),J(1),B(),I(2,vG,2,1,`pre`,126,Cg,!1,yG,2,0,`p`,85)),e&2){let e=K();M(),X(`Warnings (`,e.warnings.length,`)`),M(),L(e.warnings)}}function xG(e,t){if(e&1&&(z(0,`dl`,84)(1,`div`)(2,`dt`),J(3,`Enabled`),B(),z(4,`dd`)(5,`span`,92),J(6),B()()(),z(7,`div`)(8,`dt`),J(9,`Hydrated components`),B(),z(10,`dd`),J(11),B()(),z(12,`div`)(13,`dt`),J(14,`Hydrated nodes`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Skipped components`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`App stable after`),B(),z(25,`dd`),J(26),B()(),z(27,`div`)(28,`dt`),J(29,`Incremental defer blocks`),B(),z(30,`dd`),J(31),B()(),P(32,uG,15,5),B(),P(33,mG,5,1),P(34,gG,5,0),P(35,_G,7,0)(36,bG,5,2)),e&2){let e,n=t;M(5),q(`on`,n.enabled)(`off-tag`,!n.enabled),M(),Y(n.enabled?`yes`:`no (client render only)`),M(5),Y(n.hydratedComponents??`n/a`),M(5),Y(n.hydratedNodes??`n/a`),M(5),Y(n.componentsSkippedHydration??`n/a`),M(5),Y(n.stableMs===void 0?`n/a`:n.stableMs+` ms`),M(5),Y(n.deferBlocksWithIncrementalHydration??`n/a`),M(),F((e=n.nodes)?32:-1,e),M(),F(n.mismatches?.length?33:-1),M(),F(n.skipHydrationHosts.length?34:-1),M(),F(n.warningsCaptured===!1?35:36)}}function SG(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No hydration data for this page.`),B(),z(3,`p`,56),J(4,`Open a server rendered page of the app to see its stats.`),B()())}function CG(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`No TransferState script: this page was not server rendered.`),B()())}function wG(e,t){if(e&1&&(z(0,`p`,128),J(1),B()),e&2){let e=K(2);M(),Y(e.error)}}function TG(e,t){e&1&&(z(0,`span`,92),J(1),B()),e&2&&(M(),Y(t))}function EG(e,t){if(e&1&&(z(0,`span`,92),J(1),B(),z(2,`span`,131),J(3),B()),e&2){let e=t,n=K().$implicit,r=K(3);q(`server`,r.statusTone(e.status)===`ok`)(`fault`,r.statusTone(e.status)===`bad`),M(),X(`HTTP `,e.status),M(2),Y(e.url??n.key)}}function DG(e,t){if(e&1&&(z(0,`span`,131),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.key)}}function OG(e,t){if(e&1){let e=W();z(0,`button`,104),G(`click`,function(){O(e);let t=K().$implicit;return k(K(3).editEntry(t))}),J(1,` Edit in SSR overrides `),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Edit in SSR overrides, key `+e.key)}}function kG(e,t){if(e&1){let e=W();z(0,`details`)(1,`summary`),V(2,`span`,130),P(3,TG,2,1,`span`,92),P(4,EG,4,6)(5,DG,2,1,`span`,131),z(6,`span`,132),J(7),B()(),z(8,`div`,133)(9,`span`,134),J(10,`Key`),B(),z(11,`code`,135),J(12),B(),z(13,`div`,136)(14,`button`,104),G(`click`,function(){let t=O(e).$implicit;return k(K(3).copyKey(t.key))}),J(15,` Copy `),B(),P(16,OG,2,1,`button`,102),B()(),z(17,`pre`,137),J(18),dv(19,`json`),B()()}if(e&2){let e,n,r=t.$implicit,i=K(3);M(3),F((e=i.payloadLabel(r))?3:-1,e),M(),F((n=r.http)?4:5,n),M(3),X(``,r.size,` B`),M(5),Y(r.key),M(2),N(`aria-label`,`Copy key `+r.key),M(2),F(i.canEditEntry(r)?16:-1),M(),N(`aria-label`,`Value of `+r.key),M(),Y(pv(19,8,r.value))}}function AG(e,t){if(e&1&&(z(0,`p`,127),J(1),B(),P(2,wG,2,1,`p`,128),z(3,`div`,129),I(4,kG,20,10,`details`,null,nW),B()),e&2){let e=K();M(),Y_(` `,e.entries.length,` entr`,e.entries.length===1?`y`:`ies`,`, `,e.size,` bytes `),M(),F(e.error?2:-1),M(2),L(e.entries)}}function jG(e,t){e&1&&P(0,CG,3,0,`div`,11)(1,AG,6,4),e&2&&F(+!!t.found)}function MG(e,t){e&1&&(z(0,`div`,11)(1,`p`),J(2,`Open a page of the app to see its payload.`),B()())}var NG={kind:`render-error`,pattern:``,message:``,key:``,value:``},PG={"render-error":`Render error`,"client-render":`Client render`,"state-edit":`TransferState edit`},FG={server:`Server`,prerender:`Prerender`,client:`Client`,redirect:`Redirect`,"not-rendered":`Not rendered`,unknown:`Unknown`},IG={pattern:``,method:``,target:`both`,status:``,delayMs:``,body:``};function LG(e){try{let t=new URL(e,`http://x`);return t.pathname+t.search}catch{return e}}var RG=/\[redacted\]|%5Bredacted%5D/gi;function zG(e){return(/^([a-z][a-z\d+.-]*:|\/\/)/i.test(e)?LG(e):e).replace(RG,`*`)}function BG(e){let t=VD(e);if(t!==null)return t;try{return JSON.parse(e),e.trim()}catch{return null}}var VG=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];function HG(e){try{return new URL(e,`http://x`).pathname}catch{return``}}function UG(e){let t=HG(e);return t===`/`?``:t}var WG=/\[redacted\]|%5Bredacted%5D/i,GG=200,KG=50,qG=500,JG=1e5,YG=[{value:``,label:`None`},...PT.map(([e,t])=>({value:String(e),label:`${e} ${t}`}))],XG=class e{rpc=$(null);canWrite=Q(()=>bE(this.rpc(),`http`));writesOff=KT(`http`);loading=j(!1);failed=j(!1);serverCalls=j([]);pages=j([]);payloads=j({});serverDropped=j(0);requests=j([]);rules=j([]);overrides=j([]);overrideDraft=j({...NG});overrideFromPayload=j(null);overrideKindOptions=[{value:`render-error`,label:`Render error`},{value:`client-render`,label:`Force Client render`},{value:`state-edit`,label:`Edit TransferState entry`}];overrideValueError=Q(()=>{let e=this.overrideDraft().value.trim();if(!e)return``;try{return JSON.parse(e),``}catch{return`The value must be valid JSON.`}});overrideReady=Q(()=>{let e=this.overrideDraft();return!e.pattern.trim()||this.overrides().length>=20?!1:e.kind!==`state-edit`||!!e.key.trim()&&!this.overrideValueError()});hostPageId=eE();selectedPageId=Tv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId)?.pageId??e[0]?.pageId??null});selectedCallId=j(null);draft=j({...IG});message=j(``);bodyPlaceholder=`{ "error": "Service unavailable" }`;statusOptions=YG;unsubscribe=[];destroyRef=E(Cs);injector=E(xs);host=E(Ml);selected=Q(()=>this.pages().find(e=>e.pageId===this.selectedPageId())??null);pageRequestId=Q(()=>this.selected()?.ssrRequestId??null);selectedRequestId=Tv(()=>this.pageRequestId());selectedPayload=Q(()=>{let e=this.selectedPageId();return e?this.payloads()[e]??null:null});maxCalls=Q(()=>yE(this.rpc()).limits.httpCalls);droppedCalls=Q(()=>(this.selected()?.dropped??0)+this.serverDropped());pageServerCalls=Q(()=>{let e=this.selected()?.initialUrl;return e?this.serverCalls().filter(t=>!t.pageUrl||t.pageUrl===e):this.serverCalls()});timeline=Q(()=>[...this.pageServerCalls(),...this.selected()?.calls??[]].sort((e,t)=>t.at-e.at));callQuery=j(``);sideFilter=j(`all`);failedOnly=j(!1);sideOptions=[{value:`all`,label:`All sides`},{value:`server`,label:`SSR`},{value:`client`,label:`Client`}];visibleCalls=Q(()=>{let e=this.callQuery().trim().toLowerCase(),t=this.sideFilter()??`all`,n=this.failedOnly();return this.timeline().filter(r=>(t===`all`||r.side===t)&&(!n||this.isFailed(r))&&(!e||`${r.method} ${r.url}`.toLowerCase().includes(e)||`${r.method} ${LG(r.url)}`.toLowerCase().includes(e)))});filterStatus=Q(()=>{this.callQuery(),this.sideFilter(),this.failedOnly(),this.filterFlip=!this.filterFlip;let e=Cv(()=>`${this.visibleCalls().length} of ${this.timeline().length}`);return this.filterFlip?`${e}\u00a0`:e});filterFlip=!0;selectedCall=Q(()=>this.visibleCalls().find(e=>e.id===this.selectedCallId())??null);selectedRequest=Q(()=>this.requests().find(e=>e.id===this.selectedRequestId())??null);requestCalls=Q(()=>{let e=this.selectedRequest()?.id;return e?this.serverCalls().filter(t=>t.requestId===e):[]});requestPage=Q(()=>{let e=this.selectedRequest()?.id;return e?this.pages().find(t=>t.ssrRequestId===e)??null:null});refetched=Q(()=>{let e=this.selectedRequest(),t=this.requestPage();if(!e||!t)return[];let n=new Set(this.requestCalls().filter(e=>e.status).map(e=>`${e.method} ${LG(e.url)}`));return t.calls.filter(t=>t.side===`client`&&!t.cacheHit&&!t.mocked&&t.at>=e.at&&n.has(`${t.method} ${LG(t.url)}`))});draftMocksOnServer=Q(()=>{let e=this.draftRule();return!!e&&this.mocksOnServer(e)});draftRule=Q(()=>{let e=this.draft(),t=e.pattern.trim();if(!t||t.length>qG||this.bodyError()||this.rules().length>=KG)return null;let n=e.body.trim(),r=Math.min(Math.max(Math.round(Number(e.delayMs))||0,0),1e4),i=e.status.trim()?Number(e.status):n?200:void 0;return i!==void 0&&!FT(i)||i===void 0&&!r?null:{pattern:t,enabled:!0,target:e.target,...e.method?{method:e.method}:{},...i===void 0?{}:{status:i},...r?{delayMs:r}:{},...n?{body:n}:{}}});draftHint=Q(()=>{let e=this.draft();return this.rules().length>=KG?`You can add up to ${KG} rules. Remove one to add another.`:e.pattern.trim()?e.pattern.trim().length>qG?`The URL pattern is limited to ${qG} characters.`:this.bodyError()?``:e.status.trim()&&!FT(Number(e.status))?`Pick a status from the list.`:this.draftRule()?!e.status.trim()&&e.body.trim()?`With no status, the mock body returns 200.`:``:`Set a status, a delay or a mock body.`:`Enter a URL pattern to add a rule.`});bodyError=Q(()=>{let e=this.draft().body.trim();if(!e)return``;if(e.length>JG)return`The mock body is limited to ${JG} characters.`;try{return JSON.parse(e),``}catch{return`The mock body must be valid JSON.`}});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.stopListening())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=e.scope(`pangular`).rpc,[n,r]=await Promise.all([t.sharedState(`http`),t.sharedState(`http-payloads`)]);if(this.destroyRef.destroyed)return;let i=e=>{let t=e;this.serverCalls.set(t?.serverCalls??[]),this.serverDropped.set(t?.serverDropped??0),this.requests.set([...t?.requests??[]].reverse()),this.pages.set(t?.pages??[]),this.rules.set(t?.rules??[]),this.overrides.set(t?.ssrOverrides??[])},a=e=>this.payloads.set(e?.pages??{});i(n.value()),a(r.value()),this.stopListening(),this.unsubscribe=[n.on(`updated`,i),r.on(`updated`,a)]}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}guardVerdict(e){return e.guards?.passed===!1?e.outcome===`redirected`?`redirected`:`rejected`:``}msLabel(e){return e===void 0?`n/a`:`${e} ms`}skipText(e){return NT[e]??``}refetchReason(e){let t=`${e.method} ${LG(e.url)}`,n=this.requestCalls().filter(e=>`${e.method} ${LG(e.url)}`===t),r=n[0];return r?.cacheSkip&&n.every(e=>e.cacheSkip===r.cacheSkip)?this.skipText(r.cacheSkip):``}compressedWith(e){if(e.compressedBeforeTrace)return e.headers[`content-encoding`]??`unknown encoding`}renderModeLabel(e){return FG[e]??`Unknown`}statusLabel(e){return e.cancelled?`cancelled`:e.status?String(e.status):`ERR`}callTone(e){return e.cancelled?`neutral`:this.statusTone(e.status)}isFailed(e){return!!e.cancelled||!e.status||e.status>=400}clearCallFilters(){this.callQuery.set(``),this.sideFilter.set(`all`),this.failedOnly.set(!1),this.host.nativeElement.querySelector(`#timeline-search`)?.focus()}rulePatternOf(e){return e.rulePattern?e.rulePattern:e.ruleId?this.rules().find(t=>t.id===e.ruleId)?.pattern??null:null}openCall(e){this.selectedCallId.set(e),Id(()=>this.host.nativeElement.querySelector(`#preview-heading`)?.focus(),{injector:this.injector})}previewText(e){if(e.preview!==void 0)return VD(e.preview)??e.preview}async copyPreview(e){let t=this.previewText(e);if(t)try{await navigator.clipboard.writeText(t),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}mockCall(e){let t=e.method.toUpperCase(),n=zG(e.url),r=e.error||!e.preview?null:BG(e.preview);this.draft.set({...IG,pattern:n,method:t,body:r??``});let i=`${t} ${n}`;this.message.set(r?`Filled in a rule for ${i} with the preview as its body. Check it, then add the rule.`:e.preview&&!e.error?`Filled in a rule for ${i}. The preview is not complete JSON, so it is not used as the body.`:`Filled in a rule for ${i}. Set a status, a delay or a body, then add the rule.`),Id(()=>this.host.nativeElement.querySelector(`#rule-pattern`)?.focus(),{injector:this.injector})}closePreview(){let e=this.selectedCallId();this.selectedCallId.set(null),e&&[...this.host.nativeElement.querySelectorAll(`button[data-call-id]`)].find(t=>t.dataset.callId===e)?.focus()}stopListening(){for(let e of this.unsubscribe.splice(0))e()}statusTone(e){return e===void 0?`neutral`:e===0||e>=400?`bad`:e>=300?`redirect`:e>=200?`ok`:`neutral`}mocksOnServer(e){return e.target!==`client`&&e.status!==void 0&&e.status<400}payloadLabel(e){return e.source===`hydration`?`hydration annotations`:e.fn?`Analog server function ${e.fn.name??e.fn.id}`:e.source===`analog`?`Analog`:null}targetLabel(e){return e===`both`?`SSR + client`:e===`server`?`SSR only`:`Client only`}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url})));methodOptions=Q(()=>{let e=this.draft().method;return[{value:``,label:`Any`},...(e&&!VG.includes(e)?[...VG,e]:VG).map(e=>({value:e,label:e}))]});targetOptions=[{value:`both`,label:`SSR + client`},{value:`server`,label:`SSR only`},{value:`client`,label:`Client only`}];selectPage(e){e&&this.selectedPageId.set(e),this.selectedCallId.set(null),this.overrideFromPayload.set(null)}setDraft(e,t){this.draft.update(n=>({...n,[e]:t}))}patch(e,t){let n=t.target.value;this.draft.update(t=>({...t,[e]:n}))}async addRule(e){e.preventDefault();let t=this.draftRule();if(!t)return;let n={id:`r${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,...t};await this.saveRules([...this.rules(),n],`Rule added.`,n)&&(this.draft.set({...IG}),this.host.nativeElement.querySelector(`#rule-pattern`)?.focus())}toggleRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Rule updated.`,t)}async removeRule(e){let t=this.rules().findIndex(t=>t.id===e);if(t<0)return;let n=this.rules().filter(t=>t.id!==e);await this.saveRules(n,`Rule removed.`,this.rules()[t])&&this.focusAfterRemove(`[data-remove-rule]`,t,`#rule-list-heading`)}async clearCalls(){try{await iE(this.rpc(),`clear-http-calls`),this.selectedCallId.set(null),this.message.set(`Timeline cleared.`)}catch{this.message.set(`Could not clear the timeline.`)}}overrideLabel(e){return PG[e]??e}setOverrideDraft(e,t){this.overrideDraft.update(n=>({...n,[e]:t})),e===`kind`&&t!==`state-edit`&&this.overrideFromPayload.set(null)}patchOverride(e,t){let n=t.target.value;this.overrideDraft.update(t=>({...t,[e]:n})),e===`key`&&this.overrideFromPayload.set(null)}async copyKey(e){try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`The clipboard is not available here.`)}}canEditEntry(e){let{key:t}=e;return this.canWrite()&&!!t&&t===t.trim()&&t.length<=GG&&!WG.test(t)}editEntry(e){if(!this.canEditEntry(e))return;let t=this.selected();this.overrideDraft.set({...NG,kind:`state-edit`,pattern:t?UG(t.initialUrl??t.url):``,key:e.key}),this.overrideFromPayload.set(e.http?`http`:`other`),this.message.set(`Editing the TransferState entry in SSR overrides.`),Id(()=>{let e=this.host.nativeElement.querySelector(this.overrideDraft().pattern?`#override-value`:`#override-pattern`);e?.scrollIntoView?.({block:`center`}),e?.focus()},{injector:this.injector})}async addOverride(e){if(e.preventDefault(),!this.overrideReady())return;let t=this.overrideDraft(),n={id:`o${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,kind:t.kind,pattern:t.pattern.trim(),enabled:!0,...t.kind===`render-error`&&t.message.trim()?{message:t.message.trim()}:{},...t.kind===`state-edit`?{key:t.key.trim()}:{},...t.kind===`state-edit`&&t.value.trim()?{value:t.value.trim()}:{}};await this.saveOverrides([...this.overrides(),n],`Override added. Reload the page.`)&&(this.overrideDraft.set({...NG,kind:t.kind}),this.overrideFromPayload.set(null),this.host.nativeElement.querySelector(`#override-pattern`)?.focus())}toggleOverride(e){this.saveOverrides(this.overrides().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Override updated. Reload the page.`)}async removeOverride(e){let t=this.overrides().findIndex(t=>t.id===e);if(t<0)return;let n=this.overrides().filter(t=>t.id!==e);await this.saveOverrides(n,`Override removed.`)&&this.focusAfterRemove(`[data-remove-override]`,t,`#override-list-heading`)}focusAfterRemove(e,t,n){Id(()=>{let r=this.host.nativeElement,i=r.querySelectorAll(e);(i[Math.min(t,i.length-1)]??r.querySelector(n))?.focus()},{injector:this.injector})}announce(e){if(this.message()!==e){this.message.set(e);return}this.message.set(``),Id(()=>{this.message()===``&&this.message.set(e)},{injector:this.injector})}async saveOverrides(e,t){try{let n=await iE(this.rpc(),`set-ssr-overrides`,e);return this.overrides.set(Array.isArray(n)?n:e),this.announce(t),!0}catch{return this.message.set(`Could not save the overrides.`),!1}}async saveRules(e,t,n){try{let r=await iE(this.rpc(),`set-http-rules`,e);return this.rules.set(Array.isArray(r)?r:e),this.announce(n.target===`client`?t:`${t} Reload the page to apply it to SSR.`),!0}catch{return this.message.set(`Could not save the rules.`),!1}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-network-inspector`]],inputs:{rpc:[1,`rpc`]},decls:128,vars:54,consts:[[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`,`error`],[1,`toolbar`],[1,`page-picker`],[`id`,`page-picker-label`],[`labelledBy`,`page-picker-label`,`emptyText`,`No connected page`,`placeholder`,`No connected page`,3,`valueChange`,`options`,`value`],[`type`,`button`,3,`click`,`disabled`],[`role`,`status`,1,`message`],[1,`grid`],[`aria-labelledby`,`ssr-heading`,1,`panel`,`wide`],[`id`,`ssr-heading`],[1,`empty`],[`aria-labelledby`,`timeline-heading`,1,`panel`,`wide`],[`id`,`timeline-heading`],[`what`,`HTTP calls`,`limit`,`httpCalls`,3,`dropped`,`max`],[`role`,`group`,`aria-label`,`Filter the HTTP timeline`,1,`filters`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`id`,`timeline-search`,`type`,`search`,`placeholder`,`Find a URL or method…`,`aria-label`,`Find a URL or method`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Side`,1,`side-filter`,3,`valueChange`,`options`,`value`],[1,`inline`,`failed-toggle`],[`type`,`checkbox`,3,`change`,`checked`],[1,`total`],[`role`,`status`,1,`sr-only`],[1,`table-wrap`],[`role`,`status`,1,`empty`,`no-match`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`],[`aria-labelledby`,`rules-heading`,1,`panel`],[`id`,`rules-heading`],[`id`,`http-writes-off`,1,`muted`,`small`],[`id`,`rule-form`,1,`rule-form`,3,`submit`],[1,`hint`],[`id`,`rule-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /api/products`,3,`input`,`value`],[1,`row`],[1,`field-group`],[`id`,`rule-method-label`],[`labelledBy`,`rule-method-label`,3,`valueChange`,`options`,`value`],[`id`,`rule-target-label`],[`labelledBy`,`rule-target-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`id`,`rule-status-label`],[`labelledBy`,`rule-status-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`0`,`max`,`10000`,`placeholder`,`0`,3,`input`,`value`],[`rows`,`3`,`spellcheck`,`false`,`aria-describedby`,`body-error`,3,`input`,`placeholder`,`value`],[`id`,`body-error`,1,`field-error`],[`id`,`rule-ssr-note`,1,`muted`,`small`],[`id`,`rule-hint`,1,`muted`,`small`],[1,`form-actions`],[`type`,`submit`,3,`disabled`],[`id`,`rule-list-heading`,`tabindex`,`-1`,1,`rules-heading`],[1,`rules`],[3,`off`],[1,`empty-rule`],[`aria-labelledby`,`overrides-heading`,1,`panel`],[`id`,`overrides-heading`],[1,`muted`,`small`],[1,`rule-form`,3,`submit`],[`id`,`override-kind-label`],[`labelledBy`,`override-kind-label`,3,`valueChange`,`describedBy`,`options`,`value`],[`id`,`override-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /examples/ssr`,3,`input`,`value`],[`id`,`override-kind-help`,1,`muted`,`small`],[`id`,`override-list-heading`,`tabindex`,`-1`,1,`rules-heading`],[`aria-labelledby`,`hydration-heading`,1,`panel`],[`id`,`hydration-heading`],[`aria-labelledby`,`payload-heading`,1,`panel`,`wide`],[`id`,`payload-heading`],[`aria-hidden`,`true`,1,`spinner`],[`scope`,`col`],[`scope`,`col`,1,`num`],[3,`selected`],[`id`,`ssr-detail`,`role`,`region`,`aria-labelledby`,`ssr-detail-heading`,1,`preview`],[3,`click`],[1,`url`],[`type`,`button`,`aria-controls`,`ssr-detail`,1,`link`,3,`title`],[1,`method`],[1,`status`],[`aria-hidden`,`true`,1,`dot`],[1,`num`],[1,`notes`],[1,`tag`,`server`],[1,`tag`,`mock`],[1,`tag`,`fault`],[`id`,`ssr-detail-heading`],[1,`stats`],[1,`muted`,`small`,`ok-note`],[1,`request-call`],[1,`muted`],[1,`stats`,`nav-stats`],[1,`preview-url`,3,`title`],[1,`tag`,3,`title`],[1,`muted`,`small`,`skip-reason`],[1,`tag`],[`type`,`button`,1,`link`,3,`title`],[1,`page-url`,3,`title`],[1,`tag`,`rule-ref`,3,`title`],[1,`empty-actions`],[`type`,`button`,3,`click`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`,3,`keydown.escape`],[1,`preview-head`],[`id`,`preview-heading`,`tabindex`,`-1`],[1,`preview-actions`],[`type`,`button`,1,`ghost`],[`type`,`button`,`aria-controls`,`rule-form`,1,`ghost`,3,`click`,`disabled`],[`type`,`button`,1,`ghost`,3,`click`],[1,`preview-meta`],[1,`preview-rule`],[`tabindex`,`0`,`role`,`region`,1,`preview-body`],[1,`inline`],[`type`,`checkbox`,3,`change`,`checked`,`disabled`],[1,`rule-pattern`,3,`title`],[1,`rule-method`],[`type`,`button`,`data-remove-rule`,``,1,`link`,`remove`,3,`click`,`disabled`],[1,`rule-meta`],[1,`status`,3,`ok`,`redirect`,`bad`],[1,`rule-note`],[`spellcheck`,`false`,`placeholder`,`Simulated render error`,`aria-describedby`,`override-kind-help`,3,`input`,`value`],[`id`,`override-key`,`spellcheck`,`false`,`autocomplete`,`off`,3,`input`,`value`],[`id`,`override-value`,`rows`,`3`,`spellcheck`,`false`,3,`input`,`value`],[`id`,`override-value-error`,1,`field-error`],[`id`,`override-value-note`,1,`muted`,`small`],[`type`,`button`,`data-remove-override`,``,1,`link`,`remove`,3,`click`,`disabled`],[1,`plain`,`mismatches`],[1,`mismatch-row`],[1,`mismatch-label`],[1,`plain`],[1,`warn`],[1,`muted`,`small`,`summary-line`],[`role`,`alert`,1,`bad`],[1,`entries`],[`aria-hidden`,`true`,1,`chevron`],[1,`entry-key`],[1,`entry-size`],[1,`entry-key-row`],[1,`entry-key-label`],[1,`entry-key-text`],[1,`entry-actions`],[`tabindex`,`0`,`role`,`region`]],template:function(e,t){if(e&1&&(P(0,rW,4,0,`div`,0)(1,iW,5,0,`div`,1),z(2,`div`,2)(3,`div`,3)(4,`span`,4),J(5,`Page`),B(),z(6,`app-select`,5),G(`valueChange`,function(e){return t.selectPage(e)}),B()(),z(7,`button`,6),G(`click`,function(){return t.clearCalls()}),J(8,` Clear timeline `),B(),z(9,`p`,7),J(10),B()(),z(11,`div`,8)(12,`section`,9)(13,`h2`,10),J(14),B(),P(15,AW,20,1)(16,jW,11,0,`div`,11),B(),z(17,`section`,12)(18,`h2`,13),J(19),B(),V(20,`app-limit-note`,14),z(21,`div`,15)(22,`div`,16),A(),z(23,`svg`,17),V(24,`circle`,18)(25,`path`,19),B(),ps(),z(26,`input`,20),G(`input`,function(e){return t.callQuery.set(e.target.value)})(`keydown.escape`,function(){return t.callQuery.set(``)}),B()(),z(27,`app-select`,21),ev(`valueChange`,function(e){return $_(t.sideFilter,e)||(t.sideFilter=e),e}),B(),z(28,`label`,22)(29,`input`,23),G(`change`,function(e){return t.failedOnly.set(e.target.checked)}),B(),J(30,` Failed only `),B(),z(31,`span`,24),J(32),B(),z(33,`span`,25),J(34),B()(),P(35,RW,21,0,`div`,26)(36,VW,9,1,`div`,27)(37,HW,11,0,`div`,11),P(38,GW,20,18,`div`,28),B(),z(39,`section`,29)(40,`h2`,30),J(41,`Fault injection`),B(),P(42,KW,2,1,`p`,31),z(43,`form`,32),G(`submit`,function(e){return t.addRule(e)}),z(44,`label`)(45,`span`),J(46,`URL pattern `),z(47,`span`,33),J(48,`(substring or * glob, ^ anchors the path)`),B()(),z(49,`input`,34),G(`input`,function(e){return t.patch(`pattern`,e)}),B()(),z(50,`div`,35)(51,`div`,36)(52,`span`,37),J(53,`Method`),B(),z(54,`app-select`,38),G(`valueChange`,function(e){return t.setDraft(`method`,e??``)}),B()(),z(55,`div`,36)(56,`span`,39),J(57,`Apply on`),B(),z(58,`app-select`,40),G(`valueChange`,function(e){return t.setDraft(`target`,e??`both`)}),B()()(),z(59,`div`,35)(60,`div`,36)(61,`span`,41),J(62,`Status`),B(),z(63,`app-select`,42),G(`valueChange`,function(e){return t.setDraft(`status`,e??``)}),B()(),z(64,`label`),J(65,` Delay (ms) `),z(66,`input`,43),G(`input`,function(e){return t.patch(`delayMs`,e)}),B()()(),z(67,`label`)(68,`span`),J(69,`Mock JSON body `),z(70,`span`,33),J(71,`(optional)`),B()(),z(72,`textarea`,44),G(`input`,function(e){return t.patch(`body`,e)}),B()(),z(73,`p`,45),J(74),B(),P(75,qW,2,0,`p`,46),z(76,`p`,47),J(77),B(),z(78,`div`,48)(79,`button`,49),J(80,` Add rule `),B()()(),z(81,`h3`,50),J(82),B(),z(83,`ul`,51),I(84,$W,17,17,`li`,52,$U,!1,eG,2,0,`li`,53),B()(),z(87,`section`,54)(88,`h2`,55),J(89,`SSR overrides`),B(),z(90,`p`,56),J(91,` Development only. These change what the server sends for matching pages, from the next full page load, and the request is marked `),z(92,`strong`),J(93,`overridden`),B(),J(94,`. `),B(),z(95,`form`,57),G(`submit`,function(e){return t.addOverride(e)}),z(96,`div`,36)(97,`span`,58),J(98,`Override`),B(),z(99,`app-select`,59),G(`valueChange`,function(e){return t.setOverrideDraft(`kind`,e??`render-error`)}),B()(),z(100,`label`)(101,`span`),J(102,`Page pattern `),z(103,`span`,33),J(104,`(substring or * glob, ^ anchors the path)`),B()(),z(105,`input`,60),G(`input`,function(e){return t.patchOverride(`pattern`,e)}),B()(),P(106,tG,8,1)(107,iG,12,6)(108,aG,11,0,`p`,61),z(109,`div`,48)(110,`button`,49),J(111,` Add override `),B()()(),z(112,`h3`,62),J(113),B(),z(114,`ul`,51),I(115,cG,12,12,`li`,52,$U,!1,lG,2,0,`li`,53),B()(),z(118,`section`,63)(119,`h2`,64),J(120,`Hydration`),B(),P(121,xG,37,14)(122,SG,5,0,`div`,11),B(),z(123,`section`,65)(124,`h2`,66),J(125,`TransferState payload`),B(),P(126,jG,2,1)(127,MG,3,0,`div`,11),B()()),e&2){let e,n,r,i;F(t.loading()?0:t.failed()?1:-1),M(6),R(`options`,t.pageOptions())(`value`,t.selected()?.pageId??null),M(),R(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),Y(t.message()),M(4),X(`SSR requests (`,t.requests().length,`)`),M(),F(t.requests().length?15:16),M(4),X(`HTTP timeline (`,t.timeline().length,`)`),M(),R(`dropped`,t.droppedCalls())(`max`,t.maxCalls()),M(),q(`no-calls`,!t.timeline().length),M(5),R(`value`,t.callQuery()),M(),R(`options`,t.sideOptions),Q_(`value`,t.sideFilter),M(2),R(`checked`,t.failedOnly()),M(3),Z(``,t.visibleCalls().length,` of `,t.timeline().length),M(2),Y(t.filterStatus()),M(),F(t.visibleCalls().length?35:t.timeline().length?36:37),M(3),F((e=t.selectedCall())?38:-1,e),M(4),F(t.canWrite()?-1:42),M(7),R(`value`,t.draft().pattern),M(5),R(`options`,t.methodOptions())(`value`,t.draft().method),M(4),R(`describedBy`,t.draftMocksOnServer()?`rule-ssr-note`:``)(`options`,t.targetOptions)(`value`,t.draft().target),M(5),R(`describedBy`,t.draftMocksOnServer()?`rule-ssr-note`:``)(`options`,t.statusOptions)(`value`,t.draft().status),M(3),R(`value`,t.draft().delayMs),M(6),R(`placeholder`,t.bodyPlaceholder)(`value`,t.draft().body),N(`aria-invalid`,t.bodyError()?`true`:null),M(2),Y(t.bodyError()),M(),F(t.draftMocksOnServer()?75:-1),M(2),Y(t.draftHint()),M(2),R(`disabled`,!t.canWrite()||!t.draftRule()),N(`aria-describedby`,t.canWrite()?`rule-hint`:`http-writes-off`),M(3),X(` Rules (`,t.rules().length,`) `),M(2),L(t.rules()),M(15),R(`describedBy`,t.overrideDraft().kind===`state-edit`?``:`override-kind-help`)(`options`,t.overrideKindOptions)(`value`,t.overrideDraft().kind),M(6),R(`value`,t.overrideDraft().pattern),M(),F((n=t.overrideDraft().kind)===`render-error`?106:n===`state-edit`?107:n===`client-render`?108:-1),M(4),R(`disabled`,!t.canWrite()||!t.overrideReady()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),X(` Overrides (`,t.overrides().length,`) `),M(2),L(t.overrides()),M(6),F((r=t.selected()?.hydration)?121:122,r),M(5),F((i=t.selectedPayload())?126:127,i)}},dependencies:[WD,jD,ab],styles:[`@charset "UTF-8";
[_nghost-%COMP%] {
display: block;
color: var(--%NS%text);
@@ -12819,7 +12829,7 @@ summary[_ngcontent-%COMP%]:hover .entry-key[_ngcontent-%COMP%] {
.message[_ngcontent-%COMP%] {
text-align: left;
}
-}`]})};function KG(e,t){e&1&&(A(),H(0,`svg`,9),Fg(1,`path`,20),U())}function qG(e,t){e&1&&(A(),H(0,`svg`,10)(1,`defs`)(2,`linearGradient`,21),Fg(3,`stop`,22)(4,`stop`,23),U()(),Fg(5,`path`,24),H(6,`g`,25),Fg(7,`path`,26)(8,`path`,27)(9,`path`,28)(10,`path`,29),U()())}function JG(e,t){e&1&&(A(),H(0,`svg`,11),Fg(1,`path`,30)(2,`path`,31)(3,`path`,32)(4,`path`,33),U())}function YG(e,t){e&1&&(A(),H(0,`svg`,9),Fg(1,`path`,34)(2,`path`,35)(3,`path`,36)(4,`path`,37)(5,`path`,38)(6,`path`,39),U())}function XG(e,t){if(e&1&&(H(0,`a`,16)(1,`span`,40)(2,`strong`),J(3),U()(),H(4,`span`,41),J(5,`→`),U(),H(6,`span`,42),J(7,`(opens in a new tab)`),U()()),e&2){let e=t;Vg(`href`,e.href,ku),M(3),Y(e.label)}}function ZG(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit,n=t.$index;C_(`animation-delay`,200+n*120,`ms`),M(),Y(e)}}var QG=class e{info=$.required();plansTitle=Q(()=>{let e=this.info();return e.plansTitle??(e.link?`In an ${e.name} app`:`On the roadmap`)});static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-coming-soon`]],hostVars:2,hostBindings:function(e,t){e&2&&C_(`--%NS%brand`,t.info().color)},inputs:{info:[1,`info`]},decls:29,vars:6,consts:[[`aria-labelledby`,`soon-title`,1,`soon`],[`aria-hidden`,`true`,1,`stage`],[1,`ring`,`r1`],[1,`ring`,`r2`],[1,`orbit`,`o1`],[1,`dot`],[1,`orbit`,`o2`],[1,`orbit`,`o3`],[1,`logo`],[`viewBox`,`0 0 256 256`,`width`,`96`,`height`,`96`],[`viewBox`,`0 0 32 32`,`width`,`88`,`height`,`88`],[`viewBox`,`0 0 256 182`,`width`,`104`,`height`,`74`],[1,`badge`],[`aria-hidden`,`true`,1,`spark`],[`id`,`soon-title`],[1,`summary`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,`cta`,3,`href`],[1,`plans-title`],[1,`plans`],[3,`animation-delay`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`id`,`an-hero-grad`,`x1`,`0`,`y1`,`0`,`x2`,`1`,`y2`,`1`],[`offset`,`0`,`stop-color`,`#f0224f`],[`offset`,`1`,`stop-color`,`#c4002d`],[`d`,`M16 0C27.2 0 32 4.8 32 16S27.2 32 16 32 0 27.2 0 16 4.8 0 16 0Z`,`fill`,`url(#an-hero-grad)`],[`transform`,`translate(6.4 6.4) scale(0.8)`,`fill`,`#fff`],[`d`,`M14.8486 0L23.138 16.8551L23.9996 3.99892L14.8486 0Z`],[`d`,`M16.9875 17.7114H7.01272L5.73926 20.627L12.0001 24L18.261 20.627L16.9875 17.7114Z`],[`d`,`M8.72168 13.9298H15.2812L11.9997 6.39575L8.72168 13.9298Z`],[`d`,`M9.15103 0L0 3.99892L0.861556 16.8551L9.15103 0Z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[1,`who`],[`aria-hidden`,`true`,1,`go`],[1,`sr-only`]],template:function(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,1),Fg(2,`span`,2)(3,`span`,3),H(4,`span`,4),Fg(5,`span`,5),U(),H(6,`span`,6),Fg(7,`span`,5),U(),H(8,`span`,7),Fg(9,`span`,5),U(),H(10,`div`,8),P(11,KG,2,0,`:svg:svg`,9)(12,qG,11,0,`:svg:svg`,10)(13,JG,5,0,`:svg:svg`,11)(14,YG,7,0,`:svg:svg`,9),U()(),H(15,`p`,12)(16,`span`,13),J(17,`✦`),U(),J(18),U(),H(19,`h2`,14),J(20),U(),H(21,`p`,15),J(22),U(),P(23,XG,8,2,`a`,16),H(24,`h3`,17),J(25),U(),H(26,`ul`,18),I(27,ZG,2,3,`li`,19,wg),U()()),e&2){let e,n;M(11),F((e=t.info().id)===`nativescript`?11:e===`angular-native`?12:e===`analog`?13:e===`capacitor`?14:-1),M(7),X(` `,t.info().badge),M(2),Y(t.info().heading),M(2),Y(t.info().summary),M(),F((n=t.info().link)?23:-1,n),M(2),X(` `,t.plansTitle(),` `),M(2),L(t.info().plans)}},styles:[`[_nghost-%COMP%] {
+}`]})};function ZG(e,t){e&1&&(A(),H(0,`svg`,9),Fg(1,`path`,20),U())}function QG(e,t){e&1&&(A(),H(0,`svg`,10)(1,`defs`)(2,`linearGradient`,21),Fg(3,`stop`,22)(4,`stop`,23),U()(),Fg(5,`path`,24),H(6,`g`,25),Fg(7,`path`,26)(8,`path`,27)(9,`path`,28)(10,`path`,29),U()())}function $G(e,t){e&1&&(A(),H(0,`svg`,11),Fg(1,`path`,30)(2,`path`,31)(3,`path`,32)(4,`path`,33),U())}function eK(e,t){e&1&&(A(),H(0,`svg`,9),Fg(1,`path`,34)(2,`path`,35)(3,`path`,36)(4,`path`,37)(5,`path`,38)(6,`path`,39),U())}function tK(e,t){if(e&1&&(H(0,`a`,16)(1,`span`,40)(2,`strong`),J(3),U()(),H(4,`span`,41),J(5,`→`),U(),H(6,`span`,42),J(7,`(opens in a new tab)`),U()()),e&2){let e=t;Vg(`href`,e.href,ku),M(3),Y(e.label)}}function nK(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit,n=t.$index;C_(`animation-delay`,200+n*120,`ms`),M(),Y(e)}}var rK=class e{info=$.required();plansTitle=Q(()=>{let e=this.info();return e.plansTitle??(e.link?`In an ${e.name} app`:`On the roadmap`)});static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-coming-soon`]],hostVars:2,hostBindings:function(e,t){e&2&&C_(`--%NS%brand`,t.info().color)},inputs:{info:[1,`info`]},decls:29,vars:6,consts:[[`aria-labelledby`,`soon-title`,1,`soon`],[`aria-hidden`,`true`,1,`stage`],[1,`ring`,`r1`],[1,`ring`,`r2`],[1,`orbit`,`o1`],[1,`dot`],[1,`orbit`,`o2`],[1,`orbit`,`o3`],[1,`logo`],[`viewBox`,`0 0 256 256`,`width`,`96`,`height`,`96`],[`viewBox`,`0 0 32 32`,`width`,`88`,`height`,`88`],[`viewBox`,`0 0 256 182`,`width`,`104`,`height`,`74`],[1,`badge`],[`aria-hidden`,`true`,1,`spark`],[`id`,`soon-title`],[1,`summary`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,`cta`,3,`href`],[1,`plans-title`],[1,`plans`],[3,`animation-delay`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`id`,`an-hero-grad`,`x1`,`0`,`y1`,`0`,`x2`,`1`,`y2`,`1`],[`offset`,`0`,`stop-color`,`#f0224f`],[`offset`,`1`,`stop-color`,`#c4002d`],[`d`,`M16 0C27.2 0 32 4.8 32 16S27.2 32 16 32 0 27.2 0 16 4.8 0 16 0Z`,`fill`,`url(#an-hero-grad)`],[`transform`,`translate(6.4 6.4) scale(0.8)`,`fill`,`#fff`],[`d`,`M14.8486 0L23.138 16.8551L23.9996 3.99892L14.8486 0Z`],[`d`,`M16.9875 17.7114H7.01272L5.73926 20.627L12.0001 24L18.261 20.627L16.9875 17.7114Z`],[`d`,`M8.72168 13.9298H15.2812L11.9997 6.39575L8.72168 13.9298Z`],[`d`,`M9.15103 0L0 3.99892L0.861556 16.8551L9.15103 0Z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[1,`who`],[`aria-hidden`,`true`,1,`go`],[1,`sr-only`]],template:function(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,1),Fg(2,`span`,2)(3,`span`,3),H(4,`span`,4),Fg(5,`span`,5),U(),H(6,`span`,6),Fg(7,`span`,5),U(),H(8,`span`,7),Fg(9,`span`,5),U(),H(10,`div`,8),P(11,ZG,2,0,`:svg:svg`,9)(12,QG,11,0,`:svg:svg`,10)(13,$G,5,0,`:svg:svg`,11)(14,eK,7,0,`:svg:svg`,9),U()(),H(15,`p`,12)(16,`span`,13),J(17,`✦`),U(),J(18),U(),H(19,`h2`,14),J(20),U(),H(21,`p`,15),J(22),U(),P(23,tK,8,2,`a`,16),H(24,`h3`,17),J(25),U(),H(26,`ul`,18),I(27,nK,2,3,`li`,19,wg),U()()),e&2){let e,n;M(11),F((e=t.info().id)===`nativescript`?11:e===`angular-native`?12:e===`analog`?13:e===`capacitor`?14:-1),M(7),X(` `,t.info().badge),M(2),Y(t.info().heading),M(2),Y(t.info().summary),M(),F((n=t.info().link)?23:-1,n),M(2),X(` `,t.plansTitle(),` `),M(2),L(t.info().plans)}},styles:[`[_nghost-%COMP%] {
display: block;
min-height: 100%;
background: radial-gradient(60% 50% at 50% 18%, color-mix(in srgb, var(--%NS%brand) 22%, transparent), transparent 70%);
@@ -13165,9 +13175,9 @@ h2[_ngcontent-%COMP%] {
.author[_ngcontent-%COMP%]:hover .go[_ngcontent-%COMP%] {
transform: none;
}
-}`]})},$G=new Set([`CapacitorCookies`,`CapacitorHttp`,`SystemBars`,`WebView`]);function eK(e){return e==null?`Unknown`:e?`Yes`:`No`}function tK(e,t){let n=t.size?Math.max(...t.values())+1:0;for(let r of e)t.has(r.pageId)||t.set(r.pageId,n++);let r=new Set(e.map(e=>e.pageId));for(let e of t.keys())r.has(e)||t.delete(e);return[...e].sort((e,n)=>t.get(e.pageId)-t.get(n.pageId))}function nK(e,t){let n=[...e].sort((e,t)=>t.reportedAt-e.reportedAt);return e.find(e=>e.pageId===t)?.pageId??n.find(e=>e.info.bridge)?.pageId??n[0]?.pageId??null}var rK=new WeakMap;function iK(e){let t=e.calls;if(Array.isArray(t))return e;let n=rK.get(e);if(!n){let r=Object.values(t??{}).filter(e=>!!e&&typeof e.id==`number`);n={...e,calls:r.sort((e,t)=>e.id-t.id)},rK.set(e,n)}return n}function aK(e){let t=e?.pages;return!t||typeof t!=`object`?[]:Object.values(t).filter(e=>e&&typeof e.pageId==`string`&&!!e.info).map(iK).sort((e,t)=>t.reportedAt-e.reportedAt)}function oK(e){let t=e.error;return!!t&&(t.code===`UNIMPLEMENTED`||/not implemented/i.test(t.message))}function sK(e,t){return e.durationMs===void 0?e.status===`pending`?Math.max(0,t-e.startedAt):0:e.durationMs}function cK(e,t,n){return t===`failed`?e.status===`error`:t===`pending`?e.status===`pending`:t!==`slow`||sK(e,n)>=500}function lK(e){if(e<1e3)return`${Math.max(0,Math.round(e))} ms`;let t=Math.round(e/1e3);if(t<60)return`${t} s`;let n=Math.round(t/60);return n<60?`${n} min`:`${Math.round(n/60)} h`}function uK(e,t){let n=t-e;return n<1e3?`just now`:`${lK(n)} ago`}function dK(e,t){return $G.has(e.name)?null:e.registered===!0&&!e.available?t===`android`||t===`ios`?{before:`Not available on ${t}. Run `,command:`npx cap sync ${t}`,after:`, then run the app again.`}:{before:`Not available here. Run `,command:`npx cap sync`,after:` if it should be native.`}:e.native&&e.registered===!1?{before:`Installed, not imported by the app.`}:null}function fK(e,t){let n=e.info,r=n=>e.calls.filter(e=>cK(e,n,t)).length,i=n.env.capacitorHttp;return{pageId:e.pageId,platform:n.platform,native:n.native,logsCalls:n.bridge||n.webCalls,calls:e.calls.length,failed:r(`failed`),slow:r(`slow`),pending:r(`pending`),capacitorHttp:i===null?`Unknown`:i?`On`:`Off`,hints:n.plugins.filter(e=>dK(e,n.platform)).length}}function pK(e){let t=new Map;for(let n of e){if(n.removed)continue;let e=`${n.plugin} ${n.event}`;t.set(e,(t.get(e)??0)+1)}return t}var mK=/^[A-Za-z_$][\w$]*$/;function hK(e,t=``){if(e===void 0)return`undefined`;if(typeof e!=`object`||!e)return JSON.stringify(e)??String(e);let n=`${t} `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+hK(e,n)).join(`,
-`)},\n${t}]`:`[]`;let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${mK.test(e)?e:JSON.stringify(e)}: ${hK(t,n)}`).join(`,
-`)},\n${t}}`:`{}`}function gK(e){let t=mK.test(e.plugin)?e.plugin:`Capacitor.Plugins[${JSON.stringify(e.plugin)}]`,n=mK.test(e.method)?`.${e.method}`:`[${JSON.stringify(e.method)}]`,r=e.args===void 0?[]:[hK(e.args)];return e.kind===`callback`&&(r.length||r.push(`{}`),r.push(`(result, error) => {}`)),`await ${t}${n}(${r.join(`, `)});`}function _K(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e,null,2)??`undefined`}catch{return String(e)}}function vK(e,t=120){let n;try{n=JSON.stringify(e)??`undefined`}catch{n=String(e)}return n.length>t?`${n.slice(0,t-1)}…`:n}function yK(e,t){if(e&1){let e=W();H(0,`button`,8),Qg(`click`,function(){let t=O(e).$implicit;return k(K().tab.set(t))}),J(1),U()}if(e&2){let e=t.$implicit,n=K();Vg(`id`,`cap-tab-`+e),N(`aria-selected`,n.tab()===e)(`aria-controls`,`cap-panel-`+e)(`tabindex`,n.tab()===e?0:-1),M(),X(` `,n.tabLabel(e),` `)}}function bK(e,t){e&1&&(H(0,`p`,9),J(1,`No arguments.`),U())}function xK(e,t){if(e&1&&(H(0,`pre`,10),J(1),U()),e&2){let e=K(2),t=iv(0);M(),Y(e.json(t.args))}}function SK(e,t){e&1&&P(0,bK,2,0,`p`,9)(1,xK,2,1,`pre`,10),e&2&&(K(),F(iv(0).args===void 0?0:1))}function CK(e,t){if(e&1&&(H(0,`code`),J(1),U()),e&2){let e=K();M(),Y(e.code)}}function wK(e,t){if(e&1&&(H(0,`p`,11),P(1,CK,2,1,`code`),J(2),U()),e&2){let e=t;M(),F(e.code?1:-1),M(),X(` `,e.message,` `)}}function TK(e,t){e&1&&(H(0,`p`,9),J(1,`No answer yet.`),U())}function EK(e,t){if(e&1&&(H(0,`p`,9),J(1),U()),e&2){K(3);let e=iv(0);M(),X(`The latest of `,e.callbacks,` callbacks.`)}}function DK(e,t){e&1&&(H(0,`p`,9),J(1,`Resolved without a value.`),U())}function OK(e,t){if(e&1&&(H(0,`pre`,12),J(1),U()),e&2){let e=K(3),t=iv(0);M(),Y(e.json(t.result))}}function kK(e,t){if(e&1&&(P(0,EK,2,1,`p`,9),P(1,DK,2,0,`p`,9)(2,OK,2,1,`pre`,12)),e&2){K(2);let e=iv(0);F(e.callbacks&&e.callbacks>1?0:-1),M(),F(e.result===void 0?1:2)}}function AK(e,t){if(e&1&&P(0,wK,3,2,`p`,11)(1,TK,2,0,`p`,9)(2,kK,3,2),e&2){let e;K();let t=iv(0);F((e=t.error)?0:t.status===`pending`?1:2,e)}}function jK(e,t){if(e&1&&(H(0,`div`)(1,`dt`),J(2,`Callbacks`),U(),H(3,`dd`),J(4),U()()),e&2){K(2);let e=iv(0);M(4),Y(e.callbacks??0)}}function MK(e,t){if(e&1&&(H(0,`dl`)(1,`div`)(2,`dt`),J(3,`Started`),U(),H(4,`dd`),J(5),U()(),H(6,`div`)(7,`dt`),J(8,`Finished`),U(),H(9,`dd`),J(10),U()(),H(11,`div`)(12,`dt`),J(13),U(),H(14,`dd`),J(15),U()(),P(16,jK,5,1,`div`),U()),e&2){let e=K(),t=iv(0);M(5),Y(e.time(t.startedAt)),M(5),X(` `,t.durationMs===void 0?`Not yet`:e.time(t.startedAt+t.durationMs),` `),M(3),Y(t.status===`pending`?`Waiting for`:`Duration`),M(2),Y(e.span(e.took(t,e.now()))),M(),F(t.kind===`callback`?16:-1)}}var NK=[`args`,`outcome`,`timing`],PK=class e{call=$.required();now=$.required();announce=Ov();host=E(Ml);tab=j(`args`);tabOrder=NK;json=_K;time=zD;span=lK;took=sK;statusText=Q(()=>{let e=this.call();return e.status===`pending`?`Pending`:e.status===`ok`?`OK`:oK(e)?`Not implemented`:`Error`});panelHasFocusable=Q(()=>{let e=this.call();return this.tab()===`args`?e.args!==void 0:this.tab()===`outcome`&&!e.error&&e.status===`ok`&&e.result!==void 0});tabLabel(e){return e===`args`?`Arguments`:e===`timing`?`Timing`:this.call().status===`error`?`Error`:`Result`}onTabKey(e){let t=NK.indexOf(this.tab()),n;if(e.key===`ArrowRight`)n=(t+1)%NK.length;else if(e.key===`ArrowLeft`)n=(t-1+NK.length)%NK.length;else if(e.key===`Home`)n=0;else if(e.key===`End`)n=NK.length-1;else return;e.preventDefault();let r=NK[n];this.tab.set(r),this.host.nativeElement.querySelector(`#cap-tab-${r}`)?.focus()}async copy(e){let t=this.call(),n=`${t.plugin}.${t.method}()`,r=e===`json`?_K(t):gK(t);try{await navigator.clipboard.writeText(r),this.announce.emit(`Copied ${n} as ${e===`json`?`JSON`:`code`}.`)}catch{this.announce.emit(`The clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-call-detail`]],inputs:{call:[1,`call`],now:[1,`now`]},outputs:{announce:`announce`},decls:19,vars:10,consts:[[`id`,`cap-detail`,`aria-labelledby`,`cap-detail-title`,1,`detail`],[`id`,`cap-detail-title`],[1,`meta`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`],[`role`,`tablist`,`aria-label`,`Call details`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`muted`],[`tabindex`,`0`,`aria-label`,`Arguments`],[1,`error-text`],[`tabindex`,`0`,`aria-label`,`Result`]],template:function(e,t){if(e&1&&(nv(0),H(1,`section`,0)(2,`h3`,1)(3,`code`),J(4),U()(),H(5,`p`,2),J(6),U(),H(7,`div`,3)(8,`button`,4),Qg(`click`,function(){return t.copy(`json`)}),J(9,`Copy as JSON`),U(),H(10,`button`,4),Qg(`click`,function(){return t.copy(`code`)}),J(11,`Copy as code`),U()(),H(12,`div`,5),Qg(`keydown`,function(e){return t.onTabKey(e)}),I(13,yK,2,5,`button`,6,wg),U(),H(15,`div`,7),P(16,SK,2,1)(17,AK,3,1)(18,MK,17,5,`dl`),U()()),e&2){let e,n=rv(t.call());M(4),Z(``,n.plugin,`.`,n.method,`()`),M(2),Y_(` `,t.statusText(),`, `,n.via,`, `,n.kind===`callback`?`stream`:`promise`,` `),M(7),L(t.tabOrder),M(2),Vg(`id`,`cap-panel-`+t.tab()),N(`aria-labelledby`,`cap-tab-`+t.tab())(`tabindex`,t.panelHasFocusable()?null:0),M(),F((e=t.tab())===`args`?16:e===`outcome`?17:e===`timing`?18:-1)}},styles:[`.detail[_ngcontent-%COMP%] {
+}`]})},iK=new Set([`CapacitorCookies`,`CapacitorHttp`,`SystemBars`,`WebView`]);function aK(e){return e==null?`Unknown`:e?`Yes`:`No`}function oK(e,t){let n=t.size?Math.max(...t.values())+1:0;for(let r of e)t.has(r.pageId)||t.set(r.pageId,n++);let r=new Set(e.map(e=>e.pageId));for(let e of t.keys())r.has(e)||t.delete(e);return[...e].sort((e,n)=>t.get(e.pageId)-t.get(n.pageId))}function sK(e,t){let n=[...e].sort((e,t)=>t.reportedAt-e.reportedAt);return e.find(e=>e.pageId===t)?.pageId??n.find(e=>e.info.bridge)?.pageId??n[0]?.pageId??null}var cK=new WeakMap;function lK(e){let t=e.calls;if(Array.isArray(t))return e;let n=cK.get(e);if(!n){let r=Object.values(t??{}).filter(e=>!!e&&typeof e.id==`number`);n={...e,calls:r.sort((e,t)=>e.id-t.id)},cK.set(e,n)}return n}function uK(e){let t=e?.pages;return!t||typeof t!=`object`?[]:Object.values(t).filter(e=>e&&typeof e.pageId==`string`&&!!e.info).map(lK).sort((e,t)=>t.reportedAt-e.reportedAt)}function dK(e){let t=e.error;return!!t&&(t.code===`UNIMPLEMENTED`||/not implemented/i.test(t.message))}function fK(e,t){return e.durationMs===void 0?e.status===`pending`?Math.max(0,t-e.startedAt):0:e.durationMs}function pK(e,t,n){return t===`failed`?e.status===`error`:t===`pending`?e.status===`pending`:t!==`slow`||fK(e,n)>=500}function mK(e){if(e<1e3)return`${Math.max(0,Math.round(e))} ms`;let t=Math.round(e/1e3);if(t<60)return`${t} s`;let n=Math.round(t/60);return n<60?`${n} min`:`${Math.round(n/60)} h`}function hK(e,t){let n=t-e;return n<1e3?`just now`:`${mK(n)} ago`}function gK(e,t){return iK.has(e.name)?null:e.registered===!0&&!e.available?t===`android`||t===`ios`?{before:`Not available on ${t}. Run `,command:`npx cap sync ${t}`,after:`, then run the app again.`}:{before:`Not available here. Run `,command:`npx cap sync`,after:` if it should be native.`}:e.native&&e.registered===!1?{before:`Installed, not imported by the app.`}:null}function _K(e,t){let n=e.info,r=n=>e.calls.filter(e=>pK(e,n,t)).length,i=n.env.capacitorHttp;return{pageId:e.pageId,platform:n.platform,native:n.native,logsCalls:n.bridge||n.webCalls,calls:e.calls.length,failed:r(`failed`),slow:r(`slow`),pending:r(`pending`),capacitorHttp:i===null?`Unknown`:i?`On`:`Off`,hints:n.plugins.filter(e=>gK(e,n.platform)).length}}function vK(e){let t=new Map;for(let n of e){if(n.removed)continue;let e=`${n.plugin} ${n.event}`;t.set(e,(t.get(e)??0)+1)}return t}var yK=/^[A-Za-z_$][\w$]*$/;function bK(e,t=``){if(e===void 0)return`undefined`;if(typeof e!=`object`||!e)return JSON.stringify(e)??String(e);let n=`${t} `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+bK(e,n)).join(`,
+`)},\n${t}]`:`[]`;let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${yK.test(e)?e:JSON.stringify(e)}: ${bK(t,n)}`).join(`,
+`)},\n${t}}`:`{}`}function xK(e){let t=yK.test(e.plugin)?e.plugin:`Capacitor.Plugins[${JSON.stringify(e.plugin)}]`,n=yK.test(e.method)?`.${e.method}`:`[${JSON.stringify(e.method)}]`,r=e.args===void 0?[]:[bK(e.args)];return e.kind===`callback`&&(r.length||r.push(`{}`),r.push(`(result, error) => {}`)),`await ${t}${n}(${r.join(`, `)});`}function SK(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e,null,2)??`undefined`}catch{return String(e)}}function CK(e,t=120){let n;try{n=JSON.stringify(e)??`undefined`}catch{n=String(e)}return n.length>t?`${n.slice(0,t-1)}…`:n}function wK(e,t){if(e&1){let e=W();H(0,`button`,8),Qg(`click`,function(){let t=O(e).$implicit;return k(K().tab.set(t))}),J(1),U()}if(e&2){let e=t.$implicit,n=K();Vg(`id`,`cap-tab-`+e),N(`aria-selected`,n.tab()===e)(`aria-controls`,`cap-panel-`+e)(`tabindex`,n.tab()===e?0:-1),M(),X(` `,n.tabLabel(e),` `)}}function TK(e,t){e&1&&(H(0,`p`,9),J(1,`No arguments.`),U())}function EK(e,t){if(e&1&&(H(0,`pre`,10),J(1),U()),e&2){let e=K(2),t=iv(0);M(),Y(e.json(t.args))}}function DK(e,t){e&1&&P(0,TK,2,0,`p`,9)(1,EK,2,1,`pre`,10),e&2&&(K(),F(iv(0).args===void 0?0:1))}function OK(e,t){if(e&1&&(H(0,`code`),J(1),U()),e&2){let e=K();M(),Y(e.code)}}function kK(e,t){if(e&1&&(H(0,`p`,11),P(1,OK,2,1,`code`),J(2),U()),e&2){let e=t;M(),F(e.code?1:-1),M(),X(` `,e.message,` `)}}function AK(e,t){e&1&&(H(0,`p`,9),J(1,`No answer yet.`),U())}function jK(e,t){if(e&1&&(H(0,`p`,9),J(1),U()),e&2){K(3);let e=iv(0);M(),X(`The latest of `,e.callbacks,` callbacks.`)}}function MK(e,t){e&1&&(H(0,`p`,9),J(1,`Resolved without a value.`),U())}function NK(e,t){if(e&1&&(H(0,`pre`,12),J(1),U()),e&2){let e=K(3),t=iv(0);M(),Y(e.json(t.result))}}function PK(e,t){if(e&1&&(P(0,jK,2,1,`p`,9),P(1,MK,2,0,`p`,9)(2,NK,2,1,`pre`,12)),e&2){K(2);let e=iv(0);F(e.callbacks&&e.callbacks>1?0:-1),M(),F(e.result===void 0?1:2)}}function FK(e,t){if(e&1&&P(0,kK,3,2,`p`,11)(1,AK,2,0,`p`,9)(2,PK,3,2),e&2){let e;K();let t=iv(0);F((e=t.error)?0:t.status===`pending`?1:2,e)}}function IK(e,t){if(e&1&&(H(0,`div`)(1,`dt`),J(2,`Callbacks`),U(),H(3,`dd`),J(4),U()()),e&2){K(2);let e=iv(0);M(4),Y(e.callbacks??0)}}function LK(e,t){if(e&1&&(H(0,`dl`)(1,`div`)(2,`dt`),J(3,`Started`),U(),H(4,`dd`),J(5),U()(),H(6,`div`)(7,`dt`),J(8,`Finished`),U(),H(9,`dd`),J(10),U()(),H(11,`div`)(12,`dt`),J(13),U(),H(14,`dd`),J(15),U()(),P(16,IK,5,1,`div`),U()),e&2){let e=K(),t=iv(0);M(5),Y(e.time(t.startedAt)),M(5),X(` `,t.durationMs===void 0?`Not yet`:e.time(t.startedAt+t.durationMs),` `),M(3),Y(t.status===`pending`?`Waiting for`:`Duration`),M(2),Y(e.span(e.took(t,e.now()))),M(),F(t.kind===`callback`?16:-1)}}var RK=[`args`,`outcome`,`timing`],zK=class e{call=$.required();now=$.required();announce=Ov();host=E(Ml);tab=j(`args`);tabOrder=RK;json=SK;time=zD;span=mK;took=fK;statusText=Q(()=>{let e=this.call();return e.status===`pending`?`Pending`:e.status===`ok`?`OK`:dK(e)?`Not implemented`:`Error`});panelHasFocusable=Q(()=>{let e=this.call();return this.tab()===`args`?e.args!==void 0:this.tab()===`outcome`&&!e.error&&e.status===`ok`&&e.result!==void 0});tabLabel(e){return e===`args`?`Arguments`:e===`timing`?`Timing`:this.call().status===`error`?`Error`:`Result`}onTabKey(e){let t=RK.indexOf(this.tab()),n;if(e.key===`ArrowRight`)n=(t+1)%RK.length;else if(e.key===`ArrowLeft`)n=(t-1+RK.length)%RK.length;else if(e.key===`Home`)n=0;else if(e.key===`End`)n=RK.length-1;else return;e.preventDefault();let r=RK[n];this.tab.set(r),this.host.nativeElement.querySelector(`#cap-tab-${r}`)?.focus()}async copy(e){let t=this.call(),n=`${t.plugin}.${t.method}()`,r=e===`json`?SK(t):xK(t);try{await navigator.clipboard.writeText(r),this.announce.emit(`Copied ${n} as ${e===`json`?`JSON`:`code`}.`)}catch{this.announce.emit(`The clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-call-detail`]],inputs:{call:[1,`call`],now:[1,`now`]},outputs:{announce:`announce`},decls:19,vars:10,consts:[[`id`,`cap-detail`,`aria-labelledby`,`cap-detail-title`,1,`detail`],[`id`,`cap-detail-title`],[1,`meta`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`],[`role`,`tablist`,`aria-label`,`Call details`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`muted`],[`tabindex`,`0`,`aria-label`,`Arguments`],[1,`error-text`],[`tabindex`,`0`,`aria-label`,`Result`]],template:function(e,t){if(e&1&&(nv(0),H(1,`section`,0)(2,`h3`,1)(3,`code`),J(4),U()(),H(5,`p`,2),J(6),U(),H(7,`div`,3)(8,`button`,4),Qg(`click`,function(){return t.copy(`json`)}),J(9,`Copy as JSON`),U(),H(10,`button`,4),Qg(`click`,function(){return t.copy(`code`)}),J(11,`Copy as code`),U()(),H(12,`div`,5),Qg(`keydown`,function(e){return t.onTabKey(e)}),I(13,wK,2,5,`button`,6,wg),U(),H(15,`div`,7),P(16,DK,2,1)(17,FK,3,1)(18,LK,17,5,`dl`),U()()),e&2){let e,n=rv(t.call());M(4),Z(``,n.plugin,`.`,n.method,`()`),M(2),Y_(` `,t.statusText(),`, `,n.via,`, `,n.kind===`callback`?`stream`:`promise`,` `),M(7),L(t.tabOrder),M(2),Vg(`id`,`cap-panel-`+t.tab()),N(`aria-labelledby`,`cap-tab-`+t.tab())(`tabindex`,t.panelHasFocusable()?null:0),M(),F((e=t.tab())===`args`?16:e===`outcome`?17:e===`timing`?18:-1)}},styles:[`.detail[_ngcontent-%COMP%] {
border: 1px solid var(--%NS%border);
border-radius: var(--%NS%radius);
background: var(--%NS%surface);
@@ -13320,7 +13330,7 @@ dd[_ngcontent-%COMP%] {
margin: 0;
color: var(--%NS%text);
font-variant-numeric: tabular-nums;
-}`]})},FK=(e,t)=>t.plugin,IK=(e,t)=>t.label;function LK(e,t){if(e&1&&(H(0,`span`,5),J(1),U(),J(2,` `),H(3,`span`,6),J(4,`from `),H(5,`code`),J(6),U(),J(7),U()),e&2){let e=K().$implicit,t=K(2);M(),Y(e.value),M(5),Y(e.from),M(),X(`, `,t.ago(e.at,t.now()))}}function RK(e,t){e&1&&(H(0,`span`,4),J(1,`Not reported yet`),U())}function zK(e,t){if(e&1&&(H(0,`div`)(1,`dt`),J(2),U(),H(3,`dd`),P(4,LK,8,3)(5,RK,2,0,`span`,4),U()()),e&2){let e=t.$implicit;M(2),Y(e.label),M(2),F(e.value===null?5:4)}}function BK(e,t){if(e&1&&(H(0,`article`,2)(1,`h3`,3)(2,`code`),J(3),U()(),H(4,`dl`),I(5,zK,6,2,`div`,null,IK),U()()),e&2){let e=t.$implicit;N(`aria-labelledby`,`cap-state-`+e.plugin),M(),Vg(`id`,`cap-state-`+e.plugin),M(2),Y(e.plugin),M(2),L(e.fields)}}function VK(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function HK(e,t=e=>e){return n=>{let r=VK(n)?n[e]:void 0;return typeof r==`string`||typeof r==`number`||typeof r==`boolean`?t(String(r)):null}}function UK(e,t,n){return[...e.map(e=>({method:e,read:n})),...t.map(e=>({event:e,read:n}))]}var WK=[{plugin:`Foldable`,fields:[{label:`Fold state`,sources:UK([`getFoldState`],[`foldStateChange`],HK(`state`))},{label:`Posture`,sources:UK([`getFoldState`],[`foldStateChange`],HK(`posture`))},{label:`Hinge orientation`,sources:UK([`getFoldState`],[`foldStateChange`],HK(`hingeOrientation`))},{label:`Hinge angle`,sources:UK([`getHingeAngle`],[`hingeAngleChange`],HK(`angle`,e=>`${e}°`))},{label:`Active display`,sources:UK([`getFoldState`],[`foldStateChange`],HK(`activeDisplay`))},{label:`Size class`,sources:UK([`getSizeClass`],[`sizeClassChange`],e=>{let t=HK(`widthClass`)(e),n=HK(`heightClass`)(e);return!t&&!n?null:[t&&`width ${t}`,n&&`height ${n}`].filter(Boolean).join(`, `)})}]}];function GK(e,t,n){let r=null,i=(e,t,i)=>{if(r&&r.at>=i)return;let a=n.read(e);a!==null&&(r={value:a,from:t,at:i})};if(`method`in n)for(let r of e.calls)r.plugin===t&&r.method===n.method&&r.status===`ok`&&i(r.result,`${n.method}()`,r.startedAt+(r.durationMs??0));else for(let r of e.listeners)r.plugin===t&&r.event===n.event&&r.lastEventAt!==void 0&&r.last!==void 0&&i(r.last,n.event,r.lastEventAt);return r}function KK(e,t=WK){let n=new Set(e.info.plugins.map(e=>e.name));return t.filter(e=>n.has(e.plugin)).map(t=>({plugin:t.plugin,fields:t.fields.map(n=>{let r=null;for(let i of n.sources){let n=GK(e,t.plugin,i);n&&(!r||n.at>r.at)&&(r=n)}let i=r;return{label:n.label,value:i?.value??null,from:i?.from??null,at:i?.at??null}})}))}var qK=class e{cards=$.required();now=$.required();ago=uK;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-state`]],inputs:{cards:[1,`cards`],now:[1,`now`]},decls:5,vars:0,consts:[[1,`lead`],[1,`cards`],[1,`card`],[3,`id`],[1,`missing`],[1,`value`],[1,`source`]],template:function(e,t){e&1&&(H(0,`p`,0),J(1,` Read from the results and events the app already received. The panel calls nothing in the app. `),U(),H(2,`div`,1),I(3,BK,7,3,`article`,2,FK),U()),e&2&&(M(3),L(t.cards()))},styles:[`[_nghost-%COMP%] {
+}`]})},BK=(e,t)=>t.plugin,VK=(e,t)=>t.label;function HK(e,t){if(e&1&&(H(0,`span`,5),J(1),U(),J(2,` `),H(3,`span`,6),J(4,`from `),H(5,`code`),J(6),U(),J(7),U()),e&2){let e=K().$implicit,t=K(2);M(),Y(e.value),M(5),Y(e.from),M(),X(`, `,t.ago(e.at,t.now()))}}function UK(e,t){e&1&&(H(0,`span`,4),J(1,`Not reported yet`),U())}function WK(e,t){if(e&1&&(H(0,`div`)(1,`dt`),J(2),U(),H(3,`dd`),P(4,HK,8,3)(5,UK,2,0,`span`,4),U()()),e&2){let e=t.$implicit;M(2),Y(e.label),M(2),F(e.value===null?5:4)}}function GK(e,t){if(e&1&&(H(0,`article`,2)(1,`h3`,3)(2,`code`),J(3),U()(),H(4,`dl`),I(5,WK,6,2,`div`,null,VK),U()()),e&2){let e=t.$implicit;N(`aria-labelledby`,`cap-state-`+e.plugin),M(),Vg(`id`,`cap-state-`+e.plugin),M(2),Y(e.plugin),M(2),L(e.fields)}}function KK(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function qK(e,t=e=>e){return n=>{let r=KK(n)?n[e]:void 0;return typeof r==`string`||typeof r==`number`||typeof r==`boolean`?t(String(r)):null}}function JK(e,t,n){return[...e.map(e=>({method:e,read:n})),...t.map(e=>({event:e,read:n}))]}var YK=[{plugin:`Foldable`,fields:[{label:`Fold state`,sources:JK([`getFoldState`],[`foldStateChange`],qK(`state`))},{label:`Posture`,sources:JK([`getFoldState`],[`foldStateChange`],qK(`posture`))},{label:`Hinge orientation`,sources:JK([`getFoldState`],[`foldStateChange`],qK(`hingeOrientation`))},{label:`Hinge angle`,sources:JK([`getHingeAngle`],[`hingeAngleChange`],qK(`angle`,e=>`${e}°`))},{label:`Active display`,sources:JK([`getFoldState`],[`foldStateChange`],qK(`activeDisplay`))},{label:`Size class`,sources:JK([`getSizeClass`],[`sizeClassChange`],e=>{let t=qK(`widthClass`)(e),n=qK(`heightClass`)(e);return!t&&!n?null:[t&&`width ${t}`,n&&`height ${n}`].filter(Boolean).join(`, `)})}]}];function XK(e,t,n){let r=null,i=(e,t,i)=>{if(r&&r.at>=i)return;let a=n.read(e);a!==null&&(r={value:a,from:t,at:i})};if(`method`in n)for(let r of e.calls)r.plugin===t&&r.method===n.method&&r.status===`ok`&&i(r.result,`${n.method}()`,r.startedAt+(r.durationMs??0));else for(let r of e.listeners)r.plugin===t&&r.event===n.event&&r.lastEventAt!==void 0&&r.last!==void 0&&i(r.last,n.event,r.lastEventAt);return r}function ZK(e,t=YK){let n=new Set(e.info.plugins.map(e=>e.name));return t.filter(e=>n.has(e.plugin)).map(t=>({plugin:t.plugin,fields:t.fields.map(n=>{let r=null;for(let i of n.sources){let n=XK(e,t.plugin,i);n&&(!r||n.at>r.at)&&(r=n)}let i=r;return{label:n.label,value:i?.value??null,from:i?.from??null,at:i?.at??null}})}))}var QK=class e{cards=$.required();now=$.required();ago=hK;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-state`]],inputs:{cards:[1,`cards`],now:[1,`now`]},decls:5,vars:0,consts:[[1,`lead`],[1,`cards`],[1,`card`],[3,`id`],[1,`missing`],[1,`value`],[1,`source`]],template:function(e,t){e&1&&(H(0,`p`,0),J(1,` Read from the results and events the app already received. The panel calls nothing in the app. `),U(),H(2,`div`,1),I(3,GK,7,3,`article`,2,BK),U()),e&2&&(M(3),L(t.cards()))},styles:[`[_nghost-%COMP%] {
display: block;
}
@@ -13396,7 +13406,7 @@ dd[_ngcontent-%COMP%] {
.missing[_ngcontent-%COMP%] {
font-style: italic;
-}`]})},JK=(e,t)=>t.filter,YK=(e,t)=>t.id,XK=(e,t)=>t.name;function ZK(e,t){e&1&&(z(0,`p`,1),J(1,`Loading Capacitor data…`),B())}function QK(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`),J(2,`Can't read the Capacitor data from the devtools server.`),B(),z(3,`button`,3),G(`click`,function(){return O(e),k(K().retry())}),J(4,`Retry`),B()()}}function $K(e,t){if(e&1){let e=W();z(0,`button`,27),G(`click`,function(){let t=O(e).$implicit;return k(K(4).pickFilter(t.filter))}),z(1,`span`,24),J(2),B(),J(3,` `),z(4,`span`,25),J(5),B()()}if(e&2){let e=t.$implicit,n=K(4);N(`data-filter`,e.filter)(`aria-pressed`,n.callFilter()===e.filter),M(2),Y(e.label),M(3),Y(e.count)}}function eq(e,t){if(e&1&&I(0,$K,6,4,`button`,26,JK),e&2){let e=K();L(K(2).callStats(e))}}function tq(e,t){if(e&1&&(z(0,`span`,23)(1,`span`,24),J(2,`Platform`),B(),J(3,` `),z(4,`span`,25)(5,`code`),J(6),B(),J(7),B()(),P(8,eq,2,0),z(9,`span`,23)(10,`span`,24),J(11,`CapacitorHttp`),B(),J(12,` `),z(13,`span`,25),J(14),B()(),z(15,`span`,23)(16,`span`,24),J(17,`Plugin hints`),B(),J(18,` `),z(19,`span`,25),J(20),B()()),e&2){let e=t;M(6),Y(e.platform),M(),X(` `,e.native?`native`:`web`),M(),F(e.logsCalls?8:-1),M(6),Y(e.capacitorHttp),M(6),Y(e.hints)}}function nq(e,t){if(e&1){let e=W();z(0,`div`,10)(1,`span`,28),J(2,`Page`),B(),z(3,`app-select`,29),G(`valueChange`,function(t){return O(e),k(K(2).selectedPageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function rq(e,t){if(e&1&&(z(0,`section`,12)(1,`h2`,30),J(2,`Plugin state`),B(),V(3,`app-capacitor-state`,31),B()),e&2){let e=K(2);M(3),R(`cards`,e.stateCards())(`now`,e.now())}}function iq(e,t){if(e&1&&(z(0,`p`,15),J(1,` Plugin calls aren't shown on this page. Native calls are logged on iOS and Android, where plugins go through the native bridge. To log calls a web implementation answers, load `),z(2,`code`),J(3,`@pangular-inspector/devtools/capacitor-hook`),B(),J(4,` before `),z(5,`code`),J(6,`@capacitor/core`),B(),J(7,`. `),z(8,`a`,32),J(9,`How to log web calls`),z(10,`span`,6),J(11,` (opens in a new tab)`),B()()()),e&2){let e=K(2);M(8),R(`href`,e.guideUrl,ku)}}function aq(e,t){if(e&1&&(z(0,`p`,15),J(1,` Only native calls are logged. Calls a web implementation answers are left out. `),z(2,`a`,32),J(3,`How to log them too`),z(4,`span`,6),J(5,` (opens in a new tab)`),B()()()),e&2){let e=K(3);M(2),R(`href`,e.guideUrl,ku)}}function oq(e,t){e&1&&(z(0,`p`,18),J(1,`No plugin calls yet. Use the app and they show up here.`),B())}function sq(e,t){if(e&1){let e=W();z(0,`div`,18)(1,`p`),J(2,`No call matches the filters.`),B(),z(3,`p`,43),J(4),B(),z(5,`button`,3),G(`click`,function(){O(e),K();let t=n_(7);return K(2).clearFilters(),k(t.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2),t=K();M(4),Y_(` `,e.calls.length,` `,e.calls.length===1?`call is`:`calls are`,` hidden by `,t.hiddenBy(),`. `)}}function cq(e,t){e&1&&(A(),V(0,`path`,50))}function lq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,56))}function uq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,57))}function dq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,58))}function fq(e,t){e&1&&(z(0,`span`,51),J(1,`stream`),B())}function pq(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,46),G(`focus`,function(){let t=O(e).$implicit;return k(K(4).focusedCallId.set(t.id))})(`click`,function(){let t=O(e).$implicit;return k(K(4).select(t.id))}),z(2,`code`,47),J(3),B(),z(4,`span`,48),A(),z(5,`svg`,49),P(6,cq,1,0,`:svg:path`,50)(7,lq,2,0)(8,uq,2,0)(9,dq,2,0),B(),J(10),B(),P(11,fq,2,0,`span`,51),ps(),z(12,`span`,52)(13,`span`,53),V(14,`span`),B(),J(15),B(),z(16,`span`,51),J(17),B(),z(18,`time`,54),J(19),B()()()}if(e&2){let e,n=t.$implicit,r=K(4);M(),q(`selected`,r.selected()?.id===n.id),N(`aria-pressed`,r.selected()?.id===n.id)(`tabindex`,r.tabStop()===n.id?0:-1),M(2),Z(``,n.plugin,`.`,n.method,`()`),M(),N(`data-tone`,r.tone(n)),M(2),F((e=r.tone(n))===`ok`?6:e===`danger`?7:e===`warn`?8:9),M(4),X(` `,r.statusLabel(n),` `),M(),F(n.kind===`callback`?11:-1),M(3),C_(`width`,r.barWidth(n),`%`),M(),X(` `,r.durationText(n),` `),M(2),Y(n.via),M(2),Y(r.time(n.startedAt))}}function mq(e,t){if(e&1){let e=W();z(0,`app-capacitor-call-detail`,59),G(`announce`,function(t){return O(e),k(K(4).announce(t))}),B()}if(e&2){let e=K(4);R(`call`,t)(`now`,e.now())}}function hq(e,t){if(e&1){let e=W();z(0,`div`,42)(1,`ol`,44),G(`keydown`,function(t){return O(e),k(K(3).onListKey(t))}),I(2,pq,20,15,`li`,null,YK),B(),P(4,mq,1,2,`app-capacitor-call-detail`,45),B()}if(e&2){let e,t=K(3);M(2),L(t.shownCalls()),M(2),F((e=t.selected())?4:-1,e)}}function gq(e,t){if(e&1){let e=W();P(0,aq,6,1,`p`,15),z(1,`div`,33)(2,`div`,34),A(),z(3,`svg`,35),V(4,`circle`,36)(5,`path`,37),B(),ps(),z(6,`input`,38,0),G(`input`,function(t){return O(e),k(K(2).setSearch(t.target.value))})(`keydown.escape`,function(){return O(e),k(K(2).setSearch(``))}),B()(),z(8,`app-select`,39),G(`valueChange`,function(t){return O(e),k(K(2).setFilter(t))}),B(),z(9,`span`,40),J(10),B()(),V(11,`app-limit-note`,41),P(12,oq,2,0,`p`,18)(13,sq,7,3,`div`,18)(14,hq,5,1,`div`,42)}if(e&2){let e=K(),t=K();F(e.info.webCalls?-1:0),M(6),R(`value`,t.filter()),M(2),R(`options`,t.filterOptions)(`value`,t.callFilter()),M(2),Z(``,t.shownCalls().length,` of `,e.calls.length,` calls`),M(),R(`dropped`,e.dropped)(`max`,t.maxCalls()),M(),F(e.calls.length?t.shownCalls().length?14:13:12)}}function _q(e,t){e&1&&(z(0,`p`,18),J(1,`No plugins are registered or installed.`),B())}function vq(e,t){if(e&1&&(z(0,`code`),J(1),B()),e&2){let e=K();M(),Y(e.command)}}function yq(e,t){if(e&1){let e=W();z(0,`button`,65),G(`click`,function(){O(e);let t=K();return k(K(4).copyCommand(t.command))}),J(1,` Copy `),B()}e&2&&N(`aria-label`,`Copy `+K().command)}function bq(e,t){if(e&1&&(z(0,`span`,63),J(1),P(2,vq,2,1,`code`),J(3),B(),P(4,yq,2,1,`button`,64)),e&2){let e=t;M(),Y(e.before),M(),F(e.command?2:-1),M(),Y(e.after),M(),F(e.command?4:-1)}}function xq(e,t){if(e&1&&(z(0,`tr`)(1,`th`,61)(2,`code`),J(3),B()(),z(4,`td`),J(5),B(),z(6,`td`),J(7),B(),z(8,`td`),J(9),B(),z(10,`td`,62),P(11,bq,5,4),B()()),e&2){let e,n=t.$implicit,r=K(2),i=K();M(3),Y(n.name),M(2),Y(n.available?`Yes`:`No`),M(2),Y(i.yesNo(n.registered)),M(2),Y(n.native?`Yes`:`No`),M(2),F((e=i.pluginHint(n,r.info.platform))?11:-1,e)}}function Sq(e,t){if(e&1&&(z(0,`div`,19)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,60),J(5,`Plugin`),B(),z(6,`th`,60),J(7,`Available`),B(),z(8,`th`,60),J(9,`Imported`),B(),z(10,`th`,60),J(11,`Native`),B(),z(12,`th`,60),J(13,`Note`),B()()(),z(14,`tbody`),I(15,xq,12,5,`tr`,null,XK),B()()()),e&2){let e=K();M(15),L(e.info.plugins)}}function Cq(e,t){e&1&&(z(0,`p`,18),J(1,`No plugin listeners. They show up when the app calls addListener.`),B())}function wq(e,t){if(e&1&&(z(0,`code`,68),J(1),B()),e&2){let e=K(2).$implicit,t=K(3);M(),Y(t.preview(e.last))}}function Tq(e,t){e&1&&(z(0,`span`,68),J(1,`No data`),B())}function Eq(e,t){if(e&1&&(P(0,wq,2,1,`code`,68)(1,Tq,2,0,`span`,68),z(2,`span`,43),J(3),B()),e&2){let e=K().$implicit,t=K(3);F(+(e.last===void 0)),M(3),X(`at `,t.time(e.lastEventAt))}}function Dq(e,t){e&1&&J(0,` None yet `)}function Oq(e,t){if(e&1&&(z(0,`span`,67),A(),z(1,`svg`,49),V(2,`path`,69)(3,`path`,70),B(),J(4),B()),e&2){let e=K().$implicit,t=K(3);M(4),X(` `,t.leakCount(e),` active listeners: possible leak `)}}function kq(e,t){if(e&1&&(z(0,`tr`)(1,`th`,61)(2,`code`),J(3),B()(),z(4,`td`)(5,`code`),J(6),B()(),z(7,`td`),J(8),B(),z(9,`td`,66),P(10,Eq,4,2)(11,Dq,1,0),B(),z(12,`td`),J(13),P(14,Oq,5,1,`span`,67),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(e.plugin),M(3),Y(e.event),M(2),Y(e.events),M(2),F(e.lastEventAt?10:11),M(3),X(` `,e.removed?`Removed`:`Active`,` `),M(),F(!e.removed&&n.leakCount(e)>1?14:-1)}}function Aq(e,t){if(e&1&&(z(0,`div`,22)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,60),J(5,`Plugin`),B(),z(6,`th`,60),J(7,`Event`),B(),z(8,`th`,60),J(9,`Events`),B(),z(10,`th`,60),J(11,`Last event`),B(),z(12,`th`,60),J(13,`State`),B()()(),z(14,`tbody`),I(15,kq,15,6,`tr`,null,YK),B()()()),e&2){let e=K();M(15),L(e.listeners)}}function jq(e,t){if(e&1&&(z(0,`p`,4),J(1,` Plugin calls, plugins and listeners of a Capacitor app, as its WebView reports them. Values are masked like other live data. `),B(),z(2,`div`,5),P(3,tq,21,5),z(4,`span`,6),J(5),B()(),z(6,`section`,7)(7,`div`,8)(8,`h2`,9),J(9,`Environment`),B(),P(10,nq,4,2,`div`,10),B(),z(11,`dl`)(12,`div`)(13,`dt`),J(14,`Platform`),B(),z(15,`dd`)(16,`code`),J(17),B(),J(18),B()(),z(19,`div`)(20,`dt`),J(21,`Server URL`),B(),z(22,`dd`)(23,`code`),J(24),B()()(),z(25,`div`)(26,`dt`),J(27,`CapacitorHttp`),B(),z(28,`dd`),J(29),B()(),z(30,`div`)(31,`dt`),J(32,`Calls logged`),B(),z(33,`dd`),J(34),B()(),z(35,`div`,11)(36,`dt`),J(37,`User agent`),B(),z(38,`dd`)(39,`code`),J(40),B()()()()(),P(41,rq,4,2,`section`,12),z(42,`section`,13)(43,`h2`,14),J(44,`Plugin calls`),B(),P(45,iq,12,1,`p`,15)(46,gq,15,9),B(),z(47,`section`,16)(48,`h2`,17),J(49,`Plugins`),B(),P(50,_q,2,0,`p`,18)(51,Sq,17,0,`div`,19),B(),z(52,`section`,20)(53,`h2`,21),J(54,`Listeners`),B(),P(55,Cq,2,0,`p`,18)(56,Aq,17,0,`div`,22),B()),e&2){let e,n=t,r=K();M(3),F((e=r.summary())?3:-1,e),M(2),Y(r.message()),M(5),F(r.pageOptions().length>1?10:-1),M(7),Y(n.info.platform),M(),X(` (`,n.info.native?`native`:`web`,`) `),M(6),Y(n.info.env.serverUrl||`none`),M(5),X(` `,n.info.env.capacitorHttp===null?`Unknown`:n.info.env.capacitorHttp?`On`:`Off`,` `),M(5),Y(r.loggedLabel()),M(6),Y(n.info.env.userAgent||`unknown`),M(),F(r.stateCards().length?41:-1),M(4),F(!n.info.bridge&&!n.info.webCalls?45:46),M(5),F(n.info.plugins.length?51:50),M(5),F(n.listeners.length?56:55)}}function Mq(e,t){e&1&&(z(0,`p`,1),J(1,` No Capacitor app reports to this server. Start the overlay in the app, then use it. `),B())}var Nq=`https://pangular-inspector.dev/inspectors/capacitor/#web-calls`,Pq=2e3,Fq={all:`All calls`,failed:`Failed`,slow:`Slow (500 ms or more)`,pending:`Pending`},Iq=class e{rpc=$(null);destroyRef=E(Cs);host=E(Ml);injector=E(xs);seen=new Map;hostPageId=eE();unsubscribe;time=zD;preview=vK;pluginHint=dK;guideUrl=Nq;yesNo=eK;filterOptions=Object.keys(Fq).map(e=>({value:e,label:Fq[e]}));pages=j([]);loaded=j(!1);failed=j(!1);selectedPageId=Tv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:nK(e,this.hostPageId)});selectedCallId=j(null);focusedCallId=j(null);filter=j(``);callFilter=j(`all`);now=j(Date.now());message=j(``);page=Q(()=>{let e=this.selectedPageId();return this.pages().find(t=>t.pageId===e)??null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url||e.pageId,hint:e.info.platform})));maxCalls=Q(()=>yE(this.rpc()).limits.capacitorCalls);loggedLabel=Q(()=>{let e=this.page()?.info;return e?e.bridge&&e.webCalls?`Native and web`:e.bridge?`Native only`:e.webCalls?`Web only`:`None on this platform`:``});shownCalls=Q(()=>{let e=this.page();if(!e)return[];let t=this.filter().trim().toLowerCase(),n=this.callFilter(),r=n===`slow`?this.now():0;return[...e.calls].filter(e=>cK(e,n,r)).filter(e=>!t||`${e.plugin}.${e.method}`.toLowerCase().includes(t)).sort((e,t)=>t.startedAt-e.startedAt)});selected=Q(()=>this.shownCalls().find(e=>e.id===this.selectedCallId())??null);tabStop=Q(()=>{let e=this.shownCalls();for(let t of[this.focusedCallId(),this.selectedCallId()])if(t!==null&&e.some(e=>e.id===t))return t;return e[0]?.id??null});slowest=Q(()=>{let e=this.now();return Math.max(1,...this.shownCalls().map(t=>sK(t,e)))});hiddenBy=Q(()=>{let e=[],t=this.filter().trim();return t&&e.push(`the search “${t}”`),this.callFilter()!==`all`&&e.push(`the ${Fq[this.callFilter()]} filter`),e.join(` and `)});stateCards=Q(()=>{let e=this.page();return e?KK(e):[]});leaks=Q(()=>pK(this.page()?.listeners??[]));liveSummary=Q(()=>{let e=this.page();return e?fK(e,this.now()):null});summary=j(null);summaryShownAt=0;summaryTimer;messageFlip=!1;constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.liveSummary();Cv(()=>this.queueSummary(e))});let e=setInterval(()=>this.now.set(Date.now()),1e3);this.destroyRef.onDestroy(()=>{clearInterval(e),clearTimeout(this.summaryTimer),this.unsubscribe?.()})}retry(){let e=this.rpc();e&&this.load(e)}callStats(e){return[{filter:`all`,label:`Calls`,count:e.calls},{filter:`failed`,label:`Failed`,count:e.failed},{filter:`slow`,label:`Slow, 500 ms+`,count:e.slow},{filter:`pending`,label:`Pending`,count:e.pending}]}select(e){this.selectedCallId.set(e),Id(()=>{globalThis.matchMedia?.(`(max-width: 880px)`).matches&&this.host.nativeElement.querySelector(`#cap-detail`)?.scrollIntoView?.({block:`nearest`})},{injector:this.injector})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-cap-call]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}setSearch(e){e!==this.filter()&&(this.filter.set(e),this.announceCount())}setFilter(e){e!==this.callFilter()&&(this.callFilter.set(e),this.announceCount())}pickFilter(e){this.setFilter(this.callFilter()===e?`all`:e)}clearFilters(){this.filter.set(``),this.callFilter.set(`all`),this.announceCount()}announce(e){this.messageFlip=!this.messageFlip,this.message.set(this.messageFlip?`${e} `:e)}async copyCommand(e){try{await navigator.clipboard.writeText(e),this.announce(`Copied ${e}.`)}catch{this.announce(`The clipboard is not available here.`)}}leakCount(e){return this.leaks().get(`${e.plugin} ${e.event}`)??0}tone(e){return e.status===`pending`?`accent`:e.status===`ok`?`ok`:oK(e)?`warn`:`danger`}statusLabel(e){return e.status===`pending`?`Pending`:e.status===`ok`?`OK`:oK(e)?`Not implemented`:`Error`}durationText(e){return e.status===`pending`?`waiting ${lK(sK(e,this.now()))}`:e.durationMs===void 0?``:`${Math.round(e.durationMs)} ms`}barWidth(e){return Math.min(100,sK(e,this.now())/this.slowest()*100)}announceCount(){let e=this.page();e&&this.announce(`${this.shownCalls().length} of ${e.calls.length} calls shown`)}queueSummary(e){let t=this.summary();if(JSON.stringify(e)===JSON.stringify(t))return;clearTimeout(this.summaryTimer),this.summaryTimer=void 0;let n=this.summaryShownAt+Pq-Date.now();if(!t||!e||e.pageId!==t.pageId||n<=0){this.summary.set(e),this.summaryShownAt=Date.now();return}this.summaryTimer=setTimeout(()=>{this.summaryTimer=void 0,this.summary.set(this.liveSummary()),this.summaryShownAt=Date.now()},n)}async load(e){this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`capacitor`);if(this.destroyRef.destroyed)return;let n=e=>this.pages.set(tK(aK(e),this.seen));n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loaded.set(!0)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`search`,``],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[`type`,`button`,1,`small`,3,`click`],[1,`intro`],[`role`,`status`,`aria-label`,`Capacitor summary`,`aria-atomic`,`false`,1,`strip`],[1,`sr-only`],[`aria-labelledby`,`cap-env-title`,1,`env`],[1,`env-head`],[`id`,`cap-env-title`],[1,`page-picker`],[1,`wide`],[`aria-labelledby`,`cap-state-title`],[`aria-labelledby`,`cap-calls-title`],[`id`,`cap-calls-title`],[1,`notice`],[`aria-labelledby`,`cap-plugins-title`],[`id`,`cap-plugins-title`],[1,`empty`],[`tabindex`,`0`,`role`,`group`,`aria-label`,`Plugins table`,1,`table-wrap`],[`aria-labelledby`,`cap-listeners-title`],[`id`,`cap-listeners-title`],[`tabindex`,`0`,`role`,`group`,`aria-label`,`Listeners table`,1,`table-wrap`],[`aria-atomic`,`true`,1,`stat`],[1,`stat-label`],[1,`stat-value`],[`type`,`button`,`aria-atomic`,`true`,1,`stat`],[`type`,`button`,`aria-atomic`,`true`,1,`stat`,3,`click`],[`id`,`cap-page-label`,1,`label-key`],[`labelledBy`,`cap-page-label`,3,`valueChange`,`options`,`value`],[`id`,`cap-state-title`],[3,`cards`,`now`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`aria-label`,`Filter calls by plugin or method`,`placeholder`,`Filter by plugin or method`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show calls`,1,`show`,3,`valueChange`,`options`,`value`],[1,`count`],[`what`,`plugin calls`,`limit`,`capacitorCalls`,3,`dropped`,`max`],[1,`split`],[1,`muted`],[`aria-label`,`Plugin calls, newest first`,1,`calls`,3,`keydown`],[3,`call`,`now`],[`type`,`button`,`data-cap-call`,``,1,`call`,3,`focus`,`click`],[1,`name`],[1,`chip`,`status`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M20 6 9 17l-5-5`],[1,`chip`,`via`],[1,`duration`],[`aria-hidden`,`true`,1,`bar`],[1,`when`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`m15 9-6 6M9 9l6 6`],[`d`,`M5.6 5.6l12.8 12.8`],[`d`,`M12 7v5l3 2`],[3,`announce`,`call`,`now`],[`scope`,`col`],[`scope`,`row`],[1,`note`],[1,`hint`],[`type`,`button`,1,`copy`],[`type`,`button`,1,`copy`,3,`click`],[1,`last`],[`data-tone`,`warn`,1,`chip`,`leak`],[1,`payload`],[`d`,`M12 3 2 21h20z`],[`d`,`M12 10v4M12 17.5v.01`]],template:function(e,t){if(e&1&&P(0,ZK,2,0,`p`,1)(1,QK,5,0,`div`,2)(2,jq,57,13)(3,Mq,2,0,`p`,1),e&2){let e;F(t.loaded()?t.failed()?1:(e=t.page())?2:3:0,e)}},dependencies:[WD,jD,PK,qK],styles:[`[_nghost-%COMP%] {
+}`]})},$K=(e,t)=>t.filter,eq=(e,t)=>t.id,tq=(e,t)=>t.name;function nq(e,t){e&1&&(z(0,`p`,1),J(1,`Loading Capacitor data…`),B())}function rq(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`),J(2,`Can't read the Capacitor data from the devtools server.`),B(),z(3,`button`,3),G(`click`,function(){return O(e),k(K().retry())}),J(4,`Retry`),B()()}}function iq(e,t){if(e&1){let e=W();z(0,`button`,27),G(`click`,function(){let t=O(e).$implicit;return k(K(4).pickFilter(t.filter))}),z(1,`span`,24),J(2),B(),J(3,` `),z(4,`span`,25),J(5),B()()}if(e&2){let e=t.$implicit,n=K(4);N(`data-filter`,e.filter)(`aria-pressed`,n.callFilter()===e.filter),M(2),Y(e.label),M(3),Y(e.count)}}function aq(e,t){if(e&1&&I(0,iq,6,4,`button`,26,$K),e&2){let e=K();L(K(2).callStats(e))}}function oq(e,t){if(e&1&&(z(0,`span`,23)(1,`span`,24),J(2,`Platform`),B(),J(3,` `),z(4,`span`,25)(5,`code`),J(6),B(),J(7),B()(),P(8,aq,2,0),z(9,`span`,23)(10,`span`,24),J(11,`CapacitorHttp`),B(),J(12,` `),z(13,`span`,25),J(14),B()(),z(15,`span`,23)(16,`span`,24),J(17,`Plugin hints`),B(),J(18,` `),z(19,`span`,25),J(20),B()()),e&2){let e=t;M(6),Y(e.platform),M(),X(` `,e.native?`native`:`web`),M(),F(e.logsCalls?8:-1),M(6),Y(e.capacitorHttp),M(6),Y(e.hints)}}function sq(e,t){if(e&1){let e=W();z(0,`div`,10)(1,`span`,28),J(2,`Page`),B(),z(3,`app-select`,29),G(`valueChange`,function(t){return O(e),k(K(2).selectedPageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function cq(e,t){if(e&1&&(z(0,`section`,12)(1,`h2`,30),J(2,`Plugin state`),B(),V(3,`app-capacitor-state`,31),B()),e&2){let e=K(2);M(3),R(`cards`,e.stateCards())(`now`,e.now())}}function lq(e,t){if(e&1&&(z(0,`p`,15),J(1,` Plugin calls aren't shown on this page. Native calls are logged on iOS and Android, where plugins go through the native bridge. To log calls a web implementation answers, load `),z(2,`code`),J(3,`@pangular-inspector/devtools/capacitor-hook`),B(),J(4,` before `),z(5,`code`),J(6,`@capacitor/core`),B(),J(7,`. `),z(8,`a`,32),J(9,`How to log web calls`),z(10,`span`,6),J(11,` (opens in a new tab)`),B()()()),e&2){let e=K(2);M(8),R(`href`,e.guideUrl,ku)}}function uq(e,t){if(e&1&&(z(0,`p`,15),J(1,` Only native calls are logged. Calls a web implementation answers are left out. `),z(2,`a`,32),J(3,`How to log them too`),z(4,`span`,6),J(5,` (opens in a new tab)`),B()()()),e&2){let e=K(3);M(2),R(`href`,e.guideUrl,ku)}}function dq(e,t){e&1&&(z(0,`p`,18),J(1,`No plugin calls yet. Use the app and they show up here.`),B())}function fq(e,t){if(e&1){let e=W();z(0,`div`,18)(1,`p`),J(2,`No call matches the filters.`),B(),z(3,`p`,43),J(4),B(),z(5,`button`,3),G(`click`,function(){O(e),K();let t=n_(7);return K(2).clearFilters(),k(t.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2),t=K();M(4),Y_(` `,e.calls.length,` `,e.calls.length===1?`call is`:`calls are`,` hidden by `,t.hiddenBy(),`. `)}}function pq(e,t){e&1&&(A(),V(0,`path`,50))}function mq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,56))}function hq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,57))}function gq(e,t){e&1&&(A(),V(0,`circle`,55)(1,`path`,58))}function _q(e,t){e&1&&(z(0,`span`,51),J(1,`stream`),B())}function vq(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,46),G(`focus`,function(){let t=O(e).$implicit;return k(K(4).focusedCallId.set(t.id))})(`click`,function(){let t=O(e).$implicit;return k(K(4).select(t.id))}),z(2,`code`,47),J(3),B(),z(4,`span`,48),A(),z(5,`svg`,49),P(6,pq,1,0,`:svg:path`,50)(7,mq,2,0)(8,hq,2,0)(9,gq,2,0),B(),J(10),B(),P(11,_q,2,0,`span`,51),ps(),z(12,`span`,52)(13,`span`,53),V(14,`span`),B(),J(15),B(),z(16,`span`,51),J(17),B(),z(18,`time`,54),J(19),B()()()}if(e&2){let e,n=t.$implicit,r=K(4);M(),q(`selected`,r.selected()?.id===n.id),N(`aria-pressed`,r.selected()?.id===n.id)(`tabindex`,r.tabStop()===n.id?0:-1),M(2),Z(``,n.plugin,`.`,n.method,`()`),M(),N(`data-tone`,r.tone(n)),M(2),F((e=r.tone(n))===`ok`?6:e===`danger`?7:e===`warn`?8:9),M(4),X(` `,r.statusLabel(n),` `),M(),F(n.kind===`callback`?11:-1),M(3),C_(`width`,r.barWidth(n),`%`),M(),X(` `,r.durationText(n),` `),M(2),Y(n.via),M(2),Y(r.time(n.startedAt))}}function yq(e,t){if(e&1){let e=W();z(0,`app-capacitor-call-detail`,59),G(`announce`,function(t){return O(e),k(K(4).announce(t))}),B()}if(e&2){let e=K(4);R(`call`,t)(`now`,e.now())}}function bq(e,t){if(e&1){let e=W();z(0,`div`,42)(1,`ol`,44),G(`keydown`,function(t){return O(e),k(K(3).onListKey(t))}),I(2,vq,20,15,`li`,null,eq),B(),P(4,yq,1,2,`app-capacitor-call-detail`,45),B()}if(e&2){let e,t=K(3);M(2),L(t.shownCalls()),M(2),F((e=t.selected())?4:-1,e)}}function xq(e,t){if(e&1){let e=W();P(0,uq,6,1,`p`,15),z(1,`div`,33)(2,`div`,34),A(),z(3,`svg`,35),V(4,`circle`,36)(5,`path`,37),B(),ps(),z(6,`input`,38,0),G(`input`,function(t){return O(e),k(K(2).setSearch(t.target.value))})(`keydown.escape`,function(){return O(e),k(K(2).setSearch(``))}),B()(),z(8,`app-select`,39),G(`valueChange`,function(t){return O(e),k(K(2).setFilter(t))}),B(),z(9,`span`,40),J(10),B()(),V(11,`app-limit-note`,41),P(12,dq,2,0,`p`,18)(13,fq,7,3,`div`,18)(14,bq,5,1,`div`,42)}if(e&2){let e=K(),t=K();F(e.info.webCalls?-1:0),M(6),R(`value`,t.filter()),M(2),R(`options`,t.filterOptions)(`value`,t.callFilter()),M(2),Z(``,t.shownCalls().length,` of `,e.calls.length,` calls`),M(),R(`dropped`,e.dropped)(`max`,t.maxCalls()),M(),F(e.calls.length?t.shownCalls().length?14:13:12)}}function Sq(e,t){e&1&&(z(0,`p`,18),J(1,`No plugins are registered or installed.`),B())}function Cq(e,t){if(e&1&&(z(0,`code`),J(1),B()),e&2){let e=K();M(),Y(e.command)}}function wq(e,t){if(e&1){let e=W();z(0,`button`,65),G(`click`,function(){O(e);let t=K();return k(K(4).copyCommand(t.command))}),J(1,` Copy `),B()}e&2&&N(`aria-label`,`Copy `+K().command)}function Tq(e,t){if(e&1&&(z(0,`span`,63),J(1),P(2,Cq,2,1,`code`),J(3),B(),P(4,wq,2,1,`button`,64)),e&2){let e=t;M(),Y(e.before),M(),F(e.command?2:-1),M(),Y(e.after),M(),F(e.command?4:-1)}}function Eq(e,t){if(e&1&&(z(0,`tr`)(1,`th`,61)(2,`code`),J(3),B()(),z(4,`td`),J(5),B(),z(6,`td`),J(7),B(),z(8,`td`),J(9),B(),z(10,`td`,62),P(11,Tq,5,4),B()()),e&2){let e,n=t.$implicit,r=K(2),i=K();M(3),Y(n.name),M(2),Y(n.available?`Yes`:`No`),M(2),Y(i.yesNo(n.registered)),M(2),Y(n.native?`Yes`:`No`),M(2),F((e=i.pluginHint(n,r.info.platform))?11:-1,e)}}function Dq(e,t){if(e&1&&(z(0,`div`,19)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,60),J(5,`Plugin`),B(),z(6,`th`,60),J(7,`Available`),B(),z(8,`th`,60),J(9,`Imported`),B(),z(10,`th`,60),J(11,`Native`),B(),z(12,`th`,60),J(13,`Note`),B()()(),z(14,`tbody`),I(15,Eq,12,5,`tr`,null,tq),B()()()),e&2){let e=K();M(15),L(e.info.plugins)}}function Oq(e,t){e&1&&(z(0,`p`,18),J(1,`No plugin listeners. They show up when the app calls addListener.`),B())}function kq(e,t){if(e&1&&(z(0,`code`,68),J(1),B()),e&2){let e=K(2).$implicit,t=K(3);M(),Y(t.preview(e.last))}}function Aq(e,t){e&1&&(z(0,`span`,68),J(1,`No data`),B())}function jq(e,t){if(e&1&&(P(0,kq,2,1,`code`,68)(1,Aq,2,0,`span`,68),z(2,`span`,43),J(3),B()),e&2){let e=K().$implicit,t=K(3);F(+(e.last===void 0)),M(3),X(`at `,t.time(e.lastEventAt))}}function Mq(e,t){e&1&&J(0,` None yet `)}function Nq(e,t){if(e&1&&(z(0,`span`,67),A(),z(1,`svg`,49),V(2,`path`,69)(3,`path`,70),B(),J(4),B()),e&2){let e=K().$implicit,t=K(3);M(4),X(` `,t.leakCount(e),` active listeners: possible leak `)}}function Pq(e,t){if(e&1&&(z(0,`tr`)(1,`th`,61)(2,`code`),J(3),B()(),z(4,`td`)(5,`code`),J(6),B()(),z(7,`td`),J(8),B(),z(9,`td`,66),P(10,jq,4,2)(11,Mq,1,0),B(),z(12,`td`),J(13),P(14,Nq,5,1,`span`,67),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(e.plugin),M(3),Y(e.event),M(2),Y(e.events),M(2),F(e.lastEventAt?10:11),M(3),X(` `,e.removed?`Removed`:`Active`,` `),M(),F(!e.removed&&n.leakCount(e)>1?14:-1)}}function Fq(e,t){if(e&1&&(z(0,`div`,22)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,60),J(5,`Plugin`),B(),z(6,`th`,60),J(7,`Event`),B(),z(8,`th`,60),J(9,`Events`),B(),z(10,`th`,60),J(11,`Last event`),B(),z(12,`th`,60),J(13,`State`),B()()(),z(14,`tbody`),I(15,Pq,15,6,`tr`,null,eq),B()()()),e&2){let e=K();M(15),L(e.listeners)}}function Iq(e,t){if(e&1&&(z(0,`p`,4),J(1,` Plugin calls, plugins and listeners of a Capacitor app, as its WebView reports them. Values are masked like other live data. `),B(),z(2,`div`,5),P(3,oq,21,5),z(4,`span`,6),J(5),B()(),z(6,`section`,7)(7,`div`,8)(8,`h2`,9),J(9,`Environment`),B(),P(10,sq,4,2,`div`,10),B(),z(11,`dl`)(12,`div`)(13,`dt`),J(14,`Platform`),B(),z(15,`dd`)(16,`code`),J(17),B(),J(18),B()(),z(19,`div`)(20,`dt`),J(21,`Server URL`),B(),z(22,`dd`)(23,`code`),J(24),B()()(),z(25,`div`)(26,`dt`),J(27,`CapacitorHttp`),B(),z(28,`dd`),J(29),B()(),z(30,`div`)(31,`dt`),J(32,`Calls logged`),B(),z(33,`dd`),J(34),B()(),z(35,`div`,11)(36,`dt`),J(37,`User agent`),B(),z(38,`dd`)(39,`code`),J(40),B()()()()(),P(41,cq,4,2,`section`,12),z(42,`section`,13)(43,`h2`,14),J(44,`Plugin calls`),B(),P(45,lq,12,1,`p`,15)(46,xq,15,9),B(),z(47,`section`,16)(48,`h2`,17),J(49,`Plugins`),B(),P(50,Sq,2,0,`p`,18)(51,Dq,17,0,`div`,19),B(),z(52,`section`,20)(53,`h2`,21),J(54,`Listeners`),B(),P(55,Oq,2,0,`p`,18)(56,Fq,17,0,`div`,22),B()),e&2){let e,n=t,r=K();M(3),F((e=r.summary())?3:-1,e),M(2),Y(r.message()),M(5),F(r.pageOptions().length>1?10:-1),M(7),Y(n.info.platform),M(),X(` (`,n.info.native?`native`:`web`,`) `),M(6),Y(n.info.env.serverUrl||`none`),M(5),X(` `,n.info.env.capacitorHttp===null?`Unknown`:n.info.env.capacitorHttp?`On`:`Off`,` `),M(5),Y(r.loggedLabel()),M(6),Y(n.info.env.userAgent||`unknown`),M(),F(r.stateCards().length?41:-1),M(4),F(!n.info.bridge&&!n.info.webCalls?45:46),M(5),F(n.info.plugins.length?51:50),M(5),F(n.listeners.length?56:55)}}function Lq(e,t){e&1&&(z(0,`p`,1),J(1,` No Capacitor app reports to this server. Start the overlay in the app, then use it. `),B())}var Rq=`https://pangular-inspector.dev/inspectors/capacitor/#web-calls`,zq=2e3,Bq={all:`All calls`,failed:`Failed`,slow:`Slow (500 ms or more)`,pending:`Pending`},Vq=class e{rpc=$(null);destroyRef=E(Cs);host=E(Ml);injector=E(xs);seen=new Map;hostPageId=eE();unsubscribe;time=zD;preview=CK;pluginHint=gK;guideUrl=Rq;yesNo=aK;filterOptions=Object.keys(Bq).map(e=>({value:e,label:Bq[e]}));pages=j([]);loaded=j(!1);failed=j(!1);selectedPageId=Tv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:sK(e,this.hostPageId)});selectedCallId=j(null);focusedCallId=j(null);filter=j(``);callFilter=j(`all`);now=j(Date.now());message=j(``);page=Q(()=>{let e=this.selectedPageId();return this.pages().find(t=>t.pageId===e)??null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url||e.pageId,hint:e.info.platform})));maxCalls=Q(()=>yE(this.rpc()).limits.capacitorCalls);loggedLabel=Q(()=>{let e=this.page()?.info;return e?e.bridge&&e.webCalls?`Native and web`:e.bridge?`Native only`:e.webCalls?`Web only`:`None on this platform`:``});shownCalls=Q(()=>{let e=this.page();if(!e)return[];let t=this.filter().trim().toLowerCase(),n=this.callFilter(),r=n===`slow`?this.now():0;return[...e.calls].filter(e=>pK(e,n,r)).filter(e=>!t||`${e.plugin}.${e.method}`.toLowerCase().includes(t)).sort((e,t)=>t.startedAt-e.startedAt)});selected=Q(()=>this.shownCalls().find(e=>e.id===this.selectedCallId())??null);tabStop=Q(()=>{let e=this.shownCalls();for(let t of[this.focusedCallId(),this.selectedCallId()])if(t!==null&&e.some(e=>e.id===t))return t;return e[0]?.id??null});slowest=Q(()=>{let e=this.now();return Math.max(1,...this.shownCalls().map(t=>fK(t,e)))});hiddenBy=Q(()=>{let e=[],t=this.filter().trim();return t&&e.push(`the search “${t}”`),this.callFilter()!==`all`&&e.push(`the ${Bq[this.callFilter()]} filter`),e.join(` and `)});stateCards=Q(()=>{let e=this.page();return e?ZK(e):[]});leaks=Q(()=>vK(this.page()?.listeners??[]));liveSummary=Q(()=>{let e=this.page();return e?_K(e,this.now()):null});summary=j(null);summaryShownAt=0;summaryTimer;messageFlip=!1;constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.liveSummary();Cv(()=>this.queueSummary(e))});let e=setInterval(()=>this.now.set(Date.now()),1e3);this.destroyRef.onDestroy(()=>{clearInterval(e),clearTimeout(this.summaryTimer),this.unsubscribe?.()})}retry(){let e=this.rpc();e&&this.load(e)}callStats(e){return[{filter:`all`,label:`Calls`,count:e.calls},{filter:`failed`,label:`Failed`,count:e.failed},{filter:`slow`,label:`Slow, 500 ms+`,count:e.slow},{filter:`pending`,label:`Pending`,count:e.pending}]}select(e){this.selectedCallId.set(e),Id(()=>{globalThis.matchMedia?.(`(max-width: 880px)`).matches&&this.host.nativeElement.querySelector(`#cap-detail`)?.scrollIntoView?.({block:`nearest`})},{injector:this.injector})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-cap-call]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}setSearch(e){e!==this.filter()&&(this.filter.set(e),this.announceCount())}setFilter(e){e!==this.callFilter()&&(this.callFilter.set(e),this.announceCount())}pickFilter(e){this.setFilter(this.callFilter()===e?`all`:e)}clearFilters(){this.filter.set(``),this.callFilter.set(`all`),this.announceCount()}announce(e){this.messageFlip=!this.messageFlip,this.message.set(this.messageFlip?`${e} `:e)}async copyCommand(e){try{await navigator.clipboard.writeText(e),this.announce(`Copied ${e}.`)}catch{this.announce(`The clipboard is not available here.`)}}leakCount(e){return this.leaks().get(`${e.plugin} ${e.event}`)??0}tone(e){return e.status===`pending`?`accent`:e.status===`ok`?`ok`:dK(e)?`warn`:`danger`}statusLabel(e){return e.status===`pending`?`Pending`:e.status===`ok`?`OK`:dK(e)?`Not implemented`:`Error`}durationText(e){return e.status===`pending`?`waiting ${mK(fK(e,this.now()))}`:e.durationMs===void 0?``:`${Math.round(e.durationMs)} ms`}barWidth(e){return Math.min(100,fK(e,this.now())/this.slowest()*100)}announceCount(){let e=this.page();e&&this.announce(`${this.shownCalls().length} of ${e.calls.length} calls shown`)}queueSummary(e){let t=this.summary();if(JSON.stringify(e)===JSON.stringify(t))return;clearTimeout(this.summaryTimer),this.summaryTimer=void 0;let n=this.summaryShownAt+zq-Date.now();if(!t||!e||e.pageId!==t.pageId||n<=0){this.summary.set(e),this.summaryShownAt=Date.now();return}this.summaryTimer=setTimeout(()=>{this.summaryTimer=void 0,this.summary.set(this.liveSummary()),this.summaryShownAt=Date.now()},n)}async load(e){this.failed.set(!1);try{let t=await e.scope(`pangular`).rpc.sharedState(`capacitor`);if(this.destroyRef.destroyed)return;let n=e=>this.pages.set(oK(uK(e),this.seen));n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loaded.set(!0)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-capacitor-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`search`,``],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[`type`,`button`,1,`small`,3,`click`],[1,`intro`],[`role`,`status`,`aria-label`,`Capacitor summary`,`aria-atomic`,`false`,1,`strip`],[1,`sr-only`],[`aria-labelledby`,`cap-env-title`,1,`env`],[1,`env-head`],[`id`,`cap-env-title`],[1,`page-picker`],[1,`wide`],[`aria-labelledby`,`cap-state-title`],[`aria-labelledby`,`cap-calls-title`],[`id`,`cap-calls-title`],[1,`notice`],[`aria-labelledby`,`cap-plugins-title`],[`id`,`cap-plugins-title`],[1,`empty`],[`tabindex`,`0`,`role`,`group`,`aria-label`,`Plugins table`,1,`table-wrap`],[`aria-labelledby`,`cap-listeners-title`],[`id`,`cap-listeners-title`],[`tabindex`,`0`,`role`,`group`,`aria-label`,`Listeners table`,1,`table-wrap`],[`aria-atomic`,`true`,1,`stat`],[1,`stat-label`],[1,`stat-value`],[`type`,`button`,`aria-atomic`,`true`,1,`stat`],[`type`,`button`,`aria-atomic`,`true`,1,`stat`,3,`click`],[`id`,`cap-page-label`,1,`label-key`],[`labelledBy`,`cap-page-label`,3,`valueChange`,`options`,`value`],[`id`,`cap-state-title`],[3,`cards`,`now`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`aria-label`,`Filter calls by plugin or method`,`placeholder`,`Filter by plugin or method`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show calls`,1,`show`,3,`valueChange`,`options`,`value`],[1,`count`],[`what`,`plugin calls`,`limit`,`capacitorCalls`,3,`dropped`,`max`],[1,`split`],[1,`muted`],[`aria-label`,`Plugin calls, newest first`,1,`calls`,3,`keydown`],[3,`call`,`now`],[`type`,`button`,`data-cap-call`,``,1,`call`,3,`focus`,`click`],[1,`name`],[1,`chip`,`status`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M20 6 9 17l-5-5`],[1,`chip`,`via`],[1,`duration`],[`aria-hidden`,`true`,1,`bar`],[1,`when`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`m15 9-6 6M9 9l6 6`],[`d`,`M5.6 5.6l12.8 12.8`],[`d`,`M12 7v5l3 2`],[3,`announce`,`call`,`now`],[`scope`,`col`],[`scope`,`row`],[1,`note`],[1,`hint`],[`type`,`button`,1,`copy`],[`type`,`button`,1,`copy`,3,`click`],[1,`last`],[`data-tone`,`warn`,1,`chip`,`leak`],[1,`payload`],[`d`,`M12 3 2 21h20z`],[`d`,`M12 10v4M12 17.5v.01`]],template:function(e,t){if(e&1&&P(0,nq,2,0,`p`,1)(1,rq,5,0,`div`,2)(2,Iq,57,13)(3,Lq,2,0,`p`,1),e&2){let e;F(t.loaded()?t.failed()?1:(e=t.page())?2:3:0,e)}},dependencies:[WD,jD,zK,QK],styles:[`[_nghost-%COMP%] {
display: block;
font-size: 13px;
}
@@ -13879,7 +13889,7 @@ td.last[_ngcontent-%COMP%] {
.empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%],
.state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {
margin: 0 0 8px;
-}`]})};function Lq(e){return`
+}`]})};function Hq(e){return`
.devframes-dock-entry button {
transition: opacity 0.2s, filter 0.2s, background-color 0.2s, transform 0.3s;
}
@@ -13910,7 +13920,7 @@ td.last[_ngcontent-%COMP%] {
transition: none;
}
}
-`}var Rq=new Map;function zq(e,t=`dark`,n=50){let r=e?.querySelector(`devframes-dock-standalone`)?.shadowRoot;if(r){if(e){let t=Rq.get(e);t!==void 0&&(clearTimeout(t),Rq.delete(e))}let n=r.querySelector(`style[data-pangular]`);n||(n=e.createElement(`style`),n.dataset.pangular=``,r.append(n)),n.textContent=Lq(t);return}if(n>0&&e){let r=Rq.get(e);r!==void 0&&clearTimeout(r);let i=setTimeout(()=>{Rq.delete(e),zq(e,t,n-1)},100);Rq.set(e,i)}}var Bq=class e{current=j(`dark`);constructor(){let e=E(Cs),t=Uq(),n=document.documentElement.dataset.theme,r=n===`light`||n===`dark`;if(n===`light`||n===`dark`)this.current.set(n);else if(t)r=!0,this.apply(Hq(t));else{let t=Vq();if(t){this.current.set(t.matches?`light`:`dark`);let n=e=>{r||this.current.set(e.matches?`light`:`dark`)};t.addEventListener(`change`,n),e.onDestroy(()=>t.removeEventListener(`change`,n))}}let i;try{i=new BroadcastChannel(`pangular:theme`)}catch{}uc(()=>{let e=this.current();try{i?.postMessage(e)}catch{}try{let t=window;for(;t!==t.parent;)t=t.parent,t.postMessage({type:`pangular:theme-change`,theme:e},`*`)}catch{}});let a=e=>{if(e.source!==window.parent)return;let t=e.data;t?.type===`pangular:theme-change`&&(r=!0,this.apply(t.theme===`dark`?`dark`:`light`))};window.addEventListener(`message`,a);let o;t&&(o=new MutationObserver(()=>this.apply(Hq(t))),o.observe(t,{attributes:!0,attributeFilter:[`class`]})),e.onDestroy(()=>{window.removeEventListener(`message`,a),o?.disconnect(),i?.close()})}apply(e){this.current.set(e),document.documentElement.dataset.theme=e}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})};function Vq(){try{return window.matchMedia?.(`(prefers-color-scheme: light)`)??null}catch{return null}}function Hq(e){return e.classList.contains(`dark`)?`dark`:`light`}function Uq(){try{return window.frameElement?.closest(`.devframes-color-root`)??null}catch{return null}}var Wq=`__DEVFRAME_HUB_CLIENT_CONTEXT__`,Gq=`pangular:`;function Kq(){try{return window.parent===window?void 0:window.parent[Wq]}catch{return}}function qq(e,t,n=50){let r=Kq();if(!r){if(n<=0||window.parent===window)return()=>{};let r=()=>{},i=setTimeout(()=>r=qq(e,t,n-1),100);return()=>{clearTimeout(i),r()}}let i=e.map(e=>r.docks.getStateById(Gq+e)?.events.on(`entry:activated`,()=>t(e))??(()=>{})),a=r.docks.selectedId,o=e.find(e=>Gq+e===a);return o&&t(o),()=>i.forEach(e=>e())}function Jq(){return!!Kq()}async function Yq(e){let t=Kq();if(!t)return!1;try{return await t.docks.switchEntry(Gq+e)}catch{return!1}}function Xq(e,t){let n=new URL(e);return n.searchParams.delete(`view`),n.hash=t?`tab=${t}`:``,n.pathname+n.search+n.hash}function Zq(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var Qq=`pangular-tab`;function $q(e,t,n){let r=new URLSearchParams(e.replace(/^#/,``)).get(`tab`)||t;return n.find(e=>e===r)}function eJ(e){try{return sessionStorage.getItem(`${Qq}:${e}`)}catch{return null}}function tJ(e,t){try{sessionStorage.setItem(`${Qq}:${e}`,t)}catch{}}function nJ(e,t){try{return new URL(e,t.href).origin===t.origin}catch{return!1}}function rJ(e,t){if(t.protocol!==`chrome-extension:`)return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function iJ(e=location){let t=new URLSearchParams(e.search).get(`baseURL`);if(t&&(nJ(t,e)||rJ(t,e)))return t;if(!(e.pathname.includes(`__pangular`)||e.pathname.includes(`__devframes/`)))return[`/__pangular/`,`./`]}var aJ={dark:{ngrx:{accent:`#d770e8`,text:`#f0abfc`},analog:{accent:`#ff5470`,text:`#fda4af`},"angular-native":{accent:`#ff4d6d`,text:`#fda4af`},nativescript:{accent:`#8196ff`,text:`#a5b4fc`},capacitor:{accent:`#53b9ff`,text:`#7dd3fc`}},light:{ngrx:{accent:`#a21caf`,text:`#701a75`},analog:{accent:`#be123c`,text:`#881337`},"angular-native":{accent:`#be123c`,text:`#881337`},nativescript:{accent:`#3448c5`,text:`#3730a3`},capacitor:{accent:`#0369a1`,text:`#0c4a6e`}}};function oJ(e,t){let n=aJ[t];return e&&n[e]||null}var sJ=[`nav`],cJ=[`main`],lJ=e=>[e],uJ=(e,t)=>t.id;function dJ(e,t){e&1&&(A(),z(0,`svg`,4),V(1,`path`,21),B())}function fJ(e,t){e&1&&(A(),z(0,`svg`,4),V(1,`path`,22)(2,`path`,23)(3,`path`,24)(4,`path`,25)(5,`path`,26)(6,`path`,27),B())}function pJ(e,t){e&1&&(A(),z(0,`svg`,5)(1,`defs`)(2,`linearGradient`,28),V(3,`stop`,29)(4,`stop`,30),B()(),V(5,`path`,31),z(6,`g`,32),V(7,`path`,33)(8,`path`,34)(9,`path`,35)(10,`path`,36),B()())}function mJ(e,t){e&1&&(A(),z(0,`svg`,6),V(1,`path`,37)(2,`path`,38)(3,`path`,39)(4,`path`,40),B())}function hJ(e,t){e&1&&(A(),z(0,`svg`,7),V(1,`path`,41),B())}function gJ(e,t){e&1&&(A(),z(0,`svg`,8)(1,`defs`)(2,`linearGradient`,42),V(3,`stop`,43)(4,`stop`,44)(5,`stop`,45)(6,`stop`,46)(7,`stop`,47)(8,`stop`,48),B()(),V(9,`path`,49),B())}function _J(e,t){e&1&&(A(),z(0,`svg`,9),V(1,`rect`,50),z(2,`g`,51)(3,`defs`)(4,`mask`,52),V(5,`rect`,53),z(6,`g`,54),V(7,`path`,55)(8,`path`,56),B()(),z(9,`clipPath`,57),V(10,`rect`,58),B()(),z(11,`g`,59),V(12,`ellipse`,60),B(),z(13,`g`,61),V(14,`path`,62)(15,`path`,63),B(),z(16,`g`,59),V(17,`ellipse`,64)(18,`ellipse`,65),z(19,`g`,66),V(20,`line`,67)(21,`circle`,68)(22,`line`,69)(23,`circle`,70),B()()()())}function vJ(e,t){if(e&1){let e=W();z(0,`button`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).switchTab(t.id))}),V(1,`app-tab-icon`,73),z(2,`span`),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.tab()===e.id),N(`aria-current`,n.tab()===e.id?`page`:null),M(),R(`name`,e.id),M(2),Y(e.label)}}function yJ(e,t){e&1&&I(0,vJ,4,5,`button`,71,uJ),e&2&&L(K().tabs())}function bJ(e,t){if(e&1){let e=W();z(0,`a`,74),G(`click`,function(t){let n=O(e);return k(K().openFullPanel(t,n.tab))}),A(),z(1,`svg`,75),V(2,`rect`,76)(3,`rect`,77)(4,`rect`,78)(5,`rect`,79),B(),J(6,` Open full panel `),B()}e&2&&R(`href`,t.href,ku)}function xJ(e,t){e&1&&(z(0,`p`,17),J(1,` Can't reach the devtools server. Check that the dev server is running, then reload. `),B())}function SJ(e,t){e&1&&V(0,`app-coming-soon`,18),e&2&&R(`info`,t)}function CJ(e,t){e&1&&(z(0,`p`,19),J(1,`Looking for an Angular Native app…`),B())}function wJ(e,t){e&1&&(z(0,`p`,20),J(1,` This inspector is turned off in the devtools config (`),z(2,`code`),J(3,`inspectors`),B(),J(4,`). `),B())}function TJ(e,t){if(e&1){let e=W();z(0,`app-dashboard`,82),G(`navigate`,function(t){return O(e),k(K(3).switchTab(t))}),B()}e&2&&R(`rpc`,K(3).rpc())}function EJ(e,t){if(e&1){let e=W();z(0,`app-component-tree`,83),G(`focusHandled`,function(){return O(e),k(K(3).componentFocus.set(null))})(`showForm`,function(t){return O(e),k(K(3).showForm(t))}),B()}if(e&2){let e=K(3);R(`rpc`,e.rpc())(`focus`,e.componentFocus())}}function DJ(e,t){if(e&1){let e=W();z(0,`app-route-inspector`,84),G(`showComponent`,function(t){return O(e),k(K(3).showComponent(t))}),B()}e&2&&R(`rpc`,K(3).rpc())}function OJ(e,t){e&1&&V(0,`app-signal-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function kJ(e,t){e&1&&V(0,`app-di-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function AJ(e,t){e&1&&V(0,`app-store-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function jJ(e,t){e&1&&V(0,`app-network-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function MJ(e,t){if(e&1){let e=W();z(0,`app-forms-inspector`,85),G(`focusHandled`,function(){return O(e),k(K(3).formFocus.set(null))}),B()}if(e&2){let e=K(3);R(`rpc`,e.rpc())(`focus`,e.formFocus())}}function NJ(e,t){e&1&&V(0,`app-pipes-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function PJ(e,t){e&1&&V(0,`app-analog-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function FJ(e,t){e&1&&V(0,`app-capacitor-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function IJ(e,t){if(e&1&&P(0,TJ,1,1,`app-dashboard`,80)(1,EJ,1,2,`app-component-tree`,81)(2,DJ,1,1,`app-route-inspector`,80)(3,OJ,1,1,`app-signal-inspector`,80)(4,kJ,1,1,`app-di-inspector`,80)(5,AJ,1,1,`app-store-inspector`,80)(6,jJ,1,1,`app-network-inspector`,80)(7,MJ,1,2,`app-forms-inspector`,81)(8,NJ,1,1,`app-pipes-inspector`,80)(9,PJ,1,1,`app-analog-inspector`,80)(10,FJ,1,1,`app-capacitor-inspector`,80),e&2){let e;F((e=K(2).tab())===`dashboard`?0:e===`components`?1:e===`routes`?2:e===`signals`?3:e===`injectors`?4:e===`store`?5:e===`network`?6:e===`forms`?7:e===`pipes`?8:e===`analog`?9:e===`capacitor`?10:-1)}}function LJ(e,t){e&1&&I(0,IJ,11,1,null,null,wg),e&2&&L(sv(0,lJ,K().scopeKey()))}var RJ=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`],zJ=`all`,BJ=[zJ,...RJ],VJ={angular:`Angular`,ngrx:`NgRx Store`,analog:`Analog`,"angular-native":`Angular Native`,nativescript:`NativeScript`,capacitor:`Capacitor`},HJ={ngrx:`store`,analog:`analog`,capacitor:`capacitor`},UJ={store:`ngrx`,analog:`analog`,capacitor:`capacitor`},WJ={"angular-native":[`components`,`signals`,`injectors`,`store`,`pipes`]},GJ={id:`nativescript`,name:`NativeScript`,badge:`Available`,heading:`Inspect NativeScript apps`,summary:`A NativeScript Angular app reports from the simulator or device to this server, and its components, signals, injectors and NgRx stores show up in the Angular dock.`,color:`#3c5afd`,plansTitle:`Set up an app`,plans:[`Install @pangular-inspector/devtools and @valor/nativescript-websockets`,`Call initNativeScriptOverlay() in main.ts, before the app bootstraps`,`Run npx pangular dev --no-auth in the app, then open the Angular dock`],link:{label:`NativeScript setup guide`,href:`https://pangular-inspector.dev/guides/nativescript/`}},KJ={id:`capacitor`,name:`Capacitor`,badge:`Available`,heading:`Inspect Capacitor apps`,summary:`An Ionic or Capacitor app runs the browser overlay in its WebView and reports to this server, so it shows up in the Angular dock like a browser tab.`,color:`#119eff`,plansTitle:`Set up an app`,plans:[`With live reload on localhost, load @pangular-inspector/devtools/overlay as in a browser`,`In a bundled build, call initOverlay() from @pangular-inspector/devtools/overlay-manual with this server’s address and connectionMeta`,`Run the app, then come back here for its plugin calls, or open the Angular dock`],link:{label:`Capacitor setup guide`,href:`https://pangular-inspector.dev/guides/capacitor/`}},qJ={id:`analog`,name:`Analog`,badge:`Not in this app`,heading:`This app doesn’t use Analog`,summary:`In an Analog app this dock shows your file routes, server load() and API calls, render modes and route lint.`,color:`#dd0330`,plans:[`Which page, layout and .server.ts files render a URL`,`Every load(), server function and API call with timing`,`SSR, prerendered or client only, per page`],link:{label:`Get started with Analog`,href:`https://analogjs.org/docs/getting-started`}},JJ={id:`angular-native`,name:`Angular Native`,badge:`Not connected`,heading:`No Angular Native app is connected`,summary:`Start the overlay in your Angular Native app and run this server with --no-auth. The tabs fill as soon as the app reports.`,color:`#e11d48`,plans:[`The component tree, with the view outlined on the device`,`Signals and injectors of the running app`,`Live @ngrx/signals and @ngrx/store state`],link:{label:`Set up Angular Native`,href:`https://pangular-inspector.dev/guides/angular-native/`}};function YJ(){let e=new URLSearchParams(location.search).get(`view`);return RJ.find(t=>t===e)??null}Ub(class e{analog=j(!1);allTabs=[{id:`dashboard`,label:`Dashboard`},{id:`analog`,label:`Analog`},{id:`components`,label:`Components`},{id:`routes`,label:`Routes`},{id:`signals`,label:`Signals`},{id:`injectors`,label:`Injectors`},{id:`store`,label:`Store`},{id:`forms`,label:`Forms`},{id:`pipes`,label:`Pipes`},{id:`network`,label:`SSR & HTTP`},{id:`capacitor`,label:`Capacitor`}];view=j(YJ());viewAccent=Q(()=>oJ(this.view(),this.themeService.current()));title=Q(()=>{let e=this.view();return e?VJ[e]:`Pangular Inspector`});mainLabel=Q(()=>this.availableTabs().find(e=>e.id===this.tab())?.label??this.title());analogKnown=j(!1);capacitorReporting=j(!1);capacitorKnown=j(!1);nativePageId=j(null);nativeKnown=j(!1);scopeKey=Q(()=>this.view()===`angular-native`?this.nativePageId()??``:``);comingSoon=Q(()=>{let e=this.view();if(e===`analog`)return this.analogKnown()&&!this.analog()?qJ:void 0;if(e===`nativescript`)return GJ;if(e===`capacitor`)return this.config().inspectors.capacitor&&this.capacitorKnown()&&!this.capacitorReporting()?KJ:void 0;if(e===`angular-native`)return this.nativeKnown()&&!this.nativePageId()?JJ:void 0});config=Q(()=>yE(this.rpc()));tabEnabled=SE;availableTabs=Q(()=>{if(this.comingSoon())return[];let e=this.view(),t=e?HJ[e]:void 0,n=this.allTabs.filter(e=>SE(e.id,this.config()));if(t)return n.filter(e=>e.id===t);let r=e?WJ[e]:void 0;return r?n.filter(e=>r.includes(e.id)):n.filter(t=>(t.id!==`analog`||this.analog())&&(t.id!==`capacitor`||this.capacitorReporting())&&!(e===`angular`&&UJ[t.id]))});tabs=Q(()=>{let e=this.availableTabs();if(this.rpc())return e;let t=this.tab();return e.filter(e=>e.id===`dashboard`||e.id===t)});fullPanelLink=Q(()=>{let e=this.view();if(!e||location.protocol===`chrome-extension:`)return null;let t=this.comingSoon()?`dashboard`:HJ[e]??this.tab();return{tab:t,href:Xq(location.href,t)}});tab=Tv(()=>{let e=this.view();return e&&(HJ[e]??WJ[e]?.[0])||`dashboard`});rpc=j(null);connected=j(!1);connectionFailed=j(!1);hiddenPages=j([]);pageId=eE();backgroundNote=Q(()=>{let e=this.hiddenPages();return this.pageId?e.includes(this.pageId)?`Tab in background, showing the last data.`:``:e.length?e.length===1?`A tab is in the background, showing its last data.`:`${e.length} tabs are in the background, showing their last data.`:``});stopVisibility=()=>{};stopNative=()=>{};stopCapacitor=()=>{};stopFollowing=()=>{};stopHighlights=()=>{};nav=Rv(`nav`);main=Rv(`main`);injector=E(xs);themeService=E(Bq);navObserver;navFade=j({start:!1,end:!1});constructor(){Id(()=>{let e=this.nav()?.nativeElement;e&&typeof ResizeObserver<`u`&&(this.navObserver=new ResizeObserver(()=>this.measureNav()),this.navObserver.observe(e))}),ey(()=>{this.tab(),this.tabs(),Cv(()=>{this.revealActiveTab(),this.measureNav()})}),uc(()=>{let e=this.themeService.current();Cv(()=>{try{window.parent!==window&&zq(window.parent.document,e)}catch{}})})}measureNav(){let e=this.nav()?.nativeElement;if(!e)return;let t=e.scrollWidth-e.clientWidth,n=e.scrollLeft>1,r=t>1&&e.scrollLeftn?e.scrollLeft=Math.max(0,n):e.scrollLefte===zJ?this.showFullPanel():this.showView(e));let e=$q(location.hash,eJ(this.tabScope()),this.availableTabs().map(e=>e.id));e?this.tab.set(e):!this.view()&&$q(location.hash,eJ(this.tabScope()),[`capacitor`])===`capacitor`?this.restoreCapacitor=!0:!this.view()&&$q(location.hash,eJ(this.tabScope()),[`analog`])===`analog`&&(this.restoreAnalog=!0),this.stopHighlights=sE(()=>this.rpc());let t=iJ();kT(t?{baseURL:t}:{}).then(e=>{this.rpc.set(e),this.connected.set(!0),this.watchVisibility(e),this.watchAngularNative(e),this.watchCapacitor(e),e.scope(`pangular`).rpc.call(`analog-project`).then(e=>{let t=!!e?.analog;this.analog.set(t),this.analogKnown.set(!0),t&&this.restoreAnalog&&SE(`analog`,this.config())&&this.tab.set(`analog`),this.restoreAnalog=!1,!t&&this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)},()=>{this.analogKnown.set(!0),this.restoreAnalog=!1,this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)}),e.events.on(`connection:status`,e=>{this.connected.set(e===`connected`)})},()=>{this.connectionFailed.set(!0),this.analogKnown.set(!0),this.nativeKnown.set(!0)})}ngOnDestroy(){this.stopNative(),this.stopCapacitor(),this.stopFollowing(),this.stopVisibility(),this.stopHighlights(),this.navObserver?.disconnect()}showView(e){if(e===this.view())return;$T(e===`angular-native`?this.nativePageId():null),this.view.set(e);let t=new URL(location.href);t.searchParams.set(`view`,e),t.hash=``,history.replaceState(history.state,``,t)}showFullPanel(e){if(!this.view())return;$T(null),this.view.set(null);let t=new URL(location.href);t.searchParams.delete(`view`),t.hash=e?`tab=${e}`:``,history.replaceState(history.state,``,t);let n=e??eJ(this.tabScope()),r=this.availableTabs().map(e=>e.id),i=$q(t.hash,n,r);i?this.setTab(i):n===`capacitor`&&(this.restoreCapacitor=!0)}openFullPanel(e,t){Zq(e)&&Jq()&&(e.preventDefault(),this.showFullPanel(t),this.focusCurrentTab(),Yq(zJ))}formFocus=j(null);componentFocus=Tv({source:this.tab,computation:()=>null});showForm(e){this.formFocus.set({id:e}),this.switchTab(`forms`)}showComponent(e){this.config().inspectors.components&&(this.switchTab(`components`),this.componentFocus.set(e))}inspectFromPanel({source:e,origin:t,data:n}){if(e!==window.parent||t!==location.origin)return;let r=n;r?.type===`pangular:inspect-component`&&typeof r.id==`string`&&this.tab()===`components`&&this.config().inspectors.components&&this.componentFocus.set({id:r.id})}switchTab(e){let t=UJ[e];if(this.view()===`angular`&&t){this.activateDock(t,e);return}this.setTab(e),history.replaceState(history.state,``,`#tab=${e}`)}restoreAnalog=!1;restoreCapacitor=!1;setTab(e){this.restoreAnalog=!1,this.restoreCapacitor=!1,this.keepFocus(),this.tab.set(e),tJ(this.tabScope(),e)}tabScope(){return this.view()??`panel`}async watchAngularNative(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`component-tree`),n=e=>{let t=e?.pages,n=xD(t,this.nativePageId());this.view()===`angular-native`&&$T(n),this.nativePageId.set(n),this.nativeKnown.set(!0)};n(t.value()),this.stopNative(),this.stopNative=t.on(`updated`,n)}catch{this.nativeKnown.set(!0)}}async watchCapacitor(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`capacitor`),n=e=>{if(e===void 0)return;let t=aK(e).length>0;this.capacitorReporting.set(t),this.capacitorKnown.set(!0),t&&this.restoreCapacitor&&SE(`capacitor`,this.config())&&(this.restoreCapacitor=!1,this.tab.set(`capacitor`)),!t&&this.tab()===`capacitor`&&!this.view()&&this.tab.set(`dashboard`)};n(t.value()),this.stopCapacitor(),this.stopCapacitor=t.on(`updated`,n)}catch{this.capacitorReporting.set(!1),this.capacitorKnown.set(!0)}}async watchVisibility(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`page-visibility`),n=e=>{let t=e?.hidden;this.hiddenPages.set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])};n(t.value()),this.stopVisibility(),this.stopVisibility=t.on(`updated`,n)}catch{}}keepFocus(){let e=document.activeElement,t=this.main()?.nativeElement;(!e||e===document.body||t?.contains(e))&&this.focusCurrentTab()}focusCurrentTab(){Id(()=>{let e=document.activeElement;e&&e!==document.body||(this.nav()?.nativeElement.querySelector(`button.active`)??this.main()?.nativeElement)?.focus()},{injector:this.injector})}async activateDock(e,t){if(await Yq(e))return;if(window.parent===window){this.keepFocus(),this.showView(e);return}let n=this.rpc();if(!n?.call){this.setTab(t);return}try{await n.call(`hub:docks:activate`,{dockId:`pangular:${e}`}),this.keepFocus(),this.showView(e)}catch{this.setTab(t)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-root`]],viewQuery:function(e,t){e&1&&e_(t.nav,sJ,5)(t.main,cJ,5),e&2&&t_(2)},hostVars:4,hostBindings:function(e,t){e&1&&G(`message`,function(e){return t.inspectFromPanel(e)},ju),e&2&&C_(`--%NS%accent`,t.viewAccent()?.accent??null)(`--%NS%accent-text`,t.viewAccent()?.text??null)},decls:29,vars:22,consts:[[`nav`,``],[`main`,``],[1,`brand`],[1,`mark`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 256 256`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 32 32`,`aria-hidden`,`true`],[`width`,`24`,`height`,`17`,`viewBox`,`0 0 256 182`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 24 24`,`fill`,`currentColor`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`aria-hidden`,`true`],[`width`,`30`,`height`,`30`,`viewBox`,`0 0 500 500`,`aria-hidden`,`true`],[1,`title`],[`aria-label`,`Inspectors`,3,`scroll`],[1,`full-panel`,3,`href`],[`role`,`status`,1,`status`],[`aria-hidden`,`true`,1,`dot`],[`tabindex`,`-1`],[`role`,`status`,1,`background-note`],[`role`,`alert`,1,`connection-error`],[3,`info`],[`role`,`status`,1,`turned-off`],[1,`turned-off`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`id`,`an-mark-grad`,`x1`,`0`,`y1`,`0`,`x2`,`1`,`y2`,`1`],[`offset`,`0`,`stop-color`,`#f0224f`],[`offset`,`1`,`stop-color`,`#c4002d`],[`d`,`M16 0C27.2 0 32 4.8 32 16S27.2 32 16 32 0 27.2 0 16 4.8 0 16 0Z`,`fill`,`url(#an-mark-grad)`],[`transform`,`translate(6.4 6.4) scale(0.8)`,`fill`,`#fff`],[`d`,`M14.8486 0L23.138 16.8551L23.9996 3.99892L14.8486 0Z`],[`d`,`M16.9875 17.7114H7.01272L5.73926 20.627L12.0001 24L18.261 20.627L16.9875 17.7114Z`],[`d`,`M8.72168 13.9298H15.2812L11.9997 6.39575L8.72168 13.9298Z`],[`d`,`M9.15103 0L0 3.99892L0.861556 16.8551L9.15103 0Z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`d`,`M12.024.017V0L12 .008L11.976 0v.017L.812 3.892l1.605 14.875l9.559 5.207V24l.024-.013l.024.013v-.026l9.559-5.207l1.605-14.875zm6.868 14.244q-1.64 3.948-6.031 4.166c-2.829 0-4.661-1.7-4.66-1.7q-1.745-1.359-2.398-3.417c-.695-.76-.702-.841-.774-1.145c-.072-.303.045-.388.249-.685q.204-.298.098-.85q-.26-.36-.3-1.128q0-.37.496-.783q.495-.413.607-.632q.083-.119.065-1.031q-.006-.897.995-.975c1-.08 1.565-.832 1.879-1.174c.21-.228.52-.339.91-.341c.551-.026 1.052.185 1.484.62c1.075-.055 2.176.235 3.292.863q2.379 1.414 2.596 3.055q-.257 2.158-5.788-.113q-2.895.819-2.846 3.552q0 2.508 2.422 3.643c-.787-.772-1.122-1.422-1.01-1.959q2.456 2.906 5.588 2.173c-.92.032-1.65-.264-2.198-.893q2.116-.05 3.998-1.972c-.724.576-1.482.794-2.284.657q3.26-2.563 2.307-5.98l-.002-.006a3.02 3.02 0 0 1 .788 2.03q.023 1.175-.795 2.477q.613-.478 1.413-2.047c.23 2.117-.625 3.724-2.574 4.825q.934-.085 2.473-1.23m-5.567-6.63a.319.319 0 1 1 .638 0a.319.319 0 0 1-.638 0`],[`id`,`ng-grad`,`x1`,`49`,`x2`,`226`,`y1`,`214`,`y2`,`130`,`gradientUnits`,`userSpaceOnUse`],[`stop-color`,`#E40035`],[`offset`,`.24`,`stop-color`,`#F60A48`],[`offset`,`.352`,`stop-color`,`#F20755`],[`offset`,`.494`,`stop-color`,`#DC087D`],[`offset`,`.745`,`stop-color`,`#9717E7`],[`offset`,`1`,`stop-color`,`#6C00F5`],[`fill`,`url(#ng-grad)`,`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`width`,`500`,`height`,`500`,`rx`,`112`,`fill`,`#1c1a17`],[`transform`,`translate(250 252) scale(1.38) translate(-120 -129)`],[`id`,`pi-mark-mask`],[`x`,`-60`,`y`,`-60`,`width`,`360`,`height`,`380`,`fill`,`#fff`],[`fill`,`none`,`stroke`,`#000`,`stroke-width`,`30`,`stroke-linejoin`,`miter`],[`d`,`M88 66 V196`],[`d`,`M88 66 H143 L170 98 L143 130 H88 Z`],[`id`,`pi-mark-clip`],[`x`,`-40`,`y`,`129`,`width`,`320`,`height`,`200`],[`transform`,`rotate(-10 120 129)`],[`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#78350f`,`stroke-width`,`10`],[`mask`,`url(#pi-mark-mask)`],[`fill`,`#fbbf24`,`d`,`M120 5 L2 46 L22 198 L120 253 Z`],[`fill`,`#f59e0b`,`d`,`M120 5 L238 46 L218 198 L120 253 Z`],[`clip-path`,`url(#pi-mark-clip)`,`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#1c1a17`,`stroke-width`,`22`],[`clip-path`,`url(#pi-mark-clip)`,`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#fde68a`,`stroke-width`,`10`],[`transform`,`translate(230.9 146.0) rotate(10) scale(1.5) translate(-4 -4)`],[`x1`,`9`,`y1`,`9`,`x2`,`21`,`y2`,`21`,`stroke`,`#1c1a17`,`stroke-width`,`14`,`stroke-linecap`,`round`],[`r`,`16`,`fill`,`#1c1a17`],[`x1`,`9`,`y1`,`9`,`x2`,`21`,`y2`,`21`,`stroke`,`#fde68a`,`stroke-width`,`7`,`stroke-linecap`,`round`],[`r`,`12`,`fill`,`#1c1a17`,`stroke`,`#fde68a`,`stroke-width`,`5`],[`type`,`button`,3,`active`],[`type`,`button`,3,`click`],[3,`name`],[1,`full-panel`,3,`click`,`href`],[`width`,`14`,`height`,`14`,`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`3`,`y`,`14`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`14`,`y`,`14`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[3,`rpc`],[3,`rpc`,`focus`],[3,`navigate`,`rpc`],[3,`focusHandled`,`showForm`,`rpc`,`focus`],[3,`showComponent`,`rpc`],[3,`focusHandled`,`rpc`,`focus`]],template:function(e,t){if(e&1&&(z(0,`header`)(1,`h1`,2)(2,`span`,3),P(3,dJ,2,0,`:svg:svg`,4)(4,fJ,7,0,`:svg:svg`,4)(5,pJ,11,0,`:svg:svg`,5)(6,mJ,5,0,`:svg:svg`,6)(7,hJ,2,0,`:svg:svg`,7)(8,gJ,10,0,`:svg:svg`,8)(9,_J,24,0,`:svg:svg`,9),B(),z(10,`span`,10),J(11),B()(),z(12,`nav`,11,0),G(`scroll`,function(){return t.measureNav()}),P(14,yJ,2,0),B(),P(15,bJ,7,1,`a`,12),z(16,`span`,13)(17,`span`,14),V(18,`span`),B(),J(19),B()(),z(20,`main`,15,1)(22,`p`,16),J(23),B(),P(24,xJ,2,0,`p`,17)(25,SJ,1,1,`app-coming-soon`,18)(26,CJ,2,0,`p`,19)(27,wJ,5,0,`p`,20)(28,LJ,2,2),B()),e&2){let e,n;M(2),q(`ng-mark`,t.view()===`angular`)(`pi-mark`,!t.view()),M(),F(t.view()===`nativescript`?3:t.view()===`capacitor`?4:t.view()===`angular-native`?5:t.view()===`analog`?6:t.view()===`ngrx`?7:t.view()===`angular`?8:9),M(7),q(`ng-text`,t.view()===`angular`),M(),Y(t.title()),M(),q(`fade-start`,t.navFade().start)(`fade-end`,t.navFade().end),M(2),F(t.availableTabs().length>1?14:-1),M(),F((e=t.fullPanelLink())?15:-1,e),M(),q(`connected`,t.connected())(`failed`,t.connectionFailed()),M(3),X(` `,t.connected()?`Live`:t.connectionFailed()?`Disconnected`:`Connecting…`,` `),M(),N(`aria-label`,t.mainLabel()),M(3),Y(t.backgroundNote()),M(),F(t.connectionFailed()?24:(n=t.comingSoon())?25:t.view()===`angular-native`&&!t.nativePageId()?26:t.tabEnabled(t.tab(),t.config())?28:27,n)}},dependencies:[pD,Mk,uN,EP,KF,tR,yB,MV,qU,GG,Iq,QG,PE],styles:[`[_nghost-%COMP%] {
+`}var Uq=new Map;function Wq(e,t=`dark`,n=50){let r=e?.querySelector(`devframes-dock-standalone`)?.shadowRoot;if(r){if(e){let t=Uq.get(e);t!==void 0&&(clearTimeout(t),Uq.delete(e))}let n=r.querySelector(`style[data-pangular]`);n||(n=e.createElement(`style`),n.dataset.pangular=``,r.append(n)),n.textContent=Hq(t);return}if(n>0&&e){let r=Uq.get(e);r!==void 0&&clearTimeout(r);let i=setTimeout(()=>{Uq.delete(e),Wq(e,t,n-1)},100);Uq.set(e,i)}}var Gq=class e{current=j(`dark`);constructor(){let e=E(Cs),t=Jq(),n=document.documentElement.dataset.theme,r=n===`light`||n===`dark`;if(n===`light`||n===`dark`)this.current.set(n);else if(t)r=!0,this.apply(qq(t));else{let t=Kq();if(t){this.current.set(t.matches?`light`:`dark`);let n=e=>{r||this.current.set(e.matches?`light`:`dark`)};t.addEventListener(`change`,n),e.onDestroy(()=>t.removeEventListener(`change`,n))}}let i;try{i=new BroadcastChannel(`pangular:theme`)}catch{}uc(()=>{let e=this.current();try{i?.postMessage(e)}catch{}try{let t=window;for(;t!==t.parent;)t=t.parent,t.postMessage({type:`pangular:theme-change`,theme:e},`*`)}catch{}});let a=e=>{if(e.source!==window.parent)return;let t=e.data;t?.type===`pangular:theme-change`&&(r=!0,this.apply(t.theme===`dark`?`dark`:`light`))};window.addEventListener(`message`,a);let o;t&&(o=new MutationObserver(()=>this.apply(qq(t))),o.observe(t,{attributes:!0,attributeFilter:[`class`]})),e.onDestroy(()=>{window.removeEventListener(`message`,a),o?.disconnect(),i?.close()})}apply(e){this.current.set(e),document.documentElement.dataset.theme=e}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})};function Kq(){try{return window.matchMedia?.(`(prefers-color-scheme: light)`)??null}catch{return null}}function qq(e){return e.classList.contains(`dark`)?`dark`:`light`}function Jq(){try{return window.frameElement?.closest(`.devframes-color-root`)??null}catch{return null}}var Yq=`__DEVFRAME_HUB_CLIENT_CONTEXT__`,Xq=`pangular:`;function Zq(){try{return window.parent===window?void 0:window.parent[Yq]}catch{return}}function Qq(e,t,n=50){let r=Zq();if(!r){if(n<=0||window.parent===window)return()=>{};let r=()=>{},i=setTimeout(()=>r=Qq(e,t,n-1),100);return()=>{clearTimeout(i),r()}}let i=e.map(e=>r.docks.getStateById(Xq+e)?.events.on(`entry:activated`,()=>t(e))??(()=>{})),a=r.docks.selectedId,o=e.find(e=>Xq+e===a);return o&&t(o),()=>i.forEach(e=>e())}function $q(){return!!Zq()}async function eJ(e){let t=Zq();if(!t)return!1;try{return await t.docks.switchEntry(Xq+e)}catch{return!1}}function tJ(e,t){let n=new URL(e);return n.searchParams.delete(`view`),n.hash=t?`tab=${t}`:``,n.pathname+n.search+n.hash}function nJ(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var rJ=`pangular-tab`;function iJ(e,t,n){let r=new URLSearchParams(e.replace(/^#/,``)).get(`tab`)||t;return n.find(e=>e===r)}function aJ(e){try{return sessionStorage.getItem(`${rJ}:${e}`)}catch{return null}}function oJ(e,t){try{sessionStorage.setItem(`${rJ}:${e}`,t)}catch{}}function sJ(e,t){try{return new URL(e,t.href).origin===t.origin}catch{return!1}}function cJ(e,t){if(t.protocol!==`chrome-extension:`)return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function lJ(e=location){let t=new URLSearchParams(e.search).get(`baseURL`);if(t&&(sJ(t,e)||cJ(t,e)))return t;if(!(e.pathname.includes(`__pangular`)||e.pathname.includes(`__devframes/`)))return[`/__pangular/`,`./`]}var uJ={dark:{ngrx:{accent:`#d770e8`,text:`#f0abfc`},analog:{accent:`#ff5470`,text:`#fda4af`},"angular-native":{accent:`#ff4d6d`,text:`#fda4af`},nativescript:{accent:`#8196ff`,text:`#a5b4fc`},capacitor:{accent:`#53b9ff`,text:`#7dd3fc`}},light:{ngrx:{accent:`#a21caf`,text:`#701a75`},analog:{accent:`#be123c`,text:`#881337`},"angular-native":{accent:`#be123c`,text:`#881337`},nativescript:{accent:`#3448c5`,text:`#3730a3`},capacitor:{accent:`#0369a1`,text:`#0c4a6e`}}};function dJ(e,t){let n=uJ[t];return e&&n[e]||null}var fJ=[`nav`],pJ=[`main`],mJ=e=>[e],hJ=(e,t)=>t.id;function gJ(e,t){e&1&&(A(),z(0,`svg`,4),V(1,`path`,21),B())}function _J(e,t){e&1&&(A(),z(0,`svg`,4),V(1,`path`,22)(2,`path`,23)(3,`path`,24)(4,`path`,25)(5,`path`,26)(6,`path`,27),B())}function vJ(e,t){e&1&&(A(),z(0,`svg`,5)(1,`defs`)(2,`linearGradient`,28),V(3,`stop`,29)(4,`stop`,30),B()(),V(5,`path`,31),z(6,`g`,32),V(7,`path`,33)(8,`path`,34)(9,`path`,35)(10,`path`,36),B()())}function yJ(e,t){e&1&&(A(),z(0,`svg`,6),V(1,`path`,37)(2,`path`,38)(3,`path`,39)(4,`path`,40),B())}function bJ(e,t){e&1&&(A(),z(0,`svg`,7),V(1,`path`,41),B())}function xJ(e,t){e&1&&(A(),z(0,`svg`,8)(1,`defs`)(2,`linearGradient`,42),V(3,`stop`,43)(4,`stop`,44)(5,`stop`,45)(6,`stop`,46)(7,`stop`,47)(8,`stop`,48),B()(),V(9,`path`,49),B())}function SJ(e,t){e&1&&(A(),z(0,`svg`,9),V(1,`rect`,50),z(2,`g`,51)(3,`defs`)(4,`mask`,52),V(5,`rect`,53),z(6,`g`,54),V(7,`path`,55)(8,`path`,56),B()(),z(9,`clipPath`,57),V(10,`rect`,58),B()(),z(11,`g`,59),V(12,`ellipse`,60),B(),z(13,`g`,61),V(14,`path`,62)(15,`path`,63),B(),z(16,`g`,59),V(17,`ellipse`,64)(18,`ellipse`,65),z(19,`g`,66),V(20,`line`,67)(21,`circle`,68)(22,`line`,69)(23,`circle`,70),B()()()())}function CJ(e,t){if(e&1){let e=W();z(0,`button`,72),G(`click`,function(){let t=O(e).$implicit;return k(K(2).switchTab(t.id))}),V(1,`app-tab-icon`,73),z(2,`span`),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.tab()===e.id),N(`aria-current`,n.tab()===e.id?`page`:null),M(),R(`name`,e.id),M(2),Y(e.label)}}function wJ(e,t){e&1&&I(0,CJ,4,5,`button`,71,hJ),e&2&&L(K().tabs())}function TJ(e,t){if(e&1){let e=W();z(0,`a`,74),G(`click`,function(t){let n=O(e);return k(K().openFullPanel(t,n.tab))}),A(),z(1,`svg`,75),V(2,`rect`,76)(3,`rect`,77)(4,`rect`,78)(5,`rect`,79),B(),J(6,` Open full panel `),B()}e&2&&R(`href`,t.href,ku)}function EJ(e,t){e&1&&(z(0,`p`,17),J(1,` Can't reach the devtools server. Check that the dev server is running, then reload. `),B())}function DJ(e,t){e&1&&V(0,`app-coming-soon`,18),e&2&&R(`info`,t)}function OJ(e,t){e&1&&(z(0,`p`,19),J(1,`Looking for an Angular Native app…`),B())}function kJ(e,t){e&1&&(z(0,`p`,20),J(1,` This inspector is turned off in the devtools config (`),z(2,`code`),J(3,`inspectors`),B(),J(4,`). `),B())}function AJ(e,t){if(e&1){let e=W();z(0,`app-dashboard`,82),G(`navigate`,function(t){return O(e),k(K(3).switchTab(t))}),B()}e&2&&R(`rpc`,K(3).rpc())}function jJ(e,t){if(e&1){let e=W();z(0,`app-component-tree`,83),G(`focusHandled`,function(){return O(e),k(K(3).componentFocus.set(null))})(`showForm`,function(t){return O(e),k(K(3).showForm(t))}),B()}if(e&2){let e=K(3);R(`rpc`,e.rpc())(`focus`,e.componentFocus())}}function MJ(e,t){if(e&1){let e=W();z(0,`app-route-inspector`,84),G(`showComponent`,function(t){return O(e),k(K(3).showComponent(t))}),B()}e&2&&R(`rpc`,K(3).rpc())}function NJ(e,t){e&1&&V(0,`app-signal-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function PJ(e,t){e&1&&V(0,`app-di-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function FJ(e,t){e&1&&V(0,`app-store-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function IJ(e,t){e&1&&V(0,`app-network-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function LJ(e,t){if(e&1){let e=W();z(0,`app-forms-inspector`,85),G(`focusHandled`,function(){return O(e),k(K(3).formFocus.set(null))}),B()}if(e&2){let e=K(3);R(`rpc`,e.rpc())(`focus`,e.formFocus())}}function RJ(e,t){e&1&&V(0,`app-pipes-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function zJ(e,t){e&1&&V(0,`app-analog-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function BJ(e,t){e&1&&V(0,`app-capacitor-inspector`,80),e&2&&R(`rpc`,K(3).rpc())}function VJ(e,t){if(e&1&&P(0,AJ,1,1,`app-dashboard`,80)(1,jJ,1,2,`app-component-tree`,81)(2,MJ,1,1,`app-route-inspector`,80)(3,NJ,1,1,`app-signal-inspector`,80)(4,PJ,1,1,`app-di-inspector`,80)(5,FJ,1,1,`app-store-inspector`,80)(6,IJ,1,1,`app-network-inspector`,80)(7,LJ,1,2,`app-forms-inspector`,81)(8,RJ,1,1,`app-pipes-inspector`,80)(9,zJ,1,1,`app-analog-inspector`,80)(10,BJ,1,1,`app-capacitor-inspector`,80),e&2){let e;F((e=K(2).tab())===`dashboard`?0:e===`components`?1:e===`routes`?2:e===`signals`?3:e===`injectors`?4:e===`store`?5:e===`network`?6:e===`forms`?7:e===`pipes`?8:e===`analog`?9:e===`capacitor`?10:-1)}}function HJ(e,t){e&1&&I(0,VJ,11,1,null,null,wg),e&2&&L(sv(0,mJ,K().scopeKey()))}var UJ=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`],WJ=`all`,GJ=[WJ,...UJ],KJ={angular:`Angular`,ngrx:`NgRx Store`,analog:`Analog`,"angular-native":`Angular Native`,nativescript:`NativeScript`,capacitor:`Capacitor`},qJ={ngrx:`store`,analog:`analog`,capacitor:`capacitor`},JJ={store:`ngrx`,analog:`analog`,capacitor:`capacitor`},YJ={"angular-native":[`components`,`signals`,`injectors`,`store`,`pipes`]},XJ={id:`nativescript`,name:`NativeScript`,badge:`Available`,heading:`Inspect NativeScript apps`,summary:`A NativeScript Angular app reports from the simulator or device to this server, and its components, signals, injectors and NgRx stores show up in the Angular dock.`,color:`#3c5afd`,plansTitle:`Set up an app`,plans:[`Install @pangular-inspector/devtools and @valor/nativescript-websockets`,`Call initNativeScriptOverlay() in main.ts, before the app bootstraps`,`Run npx pangular dev --no-auth in the app, then open the Angular dock`],link:{label:`NativeScript setup guide`,href:`https://pangular-inspector.dev/guides/nativescript/`}},ZJ={id:`capacitor`,name:`Capacitor`,badge:`Available`,heading:`Inspect Capacitor apps`,summary:`An Ionic or Capacitor app runs the browser overlay in its WebView and reports to this server, so it shows up in the Angular dock like a browser tab.`,color:`#119eff`,plansTitle:`Set up an app`,plans:[`With live reload on localhost, load @pangular-inspector/devtools/overlay as in a browser`,`In a bundled build, call initOverlay() from @pangular-inspector/devtools/overlay-manual with this server’s address and connectionMeta`,`Run the app, then come back here for its plugin calls, or open the Angular dock`],link:{label:`Capacitor setup guide`,href:`https://pangular-inspector.dev/guides/capacitor/`}},QJ={id:`analog`,name:`Analog`,badge:`Not in this app`,heading:`This app doesn’t use Analog`,summary:`In an Analog app this dock shows your file routes, server load() and API calls, render modes and route lint.`,color:`#dd0330`,plans:[`Which page, layout and .server.ts files render a URL`,`Every load(), server function and API call with timing`,`SSR, prerendered or client only, per page`],link:{label:`Get started with Analog`,href:`https://analogjs.org/docs/getting-started`}},$J={id:`angular-native`,name:`Angular Native`,badge:`Not connected`,heading:`No Angular Native app is connected`,summary:`Start the overlay in your Angular Native app and run this server with --no-auth. The tabs fill as soon as the app reports.`,color:`#e11d48`,plans:[`The component tree, with the view outlined on the device`,`Signals and injectors of the running app`,`Live @ngrx/signals and @ngrx/store state`],link:{label:`Set up Angular Native`,href:`https://pangular-inspector.dev/guides/angular-native/`}};function eY(){let e=new URLSearchParams(location.search).get(`view`);return UJ.find(t=>t===e)??null}Ub(class e{analog=j(!1);allTabs=[{id:`dashboard`,label:`Dashboard`},{id:`analog`,label:`Analog`},{id:`components`,label:`Components`},{id:`routes`,label:`Routes`},{id:`signals`,label:`Signals`},{id:`injectors`,label:`Injectors`},{id:`store`,label:`Store`},{id:`forms`,label:`Forms`},{id:`pipes`,label:`Pipes`},{id:`network`,label:`SSR & HTTP`},{id:`capacitor`,label:`Capacitor`}];view=j(eY());viewAccent=Q(()=>dJ(this.view(),this.themeService.current()));title=Q(()=>{let e=this.view();return e?KJ[e]:`Pangular Inspector`});mainLabel=Q(()=>this.availableTabs().find(e=>e.id===this.tab())?.label??this.title());analogKnown=j(!1);capacitorReporting=j(!1);capacitorKnown=j(!1);nativePageId=j(null);nativeKnown=j(!1);scopeKey=Q(()=>this.view()===`angular-native`?this.nativePageId()??``:``);comingSoon=Q(()=>{let e=this.view();if(e===`analog`)return this.analogKnown()&&!this.analog()?QJ:void 0;if(e===`nativescript`)return XJ;if(e===`capacitor`)return this.config().inspectors.capacitor&&this.capacitorKnown()&&!this.capacitorReporting()?ZJ:void 0;if(e===`angular-native`)return this.nativeKnown()&&!this.nativePageId()?$J:void 0});config=Q(()=>yE(this.rpc()));tabEnabled=SE;availableTabs=Q(()=>{if(this.comingSoon())return[];let e=this.view(),t=e?qJ[e]:void 0,n=this.allTabs.filter(e=>SE(e.id,this.config()));if(t)return n.filter(e=>e.id===t);let r=e?YJ[e]:void 0;return r?n.filter(e=>r.includes(e.id)):n.filter(t=>(t.id!==`analog`||this.analog())&&(t.id!==`capacitor`||this.capacitorReporting())&&!(e===`angular`&&JJ[t.id]))});tabs=Q(()=>{let e=this.availableTabs();if(this.rpc())return e;let t=this.tab();return e.filter(e=>e.id===`dashboard`||e.id===t)});fullPanelLink=Q(()=>{let e=this.view();if(!e||location.protocol===`chrome-extension:`)return null;let t=this.comingSoon()?`dashboard`:qJ[e]??this.tab();return{tab:t,href:tJ(location.href,t)}});tab=Tv(()=>{let e=this.view();return e&&(qJ[e]??YJ[e]?.[0])||`dashboard`});rpc=j(null);connected=j(!1);connectionFailed=j(!1);hiddenPages=j([]);pageId=eE();backgroundNote=Q(()=>{let e=this.hiddenPages();return this.pageId?e.includes(this.pageId)?`Tab in background, showing the last data.`:``:e.length?e.length===1?`A tab is in the background, showing its last data.`:`${e.length} tabs are in the background, showing their last data.`:``});stopVisibility=()=>{};stopNative=()=>{};stopCapacitor=()=>{};stopFollowing=()=>{};stopHighlights=()=>{};nav=Rv(`nav`);main=Rv(`main`);injector=E(xs);themeService=E(Gq);navObserver;navFade=j({start:!1,end:!1});constructor(){Id(()=>{let e=this.nav()?.nativeElement;e&&typeof ResizeObserver<`u`&&(this.navObserver=new ResizeObserver(()=>this.measureNav()),this.navObserver.observe(e))}),ey(()=>{this.tab(),this.tabs(),Cv(()=>{this.revealActiveTab(),this.measureNav()})}),uc(()=>{let e=this.themeService.current();Cv(()=>{try{window.parent!==window&&Wq(window.parent.document,e)}catch{}})})}measureNav(){let e=this.nav()?.nativeElement;if(!e)return;let t=e.scrollWidth-e.clientWidth,n=e.scrollLeft>1,r=t>1&&e.scrollLeftn?e.scrollLeft=Math.max(0,n):e.scrollLefte===WJ?this.showFullPanel():this.showView(e));let e=iJ(location.hash,aJ(this.tabScope()),this.availableTabs().map(e=>e.id));e?this.tab.set(e):!this.view()&&iJ(location.hash,aJ(this.tabScope()),[`capacitor`])===`capacitor`?this.restoreCapacitor=!0:!this.view()&&iJ(location.hash,aJ(this.tabScope()),[`analog`])===`analog`&&(this.restoreAnalog=!0),this.stopHighlights=sE(()=>this.rpc());let t=lJ();kT(t?{baseURL:t}:{}).then(e=>{this.rpc.set(e),this.connected.set(!0),this.watchVisibility(e),this.watchAngularNative(e),this.watchCapacitor(e),e.scope(`pangular`).rpc.call(`analog-project`).then(e=>{let t=!!e?.analog;this.analog.set(t),this.analogKnown.set(!0),t&&this.restoreAnalog&&SE(`analog`,this.config())&&this.tab.set(`analog`),this.restoreAnalog=!1,!t&&this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)},()=>{this.analogKnown.set(!0),this.restoreAnalog=!1,this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)}),e.events.on(`connection:status`,e=>{this.connected.set(e===`connected`)})},()=>{this.connectionFailed.set(!0),this.analogKnown.set(!0),this.nativeKnown.set(!0)})}ngOnDestroy(){this.stopNative(),this.stopCapacitor(),this.stopFollowing(),this.stopVisibility(),this.stopHighlights(),this.navObserver?.disconnect()}showView(e){if(e===this.view())return;$T(e===`angular-native`?this.nativePageId():null),this.view.set(e);let t=new URL(location.href);t.searchParams.set(`view`,e),t.hash=``,history.replaceState(history.state,``,t)}showFullPanel(e){if(!this.view())return;$T(null),this.view.set(null);let t=new URL(location.href);t.searchParams.delete(`view`),t.hash=e?`tab=${e}`:``,history.replaceState(history.state,``,t);let n=e??aJ(this.tabScope()),r=this.availableTabs().map(e=>e.id),i=iJ(t.hash,n,r);i?this.setTab(i):n===`capacitor`&&(this.restoreCapacitor=!0)}openFullPanel(e,t){nJ(e)&&$q()&&(e.preventDefault(),this.showFullPanel(t),this.focusCurrentTab(),eJ(WJ))}formFocus=j(null);componentFocus=Tv({source:this.tab,computation:()=>null});showForm(e){this.formFocus.set({id:e}),this.switchTab(`forms`)}showComponent(e){this.config().inspectors.components&&(this.switchTab(`components`),this.componentFocus.set(e))}inspectFromPanel({source:e,origin:t,data:n}){if(e!==window.parent||t!==location.origin)return;let r=n;r?.type===`pangular:inspect-component`&&typeof r.id==`string`&&this.tab()===`components`&&this.config().inspectors.components&&this.componentFocus.set({id:r.id})}switchTab(e){let t=JJ[e];if(this.view()===`angular`&&t){this.activateDock(t,e);return}this.setTab(e),history.replaceState(history.state,``,`#tab=${e}`)}restoreAnalog=!1;restoreCapacitor=!1;setTab(e){this.restoreAnalog=!1,this.restoreCapacitor=!1,this.keepFocus(),this.tab.set(e),oJ(this.tabScope(),e)}tabScope(){return this.view()??`panel`}async watchAngularNative(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`component-tree`),n=e=>{let t=e?.pages,n=xD(t,this.nativePageId());this.view()===`angular-native`&&$T(n),this.nativePageId.set(n),this.nativeKnown.set(!0)};n(t.value()),this.stopNative(),this.stopNative=t.on(`updated`,n)}catch{this.nativeKnown.set(!0)}}async watchCapacitor(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`capacitor`),n=e=>{if(e===void 0)return;let t=uK(e).length>0;this.capacitorReporting.set(t),this.capacitorKnown.set(!0),t&&this.restoreCapacitor&&SE(`capacitor`,this.config())&&(this.restoreCapacitor=!1,this.tab.set(`capacitor`)),!t&&this.tab()===`capacitor`&&!this.view()&&this.tab.set(`dashboard`)};n(t.value()),this.stopCapacitor(),this.stopCapacitor=t.on(`updated`,n)}catch{this.capacitorReporting.set(!1),this.capacitorKnown.set(!0)}}async watchVisibility(e){try{let t=await e.scope(`pangular`).rpc.sharedState(`page-visibility`),n=e=>{let t=e?.hidden;this.hiddenPages.set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])};n(t.value()),this.stopVisibility(),this.stopVisibility=t.on(`updated`,n)}catch{}}keepFocus(){let e=document.activeElement,t=this.main()?.nativeElement;(!e||e===document.body||t?.contains(e))&&this.focusCurrentTab()}focusCurrentTab(){Id(()=>{let e=document.activeElement;e&&e!==document.body||(this.nav()?.nativeElement.querySelector(`button.active`)??this.main()?.nativeElement)?.focus()},{injector:this.injector})}async activateDock(e,t){if(await eJ(e))return;if(window.parent===window){this.keepFocus(),this.showView(e);return}let n=this.rpc();if(!n?.call){this.setTab(t);return}try{await n.call(`hub:docks:activate`,{dockId:`pangular:${e}`}),this.keepFocus(),this.showView(e)}catch{this.setTab(t)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-root`]],viewQuery:function(e,t){e&1&&e_(t.nav,fJ,5)(t.main,pJ,5),e&2&&t_(2)},hostVars:4,hostBindings:function(e,t){e&1&&G(`message`,function(e){return t.inspectFromPanel(e)},ju),e&2&&C_(`--%NS%accent`,t.viewAccent()?.accent??null)(`--%NS%accent-text`,t.viewAccent()?.text??null)},decls:29,vars:22,consts:[[`nav`,``],[`main`,``],[1,`brand`],[1,`mark`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 256 256`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 32 32`,`aria-hidden`,`true`],[`width`,`24`,`height`,`17`,`viewBox`,`0 0 256 182`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 24 24`,`fill`,`currentColor`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`aria-hidden`,`true`],[`width`,`30`,`height`,`30`,`viewBox`,`0 0 500 500`,`aria-hidden`,`true`],[1,`title`],[`aria-label`,`Inspectors`,3,`scroll`],[1,`full-panel`,3,`href`],[`role`,`status`,1,`status`],[`aria-hidden`,`true`,1,`dot`],[`tabindex`,`-1`],[`role`,`status`,1,`background-note`],[`role`,`alert`,1,`connection-error`],[3,`info`],[`role`,`status`,1,`turned-off`],[1,`turned-off`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`id`,`an-mark-grad`,`x1`,`0`,`y1`,`0`,`x2`,`1`,`y2`,`1`],[`offset`,`0`,`stop-color`,`#f0224f`],[`offset`,`1`,`stop-color`,`#c4002d`],[`d`,`M16 0C27.2 0 32 4.8 32 16S27.2 32 16 32 0 27.2 0 16 4.8 0 16 0Z`,`fill`,`url(#an-mark-grad)`],[`transform`,`translate(6.4 6.4) scale(0.8)`,`fill`,`#fff`],[`d`,`M14.8486 0L23.138 16.8551L23.9996 3.99892L14.8486 0Z`],[`d`,`M16.9875 17.7114H7.01272L5.73926 20.627L12.0001 24L18.261 20.627L16.9875 17.7114Z`],[`d`,`M8.72168 13.9298H15.2812L11.9997 6.39575L8.72168 13.9298Z`],[`d`,`M9.15103 0L0 3.99892L0.861556 16.8551L9.15103 0Z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`d`,`M12.024.017V0L12 .008L11.976 0v.017L.812 3.892l1.605 14.875l9.559 5.207V24l.024-.013l.024.013v-.026l9.559-5.207l1.605-14.875zm6.868 14.244q-1.64 3.948-6.031 4.166c-2.829 0-4.661-1.7-4.66-1.7q-1.745-1.359-2.398-3.417c-.695-.76-.702-.841-.774-1.145c-.072-.303.045-.388.249-.685q.204-.298.098-.85q-.26-.36-.3-1.128q0-.37.496-.783q.495-.413.607-.632q.083-.119.065-1.031q-.006-.897.995-.975c1-.08 1.565-.832 1.879-1.174c.21-.228.52-.339.91-.341c.551-.026 1.052.185 1.484.62c1.075-.055 2.176.235 3.292.863q2.379 1.414 2.596 3.055q-.257 2.158-5.788-.113q-2.895.819-2.846 3.552q0 2.508 2.422 3.643c-.787-.772-1.122-1.422-1.01-1.959q2.456 2.906 5.588 2.173c-.92.032-1.65-.264-2.198-.893q2.116-.05 3.998-1.972c-.724.576-1.482.794-2.284.657q3.26-2.563 2.307-5.98l-.002-.006a3.02 3.02 0 0 1 .788 2.03q.023 1.175-.795 2.477q.613-.478 1.413-2.047c.23 2.117-.625 3.724-2.574 4.825q.934-.085 2.473-1.23m-5.567-6.63a.319.319 0 1 1 .638 0a.319.319 0 0 1-.638 0`],[`id`,`ng-grad`,`x1`,`49`,`x2`,`226`,`y1`,`214`,`y2`,`130`,`gradientUnits`,`userSpaceOnUse`],[`stop-color`,`#E40035`],[`offset`,`.24`,`stop-color`,`#F60A48`],[`offset`,`.352`,`stop-color`,`#F20755`],[`offset`,`.494`,`stop-color`,`#DC087D`],[`offset`,`.745`,`stop-color`,`#9717E7`],[`offset`,`1`,`stop-color`,`#6C00F5`],[`fill`,`url(#ng-grad)`,`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`width`,`500`,`height`,`500`,`rx`,`112`,`fill`,`#1c1a17`],[`transform`,`translate(250 252) scale(1.38) translate(-120 -129)`],[`id`,`pi-mark-mask`],[`x`,`-60`,`y`,`-60`,`width`,`360`,`height`,`380`,`fill`,`#fff`],[`fill`,`none`,`stroke`,`#000`,`stroke-width`,`30`,`stroke-linejoin`,`miter`],[`d`,`M88 66 V196`],[`d`,`M88 66 H143 L170 98 L143 130 H88 Z`],[`id`,`pi-mark-clip`],[`x`,`-40`,`y`,`129`,`width`,`320`,`height`,`200`],[`transform`,`rotate(-10 120 129)`],[`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#78350f`,`stroke-width`,`10`],[`mask`,`url(#pi-mark-mask)`],[`fill`,`#fbbf24`,`d`,`M120 5 L2 46 L22 198 L120 253 Z`],[`fill`,`#f59e0b`,`d`,`M120 5 L238 46 L218 198 L120 253 Z`],[`clip-path`,`url(#pi-mark-clip)`,`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#1c1a17`,`stroke-width`,`22`],[`clip-path`,`url(#pi-mark-clip)`,`cx`,`120`,`cy`,`129`,`rx`,`128`,`ry`,`34`,`fill`,`none`,`stroke`,`#fde68a`,`stroke-width`,`10`],[`transform`,`translate(230.9 146.0) rotate(10) scale(1.5) translate(-4 -4)`],[`x1`,`9`,`y1`,`9`,`x2`,`21`,`y2`,`21`,`stroke`,`#1c1a17`,`stroke-width`,`14`,`stroke-linecap`,`round`],[`r`,`16`,`fill`,`#1c1a17`],[`x1`,`9`,`y1`,`9`,`x2`,`21`,`y2`,`21`,`stroke`,`#fde68a`,`stroke-width`,`7`,`stroke-linecap`,`round`],[`r`,`12`,`fill`,`#1c1a17`,`stroke`,`#fde68a`,`stroke-width`,`5`],[`type`,`button`,3,`active`],[`type`,`button`,3,`click`],[3,`name`],[1,`full-panel`,3,`click`,`href`],[`width`,`14`,`height`,`14`,`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`3`,`y`,`14`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[`x`,`14`,`y`,`14`,`width`,`7`,`height`,`7`,`rx`,`1.5`],[3,`rpc`],[3,`rpc`,`focus`],[3,`navigate`,`rpc`],[3,`focusHandled`,`showForm`,`rpc`,`focus`],[3,`showComponent`,`rpc`],[3,`focusHandled`,`rpc`,`focus`]],template:function(e,t){if(e&1&&(z(0,`header`)(1,`h1`,2)(2,`span`,3),P(3,gJ,2,0,`:svg:svg`,4)(4,_J,7,0,`:svg:svg`,4)(5,vJ,11,0,`:svg:svg`,5)(6,yJ,5,0,`:svg:svg`,6)(7,bJ,2,0,`:svg:svg`,7)(8,xJ,10,0,`:svg:svg`,8)(9,SJ,24,0,`:svg:svg`,9),B(),z(10,`span`,10),J(11),B()(),z(12,`nav`,11,0),G(`scroll`,function(){return t.measureNav()}),P(14,wJ,2,0),B(),P(15,TJ,7,1,`a`,12),z(16,`span`,13)(17,`span`,14),V(18,`span`),B(),J(19),B()(),z(20,`main`,15,1)(22,`p`,16),J(23),B(),P(24,EJ,2,0,`p`,17)(25,DJ,1,1,`app-coming-soon`,18)(26,OJ,2,0,`p`,19)(27,kJ,5,0,`p`,20)(28,HJ,2,2),B()),e&2){let e,n;M(2),q(`ng-mark`,t.view()===`angular`)(`pi-mark`,!t.view()),M(),F(t.view()===`nativescript`?3:t.view()===`capacitor`?4:t.view()===`angular-native`?5:t.view()===`analog`?6:t.view()===`ngrx`?7:t.view()===`angular`?8:9),M(7),q(`ng-text`,t.view()===`angular`),M(),Y(t.title()),M(),q(`fade-start`,t.navFade().start)(`fade-end`,t.navFade().end),M(2),F(t.availableTabs().length>1?14:-1),M(),F((e=t.fullPanelLink())?15:-1,e),M(),q(`connected`,t.connected())(`failed`,t.connectionFailed()),M(3),X(` `,t.connected()?`Live`:t.connectionFailed()?`Disconnected`:`Connecting…`,` `),M(),N(`aria-label`,t.mainLabel()),M(3),Y(t.backgroundNote()),M(),F(t.connectionFailed()?24:(n=t.comingSoon())?25:t.view()===`angular-native`&&!t.nativePageId()?26:t.tabEnabled(t.tab(),t.config())?28:27,n)}},dependencies:[pD,Mk,dN,DP,qF,oR,wB,LV,QU,XG,Vq,rK,PE],styles:[`[_nghost-%COMP%] {
--%NS%accent-soft: color-mix(in srgb, var(--%NS%accent) 12%, transparent);
--%NS%accent-line: color-mix(in srgb, var(--%NS%accent) 45%, transparent);
display: flex;
diff --git a/extension/ui/index.html b/extension/ui/index.html
index 3ac69561..ca5a4171 100644
--- a/extension/ui/index.html
+++ b/extension/ui/index.html
@@ -9,7 +9,7 @@
Pangular Inspector
-
+
diff --git a/packages/devtools/src/__tests__/analog-inspector.test.ts b/packages/devtools/src/__tests__/analog-inspector.test.ts
index 9cbeb035..1fa9f528 100644
--- a/packages/devtools/src/__tests__/analog-inspector.test.ts
+++ b/packages/devtools/src/__tests__/analog-inspector.test.ts
@@ -226,6 +226,67 @@ describe('Analog panel', () => {
expect(text).not.toContain('The page has no default export, so Analog renders nothing.');
});
+ it('counts lint errors and warnings apart, leaves info out and links shadowed pages', async () => {
+ const lintArgs: unknown[] = [];
+ let findings = [
+ { rule: 'api-outside-prefix', severity: 'info', path: '/x', message: 'x', fix: 'x' },
+ ];
+ const project = {
+ ...PROJECT,
+ content: [{ file: '/src/content/blog/first.md', slug: 'first', attributes: {} }],
+ };
+ const { el, tab, settle, inspector } = await mount((name, arg) => {
+ if (name === 'analog-project') return project;
+ if (name === 'analog-lint') {
+ lintArgs.push(arg);
+ return findings;
+ }
+ return null;
+ });
+ expect(lintArgs[0]).toBeUndefined();
+ const badge = () => el.querySelector('#analog-tab-lint .count')!;
+ expect(badge().textContent!.trim()).toBe('0');
+ expect(badge().getAttribute('data-tone')).toBe('');
+ findings = [
+ ...findings,
+ { rule: 'restart-needed', severity: 'warning', path: '/y', message: 'y', fix: 'y' },
+ {
+ rule: 'content-shadows-page',
+ severity: 'warning',
+ file: '/src/content/blog/first.md',
+ path: '/blog/first',
+ relatedFile: '/src/app/pages/blog/[slug].page.analog',
+ message: 'Files under src/content are routes too.',
+ fix: 'z',
+ },
+ { rule: 'hydration-error', severity: 'error', path: '/z', message: 'NG0500', fix: 'z' },
+ ] as typeof findings;
+ inspector.view.set('content');
+ await settle();
+ await new Promise((resolve) => setTimeout(resolve, 350));
+ await settle();
+ expect(badge().textContent!.trim()).toBe('3');
+ expect(badge().getAttribute('data-tone')).toBe('bad');
+ await tab('content');
+ expect(el.textContent).toContain('takes over [slug].page.analog');
+ });
+
+ it('asks for the lint of the page the panel is docked in', async () => {
+ const { scopeToPage } = await import('../../../../app/src/page-id.ts');
+ const lintArgs: unknown[] = [];
+ scopeToPage('pgB');
+ try {
+ await mount((name, arg) => {
+ if (name === 'analog-project') return PROJECT;
+ if (name === 'analog-lint') lintArgs.push(arg);
+ return null;
+ });
+ } finally {
+ scopeToPage(null);
+ }
+ expect(lintArgs[0]).toBe('pgB');
+ });
+
it('names server functions, marks SSR seeds and lists form action outcomes', async () => {
const id = 'aaaaaaaaaaaaaaaa';
const state = {
diff --git a/packages/devtools/src/__tests__/analog-mcp.test.ts b/packages/devtools/src/__tests__/analog-mcp.test.ts
index 32111e3a..fb0586b2 100644
--- a/packages/devtools/src/__tests__/analog-mcp.test.ts
+++ b/packages/devtools/src/__tests__/analog-mcp.test.ts
@@ -15,6 +15,7 @@ import {
} from '../rpc/analog-tools.ts';
import { scanAnalog } from '../rpc/analog-scan.ts';
import type { AnalogRuntimeReport } from '../analog-runtime.ts';
+import { redactAnalogReport } from '../analog-redact.ts';
import { BASE_FILES, BROKEN_FILES, makeProject } from './analog-fixture.ts';
function local(ctx: { rpc: unknown }, name: string): Promise {
@@ -153,6 +154,76 @@ describe('Analog MCP tools', () => {
expect(text).toContain('restart the dev server');
});
+ it('clips oversized report fields and still masks tokens in them', () => {
+ const jwt = 'eyJhbGciOiJI.eyJzdWIiOiIx.c2lnbmF0dXJl';
+ const long = 'x'.repeat(20_000);
+ const out = redactAnalogReport({
+ ...report,
+ url: `/a?token=${jwt}&q=${long}`,
+ chain: [{ path: long, file: `/src/${long}`, serverFile: `/src/${long}` }],
+ load: { preview: `${jwt} ${long}`, bytes: 1, keys: [long] },
+ hydrationErrors: [`NG0500 Bearer ${jwt} ${long}`],
+ configPaths: [long],
+ });
+ expect(out.url.length).toBeLessThanOrEqual(2001);
+ expect(out.url).not.toContain(jwt);
+ expect(out.chain[0].path.length).toBeLessThanOrEqual(501);
+ expect(out.chain[0].file!.length).toBeLessThanOrEqual(501);
+ expect(out.chain[0].serverFile!.length).toBeLessThanOrEqual(501);
+ expect(out.load!.preview.length).toBeLessThanOrEqual(1002);
+ expect(out.load!.preview).not.toContain(jwt);
+ expect(out.load!.keys[0].length).toBeLessThanOrEqual(501);
+ expect(out.hydrationErrors[0].length).toBeLessThanOrEqual(301);
+ expect(out.hydrationErrors[0]).not.toContain(jwt);
+ expect(out.configPaths[0].length).toBeLessThanOrEqual(501);
+ });
+
+ it('masks a JWT that the first cut splits in its claims', () => {
+ const jwt = (claims: string) =>
+ `eyJhbGciOiJIUzI1NiJ9.${Buffer.from(claims).toString('base64url')}.c2lnbmF0dXJl`;
+ const first = jwt(JSON.stringify({ sub: 'a'.repeat(380) }));
+ const second = jwt(JSON.stringify({ sub: 'secretUser', pad: 'b'.repeat(200) }));
+ const error = `Hydration failed: token ${first} then ${second}`;
+ expect(error.indexOf(second)).toBeLessThan(600);
+ expect(error.indexOf(second) + second.length).toBeGreaterThan(600);
+ const out = redactAnalogReport({ ...report, hydrationErrors: [error] });
+ expect(out.hydrationErrors[0]).not.toContain('eyJ');
+ });
+
+ it('analog-lint reads hydration errors from the page it is asked about', async () => {
+ const { ctx, call, push } = await boot(makeProject(BASE_FILES));
+ await push('push-analog', { ...report, pageId: 'pgA', hydrationErrors: ['NG0500: from A'] });
+ await push('push-analog', { ...report, pageId: 'pgB', hydrationErrors: ['NG0501: from B'] });
+ expect(await call('analog-lint')).toContain('from B');
+ const lintA = await call('analog-lint', { page: 'pgA' });
+ expect(lintA).toContain('from A');
+ expect(lintA).not.toContain('from B');
+ const rpc = ctx.rpc as unknown as {
+ invokeLocal: (name: string, ...args: unknown[]) => Promise<{ message: string }[]>;
+ };
+ const findings = await rpc.invokeLocal('pangular:analog-lint', 'pgA');
+ expect(findings.map((f) => f.message)).toContain('NG0500: from A');
+ expect(findings.map((f) => f.message)).not.toContain('NG0501: from B');
+ });
+
+ it('analog-lint says when the page it is asked about sends no report', async () => {
+ const { call, push } = await boot(makeProject(BASE_FILES));
+ await push('push-analog', { ...report, pageId: 'p1', hydrationErrors: ['NG0500'] });
+ const text = await call('analog-lint', { page: 'stale' });
+ expect(text).not.toContain('No Analog problems found.');
+ expect(text).toContain('No page `stale` is reporting Analog data');
+ expect(text).toContain('`p1`');
+ expect(await call('analog-lint')).toContain('NG0500');
+ });
+
+ it('list-pages names pages that send Analog reports', async () => {
+ const { call, push } = await boot(makeProject(BASE_FILES));
+ await push('push-analog', report);
+ const text = await call('list-pages');
+ expect(text).toContain('pg1');
+ expect(text).toContain('analog');
+ });
+
it('analog-current-page masks tokens in the url, load preview and hydration errors', async () => {
const { call, push } = await boot(makeProject(BASE_FILES));
await push('push-analog', {
@@ -536,6 +607,15 @@ export default {
expect(loadEndpointUrl('/src/app/pages/docs/[...slug].page.ts', 'api', { '**': 'a/b' })).toBe(
'/api/_analog/pages/docs/a/b',
);
+ expect(loadEndpointUrl('/src/app/pages/products/[id].page.ts', 'api', { id: 'a/b?c' })).toBe(
+ '/api/_analog/pages/products/a%2Fb%3Fc',
+ );
+ expect(
+ loadEndpointUrl('/src/app/pages/[org]/shop/[[...path]].page.ts', 'api', {
+ org: 'acme',
+ path: 'x/caf%C3%A9 au lait',
+ }),
+ ).toBe('/api/_analog/pages/acme/shop/x/caf%C3%A9%20au%20lait');
});
it('forgets closed pages, clears calls and shares duplicate loads', async () => {
diff --git a/packages/devtools/src/__tests__/analog-scan.test.ts b/packages/devtools/src/__tests__/analog-scan.test.ts
index f8c0ffbf..987433ba 100644
--- a/packages/devtools/src/__tests__/analog-scan.test.ts
+++ b/packages/devtools/src/__tests__/analog-scan.test.ts
@@ -112,6 +112,51 @@ describe('Analog route rules', () => {
});
});
+ it('reads options past a long nitro block and prerender routes only inside prerender', () => {
+ const filler = Array.from({ length: 300 }, (_, i) => ` key${i}: 'value ${i} )',`).join(
+ '\n',
+ );
+ const root = makeProject(BASE_FILES, {
+ 'vite.config.ts': `import analog from '@analogjs/platform';
+export default {
+ plugins: [
+ analog({
+ sitemap: { routes: ['/not-prerendered'] },
+ nitro: {
+ storage: {
+${filler}
+ },
+ },
+ prerender: { sitemap: { host: 'https://example.com' }, routes: ['/late'] },
+ apiPrefix: 'v2',
+ routeRules: { '/admin/**': { ssr: false } },
+ }),
+ ],
+};
+`,
+ });
+ const config = analogConfig(root);
+ expect(config.apiPrefix).toBe('v2');
+ expect(config.prerender).toEqual(['/late']);
+ expect(config.noSsrRoutes).toEqual(['/admin/**']);
+ });
+
+ it('reads the top-level prerender block, not one nested under nitro', () => {
+ const root = makeProject(BASE_FILES, {
+ 'vite.config.ts': `import analog from '@analogjs/platform';
+export default {
+ plugins: [
+ analog({
+ nitro: { prerender: { routes: ['/api/feed'] } },
+ prerender: { routes: ['/about'] },
+ }),
+ ],
+};
+`,
+ });
+ expect(analogConfig(root).prerender).toEqual(['/about']);
+ });
+
it('reads build output as prerendered pages', () => {
const root = makeProject(BASE_FILES);
for (const page of ['', 'pricing']) {
@@ -179,7 +224,11 @@ describe('Analog route rules', () => {
'src/content/blog/first.md': '---\ntitle: First\n---\n',
});
const finding = lintAnalog(scanAnalog(root)).find((f) => f.rule === 'content-shadows-page');
- expect(finding).toMatchObject({ file: '/src/content/blog/first.md', path: '/blog/first' });
+ expect(finding).toMatchObject({
+ file: '/src/content/blog/first.md',
+ path: '/blog/first',
+ relatedFile: '/src/app/pages/blog/[slug].page.ts',
+ });
const fallback = makeProject(BASE_FILES, {
'src/app/pages/help/[...slug].page.ts': `import { Component } from '@angular/core';\n@Component({ template: '' })\nexport default class NotFound {}\n`,
'src/content/help/faq.md': '---\ntitle: FAQ\n---\n',
diff --git a/packages/devtools/src/__tests__/analog-server-fns.test.ts b/packages/devtools/src/__tests__/analog-server-fns.test.ts
index 44f6bc38..fb6403be 100644
--- a/packages/devtools/src/__tests__/analog-server-fns.test.ts
+++ b/packages/devtools/src/__tests__/analog-server-fns.test.ts
@@ -72,6 +72,16 @@ describe('Analog server functions', () => {
expect(serverFnsOf('/a.server.ts', 'export const load = async () => ({});')).toEqual([]);
});
+ it('reads server functions called with type arguments', () => {
+ const source = `import { serverFn } from '@analogjs/router/server';
+export const getItem = serverFn<{ id: string }>(async () => null);
+export const listItems = serverFn, Item[]>({ method: 'PUT' }, async () => []);
+`;
+ expect(
+ serverFnsOf('/src/app/items.server.ts', source).map((f) => `${f.method} ${f.name}`),
+ ).toEqual(['GET getItem', 'PUT listItems']);
+ });
+
it('scans every .server.ts under src and stops false lint warnings for them', () => {
const project = scanAnalog(makeProject(BASE_FILES, FN_FILES));
expect(project.serverFns.map((f) => `${f.name} ${f.file}`).sort()).toEqual([
diff --git a/packages/devtools/src/__tests__/config.test.ts b/packages/devtools/src/__tests__/config.test.ts
index d0f94bc7..eac67a86 100644
--- a/packages/devtools/src/__tests__/config.test.ts
+++ b/packages/devtools/src/__tests__/config.test.ts
@@ -212,7 +212,7 @@ describe('agent tool and RPC registration', () => {
it('assigns every tool, resource and RPC function to an inspector or keeps it shared', async () => {
const { rpc, tools, resources } = await boot();
const unassigned = rpc.filter((name) => !RPC_INSPECTOR[name] && !SHARED_RPC.includes(name));
- expect(unassigned.filter((name) => !name.includes('analog'))).toEqual([]);
+ expect(unassigned).toEqual([]);
for (const id of [...tools, ...resources].filter((id) => !SHARED_RPC.includes(id))) {
expect(agentAllowed({ id }, resolvePangularConfig({ agent: { tools: offAll() } }))).toBe(
false,
@@ -354,6 +354,21 @@ describe('panel actions', () => {
expect(await invoke('get-http-rules', undefined)).toEqual([]);
});
+ it('refuses a form action without formId unless it acts on the page', async () => {
+ const { ctx, invoke } = await boot();
+ const broadcast = vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: never) => {
+ const { requestId } = (options as { args: [{ requestId: string }] }).args[0];
+ await invoke('form-action-result', { requestId, result: { ok: true } });
+ }) as never);
+ expect(await invoke('request-form-action', { action: 'focus' })).toEqual({
+ ok: false,
+ error: 'focus needs a formId.',
+ });
+ expect(broadcast).not.toHaveBeenCalled();
+ expect(await invoke('request-form-action', { action: 'cancel-pick' })).toEqual({ ok: true });
+ expect(broadcast).toHaveBeenCalledTimes(1);
+ });
+
it('refuses a panel probe with router actions off and lets record and resolve lazy through', async () => {
const { ctx, invoke } = await boot({ actions: { router: false } });
const broadcast = vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: never) => {
diff --git a/packages/devtools/src/__tests__/forms-actions.test.ts b/packages/devtools/src/__tests__/forms-actions.test.ts
index 9a84d181..5c6902a4 100644
--- a/packages/devtools/src/__tests__/forms-actions.test.ts
+++ b/packages/devtools/src/__tests__/forms-actions.test.ts
@@ -710,3 +710,106 @@ describe('request validation', () => {
expect(isFormAction({ action: 'focus', path: 'x'.repeat(600) })).toBe(false);
});
});
+
+class Booking {
+ model = signal({ day: null as Date | null });
+ form = form(this.model);
+ reactive = new FormGroup({
+ on: new FormControl(''),
+ at: new FormControl(''),
+ month: new FormControl(''),
+ });
+}
+Component({
+ selector: 'booking-form',
+ imports: [FormField, FormRoot, ReactiveFormsModule],
+ template: `
+
+
+ `,
+})(Booking);
+
+describe('user-mode writes to date and time inputs', () => {
+ it('writes dates in the input format and refuses values that are not dates', async () => {
+ const fixture = await render(Booking);
+ const ctx = contextFor(fixture.nativeElement);
+ const ids = new Map([...ctx.forms].map(([id, f]) => [f.kind, id]));
+ const set = (kind: string, path: string, value: unknown) =>
+ runFormAction(ctx, {
+ action: 'set-value',
+ formId: ids.get(kind),
+ path,
+ value,
+ mode: 'user',
+ });
+ const app = fixture.componentInstance;
+
+ expect(await set('signal', 'day', new Date(Date.UTC(2026, 2, 14)))).toMatchObject({
+ ok: true,
+ });
+ expect(app.model().day?.toISOString()).toBe('2026-03-14T00:00:00.000Z');
+
+ expect(await set('reactive', 'on', '2026-03-14T09:30:00Z')).toMatchObject({ ok: true });
+ expect(app.reactive.controls.on.value).toBe('2026-03-14');
+ expect(await set('reactive', 'on', '2026-04-01')).toMatchObject({ ok: true });
+ expect(app.reactive.controls.on.value).toBe('2026-04-01');
+
+ const bad = await set('reactive', 'on', 'next tuesday');
+ expect(bad.ok).toBe(false);
+ expect(bad.error).toContain('not a valid date value');
+ expect(app.reactive.controls.on.value).toBe('2026-04-01');
+ expect((fixture.nativeElement.querySelector('#on') as HTMLInputElement).value).toBe(
+ '2026-04-01',
+ );
+
+ expect(await set('reactive', 'at', '09:45')).toMatchObject({ ok: true });
+ expect(app.reactive.controls.at.value).toBe('09:45');
+
+ expect(await set('reactive', 'month', Date.UTC(2026, 2, 14))).toMatchObject({ ok: true });
+ expect(app.reactive.controls.month.value).toBe('2026-03');
+ });
+});
+
+describe('form action guards', () => {
+ it('needs a formId for actions on a form', async () => {
+ const fixture = await render(Signup);
+ const ctx = contextFor(fixture.nativeElement);
+ const result = await runFormAction(ctx, { action: 'touch-all' });
+ expect(result).toMatchObject({ ok: false, error: 'touch-all needs a formId.' });
+ expect(fixture.componentInstance.form.touched).toBe(false);
+ });
+
+ it('does not overwrite a $form the page defined itself, unless forced', async () => {
+ const fixture = await render(Signup);
+ const ctx = contextFor(fixture.nativeElement);
+ const w = window as any;
+ const own = { mine: true };
+ w.$form = own;
+ try {
+ const refused = await runFormAction(ctx, { action: 'store-as-global', formId: 'form-1' });
+ expect(refused.ok).toBe(false);
+ expect(refused.error).toContain('already defines $form');
+ expect(w.$form).toBe(own);
+ const forced = await runFormAction(ctx, {
+ action: 'store-as-global',
+ formId: 'form-1',
+ force: true,
+ });
+ expect(forced.ok).toBe(true);
+ expect(w.$form).toBe(fixture.componentInstance.form);
+ const again = await runFormAction(ctx, {
+ action: 'store-as-global',
+ formId: 'form-1',
+ path: 'name',
+ });
+ expect(again.ok).toBe(true);
+ } finally {
+ delete w.$form;
+ delete w.$control;
+ }
+ });
+});
diff --git a/packages/devtools/src/__tests__/forms-read.test.ts b/packages/devtools/src/__tests__/forms-read.test.ts
index 897d8127..4d05d41d 100644
--- a/packages/devtools/src/__tests__/forms-read.test.ts
+++ b/packages/devtools/src/__tests__/forms-read.test.ts
@@ -129,6 +129,17 @@ describe('Signal Forms internals', () => {
node = byKey(serializeField(tree()))['name'];
expect(node.changed).toBe(true);
});
+
+ it('reports an edit past the display limits of the value as changed', () => {
+ const long = 'x'.repeat(300);
+ const tree = signalForm({ bio: long });
+ tree.bio();
+ serializeField(tree());
+ tree.bio().markAsDirty();
+ expect(byKey(serializeField(tree()))['bio'].changed).toBe(false);
+ tree.bio().value.set(`${long.slice(0, 250)}y${long.slice(251)}`);
+ expect(byKey(serializeField(tree()))['bio'].changed).toBe(true);
+ });
});
describe('reactive internals', () => {
diff --git a/packages/devtools/src/__tests__/forms-scan.test.ts b/packages/devtools/src/__tests__/forms-scan.test.ts
new file mode 100644
index 00000000..c4588906
--- /dev/null
+++ b/packages/devtools/src/__tests__/forms-scan.test.ts
@@ -0,0 +1,173 @@
+// @vitest-environment jsdom
+import '@angular/compiler';
+import { Component, ViewEncapsulation, signal } from '@angular/core';
+import { TestBed } from '@angular/core/testing';
+import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
+import { FormField, FormRoot, form } from '@angular/forms/signals';
+import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing';
+import { afterEach, describe, expect, it, vi } from 'vitest';
+import { attachForms } from '../forms-collector.ts';
+import { createFormIds, pageElements, type FoundForm } from '../forms.ts';
+
+try {
+ TestBed.initTestEnvironment(BrowserTestingModule, platformBrowserTesting());
+} catch {
+ // already initialized in this worker
+}
+
+const stops: (() => void)[] = [];
+afterEach(() => {
+ stops.splice(0).forEach((stop) => stop());
+ TestBed.resetTestingModule();
+ document.body.innerHTML = '';
+ vi.restoreAllMocks();
+});
+
+class Login {
+ form = new FormGroup({ email: new FormControl('') });
+}
+Component({
+ selector: 'login-form',
+ imports: [ReactiveFormsModule],
+ template: ``,
+})(Login);
+
+class Shadowed {
+ form = form(signal({ city: '' }));
+}
+Component({
+ selector: 'shadowed-form',
+ imports: [FormField, FormRoot],
+ encapsulation: ViewEncapsulation.ShadowDom,
+ template: ``,
+})(Shadowed);
+
+function harness() {
+ const calls: { name: string; args: any[] }[] = [];
+ const handlers = new Map unknown>();
+ const my = {
+ rpc: {
+ call: async (name: string, ...args: unknown[]) => {
+ calls.push({ name, args });
+ },
+ register: (def: { name: string; handler: (...args: any[]) => unknown }) => {
+ handlers.set(def.name, def.handler);
+ },
+ },
+ };
+ const highlight = { show: vi.fn(), clear: vi.fn() };
+ const collector = attachForms(my, 'pg', () => (globalThis as any).ng, highlight);
+ stops.push(collector.stop);
+ const reports = () => calls.filter((c) => c.name === 'push-forms').map((c) => c.args[0]);
+ return { calls, handlers, collector, reports, highlight };
+}
+
+const tick = (ms = 120) => new Promise((resolve) => setTimeout(resolve, ms));
+
+async function mount(type: new () => T) {
+ const fixture = TestBed.createComponent(type);
+ document.body.appendChild(fixture.nativeElement);
+ fixture.detectChanges();
+ await fixture.whenStable();
+ return fixture;
+}
+
+const found = (root: object): FoundForm => ({ kind: 'reactive', root }) as FoundForm;
+
+describe('form ids', () => {
+ it('gives a recreated form its old id back and keeps ~n for forms shown together', () => {
+ const assign = createFormIds('pg');
+ const label = (roots: object[]) => new Map(roots.map((root) => [root, 'Checkout form']));
+ const first = {};
+ expect(assign([found(first)], label([first])).get(first)).toBe('Checkout_form@pg');
+ assign([], new Map());
+ const again = {};
+ expect(assign([found(again)], label([again])).get(again)).toBe('Checkout_form@pg');
+ const twin = {};
+ const ids = assign([found(again), found(twin)], label([again, twin]));
+ expect(ids.get(again)).toBe('Checkout_form@pg');
+ expect(ids.get(twin)).toBe('Checkout_form~2@pg');
+ });
+});
+
+describe('page elements', () => {
+ it('walks into open shadow roots', () => {
+ const host = document.createElement('div');
+ document.body.appendChild(host);
+ const shadow = host.attachShadow({ mode: 'open' });
+ shadow.innerHTML = '';
+ const roots: ShadowRoot[] = [];
+ const ids = pageElements(document, (root) => roots.push(root)).map((el) => el.id);
+ expect(ids).toContain('inside');
+ expect(roots).toEqual([shadow]);
+ });
+});
+
+describe('forms collector scanning', () => {
+ it('finds a form inside a ShadowDom component', async () => {
+ await mount(Shadowed);
+ const h = harness();
+ h.collector.push();
+ await tick();
+ const report = h.reports().at(-1);
+ expect(report.forms.map((f: { owner: string }) => f.owner)).toEqual(['Shadowed']);
+ });
+
+ it('does not rescan the whole page for text changes and finds forms added later', async () => {
+ const h = harness();
+ h.collector.push();
+ await tick();
+ const spy = vi.spyOn(document, 'querySelectorAll');
+ const clock = document.createElement('span');
+ document.body.appendChild(clock);
+ await tick(0);
+ spy.mockClear();
+ clock.textContent = '12:00:01';
+ await tick(0);
+ h.collector.push();
+ await tick();
+ expect(spy).not.toHaveBeenCalledWith('*');
+ await mount(Login);
+ h.collector.push();
+ await tick();
+ expect(spy).not.toHaveBeenCalledWith('*');
+ expect(
+ h
+ .reports()
+ .at(-1)
+ .forms.map((f: { owner: string }) => f.owner),
+ ).toEqual(['Login']);
+ });
+
+ it('keeps the id of a form that is destroyed and created again', async () => {
+ const h = harness();
+ const fixture = await mount(Login);
+ h.collector.push();
+ await tick();
+ const id = h.reports().at(-1).forms[0].id;
+ fixture.destroy();
+ fixture.nativeElement.remove();
+ h.collector.push();
+ await tick();
+ expect(h.reports().at(-1).forms).toEqual([]);
+ await mount(Login);
+ h.collector.push();
+ await tick();
+ expect(h.reports().at(-1).forms[0].id).toBe(id);
+ });
+
+ it('answers a form action without formId with an error instead of acting on a form', async () => {
+ await mount(Login);
+ const h = harness();
+ h.collector.push();
+ await tick();
+ h.handlers.get('form-action')!({
+ requestId: 'r1',
+ request: { action: 'set-value', path: 'email', value: 'x' },
+ });
+ await tick(0);
+ const answer = h.calls.find((c) => c.name === 'form-action-result')?.args[0];
+ expect(answer.result).toMatchObject({ ok: false, error: 'set-value needs a formId.' });
+ expect((document.getElementById('email') as HTMLInputElement).value).toBe('');
+ });
+});
diff --git a/packages/devtools/src/__tests__/forms-webmcp.test.ts b/packages/devtools/src/__tests__/forms-webmcp.test.ts
index 43975663..f52b61d7 100644
--- a/packages/devtools/src/__tests__/forms-webmcp.test.ts
+++ b/packages/devtools/src/__tests__/forms-webmcp.test.ts
@@ -289,3 +289,46 @@ describe('watchWebMcp', () => {
});
});
});
+
+describe('WebMCP audit fixes', () => {
+ it('names the field nested past the depth limit', () => {
+ let deep: Record = { leaf: 'x' };
+ for (let i = 0; i < 11; i++) deep = { a: deep };
+ const shape = inferShape(deep);
+ expect(shape.schema).toBeUndefined();
+ expect(shape.blocking).toEqual([
+ { path: 'a.a.a.a.a.a.a.a.a.a', reason: 'nested deeper than 10 levels' },
+ ]);
+ });
+
+ it('patches a modelContext added after the overlay loaded', async () => {
+ const watcher = watch();
+ expect(watcher.describe([]).page).toBeUndefined();
+ const { tools } = fakeContext();
+ expect(watcher.describe([]).page).toMatchObject({ modelContext: true });
+ await (navigator as any).modelContext.registerTool({
+ name: 'late',
+ description: 'Registered after load',
+ inputSchema: { type: 'object', properties: {} },
+ execute: async () => ({ content: [] }),
+ });
+ expect(tools.has('late')).toBe(true);
+ expect(watcher.describe([]).page?.tools.map((t) => t.name)).toEqual(['late']);
+ });
+
+ it('counts only the synchronous part of a call as agent activity', async () => {
+ const { tools } = fakeContext();
+ const watcher = watch();
+ let release!: () => void;
+ await (navigator as any).modelContext.registerTool({
+ name: 'slow',
+ description: '',
+ inputSchema: { type: 'object', properties: {} },
+ execute: () => new Promise((resolve) => (release = resolve)),
+ });
+ const pending = tools.get('slow')!.execute({});
+ expect(watcher.active()).toBe(false);
+ release();
+ await pending;
+ });
+});
diff --git a/packages/devtools/src/__tests__/ngrx-collector.test.ts b/packages/devtools/src/__tests__/ngrx-collector.test.ts
index baaaaae8..d68c9db2 100644
--- a/packages/devtools/src/__tests__/ngrx-collector.test.ts
+++ b/packages/devtools/src/__tests__/ngrx-collector.test.ts
@@ -4,7 +4,13 @@ import { describe, expect, it, vi } from 'vitest';
import { domTree } from '../host-tree.ts';
import { createNgrxCollector } from '../ngrx-collector.ts';
import { attachNgrx } from '../ngrx-overlay.ts';
-import { diff, serialize, type NgrxPageReport } from '../ngrx-shared.ts';
+import {
+ diff,
+ NGRX_DIFF_MORE_CAP,
+ referenceDiff,
+ serialize,
+ type NgrxPageReport,
+} from '../ngrx-shared.ts';
import { mergeNgrxReport, nameStore, ngrxStateOf, type NgrxPages } from '../rpc/ngrx-tools.ts';
const SIGNAL = Symbol('SIGNAL');
@@ -998,6 +1004,33 @@ describe('ngrx collector with a classic store', () => {
]);
});
+ it('marks a diff cut at 50 rows with the number of changes left out', () => {
+ const initial = Object.fromEntries(Array.from({ length: 60 }, (_, i) => [`k${i}`, 0]));
+ const { store, collector } = fakeClassic(initial, (state, action) =>
+ action.type === 'bump'
+ ? Object.fromEntries(Object.keys(state).map((key) => [key, 1]))
+ : { ...state, k0: 2 },
+ );
+ store.dispatch({ type: 'bump' });
+ store.dispatch({ type: 'one' });
+ const [bump, one] = collector.logSince(0);
+ expect(bump.diff).toHaveLength(50);
+ expect(bump.diffTruncated).toBe(10);
+ expect(one.diff).toHaveLength(1);
+ expect(one).not.toHaveProperty('diffTruncated');
+ });
+
+ it('reuses the serialized classic state while the store holds the same object', () => {
+ const { store, collector } = fakeClassic({ n: 0 }, (s, action) =>
+ action.type === 'inc' ? { n: s.n + 1 } : s,
+ );
+ store.dispatch({ type: 'noop' });
+ const first = collector.collect().classic!.state;
+ expect(collector.collect().classic!.state).toBe(first);
+ store.dispatch({ type: 'inc' });
+ expect(collector.collect().classic!.state).toEqual({ n: 1 });
+ });
+
it('keeps a redacted top-level key out of the logged diff', () => {
const { store, collector } = fakeClassic({ apiKey: 'hunter2' }, (state, action) =>
action.type === 'rotate' ? { apiKey: 'swordfish' } : state,
@@ -1284,6 +1317,33 @@ describe('serialize', () => {
{ path: 'c', op: 'add', after: true },
]);
});
+
+ it('counts the changes past the limit without keeping them', () => {
+ const before = Object.fromEntries(Array.from({ length: 60 }, (_, i) => [`k${i}`, 0]));
+ const after = Object.fromEntries(Array.from({ length: 60 }, (_, i) => [`k${i}`, 1]));
+ const overflow = { more: 0 };
+ expect(diff(before, after, 50, 6, overflow)).toHaveLength(50);
+ expect(overflow.more).toBe(10);
+ const raw = { more: 0 };
+ expect(referenceDiff(before, after, '', {}, 50, 12, raw)).toHaveLength(50);
+ expect(raw.more).toBe(10);
+ });
+
+ it('stops counting at the cap', () => {
+ const size = NGRX_DIFF_MORE_CAP + 200;
+ const before = Array.from({ length: size }, () => 0);
+ const after = Array.from({ length: size }, () => 1);
+ const overflow = { more: 0 };
+ expect(diff(before, after, 50, 6, overflow)).toHaveLength(50);
+ expect(overflow.more).toBe(NGRX_DIFF_MORE_CAP);
+ });
+
+ it('treats equal objects as unchanged whatever their key order', () => {
+ expect(diff({ a: [{ x: 1, y: 2 }] }, { a: [{ y: 2, x: 1 }] }, 50, 1)).toEqual([]);
+ expect(diff({ a: { x: 1 } }, { a: { x: 1, y: 2 } }, 50, 1)).toEqual([
+ { path: 'a', op: 'change', before: { x: 1 }, after: { x: 1, y: 2 } },
+ ]);
+ });
});
describe('ngrx tools', () => {
diff --git a/packages/devtools/src/__tests__/router-attach.test.ts b/packages/devtools/src/__tests__/router-attach.test.ts
index 5befe8ca..6c42a1eb 100644
--- a/packages/devtools/src/__tests__/router-attach.test.ts
+++ b/packages/devtools/src/__tests__/router-attach.test.ts
@@ -4,6 +4,7 @@ import { PANGULAR_INSPECTORS } from '../config.ts';
import { createScanBackoff } from '../router-attach.ts';
const calls: string[] = [];
+const routerReports: { navigations: { id: number; url: string; outcome: string }[] }[] = [];
vi.mock('devframe/client', () => ({
connectDevframe: async () => ({
@@ -18,8 +19,9 @@ vi.mock('devframe/client', () => ({
},
scope: () => ({
rpc: {
- call: async (name: string) => {
+ call: async (name: string, arg: unknown) => {
calls.push(name);
+ if (name === 'push-router') routerReports.push(JSON.parse(JSON.stringify(arg)));
return undefined;
},
register: () => {},
@@ -79,3 +81,114 @@ describe('overlay router lookup without an Angular root', () => {
}
});
});
+
+describe('overlay router lookup after the router goes away', () => {
+ function fakeRouter() {
+ const listeners = new Set();
+ return {
+ listeners,
+ config: [{ path: 'a' }],
+ navigated: true,
+ url: '/',
+ routerState: { snapshot: null },
+ disposed: false,
+ navigateByUrl: () => Promise.resolve(true),
+ events: {
+ subscribe(listener: unknown) {
+ listeners.add(listener);
+ return { unsubscribe: () => listeners.delete(listener) };
+ },
+ },
+ };
+ }
+
+ let current = fakeRouter();
+
+ beforeEach(() => {
+ calls.length = 0;
+ document.body.innerHTML = ' ';
+ (window as { ng?: unknown }).ng = {
+ getComponent: () => ({}),
+ getInjector: () => ({}),
+ ɵgetRouterInstance: () => current,
+ };
+ vi.stubGlobal('BroadcastChannel', undefined);
+ vi.stubGlobal(
+ 'fetch',
+ vi.fn(async () => new Response('', { status: 404 })),
+ );
+ vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval'] });
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ vi.unstubAllGlobals();
+ vi.restoreAllMocks();
+ delete (window as { ng?: unknown }).ng;
+ document.body.innerHTML = '';
+ });
+
+ it('lets go of a disposed router and watches the new one', async () => {
+ const first = fakeRouter();
+ current = first;
+ const { initOverlay } = await import('../overlay.ts');
+ const dispose = await initOverlay();
+ try {
+ await vi.advanceTimersByTimeAsync(2_000);
+ expect(first.listeners.size).toBeGreaterThan(0);
+ const second = fakeRouter();
+ first.disposed = true;
+ current = second;
+ await vi.advanceTimersByTimeAsync(2_000);
+ expect(first.listeners.size).toBe(0);
+ expect(second.listeners.size).toBeGreaterThan(0);
+ } finally {
+ dispose();
+ }
+ });
+
+ it('does not fold the new router navigation ids into the old router records', async () => {
+ const emit = (router: ReturnType, event: Record) => {
+ for (const listener of router.listeners) (listener as (event: unknown) => void)(event);
+ };
+ const first = fakeRouter();
+ current = first;
+ routerReports.length = 0;
+ const { initOverlay } = await import('../overlay.ts');
+ const dispose = await initOverlay();
+ try {
+ await vi.advanceTimersByTimeAsync(2_000);
+ emit(first, { type: 0, id: 1, url: '/a' });
+ emit(first, { type: 1, id: 1, url: '/a', urlAfterRedirects: '/a' });
+ await vi.advanceTimersByTimeAsync(2_000);
+ const second = fakeRouter();
+ first.disposed = true;
+ current = second;
+ await vi.advanceTimersByTimeAsync(2_000);
+ emit(second, { type: 0, id: 1, url: '/b' });
+ emit(second, { type: 1, id: 1, url: '/b', urlAfterRedirects: '/b' });
+ await vi.advanceTimersByTimeAsync(2_000);
+ const last = routerReports.at(-1)!;
+ expect(last.navigations.map(({ id, url, outcome }) => ({ id, url, outcome }))).toEqual([
+ { id: 1, url: '/b', outcome: 'succeeded' },
+ ]);
+ } finally {
+ dispose();
+ }
+ });
+
+ it('keeps looking, with a back-off, when the root has no router yet', async () => {
+ current = null as never;
+ const { initOverlay } = await import('../overlay.ts');
+ const dispose = await initOverlay();
+ try {
+ await vi.advanceTimersByTimeAsync(10_000);
+ const late = fakeRouter();
+ current = late;
+ await vi.advanceTimersByTimeAsync(60_000);
+ expect(late.listeners.size).toBeGreaterThan(0);
+ } finally {
+ dispose();
+ }
+ });
+});
diff --git a/packages/devtools/src/__tests__/router-audit.test.ts b/packages/devtools/src/__tests__/router-audit.test.ts
index 5a20036f..3f45b3ad 100644
--- a/packages/devtools/src/__tests__/router-audit.test.ts
+++ b/packages/devtools/src/__tests__/router-audit.test.ts
@@ -56,6 +56,9 @@ Component({
>Partial
Invite
+
@if (nullOptions) {
Never
}
@@ -128,6 +131,14 @@ describe('router audit fixes on a real Router', () => {
expect(matchOptionsOf(null)).toBeNull();
});
+ it('finds RouterLinkActive on a parent of the RouterLink', async () => {
+ const harness = await RouterTestingHarness.create();
+ await harness.navigateByUrl('/a/child');
+ harness.detectChanges();
+ const parent = linksOf(ng(), router as never).find((l) => l.element === 'li');
+ expect(parent).toMatchObject({ linkActive: true, activeClasses: ['on'] });
+ });
+
it.skipIf(!angularAtLeast('22.0.0'))(
'agrees with RouterLinkActive for partial match options and null options',
async () => {
diff --git a/packages/devtools/src/__tests__/router-mcp.test.ts b/packages/devtools/src/__tests__/router-mcp.test.ts
index 24e9a860..666243e0 100644
--- a/packages/devtools/src/__tests__/router-mcp.test.ts
+++ b/packages/devtools/src/__tests__/router-mcp.test.ts
@@ -227,7 +227,8 @@ describe('router MCP tools', () => {
);
expect(text).toContain('redirect from #3');
expect(text).toContain('error `NG04002`: No route matches the URL');
- expect(text).toContain('Instrumentation is on.');
+ expect(text).toContain('Instrumentation is on,');
+ expect(text).not.toContain('turn it on');
expect(await call('explain-navigation', { id: 4 })).not.toContain('#3 `/admin`');
const perf = await call('explain-navigation', { perf: true });
expect(perf).toContain('#3 `/admin` 12ms, mostly guards (3ms)');
diff --git a/packages/devtools/src/__tests__/router-regressions.test.ts b/packages/devtools/src/__tests__/router-regressions.test.ts
new file mode 100644
index 00000000..aa78bebd
--- /dev/null
+++ b/packages/devtools/src/__tests__/router-regressions.test.ts
@@ -0,0 +1,177 @@
+// @vitest-environment jsdom
+import { describe, expect, it } from 'vitest';
+import { EventType, applyRouterEvent, type NavigationRecord } from '../router.ts';
+import { configSignature, type RouteNode } from '../router-config.ts';
+import { instrument, runAction } from '../router-actions.ts';
+import { lintRoutes } from '../rpc/router-config-tools.ts';
+import { explainNavigationText, type RouterPage, type RouterState } from '../rpc/router-tools.ts';
+
+function node(fullPath: string, extra: Partial = {}): RouteNode {
+ const path = extra.path ?? fullPath.split('/').pop() ?? '';
+ return { id: fullPath, path, fullPath, kind: 'component', component: 'C', ...extra };
+}
+
+function page(extra: Partial = {}): RouterPage {
+ return { pageId: 'p', snapshot: null, navigations: [], reportedAt: 1, changedAt: 1, ...extra };
+}
+
+function events() {
+ const listeners: ((event: Record) => void)[] = [];
+ return {
+ subscribe(listener: (event: Record) => void) {
+ listeners.push(listener);
+ return { unsubscribe: () => listeners.splice(listeners.indexOf(listener), 1) };
+ },
+ };
+}
+
+describe('router config signature', () => {
+ it('changes when a route is edited in place with the same route count', () => {
+ const routes: Record[] = [{ path: 'a' }, { path: 'b', canActivate: [] }];
+ const router = { config: routes };
+ const before = configSignature(router);
+ routes[0]['path'] = 'renamed';
+ const renamed = configSignature(router);
+ expect(renamed).not.toBe(before);
+ (routes[1]['canActivate'] as unknown[]).push(() => true);
+ expect(configSignature(router)).not.toBe(renamed);
+ expect(configSignature(router)).toBe(configSignature(router));
+ });
+
+ it('changes when a guard is swapped for another at the same index, but not when it is instrumented', () => {
+ const first = () => true;
+ const routes: Record[] = [{ path: 'a', canActivate: [first] }];
+ const router = { config: routes, events: events() };
+ const before = configSignature(router);
+ const stop = instrument(router, []);
+ expect((routes[0]['canActivate'] as unknown[])[0]).not.toBe(first);
+ expect(configSignature(router)).toBe(before);
+ stop();
+ (routes[0]['canActivate'] as unknown[])[0] = () => false;
+ expect(configSignature(router)).not.toBe(before);
+ });
+});
+
+describe('router lint', () => {
+ it('flags a param route that shadows a literal, with or without children', () => {
+ const rules = (config: RouteNode[]) =>
+ lintRoutes(page({ config })).filter((f) => f.rule === 'param-shadows-literal');
+ // Angular matches '/new' as ':id' with no child activated; it does not backtrack.
+ const withChildren = node('/:id', {
+ kind: 'children',
+ component: undefined,
+ children: [node('/:id/edit', { path: 'edit' })],
+ });
+ expect(rules([withChildren, node('/new')])).toHaveLength(1);
+ const withEmptyChild = {
+ ...withChildren,
+ children: [node('/:id', { path: '' }), node('/:id/edit', { path: 'edit' })],
+ };
+ expect(rules([withEmptyChild, node('/new')])).toHaveLength(1);
+ expect(rules([node('/:id'), node('/new')])).toHaveLength(1);
+ });
+
+ it('flags unloaded lazy param routes, loadComponent and loadChildren alike', () => {
+ const rules = (config: RouteNode[]) =>
+ lintRoutes(page({ config })).filter((f) => f.rule === 'param-shadows-literal');
+ const lazyComponent = node('/:id', { lazy: 'unloaded', component: undefined });
+ expect(rules([lazyComponent, node('/new')])).toHaveLength(1);
+ const lazyChildren = node('/:id', { kind: 'lazy', lazy: 'unloaded', component: undefined });
+ expect(rules([lazyChildren, node('/new')])).toHaveLength(1);
+ });
+
+ it('says Angular stays silent about an empty-path prefix redirect', () => {
+ const config = [
+ node('/', { path: '', kind: 'redirect', redirectTo: 'home', pathMatch: 'prefix' }),
+ node('/home'),
+ ];
+ const finding = lintRoutes(page({ config })).find((f) => f.rule === 'empty-redirect-prefix');
+ expect(finding).toMatchObject({ angular: 'silent' });
+ expect(finding?.message).toContain("pathMatch 'prefix'");
+ });
+});
+
+describe('router events', () => {
+ it('takes a skipped navigation trigger from the current navigation', () => {
+ const navigations: NavigationRecord[] = [];
+ const router = {
+ navigationTransitions: { currentNavigation: () => ({ id: 4, trigger: 'popstate' }) },
+ };
+ applyRouterEvent(
+ navigations,
+ { type: EventType.NavigationSkipped, id: 4, url: '/x' },
+ 1,
+ router,
+ );
+ applyRouterEvent(
+ navigations,
+ { type: EventType.NavigationSkipped, id: 5, url: '/y' },
+ 2,
+ router,
+ );
+ expect(navigations.map((nav) => nav.trigger)).toEqual(['popstate', 'unknown']);
+ });
+
+ it('reports the title set after NavigationEnd', async () => {
+ const navigations: NavigationRecord[] = [];
+ const router = { url: '/', routerState: { snapshot: null } };
+ let late = 0;
+ applyRouterEvent(navigations, { type: EventType.NavigationStart, id: 1, url: '/a' }, 0, router);
+ document.title = 'Before';
+ applyRouterEvent(
+ navigations,
+ { type: EventType.NavigationEnd, id: 1, urlAfterRedirects: '/a' },
+ 1,
+ router,
+ () => late++,
+ );
+ document.title = 'Page A';
+ await Promise.resolve();
+ expect(navigations[0].title).toBe('Page A');
+ expect(late).toBe(1);
+ });
+});
+
+describe('router probe', () => {
+ it('answers at once when navigateByUrl throws', async () => {
+ const router = {
+ navigationTransitions: { events: events() },
+ currentNavigation: () => null,
+ navigationId: 1,
+ navigateByUrl: () => {
+ throw new Error('bad url');
+ },
+ };
+ const started = Date.now();
+ const result = await runAction(router, [], { action: 'probe', url: '/x' }, () => {});
+ expect(Date.now() - started).toBeLessThan(1000);
+ expect(result).toEqual({ error: expect.stringContaining('bad url') });
+ });
+});
+
+describe('explain-navigation', () => {
+ const navs: NavigationRecord[] = Array.from({ length: 80 }, (_, i) => ({
+ id: i + 1,
+ url: `/n${i + 1}`,
+ trigger: 'imperative',
+ startedAt: i + 1,
+ outcome: 'succeeded',
+ }));
+
+ it('allows up to the configured navigation limit', () => {
+ const state: RouterState = { pages: [page({ navigations: navs })] } as RouterState;
+ const text = explainNavigationText(state, { limit: 80 }, 1, 200);
+ expect(text).toContain('Most recent 80 of 80');
+ expect(explainNavigationText(state, { limit: 80 }, 1)).toContain('Most recent 50 of 80');
+ });
+
+ it('only asks to turn instrumentation on when it is off', () => {
+ const off = explainNavigationText({ pages: [page({ navigations: navs })] } as RouterState, {});
+ expect(off).toContain('Instrumentation is off');
+ const on = explainNavigationText(
+ { pages: [page({ navigations: navs, instrumented: true })] } as RouterState,
+ {},
+ );
+ expect(on).not.toContain('turn it on');
+ });
+});
diff --git a/packages/devtools/src/analog-redact.ts b/packages/devtools/src/analog-redact.ts
index 0507239c..ec0ba45e 100644
--- a/packages/devtools/src/analog-redact.ts
+++ b/packages/devtools/src/analog-redact.ts
@@ -3,21 +3,50 @@ import { redactPreview } from './http-redact.ts';
import { redactText, redactUrl } from './router.ts';
import { clip } from './text.ts';
+/** Longest URL, `load()` preview and file path kept from a page report. */
+const MAX_URL = 2000;
+const MAX_PREVIEW = 1001;
+const MAX_PATH = 500;
+const MAX_ERROR = 300;
+
+/** A JWT cut before its signature, which the JWT pattern no longer matches. */
+const PARTIAL_JWT = /eyJ[\w-]*(?:\.[\w-]*)?$/;
+
+/**
+ * Clips `value` to twice `max` before redacting it, so an oversized field
+ * costs little to redact, and to `max` after. A JWT that the first cut splits
+ * is dropped, so its header and claims cannot slip past the redaction.
+ */
+function capped(value: string, max: number, redact: (text: string) => string = (t) => t) {
+ const head =
+ value.length > max * 2 ? `${value.slice(0, max * 2).replace(PARTIAL_JWT, '')}…` : value;
+ return clip(redact(head), max);
+}
+
/**
* Hides secret query values, JWTs, bearer tokens and `redaction.secretNames`
- * in the text fields of a page report before it is stored or served.
+ * in the text fields of a page report before it is stored or served, and
+ * clips each text field.
*/
export function redactAnalogReport(report: AnalogRuntimeReport): AnalogRuntimeReport {
+ const path = (value: string) => capped(value, MAX_PATH);
return {
...report,
- url: redactUrl(report.url),
+ url: capped(report.url, MAX_URL, redactUrl),
+ chain: report.chain.map((item) => ({
+ ...item,
+ path: path(item.path),
+ ...(item.file !== undefined && { file: path(item.file) }),
+ ...(item.serverFile !== undefined && { serverFile: path(item.serverFile) }),
+ })),
...(report.load && {
load: {
...report.load,
- preview: redactPreview(report.load.preview),
- keys: report.load.keys.map((key) => redactUrl(key)),
+ preview: capped(report.load.preview, MAX_PREVIEW, redactPreview),
+ keys: report.load.keys.map((key) => capped(key, MAX_PATH, redactUrl)),
},
}),
- hydrationErrors: report.hydrationErrors.map((error) => clip(redactText(error), 300)),
+ hydrationErrors: report.hydrationErrors.map((error) => capped(error, MAX_ERROR, redactText)),
+ configPaths: report.configPaths.map(path),
};
}
diff --git a/packages/devtools/src/config.ts b/packages/devtools/src/config.ts
index 49f25aa1..b2c7ac15 100644
--- a/packages/devtools/src/config.ts
+++ b/packages/devtools/src/config.ts
@@ -387,6 +387,14 @@ export function pickPangularConfig(
return { config: { inspectors, agent, actions, redaction, limits }, rest };
}
+/** Form actions that work without a `formId`: they act on the page, not on one form. */
+export const FORMLESS_FORM_ACTIONS: readonly string[] = [
+ 'locate',
+ 'pick',
+ 'cancel-pick',
+ 'instrument',
+];
+
/** Form actions that change the form or its validity, as opposed to reading or focusing it. */
export const FORM_WRITE_ACTIONS: readonly string[] = [
'set-value',
@@ -492,6 +500,15 @@ export const RPC_INSPECTOR: Record = {
'clear-http-calls': 'http',
'push-capacitor': 'capacitor',
'forget-capacitor-page': 'capacitor',
+ 'push-analog': 'analog',
+ 'forget-analog-page': 'analog',
+ 'analog-clear-calls': 'analog',
+ 'analog-project': 'analog',
+ 'analog-explain-url': 'analog',
+ 'analog-lint': 'analog',
+ 'analog-render': 'analog',
+ 'analog-text': 'analog',
+ 'analog-call-api': 'analog',
};
/**
diff --git a/packages/devtools/src/devframe.ts b/packages/devtools/src/devframe.ts
index 9a2300f4..7a793caa 100644
--- a/packages/devtools/src/devframe.ts
+++ b/packages/devtools/src/devframe.ts
@@ -175,7 +175,7 @@ import {
} from './rpc/cd-tools.ts';
import type { HttpPage, HttpPayloadState, HttpReport, HttpState } from './types.ts';
-import { nameServerFns, registerAnalog } from './rpc/analog-register.ts';
+import { analogPages, nameServerFns, registerAnalog } from './rpc/analog-register.ts';
import { createPageVisibility } from './rpc/page-ttl.ts';
import {
PAGE_ARGUMENT,
@@ -191,6 +191,7 @@ import { clip } from './text.ts';
import { setRedaction } from './forms-privacy.ts';
import {
FORM_WRITE_ACTIONS,
+ FORMLESS_FORM_ACTIONS,
PANGULAR_CONFIG_KEY,
ROUTER_WRITE_ACTIONS,
actionBlockedMessage,
@@ -1217,13 +1218,23 @@ const pangular = defineDevframe({
const pendingFormActions = new Map void>();
let formActionSeq = 0;
- const requestFormAction = (request: Record, timeoutMs = 15_000) =>
- !config.actions.forms && FORM_WRITE_ACTIONS.includes(request['action'] as string)
- ? Promise.resolve>({
- ok: false,
- error: actionBlockedMessage('forms'),
- })
- : sendFormAction(request, timeoutMs);
+ const requestFormAction = (request: Record, timeoutMs = 15_000) => {
+ const action = request['action'] as string;
+ if (!config.actions.forms && FORM_WRITE_ACTIONS.includes(action)) {
+ return Promise.resolve>({
+ ok: false,
+ error: actionBlockedMessage('forms'),
+ });
+ }
+ const formId = request['formId'];
+ if (!FORMLESS_FORM_ACTIONS.includes(action) && (typeof formId !== 'string' || !formId)) {
+ return Promise.resolve>({
+ ok: false,
+ error: `${String(action)} needs a formId.`,
+ });
+ }
+ return sendFormAction(request, timeoutMs);
+ };
const sendFormAction = (request: Record, timeoutMs: number) =>
new Promise>((resolve) => {
@@ -2269,8 +2280,8 @@ const pangular = defineDevframe({
limit: {
type: 'integer',
minimum: 1,
- maximum: 50,
- description: 'How many navigations to return (default 5, at most 50).',
+ maximum: limits.navigations,
+ description: `How many navigations to return (default 5, at most ${limits.navigations}).`,
},
perf: {
type: 'boolean',
@@ -2287,7 +2298,7 @@ const pangular = defineDevframe({
}) => {
const state = routerState.value() as RouterState;
if (!state.pages.length) return { markdown: noRouter };
- return { markdown: explainNavigationText(state, args) };
+ return { markdown: explainNavigationText(state, args, Date.now(), limits.navigations) };
},
});
@@ -2915,7 +2926,7 @@ const pangular = defineDevframe({
agent.registerTool({
id: 'pangular:form-action',
description:
- 'Act on a live form (dev mode). Actions: set-value (mode code or user; user goes through the input like typing), mark-touched, mark-untouched, mark-dirty, mark-pristine, touch-all, revalidate (Signal Forms: reloads async/HTTP validation), reset, enable, disable (reactive only), submit, focus, focus-first-invalid, store-as-global ($form in the page console), snapshot, restore, instrument (value true or false: record the calling code of form changes, validator changes and template updates per keystroke, shown by form-history). reset, submit and restore need confirm: true. Secret, hidden and readonly fields are never written; disabled reactive fields need force.',
+ 'Act on a live form (dev mode). Actions: set-value (mode code or user; user goes through the input like typing), mark-touched, mark-untouched, mark-dirty, mark-pristine, touch-all, revalidate (Signal Forms: reloads async/HTTP validation), reset, enable, disable (reactive only), submit, focus, focus-first-invalid, store-as-global ($form in the page console; needs force to replace a $form or $control the page set itself), snapshot, restore, instrument (value true or false: record the calling code of form changes, validator changes and template updates per keystroke, shown by form-history). reset, submit and restore need confirm: true. Secret, hidden and readonly fields are never written; disabled reactive fields need force.',
safety: 'action',
inputSchema: {
type: 'object',
@@ -3043,6 +3054,7 @@ const pangular = defineDevframe({
pipes: withUrl(pipePages.values()),
http: withUrl(httpPages.values()),
capacitor: withUrl(capacitorPages.values()),
+ analog: withUrl(on.analog ? analogPages() : []),
},
visibility.list(),
);
diff --git a/packages/devtools/src/forms-actions.ts b/packages/devtools/src/forms-actions.ts
index c5e7a338..2383206a 100644
--- a/packages/devtools/src/forms-actions.ts
+++ b/packages/devtools/src/forms-actions.ts
@@ -18,6 +18,7 @@ import {
import { childPath, splitPath } from './forms-path.ts';
import { fieldPath, submitSetup } from './forms-read.ts';
import { clip } from './text.ts';
+import { FORMLESS_FORM_ACTIONS } from './config.ts';
type AnyRecord = Record;
@@ -102,6 +103,9 @@ const snapshots = new Map<
const MAX_GUARDED_NODES = 5000;
+/** What `store-as-global` last wrote, so it only overwrites globals it set itself. */
+const storedGlobals = new Map();
+
export function secretInside(
value: unknown,
prefix = '',
@@ -404,7 +408,45 @@ function dispatchPick(element: Element): void {
element.dispatchEvent(new Event('change', { bubbles: true }));
}
-function nativeWrite(element: Element, value: unknown): boolean {
+const DATE_INPUTS = new Set(['date', 'datetime-local', 'time', 'month', 'week']);
+
+/**
+ * Writes a date or time input in its wire format. A string already in that format is
+ * written as is. A `Date`, a timestamp or another date string goes through `valueAsDate`
+ * (or `valueAsNumber` for `datetime-local`), in UTC like Signal Forms does. Returns a
+ * problem, and leaves the input as it was, when the value is not a valid date.
+ */
+function writeDateInput(element: HTMLInputElement, value: unknown): string | null {
+ const previous = element.value;
+ if (value == null || value === '') {
+ element.value = '';
+ return null;
+ }
+ let date: Date | null = null;
+ if (typeof value === 'string') {
+ element.value = value;
+ if (element.value) return null;
+ const time = Date.parse(value);
+ date = Number.isNaN(time) ? null : new Date(time);
+ } else if (value instanceof Date) date = value;
+ else if (typeof value === 'number') date = new Date(value);
+ if (date !== null && !Number.isNaN(Number(date))) {
+ read(() => {
+ // valueAsNumber counts months for a month input, so only datetime-local takes it.
+ if (element.type === 'datetime-local') element.valueAsNumber = Number(date);
+ else element.valueAsDate = date;
+ }, undefined);
+ if (element.value) return null;
+ }
+ element.value = previous;
+ return `is a ${element.type} input and ${label(value)} is not a valid ${element.type} value`;
+}
+
+/**
+ * Writes a native input or textarea and fires its events. Returns false when the element
+ * can't be written this way, or a problem when the value doesn't fit the input.
+ */
+function nativeWrite(element: Element, value: unknown): boolean | string {
if (element instanceof HTMLInputElement) {
if (element.type === 'file') return false;
if (element.type === 'checkbox') {
@@ -424,7 +466,10 @@ function nativeWrite(element: Element, value: unknown): boolean {
dispatchPick(target);
return true;
}
- element.value = value == null ? '' : String(value);
+ if (DATE_INPUTS.has(element.type)) {
+ const problem = writeDateInput(element, value);
+ if (problem) return problem;
+ } else element.value = value == null ? '' : String(value);
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
return true;
@@ -545,7 +590,9 @@ function writeValue(
? null
: `holds ${label(stored)} after the write`;
}
- if (viaDom && nativeWrite(element, value)) {
+ const written = viaDom ? nativeWrite(element, value) : false;
+ if (typeof written === 'string') return written;
+ if (viaDom && written) {
if (mode === 'user') element.dispatchEvent(new Event('blur'));
const picked =
element instanceof HTMLInputElement &&
@@ -688,7 +735,10 @@ export async function runFormAction(
if (!request.selector) return fail('Pass a CSS selector.');
return locate(ctx, request.selector);
}
- const found = request.formId ? ctx.forms.get(request.formId) : ctx.forms.values().next().value;
+ if (!request.formId && !FORMLESS_FORM_ACTIONS.includes(request.action)) {
+ return fail(`${request.action} needs a formId.`);
+ }
+ const found = request.formId ? ctx.forms.get(request.formId) : undefined;
if (!found) return fail(`No form ${request.formId ?? ''} on this page.`);
if (CONFIRM_ACTIONS.includes(request.action) || (request.action === 'fill' && request.submit)) {
if (request.confirm !== true) {
@@ -896,8 +946,18 @@ async function perform(
case 'store-as-global': {
const target = signal ? read(() => found.root['fieldTree'], found.root) : found.root;
const w = window as unknown as AnyRecord;
+ const taken = (['$form', '$control'] as const).find(
+ (name) => w[name] !== undefined && w[name] !== storedGlobals.get(name),
+ );
+ if (taken && !request.force) {
+ return fail(
+ `The page already defines ${taken}, so it was not overwritten. Call again with force: true to replace it.`,
+ );
+ }
w['$form'] = target;
w['$control'] = signal ? read(() => nodeAt(found, path, true)?.['fieldTree'], null) : node();
+ storedGlobals.set('$form', w['$form']);
+ storedGlobals.set('$control', w['$control']);
const expression = expressionFor(found, path);
return {
ok: true,
diff --git a/packages/devtools/src/forms-collector.ts b/packages/devtools/src/forms-collector.ts
index af5faef9..fd53b074 100644
--- a/packages/devtools/src/forms-collector.ts
+++ b/packages/devtools/src/forms-collector.ts
@@ -5,6 +5,7 @@ import {
diffForms,
findFieldElement,
findForms,
+ pageElements,
createFormIds,
formLabels,
propertyHolding,
@@ -37,6 +38,7 @@ import {
import { redactMessage } from './forms-privacy.ts';
import { fieldPath, probeEveryTime } from './forms-read.ts';
import { watchWebMcp } from './forms-webmcp.ts';
+import { FORMLESS_FORM_ACTIONS } from './config.ts';
type AnyRecord = Record;
@@ -123,16 +125,40 @@ export function attachForms(
const assignIds = createFormIds(pageId);
let ids = new WeakMap();
const idOf = (root: object) => ids.get(root) ?? `form@${pageId}`;
+ // Directive hosts from the last scan. Elements added since then are scanned on the next
+ // push; a full rescan runs at most once per heartbeat, as a safety net.
let hosts: Element[] | null = null;
- let hostsStale = true;
+ const added = new Set();
+ let lastFullScan = 0;
+ const observed = new WeakSet();
const observer =
typeof MutationObserver === 'function'
- ? new MutationObserver(() => {
- hostsStale = true;
+ ? new MutationObserver((records) => {
+ for (const record of records) {
+ for (const node of Array.from(record.addedNodes)) {
+ if (node.nodeType === 1) added.add(node as Element);
+ }
+ }
})
: null;
- observer?.observe(document.documentElement, { childList: true, subtree: true });
+ const observe = (target: Node) => {
+ if (!observer || observed.has(target)) return;
+ observed.add(target);
+ observer.observe(target, { childList: true, subtree: true });
+ };
+ observe(document.documentElement);
+ const scanAll = () => pageElements(document, observe);
+ /** The elements worth scanning: the cached hosts plus what was added since the last scan. */
+ const knownElements = (): Element[] => {
+ if (!hosts || !observer) return scanAll();
+ const out = new Set(hosts.filter((el) => el.isConnected));
+ for (const el of added) {
+ if (el.isConnected) for (const inner of pageElements(el, observe)) out.add(inner);
+ }
+ return [...out];
+ };
let lastForms: CollectedForm[] = [];
+ let lastRoots = new Map();
let lastPayload = '';
let lastPushAt = 0;
const formEvents: FormEvent[] = [];
@@ -237,9 +263,20 @@ export function attachForms(
}
function watchRoots(found: FoundForm[]) {
- const live = new Set();
+ const live = new Set(found.map((form) => form.root));
+ // Forget the forms that are gone first: a recreated form can take over their id.
+ for (const [root, { formId, stop }] of watched) {
+ if (live.has(root)) continue;
+ stop();
+ watched.delete(root);
+ forgetKeys(formId);
+ }
+ for (const [root, { formId }] of signalRoots) {
+ if (live.has(root)) continue;
+ unwrapSignalRoot(root);
+ forgetKeys(formId);
+ }
for (const form of found) {
- live.add(form.root);
if (form.kind === 'signal') {
wrapSignalSubmit(form);
continue;
@@ -270,17 +307,6 @@ export function attachForms(
watched.set(form.root, { formId, stop });
seedStatuses(formId, serializeControl(form.root, fieldElements));
}
- for (const [root, { formId, stop }] of watched) {
- if (live.has(root)) continue;
- stop();
- watched.delete(root);
- forgetKeys(formId);
- }
- for (const [root, { formId }] of signalRoots) {
- if (live.has(root)) continue;
- unwrapSignalRoot(root);
- forgetKeys(formId);
- }
}
function wrapSignalSubmit(form: FoundForm) {
@@ -366,26 +392,27 @@ export function attachForms(
try {
const ng = getNg();
if (!ng?.getDirectives) return;
- const rescan = hostsStale || !hosts || !observer;
- const found = findForms(
- ng,
- rescan ? document.querySelectorAll('*') : hosts!.filter((el) => el.isConnected),
- );
- if (rescan) {
- hosts = found.hosts ?? null;
- hostsStale = false;
- }
+ const now = Date.now();
+ const full = !hosts || !observer || (added.size > 0 && now - lastFullScan >= HEARTBEAT_MS);
+ const found = findForms(ng, full ? scanAll() : knownElements());
+ if (full) lastFullScan = now;
+ added.clear();
+ hosts = found.hosts ?? null;
const labels = formLabels(found.forms);
ids = assignIds(found.forms, labels);
foundById = new Map(found.forms.map((form) => [idOf(form.root), form]));
fieldElements = found.elements;
watchRoots(found.forms);
const forms = collectForms(found, (root) => idOf(root));
- const now = Date.now();
for (const form of forms) stampPending(form.id, form.root, now);
const streamed = new Set(Array.from(watched.values(), ({ formId }) => formId));
const agentSincePush = webMcp.takeActivity();
- for (const event of diffForms(lastForms, forms)) {
+ // A form recreated under the same id starts over instead of diffing against the old one.
+ const comparable = lastForms.filter(
+ (form) => lastRoots.get(form.id) === foundById.get(form.id)?.root,
+ );
+ lastRoots = new Map(found.forms.map((form) => [idOf(form.root), form.root]));
+ for (const event of diffForms(comparable, forms)) {
if (!streamed.has(event.formId) || DIFFED_FOR_ALL.includes(event.type)) {
const caller = signalCallers.get(event.formId);
const origin: EventOrigin | undefined = devtoolsSincePush
@@ -540,8 +567,11 @@ export function attachForms(
cancelPick = null;
resolve(result);
};
+ // The first node of the composed path, so fields inside open shadow roots can be picked.
+ const targetOf = (event: Event) => event.composedPath?.()[0] ?? event.target;
const onHover = (event: Event) => {
- if (event.target instanceof HTMLElement) highlight.show(event.target);
+ const target = targetOf(event);
+ if (target instanceof HTMLElement) highlight.show(target);
};
const onLeave = (event: MouseEvent) => {
if (!event.relatedTarget) highlight.clear();
@@ -549,7 +579,8 @@ export function attachForms(
const onClick = (event: Event) => {
event.preventDefault();
event.stopPropagation();
- const target = event.target instanceof Element ? event.target : null;
+ const picked = targetOf(event);
+ const target = picked instanceof Element ? picked : null;
const field =
target?.closest('input, select, textarea, [formcontrolname], [ngmodel]') ?? target;
finish(
@@ -647,13 +678,7 @@ export function attachForms(
const found = foundById.get(target.formId);
if (!found) return;
try {
- const el = findFieldElement(
- ng,
- document.querySelectorAll('*'),
- found,
- target.path,
- fieldElements,
- );
+ const el = findFieldElement(ng, knownElements(), found, target.path, fieldElements);
if (el instanceof HTMLElement) highlight.show(el);
} catch {
return;
@@ -682,7 +707,9 @@ export function attachForms(
return respond({ ok: false, error: 'Unknown form action.' });
const request = message.request;
if (request.formId && !foundById.has(request.formId) && request.action !== 'locate') return;
- if (!request.formId && !foundById.size && request.action !== 'locate') return;
+ if (!request.formId && !FORMLESS_FORM_ACTIONS.includes(request.action)) {
+ return respond({ ok: false, error: `${request.action} needs a formId.` });
+ }
if (request.action === 'locate') {
let el: Element | null = null;
try {
@@ -696,7 +723,7 @@ export function attachForms(
ng,
forms: foundById,
elements: fieldElements,
- all: () => document.querySelectorAll('*'),
+ all: knownElements,
};
if (request.action === 'instrument') return respond(setInstrumented(request.value !== false));
if (request.action === 'pick') {
diff --git a/packages/devtools/src/forms-webmcp.ts b/packages/devtools/src/forms-webmcp.ts
index 78d985b5..421fe3f5 100644
--- a/packages/devtools/src/forms-webmcp.ts
+++ b/packages/devtools/src/forms-webmcp.ts
@@ -93,9 +93,12 @@ export function inferShape(value: unknown, path = '', depth = 0): Shape {
const at = path || '(form)';
if (value === null) return { blocking: [{ path: at, reason: 'null' }] };
if (value === undefined) return { blocking: [{ path: at, reason: 'undefined' }] };
- if (depth >= MAX_DEPTH) return { blocking: [] };
+ if (depth >= MAX_DEPTH) {
+ return { blocking: [{ path: at, reason: `nested deeper than ${MAX_DEPTH} levels` }] };
+ }
if (Array.isArray(value)) {
if (!value.length) return { blocking: [{ path: at, reason: 'empty array' }] };
+ // Angular infers an array from its first item only, so the others are not checked.
const item = inferShape(value[0], `${path}[]`, depth + 1);
return {
schema: item.schema && { type: 'array', items: item.schema },
@@ -236,7 +239,7 @@ export function watchWebMcp(onChange: () => void): WebMcpWatcher {
let activity = false;
let provided: boolean | undefined;
let providerCheckedAt = 0;
- const context = modelContextOf();
+ let context: AnyRecord | null = null;
let restore: (() => void) | null = null;
const add = (record: ToolRecord) => {
@@ -295,7 +298,8 @@ export function watchWebMcp(onChange: () => void): WebMcpWatcher {
};
}
- if (context) {
+ // Patches `registerTool` and lists the tools already there, once a `modelContext` exists.
+ function attach(context: AnyRecord) {
const original = context['registerTool'] as (...args: unknown[]) => unknown;
const own = Object.prototype.hasOwnProperty.call(context, 'registerTool');
const patched = function (this: unknown, tool: AnyRecord, options?: AnyRecord) {
@@ -366,6 +370,15 @@ export function watchWebMcp(onChange: () => void): WebMcpWatcher {
}
}
+ // A polyfill or extension can add `modelContext` after the overlay loads, so `describe`
+ // looks again until one shows up.
+ const lookUp = () => {
+ if (context) return;
+ context = modelContextOf();
+ if (context) attach(context);
+ };
+ lookUp();
+
const onRejection = (event: PromiseRejectionEvent) => {
const match = read(
() => String(event.reason?.message ?? event.reason).match(SCHEMA_ERROR),
@@ -435,7 +448,9 @@ export function watchWebMcp(onChange: () => void): WebMcpWatcher {
}
return {
- active: () => running > 0,
+ // Only the synchronous part of `execute`: user typing or app code that runs while a
+ // long async submit is pending is not the agent's.
+ active: () => current !== null,
takeActivity() {
const was = activity;
activity = running > 0;
@@ -446,6 +461,7 @@ export function watchWebMcp(onChange: () => void): WebMcpWatcher {
},
describe(forms, ng) {
const out = new Map();
+ lookUp();
if (!context) checkProvided(forms, ng);
if (!records.length) {
return {
diff --git a/packages/devtools/src/forms.ts b/packages/devtools/src/forms.ts
index ac1557df..2240acb5 100644
--- a/packages/devtools/src/forms.ts
+++ b/packages/devtools/src/forms.ts
@@ -166,6 +166,7 @@ const MAX_REDACT_WINDOW = 65536;
const MAX_VALUE_ITEMS = 20;
const MAX_VALUE_DEPTH = 3;
const MAX_DETAIL = 120;
+const MAX_SHADOW_DEPTH = 32;
type AnyRecord = Record;
@@ -211,8 +212,53 @@ function uidOf(target: object): string {
return uid;
}
+const MAX_HASH_NODES = 10_000;
+
+/**
+ * A hash of the whole value, unclipped, so an edit past the display limits of
+ * `serializeFormValue` still counts as a change. Stops after `MAX_HASH_NODES` nodes.
+ */
+export function valueHash(value: unknown): string {
+ let hash = 0x811c9dc5;
+ let nodes = 0;
+ const mix = (text: string) => {
+ for (let i = 0; i < text.length; i++) {
+ hash ^= text.charCodeAt(i);
+ hash = Math.imul(hash, 0x01000193);
+ }
+ };
+ const seen = new WeakSet();
+ const visit = (item: unknown) => {
+ if (++nodes > MAX_HASH_NODES) return;
+ if (item === null || typeof item !== 'object') {
+ mix(`${typeof item}:${typeof item === 'function' ? 'ƒ' : String(item)};`);
+ return;
+ }
+ if (item instanceof Date) return mix(`date:${item.getTime()};`);
+ if (typeof Node !== 'undefined' && item instanceof Node) return mix(`node:${item.nodeName};`);
+ if (seen.has(item)) return mix('cycle;');
+ seen.add(item);
+ const entries: [unknown, unknown][] =
+ item instanceof Map
+ ? Array.from(item.entries())
+ : item instanceof Set
+ ? Array.from(item, (entry, index) => [index, entry])
+ : Object.keys(item)
+ .filter((key) => !key.startsWith('__ng'))
+ .map((key) => [key, read(() => (item as AnyRecord)[key], undefined)]);
+ mix(Array.isArray(item) ? `[${entries.length}` : `{${entries.length}`);
+ for (const [key, child] of entries) {
+ mix(`${String(key)}=`);
+ visit(child);
+ }
+ mix(Array.isArray(item) ? ']' : '}');
+ };
+ visit(value);
+ return (hash >>> 0).toString(36);
+}
+
function changedOf(target: object, value: unknown, dirty: boolean): boolean | undefined {
- const text = JSON.stringify(serializeFormValue(value)) ?? 'undefined';
+ const text = valueHash(value);
if (!dirty || !baselines.has(target)) {
baselines.set(target, text);
return undefined;
@@ -772,17 +818,28 @@ export function formIdFor(label: string): string {
return id || 'form';
}
+/**
+ * Gives each form root a stable id for as long as it is on the page. Ids of roots that are
+ * gone are released, so a form recreated by a route round trip gets its old id back, and
+ * `~n` only tells apart forms that are on the page at the same time.
+ */
export function createFormIds(pageId: string) {
const assigned = new WeakMap();
- const used = new Set();
+ const live = new Map();
return (forms: FoundForm[], labels: Map): WeakMap => {
+ const present = new Set(forms.map((form) => form.root));
+ for (const [id, root] of live) {
+ if (present.has(root)) continue;
+ live.delete(id);
+ assigned.delete(root);
+ }
for (const form of forms) {
if (assigned.has(form.root)) continue;
const base = formIdFor(labels.get(form.root) ?? 'form');
const stem = base.replace(/~\d+$/, '');
let id = `${base}@${pageId}`;
- for (let n = 2; used.has(id); n++) id = `${stem}~${n}@${pageId}`;
- used.add(id);
+ for (let n = 2; live.has(id); n++) id = `${stem}~${n}@${pageId}`;
+ live.set(id, form.root);
assigned.set(form.root, id);
}
return assigned;
@@ -826,6 +883,32 @@ function compatControls(root: AnyRecord): AnyRecord[] {
return out;
}
+/**
+ * Every element under `root`, including the ones inside open shadow roots, so forms in
+ * `ViewEncapsulation.ShadowDom` components are found. With an element, it comes first.
+ * `onShadowRoot` sees each shadow root on the way.
+ */
+export function pageElements(
+ root: Document | Element = document,
+ onShadowRoot?: (shadow: ShadowRoot) => void,
+): Element[] {
+ const out: Element[] = [];
+ const visit = (scope: Document | Element | ShadowRoot, depth: number) => {
+ const add = (el: Element) => {
+ out.push(el);
+ const shadow = el.shadowRoot;
+ if (shadow && depth < MAX_SHADOW_DEPTH) {
+ onShadowRoot?.(shadow);
+ visit(shadow, depth + 1);
+ }
+ };
+ if (scope instanceof Element) add(scope);
+ for (const el of Array.from(scope.querySelectorAll('*'))) add(el);
+ };
+ visit(root, 0);
+ return out;
+}
+
export function findForms(ng: FormsDebugApi, elements: Iterable): FoundForms {
const byRoot = new Map();
const controlElements = new WeakMap();
diff --git a/packages/devtools/src/ngrx-collector.ts b/packages/devtools/src/ngrx-collector.ts
index ee2dd307..b9993941 100644
--- a/packages/devtools/src/ngrx-collector.ts
+++ b/packages/devtools/src/ngrx-collector.ts
@@ -5,6 +5,7 @@ import { className, tokenName } from './injector-tree.ts';
import {
diff,
dispatchProblem,
+ NGRX_DIFF_MORE_CAP,
referenceDiff,
serialize,
serializeSlice,
@@ -170,23 +171,50 @@ function envScope(ng: NgrxDebugNg, injector: AnyRecord): st
return typeof source === 'string' && source ? source : 'environment';
}
-function snapshotDiff(before: Snapshot, after: Snapshot, keys: PropertyKey[]): NgrxDiffEntry[] {
+/** The kept diff rows, and how many more changes were counted past them. */
+interface Changes {
+ diff: NgrxDiffEntry[];
+ more: number;
+}
+
+/** `diffTruncated` for an entry, set only when changes were left out. */
+function truncated(more: number): { diffTruncated?: number } {
+ return more > 0 ? { diffTruncated: Math.min(more, NGRX_DIFF_MORE_CAP) } : {};
+}
+
+function snapshotDiff(before: Snapshot, after: Snapshot, keys: PropertyKey[]): Changes {
const out: NgrxDiffEntry[] = [];
+ const overflow = { more: 0 };
for (const key of keys) {
- if (out.length >= MAX_DIFF) break;
+ if (out.length >= MAX_DIFF && overflow.more >= NGRX_DIFF_MORE_CAP) break;
if (before[key] === after[key]) continue;
const root = String(key);
if (typeof key === 'string' && isRedactedKey(key)) {
- out.push({ path: root, op: 'change', before: REDACTED, after: REDACTED });
+ if (out.length < MAX_DIFF) {
+ out.push({ path: root, op: 'change', before: REDACTED, after: REDACTED });
+ } else overflow.more++;
continue;
}
+ const counted = overflow.more;
const found = diff(
serializeSlice(key, before[key]),
serializeSlice(key, after[key]),
MAX_DIFF - out.length,
+ undefined,
+ overflow,
);
- if (!found.length) {
- out.push(...referenceDiff(before[key], after[key], root, SMALL, MAX_DIFF - out.length));
+ if (!found.length && overflow.more === counted) {
+ out.push(
+ ...referenceDiff(
+ before[key],
+ after[key],
+ root,
+ SMALL,
+ MAX_DIFF - out.length,
+ undefined,
+ overflow,
+ ),
+ );
continue;
}
for (const entry of found) {
@@ -204,7 +232,7 @@ function snapshotDiff(before: Snapshot, after: Snapshot, keys: PropertyKey[]): N
});
}
}
- return out;
+ return { diff: out, more: overflow.more };
}
function syncValue(observable: AnyRecord | null | undefined): unknown {
@@ -315,7 +343,7 @@ export function createNgrxCollector(
// noop entry). Otherwise the next real `watchState` firing would diff
// against stale state.
if (t.watched) t.lastWatched = after;
- if (!changes.length) {
+ if (!changes.diff.length) {
if (!logNoop) return;
const noopAt = Date.now();
if (noopAt - (t.lastNoop.get(type) ?? 0) < NOOP_GAP_MS) return;
@@ -328,7 +356,8 @@ export function createNgrxCollector(
type,
...(args ? { args: args.map((a) => serialize(a, SMALL)) } : {}),
timestamp: Date.now(),
- diff: changes,
+ diff: changes.diff,
+ ...truncated(changes.more),
restorable: t.writable,
...(causedByEvent ? { causedByEvent } : {}),
...(durationMs !== undefined ? { durationMs } : {}),
@@ -383,7 +412,7 @@ export function createNgrxCollector(
// microtask-fallback path, where `finish()` runs after dispatch returns).
const causedByEvent = currentDispatchedEvent ?? pendingEventByInstance.get(t.instance);
if (!currentDispatchedEvent && causedByEvent) pendingEventByInstance.delete(t.instance);
- if (!changes.length) return;
+ if (!changes.diff.length) return;
const type = call?.name ?? 'patchState';
const isRestore = /^Restore #\d+/.test(type);
const durationMs = call && !isRestore ? Math.round(now() - call.startedAt) : undefined;
@@ -396,7 +425,8 @@ export function createNgrxCollector(
? { args: call.args.map((a) => serialize(a, SMALL)) }
: {}),
timestamp: Date.now(),
- diff: changes,
+ diff: changes.diff,
+ ...truncated(changes.more),
restorable: t.writable,
...(causedByEvent ? { causedByEvent } : {}),
...(durationMs !== undefined ? { durationMs } : {}),
@@ -735,6 +765,15 @@ export function createNgrxCollector(
return fromSource !== undefined ? fromSource : syncValue(store);
};
+ /**
+ * The serialized classic state. `last` already holds `serialize(lastRaw)`, so the
+ * state is serialized again only when the store emitted a new object since then.
+ */
+ const classicSnapshot = (c: Classic): unknown => {
+ const raw = classicState(c.store);
+ return Object.is(raw, c.lastRaw) ? c.last : serialize(raw);
+ };
+
const logClassic = (
c: Classic,
type: string,
@@ -743,14 +782,15 @@ export function createNgrxCollector(
): NgrxLogEntry => {
const raw = classicState(c.store);
const next = serialize(raw);
- let changes = diff(c.last, next, MAX_DIFF).map((entry) => ({
+ const overflow = { more: 0 };
+ let changes = diff(c.last, next, MAX_DIFF, undefined, overflow).map((entry) => ({
...entry,
...('before' in entry ? { before: serialize(entry.before, SMALL) } : {}),
...('after' in entry ? { after: serialize(entry.after, SMALL) } : {}),
}));
- if (!changes.length && !Object.is(c.lastRaw, raw)) {
- changes = referenceDiff(c.lastRaw, raw, '', SMALL, MAX_DIFF).map((entry) =>
- entry.path ? entry : { ...entry, path: '(root)' },
+ if (!changes.length && !overflow.more && !Object.is(c.lastRaw, raw)) {
+ changes = referenceDiff(c.lastRaw, raw, '', SMALL, MAX_DIFF, undefined, overflow).map(
+ (entry) => (entry.path ? entry : { ...entry, path: '(root)' }),
);
}
const origin =
@@ -771,6 +811,7 @@ export function createNgrxCollector(
...(origin ? { origin } : {}),
timestamp: Date.now(),
diff: changes,
+ ...truncated(overflow.more),
restorable: held,
...(c.devtools && !held ? { unrestorable: 'not-recorded' as const } : {}),
},
@@ -1161,7 +1202,7 @@ export function createNgrxCollector(
stores,
classic: classic
? {
- state: serialize(classicState(classic.store)),
+ state: classicSnapshot(classic),
devtools: !!classic.devtools,
scope: classic.scope,
...(isPaused(classic.devtools) ? { paused: true } : {}),
diff --git a/packages/devtools/src/ngrx-shared.ts b/packages/devtools/src/ngrx-shared.ts
index 0eb60ec4..ec0168ae 100644
--- a/packages/devtools/src/ngrx-shared.ts
+++ b/packages/devtools/src/ngrx-shared.ts
@@ -103,6 +103,29 @@ export interface NgrxLogEntry {
*/
causedByEvent?: { type: string; payload?: unknown };
unrestorable?: NgrxUnrestorable;
+ /**
+ * How many more changes the state went through than `diff` holds (it keeps at most
+ * 50). Counted up to {@link NGRX_DIFF_MORE_CAP}, so at the cap it is a lower bound.
+ * Absent when `diff` is complete.
+ */
+ diffTruncated?: number;
+}
+
+/** The most changes counted past a full `diff`; `diffTruncated` stops there. */
+export const NGRX_DIFF_MORE_CAP = 1000;
+
+/** "12 more changes not shown", or "1000+ more…" at the cap. */
+export function moreChangesText(count: number): string {
+ const n = count >= NGRX_DIFF_MORE_CAP ? `${NGRX_DIFF_MORE_CAP}+` : String(count);
+ return `${n} more ${count === 1 ? 'change' : 'changes'} not shown`;
+}
+
+/**
+ * Counts the changes `diff` and `referenceDiff` find past their `limit`, up to
+ * {@link NGRX_DIFF_MORE_CAP}, without building or serializing them.
+ */
+export interface DiffOverflow {
+ more: number;
}
export interface NgrxUnrestorableUpdate {
@@ -297,10 +320,20 @@ function isPlain(value: unknown): value is Record {
return !!value && typeof value === 'object' && !Array.isArray(value);
}
+/** Deep equality of serialized (JSON-like) values, without building strings. */
function same(a: unknown, b: unknown): boolean {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || !a || !b) return false;
- return JSON.stringify(a) === JSON.stringify(b);
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
+ if (Array.isArray(a)) {
+ const y = b as unknown[];
+ return a.length === y.length && a.every((item, i) => same(item, y[i]));
+ }
+ const x = a as Record;
+ const y = b as Record;
+ const keys = Object.keys(x);
+ if (keys.length !== Object.keys(y).length) return false;
+ return keys.every((key) => Object.hasOwn(y, key) && same(x[key], y[key]));
}
function join(path: string, key: string | number): string {
@@ -310,34 +343,45 @@ function join(path: string, key: string | number): string {
return safe.startsWith('"') ? `${path}[${safe}]` : `${path}.${safe}`;
}
-export function diff(before: unknown, after: unknown, limit = 50, maxDepth = 6): NgrxDiffEntry[] {
+export function diff(
+ before: unknown,
+ after: unknown,
+ limit = 50,
+ maxDepth = 6,
+ overflow?: DiffOverflow,
+): NgrxDiffEntry[] {
const out: NgrxDiffEntry[] = [];
+ const full = () => out.length >= limit && (!overflow || overflow.more >= NGRX_DIFF_MORE_CAP);
+ const emit = (entry: NgrxDiffEntry) => {
+ if (out.length < limit) out.push(entry);
+ else if (overflow) overflow.more++;
+ };
const walk = (a: unknown, b: unknown, path: string, depth: number) => {
- if (out.length >= limit || same(a, b)) return;
+ if (full() || same(a, b)) return;
const bothArrays = Array.isArray(a) && Array.isArray(b);
const bothObjects = isPlain(a) && isPlain(b) && !(TYPE_KEY in a) && !(TYPE_KEY in b);
if (depth >= maxDepth || (!bothArrays && !bothObjects)) {
- out.push({ path: path || '(root)', op: 'change', before: a, after: b });
+ emit({ path: path || '(root)', op: 'change', before: a, after: b });
return;
}
if (bothArrays) {
const x = a as unknown[];
const y = b as unknown[];
for (let i = 0; i < Math.max(x.length, y.length); i++) {
- if (i >= x.length) out.push({ path: join(path, i), op: 'add', after: y[i] });
- else if (i >= y.length) out.push({ path: join(path, i), op: 'remove', before: x[i] });
+ if (i >= x.length) emit({ path: join(path, i), op: 'add', after: y[i] });
+ else if (i >= y.length) emit({ path: join(path, i), op: 'remove', before: x[i] });
else walk(x[i], y[i], join(path, i), depth + 1);
- if (out.length >= limit) return;
+ if (full()) return;
}
return;
}
const x = a as Record;
const y = b as Record;
for (const key of new Set([...Object.keys(x), ...Object.keys(y)])) {
- if (!(key in y)) out.push({ path: join(path, key), op: 'remove', before: x[key] });
- else if (!(key in x)) out.push({ path: join(path, key), op: 'add', after: y[key] });
+ if (!(key in y)) emit({ path: join(path, key), op: 'remove', before: x[key] });
+ else if (!(key in x)) emit({ path: join(path, key), op: 'add', after: y[key] });
else walk(x[key], y[key], join(path, key), depth + 1);
- if (out.length >= limit) return;
+ if (full()) return;
}
};
walk(before, after, '', 0);
@@ -365,53 +409,65 @@ export function referenceDiff(
options: SerializeOptions,
limit = 50,
maxDepth = 12,
+ overflow?: DiffOverflow,
): NgrxDiffEntry[] {
const out: NgrxDiffEntry[] = [];
+ let found = 0;
const show = (value: unknown) => serialize(value, options);
+ const full = () => out.length >= limit && (!overflow || overflow.more >= NGRX_DIFF_MORE_CAP);
+ // Builds (and serializes) an entry only when it is kept; past `limit` it is only counted.
+ const emit = (entry: () => NgrxDiffEntry) => {
+ found++;
+ if (out.length < limit) out.push(entry());
+ else if (overflow) overflow.more++;
+ };
const walk = (a: unknown, b: unknown, at: string, depth: number) => {
- if (out.length >= limit || Object.is(a, b)) return;
+ if (full() || Object.is(a, b)) return;
const arrays = Array.isArray(a) && Array.isArray(b);
const records = isRecord(a) && isRecord(b);
if (depth >= maxDepth || (!arrays && !records)) {
- out.push({ path: at, op: 'change', before: show(a), after: show(b) });
+ emit(() => ({ path: at, op: 'change', before: show(a), after: show(b) }));
return;
}
- const start = out.length;
+ const start = found;
if (arrays) {
const x = a as unknown[];
const y = b as unknown[];
- for (let i = 0; i < Math.max(x.length, y.length) && out.length < limit; i++) {
- if (i >= x.length) out.push({ path: join(at, i), op: 'add', after: show(field(y, i)) });
- else if (i >= y.length) {
- out.push({ path: join(at, i), op: 'remove', before: show(field(x, i)) });
+ for (let i = 0; i < Math.max(x.length, y.length) && !full(); i++) {
+ if (i >= x.length) {
+ emit(() => ({ path: join(at, i), op: 'add', after: show(field(y, i)) }));
+ } else if (i >= y.length) {
+ emit(() => ({ path: join(at, i), op: 'remove', before: show(field(x, i)) }));
} else walk(field(x, i), field(y, i), join(at, i), depth + 1);
}
} else {
const x = a as Record;
const y = b as Record;
for (const key of new Set([...Object.keys(x), ...Object.keys(y)])) {
- if (out.length >= limit) break;
+ if (full()) break;
const secret = isRedactedKey(key);
if (!(key in y)) {
- out.push({
+ emit(() => ({
path: join(at, key),
op: 'remove',
before: secret ? REDACTED : show(field(x, key)),
- });
+ }));
} else if (!(key in x)) {
- out.push({
+ emit(() => ({
path: join(at, key),
op: 'add',
after: secret ? REDACTED : show(field(y, key)),
- });
+ }));
} else if (secret) {
if (!Object.is(field(x, key), field(y, key))) {
- out.push({ path: join(at, key), op: 'change', before: REDACTED, after: REDACTED });
+ emit(() => ({ path: join(at, key), op: 'change', before: REDACTED, after: REDACTED }));
}
} else walk(field(x, key), field(y, key), join(at, key), depth + 1);
}
}
- if (out.length === start) out.push({ path: at, op: 'change', before: show(a), after: show(b) });
+ if (found === start) {
+ emit(() => ({ path: at, op: 'change', before: show(a), after: show(b) }));
+ }
};
walk(before, after, path, 0);
return out;
diff --git a/packages/devtools/src/overlay.ts b/packages/devtools/src/overlay.ts
index 3973cc3a..f871fe59 100644
--- a/packages/devtools/src/overlay.ts
+++ b/packages/devtools/src/overlay.ts
@@ -16,6 +16,7 @@ import {
findRouters,
redactMessage,
redactUrl,
+ resetNavigations,
setGeneration,
setNavigationLimit,
snapshotRouter,
@@ -416,7 +417,6 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void)
let configTruncated = 0;
let setup: RouterSetup | undefined;
let sentGeneration = -1;
- let routerMisses = 0;
const routerScan = createScanBackoff();
let lastRouterPayload = '';
let lastRouterPushAt = 0;
@@ -462,15 +462,17 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void)
}
function attachRouter(ng: RouterDebugApi) {
+ if (!routerScan.due()) return;
const roots = Array.from(document.querySelectorAll('[ng-version]'));
- if (!roots.length && !routerScan.due()) return;
const candidates = roots.length ? roots : findAngularElements().slice(0, 1);
const routers = findRouters(ng, candidates);
if (!routers.length) {
- if (candidates.some((root) => read(() => !!ng?.getComponent?.(root), false))) routerMisses++;
- else if (!roots.length) routerScan.miss();
+ // A root that is not bootstrapped yet is cheap to check again on the next push.
+ const bootstrapped = candidates.some((root) => read(() => !!ng?.getComponent?.(root), false));
+ if (bootstrapped || !roots.length) routerScan.miss();
return;
}
+ routerScan.reset();
router = routers[0];
routerCount = routers.length;
routerRoot = candidates[0] ?? null;
@@ -482,10 +484,39 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void)
routerCleanup.push(capturePreloads(preloaderOf(ng, routerRoot), preloads, scheduleRouterPush));
}
+ /** True when the watched router was destroyed or its root left the page (HMR, re-bootstrap). */
+ function routerGone(): boolean {
+ if (!router) return false;
+ if (read(() => router!['disposed'] === true, false)) return true;
+ return !!routerRoot && !routerRoot.isConnected;
+ }
+
+ function detachRouter() {
+ for (const cleanup of routerCleanup) cleanup();
+ routerCleanup = [];
+ stopInstrument?.();
+ stopInstrument = null;
+ router = null;
+ routerCount = 0;
+ routerRoot = null;
+ // A new router counts navigation ids from 1 again, so old records would take its events.
+ resetNavigations(navigations);
+ preloads.length = 0;
+ config = undefined;
+ configTruncated = 0;
+ setup = undefined;
+ sentGeneration = -1;
+ lastRouterPayload = '';
+ routerDomDirty = true;
+ outlets = [];
+ links = [];
+ }
+
async function pushRouter() {
try {
const ng = getNg() as RouterDebugApi | undefined;
- if (!router && routerMisses < 3 && ng) attachRouter(ng);
+ if (routerGone()) detachRouter();
+ if (!router && ng) attachRouter(ng);
const snapshot = router ? snapshotRouter(router) : null;
const report: Record = { pageId, snapshot, navigations };
const dropped = droppedNavigations(navigations);
diff --git a/packages/devtools/src/router-actions.ts b/packages/devtools/src/router-actions.ts
index 2049a1ab..be4effeb 100644
--- a/packages/devtools/src/router-actions.ts
+++ b/packages/devtools/src/router-actions.ts
@@ -1,5 +1,6 @@
import { isRouterLink } from './router-links.ts';
import {
+ CANCEL_CODES,
EventType,
MAX_DEPTH,
clip,
@@ -21,6 +22,7 @@ import {
type AnyRecord,
type NavigationRecord,
type RouterDebugApi,
+ WRAPPED,
} from './router.ts';
export interface PreloadRecord {
@@ -88,6 +90,7 @@ export function routerLinkOf(target: Element | null, ng?: RouterDebugApi): Eleme
const INSTRUMENT_KEY = 'pangular-router-instrument';
+/** Whether instrumentation is on for this tab: on unless it was turned off. */
export function storedInstrumented(): boolean {
try {
return sessionStorage.getItem(INSTRUMENT_KEY) !== '0';
@@ -371,8 +374,6 @@ function track(result: unknown, record: Recorder): unknown {
return result;
}
-const WRAPPED = '__pangularOriginal';
-
interface Wrapping {
restore: (() => void)[];
}
@@ -539,7 +540,8 @@ function instrumentRoutes(
}
/**
- * Opt-in: wraps every guard and resolver in the live config so each run is
+ * On by default (see `storedInstrumented`); turned off per tab with the
+ * "instrument" action. Wraps every guard and resolver in the live config so each run is
* recorded with its verdict and time. Call again after the config changes to
* cover newly loaded routes. The returned function unwraps everything.
*/
@@ -663,6 +665,15 @@ function findConfig(router: AnyRecord, id: string): AnyRecord | null {
return found;
}
+const REDIRECT_CANCEL_CODE = CANCEL_CODES.indexOf('Redirect');
+/** The events that end a probed navigation. */
+const PROBE_END_EVENTS: number[] = [
+ EventType.NavigationEnd,
+ EventType.NavigationCancel,
+ EventType.NavigationError,
+ EventType.NavigationSkipped,
+];
+
function probe(router: AnyRecord, navigations: NavigationRecord[], url: string): Promise {
const transitions = read(() => router['navigationTransitions'] as AnyRecord, null);
const events = read(() => transitions?.['events'] as AnyRecord, null);
@@ -700,15 +711,20 @@ function probe(router: AnyRecord, navigations: NavigationRecord[], url: string):
abortCurrent();
}
if (id !== targetId) return;
- if (event['type'] === 4 && redirectedTo === undefined) {
+ if (event['type'] === EventType.RoutesRecognized && redirectedTo === undefined) {
matched = read(() => serializeRoute(event['state']['root']), null);
abortCurrent();
}
- if (event['type'] === 2 && event['code'] === 0 && redirectedTo === undefined && !matched) {
+ if (
+ event['type'] === EventType.NavigationCancel &&
+ event['code'] === REDIRECT_CANCEL_CODE &&
+ redirectedTo === undefined &&
+ !matched
+ ) {
redirecting = true;
return;
}
- if ([1, 2, 3, 16].includes(event['type'])) {
+ if (PROBE_END_EVENTS.includes(event['type'])) {
const record = markProbe(targetId);
finish(
redirectedTo !== undefined
@@ -743,14 +759,21 @@ function probe(router: AnyRecord, navigations: NavigationRecord[], url: string):
targetId = current < 0 ? current : current + 1;
setCaller('probe from DevTools', true);
// 'reload' so probing the current URL is matched instead of skipped as the same URL.
- const promise = read(
- () =>
- router['navigateByUrl'](url, {
- skipLocationChange: true,
- onSameUrlNavigation: 'reload',
- }) as Promise,
- null,
- );
+ let promise: Promise | null = null;
+ try {
+ promise = router['navigateByUrl'](url, {
+ skipLocationChange: true,
+ onSameUrlNavigation: 'reload',
+ }) as Promise;
+ } catch (error) {
+ markProbe(targetId);
+ finish({
+ error: `navigateByUrl threw before the probe started: ${redactMessage(
+ read(() => String((error as Error)?.message ?? error), 'unknown error'),
+ )}`,
+ });
+ return;
+ }
promise?.catch?.(() => {});
});
}
diff --git a/packages/devtools/src/router-attach.ts b/packages/devtools/src/router-attach.ts
index b870215f..f9402f5c 100644
--- a/packages/devtools/src/router-attach.ts
+++ b/packages/devtools/src/router-attach.ts
@@ -14,6 +14,11 @@ export function createScanBackoff(maxSkip = 32) {
wait--;
return false;
},
+ /** The scan found a router: scan right away the next time one is needed. */
+ reset(): void {
+ skip = 0;
+ wait = 0;
+ },
/** The scan found nothing: wait longer before the next one. */
miss(): void {
skip = Math.min(maxSkip, skip ? skip * 2 : 1);
diff --git a/packages/devtools/src/router-config.ts b/packages/devtools/src/router-config.ts
index da085233..dd5369ff 100644
--- a/packages/devtools/src/router-config.ts
+++ b/packages/devtools/src/router-config.ts
@@ -7,6 +7,7 @@ import {
nameOf,
read,
resolversOf,
+ WRAPPED,
type AnyRecord,
type RouteGuards,
} from './router.ts';
@@ -208,19 +209,70 @@ export function activeIds(router: AnyRecord): string[] {
return out;
}
+const SIGNATURE_GUARDS = [
+ 'canActivate',
+ 'canActivateChild',
+ 'canDeactivate',
+ 'canMatch',
+ 'canLoad',
+];
+
+const guardIds = new WeakMap();
+let nextGuardId = 0;
+
+/**
+ * A stable id per guard function, class or token, so swapping one guard for
+ * another at the same index changes the signature. Instrumentation wraps
+ * guards in place, so the id is taken from the app's own function.
+ */
+function guardId(entry: unknown): string {
+ if ((typeof entry !== 'function' && typeof entry !== 'object') || entry === null) {
+ return typeof entry;
+ }
+ const own = ((entry as AnyRecord)[WRAPPED] as object | undefined) ?? entry;
+ let id = guardIds.get(own);
+ if (id === undefined) guardIds.set(own, (id = ++nextGuardId));
+ return String(id);
+}
+
+/** What an in-place edit of a route changes: its path, redirect and guards. */
+function routeShape(route: AnyRecord): string {
+ return read(() => {
+ const redirect = route['redirectTo'];
+ const guards = SIGNATURE_GUARDS.map((kind) => {
+ const list = route[kind];
+ return Array.isArray(list) ? list.map(guardId).join('+') : '-';
+ });
+ return `${String(route['path'] ?? '')}|${typeof redirect === 'string' ? redirect : typeof redirect}|${guards.join(',')}`;
+ }, '');
+}
+
+/** A short FNV-1a hash, so the signature stays small however big the config is. */
+function hashInto(hash: number, text: string): number {
+ let next = hash;
+ for (let i = 0; i < text.length; i++) {
+ next ^= text.charCodeAt(i);
+ next = Math.imul(next, 0x01000193);
+ }
+ return next >>> 0;
+}
+
/**
- * Counts config changes: a new config array (resetConfig, HMR) or a lazy
- * route whose children or component finished loading.
+ * Counts config changes: a new config array (resetConfig, HMR), a lazy route
+ * whose children or component finished loading, or a route whose path,
+ * redirect or guards were edited in place.
*/
export function configSignature(router: AnyRecord): string {
const config = read(() => router['config'] as AnyRecord[], []);
let loaded = 0;
let total = 0;
+ let shape = 0x811c9dc5;
const visit = (routes: AnyRecord[], depth: number) => {
if (!Array.isArray(routes) || depth > MAX_DEPTH || total > MAX_NODES) return;
for (const route of routes) {
total++;
if (read(() => !!route['_loadedRoutes'] || !!route['_loadedComponent'], false)) loaded++;
+ shape = hashInto(shape, `${depth}:${routeShape(route)};`);
visit(
read(() => route['children'] as AnyRecord[], []),
depth + 1,
@@ -232,7 +284,7 @@ export function configSignature(router: AnyRecord): string {
}
};
visit(config, 0);
- return `${total}:${loaded}`;
+ return `${total}:${loaded}:${shape.toString(36)}`;
}
export class ConfigTracker {
diff --git a/packages/devtools/src/router-links.ts b/packages/devtools/src/router-links.ts
index 71461cb8..3b18cfc2 100644
--- a/packages/devtools/src/router-links.ts
+++ b/packages/devtools/src/router-links.ts
@@ -161,7 +161,11 @@ function isLinkActive(value: unknown): value is AnyRecord {
*/
export function linksOf(ng: RouterDebugApi, router: AnyRecord): LinkInfo[] {
if (typeof document === 'undefined' || !ng.getDirectives) return [];
- const elements = Array.from(document.querySelectorAll('a, button, [routerlink], [routerLink]'));
+ const elements = Array.from(
+ document.querySelectorAll(
+ 'a, button, [routerlink], [routerLink], [routerlinkactive], [routerLinkActive]',
+ ),
+ );
const out: LinkInfo[] = [];
for (const element of elements) {
if (out.length >= MAX_LINKS) break;
diff --git a/packages/devtools/src/router.ts b/packages/devtools/src/router.ts
index 9b0416cd..1ef33511 100644
--- a/packages/devtools/src/router.ts
+++ b/packages/devtools/src/router.ts
@@ -97,6 +97,9 @@ export interface RouterDebugApi {
export type AnyRecord = Record;
export const MAX_DEPTH = 12;
+
+/** Key on a wrapped guard or resolver that holds the app's own function. */
+export const WRAPPED = '__pangularOriginal';
const MAX_REASON = 300;
const MAX_URL = 2000;
const URL_SECRET_KEY =
@@ -108,7 +111,8 @@ const GUARD_KINDS = [
'canMatch',
'canLoad',
] as const;
-const CANCEL_CODES = [
+/** Angular's `NavigationCancellationCode` names, by code. */
+export const CANCEL_CODES = [
'Redirect',
'SupersededByNewNavigation',
'NoDataFromResolver',
@@ -677,6 +681,21 @@ function extrasOf(extras: AnyRecord | null | undefined, restored: unknown): stri
return out.length ? out : undefined;
}
+/**
+ * A skipped navigation has no NavigationStart to carry its trigger. Read it
+ * from the router's current navigation when that is the same one, else say
+ * it is unknown rather than guess it was started by code.
+ */
+function skippedTriggerOf(router: AnyRecord | undefined, id: number): string {
+ return read(() => {
+ const transitions = router?.['navigationTransitions'];
+ const current = transitions?.['currentNavigation'];
+ const navigation = (typeof current === 'function' ? current() : current) as AnyRecord | null;
+ if (navigation?.['id'] !== id || typeof navigation['trigger'] !== 'string') return 'unknown';
+ return navigation['trigger'] as string;
+ }, 'unknown');
+}
+
function findPending(navigations: NavigationRecord[]): NavigationRecord | undefined {
for (let i = navigations.length - 1; i >= 0; i--) {
if (navigations[i].outcome === 'pending') return navigations[i];
@@ -841,6 +860,16 @@ export function clearNavigations(navigations: NavigationRecord[]) {
droppedNavigationCounts.delete(navigations);
}
+/**
+ * Empties the list, pending navigations included, and forgets the dropped count.
+ * Used when the overlay lets go of a router: a new router counts its navigation
+ * ids from 1 again, so old records would take its events.
+ */
+export function resetNavigations(navigations: NavigationRecord[]) {
+ navigations.length = 0;
+ droppedNavigationCounts.delete(navigations);
+}
+
/** How many navigations `trimNavigations` removed from this list. */
export function droppedNavigations(navigations: NavigationRecord[]): number {
return droppedNavigationCounts.get(navigations) ?? 0;
@@ -848,13 +877,15 @@ export function droppedNavigations(navigations: NavigationRecord[]): number {
/**
* Folds one router event into the navigation it belongs to. Returns true when
- * something changed.
+ * something changed. `onLateChange` runs when a field is filled in after the
+ * event, such as the page title the app sets once the navigation ended.
*/
export function applyRouterEvent(
navigations: NavigationRecord[],
event: AnyRecord,
at: number,
router?: AnyRecord,
+ onLateChange?: () => void,
): boolean {
const type = read(() => event['type'] as number | undefined, undefined);
const id = read(() => event['id'] as number, -1);
@@ -966,12 +997,13 @@ export function applyRouterEvent(
const nav: NavigationRecord = {
id,
url: redactUrl(String(event['url'])),
- trigger: 'imperative',
+ trigger: skippedTriggerOf(router, id),
startedAt: at,
outcome: 'pending',
generation: configGeneration,
};
- if (pendingCaller && at - pendingCaller.at < 2000) nav.caller = pendingCaller.text;
+ if (pendingCaller && at - pendingCaller.at < 2000 && nav.trigger === 'imperative')
+ nav.caller = pendingCaller.text;
pendingCaller = null;
navigations.push(nav);
}
@@ -1040,8 +1072,11 @@ export function applyRouterEvent(
const reused = reusedOf(router);
if (reused.length) nav.reused = reused;
Promise.resolve().then(() => {
- if (typeof document !== 'undefined')
- nav.title = redactMessage(document.title, state.secrets);
+ if (typeof document === 'undefined') return;
+ const title = redactMessage(document.title, state.secrets);
+ if (title === nav.title) return;
+ nav.title = title;
+ onLateChange?.();
});
}
finish(nav, at, router);
@@ -1188,7 +1223,7 @@ export function watchRouter(
const subscription = read(
() =>
events['subscribe']((event: AnyRecord) => {
- if (!applyRouterEvent(navigations, event, Date.now(), router)) return;
+ if (!applyRouterEvent(navigations, event, Date.now(), router, onChange)) return;
trimNavigations(navigations, max);
onChange();
}) as { unsubscribe(): void },
diff --git a/packages/devtools/src/rpc/__tests__/ngrx-live-tools.test.ts b/packages/devtools/src/rpc/__tests__/ngrx-live-tools.test.ts
index 4e77ca9b..a2df6b8a 100644
--- a/packages/devtools/src/rpc/__tests__/ngrx-live-tools.test.ts
+++ b/packages/devtools/src/rpc/__tests__/ngrx-live-tools.test.ts
@@ -290,6 +290,34 @@ describe('signal-store-history', () => {
const text = signalStoreHistoryText(pages, undefined, undefined, 0);
expect(text).toMatch(/pass `page`/i);
});
+
+ it('says how many changes a long diff left out', () => {
+ const pages = pagesWith(
+ [store()],
+ [logEntry({ seq: 1, diffTruncated: 12 }), logEntry({ seq: 2, diffTruncated: 1000 })],
+ );
+ const text = signalStoreHistoryText(pages);
+ expect(text).toContain('count change 0 → 1; 12 more changes not shown');
+ expect(text).toContain('1000+ more changes not shown');
+ });
+
+ it('drops malformed log entries and stores from a report instead of failing', () => {
+ const pages: NgrxPages = new Map();
+ const report = {
+ pageId: 'p1',
+ session: 's1',
+ url: '/app',
+ title: 'My App',
+ stores: [store(), null, { id: 'ngrx-2' }],
+ classic: { state: 'not a classic store' },
+ log: [null, 'entry', { seq: 2 }, logEntry({ seq: 3 })],
+ } as unknown as NgrxPageReport;
+ expect(mergeNgrxReport(pages, report, [])).toBe(3);
+ const page = pages.get('p1')!;
+ expect(page.stores.map((s) => s.id)).toEqual(['ngrx-1']);
+ expect(page.log.map((e) => e.seq)).toEqual([3]);
+ expect(page.classic).toBeNull();
+ });
});
describe('withUntrustedPreamble', () => {
diff --git a/packages/devtools/src/rpc/analog-register.ts b/packages/devtools/src/rpc/analog-register.ts
index 1e752999..71e6f2fe 100644
--- a/packages/devtools/src/rpc/analog-register.ts
+++ b/packages/devtools/src/rpc/analog-register.ts
@@ -49,6 +49,12 @@ const MAX_BODY = 2000;
let disposeAnalog: (() => void) | undefined;
let analogOwner: unknown;
let findServerFn: ((id: string) => AnalogServerFn | undefined) | undefined;
+let reportingPages: (() => { pageId: string; reportedAt: number }[]) | undefined;
+
+/** The pages that sent an Analog report, for `list-pages`. */
+export function analogPages(): { pageId: string; reportedAt: number }[] {
+ return reportingPages?.() ?? [];
+}
/** Adds the name and file of each Analog server function seeded into a TransferState payload. */
export function nameServerFns(payload: PayloadSummary): PayloadSummary {
@@ -192,7 +198,10 @@ export async function registerAnalog(
clearInterval(expiry);
stopCalls();
findServerFn = undefined;
+ reportingPages = undefined;
};
+ reportingPages = () =>
+ current().pages.map((p) => ({ pageId: p.pageId, reportedAt: seenAt.get(p.pageId) ?? 0 }));
let cache: { at: number; project: AnalogProject } | null = null;
const project = () => {
@@ -246,7 +255,8 @@ export async function registerAnalog(
name: 'analog-lint',
type: 'query',
jsonSerializable: true,
- handler: () => analogLint(project(), current()),
+ handler: (page: unknown) =>
+ analogLint(project(), current(), typeof page === 'string' ? page : undefined),
});
my.rpc.register({
name: 'analog-render',
@@ -395,9 +405,10 @@ export async function registerAnalog(
ctx.agent.registerTool({
id: 'pangular:analog-lint',
description:
- 'Analog checks: two files for one URL, sibling [param] files, missing default export, layout without router-outlet, .server.ts without load, action or server functions, or without a page, redirect mistakes, bad API method suffix, duplicate API routes, routes outside the API prefix, prerender entries that match nothing, frontmatter errors, duplicate slugs, plus live problems (load fetched twice, seeded server function read called again, hydration errors, restart needed, API 404/405).',
+ 'Analog checks: two files for one URL, sibling [param] files, missing default export, layout without router-outlet, .server.ts without load, action or server functions, or without a page, redirect mistakes, bad API method suffix, duplicate API routes, routes outside the API prefix, prerender entries that match nothing, frontmatter errors, duplicate slugs, plus live problems (load fetched twice, seeded server function read called again, hydration errors, restart needed, API 404/405). Hydration errors and restart hints come from one page: `page`, or the most recent one.',
safety: 'read',
- inputSchema: { type: 'object', properties: {} },
- handler: async () => text(analogLintText(project(), current())),
+ inputSchema: { type: 'object', properties: { page } },
+ handler: async (args: { page?: string }) =>
+ text(analogLintText(project(), current(), args?.page)),
});
}
diff --git a/packages/devtools/src/rpc/analog-scan.ts b/packages/devtools/src/rpc/analog-scan.ts
index 7ee98b2d..fac2c5ad 100644
--- a/packages/devtools/src/rpc/analog-scan.ts
+++ b/packages/devtools/src/rpc/analog-scan.ts
@@ -86,6 +86,8 @@ export interface AnalogLintFinding {
severity: 'error' | 'warning' | 'info';
file?: string;
path?: string;
+ /** Another file the finding is about, such as the page a content file takes over. */
+ relatedFile?: string;
message: string;
fix: string;
}
@@ -409,7 +411,7 @@ export function serverFnsOf(file: string, source: string): AnalogServerFn[] {
if (!locals.size) locals.add('serverFn');
const out: AnalogServerFn[] = [];
for (const match of masked.matchAll(
- /\bexport\s+(?:const|let|var)\s+(\w+)\s*(?::[^=]+)?=\s*(\w+)\s*\(/g,
+ /\bexport\s+(?:const|let|var)\s+(\w+)\s*(?::[^=]+)?=\s*(\w+)\s*(?:<[^;=()]*?>\s*)?\(/g,
)) {
if (!locals.has(match[2])) continue;
out.push({
@@ -479,6 +481,16 @@ function blockEnd(source: string, open: number): number {
return source.length;
}
+/** Index of the parenthesis that closes the one at `open`, in a string-masked source. */
+function callEnd(masked: string, open: number): number {
+ let depth = 0;
+ for (let i = open; i < masked.length; i++) {
+ if (masked[i] === '(') depth++;
+ else if (masked[i] === ')' && --depth === 0) return i;
+ }
+ return masked.length;
+}
+
function ruleTiming(body: string, key: string): string | undefined {
const match = body.match(new RegExp(`\\b${key}\\s*:\\s*(true|false|\\d+|\\{)`));
if (!match || match[1] === 'false') return undefined;
@@ -549,6 +561,25 @@ function stripBlocks(source: string, keys: string[]): string {
return out;
}
+/**
+ * The `key: {` of the analog() options object itself, skipping the same key
+ * nested deeper, such as `nitro: { prerender: { ... } }`. `masked` is the
+ * analog(...) call with its strings blanked, so braces in strings don't count.
+ */
+function topLevelBlock(masked: string, key: string): RegExpExecArray | null {
+ const pattern = new RegExp(`\\b${key}\\s*:\\s*\\{`, 'g');
+ let depth = 0;
+ let at = 0;
+ for (let match = pattern.exec(masked); match; match = pattern.exec(masked)) {
+ for (; at < match.index; at++) {
+ if (masked[at] === '{') depth++;
+ else if (masked[at] === '}') depth--;
+ }
+ if (depth === 1) return match;
+ }
+ return null;
+}
+
export function analogConfig(root: string): AnalogConfig {
const file = configFile(root);
const config: AnalogConfig = { apiPrefix: 'api', noSsrRoutes: [], routeRules: [] };
@@ -557,7 +588,7 @@ export function analogConfig(root: string): AnalogConfig {
const source = stripComments(read(join(root, file)));
const start = source.search(/\banalog\s*\(/);
if (start < 0) return config;
- const options = source.slice(start, start + 4000);
+ const options = source.slice(start, callEnd(maskStrings(source), source.indexOf('(', start)) + 1);
const topLevel = stripBlocks(options.slice(options.indexOf('(') + 1), [
'nitro',
'routeRules',
@@ -575,9 +606,16 @@ export function analogConfig(root: string): AnalogConfig {
if (isStatic !== undefined) config.static = isStatic;
const prefix = options.match(/\bapiPrefix\s*:\s*['"`]([^'"`]*)['"`]/);
if (prefix) config.apiPrefix = prefix[1];
- const prerender = options.match(
- /\bprerender\s*:\s*\{[\s\S]*?\broutes\s*:\s*(\[[\s\S]*?\]|async|\(|function)/,
- );
+ const masked = maskStrings(options);
+ const prerenderBlock = topLevelBlock(masked, 'prerender');
+ const prerender = prerenderBlock
+ ? options
+ .slice(
+ prerenderBlock.index,
+ blockEnd(masked, prerenderBlock.index + prerenderBlock[0].length - 1) + 1,
+ )
+ .match(/\broutes\s*:\s*(\[[\s\S]*?\]|async|\(|function)/)
+ : null;
if (prerender) {
if (prerender[1].startsWith('[')) {
config.prerender = Array.from(prerender[1].matchAll(/['"`](\/[^'"`]*)['"`]/g), (m) => m[1]);
@@ -1031,6 +1069,7 @@ export function lintAnalog(project: AnalogProject): AnalogLintFinding[] {
severity: 'warning',
file: route.file,
path: route.fullPath,
+ relatedFile: page.file,
message: `Files under src/content are routes too, so ${route.file} serves ${route.fullPath} and ${page.file} never renders for it.`,
fix: 'Move content outside the routed content folder (for example src/content-data with contentDir), or drop the [param] page.',
});
diff --git a/packages/devtools/src/rpc/analog-tools.ts b/packages/devtools/src/rpc/analog-tools.ts
index dfcd7c75..a38540bb 100644
--- a/packages/devtools/src/rpc/analog-tools.ts
+++ b/packages/devtools/src/rpc/analog-tools.ts
@@ -145,10 +145,21 @@ export function loadEndpointUrl(
): string {
let path = `/${apiPrefix}/_analog${analogEndpoint(file)}`.replace(/\/{2,}/g, '/');
for (const [name, value] of Object.entries(params)) {
- if (name !== '**') path = path.replace(`[${name}]`, value);
+ if (name !== '**') path = path.replace(`[${name}]`, encodeURIComponent(value));
+ }
+ if (!path.includes('**')) return path;
+ const catchAll = file.match(/\[\[?\.{3}([^\]]+)\]\]?/)?.[1];
+ const rest = params['**'] ?? (catchAll ? params[catchAll] : undefined) ?? '';
+ return path.replace('**', rest.split('/').map(encodeSegment).join('/'));
+}
+
+/** Catch-all values hold the URL's own segments, so decode before encoding. */
+function encodeSegment(part: string): string {
+ try {
+ return encodeURIComponent(decodeURIComponent(part));
+ } catch {
+ return encodeURIComponent(part);
}
- const rest = params['**'] ?? Object.values(params).at(-1) ?? '';
- return path.replace('**', rest);
}
function kindLabel(route: AnalogRoute): string {
@@ -638,7 +649,15 @@ function hasHandler(project: AnalogProject, call: AnalogCall): boolean {
});
}
-export function analogLint(project: AnalogProject, state: AnalogState): AnalogLintFinding[] {
+/**
+ * Static findings, live call findings and the findings of one page: `page`,
+ * or the most recent page when it is left out.
+ */
+export function analogLint(
+ project: AnalogProject,
+ state: AnalogState,
+ page?: string,
+): AnalogLintFinding[] {
if (!project.analog) return [];
const findings = lintAnalog(project);
const dupes = new Map(duplicateLoads(state.calls).map((d) => [d.route, d]));
@@ -662,7 +681,7 @@ export function analogLint(project: AnalogProject, state: AnalogState): AnalogLi
fix: 'The browser read did not use the TransferState seed. Read it with injectServerFn and the same input on both sides, and check provideClientHydration().',
});
}
- const report = state.pages[0];
+ const report = pickPage(state, page);
if (report) {
for (const path of restartNeeded(project, report)) {
findings.push({
@@ -701,16 +720,31 @@ export function analogLint(project: AnalogProject, state: AnalogState): AnalogLi
return findings;
}
-export function analogLintText(project: AnalogProject, state: AnalogState): string {
+export function analogLintText(project: AnalogProject, state: AnalogState, page?: string): string {
if (!project.analog) return NOT_ANALOG;
- const findings = analogLint(project, state);
- if (!findings.length) return 'No Analog problems found.';
+ const findings = analogLint(project, state, page);
+ const missing = page && !state.pages.some((p) => p.pageId === page) ? page : undefined;
+ if (!findings.length && !missing) return 'No Analog problems found.';
const order = { error: 0, warning: 1, info: 2 };
- return `${UNTRUSTED}\n\n${findings
+ const lines = findings
.sort((a, b) => order[a.severity] - order[b.severity])
.map(
(f) =>
`- **${f.severity}** ${f.rule}${f.file ? ` in ${code(f.file)}` : ''}${f.path ? ` at ${code(f.path)}` : ''}: ${f.message} Fix: ${f.fix}`,
- )
- .join('\n')}`;
+ );
+ if (missing) {
+ lines.unshift(unknownLintPage(missing, state.pages), '');
+ if (!findings.length) lines.push('No problems found in the files or API calls.');
+ }
+ return `${UNTRUSTED}\n\n${lines.join('\n')}`;
+}
+
+/** Says that `page` sends no Analog report, so its hydration errors and restart checks are left out. */
+function unknownLintPage(page: string, pages: readonly AnalogRuntimeReport[]): string {
+ const known = pages.map((p) => `${code(p.pageId)} (${code(p.url)})`).join(', ');
+ return `No page ${code(page)} is reporting Analog data, so its hydration errors and restart checks are left out. ${
+ known
+ ? `Pages that report Analog data: ${known}. Pass one of these ids as \`page\`, or leave \`page\` out for the most recent.`
+ : 'No page reports Analog data right now.'
+ }`;
}
diff --git a/packages/devtools/src/rpc/ngrx-live-tools.ts b/packages/devtools/src/rpc/ngrx-live-tools.ts
index 32aca033..bd2315db 100644
--- a/packages/devtools/src/rpc/ngrx-live-tools.ts
+++ b/packages/devtools/src/rpc/ngrx-live-tools.ts
@@ -1,5 +1,5 @@
import type { NgrxPageRecord, NgrxPages } from './ngrx-tools.ts';
-import type { NgrxLogEntry, NgrxSignalStoreInfo } from '../ngrx-shared.ts';
+import { moreChangesText, type NgrxLogEntry, type NgrxSignalStoreInfo } from '../ngrx-shared.ts';
import { unknownPageText } from './pages.ts';
/**
@@ -170,7 +170,7 @@ function entryLine(entry: NgrxLogEntry, showPage?: string): string {
(d) =>
`${d.path} ${d.op}${'before' in d ? ` ${JSON.stringify(d.before)}` : ''}${'before' in d && 'after' in d ? ' →' : ''}${'after' in d ? ` ${JSON.stringify(d.after)}` : ''}`,
)
- .join('; ')
+ .join('; ') + (entry.diffTruncated ? `; ${moreChangesText(entry.diffTruncated)}` : '')
: 'no state change';
const kind = entry.source === 'store' ? 'action' : 'call';
return `- #${entry.seq} ${when}${page}: ${kind} ${code(entry.type)}${duration} on ${code(entry.storeId)}${caused}${restorable}: ${diffText}`;
diff --git a/packages/devtools/src/rpc/ngrx-tools.ts b/packages/devtools/src/rpc/ngrx-tools.ts
index 836d149d..62110c9b 100644
--- a/packages/devtools/src/rpc/ngrx-tools.ts
+++ b/packages/devtools/src/rpc/ngrx-tools.ts
@@ -1,4 +1,6 @@
+import * as v from 'valibot';
import type {
+ NgrxClassicStoreInfo,
NgrxLogEntry,
NgrxPage,
NgrxPageReport,
@@ -40,6 +42,43 @@ export function isNgrxReport(value: unknown): value is NgrxPageReport {
);
}
+const StoreSchema = v.looseObject({
+ id: v.string(),
+ kind: v.picklist(['signal-store', 'signal-state']),
+ className: v.string(),
+ scope: v.string(),
+ stateKeys: v.array(v.string()),
+ state: v.record(v.string(), v.unknown()),
+ computed: v.record(v.string(), v.unknown()),
+ methods: v.array(v.looseObject({ name: v.string(), calls: v.number() })),
+ references: v.array(v.string()),
+ writable: v.boolean(),
+});
+
+const LogEntrySchema = v.looseObject({
+ seq: v.number(),
+ source: v.picklist(['signal-store', 'store', 'event']),
+ storeId: v.string(),
+ type: v.string(),
+ timestamp: v.number(),
+ diff: v.array(v.looseObject({ path: v.string(), op: v.picklist(['add', 'remove', 'change']) })),
+ restorable: v.boolean(),
+});
+
+const ClassicSchema = v.looseObject({
+ state: v.unknown(),
+ devtools: v.boolean(),
+ scope: v.string(),
+});
+
+/**
+ * The page writes the report, so its items are checked one by one: a malformed store
+ * or log entry is dropped instead of failing the merge or reaching the panel.
+ */
+function validItems(items: unknown[], schema: v.GenericSchema): T[] {
+ return items.filter((item): item is T => v.is(schema, item));
+}
+
/**
* Matches a live `signalStore`/`signalState` to its source declaration (by
* state-key overlap) and returns the fields we can derive from the match.
@@ -98,7 +137,9 @@ export function mergeNgrxReport(
// (forget-ngrx-page, expiry, restart), drop the partial log and answer 0 so
// the page resends everything it still holds.
const resync = !known && typeof report.since === 'number' && report.since > 0;
- const fresh = resync ? [] : report.log.filter((entry: NgrxLogEntry) => entry.seq > lastSeq);
+ const fresh = resync
+ ? []
+ : validItems(report.log, LogEntrySchema).filter((entry) => entry.seq > lastSeq);
const lost = new Map();
for (const update of Array.isArray(report.unrestorable) ? report.unrestorable : []) {
if (typeof update?.seq === 'number' && UNRESTORABLE.has(update.reason)) {
@@ -114,8 +155,11 @@ export function mergeNgrxReport(
session: report.session,
url: redactUrl(String(report.url ?? '').slice(0, 2000)),
title: redactMessage(String(report.title ?? '').slice(0, 2000)).slice(0, 200),
- stores: report.stores.map((store) => ({ ...store, ...nameStore(store, declarations) })),
- classic: report.classic ?? null,
+ stores: validItems(report.stores, StoreSchema).map((store) => ({
+ ...store,
+ ...nameStore(store, declarations),
+ })),
+ classic: v.is(ClassicSchema, report.classic) ? (report.classic as NgrxClassicStoreInfo) : null,
log,
dropped: Math.max(0, (log[0]?.seq ?? 1) - 1),
reportedAt: now,
diff --git a/packages/devtools/src/rpc/router-config-tools.ts b/packages/devtools/src/rpc/router-config-tools.ts
index 352c410d..c56024d3 100644
--- a/packages/devtools/src/rpc/router-config-tools.ts
+++ b/packages/devtools/src/rpc/router-config-tools.ts
@@ -367,6 +367,8 @@ export function lintRoutes(page: RouterPage): LintFinding[] {
primary.forEach((node, index) => {
const own = parts(node.path);
if (own.length !== 1 || !own[0].startsWith(':') || node.guards?.canMatch) return;
+ // Children don't stop it: when the URL ends at this route, Angular matches it with no
+ // child activated (recognize's NoLeftoversInUrl) and never backtracks to the literal.
for (const later of primary.slice(index + 1)) {
const laterParts = parts(later.path);
if (laterParts.length === 1 && !laterParts[0].startsWith(':') && laterParts[0] !== '**') {
@@ -387,9 +389,10 @@ export function lintRoutes(page: RouterPage): LintFinding[] {
rule: 'empty-redirect-prefix',
severity: 'error',
route: node.fullPath,
- message: "An empty-path redirect without pathMatch 'full' matches every URL.",
- fix: "Add pathMatch: 'full'.",
- angular: 'throws',
+ message:
+ "An empty-path redirect with pathMatch 'prefix' matches every URL, so every navigation is redirected.",
+ fix: "Use pathMatch: 'full'.",
+ angular: 'silent',
});
}
}
diff --git a/packages/devtools/src/rpc/router-tools.ts b/packages/devtools/src/rpc/router-tools.ts
index 4aee7e25..0299f473 100644
--- a/packages/devtools/src/rpc/router-tools.ts
+++ b/packages/devtools/src/rpc/router-tools.ts
@@ -785,6 +785,7 @@ export function explainNavigationText(
state: RouterState,
args: { page?: string; url?: string; limit?: number; perf?: boolean; id?: number },
now = Date.now(),
+ maxNavigations = MAX_NAVIGATIONS,
): string {
const page = pickPage(state, args.page);
if (!page) return noPage(args.page, state);
@@ -794,7 +795,7 @@ export function explainNavigationText(
);
}
const requested = Number.isFinite(args.limit) ? Math.floor(args.limit as number) : 5;
- const limit = Math.max(1, Math.min(requested, MAX_NAVIGATIONS));
+ const limit = Math.max(1, Math.min(requested, maxNavigations));
const needle = args.url?.toLowerCase();
const matching = page.navigations.filter(
(nav) =>
@@ -810,7 +811,7 @@ export function explainNavigationText(
}
const recent = matching.slice(-limit).reverse();
const loops = loopsOf(page).filter((loop) => recent.some((nav) => loop.ids.includes(nav.id)));
- const header = `Most recent ${recent.length} of ${matching.length} navigation(s), newest first. Guards lists the candidates: canDeactivate guards of the page being left (marked "leaving") and canActivate/canActivateChild guards of the target; without per-guard instrumentation the router reports one result for all of them. Turn instrumentation on (navigate tool, action "instrument") to see each guard's verdict.${page.instrumented ? ' Instrumentation is on.' : ''}`;
+ const header = `Most recent ${recent.length} of ${matching.length} navigation(s), newest first. Guards lists the candidates: canDeactivate guards of the page being left (marked "leaving") and canActivate/canActivateChild guards of the target; without per-guard instrumentation the router reports one result for all of them. ${page.instrumented ? 'Instrumentation is on, so each guard and resolver run is listed with its verdict.' : 'Instrumentation is off: turn it on (navigate tool, action "instrument") to see each guard\'s verdict.'}`;
return capped(
`${UNTRUSTED}\n\n${header}\n\n${loopsText(loops)}${recent.map((nav) => describeNavigation(nav, page)).join('\n')}${droppedNote(page.dropped, 'navigations', 'navigations')}${otherPages(state, page)}${freshness(page, now)}`,
);
diff --git a/src/app/examples/forms-example.ts b/src/app/examples/forms-example.ts
index a14e60bb..be6c182e 100644
--- a/src/app/examples/forms-example.ts
+++ b/src/app/examples/forms-example.ts
@@ -1,17 +1,25 @@
import { Component } from '@angular/core';
import { ExamplePage } from './example-page';
import { ReactiveFormExample } from './reactive-form-example';
+import { ShadowFormExample } from './shadow-form-example';
import { SignalFormExample } from './signal-form-example';
import { TemplateFormExample } from './template-form-example';
@Component({
selector: 'app-forms-example',
- imports: [ExamplePage, SignalFormExample, ReactiveFormExample, TemplateFormExample],
+ imports: [
+ ExamplePage,
+ SignalFormExample,
+ ReactiveFormExample,
+ TemplateFormExample,
+ ShadowFormExample,
+ ],
template: `
All three kinds of Angular form on one page: Signal Forms, reactive forms and
- template-driven forms, each with nested fields, a list and failing validators.
+ template-driven forms, each with nested fields, a list and failing validators, plus a Signal
+ Form inside a shadow root.
Type into the fields and watch validity, touched and dirty change in the Forms tab.
@@ -21,6 +29,7 @@ import { TemplateFormExample } from './template-form-example';
+
`,
diff --git a/src/app/examples/shadow-form-example.ts b/src/app/examples/shadow-form-example.ts
new file mode 100644
index 00000000..b1201e4b
--- /dev/null
+++ b/src/app/examples/shadow-form-example.ts
@@ -0,0 +1,33 @@
+import { Component, ViewEncapsulation, signal } from '@angular/core';
+import { form, FormField, FormRoot, required } from '@angular/forms/signals';
+
+/** A Signal Form inside a shadow root, to check that the Forms tab still finds it. */
+@Component({
+ selector: 'app-shadow-form-example',
+ imports: [FormField, FormRoot],
+ encapsulation: ViewEncapsulation.ShadowDom,
+ template: `
+
+ `,
+ styleUrl: './forms-example.css',
+})
+export class ShadowFormExample {
+ readonly address = form(signal({ city: '' }), (p) => {
+ required(p.city, { message: 'City is required' });
+ });
+}