From a80a38ae88848eb0b4d21b27107fe94e14cb20a1 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 13:43:10 +0000 Subject: [PATCH 01/19] docs(docs): merge the setup guides into one page per setup NativeScript, Angular Native and Analog each had a Getting Started page and a Guides page that described the same setup, so they drifted (the Angular Native guide listed five tabs, the view shows seven) and readers didn't know which one to follow. Fold the steps, the connection tables and the demo of each guide into its Getting Started page, delete the three guides and point every link at the merged page. Cloudflare redirects the old guide URLs, which the panel and older links still use, through a _redirects file. --- README.md | 2 +- apps/docs/public/_redirects | 11 + apps/docs/src/app/pages/index.page.ts | 9 +- .../src/content/contributing/demo-apps.md | 2 +- .../content/getting-started/angular-native.md | 176 ++++++++++++++-- .../src/content/getting-started/express.md | 4 +- .../content/getting-started/nativescript.md | 149 ++++++++++++-- .../content/getting-started/popup-and-hub.md | 4 +- apps/docs/src/content/getting-started/vite.md | 113 ++++++++++- apps/docs/src/content/guides/analog.md | 189 ------------------ .../docs/src/content/guides/angular-native.md | 184 ----------------- apps/docs/src/content/guides/nativescript.md | 149 -------------- apps/docs/src/content/guides/ssr-http.md | 2 +- apps/docs/src/content/inspectors/analog.md | 9 +- apps/docs/src/content/inspectors/ssr-http.md | 4 +- apps/docs/src/ngmd.config.ts | 4 +- examples/angular-native/README.md | 2 +- 17 files changed, 430 insertions(+), 583 deletions(-) create mode 100644 apps/docs/public/_redirects delete mode 100644 apps/docs/src/content/guides/analog.md delete mode 100644 apps/docs/src/content/guides/angular-native.md delete mode 100644 apps/docs/src/content/guides/nativescript.md diff --git a/README.md b/README.md index b07cc2a3..eeea1553 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ npm install -D @pangular-inspector/devtools An Angular SSR server imports the hub when it starts, so install the package as a dependency there (`npm install @pangular-inspector/devtools`). -For an Angular CLI app with SSR, the [quick start](./apps/docs/src/content/getting-started/quick-start.md) takes you from install to a live panel. For other setups, follow the [installation guide](./apps/docs/src/content/getting-started/installation.md): a client-only Angular CLI app, Vite and Analog, the standalone CLI, [Angular Native](./apps/docs/src/content/guides/angular-native.md), or [Capacitor](./apps/docs/src/content/guides/capacitor.md). For a coding agent, run `npx @pangular-inspector/devtools mcp`. +For an Angular CLI app with SSR, the [quick start](./apps/docs/src/content/getting-started/quick-start.md) takes you from install to a live panel. For other setups, follow the [installation guide](./apps/docs/src/content/getting-started/installation.md): a client-only Angular CLI app, Vite and Analog, the standalone CLI, [Angular Native](./apps/docs/src/content/getting-started/angular-native.md), or [Capacitor](./apps/docs/src/content/guides/capacitor.md). For a coding agent, run `npx @pangular-inspector/devtools mcp`. ## Documentation diff --git a/apps/docs/public/_redirects b/apps/docs/public/_redirects new file mode 100644 index 00000000..f6fe040d --- /dev/null +++ b/apps/docs/public/_redirects @@ -0,0 +1,11 @@ +# Cloudflare reads this file from the static assets and moves each old URL to its page. +# The NativeScript, Angular Native and Analog setup guides merged into their Getting Started pages. +/guides/nativescript /getting-started/nativescript 301 +/guides/nativescript/ /getting-started/nativescript 301 +/guides/nativescript.md /getting-started/nativescript.md 301 +/guides/angular-native /getting-started/angular-native 301 +/guides/angular-native/ /getting-started/angular-native 301 +/guides/angular-native.md /getting-started/angular-native.md 301 +/guides/analog /getting-started/vite 301 +/guides/analog/ /getting-started/vite 301 +/guides/analog.md /getting-started/vite.md 301 diff --git a/apps/docs/src/app/pages/index.page.ts b/apps/docs/src/app/pages/index.page.ts index 94982d9c..83e3699b 100644 --- a/apps/docs/src/app/pages/index.page.ts +++ b/apps/docs/src/app/pages/index.page.ts @@ -965,7 +965,7 @@ claude mcp add pangular -- \\ readonly stack: StackItem[] = [ {name: 'Angular', url: '/getting-started/installation', logo: '/logos/angular.svg', size: 20}, - {name: 'AnalogJS', url: '/guides/analog', logo: '/logos/analog.svg', size: 17}, + {name: 'AnalogJS', url: '/getting-started/vite', logo: '/logos/analog.svg', size: 17}, {name: 'Vite', url: '/getting-started/vite', logo: '/logos/vite-mark.svg', size: 19}, { name: 'Express', @@ -981,7 +981,12 @@ claude mcp add pangular -- \\ logoDark: '/logos/ngrx-dark.svg', size: 20, }, - {name: 'NativeScript', url: '/guides/nativescript', logo: '/logos/nativescript.svg', size: 17}, + { + name: 'NativeScript', + url: '/getting-started/nativescript', + logo: '/logos/nativescript.svg', + size: 17, + }, { name: 'Angular Native', url: '/getting-started/angular-native', diff --git a/apps/docs/src/content/contributing/demo-apps.md b/apps/docs/src/content/contributing/demo-apps.md index 608a1883..27eea6c9 100644 --- a/apps/docs/src/content/contributing/demo-apps.md +++ b/apps/docs/src/content/contributing/demo-apps.md @@ -172,7 +172,7 @@ npm run devtools - + diff --git a/apps/docs/src/content/getting-started/angular-native.md b/apps/docs/src/content/getting-started/angular-native.md index 681ddee9..eef4c65b 100644 --- a/apps/docs/src/content/getting-started/angular-native.md +++ b/apps/docs/src/content/getting-started/angular-native.md @@ -1,6 +1,6 @@ --- title: Angular Native -description: Send live components, signals, injectors, stores, change detection, leaks and errors from an Angular Native app on a device to the devtools on your machine. +description: Add the devtools to an Angular Native app and send live components, signals, injectors, stores, change detection, leaks and errors from a device to your machine. --- @@ -9,9 +9,135 @@ description: Send live components, signals, injectors, stores, change detection, # Angular Native -[Angular Native](https://ng-native.com) renders *Angular onto React Native's Fabric renderer, so the app has no DOM for the [browser overlay](./overlay.md) to walk. The `@pangular-inspector/devtools/overlay-angular-native` entry point walks Angular Native's own node tree instead and sends the same live data to a devtools server that runs on your machine. +[Angular Native](https://ng-native.com) renders *Angular onto React Native's Fabric renderer, so the app has no DOM for the [browser overlay](./overlay.md) to walk. The `@pangular-inspector/devtools/overlay-angular-native` entry point walks Angular Native's own node tree instead, and sends the same live data to the [standalone devtools server](./cli.md) on your machine. -This page describes what the overlay shows and how it works. To add it to an app, follow [Set up Angular Native](../guides/angular-native.md). +This page sets the overlay up, then describes what it shows and how it works. + +## Requirements + +- A development build. Angular publishes its debug API on `globalThis.ng` only when `ngDevMode` is on, which is the default in a Metro development build. +- An app started with `mount()` from `@ng-native/platform`. The overlay needs the root node it returns. The demo uses `@ng-native/*` 0.2.0, the version the overlay is written against. +- A `WebSocket` global and a standards-compliant `URL`. React Native provides `WebSocket`. Expo provides `URL`. React Native's own `URL` is read-only, and the client sets the `protocol` of the socket URL, so a bare React Native app needs a polyfill such as `react-native-url-polyfill`. + +## Set up + + + + Add @pangular-inspector/devtools. A bare React Native app also needs a URL polyfill. + + + Call initAngularNativeOverlay() in src/main.ts, after mount(), with the root node it returns. + + + Start pangular dev --no-auth in the app's folder. + + + Open the Angular Native apps URL the server prints. The live tabs fill once the app connects. + + + +### Install + +```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active +pnpm add @pangular-inspector/devtools +``` + +```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" +npm install @pangular-inspector/devtools +``` + +```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" +yarn add @pangular-inspector/devtools +``` + +```bash group="install" name="bun" image="https://bun.sh/logo.svg" +bun add @pangular-inspector/devtools +``` + +### WebSocket and URL + +The overlay needs a `WebSocket` global and a standards-compliant `URL`. React Native provides `WebSocket`, and Expo provides `URL`, so an Expo app needs nothing more. + +React Native's own `URL` is read-only, and the client sets the `protocol` of the socket URL. In a bare React Native app, add a polyfill such as `react-native-url-polyfill` and import it first in `src/main.ts`. + +### Start the overlay + +Start the overlay after `mount()` from `@ng-native/platform`, and pass the root node of the mounted app: + +```ts {5,15} +// src/main.ts +import {AppRegistry, Image, Platform, processColor} from 'react-native'; +import {mount} from '@ng-native/platform'; +import {getFabricUIManager, registerPlatformComponents} from '@ng-native/fabric'; +import {initAngularNativeOverlay} from '@pangular-inspector/devtools/overlay-angular-native'; +import {App} from './app/app.ts'; + +registerPlatformComponents(Platform.OS); + +AppRegistry.registerRunnable('main', ({rootTag}) => { + const app = mount(Number(rootTag), App, getFabricUIManager(), { + processColor, + resolveAssetSource: (value) => Image.resolveAssetSource(value as never), + }); + if (__DEV__) initAngularNativeOverlay({root: app.engine.root}); +}); +``` + +The `__DEV__` check keeps the overlay out of release builds, which have no `ng` debug global to read. `initAngularNativeOverlay()` returns a function that stops the overlay and tells the server to forget the app. See [Options](#options) for `baseURL`, `intervalMs` and `retryMs`. + +### Where the overlay connects + +The overlay connects to `http://localhost:9999/` unless you pass `baseURL`. + +| Where the app runs | What to do | +| -------------------------------------- | ----------------------------------------------------------------------------------------------- | +| iOS simulator | Nothing. The simulator shares your machine's `localhost`. | +| Android emulator or USB Android device | Run `adb reverse tcp:9999 tcp:9999`, the same forwarding Metro uses for its own port. | +| Physical device over Wi-Fi | Pass your machine's LAN address as `baseURL`, such as `{baseURL: 'http://192.168.1.20:9999/'}`. | + +A device that reaches the server over plain HTTP may need a cleartext exception for that address in `Info.plist` or the Android network security config. + +### Run the devtools server + +Run the server in the app's folder, so the source scanners read its `src/`: + +```bash +cd my-angular-native-app +npx @pangular-inspector/devtools dev --no-auth +``` + +The server listens on `localhost` only, which the iOS simulator reaches directly and an Android emulator reaches through `adb reverse`. `--no-auth` is needed because the app cannot enter the one-time code the panel asks for. Without it, the overlay logs a warning in the Metro log that names the flag and keeps retrying. + +When it is ready, the server prints the Angular Native view on its own line: + +```text + pangular v + Panel: http://localhost:9999/ + Angular Native apps: http://localhost:9999/?view=angular-native + MCP: http://localhost:9999/__mcp +``` + +A physical device over Wi-Fi reaches your machine over the network, so the server has to listen on an interface the device can reach: + +```bash +npx @pangular-inspector/devtools dev --host 192.168.1.20 --allowed-origin http://192.168.1.20:9999 --no-auth +``` + +The server then listens on that address only, not on `localhost`, so open the panel at `http://192.168.1.20:9999/`. `--allowed-origin` lets the panel's own origin through there. Use your machine's address and the server's port. + + + With --host and --no-auth, every host that can reach that address can call the devtools RPC and MCP endpoints without a code. Use it on a trusted network only. Binding to the one address the device uses, as above, keeps the server off your other interfaces, which 0.0.0.0 would not. + + +See [Standalone CLI](./cli.md) for the other server options and [Security](../security.md) for what `--no-auth` turns off. + +### Open the panel + +Open `http://localhost:9999/?view=angular-native` on your machine. The **Angular Native** view shows the tabs an app on a device fills: **Components**, **Signals**, **Injectors**, **Store**, **Queries**, **Pipes** and **Errors**. With no app connected, it says **No Angular Native app is connected**. + +When the app connects, the Metro log shows `[pangular] Connected to the devtools server at http://localhost:9999/` and the tabs fill. Hover a component in the tree to outline its view on the device. + +If the app reports to a hub (Express or the Vite plugin) instead, pick the **Angular Native** dock in the side rail. See [Where it shows in the panel](#where-it-shows-in-the-panel). ## What it shows @@ -60,16 +186,6 @@ The overlay marks its component reports with `platform: 'angular-native'`, and t `list-pages` gives each page's platform, so an agent can tell an Angular Native app from a browser tab. See [Agent tools](../agents/tools.md#list-pages). -## Requirements - -- A development build. Angular publishes its debug API on `globalThis.ng` only when `ngDevMode` is on, which is the default in a Metro development build. -- An app started with `mount()` from `@ng-native/platform`. The overlay needs the root node it returns. The demo uses `@ng-native/*` 0.2.0, the version the overlay is written against. -- A `WebSocket` global and a standards-compliant `URL`. React Native provides `WebSocket`. Expo provides `URL`. React Native's own `URL` is read-only, and the client sets the `protocol` of the socket URL, so a bare React Native app needs a polyfill such as `react-native-url-polyfill`. - -## Set up - -[Set up Angular Native](../guides/angular-native.md) walks through it: install the package, start the overlay after `mount()`, run the server with `--no-auth` and open the panel. It also covers how the app reaches the server from a simulator, an emulator or a device, and how to run the [Angular Native demo](../contributing/demo-apps.md#angular-native-demo). - ## Options | Option | Default | What it does | @@ -101,11 +217,39 @@ The hook does nothing when `ngDevMode` is off. Without it, only stores created a - **Errors**: the overlay wraps the app's `ErrorHandler`, listens to the console, and hears React Native's global error handler (`ErrorUtils`), which it calls on with every error and puts back when the overlay stops. - **Highlight**: when the panel or the `highlight` agent tool points at a component, the overlay sets `outlineWidth`, `outlineStyle` and `outlineColor` in the view's inline style, and restores the previous values when the panel clears it. -## FAQ +## Try the demo + +`examples/angular-native` is an Expo app wired up this way, with a root service, an `@ngrx/signals` store and components with signals to inspect. It is outside the pnpm workspace and installs with npm, using a tarball of the devtools package built from this repository. It uses `@ng-native/*` 0.2.0. The overlay's tests run against a simulated view tree and connection, and no automated test runs the demo on a simulator or device: + +```bash +cd examples/angular-native +npm run devtools:pack +npm install +npm run devtools +``` + +`npm run devtools` starts the devtools server with `--no-auth` on `http://localhost:9999/`, scanning the demo's `src`. In a second terminal, build and start the app: + +```bash +npm run ios +``` + +On Android, forward the devtools port first: + +```bash +adb reverse tcp:9999 tcp:9999 +npm run android +``` + +After a change in `packages/devtools`, run `npm run devtools:pack` and then `npm install ./pangular-inspector-devtools.tgz`, since a plain `npm install` keeps the tarball its lockfile pins. See [Angular Native demo](../contributing/demo-apps.md#angular-native-demo) for what each file covers. + +## Troubleshooting + +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. - Check the Metro log for a [pangular] line. A warning about --no-auth means the server asked for a code. A warning about reaching the server means the address is wrong for where the app runs. See where the overlay connects. A release build has no ng global, so nothing is collected there. + Check the Metro log for a [pangular] line. A warning about --no-auth means the server asked for a code. A warning about reaching the server means the address is wrong for where the app runs. See where the overlay connects. A release build has no ng global, so nothing is collected there. Angular records providers only when a window global exists as mount() creates the platform. When __DEV__ is true and no window exists, importing @pangular-inspector/devtools/overlay-angular-native defines one until Angular publishes its debug utilities, then removes it. Keep the import at the top of src/main.ts, so it runs before mount(). If the list stays empty, check that window is defined before mount() runs. @@ -115,9 +259,9 @@ The hook does nothing when `ngDevMode` is off. Without it, only stores created a ## Where to next - + diff --git a/apps/docs/src/content/getting-started/express.md b/apps/docs/src/content/getting-started/express.md index 7a6fd944..a9395879 100644 --- a/apps/docs/src/content/getting-started/express.md +++ b/apps/docs/src/content/getting-started/express.md @@ -208,7 +208,7 @@ A floating button appears on your page. It opens the devtools with one dock entr | NgRx | Store patterns from source, and live state and actions | | Analog | File routes, server calls, render modes and lint (a notice in non-Analog apps) | | Angular Native | Components, signals, injectors, stores, queries, pipes and errors of a connected [Angular Native](./angular-native.md) app | -| NativeScript | Setup steps for [NativeScript apps](../guides/nativescript.md) | +| NativeScript | Setup steps for [NativeScript apps](./nativescript.md) | | Capacitor | Plugin calls of a connected [Capacitor app](../inspectors/capacitor.md), or setup steps when none is connected | [Popup and hub](./popup-and-hub.md) covers the panel, its dock modes and deep links. @@ -313,6 +313,8 @@ Like `@pangular-inspector/devtools/hub`, the devframe entry point loads Devframe ## Troubleshooting +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + The app is probably a production build. Run ng serve, or build with --configuration development. Then check that main.ts imports the overlay. diff --git a/apps/docs/src/content/getting-started/nativescript.md b/apps/docs/src/content/getting-started/nativescript.md index 15fa2502..cb3cc3dd 100644 --- a/apps/docs/src/content/getting-started/nativescript.md +++ b/apps/docs/src/content/getting-started/nativescript.md @@ -1,6 +1,6 @@ --- title: NativeScript -description: Send live components, signals, injectors, stores, change detection, leaks and errors from a NativeScript Angular app on a simulator or device to the devtools on your machine. +description: Add the devtools to a NativeScript Angular app and send live components, signals, injectors, stores, change detection, leaks and errors from a simulator or device to your machine. --- @@ -9,9 +9,114 @@ description: Send live components, signals, injectors, stores, change detection, # NativeScript -A NativeScript Angular app renders into `@nativescript/core` views, so it has no DOM for the [browser overlay](./overlay.md) to walk. The `@pangular-inspector/devtools/overlay-nativescript` entry point walks the NativeScript view tree instead and sends live data to a devtools server that runs on your machine. +A NativeScript Angular app renders into `@nativescript/core` views, so it has no DOM for the [browser overlay](./overlay.md) to walk. The `@pangular-inspector/devtools/overlay-nativescript` entry point walks the NativeScript view tree through *Angular's debug API instead, and sends live data to the [standalone devtools server](./cli.md) on your machine. -This page describes what the overlay shows and how it works. To add it to an app, follow [Set up NativeScript](../guides/nativescript.md). +This page sets the overlay up, then describes what it shows and how it works. + +## Requirements + +- A development build. Angular publishes its debug API on `globalThis.ng` only when `ngDevMode` is on. Start the overlay inside an `if (__DEV__)` check. +- `@nativescript/core`, an optional peer dependency of the package. The overlay reads the root view and the platform from it. +- A `WebSocket` global. The NativeScript runtime has none, so import `@valor/nativescript-websockets` first in `src/polyfills.ts`. Without it, the overlay logs a warning that names the package and does not start. +- `initNativeScriptOverlay()` called before `runNativeScriptAngularApp()`, so the injector inspector gets its provider lists. See [How it works](#how-it-works). +- A server started with `--no-auth`, since the app cannot enter the one-time code the panel asks for. Against a server with auth on, the overlay logs a warning that says to start it with `--no-auth`, and tries again every `retryMs`. + +## Set up + + + + Add @pangular-inspector/devtools and @valor/nativescript-websockets. + + + Import @valor/nativescript-websockets first in src/polyfills.ts. + + + Call initNativeScriptOverlay() in src/main.ts, before the app bootstraps. + + + Start pangular dev --no-auth in the app's folder and open the panel. + + + +### Install + +```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active +pnpm add @pangular-inspector/devtools @valor/nativescript-websockets +``` + +```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" +npm install @pangular-inspector/devtools @valor/nativescript-websockets +``` + +```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" +yarn add @pangular-inspector/devtools @valor/nativescript-websockets +``` + +```bash group="install" name="bun" image="https://bun.sh/logo.svg" +bun add @pangular-inspector/devtools @valor/nativescript-websockets +``` + +### Add a WebSocket global + +The overlay talks to the server over a WebSocket, and the NativeScript runtime has no `WebSocket` global. Import the polyfill first: + +```ts +// src/polyfills.ts +import '@valor/nativescript-websockets'; +``` + +### Start the overlay + +```ts {2,4-6} +// src/main.ts +import {initNativeScriptOverlay} from '@pangular-inspector/devtools/overlay-nativescript'; + +if (__DEV__) { + initNativeScriptOverlay(); +} +``` + +Call it before `runNativeScriptAngularApp()`. The injector inspector relies on *Angular's injector profiler, which *Angular only wires while it creates the platform. See [Options](#options) for `baseURL`, `intervalMs` and `retryMs`. + +### Where the overlay connects + +| Target | Default URL | +| ---------------- | ------------------------ | +| iOS simulator | `http://localhost:9999/` | +| Android emulator | `http://10.0.2.2:9999/` | +| Physical device | Pass `{ baseURL }` | + +For a physical device, pass the address of your machine as `baseURL`. Android 9 and later and iOS App Transport Security block plain `http` to a LAN address, so allow it for development builds: set `android:usesCleartextTraffic="true"` in `AndroidManifest.xml`, and add an `NSAppTransportSecurity` exception for the address in `Info.plist`. + +### Run the devtools server + +Run the server in the app's folder, so the source scanners read its `src/`: + +```bash +cd my-nativescript-app +npx @pangular-inspector/devtools dev --no-auth +``` + +The server listens on `localhost` only, which the iOS simulator and the Android emulator reach. `--no-auth` is needed because the app cannot enter the one-time code the panel asks for. + +| What | Where | +| ------------ | ----------------------------- | +| Devtools UI | `http://localhost:9999/` | +| MCP endpoint | `http://localhost:9999/__mcp` | + +A physical device reaches your machine over the network, so the server has to listen on an interface the device can reach: + +```bash +npx @pangular-inspector/devtools dev --host 192.168.1.20 --allowed-origin http://192.168.1.20:9999 --no-auth +``` + +The server then listens on that address only, not on `localhost`, so open the panel at `http://192.168.1.20:9999/`. `--allowed-origin` lets the panel's own origin through there. Use your machine's address and the server's port. + + + With --host and --no-auth, every host that can reach that address can call the devtools RPC and MCP endpoints without a code. Use it on a trusted network only. Binding to the one address the device uses, as above, keeps the server off your other interfaces, which 0.0.0.0 would not. + + +See [Standalone CLI](./cli.md) for the other server options and [Security](../security.md) for what `--no-auth` turns off. ## What it shows @@ -56,22 +161,10 @@ The live data shows in the same tabs as a browser page. | [Standalone CLI](./cli.md) | The panel at `http://localhost:9999/`, without `?view`. | | A hub (Express or the Vite plugin) | The **Angular** dock in the side rail. | -The **NativeScript** dock (`?view=nativescript`) shows no live data. It is a setup card, **Inspect NativeScript apps**, with the setup steps and a link to the [setup guide](../guides/nativescript.md). +The **NativeScript** dock (`?view=nativescript`) shows no live data. It is a setup card, **Inspect NativeScript apps**, with the setup steps and a link to this page. The overlay marks its component reports with `platform: 'nativescript'`, the URL `/` and the title `NativeScript (iOS)` or `NativeScript (Android)`. `list-pages` lists the app with the `NativeScript` platform. See [Agent tools](../agents/tools.md#list-pages). -## Requirements - -- A development build. Angular publishes its debug API on `globalThis.ng` only when `ngDevMode` is on. Start the overlay inside an `if (__DEV__)` check. -- `@nativescript/core`, an optional peer dependency of the package. The overlay reads the root view and the platform from it. -- A `WebSocket` global. The NativeScript runtime has none, so import `@valor/nativescript-websockets` first in `src/polyfills.ts`. Without it, the overlay logs a warning that names the package and does not start. -- `initNativeScriptOverlay()` called before `runNativeScriptAngularApp()`, so the injector inspector gets its provider lists. See [How it works](#how-it-works). -- A server started with `--no-auth`, since the app cannot enter the one-time code the panel asks for. Against a server with auth on, the overlay logs a warning that says to start it with `--no-auth`, and tries again every `retryMs`. - -## Set up - -[Set up NativeScript](../guides/nativescript.md) walks through it: install the packages, add the WebSocket global, start the overlay and run the server. It also covers where the overlay connects from a simulator, an emulator or a device, and how to run the demo in `examples/nativescript`. - ## Options `initNativeScriptOverlay()` takes an optional object: @@ -104,11 +197,27 @@ The overlay marks its component reports with `platform: 'nativescript'`, the URL - **Reporting**: the app collects every `intervalMs` and sends a report when it changed. The **Leaks** scan walks the views again when the component tree changed, and at least every 30 seconds. When a report has not changed for a while, the app asks the server whether it still holds it, and sends it again only if not. When the connection fails or drops, it logs one warning and tries again every `retryMs`. The app keeps one page id for as long as the overlay runs, so a reconnect does not show it as a new page. - **Highlight**: when the panel or the `highlight` agent tool points at a component, the overlay sets a 2 px `#68b6ff` border on the first view under the host that draws something. It restores the previous border when the pointer leaves the row, after the duration the `highlight` tool asks for, or after two seconds. -## FAQ +## Try the demo + +`examples/nativescript` is a `ns create --ng` project wired up this way, with a small showcase component (signals, a computed, an effect and a component-level provider). It is tested on the iOS simulator. Android is untested. + +The demo maps `@pangular-inspector/devtools/*` to the package's build output in `packages/devtools/dist`, so build the package first: + +```bash +pnpm devtools:build-pkg +pnpm devtools:nativescript +cd examples/nativescript && npm install && ns debug ios --no-hmr +``` + +`pnpm devtools:nativescript` starts the devtools server on `localhost`, scanning `examples/nativescript/src`. For a physical device, `pnpm devtools:nativescript:device` listens on every interface instead, with the same warning as above. + +## Troubleshooting + +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. - Check the app log for a [pangular] line. A warning about a missing WebSocket global means @valor/nativescript-websockets is not imported first in src/polyfills.ts. A warning about reaching the server means the address is wrong for where the app runs; see where the overlay connects. A release build has no ng global, so nothing is collected there. + Check the app log for a [pangular] line. A warning about a missing WebSocket global means @valor/nativescript-websockets is not imported first in src/polyfills.ts. A warning about reaching the server means the address is wrong for where the app runs; see where the overlay connects. A release build has no ng global, so nothing is collected there. The overlay has to start before runNativeScriptAngularApp() creates the platform. Call initNativeScriptOverlay() above it in src/main.ts. @@ -121,8 +230,8 @@ The overlay marks its component reports with `platform: 'nativescript'`, the URL ## Where to next - + - + diff --git a/apps/docs/src/content/getting-started/popup-and-hub.md b/apps/docs/src/content/getting-started/popup-and-hub.md index 14d60caa..a3f6de90 100644 --- a/apps/docs/src/content/getting-started/popup-and-hub.md +++ b/apps/docs/src/content/getting-started/popup-and-hub.md @@ -156,7 +156,7 @@ When the page's server mounts the hub (`/__devframes/`), the button opens the wh | NgRx | The Store tab | | Analog | The Analog tab, or a notice in apps that do not use Analog | | Angular Native | Components, Signals, Injectors, Store, Queries, Pipes and Errors for a connected [Angular Native](./angular-native.md) app, or a setup notice when none is connected | -| NativeScript | Setup steps for [NativeScript apps](../guides/nativescript.md) | +| NativeScript | Setup steps for [NativeScript apps](./nativescript.md) | | Capacitor | Plugin calls of a connected [Capacitor app](../inspectors/capacitor.md), or setup steps when none is connected | ### The full panel @@ -269,6 +269,8 @@ A browser tab in the background runs its timers about once a minute. The app pag ## Troubleshooting +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + Drag it somewhere else, or focus it and use the arrow keys. Double-click it to reset its position. To remove it, stop the overlay with disposeOverlay. diff --git a/apps/docs/src/content/getting-started/vite.md b/apps/docs/src/content/getting-started/vite.md index 194c3e30..d9e68c46 100644 --- a/apps/docs/src/content/getting-started/vite.md +++ b/apps/docs/src/content/getting-started/vite.md @@ -15,7 +15,7 @@ For *Analog apps, add the *Vite plugin next to `analog()`. The plugin mounts the - Add @pangular-inspector/devtools as a dev dependency. See Installation. + Add @pangular-inspector/devtools as a dev dependency. Register pangular() after analog() in vite.config.ts. @@ -25,6 +25,40 @@ For *Analog apps, add the *Vite plugin next to `analog()`. The plugin mounts the +## Install + +```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active +pnpm add -D @pangular-inspector/devtools +``` + +```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" +npm install -D @pangular-inspector/devtools +``` + +```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" +yarn add -D @pangular-inspector/devtools +``` + +```bash group="install" name="bun" image="https://bun.sh/logo.svg" +bun add -D @pangular-inspector/devtools +``` + +### If the build fails under pnpm + +With pnpm, `vite build` or the dev server can stop with `SyntaxError: The requested module 'h3' does not provide an export named 'createEvent'`. `@analogjs/vite-plugin-nitro` imports `h3` without listing it as a dependency, so pnpm resolves the import to whichever `h3` it hoists. Analog's server needs `h3` 1, and this package brings `h3` 2 through *Devframe. + +Declare the missing dependency in `pnpm-workspace.yaml` at the root of your app (create the file if there is none), then run `pnpm install` again: + +```yaml +# pnpm-workspace.yaml +packageExtensions: + '@analogjs/vite-plugin-nitro': + dependencies: + h3: ^1.15.0 +``` + +Before pnpm 10, put the same entry under `pnpm.packageExtensions` in `package.json`. Adding `h3` 1 to your own dependencies does not help, because the plugin's import still resolves to the hoisted copy. + ## Add the plugin ### Register it in `vite.config.ts` @@ -54,6 +88,12 @@ The plugin adds a module script to every HTML page the dev server transforms, at When the dev server starts, Vite prints the full-page viewer URL under its own URLs, on a line labeled `Pangular Inspector`. +The terminal also prints a one-time code. Enter it when the page or the panel asks for it. In an Analog app, open the **Analog** dock to see file routes, server calls, render modes, content and lint. See [the Analog inspector](../inspectors/analog.md) for each view. + + + Point your MCP client at http://localhost:5173/__devframes/__mcp with an Origin header and the bearer token. See MCP server. The analog-list-server-calls and analog-run-api tools only work through the Vite plugin. + + ## What the plugin does ### Dev server only @@ -166,6 +206,65 @@ bootstrapApplication(App, appConfig).then(() => { `import.meta.env.DEV` is false in `vite build`, so the import stays out of your production bundle. Use the same import when your framework renders HTML without passing it through Vite's `transformIndexHtml`, which is where the plugin adds the script. +## Catch hydration errors from the first load + +The overlay can connect after the first render, so it can miss hydration errors (`NG0500` to `NG0506`) logged during the first load. `providePangularHttp()` starts listening for them when the app starts. The Analog dock lists them under **Hydration error** in **Lint**, and the `analog-inspect-page` tool returns them. + +Analog's own `load()` fetches and API calls show in the Analog dock without extra setup. `withPangular()` also records `HttpClient` calls in the **SSR & HTTP** tab. + +```ts {5,10-11} +// src/app/app.config.ts +import {provideHttpClient, withFetch} from '@angular/common/http'; +import {ApplicationConfig} from '@angular/core'; +import {provideFileRouter} from '@analogjs/router'; +import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideFileRouter(), + provideHttpClient(withFetch(), withPangular()), + providePangularHttp(), + ], +}; +``` + +`providePangularHttp()` and `withPangular()` do nothing in production builds. See [Set up SSR & HTTP](../guides/ssr-http.md) for the interceptor order. + +## Trace server renders + +To fill the **SSR requests** table in the **SSR & HTTP** tab, add a Nitro server middleware that traces each page render. Analog runs files in `src/server/middleware` before it renders the page, on the dev server too: + +```ts +// src/server/middleware/pangular-ssr.ts +import {pangularSsrEventHandler} from '@pangular-inspector/devtools/ssr'; +import {defineEventHandler} from 'h3'; + +export default defineEventHandler(pangularSsrEventHandler()); +``` + +It wraps the Node response of each HTML request, adds the `Server-Timing` header that links the page to its render, and records the render with its render mode. Analog marks its renders `ssr-analog`, which the tab shows as **Server**. It does nothing while the Vite plugin is not running, so it is safe in a production build. + +Analog gives the render its own `REQUEST` token, not the one from `@angular/core`, so `withPangular()` can't read the request id from a header. Instead, the tracer keeps the id in the request's async context (Node's `AsyncLocalStorage`), and each server call is linked to the request it ran under. Renders that run at the same time each keep their own calls. + +The tracer skips a request that does not accept `text/html`, such as `curl` without an `Accept` header. It also skips a path in `skip`. The calls of a render it skips show in the timeline without a link to a request, even while a traced render runs alongside. + +The tracer drops a traced request after five minutes without activity, such as a response nobody reads. A response that keeps sending chunks stays in flight. A server call made after its request was dropped is not linked. + +## Try the demo + +The repository has an Analog demo in `examples/analog`. It has file routes with route groups, `.server.ts` loads, API routes under `src/server/routes/api/v1`, markdown content, prerendered pages and a client-only `/dashboard`. + +```bash +pnpm install +pnpm analog:dev +``` + +The script builds the devtools package first, then starts the Vite dev server. + + + The demo aliases @pangular-inspector/devtools/overlay to the built package in its vite.config.ts, and the overlay script the plugin adds resolves through that alias. Your app does not need it. + + ## Hostnames other than localhost ### Local hostnames @@ -216,7 +315,9 @@ Start Vite on every interface too, with `server.host: true`. A request from anot The Angular CLI dev server does not accept Vite plugins. For an Angular CLI app, mount the hub in your Express server instead. See Angular CLI and Express. -## FAQ +## Troubleshooting + +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. @@ -226,18 +327,18 @@ Start Vite on every interface too, with `server.host: true`. A request from anot The request did not come from your machine, or its origin or the host it was sent to is not trusted. The terminal names a refused origin or host. Open the app on localhost, list your hostname in server.allowedHosts, or add the origin to allowedOrigins. - @analogjs/vite-plugin-nitro imports h3 without declaring it, so pnpm can resolve it to the h3 2 that this package brings instead of the h3 1 Analog needs. The build stops with The requested module 'h3' does not provide an export named 'createEvent'. Declare h3 for the plugin with packageExtensions, as Set up Analog shows. + @analogjs/vite-plugin-nitro imports h3 without declaring it, so pnpm can resolve it to the h3 2 that this package brings instead of the h3 1 Analog needs. The build stops with The requested module 'h3' does not provide an export named 'createEvent'. Declare h3 for the plugin with packageExtensions, as If the build fails under pnpm shows. - The plugin records server calls made through the Vite dev server. Check that the plugin is registered and that apiPrefix matches your server routes. The Analog guide walks through a full setup. + The plugin records server calls made through the Vite dev server. Check that the plugin is registered and that apiPrefix matches your server routes. To link renders to the SSR & HTTP tab too, see Trace server renders. ## Where to next - - A full Analog setup, including the demo in this repository. + + Symptoms every setup shares, such as no page connected or a 403. File routes, server calls, render modes, content and lint. diff --git a/apps/docs/src/content/guides/analog.md b/apps/docs/src/content/guides/analog.md deleted file mode 100644 index c199e627..00000000 --- a/apps/docs/src/content/guides/analog.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -title: Set up Analog -description: Add the devtools to an Analog app, step by step. ---- - - - One Vite plugin. You get the Angular inspectors, the NgRx dock, the Analog dock and an MCP endpoint on the Vite dev server. - - -# Set up Analog - -This guide adds the devtools to an *Analog app. Everything runs on the *Vite dev server, so there is no separate server to start. - -## What you get - - - - Components, injectors, signals, forms, router and pipes, reading the live page. - - - File routes, server calls, render modes, content and lint. - - - Signal stores and the change log, when your app uses NgRx. - - - /__devframes/__mcp on the Vite dev server, with the Analog tools. - - - -## The flow - - - - Add @pangular-inspector/devtools as a dev dependency. - - - Register it next to analog() in vite.config.ts. It also loads the overlay into your pages. - - - Start the dev server and click the floating button. - - - -## Step 1: Install - -```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active -pnpm add -D @pangular-inspector/devtools -``` - -```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" -npm install -D @pangular-inspector/devtools -``` - -```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" -yarn add -D @pangular-inspector/devtools -``` - -```bash group="install" name="bun" image="https://bun.sh/logo.svg" -bun add -D @pangular-inspector/devtools -``` - -### If the build fails under pnpm - -With pnpm, `vite build` or the dev server can stop with `SyntaxError: The requested module 'h3' does not provide an export named 'createEvent'`. `@analogjs/vite-plugin-nitro` imports `h3` without listing it as a dependency, so pnpm resolves the import to whichever `h3` it hoists. Analog's server needs `h3` 1, and this package brings `h3` 2 through *Devframe. - -Declare the missing dependency in `pnpm-workspace.yaml` at the root of your app (create the file if there is none), then run `pnpm install` again: - -```yaml -# pnpm-workspace.yaml -packageExtensions: - '@analogjs/vite-plugin-nitro': - dependencies: - h3: ^1.15.0 -``` - -Before pnpm 10, put the same entry under `pnpm.packageExtensions` in `package.json`. Adding `h3` 1 to your own dependencies does not help, because the plugin's import still resolves to the hoisted copy. - -## Step 2: Add the Vite plugin - -Add the plugin after `analog()`: - -```ts {3,7} -// vite.config.ts -import analog from '@analogjs/platform'; -import pangular from '@pangular-inspector/devtools/vite'; -import {defineConfig} from 'vite'; - -export default defineConfig(() => ({ - plugins: [analog(), pangular()], -})); -``` - -The plugin runs on the dev server only (`apply: 'serve'`). Production builds do not include it. - -### Plugin options - -Every option is optional. `apiPrefix` is read from your Analog config, and the one-time code (`auth`) is on by default. The plugin also takes the devtools options. See [Vite and Analog options](../getting-started/vite.md#options) for the full list and [Configuration](../getting-started/configuration.md) for the devtools options. - -### Custom hostnames - -The devtools only answer requests from this machine. If you open the dev server through another hostname, add it to Vite's `server.allowedHosts`. See [Security](../security.md). - -### The overlay - -The plugin adds the overlay to the pages the dev server serves, so `src/main.ts` needs no import. A production build does not include it. To load it yourself instead, see [Load the overlay yourself](../getting-started/vite.md#load-the-overlay-yourself). - -## Step 3: Open the devtools - -Start the dev server as usual. The terminal prints a one-time code. Enter it when the page or the panel asks for it. Then: - -| What | Where | -| --------------- | ------------------------------------------- | -| Floating button | On every page of your app | -| Full viewer | `/__devframes/` on the Vite dev server | -| MCP endpoint | `/__devframes/__mcp` on the Vite dev server | - -Open the **Analog** dock to see file routes, server calls, render modes, content and lint. See [the Analog inspector](../inspectors/analog.md) for each view. - - - Point your MCP client at http://localhost:5173/__devframes/__mcp with an Origin header and the bearer token. See MCP server. The analog-list-server-calls and analog-run-api tools only work through the Vite plugin. - - -## Catch hydration errors from the first load - -The overlay can connect after the first render, so it can miss hydration errors (`NG0500` to `NG0506`) logged during the first load. `providePangularHttp()` starts listening for them when the app starts. The Analog dock lists them under **Hydration error** in **Lint**, and the `analog-inspect-page` tool returns them. - -Analog's own `load()` fetches and API calls show in the Analog dock without extra setup. `withPangular()` also records `HttpClient` calls in the **SSR & HTTP** tab. - -```ts {5,10-11} -// src/app/app.config.ts -import {provideHttpClient, withFetch} from '@angular/common/http'; -import {ApplicationConfig} from '@angular/core'; -import {provideFileRouter} from '@analogjs/router'; -import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http'; - -export const appConfig: ApplicationConfig = { - providers: [ - provideFileRouter(), - provideHttpClient(withFetch(), withPangular()), - providePangularHttp(), - ], -}; -``` - -`providePangularHttp()` and `withPangular()` do nothing in production builds. See [Set up SSR & HTTP](./ssr-http.md) for the interceptor order. - -## Trace server renders - -To fill the **SSR requests** table in the **SSR & HTTP** tab, add a Nitro server middleware that traces each page render. Analog runs files in `src/server/middleware` before it renders the page, on the dev server too: - -```ts -// src/server/middleware/pangular-ssr.ts -import {pangularSsrEventHandler} from '@pangular-inspector/devtools/ssr'; -import {defineEventHandler} from 'h3'; - -export default defineEventHandler(pangularSsrEventHandler()); -``` - -It wraps the Node response of each HTML request, adds the `Server-Timing` header that links the page to its render, and records the render with its render mode. Analog marks its renders `ssr-analog`, which the tab shows as **Server**. It does nothing while the Vite plugin is not running, so it is safe in a production build. - -Analog gives the render its own `REQUEST` token, not the one from `@angular/core`, so `withPangular()` can't read the request id from a header. Instead, the tracer keeps the id in the request's async context (Node's `AsyncLocalStorage`), and each server call is linked to the request it ran under. Renders that run at the same time each keep their own calls. - -The tracer skips a request that does not accept `text/html`, such as `curl` without an `Accept` header. It also skips a path in `skip`. The calls of a render it skips show in the timeline without a link to a request, even while a traced render runs alongside. - -The tracer drops a traced request after five minutes without activity, such as a response nobody reads. A response that keeps sending chunks stays in flight. A server call made after its request was dropped is not linked. - -## Try the demo - -The repository has an Analog demo in `examples/analog`. It has file routes with route groups, `.server.ts` loads, API routes under `src/server/routes/api/v1`, markdown content, prerendered pages and a client-only `/dashboard`. - -```bash -pnpm install -pnpm analog:dev -``` - -The script builds the devtools package first, then starts the Vite dev server. - - - The demo aliases @pangular-inspector/devtools/overlay to the built package in its vite.config.ts, and the overlay script the plugin adds resolves through that alias. Your app does not need it. - - -## Where to next - - - - - - diff --git a/apps/docs/src/content/guides/angular-native.md b/apps/docs/src/content/guides/angular-native.md deleted file mode 100644 index e1337935..00000000 --- a/apps/docs/src/content/guides/angular-native.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: Set up Angular Native -description: Inspect an Angular Native app from a simulator, an emulator or a device, step by step. ---- - - - An Angular Native overlay walks the app's node tree and reports over a WebSocket to a devtools server on your machine. - - -# Set up Angular Native - -This guide adds the devtools to an [Angular Native](https://ng-native.com) app. The app renders through React Native's Fabric renderer and has no DOM, so a separate overlay walks Angular Native's node tree through *Angular's debug API and reports to the standalone devtools server. For what each tab shows and the overlay options, see [Angular Native](../getting-started/angular-native.md). - -## What you get - - - - The component tree, the signal graph, the injector tree and the pipes in use. - - - Live @ngrx/signals and @ngrx/store state and the change log, when your app uses NgRx. - - - Hovering a component in the panel outlines its view on the simulator or device. - - - /__mcp on the devtools server. The source scanners read the app's src/. - - - -## The flow - - - - Add @pangular-inspector/devtools. A bare React Native app also needs a URL polyfill. - - - Call initAngularNativeOverlay() in src/main.ts, after mount(), with the root node it returns. - - - Start pangular dev --no-auth in the app's folder. - - - Open the Angular Native apps URL the server prints. The live tabs fill once the app connects. - - - -## Step 1: Install - -```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" active -npm install @pangular-inspector/devtools -``` - -```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" -pnpm add @pangular-inspector/devtools -``` - -```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" -yarn add @pangular-inspector/devtools -``` - -```bash group="install" name="bun" image="https://bun.sh/logo.svg" -bun add @pangular-inspector/devtools -``` - -### WebSocket and URL - -The overlay needs a `WebSocket` global and a standards-compliant `URL`. React Native provides `WebSocket`, and Expo provides `URL`, so an Expo app needs nothing more. - -React Native's own `URL` is read-only, and the client sets the `protocol` of the socket URL. In a bare React Native app, add a polyfill such as `react-native-url-polyfill` and import it first in `src/main.ts`. - -## Step 2: Start the overlay - -Start the overlay after `mount()` from `@ng-native/platform`, and pass the root node of the mounted app: - -```ts {5,15} -// src/main.ts -import {AppRegistry, Image, Platform, processColor} from 'react-native'; -import {mount} from '@ng-native/platform'; -import {getFabricUIManager, registerPlatformComponents} from '@ng-native/fabric'; -import {initAngularNativeOverlay} from '@pangular-inspector/devtools/overlay-angular-native'; -import {App} from './app/app.ts'; - -registerPlatformComponents(Platform.OS); - -AppRegistry.registerRunnable('main', ({rootTag}) => { - const app = mount(Number(rootTag), App, getFabricUIManager(), { - processColor, - resolveAssetSource: (value) => Image.resolveAssetSource(value as never), - }); - if (__DEV__) initAngularNativeOverlay({root: app.engine.root}); -}); -``` - -The `__DEV__` check keeps the overlay out of release builds, which have no `ng` debug global to read. `initAngularNativeOverlay()` returns a function that stops the overlay and tells the server to forget the app. See [Options](../getting-started/angular-native.md#options) for `baseURL`, `intervalMs` and `retryMs`. - -### Where the overlay connects - -The overlay connects to `http://localhost:9999/` unless you pass `baseURL`. - -| Where the app runs | What to do | -| -------------------------------------- | ----------------------------------------------------------------------------------------------- | -| iOS simulator | Nothing. The simulator shares your machine's `localhost`. | -| Android emulator or USB Android device | Run `adb reverse tcp:9999 tcp:9999`, the same forwarding Metro uses for its own port. | -| Physical device over Wi-Fi | Pass your machine's LAN address as `baseURL`, such as `{baseURL: 'http://192.168.1.20:9999/'}`. | - -A device that reaches the server over plain HTTP may need a cleartext exception for that address in `Info.plist` or the Android network security config. - -## Step 3: Run the devtools server - -Run the server in the app's folder, so the source scanners read its `src/`: - -```bash -cd my-angular-native-app -npx @pangular-inspector/devtools dev --no-auth -``` - -The server listens on `localhost` only, which the iOS simulator reaches directly and an Android emulator reaches through `adb reverse`. `--no-auth` is needed because the app cannot enter the one-time code the panel asks for. Without it, the overlay logs a warning in the Metro log that names the flag and keeps retrying. - -When it is ready, the server prints the Angular Native view on its own line: - -```text - pangular v - Panel: http://localhost:9999/ - Angular Native apps: http://localhost:9999/?view=angular-native - MCP: http://localhost:9999/__mcp -``` - -A physical device over Wi-Fi reaches your machine over the network, so the server has to listen on an interface the device can reach: - -```bash -npx @pangular-inspector/devtools dev --host 192.168.1.20 --allowed-origin http://192.168.1.20:9999 --no-auth -``` - -The server then listens on that address only, not on `localhost`, so open the panel at `http://192.168.1.20:9999/`. `--allowed-origin` lets the panel's own origin through there. Use your machine's address and the server's port. - - - With --host and --no-auth, every host that can reach that address can call the devtools RPC and MCP endpoints without a code. Use it on a trusted network only. Binding to the one address the device uses, as above, keeps the server off your other interfaces, which 0.0.0.0 would not. - - -See [Standalone CLI](../getting-started/cli.md) for the other server options and [Security](../security.md) for what `--no-auth` turns off. - -## Step 4: Open the panel - -Open `http://localhost:9999/?view=angular-native` on your machine. The **Angular Native** view shows the tabs an app on a device fills: **Components**, **Signals**, **Injectors**, **Store** and **Pipes**. With no app connected, it says **No Angular Native app is connected**. - -When the app connects, the Metro log shows `[pangular] Connected to the devtools server at http://localhost:9999/` and the tabs fill. Hover a component in the tree to outline its view on the device. - -If the app reports to a hub (Express or the Vite plugin) instead, pick the **Angular Native** dock in the side rail. See [Where it shows in the panel](../getting-started/angular-native.md#where-it-shows-in-the-panel). - -## Try the demo - -`examples/angular-native` is an Expo app wired up this way, with a root service, an `@ngrx/signals` store and components with signals to inspect. It is outside the pnpm workspace and installs with npm, using a tarball of the devtools package built from this repository. It uses `@ng-native/*` 0.2.0. The overlay's tests run against a simulated view tree and connection, and no automated test runs the demo on a simulator or device: - -```bash -cd examples/angular-native -npm run devtools:pack -npm install -npm run devtools -``` - -`npm run devtools` starts the devtools server with `--no-auth` on `http://localhost:9999/`, scanning the demo's `src`. In a second terminal, build and start the app: - -```bash -npm run ios -``` - -On Android, forward the devtools port first: - -```bash -adb reverse tcp:9999 tcp:9999 -npm run android -``` - -After a change in `packages/devtools`, run `npm run devtools:pack` and then `npm install ./pangular-inspector-devtools.tgz`, since a plain `npm install` keeps the tarball its lockfile pins. See [Angular Native demo](../contributing/demo-apps.md#angular-native-demo) for what each file covers. - -## Where to next - - - - - - - diff --git a/apps/docs/src/content/guides/nativescript.md b/apps/docs/src/content/guides/nativescript.md deleted file mode 100644 index ab172b5c..00000000 --- a/apps/docs/src/content/guides/nativescript.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -title: Set up NativeScript -description: Inspect a NativeScript Angular app from the simulator or a device, step by step. ---- - - - A NativeScript overlay walks the native view tree and reports over a WebSocket to a devtools server on your machine. - - -# Set up NativeScript - -This guide adds the devtools to a NativeScript Angular app. The app has no DOM, so a separate overlay walks the native view tree through *Angular's debug API and reports to the standalone devtools server. For what each tab shows and the overlay options, see [NativeScript](../getting-started/nativescript.md). - -## What you get - - - - The component tree, the signal graph and the injector tree, including environment injectors and their providers. - - - Signal stores and the change log, when your app uses NgRx. - - - The highlight tool outlines a component's view on the simulator or device. - - - /__mcp on the devtools server. The source scanners read the app's src/. - - - -## The flow - - - - Add @pangular-inspector/devtools and @valor/nativescript-websockets. - - - Import @valor/nativescript-websockets first in src/polyfills.ts. - - - Call initNativeScriptOverlay() in src/main.ts, before the app bootstraps. - - - Start pangular dev in the app's folder and open the UI. - - - -## Step 1: Install - -```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" active -npm install @pangular-inspector/devtools @valor/nativescript-websockets -``` - -```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" -pnpm add @pangular-inspector/devtools @valor/nativescript-websockets -``` - -```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB" -yarn add @pangular-inspector/devtools @valor/nativescript-websockets -``` - -```bash group="install" name="bun" image="https://bun.sh/logo.svg" -bun add @pangular-inspector/devtools @valor/nativescript-websockets -``` - -## Step 2: Add a WebSocket global - -The overlay talks to the server over a WebSocket, and the NativeScript runtime has no `WebSocket` global. Import the polyfill first: - -```ts -// src/polyfills.ts -import '@valor/nativescript-websockets'; -``` - -## Step 3: Start the overlay - -```ts {2,4-6} -// src/main.ts -import {initNativeScriptOverlay} from '@pangular-inspector/devtools/overlay-nativescript'; - -if (__DEV__) { - initNativeScriptOverlay(); -} -``` - -Call it before `runNativeScriptAngularApp()`. The injector inspector relies on *Angular's injector profiler, which *Angular only wires while it creates the platform. See [Options](../getting-started/nativescript.md#options) for `baseURL`, `intervalMs` and `retryMs`. - -### Where the overlay connects - -| Target | Default URL | -| ---------------- | ------------------------ | -| iOS simulator | `http://localhost:9999/` | -| Android emulator | `http://10.0.2.2:9999/` | -| Physical device | Pass `{ baseURL }` | - -For a physical device, pass the address of your machine as `baseURL`. Android 9 and later and iOS App Transport Security block plain `http` to a LAN address, so allow it for development builds: set `android:usesCleartextTraffic="true"` in `AndroidManifest.xml`, and add an `NSAppTransportSecurity` exception for the address in `Info.plist`. - -## Step 4: Run the devtools server - -Run the server in the app's folder, so the source scanners read its `src/`: - -```bash -cd my-nativescript-app -npx @pangular-inspector/devtools dev --no-auth -``` - -The server listens on `localhost` only, which the iOS simulator and the Android emulator reach. `--no-auth` is needed because the app cannot enter the one-time code the panel asks for. - -| What | Where | -| ------------ | ----------------------------- | -| Devtools UI | `http://localhost:9999/` | -| MCP endpoint | `http://localhost:9999/__mcp` | - -A physical device reaches your machine over the network, so the server has to listen on an interface the device can reach: - -```bash -npx @pangular-inspector/devtools dev --host 192.168.1.20 --allowed-origin http://192.168.1.20:9999 --no-auth -``` - -The server then listens on that address only, not on `localhost`, so open the panel at `http://192.168.1.20:9999/`. `--allowed-origin` lets the panel's own origin through there. Use your machine's address and the server's port. - - - With --host and --no-auth, every host that can reach that address can call the devtools RPC and MCP endpoints without a code. Use it on a trusted network only. Binding to the one address the device uses, as above, keeps the server off your other interfaces, which 0.0.0.0 would not. - - -See [Standalone CLI](../getting-started/cli.md) for the other server options and [Security](../security.md) for what `--no-auth` turns off. - -## Try the demo - -`examples/nativescript` is a `ns create --ng` project wired up this way, with a small showcase component (signals, a computed, an effect and a component-level provider). It is tested on the iOS simulator. Android is untested. - -The demo maps `@pangular-inspector/devtools/*` to the package's build output in `packages/devtools/dist`, so build the package first: - -```bash -pnpm devtools:build-pkg -pnpm devtools:nativescript -cd examples/nativescript && npm install && ns debug ios --no-hmr -``` - -`pnpm devtools:nativescript` starts the devtools server on `localhost`, scanning `examples/nativescript/src`. For a physical device, `pnpm devtools:nativescript:device` listens on every interface instead, with the same warning as above. - -## Where to next - - - - - - - diff --git a/apps/docs/src/content/guides/ssr-http.md b/apps/docs/src/content/guides/ssr-http.md index c1ed8cfe..483bcfee 100644 --- a/apps/docs/src/content/guides/ssr-http.md +++ b/apps/docs/src/content/guides/ssr-http.md @@ -190,5 +190,5 @@ Open `http://localhost:4000/examples/http`. See [Demo apps](../contributing/demo - + diff --git a/apps/docs/src/content/inspectors/analog.md b/apps/docs/src/content/inspectors/analog.md index c3e945a9..4b9fb437 100644 --- a/apps/docs/src/content/inspectors/analog.md +++ b/apps/docs/src/content/inspectors/analog.md @@ -19,7 +19,7 @@ The Analog dock is always in the rail. In other apps it shows a **This app doesn ### Add the plugin -Add the Vite plugin next to `analog()` and load the overlay. See [Vite and Analog](../getting-started/vite.md) and the [Analog guide](../guides/analog.md). +Add the Vite plugin next to `analog()`. It also loads the overlay into your pages. See [Vite and Analog](../getting-started/vite.md). ```ts {3,7} // vite.config.ts @@ -101,7 +101,7 @@ Checks grouped by rule, each with a fix. The count on the tab adds up errors and - Prerender entries that match nothing. - A `vite.config` the scan could not read in full (rule `config-partial`). See [Config the scan cannot read](#config-the-scan-cannot-read). - Frontmatter errors, duplicate slugs, and content that shadows a page. -- From the live page: `load()` fetched twice, server function reads called again after hydration, hydration errors, API routes not found, and added pages that need a restart. To catch hydration errors from the first load, add `providePangularHttp()` (see [Set up Analog](../guides/analog.md#catch-hydration-errors-from-the-first-load)). +- From the live page: `load()` fetched twice, server function reads called again after hydration, hydration errors, API routes not found, and added pages that need a restart. To catch hydration errors from the first load, add `providePangularHttp()` (see [Catch hydration errors from the first load](../getting-started/vite.md#catch-hydration-errors-from-the-first-load)). ## Where the data comes from @@ -244,11 +244,8 @@ The server keeps the last 200 calls of all tabs, and the **Server** tab renders ## Where to next - - Install, add the plugin and load the overlay. - - The Vite plugin and its options. + Install the package, add the Vite plugin and trace server renders. The TransferState payload, with Analog entries decoded. diff --git a/apps/docs/src/content/inspectors/ssr-http.md b/apps/docs/src/content/inspectors/ssr-http.md index e629d855..306b17a3 100644 --- a/apps/docs/src/content/inspectors/ssr-http.md +++ b/apps/docs/src/content/inspectors/ssr-http.md @@ -52,7 +52,7 @@ app.use(devtools.ssrMiddleware); If the server uses `compression()`, mount `ssrMiddleware` after it. Mounted the other way round, the body is already compressed when `ssrMiddleware` sees it, so the render mode can't be read and **Edit TransferState** can't apply. The request detail then says so. -If your server takes web-standard handlers, as Hono, h3 and Nitro do, wrap the Angular handler with `withPangularSsr()` from `@pangular-inspector/devtools/ssr` instead. It records the same data. For Fastify and Analog, the same entry point has a Node tracer. See [Trace SSR renders](../getting-started/other-servers.md#trace-ssr-renders) and [Set up Analog](../guides/analog.md#trace-server-renders). +If your server takes web-standard handlers, as Hono, h3 and Nitro do, wrap the Angular handler with `withPangularSsr()` from `@pangular-inspector/devtools/ssr` instead. It records the same data. For Fastify and Analog, the same entry point has a Node tracer. See [Trace SSR renders](../getting-started/other-servers.md#trace-ssr-renders) and [Trace server renders](../getting-started/vite.md#trace-server-renders). ## What it shows @@ -73,7 +73,7 @@ The request that served the selected page opens on its own. Click another row to The middleware gives each request an id. The id reaches the render in the `x-pangular-ssr-id` request header, so the interceptor tags each server call with it. It goes back to the browser in a `Server-Timing` header (`pangular;desc=""`, `render;dur=...`, `fetch;dur=...`, and `guards;dur=...` and `resolve;dur=...` when the router ran them), so the overlay links the page to the render, and the browser's own Network panel shows the same times. -A render without the `REQUEST` token from `@angular/core`, as in Analog, has no header to read. The tracer keeps the id in the request's async context instead (Node's `AsyncLocalStorage`), so each server call is linked to the request it ran under, even when several renders run at the same time. The calls of a render that is not traced are not linked to any request. A traced request with no activity for five minutes no longer counts as in flight. See [Set up Analog](../guides/analog.md#trace-server-renders). +A render without the `REQUEST` token from `@angular/core`, as in Analog, has no header to read. The tracer keeps the id in the request's async context instead (Node's `AsyncLocalStorage`), so each server call is linked to the request it ran under, even when several renders run at the same time. The calls of a render that is not traced are not linked to any request. A traced request with no activity for five minutes no longer counts as in flight. See [Trace server renders](../getting-started/vite.md#trace-server-renders). #### Render modes diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts index 6d4a0a23..92800557 100644 --- a/apps/docs/src/ngmd.config.ts +++ b/apps/docs/src/ngmd.config.ts @@ -191,6 +191,7 @@ const config: NgmdConfig = { {label: 'Chrome extension', href: '/getting-started/chrome-extension'}, {label: 'Angular Native', href: '/getting-started/angular-native'}, {label: 'NativeScript', href: '/getting-started/nativescript'}, + {label: 'Troubleshooting', href: '/getting-started/troubleshooting'}, ], }, { @@ -228,9 +229,6 @@ const config: NgmdConfig = { items: [ {label: 'Restore NgRx signal state', href: '/guides/ngrx-signals-restore'}, {label: 'Set up SSR & HTTP', href: '/guides/ssr-http'}, - {label: 'Set up Analog', href: '/guides/analog'}, - {label: 'Set up NativeScript', href: '/guides/nativescript'}, - {label: 'Set up Angular Native', href: '/guides/angular-native'}, {label: 'Set up Capacitor', href: '/guides/capacitor'}, {label: 'Write a plugin', href: '/guides/write-a-plugin'}, {label: 'Inspect, fix and verify', href: '/guides/inspect-fix-verify'}, diff --git a/examples/angular-native/README.md b/examples/angular-native/README.md index bfb23b1b..3e3162c3 100644 --- a/examples/angular-native/README.md +++ b/examples/angular-native/README.md @@ -57,4 +57,4 @@ If you restart the devtools server, the app reconnects within five seconds. Type-check the app with `npm run typecheck`. -The setup is explained in the [Set up Angular Native](../../apps/docs/src/content/guides/angular-native.md) guide. +The setup is explained on the [Angular Native](../../apps/docs/src/content/getting-started/angular-native.md) page. From d59167a1a6856d90d59131fdb04be4608b0d0d17 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 13:43:25 +0000 Subject: [PATCH 02/19] docs(docs): add one troubleshooting page indexed by symptom Only a few setup pages had a troubleshooting section, and the answers for the same symptom (no button, No devtools server found, a 403, an empty tab) were spread over Express, Hono, the popup and the inspector FAQs. Vite, the CLI, MCP and the Chrome extension had none. Add a Troubleshooting page that starts from what the reader sees, sends each symptom to the page that covers it, and lists the questions the inspector FAQs answer. Every setup page and the MCP server page link to it from their own troubleshooting or FAQ section. --- apps/docs/src/content/agents/mcp-server.md | 4 + .../getting-started/chrome-extension.md | 2 + apps/docs/src/content/getting-started/cli.md | 2 + .../content/getting-started/installation.md | 2 + .../content/getting-started/other-servers.md | 2 + .../src/content/getting-started/overlay.md | 2 + .../content/getting-started/quick-start.md | 2 + .../getting-started/troubleshooting.md | 168 ++++++++++++++++++ apps/docs/src/content/guides/capacitor.md | 2 + 9 files changed, 186 insertions(+) create mode 100644 apps/docs/src/content/getting-started/troubleshooting.md diff --git a/apps/docs/src/content/agents/mcp-server.md b/apps/docs/src/content/agents/mcp-server.md index 38ca19af..1ef86aa0 100644 --- a/apps/docs/src/content/agents/mcp-server.md +++ b/apps/docs/src/content/agents/mcp-server.md @@ -307,6 +307,10 @@ Your client can ask you before it runs them. To drop them from the server, set ` Each browser tab reports on its own and gets a page id, and so does an [Angular Native](../getting-started/angular-native.md) or [NativeScript](../getting-started/nativescript.md) app. `list-pages` lists them with their platform. Without `page`, every tool that reads live data uses the same default page, the first row of `list-pages`, and names it in its answer. [The page argument](./tools.md#the-page-argument) gives the rule and the tools that pick a page another way. Pass `page` to pick another tab. An id that no tab reports gets an answer that lists the tabs that do, instead of data from another tab. The server drops pages that stop reporting after a short time. +## Troubleshooting + +If the HTTP endpoint answers `401` or `403`, see [The MCP endpoint answers 401 or 403](../getting-started/troubleshooting.md#the-mcp-endpoint-answers-401-or-403). If a tool says no page reports its data, open the app in a development build with the overlay loaded, as in [The tabs stay empty](../getting-started/troubleshooting.md#the-tabs-stay-empty). + ## Where to next diff --git a/apps/docs/src/content/getting-started/chrome-extension.md b/apps/docs/src/content/getting-started/chrome-extension.md index b7d723fe..4a69ec18 100644 --- a/apps/docs/src/content/getting-started/chrome-extension.md +++ b/apps/docs/src/content/getting-started/chrome-extension.md @@ -193,6 +193,8 @@ The extension has no content scripts, so it runs nothing in the pages you browse ## FAQ +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + The page did not look like an Angular app within about five seconds of opening DevTools. Check that it renders an ng-version attribute or exposes window.ng, which development builds do. If the page shows a prompt for the one-time code, the extension cannot check the page until you answer or close the prompt. Then close and reopen DevTools, or reload the page. diff --git a/apps/docs/src/content/getting-started/cli.md b/apps/docs/src/content/getting-started/cli.md index e7871d0a..22538d5f 100644 --- a/apps/docs/src/content/getting-started/cli.md +++ b/apps/docs/src/content/getting-started/cli.md @@ -254,6 +254,8 @@ The SARIF output is a SARIF 2.1.0 log with one run. Rule ids are the lint and th ## FAQ +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + No. dev, build, mcp and lint read your source files. Only live data needs a running app with the overlay loaded. diff --git a/apps/docs/src/content/getting-started/installation.md b/apps/docs/src/content/getting-started/installation.md index d8410af2..7c7ae460 100644 --- a/apps/docs/src/content/getting-started/installation.md +++ b/apps/docs/src/content/getting-started/installation.md @@ -313,6 +313,8 @@ The [Chrome extension](./chrome-extension.md) adds a panel to Chrome DevTools. I ## FAQ +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + No. The package depends on Devframe and re-exports initDevframe from @pangular-inspector/devtools/devframe, for example to mount only the panel. Import it from there, so the panel and the devframe definition come from the same Devframe copy. diff --git a/apps/docs/src/content/getting-started/other-servers.md b/apps/docs/src/content/getting-started/other-servers.md index 20d96f90..79a159e5 100644 --- a/apps/docs/src/content/getting-started/other-servers.md +++ b/apps/docs/src/content/getting-started/other-servers.md @@ -237,6 +237,8 @@ The hub is off when `NODE_ENV` is `production`. `handler` then answers 404, `att ## Troubleshooting +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + devtools.handler is mounted on a route that matches more than devtools.base. It answers 404 outside the base and doesn't fall through. Mount it on `${devtools.base}*` (Hono) or `${devtools.base}**` (h3). diff --git a/apps/docs/src/content/getting-started/overlay.md b/apps/docs/src/content/getting-started/overlay.md index be5eb6fa..5ffccf5b 100644 --- a/apps/docs/src/content/getting-started/overlay.md +++ b/apps/docs/src/content/getting-started/overlay.md @@ -284,6 +284,8 @@ While you pick an element on the page, the box follows the pointer and clears wh ## FAQ +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + No. The overlay adds the floating button itself. See Popup and hub. diff --git a/apps/docs/src/content/getting-started/quick-start.md b/apps/docs/src/content/getting-started/quick-start.md index f92dc8d4..36502f5a 100644 --- a/apps/docs/src/content/getting-started/quick-start.md +++ b/apps/docs/src/content/getting-started/quick-start.md @@ -116,6 +116,8 @@ To see the panel on a page of its own, open `http://localhost:4200/__devframes/` ## Troubleshooting +The [troubleshooting page](./troubleshooting.md) lists the problems every setup shares, by symptom. + The app is probably a production build. ng build uses the production configuration by default, and the overlay import never runs there. Use ng serve, or build with --configuration development. Then check that main.ts imports the overlay. diff --git a/apps/docs/src/content/getting-started/troubleshooting.md b/apps/docs/src/content/getting-started/troubleshooting.md new file mode 100644 index 00000000..fb3f9ef6 --- /dev/null +++ b/apps/docs/src/content/getting-started/troubleshooting.md @@ -0,0 +1,168 @@ +--- +title: Troubleshooting +description: Find the cause of a missing button, an empty tab, a refused request or a stuck connection by its symptom, in every setup. +--- + + + Problems every setup shares, sorted by what you see. Each answer links to the page that covers it in full. + + +# Troubleshooting + +Find what you see in the table, then read its section. Problems that only one setup has stay on that setup's page, in its **Troubleshooting** or **FAQ** section. The table at the end of this page lists the questions the inspector pages answer. + +## Find your symptom + +| What you see | Read | +| -------------------------------------------------------- | --------------------------------------------------------------------------- | +| No floating button on the page | [The button does not appear](#the-button-does-not-appear) | +| **No devtools server found** in the panel or the console | [No devtools server found](#no-devtools-server-found) | +| **Disconnected** or **Connecting…** in the panel header | [The panel says Disconnected](#the-panel-says-disconnected) | +| A dialog that asks for a code | [The panel asks for a one-time code](#the-panel-asks-for-a-one-time-code) | +| `403 Forbidden` from the devtools | [The devtools answer 403](#the-devtools-answer-403) | +| `401` from the MCP endpoint | [The MCP endpoint answers 401 or 403](#the-mcp-endpoint-answers-401-or-403) | +| The header shows **Live**, but the tabs are empty | [The tabs stay empty](#the-tabs-stay-empty) | +| A tab lists source files instead of the running app | [A tab shows source data only](#a-tab-shows-source-data-only) | +| **Page in background, showing the last data.** | [The data stops changing](#the-data-stops-changing) | +| A tab or dock is missing | [A tab is missing](#a-tab-is-missing) | +| A tab or tool names an Angular version it needs | [A feature needs a newer Angular](#a-feature-needs-a-newer-angular) | +| The CLI prints another port than 9999 | [Port 9999 is taken](#port-9999-is-taken) | +| An app on a phone, simulator or emulator never shows | [A device app never connects](#a-device-app-never-connects) | + +## The button and the panel + +### The button does not appear + +The app is probably a production build. `ng build` uses the production configuration by default, and the overlay import in `main.ts` runs only while `ngDevMode` is on. Run `ng serve`, or build with `--configuration development`. Then check that `main.ts` imports the overlay, as [Load it in development](./overlay.md#load-it-in-development) shows. + +With the [Vite plugin](./vite.md), `main.ts` needs no import: the plugin adds the overlay to the pages the dev server transforms. If your framework renders HTML without Vite's `transformIndexHtml`, [load the overlay yourself](./vite.md#load-the-overlay-yourself). + +### No devtools server found + +The overlay found no server part. It logs an error that starts with `[pangular] No devtools server found` and lists the paths it tried, and the panel says **No devtools server found**. + +| Cause | Fix | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| No server part is mounted, for example plain `ng serve` without SSR | Mount `initPangularHub()` in `server.ts`, or run the [client-only setup](./installation.md#client-only-angular-cli-app). | +| The hub is mounted after `express.static` or the SSR handler | Move `app.use(devtools.nodeMiddleware)` above them. See [Middleware order](./express.md#middleware-order). | +| The hub runs on a custom `base` | Pass `pangular/` to [`initOverlay`](./overlay.md#a-custom-mount-path). | + +[No devtools server found](./overlay.md#no-devtools-server-found) on the overlay page lists the paths the overlay tries. + +### The panel says Disconnected + +The panel lost the server, or never reached it. It tries again after 1, 2, 5 and then every 10 seconds, so a dev server that restarts connects without a reload. Click **Retry now** to try at once. If it stays disconnected, check that the server runs and that the hub is mounted before `express.static` and the SSR handler. See [Connection status](./popup-and-hub.md#connection-status). + +If the panel does not connect at all with Hono, h3 or Fastify, the hub advertises a WebSocket that no upgrade reaches. Pass `ws: false`, pass `ws: {sidecar: true}`, or call `devtools.attach(server)`. See [Hono, h3 and Fastify](./other-servers.md#troubleshooting). + +## Access and the one-time code + +### The panel asks for a one-time code + +The server has the one-time code on, which is the default for the Vite plugin, the Express hub and the CLI. Type the code the server printed in its terminal. A browser reads data only after it exchanges the code, so the tabs stay empty until you do. + +If the dialog keeps coming back, the app's origin changed, its storage was cleared, or the code expired before you typed it. A code lasts 5 minutes. Type the newest code the server printed. Too many wrong codes lock the server until it restarts. See [One-time code](../security.md#one-time-code). + +In a client-only Angular CLI app, start the CLI with `--proxy-origin`, so the link it prints opens on your app's origin. See [Client-only Angular CLI app](./installation.md#client-only-angular-cli-app). + +### The devtools answer 403 + +The request did not come from this machine, was sent to a host the server doesn't trust, or came from an origin it doesn't trust. The terminal names a refused origin or host. + +| Setup | Fix | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Any | Open the app on `localhost` or `127.0.0.1`, not on a LAN address or another host name. | +| Vite plugin | List a local host name in `server.allowedHosts`, or add the origin to `allowedOrigins`. See [Hostnames other than localhost](./vite.md#hostnames-other-than-localhost). | +| Express hub | Add the origin to `allowedOrigins`. See [Access control](./express.md#access-control). | +| Another device on Wi-Fi | Pass `allowLan: true` and list the page's origin in `allowedOrigins`. Keep the one-time code on. | +| Chrome extension | A build with another extension ID needs its origin in `allowedOrigins`. See [Server origin](./chrome-extension.md#server-origin). | + +[Access and redaction](../security.md) covers every check. + +### Every app route answers 404 + +This happens with Hono and h3: `devtools.handler` is mounted on a route that matches more than `devtools.base`. It answers 404 outside the base and doesn't fall through. Mount it on the base path only, as [Hono, h3 and Fastify](./other-servers.md#troubleshooting) shows. + +## Empty or missing data + +### The tabs stay empty + +| Cause | Fix | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | +| The one-time code was not exchanged | Type the code from the terminal. The header shows **Live** once the panel is connected. | +| The page is a production build | Production builds leave out `window.ng`, which the overlay reads. Run a development build. | +| No page with the overlay is open | Open the app in a browser tab. The live tabs read the pages that report to the server. | +| The tab reads another page than you expect | Pick the page in the tab's page picker, where it has one. Agents read the [default page](../agents/tools.md#the-page-argument). | + +Some tabs need more than a connected page. The **SSR & HTTP** tab needs the providers in [Fill the SSR & HTTP tab](./express.md#fill-the-ssr-http-tab), and the [timeline](../inspectors/timeline.md) shows change detection only while a recording runs. + +### A tab shows source data only + +The **Components** and **Injectors** tabs fall back to what the source scan finds when no live tree reached them. No page is connected, or the connected page is a production build. Open the app in a development build with the overlay loaded. The [Dashboard](../inspectors/dashboard.md) fills its source cards from the scan without a page. + +### The data stops changing + +A browser tab in the background runs its timers about once a minute, so the page stops reading itself while it is hidden. The panel says **Page in background, showing the last data.** Switch back to the tab and it sends fresh data. The server drops a hidden tab that stops answering for 5 minutes. See [Tabs in the background](./popup-and-hub.md#tabs-in-the-background). + +### A tab is missing + +| Cause | Fix | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| The inspector is turned off with `inspectors` | Remove `false` for it. A tab you open while it is off names the option. See [Inspectors and agent tools](./configuration.md#inspectors-and-agent-tools). | +| You hid the tab in **Settings** | Turn it back on under tab visibility. See [Settings](./settings.md). | +| The **Analog** tab outside an Analog app | Without the hub, the tab appears only when `package.json` depends on `@analogjs/platform` or `@analogjs/router`. | + +### A feature needs a newer Angular + +The overlay reads Angular's debug API, which grows with each release. A tab that needs a missing API names the Angular version it needs and the version the page runs, and agent tools answer **Unsupported on this Angular version**. [Supported Angular versions](./installation.md#supported-angular-versions) lists the minimum version of each feature. + +## Servers and ports + +### Port 9999 is taken + +Without `--port`, the standalone CLI listens on 9999, or on a free port if 9999 is taken, and prints the port it uses. Use the URLs it prints. With `--port`, a taken port stops the server with an error. See [Dev server flags](./cli.md#dev-server-flags). + +### The MCP endpoint answers 401 or 403 + +The HTTP endpoint needs a local `Origin` header, and a bearer token while the one-time code is on. A request without the header gets `403`, and one without the right token gets `401`. The token is in `~/.pangular-inspector/mcp-token`. See [Send an Origin header](../agents/mcp-server.md#send-an-origin-header) and [Send a token](../agents/mcp-server.md#send-a-token). The stdio server needs neither. + +### vite build fails with an h3 error under pnpm + +`@analogjs/vite-plugin-nitro` imports `h3` without declaring it, so pnpm can resolve the `h3` 2 this package brings instead of the `h3` 1 Analog needs. Declare it with `packageExtensions`, as [If the build fails under pnpm](./vite.md#if-the-build-fails-under-pnpm) shows. + +## A device app never connects + +An app on a phone, a simulator or an emulator reaches your machine over the network, and can't type the one-time code in every setup. Read the log of the app for a `[pangular]` line, then follow its setup page. + +| Platform | Read | +| -------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| NativeScript | [Where the overlay connects](./nativescript.md#where-the-overlay-connects) and [Troubleshooting](./nativescript.md#troubleshooting) | +| Angular Native | [Where the overlay connects](./angular-native.md#where-the-overlay-connects) and [Troubleshooting](./angular-native.md#troubleshooting) | +| Capacitor | [Troubleshooting](../guides/capacitor.md#troubleshooting) | + +## Questions the inspector pages answer + +| Question | Answer on | +| --------------------------------------------------------------- | --------------------------------------------------------------- | +| Why are the file and line of a component missing? | [Components FAQ](../inspectors/components.md#faq) | +| Why does the signal graph show another component? | [Signals FAQ](../inspectors/signals.md#faq) | +| Why is a constructor-injected service missing from source mode? | [Injectors FAQ](../inspectors/injectors.md#faq) | +| Why can't I restore an NgRx entry? | [NgRx Store FAQ](../inspectors/ngrx-store.md#faq) | +| Why does the Forms tab say no forms on this page? | [Forms FAQ](../inspectors/forms.md#faq) | +| Why does a navigation list guards but no verdicts? | [Router FAQ](../inspectors/router.md#faq) | +| Why does `explain-pipe` return no call data? | [Pipes FAQ](../inspectors/pipes.md#faq) | +| Why are there no SSR rows? | [SSR & HTTP FAQ](../inspectors/ssr-http.md#faq) | +| Why is there no Analog tab? | [Analog FAQ](../inspectors/analog.md#faq) | +| Why is the Capacitor call list empty on the web? | [Capacitor FAQ](../inspectors/capacitor.md#faq) | +| Why does an error have no component? | [Errors FAQ](../inspectors/errors.md#faq) | +| Why is the timeline empty? | [Timeline limits](../inspectors/timeline.md#limits-and-gotchas) | +| Why does the Chrome extension panel not appear? | [Chrome extension FAQ](./chrome-extension.md#faq) | + +## Where to next + + + + + + + diff --git a/apps/docs/src/content/guides/capacitor.md b/apps/docs/src/content/guides/capacitor.md index 16ddab80..6f91a6f8 100644 --- a/apps/docs/src/content/guides/capacitor.md +++ b/apps/docs/src/content/guides/capacitor.md @@ -216,6 +216,8 @@ These keys are the same in Capacitor 6, 7 and 8. Keep the development ones out o ## Troubleshooting +The [troubleshooting page](../getting-started/troubleshooting.md) lists the problems every setup shares, by symptom. + Inspect the WebView, with Safari's Develop menu for iOS or chrome://inspect for Android, and read the console. [pangular] No devtools server found in a bundled build means connectionMeta is missing, or the WebView blocked the request. A Mixed Content message next to it means allowMixedContent is off, and a cleartext error means server.cleartext is. In both cases the overlay sends nothing. A failed connection to the address means the server is not running, listens only on localhost, or the address is wrong for where the app runs. A 403 under live reload over Wi-Fi means the page's origin is missing from allowedOrigins. A 400 page with is not allowed under SSR means the address is missing from Angular's security.allowedHosts, as in Live reload over Wi-Fi. From 9706a9664d96fe15b00ed27346ab01db98a032a8 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 13:54:36 +0000 Subject: [PATCH 03/19] docs(docs): add a supported setups matrix and builder list The installation page said nothing on which builders work, and nothing on what the weekly install check proves, so a reader with webpack, Nx or a plain Vite config had to guess. Add a Supported setups section at the top of the page: one row per setup with its dev server, server part, number of steps and whether the weekly install check covers it, a table of builders, and the cells that e2e.yml runs from scripts/e2e-install.mjs. Setups the check doesn't run, such as webpack, Nx executors and Rsbuild, say so instead of claiming support. --- .../content/getting-started/installation.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/apps/docs/src/content/getting-started/installation.md b/apps/docs/src/content/getting-started/installation.md index 7c7ae460..dcff1439 100644 --- a/apps/docs/src/content/getting-started/installation.md +++ b/apps/docs/src/content/getting-started/installation.md @@ -29,6 +29,49 @@ The devtools ship as one npm package, `@pangular-inspector/devtools`. It contain Live data comes from Angular's debug API (window.ng). Production builds remove it, so the live tabs stay empty there. Run your app in development mode while you inspect it. +## Supported setups + +Every setup has a server part, which serves the panel, and the [overlay](./overlay.md), which sends live data from your page. Find your app in the table, then follow its page. + +| Your app | Dev server or builder | Server part | Steps | Install check | +| ---------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------- | ------ | ------------- | +| Angular CLI with SSR | `ng serve` or the built SSR server (`@angular/build`) | [`initPangularHub()` in `server.ts`](./express.md) | 3 | Weekly | +| Angular CLI without SSR | `ng serve` with a proxy (`@angular/build`) | [Standalone CLI next to `ng serve`](#client-only-angular-cli-app) | 5 | Weekly | +| Analog | Vite | [Vite plugin](./vite.md) | 2 | Weekly | +| Another Angular app with its own `vite.config` | Vite | [Vite plugin](./vite.md) | 2 | No | +| Angular SSR on Hono, h3 or Fastify | Your server | [`initPangularHub()` handler](./other-servers.md) | 3 | No | +| Your source files, with no app running | None | [Standalone CLI](./cli.md) | 1 | Weekly | +| NativeScript, Angular Native or Capacitor | The platform's own tooling | Standalone CLI or a hub | 3 to 4 | No | + +Steps count what you add to the app, from the install to the first **Live** panel. The [Chrome extension](./chrome-extension.md) works on top of any setup with a browser page and adds no server part. [Platforms](./platforms.md) lists the device targets and what is checked on each. + +### Builders + +The builder bundles your app and the overlay import in `main.ts`. Only the Vite plugin plugs into it. The other server parts run in your server or in the standalone CLI. + +| Builder | Status | +| ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@angular/build:application` and `@angular/build:dev-server` | Supported. The weekly install check runs it on Angular 20.3, 21 and 22, with and without SSR. | +| Vite, through `@analogjs/platform` | Supported. The weekly install check runs a fresh Analog app. | +| Vite, with your own `vite.config` | Supported through the same plugin, but not tested. The Angular CLI dev server does not accept Vite plugins, so `ng serve` apps use the hub or the CLI instead. | +| `@angular-devkit/build-angular:browser` (webpack) | Supported, but not in the install check. Load the overlay in `main.ts` and run the standalone CLI next to `ng serve`, or the Express hub for an SSR app. See [Setup on Angular 12 to 19](#setup-on-angular-12-to-19). | +| Nx executors | Not tested. The standalone CLI reads every `project.json` of the workspace, see [Nx workspaces](./cli.md#nx-workspaces). The rest depends on the builder the executor runs. | +| Rsbuild and other bundlers | Not tested. | + +### What the install check runs + +The weekly E2E workflow packs the package, publishes it to a local registry, installs it into fresh apps the way these pages say. Each cell with an app builds it, starts it, and opens the app and the panel in Chromium until the **Components** tab shows the app root. + +| Cell | App | Package managers | Angular | +| ------------------- | ---------------------------------------------------------------------------------------------- | ---------------- | --------------- | +| `angular-cli` | `ng new --ssr` with the Express hub, built for development and run on the SSR server | npm, pnpm | 20.3, 21 and 22 | +| `angular-cli-serve` | The same app under `ng serve` | npm, pnpm | 20.3, 21 and 22 | +| `angular-cli-nossr` | `ng new --ssr=false` with the standalone CLI behind the `ng serve` proxy | npm, pnpm | 20.3, 21 and 22 | +| `analog` | `create-analog` with the Vite plugin, built with `vite build`, then run on the Vite dev server | pnpm | The template's | +| `cli` | The standalone CLI with `npx`, its MCP endpoint and the static report | npm, pnpm | Newest | + +yarn and bun are not in the weekly run. [End-to-end scripts](../contributing/development.md#end-to-end-scripts) shows how to run the cells yourself. + ## Supported Angular versions The peer range covers Angular 12.2 and later, and CI tests it (see [Tested versions](#tested-versions)). The overlay checks each debug API on the page and sends what it finds with the page's Angular version, so each tab shows the data that version provides. Only the profiler also looks at the version: the overlay uses `ɵsetProfiler` from Angular 20.0, because before that it holds a single profiler. From 976c8cab6465b41886d056745bc3312cc0b73dd2 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 13:54:37 +0000 Subject: [PATCH 04/19] docs(docs): add a platforms page with the planned targets Capacitor, NativeScript and Angular Native were each described on their own setup page, and the planned platforms only showed up as rows on the roadmap, so nothing said where the devtools run today and what comes next. Add a Platforms page with each supported platform, how it reports, how it is checked and where it shows in the panel, and the planned platforms and extension stores with their tracking issues. The roadmap and the hub's setup docks link to it. --- .../src/content/getting-started/platforms.md | 58 +++++++++++++++++++ .../content/getting-started/popup-and-hub.md | 2 + apps/docs/src/content/roadmap.md | 14 +++-- apps/docs/src/ngmd.config.ts | 1 + 4 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 apps/docs/src/content/getting-started/platforms.md diff --git a/apps/docs/src/content/getting-started/platforms.md b/apps/docs/src/content/getting-started/platforms.md new file mode 100644 index 00000000..011e8979 --- /dev/null +++ b/apps/docs/src/content/getting-started/platforms.md @@ -0,0 +1,58 @@ +--- +title: Platforms +description: The browsers, devices and app frameworks the devtools inspect today, how each one is checked, and the platforms still planned with their tracking issues. +--- + + + Where an Angular app can run and still report to the devtools, and which platforms are planned next. + + +# Platforms + +The devtools read a running Angular app through its debug API, wherever it renders. A browser page runs the [browser overlay](./overlay.md). A platform without a DOM gets an overlay of its own that walks its view tree and sends the same reports. For the build tools and servers each setup uses, see [Supported setups](./installation.md#supported-setups). + +## Supported platforms + +| Platform | How it reports | How it is checked | Set up | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| Browser | The browser overlay, loaded in `main.ts` or by the Vite plugin | CI and the weekly install check, in Chromium | [Installation](./installation.md) | +| Chrome DevTools | The [Chrome extension](./chrome-extension.md) shows the panel for a page that already runs the overlay | Package tests of the extension bridge. You build and load the extension from the repository | [Chrome extension](./chrome-extension.md) | +| Capacitor and Ionic WebViews | The browser overlay in the WebView, or `overlay-manual` in a bundled build | Android emulators and the iOS simulator. Checks on real phones are tracked in [#337](https://github.com/pangular-inspector/devtools/issues/337) | [Set up Capacitor](../guides/capacitor.md) | +| NativeScript | `overlay-nativescript`, over a WebSocket | The demo in `examples/nativescript` on the iOS simulator. Android is untested | [NativeScript](./nativescript.md) | +| Angular Native | `overlay-angular-native`, over a WebSocket | Package tests against a simulated view tree. No automated test runs the demo on a device | [Angular Native](./angular-native.md) | + +A platform without a DOM has no picker, no axe pass and no Router, Forms or SSR & HTTP data. The NativeScript and Angular Native pages list [what needs a browser](./nativescript.md#what-needs-a-browser). + +## How a platform shows in the panel + +| Platform | Where its data shows | +| -------------- | ------------------------------------------------------------------------------------ | +| Browser | Every tab, scoped to the page you pick. | +| Capacitor | Every tab, like a browser tab, and the **Capacitor** tab for plugin calls. | +| NativeScript | The tabs it fills, in the **Angular** dock or the CLI panel without `?view`. | +| Angular Native | The **Angular Native** view (`?view=angular-native`), and the panel without `?view`. | + +The hub's **NativeScript** dock always shows the setup steps and a link to the setup page. The **Capacitor** dock shows them while no Capacitor app reports, and the **Angular Native** view says **No Angular Native app is connected** while none does. `list-pages` gives each page's platform to agents. See [list-pages](../agents/tools.md#list-pages). + +## Planned + +Plans follow feedback. To ask for a platform, or to move one up, comment on its issue. + +| Platform or channel | What it adds | Issue | +| --------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| Ionic | Ionic apps on top of the Capacitor support, and what only Ionic has, such as its page stack. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | +| Other app frameworks | One core and an adapter per framework, after the mobile platforms. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | +| Chrome Web Store and Edge Add-ons | The extension installed from a store, instead of built from the repository. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | +| Firefox | A build of the extension for Firefox. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | + +The [roadmap](../roadmap.md) lists the rest of the planned work. + +## Where to next + + + + + + + + diff --git a/apps/docs/src/content/getting-started/popup-and-hub.md b/apps/docs/src/content/getting-started/popup-and-hub.md index a3f6de90..fcb3e3a7 100644 --- a/apps/docs/src/content/getting-started/popup-and-hub.md +++ b/apps/docs/src/content/getting-started/popup-and-hub.md @@ -175,6 +175,8 @@ The Analog, Angular Native and Capacitor docks open setup steps when their tool | Angular Native | `Angular Native: no app connected` | An Angular Native app reports | | Capacitor | `Capacitor: no app connected` | A Capacitor app reports | +The setup steps of the Angular Native, NativeScript and Capacitor docks end with a **Supported and planned platforms** link to [Platforms](./platforms.md). + The tooltip comes back when the app stops reporting and its data expires. The Angular and NgRx docks always have data. The NativeScript dock always shows setup steps, because a NativeScript app's data shows in the Angular dock, so its tooltip stays **NativeScript**. ### Messages and badges diff --git a/apps/docs/src/content/roadmap.md b/apps/docs/src/content/roadmap.md index 98b203eb..01803b3f 100644 --- a/apps/docs/src/content/roadmap.md +++ b/apps/docs/src/content/roadmap.md @@ -17,12 +17,12 @@ Plans follow feedback. To ask for something, or to move an item up, comment on i ### Inspection and agents -| Feature | Read more | -| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| Agent tools over MCP for the live app | [Tools](./agents/tools.md) | -| NgRx and SignalStore time travel | [Restore an earlier state](./inspectors/ngrx-store.md#restore-an-earlier-state) | -| Why a form is invalid, for you and agents | [Forms agent tools](./inspectors/forms.md#agent-tools) | -| Mobile apps | [Capacitor](./inspectors/capacitor.md), [NativeScript](./getting-started/nativescript.md), [Angular Native](./getting-started/angular-native.md) | +| Feature | Read more | +| ----------------------------------------- | ------------------------------------------------------------------------------- | +| Agent tools over MCP for the live app | [Tools](./agents/tools.md) | +| NgRx and SignalStore time travel | [Restore an earlier state](./inspectors/ngrx-store.md#restore-an-earlier-state) | +| Why a form is invalid, for you and agents | [Forms agent tools](./inspectors/forms.md#agent-tools) | +| Mobile apps | [Platforms](./getting-started/platforms.md) | ### Setup and workflow @@ -86,6 +86,8 @@ These items remain from phase 3, [#342](https://github.com/pangular-inspector/de | Extension stores | The Chrome extension in the Chrome Web Store and Edge Add-ons, and a Firefox build. | [#342](https://github.com/pangular-inspector/devtools/issues/342) | | Ionic support | Ionic apps, on top of the Capacitor support. | [#307](https://github.com/pangular-inspector/devtools/issues/307) | +[Platforms](./getting-started/platforms.md#planned) lists the planned platforms and extension stores together. + ## Fixes and improvements per inspector Besides the phases, issues [#366](https://github.com/pangular-inspector/devtools/issues/366) through [#373](https://github.com/pangular-inspector/devtools/issues/373) track the open audit findings and proposed improvements for each inspector and the package. Pull requests for any of them are welcome. Start with [Development setup](./contributing/development.md). diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts index 92800557..7a74c32a 100644 --- a/apps/docs/src/ngmd.config.ts +++ b/apps/docs/src/ngmd.config.ts @@ -191,6 +191,7 @@ const config: NgmdConfig = { {label: 'Chrome extension', href: '/getting-started/chrome-extension'}, {label: 'Angular Native', href: '/getting-started/angular-native'}, {label: 'NativeScript', href: '/getting-started/nativescript'}, + {label: 'Platforms', href: '/getting-started/platforms'}, {label: 'Troubleshooting', href: '/getting-started/troubleshooting'}, ], }, From 93d817b8ab619280af26f0ae485df8dc1b60cdc3 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 13:54:49 +0000 Subject: [PATCH 05/19] feat(ui): link the setup views to the platforms page The NativeScript, Angular Native and Capacitor setup views only linked to their own setup guide, and the NativeScript and Angular Native links pointed at guide pages that merged into Getting Started. Point those links at the merged pages, and end each setup view with a "Supported and planned platforms" link to the docs Platforms page. The Analog notice keeps its link to the Analog docs. Rebuild extension/ui. --- app/src/__tests__/angular-native-view.test.ts | 4 ++- app/src/__tests__/capacitor-view.test.ts | 4 +++ app/src/app.ts | 4 +-- app/src/pages/coming-soon.ts | 30 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/app/src/__tests__/angular-native-view.test.ts b/app/src/__tests__/angular-native-view.test.ts index c6a7a157..ff1043a7 100644 --- a/app/src/__tests__/angular-native-view.test.ts +++ b/app/src/__tests__/angular-native-view.test.ts @@ -101,7 +101,9 @@ describe('Angular Native view', () => { expect(text).toContain('No Angular Native app is connected'); const link = host(fixture).querySelector('a.cta'); expect(link?.textContent).toContain('Set up Angular Native'); - expect(link?.href).toContain('guides/angular-native/'); + expect(link?.href).toContain('getting-started/angular-native/'); + const platforms = host(fixture).querySelector('.platforms a'); + expect(platforms?.href).toBe('https://pangular-inspector.dev/getting-started/platforms/'); expect(tabNames(fixture)).toEqual([]); }); diff --git a/app/src/__tests__/capacitor-view.test.ts b/app/src/__tests__/capacitor-view.test.ts index 05f62e5f..5be65d1e 100644 --- a/app/src/__tests__/capacitor-view.test.ts +++ b/app/src/__tests__/capacitor-view.test.ts @@ -158,6 +158,10 @@ describe('Capacitor view', () => { expect(link?.textContent).toContain('Capacitor setup guide'); expect(link?.href).toBe('https://pangular-inspector.dev/guides/capacitor/'); expect(link?.target).toBe('_blank'); + const platforms = el.querySelector('.platforms a'); + expect(platforms?.textContent).toContain('Supported and planned platforms'); + expect(platforms?.href).toBe('https://pangular-inspector.dev/getting-started/platforms/'); + expect(platforms?.target).toBe('_blank'); expect(el.textContent).not.toContain('Coming Soon'); expect(tabNames(fixture)).toEqual([]); }); diff --git a/app/src/app.ts b/app/src/app.ts index b4cb2f1c..332bcf67 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -128,7 +128,7 @@ const NATIVESCRIPT_SETUP: ComingSoonInfo = { ], link: { label: 'NativeScript setup guide', - href: 'https://pangular-inspector.dev/guides/nativescript/', + href: 'https://pangular-inspector.dev/getting-started/nativescript/', }, }; @@ -183,7 +183,7 @@ const NO_ANGULAR_NATIVE: ComingSoonInfo = { ], link: { label: 'Set up Angular Native', - href: 'https://pangular-inspector.dev/guides/angular-native/', + href: 'https://pangular-inspector.dev/getting-started/angular-native/', }, }; diff --git a/app/src/pages/coming-soon.ts b/app/src/pages/coming-soon.ts index 78a52173..444258da 100644 --- a/app/src/pages/coming-soon.ts +++ b/app/src/pages/coming-soon.ts @@ -12,6 +12,9 @@ export interface ComingSoonInfo { link?: { label: string; href: string }; } +/** The docs page that lists the supported platforms and the planned ones, with their issues. */ +export const PLATFORMS_URL = 'https://pangular-inspector.dev/getting-started/platforms/'; + @Component({ selector: 'app-coming-soon', host: { '[style.--brand]': 'info().color' }, @@ -111,6 +114,14 @@ export interface ComingSoonInfo {
  • {{ plan }}
  • } + + @if (info().id !== 'analog') { +

    + Supported and planned platforms (opens in a new tab) +

    + } `, styles: ` @@ -352,6 +363,24 @@ export interface ComingSoonInfo { background: var(--brand); box-shadow: 0 0 0 3px color-mix(in srgb, var(--brand) 20%, transparent); } + .platforms { + width: 100%; + max-width: 440px; + margin: 16px auto 0; + font-size: 13px; + text-align: left; + } + .platforms a { + color: var(--accent-text); + text-decoration: underline; + text-underline-offset: 2px; + } + .platforms a:hover { + color: var(--text-strong); + } + .platforms a:focus-visible { + @include m.focus-ring; + } @media (max-height: 640px) { .soon { padding-top: 12px; @@ -449,6 +478,7 @@ export interface ComingSoonInfo { }) export class ComingSoon { readonly info = input.required(); + protected readonly platformsUrl = PLATFORMS_URL; readonly plansTitle = computed(() => { const info = this.info(); return info.plansTitle ?? (info.link ? `In an ${info.name} app` : 'On the roadmap'); From c5ad745c2bc984700d05c183ba6a8bb9eb5f3a5a Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 14:28:02 +0000 Subject: [PATCH 06/19] docs(docs): add features, keyboard shortcuts and agent recipes pages Readers had no single tour of the tabs, the shortcuts were spread over the popup, command palette, settings and inspector pages, and the agent pages listed tools without saying which ones answer a common question. Add a Features page that walks every tab with its screenshot and what to open it for, a Keyboard shortcuts page that collects every shortcut with a link to where it is described, and Recipes for agents with prompts for an invalid form, a failed navigation, a missing provider, wasted change detection and checking a fix. --- apps/docs/src/content/agents/recipes.md | 98 +++++++++++++ .../src/content/getting-started/features.md | 132 ++++++++++++++++++ .../content/getting-started/introduction.md | 2 +- .../getting-started/keyboard-shortcuts.md | 70 ++++++++++ 4 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 apps/docs/src/content/agents/recipes.md create mode 100644 apps/docs/src/content/getting-started/features.md create mode 100644 apps/docs/src/content/getting-started/keyboard-shortcuts.md diff --git a/apps/docs/src/content/agents/recipes.md b/apps/docs/src/content/agents/recipes.md new file mode 100644 index 00000000..5c83577a --- /dev/null +++ b/apps/docs/src/content/agents/recipes.md @@ -0,0 +1,98 @@ +--- +title: Recipes for agents +description: Prompts to paste into Claude Code, Cursor or Copilot for common debugging tasks, with the agent tools each one leads to and what to check in the answer. +--- + + + Prompts for the questions developers ask most, with the tools an agent calls to answer them. + + +# Recipes for agents + +Each recipe is a prompt you paste into your coding agent, the agent tools it leads to, and what to check in the answer. The prompts work in any client that is connected to the [MCP server](./mcp-server.md), such as Claude Code, Cursor or VS Code with Copilot. Clients see the tools as `pangular_`. See [Names](./tools.md#names). + +Keep the app open in a development build with the overlay loaded while the agent works. The live tools read the pages that report to the server. If several tabs are open, ask the agent to call `list-pages` first and name the tab. + + + The HTTP endpoint also offers MCP prompts, such as fix-form and debug-error, which clients that support them show as slash commands. See Prompts. + + +## Debug an invalid form + +```text +The checkout form won't submit. Use the Pangular tools to find which fields make it +invalid and why, fix the cause in the code, then show me the form is valid. +``` + +| Step | Tool | +| --------------------------- | ------------------------------------------------------------- | +| Find the invalid fields | `explain-invalid-forms` | +| Look at one field | `explain-field` with `form` and `path` | +| See why submit does nothing | `explain-submit` | +| Prove the fix | `list-form-changes` for a marker, then `explain-form-changes` | + +Check that the answer names the failing validator and its message for each field, not only that the form is invalid. Values that look secret stay redacted. See [Forms](./tools.md#forms). + +## Explain a failed navigation + +```text +Clicking "My trips" sends me back to the home page. Use the Pangular tools to explain +the last navigations: who started them, which guard or redirect changed the URL, and why. +``` + +| Step | Tool | +| ---------------------------- | ------------------------------------------- | +| Read the recent navigations | `explain-navigation` | +| Read the current route | `inspect-route` | +| Time each guard and resolver | `record-guards`, then navigate again | +| Get a repro to keep | `explain-navigation` with `format: "repro"` | + +`record-guards` is an action tool, and the server tells agents to call action tools only when you ask for the change. Add "record the guards" to the prompt for the timing. Check that the answer names the guard verdict or the redirect behind each hop. See [Router](./tools.md#router). + +## Find a missing provider + +```text +The trip details page throws NG0201 for TripService. Use the Pangular tools to show where +Angular looked for it and why no injector provided it, then fix the providers. +``` + +| Step | Tool | +| ----------------------------- | -------------------------------------------------------------- | +| Find the error and its owner | `list-errors`, then `explain-error` with its `id` | +| Walk the lookup path | `explain-injection` with the owner as `injector` and the token | +| Read the providers at a level | `inspect-providers` | + +`explain-error` adds the missing provider explainer, and its owner id works as the `injector` of `explain-injection`. Check that the answer marks each injector on the path as **provides it**, **not provided** or **hidden**. See [explain-injection](./tools.md#explain-injection). + +## Find wasted change detection + +```text +Typing in the search box feels slow. Record change detection while I type, then use the +Pangular tools to tell me what triggered each check and which components ran for nothing. +``` + +| Step | Tool | +| -------------------------- | --------------------------- | +| Start and stop a recording | `record-change-detection` | +| Read the cycles | `change-detection` | +| Find the waste | `diagnose-change-detection` | + +The recording needs Angular 20 or later. Check that the answer names the trigger of each cycle and the checks that changed nothing. See [diagnose-change-detection](./tools.md#diagnose-change-detection). + +## Check that a fix worked + +```text +Before you change anything, take a Pangular audit of this page as a baseline. After the +fix, repeat the same steps, run the audit again and compare the two. +``` + +The agent calls `audit` with `session: "before"`, makes the change, repeats the same steps in the app and calls `audit` with `session: "after"`, which compares the two. [Inspect, fix and verify](../guides/inspect-fix-verify.md) walks through the loop, and the `verify-fix` prompt asks for it in one step. + +## Where to next + + + + + + + diff --git a/apps/docs/src/content/getting-started/features.md b/apps/docs/src/content/getting-started/features.md new file mode 100644 index 00000000..c23e569e --- /dev/null +++ b/apps/docs/src/content/getting-started/features.md @@ -0,0 +1,132 @@ +--- +title: Features +description: A tour of every tab in the panel, with a screenshot and what to open it for, plus what works outside the panel. +--- + + + Every tab in the panel, what it shows and when to open it. Each section links to the inspector page that covers it in full. + + +# Features + +Each tab of the panel is an inspector. It reads your source files, your running app, or both. Agents read the same data through the [agent tools](../agents/tools.md). The screenshots come from the [demo apps](../contributing/demo-apps.md). + +## App structure + +### Dashboard + +Get your bearings: the Angular and TypeScript versions, SSR, change detection mode and a count for each inspector, from the source scan and the live page. See [Dashboard](../inspectors/dashboard.md). + + + +### Components + +Find out what a component received and holds right now: its inputs, properties, outputs, injected services, defer blocks and `@for` blocks, with change detection recordings and leaks. See [Components](../inspectors/components.md). + + + +### Injectors + +See why an injection resolved to the provider it did, or failed: the injector hierarchy, the lookup path of a token and the providers at each level. See [Injectors](../inspectors/injectors.md). + + + +### Signals + +Follow a value through its producers and consumers in the live signal graph of a component or injector, with resources and a value history per signal. See [Signals](../inspectors/signals.md). + + + +### Pipes + +Check where custom, built-in and library pipes are used, how many instances are live, and record their calls. See [Pipes](../inspectors/pipes.md). + + + +## State and data + +### NgRx Store + +Read NgRx signal stores and @ngrx/store state with their change logs and diffs, restore an earlier state and dispatch actions. NGXS, Elf and MiniRx stores show too. See [NgRx Store](../inspectors/ngrx-store.md). + + + +### TanStack Query + +See each query and mutation with its status, freshness, observers, error and data, then invalidate or refetch it. See [TanStack Query](../inspectors/tanstack-query.md). + +### Forms + +Find out why a form is invalid or did not submit: each field with its state and errors, a change timeline and a lint. See [Forms](../inspectors/forms.md). + + + +## Navigation and the network + +### Router + +Explain a navigation: the live route, each navigation with its guards and resolvers, the route config and a route lint. See [Router](../inspectors/router.md). + + + +### SSR & HTTP + +Trace an HTTP call from the server render to the browser, inject faults, and read hydration stats and the TransferState payload. See [SSR & HTTP](../inspectors/ssr-http.md). + + + +### Timeline + +Put navigations, HTTP calls, NgRx actions, change detection, form events and signal changes on one time axis to see what happened in what order. See [Timeline](../inspectors/timeline.md). + + + +## Problems + +### Errors + +Read every error from the ErrorHandler, uncaught errors, unhandled rejections and the console, with the component that threw it, a docs link for NG0xxx codes and explainers for NG0100, hydration mismatches and missing providers. See [Errors](../inspectors/errors.md). + + + +### Audit + +Get one ranked list of what the inspectors found, an axe pass over the page, and a before and after comparison of a change. See [Audit](../inspectors/audit.md). + +## Frameworks and platforms + +### Analog + +Map an Analog URL to its page, layout and server files, and list server calls, render modes, content and lint. See [Analog](../inspectors/analog.md). + + + +### Capacitor + +Watch a Capacitor app's plugin calls and listeners, with the platform and the plugins its WebView reports. See [Capacitor](../inspectors/capacitor.md). + + + +## Outside the panel + +| Feature | What it does | Read more | +| --------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------- | +| Agent tools over *MCP | The same data and actions for a coding agent, over HTTP or stdio. | [MCP server](../agents/mcp-server.md) | +| Browser agents | Read-only tools registered on the page through WebMCP, off by default. | [Browser agents](../agents/browser-agents.md) | +| Standalone CLI | A local server, a static report, an MCP server and a lint export, without your app running. | [Standalone CLI](./cli.md) | +| Chrome extension | The panel inside Chrome DevTools, following the **Elements** panel. | [Chrome extension](./chrome-extension.md) | +| Command palette | Any tab or action from the keyboard. | [Command palette](./command-palette.md) | +| Plugins | A library's own tab and agent tools. | [Write a plugin](../guides/write-a-plugin.md) | + +## Which Angular version each feature needs + +Most tabs work from Angular 12.2. Some features read debug APIs that later releases added, such as the live signal graph (20.1) and change detection recording (20.0). [Supported Angular versions](./installation.md#supported-angular-versions) lists the minimum version of each feature. + +## Where to next + + + + + + + diff --git a/apps/docs/src/content/getting-started/introduction.md b/apps/docs/src/content/getting-started/introduction.md index e0f5ad81..8e2ac31a 100644 --- a/apps/docs/src/content/getting-started/introduction.md +++ b/apps/docs/src/content/getting-started/introduction.md @@ -21,7 +21,7 @@ The same tool runs in several places. It is built with *Devframe, so one definit ### Live inspectors -These tabs read the running page through Angular's debug API. They need a development build. +These tabs read the running page through Angular's debug API. They need a development build. [Features](./features.md) shows each tab with a screenshot. diff --git a/apps/docs/src/content/getting-started/keyboard-shortcuts.md b/apps/docs/src/content/getting-started/keyboard-shortcuts.md new file mode 100644 index 00000000..71b45ce7 --- /dev/null +++ b/apps/docs/src/content/getting-started/keyboard-shortcuts.md @@ -0,0 +1,70 @@ +--- +title: Keyboard shortcuts +description: Every keyboard shortcut of the popup, the panel, the command palette and the inspector tabs, on one page. +--- + + + The keys that open the popup and the command palette, and the keys each tab answers. Each table links to the page that describes it. + + +# Keyboard shortcuts + +Use Cmd on macOS where a shortcut says Ctrl. Every control the shortcuts reach also has a button or a link, so the mouse and a screen reader get the same actions. + +## On your app's page + +| Keys | What it does | +| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| Alt+Shift+P | Opens or closes the popup anywhere on the page. [`popup.hotkey`](./configuration.md#popup) sets another shortcut, or `false` turns it off. | +| Enter or Space | Opens the panel from the focused floating button, and moves focus into the panel. | +| Arrow keys on the floating button | Move the button. Hold Shift to move it further. | +| Alt+click while picking | Picks the component and also opens its file in your editor, in a development build. Option+click on macOS. | +| Escape | Stops picking a component or a form field, in the app or in the panel. | + +See [Keyboard and mouse](./popup-and-hub.md#keyboard-and-mouse) and [Pick a component on the page](../inspectors/components.md#pick-a-component-on-the-page). + +## In the panel + +| Keys | What it does | +| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| Ctrl+K | Opens the [command palette](./command-palette.md). | +| Arrow keys, Home and End in the tab bar | Move between tabs. Enter opens one. | +| Escape | Closes the panel. In a search box with text, it clears the box first. | +| Arrow keys on the splitter | Resize a docked panel by 16 pixels, or 64 with Shift. Home and End go to the smallest and largest size. | +| Enter on a file and line | Opens the file at that line in your editor, with a live devtools server. | + +See [Resize a docked panel](./popup-and-hub.md#resize-a-docked-panel). + +## In the command palette + +| Keys | What it does | +| ------------------------------------------- | --------------------------------------------- | +| ↑ and ↓ | Move through the list. It wraps at both ends. | +| Page Up and Page Down | Jump to the first or the last command. | +| Enter | Run the highlighted command. | +| Escape | Close the palette without running anything. | + +See [Filter and run](./command-palette.md#filter-and-run). + +## In the tabs + +Long lists are one Tab stop. Move inside them with the keys below. + +| Where | Keys | Read more | +| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| **Components** tree | Arrow keys, Home and End. → expands a row or moves to its first child, ← collapses it or moves to its parent. * expands every row at the same level. | [Keyboard](../inspectors/components.md#keyboard) | +| **Components** change detection chart | Arrow keys move between cycles, Shift with an arrow extends the range, Enter picks one cycle and Escape shows all. | [Pick a range of cycles](../inspectors/components.md#pick-a-range-of-cycles) | +| **Signals** graph | Arrow keys move up and down a column, left to a producer and right to a consumer. Home and End go to the ends, Enter or Space selects. | [Graph](../inspectors/signals.md#graph) | +| **Timeline** events | ↑, ↓, Home and End move, Enter selects. | [Keyboard](../inspectors/timeline.md#keyboard) | +| **SSR & HTTP** timeline, **Store** lists | ↑, ↓, Home and End move through the rows. | [Keyboard and mouse](./popup-and-hub.md#keyboard-and-mouse) | +| **Capacitor** calls | Arrow keys, Home and End move, Enter selects. The same keys move between the tabs of a call. | [Plugin calls](../inspectors/capacitor.md#plugin-calls) | +| **Settings** tab list | Alt+↑ or Alt+↓ on a row moves the tab. | [Tabs](./settings.md#tabs) | +| Search and filter boxes | Escape clears the box. | The page of each tab | + +## Where to next + + + + + + From 10e34cd84754eabe1211f72f7dabd2e9fcae59b2 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 14:28:05 +0000 Subject: [PATCH 07/19] docs(docs): publish llms.txt and a generated agent tool index The raw markdown routes existed, but an agent had no index of them, and nothing tied the tool pages to the list the server registers its tools from, so a new tool could ship without a place in the docs. Emit /llms.txt and /llms-full.txt from the content files in sidebar order. Generate a Tool index page from AGENT_ENTRIES with each entry's inspector, tier, transports, the option that turns it off and the section that describes it (pnpm docs:agent-tools). pnpm docs:test fails when the page is stale or a tool is not named in tools.md or resources.md. --- apps/docs/agent-tool-index.spec.ts | 47 ++++ apps/docs/agent-tool-index.ts | 201 ++++++++++++++++++ apps/docs/llms-txt.plugin.spec.ts | 33 +++ apps/docs/llms-txt.plugin.ts | 130 +++++++++++ apps/docs/src/content/agents/tool-index.md | 145 +++++++++++++ apps/docs/src/content/agents/tools.md | 2 +- .../src/content/contributing/development.md | 10 +- apps/docs/vite.config.ts | 2 + package.json | 1 + scripts/docs-agent-tools.mjs | 24 +++ 10 files changed, 592 insertions(+), 3 deletions(-) create mode 100644 apps/docs/agent-tool-index.spec.ts create mode 100644 apps/docs/agent-tool-index.ts create mode 100644 apps/docs/llms-txt.plugin.spec.ts create mode 100644 apps/docs/llms-txt.plugin.ts create mode 100644 apps/docs/src/content/agents/tool-index.md create mode 100644 scripts/docs-agent-tools.mjs diff --git a/apps/docs/agent-tool-index.spec.ts b/apps/docs/agent-tool-index.spec.ts new file mode 100644 index 00000000..321324fa --- /dev/null +++ b/apps/docs/agent-tool-index.spec.ts @@ -0,0 +1,47 @@ +import {readFileSync} from 'node:fs'; +import {join} from 'node:path'; +import * as prettier from 'prettier'; +import {TOOL_INDEX_PATH, findSection, renderToolIndex} from './agent-tool-index'; + +const docsRoot = import.meta.dirname; + +describe('agent tool index', () => { + it('names every agent tool and resource in tools.md or resources.md', () => { + expect(renderToolIndex(docsRoot).problems).toEqual([]); + }); + + it('matches the page in the repository; run pnpm docs:agent-tools when it fails', async () => { + const file = join(docsRoot, TOOL_INDEX_PATH); + const options = (await prettier.resolveConfig(file)) ?? {}; + const expected = await prettier.format(renderToolIndex(docsRoot).markdown, { + ...options, + filepath: file, + }); + expect(readFileSync(file, 'utf8')).toBe(expected); + }, 30_000); + + it('links a tool to its own heading, then to the table that defines it', () => { + const markdown = [ + '## Before you call a tool', + 'Use `explain-field` and `explain-form-changes`.', + '## Forms', + '### Read', + '| Tool | What it answers |', + '| --- | --- |', + '| `explain-field` | One field |', + '', + '| Tool | Cap |', + '| --- | --- |', + '| `explain-form-changes` | 100 fields |', + '### Track', + '| Tool | What it answers |', + '| --- | --- |', + '| `explain-form-changes` | The net change |', + '### wait-for', + ].join('\n'); + expect(findSection(markdown, 'explain-field')?.slug).toBe('read'); + expect(findSection(markdown, 'explain-form-changes')?.slug).toBe('track'); + expect(findSection(markdown, 'wait-for')?.slug).toBe('wait-for'); + expect(findSection(markdown, 'missing-tool')).toBeNull(); + }); +}); diff --git a/apps/docs/agent-tool-index.ts b/apps/docs/agent-tool-index.ts new file mode 100644 index 00000000..a5d23c18 --- /dev/null +++ b/apps/docs/agent-tool-index.ts @@ -0,0 +1,201 @@ +import {readFileSync} from 'node:fs'; +import {join} from 'node:path'; +import {AGENT_ENTRIES, type AgentEntry} from '../../packages/devtools/src/config.ts'; +import {createSlugger, headingText, slugify} from './src/app/utils/heading-slug.ts'; + +/** + * Builds `src/content/agents/tool-index.md` from `AGENT_ENTRIES` in + * `packages/devtools/src/config.ts`, the list the server registers its agent + * tools and resources from. `scripts/docs-agent-tools.mjs` writes the page, + * and `agent-tool-index.spec.ts` fails when the committed page is stale or a + * tool has no place in `tools.md` or `resources.md`. + */ + +export const TOOL_INDEX_PATH = 'src/content/agents/tool-index.md'; + +const INSPECTOR_LABELS: Record = { + components: 'Components', + signals: 'Signals', + injectors: 'Injectors', + ngrx: 'NgRx Store', + tanstackQuery: 'TanStack Query', + forms: 'Forms', + router: 'Router', + pipes: 'Pipes', + http: 'SSR & HTTP', + analog: 'Analog', + capacitor: 'Capacitor', + errors: 'Errors', + plugins: 'Plugins', +}; + +/** Sections that mention every tool in passing, so they are not where a tool is described. */ +const PASSING_SECTIONS = new Set(['before-you-call-a-tool', 'renamed-tools', 'shared-state']); + +interface Heading { + slug: string; + text: string; + section: string; +} + +/** Each line's heading, with slugs computed the way the link guard and the TOC do. */ +function headingsByLine(markdown: string): (Heading | null)[] { + const slug = createSlugger(); + const out: (Heading | null)[] = []; + let current: Heading | null = null; + let section = ''; + let fence: string | null = null; + for (const line of markdown.split(/\r?\n/)) { + const marker = /^ {0,3}(`{3,}|~{3,})/.exec(line)?.[1]; + if (marker && (fence === null || marker.startsWith(fence))) { + fence = fence === null ? marker : null; + } else if (fence === null) { + const m = /^ {0,3}(#{1,6})\s+(.+?)\s*$/.exec(line); + if (m) { + const text = headingText(m[2]); + const id = m[1].length === 1 ? slugify(text) : slug(text); + if (m[1].length <= 2) section = id; + current = {slug: id, text, section}; + } + } + out.push(current); + } + return out; +} + +/** The heading a name is described under: its own heading, or the first section that names it. */ +export function findSection(markdown: string, name: string): Heading | null { + const lines = markdown.split(/\r?\n/); + const headings = headingsByLine(markdown); + const own = headings.find((h) => h?.text === name); + if (own) return own; + const needle = '`' + name + '`'; + // The header row of the table each line is in, so a row in a table of limits doesn't count. + const tableHeaders: string[] = []; + lines.forEach((line, i) => { + const inTable = line.startsWith('|'); + tableHeaders.push(!inTable ? '' : lines[i - 1]?.startsWith('|') ? tableHeaders[i - 1] : line); + }); + const isLimits = (i: number) => /^\|\s*\S+\s*\|\s*(Cap|Limit)\s*\|/.test(tableHeaders[i]); + // A table row that defines it, then a paragraph that starts with it, then any mention. + const tests = [ + (line: string, i: number) => line.startsWith(`| ${needle} `) && !isLimits(i), + (line: string) => line.startsWith(needle), + (line: string) => line.includes(needle), + ]; + for (const test of tests) { + for (let i = 0; i < lines.length; i++) { + const heading = headings[i]; + if (!heading || PASSING_SECTIONS.has(heading.section)) continue; + if (test(lines[i], i)) return heading; + } + } + return null; +} + +function tier(entry: AgentEntry): string { + const base = entry.safety ?? 'read'; + return entry.readOnlyVariant ? `${base} (read under \`agent.readOnly\`)` : base; +} + +function inspectorOf(entry: AgentEntry): string { + const first = entry.inspectors?.[0]; + if (!first) return 'Shared'; + return entry.anyInspector ? `${INSPECTOR_LABELS[first]} and others` : INSPECTOR_LABELS[first]; +} + +function turnedOffBy(entry: AgentEntry): string { + if (!entry.inspectors?.length) return 'None'; + const keys = entry.anyInspector ? entry.inspectors : entry.inspectors.slice(0, 1); + const parts = keys.map((key) => `\`inspectors.${key}\``); + const joined = entry.anyInspector ? `${parts.join(', ')} (all of them)` : parts[0]; + return entry.actions?.length + ? `${joined}, or blocking ${entry.actions.map((a) => `\`actions.${a}\``).join(' and ')}` + : joined; +} + +export interface IndexProblem { + name: string; + problem: string; +} + +/** The markdown of the page, and the entries that have no place in the docs. */ +export function renderToolIndex(docsRoot: string): {markdown: string; problems: IndexProblem[]} { + const tools = readFileSync(join(docsRoot, 'src/content/agents/tools.md'), 'utf8'); + const resources = readFileSync(join(docsRoot, 'src/content/agents/resources.md'), 'utf8'); + const problems: IndexProblem[] = []; + const toolRows: string[] = []; + const resourceRows: string[] = []; + + const order = ['Shared', ...Object.values(INSPECTOR_LABELS)]; + const entries = Object.entries(AGENT_ENTRIES).sort( + ([a, x], [b, y]) => + order.indexOf(inspectorOf(x).replace(/ and others$/, '')) - + order.indexOf(inspectorOf(y).replace(/ and others$/, '')) || a.localeCompare(b), + ); + + for (const [name, entry] of entries) { + const isResource = entry.kind === 'resource'; + const page = isResource ? './resources.md' : './tools.md'; + const section = findSection(isResource ? resources : tools, name); + if (!section) { + problems.push({name, problem: `not named in ${isResource ? 'resources.md' : 'tools.md'}`}); + continue; + } + const link = `[${section.text}](${page}#${section.slug})`; + const stdio = entry.page ? 'No' : 'Yes'; + if (isResource) { + resourceRows.push(`| \`pangular:${name}\` | ${inspectorOf(entry)} | ${stdio} | ${link} |`); + } else { + toolRows.push( + `| \`${name}\` | ${inspectorOf(entry)} | ${tier(entry)} | ${stdio} | ${turnedOffBy(entry)} | ${link} |`, + ); + } + } + + const markdown = `--- +title: Tool index +description: Every built-in agent tool and resource with its inspector, safety tier, transports and the option that turns it off, generated from the server's own list. +--- + + + Every built-in agent tool and resource on one page, generated from the list the server registers them from. + + +# Tool index + +This page is generated from \`AGENT_ENTRIES\` in \`packages/devtools/src/config.ts\`, the list the server registers its tools and resources from, so it can't drift from the code. [Tools](./tools.md) and [Resources](./resources.md) describe the arguments and answers of each one. Run \`pnpm docs:agent-tools\` after you add or change an entry. + +Clients see each tool as \`pangular_\`. See [Names](./tools.md#names). Plugin tools, \`pangular:plugin::\`, come from the plugins and are not listed here. See [A plugin's own tools](./tools.md#a-plugin-s-own-tools). + +## Columns + +| Column | Meaning | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Inspector | The inspector the entry belongs to. Shared entries belong to none. | +| Tier | \`read\`, \`action\` or \`destructive\`. See [Action tools](./tools.md#action-tools). | +| Over stdio | Whether the stdio server offers it. Entries that need a connected page, the app's dev server or the panel are HTTP only. | +| Turned off by | The [configuration](../getting-started/configuration.md#inspectors-and-agent-tools) that removes it. \`agent.tools.: false\` also hides an inspector's entries, and \`agent.readOnly\` drops the \`action\` and \`destructive\` tools. | + +## Tools + +| Tool | Inspector | Tier | Over stdio | Turned off by | Described in | +| ---- | --------- | ---- | ---------- | ------------- | ------------ | +${toolRows.join('\n')} + +## Resources + +| Resource | Inspector | Over stdio | Described in | +| -------- | --------- | ---------- | ------------ | +${resourceRows.join('\n')} + +## Where to next + + + + + + +`; + return {markdown, problems}; +} diff --git a/apps/docs/llms-txt.plugin.spec.ts b/apps/docs/llms-txt.plugin.spec.ts new file mode 100644 index 00000000..868afd90 --- /dev/null +++ b/apps/docs/llms-txt.plugin.spec.ts @@ -0,0 +1,33 @@ +import config from './src/ngmd.config.ts'; +import {buildLlmsTxt} from './llms-txt.plugin.ts'; + +const {index, full} = buildLlmsTxt(import.meta.dirname, config); + +describe('llms.txt', () => { + it('starts with the site name and summary', () => { + expect(index.startsWith(`# ${config.site.name}\n\n> ${config.site.description}\n`)).toBe(true); + expect(full.startsWith(`# ${config.site.name}\n`)).toBe(true); + }); + + it('links each sidebar page to its markdown route with its description, in sidebar order', () => { + const first = config.nav[0]; + expect(index).toContain(`## ${first.label}`); + expect(index).toMatch( + /- \[Quick start\]\(https:\/\/pangular-inspector\.dev\/getting-started\/quick-start\.md\): \S/, + ); + const positions = first.items + .map((item) => index.indexOf(`${config.site.url}${item.href}.md`)) + .filter((at) => at >= 0); + expect(positions).toEqual([...positions].sort((a, b) => a - b)); + }); + + it('leaves out noIndex pages and keeps page bodies without frontmatter', () => { + expect(index).not.toContain('/contributing/kitchen-sink.md'); + expect(full).not.toContain(''); + expect(full).toContain( + '', + ); + expect(full).not.toContain('title: Troubleshooting\n'); + expect(full).toContain('\n\n# Troubleshooting\n'); + }); +}); diff --git a/apps/docs/llms-txt.plugin.ts b/apps/docs/llms-txt.plugin.ts new file mode 100644 index 00000000..6fe4b23c --- /dev/null +++ b/apps/docs/llms-txt.plugin.ts @@ -0,0 +1,130 @@ +import {existsSync, readFileSync} from 'node:fs'; +import {join} from 'node:path'; +import type {Plugin} from 'vite'; +import type {NgmdConfig} from './src/ngmd.config.ts'; +import {isNoIndex, parseFrontmatter, walkContentFiles} from './plugin-utils.ts'; +import {substituteMdVars} from './vars.plugin.ts'; + +/** + * Emits `/llms.txt` and `/llms-full.txt` (https://llmstxt.org) next to the + * raw `.md` routes that `rawMdPlugin` serves. + * + * /llms.txt the site name and summary, then one link per page, in + * sidebar order, to its `.md` route with its description. + * Content pages missing from the sidebar go under Optional. + * /llms-full.txt the same pages' markdown, frontmatter dropped, one after + * the other, each under a heading with its URL. + * + * `noIndex` pages are left out of both. The dev server answers the same two + * paths from `src/content` on each request. + */ + +interface LlmsPage { + route: string; + title: string; + description: string; + body: string; +} + +function readPages(root: string): Map { + const contentDir = join(root, 'src/content'); + const pages = new Map(); + if (!existsSync(contentDir)) return pages; + for (const [rel, route] of walkContentFiles(contentDir, root)) { + const {attributes, body} = parseFrontmatter( + substituteMdVars(readFileSync(join(root, rel), 'utf8'), root), + ); + if (isNoIndex(attributes)) continue; + pages.set(route, { + route, + title: String(attributes['title'] ?? route), + description: String(attributes['description'] ?? ''), + body: body.trim(), + }); + } + return pages; +} + +/** The pages in sidebar order, grouped by section, then the rest under Optional. */ +function orderedSections( + pages: Map, + config: NgmdConfig, +): Array<[string, LlmsPage[]]> { + const used = new Set(); + const sections: Array<[string, LlmsPage[]]> = []; + for (const section of config.nav) { + const items: LlmsPage[] = []; + for (const item of section.items) { + const page = pages.get(item.href); + if (!page || used.has(item.href)) continue; + used.add(item.href); + items.push(page); + } + if (items.length) sections.push([section.label, items]); + } + const rest = [...pages.values()] + .filter((page) => !used.has(page.route)) + .sort((a, b) => a.route.localeCompare(b.route)); + if (rest.length) sections.push(['Optional', rest]); + return sections; +} + +export function buildLlmsTxt(root: string, config: NgmdConfig): {index: string; full: string} { + const site = config.site.url.replace(/\/+$/, ''); + const sections = orderedSections(readPages(root), config); + const mdUrl = (route: string) => `${site}${route === '/' ? '/index' : route}.md`; + + const index = [ + `# ${config.site.name}`, + '', + `> ${config.site.description}`, + '', + `Each link below is the page's markdown source. The whole site in one file is ${site}/llms-full.txt.`, + '', + ...sections.flatMap(([label, items]) => [ + `## ${label}`, + '', + ...items.map( + (page) => + `- [${page.title}](${mdUrl(page.route)})${page.description ? `: ${page.description}` : ''}`, + ), + '', + ]), + ].join('\n'); + + const full = [ + `# ${config.site.name}`, + '', + `> ${config.site.description}`, + '', + ...sections.flatMap(([, items]) => + items.flatMap((page) => [``, '', page.body, '']), + ), + ].join('\n'); + + return {index, full}; +} + +export function llmsTxtPlugin(config: NgmdConfig): Plugin { + let root = process.cwd(); + return { + name: 'ngmd-llms-txt', + configResolved(cfg) { + root = cfg.root; + }, + configureServer(server) { + server.middlewares.use((req, res, next) => { + const path = req.url?.split('?')[0]; + if (path !== '/llms.txt' && path !== '/llms-full.txt') return next(); + const {index, full} = buildLlmsTxt(root, config); + res.setHeader('Content-Type', 'text/plain; charset=utf-8'); + res.end(path === '/llms.txt' ? index : full); + }); + }, + generateBundle() { + const {index, full} = buildLlmsTxt(root, config); + this.emitFile({type: 'asset', fileName: 'llms.txt', source: index}); + this.emitFile({type: 'asset', fileName: 'llms-full.txt', source: full}); + }, + }; +} diff --git a/apps/docs/src/content/agents/tool-index.md b/apps/docs/src/content/agents/tool-index.md new file mode 100644 index 00000000..7e86f4f2 --- /dev/null +++ b/apps/docs/src/content/agents/tool-index.md @@ -0,0 +1,145 @@ +--- +title: Tool index +description: Every built-in agent tool and resource with its inspector, safety tier, transports and the option that turns it off, generated from the server's own list. +--- + + + Every built-in agent tool and resource on one page, generated from the list the server registers them from. + + +# Tool index + +This page is generated from `AGENT_ENTRIES` in `packages/devtools/src/config.ts`, the list the server registers its tools and resources from, so it can't drift from the code. [Tools](./tools.md) and [Resources](./resources.md) describe the arguments and answers of each one. Run `pnpm docs:agent-tools` after you add or change an entry. + +Clients see each tool as `pangular_`. See [Names](./tools.md#names). Plugin tools, `pangular:plugin::`, come from the plugins and are not listed here. See [A plugin's own tools](./tools.md#a-plugin-s-own-tools). + +## Columns + +| Column | Meaning | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Inspector | The inspector the entry belongs to. Shared entries belong to none. | +| Tier | `read`, `action` or `destructive`. See [Action tools](./tools.md#action-tools). | +| Over stdio | Whether the stdio server offers it. Entries that need a connected page, the app's dev server or the panel are HTTP only. | +| Turned off by | The [configuration](../getting-started/configuration.md#inspectors-and-agent-tools) that removes it. `agent.tools.: false` also hides an inspector's entries, and `agent.readOnly` drops the `action` and `destructive` tools. | + +## Tools + +| Tool | Inspector | Tier | Over stdio | Turned off by | Described in | +| ------------------------------ | --------------------- | ------------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| `audit` | Shared | action (read under `agent.readOnly`) | No | None | [audit](./tools.md#audit-1) | +| `list-pages` | Shared | read | No | None | [list-pages](./tools.md#list-pages) | +| `open-in-panel` | Shared | read | No | None | [open-in-panel](./tools.md#open-in-panel) | +| `scan-build` | Shared | read | Yes | None | [Source scan](./tools.md#source-scan) | +| `snapshot` | Shared | read | No | None | [snapshot](./tools.md#snapshot) | +| `change-detection` | Components | read | No | `inspectors.components` | [change-detection](./tools.md#change-detection) | +| `defer-blocks` | Components | read | No | `inspectors.components` | [defer-blocks](./tools.md#defer-blocks) | +| `diagnose-change-detection` | Components | read | No | `inspectors.components` | [diagnose-change-detection](./tools.md#diagnose-change-detection) | +| `find-leaks` | Components | read | No | `inspectors.components` | [find-leaks](./tools.md#find-leaks) | +| `for-blocks` | Components | read | No | `inspectors.components` | [for-blocks](./tools.md#for-blocks) | +| `highlight` | Components | read | No | `inspectors.components` | [highlight](./tools.md#highlight) | +| `hydration` | Components | read | No | `inspectors.components` | [hydration](./tools.md#hydration) | +| `inspect-component` | Components | read | No | `inspectors.components` | [inspect-component](./tools.md#inspect-component) | +| `list-components` | Components | read | No | `inspectors.components` | [list-components](./tools.md#list-components) | +| `record-change-detection` | Components | action | No | `inspectors.components` | [record-change-detection](./tools.md#record-change-detection) | +| `scan-components` | Components | read | Yes | `inspectors.components` | [Source scan](./tools.md#source-scan) | +| `scan-templates` | Components | read | Yes | `inspectors.components` | [scan-templates](./tools.md#scan-templates) | +| `screenshot-component` | Components | read | No | `inspectors.components` | [screenshot-component](./tools.md#screenshot-component) | +| `set-component-property` | Components | action | No | `inspectors.components`, or blocking `actions.components` | [Edit a component](./tools.md#edit-a-component) | +| `set-signal` | Components | action | No | `inspectors.components`, or blocking `actions.components` | [Edit a component](./tools.md#edit-a-component) | +| `track-subscriptions` | Components | action | No | `inspectors.components` | [Track subscriptions](./tools.md#track-subscriptions) | +| `wait-for` | Components and others | read | No | `inspectors.components`, `inspectors.router`, `inspectors.http`, `inspectors.errors`, `inspectors.forms` (all of them) | [wait-for](./tools.md#wait-for) | +| `inspect-signals` | Signals | read | No | `inspectors.signals` | [inspect-signals](./tools.md#inspect-signals) | +| `scan-signals` | Signals | read | Yes | `inspectors.signals` | [Source scan](./tools.md#source-scan) | +| `watch-signal` | Signals | action | No | `inspectors.signals` | [watch-signal](./tools.md#watch-signal) | +| `explain-injection` | Injectors | read | No | `inspectors.injectors` | [explain-injection](./tools.md#explain-injection) | +| `inspect-providers` | Injectors | read | No | `inspectors.injectors` | [inspect-providers](./tools.md#inspect-providers) | +| `read-provider-value` | Injectors | read | No | `inspectors.injectors` | [read-provider-value](./tools.md#read-provider-value) | +| `scan-providers` | Injectors | read | Yes | `inspectors.injectors` | [Source scan](./tools.md#source-scan) | +| `startup-timing` | Injectors | read | No | `inspectors.injectors` | [startup-timing](./tools.md#startup-timing) | +| `ngrx-dispatch` | NgRx Store | action | No | `inspectors.ngrx`, or blocking `actions.ngrx` | [Dispatch an action](./tools.md#dispatch-an-action) | +| `ngrx-export-session` | NgRx Store | read | No | `inspectors.ngrx` | [ngrx-export-session](./tools.md#ngrx-export-session) | +| `ngrx-generate-test` | NgRx Store | read | Yes | `inspectors.ngrx` | [ngrx-generate-test](./tools.md#ngrx-generate-test) | +| `ngrx-history` | NgRx Store | read | No | `inspectors.ngrx` | [ngrx-history](./tools.md#ngrx-history) | +| `ngrx-import-session` | NgRx Store | read | Yes | `inspectors.ngrx` | [ngrx-import-session](./tools.md#ngrx-import-session) | +| `ngrx-inspect-entry` | NgRx Store | read | Yes | `inspectors.ngrx` | [ngrx-inspect-entry](./tools.md#ngrx-inspect-entry) | +| `ngrx-inspect-store` | NgRx Store | read | No | `inspectors.ngrx` | [ngrx-inspect-store](./tools.md#ngrx-inspect-store) | +| `ngrx-restore` | NgRx Store | action | No | `inspectors.ngrx`, or blocking `actions.ngrx` | [Restore a state](./tools.md#restore-a-state) | +| `ngrx-scan` | NgRx Store | read | Yes | `inspectors.ngrx` | [Source scan](./tools.md#source-scan) | +| `redux-inspect-stores` | NgRx Store | read | No | `inspectors.ngrx` | [redux-inspect-stores](./tools.md#redux-inspect-stores) | +| `tanstack-inspect-query` | TanStack Query | read | No | `inspectors.tanstackQuery` | [TanStack Query](./tools.md#tanstack-query) | +| `tanstack-list-queries` | TanStack Query | read | No | `inspectors.tanstackQuery` | [TanStack Query](./tools.md#tanstack-query) | +| `tanstack-run-query` | TanStack Query | action | No | `inspectors.tanstackQuery`, or blocking `actions.tanstackQuery` | [Invalidate or refetch a query](./tools.md#invalidate-or-refetch-a-query) | +| `explain-custom-control` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `explain-field` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `explain-form-changes` | Forms | read | No | `inspectors.forms` | [Track changes](./tools.md#track-changes) | +| `explain-invalid-forms` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `explain-submit` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `export-form` | Forms | read | No | `inspectors.forms` | [Track changes](./tools.md#track-changes) | +| `fill-form` | Forms | action | No | `inspectors.forms`, or blocking `actions.forms` | [Act on a form](./tools.md#act-on-a-form) | +| `inspect-form-payload` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `inspect-forms` | Forms | read | No | `inspectors.forms` | [Read form state](./tools.md#read-form-state) | +| `lint-forms` | Forms | read | No | `inspectors.forms` | [Track changes](./tools.md#track-changes) | +| `list-form-changes` | Forms | read | No | `inspectors.forms` | [Track changes](./tools.md#track-changes) | +| `run-form-action` | Forms | action | No | `inspectors.forms`, or blocking `actions.forms` | [Act on a form](./tools.md#act-on-a-form) | +| `explain-navigation` | Router | read | No | `inspectors.router` | [Read the current route](./tools.md#read-the-current-route) | +| `inspect-route` | Router | read | No | `inspectors.router` | [Read the current route](./tools.md#read-the-current-route) | +| `lint-routes` | Router | read | No | `inspectors.router` | [Read the route config](./tools.md#read-the-route-config) | +| `list-routes` | Router | read | No | `inspectors.router` | [Read the route config](./tools.md#read-the-route-config) | +| `navigate` | Router | action | No | `inspectors.router`, or blocking `actions.router` | [Act on the router](./tools.md#act-on-the-router) | +| `probe-route` | Router | action | No | `inspectors.router`, or blocking `actions.router` | [Act on the router](./tools.md#act-on-the-router) | +| `record-guards` | Router | action | No | `inspectors.router` | [Act on the router](./tools.md#act-on-the-router) | +| `router-config` | Router | read | No | `inspectors.router` | [Read the route config](./tools.md#read-the-route-config) | +| `scan-render-mode` | Router | read | Yes | `inspectors.router` | [Read the route config](./tools.md#read-the-route-config) | +| `scan-routes` | Router | read | Yes | `inspectors.router` | [Source scan](./tools.md#source-scan) | +| `explain-pipe` | Pipes | read | Yes | `inspectors.pipes` | [Explain a pipe](./tools.md#explain-a-pipe) | +| `record-pipes` | Pipes | action | No | `inspectors.pipes` | [Record pipe calls](./tools.md#record-pipe-calls) | +| `scan-pipe-usage` | Pipes | read | Yes | `inspectors.pipes` | [scan-pipe-usage](./tools.md#scan-pipe-usage) | +| `scan-pipes` | Pipes | read | Yes | `inspectors.pipes` | [Source scan](./tools.md#source-scan) | +| `clear-recordings` | SSR & HTTP | destructive | No | `inspectors.http`, or blocking `actions.router` and `actions.http` and `actions.analog` | [Clear recordings](./tools.md#clear-recordings) | +| `explain-ssr-request` | SSR & HTTP | read | No | `inspectors.http` | [SSR & HTTP](./tools.md#ssr-http) | +| `inspect-transfer-state` | SSR & HTTP | read | No | `inspectors.http` | [TransferState and SSR overrides](./tools.md#transferstate-and-ssr-overrides) | +| `list-http-calls` | SSR & HTTP | read | No | `inspectors.http` | [SSR & HTTP](./tools.md#ssr-http) | +| `list-http-rules` | SSR & HTTP | read | No | `inspectors.http` | [Fault rules](./tools.md#fault-rules) | +| `list-ssr-overrides` | SSR & HTTP | read | No | `inspectors.http` | [TransferState and SSR overrides](./tools.md#transferstate-and-ssr-overrides) | +| `list-ssr-requests` | SSR & HTTP | read | No | `inspectors.http` | [SSR & HTTP](./tools.md#ssr-http) | +| `remove-http-rule` | SSR & HTTP | action | No | `inspectors.http`, or blocking `actions.http` | [Fault rules](./tools.md#fault-rules) | +| `remove-ssr-override` | SSR & HTTP | action | No | `inspectors.http`, or blocking `actions.http` | [TransferState and SSR overrides](./tools.md#transferstate-and-ssr-overrides) | +| `set-http-rule` | SSR & HTTP | action | No | `inspectors.http`, or blocking `actions.http` | [Fault rules](./tools.md#fault-rules) | +| `set-ssr-override` | SSR & HTTP | action | No | `inspectors.http`, or blocking `actions.http` | [TransferState and SSR overrides](./tools.md#transferstate-and-ssr-overrides) | +| `analog-explain-render-modes` | Analog | read | Yes | `inspectors.analog` | [Rendering](./tools.md#rendering) | +| `analog-inspect-page` | Analog | read | No | `inspectors.analog` | [The running page](./tools.md#the-running-page) | +| `analog-lint` | Analog | read | Yes | `inspectors.analog` | [Lint](./tools.md#lint) | +| `analog-list-server-calls` | Analog | read | No | `inspectors.analog` | [The running page](./tools.md#the-running-page) | +| `analog-run-api` | Analog | destructive | No | `inspectors.analog`, or blocking `actions.analog` | [Call a server route](./tools.md#call-a-server-route) | +| `analog-scan-api-routes` | Analog | read | Yes | `inspectors.analog` | [Routes and files](./tools.md#routes-and-files) | +| `analog-scan-content` | Analog | read | Yes | `inspectors.analog` | [Routes and files](./tools.md#routes-and-files) | +| `analog-scan-prerender` | Analog | read | Yes | `inspectors.analog` | [Rendering](./tools.md#rendering) | +| `analog-scan-routes` | Analog | read | Yes | `inspectors.analog` | [Routes and files](./tools.md#routes-and-files) | +| `analog-scan-server-functions` | Analog | read | Yes | `inspectors.analog` | [Routes and files](./tools.md#routes-and-files) | +| `analog-scan-url` | Analog | read | Yes | `inspectors.analog` | [Routes and files](./tools.md#routes-and-files) | +| `capacitor-list-calls` | Capacitor | read | No | `inspectors.capacitor` | [Capacitor](./tools.md#capacitor) | +| `capacitor-list-plugins` | Capacitor | read | No | `inspectors.capacitor` | [Capacitor](./tools.md#capacitor) | +| `explain-error` | Errors | read | No | `inspectors.errors` | [Errors](./tools.md#errors) | +| `list-console` | Errors | read | No | `inspectors.errors` | [Errors](./tools.md#errors) | +| `list-errors` | Errors | read | No | `inspectors.errors` | [Errors](./tools.md#errors) | +| `inspect-plugin` | Plugins | read | No | `inspectors.plugins` | [Plugins](./tools.md#plugins) | +| `list-plugins` | Plugins | read | No | `inspectors.plugins` | [Plugins](./tools.md#plugins) | + +## Resources + +| Resource | Inspector | Over stdio | Described in | +| ------------------------- | ---------- | ---------- | ----------------------------------------------- | +| `pangular:component-tree` | Components | No | [component-tree](./resources.md#component-tree) | +| `pangular:signal-graph` | Signals | No | [signal-graph](./resources.md#signal-graph) | +| `pangular:injector-tree` | Injectors | No | [injector-tree](./resources.md#injector-tree) | +| `pangular:ngrx-store` | NgRx Store | No | [ngrx-store](./resources.md#ngrx-store) | +| `pangular:forms` | Forms | No | [forms](./resources.md#forms) | +| `pangular:router` | Router | No | [router](./resources.md#router) | + +## Where to next + + + + + + diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index ab27083e..68078b57 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -19,7 +19,7 @@ The server's [prompts](./mcp-server.md#prompts) chain these tools into ready wor Tool ids use a colon, as `pangular:scan-routes`. MCP clients see them with an underscore, as `pangular_scan-routes`. The tables below drop the `pangular:` prefix. The `read` tools are also registered on the page under the same names, for [browser agents](./browser-agents.md). -Each tool has a short title that clients show in their tool lists. Every tool answers with one plain text block: markdown, or compact JSON for a source scan. See [Titles and answers](./mcp-server.md#titles-and-answers). +The [Tool index](./tool-index.md) lists every tool with its inspector, tier and transports, generated from the server's own list. Each tool has a short title that clients show in their tool lists. Every tool answers with one plain text block: markdown, or compact JSON for a source scan. See [Titles and answers](./mcp-server.md#titles-and-answers). ### Source and live tools diff --git a/apps/docs/src/content/contributing/development.md b/apps/docs/src/content/contributing/development.md index f002c721..67ad493e 100644 --- a/apps/docs/src/content/contributing/development.md +++ b/apps/docs/src/content/contributing/development.md @@ -278,6 +278,8 @@ Give every registered tool and resource an entry in `AGENT_ENTRIES` in `packages `packages/devtools/src/__tests__/agent-metadata.test.ts` boots the server and fails when a registered tool has no entry, or an entry has no registered tool. It also compares the derived lists with `packages/devtools/src/__tests__/fixtures/agent-metadata-derived.json`, so update that file with the tool and the reviewer sees what changed. See [Configuration](../getting-started/configuration.md). +Then run `pnpm docs:agent-tools`. It writes the [Tool index](../agents/tool-index.md) from `AGENT_ENTRIES`, and `pnpm docs:test` fails while that page is stale or a tool is not named on the Tools or Resources page. + Run pnpm extension:build and commit extension/ui. CI fails when it is stale. See Build the extension. @@ -287,12 +289,16 @@ Give every registered tool and resource an entry in `AGENT_ENTRIES` in `packages This site lives in `apps/docs`. It is built with [NgMd](https://github.com/erkamyaman/ngmd) on *Analog. ```bash -pnpm docs:dev # Dev server -pnpm docs:build # Production build +pnpm docs:dev # Dev server +pnpm docs:build # Production build +pnpm docs:test # Docs site tests, including the stale page checks +pnpm docs:agent-tools # Regenerate the agent tool index ``` Pages are markdown files under `apps/docs/src/content`. The sidebar comes from `apps/docs/src/ngmd.config.ts`. +The build also writes `/llms.txt`, one link per page to its markdown source in sidebar order, and `/llms-full.txt`, every page's markdown in one file. Both follow the [llms.txt](https://llmstxt.org) format and come from `apps/docs/llms-txt.plugin.ts`. + The build fails on broken internal links and on raw external anchors without target="_blank". Run pnpm docs:build before you open a PR. diff --git a/apps/docs/vite.config.ts b/apps/docs/vite.config.ts index 086f0138..18c92051 100644 --- a/apps/docs/vite.config.ts +++ b/apps/docs/vite.config.ts @@ -12,6 +12,7 @@ import {mdLinksPlugin} from './md-links.plugin.ts'; import {sitemapPlugin} from './sitemap.plugin.ts'; import {searchIndexPlugin} from './search-index.plugin.ts'; import {rawMdPlugin} from './raw-md.plugin.ts'; +import {llmsTxtPlugin} from './llms-txt.plugin.ts'; import {varsPlugin} from './vars.plugin.ts'; import {apiGenPlugin} from './api-gen.plugin.ts'; import {prerenderRoutes, withoutCode} from './plugin-utils.ts'; @@ -93,6 +94,7 @@ export default defineConfig(async () => ({ }), sitemapPlugin({siteUrl: config.site.url}), rawMdPlugin(), + llmsTxtPlugin(config), searchIndexPlugin(), apiGenPlugin(), analog({ diff --git a/package.json b/package.json index bed264ff..f3656107 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "docs:dev": "nx serve pangular-inspector-docs", "docs:build": "nx build pangular-inspector-docs", "docs:test": "nx test pangular-inspector-docs", + "docs:agent-tools": "node scripts/docs-agent-tools.mjs", "docs:deploy": "nx deploy pangular-inspector-docs" }, "private": true, diff --git a/scripts/docs-agent-tools.mjs b/scripts/docs-agent-tools.mjs new file mode 100644 index 00000000..70e1e5b0 --- /dev/null +++ b/scripts/docs-agent-tools.mjs @@ -0,0 +1,24 @@ +#!/usr/bin/env node +/** + * Writes apps/docs/src/content/agents/tool-index.md from AGENT_ENTRIES in + * packages/devtools/src/config.ts. `pnpm docs:test` fails when the page in the repository is + * stale, so run this after adding or changing an agent tool or resource. + * + * Usage: node scripts/docs-agent-tools.mjs + */ +import { execFileSync } from 'node:child_process'; +import { writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { renderToolIndex, TOOL_INDEX_PATH } from '../apps/docs/agent-tool-index.ts'; + +const docsRoot = path.resolve(import.meta.dirname, '../apps/docs'); +const { markdown, problems } = renderToolIndex(docsRoot); +if (problems.length > 0) { + for (const { name, problem } of problems) console.error(`${name}: ${problem}`); + console.error('Describe each entry in tools.md or resources.md first.'); + process.exit(1); +} +const file = path.join(docsRoot, TOOL_INDEX_PATH); +writeFileSync(file, markdown); +execFileSync('pnpm', ['exec', 'prettier', '--write', file], { stdio: 'inherit' }); +console.log(`Wrote ${path.relative(process.cwd(), file)}`); From 6a8d504553264df7e0db8c18804f644a69de7e74 Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 14:28:29 +0000 Subject: [PATCH 08/19] docs(docs): give sidebar badges an expiry version A new or updated badge in the sidebar stayed until someone removed it by hand, so badges ended up on most pages and stopped meaning anything. Add an until field to nav items: the package version the badge expires at. The sidebar shows a badge only while packages/devtools/package.json is older than it, never shows a new or updated badge without one, and pnpm docs:test fails on a missing or malformed until. The pages this branch adds or reworks get badges that expire at 1.2.0, and the writing guide and the docs skill say how to set it. The pages also join the sidebar. --- .claude/skills/devtools-docs/SKILL.md | 2 +- apps/docs/src/app/components/sidebar.ts | 8 ++- .../src/content/contributing/writing-docs.md | 9 ++++ apps/docs/src/nav-badges.spec.ts | 49 +++++++++++++++++ apps/docs/src/nav-badges.ts | 47 +++++++++++++++++ apps/docs/src/ngmd.config.ts | 52 ++++++++++++++++--- apps/docs/src/types/badge.ts | 3 +- apps/docs/tsconfig.json | 1 + 8 files changed, 162 insertions(+), 9 deletions(-) create mode 100644 apps/docs/src/nav-badges.spec.ts create mode 100644 apps/docs/src/nav-badges.ts diff --git a/.claude/skills/devtools-docs/SKILL.md b/.claude/skills/devtools-docs/SKILL.md index 55d3a350..0bc97ec4 100644 --- a/.claude/skills/devtools-docs/SKILL.md +++ b/.claude/skills/devtools-docs/SKILL.md @@ -27,7 +27,7 @@ Reviewers reject changes that break these. 1. **No em dashes.** Use a period, comma or parentheses. 2. **No first person** ("we", "our"). 3. **No future tense** ("will"). -4. **No time-relative claims** ("new", "recently", "upcoming", "now supports"). Use a sidebar `status` badge in `ngmd.config.ts` and the changelog instead. +4. **No time-relative claims** ("new", "recently", "upcoming", "now supports"). Use a sidebar `status` badge in `ngmd.config.ts` and the changelog instead. A `new` or `updated` badge needs `until`: the minor after the release that ships the page (`until: '1.2.0'` for a page in 1.1), so it expires. 5. **No comparisons with other devtools products.** Describe this project on its own terms. 6. **No marketing words**: powerful, seamless, blazingly fast, simply, just, easy. 7. **No invented features.** Every name, label, option, default, tool and argument must exist in the code. diff --git a/apps/docs/src/app/components/sidebar.ts b/apps/docs/src/app/components/sidebar.ts index 1c8b180f..01b57c8b 100644 --- a/apps/docs/src/app/components/sidebar.ts +++ b/apps/docs/src/app/components/sidebar.ts @@ -13,6 +13,7 @@ import {Router, RouterLink, RouterLinkActive} from '@angular/router'; import {LucideDynamicIcon, LucideChevronDown} from '@lucide/angular'; import config from '../../ngmd.config'; import {BADGE_VARIANTS, type BadgeVariant} from '../../types/badge'; +import {activeBadge, type BadgedItem} from '../../nav-badges'; import {onNavigation} from '../utils/enhance-on-navigation'; import {RouteUrlService} from '../services/route-url/route-url.service'; @@ -68,7 +69,7 @@ export class SidebarState { class="flex items-center justify-between gap-2 rounded-md px-3 py-1.5 text-zinc-700 dark:text-zinc-300 hover:bg-[color:var(--accent-soft)] hover:text-[color:var(--accent-strong)] focus:outline-none focus-visible:outline-2 focus-visible:outline focus-visible:outline-offset-[-2px] focus-visible:outline-[color:var(--accent)]" > {{ item.label }} - @if (item.status; as status) { + @if (badge(item); as status) { ` tags: `[Configuration](./configuration.md)`, ``. The site turns these into routes, and the same links work when the page is read on GitHub. diff --git a/apps/docs/src/nav-badges.spec.ts b/apps/docs/src/nav-badges.spec.ts new file mode 100644 index 00000000..4aa53393 --- /dev/null +++ b/apps/docs/src/nav-badges.spec.ts @@ -0,0 +1,49 @@ +import config from './ngmd.config'; +import { + DOCS_PACKAGE_VERSION, + activeBadge, + compareVersions, + isExpiringBadge, + parseVersion, +} from './nav-badges'; + +describe('nav badges', () => { + it('compares package versions by major, minor and patch', () => { + expect(compareVersions('1.0.0', '1.2.0')).toBeLessThan(0); + expect(compareVersions('1.2.0', '1.2.0')).toBe(0); + expect(compareVersions('1.10.0', '1.2.0')).toBeGreaterThan(0); + expect(compareVersions('1.2.0-rc.1', '1.2.0')).toBe(0); + expect(compareVersions('next', '1.2.0')).toBeNaN(); + }); + + it('shows a badge while the package version is older than until', () => { + expect(activeBadge({status: 'new', until: '1.2.0'}, '1.1.4')).toBe('new'); + expect(activeBadge({status: 'new', until: '1.2.0'}, '1.2.0')).toBeNull(); + expect(activeBadge({status: 'updated', until: '1.2.0'}, '2.0.0')).toBeNull(); + }); + + it('never shows new or updated without until, and keeps other badges', () => { + expect(activeBadge({status: 'new'}, '1.0.0')).toBeNull(); + expect(activeBadge({status: 'updated'}, '1.0.0')).toBeNull(); + expect(activeBadge({status: 'beta'}, '1.0.0')).toBe('beta'); + expect(activeBadge({status: 'deprecated', until: '2.0.0'}, '2.0.0')).toBeNull(); + expect(activeBadge({}, '1.0.0')).toBeNull(); + }); + + it('reads the package version', () => { + expect(parseVersion(DOCS_PACKAGE_VERSION)).not.toBeNull(); + }); + + it('gives every new or updated sidebar item a valid until version', () => { + const items = config.nav.flatMap((section) => section.items); + const missing = items + .filter((item) => item.status && isExpiringBadge(item.status)) + .filter((item) => !item.until || !parseVersion(item.until)) + .map((item) => item.href); + expect(missing).toEqual([]); + const malformed = items + .filter((item) => item.until !== undefined && !parseVersion(item.until)) + .map((item) => item.href); + expect(malformed).toEqual([]); + }); +}); diff --git a/apps/docs/src/nav-badges.ts b/apps/docs/src/nav-badges.ts new file mode 100644 index 00000000..543a553a --- /dev/null +++ b/apps/docs/src/nav-badges.ts @@ -0,0 +1,47 @@ +import {version as packageVersion} from '../../../packages/devtools/package.json'; +import type {BadgeVariant} from './types/badge.ts'; + +/** Badges that announce a change, so they stop meaning anything once the change is old. */ +const EXPIRING: ReadonlySet = new Set(['new', 'updated']); + +/** The published package version the docs describe, from `packages/devtools/package.json`. */ +export const DOCS_PACKAGE_VERSION: string = packageVersion; + +export interface BadgedItem { + status?: BadgeVariant; + until?: string; +} + +/** `major.minor.patch` as numbers. A prerelease or build suffix is ignored. */ +export function parseVersion(value: string): [number, number, number] | null { + const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(value.trim()); + return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : null; +} + +/** Negative when `a` is older than `b`, 0 when equal, positive when newer. */ +export function compareVersions(a: string, b: string): number { + const left = parseVersion(a); + const right = parseVersion(b); + if (!left || !right) return Number.NaN; + for (let i = 0; i < 3; i++) { + if (left[i] !== right[i]) return left[i] - right[i]; + } + return 0; +} + +/** Whether the badge is an announcement (`new`, `updated`) that needs an `until`. */ +export function isExpiringBadge(status: BadgeVariant): boolean { + return EXPIRING.has(status); +} + +/** + * The badge to show beside a sidebar item, or `null`. A badge with `until` + * shows while the package version is older than `until`. A `new` or + * `updated` badge without `until` never shows, so it can't stay forever. + */ +export function activeBadge(item: BadgedItem, version = DOCS_PACKAGE_VERSION): BadgeVariant | null { + const {status, until} = item; + if (!status) return null; + if (until === undefined) return isExpiringBadge(status) ? null : status; + return compareVersions(version, until) < 0 ? status : null; +} diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts index 7a74c32a..6a3d3555 100644 --- a/apps/docs/src/ngmd.config.ts +++ b/apps/docs/src/ngmd.config.ts @@ -15,6 +15,12 @@ export interface NavItem { * (`new`, `updated`, `alpha`, `beta`, `stable`, `deprecated`), so the * sidebar chip and inline `` always stay in sync. */ status?: BadgeVariant; + /** The `@pangular-inspector/devtools` version the badge expires at, such as + * `'1.2.0'`. The chip shows while the package version in + * `packages/devtools/package.json` is older. `new` and `updated` need it: + * set it to the minor after the release that ships the page, so the badge + * disappears with the next minor release. See `nav-badges.ts`. */ + until?: string; } export interface NavSection { @@ -177,22 +183,54 @@ const config: NgmdConfig = { items: [ {label: 'Quick start', href: '/getting-started/quick-start'}, {label: 'Introduction', href: '/getting-started/introduction'}, - {label: 'Installation', href: '/getting-started/installation'}, + {label: 'Features', href: '/getting-started/features', status: 'new', until: '1.2.0'}, + { + label: 'Installation', + href: '/getting-started/installation', + status: 'updated', + until: '1.2.0', + }, {label: 'Angular CLI and Express', href: '/getting-started/express'}, {label: 'Hono, h3 and Fastify', href: '/getting-started/other-servers'}, - {label: 'Vite and Analog', href: '/getting-started/vite'}, + { + label: 'Vite and Analog', + href: '/getting-started/vite', + status: 'updated', + until: '1.2.0', + }, {label: 'Standalone CLI', href: '/getting-started/cli'}, {label: 'Configuration', href: '/getting-started/configuration'}, {label: 'Popup and hub', href: '/getting-started/popup-and-hub'}, {label: 'Command palette', href: '/getting-started/command-palette'}, + { + label: 'Keyboard shortcuts', + href: '/getting-started/keyboard-shortcuts', + status: 'new', + until: '1.2.0', + }, {label: 'Terminals', href: '/getting-started/terminals'}, {label: 'Settings', href: '/getting-started/settings'}, {label: 'Browser overlay', href: '/getting-started/overlay'}, {label: 'Chrome extension', href: '/getting-started/chrome-extension'}, - {label: 'Angular Native', href: '/getting-started/angular-native'}, - {label: 'NativeScript', href: '/getting-started/nativescript'}, - {label: 'Platforms', href: '/getting-started/platforms'}, - {label: 'Troubleshooting', href: '/getting-started/troubleshooting'}, + { + label: 'Angular Native', + href: '/getting-started/angular-native', + status: 'updated', + until: '1.2.0', + }, + { + label: 'NativeScript', + href: '/getting-started/nativescript', + status: 'updated', + until: '1.2.0', + }, + {label: 'Platforms', href: '/getting-started/platforms', status: 'new', until: '1.2.0'}, + { + label: 'Troubleshooting', + href: '/getting-started/troubleshooting', + status: 'new', + until: '1.2.0', + }, ], }, { @@ -220,9 +258,11 @@ const config: NgmdConfig = { items: [ {label: 'MCP server', href: '/agents/mcp-server'}, {label: 'Tools', href: '/agents/tools'}, + {label: 'Tool index', href: '/agents/tool-index', status: 'new', until: '1.2.0'}, {label: 'Resources', href: '/agents/resources'}, {label: 'Browser agents', href: '/agents/browser-agents'}, {label: 'Agent skills', href: '/agents/skills'}, + {label: 'Recipes for agents', href: '/agents/recipes', status: 'new', until: '1.2.0'}, ], }, { diff --git a/apps/docs/src/types/badge.ts b/apps/docs/src/types/badge.ts index d9d961f4..7d7579fc 100644 --- a/apps/docs/src/types/badge.ts +++ b/apps/docs/src/types/badge.ts @@ -4,7 +4,8 @@ * One map, two consumers: * - `` (`src/app/ui/badge.ts`): inline status pill * - sidebar status chip (`src/app/components/sidebar.ts`), driven by - * `NavItem.status` declared in `ngmd.config.ts` + * `NavItem.status` declared in `ngmd.config.ts`, hidden once its + * `until` version is reached (`src/nav-badges.ts`) * * Add a row here to define a new variant. Both the inline component and * the sidebar pick it up without further edits. diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 5e79f72c..8c15c3f8 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -12,6 +12,7 @@ "declaration": false, "experimentalDecorators": true, "moduleResolution": "bundler", + "resolveJsonModule": true, "rewriteRelativeImportExtensions": true, "isolatedModules": true, "importHelpers": true, From d3bfac8b7d132806cdacf55e22873c520ad44bec Mon Sep 17 00:00:00 2001 From: erKam Date: Sat, 7 Nov 2026 15:10:04 +0000 Subject: [PATCH 09/19] build(extension): rebuild the panel with the platforms link --- ...=> browser-agent-rpc-KH4HHvHf-Of9JOtz4.js} | 2 +- .../{index-g9zn2eza.js => index-DWA0V8Ca.js} | 169 ++++++++++-------- extension/ui/index.html | 2 +- 3 files changed, 98 insertions(+), 75 deletions(-) rename extension/ui/assets/{browser-agent-rpc-KH4HHvHf-CD3-sSAR.js => browser-agent-rpc-KH4HHvHf-Of9JOtz4.js} (95%) rename extension/ui/assets/{index-g9zn2eza.js => index-DWA0V8Ca.js} (77%) diff --git a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-CD3-sSAR.js b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-Of9JOtz4.js similarity index 95% rename from extension/ui/assets/browser-agent-rpc-KH4HHvHf-CD3-sSAR.js rename to extension/ui/assets/browser-agent-rpc-KH4HHvHf-Of9JOtz4.js index aeb451dc..52640e58 100644 --- a/extension/ui/assets/browser-agent-rpc-KH4HHvHf-CD3-sSAR.js +++ b/extension/ui/assets/browser-agent-rpc-KH4HHvHf-Of9JOtz4.js @@ -1 +1 @@ -import{t as e}from"./index-g9zn2eza.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(){let e=typeof document>`u`?void 0:document;return{url:e?.location?.href??``,title:e?.title??``,visible:!e||e.visibilityState===`visible`,focused:e?.hasFocus()??!0}}function u(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,l()).catch(()=>{}))}))},s=a(o),u=e.events.on(`connection:status`,e=>{e===`connected`&&o()}),d=typeof window>`u`?void 0:window;return d?.addEventListener(`focus`,o),d?.addEventListener(`blur`,o),d?.document.addEventListener(`visibilitychange`,o),o(),()=>{n=!0,s(),u(),d?.removeEventListener(`focus`,o),d?.removeEventListener(`blur`,o),d?.document.removeEventListener(`visibilitychange`,o)}}export{u as setupBrowserAgentRpcBridge}; \ No newline at end of file +import{t as e}from"./index-DWA0V8Ca.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(){let e=typeof document>`u`?void 0:document;return{url:e?.location?.href??``,title:e?.title??``,visible:!e||e.visibilityState===`visible`,focused:e?.hasFocus()??!0}}function u(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,l()).catch(()=>{}))}))},s=a(o),u=e.events.on(`connection:status`,e=>{e===`connected`&&o()}),d=typeof window>`u`?void 0:window;return d?.addEventListener(`focus`,o),d?.addEventListener(`blur`,o),d?.document.addEventListener(`visibilitychange`,o),o(),()=>{n=!0,s(),u(),d?.removeEventListener(`focus`,o),d?.removeEventListener(`blur`,o),d?.document.removeEventListener(`visibilitychange`,o)}}export{u as setupBrowserAgentRpcBridge}; \ No newline at end of file diff --git a/extension/ui/assets/index-g9zn2eza.js b/extension/ui/assets/index-DWA0V8Ca.js similarity index 77% rename from extension/ui/assets/index-g9zn2eza.js rename to extension/ui/assets/index-DWA0V8Ca.js index b396cf55..471ecaa2 100644 --- a/extension/ui/assets/index-g9zn2eza.js +++ b/extension/ui/assets/index-DWA0V8Ca.js @@ -3,12 +3,12 @@ \r \v ᠎ - \u2028\u2029   `;`${Kt}`,`${Kt}`;var qt=(function(e){return e[e.Character=0]=`Character`,e[e.Identifier=1]=`Identifier`,e[e.PrivateIdentifier=2]=`PrivateIdentifier`,e[e.Keyword=3]=`Keyword`,e[e.String=4]=`String`,e[e.Operator=5]=`Operator`,e[e.Number=6]=`Number`,e[e.RegExpBody=7]=`RegExpBody`,e[e.RegExpFlags=8]=`RegExpFlags`,e[e.Error=9]=`Error`,e})(qt||{}),Jt=(function(e){return e[e.Plain=0]=`Plain`,e[e.TemplateLiteralPart=1]=`TemplateLiteralPart`,e[e.TemplateLiteralEnd=2]=`TemplateLiteralEnd`,e})(Jt||{});qt.Character,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Attribute,x.Property,x.Attribute,x.Control,x.DomProperty,x.DomProperty,x.Attribute,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Listener,x.TwoWayListener,x.AnimationListener,x.StyleMap,x.ClassMap,x.StyleProp,x.ClassProp,x.Property,x.TwoWayProperty,x.DomProperty,x.Attribute,x.Animation,x.Control,Vt.Idle,b.deferOnIdle,b.deferPrefetchOnIdle,b.deferHydrateOnIdle,Vt.Immediate,b.deferOnImmediate,b.deferPrefetchOnImmediate,b.deferHydrateOnImmediate,Vt.Timer,b.deferOnTimer,b.deferPrefetchOnTimer,b.deferHydrateOnTimer,Vt.Hover,b.deferOnHover,b.deferPrefetchOnHover,b.deferHydrateOnHover,Vt.Interaction,b.deferOnInteraction,b.deferPrefetchOnInteraction,b.deferHydrateOnInteraction,Vt.Viewport,b.deferOnViewport,b.deferPrefetchOnViewport,b.deferHydrateOnViewport,Vt.Never,b.deferHydrateNever,b.deferHydrateNever,b.deferHydrateNever,b.pipeBind1,b.pipeBind2,b.pipeBind3,b.pipeBind4,b.textInterpolate,b.textInterpolate1,b.textInterpolate2,b.textInterpolate3,b.textInterpolate4,b.textInterpolate5,b.textInterpolate6,b.textInterpolate7,b.textInterpolate8,b.textInterpolateV,b.interpolate,b.interpolate1,b.interpolate2,b.interpolate3,b.interpolate4,b.interpolate5,b.interpolate6,b.interpolate7,b.interpolate8,b.interpolateV,b.pureFunction0,b.pureFunction1,b.pureFunction2,b.pureFunction3,b.pureFunction4,b.pureFunction5,b.pureFunction6,b.pureFunction7,b.pureFunction8,b.pureFunctionV,b.resolveWindow,b.resolveDocument,b.resolveBody,nt.HTML,b.sanitizeHtml,nt.RESOURCE_URL,b.sanitizeResourceUrl,nt.SCRIPT,b.sanitizeScript,nt.STYLE,b.sanitizeStyle,nt.URL,b.sanitizeUrl,nt.ATTRIBUTE_NO_BINDING,b.validateAttribute,nt.HTML,b.trustConstantHtml,nt.RESOURCE_URL,b.trustConstantResourceUrl;var Yt=(function(e){return e[e.None=0]=`None`,e[e.ViewContextRead=1]=`ViewContextRead`,e[e.ViewContextWrite=2]=`ViewContextWrite`,e[e.SideEffectful=4]=`SideEffectful`,e})(Yt||{});S.Tmpl,S.Tmpl,S.Both,S.Host,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Tmpl,S.Both,S.Both,S.Both,S.Both,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Both,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Tmpl,S.Both,S.Both,S.Both,Tt.Property,It.Property,Tt.TwoWay,It.TwoWayProperty,Tt.Attribute,It.Attribute,Tt.Class,It.ClassName,Tt.Style,It.StyleProperty,Tt.LegacyAnimation,It.LegacyAnimation,Tt.Animation,It.Animation;var Xt=`%COMP%`;`${Xt}`,`${Xt}`,class e{static SINGLETON=new e;static veWillInferAnyFor(t){let n=e.SINGLETON;return t instanceof wt?t.visit(n):t.receiver.visit(n)}visitUnary(e){return e.expr.visit(this)}visitBinary(e){return e.left.visit(this)||e.right.visit(this)}visitChain(){return!1}visitConditional(e){return e.condition.visit(this)||e.trueExp.visit(this)||e.falseExp.visit(this)}visitCall(){return!0}visitSafeCall(){return!1}visitImplicitReceiver(){return!1}visitThisReceiver(){return!1}visitInterpolation(e){return e.expressions.some(e=>e.visit(this))}visitKeyedRead(){return!1}visitLiteralArray(){return!0}visitLiteralMap(){return!0}visitLiteralPrimitive(){return!1}visitPipe(){return!0}visitPrefixNot(e){return e.expression.visit(this)}visitTypeofExpression(e){return e.expression.visit(this)}visitVoidExpression(e){return e.expression.visit(this)}visitNonNullAssert(e){return e.expression.visit(this)}visitPropertyRead(){return!1}visitSafePropertyRead(){return!1}visitSafeKeyedRead(){return!1}visitTemplateLiteral(){return!1}visitTemplateLiteralElement(){return!1}visitTaggedTemplateLiteral(){return!1}visitParenthesizedExpression(e){return e.expression.visit(this)}visitRegularExpressionLiteral(){return!1}visitSpreadElement(e){return e.expression.visit(this)}visitArrowFunction(e,t){return!1}};var Zt=null,Qt=!1,$t=1,en=null,tn=Symbol(`SIGNAL`);function nn(e){let t=Zt;return Zt=e,t}function rn(){return Zt}var an={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:`unknown`,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function on(e){if(Qt)throw Error(``);if(Zt===null)return;Zt.consumerOnSignalRead(e);let t=Zt.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=Zt.recomputing;if(r&&(n=t===void 0?Zt.producers:t.nextProducer,n!==void 0&&n.producer===e)){Zt.producersTail=n,n.lastReadVersion=e.version,n.knownValidAtEpoch=$t;return}let i=e.consumersTail;if(i!==void 0&&i.consumer===Zt&&(!r||i.knownValidAtEpoch===$t))return;let a=xn(Zt),o={producer:e,consumer:Zt,nextProducer:n,prevConsumer:void 0,knownValidAtEpoch:$t,lastReadVersion:e.version,nextConsumer:void 0};Zt.producersTail=o,t===void 0?Zt.producers=o:t.nextProducer=o,a&&yn(e,o)}function sn(){$t++}function cn(e){if((!xn(e)||e.dirty)&&(e.dirty||e.lastCleanEpoch!==$t)){if(!e.producerMustRecompute(e)&&!_n(e)){fn(e);return}e.producerRecomputeValue(e),fn(e)}}function ln(e){if(e.consumers===void 0)return;let t=Qt;Qt=!0;try{for(let t=e.consumers;t!==void 0;t=t.nextConsumer){let e=t.consumer;e.dirty||dn(e)}}finally{Qt=t}}function un(){return Zt?.consumerAllowSignalWrites!==!1}function dn(e){e.dirty=!0,ln(e),e.consumerMarkedDirty?.(e)}function fn(e){e.dirty=!1,e.lastCleanEpoch=$t}function pn(e){return e&&mn(e),nn(e)}function mn(e){if(e.producersTail?.knownValidAtEpoch===$t){let t=e.producers;for(;t!==void 0;)t.knownValidAtEpoch=null,t=t.nextProducer}e.producersTail=void 0,e.recomputing=!0}function hn(e,t){nn(t),e&&gn(e)}function gn(e){e.recomputing=!1;let t=e.producersTail,n=t===void 0?e.producers:t.nextProducer;if(n!==void 0){if(xn(e))do n=bn(n);while(n!==void 0);t===void 0?e.producers=void 0:t.nextProducer=void 0}}function _n(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let e=t.producer,n=t.lastReadVersion;if(n!==e.version||(cn(e),n!==e.version))return!0}return!1}function vn(e){if(xn(e)){let t=e.producers;for(;t!==void 0;)t=bn(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function yn(e,t){let n=e.consumersTail,r=xn(e);if(n===void 0?(t.nextConsumer=void 0,e.consumers=t):(t.nextConsumer=n.nextConsumer,n.nextConsumer=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let t=e.producers;t!==void 0;t=t.nextProducer)yn(t.producer,t)}function bn(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,i=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r===void 0?t.consumersTail=i:r.prevConsumer=i,i!==void 0)i.nextConsumer=r;else if(t.consumers=r,!xn(t)){let e=t.producers;for(;e!==void 0;)e=bn(e)}return n}function xn(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function Sn(e){en?.(e)}function Cn(e,t){return Object.is(e,t)}function wn(e,t){let n=Object.create(On);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(cn(n),on(n),n.value===Dn)throw n.error;return n.value};return r[tn]=n,Sn(n),r}var Tn=Symbol(`UNSET`),En=Symbol(`COMPUTING`),Dn=Symbol(`ERRORED`),On={...an,value:Tn,dirty:!0,error:null,equal:Cn,kind:`computed`,producerMustRecompute(e){return e.value===Tn||e.value===En},producerRecomputeValue(e){if(e.value===En)throw Error(``);let t=e.value;e.value=En;let n=pn(e),r,i=!1;try{r=e.computation(),nn(null),i=t!==Tn&&t!==Dn&&r!==Dn&&e.equal(t,r)}catch(t){r=Dn,e.error=t}finally{hn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function kn(){throw Error()}var An=kn;function jn(e){An(e)}function Mn(e){An=e}var Nn=null;function Pn(e,t){let n=Object.create(Rn);n.value=e,t!==void 0&&(n.equal=t);let r=()=>Fn(n);return r[tn]=n,Sn(n),[r,e=>In(n,e),e=>Ln(n,e)]}function Fn(e){return on(e),e.value}function In(e,t){un()||jn(e),e.equal(e.value,t)||(e.value=t,zn(e))}function Ln(e,t){un()||jn(e),In(e,t(e.value))}var Rn={...an,equal:Cn,value:void 0,kind:`signal`};function zn(e){e.version++,sn(),ln(e),Nn?.(e)}var Bn={...an,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:`effect`};function Vn(e){if(e.dirty=!1,e.version>0&&!_n(e))return;e.version++;let t=pn(e);try{e.cleanup(),e.fn()}finally{hn(e,t)}}var Hn=void 0;function Un(){return Hn}function Wn(e){let t=Hn;return Hn=e,t}var Gn=Symbol(`NotFound`);function Kn(e){return e===Gn||e?.name===`ɵNotFound`}function qn(e,t,n){let r=Object.create(Xn);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(cn(r),on(r),r.value===Dn)throw r.error;return r.value};return i[tn]=r,Sn(r),i}function Jn(e,t){cn(e),In(e,t),fn(e)}function Yn(e,t){if(cn(e),e.value===Dn)throw e.error;Ln(e,t),fn(e)}var Xn={...an,value:Tn,dirty:!0,error:null,equal:Cn,kind:`linkedSignal`,producerMustRecompute(e){return e.value===Tn||e.value===En},producerRecomputeValue(e){if(e.value===En)throw Error(``);let t=e.value;e.value=En;let n=pn(e),r,i=!1;try{let n=e.source(),a=t!==Tn&&t!==Dn,o=a?{source:e.sourceValue,value:t}:void 0;r=e.computation(n,o),e.sourceValue=n,nn(null),i=a&&r!==Dn&&e.equal(t,r)}catch(t){r=Dn,e.error=t}finally{hn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function Zn(e){let t=nn(null);try{return e()}finally{nn(t)}}var Qn=function(e,t){return Qn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Qn(e,t)};function $n(e,t){if(typeof t!=`function`&&t!==null)throw TypeError(`Class extends value `+String(t)+` is not a constructor or null`);Qn(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}function er(e,t,n,r){function i(e){return e instanceof n?e:new n(function(t){t(e)})}return new(n||=Promise)(function(n,a){function o(e){try{c(r.next(e))}catch(e){a(e)}}function s(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){e.done?n(e.value):i(e.value).then(o,s)}c((r=r.apply(e,t||[])).next())})}function tr(e,t){var n={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},r,i,a,o=Object.create((typeof Iterator==`function`?Iterator:Object).prototype);return o.next=s(0),o.throw=s(1),o.return=s(2),typeof Symbol==`function`&&(o[Symbol.iterator]=function(){return this}),o;function s(e){return function(t){return c([e,t])}}function c(s){if(r)throw TypeError(`Generator is already executing.`);for(;o&&(o=0,s[0]&&(n=0)),n;)try{if(r=1,i&&(a=s[0]&2?i.return:s[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,s[1])).done)return a;switch(i=0,a&&(s=[s[0]&2,a.value]),s[0]){case 0:case 1:a=s;break;case 4:return n.label++,{value:s[1],done:!1};case 5:n.label++,i=s[1],s=[0];continue;case 7:s=n.ops.pop(),n.trys.pop();continue;default:if(a=n.trys,!(a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){n=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw TypeError(t?`Object is not iterable.`:`Symbol.iterator is not defined.`)}function rr(e,t){var n=typeof Symbol==`function`&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),i,a=[],o;try{for(;(t===void 0||t-->0)&&!(i=r.next()).done;)a.push(i.value)}catch(e){o={error:e}}finally{try{i&&!i.done&&(n=r.return)&&n.call(r)}finally{if(o)throw o.error}}return a}function ir(e,t,n){if(n||arguments.length===2)for(var r=0,i=t.length,a;r1||c(e,t)})},t&&(i[e]=t(i[e])))}function c(e,t){try{l(r[e](t))}catch(e){f(a[0][3],e)}}function l(e){e.value instanceof ar?Promise.resolve(e.value.v).then(u,d):f(a[0][2],e)}function u(e){c(`next`,e)}function d(e){c(`throw`,e)}function f(e,t){e(t),a.shift(),a.length&&c(a[0][0],a[0][1])}}function sr(e){if(!Symbol.asyncIterator)throw TypeError(`Symbol.asyncIterator is not defined.`);var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof nr==`function`?nr(e):e[Symbol.iterator](),n={},r(`next`),r(`throw`),r(`return`),n[Symbol.asyncIterator]=function(){return this},n);function r(t){n[t]=e[t]&&function(n){return new Promise(function(r,a){n=e[t](n),i(r,a,n.done,n.value)})}}function i(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)}}function cr(e){return typeof e==`function`}function lr(e){var t=e(function(e){Error.call(e),e.stack=Error().stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var ur=lr(function(e){return function(t){e(this),this.message=t?t.length+` errors occurred during unsubscription: `+t.map(function(e,t){return t+1+`) `+e.toString()}).join(` `):``,this.name=`UnsubscriptionError`,this.errors=t}});function dr(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var fr=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=nr(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(cr(c))try{c()}catch(e){i=e instanceof ur?e.errors:[e]}var l=this._finalizers;if(l){this._finalizers=null;try{for(var u=nr(l),d=u.next();!d.done;d=u.next()){var f=d.value;try{hr(f)}catch(e){i??=[],e instanceof ur?i=ir(ir([],rr(i)),rr(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 ur(i)}},e.prototype.add=function(t){if(t&&t!==this){if(this.closed)hr(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)&&dr(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&dr(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e}(),pr=fr.EMPTY;function mr(e){return e instanceof fr||e&&`closed`in e&&cr(e.remove)&&cr(e.add)&&cr(e.unsubscribe)}function hr(e){cr(e)?e():e.unsubscribe()}var gr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},_r={setTimeout:function(e,t){var n=[...arguments].slice(2),r=_r.delegate;return r?.setTimeout?r.setTimeout.apply(r,ir([e,t],rr(n))):setTimeout.apply(void 0,ir([e,t],rr(n)))},clearTimeout:function(e){return(_r.delegate?.clearTimeout||clearTimeout)(e)},delegate:void 0};function vr(e){_r.setTimeout(function(){var t=gr.onUnhandledError;if(t)t(e);else throw e})}function yr(){}var br=(function(){return Cr(`C`,void 0,void 0)})();function xr(e){return Cr(`E`,void 0,e)}function Sr(e){return Cr(`N`,e,void 0)}function Cr(e,t,n){return{kind:e,value:t,error:n}}var wr=null;function Tr(e){if(gr.useDeprecatedSynchronousErrorHandling){var t=!wr;if(t&&(wr={errorThrown:!1,error:null}),e(),t){var n=wr,r=n.errorThrown,i=n.error;if(wr=null,r)throw i}}else e()}function Er(e){gr.useDeprecatedSynchronousErrorHandling&&wr&&(wr.errorThrown=!0,wr.error=e)}var Dr=function(e){$n(t,e);function t(t){var n=e.call(this)||this;return n.isStopped=!1,t?(n.destination=t,mr(t)&&t.add(n)):n.destination=Fr,n}return t.create=function(e,t,n){return new jr(e,t,n)},t.prototype.next=function(e){this.isStopped?Pr(Sr(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?Pr(xr(e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?Pr(br,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}(fr),Or=Function.prototype.bind;function kr(e,t){return Or.call(e,t)}var Ar=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){Mr(e)}},e.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(e){Mr(e)}else Mr(e)},e.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(e){Mr(e)}},e}(),jr=function(e){$n(t,e);function t(t,n,r){var i=e.call(this)||this,a;if(cr(t)||!t)a={next:t??void 0,error:n??void 0,complete:r??void 0};else{var o;i&&gr.useDeprecatedNextContext?(o=Object.create(t),o.unsubscribe=function(){return i.unsubscribe()},a={next:t.next&&kr(t.next,o),error:t.error&&kr(t.error,o),complete:t.complete&&kr(t.complete,o)}):a=t}return i.destination=new Ar(a),i}return t}(Dr);function Mr(e){gr.useDeprecatedSynchronousErrorHandling?Er(e):vr(e)}function Nr(e){throw e}function Pr(e,t){var n=gr.onStoppedNotification;n&&_r.setTimeout(function(){return n(e,t)})}var Fr={closed:!0,next:yr,error:Nr,complete:yr},Ir=(function(){return typeof Symbol==`function`&&Symbol.observable||`@@observable`})();function Lr(e){return e}function Rr(e){return e.length===0?Lr:e.length===1?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}}var zr=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=Hr(e)?e:new jr(e,t,n);return Tr(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=Br(t),new t(function(t,r){var i=new jr({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[Ir]=function(){return this},e.prototype.pipe=function(){return Rr([...arguments])(this)},e.prototype.toPromise=function(e){var t=this;return e=Br(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 Br(e){return e??gr.Promise??Promise}function Vr(e){return e&&cr(e.next)&&cr(e.error)&&cr(e.complete)}function Hr(e){return e&&e instanceof Dr||Vr(e)&&mr(e)}function Ur(e){return cr(e?.lift)}function Wr(e){return function(t){if(Ur(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 Gr(e,t,n,r,i){return new Kr(e,t,n,r,i)}var Kr=function(e){$n(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}(Dr),qr=lr(function(e){return function(){e(this),this.name=`ObjectUnsubscribedError`,this.message=`object unsubscribed`}}),Jr=function(e){$n(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 Yr(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new qr},t.prototype.next=function(e){var t=this;Tr(function(){var n,r;if(t._throwIfClosed(),!t.isStopped){t.currentObservers||=Array.from(t.observers);try{for(var i=nr(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;Tr(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;Tr(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?pr:(this.currentObservers=null,a.push(e),new fr(function(){t.currentObservers=null,dr(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 zr;return e.source=this,e},t.create=function(e,t){return new Yr(e,t)},t}(zr),Yr=function(e){$n(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)??pr},t}(Jr),Xr=function(e){$n(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}(Jr);function Zr(e){return e[e.length-1]}function Qr(e){return cr(Zr(e))?e.pop():void 0}var $r=(function(e){return e&&typeof e.length==`number`&&typeof e!=`function`});function ei(e){return cr(e?.then)}function ti(e){return cr(e[Ir])}function ni(e){return Symbol.asyncIterator&&cr(e?.[Symbol.asyncIterator])}function ri(e){return TypeError(`You provided `+(typeof e==`object`&&e?`an invalid object`:`'`+e+`'`)+` where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function ii(){return typeof Symbol!=`function`||!Symbol.iterator?`@@iterator`:Symbol.iterator}var ai=ii();function oi(e){return cr(e?.[ai])}function si(e){return or(this,arguments,function(){var t,n,r,i;return tr(this,function(a){switch(a.label){case 0:t=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,ar(t.read())];case 3:return n=a.sent(),r=n.value,i=n.done,i?[4,ar(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ar(r)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function ci(e){return cr(e?.getReader)}function li(e){if(e instanceof zr)return e;if(e!=null){if(ti(e))return uee(e);if($r(e))return dee(e);if(ei(e))return fee(e);if(ni(e))return ui(e);if(oi(e))return pee(e);if(ci(e))return mee(e)}throw ri(e)}function uee(e){return new zr(function(t){var n=e[Ir]();if(cr(n.subscribe))return n.subscribe(t);throw TypeError(`Provided object does not correctly implement Symbol.observable`)})}function dee(e){return new zr(function(t){for(var n=0;n=0?n.slice(0,r):n}function Ci(e,t){return e?t?`${e} ${t}`:e:t||``}var wi=bi({__forward_ref__:bi});function Ti(e){return e.__forward_ref__=Ti,e}function Ei(e){return Di(e)?e():e}function Di(e){return typeof e==`function`&&Object.hasOwn(e,wi)&&e.__forward_ref__===Ti}function Oi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ki(e){return Ai(e,Ni)}function Ai(e,t){return Object.hasOwn(e,t)&&e[t]||null}function ji(e){return(e?.[Ni]??null)||null}function Mi(e){return e&&Object.hasOwn(e,Pi)?e[Pi]:null}var Ni=bi({ɵprov:bi}),Pi=bi({ɵinj:bi}),Fi=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=Oi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ii(e){return e&&!!e.ɵproviders}var Li=bi({ɵcmp:bi}),Ri=bi({ɵdir:bi}),zi=bi({ɵpipe:bi}),Bi=bi({ɵfac:bi}),Vi=bi({__NG_ELEMENT_ID__:bi}),Hi=bi({__NG_ENV_ID__:bi});function Ui(e){return Ki(e,`@Component`),e[Li]||null}function Wi(e){return Ki(e,`@Directive`),e[Ri]||null}function Gi(e){return Ki(e,`@Pipe`),e[zi]||null}function Ki(e,t){if(e==null)throw new _i(-919,!1)}function qi(e){return typeof e==`string`?e:e==null?``:String(e)}var Ji=bi({ngErrorCode:bi}),Yi=bi({ngErrorMessage:bi}),Xi=bi({ngTokenPath:bi});function Zi(e,t){return $i(``,-200,t)}function Qi(e,t){throw new _i(-201,!1)}function $i(e,t,n){let r=new _i(t,e);return r[Ji]=t,r[Yi]=e,n&&(r[Xi]=n),r}function ea(e){return e[Ji]}var ta;function na(){return ta}function ra(e){let t=ta;return ta=e,t}function ia(e,t,n){let r=ki(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;Qi(e,``)}var aa=globalThis,oa={},sa=`__NG_DI_FLAG__`,ca=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=da(t)||0;try{return this.injector.get(e,n&8?null:oa,n)}catch(e){if(Kn(e))return e;throw e}}};function la(e,t=0){let n=Un();if(n===void 0)throw new _i(-203,!1);if(n===null)return ia(e,void 0,t);{let r=fa(t),i=n.retrieve(e,r);if(Kn(i)){if(r.optional)return null;throw i}return i}}function ua(e,t=0){return(na()||la)(Ei(e),t)}function C(e,t){return ua(e,da(t))}function da(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function fa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function pa(e){let t=[];for(let n=0;nArray.isArray(e)?va(e,t):t(e))}function ya(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ba(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function xa(e,t){let n=[];for(let r=0;rt;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function Ca(e,t,n){let r=Ta(e,t);return r>=0?e[r|1]=n:(r=~r,Sa(e,r,t,n)),r}function wa(e,t){let n=Ta(e,t);if(n>=0)return e[n|1]}function Ta(e,t){return Ea(e,t,1)}function Ea(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 va(t,e=>{let t=e;Ia(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Fa(i,a),n}function Fa(e,t){for(let n=0;n{t(e,r)})}}function Ia(e,t,n,r){if(e=Ei(e),!e)return!1;let i=null,a=Mi(e),o=!a&&Ui(e);if(!a&&!o){let t=e.ngModule;if(a=Mi(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)Ia(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{va(a.imports,i=>{Ia(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Fa(e,t)}if(!s){let e=ha(i)||(()=>new i);t({provide:i,useFactory:e,deps:Oa},i),t({provide:ja,useValue:i,multi:!0},i),t({provide:ka,useValue:()=>ua(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;La(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function La(e,t){for(let n of e)Ii(n)&&(n=n.ɵproviders),Array.isArray(n)?La(n,t):t(n)}var Ra=bi({provide:String,useValue:bi});function za(e){return typeof e==`object`&&!!e&&Ra in e}function Ba(e){return!!(e&&e.useExisting)}function Va(e){return!!(e&&e.useFactory)}function Ha(e){return typeof e==`function`}function Ua(e){return!!e.useClass}var Wa=new Fi(``),Ga={},Ka={},qa=void 0;function Ja(){return qa===void 0&&(qa=new Ma),qa}var Ya=class{},Xa=class extends Ya{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,oo(e,e=>this.processProvider(e)),this.records.set(Aa,no(void 0,this)),r.has(`environment`)&&this.records.set(Ya,no(void 0,this));let i=this.records.get(Wa);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(ja,Oa,{self:!0}))}retrieve(e,t){let n=da(t)||0;try{return this.get(e,oa,n)}catch(e){if(Kn(e))return e;throw e}}destroy(){to(this),this._destroyed=!0;let e=nn(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(),nn(e)}}onDestroy(e){return to(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){to(this);let t=Wn(this),n=ra(void 0);try{return e()}finally{Wn(t),ra(n)}}get(e,t=oa,n){if(to(this),Object.hasOwn(e,Hi))return e[Hi](this);let r=da(n),i=Wn(this),a=ra(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=ao(e)&&ki(e);t=n&&this.injectableDefInScope(n)?no(Za(e),Ga):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Ja():this.parent;return t=r&8&&t===oa?null:t,n.get(e,t)}catch(e){let t=ea(e);throw t===-200||t===-201?new _i(t,null):e}finally{ra(a),Wn(i)}}resolveInjectorInitializers(){let e=nn(null),t=Wn(this),n=ra(void 0);try{let e=this.get(ka,Oa,{self:!0});for(let t of e)t()}finally{Wn(t),ra(n),nn(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=Ei(e);let t=Ha(e)?e:Ei(e&&e.provide),n=$a(e);if(!Ha(e)&&e.multi===!0){let n=this.records.get(t);n||(n=no(void 0,Ga,!0),n.factory=()=>pa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=nn(null);try{if(t.value===Ka)throw Zi(``);return t.value===Ga&&(t.value=Ka,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&io(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{nn(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=Ei(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 Za(e){let t=ki(e),n=t===null?ha(e):t.factory;if(n!==null)return n;if(e instanceof Fi)throw new _i(-204,!1);if(e instanceof Function)return Qa(e);throw new _i(-204,!1)}function Qa(e){if(e.length>0)throw new _i(-204,!1);let t=ji(e);return t===null?()=>new e:()=>t.factory(e)}function $a(e){return za(e)?no(void 0,e.useValue):no(eo(e),Ga)}function eo(e,t,n){let r;if(Ha(e)){let t=Ei(e);return ha(t)||Za(t)}if(za(e))r=()=>Ei(e.useValue);else if(Va(e))r=()=>e.useFactory(...pa(e.deps||[]));else if(Ba(e))r=(t,n)=>ua(Ei(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=Ei(e&&(e.useClass||e.provide));if(ro(e))r=()=>new t(...pa(e.deps));else return ha(t)||Za(t)}return r}function to(e){if(e.destroyed)throw new _i(-205,!1)}function no(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function ro(e){return!!e.deps}function io(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function ao(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function oo(e,t){for(let n of e)Array.isArray(n)?oo(n,t):n&&Ii(n)?oo(n.ɵproviders,t):t(n)}function so(e,t){let n;e instanceof Xa?(to(e),n=e):n=new ca(e);let r=Wn(n),i=ra(void 0);try{return t()}finally{Wn(r),ra(i)}}function co(){return na()!==void 0||Un()!=null}var lo=1;function uo(e){return Array.isArray(e)&&typeof e[lo]==`object`}function fo(e){return Array.isArray(e)&&e[lo]===!0}function po(e){return!!(e.flags&4)}function mo(e){return e.componentOffset>-1}function ho(e){return(e.flags&1)==1}function go(e){return!!e.template}function _o(e){return!!(e[2]&512)}function vo(e){return(e[2]&256)==256}var yo=(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})(yo||{}),bo=`math`;function xo(e){for(;Array.isArray(e);)e=e[0];return e}function So(e,t){return xo(t[e])}function Co(e,t){return xo(t[e.index])}function wo(e,t){return e.data[t]}function To(e,t){return e[t]}function Eo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Do(e,t){let n=t[e];return uo(n)?n:n[0]}function Oo(e){return(e[2]&128)==128}function Pee(e){return fo(e[3])}function ko(e,t){return t==null?null:e[t]}function Ao(e){e[17]=0}function jo(e){e[2]&1024||(e[2]|=1024,Oo(e)&&Po(e))}function Fee(e,t){for(;e>0;)t=t[14],e--;return t}function Mo(e){return!!(e[2]&9216||e[24]?.dirty)}function No(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Mo(e)&&Po(e)}function Po(e){e[10].changeDetectionScheduler?.notify(0);let t=Io(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!Oo(t)));)t=Io(t)}function Fo(e,t){if(vo(e))throw new _i(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Iee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function Io(e){let t=e[3];return fo(t)?t[3]:t}function Lo(e){return e[7]??=[]}function Ro(e){return e.cleanup??=[]}function Lee(e,t,n,r){let i=Lo(t);i.push(n),e.firstCreatePass&&Ro(e).push(r,i.length-1)}var zo={lFrame:fs(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Bo=!1;function Ree(){return zo.lFrame.elementDepthCount}function zee(){zo.lFrame.elementDepthCount++}function Vo(){zo.lFrame.elementDepthCount--}function Ho(){return zo.bindingsEnabled}function Uo(){return zo.skipHydrationRootTNode!==null}function Wo(e){return zo.skipHydrationRootTNode===e}function Go(){zo.skipHydrationRootTNode=null}function Ko(){return zo.lFrame.lView}function qo(){return zo.lFrame.tView}function w(e){return zo.lFrame.contextLView=e,e[8]}function T(e){return zo.lFrame.contextLView=null,e}function Jo(){let e=Yo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Yo(){return zo.lFrame.currentTNode}function Bee(){let e=zo.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Xo(e,t){let n=zo.lFrame;n.currentTNode=e,n.isParent=t}function Zo(){return zo.lFrame.isParent}function Qo(){zo.lFrame.isParent=!1}function $o(){return zo.lFrame.contextLView}function es(){return Bo}function ts(e){let t=Bo;return Bo=e,t}function ns(){let e=zo.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function rs(){return zo.lFrame.bindingIndex}function Vee(e){return zo.lFrame.bindingIndex=e}function is(){return zo.lFrame.bindingIndex++}function as(e){let t=zo.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Hee(){return zo.lFrame.inI18n}function Uee(e,t){let n=zo.lFrame;n.bindingIndex=n.bindingRootIndex=e,os(t)}function Wee(){return zo.lFrame.currentDirectiveIndex}function os(e){zo.lFrame.currentDirectiveIndex=e}function Gee(e){let t=zo.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Kee(){return zo.lFrame.currentQueryIndex}function ss(e){zo.lFrame.currentQueryIndex=e}function cs(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ls(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=cs(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=zo.lFrame=ds();return r.currentTNode=t,r.lView=e,!0}function us(e){let t=ds(),n=e[1];zo.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function ds(){let e=zo.lFrame,t=e===null?null:e.child;return t===null?fs(e):t}function fs(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 ps(){let e=zo.lFrame;return zo.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ms=ps;function hs(){let e=ps();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 gs(e){return(zo.lFrame.contextLView=Fee(e,zo.lFrame.contextLView))[8]}function _s(){return zo.lFrame.selectedIndex}function vs(e){zo.lFrame.selectedIndex=e}function ys(){let e=zo.lFrame;return wo(e.tView,e.selectedIndex)}function E(){zo.lFrame.currentNamespace=`svg`}function bs(){xs()}function xs(){zo.lFrame.currentNamespace=null}function Ss(){return zo.lFrame.currentNamespace}var Cs=!0;function ws(){return Cs}function Ts(e){Cs=e}function Es(e,t=null,n=null,r){let i=Ds(e,t,n,r);return i.resolveInjectorInitializers(),i}function Ds(e,t=null,n=null,r,i=new Set){return new Xa([n||Oa,Na(e)],t||Ja(),null,i)}var Os=class e{static THROW_IF_NOT_FOUND=oa;static NULL=new Ma;static create(e,t){if(Array.isArray(e))return Es({name:``},t,e,``);{let t=e.name??``;return Es({name:t},e.parent,e.providers,t)}}static ɵprov=Oi({token:e,providedIn:`any`,factory:()=>ua(Aa)});static __NG_ELEMENT_ID__=-1},ks=new Fi(``),As=class{static __NG_ELEMENT_ID__=Ms;static __NG_ENV_ID__=e=>e},js=class extends As{_lView;constructor(e){super(),this._lView=e}get destroyed(){return vo(this._lView)}onDestroy(e){let t=this._lView;return Fo(t,e),()=>Iee(t,e)}};function Ms(){return new js(Ko())}var Ns=new Fi(``),Ps=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Xr(!1);debugTaskTracker=C(Ns,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new zr(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=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fs=class extends Jr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,co()&&(this.destroyRef=C(As,{optional:!0})??void 0,this.pendingTasks=C(Ps,{optional:!0})??void 0)}emit(e){let t=nn(null);try{super.next(e)}finally{nn(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 fr&&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 Is(...e){}function Ls(e){let t,n;function r(){e=Is;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 Rs(e){return queueMicrotask(()=>e()),()=>{e=Is}}var zs=`isAngularZone`,Bs=`isAngularZone_ID`,Vs=0,Hs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Fs(!1);onMicrotaskEmpty=new Fs(!1);onStable=new Fs(!1);onError=new Fs(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new _i(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,Ks(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(zs)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new _i(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new _i(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,Us,Is,Is);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)}},Us={};function Ws(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 Gs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Ls(()=>{e.callbackScheduled=!1,qs(e),e.isCheckStableRunning=!0,Ws(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),qs(e)}function Ks(e){let t=()=>{Gs(e)},n=Vs++;e._inner=e._inner.fork({name:`angular`,properties:{[zs]:!0,[Bs]:n,[Bs+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Zs(s))return n.invokeTask(i,a,o,s);try{return Js(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Ys(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Js(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Qs(s)&&t(),Ys(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,qs(e),Ws(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 qs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Js(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Ys(e){e._nesting--,Ws(e)}var Xs=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Fs;onMicrotaskEmpty=new Fs;onStable=new Fs;onError=new Fs;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 Zs(e){return $s(e,`__ignore_ng_zone__`)}function Qs(e){return $s(e,`__scheduler_tick__`)}function $s(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var ec=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},tc=new Fi(``,{factory:()=>{let e=C(Hs),t=C(Ya),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(ec),n.handleError(r))})}}}),nc={provide:ka,useValue:()=>{C(ec,{optional:!0})},multi:!0};function D(e,t){let[n,r,i]=Pn(e,t?.equal),a=n;return a[tn],a.set=r,a.update=i,a.asReadonly=rc.bind(a),a}function rc(){let e=this[tn];if(e.readonlyFn===void 0){let t=()=>this();t[tn]=e,e.readonlyFn=t}return e.readonlyFn}var ic=new Fi(``,{factory:()=>ac}),ac=`ng`,oc=new Fi(``),sc=new Fi(``,{providedIn:`platform`,factory:()=>`unknown`}),cc=new Fi(``,{factory:()=>C(ks).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),lc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=uc}return e})();function uc(){return new lc(Ko(),Jo())}var dc=class{},fc=new Fi(``,{factory:()=>!0}),pc=new Fi(``),mc=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new hc})}return e})(),hc=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}},gc=class{[tn];constructor(e){this[tn]=e}destroy(){this[tn].destroy()}};function _c(e,t){let n=t?.injector??C(Os),r=t?.manualCleanup===!0?null:n.get(As),i,a=n.get(lc,null,{optional:!0}),o=n.get(dc);return a===null?i=Sc(e,n.get(mc),o):(i=xc(a.view,o,e),r instanceof js&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new gc(i)}var vc={...Bn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ts(!1);try{Vn(this)}finally{ts(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=nn(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],nn(e)}}},yc={...vc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},bc={...vc,consumerMarkedDirty(){this.view[2]|=8192,Po(this.view),this.notifier.notify(13)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function xc(e,t,n){let r=Object.create(bc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=Cc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function Sc(e,t,n){let r=Object.create(yc);return r.fn=Cc(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 Cc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function wc(e){return typeof e==`function`&&e[tn]!==void 0}function Tc(e){return wc(e)&&typeof e.set==`function`}var Ec=Symbol(`InputSignalNode#UNSET`),Dc={...Rn,transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}};function Oc(e){return{toString:e}.toString()}var kc=(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})(kc||{}),Ac=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function jc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Mc=null,Nc=(()=>{Mc=Fc;let e=()=>Fc;return e.ngInherit=!0,e})();function Pc(){return Mc}function Fc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Lc),Ic}function Ic(){let e=zc(this),t=e?.current;if(t){let n=e.previous;if(n===Da)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Lc(e,t,n,r,i){let a=this.declaredInputs[r],o=zc(e)||Bc(e,{previous:Da,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Ac(l&&l.currentValue,n,c===Da),jc(e,t,i,n)}var Rc=`__ngSimpleChanges__`;function zc(e){return Object.hasOwn(e,Rc)&&e[Rc]||null}function Bc(e,t){return e[Rc]=t}var Vc=[],Hc=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,Yc(o,a)):Yc(o,a)}var Zc=-1,Qc=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 $c(e){return!!(e.flags&8)}function el(e){return!!(e.flags&16)}function tl(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function ll(e,t){let n=cl(e),r=t;for(;n>0;)r=r[14],n--;return r}var ul=!0;function dl(e){let t=ul;return ul=e,t}var fl=255,pl=5,ml=0,hl={};function gl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Vi)&&(r=n[Vi]),r??=n[Vi]=ml++;let i=r&fl,a=1<>pl)]|=a}function _l(e,t){let n=yl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let i=bl(e,t),a=e.injectorIndex;if(ol(i)){let e=sl(i),n=ll(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 vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function yl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function bl(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=Ll(i),r===null)return Zc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Zc}function xl(e,t,n){gl(e,t,n)}function Sl(e,t,n){if(n&8||e!==void 0)return e;Qi(t,`NodeInjector`)}function Cl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=ra(void 0);try{return i?i.get(t,r,n&8):ia(t,r,n&8)}finally{ra(a)}}return Sl(r,t,n)}function wl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Il(e,t,n,r,hl);if(i!==hl)return i}let i=Tl(e,t,n,r,hl);if(i!==hl)return i}return Cl(t,n,r,i)}function Tl(e,t,n,r,i){let a=kl(n);if(typeof a==`function`){if(!ls(t,e,r))return r&1?Sl(i,n,r):Cl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Qi(n);else return e}finally{ms()}}else if(typeof a==`number`){let i=null,o=yl(e,t),s=Zc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?bl(e,t):t[o+8],s===Zc||!jl(r,!1)?o=-1:(i=t[1],o=sl(s),t=ll(s,t)));o!==-1;){let e=t[1];if(Al(a,o,e.data)){let e=El(o,t,n,i,r,c);if(e!==hl)return e}s=t[o+8],s!==Zc&&jl(r,t[1].data[o+8]===c)&&Al(a,o,t)?(i=e,o=sl(s),t=ll(s,t)):o=-1}}return i}function El(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=Dl(s,o,n,r==null?mo(s)&&ul:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?hl:Ol(t,o,c,s,i)}function Dl(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&&go(e)&&e.type===n)return c}return null}function Ol(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Qc){let s=a;if(s.resolving)throw Zi(``);let c=dl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?ra(s.injectImpl):null;ls(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Uc(n,o[n],t)}finally{l!==null&&ra(l),dl(c),s.resolving=!1,ms()}}return a}function kl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Vi)?e[Vi]:void 0;return typeof t==`number`?t>=0?t&fl:Nl:t}function Al(e,t,n){let r=1<>pl)]&r)}function jl(e,t){return!(e&2)&&!(e&1&&t)}var Ml=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return wl(this._tNode,this._lView,e,da(n),t)}};function Nl(){return new Ml(Jo(),Ko())}function Pl(e){return Oc(()=>{let t=e.prototype.constructor,n=t[Bi]||Fl(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Bi]||Fl(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function Fl(e){return Di(e)?()=>{let t=Fl(Ei(e));return t&&t()}:ha(e)}function Il(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!_o(o);){let e=Tl(a,o,n,r|2,hl);if(e!==hl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,hl,r);if(t!==hl)return t}t=Ll(o),o=o[14]}a=t}return i}function Ll(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function Rl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function zl(){return Bl(Jo(),Ko())}function Bl(e,t){return new Vl(Co(e,t))}var Vl=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=zl}return e})();function Hl(e){return e instanceof Vl?e.nativeElement:e}function Ul(){return this._results[Symbol.iterator]()}var Wl=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 Jr}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=_a(e);(this._changesDetected=!ga(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]=Ul};function Gl(e){return(e.flags&128)==128}var Kl=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Kl||{}),ql=new Map,Jl=0;function Yl(){return Jl++}function Xl(e){ql.set(e[19],e)}function Zl(e){ql.delete(e[19])}var Ql=`__ngContext__`;function $l(e,t){uo(t)?(e[Ql]=t[19],Xl(t)):e[Ql]=t}function eu(e){return nu(e[12])}function tu(e){return nu(e[4])}function nu(e){for(;e!==null&&!fo(e);)e=e[4];return e}var ru=void 0;function iu(e){ru=e}function au(){if(ru!==void 0)return ru;if(typeof document<`u`)return document;throw new _i(210,!1)}var ou=!1,su=new Fi(``,{factory:()=>ou}),cu=new WeakMap;function lu(e,t){if(typeof e!=`object`||!e)return;let n=cu.get(e);n||(n=new WeakSet,cu.set(e,n)),n.add(t)}function uu(e){return(e.flags&32)==32}var du=()=>null;function fu(e,t,n=!1){return du(e,t,n)}function pu(e,t){let n=e.contentQueries;if(n!==null){let r=nn(null);try{for(let r=0;r|^->||--!>|)/g,Yee=`​$1​`;function Xee(e){return e.replace(qee,e=>e.replace(Jee,Yee))}function Zee(e,t){return e.createText(t)}function Qee(e,t,n){e.setValue(t,n)}function $ee(e,t){return e.createComment(Xee(t))}function Cu(e,t,n){return e.createElement(t,n)}function wu(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Tu(e,t,n){e.appendChild(t,n)}function Eu(e,t,n,r,i){r===null?Tu(e,t,n):wu(e,t,n,r,i)}function Du(e,t,n,r){e.removeChild(null,t,n,r)}function ete(e,t,n){e.setAttribute(t,`style`,n)}function tte(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&&tl(e,t,r),i!==null&&tte(e,t,i),a!==null&&ete(e,t,a)}function ku(e){let t=nte();return t?t.sanitize(yo.URL,e)||``:yu(e,`URL`)?vu(e):Su(qi(e))}function nte(){let e=Ko();return e&&e[10].sanitizer}function Au(e){return e.ownerDocument.defaultView}function ju(e){return e.ownerDocument}function rte(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 Mu=`ng-template`;function ite(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(Pu(r))return!1;o=!0}}}}}return Pu(r)||o}function Pu(e){return!(e&1)}function ste(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!==``&&!Pu(o)&&(t+=Iu(a,i),i=``),r=o,a||=!Pu(r);n++}return i!==``&&(t+=Iu(a,i)),t}function pte(e){return e.map(fte).join(`,`)}function mte(e){let t=[],n=[],r=1,i=2;for(;r!1});function Bu(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function Vu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function _te(e){let t=Vu(e,`transition-property`),n=Vu(e,`transition-duration`),r=Vu(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 vte(e){let t=Vu(e,`animation-name`),n=Vu(e,`animation-delay`),r=Vu(e,`animation-duration`),i=Vu(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 Hu(e,t){return e!==void 0&&e.duration>t.duration}function Uu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Wu(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 yte(e,t){let n=getComputedStyle(e),r=vte(n),i=_te(n),a=r.duration>i.duration?r:i;Hu(t.get(e),a)||Uu(a)&&t.set(e,a)}function bte(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?yte(e,t):xte(e,t,r)}function xte(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=Wu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Hu(t.get(e),r)||Uu(r)&&t.set(e,r)}var Gu=new Set,Ste=!1,Cte=1,Ku=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function wte(e){return e[9].get(gte,Ste)}function Tte(e,t,n){let r=Ju.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else Ju.set(e,{classList:t,cleanupFns:n})}function qu(e){let t=Ju.get(e);if(t){for(let e of t.cleanupFns)e();Ju.delete(e)}Yu.delete(e)}var Ju=new WeakMap,Yu=new WeakMap,Xu=new WeakMap;function Zu(e){return e?e[14]??e:null}var Qu=new WeakSet;function Ete(e,t,n){let r=Xu.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Zu(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),Qu.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 Dte(e,t,n){let r=Zu(n),i=Xu.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Xu.set(e,[{el:t,declarationView:r}])}function $u(e){let t=e[26]??={};return t.enter??=new Map}function Ote(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 ed(e){return e.composedPath?e.composedPath()[0]:e.target}function td(e,t){let n=Yu.get(t);if(n===void 0)return!0;if(t!==ed(e))return!1;let r=e.animation;if(r){let e=Wu(r);if(e!==void 0&&e+Cte{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),sd=[0,1,2,3],cd=(()=>{class e{ngZone=C(Hs);scheduler=C(dc);errorHandler=C(ec,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){C(rd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Hc(kc.AfterRenderHooksStart),this.executing=!0;for(let e of sd)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&&Hc(kc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),Po(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(nd.AFTER_NEXT_RENDER,e):e()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),ld=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 ud(e,t){let n=t?.injector??C(Os);return ad(`NgAfterNextRender`),jte(e,n,t,!0)}function Ate(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function jte(e,t,n,r){let i=t.get(od);i.impl??=t.get(cd);let a=t.get(rd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(As),s=t.get(lc,null,{optional:!0}),c=new ld(i.impl,Ate(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var dd=new Fi(``,{factory:()=>{let e=C(Ya),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function fd(e,t,n){let r=e.get(dd);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 Mte(e,t){let n=e.get(dd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Nte(e,t){let n=e.get(dd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Pte(e){let t=e.get(dd);t.isScheduled||=(ud(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Fte(e){let t=e.get(dd);t.scheduler=Pte,t.scheduler(e)}function pd(e,t){for(let[n,r]of t)fd(e,r.animateFns)}function md(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&pd(r,i)}function hd(e,t,n,r){try{n.get(Aa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Mte(n,i.enter.get(t.index).animateFns);let a=gd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];vd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Gu.add(e[19]),fd(n,()=>_d(e,t,i||void 0,a,r),i||void 0)}function gd(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 _d(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&&vd(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),bd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Gu.delete(e[19]),i(!0)})}else e&&Gu.delete(e[19]),i(!1)}function vd(e,t,n){if(t.type&12){let r=e[t.index];if(fo(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Gu.delete(e[19])),n(!0)})}function xd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;fo(i)?c=i:uo(i)&&(l=!0,i=i[0]);let u=xo(i);e===0&&r!==null?(md(s,r,a,n),o==null?Tu(t,r,u):wu(t,r,u,o||null,!0)):e===1&&r!==null?(md(s,r,a,n),wu(t,r,u,o||null,!0),Ete(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Dte(a,u,s),Qu.delete(u),hd(s,a,n,e=>{if(Qu.has(u)){Qu.delete(u);return}Du(t,u,l,e)})):e===3&&(Qu.delete(u),hd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Gd(t,e,n,c,a,r,o)}}function Sd(e,t){wd(e,t),t[0]=null,t[5]=null}function Cd(e,t,n,r,i,a){r[0]=i,r[5]=t,Vd(e,r,n,1,i,a)}function wd(e,t){t[10].changeDetectionScheduler?.notify(9),Vd(e,t,t[11],2,null,null)}function Td(e){let t=e[12];if(!t)return Od(e[1],e);for(;t;){let n=null;if(uo(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)uo(t)&&Od(t[1],t),t=t[3];t===null&&(t=e),uo(t)&&Od(t[1],t),n=t&&t[4]}t=n}}function Ed(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function Dd(e,t){if(vo(t))return;let n=t[11];n.destroyNode&&Vd(e,t,n,3,null,null),Td(t)}function Od(e,t){if(vo(t))return;let n=nn(null);try{t[2]&=-129,t[2]|=256,t[24]&&vn(t[24]),Ad(e,t),kd(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&fo(t[3])){n!==t[3]&&Ed(n,t);let r=t[18];r!==null&&r.detachView(e)}Zl(t)}finally{nn(n)}}function kd(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&&tf(e,t,27,!1),Hc(o?kc.TemplateUpdateStart:kc.TemplateCreateStart,i,n),n(r,i)}finally{vs(a),Hc(o?kc.TemplateUpdateEnd:kc.TemplateCreateEnd,i,n)}}function of(e,t,n){pf(e,t,n),(n.flags&64)==64&&mf(e,t,n)}function sf(e,t,n=Co){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a=s&&i<=c){let o=t.data[i],s=r[e+1];rf(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(rf(r,n[o],i,a),l=!0),l}function Tf(e,t){let n=Do(t,e),r=n[1];Ef(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=fu(i,n[9])),Hc(kc.ComponentStart);try{Df(r,n,n[8])}finally{Hc(kc.ComponentEnd,n[8])}}function Ef(e,t){for(let n=t.length;n{Po(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function zf(e){let t=e[24]??Object.create(Bf);return t.lView=e,t}var Bf={...an,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=Io(e.lView);for(;t&&!Vf(t[1]);)t=Io(t);t&&jo(t)},consumerOnSignalRead(){this.lView[24]=this}};function Vf(e){return e.type!==2}function Hf(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 Uf=100;function Wf(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{Gf(e,t)}finally{n.end?.()}}function Gf(e,t){let n=es();try{ts(!0),Zf(e,t);let n=0;for(;Mo(e);){if(n===Uf)throw new _i(103,!1);n++,Zf(e,1)}}finally{ts(n)}}function Kf(e,t,n,r){if(vo(t))return;let i=t[2];us(t);let a=!0,o=null,s=null;Vf(e)?(s=Ff(t),o=pn(s)):rn()===null?(a=!1,s=zf(t),o=pn(s)):t[24]&&=(vn(t[24]),null);try{Ao(t),Vee(e.bindingStartIndex),n!==null&&af(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Gc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Kc(t,n,0,null),qc(t,0)}if(Jf(t),Hf(t),qf(t,0),e.contentQueries!==null&&pu(e,t),a){let n=e.contentCheckHooks;n!==null&&Gc(t,n)}else{let n=e.contentHooks;n!==null&&Kc(t,n,1),qc(t,1)}$f(e,t);let o=e.components;o!==null&&Qf(t,o,0);let s=e.viewQuery;if(s!==null&&mu(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Gc(t,n)}else{let n=e.viewHooks;n!==null&&Kc(t,n,2),qc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}Nf(t),t[2]&=-73}catch(e){throw Po(t),e}finally{s!==null&&(hn(s,o),a&&Lf(s)),hs()}}function qf(e,t){for(let n=eu(e);n!==null;n=tu(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ba(e,10+t);Sd(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 op(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(ap(e,n),ba(t,n))}this._attachedToViewContainer=!1}Dd(this._lView[1],this._lView)}onDestroy(e){Fo(this._lView,e)}markForCheck(){ep(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){No(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,Wf(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new _i(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=_o(this._lView),t=this._lView[16];t!==null&&!e&&Ed(t,this._lView),wd(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new _i(902,!1);this._appRef=e;let t=_o(this._lView),n=this._lView[16];n!==null&&!t&&sp(n,this._lView),No(this._lView)}},lp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=up;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 cp(kf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function up(){return dp(Jo(),Ko())}function dp(e,t){return e.type&4?new lp(t,e,Bl(e,t)):null}function fp(e,t,n,r,i){let a=e.data[t];if(a===null)a=pp(e,t,n,r,i),Hee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Bee();a.injectorIndex=e===null?-1:e.injectorIndex}return Xo(a,!0),a}function pp(e,t,n,r,i){let a=Yo(),o=Zo(),s=o?a:a&&a.parent,c=e.data[t]=hp(e,s,n,t,r,i);return mp(e,c,a,o),c}function mp(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 hp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Uo()&&(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:Ss(),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 gp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?_p(e,n):r.push(e);e[6]=r}function _p(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,yp=()=>null;function bp(e,t){return vp(e,t)}function xp(e,t,n){return yp(e,t,n)}var Sp=class{},Cp=class{},wp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>Tp()};function Tp(){let e=Ko(),t=Do(Jo().index,e);return(uo(t)?t:e)[11]}var Ep=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>null})}return e})();function Dp(e){return e.debugInfo?.className||e.type.name||null}var Op={},kp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,Op,n);return r!==Op||t===Op?r:this.parentInjector.get(e,t,n)}};function Ap(e,t,n){return e[t]=n}function jp(e,t){return e[t]}function Mp(e,t,n){if(n===Lu)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function Np(e,t,n,r){let i=Mp(e,t,n);return Mp(e,t+1,r)||i}function Pp(e,t,n,r,i){let a=Np(e,t,n,r);return Mp(e,t+2,i)||a}function Fp(e,t,n,r,i,a){let o=Np(e,t,n,r);return Np(e,t+2,i,a)||o}function Ip(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&lu(i,a),ep(mo(e)?Do(e.index,t):t,5);let o=t[8],s=Lp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=Lp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function Lp(e,t,n,r){let i=nn(null);try{return Hc(kc.OutputStart,t,n),n(r)!==!1}catch(t){return Sf(e,t),!1}finally{Hc(kc.OutputEnd,t,n),nn(i)}}function Rp(e,t,n,r,i,a,o,s){let c=ho(e),l=!1,u=null;if(!r&&c&&(u=Bp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=Co(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);zp(a)||Vp(r?t=>r(xo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function zp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function Bp(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 Vp(e,t,n,r,i,a,o){let s=t.firstCreatePass?Ro(t):null,c=Lo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Hp(e,t,n,r,i){let a=null,o=null,s=null,c=!1,l=e.directiveToIndex.get(n.type);if(typeof l==`number`?a=l:[a,o,s]=l,o!==null&&s!==null&&e.hostDirectiveOutputs&&Object.hasOwn(e.hostDirectiveOutputs,r)){let n=e.hostDirectiveOutputs[r];for(let a=0;a=o&&l<=s)c=!0,Up(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Up(e,t,a,r,r,i)),c}function Up(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Vp(e.index,s,t,i,a,c,!0)}function Wp(){Gp()}function Gp(){let e=Ko(),t=qo(),n=Jo();if(t.firstCreatePass&&Zp(t,n),n.controlDirectiveIndex===-1)return;ad(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Jp(e,t,n))}function Kp(){qp()}function qp(){let e=Ko(),t=qo(),n=ys();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Jp(e,t,n))}var Jp=class{lView;tView;tNode;hasPassThrough;constructor(e,t,n){this.lView=e,this.tView=t,this.tNode=n,this.hasPassThrough=!!(n.flags&4096)}get customControl(){return this.tNode.customControlIndex===-1?void 0:this.lView[this.tNode.customControlIndex]}get nativeElement(){return Co(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,e,Ip(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,t,Ip(this.tNode,this.lView,e))}listenToDom(e,t){Rp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,Ip(this.tNode,this.lView,t))}setInputOnDirectives(e,t,n){let r=this.tNode.inputs?.[e],i=this.tNode.hostDirectiveInputs?.[e];if(!r&&!i)return!1;let a=!1;if(r)for(let i of r){if(i===this.tNode.controlDirectiveIndex)continue;let r=this.lView[i],o=this.tView.data[i];(!n||n(Xp(r,o,e)))&&(rf(o,r,e,t),a=!0)}if(i)for(let r=0;r0;){let e=n.shift();if(typeof e!=`function`){for(let n in e.inputs)t[e.inputs[n]]=!0;let r=Yp(e.directive);r!==null&&n.push(...r);continue}for(let r of e()){if(typeof r==`function`)continue;if(r.inputs)for(let e=0;e1){t.flags|=4096;return}Qp(e,t)}function Qp(e,t){for(let n=t.directiveStart;n{let r=t.hostDirectiveInputs[e],i=t.hostDirectiveOutputs[e+`Change`];if(!r||!i)return!1;for(let e=0;e=i&&a<=o)return t.flags|=n,t.customControlIndex=r,!0}}return!1};if(e(`value`,1024)||e(`checked`,2048))return}}function $p(e,t){return em(e,t)&&tm(e,t+`Change`)}function em(e,t){return t in e.inputs}function tm(e,t){return t in e.outputs}var nm=Symbol(`BINDING`),rm=new Fi(``);function im(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 vm(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&nf.SignalBased)!==0};return i&&(a.transform=i),a})}function Em(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Dm(e,t,n){let r=t instanceof Ya?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new kp(n,r):n}function Om(e){let t=e.get(Cp,null);if(t===null)throw new _i(407,!1);return{rendererFactory:t,sanitizer:e.get(Ep,null),changeDetectionScheduler:e.get(dc,null),ngReflect:!1,tracingService:e.get(rd,null,{optional:!0})}}function km(e,t,n){let r=jm(e);return Cu(t,r,r===`svg`?`svg`:r===`math`?bo:n)}function Am(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new _i(905,!1)}function jm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var Mm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Tm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Em(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=pte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Hc(kc.DynamicComponentStart);let s=nn(null);try{let s=this.componentDef,c=Dm(s,r||this.ngModule,e),l=Om(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(Dp(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{nn(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Nm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?cf(l,r,s.encapsulation,t):km(s,l,o??null);Am(u);let d=t.get(rm,null),f=Pm(u,()=>t.get(ks,null)??au());d&&d.addHost(f);let p=a?.some(Im)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Im)),m=Xd(null,c,null,512|Qd(s),null,null,e,l,t,null,fu(u,t,!0));d&&Cm&&f instanceof ShadowRoot&&Fo(m,()=>{d.removeHost(f)}),m[27]=u,us(m);let h=null;try{let e=bm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),$l(u,m),of(c,m,e),hu(c,e,m),xm(c,e),n!==void 0&&Rm(e,this.ngContentSelectors,n),h=Do(e.index,m),m[8]=h[8],Df(c,m,null)}catch(e){throw h!==null&&Zl(h),Zl(m),e}finally{Hc(kc.DynamicComponentEnd),hs()}return new Lm(this.componentType,m,!!p)}};function Nm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:mte(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[nm].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 Im(e){let t=e[nm].kind;return t===`input`||t===`twoWay`}var Lm=class extends Sp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=wo(t[1],27),this.location=Bl(this._tNode,t),this.instance=Do(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new cp(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;Cf(n,r[1],r,e,t),this.previousInputValues.set(e,t),ep(Do(n.index,r),1)}get injector(){return new Ml(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Rm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=Bm}return e})();function Bm(){return Wm(Jo(),Ko())}var Vm=class e extends zm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return Bl(this._hostTNode,this._hostLView)}get injector(){return new Ml(this._hostTNode,this._hostLView)}get parentInjector(){let e=bl(this._hostTNode,this._hostLView);if(ol(e)){let t=ll(e,this._hostLView),n=sl(e),r=t[1].data[n+8];return new Ml(r,t)}return new Ml(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Hm(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=bp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,Af(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 Mm(Ui(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ya,null);e&&(i=e)}let d=Ui(l.componentType??{}),f=bp(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,Af(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(Pee(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 rp(o,i,a,r),t.attachToViewContainerRef(),ya(Um(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Hm(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);n&&(ba(Um(this._lContainer),t),Dd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);return n&&ba(Um(this._lContainer),t)!=null?new cp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Hm(e){return e[8]}function Um(e){return e[8]||=[]}function Wm(e,t){let n,r=t[e.index];return fo(r)?n=r:(n=tp(r,t,null,e),t[e.index]=n,ef(t,n)),Km(n,t,e,r),new Vm(n,e,t)}function Gm(e,t){let n=e[11],r=n.createComment(``),i=Co(t,e);return wu(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var Km=Ym,qm=()=>!1;function Jm(e,t,n){return qm(e,t,n)}function Ym(e,t,n,r){if(e[7])return;let i;i=n.type&8?xo(r):Gm(t,n),e[7]=i}var Xm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Zm=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 dh(e,t,n){e.queries===null&&(e.queries=new $m),e.queries.track(new eh(t,n))}function fh(e,t){return e.queries.getByIndex(t)}function ph(e,t){let n=e[1],r=fh(n,t);return r.crossesNgTemplate?oh(n,e,t,[]):ah(n,e,r,t)}function mh(e,t,n){let r,i=wn(()=>{r._dirtyCounter();let n=vh(r,e);if(t&&n===void 0)throw new _i(-951,!1);return n});return r=i[tn],r._dirtyCounter=D(0),r._flatValue=void 0,i}function hh(e){return mh(!0,!1,e)}function gh(e){return mh(!0,!0,e)}function _h(e,t){let n=e[tn];n._lView=Ko(),n._queryIndex=t,n._queryList=sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function vh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:Oa;let i=sh(n,r),a=ph(n,r);return i.reset(a,Hl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function yh(e){return!!e&&typeof e.then==`function`}function bh(e){return!!e&&typeof e.subscribe==`function`}var xh=class{},Sh=class extends xh{injector;instance=null;constructor(e){super();let t=new Xa([...e.providers,{provide:xh,useValue:this}],e.parent||Ja(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Ch(e,t,n=null){return new Sh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var wh=(()=>{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=Pa(!1,e.type),n=t.length>0?Ch([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=Oi({token:e,providedIn:`environment`,factory:()=>new e(ua(Ya))})}return e})();function k(e){return Oc(()=>{let t=Ah(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Kl.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(wh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||gu.Emulated,styles:e.styles||Oa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&ad(`NgStandalone`),jh(n);let r=e.dependencies;return n.directiveDefs=Mh(r,Th),n.pipeDefs=Mh(r,Gi),n.id=Nh(n),n})}function Th(e){return Ui(e)||Wi(e)}function Eh(e,t){if(e==null)return Da;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=nf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Dh(e){if(e==null)return Da;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Oh(e){return Oc(()=>{let t=Ah(e);return jh(t),t})}function kh(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 Ah(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||Da,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Oa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Eh(e.inputs,t),outputs:Dh(e.outputs),debugInfo:null}}function jh(e){e.features?.forEach(t=>t(e))}function Mh(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 Nh(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 Ph=new Fi(``),Fh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=C(Ph,{optional:!0})??[];injector=C(Os);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=so(this.injector,t);if(yh(n))e.push(n);else if(bh(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=Rl({token:e,factory:e.ɵfac})}return e})();function Ih(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function Lh(e){return Object.getPrototypeOf(e.prototype).constructor}function Rh(e){let t=Lh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Li)?t[Li]:void 0,o=Object.hasOwn(t,Ri)?t[Ri]:void 0;if(go(e))i=a??o;else{if(a)throw new _i(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Vh(e.inputs),t.declaredInputs=Vh(e.declaredInputs),t.outputs=Vh(e.outputs);let n=i.hostBindings;n&&Wh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Hh(e,a),o&&Uh(e,o),zh(e,i),xi(e.outputs,i.outputs),go(i)&&i.data.animation){let t=e.data;t.animation=(t.animation||[]).concat(i.data.animation)}}let t=i.features;if(t)for(let r=0;r=0;r--){let i=e[r];i.hostVars=t+=i.hostVars,i.hostAttrs=il(i.hostAttrs,n=il(n,i.hostAttrs))}}function Vh(e){return e===Da?{}:e===Oa?[]:e}function Hh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Uh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function Wh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function Gh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=il(e.mergedAttrs,e.attrs);let t=e.tView=qd(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),Xo(e,!1);let c=Yh(n,t,e,r);ws()&&Id(n,t,c,e),$l(c,t);let l=tp(c,t,c,e);t[r+27]=l,ef(t,l),Jm(l,e,t)}function Kh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=fp(t,d,4,o||null,s||null),Ho()&&om(t,e,f,ko(t.consts,l),gf),Wc(t,f)):f=t.data[d],Gh(f,e,t,n,r,i,a,c),ho(f)&&of(t,e,f),l!=null&&sf(e,f,u),f}function qh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=fp(t,d,4,o||null,s||null),l!=null){let e=ko(t.consts,l);f.localNames=[];for(let t=0;t{throw new _i(600,``)})}var eg=10,tg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=C(tc);afterRenderManager=C(od);zonelessEnabled=C(fc);rootEffectScheduler=C(mc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Jr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=C(Ps);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(hi(e=>!e))}constructor(){C(rd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=C(Ya);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=Os.NULL){return this._injector.get(Hs).run(()=>{if(Hc(kc.BootstrapComponentStart),!this._injector.get(Fh).done)throw new _i(405,``);let r=Ui(e),i=this._injector.get(xh),a=new Mm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=ng(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Zh,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),rg(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Hc(kc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Hc(kc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(nd.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Hc(kc.ChangeDetectionEnd),new _i(101,!1);let e=nn(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,nn(e),this.afterTick.next(),Hc(kc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(Cp,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++Mo(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;rg(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(Qh,[]).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),()=>rg(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new _i(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=Rl({token:e,factory:e.ɵfac})}return e})();function ng(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function rg(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function A(e,t,n,r){let i=Ko();return Mp(i,is(),t)&&(qo(),_f(ys(),i,e,t,n,r)),A}function ig(e){if(ad(`NgAnimateEnter`),!Ku)return ig;let t=Ko();if(wte(t))return ig;let n=Jo(),r=t[9].get(Hs);return kte($u(t),n,()=>ag(t,n,e,r)),Fte(t[9]),pd(t[9],$u(t)),ig}function ag(e,t,n,r){let i=Co(t,e),a=e[11],o=Ote(n),s=[],c=!1,l=e=>{if(ed(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{ed(e)===i&&(td(e,i)&&(c=!0),og(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),Tte(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(bte(i,Yu,Ku),!Yu.has(i))){for(let e of o)a.removeClass(i,e);qu(i)}})})}}function og(e,t,n){let r=Ju.get(t);if(ed(e)===t&&r&&td(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);qu(t)}}var sg=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 cg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function lg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){nn(r);let c=t.length-1;for(nn(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=cg(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=cg(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 pg,a??=fg(e,o,s,n),ug(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;)dg(e,i,n,o,t[o]),o++}else if(t!=null){nn(r);let c=t[Symbol.iterator]();nn(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=cg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new pg,a??=fg(e,o,s,n);let u=n(o,r);if(ug(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;)dg(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 ug(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function dg(e,t,n,r,i){if(ug(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function fg(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 pg=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 j(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),256,o,s),mg}function mg(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),512,o,s),mg}function M(e,t){ad(`NgControlFlow`);let n=Ko(),r=is(),i=n[r]===Lu?-1:n[r],a=i===-1?void 0:bg(n,27+i);if(Mp(n,r,e)){let r=nn(null);try{if(a!==void 0&&ip(a,0),e!==-1){let r=27+e,i=bg(n,r),a=Tg(n[1],r),o=xp(i,a,n);rp(i,kf(n,a,t,{dehydratedView:o}),0,Af(a,o))}}finally{nn(r)}}else if(a!==void 0){let e=np(a,0);e!==void 0&&(e[8]=t)}}var hg=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 gg(e){return e}function _g(e,t){return t}var vg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function N(e,t,n,r,i,a,o,s,c,l,u,d,f){ad(`NgControlFlow`);let p=Ko(),m=qo(),h=c!==void 0,g=Ko(),_=new vg(h,s?o.bind(g[15][8]):o);g[27+e]=_,qh(p,m,e+1,t,n,r,i,ko(m.consts,a),256),h&&qh(p,m,e+2,c,l,u,d,ko(m.consts,f),512)}var yg=class extends sg{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,rp(this.lContainer,t,e,Af(this.templateTNode,n)),xg(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,Sg(this.lContainer,e),Cg(this.lContainer,e)}create(e,t){let n=bp(this.lContainer,this.templateTNode.tView.ssrId);return kf(this.hostLView,this.templateTNode,new hg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){Dd(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];Nte(e,r),Gu.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function Sg(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 Cg(e,t){return ap(e,t)}function wg(e,t){return np(e,t)}function Tg(e,t){return wo(e,t)}function F(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),F}function Eg(e,t,n,r,i){Cf(t,e,n,i?`class`:`style`,r)}function I(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?bm(o,i,2,t,gf,Ho(),n,r):a.data[o];if(mo(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(Dp(o),()=>(Dg(e,t,i,s,r),I))}}return Dg(e,t,i,s,r),I}function Dg(e,t,n,r,i){if(bf(r,n,e,t,kg),ho(r)){let e=n[1];of(e,n,r),hu(e,r,n)}i!=null&&sf(n,r)}function L(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),Wo(t)&&Go(),Vo(),t.classesWithoutHost!=null&&$c(t)&&Eg(e,t,Ko(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&el(t)&&Eg(e,t,Ko(),t.stylesWithoutHost,!1),L}function R(e,t,n,r){return I(e,t,n,r),L(),R}function z(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?Sm(o,a,2,t,n,r):a.data[o];return bf(s,i,e,t,kg),r!=null&&sf(i,s),z}function B(){return Wo(xf(Jo()))&&Go(),Vo(),B}function Og(e,t,n,r){return z(e,t,n,r),B(),Og}var kg=(e,t,n,r,i)=>(Ts(!0),Cu(t[11],r,Ss()));function Ag(e,t,n){let r=Ko(),i=r[1],a=e+27,o=i.firstCreatePass?bm(a,r,8,`ng-container`,gf,Ho(),t,n):i.data[a];if(bf(o,r,e,`ng-container`,Ng),ho(o)){let e=r[1];of(e,r,o),hu(e,o,r)}return n!=null&&sf(r,o),Ag}function jg(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),jg}function Mg(e,t,n){return Ag(e,t,n),jg(),Mg}var Ng=(e,t,n,r,i)=>(Ts(!0),$ee(t[11],``));function V(){return Ko()}function Pg(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),df(ys(),r,e,t,r[11],n)),Pg}var Fg=void 0;function Ig(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Lg=[`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`]],Fg,[[`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`]],Fg,[[`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}`,Fg,Fg,Fg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ig],Rg=Object.create(null);function zg(e){let t=Hg(e),n=Bg(t);if(n)return n;let r=t.split(`-`)[0];if(n=Bg(r),n)return n;if(r===`en`)return Lg;throw new _i(701,!1)}function Bg(e){if(!(e in Rg)){let t=aa.ng&&aa.ng.common&&aa.ng.common.locales&&aa.ng.common.locales[e];return t!==void 0&&(Rg[e]=t),t}return Rg[e]}var Vg={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 Hg(e){return e.toLowerCase().replace(/_/g,`-`)}var Ug=`en-US`;function Wg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Ko(),i=qo(),a=Jo();return Gg(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Ko(),i=qo(),a=Jo();return(a.type&3||n)&&Rp(a,i,r,n,r[11],e,t,Ip(a,r,t)),U}function Gg(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=Ip(r,t,a),Rp(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 t_(e){return(e&2)==2}function n_(e,t){return e&131071|t<<17}function r_(e){return e|2}function i_(e){return(e&131068)>>2}function a_(e,t){return e&-131069|t<<2}function o_(e){return(e&1)==1}function s_(e){return e|1}function c_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=e_(o),c=i_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||Ta(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=e_(e[s+1]);e[r+1]=$g(t,s),t!==0&&(e[t+1]=a_(e[t+1],r)),e[s+1]=n_(e[s+1],r)}else e[r+1]=$g(s,0),s!==0&&(e[s+1]=a_(e[s+1],r)),s=r}else e[r+1]=$g(c,0),s===0?s=r:e[c+1]=a_(e[c+1],r),c=r;l&&(e[r+1]=r_(e[r+1])),u_(e,u,r,!0),u_(e,u,r,!1),l_(t,u,e,r,a),o=$g(s,c),a?t.classBindings=o:t.styleBindings=o}function l_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&Ta(a,t)>=0&&(n[r+1]=s_(n[r+1]))}function u_(e,t,n,r){let i=e[n+1],a=t===null,o=r?e_(i):i_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];d_(n,t)&&(s=!0,e[o+1]=r?s_(i):r_(i)),o=r?e_(i):i_(i)}s&&(e[n+1]=r?r_(i):s_(i))}function d_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?Ta(e,t)>=0:!1}var f_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function p_(e){return e.substring(f_.key,f_.keyEnd)}function m_(e){return g_(e),h_(e,__(e,0,f_.textEnd))}function h_(e,t){let n=f_.textEnd;return n===t?-1:(t=f_.keyEnd=v_(e,f_.key=t,n),__(e,t,n))}function g_(e){f_.key=0,f_.keyEnd=0,f_.value=0,f_.valueEnd=0,f_.textEnd=e.length}function __(e,t,n){for(;t32;)t++;return t}function y_(e,t,n){return S_(e,t,n,!1),y_}function G(e,t){return S_(e,t,null,!0),G}function b_(e){C_(N_,x_,e,!0)}function x_(e,t){for(let n=m_(t);n>=0;n=h_(t,n))Ca(e,p_(t),!0)}function S_(e,t,n,r){let i=Ko(),a=qo(),o=as(2);if(a.firstUpdatePass&&T_(a,e,o,r),t!==Lu&&Mp(i,o,t)){let s=a.data[_s()];P_(a,s,i,i[11],e,i[o+1]=Lte(t,n),r,o)}}function C_(e,t,n,r){let i=qo(),a=as(2);i.firstUpdatePass&&T_(i,null,a,r);let o=Ko();if(n!==Lu&&Mp(o,a,n)){let s=i.data[_s()];if(L_(s,r)&&!w_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=Ci(e,n||``)),Eg(i,s,o,n,r)}else Ite(i,s,o,o[11],o[a+1],o[a+1]=M_(e,t,n),r,a)}}function w_(e,t){return t>=e.expandoStartIndex}function T_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[_s()],o=w_(e,n);L_(a,r)&&t===null&&!o&&(t=!1),t=E_(i,a,t,r),c_(i,a,t,n,o,r)}}function E_(e,t,n,r){let i=Gee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=A_(null,e,t,n,r),n=j_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=A_(i,e,t,n,r),a===null){let n=D_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=A_(null,e,t,n[1],r),n=j_(n,t.attrs,r),O_(e,t,r,n))}else a=k_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function D_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(i_(r)!==0)return e[e_(r)]}function O_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[e_(i)]=r}function k_(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===Lu&&(u=l?Oa:void 0);let d=l?wa(u,r):c===r?u:void 0;if(a&&!I_(d)&&(d=wa(t,r)),I_(d)&&(s=d,o))return s;let f=e[i+1];i=o?e_(f):i_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=wa(e,r))}return s}function I_(e){return e!==void 0}function Lte(e,t){return e==null||e===``||(typeof t==`string`?e=vu(e)+t:typeof e==`object`&&(e=Si(vu(e)))),e}function L_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Ko(),r=qo(),i=e+27,a=r.firstCreatePass?fp(r,i,1,t,null):r.data[i],o=Rte(r,n,a,t);n[i]=o,ws()&&Id(r,n,o,a),Xo(a,!1)}var Rte=(e,t,n,r)=>(Ts(!0),Zee(t[11],r));function R_(e,t,n,r=``){return Mp(e,is(),n)?t+qi(n)+r:Lu}function zte(e,t,n,r,i,a=``){let o=Np(e,rs(),n,i);return as(2),o?t+qi(n)+r+qi(i)+a:Lu}function Bte(e,t,n,r,i,a,o,s=``){let c=Pp(e,rs(),n,i,o);return as(3),c?t+qi(n)+r+qi(i)+a+qi(o)+s:Lu}function Vte(e,t,n,r,i,a,o,s,c,l=``){let u=Fp(e,rs(),n,i,o,c);return as(4),u?t+qi(n)+r+qi(i)+a+qi(o)+s+qi(c)+l:Lu}function q(e){return J(``,e),q}function J(e,t,n){let r=Ko(),i=R_(r,e,t,n);return i!==Lu&&V_(r,_s(),i),J}function Y(e,t,n,r,i){let a=Ko(),o=zte(a,e,t,n,r,i);return o!==Lu&&V_(a,_s(),o),Y}function z_(e,t,n,r,i,a,o){let s=Ko(),c=Bte(s,e,t,n,r,i,a,o);return c!==Lu&&V_(s,_s(),c),z_}function B_(e,t,n,r,i,a,o,s,c){let l=Ko(),u=Vte(l,e,t,n,r,i,a,o,s,c);return u!==Lu&&V_(l,_s(),u),B_}function V_(e,t,n){let r=So(t,e);Qee(e[11],r,n)}function H_(e,t,n){Tc(t)&&(t=t());let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),H_}function U_(e,t){let n=Tc(e);return n&&e.set(t),n}function W_(e,t){let n=Ko(),r=qo(),i=Jo();return Gg(r,n,n[11],i,e,t),W_}var G_={};function K_(e){ad(`NgLet`);let t=qo(),n=Ko(),r=e+27;return Xo(fp(t,r,128,null,null),!1),Eo(t,n,r,G_),K_}function q_(e){return Eo(qo(),Ko(),_s(),e),e}function J_(e){let t=To($o(),27+e);if(t===G_)throw new _i(314,!1);return t}function Y_(e,t,n=``){return R_(Ko(),e,t,n)}function X_(e,t,n){let r=qo();r.firstCreatePass&&Z_(t,r.data,r.blueprint,go(e),n)}function Z_(e,t,n,r,i){if(e=Ei(e),Array.isArray(e))for(let a=0;a>20;if(Ha(e)||!e.multi){let r=new Qc(l,i,am,null),p=ev(c,t,i?u:u+f,d);p===-1?(xl(_l(s,o),a,c),Q_(a,e,t.length),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(r),o.push(r)):(n[p]=r,o[p]=r)}else{let p=ev(c,t,u+f,d),m=ev(c,t,u,u+f),h=p>=0&&n[p],g=m>=0&&n[m];if(i&&!g||!i&&!h){xl(_l(s,o),a,c);let u=Wte(i?Ute:Hte,n.length,i,r,l,e);!i&&g&&(n[m].providerFactory=u),Q_(a,e,t.length,0),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(u),o.push(u)}else{let t=$_(n[i?m:p],l,!i&&r);Q_(a,e,p>-1?p:m,t)}!i&&r&&g&&n[m].componentProviders++}}}function Q_(e,t,n,r){let i=Ha(t),a=Ua(t);if(i||a){let o=(a?Ei(t.useClass):t).prototype.ngOnDestroy;if(o){let a=e.destroyHooks||=[];if(!i&&t.multi){let e=a.indexOf(n);e===-1?a.push(n,[r,o]):a[e+1].push(r,o)}else a.push(n,o)}}}function $_(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function ev(e,t,n,r){for(let i=n;i{n.providersResolver=(t,n)=>X_(t,n?n(e):e,!1),t&&(n.viewProvidersResolver=(e,n)=>X_(e,n?n(t):t,!0))}}function rv(e,t){let n=ns()+e,r=Ko();return r[n]===Lu?Ap(r,n,t()):jp(r,n)}function iv(e,t,n){return sv(Ko(),ns(),e,t,n)}function av(e,t,n,r){return cv(Ko(),ns(),e,t,n,r)}function Gte(e,t,n,r,i){return Kte(Ko(),ns(),e,t,n,r,i)}function ov(e,t){let n=e[t];return n===Lu?void 0:n}function sv(e,t,n,r,i,a){let o=t+n;return Mp(e,o,i)?Ap(e,o+1,a?r.call(a,i):r(i)):ov(e,o+1)}function cv(e,t,n,r,i,a,o){let s=t+n;return Np(e,s,i,a)?Ap(e,s+2,o?r.call(o,i,a):r(i,a)):ov(e,s+2)}function Kte(e,t,n,r,i,a,o,s){let c=t+n;return Pp(e,c,i,a,o)?Ap(e,c+3,s?r.call(s,i,a,o):r(i,a,o)):ov(e,c+3)}function lv(e,t){let n=qo(),r,i=e+27;n.firstCreatePass?(r=qte(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=ha(r.type,!0)),o=ra(am);try{let e=dl(!1),t=a();return dl(e),Eo(n,Ko(),i,t),t}finally{ra(o)}}function qte(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function uv(e,t,n){let r=e+27,i=Ko(),a=To(i,r);return fv(i,r)?sv(i,ns(),t,a.transform,n,a):a.transform(n)}function dv(e,t,n,r){let i=e+27,a=Ko(),o=To(a,i);return fv(a,i)?cv(a,ns(),t,o.transform,n,r,o):o.transform(n,r)}function fv(e,t){return e[1].data[t].pure}function pv(e,t){return dp(e,t)}var Jte=(()=>{class e{applicationErrorHandler=C(tc);appRef=C(tg);taskService=C(Ps);ngZone=C(Hs);zonelessEnabled=C(fc);tracing=C(rd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new fr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Bs):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(C(pc,{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?Rs:Ls;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=Rl({token:e,factory:e.ɵfac})}return e})();function Yte(){return[{provide:dc,useExisting:Jte},{provide:Hs,useClass:Xs},{provide:fc,useValue:!0}]}function Xte(){return typeof $localize<`u`&&$localize.locale||`en-US`}var mv=new Fi(``,{factory:()=>C(mv,{optional:!0,skipSelf:!0})||Xte()}),hv=class{destroyed=!1;listeners=null;errorHandler=C(ec,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=C(As);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new _i(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(yi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=nn(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&&Zte(this.listeners)),nn(t),this.isEmitting=!1}}};function Zte(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return wn(e,t?.equal)}function Z(e){return Zn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var Qte=e=>e;function Q(e,t){return typeof e==`function`?gv(qn(e,Qte,t?.equal),t?.debugName,t?.set):gv(qn(e.source,e.computation,e.equal),e.debugName,e.set)}function gv(e,t,n){let r=e[tn],i=e;if(n!==void 0){let t=e=>Jn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Jn(r,e),i.update=e=>Yn(r,e);return i.asReadonly=rc.bind(e),i}var _v=!1;function $te(){return _v}function vv(e){_v=e}function yv(e,t){let n=Object.create(Dc);n.value=e,n.transformFn=t?.transform;function r(){if(on(n),n.value===Ec)throw new _i(-950,null);return n.value}return r[tn]=n,r}function bv(e){return new hv}function xv(e,t){return yv(e,t)}function ene(e){return yv(Ec,e)}var $=(xv.required=ene,xv);function Sv(e,t){let n=Object.create(Dc),r=new hv;n.value=e;function i(){return on(n),Cv(n.value),n.value}return i[tn]=n,i.asReadonly=rc.bind(i),i.set=e=>{n.equal(n.value,e)||(In(n,e),r.emit(e))},i.update=e=>{Cv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function Cv(e){if(e===Ec)throw new _i(952,!1)}function wv(e,t){return Sv(e,t)}function tne(e){return Sv(Ec,e)}var Tv=(wv.required=tne,wv);function Ev(e,t){return hh(t)}function nne(e,t){return gh(t)}var Dv=(Ev.required=nne,Ev),rne=(()=>{class e{static __NG_ELEMENT_ID__=ine}return e})();function ine(e){return ane(Jo(),Ko(),(e&16)==16)}function ane(e,t,n){if(mo(e)&&!n){let n=Do(e.index,t);return new cp(n,n)}if(e.type&175){let e=t[15];return new cp(e,t)}return null}var Ov=new Fi(``),one=new Fi(``);function kv(e){return!e.moduleRef}function sne(e){let t=kv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Hs);return n.run(()=>{kv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(tc),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),kv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(Ov);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(Ov);n.add(t),e.moduleRef.onDestroy(()=>{rg(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return lne(r,n,()=>{let n=t.get(Ps),r=n.add(),i=t.get(Fh);return i.runInitializers(),i.donePromise.then(()=>{if(Wg(t.get(mv,Ug)||`en-US`),!t.get(one,!0))return kv(e)?t.get(tg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(kv(e)){let n=t.get(tg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return cne?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var cne;function lne(e,t,n){try{let r=n();return yh(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Av=null;function une(e=[],t){return Os.create({name:t,providers:[{provide:Wa,useValue:`platform`},{provide:Ov,useValue:new Set([()=>Av=null])},...e]})}function dne(e=[]){if(Av)return Av;let t=une(e);return Av=t,$h(),fne(t),t}function fne(e){let t=e.get(oc,null);so(e,()=>{t?.forEach(e=>e())})}function pne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Hc(kc.BootstrapApplicationStart);try{let e=i?.injector??dne(r);return sne({r3Injector:new Sh({providers:[Yte(),nc,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Hc(kc.BootstrapApplicationEnd)}}function jv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var Mv=Symbol(`NOT_SET`),Nv=new Set,mne={...Rn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Mv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(on(r),r.value),r.signal[tn]=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??Nv)t()}finally{vn(e)}}};function Pv(e,t){let n=t?.injector??C(Os),r=n.get(dc),i=n.get(od),a=n.get(rd,null,{optional:!0});i.impl??=n.get(cd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(lc,null,{optional:!0}),c=new hne(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var Fv=null;function Iv(){return Fv}function gne(e){Fv??=e}var _ne=class{},Lv=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Lv||{}),Rv=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(Rv||{}),zv=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(zv||{}),Bv={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 vne(e){return zg(e)[Vg.LocaleId]}function yne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.DayPeriodsFormat],r[Vg.DayPeriodsStandalone]],t),n)}function bne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.DaysFormat],r[Vg.DaysStandalone]],t),n)}function xne(e,t,n){let r=zg(e);return Kv(Kv([r[Vg.MonthsFormat],r[Vg.MonthsStandalone]],t),n)}function Sne(e,t){let n=zg(e)[Vg.Eras];return Kv(n,t)}function Vv(e,t){return Kv(zg(e)[Vg.DateFormat],t)}function Hv(e,t){return Kv(zg(e)[Vg.TimeFormat],t)}function Uv(e,t){let n=zg(e)[Vg.DateTimeFormat];return Kv(n,t)}function Wv(e,t){let n=zg(e),r=n[Vg.NumberSymbols][t];if(r===void 0){if(t===Bv.CurrencyDecimal)return n[Vg.NumberSymbols][Bv.Decimal];if(t===Bv.CurrencyGroup)return n[Vg.NumberSymbols][Bv.Group]}return r}function Gv(e){if(!e[Vg.ExtraData])throw new _i(2303,!1)}function Cne(e){let t=zg(e);return Gv(t),(t[Vg.ExtraData][2]||[]).map(e=>typeof e==`string`?qv(e):[qv(e[0]),qv(e[1])])}function wne(e,t,n){let r=zg(e);return Gv(r),Kv(Kv([r[Vg.ExtraData][0],r[Vg.ExtraData][1]],t)||[],n)||[]}function Kv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new _i(2304,!1)}function qv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Tne=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Jv=Object.create(null),Ene=/((?:[^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]*)/,Dne=256;function One(e,t,n,r){let i=uy(e);kne(t),t=Xv(n,t)||t;let a=[],o;for(;t;)if(o=Ene.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=sy(r,s),i=ly(i,r));let c=``;return a.forEach(e=>{let t=Fne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function kne(e){if(e.length>Dne)throw new _i(2300,!1)}function Yv(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Xv(e,t){let n=vne(e);if(Jv[n]??=Object.create(null),Jv[n][t])return Jv[n][t];let r=``;switch(t){case`shortDate`:r=Vv(e,zv.Short);break;case`mediumDate`:r=Vv(e,zv.Medium);break;case`longDate`:r=Vv(e,zv.Long);break;case`fullDate`:r=Vv(e,zv.Full);break;case`shortTime`:r=Hv(e,zv.Short);break;case`mediumTime`:r=Hv(e,zv.Medium);break;case`longTime`:r=Hv(e,zv.Long);break;case`fullTime`:r=Hv(e,zv.Full);break;case`short`:let t=Xv(e,`shortTime`),n=Xv(e,`shortDate`);r=Zv(Uv(e,zv.Short),[t,n]);break;case`medium`:let i=Xv(e,`mediumTime`),a=Xv(e,`mediumDate`);r=Zv(Uv(e,zv.Medium),[i,a]);break;case`long`:let o=Xv(e,`longTime`),s=Xv(e,`longDate`);r=Zv(Uv(e,zv.Long),[o,s]);break;case`full`:let c=Xv(e,`fullTime`),l=Xv(e,`fullDate`);r=Zv(Uv(e,zv.Full),[c,l])}return r&&(Jv[n][t]=r),r}function Zv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function Qv(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 Ane(s,t);let c=Wv(o,Bv.MinusSign);return Qv(s,t,c,r,i)}}function jne(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 _i(2301,!1)}}function ey(e,t,n=Lv.Format,r=!1){return function(i,a){return Mne(i,a,e,t,n,r)}}function Mne(e,t,n,r,i,a){switch(n){case 2:return xne(t,i,r)[e.getMonth()];case 1:return bne(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Cne(t),a=wne(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?`+`:``)+Qv(o,2,a)+Qv(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+Qv(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+Qv(o,2,a)+`:`+Qv(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+Qv(o,2,a)+`:`+Qv(Math.abs(i%60),2,a);default:throw new _i(2310,!1)}}}var Nne=0,ny=4;function Pne(e){let t=Yv(e,Nne,1).getDay();return Yv(e,0,1+(t<=ny?ny:11)-t)}function ry(e){let t=e.getDay(),n=t===0?-3:ny-t;return Yv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function iy(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=ry(n),t=Pne(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return Qv(i,e,Wv(r,Bv.MinusSign))}}function ay(e,t=!1){return function(n,r){return Qv(ry(n).getFullYear(),e,Wv(r,Bv.MinusSign),t)}}var oy=Object.create(null);function Fne(e){if(oy[e])return oy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=ey(3,Rv.Abbreviated);break;case`GGGG`:t=ey(3,Rv.Wide);break;case`GGGGG`:t=ey(3,Rv.Narrow);break;case`y`:t=$v(0,1,0,!1,!0);break;case`yy`:t=$v(0,2,0,!0,!0);break;case`yyy`:t=$v(0,3,0,!1,!0);break;case`yyyy`:t=$v(0,4,0,!1,!0);break;case`Y`:t=ay(1);break;case`YY`:t=ay(2,!0);break;case`YYY`:t=ay(3);break;case`YYYY`:t=ay(4);break;case`M`:case`L`:t=$v(1,1,1);break;case`MM`:case`LL`:t=$v(1,2,1);break;case`MMM`:t=ey(2,Rv.Abbreviated);break;case`MMMM`:t=ey(2,Rv.Wide);break;case`MMMMM`:t=ey(2,Rv.Narrow);break;case`LLL`:t=ey(2,Rv.Abbreviated,Lv.Standalone);break;case`LLLL`:t=ey(2,Rv.Wide,Lv.Standalone);break;case`LLLLL`:t=ey(2,Rv.Narrow,Lv.Standalone);break;case`w`:t=iy(1);break;case`ww`:t=iy(2);break;case`W`:t=iy(1,!0);break;case`d`:t=$v(2,1);break;case`dd`:t=$v(2,2);break;case`c`:case`cc`:t=$v(7,1);break;case`ccc`:t=ey(1,Rv.Abbreviated,Lv.Standalone);break;case`cccc`:t=ey(1,Rv.Wide,Lv.Standalone);break;case`ccccc`:t=ey(1,Rv.Narrow,Lv.Standalone);break;case`cccccc`:t=ey(1,Rv.Short,Lv.Standalone);break;case`E`:case`EE`:case`EEE`:t=ey(1,Rv.Abbreviated);break;case`EEEE`:t=ey(1,Rv.Wide);break;case`EEEEE`:t=ey(1,Rv.Narrow);break;case`EEEEEE`:t=ey(1,Rv.Short);break;case`a`:case`aa`:case`aaa`:t=ey(0,Rv.Abbreviated);break;case`aaaa`:t=ey(0,Rv.Wide);break;case`aaaaa`:t=ey(0,Rv.Narrow);break;case`b`:case`bb`:case`bbb`:t=ey(0,Rv.Abbreviated,Lv.Standalone,!0);break;case`bbbb`:t=ey(0,Rv.Wide,Lv.Standalone,!0);break;case`bbbbb`:t=ey(0,Rv.Narrow,Lv.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=ey(0,Rv.Abbreviated,Lv.Format,!0);break;case`BBBB`:t=ey(0,Rv.Wide,Lv.Format,!0);break;case`BBBBB`:t=ey(0,Rv.Narrow,Lv.Format,!0);break;case`h`:t=$v(3,1,-12);break;case`hh`:t=$v(3,2,-12);break;case`H`:t=$v(3,1);break;case`HH`:t=$v(3,2);break;case`m`:t=$v(4,1);break;case`mm`:t=$v(4,2);break;case`s`:t=$v(5,1);break;case`ss`:t=$v(5,2);break;case`S`:t=$v(6,1);break;case`SS`:t=$v(6,2);break;case`SSS`:t=$v(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=ty(0);break;case`ZZZZZ`:t=ty(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=ty(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=ty(2);break;default:return null}return oy[e]=t,t}function sy(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function cy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function ly(e,t,n){let r=e.getTimezoneOffset();return cy(e,-1*(sy(t,r)-r))}function uy(e){if(fy(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 Yv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Tne))return dy(n)}let t=new Date(e);if(!fy(t))throw new _i(2311,!1);return t}function dy(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 fy(e){return e instanceof Date&&!isNaN(e.valueOf())}var py=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=C(Os);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)(am(zm))};static ɵdir=Oh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Nc]})}return e})();function my(e,t){return new _i(2100,!1)}var hy=`mediumDate`,gy=new Fi(``),_y=new Fi(``),vy=(()=>{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??hy,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return One(t,e,i||this.locale,a)}catch(t){throw my(e,t.message)}}static ɵfac=function(t){return new(t||e)(am(mv,16),am(gy,24),am(_y,24))};static ɵpipe=kh({name:`date`,type:e,pure:!0})}return e})(),yy=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=kh({name:`json`,type:e,pure:!1})}return e})();function by(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 xy=`browser`,Sy=class{_doc;constructor(e){this._doc=e}manager},Cy=(()=>{class e extends Sy{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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),wy=new Fi(``),Ty=(()=>{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 Cy));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof Cy);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 _i(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ua(wy),ua(Hs))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Ey=`ng-app-id`;function Dy(e){for(let t of e)t.remove()}function Oy(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function ky(e,t,n,r){let i=e.head?.querySelectorAll(`style[${Ey}="${t}"],link[${Ey}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(Ey),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 Ay(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var jy=(()=>{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,ky(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,Oy);t?.forEach(e=>this.addUsage(e,this.external,Ay))}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&&(Dy(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])Dy(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,Oy(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,Ay(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)(ua(ks),ua(ic),ua(cc,8),ua(sc))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),My={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`},Ny=/%COMP%/g,Py=`%COMP%`,Fy=`_nghost-${Py}`,Iy=`_ngcontent-${Py}`,Ly=!0,Ry=new Fi(``,{factory:()=>Ly}),zy=new Fi(``);function By(e){return Iy.replace(Ny,e)}function Vy(e){return Fy.replace(Ny,e)}function Hy(e,t){return t.map(t=>t.replace(Ny,e))}var Uy=(()=>{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 Wy(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 Jy?n.applyToHost(e):n instanceof qy&&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 gu.Emulated:r=new Jy(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case gu.ShadowDom:return new Ky(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case gu.ExperimentalIsolatedShadowDom:return new Ky(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new qy(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)(ua(Ty),ua(rm),ua(ic),ua(Ry),ua(ks),ua(Hs),ua(cc),ua(rd,8),ua(zy,8))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Wy=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(My[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(Gy(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=Gy(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new _i(-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 _i(-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=My[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=My[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&(Ru.DashCase|Ru.Important)?e.style.setProperty(t,n,r&Ru.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Ru.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=Iv().getGlobalEventTarget(this.doc,e),!e))throw new _i(-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 Gy(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var Ky=class extends Wy{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=Hy(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=Ay(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)}},qy=class extends Wy{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?Hy(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&&Gu.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Jy=class extends qy{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=By(l),this.hostAttr=Vy(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}},Yy=class e extends _ne{supportsDOMEvents=!0;static makeCurrent(){gne(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=Zy();return t==null?null:Qy(t)}resetBaseElement(){Xy=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return by(document.cookie,e)}},Xy=null;function Zy(){return Xy||=document.head.querySelector(`base`),Xy?Xy.getAttribute(`href`):null}function Qy(e){return new URL(e,document.baseURI).pathname}var $y=[`alt`,`control`,`meta`,`shift`],eb={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},tb={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},nb=(()=>{class e extends Sy{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(()=>Iv().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.`),$y.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=eb[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`),$y.forEach(t=>{if(t!==n){let n=tb[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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})();async function rb(e,t,n){return pne({rootComponent:e,...ib(t,n)})}function ib(e,t){return{platformRef:t?.platformRef,appProviders:[...lb,...e?.providers??[]],platformProviders:cb}}function ab(){Yy.makeCurrent()}function ob(){return new ec}function sb(){return iu(document),document}var cb=[{provide:sc,useValue:xy},{provide:oc,useValue:ab,multi:!0},{provide:ks,useFactory:sb}],lb=[{provide:Wa,useValue:`root`},{provide:ec,useFactory:ob},{provide:wy,useClass:Cy,multi:!0},{provide:wy,useClass:nb,multi:!0},Uy,{provide:rm,useClass:jy},{provide:jy,useExisting:rm},Ty,{provide:Cp,useExisting:Uy},[]];function ub(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 mb({code:i,why:fb(a.why,e),fix:fb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:fb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function _b(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 Cb=Math.random.bind(Math),wb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Tb(e=21){let t=``,n=e;for(;n--;)t+=wb[Cb()*64|0];return t}var Eb=6e4,Db=e=>e,Ob=Db,{clearTimeout:kb,setTimeout:Ab}=globalThis;function jb(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=Db,deserialize:s=Ob,resolver:c,bind:l=`rpc`,timeout:u=Eb,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}=Sb(),_=Tb();s.i=_;let ee;async function te(n=s){return u>=0&&(ee=Ab(()=>{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,te,d):await te()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{kb(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:te,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(ne)}function te(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 ne(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&&(kb(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(ne),h}function Mb(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var Nb=Object.freeze({type:`object`,additionalProperties:!0});function Pb(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return Nb}return Nb}function Fb(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 Lb(e,t){return Ib(e,t)??[e]}function Rb(e){return typeof e==`string`?`'${e}'`:new Hb().serialize(e)}var zb=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Bb=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[zb.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Vb(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})(),Ub=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Wb=[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],Gb=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Kb=[],qb=class{_data=new Jb;_hash=new Jb([...Ub]);_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)Kb[n]=e[t+n]|0;else{let e=Kb[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Kb[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Kb[n]=t+Kb[n-7]+i+Kb[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+Wb[n]+Kb[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=Jb.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 Yb(e){return new qb().finalize(e).toBase64()}function Xb(e){return Yb(Rb(e))}function Zb(e){return Xb(e)}function Qb(){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 $b=/^[\w+.-]{2,}:\/\//;function ex(e){return e.endsWith(`/`)?e:`${e}/`}function tx(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function nx(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?ex(n)+e.replace(/^\.?\//,``):e);return n}function rx(e,t){if(!t||t===`/`||$b.test(e))return e;let n=tx(t);return e.startsWith(n)?e:nx(n,e)}function ix(e,t){let n=e.match($b);return t+(n?e.slice(n[0].length):e)}var ax=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function ox(e=21){let t=``,n=e;for(;n--;)t+=ax[Math.random()*64|0];return t}var sx=Symbol.for(`immer-nothing`),cx=Symbol.for(`immer-draftable`),lx=Symbol.for(`immer-state`),ux=[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 dx(e,...t){{let n=ux[e],r=Fx(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var fx=Object,px=fx.getPrototypeOf,mx=`constructor`,hx=`prototype`,gx=`configurable`,_x=`enumerable`,vx=`writable`,yx=`value`,bx=e=>!!e&&!!e[lx];function xx(e){return e?wx(e)||jx(e)||!!e[cx]||!!e[mx]?.[cx]||Mx(e)||Nx(e):!1}var Sx=fx[hx][mx].toString(),Cx=new WeakMap;function wx(e){if(!e||!Px(e))return!1;let t=px(e);if(t===null||t===fx[hx])return!0;let n=fx.hasOwnProperty.call(t,mx)&&t[mx];if(n===Object)return!0;if(!Fx(n))return!1;let r=Cx.get(n);return r===void 0&&(r=Function.toString.call(n),Cx.set(n,r)),r===Sx}function Tx(e,t,n=!0){Ex(e)===0?(n?Reflect.ownKeys(e):fx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function Ex(e){let t=e[lx];return t?t.type_:jx(e)?1:Mx(e)?2:Nx(e)?3:0}var Dx=(e,t,n=Ex(e))=>n===2?e.has(t):fx[hx].hasOwnProperty.call(e,t),Ox=(e,t,n=Ex(e))=>n===2?e.get(t):e[t],kx=(e,t,n,r=Ex(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Ax(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var jx=Array.isArray,Mx=e=>e instanceof Map,Nx=e=>e instanceof Set,Px=e=>typeof e==`object`,Fx=e=>typeof e==`function`,Ix=e=>typeof e==`boolean`;function Lx(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Rx=e=>Px(e)?e?.[lx]:null,zx=e=>e.copy_||e.base_,Bx=e=>e.modified_?e.copy_:e.base_;function Vx(e,t){if(Mx(e))return new Map(e);if(Nx(e))return new Set(e);if(jx(e))return Array[hx].slice.call(e);let n=wx(e);if(t===!0||t===`class_only`&&!n){let t=fx.getOwnPropertyDescriptors(e);delete t[lx];let n=Reflect.ownKeys(t);for(let r=0;r1&&fx.defineProperties(e,{set:Wx,add:Wx,clear:Wx,delete:Wx}),fx.freeze(e),t&&Tx(e,(e,t)=>{Hx(t,!0)},!1),e)}function Ux(){dx(2)}var Wx={[yx]:Ux};function Gx(e){return e===null||!Px(e)||fx.isFrozen(e)}var Kx=`MapSet`,qx=`Patches`,Jx=`ArrayMethods`,Yx={};function Xx(e){let t=Yx[e];return t||dx(0,e),t}var Zx=e=>!!Yx[e];function Qx(e,t){Yx[e]||(Yx[e]=t)}var $x,eS=()=>$x,tS=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Zx(Kx)?Xx(Kx):void 0,arrayMethodsPlugin_:Zx(Jx)?Xx(Jx):void 0});function nS(e,t){t&&(e.patchPlugin_=Xx(qx),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function rS(e){iS(e),e.drafts_.forEach(oS),e.drafts_=null}function iS(e){e===$x&&($x=e.parent_)}var aS=e=>$x=tS($x,e);function oS(e){let t=e[lx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function sS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[lx].modified_&&(rS(t),dx(4)),xx(e)&&(e=cS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[lx].base_,e,t)}else e=cS(t,n);return lS(t,e,!0),rS(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===sx?void 0:e}function cS(e,t){if(Gx(t))return t;let n=t[lx];if(!n)return _S(t,e.handledSet_,e);if(!dS(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);hS(n,e)}return n.copy_}function lS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Hx(t,n)}function uS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var dS=(e,t)=>e.scope_===t,fS=[];function pS(e,t,n,r){let i=zx(e),a=e.type_;if(r!==void 0&&Ox(i,r,a)===t){kx(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Tx(i,(e,n)=>{if(bx(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??fS;for(let e of o)kx(i,e,n,a)}function mS(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!dS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Bx(i);pS(e,i.draft_??i,a,n),hS(i,r)})}function hS(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)}uS(e)}}function gS(e,t,n){let{scope_:r}=e;if(bx(n)){let i=n[lx];dS(i,r)&&i.callbacks_.push(function(){ES(e),pS(e,n,Bx(i),t)})}else xx(n)&&e.callbacks_.push(function(){let i=zx(e);e.type_===3?i.has(n)&&_S(n,r.handledSet_,r):Ox(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&_S(Ox(e.copy_,t,e.type_),r.handledSet_,r)})}function _S(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||bx(e)||t.has(e)||!xx(e)||Gx(e)?e:(t.add(e),Tx(e,(r,i)=>{if(bx(i)){let t=i[lx];dS(t,n)&&(kx(e,r,Bx(t),e.type_),uS(t))}else xx(i)&&_S(i,t,n)}),e)}function vS(e,t){let n=jx(e),r={type_:+!!n,scope_:t?t.scope_:eS(),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=yS;n&&(i=[r],a=bS);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var yS={get(e,t){if(t===lx)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=zx(e);if(!Dx(i,t,e.type_))return CS(e,i,t);let a=i[t];if(e.finalized_||!xx(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Lx(t))return a;if(a===xS(e.base_,t)||SS(e,t,a)){ES(e);let n=e.type_===1?+t:t,r=OS(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in zx(e)},ownKeys(e){return Reflect.ownKeys(zx(e))},set(e,t,n){let r=wS(zx(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=xS(zx(e),t),i=r?.[lx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Ax(n,r)&&(n!==void 0||Dx(e.base_,t,e.type_)))return!0;ES(e),TS(e)}return e.copy_[t]===n&&(n!==void 0||Dx(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),gS(e,t,n),!0)},deleteProperty(e,t){return ES(e),xS(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),TS(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=zx(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[vx]:!0,[gx]:e.type_!==1||t!==`length`,[_x]:r[_x],[yx]:n[t]}},defineProperty(){dx(11)},getPrototypeOf(e){return px(e.base_)},setPrototypeOf(){dx(12)}},bS={};for(let e in yS){let t=yS[e];bS[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}bS.deleteProperty=function(e,t){return isNaN(parseInt(t))&&dx(13),bS.set.call(this,e,t,void 0)},bS.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&dx(14),yS.set.call(this,e[0],t,n,e[0])};function xS(e,t){let n=e[lx];return(n?zx(n):e)[t]}function SS(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!xx(n)||n[lx]?!1:e.baseRefs_.has(n)}function CS(e,t,n){let r=wS(t,n);return r?yx in r?r[yx]:r.get?.call(e.draft_):void 0}function wS(e,t){if(!(t in e))return;let n=px(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=px(n)}}function TS(e){e.modified_||(e.modified_=!0,e.parent_&&TS(e.parent_))}function ES(e){e.copy_||=(e.assigned_=new Map,Vx(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var DS=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Fx(e)&&!Fx(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Fx(t)||dx(6),n!==void 0&&!Fx(n)&&dx(7);let r;if(xx(e)){let i=aS(this),a=OS(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?rS(i):iS(i)}return nS(i,n),sS(r,i)}if(!e||!Px(e)){if(r=t(e),r===void 0&&(r=e),r===sx&&(r=void 0),this.autoFreeze_&&Hx(r,!0),n){let t=[],i=[];Xx(qx).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}dx(1,e)},this.produceWithPatches=(e,t)=>{if(Fx(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]},Ix(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ix(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ix(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){xx(e)||dx(8),bx(e)&&(e=kS(e));let t=aS(this),n=OS(t,e,void 0);return n[lx].isManual_=!0,iS(t),n}finishDraft(e,t){let n=e&&e[lx];(!n||!n.isManual_)&&dx(9);let{scope_:r}=n;return nS(r,t),sS(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=Xx(qx).applyPatches_;return bx(e)?r(e,t):this.produce(e,e=>r(e,t))}};function OS(e,t,n,r){let[i,a]=Mx(t)?Xx(Kx).proxyMap_(t,n):Nx(t)?Xx(Kx).proxySet_(t,n):vS(t,n);return(n?.scope_??eS()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?mS(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 kS(e){return bx(e)||dx(10,e),AS(e)}function AS(e){if(!xx(e)||Gx(e))return e;let t=e[lx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Vx(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Vx(e,!0);let i=n;return Nx(n)&&(n=new Set),Tx(i,(e,t)=>{kx(n,e,AS(t))},r),t&&(t.finalized_=!1),n}function jS(){ux.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=Rx(Ox(e,n.key_)),i=Ox(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||Dx(e,o))||n.parent_.type_===1&&n.parent_.allIndicesReassigned_)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=Ox(o,e,c),f=Ox(s,e,c),p=l?Dx(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===sx?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(Nx(e))return new Set(Array.from(e).map(u));let t=Object.create(px(e));for(let n in e)t[n]=u(e[n]);return Dx(e,cx)&&(t[cx]=e[cx]),t}function d(e){return bx(e)?u(e):e}Qx(qx,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var MS=new DS,NS=MS.produce,PS=MS.produceWithPatches.bind(MS),FS=MS.applyPatches.bind(MS),IS=1e3;function LS(e,t){if(e.add(t),e.size>IS){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function RS(e){let{enablePatches:t=!1}=e;t&&jS();let n=Qb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=ox())=>{i.has(t)||(jS(),r=FS(r,e),LS(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=ox())=>{if(!i.has(a)){if(LS(i,a),t){let[t,i]=PS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=NS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var zS=typeof self==`object`?self:globalThis,BS=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),VS=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function HS(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=BS.has(e)?zS[e]:void 0;return n(new(r??zS.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`&&VS.has(a))return n(new zS[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function US(e){return HS(new Map,e)(0)}var WS=``,{toString:GS}={},{keys:KS}=Object;function qS(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=GS.call(e).slice(8,-1);switch(n){case`Array`:return[1,WS];case`Object`:return[2,WS];case`Date`:return[3,WS];case`RegExp`:return[4,WS];case`Map`:return[5,WS];case`Set`:return[6,WS];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function JS([e,t]){return e===0&&(t===`function`||t===`symbol`)}function YS(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]=qS(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 KS(r))(e||!JS(qS(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||!(JS(qS(n))||JS(qS(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!JS(qS(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function XS(e,t={}){let n=[];return YS(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:ZS,stringify:QS}=JSON,$S={json:!0,lossy:!0};function eC(e){return US(ZS(e))}function tC(e){return QS(XS(e,$S))}function nC(e){return US(e)}function rC(e){return tC(e)}function iC(e){return eC(e)}var aC=256,oC=class extends Error{name=`StreamClosedError`};function sC(e={}){let t=e.id??ox(),n=Math.max(0,e.replayWindow??0),r=Qb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new oC(`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=lC(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 cC(e={}){let t=e.id??ox(),n=Math.max(1,e.highWaterMark??aC),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 lC(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 uC=128;function dC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,uC)}var fC=`modulepreload`,pC=function(e,t){return new URL(e,t).href},mC={},hC=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=pC(t,n),t=s(t),t in mC)return;mC[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`:fC,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)})},gC=`__connection.json`,_C=`__DEVFRAME_CONNECTION__`,vC=`x-birpc-session`,yC=`__rpc-dump/index.json`,bC=`devframe:services`,xC=`devframe_otp`,SC=`devframe_auth_token`;vb.postMessage.remoteAssetsError;var CC=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Zb(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()}},wC=xb({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 TC(e){if(e.agent&&e.jsonSerializable===!1)throw wC.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function EC(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function DC(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 OC(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 jC(e,t){let n=e.handler;if(!n){let r=await AC(e,t);if(!r.handler)throw wC.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 OC(e.name,r,t),o=await a(...n);return await kC(e.name,i,o)}}var MC=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 jC(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 wC.DF0021({name:e.name});TC(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 wC.DF0022({name:e.name});TC(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 jC(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw wC.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 NC(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 FC(t,`undefined`,r,e);return n}return i!==null&&PC(i,r,e,t),n})}function PC(e,t,n,r){if(typeof e==`bigint`)throw FC(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw FC(r,`Map`,t,n);if(e instanceof Set)throw FC(r,`Set`,t,n);if(e instanceof Date)throw FC(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw FC(r,e.constructor?.name??`class instance`,t,n)}function FC(e,t,n,r){let i=IC(n,r);return wC.DF0020({name:e||``,type:t,path:i})}function IC(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var LC=`__DEVFRAME_CONNECTION_META__`,RC=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function zC(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 BC(){return zC(_C)}function VC(){return zC(LC)}function HC(e){if(e)return e;try{let e=localStorage.getItem(RC);if(e)return e}catch{}return zC(RC)}function UC(e){globalThis[_C]=e,globalThis[LC]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&WC(e.authToken)}function WC(e){try{localStorage.setItem(RC,e)}catch{}globalThis[RC]=e;let t=BC();t&&(globalThis[_C]={...t,authToken:e})}function GC(e){let t=rx(gC,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function KC(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function qC(){let e=BC();if(e)return KC(e,HC()??e.authToken??e.connectionMeta.authToken);let t=VC();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??GC(`./`),authToken:HC(t.authToken)}}async function JC(e={}){if(e.connection){let t=KC(e.connection,HC(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return UC(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:GC(t[0]??`./`),authToken:HC(e.authToken??e.connectionMeta.authToken)};return UC(n),n}let n=qC();if(n){let t=KC(n,HC(e.authToken??n.authToken??n.connectionMeta.authToken));return UC(t),t}let r=[];for(let n of t){let t=rx(gC,n),i=GC(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:HC(e.authToken??r.authToken)};return UC(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var YC=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function XC(e=xC){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function ZC(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 QC(e=xC){let t=XC(e);return t&&ZC(e),t}async function $C(e,t={}){let n=QC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function ew(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(bC,{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 tw(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:vb.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:vb.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=RS({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,n)=>{if(e.isTrusted)d().then(t,n);else{t(u);let n=!1;e.events.on(vb.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var nw=new Map;function rw(e=nw){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?NC(n,r??``):`s:${rC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?iC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function iw(){}function aw(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 ow(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 sw(e){let{onConnected:t=iw,onError:n=iw,onDisconnected:r=iw,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${SC}=${encodeURIComponent(e.authToken)}`);let s=rw(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=aw(r);if(!e)break;r=e.rest;let{event:t,data:n}=ow(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`,[vC]: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 cw(e,t){let{channel:n,rpcOptions:r={}}=t;return jb(e,{...n,timeout:-1,...r,proxify:!1})}function lw(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(vb.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 YC(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new YC(`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(vb.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 YC(`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(vb.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(vb.client.connectionError,e),m(new YC(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new YC(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),te=cw(a.functions,{channel:ee,rpcOptions:o});a.register({name:vb.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new YC(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(vb.client.connectionError,e),m(e),i.emit(vb.client.isTrustedUpdated,!1)}});let ne=n;async function re(e){ne=e;let t=await te.$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 YC(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(vb.client.connectionError,e)}return i.emit(vb.client.isTrustedUpdated,c),t.isTrusted}async function ie(e){let t=(await te.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(ne=t,c=!0,d.resolve(!0),f(`connected`),i.emit(vb.client.isTrustedUpdated,!0)),t}async function ae(e={}){await te.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function oe(){return c?!0:re(ne??``)}async function se(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:oe,requestTrustWithToken:re,requestTrustWithCode:ie,requestAuthCode:ae,ensureTrusted:se,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(vb.client.error,n,t),Promise.reject(n)):g(te.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(vb.client.error,t,String(e[0]));return}return te.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(vb.client.error,n,t),Promise.reject(n)):g(te.$callOptional(...e),t)},close:()=>{ee.close()}}}function uw(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 dw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=uw(n.sse,r??`./`,location);return lw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>sw({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 fw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:pw(r)?fw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function pw(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function mw(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function hw(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function gw(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function _w(e){if(e.error)throw fw(e.error);return e.output}function vw(e){return e.some(e=>e!=null)}function yw(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function bw(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?nC(e):e}function a(e,t){return i(yw(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 gw(r)?_w(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(mw(r)){if(vw(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(hw(r)){let e=Zb(n),i=r.records[e];if(i)return _w(await s(i,r.serialization));if(r.fallback)return _w(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!vw(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 xw(e){let t=bw(await e.fetchJsonFromBases(yC),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 Sw=``;function Cw(e,t){return`${e}${Sw}${t}`}function ww(e){let t=new Map,n=new Map;e.client.register({name:vb.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(Cw(e,n))?._push(r,i)}}),e.client.register({name:vb.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=Cw(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:vb.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=Cw(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(vb.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(Sw);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=Cw(n,r),o=t.get(a);if(o)return o;let s=cC({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(vb.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=Cw(t,r),a=n.get(i);if(a)return a;let o=sC({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 Tw(){}var Ew=new Map;function Dw(e){let t=e.url;e.authToken&&(t=`${t}?${SC}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=Tw,onError:i=Tw,onDisconnected:a=Tw,definitions:o=Ew}=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=rw(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 Ow(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 ix(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function kw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=Ow(n.websocket,r??`./`,location);return lw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>Dw({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 Aw(e){return e.includes(`:`)}function jw(e,t){return Aw(t)?t:`${e}:${t}`}function Mw(e){return{async get(t){return(await e()).value()?.[t]},async set(t,n){(await e()).mutate(e=>{if(e===void 0)return{[t]:n};e[t]=n})},async delete(t){(await e()).mutate(e=>{e!==void 0&&delete e[t]})},async all(){return(await e()).value()??{}},async onChange(t){return(await e()).on(`updated`,e=>t(e??{}))}}}function Nw(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=(async()=>(await e.ensureTrusted(),e.sharedState.get(r)))().catch(e=>{throw i=void 0,e}),i}return Mw(a)}function Pw(e,t){return{global:Nw(e,t,`global`),project:Nw(e,t,`project`)}}function Fw(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(Aw(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(jw(t,n),...r)),callEvent:((n,...r)=>e.callEvent(jw(t,n),...r)),callOptional:((n,...r)=>e.callOptional(jw(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(jw(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(jw(t,n),r,i),upload:(n,r)=>e.streaming.upload(jw(t,n),r)}},settings:Pw(e,t),scope:e.scope}}function Iw(){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 Lw(e,t={}){let n=t.modelContext??Iw();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=dC(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=Mb(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Fb(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>Rw(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 Rw(e,t,n){try{let r=Lb(n,e.args?.length);return{content:[{type:`text`,text:zw(await(await jC(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:Bw(e)}]}}}function zw(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function Bw(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 Vw(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 Hw(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Qb(),a=Array.isArray(t)?t:[t],o=await JC(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new CC({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new MC(f),m=e.webmcp===!1?void 0:Lw(p),h,g=!1,_=0,ee;function te(){_++,ee=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:vb.broadcast.cacheInvalidate,type:`event`,handler:te}),i.on(vb.client.connectionStatus,te),i.on(vb.client.isTrustedUpdated,te));async function ne(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(rx(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 re=e.callTimeout??0,ie=re>0?re:1/0,ae,oe={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ie;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&ae.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new YC(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${re}ms`)}for(;!ee&&(t(),!(g||ae.status!==`connected`));){let e=_;ee=ae.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===_&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===_&&(ee=void 0),t}),await ee}await ee,t()}let o=_;if(r&&e.i&&!g&&ae.isTrusted&&d.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);o===_&&!g&&d.apply(e,n)}else await t(e)}}},se=Vw(e.transport??`auto`,s);ae=se===`static`?await xw({fetchJsonFromBases:ne}):se===`sse`?dw({...oe,sseOptions:e.sseOptions}):kw({...oe,wsOptions:e.wsOptions});let ce;try{ce=new BroadcastChannel(`devframe-auth`)}catch{}let le,ue=!1;function de(e){return((...t)=>ue||!le?e(...t):le.then(()=>e(...t)))}function fe(){g=!0,te();try{h?.(),m?.()}finally{try{ce?.close()}finally{ae.close?.()}}}let pe={events:i,get isTrusted(){return ae.isTrusted},get status(){return ae.status},get connectionError(){return ae.connectionError},get transport(){return ae.transport??se},get connection(){return o},connectionMeta:s,ensureTrusted:ae.ensureTrusted,requestTrust:ae.requestTrust,requestTrustWithToken:async e=>(WC(e),o={...o,authToken:e},ae.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await ae.requestTrustWithCode(e);if(!t)return!1;WC(t),o={...o,authToken:t};try{ce?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>ae.requestAuthCode(e),call:de(ae.call),callEvent:de(ae.callEvent),callOptional:de(ae.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:fe};pe.sharedState=tw(pe),pe.streaming=ww(pe),pe.services=ew(pe);let me=new Map;pe.scope=(e=>{if(!e)return pe;let t=me.get(e);return t||(t=Fw(pe,e),me.set(e,t)),t}),f.rpc=pe;function he(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ge(){if(e.simpleAuth!==!1&&he()&&typeof globalThis.prompt==`function`)for(await pe.requestAuthCode().catch(()=>{});!pe.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 pe.requestTrustWithCode(t))return}}async function _e(){let t=await ae.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await $C(pe,{param:n}):!1;t||r||pe.isTrusted||await ge()}return le=_e().then(()=>{ue=!0},()=>{ue=!0}),s.mcp&&hC(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-CD3-sSAR.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(pe))}).catch(()=>{}),ce&&(ce.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&pe.requestTrustWithToken(e.data.authToken)}),pe}var Uw=Hw,Ww=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`],Gw=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function Kw(e){return`pangular:${e}`}var qw=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],Jw={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},idleAfterMs:{default:6e4,min:0,max:6e5}},Yw={"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`},Xw=[[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 Zw(e){return Xw.some(([t])=>t===e)}var Qw=/^[a-z][a-z0-9-]{0,39}$/;function $w(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&Qw.test(e)&&(n?.enabled??!0);return{enabled:r,tools:r&&t.agent.tools.plugins&&(n?.tools??!0),actions:r&&t.actions.plugins&&(n?.actions??!0)}}var eT=`pangular`,tT={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},nT=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function rT(e){if(typeof e!=`string`||e.length>40)return;let t=e.split(`+`).map(e=>e.trim());if(t.some(e=>!e))return;let n=new Set,r;for(let e of t){let t=tT[e.toLowerCase()];if(t){if(n.has(t))return;n.add(t);continue}if(r!==void 0)return;if(/^[a-z0-9]$/i.test(e))r=e.toUpperCase();else if(/^f([1-9]|1[0-2])$/i.test(e))r=e.toUpperCase();else return}if(r&&[...n].some(e=>e!==`Shift`)&&!(n.has(`Mod`)&&(n.has(`Ctrl`)||n.has(`Meta`))))return[...nT.filter(e=>n.has(e)),r].join(`+`)}function iT(e,t,n){let r=t.split(`+`),i=r.pop(),a=new Set(r),o=a.has(`Ctrl`)||a.has(`Mod`)&&!n,s=a.has(`Meta`)||a.has(`Mod`)&&n;if(e.ctrlKey!==o||e.metaKey!==s||e.altKey!==a.has(`Alt`)||e.shiftKey!==a.has(`Shift`))return!1;if(/^F\d+$/.test(i))return e.key.toUpperCase()===i;let c=/^\d$/.test(i)?`Digit${i}`:`Key${i}`;return e.code?e.code===c:e.key.toUpperCase()===i}function aT(e,t){if(!t)return e.replace(/^Mod\b/,`Ctrl`);let n={Mod:`⌘`,Meta:`⌘`,Ctrl:`⌃`,Alt:`⌥`,Shift:`⇧`};return e.split(`+`).map(e=>n[e]??e).join(``)}var oT=[{id:`dashboard`,label:`Dashboard`},{id:`timeline`,label:`Timeline`},{id:`audit`,label:`Audit`},{id:`analog`,label:`Analog`,inspector:`analog`},{id:`components`,label:`Components`,inspector:`components`},{id:`routes`,label:`Routes`,inspector:`router`},{id:`signals`,label:`Signals`,inspector:`signals`},{id:`injectors`,label:`Injectors`,inspector:`injectors`},{id:`store`,label:`Store`,inspector:`ngrx`},{id:`queries`,label:`Queries`,inspector:`tanstackQuery`},{id:`forms`,label:`Forms`,inspector:`forms`},{id:`pipes`,label:`Pipes`,inspector:`pipes`},{id:`network`,label:`SSR & HTTP`,inspector:`http`},{id:`errors`,label:`Errors`,inspector:`errors`},{id:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],sT=1e4;function cT(e){return oT.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var lT={components:`a component instance, by its id in the component tree`,injectors:`a component's element injector, by the component's id`,forms:`a form, by its id`},uT=200;function dT(e){let t=new URLSearchParams({tab:e.tab});return e.id&&t.set(`id`,e.id),e.page&&t.set(`page`,e.page),`#${t.toString()}`}function fT(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=uT?n:void 0},r=n(`tab`);if(!r)return null;let i=n(`id`),a=n(`page`);return{tab:r,...i?{id:i}:{},...a?{page:a}:{}}}var pT=[{id:`settings`,title:`Open settings`,group:`Go to`,keywords:`preferences tabs`},{id:`pick-component`,title:`Pick component on page`,group:`Actions`,keywords:`select inspect element`,inspector:`components`},{id:`cd-record-start`,title:`Start recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-record-stop`,title:`Stop recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-clear`,title:`Clear change detection recording`,group:`Actions`,keywords:`reset recordings cycles`,inspector:`components`},{id:`theme:system`,title:`Theme: follow the system`,group:`Theme`,keywords:`auto`},{id:`theme:light`,title:`Theme: light`,group:`Theme`},{id:`theme:dark`,title:`Theme: dark`,group:`Theme`},{id:`dock:float`,title:`Popup: float`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:bottom`,title:`Popup: dock to the bottom`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:right`,title:`Popup: dock to the right`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:reset-size`,title:`Popup: reset the docked size`,group:`Popup`,keywords:`splitter resize height width`,popupOnly:!0},{id:`popout`,title:`Popup: open in its own window`,group:`Popup`,keywords:`pop out detach new window`,popupOnly:!0},{id:`popout:return`,title:`Popup: back into the page`,group:`Popup`,keywords:`pop in attach dock window`,popupOnly:!0}];function mT(e){let t=cT(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=pT.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function hT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function gT(e,t){return typeof e==`boolean`?e:t}var _T=100,vT=100;function yT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=vT);return[...new Set(t)].slice(0,_T)}function bT(e,t){let{default:n,min:r,max:i}=Jw[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function xT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function ST(e){let t=hT(e),n=hT(t.agent),r=hT(t.inspectors),i=hT(n.tools),a=hT(t.actions),o=gT(t.actions,!0),s=hT(t.redaction),c=hT(t.limits),l=xT(Ww,e=>gT(r[e],!0));return{inspectors:l,agent:{readOnly:gT(n.readOnly,!1),tools:xT(Ww,e=>l[e]&&gT(i[e],!0)),browserTools:gT(n.browserTools,!1)},actions:xT(qw,e=>l[e]&&gT(a[e],o)),redaction:{secretNames:yT(s.secretNames),unmask:yT(s.unmask)},limits:Object.fromEntries(Object.keys(Jw).map(e=>[e,bT(c[e],e)])),popup:{hotkey:DT(hT(t.popup).hotkey)},plugins:ET(t.plugins),lint:{rules:wT(t.lint)}}}var CT=200;function wT(e){let t=hT(hT(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,CT))typeof r==`boolean`&&(n[e]=r);return n}var TT=100;function ET(e){let t={};for(let[n,r]of Object.entries(hT(e)).slice(0,TT)){if(!Qw.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=hT(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:gT(e.enabled,!0),tools:gT(e.tools,!0),actions:gT(e.actions,!0)})}return t}function DT(e){return e===!1?!1:rT(e)??`Alt+Shift+P`}function OT(e){let t=e?.configs;return ST(t?.[eT])}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 SSR overrides, and clearing HTTP calls`,analog:`Calling API routes and clearing server calls`,components:`Editing component properties and signals`,tanstackQuery:`Invalidating and refetching TanStack queries`,plugins:`Running plugin actions`}[e]} is turned off in the devtools config (actions.${e}).`}var AT=[`pangular:build-meta`],jT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,tanstackQuery:`TanStack Query`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`,errors:`Errors`,plugins:`Plugins`},MT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},NT={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`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function PT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=Ww.filter(t=>e.inspectors[t]);n(`Inspectors off`,Ww.filter(t=>!e.inspectors[t]).map(e=>jT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>jT[e])),n(`Blocked actions`,qw.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>MT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(Jw).filter(t=>e.limits[t]!==Jw[t].default).map(t=>NT[t](e.limits[t]))),e.popup.hotkey!==`Alt+Shift+P`&&n(`Popup shortcut`,[e.popup.hotkey===!1?`Off`:e.popup.hotkey]);let i=Object.entries(e.plugins??{});return n(`Plugins off`,i.filter(([,e])=>!e.enabled).map(([e])=>e)),n(`Plugin tools or actions off`,i.filter(([,e])=>e.enabled&&(!e.tools||!e.actions)).map(([e,t])=>`${e} (${[!t.tools&&`tools`,!t.actions&&`actions`].filter(Boolean).join(`, `)})`)),n(`Lint rules off`,Object.entries(e.lint?.rules??{}).filter(([,e])=>!e).map(([e])=>e)),t}function FT(e){let t={tags:[],directives:[],text:``},n=e.toLowerCase();return n=n.replace(/<\s*([^<>\s]+)\s*>/g,(e,n)=>(t.tags.push({value:n,exact:!0}),` `)),n=n.replace(/\[\s*([^[\]\s]+)\s*\]/g,(e,n)=>(t.directives.push({value:n,exact:!0}),` `)),n=n.replace(/(^|\s)([<[])([^<>[\]\s]*)$/,(e,n,r,i)=>(i&&(r===`<`?t.tags:t.directives).push({value:i,exact:!1}),n)),t.text=n.replace(/\s+/g,` `).trim(),t}function IT(e){return!e.tags.length&&!e.directives.length&&!e.text}function LT(e,t){let n=e.tag.toLowerCase(),r=(e.directives??[]).map(e=>e.toLowerCase()),i=(e.attributes??[]).map(e=>e.toLowerCase()),a=[...r,...r.map(e=>e.replace(/directive$/,``)),...i];for(let{value:e,exact:r}of t.tags)if(r?n!==e:!n.startsWith(e))return!1;for(let{value:e,exact:n}of t.directives)if(!a.some(t=>n?t===e:t.includes(e)))return!1;if(t.text){let a=t.text;if(!(e.name.toLowerCase().includes(a)||n.includes(a)||r.some(e=>e.includes(a))||i.some(e=>e.includes(a))))return!1}return!0}var RT={debugApi:{subject:`Live data`,since:`12.0`},injectorProviders:{subject:`Reading providers and environment injectors`,since:`16.2`},injectorMetadata:{subject:`The full injector tree`,since:`17.0`},isSignal:{subject:`Telling signals apart in component values`,since:`17.1`},signalGraph:{subject:`The live signal graph`,since:`20.1`},deferBlocks:{subject:`Listing @defer blocks`,since:`19.1`},forBlocks:{subject:`Listing @for blocks`,since:`22.0`},profiler:{subject:`Recording change detection`,since:`20.0`},angularProfiling:{subject:`Angular profiling`,since:`20.0`},routerInstance:{subject:`The router debug util`,since:`20.3`}};function zT(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function BT(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function VT(e,t){let n=BT(e),r=BT(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function HT(e,t){return e?.capabilities?.[t]===!1}function UT(e,t){let n=RT[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=zT(t);return VT(t,n.since)?`${r} in a development build; this page runs Angular ${i} without it, which usually means a production build.`:`${r}; this page runs Angular ${i}.`}var WT=/^on (viewport|interaction|hover)\b/;function GT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>WT.test(e))}function KT(e,t){let n=[],r=e.since>0?Math.max(0,Math.round((t-e.since)/1e3)):0;return e.state===`error`&&n.push({kind:`failed`,text:`failed to load`,label:`failed`}),(e.state===`placeholder`||e.state===`initial`)&&r*1e3>=1e4&&n.push(GT(e.triggers)?{kind:`waiting`,text:`waiting for its trigger for ${r}s`,label:`waiting ${r}s`,seconds:r}:{kind:`stuck`,text:`on its placeholder for ${r}s`,label:`stuck ${r}s`,seconds:r}),e.hydrateNever?n.push({kind:`hydrate-never`,text:`hydrate never: the server HTML stays static`,label:`hydrate never`}):e.hydration===`dehydrated`&&n.push({kind:`dehydrated`,text:`still dehydrated`,label:`dehydrated`}),n}var qT=`pangular-page-id`,JT=null;function YT(e){JT=e}function XT(){if(JT)return JT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(qT)||null)}catch{return null}}function ZT(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 QT(e,t){return e?t?e.pages?.[t]??null:e:null}function $T(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function eE(){return{functions:[...AT]}}function tE(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function nE(e,t,n){return tE(e,t,n).then(e=>e,()=>null)}function rE(e){return e?.connectionMeta.backend===`static`}function iE(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 aE(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function oE(e){return e.split(`@`)[1]??``}var sE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},cE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},lE=nE,uE={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 dE(e){return uE[e]??e}var fE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function pE(e,t){return await lE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function mE(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 hE=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function gE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(hE,(e,t)=>t??(e===`**`?``:e))}function _E(e){return OT(e?.connectionMeta)}function vE(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function yE(e,t){if(!t||typeof t!=`object`)return e;let n=vE(t.secretNames),r=vE(t.unmask);return!n||!r?e:{...e,redaction:{secretNames:n,unmask:r}}}function bE(e,t){return _E(e).actions[t]}var xE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,queries:`tanstackQuery`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`,errors:`errors`,plugins:`plugins`};function SE(e){return xE[e]}var CE=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function wE(e,t){let n=xE[e];return!n||t.inspectors[n]}function TE(e,t){e&1&&(E(),Og(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function EE(e,t){e&1&&(E(),Og(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function DE(e,t){e&1&&(E(),Og(0,`path`,13)(1,`path`,14))}function OE(e,t){e&1&&(E(),Og(0,`path`,15)(1,`path`,16)(2,`path`,17))}function kE(e,t){e&1&&(E(),Og(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function AE(e,t){e&1&&(E(),Og(0,`path`,1))}function jE(e,t){e&1&&(E(),Og(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function ME(e,t){e&1&&(E(),Og(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function NE(e,t){e&1&&(E(),Og(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function PE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function FE(e,t){e&1&&(E(),Og(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function IE(e,t){e&1&&(E(),Og(0,`circle`,39)(1,`path`,40))}function LE(e,t){e&1&&(E(),Og(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function RE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function zE(e,t){e&1&&(E(),Og(0,`path`,2))}function BE(e,t){e&1&&(E(),Og(0,`path`,3))}function VE(e,t){e&1&&(E(),Og(0,`path`,4))}var HE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:18,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`,`M10 3h4v3a2 2 0 1 0 4 0V5h1a2 2 0 0 1 2 2v4h-2a2 2 0 1 0 0 4h2v4a2 2 0 0 1-2 2h-4v-2a2 2 0 1 0-4 0v2H7a2 2 0 0 1-2-2v-4H4a2 2 0 1 1 0-4h1V7a2 2 0 0 1 2-2h3Z`],[`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`,`M3 12h18`],[`cx`,`7`,`cy`,`12`,`r`,`2`],[`cx`,`14`,`cy`,`12`,`r`,`2`],[`d`,`M18 7v10`],[`d`,`M9 11l2 2 4-4`],[`d`,`M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3Z`],[`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`,`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`],[`cx`,`12`,`cy`,`12`,`r`,`3`],[`d`,`M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z`],[`cx`,`11`,`cy`,`5`,`rx`,`8`,`ry`,`3`],[`d`,`M3 5v6c0 1.66 3.58 3 8 3`],[`d`,`M3 11v6c0 1.66 3.58 3 8 3`],[`d`,`M21 14a4 4 0 1 1-1.2-2.85L21 12.3`],[`d`,`M21 9v3.3h-3.3`],[`d`,`M12 7v6`],[`d`,`M12 16.5v.01`]],template:function(e,t){if(e&1&&(E(),z(0,`svg`,0),j(1,TE,4,0)(2,EE,4,0)(3,DE,2,0)(4,OE,3,0)(5,kE,3,0)(6,AE,1,0,`:svg:path`,1)(7,jE,4,0)(8,ME,3,0)(9,NE,4,0)(10,PE,3,0)(11,FE,5,0)(12,IE,2,0)(13,LE,5,0)(14,RE,3,0)(15,zE,1,0,`:svg:path`,2)(16,BE,1,0,`:svg:path`,3)(17,VE,1,0,`:svg:path`,4),B()),e&2){let e;O(),M((e=t.name())===`dashboard`?1:e===`timeline`?2:e===`audit`?3:e===`components`?4:e===`routes`?5:e===`signals`?6:e===`injectors`?7:e===`store`?8:e===`forms`?9:e===`network`?10:e===`pipes`?11:e===`settings`?12:e===`queries`?13:e===`errors`?14:e===`plugins`?15:e===`analog`?16:e===`capacitor`?17:-1)}},styles:[`[_nghost-%COMP%] { +`);return r>=0?n.slice(0,r):n}function Ci(e,t){return e?t?`${e} ${t}`:e:t||``}var wi=bi({__forward_ref__:bi});function Ti(e){return e.__forward_ref__=Ti,e}function Ei(e){return Di(e)?e():e}function Di(e){return typeof e==`function`&&Object.hasOwn(e,wi)&&e.__forward_ref__===Ti}function Oi(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ki(e){return Ai(e,Ni)}function Ai(e,t){return Object.hasOwn(e,t)&&e[t]||null}function ji(e){return(e?.[Ni]??null)||null}function Mi(e){return e&&Object.hasOwn(e,Pi)?e[Pi]:null}var Ni=bi({ɵprov:bi}),Pi=bi({ɵinj:bi}),Fi=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=Oi({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ii(e){return e&&!!e.ɵproviders}var Li=bi({ɵcmp:bi}),Ri=bi({ɵdir:bi}),zi=bi({ɵpipe:bi}),Bi=bi({ɵfac:bi}),Vi=bi({__NG_ELEMENT_ID__:bi}),Hi=bi({__NG_ENV_ID__:bi});function Ui(e){return Ki(e,`@Component`),e[Li]||null}function Wi(e){return Ki(e,`@Directive`),e[Ri]||null}function Gi(e){return Ki(e,`@Pipe`),e[zi]||null}function Ki(e,t){if(e==null)throw new _i(-919,!1)}function qi(e){return typeof e==`string`?e:e==null?``:String(e)}var Ji=bi({ngErrorCode:bi}),Yi=bi({ngErrorMessage:bi}),Xi=bi({ngTokenPath:bi});function Zi(e,t){return $i(``,-200,t)}function Qi(e,t){throw new _i(-201,!1)}function $i(e,t,n){let r=new _i(t,e);return r[Ji]=t,r[Yi]=e,n&&(r[Xi]=n),r}function ea(e){return e[Ji]}var ta;function na(){return ta}function ra(e){let t=ta;return ta=e,t}function ia(e,t,n){let r=ki(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;Qi(e,``)}var aa=globalThis,oa={},sa=`__NG_DI_FLAG__`,ca=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=da(t)||0;try{return this.injector.get(e,n&8?null:oa,n)}catch(e){if(Kn(e))return e;throw e}}};function la(e,t=0){let n=Un();if(n===void 0)throw new _i(-203,!1);if(n===null)return ia(e,void 0,t);{let r=fa(t),i=n.retrieve(e,r);if(Kn(i)){if(r.optional)return null;throw i}return i}}function ua(e,t=0){return(na()||la)(Ei(e),t)}function C(e,t){return ua(e,da(t))}function da(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function fa(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function pa(e){let t=[];for(let n=0;nArray.isArray(e)?va(e,t):t(e))}function ya(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ba(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function xa(e,t){let n=[];for(let r=0;rt;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function Ca(e,t,n){let r=Ta(e,t);return r>=0?e[r|1]=n:(r=~r,Sa(e,r,t,n)),r}function wa(e,t){let n=Ta(e,t);if(n>=0)return e[n|1]}function Ta(e,t){return Ea(e,t,1)}function Ea(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 va(t,e=>{let t=e;Ia(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&Fa(i,a),n}function Fa(e,t){for(let n=0;n{t(e,r)})}}function Ia(e,t,n,r){if(e=Ei(e),!e)return!1;let i=null,a=Mi(e),o=!a&&Ui(e);if(!a&&!o){let t=e.ngModule;if(a=Mi(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)Ia(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{va(a.imports,i=>{Ia(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&Fa(e,t)}if(!s){let e=ha(i)||(()=>new i);t({provide:i,useFactory:e,deps:Oa},i),t({provide:ja,useValue:i,multi:!0},i),t({provide:ka,useValue:()=>ua(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;La(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function La(e,t){for(let n of e)Ii(n)&&(n=n.ɵproviders),Array.isArray(n)?La(n,t):t(n)}var Ra=bi({provide:String,useValue:bi});function za(e){return typeof e==`object`&&!!e&&Ra in e}function Ba(e){return!!(e&&e.useExisting)}function Va(e){return!!(e&&e.useFactory)}function Ha(e){return typeof e==`function`}function Ua(e){return!!e.useClass}var Wa=new Fi(``),Ga={},Ka={},qa=void 0;function Ja(){return qa===void 0&&(qa=new Ma),qa}var Ya=class{},Xa=class extends Ya{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,oo(e,e=>this.processProvider(e)),this.records.set(Aa,no(void 0,this)),r.has(`environment`)&&this.records.set(Ya,no(void 0,this));let i=this.records.get(Wa);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(ja,Oa,{self:!0}))}retrieve(e,t){let n=da(t)||0;try{return this.get(e,oa,n)}catch(e){if(Kn(e))return e;throw e}}destroy(){to(this),this._destroyed=!0;let e=nn(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(),nn(e)}}onDestroy(e){return to(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){to(this);let t=Wn(this),n=ra(void 0);try{return e()}finally{Wn(t),ra(n)}}get(e,t=oa,n){if(to(this),Object.hasOwn(e,Hi))return e[Hi](this);let r=da(n),i=Wn(this),a=ra(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=ao(e)&&ki(e);t=n&&this.injectableDefInScope(n)?no(Za(e),Ga):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?Ja():this.parent;return t=r&8&&t===oa?null:t,n.get(e,t)}catch(e){let t=ea(e);throw t===-200||t===-201?new _i(t,null):e}finally{ra(a),Wn(i)}}resolveInjectorInitializers(){let e=nn(null),t=Wn(this),n=ra(void 0);try{let e=this.get(ka,Oa,{self:!0});for(let t of e)t()}finally{Wn(t),ra(n),nn(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=Ei(e);let t=Ha(e)?e:Ei(e&&e.provide),n=$a(e);if(!Ha(e)&&e.multi===!0){let n=this.records.get(t);n||(n=no(void 0,Ga,!0),n.factory=()=>pa(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=nn(null);try{if(t.value===Ka)throw Zi(``);return t.value===Ga&&(t.value=Ka,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&io(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{nn(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=Ei(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 Za(e){let t=ki(e),n=t===null?ha(e):t.factory;if(n!==null)return n;if(e instanceof Fi)throw new _i(-204,!1);if(e instanceof Function)return Qa(e);throw new _i(-204,!1)}function Qa(e){if(e.length>0)throw new _i(-204,!1);let t=ji(e);return t===null?()=>new e:()=>t.factory(e)}function $a(e){return za(e)?no(void 0,e.useValue):no(eo(e),Ga)}function eo(e,t,n){let r;if(Ha(e)){let t=Ei(e);return ha(t)||Za(t)}if(za(e))r=()=>Ei(e.useValue);else if(Va(e))r=()=>e.useFactory(...pa(e.deps||[]));else if(Ba(e))r=(t,n)=>ua(Ei(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=Ei(e&&(e.useClass||e.provide));if(ro(e))r=()=>new t(...pa(e.deps));else return ha(t)||Za(t)}return r}function to(e){if(e.destroyed)throw new _i(-205,!1)}function no(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function ro(e){return!!e.deps}function io(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function ao(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function oo(e,t){for(let n of e)Array.isArray(n)?oo(n,t):n&&Ii(n)?oo(n.ɵproviders,t):t(n)}function so(e,t){let n;e instanceof Xa?(to(e),n=e):n=new ca(e);let r=Wn(n),i=ra(void 0);try{return t()}finally{Wn(r),ra(i)}}function co(){return na()!==void 0||Un()!=null}var lo=1;function uo(e){return Array.isArray(e)&&typeof e[lo]==`object`}function fo(e){return Array.isArray(e)&&e[lo]===!0}function po(e){return!!(e.flags&4)}function mo(e){return e.componentOffset>-1}function ho(e){return(e.flags&1)==1}function go(e){return!!e.template}function _o(e){return!!(e[2]&512)}function vo(e){return(e[2]&256)==256}var yo=(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})(yo||{}),bo=`math`;function xo(e){for(;Array.isArray(e);)e=e[0];return e}function So(e,t){return xo(t[e])}function Co(e,t){return xo(t[e.index])}function wo(e,t){return e.data[t]}function To(e,t){return e[t]}function Eo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Do(e,t){let n=t[e];return uo(n)?n:n[0]}function Oo(e){return(e[2]&128)==128}function Pee(e){return fo(e[3])}function ko(e,t){return t==null?null:e[t]}function Ao(e){e[17]=0}function jo(e){e[2]&1024||(e[2]|=1024,Oo(e)&&Po(e))}function Fee(e,t){for(;e>0;)t=t[14],e--;return t}function Mo(e){return!!(e[2]&9216||e[24]?.dirty)}function No(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),Mo(e)&&Po(e)}function Po(e){e[10].changeDetectionScheduler?.notify(0);let t=Io(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!Oo(t)));)t=Io(t)}function Fo(e,t){if(vo(e))throw new _i(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function Iee(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function Io(e){let t=e[3];return fo(t)?t[3]:t}function Lo(e){return e[7]??=[]}function Ro(e){return e.cleanup??=[]}function Lee(e,t,n,r){let i=Lo(t);i.push(n),e.firstCreatePass&&Ro(e).push(r,i.length-1)}var zo={lFrame:fs(null),bindingsEnabled:!0,skipHydrationRootTNode:null},Bo=!1;function Ree(){return zo.lFrame.elementDepthCount}function zee(){zo.lFrame.elementDepthCount++}function Vo(){zo.lFrame.elementDepthCount--}function Ho(){return zo.bindingsEnabled}function Uo(){return zo.skipHydrationRootTNode!==null}function Wo(e){return zo.skipHydrationRootTNode===e}function Go(){zo.skipHydrationRootTNode=null}function Ko(){return zo.lFrame.lView}function qo(){return zo.lFrame.tView}function w(e){return zo.lFrame.contextLView=e,e[8]}function T(e){return zo.lFrame.contextLView=null,e}function Jo(){let e=Yo();for(;e!==null&&e.type===64;)e=e.parent;return e}function Yo(){return zo.lFrame.currentTNode}function Bee(){let e=zo.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Xo(e,t){let n=zo.lFrame;n.currentTNode=e,n.isParent=t}function Zo(){return zo.lFrame.isParent}function Qo(){zo.lFrame.isParent=!1}function $o(){return zo.lFrame.contextLView}function es(){return Bo}function ts(e){let t=Bo;return Bo=e,t}function ns(){let e=zo.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function rs(){return zo.lFrame.bindingIndex}function Vee(e){return zo.lFrame.bindingIndex=e}function is(){return zo.lFrame.bindingIndex++}function as(e){let t=zo.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function Hee(){return zo.lFrame.inI18n}function Uee(e,t){let n=zo.lFrame;n.bindingIndex=n.bindingRootIndex=e,os(t)}function Wee(){return zo.lFrame.currentDirectiveIndex}function os(e){zo.lFrame.currentDirectiveIndex=e}function Gee(e){let t=zo.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Kee(){return zo.lFrame.currentQueryIndex}function ss(e){zo.lFrame.currentQueryIndex=e}function cs(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ls(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=cs(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=zo.lFrame=ds();return r.currentTNode=t,r.lView=e,!0}function us(e){let t=ds(),n=e[1];zo.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function ds(){let e=zo.lFrame,t=e===null?null:e.child;return t===null?fs(e):t}function fs(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 ps(){let e=zo.lFrame;return zo.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var ms=ps;function hs(){let e=ps();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 gs(e){return(zo.lFrame.contextLView=Fee(e,zo.lFrame.contextLView))[8]}function _s(){return zo.lFrame.selectedIndex}function vs(e){zo.lFrame.selectedIndex=e}function ys(){let e=zo.lFrame;return wo(e.tView,e.selectedIndex)}function E(){zo.lFrame.currentNamespace=`svg`}function bs(){xs()}function xs(){zo.lFrame.currentNamespace=null}function Ss(){return zo.lFrame.currentNamespace}var Cs=!0;function ws(){return Cs}function Ts(e){Cs=e}function Es(e,t=null,n=null,r){let i=Ds(e,t,n,r);return i.resolveInjectorInitializers(),i}function Ds(e,t=null,n=null,r,i=new Set){return new Xa([n||Oa,Na(e)],t||Ja(),null,i)}var Os=class e{static THROW_IF_NOT_FOUND=oa;static NULL=new Ma;static create(e,t){if(Array.isArray(e))return Es({name:``},t,e,``);{let t=e.name??``;return Es({name:t},e.parent,e.providers,t)}}static ɵprov=Oi({token:e,providedIn:`any`,factory:()=>ua(Aa)});static __NG_ELEMENT_ID__=-1},ks=new Fi(``),As=class{static __NG_ELEMENT_ID__=Ms;static __NG_ENV_ID__=e=>e},js=class extends As{_lView;constructor(e){super(),this._lView=e}get destroyed(){return vo(this._lView)}onDestroy(e){let t=this._lView;return Fo(t,e),()=>Iee(t,e)}};function Ms(){return new js(Ko())}var Ns=new Fi(``),Ps=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Xr(!1);debugTaskTracker=C(Ns,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new zr(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=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fs=class extends Jr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,co()&&(this.destroyRef=C(As,{optional:!0})??void 0,this.pendingTasks=C(Ps,{optional:!0})??void 0)}emit(e){let t=nn(null);try{super.next(e)}finally{nn(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 fr&&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 Is(...e){}function Ls(e){let t,n;function r(){e=Is;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 Rs(e){return queueMicrotask(()=>e()),()=>{e=Is}}var zs=`isAngularZone`,Bs=`isAngularZone_ID`,Vs=0,Hs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Fs(!1);onMicrotaskEmpty=new Fs(!1);onStable=new Fs(!1);onError=new Fs(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new _i(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,Ks(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(zs)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new _i(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new _i(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,Us,Is,Is);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)}},Us={};function Ws(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 Gs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Ls(()=>{e.callbackScheduled=!1,qs(e),e.isCheckStableRunning=!0,Ws(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),qs(e)}function Ks(e){let t=()=>{Gs(e)},n=Vs++;e._inner=e._inner.fork({name:`angular`,properties:{[zs]:!0,[Bs]:n,[Bs+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Zs(s))return n.invokeTask(i,a,o,s);try{return Js(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Ys(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Js(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Qs(s)&&t(),Ys(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,qs(e),Ws(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 qs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Js(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Ys(e){e._nesting--,Ws(e)}var Xs=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Fs;onMicrotaskEmpty=new Fs;onStable=new Fs;onError=new Fs;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 Zs(e){return $s(e,`__ignore_ng_zone__`)}function Qs(e){return $s(e,`__scheduler_tick__`)}function $s(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var ec=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},tc=new Fi(``,{factory:()=>{let e=C(Hs),t=C(Ya),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(ec),n.handleError(r))})}}}),nc={provide:ka,useValue:()=>{C(ec,{optional:!0})},multi:!0};function D(e,t){let[n,r,i]=Pn(e,t?.equal),a=n;return a[tn],a.set=r,a.update=i,a.asReadonly=rc.bind(a),a}function rc(){let e=this[tn];if(e.readonlyFn===void 0){let t=()=>this();t[tn]=e,e.readonlyFn=t}return e.readonlyFn}var ic=new Fi(``,{factory:()=>ac}),ac=`ng`,oc=new Fi(``),sc=new Fi(``,{providedIn:`platform`,factory:()=>`unknown`}),cc=new Fi(``,{factory:()=>C(ks).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),lc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=uc}return e})();function uc(){return new lc(Ko(),Jo())}var dc=class{},fc=new Fi(``,{factory:()=>!0}),pc=new Fi(``),mc=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new hc})}return e})(),hc=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}},gc=class{[tn];constructor(e){this[tn]=e}destroy(){this[tn].destroy()}};function _c(e,t){let n=t?.injector??C(Os),r=t?.manualCleanup===!0?null:n.get(As),i,a=n.get(lc,null,{optional:!0}),o=n.get(dc);return a===null?i=Sc(e,n.get(mc),o):(i=xc(a.view,o,e),r instanceof js&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new gc(i)}var vc={...Bn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ts(!1);try{Vn(this)}finally{ts(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=nn(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],nn(e)}}},yc={...vc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},bc={...vc,consumerMarkedDirty(){this.view[2]|=8192,Po(this.view),this.notifier.notify(13)},destroy(){if(vn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function xc(e,t,n){let r=Object.create(bc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=Cc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function Sc(e,t,n){let r=Object.create(yc);return r.fn=Cc(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 Cc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function wc(e){return typeof e==`function`&&e[tn]!==void 0}function Tc(e){return wc(e)&&typeof e.set==`function`}var Ec=Symbol(`InputSignalNode#UNSET`),Dc={...Rn,transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}};function Oc(e){return{toString:e}.toString()}var kc=(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})(kc||{}),Ac=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function jc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Mc=null,Nc=(()=>{Mc=Fc;let e=()=>Fc;return e.ngInherit=!0,e})();function Pc(){return Mc}function Fc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Lc),Ic}function Ic(){let e=zc(this),t=e?.current;if(t){let n=e.previous;if(n===Da)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Lc(e,t,n,r,i){let a=this.declaredInputs[r],o=zc(e)||Bc(e,{previous:Da,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Ac(l&&l.currentValue,n,c===Da),jc(e,t,i,n)}var Rc=`__ngSimpleChanges__`;function zc(e){return Object.hasOwn(e,Rc)&&e[Rc]||null}function Bc(e,t){return e[Rc]=t}var Vc=[],Hc=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,Yc(o,a)):Yc(o,a)}var Zc=-1,Qc=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 $c(e){return!!(e.flags&8)}function el(e){return!!(e.flags&16)}function tl(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function ll(e,t){let n=cl(e),r=t;for(;n>0;)r=r[14],n--;return r}var ul=!0;function dl(e){let t=ul;return ul=e,t}var fl=255,pl=5,ml=0,hl={};function gl(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,Vi)&&(r=n[Vi]),r??=n[Vi]=ml++;let i=r&fl,a=1<>pl)]|=a}function _l(e,t){let n=yl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let i=bl(e,t),a=e.injectorIndex;if(ol(i)){let e=sl(i),n=ll(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 vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function yl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function bl(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=Ll(i),r===null)return Zc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Zc}function xl(e,t,n){gl(e,t,n)}function Sl(e,t,n){if(n&8||e!==void 0)return e;Qi(t,`NodeInjector`)}function Cl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=ra(void 0);try{return i?i.get(t,r,n&8):ia(t,r,n&8)}finally{ra(a)}}return Sl(r,t,n)}function wl(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Il(e,t,n,r,hl);if(i!==hl)return i}let i=Tl(e,t,n,r,hl);if(i!==hl)return i}return Cl(t,n,r,i)}function Tl(e,t,n,r,i){let a=kl(n);if(typeof a==`function`){if(!ls(t,e,r))return r&1?Sl(i,n,r):Cl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Qi(n);else return e}finally{ms()}}else if(typeof a==`number`){let i=null,o=yl(e,t),s=Zc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?bl(e,t):t[o+8],s===Zc||!jl(r,!1)?o=-1:(i=t[1],o=sl(s),t=ll(s,t)));o!==-1;){let e=t[1];if(Al(a,o,e.data)){let e=El(o,t,n,i,r,c);if(e!==hl)return e}s=t[o+8],s!==Zc&&jl(r,t[1].data[o+8]===c)&&Al(a,o,t)?(i=e,o=sl(s),t=ll(s,t)):o=-1}}return i}function El(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=Dl(s,o,n,r==null?mo(s)&&ul:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?hl:Ol(t,o,c,s,i)}function Dl(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&&go(e)&&e.type===n)return c}return null}function Ol(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Qc){let s=a;if(s.resolving)throw Zi(``);let c=dl(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?ra(s.injectImpl):null;ls(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Uc(n,o[n],t)}finally{l!==null&&ra(l),dl(c),s.resolving=!1,ms()}}return a}function kl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,Vi)?e[Vi]:void 0;return typeof t==`number`?t>=0?t&fl:Nl:t}function Al(e,t,n){let r=1<>pl)]&r)}function jl(e,t){return!(e&2)&&!(e&1&&t)}var Ml=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return wl(this._tNode,this._lView,e,da(n),t)}};function Nl(){return new Ml(Jo(),Ko())}function Pl(e){return Oc(()=>{let t=e.prototype.constructor,n=t[Bi]||Fl(t),r=Object.prototype,i=Object.getPrototypeOf(e.prototype).constructor;for(;i&&i!==r;){let e=i[Bi]||Fl(i);if(e&&e!==n)return e;i=Object.getPrototypeOf(i)}return e=>new e})}function Fl(e){return Di(e)?()=>{let t=Fl(Ei(e));return t&&t()}:ha(e)}function Il(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!_o(o);){let e=Tl(a,o,n,r|2,hl);if(e!==hl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,hl,r);if(t!==hl)return t}t=Ll(o),o=o[14]}a=t}return i}function Ll(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function Rl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function zl(){return Bl(Jo(),Ko())}function Bl(e,t){return new Vl(Co(e,t))}var Vl=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=zl}return e})();function Hl(e){return e instanceof Vl?e.nativeElement:e}function Ul(){return this._results[Symbol.iterator]()}var Wl=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 Jr}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=_a(e);(this._changesDetected=!ga(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]=Ul};function Gl(e){return(e.flags&128)==128}var Kl=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Kl||{}),ql=new Map,Jl=0;function Yl(){return Jl++}function Xl(e){ql.set(e[19],e)}function Zl(e){ql.delete(e[19])}var Ql=`__ngContext__`;function $l(e,t){uo(t)?(e[Ql]=t[19],Xl(t)):e[Ql]=t}function eu(e){return nu(e[12])}function tu(e){return nu(e[4])}function nu(e){for(;e!==null&&!fo(e);)e=e[4];return e}var ru=void 0;function iu(e){ru=e}function au(){if(ru!==void 0)return ru;if(typeof document<`u`)return document;throw new _i(210,!1)}var ou=!1,su=new Fi(``,{factory:()=>ou}),cu=new WeakMap;function lu(e,t){if(typeof e!=`object`||!e)return;let n=cu.get(e);n||(n=new WeakSet,cu.set(e,n)),n.add(t)}function uu(e){return(e.flags&32)==32}var du=()=>null;function fu(e,t,n=!1){return du(e,t,n)}function pu(e,t){let n=e.contentQueries;if(n!==null){let r=nn(null);try{for(let r=0;r|^->||--!>|)/g,Yee=`​$1​`;function Xee(e){return e.replace(qee,e=>e.replace(Jee,Yee))}function Zee(e,t){return e.createText(t)}function Qee(e,t,n){e.setValue(t,n)}function $ee(e,t){return e.createComment(Xee(t))}function Cu(e,t,n){return e.createElement(t,n)}function wu(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Tu(e,t,n){e.appendChild(t,n)}function Eu(e,t,n,r,i){r===null?Tu(e,t,n):wu(e,t,n,r,i)}function Du(e,t,n,r){e.removeChild(null,t,n,r)}function ete(e,t,n){e.setAttribute(t,`style`,n)}function tte(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&&tl(e,t,r),i!==null&&tte(e,t,i),a!==null&&ete(e,t,a)}function ku(e){let t=nte();return t?t.sanitize(yo.URL,e)||``:yu(e,`URL`)?vu(e):Su(qi(e))}function nte(){let e=Ko();return e&&e[10].sanitizer}function Au(e){return e.ownerDocument.defaultView}function ju(e){return e.ownerDocument}function rte(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 Mu=`ng-template`;function ite(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(Pu(r))return!1;o=!0}}}}}return Pu(r)||o}function Pu(e){return!(e&1)}function ste(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!==``&&!Pu(o)&&(t+=Iu(a,i),i=``),r=o,a||=!Pu(r);n++}return i!==``&&(t+=Iu(a,i)),t}function pte(e){return e.map(fte).join(`,`)}function mte(e){let t=[],n=[],r=1,i=2;for(;r!1});function Bu(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function Vu(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function _te(e){let t=Vu(e,`transition-property`),n=Vu(e,`transition-duration`),r=Vu(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 vte(e){let t=Vu(e,`animation-name`),n=Vu(e,`animation-delay`),r=Vu(e,`animation-duration`),i=Vu(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 Hu(e,t){return e!==void 0&&e.duration>t.duration}function Uu(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function Wu(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 yte(e,t){let n=getComputedStyle(e),r=vte(n),i=_te(n),a=r.duration>i.duration?r:i;Hu(t.get(e),a)||Uu(a)&&t.set(e,a)}function bte(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?yte(e,t):xte(e,t,r)}function xte(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=Wu(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}Hu(t.get(e),r)||Uu(r)&&t.set(e,r)}var Gu=new Set,Ste=!1,Cte=1,Ku=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function wte(e){return e[9].get(gte,Ste)}function Tte(e,t,n){let r=Ju.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else Ju.set(e,{classList:t,cleanupFns:n})}function qu(e){let t=Ju.get(e);if(t){for(let e of t.cleanupFns)e();Ju.delete(e)}Yu.delete(e)}var Ju=new WeakMap,Yu=new WeakMap,Xu=new WeakMap;function Zu(e){return e?e[14]??e:null}var Qu=new WeakSet;function Ete(e,t,n){let r=Xu.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=Zu(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),Qu.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 Dte(e,t,n){let r=Zu(n),i=Xu.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):Xu.set(e,[{el:t,declarationView:r}])}function $u(e){let t=e[26]??={};return t.enter??=new Map}function Ote(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 ed(e){return e.composedPath?e.composedPath()[0]:e.target}function td(e,t){let n=Yu.get(t);if(n===void 0)return!0;if(t!==ed(e))return!1;let r=e.animation;if(r){let e=Wu(r);if(e!==void 0&&e+Cte{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),sd=[0,1,2,3],cd=(()=>{class e{ngZone=C(Hs);scheduler=C(dc);errorHandler=C(ec,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){C(rd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Hc(kc.AfterRenderHooksStart),this.executing=!0;for(let e of sd)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&&Hc(kc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),Po(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(nd.AFTER_NEXT_RENDER,e):e()}static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>new e})}return e})(),ld=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 ud(e,t){let n=t?.injector??C(Os);return ad(`NgAfterNextRender`),jte(e,n,t,!0)}function Ate(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function jte(e,t,n,r){let i=t.get(od);i.impl??=t.get(cd);let a=t.get(rd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(As),s=t.get(lc,null,{optional:!0}),c=new ld(i.impl,Ate(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var dd=new Fi(``,{factory:()=>{let e=C(Ya),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function fd(e,t,n){let r=e.get(dd);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 Mte(e,t){let n=e.get(dd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Nte(e,t){let n=e.get(dd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Pte(e){let t=e.get(dd);t.isScheduled||=(ud(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Fte(e){let t=e.get(dd);t.scheduler=Pte,t.scheduler(e)}function pd(e,t){for(let[n,r]of t)fd(e,r.animateFns)}function md(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&pd(r,i)}function hd(e,t,n,r){try{n.get(Aa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Mte(n,i.enter.get(t.index).animateFns);let a=gd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];vd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&Gu.add(e[19]),fd(n,()=>_d(e,t,i||void 0,a,r),i||void 0)}function gd(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 _d(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&&vd(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),bd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&Gu.delete(e[19]),i(!0)})}else e&&Gu.delete(e[19]),i(!1)}function vd(e,t,n){if(t.type&12){let r=e[t.index];if(fo(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,Gu.delete(e[19])),n(!0)})}function xd(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;fo(i)?c=i:uo(i)&&(l=!0,i=i[0]);let u=xo(i);e===0&&r!==null?(md(s,r,a,n),o==null?Tu(t,r,u):wu(t,r,u,o||null,!0)):e===1&&r!==null?(md(s,r,a,n),wu(t,r,u,o||null,!0),Ete(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Dte(a,u,s),Qu.delete(u),hd(s,a,n,e=>{if(Qu.has(u)){Qu.delete(u);return}Du(t,u,l,e)})):e===3&&(Qu.delete(u),hd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Gd(t,e,n,c,a,r,o)}}function Sd(e,t){wd(e,t),t[0]=null,t[5]=null}function Cd(e,t,n,r,i,a){r[0]=i,r[5]=t,Vd(e,r,n,1,i,a)}function wd(e,t){t[10].changeDetectionScheduler?.notify(9),Vd(e,t,t[11],2,null,null)}function Td(e){let t=e[12];if(!t)return Od(e[1],e);for(;t;){let n=null;if(uo(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)uo(t)&&Od(t[1],t),t=t[3];t===null&&(t=e),uo(t)&&Od(t[1],t),n=t&&t[4]}t=n}}function Ed(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function Dd(e,t){if(vo(t))return;let n=t[11];n.destroyNode&&Vd(e,t,n,3,null,null),Td(t)}function Od(e,t){if(vo(t))return;let n=nn(null);try{t[2]&=-129,t[2]|=256,t[24]&&vn(t[24]),Ad(e,t),kd(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&fo(t[3])){n!==t[3]&&Ed(n,t);let r=t[18];r!==null&&r.detachView(e)}Zl(t)}finally{nn(n)}}function kd(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&&tf(e,t,27,!1),Hc(o?kc.TemplateUpdateStart:kc.TemplateCreateStart,i,n),n(r,i)}finally{vs(a),Hc(o?kc.TemplateUpdateEnd:kc.TemplateCreateEnd,i,n)}}function of(e,t,n){pf(e,t,n),(n.flags&64)==64&&mf(e,t,n)}function sf(e,t,n=Co){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a=s&&i<=c){let o=t.data[i],s=r[e+1];rf(o,n[i],s,a),l=!0}else if(i>c)break}}return o!==null&&Object.hasOwn(r.inputs,i)&&(rf(r,n[o],i,a),l=!0),l}function Tf(e,t){let n=Do(t,e),r=n[1];Ef(r,n);let i=n[0];i!==null&&n[6]===null&&(n[6]=fu(i,n[9])),Hc(kc.ComponentStart);try{Df(r,n,n[8])}finally{Hc(kc.ComponentEnd,n[8])}}function Ef(e,t){for(let n=t.length;n{Po(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function zf(e){let t=e[24]??Object.create(Bf);return t.lView=e,t}var Bf={...an,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=Io(e.lView);for(;t&&!Vf(t[1]);)t=Io(t);t&&jo(t)},consumerOnSignalRead(){this.lView[24]=this}};function Vf(e){return e.type!==2}function Hf(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 Uf=100;function Wf(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{Gf(e,t)}finally{n.end?.()}}function Gf(e,t){let n=es();try{ts(!0),Zf(e,t);let n=0;for(;Mo(e);){if(n===Uf)throw new _i(103,!1);n++,Zf(e,1)}}finally{ts(n)}}function Kf(e,t,n,r){if(vo(t))return;let i=t[2];us(t);let a=!0,o=null,s=null;Vf(e)?(s=Ff(t),o=pn(s)):rn()===null?(a=!1,s=zf(t),o=pn(s)):t[24]&&=(vn(t[24]),null);try{Ao(t),Vee(e.bindingStartIndex),n!==null&&af(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Gc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&Kc(t,n,0,null),qc(t,0)}if(Jf(t),Hf(t),qf(t,0),e.contentQueries!==null&&pu(e,t),a){let n=e.contentCheckHooks;n!==null&&Gc(t,n)}else{let n=e.contentHooks;n!==null&&Kc(t,n,1),qc(t,1)}$f(e,t);let o=e.components;o!==null&&Qf(t,o,0);let s=e.viewQuery;if(s!==null&&mu(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Gc(t,n)}else{let n=e.viewHooks;n!==null&&Kc(t,n,2),qc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}Nf(t),t[2]&=-73}catch(e){throw Po(t),e}finally{s!==null&&(hn(s,o),a&&Lf(s)),hs()}}function qf(e,t){for(let n=eu(e);n!==null;n=tu(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ba(e,10+t);Sd(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 op(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(ap(e,n),ba(t,n))}this._attachedToViewContainer=!1}Dd(this._lView[1],this._lView)}onDestroy(e){Fo(this._lView,e)}markForCheck(){ep(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){No(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,Wf(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new _i(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=_o(this._lView),t=this._lView[16];t!==null&&!e&&Ed(t,this._lView),wd(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new _i(902,!1);this._appRef=e;let t=_o(this._lView),n=this._lView[16];n!==null&&!t&&sp(n,this._lView),No(this._lView)}},lp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=up;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 cp(kf(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function up(){return dp(Jo(),Ko())}function dp(e,t){return e.type&4?new lp(t,e,Bl(e,t)):null}function fp(e,t,n,r,i){let a=e.data[t];if(a===null)a=pp(e,t,n,r,i),Hee()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Bee();a.injectorIndex=e===null?-1:e.injectorIndex}return Xo(a,!0),a}function pp(e,t,n,r,i){let a=Yo(),o=Zo(),s=o?a:a&&a.parent,c=e.data[t]=hp(e,s,n,t,r,i);return mp(e,c,a,o),c}function mp(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 hp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return Uo()&&(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:Ss(),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 gp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?_p(e,n):r.push(e);e[6]=r}function _p(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,yp=()=>null;function bp(e,t){return vp(e,t)}function xp(e,t,n){return yp(e,t,n)}var Sp=class{},Cp=class{},wp=class{destroyNode=null;static __NG_ELEMENT_ID__=()=>Tp()};function Tp(){let e=Ko(),t=Do(Jo().index,e);return(uo(t)?t:e)[11]}var Ep=(()=>{class e{static ɵprov=Oi({token:e,providedIn:`root`,factory:()=>null})}return e})();function Dp(e){return e.debugInfo?.className||e.type.name||null}var Op={},kp=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,Op,n);return r!==Op||t===Op?r:this.parentInjector.get(e,t,n)}};function Ap(e,t,n){return e[t]=n}function jp(e,t){return e[t]}function Mp(e,t,n){if(n===Lu)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function Np(e,t,n,r){let i=Mp(e,t,n);return Mp(e,t+1,r)||i}function Pp(e,t,n,r,i){let a=Np(e,t,n,r);return Mp(e,t+2,i)||a}function Fp(e,t,n,r,i,a){let o=Np(e,t,n,r);return Np(e,t+2,i,a)||o}function Ip(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&lu(i,a),ep(mo(e)?Do(e.index,t):t,5);let o=t[8],s=Lp(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=Lp(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function Lp(e,t,n,r){let i=nn(null);try{return Hc(kc.OutputStart,t,n),n(r)!==!1}catch(t){return Sf(e,t),!1}finally{Hc(kc.OutputEnd,t,n),nn(i)}}function Rp(e,t,n,r,i,a,o,s){let c=ho(e),l=!1,u=null;if(!r&&c&&(u=Bp(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=Co(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);zp(a)||Vp(r?t=>r(xo(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function zp(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function Bp(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 Vp(e,t,n,r,i,a,o){let s=t.firstCreatePass?Ro(t):null,c=Lo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function Hp(e,t,n,r,i){let a=null,o=null,s=null,c=!1,l=e.directiveToIndex.get(n.type);if(typeof l==`number`?a=l:[a,o,s]=l,o!==null&&s!==null&&e.hostDirectiveOutputs&&Object.hasOwn(e.hostDirectiveOutputs,r)){let n=e.hostDirectiveOutputs[r];for(let a=0;a=o&&l<=s)c=!0,Up(e,t,l,n[a+1],r,i);else if(l>s)break}}return Object.hasOwn(n.outputs,r)&&(c=!0,Up(e,t,a,r,r,i)),c}function Up(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);Vp(e.index,s,t,i,a,c,!0)}function Wp(){Gp()}function Gp(){let e=Ko(),t=qo(),n=Jo();if(t.firstCreatePass&&Zp(t,n),n.controlDirectiveIndex===-1)return;ad(`NgSignalForms`);let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new Jp(e,t,n))}function Kp(){qp()}function qp(){let e=Ko(),t=qo(),n=ys();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,i=e[n.controlDirectiveIndex];r.update(i,new Jp(e,t,n))}var Jp=class{lView;tView;tNode;hasPassThrough;constructor(e,t,n){this.lView=e,this.tView=t,this.tNode=n,this.hasPassThrough=!!(n.flags&4096)}get customControl(){return this.tNode.customControlIndex===-1?void 0:this.lView[this.tNode.customControlIndex]}get nativeElement(){return Co(this.tNode,this.lView)}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(e,t){let n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,e,Ip(this.tNode,this.lView,t))}listenToCustomControlModel(e){let t=this.tNode.flags&1024?`valueChange`:`checkedChange`,n=this.tView.data[this.tNode.customControlIndex];Hp(this.tNode,this.lView,n,t,Ip(this.tNode,this.lView,e))}listenToDom(e,t){Rp(this.tNode,this.tView,this.lView,void 0,this.lView[11],e,t,Ip(this.tNode,this.lView,t))}setInputOnDirectives(e,t,n){let r=this.tNode.inputs?.[e],i=this.tNode.hostDirectiveInputs?.[e];if(!r&&!i)return!1;let a=!1;if(r)for(let i of r){if(i===this.tNode.controlDirectiveIndex)continue;let r=this.lView[i],o=this.tView.data[i];(!n||n(Xp(r,o,e)))&&(rf(o,r,e,t),a=!0)}if(i)for(let r=0;r0;){let e=n.shift();if(typeof e!=`function`){for(let n in e.inputs)t[e.inputs[n]]=!0;let r=Yp(e.directive);r!==null&&n.push(...r);continue}for(let r of e()){if(typeof r==`function`)continue;if(r.inputs)for(let e=0;e1){t.flags|=4096;return}Qp(e,t)}function Qp(e,t){for(let n=t.directiveStart;n{let r=t.hostDirectiveInputs[e],i=t.hostDirectiveOutputs[e+`Change`];if(!r||!i)return!1;for(let e=0;e=i&&a<=o)return t.flags|=n,t.customControlIndex=r,!0}}return!1};if(e(`value`,1024)||e(`checked`,2048))return}}function $p(e,t){return em(e,t)&&tm(e,t+`Change`)}function em(e,t){return t in e.inputs}function tm(e,t){return t in e.outputs}var nm=Symbol(`BINDING`),rm=new Fi(``);function im(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 vm(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&nf.SignalBased)!==0};return i&&(a.transform=i),a})}function Em(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Dm(e,t,n){let r=t instanceof Ya?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new kp(n,r):n}function Om(e){let t=e.get(Cp,null);if(t===null)throw new _i(407,!1);return{rendererFactory:t,sanitizer:e.get(Ep,null),changeDetectionScheduler:e.get(dc,null),ngReflect:!1,tracingService:e.get(rd,null,{optional:!0})}}function km(e,t,n){let r=jm(e);return Cu(t,r,r===`svg`?`svg`:r===`math`?bo:n)}function Am(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new _i(905,!1)}function jm(e){return(e.selectors[0][0]||`div`).toLowerCase()}var Mm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Tm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Em(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=pte(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Hc(kc.DynamicComponentStart);let s=nn(null);try{let s=this.componentDef,c=Dm(s,r||this.ngModule,e),l=Om(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(Dp(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{nn(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Nm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?cf(l,r,s.encapsulation,t):km(s,l,o??null);Am(u);let d=t.get(rm,null),f=Pm(u,()=>t.get(ks,null)??au());d&&d.addHost(f);let p=a?.some(Im)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Im)),m=Xd(null,c,null,512|Qd(s),null,null,e,l,t,null,fu(u,t,!0));d&&Cm&&f instanceof ShadowRoot&&Fo(m,()=>{d.removeHost(f)}),m[27]=u,us(m);let h=null;try{let e=bm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),$l(u,m),of(c,m,e),hu(c,e,m),xm(c,e),n!==void 0&&Rm(e,this.ngContentSelectors,n),h=Do(e.index,m),m[8]=h[8],Df(c,m,null)}catch(e){throw h!==null&&Zl(h),Zl(m),e}finally{Hc(kc.DynamicComponentEnd),hs()}return new Lm(this.componentType,m,!!p)}};function Nm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:mte(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[nm].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 Im(e){let t=e[nm].kind;return t===`input`||t===`twoWay`}var Lm=class extends Sp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=wo(t[1],27),this.location=Bl(this._tNode,t),this.instance=Do(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new cp(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;Cf(n,r[1],r,e,t),this.previousInputValues.set(e,t),ep(Do(n.index,r),1)}get injector(){return new Ml(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function Rm(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=Bm}return e})();function Bm(){return Wm(Jo(),Ko())}var Vm=class e extends zm{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return Bl(this._hostTNode,this._hostLView)}get injector(){return new Ml(this._hostTNode,this._hostLView)}get parentInjector(){let e=bl(this._hostTNode,this._hostLView);if(ol(e)){let t=ll(e,this._hostLView),n=sl(e),r=t[1].data[n+8];return new Ml(r,t)}return new Ml(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=Hm(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=bp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,Af(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 Mm(Ui(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Ya,null);e&&(i=e)}let d=Ui(l.componentType??{}),f=bp(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,Af(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(Pee(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 rp(o,i,a,r),t.attachToViewContainerRef(),ya(Um(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=Hm(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);n&&(ba(Um(this._lContainer),t),Dd(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=ap(this._lContainer,t);return n&&ba(Um(this._lContainer),t)!=null?new cp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function Hm(e){return e[8]}function Um(e){return e[8]||=[]}function Wm(e,t){let n,r=t[e.index];return fo(r)?n=r:(n=tp(r,t,null,e),t[e.index]=n,ef(t,n)),Km(n,t,e,r),new Vm(n,e,t)}function Gm(e,t){let n=e[11],r=n.createComment(``),i=Co(t,e);return wu(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var Km=Ym,qm=()=>!1;function Jm(e,t,n){return qm(e,t,n)}function Ym(e,t,n,r){if(e[7])return;let i;i=n.type&8?xo(r):Gm(t,n),e[7]=i}var Xm=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Zm=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 dh(e,t,n){e.queries===null&&(e.queries=new $m),e.queries.track(new eh(t,n))}function fh(e,t){return e.queries.getByIndex(t)}function ph(e,t){let n=e[1],r=fh(n,t);return r.crossesNgTemplate?oh(n,e,t,[]):ah(n,e,r,t)}function mh(e,t,n){let r,i=wn(()=>{r._dirtyCounter();let n=vh(r,e);if(t&&n===void 0)throw new _i(-951,!1);return n});return r=i[tn],r._dirtyCounter=D(0),r._flatValue=void 0,i}function hh(e){return mh(!0,!1,e)}function gh(e){return mh(!0,!0,e)}function _h(e,t){let n=e[tn];n._lView=Ko(),n._queryIndex=t,n._queryList=sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function vh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:Oa;let i=sh(n,r),a=ph(n,r);return i.reset(a,Hl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function yh(e){return!!e&&typeof e.then==`function`}function bh(e){return!!e&&typeof e.subscribe==`function`}var xh=class{},Sh=class extends xh{injector;instance=null;constructor(e){super();let t=new Xa([...e.providers,{provide:xh,useValue:this}],e.parent||Ja(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Ch(e,t,n=null){return new Sh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var wh=(()=>{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=Pa(!1,e.type),n=t.length>0?Ch([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=Oi({token:e,providedIn:`environment`,factory:()=>new e(ua(Ya))})}return e})();function k(e){return Oc(()=>{let t=Ah(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Kl.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(wh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||gu.Emulated,styles:e.styles||Oa,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&ad(`NgStandalone`),jh(n);let r=e.dependencies;return n.directiveDefs=Mh(r,Th),n.pipeDefs=Mh(r,Gi),n.id=Nh(n),n})}function Th(e){return Ui(e)||Wi(e)}function Eh(e,t){if(e==null)return Da;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=nf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Dh(e){if(e==null)return Da;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Oh(e){return Oc(()=>{let t=Ah(e);return jh(t),t})}function kh(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 Ah(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||Da,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Oa,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Eh(e.inputs,t),outputs:Dh(e.outputs),debugInfo:null}}function jh(e){e.features?.forEach(t=>t(e))}function Mh(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 Nh(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 Ph=new Fi(``),Fh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=C(Ph,{optional:!0})??[];injector=C(Os);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=so(this.injector,t);if(yh(n))e.push(n);else if(bh(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=Rl({token:e,factory:e.ɵfac})}return e})();function Ih(e){return t=>{t.controlDef={create:(e,t)=>{e?.ɵngControlCreate(t)},update:(e,t)=>{e?.ɵngControlUpdate?.(t)},passThroughInput:e}}}function Lh(e){return Object.getPrototypeOf(e.prototype).constructor}function Rh(e){let t=Lh(e.type),n=!0,r=[e];for(;t&&t!==Function.prototype&&t!==Object.prototype;){let i,a=Object.hasOwn(t,Li)?t[Li]:void 0,o=Object.hasOwn(t,Ri)?t[Ri]:void 0;if(go(e))i=a??o;else{if(a)throw new _i(903,!1);i=o}if(i){if(n){r.push(i);let t=e;t.inputs=Vh(e.inputs),t.declaredInputs=Vh(e.declaredInputs),t.outputs=Vh(e.outputs);let n=i.hostBindings;n&&Wh(e,n);let a=i.viewQuery,o=i.contentQueries;if(a&&Hh(e,a),o&&Uh(e,o),zh(e,i),xi(e.outputs,i.outputs),go(i)&&i.data.animation){let t=e.data;t.animation=(t.animation||[]).concat(i.data.animation)}}let t=i.features;if(t)for(let r=0;r=0;r--){let i=e[r];i.hostVars=t+=i.hostVars,i.hostAttrs=il(i.hostAttrs,n=il(n,i.hostAttrs))}}function Vh(e){return e===Da?{}:e===Oa?[]:e}function Hh(e,t){let n=e.viewQuery;e.viewQuery=n?(e,r)=>{t(e,r),n(e,r)}:t}function Uh(e,t){let n=e.contentQueries;e.contentQueries=n?(e,r,i)=>{t(e,r,i),n(e,r,i)}:t}function Wh(e,t){let n=e.hostBindings;e.hostBindings=n?(e,r)=>{t(e,r),n(e,r)}:t}function Gh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=il(e.mergedAttrs,e.attrs);let t=e.tView=qd(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),Xo(e,!1);let c=Yh(n,t,e,r);ws()&&Id(n,t,c,e),$l(c,t);let l=tp(c,t,c,e);t[r+27]=l,ef(t,l),Jm(l,e,t)}function Kh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=fp(t,d,4,o||null,s||null),Ho()&&om(t,e,f,ko(t.consts,l),gf),Wc(t,f)):f=t.data[d],Gh(f,e,t,n,r,i,a,c),ho(f)&&of(t,e,f),l!=null&&sf(e,f,u),f}function qh(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=fp(t,d,4,o||null,s||null),l!=null){let e=ko(t.consts,l);f.localNames=[];for(let t=0;t{throw new _i(600,``)})}var eg=10,tg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=C(tc);afterRenderManager=C(od);zonelessEnabled=C(fc);rootEffectScheduler=C(mc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Jr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=C(Ps);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(hi(e=>!e))}constructor(){C(rd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=C(Ya);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=Os.NULL){return this._injector.get(Hs).run(()=>{if(Hc(kc.BootstrapComponentStart),!this._injector.get(Fh).done)throw new _i(405,``);let r=Ui(e),i=this._injector.get(xh),a=new Mm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=ng(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(Zh,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),rg(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Hc(kc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Hc(kc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(nd.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Hc(kc.ChangeDetectionEnd),new _i(101,!1);let e=nn(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,nn(e),this.afterTick.next(),Hc(kc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(Cp,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++Mo(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;rg(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(Qh,[]).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),()=>rg(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new _i(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=Rl({token:e,factory:e.ɵfac})}return e})();function ng(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function rg(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function A(e,t,n,r){let i=Ko();return Mp(i,is(),t)&&(qo(),_f(ys(),i,e,t,n,r)),A}function ig(e){if(ad(`NgAnimateEnter`),!Ku)return ig;let t=Ko();if(wte(t))return ig;let n=Jo(),r=t[9].get(Hs);return kte($u(t),n,()=>ag(t,n,e,r)),Fte(t[9]),pd(t[9],$u(t)),ig}function ag(e,t,n,r){let i=Co(t,e),a=e[11],o=Ote(n),s=[],c=!1,l=e=>{if(ed(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{ed(e)===i&&(td(e,i)&&(c=!0),og(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),Tte(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(bte(i,Yu,Ku),!Yu.has(i))){for(let e of o)a.removeClass(i,e);qu(i)}})})}}function og(e,t,n){let r=Ju.get(t);if(ed(e)===t&&r&&td(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);qu(t)}}var sg=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 cg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function lg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){nn(r);let c=t.length-1;for(nn(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=cg(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=cg(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 pg,a??=fg(e,o,s,n),ug(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;)dg(e,i,n,o,t[o]),o++}else if(t!=null){nn(r);let c=t[Symbol.iterator]();nn(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=cg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new pg,a??=fg(e,o,s,n);let u=n(o,r);if(ug(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;)dg(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 ug(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function dg(e,t,n,r,i){if(ug(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function fg(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 pg=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 j(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),256,o,s),mg}function mg(e,t,n,r,i,a,o,s){ad(`NgControlFlow`);let c=Ko(),l=qo();return qh(c,l,e,t,n,r,i,ko(l.consts,a),512,o,s),mg}function M(e,t){ad(`NgControlFlow`);let n=Ko(),r=is(),i=n[r]===Lu?-1:n[r],a=i===-1?void 0:bg(n,27+i);if(Mp(n,r,e)){let r=nn(null);try{if(a!==void 0&&ip(a,0),e!==-1){let r=27+e,i=bg(n,r),a=Tg(n[1],r),o=xp(i,a,n);rp(i,kf(n,a,t,{dehydratedView:o}),0,Af(a,o))}}finally{nn(r)}}else if(a!==void 0){let e=np(a,0);e!==void 0&&(e[8]=t)}}var hg=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 gg(e){return e}function _g(e,t){return t}var vg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function N(e,t,n,r,i,a,o,s,c,l,u,d,f){ad(`NgControlFlow`);let p=Ko(),m=qo(),h=c!==void 0,g=Ko(),_=new vg(h,s?o.bind(g[15][8]):o);g[27+e]=_,qh(p,m,e+1,t,n,r,i,ko(m.consts,a),256),h&&qh(p,m,e+2,c,l,u,d,ko(m.consts,f),512)}var yg=class extends sg{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,rp(this.lContainer,t,e,Af(this.templateTNode,n)),xg(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,Sg(this.lContainer,e),Cg(this.lContainer,e)}create(e,t){let n=bp(this.lContainer,this.templateTNode.tView.ssrId);return kf(this.hostLView,this.templateTNode,new hg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){Dd(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];Nte(e,r),Gu.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function Sg(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 Cg(e,t){return ap(e,t)}function wg(e,t){return np(e,t)}function Tg(e,t){return wo(e,t)}function F(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),F}function Eg(e,t,n,r,i){Cf(t,e,n,i?`class`:`style`,r)}function I(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?bm(o,i,2,t,gf,Ho(),n,r):a.data[o];if(mo(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(Dp(o),()=>(Dg(e,t,i,s,r),I))}}return Dg(e,t,i,s,r),I}function Dg(e,t,n,r,i){if(bf(r,n,e,t,kg),ho(r)){let e=n[1];of(e,n,r),hu(e,r,n)}i!=null&&sf(n,r)}function L(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),Wo(t)&&Go(),Vo(),t.classesWithoutHost!=null&&$c(t)&&Eg(e,t,Ko(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&el(t)&&Eg(e,t,Ko(),t.stylesWithoutHost,!1),L}function R(e,t,n,r){return I(e,t,n,r),L(),R}function z(e,t,n,r){let i=Ko(),a=i[1],o=e+27,s=a.firstCreatePass?Sm(o,a,2,t,n,r):a.data[o];return bf(s,i,e,t,kg),r!=null&&sf(i,s),z}function B(){return Wo(xf(Jo()))&&Go(),Vo(),B}function Og(e,t,n,r){return z(e,t,n,r),B(),Og}var kg=(e,t,n,r,i)=>(Ts(!0),Cu(t[11],r,Ss()));function Ag(e,t,n){let r=Ko(),i=r[1],a=e+27,o=i.firstCreatePass?bm(a,r,8,`ng-container`,gf,Ho(),t,n):i.data[a];if(bf(o,r,e,`ng-container`,Ng),ho(o)){let e=r[1];of(e,r,o),hu(e,o,r)}return n!=null&&sf(r,o),Ag}function jg(){let e=qo(),t=xf(Jo());return e.firstCreatePass&&xm(e,t),jg}function Mg(e,t,n){return Ag(e,t,n),jg(),Mg}var Ng=(e,t,n,r,i)=>(Ts(!0),$ee(t[11],``));function V(){return Ko()}function Pg(e,t,n){let r=Ko();return Mp(r,is(),t)&&(qo(),df(ys(),r,e,t,r[11],n)),Pg}var Fg=void 0;function Ig(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Lg=[`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`]],Fg,[[`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`]],Fg,[[`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}`,Fg,Fg,Fg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ig],Rg=Object.create(null);function zg(e){let t=Hg(e),n=Bg(t);if(n)return n;let r=t.split(`-`)[0];if(n=Bg(r),n)return n;if(r===`en`)return Lg;throw new _i(701,!1)}function Bg(e){if(!(e in Rg)){let t=aa.ng&&aa.ng.common&&aa.ng.common.locales&&aa.ng.common.locales[e];return t!==void 0&&(Rg[e]=t),t}return Rg[e]}var Vg={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 Hg(e){return e.toLowerCase().replace(/_/g,`-`)}var Ug=`en-US`;function Wg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function H(e,t,n){let r=Ko(),i=qo(),a=Jo();return Gg(i,r,r[11],a,e,t,n),H}function U(e,t,n){let r=Ko(),i=qo(),a=Jo();return(a.type&3||n)&&Rp(a,i,r,n,r[11],e,t,Ip(a,r,t)),U}function Gg(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=Ip(r,t,a),Rp(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 t_(e){return(e&2)==2}function n_(e,t){return e&131071|t<<17}function r_(e){return e|2}function i_(e){return(e&131068)>>2}function a_(e,t){return e&-131069|t<<2}function o_(e){return(e&1)==1}function s_(e){return e|1}function c_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=e_(o),c=i_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||Ta(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=e_(e[s+1]);e[r+1]=$g(t,s),t!==0&&(e[t+1]=a_(e[t+1],r)),e[s+1]=n_(e[s+1],r)}else e[r+1]=$g(s,0),s!==0&&(e[s+1]=a_(e[s+1],r)),s=r}else e[r+1]=$g(c,0),s===0?s=r:e[c+1]=a_(e[c+1],r),c=r;l&&(e[r+1]=r_(e[r+1])),u_(e,u,r,!0),u_(e,u,r,!1),l_(t,u,e,r,a),o=$g(s,c),a?t.classBindings=o:t.styleBindings=o}function l_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&Ta(a,t)>=0&&(n[r+1]=s_(n[r+1]))}function u_(e,t,n,r){let i=e[n+1],a=t===null,o=r?e_(i):i_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];d_(n,t)&&(s=!0,e[o+1]=r?s_(i):r_(i)),o=r?e_(i):i_(i)}s&&(e[n+1]=r?r_(i):s_(i))}function d_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?Ta(e,t)>=0:!1}var f_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function p_(e){return e.substring(f_.key,f_.keyEnd)}function m_(e){return g_(e),h_(e,__(e,0,f_.textEnd))}function h_(e,t){let n=f_.textEnd;return n===t?-1:(t=f_.keyEnd=v_(e,f_.key=t,n),__(e,t,n))}function g_(e){f_.key=0,f_.keyEnd=0,f_.value=0,f_.valueEnd=0,f_.textEnd=e.length}function __(e,t,n){for(;t32;)t++;return t}function y_(e,t,n){return S_(e,t,n,!1),y_}function G(e,t){return S_(e,t,null,!0),G}function b_(e){C_(Lte,x_,e,!0)}function x_(e,t){for(let n=m_(t);n>=0;n=h_(t,n))Ca(e,p_(t),!0)}function S_(e,t,n,r){let i=Ko(),a=qo(),o=as(2);if(a.firstUpdatePass&&T_(a,e,o,r),t!==Lu&&Mp(i,o,t)){let s=a.data[_s()];M_(a,s,i,i[11],e,i[o+1]=zte(t,n),r,o)}}function C_(e,t,n,r){let i=qo(),a=as(2);i.firstUpdatePass&&T_(i,null,a,r);let o=Ko();if(n!==Lu&&Mp(o,a,n)){let s=i.data[_s()];if(F_(s,r)&&!w_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=Ci(e,n||``)),Eg(i,s,o,n,r)}else Rte(i,s,o,o[11],o[a+1],o[a+1]=Ite(e,t,n),r,a)}}function w_(e,t){return t>=e.expandoStartIndex}function T_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[_s()],o=w_(e,n);F_(a,r)&&t===null&&!o&&(t=!1),t=E_(i,a,t,r),c_(i,a,t,n,o,r)}}function E_(e,t,n,r){let i=Gee(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=A_(null,e,t,n,r),n=j_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=A_(i,e,t,n,r),a===null){let n=D_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=A_(null,e,t,n[1],r),n=j_(n,t.attrs,r),O_(e,t,r,n))}else a=k_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function D_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(i_(r)!==0)return e[e_(r)]}function O_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[e_(i)]=r}function k_(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===Lu&&(u=l?Oa:void 0);let d=l?wa(u,r):c===r?u:void 0;if(a&&!P_(d)&&(d=wa(t,r)),P_(d)&&(s=d,o))return s;let f=e[i+1];i=o?e_(f):i_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=wa(e,r))}return s}function P_(e){return e!==void 0}function zte(e,t){return e==null||e===``||(typeof t==`string`?e=vu(e)+t:typeof e==`object`&&(e=Si(vu(e)))),e}function F_(e,t){return!!(e.flags&(t?8:16))}function K(e,t=``){let n=Ko(),r=qo(),i=e+27,a=r.firstCreatePass?fp(r,i,1,t,null):r.data[i],o=Bte(r,n,a,t);n[i]=o,ws()&&Id(r,n,o,a),Xo(a,!1)}var Bte=(e,t,n,r)=>(Ts(!0),Zee(t[11],r));function I_(e,t,n,r=``){return Mp(e,is(),n)?t+qi(n)+r:Lu}function Vte(e,t,n,r,i,a=``){let o=Np(e,rs(),n,i);return as(2),o?t+qi(n)+r+qi(i)+a:Lu}function Hte(e,t,n,r,i,a,o,s=``){let c=Pp(e,rs(),n,i,o);return as(3),c?t+qi(n)+r+qi(i)+a+qi(o)+s:Lu}function Ute(e,t,n,r,i,a,o,s,c,l=``){let u=Fp(e,rs(),n,i,o,c);return as(4),u?t+qi(n)+r+qi(i)+a+qi(o)+s+qi(c)+l:Lu}function q(e){return J(``,e),q}function J(e,t,n){let r=Ko(),i=I_(r,e,t,n);return i!==Lu&&z_(r,_s(),i),J}function Y(e,t,n,r,i){let a=Ko(),o=Vte(a,e,t,n,r,i);return o!==Lu&&z_(a,_s(),o),Y}function L_(e,t,n,r,i,a,o){let s=Ko(),c=Hte(s,e,t,n,r,i,a,o);return c!==Lu&&z_(s,_s(),c),L_}function R_(e,t,n,r,i,a,o,s,c){let l=Ko(),u=Ute(l,e,t,n,r,i,a,o,s,c);return u!==Lu&&z_(l,_s(),u),R_}function z_(e,t,n){let r=So(t,e);Qee(e[11],r,n)}function B_(e,t,n){Tc(t)&&(t=t());let r=Ko();return Mp(r,is(),t)&&(qo(),uf(ys(),r,e,t,r[11],n)),B_}function V_(e,t){let n=Tc(e);return n&&e.set(t),n}function H_(e,t){let n=Ko(),r=qo(),i=Jo();return Gg(r,n,n[11],i,e,t),H_}var U_={};function W_(e){ad(`NgLet`);let t=qo(),n=Ko(),r=e+27;return Xo(fp(t,r,128,null,null),!1),Eo(t,n,r,U_),W_}function G_(e){return Eo(qo(),Ko(),_s(),e),e}function K_(e){let t=To($o(),27+e);if(t===U_)throw new _i(314,!1);return t}function q_(e,t,n=``){return I_(Ko(),e,t,n)}function J_(e,t,n){let r=qo();r.firstCreatePass&&Y_(t,r.data,r.blueprint,go(e),n)}function Y_(e,t,n,r,i){if(e=Ei(e),Array.isArray(e))for(let a=0;a>20;if(Ha(e)||!e.multi){let r=new Qc(l,i,am,null),p=Q_(c,t,i?u:u+f,d);p===-1?(xl(_l(s,o),a,c),X_(a,e,t.length),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(r),o.push(r)):(n[p]=r,o[p]=r)}else{let p=Q_(c,t,u+f,d),m=Q_(c,t,u,u+f),h=p>=0&&n[p],g=m>=0&&n[m];if(i&&!g||!i&&!h){xl(_l(s,o),a,c);let u=Kte(i?Gte:Wte,n.length,i,r,l,e);!i&&g&&(n[m].providerFactory=u),X_(a,e,t.length,0),t.push(c),s.directiveStart++,s.directiveEnd++,i&&(s.providerIndexes+=1048576),n.push(u),o.push(u)}else{let t=Z_(n[i?m:p],l,!i&&r);X_(a,e,p>-1?p:m,t)}!i&&r&&g&&n[m].componentProviders++}}}function X_(e,t,n,r){let i=Ha(t),a=Ua(t);if(i||a){let o=(a?Ei(t.useClass):t).prototype.ngOnDestroy;if(o){let a=e.destroyHooks||=[];if(!i&&t.multi){let e=a.indexOf(n);e===-1?a.push(n,[r,o]):a[e+1].push(r,o)}else a.push(n,o)}}}function Z_(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Q_(e,t,n,r){for(let i=n;i{n.providersResolver=(t,n)=>J_(t,n?n(e):e,!1),t&&(n.viewProvidersResolver=(e,n)=>J_(e,n?n(t):t,!0))}}function tv(e,t){let n=ns()+e,r=Ko();return r[n]===Lu?Ap(r,n,t()):jp(r,n)}function nv(e,t,n){return av(Ko(),ns(),e,t,n)}function rv(e,t,n,r){return ov(Ko(),ns(),e,t,n,r)}function qte(e,t,n,r,i){return Jte(Ko(),ns(),e,t,n,r,i)}function iv(e,t){let n=e[t];return n===Lu?void 0:n}function av(e,t,n,r,i,a){let o=t+n;return Mp(e,o,i)?Ap(e,o+1,a?r.call(a,i):r(i)):iv(e,o+1)}function ov(e,t,n,r,i,a,o){let s=t+n;return Np(e,s,i,a)?Ap(e,s+2,o?r.call(o,i,a):r(i,a)):iv(e,s+2)}function Jte(e,t,n,r,i,a,o,s){let c=t+n;return Pp(e,c,i,a,o)?Ap(e,c+3,s?r.call(s,i,a,o):r(i,a,o)):iv(e,c+3)}function sv(e,t){let n=qo(),r,i=e+27;n.firstCreatePass?(r=Yte(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=ha(r.type,!0)),o=ra(am);try{let e=dl(!1),t=a();return dl(e),Eo(n,Ko(),i,t),t}finally{ra(o)}}function Yte(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function cv(e,t,n){let r=e+27,i=Ko(),a=To(i,r);return uv(i,r)?av(i,ns(),t,a.transform,n,a):a.transform(n)}function lv(e,t,n,r){let i=e+27,a=Ko(),o=To(a,i);return uv(a,i)?ov(a,ns(),t,o.transform,n,r,o):o.transform(n,r)}function uv(e,t){return e[1].data[t].pure}function dv(e,t){return dp(e,t)}var Xte=(()=>{class e{applicationErrorHandler=C(tc);appRef=C(tg);taskService=C(Ps);ngZone=C(Hs);zonelessEnabled=C(fc);tracing=C(rd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new fr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Bs):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(C(pc,{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?Rs:Ls;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=Rl({token:e,factory:e.ɵfac})}return e})();function Zte(){return[{provide:dc,useExisting:Xte},{provide:Hs,useClass:Xs},{provide:fc,useValue:!0}]}function Qte(){return typeof $localize<`u`&&$localize.locale||`en-US`}var fv=new Fi(``,{factory:()=>C(fv,{optional:!0,skipSelf:!0})||Qte()}),pv=class{destroyed=!1;listeners=null;errorHandler=C(ec,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=C(As);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new _i(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(yi(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=nn(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&&$te(this.listeners)),nn(t),this.isEmitting=!1}}};function $te(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function X(e,t){return wn(e,t?.equal)}function Z(e){return Zn(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var ene=e=>e;function Q(e,t){return typeof e==`function`?mv(qn(e,ene,t?.equal),t?.debugName,t?.set):mv(qn(e.source,e.computation,e.equal),e.debugName,e.set)}function mv(e,t,n){let r=e[tn],i=e;if(n!==void 0){let t=e=>Jn(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Z(e)),t)}else i.set=e=>Jn(r,e),i.update=e=>Yn(r,e);return i.asReadonly=rc.bind(e),i}var hv=!1;function tne(){return hv}function gv(e){hv=e}function _v(e,t){let n=Object.create(Dc);n.value=e,n.transformFn=t?.transform;function r(){if(on(n),n.value===Ec)throw new _i(-950,null);return n.value}return r[tn]=n,r}function vv(e){return new pv}function yv(e,t){return _v(e,t)}function nne(e){return _v(Ec,e)}var $=(yv.required=nne,yv);function bv(e,t){let n=Object.create(Dc),r=new pv;n.value=e;function i(){return on(n),xv(n.value),n.value}return i[tn]=n,i.asReadonly=rc.bind(i),i.set=e=>{n.equal(n.value,e)||(In(n,e),r.emit(e))},i.update=e=>{xv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function xv(e){if(e===Ec)throw new _i(952,!1)}function Sv(e,t){return bv(e,t)}function rne(e){return bv(Ec,e)}var Cv=(Sv.required=rne,Sv);function wv(e,t){return hh(t)}function ine(e,t){return gh(t)}var Tv=(wv.required=ine,wv),ane=(()=>{class e{static __NG_ELEMENT_ID__=one}return e})();function one(e){return sne(Jo(),Ko(),(e&16)==16)}function sne(e,t,n){if(mo(e)&&!n){let n=Do(e.index,t);return new cp(n,n)}if(e.type&175){let e=t[15];return new cp(e,t)}return null}var Ev=new Fi(``),cne=new Fi(``);function Dv(e){return!e.moduleRef}function lne(e){let t=Dv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Hs);return n.run(()=>{Dv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(tc),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),Dv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(Ev);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(Ev);n.add(t),e.moduleRef.onDestroy(()=>{rg(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return dne(r,n,()=>{let n=t.get(Ps),r=n.add(),i=t.get(Fh);return i.runInitializers(),i.donePromise.then(()=>{if(Wg(t.get(fv,Ug)||`en-US`),!t.get(cne,!0))return Dv(e)?t.get(tg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Dv(e)){let n=t.get(tg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return une?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var une;function dne(e,t,n){try{let r=n();return yh(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Ov=null;function fne(e=[],t){return Os.create({name:t,providers:[{provide:Wa,useValue:`platform`},{provide:Ev,useValue:new Set([()=>Ov=null])},...e]})}function pne(e=[]){if(Ov)return Ov;let t=fne(e);return Ov=t,$h(),mne(t),t}function mne(e){let t=e.get(oc,null);so(e,()=>{t?.forEach(e=>e())})}function hne(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Hc(kc.BootstrapApplicationStart);try{let e=i?.injector??pne(r);return lne({r3Injector:new Sh({providers:[Zte(),nc,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Hc(kc.BootstrapApplicationEnd)}}function kv(e){return typeof e==`boolean`?e:e!=null&&e!==`false`}var Av=Symbol(`NOT_SET`),jv=new Set,gne={...Rn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Av,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(on(r),r.value),r.signal[tn]=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??jv)t()}finally{vn(e)}}};function Mv(e,t){let n=t?.injector??C(Os),r=n.get(dc),i=n.get(od),a=n.get(rd,null,{optional:!0});i.impl??=n.get(cd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(lc,null,{optional:!0}),c=new _ne(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var Nv=null;function Pv(){return Nv}function vne(e){Nv??=e}var yne=class{},Fv=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(Fv||{}),Iv=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(Iv||{}),Lv=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(Lv||{}),Rv={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 bne(e){return zg(e)[Vg.LocaleId]}function xne(e,t,n){let r=zg(e);return Wv(Wv([r[Vg.DayPeriodsFormat],r[Vg.DayPeriodsStandalone]],t),n)}function Sne(e,t,n){let r=zg(e);return Wv(Wv([r[Vg.DaysFormat],r[Vg.DaysStandalone]],t),n)}function Cne(e,t,n){let r=zg(e);return Wv(Wv([r[Vg.MonthsFormat],r[Vg.MonthsStandalone]],t),n)}function wne(e,t){let n=zg(e)[Vg.Eras];return Wv(n,t)}function zv(e,t){return Wv(zg(e)[Vg.DateFormat],t)}function Bv(e,t){return Wv(zg(e)[Vg.TimeFormat],t)}function Vv(e,t){let n=zg(e)[Vg.DateTimeFormat];return Wv(n,t)}function Hv(e,t){let n=zg(e),r=n[Vg.NumberSymbols][t];if(r===void 0){if(t===Rv.CurrencyDecimal)return n[Vg.NumberSymbols][Rv.Decimal];if(t===Rv.CurrencyGroup)return n[Vg.NumberSymbols][Rv.Group]}return r}function Uv(e){if(!e[Vg.ExtraData])throw new _i(2303,!1)}function Tne(e){let t=zg(e);return Uv(t),(t[Vg.ExtraData][2]||[]).map(e=>typeof e==`string`?Gv(e):[Gv(e[0]),Gv(e[1])])}function Ene(e,t,n){let r=zg(e);return Uv(r),Wv(Wv([r[Vg.ExtraData][0],r[Vg.ExtraData][1]],t)||[],n)||[]}function Wv(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new _i(2304,!1)}function Gv(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Dne=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Kv=Object.create(null),One=/((?:[^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]*)/,kne=256;function Ane(e,t,n,r){let i=cy(e);jne(t),t=Jv(n,t)||t;let a=[],o;for(;t;)if(o=One.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=ay(r,s),i=sy(i,r));let c=``;return a.forEach(e=>{let t=Lne(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function jne(e){if(e.length>kne)throw new _i(2300,!1)}function qv(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Jv(e,t){let n=bne(e);if(Kv[n]??=Object.create(null),Kv[n][t])return Kv[n][t];let r=``;switch(t){case`shortDate`:r=zv(e,Lv.Short);break;case`mediumDate`:r=zv(e,Lv.Medium);break;case`longDate`:r=zv(e,Lv.Long);break;case`fullDate`:r=zv(e,Lv.Full);break;case`shortTime`:r=Bv(e,Lv.Short);break;case`mediumTime`:r=Bv(e,Lv.Medium);break;case`longTime`:r=Bv(e,Lv.Long);break;case`fullTime`:r=Bv(e,Lv.Full);break;case`short`:let t=Jv(e,`shortTime`),n=Jv(e,`shortDate`);r=Yv(Vv(e,Lv.Short),[t,n]);break;case`medium`:let i=Jv(e,`mediumTime`),a=Jv(e,`mediumDate`);r=Yv(Vv(e,Lv.Medium),[i,a]);break;case`long`:let o=Jv(e,`longTime`),s=Jv(e,`longDate`);r=Yv(Vv(e,Lv.Long),[o,s]);break;case`full`:let c=Jv(e,`fullTime`),l=Jv(e,`fullDate`);r=Yv(Vv(e,Lv.Full),[c,l])}return r&&(Kv[n][t]=r),r}function Yv(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function Xv(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 Mne(s,t);let c=Hv(o,Rv.MinusSign);return Xv(s,t,c,r,i)}}function Nne(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 _i(2301,!1)}}function Qv(e,t,n=Fv.Format,r=!1){return function(i,a){return Pne(i,a,e,t,n,r)}}function Pne(e,t,n,r,i,a){switch(n){case 2:return Cne(t,i,r)[e.getMonth()];case 1:return Sne(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=Tne(t),a=Ene(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?`+`:``)+Xv(o,2,a)+Xv(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+Xv(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+Xv(o,2,a)+`:`+Xv(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+Xv(o,2,a)+`:`+Xv(Math.abs(i%60),2,a);default:throw new _i(2310,!1)}}}var Fne=0,ey=4;function Ine(e){let t=qv(e,Fne,1).getDay();return qv(e,0,1+(t<=ey?ey:11)-t)}function ty(e){let t=e.getDay(),n=t===0?-3:ey-t;return qv(e.getFullYear(),e.getMonth(),e.getDate()+n)}function ny(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=ty(n),t=Ine(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return Xv(i,e,Hv(r,Rv.MinusSign))}}function ry(e,t=!1){return function(n,r){return Xv(ty(n).getFullYear(),e,Hv(r,Rv.MinusSign),t)}}var iy=Object.create(null);function Lne(e){if(iy[e])return iy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Qv(3,Iv.Abbreviated);break;case`GGGG`:t=Qv(3,Iv.Wide);break;case`GGGGG`:t=Qv(3,Iv.Narrow);break;case`y`:t=Zv(0,1,0,!1,!0);break;case`yy`:t=Zv(0,2,0,!0,!0);break;case`yyy`:t=Zv(0,3,0,!1,!0);break;case`yyyy`:t=Zv(0,4,0,!1,!0);break;case`Y`:t=ry(1);break;case`YY`:t=ry(2,!0);break;case`YYY`:t=ry(3);break;case`YYYY`:t=ry(4);break;case`M`:case`L`:t=Zv(1,1,1);break;case`MM`:case`LL`:t=Zv(1,2,1);break;case`MMM`:t=Qv(2,Iv.Abbreviated);break;case`MMMM`:t=Qv(2,Iv.Wide);break;case`MMMMM`:t=Qv(2,Iv.Narrow);break;case`LLL`:t=Qv(2,Iv.Abbreviated,Fv.Standalone);break;case`LLLL`:t=Qv(2,Iv.Wide,Fv.Standalone);break;case`LLLLL`:t=Qv(2,Iv.Narrow,Fv.Standalone);break;case`w`:t=ny(1);break;case`ww`:t=ny(2);break;case`W`:t=ny(1,!0);break;case`d`:t=Zv(2,1);break;case`dd`:t=Zv(2,2);break;case`c`:case`cc`:t=Zv(7,1);break;case`ccc`:t=Qv(1,Iv.Abbreviated,Fv.Standalone);break;case`cccc`:t=Qv(1,Iv.Wide,Fv.Standalone);break;case`ccccc`:t=Qv(1,Iv.Narrow,Fv.Standalone);break;case`cccccc`:t=Qv(1,Iv.Short,Fv.Standalone);break;case`E`:case`EE`:case`EEE`:t=Qv(1,Iv.Abbreviated);break;case`EEEE`:t=Qv(1,Iv.Wide);break;case`EEEEE`:t=Qv(1,Iv.Narrow);break;case`EEEEEE`:t=Qv(1,Iv.Short);break;case`a`:case`aa`:case`aaa`:t=Qv(0,Iv.Abbreviated);break;case`aaaa`:t=Qv(0,Iv.Wide);break;case`aaaaa`:t=Qv(0,Iv.Narrow);break;case`b`:case`bb`:case`bbb`:t=Qv(0,Iv.Abbreviated,Fv.Standalone,!0);break;case`bbbb`:t=Qv(0,Iv.Wide,Fv.Standalone,!0);break;case`bbbbb`:t=Qv(0,Iv.Narrow,Fv.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Qv(0,Iv.Abbreviated,Fv.Format,!0);break;case`BBBB`:t=Qv(0,Iv.Wide,Fv.Format,!0);break;case`BBBBB`:t=Qv(0,Iv.Narrow,Fv.Format,!0);break;case`h`:t=Zv(3,1,-12);break;case`hh`:t=Zv(3,2,-12);break;case`H`:t=Zv(3,1);break;case`HH`:t=Zv(3,2);break;case`m`:t=Zv(4,1);break;case`mm`:t=Zv(4,2);break;case`s`:t=Zv(5,1);break;case`ss`:t=Zv(5,2);break;case`S`:t=Zv(6,1);break;case`SS`:t=Zv(6,2);break;case`SSS`:t=Zv(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=$v(0);break;case`ZZZZZ`:t=$v(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=$v(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=$v(2);break;default:return null}return iy[e]=t,t}function ay(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function oy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function sy(e,t,n){let r=e.getTimezoneOffset();return oy(e,-1*(ay(t,r)-r))}function cy(e){if(uy(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 qv(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Dne))return ly(n)}let t=new Date(e);if(!uy(t))throw new _i(2311,!1);return t}function ly(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 uy(e){return e instanceof Date&&!isNaN(e.valueOf())}var dy=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=C(Os);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)(am(zm))};static ɵdir=Oh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Nc]})}return e})();function fy(e,t){return new _i(2100,!1)}var py=`mediumDate`,my=new Fi(``),hy=new Fi(``),gy=(()=>{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??py,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Ane(t,e,i||this.locale,a)}catch(t){throw fy(e,t.message)}}static ɵfac=function(t){return new(t||e)(am(fv,16),am(my,24),am(hy,24))};static ɵpipe=kh({name:`date`,type:e,pure:!0})}return e})(),_y=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=kh({name:`json`,type:e,pure:!1})}return e})();function vy(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 yy=`browser`,by=class{_doc;constructor(e){this._doc=e}manager},xy=(()=>{class e extends by{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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Sy=new Fi(``),Cy=(()=>{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 xy));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof xy);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 _i(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(ua(Sy),ua(Hs))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),wy=`ng-app-id`;function Ty(e){for(let t of e)t.remove()}function Ey(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function Dy(e,t,n,r){let i=e.head?.querySelectorAll(`style[${wy}="${t}"],link[${wy}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(wy),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 Oy(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var ky=(()=>{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,Dy(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,Ey);t?.forEach(e=>this.addUsage(e,this.external,Oy))}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&&(Ty(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])Ty(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,Ey(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,Oy(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)(ua(ks),ua(ic),ua(cc,8),ua(sc))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Ay={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`},jy=/%COMP%/g,My=`%COMP%`,Ny=`_nghost-${My}`,Py=`_ngcontent-${My}`,Fy=!0,Iy=new Fi(``,{factory:()=>Fy}),Ly=new Fi(``);function Ry(e){return Py.replace(jy,e)}function zy(e){return Ny.replace(jy,e)}function By(e,t){return t.map(t=>t.replace(jy,e))}var Vy=(()=>{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 Hy(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 Ky?n.applyToHost(e):n instanceof Gy&&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 gu.Emulated:r=new Ky(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case gu.ShadowDom:return new Wy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case gu.ExperimentalIsolatedShadowDom:return new Wy(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new Gy(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)(ua(Cy),ua(rm),ua(ic),ua(Iy),ua(ks),ua(Hs),ua(cc),ua(rd,8),ua(Ly,8))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})(),Hy=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(Ay[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(Uy(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=Uy(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new _i(-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 _i(-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=Ay[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=Ay[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&(Ru.DashCase|Ru.Important)?e.style.setProperty(t,n,r&Ru.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Ru.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=Pv().getGlobalEventTarget(this.doc,e),!e))throw new _i(-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 Uy(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var Wy=class extends Hy{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=By(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=Oy(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)}},Gy=class extends Hy{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?By(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&&Gu.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Ky=class extends Gy{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=Ry(l),this.hostAttr=zy(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}},qy=class e extends yne{supportsDOMEvents=!0;static makeCurrent(){vne(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=Yy();return t==null?null:Xy(t)}resetBaseElement(){Jy=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return vy(document.cookie,e)}},Jy=null;function Yy(){return Jy||=document.head.querySelector(`base`),Jy?Jy.getAttribute(`href`):null}function Xy(e){return new URL(e,document.baseURI).pathname}var Zy=[`alt`,`control`,`meta`,`shift`],Qy={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},$y={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},eb=(()=>{class e extends by{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(()=>Pv().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.`),Zy.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=Qy[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`),Zy.forEach(t=>{if(t!==n){let n=$y[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)(ua(ks))};static ɵprov=Oi({token:e,factory:e.ɵfac})}return e})();async function tb(e,t,n){return hne({rootComponent:e,...nb(t,n)})}function nb(e,t){return{platformRef:t?.platformRef,appProviders:[...sb,...e?.providers??[]],platformProviders:ob}}function rb(){qy.makeCurrent()}function ib(){return new ec}function ab(){return iu(document),document}var ob=[{provide:sc,useValue:yy},{provide:oc,useValue:rb,multi:!0},{provide:ks,useFactory:ab}],sb=[{provide:Wa,useValue:`root`},{provide:ec,useFactory:ib},{provide:Sy,useClass:xy,multi:!0},{provide:Sy,useClass:eb,multi:!0},Vy,{provide:rm,useClass:ky},{provide:ky,useExisting:rm},Cy,{provide:Cp,useExisting:Vy},[]];function cb(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 fb({code:i,why:ub(a.why,e),fix:ub(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:ub(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function hb(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 xb=Math.random.bind(Math),Sb=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Cb(e=21){let t=``,n=e;for(;n--;)t+=Sb[xb()*64|0];return t}var wb=6e4,Tb=e=>e,Eb=Tb,{clearTimeout:Db,setTimeout:Ob}=globalThis;function kb(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=Tb,deserialize:s=Eb,resolver:c,bind:l=`rpc`,timeout:u=wb,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}=bb(),_=Cb();s.i=_;let ee;async function te(n=s){return u>=0&&(ee=Ob(()=>{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,te,d):await te()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{Db(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:te,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(ne)}function te(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 ne(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&&(Db(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(ne),h}function Ab(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var jb=Object.freeze({type:`object`,additionalProperties:!0});function Mb(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return jb}return jb}function Nb(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 Fb(e,t){return Pb(e,t)??[e]}function Ib(e){return typeof e==`string`?`'${e}'`:new Bb().serialize(e)}var Lb=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Rb=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Lb.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function zb(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})(),Vb=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Hb=[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],Ub=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Wb=[],Gb=class{_data=new Kb;_hash=new Kb([...Vb]);_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)Wb[n]=e[t+n]|0;else{let e=Wb[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Wb[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Wb[n]=t+Wb[n-7]+i+Wb[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+Hb[n]+Wb[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=Kb.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 qb(e){return new Gb().finalize(e).toBase64()}function Jb(e){return qb(Ib(e))}function Yb(e){return Jb(e)}function Xb(){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 Zb=/^[\w+.-]{2,}:\/\//;function Qb(e){return e.endsWith(`/`)?e:`${e}/`}function $b(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function ex(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?Qb(n)+e.replace(/^\.?\//,``):e);return n}function tx(e,t){if(!t||t===`/`||Zb.test(e))return e;let n=$b(t);return e.startsWith(n)?e:ex(n,e)}function nx(e,t){let n=e.match(Zb);return t+(n?e.slice(n[0].length):e)}var rx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function ix(e=21){let t=``,n=e;for(;n--;)t+=rx[Math.random()*64|0];return t}var ax=Symbol.for(`immer-nothing`),ox=Symbol.for(`immer-draftable`),sx=Symbol.for(`immer-state`),cx=[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 lx(e,...t){{let n=cx[e],r=Nx(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var ux=Object,dx=ux.getPrototypeOf,fx=`constructor`,px=`prototype`,mx=`configurable`,hx=`enumerable`,gx=`writable`,_x=`value`,vx=e=>!!e&&!!e[sx];function yx(e){return e?Sx(e)||kx(e)||!!e[ox]||!!e[fx]?.[ox]||Ax(e)||jx(e):!1}var bx=ux[px][fx].toString(),xx=new WeakMap;function Sx(e){if(!e||!Mx(e))return!1;let t=dx(e);if(t===null||t===ux[px])return!0;let n=ux.hasOwnProperty.call(t,fx)&&t[fx];if(n===Object)return!0;if(!Nx(n))return!1;let r=xx.get(n);return r===void 0&&(r=Function.toString.call(n),xx.set(n,r)),r===bx}function Cx(e,t,n=!0){wx(e)===0?(n?Reflect.ownKeys(e):ux.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function wx(e){let t=e[sx];return t?t.type_:kx(e)?1:Ax(e)?2:jx(e)?3:0}var Tx=(e,t,n=wx(e))=>n===2?e.has(t):ux[px].hasOwnProperty.call(e,t),Ex=(e,t,n=wx(e))=>n===2?e.get(t):e[t],Dx=(e,t,n,r=wx(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Ox(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var kx=Array.isArray,Ax=e=>e instanceof Map,jx=e=>e instanceof Set,Mx=e=>typeof e==`object`,Nx=e=>typeof e==`function`,Px=e=>typeof e==`boolean`;function Fx(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Ix=e=>Mx(e)?e?.[sx]:null,Lx=e=>e.copy_||e.base_,Rx=e=>e.modified_?e.copy_:e.base_;function zx(e,t){if(Ax(e))return new Map(e);if(jx(e))return new Set(e);if(kx(e))return Array[px].slice.call(e);let n=Sx(e);if(t===!0||t===`class_only`&&!n){let t=ux.getOwnPropertyDescriptors(e);delete t[sx];let n=Reflect.ownKeys(t);for(let r=0;r1&&ux.defineProperties(e,{set:Hx,add:Hx,clear:Hx,delete:Hx}),ux.freeze(e),t&&Cx(e,(e,t)=>{Bx(t,!0)},!1),e)}function Vx(){lx(2)}var Hx={[_x]:Vx};function Ux(e){return e===null||!Mx(e)||ux.isFrozen(e)}var Wx=`MapSet`,Gx=`Patches`,Kx=`ArrayMethods`,qx={};function Jx(e){let t=qx[e];return t||lx(0,e),t}var Yx=e=>!!qx[e];function Xx(e,t){qx[e]||(qx[e]=t)}var Zx,Qx=()=>Zx,$x=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Yx(Wx)?Jx(Wx):void 0,arrayMethodsPlugin_:Yx(Kx)?Jx(Kx):void 0});function eS(e,t){t&&(e.patchPlugin_=Jx(Gx),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function tS(e){nS(e),e.drafts_.forEach(iS),e.drafts_=null}function nS(e){e===Zx&&(Zx=e.parent_)}var rS=e=>Zx=$x(Zx,e);function iS(e){let t=e[sx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function aS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[sx].modified_&&(tS(t),lx(4)),yx(e)&&(e=oS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[sx].base_,e,t)}else e=oS(t,n);return sS(t,e,!0),tS(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===ax?void 0:e}function oS(e,t){if(Ux(t))return t;let n=t[sx];if(!n)return hS(t,e.handledSet_,e);if(!lS(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);pS(n,e)}return n.copy_}function sS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Bx(t,n)}function cS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var lS=(e,t)=>e.scope_===t,uS=[];function dS(e,t,n,r){let i=Lx(e),a=e.type_;if(r!==void 0&&Ex(i,r,a)===t){Dx(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;Cx(i,(e,n)=>{if(vx(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??uS;for(let e of o)Dx(i,e,n,a)}function fS(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!lS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Rx(i);dS(e,i.draft_??i,a,n),pS(i,r)})}function pS(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)}cS(e)}}function mS(e,t,n){let{scope_:r}=e;if(vx(n)){let i=n[sx];lS(i,r)&&i.callbacks_.push(function(){wS(e),dS(e,n,Rx(i),t)})}else yx(n)&&e.callbacks_.push(function(){let i=Lx(e);e.type_===3?i.has(n)&&hS(n,r.handledSet_,r):Ex(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&hS(Ex(e.copy_,t,e.type_),r.handledSet_,r)})}function hS(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||vx(e)||t.has(e)||!yx(e)||Ux(e)?e:(t.add(e),Cx(e,(r,i)=>{if(vx(i)){let t=i[sx];lS(t,n)&&(Dx(e,r,Rx(t),e.type_),cS(t))}else yx(i)&&hS(i,t,n)}),e)}function gS(e,t){let n=kx(e),r={type_:+!!n,scope_:t?t.scope_:Qx(),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=_S;n&&(i=[r],a=vS);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var _S={get(e,t){if(t===sx)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=Lx(e);if(!Tx(i,t,e.type_))return xS(e,i,t);let a=i[t];if(e.finalized_||!yx(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Fx(t))return a;if(a===yS(e.base_,t)||bS(e,t,a)){wS(e);let n=e.type_===1?+t:t,r=ES(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Lx(e)},ownKeys(e){return Reflect.ownKeys(Lx(e))},set(e,t,n){let r=SS(Lx(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=yS(Lx(e),t),i=r?.[sx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.delete(t),!0;if(Ox(n,r)&&(n!==void 0||Tx(e.base_,t,e.type_)))return!0;wS(e),CS(e)}return e.copy_[t]===n&&(n!==void 0||Tx(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),mS(e,t,n),!0)},deleteProperty(e,t){return wS(e),yS(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),CS(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Lx(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[gx]:!0,[mx]:e.type_!==1||t!==`length`,[hx]:r[hx],[_x]:n[t]}},defineProperty(){lx(11)},getPrototypeOf(e){return dx(e.base_)},setPrototypeOf(){lx(12)}},vS={};for(let e in _S){let t=_S[e];vS[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}vS.deleteProperty=function(e,t){return isNaN(parseInt(t))&&lx(13),vS.set.call(this,e,t,void 0)},vS.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&lx(14),_S.set.call(this,e[0],t,n,e[0])};function yS(e,t){let n=e[sx];return(n?Lx(n):e)[t]}function bS(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!yx(n)||n[sx]?!1:e.baseRefs_.has(n)}function xS(e,t,n){let r=SS(t,n);return r?_x in r?r[_x]:r.get?.call(e.draft_):void 0}function SS(e,t){if(!(t in e))return;let n=dx(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=dx(n)}}function CS(e){e.modified_||(e.modified_=!0,e.parent_&&CS(e.parent_))}function wS(e){e.copy_||=(e.assigned_=new Map,zx(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var TS=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(Nx(e)&&!Nx(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}Nx(t)||lx(6),n!==void 0&&!Nx(n)&&lx(7);let r;if(yx(e)){let i=rS(this),a=ES(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?tS(i):nS(i)}return eS(i,n),aS(r,i)}if(!e||!Mx(e)){if(r=t(e),r===void 0&&(r=e),r===ax&&(r=void 0),this.autoFreeze_&&Bx(r,!0),n){let t=[],i=[];Jx(Gx).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}lx(1,e)},this.produceWithPatches=(e,t)=>{if(Nx(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]},Px(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Px(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Px(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){yx(e)||lx(8),vx(e)&&(e=DS(e));let t=rS(this),n=ES(t,e,void 0);return n[sx].isManual_=!0,nS(t),n}finishDraft(e,t){let n=e&&e[sx];(!n||!n.isManual_)&&lx(9);let{scope_:r}=n;return eS(r,t),aS(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=Jx(Gx).applyPatches_;return vx(e)?r(e,t):this.produce(e,e=>r(e,t))}};function ES(e,t,n,r){let[i,a]=Ax(t)?Jx(Wx).proxyMap_(t,n):jx(t)?Jx(Wx).proxySet_(t,n):gS(t,n);return(n?.scope_??Qx()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?fS(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 DS(e){return vx(e)||lx(10,e),OS(e)}function OS(e){if(!yx(e)||Ux(e))return e;let t=e[sx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=zx(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=zx(e,!0);let i=n;return jx(n)&&(n=new Set),Cx(i,(e,t)=>{Dx(n,e,OS(t))},r),t&&(t.finalized_=!1),n}function kS(){cx.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=Ix(Ex(e,n.key_)),i=Ex(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||Tx(e,o))||n.parent_.type_===1&&n.parent_.allIndicesReassigned_)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=Ex(o,e,c),f=Ex(s,e,c),p=l?Tx(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===ax?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(jx(e))return new Set(Array.from(e).map(u));let t=Object.create(dx(e));for(let n in e)t[n]=u(e[n]);return Tx(e,ox)&&(t[ox]=e[ox]),t}function d(e){return vx(e)?u(e):e}Xx(Gx,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var AS=new TS,jS=AS.produce,MS=AS.produceWithPatches.bind(AS),NS=AS.applyPatches.bind(AS),PS=1e3;function FS(e,t){if(e.add(t),e.size>PS){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function IS(e){let{enablePatches:t=!1}=e;t&&kS();let n=Xb(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=ix())=>{i.has(t)||(kS(),r=NS(r,e),FS(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=ix())=>{if(!i.has(a)){if(FS(i,a),t){let[t,i]=MS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=jS(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var LS=typeof self==`object`?self:globalThis,RS=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),zS=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function BS(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=RS.has(e)?LS[e]:void 0;return n(new(r??LS.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`&&zS.has(a))return n(new LS[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function VS(e){return BS(new Map,e)(0)}var HS=``,{toString:US}={},{keys:WS}=Object;function GS(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=US.call(e).slice(8,-1);switch(n){case`Array`:return[1,HS];case`Object`:return[2,HS];case`Date`:return[3,HS];case`RegExp`:return[4,HS];case`Map`:return[5,HS];case`Set`:return[6,HS];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function KS([e,t]){return e===0&&(t===`function`||t===`symbol`)}function qS(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]=GS(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 WS(r))(e||!KS(GS(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||!(KS(GS(n))||KS(GS(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!KS(GS(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function JS(e,t={}){let n=[];return qS(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:YS,stringify:XS}=JSON,ZS={json:!0,lossy:!0};function QS(e){return VS(YS(e))}function $S(e){return XS(JS(e,ZS))}function eC(e){return VS(e)}function tC(e){return $S(e)}function nC(e){return QS(e)}var rC=256,iC=class extends Error{name=`StreamClosedError`};function aC(e={}){let t=e.id??ix(),n=Math.max(0,e.replayWindow??0),r=Xb(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new iC(`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=sC(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 oC(e={}){let t=e.id??ix(),n=Math.max(1,e.highWaterMark??rC),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 sC(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 cC=128;function lC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,cC)}var uC=`modulepreload`,dC=function(e,t){return new URL(e,t).href},fC={},pC=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=dC(t,n),t=s(t),t in fC)return;fC[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`:uC,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)})},mC=`__connection.json`,hC=`__DEVFRAME_CONNECTION__`,gC=`x-birpc-session`,_C=`__rpc-dump/index.json`,vC=`devframe:services`,yC=`devframe_otp`,bC=`devframe_auth_token`;gb.postMessage.remoteAssetsError;var xC=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Yb(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()}},SC=yb({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 CC(e){if(e.agent&&e.jsonSerializable===!1)throw SC.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function wC(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function TC(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 EC(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 kC(e,t){let n=e.handler;if(!n){let r=await OC(e,t);if(!r.handler)throw SC.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 EC(e.name,r,t),o=await a(...n);return await DC(e.name,i,o)}}var AC=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 kC(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 SC.DF0021({name:e.name});CC(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 SC.DF0022({name:e.name});CC(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 kC(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw SC.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 jC(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 NC(t,`undefined`,r,e);return n}return i!==null&&MC(i,r,e,t),n})}function MC(e,t,n,r){if(typeof e==`bigint`)throw NC(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw NC(r,`Map`,t,n);if(e instanceof Set)throw NC(r,`Set`,t,n);if(e instanceof Date)throw NC(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw NC(r,e.constructor?.name??`class instance`,t,n)}function NC(e,t,n,r){let i=PC(n,r);return SC.DF0020({name:e||``,type:t,path:i})}function PC(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var FC=`__DEVFRAME_CONNECTION_META__`,IC=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function LC(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 RC(){return LC(hC)}function zC(){return LC(FC)}function BC(e){if(e)return e;try{let e=localStorage.getItem(IC);if(e)return e}catch{}return LC(IC)}function VC(e){globalThis[hC]=e,globalThis[FC]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&HC(e.authToken)}function HC(e){try{localStorage.setItem(IC,e)}catch{}globalThis[IC]=e;let t=RC();t&&(globalThis[hC]={...t,authToken:e})}function UC(e){let t=tx(mC,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function WC(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function GC(){let e=RC();if(e)return WC(e,BC()??e.authToken??e.connectionMeta.authToken);let t=zC();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??UC(`./`),authToken:BC(t.authToken)}}async function KC(e={}){if(e.connection){let t=WC(e.connection,BC(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return VC(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:UC(t[0]??`./`),authToken:BC(e.authToken??e.connectionMeta.authToken)};return VC(n),n}let n=GC();if(n){let t=WC(n,BC(e.authToken??n.authToken??n.connectionMeta.authToken));return VC(t),t}let r=[];for(let n of t){let t=tx(mC,n),i=UC(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:BC(e.authToken??r.authToken)};return VC(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var qC=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function JC(e=yC){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function YC(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 XC(e=yC){let t=JC(e);return t&&YC(e),t}async function ZC(e,t={}){let n=XC(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function QC(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(vC,{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 $C(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:gb.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:gb.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=IS({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,n)=>{if(e.isTrusted)d().then(t,n);else{t(u);let n=!1;e.events.on(gb.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var ew=new Map;function tw(e=ew){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?jC(n,r??``):`s:${tC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?nC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function nw(){}function rw(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 iw(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 aw(e){let{onConnected:t=nw,onError:n=nw,onDisconnected:r=nw,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${bC}=${encodeURIComponent(e.authToken)}`);let s=tw(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=rw(r);if(!e)break;r=e.rest;let{event:t,data:n}=iw(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`,[gC]: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 ow(e,t){let{channel:n,rpcOptions:r={}}=t;return kb(e,{...n,timeout:-1,...r,proxify:!1})}function sw(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(gb.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 qC(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new qC(`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(gb.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 qC(`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(gb.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(gb.client.connectionError,e),m(new qC(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new qC(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),te=ow(a.functions,{channel:ee,rpcOptions:o});a.register({name:gb.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new qC(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(gb.client.connectionError,e),m(e),i.emit(gb.client.isTrustedUpdated,!1)}});let ne=n;async function re(e){ne=e;let t=await te.$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 qC(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(gb.client.connectionError,e)}return i.emit(gb.client.isTrustedUpdated,c),t.isTrusted}async function ie(e){let t=(await te.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(ne=t,c=!0,d.resolve(!0),f(`connected`),i.emit(gb.client.isTrustedUpdated,!0)),t}async function ae(e={}){await te.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function oe(){return c?!0:re(ne??``)}async function se(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:oe,requestTrustWithToken:re,requestTrustWithCode:ie,requestAuthCode:ae,ensureTrusted:se,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(gb.client.error,n,t),Promise.reject(n)):g(te.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(gb.client.error,t,String(e[0]));return}return te.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(gb.client.error,n,t),Promise.reject(n)):g(te.$callOptional(...e),t)},close:()=>{ee.close()}}}function cw(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 lw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=cw(n.sse,r??`./`,location);return sw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>aw({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 uw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:dw(r)?uw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function dw(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function fw(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function pw(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function mw(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function hw(e){if(e.error)throw uw(e.error);return e.output}function gw(e){return e.some(e=>e!=null)}function _w(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function vw(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?eC(e):e}function a(e,t){return i(_w(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 mw(r)?hw(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(fw(r)){if(gw(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(pw(r)){let e=Yb(n),i=r.records[e];if(i)return hw(await s(i,r.serialization));if(r.fallback)return hw(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!gw(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 yw(e){let t=vw(await e.fetchJsonFromBases(_C),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 bw=``;function xw(e,t){return`${e}${bw}${t}`}function Sw(e){let t=new Map,n=new Map;e.client.register({name:gb.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(xw(e,n))?._push(r,i)}}),e.client.register({name:gb.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=xw(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:gb.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=xw(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(gb.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(bw);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=xw(n,r),o=t.get(a);if(o)return o;let s=oC({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(gb.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=xw(t,r),a=n.get(i);if(a)return a;let o=aC({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 Cw(){}var ww=new Map;function Tw(e){let t=e.url;e.authToken&&(t=`${t}?${bC}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=Cw,onError:i=Cw,onDisconnected:a=Cw,definitions:o=ww}=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=tw(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 Ew(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 nx(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function Dw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=Ew(n.websocket,r??`./`,location);return sw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>Tw({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 Ow(e){return e.includes(`:`)}function kw(e,t){return Ow(t)?t:`${e}:${t}`}function Aw(e){return{async get(t){return(await e()).value()?.[t]},async set(t,n){(await e()).mutate(e=>{if(e===void 0)return{[t]:n};e[t]=n})},async delete(t){(await e()).mutate(e=>{e!==void 0&&delete e[t]})},async all(){return(await e()).value()??{}},async onChange(t){return(await e()).on(`updated`,e=>t(e??{}))}}}function jw(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=(async()=>(await e.ensureTrusted(),e.sharedState.get(r)))().catch(e=>{throw i=void 0,e}),i}return Aw(a)}function Mw(e,t){return{global:jw(e,t,`global`),project:jw(e,t,`project`)}}function Nw(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(Ow(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(kw(t,n),...r)),callEvent:((n,...r)=>e.callEvent(kw(t,n),...r)),callOptional:((n,...r)=>e.callOptional(kw(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(kw(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(kw(t,n),r,i),upload:(n,r)=>e.streaming.upload(kw(t,n),r)}},settings:Mw(e,t),scope:e.scope}}function Pw(){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 Fw(e,t={}){let n=t.modelContext??Pw();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=lC(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=Ab(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:Nb(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>Iw(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 Iw(e,t,n){try{let r=Fb(n,e.args?.length);return{content:[{type:`text`,text:Lw(await(await kC(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:Rw(e)}]}}}function Lw(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function Rw(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 zw(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 Bw(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Xb(),a=Array.isArray(t)?t:[t],o=await KC(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new xC({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new AC(f),m=e.webmcp===!1?void 0:Fw(p),h,g=!1,_=0,ee;function te(){_++,ee=void 0,d.clear(),r===!0&&d.updateOptions({functions:[]})}r&&(p.register({name:gb.broadcast.cacheInvalidate,type:`event`,handler:te}),i.on(gb.client.connectionStatus,te),i.on(gb.client.isTrustedUpdated,te));async function ne(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(tx(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 re=e.callTimeout??0,ie=re>0?re:1/0,ae,oe={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){let a=performance.now()+ie;if(await n.onRequest?.call(this,e,t,i),r===!0&&e.i&&ae.isTrusted&&!e.m.startsWith(`anonymous:`)&&e.m!==`devframe:rpc:cacheable-functions`){function t(){if(performance.now()>=a)throw new qC(`timeout`,`[devframe] RPC call "${e.m}" timed out after ${re}ms`)}for(;!ee&&(t(),!(g||ae.status!==`connected`));){let e=_;ee=ae.callOptional(`devframe:rpc:cacheable-functions`).then(t=>{e===_&&d.updateOptions({functions:t??[]})}).catch(t=>{throw e===_&&(ee=void 0),t}),await ee}await ee,t()}let o=_;if(r&&e.i&&!g&&ae.isTrusted&&d.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);o===_&&!g&&d.apply(e,n)}else await t(e)}}},se=zw(e.transport??`auto`,s);ae=se===`static`?await yw({fetchJsonFromBases:ne}):se===`sse`?lw({...oe,sseOptions:e.sseOptions}):Dw({...oe,wsOptions:e.wsOptions});let ce;try{ce=new BroadcastChannel(`devframe-auth`)}catch{}let le,ue=!1;function de(e){return((...t)=>ue||!le?e(...t):le.then(()=>e(...t)))}function fe(){g=!0,te();try{h?.(),m?.()}finally{try{ce?.close()}finally{ae.close?.()}}}let pe={events:i,get isTrusted(){return ae.isTrusted},get status(){return ae.status},get connectionError(){return ae.connectionError},get transport(){return ae.transport??se},get connection(){return o},connectionMeta:s,ensureTrusted:ae.ensureTrusted,requestTrust:ae.requestTrust,requestTrustWithToken:async e=>(HC(e),o={...o,authToken:e},ae.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await ae.requestTrustWithCode(e);if(!t)return!1;HC(t),o={...o,authToken:t};try{ce?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>ae.requestAuthCode(e),call:de(ae.call),callEvent:de(ae.callEvent),callOptional:de(ae.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:fe};pe.sharedState=$C(pe),pe.streaming=Sw(pe),pe.services=QC(pe);let me=new Map;pe.scope=(e=>{if(!e)return pe;let t=me.get(e);return t||(t=Nw(pe,e),me.set(e,t)),t}),f.rpc=pe;function he(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ge(){if(e.simpleAuth!==!1&&he()&&typeof globalThis.prompt==`function`)for(await pe.requestAuthCode().catch(()=>{});!pe.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 pe.requestTrustWithCode(t))return}}async function _e(){let t=await ae.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await ZC(pe,{param:n}):!1;t||r||pe.isTrusted||await ge()}return le=_e().then(()=>{ue=!0},()=>{ue=!0}),s.mcp&&pC(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-KH4HHvHf-Of9JOtz4.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(pe))}).catch(()=>{}),ce&&(ce.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&pe.requestTrustWithToken(e.data.authToken)}),pe}var Vw=Bw,Hw=[`components`,`injectors`,`signals`,`ngrx`,`tanstackQuery`,`forms`,`router`,`pipes`,`http`,`analog`,`capacitor`,`errors`,`plugins`],Uw=[`angular`,`ngrx`,`analog`,`angular-native`,`nativescript`,`capacitor`];function Ww(e){return`pangular:${e}`}var Gw=[`forms`,`router`,`ngrx`,`http`,`analog`,`components`,`tanstackQuery`,`plugins`],Kw={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},idleAfterMs:{default:6e4,min:0,max:6e5}},qw={"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`},Jw=[[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 Yw(e){return Jw.some(([t])=>t===e)}var Xw=/^[a-z][a-z0-9-]{0,39}$/;function Zw(e,t){let n=t.plugins?.[e],r=t.inspectors.plugins&&Xw.test(e)&&(n?.enabled??!0);return{enabled:r,tools:r&&t.agent.tools.plugins&&(n?.tools??!0),actions:r&&t.actions.plugins&&(n?.actions??!0)}}var Qw=`pangular`,$w={mod:`Mod`,ctrl:`Ctrl`,control:`Ctrl`,meta:`Meta`,cmd:`Meta`,command:`Meta`,alt:`Alt`,option:`Alt`,opt:`Alt`,shift:`Shift`},eT=[`Mod`,`Ctrl`,`Meta`,`Alt`,`Shift`];function tT(e){if(typeof e!=`string`||e.length>40)return;let t=e.split(`+`).map(e=>e.trim());if(t.some(e=>!e))return;let n=new Set,r;for(let e of t){let t=$w[e.toLowerCase()];if(t){if(n.has(t))return;n.add(t);continue}if(r!==void 0)return;if(/^[a-z0-9]$/i.test(e))r=e.toUpperCase();else if(/^f([1-9]|1[0-2])$/i.test(e))r=e.toUpperCase();else return}if(r&&[...n].some(e=>e!==`Shift`)&&!(n.has(`Mod`)&&(n.has(`Ctrl`)||n.has(`Meta`))))return[...eT.filter(e=>n.has(e)),r].join(`+`)}function nT(e,t,n){let r=t.split(`+`),i=r.pop(),a=new Set(r),o=a.has(`Ctrl`)||a.has(`Mod`)&&!n,s=a.has(`Meta`)||a.has(`Mod`)&&n;if(e.ctrlKey!==o||e.metaKey!==s||e.altKey!==a.has(`Alt`)||e.shiftKey!==a.has(`Shift`))return!1;if(/^F\d+$/.test(i))return e.key.toUpperCase()===i;let c=/^\d$/.test(i)?`Digit${i}`:`Key${i}`;return e.code?e.code===c:e.key.toUpperCase()===i}function rT(e,t){if(!t)return e.replace(/^Mod\b/,`Ctrl`);let n={Mod:`⌘`,Meta:`⌘`,Ctrl:`⌃`,Alt:`⌥`,Shift:`⇧`};return e.split(`+`).map(e=>n[e]??e).join(``)}var iT=[{id:`dashboard`,label:`Dashboard`},{id:`timeline`,label:`Timeline`},{id:`audit`,label:`Audit`},{id:`analog`,label:`Analog`,inspector:`analog`},{id:`components`,label:`Components`,inspector:`components`},{id:`routes`,label:`Routes`,inspector:`router`},{id:`signals`,label:`Signals`,inspector:`signals`},{id:`injectors`,label:`Injectors`,inspector:`injectors`},{id:`store`,label:`Store`,inspector:`ngrx`},{id:`queries`,label:`Queries`,inspector:`tanstackQuery`},{id:`forms`,label:`Forms`,inspector:`forms`},{id:`pipes`,label:`Pipes`,inspector:`pipes`},{id:`network`,label:`SSR & HTTP`,inspector:`http`},{id:`errors`,label:`Errors`,inspector:`errors`},{id:`capacitor`,label:`Capacitor`,inspector:`capacitor`},{id:`plugins`,label:`Plugins`,inspector:`plugins`}],aT=1e4;function oT(e){return iT.filter(t=>!(`inspector`in t)||e.inspectors[t.inspector])}var sT={components:`a component instance, by its id in the component tree`,injectors:`a component's element injector, by the component's id`,forms:`a form, by its id`},cT=200;function lT(e){let t=new URLSearchParams({tab:e.tab});return e.id&&t.set(`id`,e.id),e.page&&t.set(`page`,e.page),`#${t.toString()}`}function uT(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=e=>{let n=t.get(e)?.trim();return n&&n.length<=cT?n:void 0},r=n(`tab`);if(!r)return null;let i=n(`id`),a=n(`page`);return{tab:r,...i?{id:i}:{},...a?{page:a}:{}}}var dT=[{id:`settings`,title:`Open settings`,group:`Go to`,keywords:`preferences tabs`},{id:`pick-component`,title:`Pick component on page`,group:`Actions`,keywords:`select inspect element`,inspector:`components`},{id:`cd-record-start`,title:`Start recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-record-stop`,title:`Stop recording change detection`,group:`Actions`,keywords:`profiler cycles`,inspector:`components`},{id:`cd-clear`,title:`Clear change detection recording`,group:`Actions`,keywords:`reset recordings cycles`,inspector:`components`},{id:`theme:system`,title:`Theme: follow the system`,group:`Theme`,keywords:`auto`},{id:`theme:light`,title:`Theme: light`,group:`Theme`},{id:`theme:dark`,title:`Theme: dark`,group:`Theme`},{id:`dock:float`,title:`Popup: float`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:bottom`,title:`Popup: dock to the bottom`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:right`,title:`Popup: dock to the right`,group:`Popup`,keywords:`dock`,popupOnly:!0},{id:`dock:reset-size`,title:`Popup: reset the docked size`,group:`Popup`,keywords:`splitter resize height width`,popupOnly:!0},{id:`popout`,title:`Popup: open in its own window`,group:`Popup`,keywords:`pop out detach new window`,popupOnly:!0},{id:`popout:return`,title:`Popup: back into the page`,group:`Popup`,keywords:`pop in attach dock window`,popupOnly:!0}];function fT(e){let t=oT(e).map(e=>({id:`tab:${e.id}`,title:`Go to ${e.label}`,group:`Go to`,keywords:`tab open`})),n=dT.filter(t=>!t.inspector||e.inspectors[t.inspector]).map(({inspector:e,...t})=>t);return[...t,...n]}function pT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function mT(e,t){return typeof e==`boolean`?e:t}var hT=100,gT=100;function _T(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=gT);return[...new Set(t)].slice(0,hT)}function vT(e,t){let{default:n,min:r,max:i}=Kw[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function yT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function bT(e){let t=pT(e),n=pT(t.agent),r=pT(t.inspectors),i=pT(n.tools),a=pT(t.actions),o=mT(t.actions,!0),s=pT(t.redaction),c=pT(t.limits),l=yT(Hw,e=>mT(r[e],!0));return{inspectors:l,agent:{readOnly:mT(n.readOnly,!1),tools:yT(Hw,e=>l[e]&&mT(i[e],!0)),browserTools:mT(n.browserTools,!1)},actions:yT(Gw,e=>l[e]&&mT(a[e],o)),redaction:{secretNames:_T(s.secretNames),unmask:_T(s.unmask)},limits:Object.fromEntries(Object.keys(Kw).map(e=>[e,vT(c[e],e)])),popup:{hotkey:TT(pT(t.popup).hotkey)},plugins:wT(t.plugins),lint:{rules:ST(t.lint)}}}var xT=200;function ST(e){let t=pT(pT(e).rules),n={};for(let[e,r]of Object.entries(t).slice(0,xT))typeof r==`boolean`&&(n[e]=r);return n}var CT=100;function wT(e){let t={};for(let[n,r]of Object.entries(pT(e)).slice(0,CT)){if(!Xw.test(n))continue;if(typeof r==`boolean`){t[n]={enabled:r,tools:!0,actions:!0};continue}let e=pT(r);r!==void 0&&Object.keys(e).length&&(t[n]={enabled:mT(e.enabled,!0),tools:mT(e.tools,!0),actions:mT(e.actions,!0)})}return t}function TT(e){return e===!1?!1:tT(e)??`Alt+Shift+P`}function ET(e){let t=e?.configs;return bT(t?.[Qw])}function DT(e){return`${{forms:`Writing to forms`,router:`Navigating and clearing navigations`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and SSR overrides, and clearing HTTP calls`,analog:`Calling API routes and clearing server calls`,components:`Editing component properties and signals`,tanstackQuery:`Invalidating and refetching TanStack queries`,plugins:`Running plugin actions`}[e]} is turned off in the devtools config (actions.${e}).`}var OT=[`pangular:build-meta`],kT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,tanstackQuery:`TanStack Query`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`,capacitor:`Capacitor`,errors:`Errors`,plugins:`Plugins`},AT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`,components:`Component edits`,tanstackQuery:`TanStack Query invalidate and refetch`,plugins:`Plugin actions`},jT={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`,idleAfterMs:e=>e?`idle ${e/1e3} s after the last agent call`:`never idle`};function MT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=Hw.filter(t=>e.inspectors[t]);n(`Inspectors off`,Hw.filter(t=>!e.inspectors[t]).map(e=>kT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>kT[e])),n(`Blocked actions`,Gw.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>AT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(Kw).filter(t=>e.limits[t]!==Kw[t].default).map(t=>jT[t](e.limits[t]))),e.popup.hotkey!==`Alt+Shift+P`&&n(`Popup shortcut`,[e.popup.hotkey===!1?`Off`:e.popup.hotkey]);let i=Object.entries(e.plugins??{});return n(`Plugins off`,i.filter(([,e])=>!e.enabled).map(([e])=>e)),n(`Plugin tools or actions off`,i.filter(([,e])=>e.enabled&&(!e.tools||!e.actions)).map(([e,t])=>`${e} (${[!t.tools&&`tools`,!t.actions&&`actions`].filter(Boolean).join(`, `)})`)),n(`Lint rules off`,Object.entries(e.lint?.rules??{}).filter(([,e])=>!e).map(([e])=>e)),t}function NT(e){let t={tags:[],directives:[],text:``},n=e.toLowerCase();return n=n.replace(/<\s*([^<>\s]+)\s*>/g,(e,n)=>(t.tags.push({value:n,exact:!0}),` `)),n=n.replace(/\[\s*([^[\]\s]+)\s*\]/g,(e,n)=>(t.directives.push({value:n,exact:!0}),` `)),n=n.replace(/(^|\s)([<[])([^<>[\]\s]*)$/,(e,n,r,i)=>(i&&(r===`<`?t.tags:t.directives).push({value:i,exact:!1}),n)),t.text=n.replace(/\s+/g,` `).trim(),t}function PT(e){return!e.tags.length&&!e.directives.length&&!e.text}function FT(e,t){let n=e.tag.toLowerCase(),r=(e.directives??[]).map(e=>e.toLowerCase()),i=(e.attributes??[]).map(e=>e.toLowerCase()),a=[...r,...r.map(e=>e.replace(/directive$/,``)),...i];for(let{value:e,exact:r}of t.tags)if(r?n!==e:!n.startsWith(e))return!1;for(let{value:e,exact:n}of t.directives)if(!a.some(t=>n?t===e:t.includes(e)))return!1;if(t.text){let a=t.text;if(!(e.name.toLowerCase().includes(a)||n.includes(a)||r.some(e=>e.includes(a))||i.some(e=>e.includes(a))))return!1}return!0}var IT={debugApi:{subject:`Live data`,since:`12.0`},injectorProviders:{subject:`Reading providers and environment injectors`,since:`16.2`},injectorMetadata:{subject:`The full injector tree`,since:`17.0`},isSignal:{subject:`Telling signals apart in component values`,since:`17.1`},signalGraph:{subject:`The live signal graph`,since:`20.1`},deferBlocks:{subject:`Listing @defer blocks`,since:`19.1`},forBlocks:{subject:`Listing @for blocks`,since:`22.0`},profiler:{subject:`Recording change detection`,since:`20.0`},angularProfiling:{subject:`Angular profiling`,since:`20.0`},routerInstance:{subject:`The router debug util`,since:`20.3`}};function LT(e){let t=/^(\d+)\.(\d+)/.exec(e.trim());return t?`${t[1]}.${t[2]}`:e.trim()}function RT(e){let t=/^(\d+)(?:\.(\d+))?/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0)]:null}function zT(e,t){let n=RT(e),r=RT(t);return!n||!r?!1:n[0]===r[0]?n[1]>=r[1]:n[0]>r[0]}function BT(e,t){return e?.capabilities?.[t]===!1}function VT(e,t){let n=IT[e],r=`${n.subject} needs Angular ${n.since} or later`;if(!t)return`${r}; this page's Angular version is unknown.`;let i=LT(t);return zT(t,n.since)?`${r} in a development build; this page runs Angular ${i} without it, which usually means a production build.`:`${r}; this page runs Angular ${i}.`}var HT=/^on (viewport|interaction|hover)\b/;function UT(e){let t=e.filter(e=>!/^(prefetch|hydrate) /.test(e));return t.length>0&&t.every(e=>HT.test(e))}function WT(e,t){let n=[],r=e.since>0?Math.max(0,Math.round((t-e.since)/1e3)):0;return e.state===`error`&&n.push({kind:`failed`,text:`failed to load`,label:`failed`}),(e.state===`placeholder`||e.state===`initial`)&&r*1e3>=1e4&&n.push(UT(e.triggers)?{kind:`waiting`,text:`waiting for its trigger for ${r}s`,label:`waiting ${r}s`,seconds:r}:{kind:`stuck`,text:`on its placeholder for ${r}s`,label:`stuck ${r}s`,seconds:r}),e.hydrateNever?n.push({kind:`hydrate-never`,text:`hydrate never: the server HTML stays static`,label:`hydrate never`}):e.hydration===`dehydrated`&&n.push({kind:`dehydrated`,text:`still dehydrated`,label:`dehydrated`}),n}var GT=`pangular-page-id`,KT=null;function qT(e){KT=e}function JT(){if(KT)return KT;try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(GT)||null)}catch{return null}}function YT(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 XT(e,t){return e?t?e.pages?.[t]??null:e:null}function ZT(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function QT(){return{functions:[...OT]}}function $T(e,t,n){return e?e.scope(`pangular`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function eE(e,t,n){return $T(e,t,n).then(e=>e,()=>null)}function tE(e){return e?.connectionMeta.backend===`static`}function nE(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 rE(e=globalThis){delete e.__DEVFRAME_CONNECTION__,delete e.__DEVFRAME_CONNECTION_META__}function iE(e){return e.split(`@`)[1]??``}var aE={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},oE={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},sE=eE,cE={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 lE(e){return cE[e]??e}var uE=`https://pangular-inspector.dev/security/#opt-fields-in-or-out`;async function dE(e,t){return await sE(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function fE(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 pE=/"(?:[^"\\\n]|\\.)*"|`([^`\n]*)`|\*\*/g;function mE(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(pE,(e,t)=>t??(e===`**`?``:e))}function hE(e){return ET(e?.connectionMeta)}function gE(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?[...e]:void 0}function _E(e,t){if(!t||typeof t!=`object`)return e;let n=gE(t.secretNames),r=gE(t.unmask);return!n||!r?e:{...e,redaction:{secretNames:n,unmask:r}}}function vE(e,t){return hE(e).actions[t]}var yE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,queries:`tanstackQuery`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`,capacitor:`capacitor`,errors:`errors`,plugins:`plugins`};function bE(e){return yE[e]}var xE=`https://pangular-inspector.dev/getting-started/configuration/#inspectors-and-agent-tools`;function SE(e,t){let n=yE[e];return!n||t.inspectors[n]}function CE(e,t){e&1&&(E(),Og(0,`rect`,5)(1,`rect`,6)(2,`rect`,7)(3,`rect`,8))}function wE(e,t){e&1&&(E(),Og(0,`path`,9)(1,`circle`,10)(2,`circle`,11)(3,`path`,12))}function TE(e,t){e&1&&(E(),Og(0,`path`,13)(1,`path`,14))}function EE(e,t){e&1&&(E(),Og(0,`path`,15)(1,`path`,16)(2,`path`,17))}function DE(e,t){e&1&&(E(),Og(0,`circle`,18)(1,`path`,19)(2,`circle`,20))}function OE(e,t){e&1&&(E(),Og(0,`path`,1))}function kE(e,t){e&1&&(E(),Og(0,`path`,21)(1,`path`,22)(2,`path`,23)(3,`path`,24))}function AE(e,t){e&1&&(E(),Og(0,`ellipse`,25)(1,`path`,26)(2,`path`,27))}function jE(e,t){e&1&&(E(),Og(0,`rect`,28)(1,`path`,29)(2,`path`,30)(3,`path`,31))}function ME(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,9)(2,`path`,33))}function NE(e,t){e&1&&(E(),Og(0,`path`,34)(1,`path`,35)(2,`path`,36)(3,`path`,37)(4,`circle`,38))}function PE(e,t){e&1&&(E(),Og(0,`circle`,39)(1,`path`,40))}function FE(e,t){e&1&&(E(),Og(0,`ellipse`,41)(1,`path`,42)(2,`path`,43)(3,`path`,44)(4,`path`,45))}function IE(e,t){e&1&&(E(),Og(0,`circle`,32)(1,`path`,46)(2,`path`,47))}function LE(e,t){e&1&&(E(),Og(0,`path`,2))}function RE(e,t){e&1&&(E(),Og(0,`path`,3))}function zE(e,t){e&1&&(E(),Og(0,`path`,4))}var BE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:18,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`,`M10 3h4v3a2 2 0 1 0 4 0V5h1a2 2 0 0 1 2 2v4h-2a2 2 0 1 0 0 4h2v4a2 2 0 0 1-2 2h-4v-2a2 2 0 1 0-4 0v2H7a2 2 0 0 1-2-2v-4H4a2 2 0 1 1 0-4h1V7a2 2 0 0 1 2-2h3Z`],[`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`,`M3 12h18`],[`cx`,`7`,`cy`,`12`,`r`,`2`],[`cx`,`14`,`cy`,`12`,`r`,`2`],[`d`,`M18 7v10`],[`d`,`M9 11l2 2 4-4`],[`d`,`M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3Z`],[`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`,`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`],[`cx`,`12`,`cy`,`12`,`r`,`3`],[`d`,`M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z`],[`cx`,`11`,`cy`,`5`,`rx`,`8`,`ry`,`3`],[`d`,`M3 5v6c0 1.66 3.58 3 8 3`],[`d`,`M3 11v6c0 1.66 3.58 3 8 3`],[`d`,`M21 14a4 4 0 1 1-1.2-2.85L21 12.3`],[`d`,`M21 9v3.3h-3.3`],[`d`,`M12 7v6`],[`d`,`M12 16.5v.01`]],template:function(e,t){if(e&1&&(E(),z(0,`svg`,0),j(1,CE,4,0)(2,wE,4,0)(3,TE,2,0)(4,EE,3,0)(5,DE,3,0)(6,OE,1,0,`:svg:path`,1)(7,kE,4,0)(8,AE,3,0)(9,jE,4,0)(10,ME,3,0)(11,NE,5,0)(12,PE,2,0)(13,FE,5,0)(14,IE,3,0)(15,LE,1,0,`:svg:path`,2)(16,RE,1,0,`:svg:path`,3)(17,zE,1,0,`:svg:path`,4),B()),e&2){let e;O(),M((e=t.name())===`dashboard`?1:e===`timeline`?2:e===`audit`?3:e===`components`?4:e===`routes`?5:e===`signals`?6:e===`injectors`?7:e===`store`?8:e===`forms`?9:e===`network`?10:e===`pipes`?11:e===`settings`?12:e===`queries`?13:e===`errors`?14:e===`plugins`?15:e===`analog`?16:e===`capacitor`?17:-1)}},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-shrink: 0; -}`]})},UE=(e,t)=>t.tab,WE=(e,t)=>t.label;function GE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function KE(e,t){e&1&&K(0,` Project details unavailable `)}function qE(e,t){e&1&&K(0,` Loading… `)}function JE(e,t){e&1&&(K(0,` Run `),I(1,`code`),K(2,`pangular build`),L(),K(3,` again to rebuild the report. `))}function YE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function XE(e,t){if(e&1){let e=V();I(0,`button`,12),H(`click`,function(){return w(e),T(W(2).loadMeta())}),K(1,`Try again`),L()}}function ZE(e,t){if(e&1&&(I(0,`p`,10),j(1,JE,4,0)(2,YE,1,0),L(),j(3,XE,2,0,`button`,11)),e&2){let e=W();O(),M(e.staticReport()?1:2),O(2),M(e.staticReport()?-1:3)}}function QE(e,t){e&1&&(I(0,`li`,5)(1,`span`),K(2,`Analog`),L(),K(3),L()),e&2&&(O(3),q(t))}function $E(e,t){e&1&&(I(0,`li`)(1,`span`),K(2,`Change detection`),L(),K(3),L()),e&2&&(O(3),q(t))}function eD(e,t){if(e&1&&(I(0,`span`,19),K(1),L(),I(2,`span`,20),K(3),L()),e&2){let e=W().$implicit,t=W();O(),q(t.cards()[e.tab]?.value),O(2),q(t.cards()[e.tab]?.sub)}}function tD(e,t){e&1&&(I(0,`span`,21),K(1,`–`),L(),I(2,`span`,20),K(3,`Count unavailable`),L())}function nD(e,t){e&1&&(R(0,`span`,22),I(1,`span`,20),K(2,`Counting…`),L())}function rD(e,t){if(e&1){let e=V();I(0,`button`,13),H(`click`,function(){let t=w(e).$implicit;return T(W().navigate.emit(t.tab))}),I(1,`span`,14)(2,`span`,15),R(3,`app-tab-icon`,16),L(),I(4,`span`,17),K(5,`→`),L()(),I(6,`span`,18),K(7),L(),j(8,eD,4,2)(9,tD,4,0)(10,nD,3,0),L()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);y_(`animation-delay`,60*r,`ms`),A(`aria-busy`,i===`loading`),O(3),F(`name`,n.tab),O(4),q(n.label),O(),M((e=i)===`ready`?8:e===`error`?9:10)}}function iD(e,t){e&1&&(I(0,`p`),K(1,`Loading…`),L())}function aD(e,t){if(e&1&&(I(0,`div`)(1,`dt`),K(2),L(),I(3,`dd`),K(4),L()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.value)}}function oD(e,t){if(e&1&&(I(0,`dl`),N(1,aD,5,2,`div`,null,WE),L()),e&2){let e=W();O(),P(e.configItems())}}function sD(e,t){e&1&&(I(0,`p`),K(1,`Defaults`),L())}var cD=[{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 lD(e){return cD.filter(t=>wE(t.tab,e))}var uD={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function dD(e){return e&&Object.hasOwn(uD,e)?uD[e]:null}var fD=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),pD={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 mD(e,t,n){return`${e} ${e===1?t:n}`}function hD(e,t){for(let n of e??[])t(n),hD(n.children,t)}function gD(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 · ${mD(t,`directive`,`directives`)}`}}function _D(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 · ${mD(t,`redirect`,`redirects`)}`}}function vD(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]=pD[e]??[e,e];return mD(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function yD(e,t){let n=e?.forms??[],r=t?n.filter(e=>oE(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 bD(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function xD(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(bD).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var SD=class e{rpc=$(null);navigate=bv();staticReport=X(()=>rE(this.rpc()));meta=D(null);redaction=D(null);config=X(()=>yE(_E(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?lD(this.config()):[]);configItems=X(()=>PT(this.config()));metaState=D(`loading`);states=D({});rows=D({});injectorTree=D(null);signalGraph=D(null);formsState=D(null);httpState=D(null);pageId=XT();destroyRef=C(As);stopLive=[];zone=X(()=>dD(QT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=QT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return hD(e.roots,r),hD(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=$T(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>fD.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=gD(e.components)),e.routes&&(t.routes=_D(e.routes)),e.store&&(t.store=vD(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 · ${mD(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=yD(i,this.pageId));let a=this.httpState();return a&&(t.network=xD(a,this.pageId)),t});loadMeta(e=this.rpc()){e&&(this.metaState.set(`loading`),e.scope(`pangular`).rpc.call(`build-meta`).then(t=>{this.rpc()===e&&(this.meta.set(t),this.metaState.set(`ready`))}).catch(()=>{this.rpc()===e&&this.metaState.set(`error`)}))}loadRedaction(e){this.redaction.set(null),!rE(e)&&tE(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}constructor(){_c(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`pangular`);this.states.set({}),this.rows.set({}),this.formsState.set(null),this.httpState.set(null),this.loadMeta(e),this.loadRedaction(e);let n=_E(e),r=e=>wE(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)),wE(`forms`,t)&&r(`forms`,e=>this.formsState.set(e??{}),`forms`),wE(`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=k({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,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[1,`hint`],[`type`,`button`,1,`retry`],[`type`,`button`,1,`retry`,3,`click`],[`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&&(I(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),L(),I(4,`h2`,3),j(5,GE,1,1)(6,KE,1,0)(7,qE,1,0),L(),j(8,ZE,4,2),L(),I(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),L(),K(13),L(),I(14,`li`)(15,`span`),K(16,`TypeScript`),L(),K(17),L(),I(18,`li`)(19,`span`),K(20,`SSR`),L(),K(21),L(),j(22,QE,4,1,`li`,5),j(23,$E,4,1,`li`),L()(),I(24,`div`,6),N(25,rD,11,6,`button`,7,UE),L(),I(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),L(),j(30,iD,2,0,`p`)(31,oD,3,0,`dl`)(32,sD,2,0,`p`),L()),e&2){let e,n,r;A(`aria-busy`,t.metaState()===`loading`),O(4),G(`muted`,t.metaState()!==`ready`),O(),M((e=t.metaState())===`ready`?5:e===`error`?6:7),O(3),M(t.metaState()===`error`?8:-1),O(),G(`pending`,t.metaState()===`loading`),O(4),q(t.meta()?.angularVersion??`…`),O(4),q(t.meta()?.typescript??`…`),O(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),O(),M((n=t.meta()?.analog)?22:-1,n),O(),M((r=t.zone())?23:-1,r),O(2),P(t.stats()),O(2),A(`aria-busy`,!t.rpc()),O(3),M(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[HE],styles:[`[_nghost-%COMP%] { +}`]})},VE=(e,t)=>t.tab,HE=(e,t)=>t.label;function UE(e,t){e&1&&K(0),e&2&&J(` `,W().meta()?.projectName,` `)}function WE(e,t){e&1&&K(0,` Project details unavailable `)}function GE(e,t){e&1&&K(0,` Loading… `)}function KE(e,t){e&1&&(K(0,` Run `),I(1,`code`),K(2,`pangular build`),L(),K(3,` again to rebuild the report. `))}function qE(e,t){e&1&&K(0,` Check that the dev server is running. `)}function JE(e,t){if(e&1){let e=V();I(0,`button`,12),H(`click`,function(){return w(e),T(W(2).loadMeta())}),K(1,`Try again`),L()}}function YE(e,t){if(e&1&&(I(0,`p`,10),j(1,KE,4,0)(2,qE,1,0),L(),j(3,JE,2,0,`button`,11)),e&2){let e=W();O(),M(e.staticReport()?1:2),O(2),M(e.staticReport()?-1:3)}}function XE(e,t){e&1&&(I(0,`li`,5)(1,`span`),K(2,`Analog`),L(),K(3),L()),e&2&&(O(3),q(t))}function ZE(e,t){e&1&&(I(0,`li`)(1,`span`),K(2,`Change detection`),L(),K(3),L()),e&2&&(O(3),q(t))}function QE(e,t){if(e&1&&(I(0,`span`,19),K(1),L(),I(2,`span`,20),K(3),L()),e&2){let e=W().$implicit,t=W();O(),q(t.cards()[e.tab]?.value),O(2),q(t.cards()[e.tab]?.sub)}}function $E(e,t){e&1&&(I(0,`span`,21),K(1,`–`),L(),I(2,`span`,20),K(3,`Count unavailable`),L())}function eD(e,t){e&1&&(R(0,`span`,22),I(1,`span`,20),K(2,`Counting…`),L())}function tD(e,t){if(e&1){let e=V();I(0,`button`,13),H(`click`,function(){let t=w(e).$implicit;return T(W().navigate.emit(t.tab))}),I(1,`span`,14)(2,`span`,15),R(3,`app-tab-icon`,16),L(),I(4,`span`,17),K(5,`→`),L()(),I(6,`span`,18),K(7),L(),j(8,QE,4,2)(9,$E,4,0)(10,eD,3,0),L()}if(e&2){let e,n=t.$implicit,r=t.$index,i=W().stateOf(n.tab);y_(`animation-delay`,60*r,`ms`),A(`aria-busy`,i===`loading`),O(3),F(`name`,n.tab),O(4),q(n.label),O(),M((e=i)===`ready`?8:e===`error`?9:10)}}function nD(e,t){e&1&&(I(0,`p`),K(1,`Loading…`),L())}function rD(e,t){if(e&1&&(I(0,`div`)(1,`dt`),K(2),L(),I(3,`dd`),K(4),L()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.value)}}function iD(e,t){if(e&1&&(I(0,`dl`),N(1,rD,5,2,`div`,null,HE),L()),e&2){let e=W();O(),P(e.configItems())}}function aD(e,t){e&1&&(I(0,`p`),K(1,`Defaults`),L())}var oD=[{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 sD(e){return oD.filter(t=>SE(t.tab,e))}var cD={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function lD(e){return e&&Object.hasOwn(cD,e)?cD[e]:null}var uD=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),dD={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 fD(e,t,n){return`${e} ${e===1?t:n}`}function pD(e,t){for(let n of e??[])t(n),pD(n.children,t)}function mD(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 · ${fD(t,`directive`,`directives`)}`}}function hD(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 · ${fD(t,`redirect`,`redirects`)}`}}function gD(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]=dD[e]??[e,e];return fD(t,n,r)});return{value:e.length,sub:n.join(` · `)}}function _D(e,t){let n=e?.forms??[],r=t?n.filter(e=>iE(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 vD(e){return e.cancelled||e.status===void 0?!1:e.status===0||e.status>=400}function yD(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(vD).length;return{value:o.length,sub:`${o.length===1?`call`:`calls`} · ${s} failed`}}var bD=class e{rpc=$(null);navigate=vv();staticReport=X(()=>tE(this.rpc()));meta=D(null);redaction=D(null);config=X(()=>_E(hE(this.rpc()),this.redaction()));stats=X(()=>this.rpc()?sD(this.config()):[]);configItems=X(()=>MT(this.config()));metaState=D(`loading`);states=D({});rows=D({});injectorTree=D(null);signalGraph=D(null);formsState=D(null);httpState=D(null);pageId=JT();destroyRef=C(As);stopLive=[];zone=X(()=>lD(XT(this.injectorTree(),this.pageId)?.zone));liveInjectors=X(()=>{let e=XT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return pD(e.roots,r),pD(e.environment,r),{injectors:t,providers:n}});liveSignals=X(()=>{let e=ZT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>uD.has(e.kind??``)).length:null});cards=X(()=>{let e=this.rows(),t={};if(e.components&&(t.components=mD(e.components)),e.routes&&(t.routes=hD(e.routes)),e.store&&(t.store=gD(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 · ${fD(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=_D(i,this.pageId));let a=this.httpState();return a&&(t.network=yD(a,this.pageId)),t});loadMeta(e=this.rpc()){e&&(this.metaState.set(`loading`),e.scope(`pangular`).rpc.call(`build-meta`).then(t=>{this.rpc()===e&&(this.meta.set(t),this.metaState.set(`ready`))}).catch(()=>{this.rpc()===e&&this.metaState.set(`error`)}))}loadRedaction(e){this.redaction.set(null),!tE(e)&&$T(e,`redaction-config`).then(t=>{this.rpc()===e&&this.redaction.set(t)}).catch(()=>{})}constructor(){_c(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`pangular`);this.states.set({}),this.rows.set({}),this.formsState.set(null),this.httpState.set(null),this.loadMeta(e),this.loadRedaction(e);let n=hE(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=k({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,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[1,`hint`],[`type`,`button`,1,`retry`],[`type`,`button`,1,`retry`,3,`click`],[`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&&(I(0,`section`,0)(1,`div`,1)(2,`p`,2),K(3,`Project`),L(),I(4,`h2`,3),j(5,UE,1,1)(6,WE,1,0)(7,GE,1,0),L(),j(8,YE,4,2),L(),I(9,`ul`,4)(10,`li`)(11,`span`),K(12,`Angular`),L(),K(13),L(),I(14,`li`)(15,`span`),K(16,`TypeScript`),L(),K(17),L(),I(18,`li`)(19,`span`),K(20,`SSR`),L(),K(21),L(),j(22,XE,4,1,`li`,5),j(23,ZE,4,1,`li`),L()(),I(24,`div`,6),N(25,tD,11,6,`button`,7,VE),L(),I(27,`section`,8)(28,`h2`,9),K(29,`Configuration`),L(),j(30,nD,2,0,`p`)(31,iD,3,0,`dl`)(32,aD,2,0,`p`),L()),e&2){let e,n,r;A(`aria-busy`,t.metaState()===`loading`),O(4),G(`muted`,t.metaState()!==`ready`),O(),M((e=t.metaState())===`ready`?5:e===`error`?6:7),O(3),M(t.metaState()===`error`?8:-1),O(),G(`pending`,t.metaState()===`loading`),O(4),q(t.meta()?.angularVersion??`…`),O(4),q(t.meta()?.typescript??`…`),O(4),q(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),O(),M((n=t.meta()?.analog)?22:-1,n),O(),M((r=t.zone())?23:-1,r),O(2),P(t.stats()),O(2),A(`aria-busy`,!t.rpc()),O(3),M(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[BE],styles:[`[_nghost-%COMP%] { display: block; max-width: 1200px; } @@ -325,7 +325,7 @@ h2.muted[_ngcontent-%COMP%] { .skeleton[_ngcontent-%COMP%] { animation: none; } -}`]})},CD=`pangular:panel-action-result`,wD=6e3,TD=0;function ED(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function DD(e,t=window){let n=`pa-${Date.now().toString(36)}-${++TD}`;return new Promise(r=>{let i=e=>{t.clearTimeout(o),t.removeEventListener(`message`,a),r(e)},a=({source:e,origin:r,data:a})=>{if(e!==t.parent||r!==t.location.origin)return;let o=a;if(o?.type!==CD||o.requestId!==n)return;let{opened:s,error:c}=a;i({ok:o.ok===!0,...s===`file`||s===`class`?{opened:s}:{},...typeof c==`string`?{error:c}:{}})},o=t.setTimeout(()=>i({ok:!1,error:`timeout`}),wD);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var OD=class e{available=ED();reveal(e,t){return DD({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return DD({type:`pangular:open-source`,pageId:e,id:t,...n?{file:n.file,line:n.line}:{}})}static ɵfac=function(t){return new(t||e)};static ɵprov=Rl({token:e,factory:e.ɵfac})};function kD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function AD(e){let t=C(As),n=D({}),r=null,i=null,a=async e=>{i?.(),i=null,r=e;try{let a=await e.scope(`pangular`).rpc.sharedState(`page-angular`);if(t.destroyed||r!==e)return;let o=e=>n.set(kD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return _c(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function jD(e,t){if(t)return e[t]??null;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n}var MD=[`*`];function ND(e,t){if(e&1&&(z(0,`div`,1)(1,`p`,2),K(2),B(),z(3,`p`,3),K(4),Jg(5),z(6,`a`,4),K(7,`Supported versions`),B()()()),e&2){let e=W();G(`compact`,e.compact()),O(2),q(e.title()),O(2),J(` `,t,` `),O(2),Pg(`href`,e.docsUrl,ku)}}var PD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,FD=class e{page=$(null);capability=$.required();missing=$(!1,{transform:jv});compact=$(!1,{transform:jv});docsUrl=PD;text=X(()=>{let e=this.page();return!this.missing()&&!HT(e,this.capability())?null:UT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${zT(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:MD,decls:1,vars:1,consts:[[`role`,`status`,1,`unavailable`,3,`compact`],[`role`,`status`,1,`unavailable`],[1,`title`],[1,`hint`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){if(e&1&&(qg(),j(0,ND,8,5,`div`,0)),e&2){let e;M((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})},xD=`pangular:panel-action-result`,SD=6e3,CD=0;function wD(e=window){return e.location.protocol===`chrome-extension:`&&e.parent!==e}function TD(e,t=window){let n=`pa-${Date.now().toString(36)}-${++CD}`;return new Promise(r=>{let i=e=>{t.clearTimeout(o),t.removeEventListener(`message`,a),r(e)},a=({source:e,origin:r,data:a})=>{if(e!==t.parent||r!==t.location.origin)return;let o=a;if(o?.type!==xD||o.requestId!==n)return;let{opened:s,error:c}=a;i({ok:o.ok===!0,...s===`file`||s===`class`?{opened:s}:{},...typeof c==`string`?{error:c}:{}})},o=t.setTimeout(()=>i({ok:!1,error:`timeout`}),SD);t.addEventListener(`message`,a),t.parent.postMessage({...e,requestId:n},t.location.origin)})}var ED=class e{available=wD();reveal(e,t){return TD({type:`pangular:reveal-element`,pageId:e,id:t})}openSource(e,t,n){return TD({type:`pangular:open-source`,pageId:e,id:t,...n?{file:n.file,line:n.line}:{}})}static ɵfac=function(t){return new(t||e)};static ɵprov=Rl({token:e,factory:e.ɵfac})};function DD(e){let t=e?.pages;return t&&typeof t==`object`?t:{}}function OD(e){let t=C(As),n=D({}),r=null,i=null,a=async e=>{i?.(),i=null,r=e;try{let a=await e.scope(`pangular`).rpc.sharedState(`page-angular`);if(t.destroyed||r!==e)return;let o=e=>n.set(DD(e));o(a.value()),i=a.on(`updated`,o)}catch{r===e&&n.set({})}};return _c(()=>{let t=e();t&&t!==r&&Z(()=>void a(t))}),t.onDestroy(()=>i?.()),n.asReadonly()}function kD(e,t){if(t)return e[t]??null;let n=null;for(let t of Object.values(e))(!n||t.reportedAt>n.reportedAt)&&(n=t);return n}var AD=[`*`];function jD(e,t){if(e&1&&(z(0,`div`,1)(1,`p`,2),K(2),B(),z(3,`p`,3),K(4),Jg(5),z(6,`a`,4),K(7,`Supported versions`),B()()()),e&2){let e=W();G(`compact`,e.compact()),O(2),q(e.title()),O(2),J(` `,t,` `),O(2),Pg(`href`,e.docsUrl,ku)}}var MD=`https://pangular-inspector.dev/getting-started/installation/#supported-angular-versions`,ND=class e{page=$(null);capability=$.required();missing=$(!1,{transform:kv});compact=$(!1,{transform:kv});docsUrl=MD;text=X(()=>{let e=this.page();return!this.missing()&&!BT(e,this.capability())?null:VT(this.capability(),e?.version)});title=X(()=>{let e=this.page()?.version;return e?`Not available on Angular ${LT(e)}`:`Not available on this page`});static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-angular-unavailable`]],inputs:{page:[1,`page`],capability:[1,`capability`],missing:[1,`missing`],compact:[1,`compact`]},ngContentSelectors:AD,decls:1,vars:1,consts:[[`role`,`status`,1,`unavailable`,3,`compact`],[`role`,`status`,1,`unavailable`],[1,`title`],[1,`hint`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){if(e&1&&(qg(),j(0,jD,8,5,`div`,0)),e&2){let e;M((e=t.text())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -372,7 +372,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})};function ID(e){return e?.platform===`angular-native`}function LD(e){return ID(e)||e?.platform===`nativescript`}function RD(e,t){let n=Object.values(e??{}).filter(ID);if(t&&n.some(e=>e.pageId===t))return t;let r=null;for(let e of n)(!r||e.reportedAt>r.reportedAt)&&(r=e);return r?.pageId??null}var zD=[`trigger`],BD=[`list`],VD=(e,t)=>t.value;function HD(e,t){if(e&1&&(z(0,`span`,4),K(1),B()),e&2){let e=W();O(),q(e.current().hint)}}function UD(e,t){if(e&1&&(z(0,`span`,15),K(1),B()),e&2){let e=W().$implicit;O(),q(e.hint)}}function WD(e,t){if(e&1){let e=V();z(0,`li`,11),U(`pointerenter`,function(){let t=w(e).$index;return T(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=w(e).$index;return T(W(2).choose(t))}),E(),z(1,`svg`,12),Og(2,`path`,13),B(),bs(),z(3,`span`,14),K(4),B(),j(5,UD,2,1,`span`,15),B()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),A(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),O(4),q(e.label),O(),M(e.hint?5:-1)}}function GD(e,t){if(e&1&&(z(0,`li`,10),K(1),B()),e&2){let e=W(2);O(),q(e.emptyText())}}function KD(e,t){if(e&1&&(z(0,`ul`,8,1),ig(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),N(2,WD,6,9,`li`,9,VD,!1,GD,2,1,`li`,10),B()),e&2){let e=W();G(`up`,e.dropUp()),A(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),O(2),P(e.options())}}var qD=0,JD=class e{options=$.required();value=Tv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++qD}`;open=D(!1);active=D(-1);dropUp=D(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=C(Vl);injector=C(Os);trigger=Dv.required(`trigger`);list=Dv(`list`);typed=``;typedAt=0;toggle(){this.open()?this.close():this.show()}choose(e){let t=this.options()[e];t&&!t.disabled&&(this.value.set(t.value),this.close(),this.trigger().nativeElement.focus())}onKey(e){let t=this.options(),n=this.open();switch(e.key){case`ArrowDown`:case`ArrowUp`:if(e.preventDefault(),!n){this.show();return}this.move(e.key===`ArrowDown`?1:-1);return;case`Home`:case`End`:if(!n)return;e.preventDefault(),this.setActive(e.key===`Home`?this.firstEnabled(0,1):this.firstEnabled(t.length-1,-1));return;case`Enter`:case` `:e.preventDefault(),n&&this.active()>=0?this.choose(this.active()):this.show();return;case`Escape`:if(!n)return;e.preventDefault(),e.stopPropagation(),this.close();return;case`Tab`:n&&this.close();return;default:e.key.length===1&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&this.typeAhead(e.key)}}onBlur(e){let t=e.relatedTarget;t&&this.host.nativeElement.contains(t)||this.close()}onOutside(e){this.open()&&!this.host.nativeElement.contains(e.target)&&this.close()}show(){if(this.disabled())return;let e=this.host.nativeElement.getBoundingClientRect(),t=window.innerHeight-e.bottom;this.dropUp.set(t<220&&e.top>t);let n=this.options().findIndex(e=>e.value===this.value());this.open.set(!0),this.setActive(n>=0?n:this.firstEnabled(0,1))}close(){this.open.set(!1),this.active.set(-1)}move(e){let t=this.firstEnabled(this.active()+e,e);t>=0&&this.setActive(t)}firstEnabled(e,t){let n=this.options();for(let r=e;r>=0&&r{(this.list()?.nativeElement.querySelector(`#${this.uid}-opt-${e}`))?.scrollIntoView({block:`nearest`})},{injector:this.injector})}typeAhead(e){let t=performance.now();this.typed=t-this.typedAt>600?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=this.options().findIndex(e=>!e.disabled&&e.label.toLowerCase().startsWith(this.typed));n<0||(this.open()?this.setActive(n):this.value.set(this.options()[n].value))}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Xg(t.trigger,zD,5)(t.list,BD,5),e&2&&Zg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},ju),e&2&&G(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],describedBy:[1,`describedBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:13,consts:[[`trigger`,``],[`list`,``],[`type`,`button`,`role`,`combobox`,`aria-haspopup`,`listbox`,1,`trigger`,3,`click`,`keydown`,`blur`,`disabled`],[1,`value`],[1,`value-hint`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m6 9 6 6 6-6`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`up`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`pointerdown`],[`role`,`option`,3,`active`,`selected`],[`role`,`option`,`aria-disabled`,`true`,1,`empty`],[`role`,`option`,3,`pointerenter`,`pointerdown`,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`check`],[`d`,`m5 12 5 5 9-10`],[1,`label`],[1,`hint`]],template:function(e,t){e&1&&(z(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),z(2,`span`,3),K(3),B(),j(4,HD,2,1,`span`,4),E(),z(5,`svg`,5),Og(6,`path`,6),B()(),j(7,KD,5,5,`ul`,7)),e&2&&(Pg(`disabled`,t.disabled()),A(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-describedby`,t.describedBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),O(2),G(`placeholder`,!t.current()),O(),J(` `,t.current()?.label??t.placeholder(),` `),O(),M(t.current()?.hint?4:-1),O(3),M(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function PD(e){return e?.platform===`angular-native`}function FD(e){return PD(e)||e?.platform===`nativescript`}function ID(e,t){let n=Object.values(e??{}).filter(PD);if(t&&n.some(e=>e.pageId===t))return t;let r=null;for(let e of n)(!r||e.reportedAt>r.reportedAt)&&(r=e);return r?.pageId??null}var LD=[`trigger`],RD=[`list`],zD=(e,t)=>t.value;function BD(e,t){if(e&1&&(z(0,`span`,4),K(1),B()),e&2){let e=W();O(),q(e.current().hint)}}function VD(e,t){if(e&1&&(z(0,`span`,15),K(1),B()),e&2){let e=W().$implicit;O(),q(e.hint)}}function HD(e,t){if(e&1){let e=V();z(0,`li`,11),U(`pointerenter`,function(){let t=w(e).$index;return T(W(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=w(e).$index;return T(W(2).choose(t))}),E(),z(1,`svg`,12),Og(2,`path`,13),B(),bs(),z(3,`span`,14),K(4),B(),j(5,VD,2,1,`span`,15),B()}if(e&2){let e=t.$implicit,n=t.$index,r=W(2);G(`active`,n===r.active())(`selected`,e.value===r.value()),A(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),O(4),q(e.label),O(),M(e.hint?5:-1)}}function UD(e,t){if(e&1&&(z(0,`li`,10),K(1),B()),e&2){let e=W(2);O(),q(e.emptyText())}}function WD(e,t){if(e&1&&(z(0,`ul`,8,1),ig(`list-in`),U(`pointerdown`,function(e){return e.preventDefault()}),N(2,HD,6,9,`li`,9,zD,!1,UD,2,1,`li`,10),B()),e&2){let e=W();G(`up`,e.dropUp()),A(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),O(2),P(e.options())}}var GD=0,KD=class e{options=$.required();value=Cv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);describedBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++GD}`;open=D(!1);active=D(-1);dropUp=D(!1);current=X(()=>this.options().find(e=>e.value===this.value())??null);host=C(Vl);injector=C(Os);trigger=Tv.required(`trigger`);list=Tv(`list`);typed=``;typedAt=0;toggle(){this.open()?this.close():this.show()}choose(e){let t=this.options()[e];t&&!t.disabled&&(this.value.set(t.value),this.close(),this.trigger().nativeElement.focus())}onKey(e){let t=this.options(),n=this.open();switch(e.key){case`ArrowDown`:case`ArrowUp`:if(e.preventDefault(),!n){this.show();return}this.move(e.key===`ArrowDown`?1:-1);return;case`Home`:case`End`:if(!n)return;e.preventDefault(),this.setActive(e.key===`Home`?this.firstEnabled(0,1):this.firstEnabled(t.length-1,-1));return;case`Enter`:case` `:e.preventDefault(),n&&this.active()>=0?this.choose(this.active()):this.show();return;case`Escape`:if(!n)return;e.preventDefault(),e.stopPropagation(),this.close();return;case`Tab`:n&&this.close();return;default:e.key.length===1&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&this.typeAhead(e.key)}}onBlur(e){let t=e.relatedTarget;t&&this.host.nativeElement.contains(t)||this.close()}onOutside(e){this.open()&&!this.host.nativeElement.contains(e.target)&&this.close()}show(){if(this.disabled())return;let e=this.host.nativeElement.getBoundingClientRect(),t=window.innerHeight-e.bottom;this.dropUp.set(t<220&&e.top>t);let n=this.options().findIndex(e=>e.value===this.value());this.open.set(!0),this.setActive(n>=0?n:this.firstEnabled(0,1))}close(){this.open.set(!1),this.active.set(-1)}move(e){let t=this.firstEnabled(this.active()+e,e);t>=0&&this.setActive(t)}firstEnabled(e,t){let n=this.options();for(let r=e;r>=0&&r{(this.list()?.nativeElement.querySelector(`#${this.uid}-opt-${e}`))?.scrollIntoView({block:`nearest`})},{injector:this.injector})}typeAhead(e){let t=performance.now();this.typed=t-this.typedAt>600?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=this.options().findIndex(e=>!e.disabled&&e.label.toLowerCase().startsWith(this.typed));n<0||(this.open()?this.setActive(n):this.value.set(this.options()[n].value))}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&Xg(t.trigger,LD,5)(t.list,RD,5),e&2&&Zg(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&H(`pointerdown`,function(e){return t.onOutside(e)},ju),e&2&&G(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],describedBy:[1,`describedBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:13,consts:[[`trigger`,``],[`list`,``],[`type`,`button`,`role`,`combobox`,`aria-haspopup`,`listbox`,1,`trigger`,3,`click`,`keydown`,`blur`,`disabled`],[1,`value`],[1,`value-hint`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m6 9 6 6 6-6`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`up`],[`role`,`listbox`,`tabindex`,`-1`,1,`list`,3,`pointerdown`],[`role`,`option`,3,`active`,`selected`],[`role`,`option`,`aria-disabled`,`true`,1,`empty`],[`role`,`option`,3,`pointerenter`,`pointerdown`,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`check`],[`d`,`m5 12 5 5 9-10`],[1,`label`],[1,`hint`]],template:function(e,t){e&1&&(z(0,`button`,2,0),U(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),z(2,`span`,3),K(3),B(),j(4,BD,2,1,`span`,4),E(),z(5,`svg`,5),Og(6,`path`,6),B()(),j(7,WD,5,5,`ul`,7)),e&2&&(Pg(`disabled`,t.disabled()),A(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-describedby`,t.describedBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),O(2),G(`placeholder`,!t.current()),O(),J(` `,t.current()?.label??t.placeholder(),` `),O(),M(t.current()?.hint?4:-1),O(3),M(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { position: relative; display: inline-flex; min-width: 0; @@ -567,7 +567,7 @@ li.selected[_ngcontent-%COMP%] .check[_ngcontent-%COMP%] { .chevron[_ngcontent-%COMP%] { transition: none; } -}`]})};function YD(e,t){let n=FT(t);if(IT(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=LT(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function XD(e){return e.flatMap(e=>e.kind===`directive`?XD(e.children):[{...e,children:XD(e.children)}])}function ZD(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var QD={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function $D(e){return QD[e]}function eO(e,t,n,r=!1,i=0){let a=r?`${e}+`:`${e}`;if(n)return`${t} of ${r?`${e+i}+`:e+i}`;let o=i?` · ${i} directive ${i===1?`host`:`hosts`}`:``;return`${a} ${e===1&&!r?`instance`:`instances`}${o}`}function tO(e,t,n,r=!1,i=0){if(!n.trim())return``;if(!t)return`No components match.`;let a=e+i,o=r?`${a}+`:`${a}`,s=!r&&a===1;return`${t} of ${o} ${i?s?`row`:`rows`:s?`instance`:`instances`} match.`}function nO(e){let t=e?.components,n=e?.depth;return t&&n?`Showing the first ${t} component instances, and none nested more than ${n} elements deep. Others are not listed or searchable.`:t?`Showing the first ${t} component instances. Others are not listed or searchable.`:n?`Components nested more than ${n} elements deep are not listed or searchable.`:`The page has more components than the tree shows.`}function rO(e,t){let n=t?.detail?.id??null,r=t?.pageId??null;if(r!==e.pageId)return{pageId:r,selectedId:n,detailId:n,destroyed:null};let i=e.selectedId;return n&&n!==e.detailId&&n!==i&&(i=n),i&&t&&!t.truncated&&!iO(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function iO(e,t){return e.some(e=>e.id===t||iO(e.children,t))}function aO(e,t,n){let r=e.indexOf(n);if(r<0)return null;for(let n=r+1;n=0;n--)if(t.has(e[n]))return e[n];return null}var oO=(e,t)=>t.key,sO=(e,t)=>t.id;function cO(e,t){e&1&&(z(0,`p`,2),K(1,` The HTML came from the server, but no component was hydrated, so the app rendered again on the client. Add `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,` and use a development build to see each component's status. `),B())}function lO(e,t){if(e&1&&(z(0,`li`)(1,`span`,9),K(2),B(),K(3),B()),e&2){let e=t.$implicit;b_(`count count-`+e.key),O(2),q(e.value),O(),J(` `,e.label,` `)}}function uO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Expected `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.expected)}}function dO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Found `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.actual)}}function fO(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,12),U(`click`,function(){let t=w(e).$implicit;return T(W(4).showNode.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(4).highlight.emit(null))}),z(2,`span`,13),K(3),B(),z(4,`span`,14),K(5),B(),j(6,uO,4,1,`span`,15),j(7,dO,4,1,`span`,15),B()()}if(e&2){let e=t.$implicit;O(3),q(e.name),O(2),J(`<`,e.tag,`>`),O(),M(e.expected?6:-1),O(),M(e.actual?7:-1)}}function pO(e,t){if(e&1&&(z(0,`h3`,10),K(1,`Mismatches`),B(),z(2,`ul`,11),N(3,fO,8,4,`li`,null,sO),B()),e&2){let e=W(2);O(3),P(e.mismatches)}}function mO(e,t){if(e&1){let e=V();z(0,`div`,3)(1,`ul`,4),N(2,lO,4,4,`li`,5,oO),B(),z(4,`button`,6),U(`click`,function(){return w(e),T(W(2).toggleOverlay())}),E(),z(5,`svg`,7),Og(6,`rect`,8),B(),K(7,` Outline on page `),B()(),j(8,pO,5,0)}if(e&2){let e=W(),t=W();O(2),P(t.counts()),O(2),A(`aria-pressed`,t.overlayOn()),O(4),M(e.mismatches.length?8:-1)}}function hO(e,t){e&1&&j(0,cO,5,0,`p`,2)(1,mO,9,2),e&2&&M(+!!t.hydrated)}function gO(e,t){e&1&&(z(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),B())}var _O=class e{report=$(void 0);overlay=bv();showNode=bv();highlight=bv();overlayOn=Q(()=>this.report()?.overlay===!0);counts=X(()=>{let e=this.report()?.counts;return e?[{key:`hydrated`,label:`hydrated`,value:e.hydrated},{key:`skipped`,label:`skipped`,value:e.skipped},{key:`mismatched`,label:`mismatched`,value:e.mismatched},{key:`client`,label:`created on the client`,value:e.client},{key:`dehydratedBlocks`,label:e.dehydratedBlocks===1?`dehydrated @defer block`:`dehydrated @defer blocks`,value:e.dehydratedBlocks}]:[]});toggleOverlay(){let e=!this.overlayOn();this.overlayOn.set(e),this.overlay.emit(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-hydration-section`]],inputs:{report:[1,`report`]},outputs:{overlay:`overlay`,showNode:`showNode`,highlight:`highlight`},decls:5,vars:1,consts:[[`aria-labelledby`,`ct-hydration-title`,1,`hydration`],[`id`,`ct-hydration-title`,1,`title`],[1,`empty`],[1,`summary`],[`aria-label`,`Hydration summary`,1,`counts`],[3,`class`],[`type`,`button`,1,`outline`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`18`,`height`,`18`,`rx`,`2`,`stroke-dasharray`,`4 3`],[1,`num`],[1,`label`],[1,`mismatches`],[`type`,`button`,1,`mismatch`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`mono`,`muted`],[1,`detail-line`]],template:function(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),B(),j(3,hO,2,1)(4,gO,5,0,`p`,2),B()),e&2){let e;O(3),M((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { +}`]})};function qD(e,t){let n=NT(t);if(PT(n))return{nodes:e,matches:0};let r=0,i=e=>e.flatMap(e=>{let t=FT(e,n);t&&r++;let a=i(e.children);return t||a.length?[{...e,children:a}]:[]});return{nodes:i(e),matches:r}}function JD(e){return e.flatMap(e=>e.kind===`directive`?JD(e.children):[{...e,children:JD(e.children)}])}function YD(e){return(e.attributes?.length?e.attributes:e.directives??[e.name]).map(e=>`[${e}]`).join(` `)}var XD={hydrated:`Hydrated`,skipped:`Skipped`,mismatched:`Mismatch`,client:`Client`};function ZD(e){return XD[e]}function QD(e,t,n,r=!1,i=0){let a=r?`${e}+`:`${e}`;if(n)return`${t} of ${r?`${e+i}+`:e+i}`;let o=i?` · ${i} directive ${i===1?`host`:`hosts`}`:``;return`${a} ${e===1&&!r?`instance`:`instances`}${o}`}function $D(e,t,n,r=!1,i=0){if(!n.trim())return``;if(!t)return`No components match.`;let a=e+i,o=r?`${a}+`:`${a}`,s=!r&&a===1;return`${t} of ${o} ${i?s?`row`:`rows`:s?`instance`:`instances`} match.`}function eO(e){let t=e?.components,n=e?.depth;return t&&n?`Showing the first ${t} component instances, and none nested more than ${n} elements deep. Others are not listed or searchable.`:t?`Showing the first ${t} component instances. Others are not listed or searchable.`:n?`Components nested more than ${n} elements deep are not listed or searchable.`:`The page has more components than the tree shows.`}function tO(e,t){let n=t?.detail?.id??null,r=t?.pageId??null;if(r!==e.pageId)return{pageId:r,selectedId:n,detailId:n,destroyed:null};let i=e.selectedId;return n&&n!==e.detailId&&n!==i&&(i=n),i&&t&&!t.truncated&&!nO(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function nO(e,t){return e.some(e=>e.id===t||nO(e.children,t))}function rO(e,t,n){let r=e.indexOf(n);if(r<0)return null;for(let n=r+1;n=0;n--)if(t.has(e[n]))return e[n];return null}var iO=(e,t)=>t.key,aO=(e,t)=>t.id;function oO(e,t){e&1&&(z(0,`p`,2),K(1,` The HTML came from the server, but no component was hydrated, so the app rendered again on the client. Add `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,` and use a development build to see each component's status. `),B())}function sO(e,t){if(e&1&&(z(0,`li`)(1,`span`,9),K(2),B(),K(3),B()),e&2){let e=t.$implicit;b_(`count count-`+e.key),O(2),q(e.value),O(),J(` `,e.label,` `)}}function cO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Expected `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.expected)}}function lO(e,t){if(e&1&&(z(0,`span`,15),K(1,`Found `),z(2,`code`),K(3),B()()),e&2){let e=W().$implicit;O(3),q(e.actual)}}function uO(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,12),U(`click`,function(){let t=w(e).$implicit;return T(W(4).showNode.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(4).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(4).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(4).highlight.emit(null))}),z(2,`span`,13),K(3),B(),z(4,`span`,14),K(5),B(),j(6,cO,4,1,`span`,15),j(7,lO,4,1,`span`,15),B()()}if(e&2){let e=t.$implicit;O(3),q(e.name),O(2),J(`<`,e.tag,`>`),O(),M(e.expected?6:-1),O(),M(e.actual?7:-1)}}function dO(e,t){if(e&1&&(z(0,`h3`,10),K(1,`Mismatches`),B(),z(2,`ul`,11),N(3,uO,8,4,`li`,null,aO),B()),e&2){let e=W(2);O(3),P(e.mismatches)}}function fO(e,t){if(e&1){let e=V();z(0,`div`,3)(1,`ul`,4),N(2,sO,4,4,`li`,5,iO),B(),z(4,`button`,6),U(`click`,function(){return w(e),T(W(2).toggleOverlay())}),E(),z(5,`svg`,7),Og(6,`rect`,8),B(),K(7,` Outline on page `),B()(),j(8,dO,5,0)}if(e&2){let e=W(),t=W();O(2),P(t.counts()),O(2),A(`aria-pressed`,t.overlayOn()),O(4),M(e.mismatches.length?8:-1)}}function pO(e,t){e&1&&j(0,oO,5,0,`p`,2)(1,fO,9,2),e&2&&M(+!!t.hydrated)}function mO(e,t){e&1&&(z(0,`p`,2),K(1,` This page was not rendered on the server, so there is nothing to hydrate. With server-side rendering and `),z(2,`code`),K(3,`provideClientHydration()`),B(),K(4,`, each component shows whether it was hydrated, skipped or mismatched. `),B())}var hO=class e{report=$(void 0);overlay=vv();showNode=vv();highlight=vv();overlayOn=Q(()=>this.report()?.overlay===!0);counts=X(()=>{let e=this.report()?.counts;return e?[{key:`hydrated`,label:`hydrated`,value:e.hydrated},{key:`skipped`,label:`skipped`,value:e.skipped},{key:`mismatched`,label:`mismatched`,value:e.mismatched},{key:`client`,label:`created on the client`,value:e.client},{key:`dehydratedBlocks`,label:e.dehydratedBlocks===1?`dehydrated @defer block`:`dehydrated @defer blocks`,value:e.dehydratedBlocks}]:[]});toggleOverlay(){let e=!this.overlayOn();this.overlayOn.set(e),this.overlay.emit(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-hydration-section`]],inputs:{report:[1,`report`]},outputs:{overlay:`overlay`,showNode:`showNode`,highlight:`highlight`},decls:5,vars:1,consts:[[`aria-labelledby`,`ct-hydration-title`,1,`hydration`],[`id`,`ct-hydration-title`,1,`title`],[1,`empty`],[1,`summary`],[`aria-label`,`Hydration summary`,1,`counts`],[3,`class`],[`type`,`button`,1,`outline`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`x`,`3`,`y`,`3`,`width`,`18`,`height`,`18`,`rx`,`2`,`stroke-dasharray`,`4 3`],[1,`num`],[1,`label`],[1,`mismatches`],[`type`,`button`,1,`mismatch`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`mono`,`muted`],[1,`detail-line`]],template:function(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,`Hydration`),B(),j(3,pO,2,1)(4,mO,5,0,`p`,2),B()),e&2){let e;O(3),M((e=t.report())?3:4,e)}},styles:[`.hydration[_ngcontent-%COMP%] { margin-top: 16px; } @@ -738,7 +738,7 @@ svg[_ngcontent-%COMP%] { button[_ngcontent-%COMP%] { transition: none; } -}`]})};function vO(e){return new Date(e).toLocaleTimeString()}var yO=/[ \t\n\r]/;function bO(e){let t=e.trim(),n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=``,i=0,a=()=>`\n${` `.repeat(i)}`;for(let e=0;e0?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function gO(e){return new Date(e).toLocaleTimeString()}var _O=/[ \t\n\r]/;function vO(e){let t=e.trim(),n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=``,i=0,a=()=>`\n${` `.repeat(i)}`;for(let e=0;e0?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -765,7 +765,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})},TO=864e13,EO=200,DO=300,OO=100,kO=10,AO=100,jO=2e3,MO=2e3,NO=4e3,PO=1e3,FO=100,IO=3,LO=50,RO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},zO=Object.values(RO),BO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),VO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,HO=(e,t)=>typeof e==`string`?e.slice(0,t):``,UO=e=>VO(e)>0?VO(e):void 0,WO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function GO(e){if(!BO(e))return null;let t=HO(e.name,EO);return t?{name:t,checks:VO(e.checks),ms:VO(e.ms)}:null}function KO(e,t){if(!Array.isArray(e)||e.length!==5)return null;let[n,r,i,a,o]=e;return typeof n!=`number`||!Number.isInteger(n)||n<0||n>=t||typeof r!=`number`||!Number.isFinite(r)||Math.abs(r)>1e7||typeof a!=`number`||!Number.isInteger(a)||a<0||a>PO||typeof o!=`string`||!zO.includes(o)?null:[n,r,VO(i),a,o]}function qO(e,t){if(!BO(e)||typeof e.id!=`number`)return null;let n=WO(e.components,kO).map(GO).filter(e=>!!e),r=HO(e.trigger,DO),i=WO(e.spans,40).map(e=>KO(e,t)).filter(e=>!!e),a=Array.isArray(e.spans)?e.spans.length-40:0,o=Math.floor(VO(e.droppedSpans))+Math.max(0,a),s={t:typeof e.t==`number`?VO(e.t):void 0,hookMs:UO(e.hookMs),afterRenderMs:UO(e.afterRenderMs),outputMs:UO(e.outputMs)},c=ZO(e.cause),l=UO(e.refreshed),u=UO(e.unchanged);return{id:VO(e.id),at:VO(e.at),ms:VO(e.ms),passes:VO(e.passes),...r?{trigger:r}:{},checks:VO(e.checks),components:n,...Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0)),...i.length?{spans:i}:{},...o?{droppedSpans:o}:{},...c?{cause:c}:{},...l?{refreshed:l}:{},...u?{unchanged:u}:{}}}var JO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],YO={event:`Event`,http:`HTTP response`,timer:`Timer`,signal:`Signal write`,effect:`Effect`,markForCheck:`markForCheck`,input:`setInput`,view:`View change`,tick:`ApplicationRef.tick`,zone:`zone.js only`,unknown:`Unknown`},XO=e=>typeof e==`string`&&JO.includes(e);function ZO(e){if(!BO(e)||!XO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};XO(e.via)&&(n.via=e.via);for(let r of t){let t=HO(e[r],EO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=WO(e.stack,IO).map(e=>HO(e,DO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(VO(e.more));return i&&(n.more=i),n}function QO(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(VO(e.refreshed)),unchanged:Math.floor(VO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function $O(e){if(!BO(e))return null;let t=HO(e.name,EO),n=HO(e.input,EO);if(!t||!n)return null;let r=HO(e.parent,EO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(VO(e.inPlace)),sameContents:Math.floor(VO(e.sameContents))}}function ek(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=WO(e.tasks,3).map(e=>HO(e,EO)).filter(Boolean);return{name:t,ticks:Math.floor(VO(e.ticks)),...n.length?{tasks:n}:{}}}function tk(e){if(!BO(e))return;let t={};if(BO(e.causes))for(let n of JO){let r=Math.floor(VO(e.causes[n]));r&&(t[n]=r)}let n=WO(e.components,AO).map(QO).filter(e=>!!e),r=WO(e.inputs,LO).map($O).filter(e=>!!e),i=WO(e.zone,LO).map(ek).filter(e=>!!e),a=Math.floor(VO(e.major));return{triggers:e.triggers===!0,waste:e.waste===!0,...a&&a<1e3?{major:a}:{},causes:t,components:n,...r.length?{inputs:r}:{},...i.length?{zone:i}:{},...typeof e.zoneJs==`boolean`?{zoneJs:e.zoneJs}:{}}}function nk(e){let t=[],n=e.component?` in ${e.component}${e.listener?` (${e.listener})`:``}`:``;switch(e.kind){case`event`:t.push(`${e.event??`Template listener`}${e.target?` on ${e.target}`:``}${n}`);break;case`http`:t.push(`HTTP response${n}`);break;case`timer`:t.push(`${e.task??`Timer`}${n}`);break;case`zone`:t.push(`zone.js tick with no Angular notification${e.task?` after ${e.task}`:``}`);break;case`tick`:t.push(`ApplicationRef.tick()${n}`);break;default:t.push(`${YO[e.kind]}${n}`)}return e.signal?t.push(e.signal===`?`?`wrote an unnamed signal`:`wrote signal ${e.signal}`):e.via&&e.via!==e.kind&&t.push(`via ${YO[e.via]}`),e.zone&&e.kind!==`zone`&&t.push(`run by zone.js`),e.more&&t.push(`${e.more} more notification${e.more===1?``:`s`}`),t.join(`, `)}function rk(e){if(!e)return[];let t=[],n=(e.major??0)>=22;for(let r of e.components){if(r.refreshed<10)continue;let e=r.refreshed-r.unchanged;if(e/r.refreshed>.2)continue;let i=`refreshed ${r.refreshed} times and changed something in ${e}`;r.strategy===`Eager`?t.push({name:r.name,kind:`on-push`,text:n?`${r.name} was ${i}. It opts out of OnPush, which is the default from Angular 22: remove \`changeDetection: ChangeDetectionStrategy.Eager\` (or \`Default\`) so Angular skips it until an input, event, signal or markForCheck marks it.`:`${r.name} was ${i}. Add \`changeDetection: ChangeDetectionStrategy.OnPush\` so Angular skips it until an input, event, signal or markForCheck marks it.`}):r.strategy===`OnPush`&&t.push({name:r.name,kind:`already-on-push`,text:`${r.name} was ${i}, and it is already OnPush${n?` (the default from Angular 22)`:``}. Something keeps marking it: an input that gets a new reference each time, an event or output in it, markForCheck, or a signal it reads that is set to an equal value.`})}for(let n of e.inputs??[]){let e=n.parent?` set by ${n.parent}`:``;n.inPlace&&t.push({name:n.name,kind:`in-place`,text:`Input ${n.input} of ${n.name}${e} changed in place ${n.inPlace} time${n.inPlace===1?``:`s`}: same reference, different contents. OnPush components, computed and signal equality don't see that. Pass a new object or array instead of mutating it.`}),n.sameContents&&t.push({name:n.name,kind:`same-contents`,text:`Input ${n.input} of ${n.name}${e} got a new reference with the same contents ${n.sameContents} time${n.sameContents===1?``:`s`}, so Angular refreshed ${n.name} for nothing. Keep the reference when nothing changed, for example with a computed instead of a method call in the template.`})}for(let n of e.zone??[]){let e=n.tasks?.length?` (after ${n.tasks.join(`, `)})`:``;t.push({name:n.name,kind:`zone`,text:`${n.name} changed in ${n.ticks} tick${n.ticks===1?``:`s`} that only zone.js started${e}. Without zone.js it would not update: keep that state in a signal, or call markForCheck after changing it.`})}return t}function ik(e){let t=GO(e);return!t||!BO(e)?null:{...t,maxMs:VO(e.maxMs),cycles:VO(e.cycles)}}function ak(e){if(!BO(e))return null;let t=HO(e.name,EO),n=HO(e.hook,OO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:VO(r),ms:VO(i),maxMs:VO(a)}}function ok(e){if(!BO(e))return null;let t=HO(e.name,EO);if(!t)return null;let n=HO(e.listener,EO);return{name:t,...n?{listener:n}:{},calls:VO(e.calls),ms:VO(e.ms),maxMs:VO(e.maxMs)}}function sk(e){if(BO(e)&&VO(e.runs))return{runs:VO(e.runs),ms:VO(e.ms),maxMs:VO(e.maxMs)}}function ck(e,t){if(!BO(e))return null;let n=WO(e.spanNames,NO).map(e=>HO(e,DO)),r=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,MO)).map(e=>qO(e,n.length)).filter(e=>!!e):[],i={},a=0;if(BO(e.hosts)){let t=Object.entries(e.hosts);a=Math.max(0,t.length-jO);for(let[e,n]of t.slice(0,jO))e.length<50&&VO(n)&&(i[e]=VO(n))}let o=Array.isArray(e.components)?e.components:[],s=Math.floor(VO(e.droppedClasses))+Math.max(0,o.length-AO),c=Math.floor(VO(e.droppedHosts))+a,l=WO(e.hooks,FO).map(ak).filter(e=>!!e),u=WO(e.outputs,FO).map(ok).filter(e=>!!e),d=Math.max(0,WO(e.hooks,1/0).length-FO)+Math.max(0,WO(e.outputs,1/0).length-FO),f=Math.floor(VO(e.droppedTimings))+d,p=sk(e.afterRender),m=r.some(e=>e.spans?.length),h=tk(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=TO?VO(e.startedAt):null,dropped:VO(e.dropped),cycles:r,components:o.slice(0,AO).map(ik).filter(e=>!!e),...s?{droppedClasses:s}:{},hosts:i,...c?{droppedHosts:c}:{},...l.length?{hooks:l}:{},...u.length?{outputs:u}:{},...f?{droppedTimings:f}:{},...p?{afterRender:p}:{},...m?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var lk=`pangular-inspector/change-detection`;function uk(e,t,n=Date.now()){return{format:lk,version:1,exportedAt:n,pageId:t,recording:{...ck(e,MO)??e,recording:!1,hosts:{}}}}function dk(e,t){if(e.length>2e7||e.length*3>2e7&&new TextEncoder().encode(e).byteLength>2e7)return{ok:!1,error:`The file is larger than 20 MB.`};let n;try{n=JSON.parse(e)}catch{return{ok:!1,error:`The file is not valid JSON.`}}if(!BO(n))return{ok:!1,error:`The file is not a recording.`};if(n.format!==void 0&&n.format!==`pangular-inspector/change-detection`)return{ok:!1,error:`The file is not a change detection recording.`};let r=BO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=ck(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=HO(n.pageId??r.pageId,49)||`imported`,o=UO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var fk=1,pk=1,mk=2,hk={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},gk=e=>Math.round(e*1e6)/1e3;function _k(e,t){let n=e.spanNames??[],r=e.cycles[0]?.at??0,i=e.startedAt??r,a=[],o=0,s=0;for(let t of e.cycles){let e=t.t??Math.max(0,t.at-i),r=e+t.ms;a.push({name:`Change detection #${t.id}`,cat:`change-detection`,ph:`X`,pid:fk,tid:pk,ts:gk(e),dur:gk(t.ms),args:{checks:t.checks,passes:t.passes,...t.trigger?{trigger:t.trigger}:{},...t.hookMs?{hookMs:t.hookMs}:{},...t.afterRenderMs?{afterRenderMs:t.afterRenderMs}:{},...t.outputMs?{outputMs:t.outputMs}:{},...t.cause?{cause:nk(t.cause)}:{},...t.unchanged?{unchanged:t.unchanged}:{},slowest:t.components.map(e=>`${e.name} ${e.checks}x ${e.ms}ms`)}}),s+=t.droppedSpans??0;let c=[{end:r}],l=[...t.spans??[]].sort((e,t)=>e[1]-t[1]||t[2]-e[2]);for(let[r,i,s,u,d]of l){o++;let l=n[r]??`?`;if(d===RO.output){let n=e+i;a.push({name:l,cat:hk[d],ph:`X`,pid:fk,tid:mk,ts:gk(n),dur:gk(i<0?Math.max(0,Math.min(s,-i)):s),args:{cycle:t.id}});continue}let f=Math.max(e,e+i);for(;c.length>1&&c.at(-1).end<=f;)c.pop();let p=c.at(-1).end,m=Math.min(f+s,p);me.ts??0));if(c<0)for(let e of a)e.ts=gk((e.ts-c)/1e3);a.sort((e,t)=>e.ts-t.ts||t.dur-e.dur);let l=(e,t,n)=>({name:t,ph:`M`,pid:fk,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(pk,`thread_name`,`Change detection`),l(mk,`thread_name`,`Outputs`),...a],displayTimeUnit:`ms`,otherData:{source:`Pangular Inspector change detection recording`,pageId:t,cycles:e.cycles.length,droppedCycles:e.dropped,spans:o,droppedSpans:s,...e.startedAt&&e.startedAt<=TO?{startedAt:new Date(e.startedAt).toISOString()}:{}}}}var vk=16.6;function yk(e){return e.ms>vk}function bk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function xk(e,t){if(!t)return[...e];let n=Math.min(t.from,t.to),r=Math.max(t.from,t.to),i=e.filter(e=>e.id>=n&&e.id<=r);return i.length?i:[...e]}function Sk(e){let t=new Map;for(let n of e)for(let e of n.components){let n=t.get(e.name);n?(n.checks+=e.checks,n.ms+=e.ms,n.maxMs=Math.max(n.maxMs,e.ms),n.cycles+=1):t.set(e.name,{name:e.name,checks:e.checks,ms:e.ms,maxMs:e.ms,cycles:1})}return[...t.values()].sort((e,t)=>t.ms-e.ms||e.name.localeCompare(t.name))}function Ck(e){let t=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(t,vk*1.25)}function wk(e,t,n=3){let r=e.map(e=>({item:e,value:t(e)})).filter(e=>e.value>0).sort((e,t)=>t.value-e.value),i=r.reduce((e,t)=>e+t.value,0);if(!i)return[];let a=n/i,o=[],s=0,c=0,l=n,u=1,d=[],f=(e,t)=>{let n=e.reduce((e,t)=>e+t,0),r=Math.max(...e),i=Math.min(...e);return Math.max(t*t*r/(n*n),n*n/(t*t*i))},p=()=>{let e=d.reduce((e,t)=>e+t.area,0);if(l>=u){let t=e/u,n=c;for(let e of d){let r=e.area/t;o.push({item:e.item,x:s,y:n,w:t,h:r}),n+=r}s+=t,l-=t}else{let t=e/l,n=s;for(let e of d){let r=e.area/t;o.push({item:e.item,x:n,y:c,w:r,h:t}),n+=r}c+=t,u-=t}d=[]};for(let e of r){let t=e.value*a,n=Math.min(l,u),r=d.map(e=>e.area);d.length&&f([...r,t],n)>f(r,n)&&p(),d.push({item:e.item,area:t})}return d.length&&p(),o.map(e=>({item:e.item,x:e.x/n*100,y:e.y*100,w:e.w/n*100,h:e.h*100}))}var Tk={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function Ek(e,t){if(t===`c`)return e||null;if(t===`h`){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}if(t===`o`){let t=e.indexOf(` (`),n=t>0?e.slice(0,t):e;return n&&n!==`?`?n:null}return null}function Dk(e,t){let n=e.filter(e=>e.spans?.length);if(!n.length)return null;let r=n.map(e=>{let t=e.spans,n=Math.min(0,...t.map(e=>e[1])),r=Math.max(e.ms,...t.map(e=>e[1]+e[2]));return{cycle:e,spans:t,from:n,width:Math.max(r-n,.001)}}),i=r.reduce((e,t)=>e+t.width,0),a=[],o=[],s=0,c=0;for(let{cycle:e,spans:n,from:l,width:u}of r){o.push({id:e.id,x:s/i*100,w:u/i*100,droppedSpans:e.droppedSpans??0});let r=[...n].sort((e,t)=>e[1]-t[1]||e[3]-t[3]),d=[];for(let[n,o,u,f,p]of r){let r=t[n]??`unknown`,m=d[f-1],h=f>0&&m!==void 0&&ot.kind,kk=(e,t)=>t.name,Ak=(e,t)=>t.name+`.`+t.input;function jk(e,t){e&1&&(z(0,`p`,3),K(1,` The page has no Angular change detection scheduler the overlay could find (it needs Angular 18 or later), so cycles have no cause. `),B())}function Mk(e,t){if(e&1&&(z(0,`tr`)(1,`td`),K(2),B(),z(3,`td`,6),K(4),B()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.count)}}function Nk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),B(),z(5,`th`,5),K(6,`Cycles`),B()()(),z(7,`tbody`),N(8,Mk,5,2,`tr`,null,Ok),B()()),e&2){let e=W(2);O(8),P(e.causes())}}function Pk(e,t){e&1&&(z(0,`p`,3),K(1,`No cycle has a cause yet.`),B())}function Fk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,7),K(6),B()()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),q(e.ticks),O(2),q(e.tasks?.join(`, `))}}function Ik(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Zone-only ticks`),B(),z(7,`th`,4),K(8,`After`),B()()(),z(9,`tbody`),N(10,Fk,7,3,`tr`,null,kk),B()()),e&2){let e=W(3);O(10),P(e.zone())}}function Lk(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W(3);O(),q(e.zoneNote())}}function Rk(e,t){if(e&1&&(z(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),B(),j(3,Ik,12,0,`table`)(4,Lk,2,1,`p`,3),B()),e&2){let e=W(),t=W();O(3),M(t.zone().length?3:e.triggers?4:-1)}}function zk(e,t){e&1&&(z(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),B())}function Bk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),q(e.name),O(2),q(e.refreshed),O(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),O(2),q(e.strategy??`Unknown`)}}function Vk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Refreshed`),B(),z(7,`th`,5),K(8,`Changed nothing`),B(),z(9,`th`,4),K(10,`Strategy`),B()()(),z(11,`tbody`),N(12,Bk,9,5,`tr`,null,kk),B()()),e&2){let e=W(2);O(12),P(e.wasted())}}function Hk(e,t){e&1&&(z(0,`p`,3),K(1,`Every refreshed check changed something.`),B())}function Uk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,7),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit;O(2),Y(``,e.name,`.`,e.input),O(2),q(e.parent??`Unknown`),O(2),q(e.inPlace),O(2),q(e.sameContents)}}function Wk(e,t){if(e&1&&(z(0,`h4`),K(1,`Inputs that break OnPush`),B(),z(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),B(),z(7,`th`,4),K(8,`Set by`),B(),z(9,`th`,5),K(10,`Changed in place`),B(),z(11,`th`,5),K(12,`Same contents, new reference`),B()()(),z(13,`tbody`),N(14,Uk,9,5,`tr`,null,Ak),B()()),e&2){let e=W(2);O(14),P(e.inputs())}}function Gk(e,t){if(e&1&&(z(0,`li`),K(1),B()),e&2){let e=t.$implicit;O(),q(e.text)}}function Kk(e,t){if(e&1&&(z(0,`h4`),K(1,`Hints`),B(),z(2,`ul`,8),N(3,Gk,2,1,`li`,null,gg),B()),e&2){let e=W(2);O(3),P(e.hints())}}function qk(e,t){if(e&1&&(z(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),B(),z(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),B(),j(7,jk,2,0,`p`,3)(8,Nk,10,0,`table`)(9,Pk,2,0,`p`,3),B(),j(10,Rk,5,1,`div`),B(),z(11,`h4`),K(12,`Wasted checks`),B(),j(13,zk,2,0,`p`,3)(14,Vk,14,0,`table`)(15,Hk,2,0,`p`,3),j(16,Wk,16,0),j(17,Kk,5,0),B()),e&2){let e=t,n=W();O(7),M(e.triggers?n.causes().length?8:9:7),O(3),M(n.hasZone()?10:-1),O(3),M(e.waste?n.wasted().length?14:15:13),O(3),M(n.inputs().length?16:-1),O(),M(n.hints().length?17:-1)}}var Jk=10,Yk=class e{page=$(null);diagnosis=X(()=>this.page()?.diagnosis??null);causes=X(()=>{let e=this.diagnosis()?.causes??{};return JO.filter(t=>e[t]).map(t=>({kind:t,label:YO[t],count:e[t]}))});zone=X(()=>(this.diagnosis()?.zone??[]).slice(0,Jk));zoneTicks=X(()=>this.diagnosis()?.causes.zone??0);hasZone=X(()=>this.diagnosis()?.zoneJs??(this.zone().length>0||this.zoneTicks()>0));zoneNote=X(()=>{let e=this.zoneTicks();return e?`${e} ${e===1?`tick`:`ticks`} came from zone.js alone, and no component changed in them.`:`No component changed in a tick only zone.js started.`});wasted=X(()=>(this.diagnosis()?.components??[]).filter(e=>e.unchanged>0).slice(0,Jk));inputs=X(()=>(this.diagnosis()?.inputs??[]).slice(0,Jk));hints=X(()=>rk(this.diagnosis()??void 0).slice(0,Jk));share(e,t){return t?`${Math.round(e/t*100)}%`:`0%`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-diagnosis`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[`aria-labelledby`,`cd-diagnosis-heading`,1,`diagnosis`],[`id`,`cd-diagnosis-heading`],[1,`grid`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`num`],[1,`mono`],[1,`hints`]],template:function(e,t){if(e&1&&j(0,qk,18,5,`section`,0),e&2){let e;M((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { +}`]})},CO=864e13,wO=200,TO=300,EO=100,DO=10,OO=100,kO=2e3,AO=2e3,jO=4e3,MO=1e3,NO=100,PO=3,FO=50,IO={component:`c`,hook:`h`,afterRender:`r`,output:`o`},LO=Object.values(IO),RO=e=>!!e&&typeof e==`object`&&!Array.isArray(e),zO=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0?e:0,BO=(e,t)=>typeof e==`string`?e.slice(0,t):``,VO=e=>zO(e)>0?zO(e):void 0,HO=(e,t)=>Array.isArray(e)?e.slice(0,t):[];function UO(e){if(!RO(e))return null;let t=BO(e.name,wO);return t?{name:t,checks:zO(e.checks),ms:zO(e.ms)}:null}function WO(e,t){if(!Array.isArray(e)||e.length!==5)return null;let[n,r,i,a,o]=e;return typeof n!=`number`||!Number.isInteger(n)||n<0||n>=t||typeof r!=`number`||!Number.isFinite(r)||Math.abs(r)>1e7||typeof a!=`number`||!Number.isInteger(a)||a<0||a>MO||typeof o!=`string`||!LO.includes(o)?null:[n,r,zO(i),a,o]}function GO(e,t){if(!RO(e)||typeof e.id!=`number`)return null;let n=HO(e.components,DO).map(UO).filter(e=>!!e),r=BO(e.trigger,TO),i=HO(e.spans,40).map(e=>WO(e,t)).filter(e=>!!e),a=Array.isArray(e.spans)?e.spans.length-40:0,o=Math.floor(zO(e.droppedSpans))+Math.max(0,a),s={t:typeof e.t==`number`?zO(e.t):void 0,hookMs:VO(e.hookMs),afterRenderMs:VO(e.afterRenderMs),outputMs:VO(e.outputMs)},c=YO(e.cause),l=VO(e.refreshed),u=VO(e.unchanged);return{id:zO(e.id),at:zO(e.at),ms:zO(e.ms),passes:zO(e.passes),...r?{trigger:r}:{},checks:zO(e.checks),components:n,...Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0)),...i.length?{spans:i}:{},...o?{droppedSpans:o}:{},...c?{cause:c}:{},...l?{refreshed:l}:{},...u?{unchanged:u}:{}}}var KO=[`event`,`http`,`timer`,`signal`,`effect`,`markForCheck`,`input`,`view`,`tick`,`zone`,`unknown`],qO={event:`Event`,http:`HTTP response`,timer:`Timer`,signal:`Signal write`,effect:`Effect`,markForCheck:`markForCheck`,input:`setInput`,view:`View change`,tick:`ApplicationRef.tick`,zone:`zone.js only`,unknown:`Unknown`},JO=e=>typeof e==`string`&&KO.includes(e);function YO(e){if(!RO(e)||!JO(e.kind))return;let t=[`component`,`listener`,`event`,`target`,`signal`,`task`],n={kind:e.kind};JO(e.via)&&(n.via=e.via);for(let r of t){let t=BO(e[r],wO);t&&(n[r]=t)}e.zone===!0&&(n.zone=!0);let r=HO(e.stack,PO).map(e=>BO(e,TO)).filter(Boolean);r.length&&(n.stack=r);let i=Math.floor(zO(e.more));return i&&(n.more=i),n}function XO(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=e.strategy;return{name:t,refreshed:Math.floor(zO(e.refreshed)),unchanged:Math.floor(zO(e.unchanged)),...n===`OnPush`||n===`Eager`?{strategy:n}:{}}}function ZO(e){if(!RO(e))return null;let t=BO(e.name,wO),n=BO(e.input,wO);if(!t||!n)return null;let r=BO(e.parent,wO);return{name:t,input:n,...r?{parent:r}:{},inPlace:Math.floor(zO(e.inPlace)),sameContents:Math.floor(zO(e.sameContents))}}function QO(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=HO(e.tasks,3).map(e=>BO(e,wO)).filter(Boolean);return{name:t,ticks:Math.floor(zO(e.ticks)),...n.length?{tasks:n}:{}}}function $O(e){if(!RO(e))return;let t={};if(RO(e.causes))for(let n of KO){let r=Math.floor(zO(e.causes[n]));r&&(t[n]=r)}let n=HO(e.components,OO).map(XO).filter(e=>!!e),r=HO(e.inputs,FO).map(ZO).filter(e=>!!e),i=HO(e.zone,FO).map(QO).filter(e=>!!e),a=Math.floor(zO(e.major));return{triggers:e.triggers===!0,waste:e.waste===!0,...a&&a<1e3?{major:a}:{},causes:t,components:n,...r.length?{inputs:r}:{},...i.length?{zone:i}:{},...typeof e.zoneJs==`boolean`?{zoneJs:e.zoneJs}:{}}}function ek(e){let t=[],n=e.component?` in ${e.component}${e.listener?` (${e.listener})`:``}`:``;switch(e.kind){case`event`:t.push(`${e.event??`Template listener`}${e.target?` on ${e.target}`:``}${n}`);break;case`http`:t.push(`HTTP response${n}`);break;case`timer`:t.push(`${e.task??`Timer`}${n}`);break;case`zone`:t.push(`zone.js tick with no Angular notification${e.task?` after ${e.task}`:``}`);break;case`tick`:t.push(`ApplicationRef.tick()${n}`);break;default:t.push(`${qO[e.kind]}${n}`)}return e.signal?t.push(e.signal===`?`?`wrote an unnamed signal`:`wrote signal ${e.signal}`):e.via&&e.via!==e.kind&&t.push(`via ${qO[e.via]}`),e.zone&&e.kind!==`zone`&&t.push(`run by zone.js`),e.more&&t.push(`${e.more} more notification${e.more===1?``:`s`}`),t.join(`, `)}function tk(e){if(!e)return[];let t=[],n=(e.major??0)>=22;for(let r of e.components){if(r.refreshed<10)continue;let e=r.refreshed-r.unchanged;if(e/r.refreshed>.2)continue;let i=`refreshed ${r.refreshed} times and changed something in ${e}`;r.strategy===`Eager`?t.push({name:r.name,kind:`on-push`,text:n?`${r.name} was ${i}. It opts out of OnPush, which is the default from Angular 22: remove \`changeDetection: ChangeDetectionStrategy.Eager\` (or \`Default\`) so Angular skips it until an input, event, signal or markForCheck marks it.`:`${r.name} was ${i}. Add \`changeDetection: ChangeDetectionStrategy.OnPush\` so Angular skips it until an input, event, signal or markForCheck marks it.`}):r.strategy===`OnPush`&&t.push({name:r.name,kind:`already-on-push`,text:`${r.name} was ${i}, and it is already OnPush${n?` (the default from Angular 22)`:``}. Something keeps marking it: an input that gets a new reference each time, an event or output in it, markForCheck, or a signal it reads that is set to an equal value.`})}for(let n of e.inputs??[]){let e=n.parent?` set by ${n.parent}`:``;n.inPlace&&t.push({name:n.name,kind:`in-place`,text:`Input ${n.input} of ${n.name}${e} changed in place ${n.inPlace} time${n.inPlace===1?``:`s`}: same reference, different contents. OnPush components, computed and signal equality don't see that. Pass a new object or array instead of mutating it.`}),n.sameContents&&t.push({name:n.name,kind:`same-contents`,text:`Input ${n.input} of ${n.name}${e} got a new reference with the same contents ${n.sameContents} time${n.sameContents===1?``:`s`}, so Angular refreshed ${n.name} for nothing. Keep the reference when nothing changed, for example with a computed instead of a method call in the template.`})}for(let n of e.zone??[]){let e=n.tasks?.length?` (after ${n.tasks.join(`, `)})`:``;t.push({name:n.name,kind:`zone`,text:`${n.name} changed in ${n.ticks} tick${n.ticks===1?``:`s`} that only zone.js started${e}. Without zone.js it would not update: keep that state in a signal, or call markForCheck after changing it.`})}return t}function nk(e){let t=UO(e);return!t||!RO(e)?null:{...t,maxMs:zO(e.maxMs),cycles:zO(e.cycles)}}function rk(e){if(!RO(e))return null;let t=BO(e.name,wO),n=BO(e.hook,EO);if(!t||!n)return null;let{calls:r,ms:i,maxMs:a}=e;return{name:t,hook:n,calls:zO(r),ms:zO(i),maxMs:zO(a)}}function ik(e){if(!RO(e))return null;let t=BO(e.name,wO);if(!t)return null;let n=BO(e.listener,wO);return{name:t,...n?{listener:n}:{},calls:zO(e.calls),ms:zO(e.ms),maxMs:zO(e.maxMs)}}function ak(e){if(RO(e)&&zO(e.runs))return{runs:zO(e.runs),ms:zO(e.ms),maxMs:zO(e.maxMs)}}function ok(e,t){if(!RO(e))return null;let n=HO(e.spanNames,jO).map(e=>BO(e,TO)),r=Array.isArray(e.cycles)?e.cycles.slice(-Math.min(t,AO)).map(e=>GO(e,n.length)).filter(e=>!!e):[],i={},a=0;if(RO(e.hosts)){let t=Object.entries(e.hosts);a=Math.max(0,t.length-kO);for(let[e,n]of t.slice(0,kO))e.length<50&&zO(n)&&(i[e]=zO(n))}let o=Array.isArray(e.components)?e.components:[],s=Math.floor(zO(e.droppedClasses))+Math.max(0,o.length-OO),c=Math.floor(zO(e.droppedHosts))+a,l=HO(e.hooks,NO).map(rk).filter(e=>!!e),u=HO(e.outputs,NO).map(ik).filter(e=>!!e),d=Math.max(0,HO(e.hooks,1/0).length-NO)+Math.max(0,HO(e.outputs,1/0).length-NO),f=Math.floor(zO(e.droppedTimings))+d,p=ak(e.afterRender),m=r.some(e=>e.spans?.length),h=$O(e.diagnosis);return{recording:e.recording===!0,startedAt:typeof e.startedAt==`number`&&e.startedAt<=CO?zO(e.startedAt):null,dropped:zO(e.dropped),cycles:r,components:o.slice(0,OO).map(nk).filter(e=>!!e),...s?{droppedClasses:s}:{},hosts:i,...c?{droppedHosts:c}:{},...l.length?{hooks:l}:{},...u.length?{outputs:u}:{},...f?{droppedTimings:f}:{},...p?{afterRender:p}:{},...m?{spanNames:n}:{},...h?{diagnosis:h}:{}}}var sk=`pangular-inspector/change-detection`;function ck(e,t,n=Date.now()){return{format:sk,version:1,exportedAt:n,pageId:t,recording:{...ok(e,AO)??e,recording:!1,hosts:{}}}}function lk(e,t){if(e.length>2e7||e.length*3>2e7&&new TextEncoder().encode(e).byteLength>2e7)return{ok:!1,error:`The file is larger than 20 MB.`};let n;try{n=JSON.parse(e)}catch{return{ok:!1,error:`The file is not valid JSON.`}}if(!RO(n))return{ok:!1,error:`The file is not a recording.`};if(n.format!==void 0&&n.format!==`pangular-inspector/change-detection`)return{ok:!1,error:`The file is not a change detection recording.`};let r=RO(n.recording)?n.recording:n;if(!Array.isArray(r.cycles))return{ok:!1,error:`The file has no change detection cycles.`};let i=ok(r,t);if(!i)return{ok:!1,error:`The file is not a recording.`};let a=BO(n.pageId??r.pageId,49)||`imported`,o=VO(n.exportedAt);return{ok:!0,pageId:a,...o?{exportedAt:o}:{},recording:{...i,recording:!1}}}var uk=1,dk=1,fk=2,pk={c:`component`,h:`lifecycle-hook`,r:`after-render`,o:`output`},mk=e=>Math.round(e*1e6)/1e3;function hk(e,t){let n=e.spanNames??[],r=e.cycles[0]?.at??0,i=e.startedAt??r,a=[],o=0,s=0;for(let t of e.cycles){let e=t.t??Math.max(0,t.at-i),r=e+t.ms;a.push({name:`Change detection #${t.id}`,cat:`change-detection`,ph:`X`,pid:uk,tid:dk,ts:mk(e),dur:mk(t.ms),args:{checks:t.checks,passes:t.passes,...t.trigger?{trigger:t.trigger}:{},...t.hookMs?{hookMs:t.hookMs}:{},...t.afterRenderMs?{afterRenderMs:t.afterRenderMs}:{},...t.outputMs?{outputMs:t.outputMs}:{},...t.cause?{cause:ek(t.cause)}:{},...t.unchanged?{unchanged:t.unchanged}:{},slowest:t.components.map(e=>`${e.name} ${e.checks}x ${e.ms}ms`)}}),s+=t.droppedSpans??0;let c=[{end:r}],l=[...t.spans??[]].sort((e,t)=>e[1]-t[1]||t[2]-e[2]);for(let[r,i,s,u,d]of l){o++;let l=n[r]??`?`;if(d===IO.output){let n=e+i;a.push({name:l,cat:pk[d],ph:`X`,pid:uk,tid:fk,ts:mk(n),dur:mk(i<0?Math.max(0,Math.min(s,-i)):s),args:{cycle:t.id}});continue}let f=Math.max(e,e+i);for(;c.length>1&&c.at(-1).end<=f;)c.pop();let p=c.at(-1).end,m=Math.min(f+s,p);me.ts??0));if(c<0)for(let e of a)e.ts=mk((e.ts-c)/1e3);a.sort((e,t)=>e.ts-t.ts||t.dur-e.dur);let l=(e,t,n)=>({name:t,ph:`M`,pid:uk,tid:e,args:{name:n}});return{traceEvents:[l(0,`process_name`,`Angular change detection (page ${t})`),l(dk,`thread_name`,`Change detection`),l(fk,`thread_name`,`Outputs`),...a],displayTimeUnit:`ms`,otherData:{source:`Pangular Inspector change detection recording`,pageId:t,cycles:e.cycles.length,droppedCycles:e.dropped,spans:o,droppedSpans:s,...e.startedAt&&e.startedAt<=CO?{startedAt:new Date(e.startedAt).toISOString()}:{}}}}var gk=16.6;function _k(e){return e.ms>gk}function vk(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}function yk(e,t){if(!t)return[...e];let n=Math.min(t.from,t.to),r=Math.max(t.from,t.to),i=e.filter(e=>e.id>=n&&e.id<=r);return i.length?i:[...e]}function bk(e){let t=new Map;for(let n of e)for(let e of n.components){let n=t.get(e.name);n?(n.checks+=e.checks,n.ms+=e.ms,n.maxMs=Math.max(n.maxMs,e.ms),n.cycles+=1):t.set(e.name,{name:e.name,checks:e.checks,ms:e.ms,maxMs:e.ms,cycles:1})}return[...t.values()].sort((e,t)=>t.ms-e.ms||e.name.localeCompare(t.name))}function xk(e){let t=e.reduce((e,t)=>Math.max(e,t.ms),0);return Math.max(t,gk*1.25)}function Sk(e,t,n=3){let r=e.map(e=>({item:e,value:t(e)})).filter(e=>e.value>0).sort((e,t)=>t.value-e.value),i=r.reduce((e,t)=>e+t.value,0);if(!i)return[];let a=n/i,o=[],s=0,c=0,l=n,u=1,d=[],f=(e,t)=>{let n=e.reduce((e,t)=>e+t,0),r=Math.max(...e),i=Math.min(...e);return Math.max(t*t*r/(n*n),n*n/(t*t*i))},p=()=>{let e=d.reduce((e,t)=>e+t.area,0);if(l>=u){let t=e/u,n=c;for(let e of d){let r=e.area/t;o.push({item:e.item,x:s,y:n,w:t,h:r}),n+=r}s+=t,l-=t}else{let t=e/l,n=s;for(let e of d){let r=e.area/t;o.push({item:e.item,x:n,y:c,w:r,h:t}),n+=r}c+=t,u-=t}d=[]};for(let e of r){let t=e.value*a,n=Math.min(l,u),r=d.map(e=>e.area);d.length&&f([...r,t],n)>f(r,n)&&p(),d.push({item:e.item,area:t})}return d.length&&p(),o.map(e=>({item:e.item,x:e.x/n*100,y:e.y*100,w:e.w/n*100,h:e.h*100}))}var Ck={c:`component`,h:`hook`,r:`afterRender`,o:`output`};function wk(e,t){if(t===`c`)return e||null;if(t===`h`){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}if(t===`o`){let t=e.indexOf(` (`),n=t>0?e.slice(0,t):e;return n&&n!==`?`?n:null}return null}function Tk(e,t){let n=e.filter(e=>e.spans?.length);if(!n.length)return null;let r=n.map(e=>{let t=e.spans,n=Math.min(0,...t.map(e=>e[1])),r=Math.max(e.ms,...t.map(e=>e[1]+e[2]));return{cycle:e,spans:t,from:n,width:Math.max(r-n,.001)}}),i=r.reduce((e,t)=>e+t.width,0),a=[],o=[],s=0,c=0;for(let{cycle:e,spans:n,from:l,width:u}of r){o.push({id:e.id,x:s/i*100,w:u/i*100,droppedSpans:e.droppedSpans??0});let r=[...n].sort((e,t)=>e[1]-t[1]||e[3]-t[3]),d=[];for(let[n,o,u,f,p]of r){let r=t[n]??`unknown`,m=d[f-1],h=f>0&&m!==void 0&&ot.kind,Dk=(e,t)=>t.name,Ok=(e,t)=>t.name+`.`+t.input;function kk(e,t){e&1&&(z(0,`p`,3),K(1,` The page has no Angular change detection scheduler the overlay could find (it needs Angular 18 or later), so cycles have no cause. `),B())}function Ak(e,t){if(e&1&&(z(0,`tr`)(1,`td`),K(2),B(),z(3,`td`,6),K(4),B()()),e&2){let e=t.$implicit;O(2),q(e.label),O(2),q(e.count)}}function jk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Trigger`),B(),z(5,`th`,5),K(6,`Cycles`),B()()(),z(7,`tbody`),N(8,Ak,5,2,`tr`,null,Ek),B()()),e&2){let e=W(2);O(8),P(e.causes())}}function Mk(e,t){e&1&&(z(0,`p`,3),K(1,`No cycle has a cause yet.`),B())}function Nk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,7),K(6),B()()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),q(e.ticks),O(2),q(e.tasks?.join(`, `))}}function Pk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Zone-only ticks`),B(),z(7,`th`,4),K(8,`After`),B()()(),z(9,`tbody`),N(10,Nk,7,3,`tr`,null,Dk),B()()),e&2){let e=W(3);O(10),P(e.zone())}}function Fk(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W(3);O(),q(e.zoneNote())}}function Ik(e,t){if(e&1&&(z(0,`div`)(1,`h4`),K(2,`Depends on zone.js`),B(),j(3,Pk,12,0,`table`)(4,Fk,2,1,`p`,3),B()),e&2){let e=W(),t=W();O(3),M(t.zone().length?3:e.triggers?4:-1)}}function Lk(e,t){e&1&&(z(0,`p`,3),K(1,`The page can't watch DOM updates, so wasted checks are not counted.`),B())}function Rk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),q(e.name),O(2),q(e.refreshed),O(2),Y(``,e.unchanged,` (`,n.share(e.unchanged,e.refreshed),`)`),O(2),q(e.strategy??`Unknown`)}}function zk(e,t){if(e&1&&(z(0,`table`)(1,`thead`)(2,`tr`)(3,`th`,4),K(4,`Component`),B(),z(5,`th`,5),K(6,`Refreshed`),B(),z(7,`th`,5),K(8,`Changed nothing`),B(),z(9,`th`,4),K(10,`Strategy`),B()()(),z(11,`tbody`),N(12,Rk,9,5,`tr`,null,Dk),B()()),e&2){let e=W(2);O(12),P(e.wasted())}}function Bk(e,t){e&1&&(z(0,`p`,3),K(1,`Every refreshed check changed something.`),B())}function Vk(e,t){if(e&1&&(z(0,`tr`)(1,`td`,7),K(2),B(),z(3,`td`,7),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit;O(2),Y(``,e.name,`.`,e.input),O(2),q(e.parent??`Unknown`),O(2),q(e.inPlace),O(2),q(e.sameContents)}}function Hk(e,t){if(e&1&&(z(0,`h4`),K(1,`Inputs that break OnPush`),B(),z(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,4),K(6,`Input`),B(),z(7,`th`,4),K(8,`Set by`),B(),z(9,`th`,5),K(10,`Changed in place`),B(),z(11,`th`,5),K(12,`Same contents, new reference`),B()()(),z(13,`tbody`),N(14,Vk,9,5,`tr`,null,Ok),B()()),e&2){let e=W(2);O(14),P(e.inputs())}}function Uk(e,t){if(e&1&&(z(0,`li`),K(1),B()),e&2){let e=t.$implicit;O(),q(e.text)}}function Wk(e,t){if(e&1&&(z(0,`h4`),K(1,`Hints`),B(),z(2,`ul`,8),N(3,Uk,2,1,`li`,null,gg),B()),e&2){let e=W(2);O(3),P(e.hints())}}function Gk(e,t){if(e&1&&(z(0,`section`,0)(1,`h3`,1),K(2,`Why it ran and what it wasted`),B(),z(3,`div`,2)(4,`div`)(5,`h4`),K(6,`What started the cycles`),B(),j(7,kk,2,0,`p`,3)(8,jk,10,0,`table`)(9,Mk,2,0,`p`,3),B(),j(10,Ik,5,1,`div`),B(),z(11,`h4`),K(12,`Wasted checks`),B(),j(13,Lk,2,0,`p`,3)(14,zk,14,0,`table`)(15,Bk,2,0,`p`,3),j(16,Hk,16,0),j(17,Wk,5,0),B()),e&2){let e=t,n=W();O(7),M(e.triggers?n.causes().length?8:9:7),O(3),M(n.hasZone()?10:-1),O(3),M(e.waste?n.wasted().length?14:15:13),O(3),M(n.inputs().length?16:-1),O(),M(n.hints().length?17:-1)}}var Kk=10,qk=class e{page=$(null);diagnosis=X(()=>this.page()?.diagnosis??null);causes=X(()=>{let e=this.diagnosis()?.causes??{};return KO.filter(t=>e[t]).map(t=>({kind:t,label:qO[t],count:e[t]}))});zone=X(()=>(this.diagnosis()?.zone??[]).slice(0,Kk));zoneTicks=X(()=>this.diagnosis()?.causes.zone??0);hasZone=X(()=>this.diagnosis()?.zoneJs??(this.zone().length>0||this.zoneTicks()>0));zoneNote=X(()=>{let e=this.zoneTicks();return e?`${e} ${e===1?`tick`:`ticks`} came from zone.js alone, and no component changed in them.`:`No component changed in a tick only zone.js started.`});wasted=X(()=>(this.diagnosis()?.components??[]).filter(e=>e.unchanged>0).slice(0,Kk));inputs=X(()=>(this.diagnosis()?.inputs??[]).slice(0,Kk));hints=X(()=>tk(this.diagnosis()??void 0).slice(0,Kk));share(e,t){return t?`${Math.round(e/t*100)}%`:`0%`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-diagnosis`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[`aria-labelledby`,`cd-diagnosis-heading`,1,`diagnosis`],[`id`,`cd-diagnosis-heading`],[1,`grid`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`num`],[1,`mono`],[1,`hints`]],template:function(e,t){if(e&1&&j(0,Gk,18,5,`section`,0),e&2){let e;M((e=t.diagnosis())?0:-1,e)}},styles:[`[_nghost-%COMP%] { display: block; } @@ -844,7 +844,7 @@ td.mono[_ngcontent-%COMP%] { .hints[_ngcontent-%COMP%] li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%] { margin-top: 4px; -}`]})},Xk=(e,t)=>t.cycle.id,Zk=(e,t)=>t.id;function Qk(e,t){if(e&1){let e=V();z(0,`button`,27),U(`click`,function(){return w(e),T(W().showAll())}),K(1,`Show all cycles`),B()}}function $k(e,t){if(e&1&&Og(0,`div`,28),e&2){let e=t;y_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function eA(e,t){if(e&1&&(z(0,`div`,29),Og(1,`span`,30),B()),e&2){let e=t.$implicit,n=W();G(`over`,e.over)(`out`,!n.inRange(e.index)&&!!n.range())(`active`,n.focused()&&n.active()===e.index),Pg(`id`,n.optionId(e.index)),A(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),O(),y_(`height`,e.height,`%`)}}function tA(e,t){e&1&&(z(0,`span`,33),K(1,`over budget`),B())}function nA(e,t){if(e&1&&(z(0,`p`),K(1,` after `),z(2,`span`,35),K(3),B()()),e&2){let e=W();O(3),q(e.cycle.trigger)}}function rA(e,t){if(e&1&&(z(0,`p`,34)(1,`span`,36),K(2),B(),z(3,`span`),K(4),B()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(n.fmt(e.ms))}}function iA(e,t){if(e&1&&(z(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),B(),z(4,`span`),K(5),B(),j(6,tA,2,0,`span`,33),B(),j(7,nA,4,1,`p`),z(8,`p`),K(9),B(),N(10,rA,5,2,`p`,34,gg),B()),e&2){let e=t,n=W();y_(`left`,e.left)(`right`,e.right),O(3),q(n.fmt(e.cycle.ms)),O(2),J(`cycle `,e.cycle.id),O(),M(e.over?6:-1),O(),M(e.cycle.trigger?7:-1),O(2),B_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),O(),P(e.top)}}function aA(e,t){if(e&1&&Og(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function oA(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function sA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),K(2),B(),z(3,`td`,37),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,37),K(8),B(),z(9,`td`,37),K(10),B(),z(11,`td`,35),K(12),B(),z(13,`td`,35),j(14,oA,1,2),B()()),e&2){let e,n=t.$implicit,r=W();O(2),q(n.id),O(2),q(r.fmt(n.ms)),O(2),q(r.isOver(n)?`Over`:`Within`),O(2),q(n.checks),O(2),q(n.passes),O(2),q(n.trigger??``),O(2),M((e=n.components[0])?14:-1,e)}}var cA=0,lA=80,uA=10,dA=class e{cycles=$([]);range=Tv(null);gapUntil=lA;budgetLabel=`${vk} ms budget`;uid=`cd-chart-${cA++}`;hintId=`${this.uid}-hint`;active=D(null);anchor=null;dragging=!1;hover=D(null);focused=D(!1);max=X(()=>Ck(this.cycles()));budgetAt=X(()=>vk/this.max()*100);bars=X(()=>{let e=this.max();return this.cycles().map((t,n)=>({cycle:t,index:n,height:t.ms/e*100,over:yk(t),label:this.describe(t)}))});firstId=X(()=>this.cycles()[0]?.id??0);lastId=X(()=>this.cycles().at(-1)?.id??0);span=X(()=>{let e=this.range();if(!e)return null;let t=this.cycles(),n=Math.min(e.from,e.to),r=Math.max(e.from,e.to),i=t.findIndex(e=>e.id>=n),a=-1;for(let e=t.length-1;e>=0;e--)if(t[e].id<=r){a=e;break}return i<0||axk(this.cycles(),this.range()));startId=X(()=>this.selected()[0]?.id??``);endId=X(()=>this.selected().at(-1)?.id??``);band=X(()=>{let e=this.span(),t=this.cycles().length;return!e||!t?null:{left:e.start/t*100,width:(e.end-e.start+1)/t*100}});summary=X(()=>{let e=this.selected(),t=e.filter(yk).length;return`${this.span()?e.length===1?`Cycle ${e[0].id}`:`Cycles ${e[0].id} to ${e.at(-1).id} (${e.length})`:`All ${e.length} ${e.length===1?`cycle`:`cycles`}`}. ${t} over the ${vk} ms budget.`});tableLabel=X(()=>this.span()?`Picked cycles, ${this.summary()}`:`All recorded cycles`);activeOptionId=X(()=>{let e=this.active();return this.focused()&&e!==null&&e{let e=this.hover()??(this.focused()?this.active():null),t=e===null?void 0:this.cycles()[e];return!t||e===null?null:{cycle:t,over:yk(t),top:t.components.slice(0,3),...this.tipSide(e)}});tipSide(e){let t=this.cycles().length;return e+.5=t.start&&e<=t.end}describe(e){let t=[`Cycle ${e.id}`,bk(e.ms)];yk(e)&&t.push(`over budget`),e.trigger&&t.push(`after ${e.trigger}`),t.push(`${e.checks} ${e.checks===1?`check`:`checks`}`);let n=e.components[0];return n&&t.push(`slowest ${n.name} ${bk(n.ms)}`),t.join(`, `)}select(e,t){let n=this.cycles(),r=n[Math.min(e,t)],i=n[Math.max(e,t)];r&&i&&this.range.set({from:r.id,to:i.id})}showAll(){this.range.set(null),this.anchor=null}setEnd(e,t){if(!this.cycles().length)return;let n=t.target,r=Number.parseInt(n.value,10);if(Number.isNaN(r)){n.value=String(e===`from`?this.startId():this.endId());return}let i=Math.min(Math.max(r,this.firstId()),this.lastId()),a=this.selected(),o=e===`from`?i:a[0]?.id??this.firstId(),s=e===`to`?i:a.at(-1)?.id??this.lastId();this.range.set({from:Math.min(o,s),to:Math.max(o,s)}),n.value=String(e===`from`?Math.min(o,s):Math.max(o,s))}onFocus(){this.focused.set(!0),(this.active()===null||this.active()>=this.cycles().length)&&this.active.set(this.span()?.start??Math.max(this.cycles().length-1,0)),this.anchor??=this.active()}onKey(e){let t=this.cycles().length;if(!t)return;let n=Math.min(this.active()??t-1,t-1),r=null;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=n+1;break;case`ArrowLeft`:case`ArrowUp`:r=n-1;break;case`PageDown`:r=n+uA;break;case`PageUp`:r=n-uA;break;case`Home`:r=0;break;case`End`:r=t-1;break;case`Enter`:case` `:e.preventDefault(),this.anchor=n,this.select(n,n);return;case`Escape`:this.range()&&(e.preventDefault(),this.showAll());return;default:return}e.preventDefault(),r=Math.min(Math.max(r,0),t-1),this.active.set(r),this.hover.set(null),e.shiftKey?(this.anchor??=n,this.select(this.anchor,r)):this.anchor=r}indexAt(e){let t=e.target?.closest?.(`[data-index]`);if(t)return Number(t.getAttribute(`data-index`));let n=e.currentTarget?.getBoundingClientRect(),r=this.cycles().length;if(!n?.width||!r)return null;let i=(e.clientX-n.left)/n.width;return Math.min(Math.max(Math.floor(i*r),0),r-1)}startDrag(e){if(e.button!==0)return;let t=this.indexAt(e);t!==null&&(this.dragging=!0,this.anchor=t,this.active.set(t),this.select(t,t))}onPointerMove(e){let t=this.indexAt(e);this.hover.set(t),this.dragging&&t!==null&&this.anchor!==null&&(this.active.set(t),this.select(this.anchor,t))}endDrag(){this.dragging=!1}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},Au)(`pointercancel`,function(){return t.endDrag()},Au)},inputs:{cycles:[1,`cycles`],range:[1,`range`]},outputs:{range:`rangeChange`},decls:69,vars:25,consts:[[1,`range`],[`type`,`number`,`inputmode`,`numeric`,3,`change`,`min`,`max`,`value`],[`type`,`button`],[1,`summary`],[1,`hint`,3,`id`],[1,`plot`],[`aria-hidden`,`true`,1,`axis`],[1,`tick`,`top`],[1,`tick`,`zero`],[1,`area`],[`aria-hidden`,`true`,1,`band`,3,`left`,`width`],[`aria-hidden`,`true`,1,`budget`],[`role`,`listbox`,`aria-multiselectable`,`true`,`aria-orientation`,`horizontal`,`tabindex`,`0`,1,`bars`,3,`keydown`,`focus`,`blur`,`pointerdown`,`pointermove`,`pointerleave`],[`role`,`option`,1,`col`,3,`id`,`over`,`out`,`active`],[`aria-hidden`,`true`,1,`tip`,3,`left`,`right`],[`aria-hidden`,`true`,1,`markers`],[3,`over`],[`aria-label`,`Chart key`,1,`legend`],[`aria-hidden`,`true`,1,`key`,`ok`],[`aria-hidden`,`true`,1,`key`,`over`],[`aria-hidden`,`true`,1,`key-marker`],[`aria-hidden`,`true`,1,`key`,`line`],[1,`table`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`band`],[`role`,`option`,1,`col`,3,`id`],[1,`bar`],[`aria-hidden`,`true`,1,`tip`],[1,`tip-head`],[1,`flag`],[1,`tip-row`],[1,`mono`],[1,`mono`,`name`],[1,`num`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),B(),z(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),B()(),z(5,`label`)(6,`span`),K(7,`End`),B(),z(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),B()(),j(9,Qk,2,0,`button`,2),z(10,`p`,3),K(11),B()(),z(12,`p`,4),K(13,` Drag across the bars to pick a range of cycles. With the chart focused, the arrow keys move between cycles, Shift with an arrow key extends the range, Enter picks one cycle and Escape shows all cycles again. `),B(),z(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),B(),z(18,`span`,8),K(19,`0 ms`),B()(),z(20,`div`,9),j(21,$k,1,4,`div`,10),z(22,`div`,11)(23,`span`),K(24),B()(),z(25,`div`,12),U(`keydown`,function(e){return t.onKey(e)})(`focus`,function(){return t.onFocus()})(`blur`,function(){return t.focused.set(!1)})(`pointerdown`,function(e){return t.startDrag(e)})(`pointermove`,function(e){return t.onPointerMove(e)})(`pointerleave`,function(){return t.hover.set(null)}),N(26,eA,2,12,`div`,13,Xk),B(),j(28,iA,12,12,`div`,14),B()(),z(29,`div`,15),N(30,aA,1,2,`span`,16,Xk),B(),z(32,`ul`,17)(33,`li`),Og(34,`span`,18),K(35,`Within budget`),B(),z(36,`li`),Og(37,`span`,19)(38,`span`,20),K(39,`Over budget `),B(),z(40,`li`),Og(41,`span`,21),K(42),B()(),z(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),B(),z(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),B(),z(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),B(),z(54,`th`,25),K(55,`Duration`),B(),z(56,`th`,26),K(57,`Budget`),B(),z(58,`th`,25),K(59,`Checks`),B(),z(60,`th`,25),K(61,`Passes`),B(),z(62,`th`,26),K(63,`After`),B(),z(64,`th`,26),K(65,`Slowest component`),B()()(),z(66,`tbody`),N(67,sA,15,7,`tr`,null,Zk),B()()()()),e&2){let e,n;O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),O(),M(t.range()?9:-1),O(2),q(t.summary()),O(),Pg(`id`,t.hintId),O(2),G(`flush`,t.bars().length>t.gapUntil),O(3),q(t.fmt(t.max())),O(4),M((e=t.band())?21:-1,e),O(),y_(`bottom`,t.budgetAt(),`%`),O(2),q(t.budgetLabel),O(),A(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),O(),P(t.bars()),O(2),M((n=t.tip())?28:-1,n),O(),G(`flush`,t.bars().length>t.gapUntil),O(),P(t.bars()),O(12),q(t.budgetLabel),O(4),A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(t.selected())}},styles:[`[_nghost-%COMP%] { +}`]})},Jk=(e,t)=>t.cycle.id,Yk=(e,t)=>t.id;function Xk(e,t){if(e&1){let e=V();z(0,`button`,27),U(`click`,function(){return w(e),T(W().showAll())}),K(1,`Show all cycles`),B()}}function Zk(e,t){if(e&1&&Og(0,`div`,28),e&2){let e=t;y_(`left`,e.left,`%`)(`width`,e.width,`%`)}}function Qk(e,t){if(e&1&&(z(0,`div`,29),Og(1,`span`,30),B()),e&2){let e=t.$implicit,n=W();G(`over`,e.over)(`out`,!n.inRange(e.index)&&!!n.range())(`active`,n.focused()&&n.active()===e.index),Pg(`id`,n.optionId(e.index)),A(`data-index`,e.index)(`aria-selected`,n.inRange(e.index))(`aria-label`,e.label),O(),y_(`height`,e.height,`%`)}}function $k(e,t){e&1&&(z(0,`span`,33),K(1,`over budget`),B())}function eA(e,t){if(e&1&&(z(0,`p`),K(1,` after `),z(2,`span`,35),K(3),B()()),e&2){let e=W();O(3),q(e.cycle.trigger)}}function tA(e,t){if(e&1&&(z(0,`p`,34)(1,`span`,36),K(2),B(),z(3,`span`),K(4),B()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(n.fmt(e.ms))}}function nA(e,t){if(e&1&&(z(0,`div`,31)(1,`p`,32)(2,`strong`),K(3),B(),z(4,`span`),K(5),B(),j(6,$k,2,0,`span`,33),B(),j(7,eA,4,1,`p`),z(8,`p`),K(9),B(),N(10,tA,5,2,`p`,34,gg),B()),e&2){let e=t,n=W();y_(`left`,e.left)(`right`,e.right),O(3),q(n.fmt(e.cycle.ms)),O(2),J(`cycle `,e.cycle.id),O(),M(e.over?6:-1),O(),M(e.cycle.trigger?7:-1),O(2),R_(` `,e.cycle.checks,` `,e.cycle.checks===1?`check`:`checks`,`, `,e.cycle.passes,` `,e.cycle.passes===1?`pass`:`passes`,` `),O(),P(e.top)}}function rA(e,t){if(e&1&&Og(0,`span`),e&2){let e=t.$implicit;G(`over`,e.over)}}function iA(e,t){if(e&1&&K(0),e&2){let e=t,n=W(2);Y(` `,e.name,` (`,n.fmt(e.ms),`) `)}}function aA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),K(2),B(),z(3,`td`,37),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,37),K(8),B(),z(9,`td`,37),K(10),B(),z(11,`td`,35),K(12),B(),z(13,`td`,35),j(14,iA,1,2),B()()),e&2){let e,n=t.$implicit,r=W();O(2),q(n.id),O(2),q(r.fmt(n.ms)),O(2),q(r.isOver(n)?`Over`:`Within`),O(2),q(n.checks),O(2),q(n.passes),O(2),q(n.trigger??``),O(2),M((e=n.components[0])?14:-1,e)}}var oA=0,sA=80,cA=10,lA=class e{cycles=$([]);range=Cv(null);gapUntil=sA;budgetLabel=`${gk} ms budget`;uid=`cd-chart-${oA++}`;hintId=`${this.uid}-hint`;active=D(null);anchor=null;dragging=!1;hover=D(null);focused=D(!1);max=X(()=>xk(this.cycles()));budgetAt=X(()=>gk/this.max()*100);bars=X(()=>{let e=this.max();return this.cycles().map((t,n)=>({cycle:t,index:n,height:t.ms/e*100,over:_k(t),label:this.describe(t)}))});firstId=X(()=>this.cycles()[0]?.id??0);lastId=X(()=>this.cycles().at(-1)?.id??0);span=X(()=>{let e=this.range();if(!e)return null;let t=this.cycles(),n=Math.min(e.from,e.to),r=Math.max(e.from,e.to),i=t.findIndex(e=>e.id>=n),a=-1;for(let e=t.length-1;e>=0;e--)if(t[e].id<=r){a=e;break}return i<0||ayk(this.cycles(),this.range()));startId=X(()=>this.selected()[0]?.id??``);endId=X(()=>this.selected().at(-1)?.id??``);band=X(()=>{let e=this.span(),t=this.cycles().length;return!e||!t?null:{left:e.start/t*100,width:(e.end-e.start+1)/t*100}});summary=X(()=>{let e=this.selected(),t=e.filter(_k).length;return`${this.span()?e.length===1?`Cycle ${e[0].id}`:`Cycles ${e[0].id} to ${e.at(-1).id} (${e.length})`:`All ${e.length} ${e.length===1?`cycle`:`cycles`}`}. ${t} over the ${gk} ms budget.`});tableLabel=X(()=>this.span()?`Picked cycles, ${this.summary()}`:`All recorded cycles`);activeOptionId=X(()=>{let e=this.active();return this.focused()&&e!==null&&e{let e=this.hover()??(this.focused()?this.active():null),t=e===null?void 0:this.cycles()[e];return!t||e===null?null:{cycle:t,over:_k(t),top:t.components.slice(0,3),...this.tipSide(e)}});tipSide(e){let t=this.cycles().length;return e+.5=t.start&&e<=t.end}describe(e){let t=[`Cycle ${e.id}`,vk(e.ms)];_k(e)&&t.push(`over budget`),e.trigger&&t.push(`after ${e.trigger}`),t.push(`${e.checks} ${e.checks===1?`check`:`checks`}`);let n=e.components[0];return n&&t.push(`slowest ${n.name} ${vk(n.ms)}`),t.join(`, `)}select(e,t){let n=this.cycles(),r=n[Math.min(e,t)],i=n[Math.max(e,t)];r&&i&&this.range.set({from:r.id,to:i.id})}showAll(){this.range.set(null),this.anchor=null}setEnd(e,t){if(!this.cycles().length)return;let n=t.target,r=Number.parseInt(n.value,10);if(Number.isNaN(r)){n.value=String(e===`from`?this.startId():this.endId());return}let i=Math.min(Math.max(r,this.firstId()),this.lastId()),a=this.selected(),o=e===`from`?i:a[0]?.id??this.firstId(),s=e===`to`?i:a.at(-1)?.id??this.lastId();this.range.set({from:Math.min(o,s),to:Math.max(o,s)}),n.value=String(e===`from`?Math.min(o,s):Math.max(o,s))}onFocus(){this.focused.set(!0),(this.active()===null||this.active()>=this.cycles().length)&&this.active.set(this.span()?.start??Math.max(this.cycles().length-1,0)),this.anchor??=this.active()}onKey(e){let t=this.cycles().length;if(!t)return;let n=Math.min(this.active()??t-1,t-1),r=null;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=n+1;break;case`ArrowLeft`:case`ArrowUp`:r=n-1;break;case`PageDown`:r=n+cA;break;case`PageUp`:r=n-cA;break;case`Home`:r=0;break;case`End`:r=t-1;break;case`Enter`:case` `:e.preventDefault(),this.anchor=n,this.select(n,n);return;case`Escape`:this.range()&&(e.preventDefault(),this.showAll());return;default:return}e.preventDefault(),r=Math.min(Math.max(r,0),t-1),this.active.set(r),this.hover.set(null),e.shiftKey?(this.anchor??=n,this.select(this.anchor,r)):this.anchor=r}indexAt(e){let t=e.target?.closest?.(`[data-index]`);if(t)return Number(t.getAttribute(`data-index`));let n=e.currentTarget?.getBoundingClientRect(),r=this.cycles().length;if(!n?.width||!r)return null;let i=(e.clientX-n.left)/n.width;return Math.min(Math.max(Math.floor(i*r),0),r-1)}startDrag(e){if(e.button!==0)return;let t=this.indexAt(e);t!==null&&(this.dragging=!0,this.anchor=t,this.active.set(t),this.select(t,t))}onPointerMove(e){let t=this.indexAt(e);this.hover.set(t),this.dragging&&t!==null&&this.anchor!==null&&(this.active.set(t),this.select(this.anchor,t))}endDrag(){this.dragging=!1}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-cycle-chart`]],hostBindings:function(e,t){e&1&&H(`pointerup`,function(){return t.endDrag()},Au)(`pointercancel`,function(){return t.endDrag()},Au)},inputs:{cycles:[1,`cycles`],range:[1,`range`]},outputs:{range:`rangeChange`},decls:69,vars:25,consts:[[1,`range`],[`type`,`number`,`inputmode`,`numeric`,3,`change`,`min`,`max`,`value`],[`type`,`button`],[1,`summary`],[1,`hint`,3,`id`],[1,`plot`],[`aria-hidden`,`true`,1,`axis`],[1,`tick`,`top`],[1,`tick`,`zero`],[1,`area`],[`aria-hidden`,`true`,1,`band`,3,`left`,`width`],[`aria-hidden`,`true`,1,`budget`],[`role`,`listbox`,`aria-multiselectable`,`true`,`aria-orientation`,`horizontal`,`tabindex`,`0`,1,`bars`,3,`keydown`,`focus`,`blur`,`pointerdown`,`pointermove`,`pointerleave`],[`role`,`option`,1,`col`,3,`id`,`over`,`out`,`active`],[`aria-hidden`,`true`,1,`tip`,3,`left`,`right`],[`aria-hidden`,`true`,1,`markers`],[3,`over`],[`aria-label`,`Chart key`,1,`legend`],[`aria-hidden`,`true`,1,`key`,`ok`],[`aria-hidden`,`true`,1,`key`,`over`],[`aria-hidden`,`true`,1,`key-marker`],[`aria-hidden`,`true`,1,`key`,`line`],[1,`table`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`band`],[`role`,`option`,1,`col`,3,`id`],[1,`bar`],[`aria-hidden`,`true`,1,`tip`],[1,`tip-head`],[1,`flag`],[1,`tip-row`],[1,`mono`],[1,`mono`,`name`],[1,`num`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`label`)(2,`span`),K(3,`Start`),B(),z(4,`input`,1),U(`change`,function(e){return t.setEnd(`from`,e)}),B()(),z(5,`label`)(6,`span`),K(7,`End`),B(),z(8,`input`,1),U(`change`,function(e){return t.setEnd(`to`,e)}),B()(),j(9,Xk,2,0,`button`,2),z(10,`p`,3),K(11),B()(),z(12,`p`,4),K(13,` Drag across the bars to pick a range of cycles. With the chart focused, the arrow keys move between cycles, Shift with an arrow key extends the range, Enter picks one cycle and Escape shows all cycles again. `),B(),z(14,`div`,5)(15,`div`,6)(16,`span`,7),K(17),B(),z(18,`span`,8),K(19,`0 ms`),B()(),z(20,`div`,9),j(21,Zk,1,4,`div`,10),z(22,`div`,11)(23,`span`),K(24),B()(),z(25,`div`,12),U(`keydown`,function(e){return t.onKey(e)})(`focus`,function(){return t.onFocus()})(`blur`,function(){return t.focused.set(!1)})(`pointerdown`,function(e){return t.startDrag(e)})(`pointermove`,function(e){return t.onPointerMove(e)})(`pointerleave`,function(){return t.hover.set(null)}),N(26,Qk,2,12,`div`,13,Jk),B(),j(28,nA,12,12,`div`,14),B()(),z(29,`div`,15),N(30,rA,1,2,`span`,16,Jk),B(),z(32,`ul`,17)(33,`li`),Og(34,`span`,18),K(35,`Within budget`),B(),z(36,`li`),Og(37,`span`,19)(38,`span`,20),K(39,`Over budget `),B(),z(40,`li`),Og(41,`span`,21),K(42),B()(),z(43,`details`,22)(44,`summary`),K(45,`Show the cycles as a table`),B(),z(46,`div`,23)(47,`table`)(48,`caption`,24),K(49),B(),z(50,`thead`)(51,`tr`)(52,`th`,25),K(53,`Cycle`),B(),z(54,`th`,25),K(55,`Duration`),B(),z(56,`th`,26),K(57,`Budget`),B(),z(58,`th`,25),K(59,`Checks`),B(),z(60,`th`,25),K(61,`Passes`),B(),z(62,`th`,26),K(63,`After`),B(),z(64,`th`,26),K(65,`Slowest component`),B()()(),z(66,`tbody`),N(67,aA,15,7,`tr`,null,Yk),B()()()()),e&2){let e,n;O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.startId()),O(4),Pg(`min`,t.firstId())(`max`,t.lastId())(`value`,t.endId()),O(),M(t.range()?9:-1),O(2),q(t.summary()),O(),Pg(`id`,t.hintId),O(2),G(`flush`,t.bars().length>t.gapUntil),O(3),q(t.fmt(t.max())),O(4),M((e=t.band())?21:-1,e),O(),y_(`bottom`,t.budgetAt(),`%`),O(2),q(t.budgetLabel),O(),A(`aria-label`,`Change detection cycles, `+t.summary())(`aria-describedby`,t.hintId)(`aria-activedescendant`,t.activeOptionId()),O(),P(t.bars()),O(2),M((n=t.tip())?28:-1,n),O(),G(`flush`,t.bars().length>t.gapUntil),O(),P(t.bars()),O(12),q(t.budgetLabel),O(4),A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(t.selected())}},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1224,7 +1224,7 @@ td.mono[_ngcontent-%COMP%] { .bar[_ngcontent-%COMP%] { transition: none; } -}`]})},fA=(e,t)=>t.id,pA=(e,t)=>t.index,mA=(e,t)=>t.kind;function hA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(2);O(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function gA(e,t){if(e&1&&(z(0,`span`),K(1),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`width`,e.w,`%`),O(),J(`cycle `,e.id)}}function _A(e,t){if(e&1){let e=V();z(0,`button`,11),U(`focus`,function(){let t=w(e).$implicit;return T(W(3).current.set(t.index))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).hover.set(t.index))})(`mouseleave`,function(){return w(e),T(W(3).hover.set(null))})(`click`,function(){let t=w(e).$implicit;return T(W(3).choose(t))}),z(1,`span`,12),K(2),B()()}if(e&2){let e=t.$implicit,n=W(3);b_(Y_(`block kind-`,e.kind)),y_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),A(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),O(2),q(e.name)}}function vA(e,t){if(e&1&&(z(0,`li`),Og(1,`span`,13),K(2),B()),e&2){let e=t.$implicit;O(),b_(Y_(`key kind-`,e.kind)),O(),q(e.label)}}function yA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(3);O(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function bA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,17),K(2),B(),z(3,`td`,18),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,17),K(8),B(),z(9,`td`,17),K(10),B(),z(11,`td`,17),K(12),B(),z(13,`td`,17),K(14),B()()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.cycleId),O(),y_(`padding-left`,6+e.depth*8,`px`),O(),q(e.name),O(2),q(n.kindLabel(e)),O(2),q(e.depth),O(2),q(n.fmt(e.start)),O(2),q(n.fmt(e.ms)),O(2),q(n.fmt(e.selfMs))}}function xA(e,t){if(e&1&&(z(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),B(),z(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),B(),z(8,`th`,16),K(9,`Span`),B(),z(10,`th`,16),K(11,`Kind`),B(),z(12,`th`,15),K(13,`Depth`),B(),z(14,`th`,15),K(15,`Start`),B(),z(16,`th`,15),K(17,`Total`),B(),z(18,`th`,15),K(19,`Self`),B()()(),z(20,`tbody`),N(21,bA,15,9,`tr`,null,pA),B()()()),e&2){let e=W(),t=W(2);A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(e.blocks)}}function SA(e,t){if(e&1){let e=V();z(0,`div`,1),U(`keydown`,function(t){return w(e),T(W(2).onKey(t))}),z(1,`div`,2),N(2,gA,2,5,`span`,3,fA),B(),z(4,`div`,4),N(5,_A,3,16,`button`,5,pA),B()(),z(7,`p`,6),K(8),B(),z(9,`ul`,7),N(10,vA,3,4,`li`,null,mA),B(),z(12,`p`,8),K(13,` Arrow keys move along a row, Up goes to the enclosing span and Down to the first nested one. Enter on a component shows it in the tree. `),B(),j(14,yA,2,2,`p`,0),z(15,`details`,9),U(`toggle`,function(t){return w(e),T(W(2).onToggle(t))}),z(16,`summary`),K(17,`Show the spans as a table`),B(),j(18,xA,23,2,`div`,10),B()}if(e&2){let e=t,n=W(2);A(`aria-label`,n.label()),O(2),P(e.cycles),O(2),y_(`height`,e.depth*n.row,`px`),O(),P(e.blocks),O(3),q(n.readout()),O(2),P(n.kinds),O(4),M(n.dropped()?14:-1),O(4),M(n.tableOpen()?18:-1)}}function CA(e,t){if(e&1&&(z(0,`h3`),K(1,`Spans in the picked cycles`),B(),j(2,hA,2,2,`p`,0)(3,SA,19,6)),e&2){let e,t=W();O(2),M(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var wA=22;function TA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var EA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=bv();row=wA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:Tk[e]}));current=D(0);tableOpen=D(!1);hover=D(null);hasSpans=X(()=>this.cycles().some(e=>e.spans?.length));count=X(()=>this.cycles().length);tooMany=X(()=>this.count()>30);graph=X(()=>this.tooMany()?null:Dk(this.cycles(),this.names()));tabStop=X(()=>Math.min(this.current(),Math.max((this.graph()?.blocks.length??1)-1,0)));dropped=X(()=>this.graph()?.cycles.reduce((e,t)=>e+t.droppedSpans,0)??0);label=X(()=>`Spans in ${this.scope()} over time, nested by depth. Pick a component to show it in the tree.`);readout=X(()=>{let e=(this.graph()?.blocks??[])[this.hover()??this.tabStop()];return e?this.describe(e):``});tableLabel=X(()=>`Timed spans in ${this.scope()}`);fmt(e){return bk(e)}kindLabel(e){return Tk[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,Tk[e.kind],`${bk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${bk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${bk(-e.start)} before it started`:`cycle ${e.cycleId} at ${bk(e.start)}`),t.join(`, `)}choose(e){this.current.set(e.index),e.component&&this.pick.emit(e.component)}onKey(e){let t=this.graph()?.blocks??[];if(!t.length)return;let n=t[this.tabStop()],r;switch(e.key){case`ArrowRight`:r=t.find(e=>e.index>n.index&&e.depth===n.depth);break;case`ArrowLeft`:r=TA(t,e=>e.indexe.indexe.parent===n.index)??t.find(e=>e.index>n.index&&e.depth===n.depth+1);break;case`Home`:r=t[0];break;case`End`:r=t.at(-1);break;default:return}e.preventDefault(),this.hover.set(null),r&&(this.current.set(r.index),e.currentTarget.querySelector(`button[data-index="${r.index}"]`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-flame-graph`]],inputs:{cycles:[1,`cycles`],names:[1,`names`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:1,vars:1,consts:[[1,`note`],[`role`,`group`,1,`flame`,3,`keydown`],[`aria-hidden`,`true`,1,`cycles`],[3,`left`,`width`],[1,`rows`],[`type`,`button`,3,`class`,`narrow`,`left`,`width`,`top`],[`aria-hidden`,`true`,1,`readout`],[`aria-label`,`Span kinds`,1,`legend`],[1,`hint`],[1,`table`,3,`toggle`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[`type`,`button`,3,`focus`,`mouseenter`,`mouseleave`,`click`],[1,`text`],[`aria-hidden`,`true`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[1,`num`],[1,`mono`]],template:function(e,t){e&1&&j(0,CA,4,1),e&2&&M(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},uA=(e,t)=>t.id,dA=(e,t)=>t.index,fA=(e,t)=>t.kind;function pA(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(2);O(),Y(` Pick `,e.max,` cycles or fewer to see their spans. `,e.count(),` are picked. `)}}function mA(e,t){if(e&1&&(z(0,`span`),K(1),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`width`,e.w,`%`),O(),J(`cycle `,e.id)}}function hA(e,t){if(e&1){let e=V();z(0,`button`,11),U(`focus`,function(){let t=w(e).$implicit;return T(W(3).current.set(t.index))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).hover.set(t.index))})(`mouseleave`,function(){return w(e),T(W(3).hover.set(null))})(`click`,function(){let t=w(e).$implicit;return T(W(3).choose(t))}),z(1,`span`,12),K(2),B()()}if(e&2){let e=t.$implicit,n=W(3);b_(q_(`block kind-`,e.kind)),y_(`left`,e.x,`%`)(`width`,e.w,`%`)(`top`,e.depth*n.row,`px`),G(`narrow`,e.w<4),A(`tabindex`,e.index===n.tabStop()?0:-1)(`data-index`,e.index)(`aria-label`,n.describe(e))(`aria-disabled`,e.component?null:`true`),O(2),q(e.name)}}function gA(e,t){if(e&1&&(z(0,`li`),Og(1,`span`,13),K(2),B()),e&2){let e=t.$implicit;O(),b_(q_(`key kind-`,e.kind)),O(),q(e.label)}}function _A(e,t){if(e&1&&(z(0,`p`,0),K(1),B()),e&2){let e=W(3);O(),Y(` Each cycle keeps its longest spans. `,e.dropped(),` shorter `,e.dropped()===1?`span was`:`spans were`,` left out. `)}}function vA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,17),K(2),B(),z(3,`td`,18),K(4),B(),z(5,`td`),K(6),B(),z(7,`td`,17),K(8),B(),z(9,`td`,17),K(10),B(),z(11,`td`,17),K(12),B(),z(13,`td`,17),K(14),B()()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.cycleId),O(),y_(`padding-left`,6+e.depth*8,`px`),O(),q(e.name),O(2),q(n.kindLabel(e)),O(2),q(e.depth),O(2),q(n.fmt(e.start)),O(2),q(n.fmt(e.ms)),O(2),q(n.fmt(e.selfMs))}}function yA(e,t){if(e&1&&(z(0,`div`,10)(1,`table`)(2,`caption`,14),K(3),B(),z(4,`thead`)(5,`tr`)(6,`th`,15),K(7,`Cycle`),B(),z(8,`th`,16),K(9,`Span`),B(),z(10,`th`,16),K(11,`Kind`),B(),z(12,`th`,15),K(13,`Depth`),B(),z(14,`th`,15),K(15,`Start`),B(),z(16,`th`,15),K(17,`Total`),B(),z(18,`th`,15),K(19,`Self`),B()()(),z(20,`tbody`),N(21,vA,15,9,`tr`,null,dA),B()()()),e&2){let e=W(),t=W(2);A(`aria-label`,t.tableLabel()),O(3),J(` `,t.tableLabel(),` `),O(18),P(e.blocks)}}function bA(e,t){if(e&1){let e=V();z(0,`div`,1),U(`keydown`,function(t){return w(e),T(W(2).onKey(t))}),z(1,`div`,2),N(2,mA,2,5,`span`,3,uA),B(),z(4,`div`,4),N(5,hA,3,16,`button`,5,dA),B()(),z(7,`p`,6),K(8),B(),z(9,`ul`,7),N(10,gA,3,4,`li`,null,fA),B(),z(12,`p`,8),K(13,` Arrow keys move along a row, Up goes to the enclosing span and Down to the first nested one. Enter on a component shows it in the tree. `),B(),j(14,_A,2,2,`p`,0),z(15,`details`,9),U(`toggle`,function(t){return w(e),T(W(2).onToggle(t))}),z(16,`summary`),K(17,`Show the spans as a table`),B(),j(18,yA,23,2,`div`,10),B()}if(e&2){let e=t,n=W(2);A(`aria-label`,n.label()),O(2),P(e.cycles),O(2),y_(`height`,e.depth*n.row,`px`),O(),P(e.blocks),O(3),q(n.readout()),O(2),P(n.kinds),O(4),M(n.dropped()?14:-1),O(4),M(n.tableOpen()?18:-1)}}function xA(e,t){if(e&1&&(z(0,`h3`),K(1,`Spans in the picked cycles`),B(),j(2,pA,2,2,`p`,0)(3,bA,19,6)),e&2){let e,t=W();O(2),M(t.tooMany()?2:(e=t.graph())?3:-1,e)}}var SA=22;function CA(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}var wA=class e{cycles=$([]);names=$([]);scope=$(`the recording`);pick=vv();row=SA;max=30;kinds=[`c`,`h`,`r`,`o`].map(e=>({kind:e,label:Ck[e]}));current=D(0);tableOpen=D(!1);hover=D(null);hasSpans=X(()=>this.cycles().some(e=>e.spans?.length));count=X(()=>this.cycles().length);tooMany=X(()=>this.count()>30);graph=X(()=>this.tooMany()?null:Tk(this.cycles(),this.names()));tabStop=X(()=>Math.min(this.current(),Math.max((this.graph()?.blocks.length??1)-1,0)));dropped=X(()=>this.graph()?.cycles.reduce((e,t)=>e+t.droppedSpans,0)??0);label=X(()=>`Spans in ${this.scope()} over time, nested by depth. Pick a component to show it in the tree.`);readout=X(()=>{let e=(this.graph()?.blocks??[])[this.hover()??this.tabStop()];return e?this.describe(e):``});tableLabel=X(()=>`Timed spans in ${this.scope()}`);fmt(e){return vk(e)}kindLabel(e){return Ck[e.kind]}onToggle(e){this.tableOpen.set(e.target.open)}describe(e){let t=[e.name,Ck[e.kind],`${vk(e.ms)} total`];return e.selfMs!==e.ms&&t.push(`${vk(e.selfMs)} self`),t.push(e.start<0?`cycle ${e.cycleId}, ${vk(-e.start)} before it started`:`cycle ${e.cycleId} at ${vk(e.start)}`),t.join(`, `)}choose(e){this.current.set(e.index),e.component&&this.pick.emit(e.component)}onKey(e){let t=this.graph()?.blocks??[];if(!t.length)return;let n=t[this.tabStop()],r;switch(e.key){case`ArrowRight`:r=t.find(e=>e.index>n.index&&e.depth===n.depth);break;case`ArrowLeft`:r=CA(t,e=>e.indexe.indexe.parent===n.index)??t.find(e=>e.index>n.index&&e.depth===n.depth+1);break;case`Home`:r=t[0];break;case`End`:r=t.at(-1);break;default:return}e.preventDefault(),this.hover.set(null),r&&(this.current.set(r.index),e.currentTarget.querySelector(`button[data-index="${r.index}"]`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-flame-graph`]],inputs:{cycles:[1,`cycles`],names:[1,`names`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:1,vars:1,consts:[[1,`note`],[`role`,`group`,1,`flame`,3,`keydown`],[`aria-hidden`,`true`,1,`cycles`],[3,`left`,`width`],[1,`rows`],[`type`,`button`,3,`class`,`narrow`,`left`,`width`,`top`],[`aria-hidden`,`true`,1,`readout`],[`aria-label`,`Span kinds`,1,`legend`],[1,`hint`],[1,`table`,3,`toggle`],[`tabindex`,`0`,`role`,`region`,1,`table-wrap`],[`type`,`button`,3,`focus`,`mouseenter`,`mouseleave`,`click`],[1,`text`],[`aria-hidden`,`true`],[1,`sr-only`],[`scope`,`col`,1,`num`],[`scope`,`col`],[1,`num`],[1,`mono`]],template:function(e,t){e&1&&j(0,xA,4,1),e&2&&M(t.hasSpans()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1431,7 +1431,7 @@ td.mono[_ngcontent-%COMP%] { .num[_ngcontent-%COMP%] { text-align: right; font-variant-numeric: tabular-nums; -}`]})};function DA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),Y(``,e.name,`.`,e.hook),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function OA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,DA,9,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.hooks())}}function kA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function AA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),j(3,kA,1,1),B(),z(4,`td`,6),K(5),B(),z(6,`td`,6),K(7),B(),z(8,`td`,6),K(9),B()()),e&2){let e=t.$implicit,n=W(3);O(2),J(` `,e.name,` `),O(),M(e.listener?3:-1),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function jA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Output listeners`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,AA,10,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.outputs())}}function MA(e,t){if(e&1&&(z(0,`p`,1),K(1),B()),e&2){let e=t,n=W(2);O(),B_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function NA(e,t){if(e&1&&(z(0,`p`,2),K(1),B()),e&2){let e=W(2);O(),Y(` `,e.dropped(),` more hook or output `,e.dropped()===1?`row is`:`rows are`,` left out. A recording lists at most 100 of each. `)}}function PA(e,t){if(e&1&&(z(0,`div`,0),j(1,OA,17,0,`div`),j(2,jA,17,0,`div`),B(),j(3,MA,2,4,`p`,1),j(4,NA,2,2,`p`,2)),e&2){let e,t=W();O(),M(t.hooks().length?1:-1),O(),M(t.outputs().length?2:-1),O(),M((e=t.afterRender())?3:-1,e),O(),M(t.dropped()?4:-1)}}var FA=10;function IA(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var LA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,FA));outputs=X(()=>(this.page()?.outputs??[]).slice(0,FA));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return IA(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-timing`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[1,`timing`],[1,`after-render`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`mono`],[1,`num`]],template:function(e,t){e&1&&j(0,PA,5,4),e&2&&M(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function TA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),B(),z(3,`td`,6),K(4),B(),z(5,`td`,6),K(6),B(),z(7,`td`,6),K(8),B()()),e&2){let e=t.$implicit,n=W(3);O(2),Y(``,e.name,`.`,e.hook),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function EA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Lifecycle hooks`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Hook`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,TA,9,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.hooks())}}function DA(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` (`,e.listener,`) `)}}function OA(e,t){if(e&1&&(z(0,`tr`)(1,`td`,5),K(2),j(3,DA,1,1),B(),z(4,`td`,6),K(5),B(),z(6,`td`,6),K(7),B(),z(8,`td`,6),K(9),B()()),e&2){let e=t.$implicit,n=W(3);O(2),J(` `,e.name,` `),O(),M(e.listener?3:-1),O(2),q(e.calls),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function kA(e,t){if(e&1&&(z(0,`div`)(1,`h3`),K(2,`Output listeners`),B(),z(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,3),K(7,`Listener`),B(),z(8,`th`,4),K(9,`Calls`),B(),z(10,`th`,4),K(11,`Time`),B(),z(12,`th`,4),K(13,`Slowest`),B()()(),z(14,`tbody`),N(15,OA,10,5,`tr`,null,gg),B()()()),e&2){let e=W(2);O(15),P(e.outputs())}}function AA(e,t){if(e&1&&(z(0,`p`,1),K(1),B()),e&2){let e=t,n=W(2);O(),R_(` afterRender callbacks ran `,e.runs,` `,e.runs===1?`time`:`times`,`, `,n.ms(e.ms),` in total, slowest `,n.ms(e.maxMs),`. `)}}function jA(e,t){if(e&1&&(z(0,`p`,2),K(1),B()),e&2){let e=W(2);O(),Y(` `,e.dropped(),` more hook or output `,e.dropped()===1?`row is`:`rows are`,` left out. A recording lists at most 100 of each. `)}}function MA(e,t){if(e&1&&(z(0,`div`,0),j(1,EA,17,0,`div`),j(2,kA,17,0,`div`),B(),j(3,AA,2,4,`p`,1),j(4,jA,2,2,`p`,2)),e&2){let e,t=W();O(),M(t.hooks().length?1:-1),O(),M(t.outputs().length?2:-1),O(),M((e=t.afterRender())?3:-1,e),O(),M(t.dropped()?4:-1)}}var NA=10;function PA(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}var FA=class e{page=$(null);hooks=X(()=>(this.page()?.hooks??[]).slice(0,NA));outputs=X(()=>(this.page()?.outputs??[]).slice(0,NA));afterRender=X(()=>{let e=this.page()?.afterRender;return e?.runs?e:null});dropped=X(()=>this.page()?.droppedTimings??0);ms(e){return PA(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-timing`]],inputs:{page:[1,`page`]},decls:1,vars:1,consts:[[1,`timing`],[1,`after-render`],[1,`note`],[`scope`,`col`],[`scope`,`col`,1,`num`],[1,`mono`],[1,`num`]],template:function(e,t){e&1&&j(0,MA,5,4),e&2&&M(t.hooks().length||t.outputs().length||t.afterRender()?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -1491,7 +1491,7 @@ td.mono[_ngcontent-%COMP%] { margin: 8px 0 0; color: var(--%NS%text-2); font-size: 12px; -}`]})};function RA(e,t){if(e&1&&(z(0,`p`,5),K(1),B()),e&2){let e=W();O(),q(e.error())}}function zA(e,t){let n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.append(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),0)}var BA=class e{page=$(null);maxCycles=$(200);imported=bv();error=D(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&zA(uk(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&zA(_k(e,e.pageId),`change-detection-${e.pageId}.trace.json`)}async read(e){let t=e.files?.[0];if(e.value=``,!t)return;if(t.size>2e7){this.error.set(`${t.name}: The file is larger than 20 MB.`);return}let n;try{n=await t.text()}catch{this.error.set(`Could not read the file.`);return}let r=dk(n,this.maxCycles());if(!r.ok){this.error.set(`${t.name}: ${r.error}`);return}this.error.set(``),this.imported.emit({fileName:t.name,page:{...r.recording,pageId:r.pageId,supported:!0}})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-transfer`]],inputs:{page:[1,`page`],maxCycles:[1,`maxCycles`]},outputs:{imported:`imported`},decls:10,vars:3,consts:[[`file`,``],[`role`,`group`,`aria-label`,`Export and import the recording`,1,`transfer`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[`type`,`file`,`accept`,`.json,application/json`,`hidden`,``,3,`change`],[`role`,`alert`,1,`error`]],template:function(e,t){if(e&1){let e=V();z(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),B(),z(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),B(),z(5,`button`,3),U(`click`,function(){return w(e),T(Qg(8).click())}),K(6,`Import`),B(),z(7,`input`,4,0),U(`change`,function(){w(e);let n=Qg(8);return T(t.read(n))}),B()(),j(9,RA,2,1,`p`,5)}e&2&&(O(),Pg(`disabled`,!t.hasCycles()),O(2),Pg(`disabled`,!t.hasCycles()),O(6),M(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { +}`]})};function IA(e,t){if(e&1&&(z(0,`p`,5),K(1),B()),e&2){let e=W();O(),q(e.error())}}function LA(e,t){let n=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.append(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),0)}var RA=class e{page=$(null);maxCycles=$(200);imported=vv();error=D(``);hasCycles(){return(this.page()?.cycles.length??0)>0}exportJson(){let e=this.page();e&&LA(ck(e,e.pageId),`change-detection-${e.pageId}.json`)}exportTrace(){let e=this.page();e&&LA(hk(e,e.pageId),`change-detection-${e.pageId}.trace.json`)}async read(e){let t=e.files?.[0];if(e.value=``,!t)return;if(t.size>2e7){this.error.set(`${t.name}: The file is larger than 20 MB.`);return}let n;try{n=await t.text()}catch{this.error.set(`Could not read the file.`);return}let r=lk(n,this.maxCycles());if(!r.ok){this.error.set(`${t.name}: ${r.error}`);return}this.error.set(``),this.imported.emit({fileName:t.name,page:{...r.recording,pageId:r.pageId,supported:!0}})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-transfer`]],inputs:{page:[1,`page`],maxCycles:[1,`maxCycles`]},outputs:{imported:`imported`},decls:10,vars:3,consts:[[`file`,``],[`role`,`group`,`aria-label`,`Export and import the recording`,1,`transfer`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[`type`,`file`,`accept`,`.json,application/json`,`hidden`,``,3,`change`],[`role`,`alert`,1,`error`]],template:function(e,t){if(e&1){let e=V();z(0,`div`,1)(1,`button`,2),U(`click`,function(){return t.exportJson()}),K(2,`Export JSON`),B(),z(3,`button`,2),U(`click`,function(){return t.exportTrace()}),K(4,` Export trace (Perfetto) `),B(),z(5,`button`,3),U(`click`,function(){return w(e),T(Qg(8).click())}),K(6,`Import`),B(),z(7,`input`,4,0),U(`change`,function(){w(e);let n=Qg(8);return T(t.read(n))}),B()(),j(9,IA,2,1,`p`,5)}e&2&&(O(),Pg(`disabled`,!t.hasCycles()),O(2),Pg(`disabled`,!t.hasCycles()),O(6),M(t.error()?9:-1))},styles:[`[_nghost-%COMP%] { display: contents; } @@ -1533,7 +1533,7 @@ button[_ngcontent-%COMP%]:disabled { margin: 0; color: var(--%NS%danger-text); font-size: 12px; -}`]})},VA=(e,t)=>t.stat.name;function HA(e,t){if(e&1&&(z(0,`span`,8),K(1),B()),e&2){let e=W(2).$implicit;O(),J(``,e.other,` more`)}}function UA(e,t){if(e&1&&(z(0,`div`,6)(1,`span`,7),K(2),B(),j(3,HA,2,1,`span`,8),B()),e&2){let e=W().$implicit;y_(`--%NS%tone`,e.tone+`%`),O(2),q(e.label),O(),M(e.roomy?3:-1)}}function WA(e,t){if(e&1&&(z(0,`span`,10),K(1),B(),z(2,`span`,11),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(),q(e.stat.name),O(2),q(t.fmt(e.stat.ms))}}function GA(e,t){if(e&1){let e=V();z(0,`button`,9),U(`focus`,function(){w(e);let t=W().$index;return T(W(2).current.set(t))})(`click`,function(){w(e);let t=W().$implicit;return T(W(2).pick.emit(t.stat.name))}),j(1,WA,4,2),B()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);y_(`--%NS%tone`,t.tone+`%`),A(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),O(),M(t.roomy?1:-1)}}function KA(e,t){if(e&1&&(z(0,`li`),j(1,UA,4,4,`div`,4)(2,GA,2,6,`button`,5),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),O(),M(e.other?1:2)}}function qA(e,t){if(e&1){let e=V();z(0,`ul`,2),U(`keydown`,function(t){return w(e),T(W().onKey(t))}),N(1,KA,3,9,`li`,3,VA),B()}if(e&2){let e=W();A(`aria-label`,e.label()),O(),P(e.cells())}}function JA(e,t){e&1&&(z(0,`p`,1),K(1,`No component time in these cycles.`),B())}var YA=24,XA=3,ZA=class e{stats=$([]);scope=$(`the recording`);pick=bv();current=D(0);label=X(()=>`Self time per component in ${this.scope()}, largest first. Pick one to show it in the tree.`);cells=X(()=>{let e=this.stats().filter(e=>e.ms>0),t=e.slice(0,YA),n=e.slice(YA),r=n.reduce((e,t)=>e+t.ms,0),i=t.map(e=>({stat:e,other:0}));n.length&&i.push({stat:{name:`Other components`,checks:0,ms:r,maxMs:0,cycles:0},other:n.length});let a=e.reduce((e,t)=>e+t.ms,0),o=t[0]?.ms??1,s=wk(i,e=>e.stat.ms,XA);return s.sort((e,t)=>Number(e.item.other>0)-Number(t.item.other>0)),s.map(e=>{let{stat:t,other:n}=e.item,r=a?Math.round(t.ms/a*100):0;return{stat:t,other:n,x:e.x,y:e.y,w:e.w,h:e.h,tone:n?0:14+Math.round(26*Math.min(t.ms/o,1)),roomy:e.w>=10&&e.h>=22,label:n?`${n} more components, ${bk(t.ms)}, ${r}% of self time`:`${t.name}, ${bk(t.ms)} self time, ${r}%, ${t.checks} ${t.checks===1?`check`:`checks`}`}})});tabStop=X(()=>Math.min(this.current(),Math.max(this.cells().filter(e=>!e.other).length-1,0)));fmt(e){return bk(e)}onKey(e){let t=this.cells().filter(e=>!e.other).length;if(!t)return;let n=this.tabStop(),r;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=Math.min(n+1,t-1);break;case`ArrowLeft`:case`ArrowUp`:r=Math.max(n-1,0);break;case`Home`:r=0;break;case`End`:r=t-1;break;default:return}e.preventDefault(),this.current.set(r),e.currentTarget.querySelector(`button[data-index="${r}"]`)?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-treemap`]],inputs:{stats:[1,`stats`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:2,vars:1,consts:[[1,`map`],[1,`empty`],[1,`map`,3,`keydown`],[3,`left`,`top`,`width`,`height`],[1,`cell`,`other`,3,`--%NS%tone`],[`type`,`button`,1,`cell`,3,`--%NS%tone`],[1,`cell`,`other`],[1,`sr-only`],[`aria-hidden`,`true`,1,`name`],[`type`,`button`,1,`cell`,3,`focus`,`click`],[1,`name`,`mono`],[1,`ms`]],template:function(e,t){e&1&&j(0,qA,3,1,`ul`,0)(1,JA,2,0,`p`,1),e&2&&M(+!t.cells().length)},styles:[`[_nghost-%COMP%] { +}`]})},zA=(e,t)=>t.stat.name;function BA(e,t){if(e&1&&(z(0,`span`,8),K(1),B()),e&2){let e=W(2).$implicit;O(),J(``,e.other,` more`)}}function VA(e,t){if(e&1&&(z(0,`div`,6)(1,`span`,7),K(2),B(),j(3,BA,2,1,`span`,8),B()),e&2){let e=W().$implicit;y_(`--%NS%tone`,e.tone+`%`),O(2),q(e.label),O(),M(e.roomy?3:-1)}}function HA(e,t){if(e&1&&(z(0,`span`,10),K(1),B(),z(2,`span`,11),K(3),B()),e&2){let e=W(2).$implicit,t=W(2);O(),q(e.stat.name),O(2),q(t.fmt(e.stat.ms))}}function UA(e,t){if(e&1){let e=V();z(0,`button`,9),U(`focus`,function(){w(e);let t=W().$index;return T(W(2).current.set(t))})(`click`,function(){w(e);let t=W().$implicit;return T(W(2).pick.emit(t.stat.name))}),j(1,HA,4,2),B()}if(e&2){let e=W(),t=e.$implicit,n=e.$index,r=W(2);y_(`--%NS%tone`,t.tone+`%`),A(`tabindex`,n===r.tabStop()?0:-1)(`aria-label`,t.label)(`data-index`,n),O(),M(t.roomy?1:-1)}}function WA(e,t){if(e&1&&(z(0,`li`),j(1,VA,4,4,`div`,4)(2,UA,2,6,`button`,5),B()),e&2){let e=t.$implicit;y_(`left`,e.x,`%`)(`top`,e.y,`%`)(`width`,e.w,`%`)(`height`,e.h,`%`),O(),M(e.other?1:2)}}function GA(e,t){if(e&1){let e=V();z(0,`ul`,2),U(`keydown`,function(t){return w(e),T(W().onKey(t))}),N(1,WA,3,9,`li`,3,zA),B()}if(e&2){let e=W();A(`aria-label`,e.label()),O(),P(e.cells())}}function KA(e,t){e&1&&(z(0,`p`,1),K(1,`No component time in these cycles.`),B())}var qA=24,JA=3,YA=class e{stats=$([]);scope=$(`the recording`);pick=vv();current=D(0);label=X(()=>`Self time per component in ${this.scope()}, largest first. Pick one to show it in the tree.`);cells=X(()=>{let e=this.stats().filter(e=>e.ms>0),t=e.slice(0,qA),n=e.slice(qA),r=n.reduce((e,t)=>e+t.ms,0),i=t.map(e=>({stat:e,other:0}));n.length&&i.push({stat:{name:`Other components`,checks:0,ms:r,maxMs:0,cycles:0},other:n.length});let a=e.reduce((e,t)=>e+t.ms,0),o=t[0]?.ms??1,s=Sk(i,e=>e.stat.ms,JA);return s.sort((e,t)=>Number(e.item.other>0)-Number(t.item.other>0)),s.map(e=>{let{stat:t,other:n}=e.item,r=a?Math.round(t.ms/a*100):0;return{stat:t,other:n,x:e.x,y:e.y,w:e.w,h:e.h,tone:n?0:14+Math.round(26*Math.min(t.ms/o,1)),roomy:e.w>=10&&e.h>=22,label:n?`${n} more components, ${vk(t.ms)}, ${r}% of self time`:`${t.name}, ${vk(t.ms)} self time, ${r}%, ${t.checks} ${t.checks===1?`check`:`checks`}`}})});tabStop=X(()=>Math.min(this.current(),Math.max(this.cells().filter(e=>!e.other).length-1,0)));fmt(e){return vk(e)}onKey(e){let t=this.cells().filter(e=>!e.other).length;if(!t)return;let n=this.tabStop(),r;switch(e.key){case`ArrowRight`:case`ArrowDown`:r=Math.min(n+1,t-1);break;case`ArrowLeft`:case`ArrowUp`:r=Math.max(n-1,0);break;case`Home`:r=0;break;case`End`:r=t-1;break;default:return}e.preventDefault(),this.current.set(r),e.currentTarget.querySelector(`button[data-index="${r}"]`)?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-treemap`]],inputs:{stats:[1,`stats`],scope:[1,`scope`]},outputs:{pick:`pick`},decls:2,vars:1,consts:[[1,`map`],[1,`empty`],[1,`map`,3,`keydown`],[3,`left`,`top`,`width`,`height`],[1,`cell`,`other`,3,`--%NS%tone`],[`type`,`button`,1,`cell`,3,`--%NS%tone`],[1,`cell`,`other`],[1,`sr-only`],[`aria-hidden`,`true`,1,`name`],[`type`,`button`,1,`cell`,3,`focus`,`click`],[1,`name`,`mono`],[1,`ms`]],template:function(e,t){e&1&&j(0,GA,3,1,`ul`,0)(1,KA,2,0,`p`,1),e&2&&M(+!t.cells().length)},styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1609,7 +1609,7 @@ button.cell[_ngcontent-%COMP%]:focus-visible { .empty[_ngcontent-%COMP%] { margin: 8px 0; color: var(--%NS%text-2); -}`]})},QA=(e,t)=>t.id;function $A(e,t){if(e&1){let e=V();I(0,`button`,14),H(`click`,function(){return w(e),T(W(2).clear())}),K(1,`Clear`),L()}}function ej(e,t){if(e&1){let e=V();I(0,`button`,11),H(`click`,function(){return w(e),T(W().toggle())}),R(1,`span`,12),K(2),L(),j(3,$A,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),F(`disabled`,!e.pageId()),O(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),O(),M(e.cycles().length?3:-1)}}function tj(e,t){if(e&1){let e=V();I(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),L(),I(3,`span`,16),K(4),L(),I(5,`button`,14),H(`click`,function(){return w(e),T(W().closeImport())}),K(6,`Back to live recording`),L()()}e&2&&(O(4),q(t.fileName))}function nj(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function rj(e,t){e&1&&(I(0,`p`,9),K(1,` The page has Angular's profiler hook, but the recording could not attach to it yet. The page tries again on its next update while recording is on. If this stays, stop and start the recording, or reload the page. `),L())}function ij(e,t){e&1&&R(0,`app-angular-unavailable`,17),e&2&&F(`page`,W(2).angularPage())}function aj(e,t){e&1&&j(0,rj,2,0,`p`,9)(1,ij,1,1,`app-angular-unavailable`,17),e&2&&M(+!W().attachPending())}function oj(e,t){e&1&&(I(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),L())}function sj(e,t){e&1&&R(0,`app-angular-unavailable`,21),e&2&&F(`page`,W(2).angularPage())}function cj(e,t){if(e&1){let e=V();I(0,`div`,18)(1,`span`,19),K(2,`Live views`),L(),I(3,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`flash`,!t.views().flash))}),R(4,`span`,12),K(5,` Flash checks `),L(),I(6,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`track`,!t.views().track))}),R(7,`span`,12),K(8,` Performance track `),L(),I(9,`button`,20),H(`click`,function(){return w(e),T(W().setView(`angularProfiling`,!0))}),R(10,`span`,12),K(11,` Angular profiling `),L()(),I(12,`p`,7),K(13,` Flash checks draws a box over each component on the page as Angular checks it, with its name and how often it was checked, fading over a second. Performance track adds a Pangular track to the Chrome Performance panel with every component check, hook and output. Angular profiling turns on Angular's own track there. `),L(),j(14,oj,2,0,`p`,9)(15,sj,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().flash),O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().track),O(3),F(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),A(`aria-pressed`,e.views().angularProfiling),O(5),M(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function lj(e,t){if(e&1&&(I(0,`p`,9),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function uj(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),J(` `,e.range()?`The picked cycles have no timed spans, so there is no flame graph for them.`:`This recording has no timed spans, so there is no flame graph. A recording from an older version, or a file saved without spans, has none.`,` `)}}function dj(e,t){e&1&&(I(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),L())}function fj(e,t){if(e&1){let e=V();I(0,`h3`),K(1,`Cycles`),L(),I(2,`app-cd-cycle-chart`,22),W_(`rangeChange`,function(t){w(e);let n=W();return U_(n.range,t)||(n.range=t),T(t)}),L(),I(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L(),j(4,uj,2,1,`p`,24),I(5,`h3`),K(6,`Self time by component`),L(),j(7,dj,2,0,`p`,9),I(8,`app-cd-treemap`,25),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L()}if(e&2){let e=W();O(2),F(`cycles`,e.cycles()),H_(`range`,e.range),O(),F(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),O(),M(e.hasSpans()?-1:4),O(3),M(e.range()?7:-1),O(),F(`stats`,e.stats())(`scope`,e.scope())}}function pj(e,t){if(e&1&&(I(0,`tr`)(1,`td`,16),K(2),L(),I(3,`td`,31),K(4),L(),I(5,`td`,31),K(6),L(),I(7,`td`,31),K(8),L()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(e.checks),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function mj(e,t){e&1&&(I(0,`tr`)(1,`td`,32),K(2,`No component time in the picked cycles.`),L()())}function hj(e,t){if(e&1&&(I(0,`span`,34),K(1,`from `),I(2,`span`,16),K(3),L()()),e&2){let e=W(3);O(3),q(e.causeText(t))}}function gj(e,t){if(e&1&&(I(0,`span`,34),K(1,`after `),I(2,`span`,16),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.trigger)}}function _j(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit;O(),J(``,e.unchanged,` changed nothing`)}}function vj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`hooks `,t.ms(e.hookMs))}}function yj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`afterRender `,t.ms(e.afterRenderMs))}}function bj(e,t){if(e&1&&(I(0,`span`,36),K(1,` slowest `),I(2,`span`,16),K(3),L(),K(4),L()),e&2){let e=t,n=W(3);O(3),q(e.name),O(),J(` `,n.ms(e.ms),` `)}}function xj(e,t){if(e&1&&(I(0,`li`)(1,`span`,33),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`),K(6),L(),j(7,hj,4,1,`span`,34)(8,gj,4,1,`span`,34),j(9,_j,2,1,`span`,35),j(10,vj,2,1,`span`,35),j(11,yj,2,1,`span`,35),j(12,bj,5,2,`span`,36),L()),e&2){let e,n,r=t.$implicit,i=W(2);O(2),q(i.clock(r.at)),O(2),q(i.ms(r.ms)),O(2),B_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),O(),M((e=r.cause)?7:r.trigger?8:-1,e),O(2),M(r.unchanged?9:-1),O(),M(r.hookMs?10:-1),O(),M(r.afterRenderMs?11:-1),O(),M((n=r.components[0])?12:-1,n)}}function Sj(e,t){if(e&1&&(I(0,`div`,26)(1,`div`)(2,`h3`),K(3),L(),I(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),L(),I(9,`th`,28),K(10,`Checks`),L(),I(11,`th`,28),K(12,`Self time`),L(),I(13,`th`,28),K(14,`Slowest`),L()()(),I(15,`tbody`),N(16,pj,9,4,`tr`,null,gg,!1,mj,3,0,`tr`),L()()(),I(19,`div`)(20,`h3`),K(21,`Latest cycles`),L(),I(22,`ol`,29),N(23,xj,13,11,`li`,null,QA),L()()(),R(25,`app-cd-timing`,30)(26,`app-cd-diagnosis`,30)),e&2){let e=W();O(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),O(13),P(e.slowest()),O(7),P(e.latest()),O(2),F(`page`,e.page()),O(),F(`page`,e.page())}}function Cj(e,t){e&1&&(I(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),L())}var wj=3e3,Tj=10,Ej=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=AD(()=>this.rpc());angularPage=X(()=>jD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=bv();range=D(null);imported=D(null);page=X(()=>this.imported()?.page??this.livePage());views=Q(()=>this.livePage()?.options??{flash:!1,track:!1,angularProfiling:!1,angularProfilingAvailable:!0});canShowViews=X(()=>!!this.pageId()&&this.livePage()?.supported!==!1);message=D(``);announcement=D(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);maxCycles=X(()=>_E(this.rpc()).limits.cdCycles);picked=X(()=>xk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?Sk(this.picked()):[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms));scope=X(()=>{let e=this.range()?this.picked():[];return e.length?e.length===1?`cycle ${e[0].id}`:`cycles ${e[0].id} to ${e.at(-1).id}`:`the recording`});slowest=X(()=>this.stats().slice(0,Tj));latest=X(()=>this.cycles().slice(-30).reverse());capNotes=X(()=>{let e=this.page()?.droppedClasses??0,t=this.page()?.droppedHosts??0,n=[];return e>0&&n.push(`${e} more component ${e===1?`class was`:`classes were`} checked than a recording keeps, so ${e===1?`it is`:`they are`} left out of these totals.`),t>0&&n.push(`${t} component ${t===1?`instance was`:`instances were`} checked past the 2000 a recording counts, so ${t===1?`its tree row shows`:`their tree rows show`} no check count.`),n});status=X(()=>{if(this.message())return this.message();let e=this.cycles().length;return this.imported()?`${e} ${e===1?`cycle`:`cycles`} imported.`:this.recording()?`Recording. ${e} ${e===1?`cycle`:`cycles`} so far.`:e?`${e} ${e===1?`cycle`:`cycles`} recorded.`:``});ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}clock(e){return vO(e)}causeText(e){return nk(e)}confirming=D(null);confirmTimer;constructor(){_c(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),C(As).onDestroy(()=>clearTimeout(this.confirmTimer))}confirmed(e){clearTimeout(this.confirmTimer),this.confirming.set(null),this.message.set(``);let t=this.livePage()?.cycles.length??0;this.announce(e?`Recording started.`:`Recording stopped. ${t} ${t===1?`cycle`:`cycles`} recorded.`)}unconfirmed(e){let t=`The page did not confirm that the recording ${e?`started`:`stopped`}. The tab may be in the background, closed or reloading.`;this.message.set(t),this.announce(t)}async toggle(){let e=!this.recording();clearTimeout(this.confirmTimer),this.confirming.set(null),await this.send({on:e},e?`Starting…`:`Stopping…`,()=>``,`request-change-detection-record`,{quiet:!0,keepPending:!0})&&(this.confirming.set(e),this.confirmTimer=setTimeout(()=>{this.confirming()===e&&this.unconfirmed(e)},wj))}showImport(e){this.message.set(``),this.range.set(null),this.imported.set(e);let t=e.page.cycles.length;this.announce(`Imported ${e.fileName}: ${t} ${t===1?`cycle`:`cycles`}. Showing the imported recording.`)}closeImport(){this.imported.set(null),this.range.set(null),this.announce(`Showing the live recording.`)}async clear(){this.range.set(null),await this.send({clear:!0},``,()=>`Cleared the recorded cycles.`)}async setView(e,t){let n=this.views();this.views.set({...n,[e]:t});let r={flash:t?`Flash checks on.`:`Flash checks off.`,track:t?`Performance track on. Record in the Chrome Performance panel to see it.`:`Performance track off.`,angularProfiling:`Angular profiling on. It stays on until the page reloads.`}[e];await this.send({[e]:t},``,()=>r,`request-change-detection-options`)||this.views.set(n)}async send(e,t,n,r=`request-change-detection-record`,{quiet:i=!1,keepPending:a=!1}={}){this.message.set(t);try{if(!this.rpc())throw Error(`no client`);return await tE(this.rpc(),r,{pageId:this.pageId(),...e}),a||this.message.set(``),i||this.announce(n()),!0}catch{let e=`Could not reach the page.`;return this.message.set(e),this.announce(e),!1}}announce(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-recording`]],inputs:{livePage:[1,`page`,`livePage`],pageId:[1,`pageId`],rpc:[1,`rpc`],native:[1,`native`]},outputs:{showComponent:`showComponent`},decls:22,vars:13,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[3,`imported`,`page`,`maxCycles`],[1,`status`],[`role`,`status`,1,`sr-only`],[1,`imported`],[1,`hint`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`note`],[1,`empty`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`type`,`button`,3,`click`],[1,`badge`],[1,`mono`],[`capability`,`profiler`,`missing`,``,`compact`,``,3,`page`],[`role`,`group`,`aria-labelledby`,`cd-views-label`,1,`views`],[`id`,`cd-views-label`,1,`views-label`],[`type`,`button`,1,`view`,3,`click`,`disabled`],[`capability`,`angularProfiling`,`missing`,``,`compact`,``,3,`page`],[3,`rangeChange`,`cycles`,`range`],[3,`pick`,`cycles`,`names`,`scope`],[1,`spans-note`],[3,`pick`,`stats`,`scope`],[1,`cd-grid`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[3,`page`],[1,`num`],[`colspan`,`4`],[1,`when`],[1,`trigger`],[1,`timing`],[1,`top`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),L(),j(4,ej,4,5),I(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),L(),I(6,`p`,4),K(7),L(),I(8,`p`,5),K(9),L()(),j(10,tj,7,1,`p`,6),I(11,`p`,7),K(12,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked, what started it and which checks changed nothing. Tree rows show how often each instance was checked. Times come from a development build. While it records, the page also wraps Angular's scheduler, adds a signal write hook and watches DOM updates; all of it stops with the recording. `),j(13,nj,1,0),L(),j(14,aj,2,1),j(15,cj,16,7),R(16,`app-limit-note`,8),N(17,lj,2,1,`p`,9,_g),j(19,fj,9,9),j(20,Sj,27,4)(21,Cj,2,0,`p`,10),L()),e&2){let e;O(4),M(t.imported()?-1:4),O(),F(`page`,t.page())(`maxCycles`,t.maxCycles()),O(2),q(t.status()),O(2),q(t.announcement()),O(),M((e=t.imported())?10:-1,e),O(3),M(t.native()?13:-1),O(),M(t.page()?.supported===!1?14:-1),O(),M(!t.imported()&&!t.native()?15:-1),O(),F(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),O(),P(t.capNotes()),O(2),M(t.cycles().length?19:-1),O(),M(t.page()?.components?.length?20:t.recording()?21:-1)}},dependencies:[FD,wO,LA,Yk,BA,dA,EA,ZA],styles:[`[_nghost-%COMP%] { +}`]})},XA=(e,t)=>t.id;function ZA(e,t){if(e&1){let e=V();I(0,`button`,14),H(`click`,function(){return w(e),T(W(2).clear())}),K(1,`Clear`),L()}}function QA(e,t){if(e&1){let e=V();I(0,`button`,11),H(`click`,function(){return w(e),T(W().toggle())}),R(1,`span`,12),K(2),L(),j(3,ZA,2,0,`button`,13)}if(e&2){let e=W();G(`on`,e.recording()),F(`disabled`,!e.pageId()),O(2),J(` `,e.recording()?`Stop recording`:`Record`,` `),O(),M(e.cycles().length?3:-1)}}function $A(e,t){if(e&1){let e=V();I(0,`p`,6)(1,`span`,15),K(2,`Imported recording`),L(),I(3,`span`,16),K(4),L(),I(5,`button`,14),H(`click`,function(){return w(e),T(W().closeImport())}),K(6,`Back to live recording`),L()()}e&2&&(O(4),q(t.fileName))}function ej(e,t){e&1&&K(0,` An app on a device has no DOM, so checks that changed nothing are not counted there. `)}function tj(e,t){e&1&&(I(0,`p`,9),K(1,` The page has Angular's profiler hook, but the recording could not attach to it yet. The page tries again on its next update while recording is on. If this stays, stop and start the recording, or reload the page. `),L())}function nj(e,t){e&1&&R(0,`app-angular-unavailable`,17),e&2&&F(`page`,W(2).angularPage())}function rj(e,t){e&1&&j(0,tj,2,0,`p`,9)(1,nj,1,1,`app-angular-unavailable`,17),e&2&&M(+!W().attachPending())}function ij(e,t){e&1&&(I(0,`p`,9),K(1,`Angular profiling stays on until the page reloads.`),L())}function aj(e,t){e&1&&R(0,`app-angular-unavailable`,21),e&2&&F(`page`,W(2).angularPage())}function oj(e,t){if(e&1){let e=V();I(0,`div`,18)(1,`span`,19),K(2,`Live views`),L(),I(3,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`flash`,!t.views().flash))}),R(4,`span`,12),K(5,` Flash checks `),L(),I(6,`button`,20),H(`click`,function(){w(e);let t=W();return T(t.setView(`track`,!t.views().track))}),R(7,`span`,12),K(8,` Performance track `),L(),I(9,`button`,20),H(`click`,function(){return w(e),T(W().setView(`angularProfiling`,!0))}),R(10,`span`,12),K(11,` Angular profiling `),L()(),I(12,`p`,7),K(13,` Flash checks draws a box over each component on the page as Angular checks it, with its name and how often it was checked, fading over a second. Performance track adds a Pangular track to the Chrome Performance panel with every component check, hook and output. Angular profiling turns on Angular's own track there. `),L(),j(14,ij,2,0,`p`,9)(15,aj,1,1,`app-angular-unavailable`,21)}if(e&2){let e=W();O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().flash),O(3),F(`disabled`,!e.canShowViews()),A(`aria-pressed`,e.views().track),O(3),F(`disabled`,!e.canShowViews()||e.views().angularProfiling||!e.views().angularProfilingAvailable),A(`aria-pressed`,e.views().angularProfiling),O(5),M(e.views().angularProfiling?14:e.views().angularProfilingAvailable?-1:15)}}function sj(e,t){if(e&1&&(I(0,`p`,9),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function cj(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),J(` `,e.range()?`The picked cycles have no timed spans, so there is no flame graph for them.`:`This recording has no timed spans, so there is no flame graph. A recording from an older version, or a file saved without spans, has none.`,` `)}}function lj(e,t){e&1&&(I(0,`p`,9),K(1,` For picked cycles, totals come from the 10 slowest components each cycle lists. `),L())}function uj(e,t){if(e&1){let e=V();I(0,`h3`),K(1,`Cycles`),L(),I(2,`app-cd-cycle-chart`,22),H_(`rangeChange`,function(t){w(e);let n=W();return V_(n.range,t)||(n.range=t),T(t)}),L(),I(3,`app-cd-flame-graph`,23),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L(),j(4,cj,2,1,`p`,24),I(5,`h3`),K(6,`Self time by component`),L(),j(7,lj,2,0,`p`,9),I(8,`app-cd-treemap`,25),H(`pick`,function(t){return w(e),T(W().showComponent.emit(t))}),L()}if(e&2){let e=W();O(2),F(`cycles`,e.cycles()),B_(`range`,e.range),O(),F(`cycles`,e.picked())(`names`,e.spanNames())(`scope`,e.scope()),O(),M(e.hasSpans()?-1:4),O(3),M(e.range()?7:-1),O(),F(`stats`,e.stats())(`scope`,e.scope())}}function dj(e,t){if(e&1&&(I(0,`tr`)(1,`td`,16),K(2),L(),I(3,`td`,31),K(4),L(),I(5,`td`,31),K(6),L(),I(7,`td`,31),K(8),L()()),e&2){let e=t.$implicit,n=W(2);O(2),q(e.name),O(2),q(e.checks),O(2),q(n.ms(e.ms)),O(2),q(n.ms(e.maxMs))}}function fj(e,t){e&1&&(I(0,`tr`)(1,`td`,32),K(2,`No component time in the picked cycles.`),L()())}function pj(e,t){if(e&1&&(I(0,`span`,34),K(1,`from `),I(2,`span`,16),K(3),L()()),e&2){let e=W(3);O(3),q(e.causeText(t))}}function mj(e,t){if(e&1&&(I(0,`span`,34),K(1,`after `),I(2,`span`,16),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.trigger)}}function hj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit;O(),J(``,e.unchanged,` changed nothing`)}}function gj(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`hooks `,t.ms(e.hookMs))}}function _j(e,t){if(e&1&&(I(0,`span`,35),K(1),L()),e&2){let e=W().$implicit,t=W(2);O(),J(`afterRender `,t.ms(e.afterRenderMs))}}function vj(e,t){if(e&1&&(I(0,`span`,36),K(1,` slowest `),I(2,`span`,16),K(3),L(),K(4),L()),e&2){let e=t,n=W(3);O(3),q(e.name),O(),J(` `,n.ms(e.ms),` `)}}function yj(e,t){if(e&1&&(I(0,`li`)(1,`span`,33),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`),K(6),L(),j(7,pj,4,1,`span`,34)(8,mj,4,1,`span`,34),j(9,hj,2,1,`span`,35),j(10,gj,2,1,`span`,35),j(11,_j,2,1,`span`,35),j(12,vj,5,2,`span`,36),L()),e&2){let e,n,r=t.$implicit,i=W(2);O(2),q(i.clock(r.at)),O(2),q(i.ms(r.ms)),O(2),R_(` `,r.checks,` `,r.checks===1?`check`:`checks`,`, `,r.passes,` `,r.passes===1?`pass`:`passes`,` `),O(),M((e=r.cause)?7:r.trigger?8:-1,e),O(2),M(r.unchanged?9:-1),O(),M(r.hookMs?10:-1),O(),M(r.afterRenderMs?11:-1),O(),M((n=r.components[0])?12:-1,n)}}function bj(e,t){if(e&1&&(I(0,`div`,26)(1,`div`)(2,`h3`),K(3),L(),I(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,27),K(8,`Component`),L(),I(9,`th`,28),K(10,`Checks`),L(),I(11,`th`,28),K(12,`Self time`),L(),I(13,`th`,28),K(14,`Slowest`),L()()(),I(15,`tbody`),N(16,dj,9,4,`tr`,null,gg,!1,fj,3,0,`tr`),L()()(),I(19,`div`)(20,`h3`),K(21,`Latest cycles`),L(),I(22,`ol`,29),N(23,yj,13,11,`li`,null,XA),L()()(),R(25,`app-cd-timing`,30)(26,`app-cd-diagnosis`,30)),e&2){let e=W();O(3),J(` `,e.range()?`Slowest components in the picked cycles`:`Slowest components`,` `),O(13),P(e.slowest()),O(7),P(e.latest()),O(2),F(`page`,e.page()),O(),F(`page`,e.page())}}function xj(e,t){e&1&&(I(0,`p`,10),K(1,`Use the app. Cycles show up here as Angular runs change detection.`),L())}var Sj=3e3,Cj=10,wj=class e{livePage=$(null,{alias:`page`});pageId=$(null);rpc=$(null);native=$(!1);angularPages=OD(()=>this.rpc());angularPage=X(()=>kD(this.angularPages(),this.pageId()));attachPending=X(()=>this.angularPage()?.capabilities.profiler===!0);showComponent=vv();range=D(null);imported=D(null);page=X(()=>this.imported()?.page??this.livePage());views=Q(()=>this.livePage()?.options??{flash:!1,track:!1,angularProfiling:!1,angularProfilingAvailable:!0});canShowViews=X(()=>!!this.pageId()&&this.livePage()?.supported!==!1);message=D(``);announcement=D(``);recording=X(()=>this.page()?.recording===!0);cycles=X(()=>this.page()?.cycles??[]);maxCycles=X(()=>hE(this.rpc()).limits.cdCycles);picked=X(()=>yk(this.cycles(),this.range()));hasSpans=X(()=>this.picked().some(e=>e.spans?.length));spanNames=X(()=>this.page()?.spanNames??[]);stats=X(()=>this.range()?bk(this.picked()):[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms));scope=X(()=>{let e=this.range()?this.picked():[];return e.length?e.length===1?`cycle ${e[0].id}`:`cycles ${e[0].id} to ${e.at(-1).id}`:`the recording`});slowest=X(()=>this.stats().slice(0,Cj));latest=X(()=>this.cycles().slice(-30).reverse());capNotes=X(()=>{let e=this.page()?.droppedClasses??0,t=this.page()?.droppedHosts??0,n=[];return e>0&&n.push(`${e} more component ${e===1?`class was`:`classes were`} checked than a recording keeps, so ${e===1?`it is`:`they are`} left out of these totals.`),t>0&&n.push(`${t} component ${t===1?`instance was`:`instances were`} checked past the 2000 a recording counts, so ${t===1?`its tree row shows`:`their tree rows show`} no check count.`),n});status=X(()=>{if(this.message())return this.message();let e=this.cycles().length;return this.imported()?`${e} ${e===1?`cycle`:`cycles`} imported.`:this.recording()?`Recording. ${e} ${e===1?`cycle`:`cycles`} so far.`:e?`${e} ${e===1?`cycle`:`cycles`} recorded.`:``});ms(e){return`${e<10?e.toFixed(2):Math.round(e)} ms`}clock(e){return gO(e)}causeText(e){return ek(e)}confirming=D(null);confirmTimer;constructor(){_c(()=>{let e=this.confirming();e!==null&&this.livePage()?.recording===!0===e&&Z(()=>this.confirmed(e))}),C(As).onDestroy(()=>clearTimeout(this.confirmTimer))}confirmed(e){clearTimeout(this.confirmTimer),this.confirming.set(null),this.message.set(``);let t=this.livePage()?.cycles.length??0;this.announce(e?`Recording started.`:`Recording stopped. ${t} ${t===1?`cycle`:`cycles`} recorded.`)}unconfirmed(e){let t=`The page did not confirm that the recording ${e?`started`:`stopped`}. The tab may be in the background, closed or reloading.`;this.message.set(t),this.announce(t)}async toggle(){let e=!this.recording();clearTimeout(this.confirmTimer),this.confirming.set(null),await this.send({on:e},e?`Starting…`:`Stopping…`,()=>``,`request-change-detection-record`,{quiet:!0,keepPending:!0})&&(this.confirming.set(e),this.confirmTimer=setTimeout(()=>{this.confirming()===e&&this.unconfirmed(e)},Sj))}showImport(e){this.message.set(``),this.range.set(null),this.imported.set(e);let t=e.page.cycles.length;this.announce(`Imported ${e.fileName}: ${t} ${t===1?`cycle`:`cycles`}. Showing the imported recording.`)}closeImport(){this.imported.set(null),this.range.set(null),this.announce(`Showing the live recording.`)}async clear(){this.range.set(null),await this.send({clear:!0},``,()=>`Cleared the recorded cycles.`)}async setView(e,t){let n=this.views();this.views.set({...n,[e]:t});let r={flash:t?`Flash checks on.`:`Flash checks off.`,track:t?`Performance track on. Record in the Chrome Performance panel to see it.`:`Performance track off.`,angularProfiling:`Angular profiling on. It stays on until the page reloads.`}[e];await this.send({[e]:t},``,()=>r,`request-change-detection-options`)||this.views.set(n)}async send(e,t,n,r=`request-change-detection-record`,{quiet:i=!1,keepPending:a=!1}={}){this.message.set(t);try{if(!this.rpc())throw Error(`no client`);return await $T(this.rpc(),r,{pageId:this.pageId(),...e}),a||this.message.set(``),i||this.announce(n()),!0}catch{let e=`Could not reach the page.`;return this.message.set(e),this.announce(e),!1}}announce(e){this.announcement.update(t=>t===e?`${e} `:e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-cd-recording`]],inputs:{livePage:[1,`page`,`livePage`],pageId:[1,`pageId`],rpc:[1,`rpc`],native:[1,`native`]},outputs:{showComponent:`showComponent`},decls:22,vars:13,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[3,`imported`,`page`,`maxCycles`],[1,`status`],[`role`,`status`,1,`sr-only`],[1,`imported`],[1,`hint`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`note`],[1,`empty`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`type`,`button`,3,`click`],[1,`badge`],[1,`mono`],[`capability`,`profiler`,`missing`,``,`compact`,``,3,`page`],[`role`,`group`,`aria-labelledby`,`cd-views-label`,1,`views`],[`id`,`cd-views-label`,1,`views-label`],[`type`,`button`,1,`view`,3,`click`,`disabled`],[`capability`,`angularProfiling`,`missing`,``,`compact`,``,3,`page`],[3,`rangeChange`,`cycles`,`range`],[3,`pick`,`cycles`,`names`,`scope`],[1,`spans-note`],[3,`pick`,`stats`,`scope`],[1,`cd-grid`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[3,`page`],[1,`num`],[`colspan`,`4`],[1,`when`],[1,`trigger`],[1,`timing`],[1,`top`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Change detection`),L(),j(4,QA,4,5),I(5,`app-cd-transfer`,3),H(`imported`,function(e){return t.showImport(e)}),L(),I(6,`p`,4),K(7),L(),I(8,`p`,5),K(9),L()(),j(10,$A,7,1,`p`,6),I(11,`p`,7),K(12,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked, what started it and which checks changed nothing. Tree rows show how often each instance was checked. Times come from a development build. While it records, the page also wraps Angular's scheduler, adds a signal write hook and watches DOM updates; all of it stops with the recording. `),j(13,ej,1,0),L(),j(14,rj,2,1),j(15,oj,16,7),R(16,`app-limit-note`,8),N(17,sj,2,1,`p`,9,_g),j(19,uj,9,9),j(20,bj,27,4)(21,xj,2,0,`p`,10),L()),e&2){let e;O(4),M(t.imported()?-1:4),O(),F(`page`,t.page())(`maxCycles`,t.maxCycles()),O(2),q(t.status()),O(2),q(t.announcement()),O(),M((e=t.imported())?10:-1,e),O(3),M(t.native()?13:-1),O(),M(t.page()?.supported===!1?14:-1),O(),M(!t.imported()&&!t.native()?15:-1),O(),F(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),O(),P(t.capNotes()),O(2),M(t.cycles().length?19:-1),O(),M(t.page()?.components?.length?20:t.recording()?21:-1)}},dependencies:[ND,SO,FA,qk,RA,lA,wA,YA],styles:[`[_nghost-%COMP%] { display: block; margin-top: 16px; } @@ -1811,7 +1811,7 @@ td.mono[_ngcontent-%COMP%] { .trigger[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%], .top[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%] { overflow-wrap: anywhere; -}`]})},Dj=[`*`];function Oj(e,t){e&1&&K(0),e&2&&q(W(2).label())}function kj(e,t){e&1&&Jg(0,0,null,Oj,1,1)}function Aj(e,t){if(e&1&&(I(0,`span`,4),K(1),L()),e&2){let e=W(2);O(),q(e.message())}}function jj(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){return w(e),T(W().open())}),Mg(1,3),L(),j(2,Aj,2,1,`span`,4)}if(e&2){let e=W(),t=Qg(1);F(`title`,`Open `+e.label()+` in your editor`),A(`aria-label`,`Open `+e.label()+` in your editor`),O(),F(`ngTemplateOutlet`,t),O(),M(e.message()?2:-1)}}function Mj(e,t){if(e&1&&(I(0,`span`,1),Mg(1,3),L()),e&2){let e=W(),t=Qg(1);F(`title`,e.label()),O(),F(`ngTemplateOutlet`,t)}}var Nj=class e{source=D(D(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!rE(e)});use(e){this.source.set(e)}async open(e,t){if(!this.available())return{ok:!1,error:`No server is connected.`};try{let n=await tE(this.client(),`open-in-editor`,{file:e,...t?{line:t}:{}});return n?.ok?{ok:!0}:{ok:!1,error:n?.error??`The server did not open it.`}}catch{return{ok:!1,error:`The server did not open it.`}}}static ɵfac=function(t){return new(t||e)};static ɵprov=Rl({token:e,factory:e.ɵfac})};function Pj(e,t){return t?`${e}:${t}`:e}var Fj=class e{editor=C(Nj);file=$.required();line=$(void 0);label=X(()=>Pj(this.file(),this.line()));message=D(``);async open(){this.message.set(``);let e=await this.editor.open(this.file(),this.line()??void 0);e.ok||this.message.set(`Not opened: ${e.error}`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:Dj,decls:4,vars:1,consts:[[`text`,``],[1,`source-text`,3,`title`],[`type`,`button`,1,`source-link`,3,`click`,`title`],[3,`ngTemplateOutlet`],[`role`,`alert`,1,`message`]],template:function(e,t){e&1&&(qg(),Jh(0,kj,2,0,`ng-template`,null,0,pv),j(2,jj,3,4)(3,Mj,2,2,`span`,1)),e&2&&(O(2),M(t.editor.available()?2:3))},dependencies:[py],styles:[`[_nghost-%COMP%] { +}`]})},Tj=[`*`];function Ej(e,t){e&1&&K(0),e&2&&q(W(2).label())}function Dj(e,t){e&1&&Jg(0,0,null,Ej,1,1)}function Oj(e,t){if(e&1&&(I(0,`span`,4),K(1),L()),e&2){let e=W(2);O(),q(e.message())}}function kj(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){return w(e),T(W().open())}),Mg(1,3),L(),j(2,Oj,2,1,`span`,4)}if(e&2){let e=W(),t=Qg(1);F(`title`,`Open `+e.label()+` in your editor`),A(`aria-label`,`Open `+e.label()+` in your editor`),O(),F(`ngTemplateOutlet`,t),O(),M(e.message()?2:-1)}}function Aj(e,t){if(e&1&&(I(0,`span`,1),Mg(1,3),L()),e&2){let e=W(),t=Qg(1);F(`title`,e.label()),O(),F(`ngTemplateOutlet`,t)}}var jj=class e{source=D(D(null));client=X(()=>this.source()());available=X(()=>{let e=this.client();return!!e&&!tE(e)});use(e){this.source.set(e)}async open(e,t){if(!this.available())return{ok:!1,error:`No server is connected.`};try{let n=await $T(this.client(),`open-in-editor`,{file:e,...t?{line:t}:{}});return n?.ok?{ok:!0}:{ok:!1,error:n?.error??`The server did not open it.`}}catch{return{ok:!1,error:`The server did not open it.`}}}static ɵfac=function(t){return new(t||e)};static ɵprov=Rl({token:e,factory:e.ɵfac})};function Mj(e,t){return t?`${e}:${t}`:e}var Nj=class e{editor=C(jj);file=$.required();line=$(void 0);label=X(()=>Mj(this.file(),this.line()));message=D(``);async open(){this.message.set(``);let e=await this.editor.open(this.file(),this.line()??void 0);e.ok||this.message.set(`Not opened: ${e.error}`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-source-link`]],inputs:{file:[1,`file`],line:[1,`line`]},ngContentSelectors:Tj,decls:4,vars:1,consts:[[`text`,``],[1,`source-text`,3,`title`],[`type`,`button`,1,`source-link`,3,`click`,`title`],[3,`ngTemplateOutlet`],[`role`,`alert`,1,`message`]],template:function(e,t){e&1&&(qg(),Jh(0,Dj,2,0,`ng-template`,null,0,dv),j(2,kj,3,4)(3,Aj,2,2,`span`,1)),e&2&&(O(2),M(t.editor.available()?2:3))},dependencies:[dy],styles:[`[_nghost-%COMP%] { display: inline; min-width: 0; } @@ -1846,7 +1846,7 @@ td.mono[_ngcontent-%COMP%] { color: var(--%NS%danger-text); font-family: var(--%NS%font-sans); font-size: 0.92em; -}`]})},Ij=[`field`],Lj=[`editButton`],Rj=[`valueBox`];function zj(e,t){if(e&1){let e=V();z(0,`div`,5)(1,`label`,6),K(2),B(),z(3,`input`,7,0),U(`input`,function(t){return w(e),T(W().draft.set(t.target.value))})(`keydown.enter`,function(t){w(e);let n=W();return t.preventDefault(),T(n.apply())})(`keydown.escape`,function(t){w(e);let n=W();return t.preventDefault(),t.stopPropagation(),T(n.cancel())}),B(),z(5,`button`,8),U(`click`,function(){return w(e),T(W().apply())}),K(6,`Apply`),B(),z(7,`button`,9),U(`click`,function(){return w(e),T(W().cancel())}),K(8,`Cancel`),B()(),z(9,`p`,10),K(10),B()}if(e&2){let e=W();O(),Pg(`htmlFor`,e.fieldId),O(),J(`New value of `,e.prop().name,`, as JSON`),O(),Pg(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),A(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),O(2),Pg(`disabled`,e.busy()),O(4),Pg(`id`,e.hintId),O(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Bj(e,t){if(e&1&&(z(0,`pre`,null,1),K(2),lv(3,`json`),B()),e&2){let e=W(2);A(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),O(2),q(uv(3,4,e.prop().value))}}function Vj(e,t){if(e&1){let e=V();z(0,`button`,14,2),U(`click`,function(){return w(e),T(W(2).start())}),K(2,` Edit `),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()),A(`aria-label`,`Edit `+e.prop().name)}}function Hj(e,t){if(e&1&&(z(0,`p`,13),K(1),B()),e&2){let e=W(2);O(),q(e.prop().locked)}}function Uj(e,t){if(e&1&&(z(0,`div`,11),j(1,Bj,4,6,`pre`),j(2,Vj,3,2,`button`,12),B(),j(3,Hj,2,1,`p`,13)),e&2){let e=W();O(),M(e.bare()?-1:1),O(),M(e.editable()?2:-1),O(),M(e.writes()&&e.prop().locked?3:-1)}}function Wj(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W();Pg(`id`,e.errorId),O(),q(e.error())}}var Gj=0;function Kj(e){let t=e.trim();if(!t)return{error:`Type a JSON value, such as "text", 42, true, null or [1, 2].`};try{return{value:JSON.parse(t)}}catch{return{error:`Not valid JSON. Put text in double quotes, such as "Paris".`}}}var qj=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++Gj}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=D(!1);draft=D(``);busy=D(!1);error=D(``);done=D(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=Dv(`field`);editButton=Dv(`editButton`);valueBox=Dv(`valueBox`);injector=C(Os);scrollable=D(!1);constructor(){Pv(()=>{this.prop();let e=this.valueBox()?.nativeElement;this.scrollable.set(!!e&&e.scrollHeight>e.clientHeight+1)})}async start(){let e=this.prop().value;this.error.set(``),this.done.set(``);let t=this.readDraft();if(t){this.busy.set(!0);let n=await t();if(this.busy.set(!1),n.error!==void 0){this.error.set(n.error);return}e=n.value}this.draft.set(e===void 0?``:JSON.stringify(e)),this.editing.set(!0),ud(()=>{let e=this.field()?.nativeElement;e?.focus(),e?.select()},{injector:this.injector})}cancel(){this.editing()&&(this.editing.set(!1),this.busy.set(!1),this.error.set(``),this.focusEdit())}async apply(){if(this.busy())return;let e=Kj(this.draft());if(`error`in e){this.error.set(e.error);return}let t=this.prop(),n=this.rpc(),r=this.pageId();if(!n||!r||!t.edit)return;this.busy.set(!0),this.error.set(``);let i;try{i=await n.scope(`pangular`).rpc.call(`request-component-edit`,{pageId:r,request:{id:this.componentId(),path:t.prop,value:e.value,kind:t.edit}})??{}}catch{i={error:`The devtools server did not answer. Try again.`}}this.busy.set(!1),this.editing()&&(i.ok?(this.editing.set(!1),this.done.set(`Set ${t.name}.`),this.focusEdit()):(this.error.set(i.error??`The page did not write it.`),this.field()?.nativeElement.focus()))}focusEdit(){ud(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Xg(t.field,Ij,5)(t.editButton,Lj,5)(t.valueBox,Rj,5),e&2&&Zg(3)},inputs:{prop:[1,`prop`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],bare:[1,`bare`],readDraft:[1,`readDraft`]},decls:5,vars:3,consts:[[`field`,``],[`valueBox`,``],[`editButton`,``],[`role`,`alert`,1,`error`,3,`id`],[`role`,`status`,1,`sr-only`],[1,`editor`],[1,`sr-only`,3,`for`],[`type`,`text`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,`mono`,3,`input`,`keydown.enter`,`keydown.escape`,`id`,`value`,`readOnly`],[`type`,`button`,1,`primary`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[1,`hint`,3,`id`],[1,`view`],[`type`,`button`,1,`edit`,3,`disabled`],[1,`locked`],[`type`,`button`,1,`edit`,3,`click`,`disabled`]],template:function(e,t){e&1&&(j(0,zj,11,11)(1,Uj,4,3),j(2,Wj,2,2,`p`,3),z(3,`p`,4),K(4),B()),e&2&&(M(+!t.editing()),O(2),M(t.error()?2:-1),O(2),q(t.done()))},dependencies:[yy],styles:[`[_nghost-%COMP%] { +}`]})},Pj=[`field`],Fj=[`editButton`],Ij=[`valueBox`];function Lj(e,t){if(e&1){let e=V();z(0,`div`,5)(1,`label`,6),K(2),B(),z(3,`input`,7,0),U(`input`,function(t){return w(e),T(W().draft.set(t.target.value))})(`keydown.enter`,function(t){w(e);let n=W();return t.preventDefault(),T(n.apply())})(`keydown.escape`,function(t){w(e);let n=W();return t.preventDefault(),t.stopPropagation(),T(n.cancel())}),B(),z(5,`button`,8),U(`click`,function(){return w(e),T(W().apply())}),K(6,`Apply`),B(),z(7,`button`,9),U(`click`,function(){return w(e),T(W().cancel())}),K(8,`Cancel`),B()(),z(9,`p`,10),K(10),B()}if(e&2){let e=W();O(),Pg(`htmlFor`,e.fieldId),O(),J(`New value of `,e.prop().name,`, as JSON`),O(),Pg(`id`,e.fieldId)(`value`,e.draft())(`readOnly`,e.busy()),A(`aria-busy`,e.busy()?`true`:null)(`aria-invalid`,e.error()?`true`:null)(`aria-describedby`,e.hintId+(e.error()?` `+e.errorId:``)),O(2),Pg(`disabled`,e.busy()),O(4),Pg(`id`,e.hintId),O(),J(` JSON, such as "text", 42, true or `,e.objectSample,`. Enter applies, Escape cancels. `)}}function Rj(e,t){if(e&1&&(z(0,`pre`,null,1),K(2),sv(3,`json`),B()),e&2){let e=W(2);A(`tabindex`,e.scrollable()?0:null)(`role`,e.scrollable()?`region`:null)(`aria-label`,e.scrollable()?`Value of `+e.prop().name:null),O(2),q(cv(3,4,e.prop().value))}}function zj(e,t){if(e&1){let e=V();z(0,`button`,14,2),U(`click`,function(){return w(e),T(W(2).start())}),K(2,` Edit `),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()),A(`aria-label`,`Edit `+e.prop().name)}}function Bj(e,t){if(e&1&&(z(0,`p`,13),K(1),B()),e&2){let e=W(2);O(),q(e.prop().locked)}}function Vj(e,t){if(e&1&&(z(0,`div`,11),j(1,Rj,4,6,`pre`),j(2,zj,3,2,`button`,12),B(),j(3,Bj,2,1,`p`,13)),e&2){let e=W();O(),M(e.bare()?-1:1),O(),M(e.editable()?2:-1),O(),M(e.writes()&&e.prop().locked?3:-1)}}function Hj(e,t){if(e&1&&(z(0,`p`,3),K(1),B()),e&2){let e=W();Pg(`id`,e.errorId),O(),q(e.error())}}var Uj=0;function Wj(e){let t=e.trim();if(!t)return{error:`Type a JSON value, such as "text", 42, true, null or [1, 2].`};try{return{value:JSON.parse(t)}}catch{return{error:`Not valid JSON. Put text in double quotes, such as "Paris".`}}}var Gj=class e{prop=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);bare=$(!1);readDraft=$(null);fieldId=`prop-edit-${++Uj}`;hintId=`${this.fieldId}-hint`;errorId=`${this.fieldId}-error`;objectSample=`{"a": 1}`;editing=D(!1);draft=D(``);busy=D(!1);error=D(``);done=D(``);editable=X(()=>this.writes()&&!!this.prop().edit&&!!this.pageId()&&!!this.rpc());field=Tv(`field`);editButton=Tv(`editButton`);valueBox=Tv(`valueBox`);injector=C(Os);scrollable=D(!1);constructor(){Mv(()=>{this.prop();let e=this.valueBox()?.nativeElement;this.scrollable.set(!!e&&e.scrollHeight>e.clientHeight+1)})}async start(){let e=this.prop().value;this.error.set(``),this.done.set(``);let t=this.readDraft();if(t){this.busy.set(!0);let n=await t();if(this.busy.set(!1),n.error!==void 0){this.error.set(n.error);return}e=n.value}this.draft.set(e===void 0?``:JSON.stringify(e)),this.editing.set(!0),ud(()=>{let e=this.field()?.nativeElement;e?.focus(),e?.select()},{injector:this.injector})}cancel(){this.editing()&&(this.editing.set(!1),this.busy.set(!1),this.error.set(``),this.focusEdit())}async apply(){if(this.busy())return;let e=Wj(this.draft());if(`error`in e){this.error.set(e.error);return}let t=this.prop(),n=this.rpc(),r=this.pageId();if(!n||!r||!t.edit)return;this.busy.set(!0),this.error.set(``);let i;try{i=await n.scope(`pangular`).rpc.call(`request-component-edit`,{pageId:r,request:{id:this.componentId(),path:t.prop,value:e.value,kind:t.edit}})??{}}catch{i={error:`The devtools server did not answer. Try again.`}}this.busy.set(!1),this.editing()&&(i.ok?(this.editing.set(!1),this.done.set(`Set ${t.name}.`),this.focusEdit()):(this.error.set(i.error??`The page did not write it.`),this.field()?.nativeElement.focus()))}focusEdit(){ud(()=>this.editButton()?.nativeElement.focus(),{injector:this.injector})}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-prop-value`]],viewQuery:function(e,t){e&1&&Xg(t.field,Pj,5)(t.editButton,Fj,5)(t.valueBox,Ij,5),e&2&&Zg(3)},inputs:{prop:[1,`prop`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],bare:[1,`bare`],readDraft:[1,`readDraft`]},decls:5,vars:3,consts:[[`field`,``],[`valueBox`,``],[`editButton`,``],[`role`,`alert`,1,`error`,3,`id`],[`role`,`status`,1,`sr-only`],[1,`editor`],[1,`sr-only`,3,`for`],[`type`,`text`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field`,`mono`,3,`input`,`keydown.enter`,`keydown.escape`,`id`,`value`,`readOnly`],[`type`,`button`,1,`primary`,3,`click`,`disabled`],[`type`,`button`,3,`click`],[1,`hint`,3,`id`],[1,`view`],[`type`,`button`,1,`edit`,3,`disabled`],[1,`locked`],[`type`,`button`,1,`edit`,3,`click`,`disabled`]],template:function(e,t){e&1&&(j(0,Lj,11,11)(1,Vj,4,3),j(2,Hj,2,2,`p`,3),z(3,`p`,4),K(4),B()),e&2&&(M(+!t.editing()),O(2),M(t.error()?2:-1),O(2),q(t.done()))},dependencies:[_y],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -1969,7 +1969,7 @@ button.edit[_ngcontent-%COMP%] { .error[_ngcontent-%COMP%] { color: var(--%NS%danger-text); -}`]})},Jj=1e3,Yj={depth:5,limit:100},Xj=`[redacted]`;function Zj(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Qj(e){return Zj(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function $j(e){return Zj(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function eM(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function tM(e){return e.$type===`Map`&&Array.isArray(e.entries)}function nM(e){return e.$type===`Set`&&Array.isArray(e.values)}function rM(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function iM(e){if(!e||typeof e!=`object`)return null;if($j(e))return e.size<=0?null:{kind:eM(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(Qj(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=Qj(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if(tM(t)||nM(t)){let e=typeof t.size==`number`?t.size:0,n=tM(t)?`map`:`set`;return e?{kind:n,type:n===`map`?`Map`:`Set`,size:e,collapsed:!1}:null}let n=typeof t.$more==`number`?t.$more:0,r=rM(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function aM(e){if(typeof e==`string`)return JSON.stringify(e);let t=iM(e);if(t)return cM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function oM(e){let t=iM(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(Qj(e.at(-1))?e.slice(0,-1):e).map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:n,more:t.size-n.length}}let n=e;if(t.kind===`map`){let e=n.entries.map((e,t)=>{let[n,r]=Array.isArray(e)?e:[void 0,e];return{key:String(t),label:aM(n),value:r}});return{children:e,more:Math.max(0,t.size-e.length)}}if(t.kind===`set`){let e=n.values.map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:e,more:Math.max(0,t.size-e.length)}}return{children:rM(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function sM(e,t,n){return`${e} ${e===1?t:n}`}function cM(e){let t={array:sM(e.size,`item`,`items`),object:sM(e.size,`key`,`keys`),map:sM(e.size,`entry`,`entries`),set:sM(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function lM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function uM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function dM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var fM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function pM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==Xj&&!fM.test(e)&&!e.endsWith(`…`)}function mM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function hM(e,t,n,r,i=500){let a=[],o=r.trim().toLowerCase();if(!o)return a;let s=new Set,c=(e,t)=>{let r=lM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of oM(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!iM(r.value))continue;let i=n(t)??(iM(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var gM=(e,t)=>t.id;function _M(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).toggle(t))}),E(),I(1,`svg`,3),R(2,`path`,4),L(),bs(),I(3,`span`,14),K(4),L(),I(5,`span`,5),K(6),L()()}if(e&2){let e=W().$implicit;A(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),O(4),J(``,e.label,`:`),O(2),q(e.text)}}function vM(e,t){if(e&1&&R(0,`app-prop-value`,15),e&2){let e=W(5);F(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function yM(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W(2).$implicit;O(),q(e.text)}}function bM(e,t){if(e&1&&(I(0,`span`,14),K(1),L(),j(2,vM,1,5,`app-prop-value`,15)(3,yM,2,1,`span`,16)),e&2){let e,t=W().$implicit;O(),J(``,t.label,`:`),O(),M((e=t.edit)?2:3,e)}}function xM(e,t){if(e&1){let e=V();I(0,`button`,17),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).more(t))}),K(1),I(2,`span`,18),K(3),L()()}if(e&2){let e=W().$implicit,t=W(3);O(),J(` Show `,t.step(e),` more `),O(2),J(`(`,e.more,` not listed)`)}}function SM(e,t){e&1&&(I(0,`span`,12),K(1,`Reading from the page…`),L())}function CM(e,t){if(e&1&&(I(0,`span`,13),K(1),L()),e&2){let e=W().$implicit;O(),q(e.text)}}function wM(e,t){if(e&1&&(I(0,`li`,9),j(1,_M,7,4,`button`,10)(2,bM,4,2)(3,xM,4,2,`button`,11)(4,SM,2,0,`span`,12)(5,CM,2,1,`span`,13),L()),e&2){let e,n=t.$implicit;y_(`padding-left`,n.depth*14,`px`),O(),M((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function TM(e,t){if(e&1&&(I(0,`ul`,7),N(1,wM,6,3,`li`,8,gM),L()),e&2){let e=W(2);F(`id`,e.listId),A(`aria-label`,e.prop().name+` entries`),O(),P(e.rows())}}function EM(e,t){if(e&1){let e=V();I(0,`div`,1)(1,`button`,2),H(`click`,function(){return w(e),T(W().toggleRoot())}),E(),I(2,`svg`,3),R(3,`path`,4),L(),bs(),I(4,`span`,5),K(5),L()(),R(6,`app-prop-value`,6),L(),j(7,TM,3,2,`ul`,7)}if(e&2){let e=t,n=W();O(),A(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),O(4),q(n.summaryOf(e)),O(),F(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),O(),M(n.rootOpen()?7:-1)}}function DM(e,t){if(e&1&&R(0,`app-prop-value`,0),e&2){let e=W();F(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var OM=0;function kM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function AM(e){if(Array.isArray(e))return e.every(AM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(AM)}return pM(e)}var jM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++OM}`;host=C(Vl);pendingMore=null;constructor(){Pv(()=>{let e=this.rows(),t=this.pendingMore;if(!t)return;let n=e.findIndex(e=>(e.kind===`leaf`||e.kind===`node`)&&!t.has(e.id));if(n<0)return;this.pendingMore=null;let r=document.activeElement;r&&r!==document.body&&r.isConnected||this.focusNear(n)})}rootPath=X(()=>[this.prop().prop]);rootValue=X(()=>this.store().level(this.rootPath(),this.directive())??this.prop().value);root=X(()=>iM(this.rootValue()));needle=X(()=>this.query().trim().toLowerCase());matches=X(()=>{let e=this.needle(),t=this.prop();if(!e||[t.name,t.prop].some(t=>t.toLowerCase().includes(e)))return null;let n=this.store(),r=this.directive();return hM(this.rootPath(),this.rootValue(),e=>n.level(e,r),e)});rootOpen=X(()=>!!this.matches()?.length||this.store().isOpen(this.rootPath(),this.directive()));rows=X(()=>{let e=this.root();if(!e)return[];let t=this.store(),n=this.directive(),r=this.matches(),i=new Set,a=new Set;for(let e of r??[]){a.add(lM(e));for(let t=2;t<=e.length;t++)i.add(lM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:h,more:g}=oM(e);for(let e of h){let h=[...o,e.key],g=lM(h);if(r&&!m&&!i.has(g))continue;let _=iM(e.value),ee=lM(h,n);if(!_){let t=p&&pM(e.value)?dM(h):null;c.push({id:ee,kind:`leaf`,depth:f,path:h,label:e.label,text:kM(e.value),edit:s&&t&&p?{name:uM(h,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let te=!!r&&!m&&i.has(g)&&!a.has(g)||t.isOpen(h,n);if(c.push({id:ee,kind:`node`,depth:f,path:h,label:e.label,text:cM(_),container:_,open:te}),!te)continue;let ne=t.level(h,n)??(_.collapsed?void 0:e.value),re=[...d,_.kind];ne===void 0?t.errors().has(ee)?c.push({...u(h,f+1,`error`),text:t.errors().get(ee)}):c.push(u(h,f+1,`loading`)):l(ne,h,re,f+1,mM(p,_),m||a.has(g))}g>0&&(!r||m)&&c.push({...u(o,f,`more`),more:g,listed:h.length})},u=(e,t,r)=>({id:`${lM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?mM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),Yj.depth,Yj.limit);return e.ok?AM(e.value)?{value:e.value}:{error:`Too large to edit as a whole. Open it to edit the values inside.`}:{error:e.error??`The page did not read it.`}};summaryOf(e){return cM(e)}toggleRoot(){this.pendingMore=null,this.store().toggle(this.rootPath(),this.directive(),!1)}toggle(e){this.pendingMore=null,this.store().toggle(e.path,this.directive(),!!e.container?.collapsed)}more(e){this.pendingMore=new Set(this.rows().map(e=>e.id)),this.store().more(e.path,this.directive(),e.listed??0)}focusNear(e){let t=this.host.nativeElement,n=Array.from(t.querySelectorAll(`#${this.listId} > li`)),r=e=>e?.querySelector(`button:not([disabled]), input, textarea, [tabindex="0"]`);(n.slice(e).map(r).find(Boolean)??n.slice(0,e).reverse().map(r).find(Boolean)??t.querySelector(`.root > .toggle`))?.focus()}step(e){return Math.min(100,e.more??0)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-value-tree`]],inputs:{prop:[1,`prop`],store:[1,`store`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],directive:[1,`directive`],query:[1,`query`]},decls:2,vars:1,consts:[[3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`root`],[`type`,`button`,1,`toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m9 6 6 6-6 6`],[1,`summary`,`mono`],[1,`whole`,3,`bare`,`prop`,`componentId`,`pageId`,`rpc`,`writes`,`readDraft`],[1,`entries`,3,`id`],[1,`entry`,3,`padding-left`],[1,`entry`],[`type`,`button`,1,`toggle`],[`type`,`button`,1,`more`],[`role`,`status`,1,`muted`],[`role`,`alert`,1,`error`],[1,`key`,`mono`],[1,`leaf-edit`,3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`leaf`,`mono`],[`type`,`button`,1,`more`,3,`click`],[1,`muted`]],template:function(e,t){if(e&1&&j(0,EM,8,12)(1,DM,1,5,`app-prop-value`,0),e&2){let e;M((e=t.root())?0:1,e)}},dependencies:[qj],styles:[`[_nghost-%COMP%] { +}`]})},Kj=1e3,qj={depth:5,limit:100},Jj=`[redacted]`;function Yj(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Xj(e){return Yj(e)&&typeof e.$more==`number`&&Object.keys(e).length===1}function Zj(e){return Yj(e)&&typeof e.$collapsed==`string`&&typeof e.size==`number`&&Object.keys(e).length===2}function Qj(e){return e===`Array`?`array`:e===`Map`?`map`:e===`Set`?`set`:`object`}function $j(e){return e.$type===`Map`&&Array.isArray(e.entries)}function eM(e){return e.$type===`Set`&&Array.isArray(e.values)}function tM(e){return Object.keys(e).filter(e=>e!==`$type`&&e!==`$more`)}function nM(e){if(!e||typeof e!=`object`)return null;if(Zj(e))return e.size<=0?null:{kind:Qj(e.$collapsed),type:e.$collapsed,size:e.size,collapsed:!0};if(Xj(e))return null;if(Array.isArray(e)){let t=e.at(-1),n=Xj(t)?t.$more:0,r=e.length-+!!n+n;return r?{kind:`array`,type:`Array`,size:r,collapsed:!1}:null}let t=e;if($j(t)||eM(t)){let e=typeof t.size==`number`?t.size:0,n=$j(t)?`map`:`set`;return e?{kind:n,type:n===`map`?`Map`:`Set`,size:e,collapsed:!1}:null}let n=typeof t.$more==`number`?t.$more:0,r=tM(t).length+n,i=typeof t.$type==`string`?t.$type:`Object`;return r?{kind:`object`,type:i,size:r,collapsed:!1}:null}function rM(e){if(typeof e==`string`)return JSON.stringify(e);let t=nM(e);if(t)return oM(t);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function iM(e){let t=nM(e);if(!t||t.collapsed)return{children:[],more:0};if(Array.isArray(e)){let n=(Xj(e.at(-1))?e.slice(0,-1):e).map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:n,more:t.size-n.length}}let n=e;if(t.kind===`map`){let e=n.entries.map((e,t)=>{let[n,r]=Array.isArray(e)?e:[void 0,e];return{key:String(t),label:rM(n),value:r}});return{children:e,more:Math.max(0,t.size-e.length)}}if(t.kind===`set`){let e=n.values.map((e,t)=>({key:String(t),label:String(t),value:e}));return{children:e,more:Math.max(0,t.size-e.length)}}return{children:tM(n).map(e=>({key:e,label:e,value:n[e]})),more:typeof n.$more==`number`?n.$more:0}}function aM(e,t,n){return`${e} ${e===1?t:n}`}function oM(e){let t={array:aM(e.size,`item`,`items`),object:aM(e.size,`key`,`keys`),map:aM(e.size,`entry`,`entries`),set:aM(e.size,`value`,`values`)}[e.kind];return`${e.type} (${t})`}function sM(e,t){return JSON.stringify(t===void 0?e:[t,...e])}function cM(e,t){return e.map((e,n)=>n===0?e:(t?t[n-1]!==`object`:/^\d+$/.test(e))?`[${e}]`:`.${e}`).join(``)}function lM(e){return e.every(e=>e&&e===e.trim()&&!/[.[\]]/.test(e))?e.join(`.`):null}var uM=/^\[(Getter|Unreadable|Circular|Truncated|Function\b.*|Promise)\]$/;function dM(e){return e===null||typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e!==Jj&&!uM.test(e)&&!e.endsWith(`…`)}function fM(e,t){return!e||t.kind===`map`||t.kind===`set`||e===`signal`&&t.kind===`object`&&t.type!==`Object`?null:e}function pM(e,t,n,r,i=500){let a=[],o=r.trim().toLowerCase();if(!o)return a;let s=new Set,c=(e,t)=>{let r=sM(e);if(!(s.has(r)||a.length>=i)){s.add(r);for(let r of iM(t).children){let t=[...e,r.key];if(r.label.toLowerCase().includes(o)&&a.push(t),!nM(r.value))continue;let i=n(t)??(nM(r.value)?.collapsed?void 0:r.value);i!==void 0&&c(t,i)}}};return c(e,n(e)??t),a}var mM=(e,t)=>t.id;function hM(e,t){if(e&1){let e=V();I(0,`button`,2),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).toggle(t))}),E(),I(1,`svg`,3),R(2,`path`,4),L(),bs(),I(3,`span`,14),K(4),L(),I(5,`span`,5),K(6),L()()}if(e&2){let e=W().$implicit;A(`aria-expanded`,e.open)(`aria-label`,e.label+`: `+e.text),O(4),J(``,e.label,`:`),O(2),q(e.text)}}function gM(e,t){if(e&1&&R(0,`app-prop-value`,15),e&2){let e=W(5);F(`prop`,t)(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}function _M(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W(2).$implicit;O(),q(e.text)}}function vM(e,t){if(e&1&&(I(0,`span`,14),K(1),L(),j(2,gM,1,5,`app-prop-value`,15)(3,_M,2,1,`span`,16)),e&2){let e,t=W().$implicit;O(),J(``,t.label,`:`),O(),M((e=t.edit)?2:3,e)}}function yM(e,t){if(e&1){let e=V();I(0,`button`,17),H(`click`,function(){w(e);let t=W().$implicit;return T(W(3).more(t))}),K(1),I(2,`span`,18),K(3),L()()}if(e&2){let e=W().$implicit,t=W(3);O(),J(` Show `,t.step(e),` more `),O(2),J(`(`,e.more,` not listed)`)}}function bM(e,t){e&1&&(I(0,`span`,12),K(1,`Reading from the page…`),L())}function xM(e,t){if(e&1&&(I(0,`span`,13),K(1),L()),e&2){let e=W().$implicit;O(),q(e.text)}}function SM(e,t){if(e&1&&(I(0,`li`,9),j(1,hM,7,4,`button`,10)(2,vM,4,2)(3,yM,4,2,`button`,11)(4,bM,2,0,`span`,12)(5,xM,2,1,`span`,13),L()),e&2){let e,n=t.$implicit;y_(`padding-left`,n.depth*14,`px`),O(),M((e=n.kind)===`node`?1:e===`leaf`?2:e===`more`?3:e===`loading`?4:e===`error`?5:-1)}}function CM(e,t){if(e&1&&(I(0,`ul`,7),N(1,SM,6,3,`li`,8,mM),L()),e&2){let e=W(2);F(`id`,e.listId),A(`aria-label`,e.prop().name+` entries`),O(),P(e.rows())}}function wM(e,t){if(e&1){let e=V();I(0,`div`,1)(1,`button`,2),H(`click`,function(){return w(e),T(W().toggleRoot())}),E(),I(2,`svg`,3),R(3,`path`,4),L(),bs(),I(4,`span`,5),K(5),L()(),R(6,`app-prop-value`,6),L(),j(7,CM,3,2,`ul`,7)}if(e&2){let e=t,n=W();O(),A(`aria-expanded`,n.rootOpen())(`aria-controls`,n.rootOpen()?n.listId:null)(`aria-label`,n.prop().name+`: `+n.summaryOf(e)),O(4),q(n.summaryOf(e)),O(),F(`bare`,!0)(`prop`,n.prop())(`componentId`,n.componentId())(`pageId`,n.pageId())(`rpc`,n.rpc())(`writes`,n.writes())(`readDraft`,n.readWhole),O(),M(n.rootOpen()?7:-1)}}function TM(e,t){if(e&1&&R(0,`app-prop-value`,0),e&2){let e=W();F(`prop`,e.prop())(`componentId`,e.componentId())(`pageId`,e.pageId())(`rpc`,e.rpc())(`writes`,e.writes())}}var EM=0;function DM(e){if(e===void 0)return`undefined`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function OM(e){if(Array.isArray(e))return e.every(OM);if(e&&typeof e==`object`){let t=e;return![`$collapsed`,`$more`,`$type`].some(e=>Object.hasOwn(t,e))&&Object.values(t).every(OM)}return dM(e)}var kM=class e{prop=$.required();store=$.required();componentId=$.required();pageId=$(null);rpc=$(null);writes=$(!1);directive=$(void 0);query=$(``);listId=`value-tree-${++EM}`;host=C(Vl);pendingMore=null;constructor(){Mv(()=>{let e=this.rows(),t=this.pendingMore;if(!t)return;let n=e.findIndex(e=>(e.kind===`leaf`||e.kind===`node`)&&!t.has(e.id));if(n<0)return;this.pendingMore=null;let r=document.activeElement;r&&r!==document.body&&r.isConnected||this.focusNear(n)})}rootPath=X(()=>[this.prop().prop]);rootValue=X(()=>this.store().level(this.rootPath(),this.directive())??this.prop().value);root=X(()=>nM(this.rootValue()));needle=X(()=>this.query().trim().toLowerCase());matches=X(()=>{let e=this.needle(),t=this.prop();if(!e||[t.name,t.prop].some(t=>t.toLowerCase().includes(e)))return null;let n=this.store(),r=this.directive();return pM(this.rootPath(),this.rootValue(),e=>n.level(e,r),e)});rootOpen=X(()=>!!this.matches()?.length||this.store().isOpen(this.rootPath(),this.directive()));rows=X(()=>{let e=this.root();if(!e)return[];let t=this.store(),n=this.directive(),r=this.matches(),i=new Set,a=new Set;for(let e of r??[]){a.add(sM(e));for(let t=2;t<=e.length;t++)i.add(sM(e.slice(0,t)))}let o=this.prop(),s=this.writes()&&n===void 0,c=[],l=(e,o,d,f,p,m)=>{let{children:h,more:g}=iM(e);for(let e of h){let h=[...o,e.key],g=sM(h);if(r&&!m&&!i.has(g))continue;let _=nM(e.value),ee=sM(h,n);if(!_){let t=p&&dM(e.value)?lM(h):null;c.push({id:ee,kind:`leaf`,depth:f,path:h,label:e.label,text:DM(e.value),edit:s&&t&&p?{name:cM(h,[...d]),prop:t,value:e.value,edit:p}:void 0});continue}let te=!!r&&!m&&i.has(g)&&!a.has(g)||t.isOpen(h,n);if(c.push({id:ee,kind:`node`,depth:f,path:h,label:e.label,text:oM(_),container:_,open:te}),!te)continue;let ne=t.level(h,n)??(_.collapsed?void 0:e.value),re=[...d,_.kind];ne===void 0?t.errors().has(ee)?c.push({...u(h,f+1,`error`),text:t.errors().get(ee)}):c.push(u(h,f+1,`loading`)):l(ne,h,re,f+1,fM(p,_),m||a.has(g))}g>0&&(!r||m)&&c.push({...u(o,f,`more`),more:g,listed:h.length})},u=(e,t,r)=>({id:`${sM(e,n)}:${r}`,kind:r,depth:t,path:e,label:``,text:``});return l(this.rootValue(),this.rootPath(),[e.kind],0,s?fM(o.editInside??null,e):null,!r),c});readWhole=async()=>{let e=await this.store().read(this.rootPath(),qj.depth,qj.limit);return e.ok?OM(e.value)?{value:e.value}:{error:`Too large to edit as a whole. Open it to edit the values inside.`}:{error:e.error??`The page did not read it.`}};summaryOf(e){return oM(e)}toggleRoot(){this.pendingMore=null,this.store().toggle(this.rootPath(),this.directive(),!1)}toggle(e){this.pendingMore=null,this.store().toggle(e.path,this.directive(),!!e.container?.collapsed)}more(e){this.pendingMore=new Set(this.rows().map(e=>e.id)),this.store().more(e.path,this.directive(),e.listed??0)}focusNear(e){let t=this.host.nativeElement,n=Array.from(t.querySelectorAll(`#${this.listId} > li`)),r=e=>e?.querySelector(`button:not([disabled]), input, textarea, [tabindex="0"]`);(n.slice(e).map(r).find(Boolean)??n.slice(0,e).reverse().map(r).find(Boolean)??t.querySelector(`.root > .toggle`))?.focus()}step(e){return Math.min(100,e.more??0)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-value-tree`]],inputs:{prop:[1,`prop`],store:[1,`store`],componentId:[1,`componentId`],pageId:[1,`pageId`],rpc:[1,`rpc`],writes:[1,`writes`],directive:[1,`directive`],query:[1,`query`]},decls:2,vars:1,consts:[[3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`root`],[`type`,`button`,1,`toggle`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[`d`,`m9 6 6 6-6 6`],[1,`summary`,`mono`],[1,`whole`,3,`bare`,`prop`,`componentId`,`pageId`,`rpc`,`writes`,`readDraft`],[1,`entries`,3,`id`],[1,`entry`,3,`padding-left`],[1,`entry`],[`type`,`button`,1,`toggle`],[`type`,`button`,1,`more`],[`role`,`status`,1,`muted`],[`role`,`alert`,1,`error`],[1,`key`,`mono`],[1,`leaf-edit`,3,`prop`,`componentId`,`pageId`,`rpc`,`writes`],[1,`leaf`,`mono`],[`type`,`button`,1,`more`,3,`click`],[1,`muted`]],template:function(e,t){if(e&1&&j(0,wM,8,12)(1,TM,1,5,`app-prop-value`,0),e&2){let e;M((e=t.root())?0:1,e)}},dependencies:[Gj],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; } @@ -2091,7 +2091,7 @@ button.edit[_ngcontent-%COMP%] { .more[_ngcontent-%COMP%] { transition: none; } -}`]})};function MM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var NM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=D(new Map);pushed=D({});open=D(new Set);loading=D(new Set);errors=D(new Map);limits=new Map;generation=0;constructor(e){this.sender=e}follow(e,t){let n=e.componentId===this.target.componentId&&e.pageId===this.target.pageId;this.target=e,n||(this.generation++,this.fetched.set(new Map),this.open.set(new Set),this.loading.set(new Set),this.errors.set(new Map),this.limits.clear()),this.pushed.set(t??{})}level(e,t){let n=lM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(lM(e,t))}toggle(e,t,n){let r=lM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||MM(e,r))&&i.delete(e);this.open.set(i),this.send({path:e,directive:t,forget:!0});return}i.add(r),this.open.set(i),n&&this.load(e,t,this.limits.get(r)??30)}more(e,t,n){let r=lM(e,t),i=Math.min(Jj,Math.max(n,this.limits.get(r)??0)+100);this.limits.set(r,i),this.load(e,t,i)}async read(e,t,n){return this.send({path:e,depth:t,limit:n})}async load(e,t,n){let r=lM(e,t),i=this.generation;this.loading.update(e=>new Set(e).add(r));let a=await this.send({path:e,directive:t,limit:n,watch:!0});i===this.generation&&(this.loading.update(e=>{let t=new Set(e);return t.delete(r),t}),this.errors.update(e=>{let t=new Map(e);return a.ok?t.delete(r):t.set(r,a.error??`The page did not read it.`),t}),a.ok&&this.fetched.update(e=>new Map(e).set(r,a.value)))}async send(e){if(this.sender){if(e.forget)return{ok:!0};let{directive:t,watch:n,...r}=e;try{return await this.sender(r)}catch{return{error:`The devtools server did not answer. Try again.`}}}let{rpc:t,pageId:n,componentId:r}=this.target;if(!t||!n||!r)return{error:`No live page to read from.`};let{directive:i,...a}=e;try{return await t.scope(`pangular`).rpc.call(`request-component-value`,{pageId:n,request:{id:r,...a,...i===void 0?{}:{directive:i}}})??{}}catch{return{error:`The devtools server did not answer. Try again.`}}}};function PM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(2);O(),J(`: `,e.label())}}function FM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(3);O(),J(`: `,e.label())}}function IM(e,t){if(e&1){let e=V();z(0,`button`,4),U(`click`,function(){return w(e),T(W(2).store(`log`))}),K(1,` Log to console `),j(2,FM,2,1,`span`,1),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1)}}function LM(e,t){if(e&1){let e=V();z(0,`button`,0),U(`click`,function(){return w(e),T(W().store())}),K(1,` Store as global `),j(2,PM,2,1,`span`,1),B(),j(3,IM,3,2,`button`,2),z(4,`span`,3),K(5),B()}if(e&2){let e=W();Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1),O(),M(e.canLog()?3:-1),O(2),q(e.message())}}var RM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>rE(this.rpc()));busy=D(!1);message=D(``);async store(e=`store`){let t=this.rpc(),n=this.pageId();if(t&&n){this.busy.set(!0),this.message.set(``);try{let r=await t.scope(`pangular`).rpc.call(`request-console-global`,{pageId:n,target:this.target(),...e===`log`?{mode:e}:{}}),i=e===`log`?r?.ok?`Logged in the page console.`:`Not logged.`:r?.ok&&r.name?`Stored as ${r.name}.`:`Not stored.`;this.message.set(r?.message||i)}catch{this.message.set(`Could not reach the page.`)}finally{this.busy.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-store-global`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],target:[1,`target`],label:[1,`label`],canLog:[1,`canLog`]},decls:1,vars:1,consts:[[`type`,`button`,1,`store`,3,`click`,`disabled`],[1,`sr-only`],[`type`,`button`,1,`store`,`log`,3,`disabled`],[`role`,`status`,1,`status`],[`type`,`button`,1,`store`,`log`,3,`click`,`disabled`]],template:function(e,t){e&1&&j(0,LM,6,4),e&2&&M(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { +}`]})};function AM(e,t){return e.length>t.length&&e.startsWith(`${t.slice(0,-1)},`)}var jM=class{sender;target={rpc:null,pageId:null,componentId:null};fetched=D(new Map);pushed=D({});open=D(new Set);loading=D(new Set);errors=D(new Map);limits=new Map;generation=0;constructor(e){this.sender=e}follow(e,t){let n=e.componentId===this.target.componentId&&e.pageId===this.target.pageId;this.target=e,n||(this.generation++,this.fetched.set(new Map),this.open.set(new Set),this.loading.set(new Set),this.errors.set(new Map),this.limits.clear()),this.pushed.set(t??{})}level(e,t){let n=sM(e,t),r=this.pushed();return Object.hasOwn(r,n)?r[n]:this.fetched().get(n)}isOpen(e,t){return this.open().has(sM(e,t))}toggle(e,t,n){let r=sM(e,t),i=new Set(this.open());if(i.has(r)){for(let e of i)(e===r||AM(e,r))&&i.delete(e);this.open.set(i),this.send({path:e,directive:t,forget:!0});return}i.add(r),this.open.set(i),n&&this.load(e,t,this.limits.get(r)??30)}more(e,t,n){let r=sM(e,t),i=Math.min(Kj,Math.max(n,this.limits.get(r)??0)+100);this.limits.set(r,i),this.load(e,t,i)}async read(e,t,n){return this.send({path:e,depth:t,limit:n})}async load(e,t,n){let r=sM(e,t),i=this.generation;this.loading.update(e=>new Set(e).add(r));let a=await this.send({path:e,directive:t,limit:n,watch:!0});i===this.generation&&(this.loading.update(e=>{let t=new Set(e);return t.delete(r),t}),this.errors.update(e=>{let t=new Map(e);return a.ok?t.delete(r):t.set(r,a.error??`The page did not read it.`),t}),a.ok&&this.fetched.update(e=>new Map(e).set(r,a.value)))}async send(e){if(this.sender){if(e.forget)return{ok:!0};let{directive:t,watch:n,...r}=e;try{return await this.sender(r)}catch{return{error:`The devtools server did not answer. Try again.`}}}let{rpc:t,pageId:n,componentId:r}=this.target;if(!t||!n||!r)return{error:`No live page to read from.`};let{directive:i,...a}=e;try{return await t.scope(`pangular`).rpc.call(`request-component-value`,{pageId:n,request:{id:r,...a,...i===void 0?{}:{directive:i}}})??{}}catch{return{error:`The devtools server did not answer. Try again.`}}}};function MM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(2);O(),J(`: `,e.label())}}function NM(e,t){if(e&1&&(z(0,`span`,1),K(1),B()),e&2){let e=W(3);O(),J(`: `,e.label())}}function PM(e,t){if(e&1){let e=V();z(0,`button`,4),U(`click`,function(){return w(e),T(W(2).store(`log`))}),K(1,` Log to console `),j(2,NM,2,1,`span`,1),B()}if(e&2){let e=W(2);Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1)}}function FM(e,t){if(e&1){let e=V();z(0,`button`,0),U(`click`,function(){return w(e),T(W().store())}),K(1,` Store as global `),j(2,MM,2,1,`span`,1),B(),j(3,PM,3,2,`button`,2),z(4,`span`,3),K(5),B()}if(e&2){let e=W();Pg(`disabled`,e.busy()||!e.rpc()||!e.pageId()),O(2),M(e.label()?2:-1),O(),M(e.canLog()?3:-1),O(2),q(e.message())}}var IM=class e{rpc=$(null);pageId=$(null);target=$.required();label=$(``);canLog=$(!1);staticReport=X(()=>tE(this.rpc()));busy=D(!1);message=D(``);async store(e=`store`){let t=this.rpc(),n=this.pageId();if(t&&n){this.busy.set(!0),this.message.set(``);try{let r=await t.scope(`pangular`).rpc.call(`request-console-global`,{pageId:n,target:this.target(),...e===`log`?{mode:e}:{}}),i=e===`log`?r?.ok?`Logged in the page console.`:`Not logged.`:r?.ok&&r.name?`Stored as ${r.name}.`:`Not stored.`;this.message.set(r?.message||i)}catch{this.message.set(`Could not reach the page.`)}finally{this.busy.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-store-global`]],inputs:{rpc:[1,`rpc`],pageId:[1,`pageId`],target:[1,`target`],label:[1,`label`],canLog:[1,`canLog`]},decls:1,vars:1,consts:[[`type`,`button`,1,`store`,3,`click`,`disabled`],[1,`sr-only`],[`type`,`button`,1,`store`,`log`,3,`disabled`],[`role`,`status`,1,`status`],[`type`,`button`,1,`store`,`log`,3,`click`,`disabled`]],template:function(e,t){e&1&&j(0,FM,6,4),e&2&&M(t.staticReport()?-1:0)},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-wrap: wrap; align-items: center; @@ -2140,7 +2140,7 @@ button.edit[_ngcontent-%COMP%] { .status[_ngcontent-%COMP%]:empty { display: none; -}`]})},zM=(e,t)=>t.block.id,BM=(e,t)=>t.kind;function VM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function HM(e,t){if(e&1&&(K(0),z(1,`span`,11),K(2),B()),e&2){let e=W().$implicit;J(` `,e.kind,` `),O(2),J(``,e.seconds,`s`)}}function UM(e,t){if(e&1&&(z(0,`span`,8),j(1,VM,1,1)(2,HM,3,2),B()),e&2){let e=t.$implicit;b_(`note-`+e.kind),A(`title`,e.text),O(),M(e.seconds===void 0?1:2)}}function WM(e,t){e&1&&(z(0,`span`,8),K(1,`hydrated`),B())}function GM(e,t){e&1&&(z(0,`span`,8),K(1,`@error block`),B())}function KM(e,t){if(e&1&&(z(0,`span`,9),K(1),B()),e&2){let e=W().$implicit;O(),q(e.timings)}}function qM(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,4),U(`click`,function(){let t=w(e).$implicit;return T(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`blur`,function(){return w(e),T(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return w(e),T(W(2).highlight.emit(null))}),z(2,`span`,5),K(3),B(),z(4,`span`,6),K(5),B(),N(6,UM,3,4,`span`,7,BM),j(8,WM,2,0,`span`,8),j(9,GM,2,0,`span`,8),j(10,KM,2,1,`span`,9),z(11,`span`,10),K(12),B()()()}if(e&2){let e=t.$implicit;O(),A(`aria-disabled`,e.block.owner?null:`true`),O(2),q(e.block.owner?.name??`Unknown component`),O(),b_(`defer-state-`+e.block.state),O(),q(e.block.state),O(),P(e.notes),O(2),M(e.block.hydration===`hydrated`?8:-1),O(),M(e.block.hasErrorBlock?9:-1),O(),M(e.timings?10:-1),O(2),q(e.block.triggers.join(`, `)||`no triggers`)}}function JM(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),z(3,`span`,2),K(4),B()(),z(5,`ul`,3),N(6,qM,13,9,`li`,null,zM),B()()),e&2){let e=W();O(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),O(2),P(e.rows())}}function YM(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function XM(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${YM(n)}`);let r=[e.loading?.afterTime==null?``:`after ${YM(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${YM(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var ZM=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=bv();highlight=bv();now=D(Date.now());waiting=X(()=>this.blocks().some(e=>!!e.since&&(e.state===`placeholder`||e.state===`initial`)));rows=X(()=>{let e=this.now()-this.clockOffset();return this.blocks().map(t=>({block:t,notes:KT({...t,since:t.since||e},e),timings:XM(t)}))});constructor(){let e,t=()=>{clearInterval(e),e=void 0};_c(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),C(As).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-defer-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],clockOffset:[1,`clockOffset`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:1,vars:1,consts:[[`aria-labelledby`,`ct-defer-title`,1,`defer`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`pill`],[1,`defer-list`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`defer-state`],[1,`flag`,3,`class`],[1,`flag`],[1,`timings`],[1,`triggers`,`mono`],[`aria-hidden`,`true`]],template:function(e,t){e&1&&j(0,JM,8,2,`section`,0),e&2&&M(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})},LM=(e,t)=>t.block.id,RM=(e,t)=>t.kind;function zM(e,t){if(e&1&&K(0),e&2){let e=W().$implicit;J(` `,e.label,` `)}}function BM(e,t){if(e&1&&(K(0),z(1,`span`,11),K(2),B()),e&2){let e=W().$implicit;J(` `,e.kind,` `),O(2),J(``,e.seconds,`s`)}}function VM(e,t){if(e&1&&(z(0,`span`,8),j(1,zM,1,1)(2,BM,3,2),B()),e&2){let e=t.$implicit;b_(`note-`+e.kind),A(`title`,e.text),O(),M(e.seconds===void 0?1:2)}}function HM(e,t){e&1&&(z(0,`span`,8),K(1,`hydrated`),B())}function UM(e,t){e&1&&(z(0,`span`,8),K(1,`@error block`),B())}function WM(e,t){if(e&1&&(z(0,`span`,9),K(1),B()),e&2){let e=W().$implicit;O(),q(e.timings)}}function GM(e,t){if(e&1){let e=V();z(0,`li`)(1,`button`,4),U(`click`,function(){let t=w(e).$implicit;return T(W(2).showOwner.emit(t.block))})(`focus`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`blur`,function(){return w(e),T(W(2).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(2).highlight.emit(t.block))})(`mouseleave`,function(){return w(e),T(W(2).highlight.emit(null))}),z(2,`span`,5),K(3),B(),z(4,`span`,6),K(5),B(),N(6,VM,3,4,`span`,7,RM),j(8,HM,2,0,`span`,8),j(9,UM,2,0,`span`,8),j(10,WM,2,1,`span`,9),z(11,`span`,10),K(12),B()()()}if(e&2){let e=t.$implicit;O(),A(`aria-disabled`,e.block.owner?null:`true`),O(2),q(e.block.owner?.name??`Unknown component`),O(),b_(`defer-state-`+e.block.state),O(),q(e.block.state),O(),P(e.notes),O(2),M(e.block.hydration===`hydrated`?8:-1),O(),M(e.block.hasErrorBlock?9:-1),O(),M(e.timings?10:-1),O(2),q(e.block.triggers.join(`, `)||`no triggers`)}}function KM(e,t){if(e&1&&(z(0,`section`,0)(1,`h2`,1),K(2,` Defer blocks `),z(3,`span`,2),K(4),B()(),z(5,`ul`,3),N(6,GM,13,9,`li`,null,LM),B()()),e&2){let e=W();O(4),Y(``,e.rows().length,``,e.truncated()?`+`:``),O(2),P(e.rows())}}function qM(e){return e<1e3?`${e}ms`:`${Number((e/1e3).toFixed(2))}s`}function JM(e){let t=[],n=e.placeholder?.minimumTime;n!=null&&t.push(`placeholder min ${qM(n)}`);let r=[e.loading?.afterTime==null?``:`after ${qM(e.loading.afterTime)}`,e.loading?.minimumTime==null?``:`min ${qM(e.loading.minimumTime)}`].filter(Boolean);return r.length&&t.push(`loading ${r.join(`, `)}`),t.join(` · `)}var YM=class e{blocks=$([]);truncated=$(!1);clockOffset=$(0);showOwner=vv();highlight=vv();now=D(Date.now());waiting=X(()=>this.blocks().some(e=>!!e.since&&(e.state===`placeholder`||e.state===`initial`)));rows=X(()=>{let e=this.now()-this.clockOffset();return this.blocks().map(t=>({block:t,notes:WT({...t,since:t.since||e},e),timings:JM(t)}))});constructor(){let e,t=()=>{clearInterval(e),e=void 0};_c(()=>{if(!this.waiting())return t();e===void 0&&(this.now.set(Date.now()),e=setInterval(()=>this.now.set(Date.now()),1e3))}),C(As).onDestroy(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-defer-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],clockOffset:[1,`clockOffset`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:1,vars:1,consts:[[`aria-labelledby`,`ct-defer-title`,1,`defer`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`pill`],[1,`defer-list`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`defer-state`],[1,`flag`,3,`class`],[1,`flag`],[1,`timings`],[1,`triggers`,`mono`],[`aria-hidden`,`true`]],template:function(e,t){e&1&&j(0,KM,8,2,`section`,0),e&2&&M(t.rows().length?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -2282,7 +2282,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},QM=(e,t)=>t.id;function $M(e,t){if(e&1&&(I(0,`p`,4),K(1),L()),e&2){let e=W(2);O(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function eN(e,t){e&1&&(I(0,`span`,9),K(1,`@empty showing`),L())}function tN(e,t){e&1&&(I(0,`span`,10),K(1,`@empty`),L())}function nN(e,t){e&1&&(I(0,`span`,10),K(1,`renders nothing`),L())}function rN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,6),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showOwner.emit(t))})(`focus`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,7),K(3),L(),I(4,`span`,8),K(5),L(),j(6,eN,2,0,`span`,9)(7,tN,2,0,`span`,10)(8,nN,2,0,`span`,10),I(9,`span`,11),K(10),L()()()}if(e&2){let e=t.$implicit,n=W(3);O(),A(`aria-disabled`,e.owner?null:`true`),O(2),q(e.owner?.name??`Unknown component`),O(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),O(),M(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),O(4),q(n.trackLabel(e))}}function iN(e,t){if(e&1&&(I(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),I(3,`span`,3),K(4),L()(),j(5,$M,2,1,`p`,4),I(6,`ul`,5),N(7,rN,11,6,`li`,null,QM),L()()),e&2){let e=W(),t=W();O(4),q(t.truncated()?e.length+`+`:e.length),O(),M(t.truncated()?5:-1),O(2),P(e)}}function aN(e,t){e&1&&j(0,iN,9,2,`section`,1),e&2&&M(t.length?0:-1)}function oN(e,t){e&1&&R(0,`app-angular-unavailable`,0),e&2&&F(`page`,W().angular())}var sN={$index:`track $index`,item:`track item`,function:`track expression`},cN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=bv();highlight=bv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?sN[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-for-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],supported:[1,`supported`],angular:[1,`angular`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:2,vars:1,consts:[[`capability`,`forBlocks`,`missing`,``,`compact`,``,1,`for`,3,`page`],[`aria-labelledby`,`ct-for-title`,1,`for`],[`id`,`ct-for-title`,1,`for-title`],[1,`pill`],[1,`note`],[1,`for-list`],[`type`,`button`,1,`for-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`count`],[1,`flag`,`empty`],[1,`flag`],[1,`track`,`mono`]],template:function(e,t){if(e&1&&j(0,aN,1,1)(1,oN,1,1,`app-angular-unavailable`,0),e&2){let e;M((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[FD],styles:[`[_nghost-%COMP%] { +}`]})},XM=(e,t)=>t.id;function ZM(e,t){if(e&1&&(I(0,`p`,4),K(1),L()),e&2){let e=W(2);O(),J(`The page has more @for blocks than the `,e.length,` listed.`)}}function QM(e,t){e&1&&(I(0,`span`,9),K(1,`@empty showing`),L())}function $M(e,t){e&1&&(I(0,`span`,10),K(1,`@empty`),L())}function eN(e,t){e&1&&(I(0,`span`,10),K(1,`renders nothing`),L())}function tN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,6),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showOwner.emit(t))})(`focus`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit,n=W(3);return T(n.highlight.emit(n.target(t)))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,7),K(3),L(),I(4,`span`,8),K(5),L(),j(6,QM,2,0,`span`,9)(7,$M,2,0,`span`,10)(8,eN,2,0,`span`,10),I(9,`span`,11),K(10),L()()()}if(e&2){let e=t.$implicit,n=W(3);O(),A(`aria-disabled`,e.owner?null:`true`),O(2),q(e.owner?.name??`Unknown component`),O(2),Y(` `,e.count,` `,e.count===1?`item`:`items`,` `),O(),M(e.showingEmpty?6:e.hasEmptyBlock?7:e.count===0?8:-1),O(4),q(n.trackLabel(e))}}function nN(e,t){if(e&1&&(I(0,`section`,1)(1,`h2`,2),K(2,` @for blocks `),I(3,`span`,3),K(4),L()(),j(5,ZM,2,1,`p`,4),I(6,`ul`,5),N(7,tN,11,6,`li`,null,XM),L()()),e&2){let e=W(),t=W();O(4),q(t.truncated()?e.length+`+`:e.length),O(),M(t.truncated()?5:-1),O(2),P(e)}}function rN(e,t){e&1&&j(0,nN,9,2,`section`,1),e&2&&M(t.length?0:-1)}function iN(e,t){e&1&&R(0,`app-angular-unavailable`,0),e&2&&F(`page`,W().angular())}var aN={$index:`track $index`,item:`track item`,function:`track expression`},oN=class e{blocks=$(void 0);truncated=$(!1);supported=$(null);angular=$(null);showOwner=vv();highlight=vv();target(e){return e.rootIds[0]??e.owner?.id??null}trackLabel(e){return e.track?aN[e.track]:`track unknown`}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-for-blocks`]],inputs:{blocks:[1,`blocks`],truncated:[1,`truncated`],supported:[1,`supported`],angular:[1,`angular`]},outputs:{showOwner:`showOwner`,highlight:`highlight`},decls:2,vars:1,consts:[[`capability`,`forBlocks`,`missing`,``,`compact`,``,1,`for`,3,`page`],[`aria-labelledby`,`ct-for-title`,1,`for`],[`id`,`ct-for-title`,1,`for-title`],[1,`pill`],[1,`note`],[1,`for-list`],[`type`,`button`,1,`for-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[1,`name`,`mono`],[1,`count`],[1,`flag`,`empty`],[1,`flag`],[1,`track`,`mono`]],template:function(e,t){if(e&1&&j(0,rN,1,1)(1,iN,1,1,`app-angular-unavailable`,0),e&2){let e;M((e=t.blocks())?0:t.supported()===!1?1:-1,e)}},dependencies:[ND],styles:[`[_nghost-%COMP%] { display: block; } @@ -2400,7 +2400,7 @@ button.edit[_ngcontent-%COMP%] { min-width: 0; text-overflow: ellipsis; white-space: nowrap; -}`]})},lN=(e,t)=>t.id;function uN(e,t){if(e&1&&(I(0,`p`,11),K(1),L(),I(2,`h3`,7),K(3,`Still retained`),L(),I(4,`p`,6),K(5,` In a development build, Angular's DI debug data keeps every destroyed component in memory, so Pangular can't tell a leak from that. Check retainers in the Chrome DevTools Memory panel: take a heap snapshot after a few navigations, search for the class and look for a retainer other than Angular's DI debug records. Open subscriptions after destroy are still tracked below. `),L()),e&2){let e=W(),t=W();O(),q(t.plural(e.navigations,`navigation`))}}function dN(e,t){e&1&&(I(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),L())}function fN(e,t){if(e&1&&(I(0,`span`,18),K(1),L()),e&2){let e=W().$implicit,t=W(4);O(),q(t.plural(e.subscriptions,`open subscription`))}}function pN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,15),K(4),L(),I(5,`span`,16),K(6),L(),I(7,`span`,17),K(8),L(),j(9,fN,2,1,`span`,18),L()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.name),O(2),q(e.route||`/`),O(2),J(``,n.plural(e.navigations,`navigation`),` ago`),O(2),q(n.ageOf(e)),O(),M(e.subscriptions?9:-1)}}function mN(e,t){if(e&1&&(I(0,`p`,6),K(1),L(),I(2,`ul`,12),N(3,pN,10,5,`li`,13,lN),L()),e&2){let e=W(3);O(),Y(` Destroyed, yet still in memory after at least `,e.minNavigations,` navigations and `,e.minSeconds,` seconds. Take a heap snapshot, search for the class and read its retainers. `),O(2),P(e.retained().slice(0,e.shown))}}function hN(e,t){e&1&&(I(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),L())}function gN(e,t){if(e&1&&(I(0,`p`,6),K(1),I(2,`span`,19),K(3),L(),K(4,`. Navigate a few times to see whether they stay. `),L()),e&2){let e=W(3);O(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),O(2),q(e.names(e.recent()))}}function _N(e,t){if(e&1&&(j(0,dN,2,0,`p`,6),I(1,`p`,11),K(2),L(),I(3,`h3`,7),K(4,` Still retained `),I(5,`span`,8),K(6),L()(),j(7,mN,5,2)(8,hN,2,0,`p`,6),j(9,gN,5,2,`p`,6)),e&2){let e=W(),t=W();M(e.support.retention?-1:0),O(2),z_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),O(4),q(t.retained().length),O(),M(t.retained().length?7:8),O(2),M(t.recent().length?9:-1)}}function vN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),I(2,`span`,19),K(3),L(),K(4,`. `),L()),e&2){let e=W(2);O(3),q(e.names(e.detached()))}}function yN(e,t){if(e&1&&(I(0,`span`,8),K(1),L()),e&2){let e=W();O(),q(e.subscriptions.length)}}function bN(e,t){if(e&1&&(I(0,`span`,15),K(1),L()),e&2){let e=W().$implicit;O(),q(e.source)}}function xN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`,18),K(6),L(),j(7,bN,2,1,`span`,15),L()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),J(``,e.count,` open`),O(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),O(),M(e.source?7:-1)}}function SN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Still open although the component that made them is gone. Tear them down with takeUntilDestroyed(), DestroyRef.onDestroy or the async pipe. `),L(),I(2,`ul`,12),N(3,xN,8,4,`li`,13,gg),L()),e&2){let e=W(2),t=W();O(3),P(e.subscriptions.slice(0,t.shown))}}function CN(e,t){e&1&&(I(0,`p`,6),K(1,`No subscription is still open after its component went away.`),L())}function wN(e,t){e&1&&(I(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),L())}function TN(e,t){if(e&1&&(j(0,SN,5,0)(1,CN,2,0,`p`,6),j(2,wN,2,0,`p`,6)),e&2){let e=W();M(+!e.subscriptions.length),O(2),M(e.support.instances?-1:2)}}function EN(e,t){e&1&&(I(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),L())}function DN(e,t){e&1&&(I(0,`p`,6),K(1,` Off. Track subscriptions wraps Observable.prototype.subscribe on the page to record which component makes each subscription, until you stop it. Subscriptions made before you start are not seen, so reload or navigate again after starting. `),L())}function ON(e,t){e&1&&R(0,`app-angular-unavailable`,10),e&2&&F(`page`,W(2).angular())}function kN(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W().$implicit,t=W(3);O(),q(t.plural(e.subscriptions,`subscription`))}}function AN(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,20),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,14),K(3),L(),I(4,`span`,16),K(5),L(),j(6,kN,2,1,`span`,16),L()()}if(e&2){let e=t.$implicit,n=W(2),r=W();O(3),q(e.name),O(2),q(r.effectsText(e)),O(),M(n.support.subscriptions===`on`?6:-1)}}function jN(e,t){e&1&&(I(0,`p`,6),K(1,` Angular files a component's effects under the template its host sits in, so effects of components side by side in one template show as shared. `),L())}function MN(e,t){if(e&1&&(I(0,`ul`,12),N(1,AN,7,3,`li`,null,lN),L(),j(3,jN,2,0,`p`,6)),e&2){let e=W(),t=W();O(),P(e.components.slice(0,t.shown)),O(2),M(e.components.some(t.hasShared)?3:-1)}}function NN(e,t){e&1&&(I(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),L())}function PN(e,t){if(e&1&&(j(0,uN,6,1)(1,_N,10,7),j(2,vN,5,1,`p`,6),I(3,`h3`,7),K(4,` Open subscriptions after destroy `),j(5,yN,2,1,`span`,8),L(),j(6,TN,3,2)(7,EN,2,0,`p`,9)(8,DN,2,0,`p`,6),I(9,`h3`,7),K(10,` Live effects and subscriptions `),I(11,`span`,8),K(12),L()(),j(13,ON,1,1,`app-angular-unavailable`,10),j(14,MN,4,1)(15,NN,2,0,`p`,6)),e&2){let e,n=t,r=W();M(n.support.retention===`dev-di-debug`?0:1),O(2),M(r.detached().length?2:-1),O(3),M(n.support.subscriptions===`on`?5:-1),O(),M((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),O(6),q(n.components.length),O(),M(n.support.effects?-1:13),O(),M(n.components.length?14:15)}}function FN(e,t){e&1&&(I(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),L())}var IN=20;function LN(e){let t=Math.max(0,Math.round(e/1e3));if(t<120)return`${t} s`;let n=Math.round(t/60);return n<120?`${n} min`:`${Math.round(n/60)} h`}var RN=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,zN=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=bv();highlight=bv();shown=IN;minNavigations=2;minSeconds=sT/1e3;plural=RN;busy=D(!1);announcement=D(``);tracking=X(()=>this.report()?.support.subscriptions===`on`);split=X(()=>{let e=this.report(),t=[],n=[],r=[];if(!e)return{retained:t,recent:n,detached:r};let i=e.support.retention===`dev-di-debug`;for(let a of e.destroyed)if(a.detached)r.push(a);else if(i)continue;else this.isRetained(e,a)?t.push(a):n.push(a);return{retained:t,recent:n,detached:r}});retained=X(()=>this.split().retained);recent=X(()=>this.split().recent);detached=X(()=>this.split().detached);ageMs(e,t){return Math.max(0,this.now()()-e.reportedAt+(e.at-t.destroyedAt))}isRetained(e,t){return t.navigations>=2&&this.ageMs(e,t)>=1e4}ageOf(e){let t=this.report();return t?`${LN(this.ageMs(t,e))} old`:``}names(e){let t=[...new Set(e.map(e=>e.name))];return t.length>6?`${t.slice(0,6).join(`, `)} and more`:t.join(`, `)}hasShared(e){return!!e.sharedEffects}effectsText(e){let t=RN(e.effects,`effect`);return e.sharedEffects?`${t}, ${e.sharedEffects} shared`:t}async toggle(){let e=this.pageId();if(!e||this.busy())return;let t=!this.tracking();this.busy.set(!0);try{await tE(this.rpc(),`request-leak-tracking`,{pageId:e,on:t}),this.announcement.set(t?`Tracking subscriptions. Reload or navigate to see subscriptions made at start.`:`Stopped tracking subscriptions.`)}catch{this.announcement.set(`Could not reach the page. Try again.`)}finally{this.busy.set(!1)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-leaks-section`]],inputs:{report:[1,`report`],pageId:[1,`pageId`],rpc:[1,`rpc`],angular:[1,`angular`],now:[1,`now`]},outputs:{showComponent:`showComponent`,highlight:`highlight`},decls:12,vars:5,consts:[[`aria-labelledby`,`ct-leaks-title`,1,`leaks`],[1,`head`],[`id`,`ct-leaks-title`],[`type`,`button`,1,`track`,3,`click`,`disabled`],[`role`,`status`,1,`sr-only`],[1,`hint`],[1,`note`],[1,`sub`],[1,`pill`],[`role`,`status`,1,`note`],[`capability`,`signalGraph`,`missing`,``,`compact`,``,3,`page`],[1,`stats`],[1,`rows`],[1,`row`],[1,`name`,`mono`],[1,`meta`,`mono`],[1,`count`],[1,`meta`],[1,`flag`,`warn`],[1,`mono`],[`type`,`button`,1,`row`,`live`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),L(),I(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),L(),I(6,`p`,4),K(7),L()(),I(8,`p`,5),K(9,` Components that left the page but are still in memory, and the live effects and RxJS subscriptions of each component. The browser collects garbage when it decides, so a retained instance is a hint: check what holds it in the Chrome DevTools Memory panel. `),L(),j(10,PN,16,7)(11,FN,2,0,`p`,6),L()),e&2){let e;O(4),F(`disabled`,!t.pageId()||!t.report()),A(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),O(3),q(t.announcement()),O(3),M((e=t.report())?10:11,e)}},dependencies:[FD],styles:[`[_nghost-%COMP%] { +}`]})},sN=(e,t)=>t.id;function cN(e,t){if(e&1&&(I(0,`p`,11),K(1),L(),I(2,`h3`,7),K(3,`Still retained`),L(),I(4,`p`,6),K(5,` In a development build, Angular's DI debug data keeps every destroyed component in memory, so Pangular can't tell a leak from that. Check retainers in the Chrome DevTools Memory panel: take a heap snapshot after a few navigations, search for the class and look for a retainer other than Angular's DI debug records. Open subscriptions after destroy are still tracked below. `),L()),e&2){let e=W(),t=W();O(),q(t.plural(e.navigations,`navigation`))}}function lN(e,t){e&1&&(I(0,`p`,6),K(1,` This page cannot track destroyed components. It needs WeakRef, FinalizationRegistry and the Angular debug API of a development build. `),L())}function uN(e,t){if(e&1&&(I(0,`span`,18),K(1),L()),e&2){let e=W().$implicit,t=W(4);O(),q(t.plural(e.subscriptions,`open subscription`))}}function dN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,15),K(4),L(),I(5,`span`,16),K(6),L(),I(7,`span`,17),K(8),L(),j(9,uN,2,1,`span`,18),L()),e&2){let e=t.$implicit,n=W(4);O(2),q(e.name),O(2),q(e.route||`/`),O(2),J(``,n.plural(e.navigations,`navigation`),` ago`),O(2),q(n.ageOf(e)),O(),M(e.subscriptions?9:-1)}}function fN(e,t){if(e&1&&(I(0,`p`,6),K(1),L(),I(2,`ul`,12),N(3,dN,10,5,`li`,13,sN),L()),e&2){let e=W(3);O(),Y(` Destroyed, yet still in memory after at least `,e.minNavigations,` navigations and `,e.minSeconds,` seconds. Take a heap snapshot, search for the class and read its retainers. `),O(2),P(e.retained().slice(0,e.shown))}}function pN(e,t){e&1&&(I(0,`p`,6),K(1,`No destroyed component is still in memory after a few navigations.`),L())}function mN(e,t){if(e&1&&(I(0,`p`,6),K(1),I(2,`span`,19),K(3),L(),K(4,`. Navigate a few times to see whether they stay. `),L()),e&2){let e=W(3);O(),J(` `,e.plural(e.recent().length,`instance`),` destroyed recently and not collected yet: `),O(2),q(e.names(e.recent()))}}function hN(e,t){if(e&1&&(j(0,lN,2,0,`p`,6),I(1,`p`,11),K(2),L(),I(3,`h3`,7),K(4,` Still retained `),I(5,`span`,8),K(6),L()(),j(7,fN,5,2)(8,pN,2,0,`p`,6),j(9,mN,5,2,`p`,6)),e&2){let e=W(),t=W();M(e.support.retention?-1:0),O(2),L_(` `,t.plural(e.navigations,`navigation`),` · `,t.retained().length,` still retained · `,t.plural(e.totals.collected,`instance`),` collected `),O(4),q(t.retained().length),O(),M(t.retained().length?7:8),O(2),M(t.recent().length?9:-1)}}function gN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Off the page but not destroyed (detached views, such as a route reuse cache): `),I(2,`span`,19),K(3),L(),K(4,`. `),L()),e&2){let e=W(2);O(3),q(e.names(e.detached()))}}function _N(e,t){if(e&1&&(I(0,`span`,8),K(1),L()),e&2){let e=W();O(),q(e.subscriptions.length)}}function vN(e,t){if(e&1&&(I(0,`span`,15),K(1),L()),e&2){let e=W().$implicit;O(),q(e.source)}}function yN(e,t){if(e&1&&(I(0,`li`,13)(1,`span`,14),K(2),L(),I(3,`span`,16),K(4),L(),I(5,`span`,18),K(6),L(),j(7,vN,2,1,`span`,15),L()),e&2){let e=t.$implicit;O(2),q(e.name),O(2),J(``,e.count,` open`),O(2),J(` `,e.reason===`instance-destroyed`?`instance destroyed`:`no instance left`,` `),O(),M(e.source?7:-1)}}function bN(e,t){if(e&1&&(I(0,`p`,6),K(1,` Still open although the component that made them is gone. Tear them down with takeUntilDestroyed(), DestroyRef.onDestroy or the async pipe. `),L(),I(2,`ul`,12),N(3,yN,8,4,`li`,13,gg),L()),e&2){let e=W(2),t=W();O(3),P(e.subscriptions.slice(0,t.shown))}}function xN(e,t){e&1&&(I(0,`p`,6),K(1,`No subscription is still open after its component went away.`),L())}function SN(e,t){e&1&&(I(0,`p`,6),K(1,` Subscriptions are tied to component classes only; Angular 20 profiler hooks tie them to instances. `),L())}function CN(e,t){if(e&1&&(j(0,bN,5,0)(1,xN,2,0,`p`,6),j(2,SN,2,0,`p`,6)),e&2){let e=W();M(+!e.subscriptions.length),O(2),M(e.support.instances?-1:2)}}function wN(e,t){e&1&&(I(0,`p`,9),K(1,` Tracking could not start: the page has no RxJS the overlay can load. `),L())}function TN(e,t){e&1&&(I(0,`p`,6),K(1,` Off. Track subscriptions wraps Observable.prototype.subscribe on the page to record which component makes each subscription, until you stop it. Subscriptions made before you start are not seen, so reload or navigate again after starting. `),L())}function EN(e,t){e&1&&R(0,`app-angular-unavailable`,10),e&2&&F(`page`,W(2).angular())}function DN(e,t){if(e&1&&(I(0,`span`,16),K(1),L()),e&2){let e=W().$implicit,t=W(3);O(),q(t.plural(e.subscriptions,`subscription`))}}function ON(e,t){if(e&1){let e=V();I(0,`li`)(1,`button`,20),H(`click`,function(){let t=w(e).$implicit;return T(W(3).showComponent.emit(t.id))})(`focus`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`blur`,function(){return w(e),T(W(3).highlight.emit(null))})(`mouseenter`,function(){let t=w(e).$implicit;return T(W(3).highlight.emit(t.id))})(`mouseleave`,function(){return w(e),T(W(3).highlight.emit(null))}),I(2,`span`,14),K(3),L(),I(4,`span`,16),K(5),L(),j(6,DN,2,1,`span`,16),L()()}if(e&2){let e=t.$implicit,n=W(2),r=W();O(3),q(e.name),O(2),q(r.effectsText(e)),O(),M(n.support.subscriptions===`on`?6:-1)}}function kN(e,t){e&1&&(I(0,`p`,6),K(1,` Angular files a component's effects under the template its host sits in, so effects of components side by side in one template show as shared. `),L())}function AN(e,t){if(e&1&&(I(0,`ul`,12),N(1,ON,7,3,`li`,null,sN),L(),j(3,kN,2,0,`p`,6)),e&2){let e=W(),t=W();O(),P(e.components.slice(0,t.shown)),O(2),M(e.components.some(t.hasShared)?3:-1)}}function jN(e,t){e&1&&(I(0,`p`,6),K(1,`No component on the page has a live effect or a tracked subscription.`),L())}function MN(e,t){if(e&1&&(j(0,cN,6,1)(1,hN,10,7),j(2,gN,5,1,`p`,6),I(3,`h3`,7),K(4,` Open subscriptions after destroy `),j(5,_N,2,1,`span`,8),L(),j(6,CN,3,2)(7,wN,2,0,`p`,9)(8,TN,2,0,`p`,6),I(9,`h3`,7),K(10,` Live effects and subscriptions `),I(11,`span`,8),K(12),L()(),j(13,EN,1,1,`app-angular-unavailable`,10),j(14,AN,4,1)(15,jN,2,0,`p`,6)),e&2){let e,n=t,r=W();M(n.support.retention===`dev-di-debug`?0:1),O(2),M(r.detached().length?2:-1),O(3),M(n.support.subscriptions===`on`?5:-1),O(),M((e=n.support.subscriptions)===`on`?6:e===`unavailable`?7:8),O(6),q(n.components.length),O(),M(n.support.effects?-1:13),O(),M(n.components.length?14:15)}}function NN(e,t){e&1&&(I(0,`p`,6),K(1,`No leak data from this page yet. It comes with the next report.`),L())}var PN=20;function FN(e){let t=Math.max(0,Math.round(e/1e3));if(t<120)return`${t} s`;let n=Math.round(t/60);return n<120?`${n} min`:`${Math.round(n/60)} h`}var IN=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,LN=class e{report=$(null);pageId=$(null);rpc=$(null);angular=$(null);now=$(()=>Date.now());showComponent=vv();highlight=vv();shown=PN;minNavigations=2;minSeconds=aT/1e3;plural=IN;busy=D(!1);announcement=D(``);tracking=X(()=>this.report()?.support.subscriptions===`on`);split=X(()=>{let e=this.report(),t=[],n=[],r=[];if(!e)return{retained:t,recent:n,detached:r};let i=e.support.retention===`dev-di-debug`;for(let a of e.destroyed)if(a.detached)r.push(a);else if(i)continue;else this.isRetained(e,a)?t.push(a):n.push(a);return{retained:t,recent:n,detached:r}});retained=X(()=>this.split().retained);recent=X(()=>this.split().recent);detached=X(()=>this.split().detached);ageMs(e,t){return Math.max(0,this.now()()-e.reportedAt+(e.at-t.destroyedAt))}isRetained(e,t){return t.navigations>=2&&this.ageMs(e,t)>=1e4}ageOf(e){let t=this.report();return t?`${FN(this.ageMs(t,e))} old`:``}names(e){let t=[...new Set(e.map(e=>e.name))];return t.length>6?`${t.slice(0,6).join(`, `)} and more`:t.join(`, `)}hasShared(e){return!!e.sharedEffects}effectsText(e){let t=IN(e.effects,`effect`);return e.sharedEffects?`${t}, ${e.sharedEffects} shared`:t}async toggle(){let e=this.pageId();if(!e||this.busy())return;let t=!this.tracking();this.busy.set(!0);try{await $T(this.rpc(),`request-leak-tracking`,{pageId:e,on:t}),this.announcement.set(t?`Tracking subscriptions. Reload or navigate to see subscriptions made at start.`:`Stopped tracking subscriptions.`)}catch{this.announcement.set(`Could not reach the page. Try again.`)}finally{this.busy.set(!1)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=k({type:e,selectors:[[`app-leaks-section`]],inputs:{report:[1,`report`],pageId:[1,`pageId`],rpc:[1,`rpc`],angular:[1,`angular`],now:[1,`now`]},outputs:{showComponent:`showComponent`,highlight:`highlight`},decls:12,vars:5,consts:[[`aria-labelledby`,`ct-leaks-title`,1,`leaks`],[1,`head`],[`id`,`ct-leaks-title`],[`type`,`button`,1,`track`,3,`click`,`disabled`],[`role`,`status`,1,`sr-only`],[1,`hint`],[1,`note`],[1,`sub`],[1,`pill`],[`role`,`status`,1,`note`],[`capability`,`signalGraph`,`missing`,``,`compact`,``,3,`page`],[1,`stats`],[1,`rows`],[1,`row`],[1,`name`,`mono`],[1,`meta`,`mono`],[1,`count`],[1,`meta`],[1,`flag`,`warn`],[1,`mono`],[`type`,`button`,1,`row`,`live`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`]],template:function(e,t){if(e&1&&(I(0,`section`,0)(1,`div`,1)(2,`h2`,2),K(3,`Leaks`),L(),I(4,`button`,3),H(`click`,function(){return t.toggle()}),K(5,` Track subscriptions `),L(),I(6,`p`,4),K(7),L()(),I(8,`p`,5),K(9,` Components that left the page but are still in memory, and the live effects and RxJS subscriptions of each component. The browser collects garbage when it decides, so a retained instance is a hint: check what holds it in the Chrome DevTools Memory panel. `),L(),j(10,MN,16,7)(11,NN,2,0,`p`,6),L()),e&2){let e;O(4),F(`disabled`,!t.pageId()||!t.report()),A(`aria-pressed`,t.tracking())(`aria-disabled`,t.busy()||null),O(3),q(t.announcement()),O(3),M((e=t.report())?10:11,e)}},dependencies:[ND],styles:[`[_nghost-%COMP%] { display: block; } @@ -2556,7 +2556,7 @@ h2[_ngcontent-%COMP%] { border-color: color-mix(in srgb, var(--%NS%warn) 30%, transparent); background: color-mix(in srgb, var(--%NS%warn) 12%, transparent); color: var(--%NS%warn-text); -}`]})},BN=12,VN=900;function HN(e){for(let t=e.parentElement;t;t=t.parentElement){let e=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(e.overflowY))return t}return null}var UN=class{options;injector=C(Os);visibleTop=D(0);viewport=D(VN);rowHeight;host=null;scroller=null;detach=null;enabled;range;padTop;padBottom;constructor(e){this.options=e,this.rowHeight=D(e.estimate);let t=e.min??300;this.enabled=X(()=>e.count()>t),this.range=X(()=>{let t=e.count();if(!this.enabled())return{start:0,end:t};let n=this.rowHeight(),r=this.viewport(),i=Math.max(0,Math.min(this.visibleTop(),t*n-r)),a=Math.max(0,Math.min(t-1,Math.floor(i/n)-BN));return{start:a,end:Math.min(t,Math.max(a,Math.ceil((i+r)/n)+BN))}}),this.padTop=X(()=>this.enabled()?this.range().start*this.rowHeight():0),this.padBottom=X(()=>this.enabled()?(e.count()-this.range().end)*this.rowHeight():0),_c(()=>{e.count(),ud(()=>this.update(),{injector:this.injector})}),C(As).onDestroy(()=>this.detach?.())}get count(){return this.options.count()}rendered(e){let{start:t,end:n}=this.range();return e>=t&&ethis.update();n.addEventListener(`scroll`,r,{passive:!0}),window.addEventListener(`resize`,r),this.detach=()=>{n.removeEventListener(`scroll`,r),window.removeEventListener(`resize`,r)},this.update()}update(){let e=this.host;if(e){if(this.scroller===e)this.place(e.scrollTop,e.clientHeight);else{let t=this.scroller?this.scroller.getBoundingClientRect().top:0,n=this.scroller?this.scroller.clientHeight:window.innerHeight;this.place(t-e.getBoundingClientRect().top,n)}this.options.fixed||this.measure()}}place(e,t){this.visibleTop.set(e),this.viewport.set(t>0?t:VN)}measure(){let e=this.host?.querySelectorAll(`[data-vindex]`);if(!e||e.length<2)return;let t=e[0].getBoundingClientRect(),n=(e[e.length-1].getBoundingClientRect().bottom-t.top)/e.length;n>4&&Math.abs(n-this.rowHeight())>1&&this.rowHeight.set(n)}reveal(e,t){if(this.enabled()&&!this.rendered(e)){let t=e*this.rowHeight(),n=this.viewport(),r=Math.max(0,t-n/2);if(this.place(r,n),this.host&&this.scroller===this.host)this.host.scrollTop=r;else if(this.host){let e=this.scroller?this.scroller.getBoundingClientRect().top:0,t=this.host.getBoundingClientRect().top-e+r;this.scroller?this.scroller.scrollTop+=t:window.scrollBy(0,t)}}t&&ud(t,{injector:this.injector})}};function WN(e){let t=e.ownerDocument.defaultView;if(!t)return null;for(let n=e.parentElement;n&&n!==e.ownerDocument.documentElement&&n!==e.ownerDocument.body;n=n.parentElement)if(/(auto|scroll|overlay)/.test(t.getComputedStyle(n).overflowY))return n;return null}var GN=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:0};function KN(e,t=8){let n=e.ownerDocument.defaultView;if(!n)return e.offsetHeight+t;let r=WN(e),i=r?n.getComputedStyle(r):null,a=i?GN(i.paddingTop):0,o=i?GN(i.scrollPaddingTop):0,s=GN(n.getComputedStyle(e).top);return Math.max(0,Math.ceil(a+s+e.offsetHeight+t-o))}function qN(e,t,n=8){let r=WN(e),i=t.getBoundingClientRect().bottom+n-e.getBoundingClientRect().top;i<=0||(r?r.scrollTop-=i:e.ownerDocument.defaultView?.scrollBy(0,-i))}var JN=[`filterInput`],YN=[`treeEl`],XN=[`propFilterInput`],ZN=()=>[],QN=e=>({kind:`component`,id:e}),$N=(e,t)=>t.row.node.id,eP=(e,t)=>t.outlet+t.route,tP=(e,t)=>t+e;function nP(e,t){return this.sourceKey(t)}var rP=(e,t)=>t.formId,iP=(e,t)=>t.name+t.index,aP=(e,t)=>t.name,oP=(e,t)=>t.token+e;function sP(e,t){if(e&1){let e=V();I(0,`span`,40),K(1,`Page`),L(),I(2,`app-select`,41),H(`valueChange`,function(t){return w(e),T(W(2).selectPage(t))}),L()}if(e&2){let e=W(2);O(2),F(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function cP(e,t){if(e&1){let e=V();I(0,`button`,42),H(`click`,function(){return w(e),T(W(2).toggleDirectiveHosts())}),E(),I(1,`svg`,15),R(2,`path`,43)(3,`path`,44),L(),bs(),I(4,`span`,18),K(5,`Directive hosts`),L()()}e&2&&A(`aria-pressed`,W(2).showDirectiveHosts())}function lP(e,t){if(e&1){let e=V();I(0,`button`,45),H(`click`,function(){w(e);let t=W(2);return T(t.picking()?t.cancelPick():t.pick())}),E(),I(1,`svg`,15),R(2,`path`,46),L(),bs(),I(3,`span`,18),K(4),L()()}if(e&2){let e=W(2);G(`on`,e.picking()),A(`title`,e.pickLabel()),O(4),q(e.pickLabel())}}function uP(e,t){if(e&1&&(I(0,`p`,24),K(1),L()),e&2){let e=W(2);O(),q(e.pickMessage())}}function dP(e,t){if(e&1&&(I(0,`p`,25),K(1),L()),e&2){let e=W(2);O(),q(e.truncationText())}}function fP(e,t){e&1&&(I(0,`p`,48),K(1,`The filter only searches the components the tree lists.`),L())}function pP(e,t){e&1&&(I(0,`p`,48),K(1,`Directive hosts are hidden, so they are not searched.`),L())}function mP(e,t){if(e&1){let e=V();I(0,`div`,29)(1,`p`,47),K(2),L(),j(3,fP,2,0,`p`,48),j(4,pP,2,0,`p`,48),I(5,`button`,49),H(`click`,function(){return w(e),T(W(2).clearFilter())}),K(6,`Clear filters`),L()()}if(e&2){let e=W(2);O(2),J(`No components match “`,e.filter().trim(),`”`),O(),M(e.page().truncated?3:-1),O(),M(!e.showDirectiveHosts()&&e.page().directiveHostCount?4:-1)}}function hP(e,t){if(e&1&&(I(0,`p`,30),K(1),L()),e&2){let e=W(2);O(),J(` `,e.rows().length,` rows. Rows render as you scroll, so the browser's find only sees the ones near view; the filter above searches them all. `)}}function gP(e,t){if(e&1){let e=V();I(0,`span`,57),H(`click`,function(t){w(e),W();let n=J_(0);return T(W(2).toggle(n.node.id,t))}),E(),I(1,`svg`,58),R(2,`path`,59),L()()}e&2&&(W(),G(`open`,J_(0).expanded))}function _P(e,t){e&1&&R(0,`span`,52)}function vP(e,t){if(e&1&&(I(0,`span`,60),K(1),L(),I(2,`span`,61),K(3),L(),I(4,`span`,28),K(5,`directive host`),L()),e&2){W();let e=J_(0),t=W(2);O(),J(`<`,e.node.tag,`>`),O(),A(`title`,e.node.directives?.join(`, `)),O(),q(t.hostLabel(e.node))}}function yP(e,t){if(e&1&&(I(0,`span`,62),K(1),L(),I(2,`span`,63),K(3),L()),e&2){W();let e=J_(0);A(`title`,e.node.name),O(),q(e.node.name),O(),A(`title`,`<`+e.node.tag+`>`),O(),J(`<`,e.node.tag,`>`)}}function bP(e,t){if(e&1&&(I(0,`span`)(1,`span`,28),K(2,`Hydration: `),L(),K(3),L()),e&2){let e=t,n=W(3);b_(`hyd hyd-`+e),O(3),q(n.hydrationText(e))}}function xP(e,t){if(e&1&&(I(0,`span`,54),K(1),L()),e&2){let e=t.$implicit;O(),q(e.route||`/`)}}function SP(e,t){if(e&1&&(I(0,`span`,55),K(1),I(2,`span`,28),K(3),L()()),e&2){let e=t;O(),J(` `,e),O(2),J(` `,e===1?`check`:`checks`,` while recording`)}}function CP(e,t){if(e&1&&(I(0,`span`,56),K(1),I(2,`span`,28),K(3),L()()),e&2){W();let e=J_(0);A(`title`,e.node.directives.join(`, `)),O(),J(` +`,e.node.directives.length,` `),O(2),J(` `,e.node.directives.length===1?`directive`:`directives`,` `)}}function wP(e,t){if(e&1){let e=V();K_(0),I(1,`div`,50),H(`click`,function(){w(e);let t=J_(0);return T(W(2).select(t.node.id))})(`focus`,function(t){w(e);let n=J_(0),r=W(2);return r.focusId.set(n.node.id),r.highlight(n.node.id),T(r.showNameTip(t))})(`blur`,function(){w(e);let t=W(2);return t.highlight(null),T(t.nameTip.set(null))})(`keydown.escape`,function(){return w(e),T(W(2).nameTip.set(null))})(`mouseenter`,function(){w(e);let t=J_(0);return T(W(2).highlight(t.node.id))})(`mouseleave`,function(){return w(e),T(W(2).highlight(null))}),j(2,gP,3,2,`span`,51)(3,_P,1,0,`span`,52),j(4,vP,6,3)(5,yP,4,4),j(6,bP,4,3,`span`,53),N(7,xP,2,1,`span`,54,eP),j(9,SP,4,2,`span`,55),j(10,CP,4,3,`span`,56),L()}if(e&2){let e,n,r=t.$implicit,i=W(2),a=q_(r.row);O(),y_(`--%NS%depth`,a.depth),G(`selected`,i.selectedId()===a.node.id)(`dir-host`,a.node.kind===`directive`),A(`aria-level`,a.depth+1)(`aria-setsize`,a.setsize)(`aria-posinset`,a.posinset)(`aria-expanded`,a.hasChildren?a.expanded:null)(`aria-selected`,i.selectedId()===a.node.id)(`tabindex`,i.tabStop()===a.node.id?0:-1)(`data-vindex`,r.index)(`data-id`,a.node.id),O(),M(a.hasChildren?2:3),O(2),M(a.node.kind===`directive`?4:5),O(2),M((e=a.node.hydration)?6:-1,e),O(),P(i.routedById().get(a.node.id)??rv(20,ZN)),O(2),M((n=i.cdHosts()[a.node.id])?9:-1,n),O(),M(a.node.kind!==`directive`&&a.node.directives?.length?10:-1)}}function TP(e,t){if(e&1&&(I(0,`div`,64),K(1),L()),e&2){let e=t;y_(`top`,e.top,`px`),O(),J(` `,e.text,` `)}}function EP(e,t){if(e&1&&(I(0,`li`,72),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function DP(e,t){if(e&1){let e=V();I(0,`div`,74)(1,`button`,49),H(`click`,function(){let t=w(e);return T(W(3).reveal(t.id,!0))}),K(2),L()()}e&2&&(O(2),J(` Show `,t.name,` `))}function OP(e,t){if(e&1&&(I(0,`section`,34)(1,`header`,65)(2,`span`,66),K(3,`directive host`),L(),I(4,`h2`,67),K(5),L(),I(6,`span`,68),K(7),L()(),I(8,`div`,69)(9,`h3`),K(10,` Directives `),I(11,`span`,70),K(12),L()(),I(13,`ul`,71),N(14,EP,2,1,`li`,72,tP),L()(),I(16,`div`,69)(17,`p`,73),K(18,` This element hosts directives but no component. Their inputs are bound in the template of the component that renders it. `),L(),j(19,DP,3,1,`div`,74),L()()),e&2){let e,n=t,r=W(2);O(5),J(`<`,n.tag,`>`),O(2),q(r.hostLabel(n)),O(5),q(n.directives?.length??0),O(2),P(n.directives??rv(4,ZN)),O(5),M((e=r.ownerOf(n.id))?19:-1,e)}}function kP(e,t){if(e&1&&(I(0,`p`,75),R(1,`app-source-link`,79),L()),e&2){let e=t;O(),F(`file`,e.file)(`line`,e.line)}}function AP(e,t){if(e&1&&(I(0,`p`,80)(1,`span`,82),K(2,`Likely`),L(),I(3,`span`,28),K(4,`, matched by class name: `),L(),R(5,`app-source-link`,79),L()),e&2){W();let e=J_(0);F(`title`,W(3).guessTitle),O(5),F(`file`,e[0].file)(`line`,e[0].line)}}function jP(e,t){if(e&1&&(I(0,`li`),R(1,`app-source-link`,79),L()),e&2){let e=t.$implicit;O(),F(`file`,e.file)(`line`,e.line)}}function MP(e,t){if(e&1&&(I(0,`div`,81)(1,`p`,83)(2,`span`,82),K(3,`Not certain`),L(),K(4),L(),I(5,`ul`,84),N(6,jP,2,2,`li`,null,nP,!0),L()()),e&2){W();let e=J_(0),t=W(),n=W(2);F(`title`,n.guessTitle),O(4),Y(` `,e.length,` source files define `,n.bareName(t.name),`: `),O(2),P(e)}}function NP(e,t){if(e&1&&(K_(0),j(1,AP,6,3,`p`,80)(2,MP,8,3,`div`,81)),e&2){let e=W(),t=q_(W(2).sourceCandidates(e));O(),M(t.length===1?1:t.length>1?2:-1)}}function PP(e,t){if(e&1){let e=V();I(0,`div`,85)(1,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).revealInElements(t))}),K(2,`Reveal in Elements`),L(),I(3,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).openSource(t))}),K(4,`Open source`),L()(),I(5,`p`,86),K(6),L()}if(e&2){let e=W(3);O(6),q(e.actionMessage())}}function FP(e,t){if(e&1){let e=V();I(0,`button`,88),H(`click`,function(){let t=w(e).$implicit;return T(W(5).showForm.emit(t.formId))}),K(1),L()}if(e&2){let e=t.$implicit;O(),J(` Show `,e.label,` in Forms `)}}function IP(e,t){if(e&1&&(I(0,`div`,76),N(1,FP,2,1,`button`,87,rP),L()),e&2){let e=W(),t=W(3);O(),P(t.formsIn(e.file))}}function LP(e,t){e&1&&j(0,IP,3,0,`div`,76),e&2&&M(W(3).formsIn(t.file).length?0:-1)}function RP(e,t){if(e&1){let e=V();I(0,`div`,76)(1,`button`,49),H(`click`,function(){w(e);let t=W();return T(W(2).openInjector(t))}),K(2,` Show in Injectors `),I(3,`span`,28),K(4),L()()()}if(e&2){let e=W();O(4),J(`: `,e.name)}}function zP(e,t){if(e&1&&R(0,`app-store-global`,77),e&2){let e=W(),t=W(2);F(`rpc`,t.rpc())(`pageId`,t.page()?.pageId)(`target`,iv(4,QN,e.id))(`label`,e.name)}}function BP(e,t){if(e&1&&(I(0,`dt`),K(1,`Routed`),L(),I(2,`dd`,90),K(3),L()),e&2){let e=t.$implicit;O(3),Y(``,e.route||`/`,` in outlet `,e.outlet)}}function VP(e,t){if(e&1&&(I(0,`span`,11),K(1),L()),e&2){let e=W(4);O(),Y(``,e.shownValues()?.count??0,` of `,e.valueTotal())}}function HP(e,t){if(e&1){let e=V();I(0,`div`,94)(1,`p`,47),K(2),L(),I(3,`p`,48),K(4,` The filter searches names, and the nested keys of values you opened. `),L(),I(5,`button`,49),H(`click`,function(){return w(e),T(W(5).clearPropFilter())}),K(6,`Clear filters`),L()()}if(e&2){let e=W(5);O(2),J(` No inputs, outputs or properties match “`,e.propFilter().trim(),`” `)}}function UP(e,t){if(e&1&&(I(0,`span`,98),K(1),L()),e&2){let e=W().$implicit;O(),J(`(`,e.prop,`)`)}}function WP(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),j(3,UP,2,1,`span`,98),L(),R(4,`app-value-tree`,99),L()),e&2){let e=t.$implicit,n=W(4),r=W(3);O(2),J(` `,e.name,` `),O(),M(e.prop===e.name?-1:3),O(),F(`prop`,e)(`store`,r.values)(`query`,r.propFilter())(`componentId`,n.id)(`pageId`,r.page()?.pageId??null)(`rpc`,r.rpc())(`writes`,r.canEdit())}}function GP(e,t){if(e&1&&(I(0,`ul`,95),N(1,WP,5,9,`li`,96,aP),L()),e&2){let e=W(2);O(),P(e.inputs)}}function KP(e,t){e&1&&(I(0,`p`,73),K(1,`No inputs.`),L())}function qP(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Inputs `),I(3,`span`,70),K(4),L()(),j(5,GP,3,0,`ul`,95)(6,KP,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.inputs.length),O(),M(e.inputs.length?5:6)}}function JP(e,t){if(e&1&&(I(0,`li`,101)(1,`span`,90),K(2),L(),I(3,`span`,102),K(4),L()()),e&2){let e=t.$implicit;G(`on`,e.listened),O(2),q(e.name),O(2),q(e.listened?`listened`:`no listener`)}}function YP(e,t){if(e&1&&(I(0,`ul`,71),N(1,JP,5,4,`li`,100,aP),L()),e&2){let e=W(2);O(),P(e.outputs)}}function XP(e,t){e&1&&(I(0,`p`,73),K(1,`No outputs.`),L())}function ZP(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Outputs `),I(3,`span`,70),K(4),L()(),j(5,YP,3,0,`ul`,71)(6,XP,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.outputs.length),O(),M(e.outputs.length?5:6)}}function QP(e,t){if(e&1&&(I(0,`span`,103),K(1),L()),e&2){let e=W().$implicit;O(),q(e.kind)}}function $P(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),j(3,QP,2,1,`span`,103),L(),R(4,`app-value-tree`,99),L()),e&2){let e=t.$implicit,n=W(4),r=W(3);O(2),J(` `,e.name,` `),O(),M(e.kind?3:-1),O(),F(`prop`,e)(`store`,r.values)(`query`,r.propFilter())(`componentId`,n.id)(`pageId`,r.page()?.pageId??null)(`rpc`,r.rpc())(`writes`,r.canEdit())}}function eF(e,t){if(e&1&&(I(0,`ul`,95),N(1,$P,5,9,`li`,96,aP),L()),e&2){let e=W(2);O(),P(e.properties)}}function tF(e,t){e&1&&(I(0,`p`,73),K(1,`No other properties.`),L())}function nF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` Properties `),I(3,`span`,70),K(4),L()(),j(5,eF,3,0,`ul`,95)(6,tF,2,0,`p`,73),L()),e&2){let e=W();O(4),q(e.properties.length),O(),M(e.properties.length?5:6)}}function rF(e,t){if(e&1&&(I(0,`li`,72),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function iF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`),K(2,` DOM listeners `),I(3,`span`,70),K(4),L()(),I(5,`ul`,71),N(6,rF,2,1,`li`,72,_g),L()()),e&2){let e=W(2);O(4),q(e.listeners.length),O(2),P(e.listeners)}}function aF(e,t){if(e&1&&(I(0,`li`,96)(1,`span`,97),K(2),L(),R(3,`app-value-tree`,104),L()),e&2){let e=t.$implicit,n=W(2).$implicit,r=W(2),i=W(3);O(2),q(e.name),O(),F(`prop`,e)(`store`,i.values)(`query`,i.propFilter())(`directive`,n.index)(`componentId`,r.id)(`pageId`,i.page()?.pageId??null)(`rpc`,i.rpc())}}function oF(e,t){if(e&1&&(I(0,`ul`,95),N(1,aF,4,8,`li`,96,aP),L()),e&2){let e=W().$implicit;O(),P(e.inputs)}}function sF(e,t){if(e&1&&(I(0,`li`,101)(1,`span`,90),K(2),L(),I(3,`span`,102),K(4),L()()),e&2){let e=t.$implicit;G(`on`,e.listened),O(2),q(e.name),O(2),q(e.listened?`listened`:`no listener`)}}function cF(e,t){if(e&1&&(I(0,`ul`,71),N(1,sF,5,4,`li`,100,aP),L()),e&2){let e=W().$implicit;O(),P(e.outputs)}}function lF(e,t){e&1&&(I(0,`p`,73),K(1,`No inputs or outputs.`),L())}function uF(e,t){if(e&1&&(I(0,`div`,69)(1,`h3`)(2,`span`,90),K(3),L(),I(4,`span`,103),K(5,`directive on host`),L()(),j(6,oF,3,0,`ul`,95),j(7,cF,3,0,`ul`,71),j(8,lF,2,0,`p`,73),L()),e&2){let e=t.$implicit;O(3),q(e.name),O(3),M(e.inputs.length?6:-1),O(),M(e.outputs.length?7:-1),O(),M(!e.inputs.length&&!e.outputs.length?8:-1)}}function dF(e,t){if(e&1&&(j(0,HP,7,1,`div`,94),j(1,qP,7,2,`div`,69),j(2,ZP,7,2,`div`,69),j(3,nF,7,2,`div`,69),j(4,iF,8,1,`div`,69),N(5,uF,9,4,`div`,69,iP)),e&2){let e=t,n=W(),r=W(3);M(r.propQuery()&&!e.count?0:-1),O(),M(!r.propQuery()||e.inputs.length?1:-1),O(),M(!r.propQuery()||e.outputs.length?2:-1),O(),M(!r.propQuery()||e.properties.length?3:-1),O(),M(!r.propQuery()&&n.listeners.length?4:-1),O(),P(e.directives)}}function fF(e,t){if(e&1&&(I(0,`span`,103),K(1),L()),e&2){let e=t.$implicit;O(),q(e)}}function pF(e,t){if(e&1&&(I(0,`span`,107),K(1,`from `),I(2,`span`,90),K(3),L()()),e&2){let e=W().$implicit;O(3),q(e.providedByName??`an injector`)}}function mF(e,t){e&1&&(I(0,`span`,108),K(1,`not provided`),L())}function hF(e,t){if(e&1&&(I(0,`li`,105)(1,`span`,106),K(2),L(),N(3,fF,2,1,`span`,103,_g),j(5,pF,4,1,`span`,107)(6,mF,2,0,`span`,108),L()),e&2){let e=t.$implicit;O(2),q(e.token),O(),P(e.flags),O(2),M(e.providedBy?5:6)}}function gF(e,t){if(e&1&&(I(0,`ul`,93),N(1,hF,7,2,`li`,105,oP),L()),e&2){let e=W();O(),P(e.dependencies)}}function _F(e,t){e&1&&(I(0,`p`,73),K(1,`Nothing is injected through the constructor or inject().`),L())}function vF(e,t){if(e&1){let e=V();I(0,`dl`,89)(1,`dt`),K(2,`Change detection`),L(),I(3,`dd`),K(4),L(),I(5,`dt`),K(6,`Encapsulation`),L(),I(7,`dd`),K(8),L(),I(9,`dt`),K(10,`Host path`),L(),I(11,`dd`,90),K(12),L(),N(13,BP,4,2,null,null,eP),L(),I(15,`div`,91)(16,`div`,5),E(),I(17,`svg`,6),R(18,`circle`,7)(19,`path`,8),L(),bs(),I(20,`input`,92,2),H(`input`,function(t){return w(e),T(W(3).propFilter.set(t.target.value))})(`keydown.escape`,function(t){return w(e),T(W(3).clearPropFilter(t))}),L()(),j(22,VP,2,2,`span`,11),I(23,`p`,23),K(24),L()(),j(25,dF,7,5),I(26,`div`,69)(27,`h3`),K(28,` Injected `),I(29,`span`,70),K(30),L()(),j(31,gF,3,0,`ul`,93)(32,_F,2,0,`p`,73),L()}if(e&2){let e,n=t,r=W(),i=W(2);O(4),q(n.changeDetection??`Unknown`),O(4),q(n.encapsulation??`Unknown`),O(4),q(n.path),O(),P(i.routedById().get(r.id)??rv(9,ZN)),O(7),F(`value`,i.propFilter()),O(2),M(i.propQuery()?22:-1),O(2),q(i.propFilterStatus()),O(),M((e=i.shownValues())?25:-1,e),O(5),q(n.dependencies.length),O(),M(n.dependencies.length?31:32)}}function yF(e,t){e&1&&(I(0,`div`,78),R(1,`span`,109),I(2,`p`,48),K(3,`Reading live values from the page…`),L()())}function bF(e,t){if(e&1&&(I(0,`section`,34)(1,`header`,65)(2,`span`,66),K(3,`component`),L(),I(4,`h2`,67),K(5),L(),I(6,`span`,68),K(7),L(),j(8,kP,2,2,`p`,75)(9,NP,3,2),j(10,PP,7,1),j(11,LP,1,1),j(12,RP,5,1,`div`,76),j(13,zP,1,6,`app-store-global`,77),L(),j(14,vF,33,10)(15,yF,4,0,`div`,78),L()),e&2){let e,n,r,i=t,a=W(2);O(5),q(i.name),O(2),J(`<`,i.tag,`>`),O(),M((e=a.detail()?.source)?8:9,e),O(2),M(a.devtoolsActions()?10:-1),O(),M((n=a.sourceFor(i))?11:-1,n),O(),M(a.canShowInjector()&&!a.staticReport()?12:-1),O(),M(!a.staticReport()&&!a.native()?13:-1),O(),M((r=a.detail())?14:15,r)}}function xF(e,t){e&1&&(I(0,`p`,47),K(1,`The selected component was destroyed`),L(),I(2,`p`,48)(3,`span`,90),K(4),L(),K(5,` is no longer on the page. Select another component to see its live values. `),L()),e&2&&(O(4),q(t))}function SF(e,t){e&1&&(I(0,`p`,48),K(1,` Select a component to see its live inputs, properties, outputs, change detection and injected services. `),L())}function CF(e,t){if(e&1&&(I(0,`div`,35),j(1,xF,6,1)(2,SF,2,0,`p`,48),L()),e&2){let e,t=W(2);O(),M((e=t.destroyed())?1:2,e)}}function wF(e,t){e&1&&R(0,`app-angular-unavailable`,37),e&2&&F(`page`,W(2).angularPage())}function TF(e,t){if(e&1){let e=V();I(0,`app-hydration-section`,110),H(`overlay`,function(t){return w(e),T(W(2).setHydrationOverlay(t))})(`showNode`,function(t){return w(e),T(W(2).revealNode(t))})(`highlight`,function(t){return w(e),T(W(2).highlight(t))}),L()}e&2&&F(`report`,W(2).page()?.hydration)}function EF(e,t){if(e&1){let e=V();I(0,`app-cd-recording`,111),H(`showComponent`,function(t){return w(e),T(W(2).showCdComponent(t))}),L(),I(1,`app-leaks-section`,112),H(`showComponent`,function(t){return w(e),T(W(2).showLeakComponent(t))})(`highlight`,function(t){return w(e),T(W(2).highlight(t))}),L()}if(e&2){let e=W(2);F(`page`,e.cdPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`native`,e.native()),O(),F(`report`,e.leaksPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())(`angular`,e.angularPage())}}function DF(e,t){if(e&1){let e=V();I(0,`p`,3),K(1,` Every component instance on the page, in the order Angular rendered them. Hover a row to highlight its host in the page, and select it to read its live inputs, properties, outputs and injected services. `),L(),I(2,`div`,4)(3,`div`,5),E(),I(4,`svg`,6),R(5,`circle`,7)(6,`path`,8),L(),bs(),I(7,`input`,9,0),H(`input`,function(t){return w(e),T(W().setFilter(t.target.value))})(`keydown.escape`,function(){return w(e),T(W().setFilter(``))}),L(),I(9,`span`,10),K(10,` Type plain text, a tag such as