diff --git a/app/src/__tests__/config-pending.test.ts b/app/src/__tests__/config-pending.test.ts new file mode 100644 index 0000000..e82d264 --- /dev/null +++ b/app/src/__tests__/config-pending.test.ts @@ -0,0 +1,99 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { Dashboard } from '../pages/dashboard'; + +const connection = vi.hoisted(() => ({ + resolve: (_client: unknown) => {}, +})); + +vi.mock('devframe/client', () => ({ + connectDevframe: () => + new Promise((resolve) => { + connection.resolve = resolve; + }), +})); + +const { App } = await import('../app'); + +function fakeClient(configs: object = {}): DevframeRpcClient { + const rpc = { + call: () => new Promise(() => {}), + callEvent: () => Promise.resolve(), + sharedState: () => Promise.resolve({ value: () => null, on: () => () => {} }), + }; + return { + connectionMeta: { configs }, + scope: () => ({ rpc }), + events: { on: () => () => {} }, + } as unknown as DevframeRpcClient; +} + +const signalsOff = { 'ng-devtools': { inspectors: { signals: false } } }; + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +function host(fixture: ComponentFixture): HTMLElement { + return fixture.nativeElement as HTMLElement; +} + +afterEach(() => { + document.body.innerHTML = ''; + location.hash = ''; +}); + +describe('Dashboard before the connection is up', () => { + it('shows a loading configuration block and no stat cards', async () => { + const fixture = TestBed.createComponent(Dashboard); + await settle(fixture); + const config = host(fixture).querySelector('section.config')!; + expect(config.getAttribute('aria-busy')).toBe('true'); + expect(config.textContent).toContain('Loading'); + expect(config.textContent).not.toContain('Defaults'); + expect(host(fixture).querySelectorAll('button.stat')).toHaveLength(0); + }); + + it('shows the stat cards and configuration once connected', async () => { + const fixture = TestBed.createComponent(Dashboard); + fixture.componentRef.setInput('rpc', fakeClient(signalsOff)); + await settle(fixture); + const config = host(fixture).querySelector('section.config')!; + expect(config.getAttribute('aria-busy')).not.toBe('true'); + expect(config.textContent).toContain('Inspectors off'); + const labels = [...host(fixture).querySelectorAll('button.stat .label')].map((el) => + el.textContent?.trim(), + ); + expect(labels).toContain('Components'); + expect(labels).not.toContain('Signals'); + }); +}); + +describe('App tabs before the connection is up', () => { + function tabNames(fixture: ComponentFixture) { + return [...host(fixture).querySelectorAll('nav button')].map((b) => b.textContent?.trim()); + } + + it('lists only the Dashboard until the config arrives, then the enabled inspectors', async () => { + const fixture = TestBed.createComponent(App); + await settle(fixture); + expect(tabNames(fixture)).toEqual(['Dashboard']); + + connection.resolve(fakeClient(signalsOff)); + await settle(fixture); + const names = tabNames(fixture); + expect(names).toContain('Components'); + expect(names).not.toContain('Signals'); + }); + + it('keeps a tab restored from the address visible while connecting', async () => { + location.hash = '#tab=routes'; + const fixture = TestBed.createComponent(App); + await settle(fixture); + expect(tabNames(fixture)).toEqual(['Dashboard', 'Routes']); + }); +}); diff --git a/app/src/__tests__/dashboard-cards.test.ts b/app/src/__tests__/dashboard-cards.test.ts index 673110e..66409bd 100644 --- a/app/src/__tests__/dashboard-cards.test.ts +++ b/app/src/__tests__/dashboard-cards.test.ts @@ -1,7 +1,15 @@ import { describe, expect, it } from 'vitest'; -import { componentsCard, routesCard, storeCard } from '../pages/dashboard'; +import { componentsCard, routesCard, storeCard, zoneLabel } from '../pages/dashboard'; describe('dashboard cards', () => { + it('names the change detection mode the page reported', () => { + expect(zoneLabel('zoneless')).toBe('Zoneless'); + expect(zoneLabel('zone')).toBe('zone.js'); + expect(zoneLabel('zone-unused')).toBe('Zoneless, zone.js loaded'); + expect(zoneLabel(null)).toBeNull(); + expect(zoneLabel('toString')).toBeNull(); + }); + it('counts source components when the rows carry no kind', () => { expect(componentsCard([{}, {}, {}])).toEqual({ value: 3, sub: 'discovered in source' }); }); diff --git a/app/src/__tests__/forms-panels.test.ts b/app/src/__tests__/forms-panels.test.ts index a991864..d5711d1 100644 --- a/app/src/__tests__/forms-panels.test.ts +++ b/app/src/__tests__/forms-panels.test.ts @@ -155,6 +155,18 @@ describe('FormsFieldDetail', () => { button(fixture, 'Close details for email').click(); expect(closed).toBe(1); }); + + it('says why a redacted field has no Set editor and links to unmasking', async () => { + const fixture = detail(() => Promise.resolve('about pin')); + fixture.componentRef.setInput('node', field('pin', { redacted: 'input-type' })); + await settle(fixture); + const host = fixture.nativeElement as HTMLElement; + expect(host.querySelector('#field-value')).toBeNull(); + expect(text(fixture)).toContain('this field is redacted (password input)'); + const link = host.querySelector('a')!; + expect(link.textContent).toContain('How to unmask it'); + expect(link.href).toContain('security.md#opt-fields-in-or-out'); + }); }); describe('FormsInspector fields', () => { @@ -189,3 +201,84 @@ describe('FormsInspector fields', () => { expect(document.activeElement).toBe(row); }); }); + +describe('FormsInspector pick', () => { + it('turns into Cancel picking and cancels from the button and Escape', async () => { + const calls: Record[] = []; + const pending: ((value: unknown) => void)[] = []; + const fixture = TestBed.createComponent(FormsInspector); + fixture.componentRef.setInput( + 'rpc', + fakeClient( + (_name, arg) => { + calls.push(arg); + if (arg['action'] === 'pick') return new Promise((resolve) => pending.push(resolve)); + return Promise.resolve({ ok: true, message: 'Picking cancelled.' }); + }, + [form], + ), + ); + document.body.append(fixture.nativeElement); + await settle(fixture); + const host = fixture.nativeElement as HTMLElement; + + button(fixture, 'Pick field on page').click(); + await settle(fixture); + const cancel = button(fixture, 'Cancel picking'); + expect(cancel.getAttribute('aria-pressed')).toBe('true'); + cancel.click(); + await settle(fixture); + expect(calls.at(-1)).toEqual({ action: 'cancel-pick', formId: form.id }); + pending.shift()!({ ok: false, error: 'Picking cancelled.' }); + await settle(fixture); + expect(button(fixture, 'Pick field on page').getAttribute('aria-pressed')).toBe('false'); + expect(text(fixture)).toContain('Picking cancelled.'); + + button(fixture, 'Pick field on page').click(); + await settle(fixture); + calls.length = 0; + host.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })); + await settle(fixture); + expect(calls).toEqual([{ action: 'cancel-pick', formId: form.id }]); + }); + + it('ignores the answer of a superseded pick', async () => { + const pending: ((value: unknown) => void)[] = []; + const fixture = TestBed.createComponent(FormsInspector); + fixture.componentRef.setInput( + 'rpc', + fakeClient(() => new Promise((resolve) => pending.push(resolve)), [form]), + ); + await settle(fixture); + const inspector = fixture.componentInstance; + void inspector.pick(); + void inspector.pick(); + await settle(fixture); + pending[1]({ ok: true, formId: form.id, path: 'email' }); + await settle(fixture); + pending[0]({ ok: false, error: 'Picking cancelled.' }); + await settle(fixture); + expect(inspector.message()).toBe('Picked email.'); + expect(inspector.picking()).toBeNull(); + }); +}); + +describe('FormsInspector redaction', () => { + it('labels redacted fields in plain words', async () => { + const secret: CollectedForm = { + ...form, + root: { + ...form.root, + children: [field('pinCode', { redacted: 'key', value: '[redacted]' })], + }, + }; + const fixture = TestBed.createComponent(FormsInspector); + fixture.componentRef.setInput( + 'rpc', + fakeClient(() => Promise.resolve(''), [secret]), + ); + await settle(fixture); + expect(text(fixture)).toContain('redacted: name looks secret'); + expect(text(fixture)).not.toContain('redacted (key)'); + }); +}); diff --git a/app/src/__tests__/panel-highlight.test.ts b/app/src/__tests__/panel-highlight.test.ts new file mode 100644 index 0000000..23241e4 --- /dev/null +++ b/app/src/__tests__/panel-highlight.test.ts @@ -0,0 +1,36 @@ +import type { DevframeRpcClient } from 'devframe/client'; +import { describe, expect, it, vi } from 'vitest'; +import { clearHighlightsOnHide } from '../rpc'; + +function fakeClient() { + const callEvent = vi.fn(() => Promise.resolve()); + const client = { scope: () => ({ rpc: { callEvent } }) } as unknown as DevframeRpcClient; + return { client, callEvent }; +} + +describe('panel highlights', () => { + it('clears the page and form highlights when the panel page hides', () => { + const { client, callEvent } = fakeClient(); + const stop = clearHighlightsOnHide(() => client); + expect(callEvent).not.toHaveBeenCalled(); + + dispatchEvent(new Event('pagehide')); + expect(callEvent.mock.calls).toEqual([ + ['request-page-highlight', null], + ['request-form-highlight', null], + ]); + + callEvent.mockClear(); + stop(); + expect(callEvent).toHaveBeenCalledTimes(2); + callEvent.mockClear(); + dispatchEvent(new Event('pagehide')); + expect(callEvent).not.toHaveBeenCalled(); + }); + + it('does nothing before the panel connects', () => { + const stop = clearHighlightsOnHide(() => null); + expect(() => dispatchEvent(new Event('pagehide'))).not.toThrow(); + stop(); + }); +}); diff --git a/app/src/__tests__/router-panels.test.ts b/app/src/__tests__/router-panels.test.ts new file mode 100644 index 0000000..9c59ee1 --- /dev/null +++ b/app/src/__tests__/router-panels.test.ts @@ -0,0 +1,227 @@ +import type { Type } from '@angular/core'; +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { RouteCurrent } from '../pages/route-current'; +import { RouteTimeline } from '../pages/route-timeline'; +import { RouteTree } from '../pages/route-tree'; +import type { NavigationRecord, RouterPage } from '../pages/router-types'; + +type Call = (name: string, arg: Record) => Promise; + +function fakeClient(call: Call): DevframeRpcClient { + const rpc = { call, callEvent: () => Promise.resolve() }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} + +const offline: Call = () => Promise.reject(new Error('offline')); + +function nav(id: number, url: string): NavigationRecord { + return { id, url, trigger: 'imperative', startedAt: 1, endedAt: 2, outcome: 'succeeded' }; +} + +function page(extra: Partial = {}): RouterPage { + return { + pageId: 'p1', + reportedAt: 1, + snapshot: { + url: '/users/42', + queryParams: {}, + fragment: null, + root: { path: '', url: '', outlet: 'primary', params: {}, data: {}, children: [] }, + }, + navigations: [], + ...extra, + }; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +function el(fixture: ComponentFixture): HTMLElement { + return fixture.nativeElement as HTMLElement; +} + +function button(fixture: ComponentFixture, name: string): HTMLButtonElement { + const found = Array.from(el(fixture).querySelectorAll('button')).find( + (b) => (b.getAttribute('aria-label') ?? b.textContent ?? '').trim() === name, + ); + if (!found) throw new Error(`No button named ${name}`); + return found; +} + +function mount(type: Type, data: RouterPage, call: Call) { + const fixture = TestBed.createComponent(type); + fixture.componentRef.setInput('page', data); + fixture.componentRef.setInput('rpc', fakeClient(call)); + document.body.append(el(fixture)); + return fixture; +} + +afterEach(() => { + document.body.innerHTML = ''; +}); + +describe('RouteTree row actions', () => { + const config = page({ + config: [ + { id: 'r1', path: 'users/:id', fullPath: 'users/:id', kind: 'component', component: 'User' }, + { id: 'r2', path: 'lazy', fullPath: 'lazy', kind: 'lazy', lazy: 'unloaded' }, + ], + }); + + it('asks for empty params next to the row instead of calling the page', async () => { + const calls: Record[] = []; + const fixture = mount(RouteTree, config, (_, arg) => { + calls.push(arg); + return Promise.resolve({ id: 3, outcome: 'succeeded', finalUrl: '/users/7' }); + }); + await settle(fixture); + button(fixture, 'Navigate to users/:id').click(); + await settle(fixture); + expect(calls).toEqual([]); + const field = el(fixture).querySelector('input.param')!; + const status = el(fixture).querySelector('tr.row-result [role="status"]'); + expect(status?.textContent?.trim()).toBe('Fill in :id to navigate.'); + expect(status?.closest('tr')?.previousElementSibling?.textContent).toContain('users/:id'); + expect(field.getAttribute('aria-invalid')).toBe('true'); + expect(field.getAttribute('aria-describedby')).toBe(status?.id); + expect(document.activeElement).toBe(field); + expect(el(fixture).textContent).not.toContain('Give a url'); + + field.value = '7'; + field.dispatchEvent(new Event('input')); + button(fixture, 'Navigate to users/:id').click(); + await settle(fixture); + expect(calls).toEqual([ + { + pageId: 'p1', + request: { action: 'navigate', pattern: 'users/:id', params: { id: '7' } }, + }, + ]); + expect(field.getAttribute('aria-invalid')).toBeNull(); + expect(el(fixture).querySelector('tr.row-result')?.textContent).toContain( + 'Navigation #3: succeeded at /users/7.', + ); + }); + + it('shows Read lazy results and unreachable pages under the row', async () => { + const fixture = mount(RouteTree, config, offline); + await settle(fixture); + button(fixture, 'Read lazy routes of lazy').click(); + await settle(fixture); + const result = el(fixture).querySelector('tr.row-result'); + expect(result?.previousElementSibling?.textContent).toContain('lazy'); + expect(result?.textContent?.trim()).toBe('Could not reach the page.'); + expect(el(fixture).querySelector('p.message')).toBeNull(); + }); +}); + +describe('RouteTimeline guard recording', () => { + function checkbox(fixture: ComponentFixture) { + return Array.from(el(fixture).querySelectorAll('input[type=checkbox]')).find( + (input) => input.parentElement?.textContent?.includes('Record each guard'), + )!; + } + + it('puts the checkbox back when the page does not answer', async () => { + const fixture = mount(RouteTimeline, page({ instrumented: false }), () => + Promise.resolve({ error: 'No page answered within 15s.' }), + ); + await settle(fixture); + const input = checkbox(fixture); + input.click(); + expect(input.checked).toBe(true); + await settle(fixture); + expect(input.checked).toBe(false); + expect(el(fixture).textContent).toContain('No page answered within 15s.'); + }); + + it('treats a failed call as a failure, not as recording', async () => { + const fixture = mount(RouteTimeline, page({ instrumented: true }), offline); + await settle(fixture); + const input = checkbox(fixture); + input.click(); + await settle(fixture); + expect(input.checked).toBe(true); + expect(el(fixture).textContent).toContain('Could not reach the page.'); + expect(el(fixture).textContent).not.toContain('Stopped recording'); + }); +}); + +describe('RouteTimeline replay', () => { + it('turns Replay off for redacted and absolute URLs, with a note', async () => { + const calls: unknown[] = []; + const fixture = mount( + RouteTimeline, + page({ + navigations: [ + nav(1, '/users/1'), + nav(2, '/reset?token=[redacted]'), + nav(3, 'https://example.com/x'), + ], + }), + (_, arg) => { + calls.push(arg); + return Promise.resolve({ replay: { outcome: 'succeeded' }, same: true }); + }, + ); + await settle(fixture); + const ok = button(fixture, 'Replay navigation 1'); + expect(ok.disabled).toBe(false); + expect(ok.getAttribute('aria-describedby')).toBeNull(); + for (const id of [2, 3]) { + const replay = button(fixture, `Replay navigation ${id}`); + expect(replay.disabled).toBe(true); + const note = document.getElementById(replay.getAttribute('aria-describedby')!); + expect(note?.textContent?.trim()).toBe('Replay is off: the URL is redacted or not relative.'); + } + ok.click(); + await settle(fixture); + expect(calls).toEqual([{ pageId: 'p1', request: { action: 'replay', id: 1 } }]); + }); +}); + +describe('RouteCurrent', () => { + it('reports an unreachable page on Abort instead of #undefined', async () => { + const fixture = mount( + RouteCurrent, + page({ + snapshot: { ...page().snapshot!, pending: { id: 5, url: '/slow' } }, + }), + offline, + ); + await settle(fixture); + button(fixture, 'Abort').click(); + await settle(fixture); + expect(el(fixture).textContent).toContain('Could not reach the page.'); + expect(el(fixture).textContent).not.toContain('#undefined'); + }); + + it('shows the routerOutletData each outlet passes', async () => { + const fixture = mount( + RouteCurrent, + page({ + outlets: [ + { + outlet: 'primary', + activated: true, + component: 'Shell', + route: '/shell', + data: '{"user":"Ada"}', + children: [{ outlet: 'side', activated: true, component: 'Filters', route: '/side' }], + }, + ], + }), + offline, + ); + await settle(fixture); + const rows = el(fixture).querySelectorAll('.outlets li'); + expect(rows[0].textContent).toContain('routerOutletData {"user":"Ada"}'); + expect(rows[1].textContent).not.toContain('routerOutletData'); + }); +}); diff --git a/app/src/__tests__/signal-inspector.test.ts b/app/src/__tests__/signal-inspector.test.ts new file mode 100644 index 0000000..611e130 --- /dev/null +++ b/app/src/__tests__/signal-inspector.test.ts @@ -0,0 +1,54 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { SignalInspector } from '../pages/signal-inspector'; + +function fakeClient(graph: Record): DevframeRpcClient { + const state = (value: unknown) => Promise.resolve({ value: () => value, on: () => () => {} }); + const rpc = { + call: () => Promise.resolve([]), + callEvent: () => Promise.resolve(), + sharedState: (name: string) => state(name === 'signal-graph' ? { graph } : { pages: {} }), + }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} + +async function render(graph: Record) { + const fixture = TestBed.createComponent(SignalInspector); + fixture.componentRef.setInput('rpc', fakeClient(graph)); + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } + return fixture; +} + +function notices(fixture: ComponentFixture): string[] { + return Array.from( + (fixture.nativeElement as HTMLElement).querySelectorAll('[role="status"]'), + (el) => el.textContent?.replace(/\s+/g, ' ').trim() ?? '', + ); +} + +const graph = { + nodes: [{ id: '1', kind: 'signal', label: 'query', epoch: 1, value: 'x' }], + edges: [], + componentSelector: 'app-root', + component: { id: 'c1', name: 'App', tag: 'app-root', path: 'app-root' }, +}; + +describe('SignalInspector', () => { + afterEach(() => TestBed.resetTestingModule()); + + it('says when the write hook did not load', async () => { + const fixture = await render({ ...graph, writeHook: false }); + expect(notices(fixture)).toContain( + 'The signal write hook did not load. Value history shows sampled values only, with no exact set entries.', + ); + }); + + it('shows no write hook notice when the hook loaded', async () => { + const fixture = await render(graph); + expect(notices(fixture).some((text) => text.includes('write hook'))).toBe(false); + }); +}); diff --git a/app/src/__tests__/signal-jump.test.ts b/app/src/__tests__/signal-jump.test.ts new file mode 100644 index 0000000..6fba3ca --- /dev/null +++ b/app/src/__tests__/signal-jump.test.ts @@ -0,0 +1,116 @@ +import { TestBed, type ComponentFixture } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { SignalInspector } from '../pages/signal-inspector'; + +const graph = { + pageId: 'p1', + nodes: [ + { id: '1', kind: 'signal', label: 'count', epoch: 1, value: 1 }, + { id: '2', kind: 'computed', label: 'doubled', epoch: 1, value: 2 }, + { id: '3', kind: 'effect', epoch: 1 }, + { id: '4', kind: 'signal', label: 'Resource#user.value', epoch: 1 }, + ], + edges: [ + { consumer: 1, producer: 0 }, + { consumer: 2, producer: 1 }, + { consumer: 2, producer: 3 }, + ], + resources: [{ id: 'r1', name: 'user', named: true, status: 'resolved', nodeIds: ['4'] }], +}; + +function fakeClient(): DevframeRpcClient { + const rpc = { + call: () => Promise.resolve([]), + sharedState: (name: string) => + Promise.resolve({ + value: () => (name === 'signal-graph' ? { graph, pages: { p1: graph } } : {}), + on: () => () => {}, + }), + }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } +} + +function host(fixture: ComponentFixture): HTMLElement { + return fixture.nativeElement as HTMLElement; +} + +function card(fixture: ComponentFixture, id: string): HTMLElement | undefined { + return [...host(fixture).querySelectorAll('.node-card')].find( + (el) => el.dataset['card'] === id, + ); +} + +function relation(fixture: ComponentFixture, name: string): HTMLButtonElement { + const found = [...host(fixture).querySelectorAll('.detail-panel button')].find( + (b) => b.getAttribute('aria-label') === name, + ); + if (!found) throw new Error(`No relation named ${name}`); + return found; +} + +async function open() { + const fixture = TestBed.createComponent(SignalInspector); + fixture.componentRef.setInput('rpc', fakeClient()); + document.body.append(fixture.nativeElement); + await settle(fixture); + return fixture; +} + +afterEach(() => { + document.body.innerHTML = ''; +}); + +describe('SignalInspector relations', () => { + it('selects a dependency and moves focus to its card', async () => { + const fixture = await open(); + card(fixture, '2')!.click(); + await settle(fixture); + + relation(fixture, 'Go to signal count').click(); + await settle(fixture); + + expect(card(fixture, '1')!.getAttribute('aria-expanded')).toBe('true'); + expect(card(fixture, '2')!.getAttribute('aria-expanded')).toBe('false'); + expect(document.activeElement).toBe(card(fixture, '1')); + }); + + it('reaches an unnamed consumer and clears a filter that hides it', async () => { + const fixture = await open(); + const filter = host(fixture).querySelector('.toolbar input')!; + filter.value = 'doubled'; + filter.dispatchEvent(new Event('input')); + await settle(fixture); + card(fixture, '2')!.click(); + await settle(fixture); + + relation(fixture, 'Go to effect 3').click(); + await settle(fixture); + + expect(filter.value).toBe(''); + expect(card(fixture, '3')!.getAttribute('aria-expanded')).toBe('true'); + expect(document.activeElement).toBe(card(fixture, '3')); + expect(host(fixture).querySelector('.jump-note')!.textContent).toContain( + 'Cleared the filters to show 3', + ); + }); + + it('opens the resource that owns an internal signal', async () => { + const fixture = await open(); + card(fixture, '3')!.click(); + await settle(fixture); + + relation(fixture, 'Go to signal Resource#user.value').click(); + await settle(fixture); + + expect(card(fixture, 'r1')!.getAttribute('aria-expanded')).toBe('true'); + expect(document.activeElement).toBe(card(fixture, 'r1')); + }); +}); diff --git a/app/src/__tests__/store-inspector-focus.test.ts b/app/src/__tests__/store-inspector-focus.test.ts new file mode 100644 index 0000000..8bfb400 --- /dev/null +++ b/app/src/__tests__/store-inspector-focus.test.ts @@ -0,0 +1,120 @@ +import { TestBed } from '@angular/core/testing'; +import type { DevframeRpcClient } from 'devframe/client'; +import { afterEach, describe, expect, it } from 'vitest'; +import { StoreInspector } from '../pages/store-inspector'; +import type { NgrxPage, NgrxState } from '../pages/store-types'; + +afterEach(() => { + TestBed.resetTestingModule(); + document.body.innerHTML = ''; +}); + +function page(paused: boolean): NgrxPage { + return { + pageId: 'p1', + url: 'http://localhost/', + title: 'Shop', + stores: [], + classic: { state: { n: 2 }, devtools: true, scope: 'root', ...(paused ? { paused } : {}) }, + log: [1, 2].map((seq) => ({ + seq, + source: 'store', + storeId: 'store', + type: 'inc', + timestamp: seq, + diff: [], + restorable: true, + })), + reportedAt: 1, + } as NgrxPage; +} + +function fakeClient(result: { ok: boolean; paused?: boolean; message: string }) { + const listeners = new Set<(value: unknown) => void>(); + let value: NgrxState = { pages: [page(false)] }; + const client = { + connectionMeta: {}, + scope: () => ({ + rpc: { + call: async (name: string) => { + if (name !== 'request-ngrx-action') return []; + if (result.paused) { + value = { pages: [page(true)] }; + listeners.forEach((listener) => listener(value)); + } + return result; + }, + sharedState: async () => ({ + value: () => value, + on: (_: string, listener: (value: unknown) => void) => { + listeners.add(listener); + return () => listeners.delete(listener); + }, + }), + }, + }), + }; + return client as unknown as DevframeRpcClient; +} + +async function restoreNewest(result: { ok: boolean; paused?: boolean; message: string }) { + const fixture = TestBed.createComponent(StoreInspector); + document.body.appendChild(fixture.nativeElement); + fixture.componentRef.setInput('rpc', fakeClient(result)); + await fixture.whenStable(); + fixture.detectChanges(); + await fixture.componentInstance.restore(2, true); + await fixture.whenStable(); + fixture.detectChanges(); + return fixture.nativeElement as HTMLElement; +} + +describe('StoreInspector restore focus', () => { + it('focuses the state when restoring the newest action does not pause the store', async () => { + const host = await restoreNewest({ ok: true, paused: false, message: 'Jumped.' }); + expect(host.querySelector('.paused')).toBeNull(); + expect(document.activeElement).toBe(host.querySelector('pre.tree')); + }); + + it('focuses "Back to latest" when the restore pauses the store', async () => { + const host = await restoreNewest({ ok: true, paused: true, message: 'Jumped. Paused.' }); + const latest = host.querySelector('.paused button'); + expect(latest).not.toBeNull(); + expect(document.activeElement).toBe(latest); + }); + + it('focuses "Back to latest" after a deferred restore on an already paused page', async () => { + let resolve!: (value: unknown) => void; + const client = { + connectionMeta: {}, + scope: () => ({ + rpc: { + call: async (name: string) => + name === 'request-ngrx-action' ? new Promise((done) => (resolve = done)) : [], + sharedState: async () => ({ + value: () => ({ pages: [page(true)] }), + on: () => () => undefined, + }), + }, + }), + } as unknown as DevframeRpcClient; + const fixture = TestBed.createComponent(StoreInspector); + document.body.appendChild(fixture.nativeElement); + fixture.componentRef.setInput('rpc', client); + await fixture.whenStable(); + fixture.detectChanges(); + const host = fixture.nativeElement as HTMLElement; + const latest = host.querySelector('.paused button'); + expect(latest).not.toBeNull(); + + const restoring = fixture.componentInstance.restore(1, true); + fixture.detectChanges(); + await Promise.resolve(); + fixture.detectChanges(); + resolve({ ok: true, paused: true, message: 'Jumped. Paused.' }); + await restoring; + await fixture.whenStable(); + fixture.detectChanges(); + expect(document.activeElement).toBe(latest); + }); +}); diff --git a/app/src/__tests__/store-inspector.test.ts b/app/src/__tests__/store-inspector.test.ts index 8bfb400..46e2b0e 100644 --- a/app/src/__tests__/store-inspector.test.ts +++ b/app/src/__tests__/store-inspector.test.ts @@ -1,120 +1,192 @@ -import { TestBed } from '@angular/core/testing'; +import { TestBed, type ComponentFixture } from '@angular/core/testing'; import type { DevframeRpcClient } from 'devframe/client'; import { afterEach, describe, expect, it } from 'vitest'; import { StoreInspector } from '../pages/store-inspector'; -import type { NgrxPage, NgrxState } from '../pages/store-types'; +import type { NgrxLogEntry, NgrxPage, NgrxStoreEntry } from '../pages/store-types'; -afterEach(() => { - TestBed.resetTestingModule(); - document.body.innerHTML = ''; -}); +type Call = (name: string, arg?: Record) => Promise; + +function fakeClient(call: Call, page: NgrxPage): DevframeRpcClient { + const rpc = { + call, + callEvent: () => Promise.resolve(), + sharedState: () => Promise.resolve({ value: () => ({ pages: [page] }), on: () => () => {} }), + }; + return { connectionMeta: {}, scope: () => ({ rpc }) } as unknown as DevframeRpcClient; +} -function page(paused: boolean): NgrxPage { +function entry(seq: number, extra: Partial = {}): NgrxLogEntry { + return { + seq, + source: 'store', + storeId: 'store', + type: '[Cart] Add Item', + action: { type: '[Cart] Add Item', id: seq }, + origin: 'dispatch', + timestamp: 0, + diff: [], + restorable: true, + ...extra, + }; +} + +function pageWith(log: NgrxLogEntry[]): NgrxPage { return { pageId: 'p1', - url: 'http://localhost/', - title: 'Shop', + url: '/', + title: 'App', stores: [], - classic: { state: { n: 2 }, devtools: true, scope: 'root', ...(paused ? { paused } : {}) }, - log: [1, 2].map((seq) => ({ - seq, - source: 'store', - storeId: 'store', - type: 'inc', - timestamp: seq, - diff: [], - restorable: true, - })), - reportedAt: 1, - } as NgrxPage; + classic: { state: { items: [] }, devtools: true, scope: 'root' }, + log, + reportedAt: 0, + }; } -function fakeClient(result: { ok: boolean; paused?: boolean; message: string }) { - const listeners = new Set<(value: unknown) => void>(); - let value: NgrxState = { pages: [page(false)] }; - const client = { - connectionMeta: {}, - scope: () => ({ - rpc: { - call: async (name: string) => { - if (name !== 'request-ngrx-action') return []; - if (result.paused) { - value = { pages: [page(true)] }; - listeners.forEach((listener) => listener(value)); - } - return result; - }, - sharedState: async () => ({ - value: () => value, - on: (_: string, listener: (value: unknown) => void) => { - listeners.add(listener); - return () => listeners.delete(listener); - }, - }), - }, - }), - }; - return client as unknown as DevframeRpcClient; +const source: NgrxStoreEntry[] = [ + { + name: 'CartActions', + kind: 'action', + file: 'src/cart.actions.ts', + line: 3, + types: ['[Cart] Remove Item', '[Cart] Add Item'], + }, +]; + +async function settle(fixture: ComponentFixture) { + for (let i = 0; i < 3; i++) { + await new Promise((resolve) => setTimeout(resolve)); + await fixture.whenStable(); + } } -async function restoreNewest(result: { ok: boolean; paused?: boolean; message: string }) { - const fixture = TestBed.createComponent(StoreInspector); - document.body.appendChild(fixture.nativeElement); - fixture.componentRef.setInput('rpc', fakeClient(result)); - await fixture.whenStable(); - fixture.detectChanges(); - await fixture.componentInstance.restore(2, true); - await fixture.whenStable(); - fixture.detectChanges(); +function root(fixture: ComponentFixture): HTMLElement { return fixture.nativeElement as HTMLElement; } -describe('StoreInspector restore focus', () => { - it('focuses the state when restoring the newest action does not pause the store', async () => { - const host = await restoreNewest({ ok: true, paused: false, message: 'Jumped.' }); - expect(host.querySelector('.paused')).toBeNull(); - expect(document.activeElement).toBe(host.querySelector('pre.tree')); +function button(fixture: ComponentFixture, name: string): HTMLButtonElement | undefined { + return Array.from(root(fixture).querySelectorAll('button')).find( + (b) => (b.textContent ?? '').trim() === name, + ); +} + +function type(el: HTMLInputElement | HTMLTextAreaElement, value: string) { + el.value = value; + el.dispatchEvent(new Event('input')); +} + +async function mount(log: NgrxLogEntry[], answer: Call = () => Promise.resolve({ ok: true })) { + const calls: { name: string; arg?: Record }[] = []; + const fixture = TestBed.createComponent(StoreInspector); + fixture.componentRef.setInput( + 'rpc', + fakeClient((name, arg) => { + if (name === 'get-ngrx-store') return Promise.resolve(source); + calls.push({ name, arg }); + return answer(name, arg); + }, pageWith(log)), + ); + await settle(fixture); + return { fixture, calls }; +} + +afterEach(() => { + document.body.innerHTML = ''; +}); + +describe('StoreInspector dispatch', () => { + it('suggests action types from source and the log, and dispatches the typed action', async () => { + const { fixture, calls } = await mount([entry(1)], () => + Promise.resolve({ + ok: true, + message: 'Dispatched [Cart] Remove Item as #2.', + entry: entry(2, { type: '[Cart] Remove Item' }), + }), + ); + const options = Array.from(root(fixture).querySelectorAll('#ngrx-action-types option')).map( + (o) => (o as HTMLOptionElement).value, + ); + expect(options).toEqual(['[Cart] Add Item', '[Cart] Remove Item']); + + const dispatch = button(fixture, 'Dispatch')!; + expect(dispatch.disabled).toBe(true); + type( + root(fixture).querySelector('.dispatch-form input')!, + '[Cart] Remove Item', + ); + const payload = root(fixture).querySelector('.dispatch-form textarea')!; + type(payload, '[1]'); + await settle(fixture); + expect(root(fixture).querySelector('#ngrx-payload-error')?.textContent).toContain( + 'JSON object', + ); + expect(payload.getAttribute('aria-invalid')).toBe('true'); + expect(dispatch.disabled).toBe(true); + + type(payload, '{"id": 7}'); + await settle(fixture); + expect(dispatch.disabled).toBe(false); + dispatch.click(); + await settle(fixture); + expect(calls).toEqual([ + { + name: 'request-ngrx-action', + arg: { + pageId: 'p1', + request: { type: 'dispatch', action: '[Cart] Remove Item', payload: { id: 7 } }, + }, + }, + ]); + expect(root(fixture).querySelector('.message')?.textContent).toContain('as #2'); }); - it('focuses "Back to latest" when the restore pauses the store', async () => { - const host = await restoreNewest({ ok: true, paused: true, message: 'Jumped. Paused.' }); - const latest = host.querySelector('.paused button'); - expect(latest).not.toBeNull(); - expect(document.activeElement).toBe(latest); + it('dispatches a logged action again', async () => { + const { fixture, calls } = await mount([entry(1)]); + ( + Array.from(root(fixture).querySelectorAll('.log-item')).find((b) => + b.textContent?.includes('#1'), + ) as HTMLButtonElement + ).click(); + await settle(fixture); + button(fixture, 'Dispatch again')!.click(); + await settle(fixture); + expect(calls.at(-1)).toEqual({ + name: 'request-ngrx-action', + arg: { pageId: 'p1', request: { type: 'dispatch-again', seq: 1 } }, + }); }); +}); - it('focuses "Back to latest" after a deferred restore on an already paused page', async () => { - let resolve!: (value: unknown) => void; - const client = { - connectionMeta: {}, - scope: () => ({ - rpc: { - call: async (name: string) => - name === 'request-ngrx-action' ? new Promise((done) => (resolve = done)) : [], - sharedState: async () => ({ - value: () => ({ pages: [page(true)] }), - on: () => () => undefined, - }), - }, - }), - } as unknown as DevframeRpcClient; - const fixture = TestBed.createComponent(StoreInspector); - document.body.appendChild(fixture.nativeElement); - fixture.componentRef.setInput('rpc', client); - await fixture.whenStable(); - fixture.detectChanges(); - const host = fixture.nativeElement as HTMLElement; - const latest = host.querySelector('.paused button'); - expect(latest).not.toBeNull(); - - const restoring = fixture.componentInstance.restore(1, true); - fixture.detectChanges(); - await Promise.resolve(); - fixture.detectChanges(); - resolve({ ok: true, paused: true, message: 'Jumped. Paused.' }); - await restoring; - await fixture.whenStable(); - fixture.detectChanges(); - expect(document.activeElement).toBe(latest); +describe('StoreInspector restore', () => { + async function select(log: NgrxLogEntry[], seq: number) { + const { fixture } = await mount(log); + Array.from(root(fixture).querySelectorAll('.log-item')) + .find((b) => b.textContent?.includes(`#${seq}`))! + .click(); + await settle(fixture); + return fixture; + } + + it('offers Restore only for an entry Store DevTools still holds', async () => { + const fixture = await select([entry(1)], 1); + expect(button(fixture, 'Restore this state')).toBeDefined(); + }); + + it('explains an entry Store DevTools no longer holds', async () => { + const fixture = await select([entry(1, { restorable: false, unrestorable: 'dropped' })], 1); + expect(button(fixture, 'Restore this state')).toBeUndefined(); + expect(root(fixture).textContent).toMatch(/no longer holds this action/); + expect(root(fixture).textContent).toMatch(/dropped past\s+maxAge/); + expect(root(fixture).textContent).toMatch(/committed, reset or imported/); + expect(button(fixture, 'Dispatch again')).toBeDefined(); + }); + + it('explains an entry Store DevTools never recorded', async () => { + const fixture = await select( + [entry(1, { restorable: false, unrestorable: 'not-recorded' })], + 1, + ); + expect(button(fixture, 'Restore this state')).toBeUndefined(); + expect(root(fixture).textContent).toMatch(/never recorded this action/); + expect(root(fixture).textContent).toContain('actionsBlocklist'); }); }); diff --git a/app/src/app.ts b/app/src/app.ts index 57f7ddb..d23aa0e 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -33,6 +33,7 @@ import { panelConfig, tabEnabled } from './devtools-config'; import { hostPageId } from './page-id'; import { initialTab, storeTab, storedTab } from './tab-memory'; import { detectBaseURL } from './base-url'; +import { clearHighlightsOnHide } from './rpc'; const HUB_VIEWS = ['angular', 'ngrx', 'analog', 'nativescript', 'capacitor'] as const; @@ -223,7 +224,7 @@ function readView(): View | null { [class.fade-end]="navFade().end" (scroll)="measureNav()" > - @if (tabs().length > 1) { + @if (availableTabs().length > 1) { @for (t of tabs(); track t.id) { } @@ -1398,9 +1403,16 @@ export class ComponentTree { readonly deferBlocks = computed(() => this.page()?.deferBlocks ?? []); readonly countLabel = computed(() => - countText(this.page()?.count ?? 0, this.filtered().matches, !!this.query()), + countText( + this.page()?.count ?? 0, + this.filtered().matches, + !!this.query(), + !!this.page()?.truncated, + ), ); + readonly truncationText = computed(() => truncationNotice(this.page()?.truncatedBy)); + readonly rows = computed(() => { const rows: Row[] = []; const collapsed = this.collapsed(); @@ -1639,7 +1651,9 @@ export class ComponentTree { setFilter(value: string) { this.filter.set(value); const { matches } = this.filtered(); - this.announcement.set(filterAnnouncement(this.page()?.count ?? 0, matches, value)); + this.announcement.set( + filterAnnouncement(this.page()?.count ?? 0, matches, value, !!this.page()?.truncated), + ); } async pick() { diff --git a/app/src/pages/dashboard.ts b/app/src/pages/dashboard.ts index 5d76f1a..7661546 100644 --- a/app/src/pages/dashboard.ts +++ b/app/src/pages/dashboard.ts @@ -62,9 +62,20 @@ interface InjectorNode { interface InjectorSnapshot { roots?: InjectorNode[]; environment?: InjectorNode[]; + zone?: string | null; pages?: Record; } +const ZONE_LABELS: Record = { + zoneless: 'Zoneless', + zone: 'zone.js', + 'zone-unused': 'Zoneless, zone.js loaded', +}; + +export function zoneLabel(mode: string | null | undefined): string | null { + return mode && Object.hasOwn(ZONE_LABELS, mode) ? ZONE_LABELS[mode] : null; +} + interface GraphSnapshot { graph?: { nodes?: { kind?: string }[] } | null; pages?: Record; @@ -170,6 +181,9 @@ export function storeCard(rows: Row[]): Card { @if (meta()?.analog; as analog) {
  • Analog{{ analog }}
  • } + @if (zone(); as zone) { +
  • Change detection{{ zone }}
  • + } @@ -206,9 +220,11 @@ export function storeCard(rows: Row[]): Card { } -
    +

    Configuration

    - @if (configItems().length) { + @if (!rpc()) { +

    Loading…

    + } @else if (configItems().length) {
    @for (item of configItems(); track item.label) {
    @@ -496,7 +512,7 @@ export class Dashboard { meta = signal(null); private readonly config = computed(() => panelConfig(this.rpc())); protected readonly stats = computed(() => - STATS.filter((stat) => tabEnabled(stat.tab, this.config())), + this.rpc() ? STATS.filter((stat) => tabEnabled(stat.tab, this.config())) : [], ); protected readonly configItems = computed(() => summarizeNgDevtoolsConfig(this.config())); protected readonly metaState = signal('loading'); @@ -508,6 +524,10 @@ export class Dashboard { private readonly destroyRef = inject(DestroyRef); private stopLive: (() => void)[] = []; + protected readonly zone = computed(() => + zoneLabel(injectorTreeFor(this.injectorTree(), this.pageId)?.zone), + ); + private readonly liveInjectors = computed(() => { const tree = injectorTreeFor(this.injectorTree(), this.pageId); if (!tree?.roots?.length) return null; diff --git a/app/src/pages/di-inspector.ts b/app/src/pages/di-inspector.ts index e340e0c..fe55a89 100644 --- a/app/src/pages/di-inspector.ts +++ b/app/src/pages/di-inspector.ts @@ -314,11 +314,17 @@ function isTree(value: unknown): value is InjectorNode[] {
    - @if (sel.injector.type === 'element') { + @if (sel.injector.type === 'element' || sel.dependencies) {

    - Injected here {{ sel.dependencies?.length ?? 0 }} + {{ + sel.injector.type === 'element' ? 'Injected here' : 'Injected by its services' + }} + {{ sel.dependencies?.length ?? 0 }}

    + @if (sel.injector.type !== 'element') { +

    Only services this injector has already created are listed.

    + } @if (sel.dependencies?.length) {
      @for (dep of sel.dependencies; track dep.from + dep.token + $index) { @@ -330,7 +336,10 @@ function isTree(value: unknown): value is InjectorNode[] { }
    - @if (sel.injector.directives && sel.injector.directives.length > 1) { + @if ( + sel.injector.type !== 'element' || + (sel.injector.directives && sel.injector.directives.length > 1) + ) { for {{ dep.from }} } @if (dep.providedBy; as by) { @@ -351,8 +360,10 @@ function isTree(value: unknown): value is InjectorNode[] { } - } @else { + } @else if (sel.injector.type === 'element') {

    Nothing is injected through the constructor or inject().

    + } @else { +

    No service created here has injected anything yet.

    }
    } diff --git a/app/src/pages/forms-field-detail.ts b/app/src/pages/forms-field-detail.ts index 35e0687..e40ebed 100644 --- a/app/src/pages/forms-field-detail.ts +++ b/app/src/pages/forms-field-detail.ts @@ -19,6 +19,8 @@ import { formAction, formsCall, plain, + redactLabel, + UNMASK_DOCS_URL, type CollectedForm, type FormFieldNode, } from './forms-types'; @@ -75,6 +77,11 @@ import { actionAllowed, actionBlockedMessage } from '../devtools-config'; Set + } @else if (node().type === 'control') { +

    + No Set editor: this field is redacted ({{ redactLabel(node().redacted!) }}). + How to unmask it +

    }
    @@ -141,6 +148,11 @@ import { actionAllowed, actionBlockedMessage } from '../devtools-config'; h3:focus { outline: none; } + a { + color: var(--accent); + border-radius: 2px; + } + a:focus-visible, h3:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; @@ -190,6 +202,8 @@ export class FormsFieldDetail { readonly canWrite = computed(() => actionAllowed(this.rpc(), 'forms')); protected readonly writesOff = actionBlockedMessage('forms'); + protected readonly redactLabel = redactLabel; + protected readonly unmaskDocsUrl = UNMASK_DOCS_URL; private readonly target = computed(() => `${this.form().id}|${this.node().path}`); readonly text = linkedSignal({ source: this.target, diff --git a/app/src/pages/forms-inspector.ts b/app/src/pages/forms-inspector.ts index f2d0ca4..1af6594 100644 --- a/app/src/pages/forms-inspector.ts +++ b/app/src/pages/forms-inspector.ts @@ -25,6 +25,7 @@ import { actionMessage, formAction, pageOf, + redactLabel, type CollectedForm, type FormEvent, type FormFieldError, @@ -88,6 +89,7 @@ function countFields(node: FormFieldNode): number { @Component({ selector: 'app-forms-inspector', imports: [JsonPipe, FormsFieldDetail, FormsTimeline, FormsSubmit, FormsLint, LimitNote], + host: { '(keydown.escape)': 'cancelPick()' }, template: ` @if (!rpc()) {
    @@ -242,7 +244,15 @@ function countFields(node: FormFieldNode): number { - + @if (snapshot()) { @@ -418,7 +428,7 @@ function countFields(node: FormFieldNode): number { view out of sync } @if (row.node.redacted) { - redacted ({{ row.node.redacted }}) + redacted: {{ redactLabel(row.node.redacted) }} } @if (row.node.required) { required @@ -862,6 +872,11 @@ function countFields(node: FormFieldNode): number { .actions .small:not(.primary):not(.danger) { max-width: 240px; } + .small.on { + background: var(--accent-soft); + border-color: var(--accent-line); + color: var(--text-strong); + } .status:empty { height: 0; margin-top: -8px; @@ -1226,6 +1241,7 @@ export class FormsInspector { rpc = input(null); focus = input<{ id: string } | null>(null); readonly canWrite = computed(() => actionAllowed(this.rpc(), 'forms')); + protected readonly redactLabel = redactLabel; protected readonly writesOff = actionBlockedMessage('forms'); readonly focusHandled = output(); @@ -1258,6 +1274,8 @@ export class FormsInspector { readonly message = signal(''); readonly armed = signal(null); readonly snapshot = signal(null); + readonly picking = signal(null); + private pickSeq = 0; private unsubscribe: (() => void) | null = null; private readonly destroyRef = inject(DestroyRef); @@ -1386,8 +1404,12 @@ export class FormsInspector { async pick() { const form = this.selected(); if (!form) return; - this.message.set('Click a field in the app (Esc cancels).'); + const seq = ++this.pickSeq; + this.picking.set(form.id); + this.message.set('Click a field in the app. Press Escape or Cancel picking to stop.'); const result = await formAction(this.rpc(), { action: 'pick', formId: form.id }); + if (seq !== this.pickSeq) return; + this.picking.set(null); const picked = result as typeof result & { formId?: string; path?: string }; if (!result.ok || !picked.formId) { this.message.set(actionMessage(result)); @@ -1399,6 +1421,12 @@ export class FormsInspector { this.message.set(`Picked ${picked.path || '(form)'}.`); } + cancelPick() { + const formId = this.picking(); + if (!formId) return; + void formAction(this.rpc(), { action: 'cancel-pick', formId }); + } + async setRecording(on: boolean) { const form = this.selected(); if (!form) return; diff --git a/app/src/pages/forms-types.ts b/app/src/pages/forms-types.ts index 4d2f1ab..8e63949 100644 --- a/app/src/pages/forms-types.ts +++ b/app/src/pages/forms-types.ts @@ -119,6 +119,22 @@ export const SOURCE_LABELS: Record = { export const formsCall = rpcTry; +const REDACT_LABELS: Record = { + 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', +}; + +export function redactLabel(reason: string): string { + return REDACT_LABELS[reason] ?? reason; +} + +export const UNMASK_DOCS_URL = + 'https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/security.md#opt-fields-in-or-out'; + export async function formAction( client: DevframeRpcClient | null, request: Record, diff --git a/app/src/pages/route-current.ts b/app/src/pages/route-current.ts index eb2d538..9c06177 100644 --- a/app/src/pages/route-current.ts +++ b/app/src/pages/route-current.ts @@ -178,6 +178,11 @@ interface OutletRow { @for (bound of boundInputs(row.outlet); track bound.input) { input {{ bound.input }} ← {{ bound.source }} } + @if (row.outlet.data !== undefined) { + routerOutletData {{ row.outlet.data }} + } } @@ -303,6 +308,11 @@ interface OutletRow { .outlets li:hover { background: var(--surface-2); } + .outlet-data { + display: block; + color: var(--text-2); + font-size: 12px; + } `, }) export class RouteCurrent { @@ -357,7 +367,7 @@ export class RouteCurrent { async abort() { const result = await routerAction(this.rpc(), this.page().pageId, { action: 'abort' }); this.message.set( - result?.['error'] ? String(result['error']) : `Aborted navigation #${result?.['aborted']}`, + result['error'] ? String(result['error']) : `Aborted navigation #${result['aborted']}.`, ); } } diff --git a/app/src/pages/route-timeline.ts b/app/src/pages/route-timeline.ts index 4bcf3ff..53032cc 100644 --- a/app/src/pages/route-timeline.ts +++ b/app/src/pages/route-timeline.ts @@ -5,6 +5,7 @@ import { LimitNote } from '../ui/limit-note'; import { time } from '../format'; import { SHARED_STYLES, + isReplayableUrl, routerAction, routerCall, tone, @@ -275,8 +276,8 @@ const PHASE_COLORS: Record = { + @if (!replayable(nav)) { + + }
    } @@ -544,6 +550,11 @@ const PHASE_COLORS: Record = { padding-top: 12px; border-top: 1px solid var(--border); } + .replay-note { + align-self: center; + margin: 0; + font-size: 12px; + } @media (max-width: 480px) { .details { grid-template-columns: minmax(0, 1fr); @@ -668,25 +679,36 @@ export class RouteTimeline { readonly time = time; async toggleInstrument(event: Event) { - const on = (event.target as HTMLInputElement).checked; + const checkbox = event.target as HTMLInputElement; + const on = checkbox.checked; const result = await routerAction(this.rpc(), this.page().pageId, { action: 'instrument', on }); + if (result['error']) { + checkbox.checked = !!this.page().instrumented; + this.message.set(String(result['error'])); + return; + } this.message.set( - result?.['error'] - ? String(result['error']) - : on - ? 'Recording each guard and resolver.' - : 'Stopped recording guards and resolvers.', + on ? 'Recording each guard and resolver.' : 'Stopped recording guards and resolvers.', ); } + replayable(nav: NavigationRecord) { + return isReplayableUrl(nav.url); + } + + replayNote(nav: NavigationRecord) { + if (!this.navigationAllowed()) return 'route-timeline-writes-off'; + return this.replayable(nav) ? null : `replay-note-${nav.id}`; + } + async replay(nav: NavigationRecord) { this.message.set(`Replaying #${nav.id}…`); const result = await routerAction(this.rpc(), this.page().pageId, { action: 'replay', id: nav.id, }); - if (!result || result['error']) { - this.message.set(String(result?.['error'] ?? 'Replay failed.')); + if (result['error']) { + this.message.set(String(result['error'])); return; } const replay = result['replay'] as { outcome?: string } | undefined; diff --git a/app/src/pages/route-tree.ts b/app/src/pages/route-tree.ts index 210095d..b6037ae 100644 --- a/app/src/pages/route-tree.ts +++ b/app/src/pages/route-tree.ts @@ -131,7 +131,7 @@ interface MatchResult { @for (row of rows(); track row.node.id) { - + {{ row.node.fullPath }} @if (isActive(row.node)) { @@ -190,6 +190,10 @@ interface MatchResult { class="field param" type="text" [attr.aria-label]="param + ' for ' + row.node.fullPath" + [attr.aria-invalid]="isInvalid(row.node, param) ? 'true' : null" + [attr.aria-describedby]=" + isInvalid(row.node, param) ? 'route-tree-row-result' : null + " [placeholder]="param" (input)="setParam(row.node.id, param, $any($event.target).value)" /> @@ -201,7 +205,7 @@ interface MatchResult { [attr.aria-describedby]=" navigationAllowed() ? null : 'route-tree-writes-off' " - (click)="navigate(row.node)" + (click)="navigate(row.node, rowEl)" [attr.aria-label]="'Navigate to ' + row.node.fullPath" > Go @@ -220,6 +224,13 @@ interface MatchResult {
    + @if (rowResult()?.id === row.node.id) { + + +

    {{ rowResult()?.text }}

    + + + } } @@ -355,6 +366,19 @@ interface MatchResult { font-family: var(--font-mono); font-size: 12px; } + .param[aria-invalid='true'] { + border-color: var(--danger); + } + .row-result td { + padding-top: 0; + background: transparent; + } + .row-result p { + margin: 0; + color: var(--text); + font-size: 13px; + overflow-wrap: anywhere; + } @media (max-width: 480px) { .filter { flex-basis: 100%; @@ -373,7 +397,9 @@ export class RouteTree { readonly testUrl = signal(''); readonly match = signal(null); readonly message = signal(''); - private readonly paramValues = new Map>(); + readonly rowResult = signal<{ id: string; text: string } | null>(null); + private readonly paramValues = signal>>({}); + private readonly checkedRow = signal(null); readonly active = computed(() => new Set(this.page().activeIds ?? [])); @@ -428,7 +454,16 @@ export class RouteTree { } setParam(id: string, name: string, value: string) { - this.paramValues.set(id, { ...this.paramValues.get(id), [name]: value }); + this.paramValues.update((all) => ({ ...all, [id]: { ...all[id], [name]: value } })); + } + + missingParams(node: RouteNode) { + const values = this.paramValues()[node.id] ?? {}; + return this.params(node).filter((param) => !values[param]); + } + + isInvalid(node: RouteNode, param: string) { + return this.checkedRow() === node.id && !this.paramValues()[node.id]?.[param]; } chainText(result: MatchResult) { @@ -451,8 +486,8 @@ export class RouteTree { if (!url) return; this.message.set('Running the real matcher in the app…'); const result = await routerAction(this.rpc(), this.page().pageId, { action: 'probe', url }); - if (!result || result['error']) { - this.message.set(String(result?.['error'] ?? 'Probe failed.')); + if (result['error']) { + this.message.set(String(result['error'])); return; } this.message.set( @@ -464,19 +499,32 @@ export class RouteTree { ); } - async navigate(node: RouteNode) { - const values = this.paramValues.get(node.id) ?? {}; - this.message.set(`Navigating to ${node.fullPath}…`); + async navigate(node: RouteNode, row?: HTMLElement) { + const missing = this.missingParams(node); + if (missing.length) { + this.checkedRow.set(node.id); + this.rowResult.set({ + id: node.id, + text: `Fill in ${missing.map((param) => `:${param}`).join(', ')} to navigate.`, + }); + Array.from(row?.querySelectorAll('input.param') ?? []) + .find((field) => !field.value) + ?.focus(); + return; + } + this.checkedRow.set(null); + this.rowResult.set({ id: node.id, text: `Navigating to ${node.fullPath}…` }); const result = await routerAction(this.rpc(), this.page().pageId, { action: 'navigate', pattern: node.fullPath, - params: values, + params: this.paramValues()[node.id] ?? {}, }); - this.message.set( - !result || result['error'] - ? String(result?.['error'] ?? 'Navigation failed.') + this.rowResult.set({ + id: node.id, + text: result['error'] + ? String(result['error']) : `Navigation #${result['id']}: ${result['outcome']}${result['finalUrl'] ? ` at ${result['finalUrl']}` : ''}.`, - ); + }); } async resolveLazy(node: RouteNode) { @@ -484,13 +532,14 @@ export class RouteTree { action: 'resolve-lazy', id: node.id, }); - if (!result || result['error']) { - this.message.set(String(result?.['error'] ?? 'Could not read the lazy routes.')); + if (result['error']) { + this.rowResult.set({ id: node.id, text: String(result['error']) }); return; } const routes = (result['routes'] as { path: string }[]) ?? []; - this.message.set( - `${node.fullPath} declares ${routes.length} route(s): ${routes.map((r) => `/${r.path}`).join(', ')}. The router loads them for real on the first navigation that needs them.`, - ); + this.rowResult.set({ + id: node.id, + text: `${node.fullPath} declares ${routes.length} route(s): ${routes.map((r) => `/${r.path}`).join(', ')}. The router loads them for real on the first navigation that needs them.`, + }); } } diff --git a/app/src/pages/router-types.ts b/app/src/pages/router-types.ts index c77991c..9d41097 100644 --- a/app/src/pages/router-types.ts +++ b/app/src/pages/router-types.ts @@ -134,6 +134,7 @@ export interface OutletInfo { activated: boolean; detached?: boolean; inputs?: { input: string; source: string }[]; + data?: string; children?: OutletInfo[]; } @@ -201,12 +202,28 @@ export type LintResult = export const routerCall = rpcTry; -export function routerAction( +export function isReplayableUrl(url: string): boolean { + return ( + url.startsWith('/') && + !url.startsWith('//') && + !/^\/*[a-z][a-z0-9+.-]*:/i.test(url) && + !url.includes('[redacted]') && + url.length <= 2000 + ); +} + +export const PAGE_UNREACHABLE = 'Could not reach the page.'; + +export async function routerAction( client: DevframeRpcClient | null, pageId: string | undefined, request: Record, -): Promise | null> { - return routerCall>(client, 'request-router-action', { pageId, request }); +): Promise> { + const result = await routerCall>(client, 'request-router-action', { + pageId, + request, + }); + return result ?? { error: PAGE_UNREACHABLE }; } export const SHARED_STYLES = ` diff --git a/app/src/pages/signal-inspector.ts b/app/src/pages/signal-inspector.ts index 5c448d9..df75f56 100644 --- a/app/src/pages/signal-inspector.ts +++ b/app/src/pages/signal-inspector.ts @@ -1,4 +1,15 @@ -import { Component, DestroyRef, computed, effect, inject, input, signal } from '@angular/core'; +import { + Component, + DestroyRef, + ElementRef, + Injector, + afterNextRender, + computed, + effect, + inject, + input, + signal, +} from '@angular/core'; import { DatePipe, JsonPipe, NgTemplateOutlet } from '@angular/common'; import type { DevframeRpcClient } from 'devframe/client'; import { hostPageId } from '../page-id'; @@ -56,6 +67,7 @@ interface SignalGraph { resources?: SignalResource[]; nodeCount?: number; unsupported?: boolean; + writeHook?: false; source?: 'selected' | 'routed' | 'root'; pageId?: string; history?: Record; @@ -184,6 +196,12 @@ const KIND_COLORS: Record = { The live signal graph needs Angular 20.1 or later. This list comes from a source scan.

    } + @if (graph()?.writeHook === false) { +

    + The signal write hook did not load. Value history shows sampled values only, with no exact + set entries. +

    + } @if (graph()?.nodeCount; as total) {

    Showing {{ graph()!.nodes.length }} of {{ total }} signals. The rest and their edges are @@ -294,6 +312,8 @@ const KIND_COLORS: Record = { } +

    {{ jumpNote() }}

    + @if (graph() && filteredResources().length) {

    Resources

      @@ -305,6 +325,7 @@ const KIND_COLORS: Record = { [class.selected]="selectedId() === res.id" [attr.aria-expanded]="selectedId() === res.id" [attr.aria-controls]="'signal-detail-' + res.id" + [attr.data-card]="res.id" (click)="select(res.id)" > @@ -427,6 +448,7 @@ const KIND_COLORS: Record = { [class.selected]="selectedId() === node.id" [attr.aria-expanded]="selectedId() === node.id" [attr.aria-controls]="'signal-detail-' + node.id" + [attr.data-card]="node.id" (click)="select(node.id)" > @@ -481,10 +503,17 @@ const KIND_COLORS: Record = {
        @for (dep of getDependencies(selectedNode()!); track dep.id) {
      • - {{ - dep.kind - }} - {{ dep.label ?? dep.id }} +
      • }
      @@ -494,10 +523,17 @@ const KIND_COLORS: Record = {
        @for (con of getConsumers(selectedNode()!); track con.id) {
      • - {{ - con.kind - }} - {{ con.label ?? con.id }} +
      • }
      @@ -1034,7 +1070,8 @@ const KIND_COLORS: Record = { margin: 0; font-size: 13px; } - .detail-panel ul li { + .detail-panel ul li, + .rel-link { display: flex; align-items: center; gap: 8px; @@ -1043,12 +1080,36 @@ const KIND_COLORS: Record = { padding: 4px 8px; color: var(--text-2); border-radius: 6px; - transition: background-color 0.15s var(--ease); } - .detail-panel ul li:hover { + .detail-panel ul li:has(> .rel-link) { + padding: 0; + } + .rel-link { + width: 100%; + font: inherit; + text-align: left; + background: none; + border: 0; + cursor: pointer; + transition: + background-color 0.15s var(--ease), + color 0.15s var(--ease); + } + .rel-link:hover { background: var(--surface-2); color: var(--text); } + .rel-link:focus-visible { + @include m.focus-ring; + } + .jump-note { + margin: 0; + font-size: 12px; + color: var(--text-2); + } + .jump-note:not(:empty) { + margin-bottom: 8px; + } .rel-label { min-width: 0; font-family: var(--font-mono); @@ -1139,6 +1200,8 @@ export class SignalInspector { rpc = input(null); private readonly destroyRef = inject(DestroyRef); + private readonly host = inject>(ElementRef); + private readonly injector = inject(Injector); private readonly pageId = hostPageId(); private readonly cleanups: (() => void)[] = []; private readonly treePages = signal>( @@ -1174,6 +1237,12 @@ export class SignalInspector { selectedNode = computed( () => this.graph()?.nodes.find((n) => n.id === this.selectedId()) ?? null, ); + private readonly jumpedPast = signal<{ id: string; label: string } | null>(null); + readonly jumpNote = computed(() => { + const jumped = this.jumpedPast(); + if (!jumped || this.filter() || this.kind() || this.selectedId() !== jumped.id) return ''; + return `Cleared the filters to show ${jumped.label}.`; + }); selectedHistory = computed(() => { const id = this.selectedId(); return id ? [...(this.graph()?.history?.[id] ?? [])].reverse() : []; @@ -1360,6 +1429,28 @@ export class SignalInspector { this.showInternals.set(false); } + jumpTo(node: SignalNode) { + const resource = this.resources().find((r) => r.nodeIds.includes(node.id)); + const id = resource?.id ?? node.id; + const hidden = resource + ? !this.filteredResources().some((r) => r.id === id) + : !this.filteredNodes().some((n) => n.id === id); + if (hidden) this.clearFilters(); + this.jumpedPast.set(hidden ? { id, label: resource?.name ?? node.label ?? node.id } : null); + this.selectedId.set(id); + this.showInternals.set(!!resource); + afterNextRender( + () => { + const card = [ + ...this.host.nativeElement.querySelectorAll('.node-card[data-card]'), + ].find((el) => el.dataset['card'] === id); + card?.scrollIntoView?.({ block: 'nearest' }); + card?.focus({ preventScroll: true }); + }, + { injector: this.injector }, + ); + } + // The page counts past the kept history; older pages only send the list. changeCount(id: string): number { const g = this.graph(); diff --git a/app/src/pages/store-inspector.ts b/app/src/pages/store-inspector.ts index 2a49d0f..a775069 100644 --- a/app/src/pages/store-inspector.ts +++ b/app/src/pages/store-inspector.ts @@ -55,6 +55,25 @@ const ORIGIN_TEXT: Record = { reactive: 'store.dispatch(() => action)', }; +function parsePayload(text: string): { payload?: Record; error?: string } { + if (!text.trim()) return {}; + let value: unknown; + try { + value = JSON.parse(text); + } catch { + return { error: 'The payload is not valid JSON.' }; + } + if (!value || typeof value !== 'object' || Array.isArray(value)) { + return { error: 'The payload must be a JSON object, like {"id": 7}.' }; + } + if (Object.prototype.hasOwnProperty.call(value, 'type')) { + return { + error: 'The payload cannot have a "type" key. Put the action type in the Type field.', + }; + } + return { payload: value as Record }; +} + const CLASSIC_KINDS = new Set([ 'action', 'reducer', @@ -179,7 +198,7 @@ const CLASSIC_KINDS = new Set([ } @if (current.classic) { {{ - current.classic.devtools ? 'Store DevTools on' : 'read-only' + current.classic.devtools ? 'Store DevTools on' : 'Store DevTools off' }} } @@ -362,69 +381,150 @@ const CLASSIC_KINDS = new Set([

      The state did not change.

      } - @if (selected.restorable) { - @if (confirmSeq() === selected.seq) { -
      -

      - @if (selected.source === 'store') { - Store DevTools jumps the app state to the state right after action - #{{ selected.seq }}. Until you go back to the latest state, new - actions are logged but do not change the state. - } @else { - This sets every state key of {{ current.label }} back to its value - right after change #{{ selected.seq }}. Components that read the - store update at once, and a new "Restore" entry is added to the log. - } -

      -
      - - -
      + @if (selected.restorable && confirmSeq() === selected.seq) { +
      +

      + @if (selected.source === 'store') { + Store DevTools jumps the app state to the state right after action #{{ + selected.seq + }}. Until you go back to the latest state, new actions are logged but + do not change the state. + } @else { + This sets every state key of {{ current.label }} back to its value + right after change #{{ selected.seq }}. Components that read the store + update at once, and a new "Restore" entry is added to the log. + } +

      +
      + +
      - } @else { - - @if (!canRestore()) { -

      {{ restoreOff }}

      +
      + } + @if ( + confirmSeq() !== selected.seq && (selected.restorable || canAgain(selected)) + ) { +
      + @if (selected.restorable) { + + } + @if (canAgain(selected)) { + } +
      + @if (!canRestore()) { +

      {{ restoreOff }}

      } - } @else if (selected.source === 'store') { + } + @if (!selected.restorable && selected.source === 'store') {

      - Time travel for @ngrx/store needs provideStoreDevtools(). - Without it this log is read-only. + @if (selected.unrestorable === 'dropped') { + Store DevTools no longer holds this action, so this state cannot be + restored. It was dropped past maxAge, or the Store DevTools + history was committed, reset or imported. + } @else if (selected.unrestorable === 'not-recorded') { + Store DevTools never recorded this action, so this state cannot be + restored. An actionsBlocklist, + actionsSafelist or predicate option filtered + it out, or recording was paused. + } @else { + Time travel for @ngrx/store needs + provideStoreDevtools(). Without it, entries cannot be + restored. + }

      }
    }
    + + @if (current.classic) { +
    +

    Dispatch an action

    +
    + + + @for (type of actionTypes(); track type) { + + } + + +

    {{ payloadError() }}

    +
    + +
    + @if (!canRestore()) { +

    {{ restoreOff }}

    + } +
    +
    + } } @@ -1019,10 +1119,77 @@ const CLASSIC_KINDS = new Set([ margin: 0 0 10px; line-height: 1.5; } - .actions { + .actions, + .entry-actions { display: flex; + flex-wrap: wrap; gap: 8px; } + .entry-actions { + margin-top: 14px; + } + .entry-actions .btn.restore { + margin-top: 0; + } + .dispatch { + min-width: 0; + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--border); + } + .dispatch-form { + display: grid; + gap: 10px; + max-width: 560px; + } + .dispatch-form label { + display: grid; + gap: 6px; + color: var(--text-2); + font-size: 12px; + font-weight: 500; + } + .optional { + color: var(--text-3); + font-weight: 400; + } + .dispatch-form input { + width: 100%; + font-family: var(--font-mono); + font-size: 12.5px; + } + textarea { + width: 100%; + min-width: 0; + padding: 8px 10px; + border: 1px solid var(--border-strong); + border-radius: var(--radius-sm); + background: var(--bg); + color: var(--text); + font-family: var(--font-mono); + font-size: 12px; + resize: vertical; + transition: + border-color 0.15s var(--ease), + box-shadow 0.15s var(--ease); + } + textarea::placeholder { + color: var(--text-3); + } + textarea:focus-visible { + @include m.field-focus; + } + textarea[aria-invalid='true'] { + border-color: color-mix(in srgb, var(--danger) 60%, transparent); + } + .field-error { + margin: -4px 0 0; + color: var(--danger); + font-size: 12px; + } + .field-error:empty { + display: none; + } .paused { display: flex; flex-wrap: wrap; @@ -1299,6 +1466,27 @@ export class StoreInspector { () => this.storeLog().find((e) => e.seq === this.selectedSeq()) ?? null, ); + readonly dispatchType = signal(''); + readonly dispatchPayload = signal(''); + + readonly actionTypes = computed(() => { + const types = new Set(); + for (const entry of this.sourceEntries()) for (const type of entry.types ?? []) types.add(type); + for (const entry of this.page()?.log ?? []) { + if (entry.source === 'store' && entry.action !== undefined) types.add(entry.type); + } + return [...types].sort().slice(0, 200); + }); + + readonly payloadError = computed(() => parsePayload(this.dispatchPayload()).error ?? ''); + + readonly dispatchRequest = computed(() => { + const type = this.dispatchType().trim(); + const { payload, error } = parsePayload(this.dispatchPayload()); + if (!type || error) return null; + return { type: 'dispatch' as const, action: type, ...(payload ? { payload } : {}) }; + }); + readonly usesSignals = computed(() => this.sourceEntries().some((e) => e.kind === 'signal-store' || e.kind === 'signal-state'), ); @@ -1451,6 +1639,44 @@ export class StoreInspector { } } + canAgain(entry: NgrxLogEntry): boolean { + return entry.source === 'store' && entry.action !== undefined; + } + + async dispatchAction(event: Event) { + event.preventDefault(); + const request = this.dispatchRequest(); + if (request) await this.send(request, 'Could not reach the page to dispatch the action.'); + } + + dispatchAgain(seq: number) { + return this.send( + { type: 'dispatch-again', seq }, + 'Could not reach the page to dispatch the action again.', + ); + } + + private async send(request: Record, offline: string) { + const page = this.page(); + if (!page || this.busy()) return; + this.busy.set(true); + try { + const result = (await call(this.rpc(), 'request-ngrx-action', { + pageId: page.pageId, + request, + })) as { ok?: boolean; message?: string; error?: string; entry?: NgrxLogEntry } | null; + this.message.set(result?.error ?? result?.message ?? 'Dispatched.'); + if (result?.entry) { + this.selectedStoreId.set('store'); + this.selectedSeq.set(result.entry.seq); + } + } catch { + this.message.set(offline); + } finally { + this.busy.set(false); + } + } + clearFilters() { this.filter.set(''); this.kind.set(null); diff --git a/app/src/pages/store-types.ts b/app/src/pages/store-types.ts index 9c14850..2f970a3 100644 --- a/app/src/pages/store-types.ts +++ b/app/src/pages/store-types.ts @@ -15,6 +15,7 @@ export interface NgrxStoreEntry { file: string; line: number; detail?: string; + types?: string[]; } export interface NgrxSignalStoreInfo { @@ -59,6 +60,7 @@ export interface NgrxLogEntry { timestamp: number; diff: NgrxDiffEntry[]; restorable: boolean; + unrestorable?: 'dropped' | 'not-recorded'; } export interface NgrxPage { diff --git a/app/src/rpc.ts b/app/src/rpc.ts index 7646fb6..e67f6e9 100644 --- a/app/src/rpc.ts +++ b/app/src/rpc.ts @@ -29,3 +29,18 @@ export function rpcTry( export function isStaticReport(client: DevframeRpcClient | null): boolean { return client?.connectionMeta.backend === 'static'; } + +/** Clears the boxes the panel drew in the app when the panel page goes away; returns the cleanup. */ +export function clearHighlightsOnHide(client: () => DevframeRpcClient | null): () => void { + const clear = () => { + const rpc = client()?.scope('ng-devtools').rpc; + if (!rpc) return; + void rpc.callEvent('request-page-highlight', null); + void rpc.callEvent('request-form-highlight', null); + }; + addEventListener('pagehide', clear); + return () => { + removeEventListener('pagehide', clear); + clear(); + }; +} diff --git a/apps/docs/src/content/agents/mcp-server.md b/apps/docs/src/content/agents/mcp-server.md index f3eab2f..b470911 100644 --- a/apps/docs/src/content/agents/mcp-server.md +++ b/apps/docs/src/content/agents/mcp-server.md @@ -208,15 +208,16 @@ The server registers tools with a colon, as `ng-devtools:get-routes`. MCP client ### Read and action tools -The server marks read-only tools as read-only for your client. Five tools act on the app, so the server does not mark them: - -| Tool | Reference | -| ----------------- | ------------------------------------------------------------------ | -| `highlight` | [Components, signals and DI](./tools.md#components-signals-and-di) | -| `navigate` | [Act on the router](./tools.md#act-on-the-router) | -| `form-action` | [Act on a form](./tools.md#act-on-a-form) | -| `fill-form` | [Act on a form](./tools.md#act-on-a-form) | -| `analog-call-api` | [Call a server route](./tools.md#call-a-server-route) | +The server marks read-only tools as read-only for your client. Six tools act on the app, so the server does not mark them: + +| Tool | Reference | +| ---------------------- | ------------------------------------------------------------------ | +| `highlight` | [Components, signals and DI](./tools.md#components-signals-and-di) | +| `navigate` | [Act on the router](./tools.md#act-on-the-router) | +| `dispatch-ngrx-action` | [Dispatch an action](./tools.md#dispatch-an-action) | +| `form-action` | [Act on a form](./tools.md#act-on-a-form) | +| `fill-form` | [Act on a form](./tools.md#act-on-a-form) | +| `analog-call-api` | [Call a server route](./tools.md#call-a-server-route) | Your client can ask you before it runs them. To drop them from the server, set `agent.readOnly`. See [Inspectors and agent tools](../getting-started/configuration.md#inspectors-and-agent-tools). diff --git a/apps/docs/src/content/agents/resources.md b/apps/docs/src/content/agents/resources.md index 7b9b998..b677d17 100644 --- a/apps/docs/src/content/agents/resources.md +++ b/apps/docs/src/content/agents/resources.md @@ -44,7 +44,7 @@ Each one returns JSON. ### component-tree -The component instances of each page, under `pages[pageId].roots`. Each node has an instance id, class name, host tag and the directives on its host. `detail` holds the live inputs, outputs, other properties, listeners, change detection, encapsulation and injected dependencies of the selected instance. The selection is the one made in the panel, by clicking in the page with **Pick component on page**, or with the `highlight` or `inspect-component` tool. `deferBlocks` lists the page's `@defer` blocks, and is missing when the page has no util to read them. `nodes` repeats the roots of the most recent page. +The component instances of each page, under `pages[pageId].roots`. Each node has an instance id, class name, host tag and the directives on its host. `detail` holds the live inputs, outputs, other properties, listeners, change detection, encapsulation and injected dependencies of the selected instance. The selection is the one made in the panel, by clicking in the page with **Pick component on page**, or with the `highlight` or `inspect-component` tool. `truncated` is `true` when the page has more instances than it lists, and `truncatedBy` names the limit it hit: `components` (2000 instances) or `depth` (256 levels of DOM nesting). `deferBlocks` lists the page's `@defer` blocks, and is missing when the page has no util to read them. `nodes` repeats the roots of the most recent page. The instance ids here are what `highlight` and `inspect-component` accept. @@ -54,11 +54,11 @@ The signal graph of each page, under `pages[pageId]`. `graph` is the latest one. ### injector-tree -The injector hierarchy the page last reported, with the providers at each level. Each page is under `pages[pageId]`. `roots` and `environment` are the latest. `truncated` is `true` when the page has more than 2000 element injectors and reported only the first 2000. +The injector hierarchy the page last reported, with the providers at each level. Each page is under `pages[pageId]`. `roots` and `environment` are the latest. Element injectors list what their components and directives inject in `dependencies`. Environment injectors list what the services they already created inject, with `from` naming the service. `zone` is the change detection mode: `zoneless`, `zone` (zone.js) or `zone-unused` (zoneless, with zone.js still loaded). `truncated` is `true` when the page has more than 2000 element injectors and reported only the first 2000. ### ngrx-store -Each `@ngrx/signals` store on the page: state, computed values, methods, and the component fields that reference it. It also holds the `@ngrx/store` state and the change log, with a state diff per entry. The log records method calls, `patchState` writes, dispatched actions and restores. An `@ngrx/store` action has an `origin`: `dispatch`, `effect` or `reactive`. `classic.paused` is `true` while a restore holds `@ngrx/store` on a past state. `dropped` counts the older log entries removed at [`limits.changeLog`](../getting-started/configuration.md#limits). +Each `@ngrx/signals` store on the page: state, computed values, methods, and the component fields that reference it. It also holds the `@ngrx/store` state and the change log, with a state diff per entry. The log records method calls, `patchState` writes, dispatched actions and restores. An `@ngrx/store` action has an `origin`: `dispatch`, `effect` or `reactive`. `classic.paused` is `true` while a restore holds `@ngrx/store` on a past state. An `@ngrx/store` entry with `unrestorable` cannot be restored: `dropped` means Store DevTools no longer holds the action (it was dropped past `maxAge`, or the history was committed, reset or imported), and `not-recorded` means Store DevTools never recorded it. `dropped` counts the older log entries removed at [`limits.changeLog`](../getting-started/configuration.md#limits). ### forms diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md index 63be861..0c382bf 100644 --- a/apps/docs/src/content/agents/tools.md +++ b/apps/docs/src/content/agents/tools.md @@ -46,26 +46,26 @@ Lists the tabs that report to the server, newest first: page id, URL, seconds si ### Action tools - highlight, navigate, form-action, fill-form and analog-call-api act on the app. Every other tool is marked read-only for your client. + highlight, navigate, dispatch-ngrx-action, form-action, fill-form and analog-call-api act on the app. Every other tool is marked read-only for your client. ### Turn tools off -The server decides which tools exist. Set `agent.readOnly` to drop the five action tools. Set `agent.tools.` to `false` to hide one inspector's tools and resources, and keep its tab. Turning an inspector off with `inspectors`, or blocking an action with `actions`, drops the matching tools too. See [Inspectors and agent tools](../getting-started/configuration.md#inspectors-and-agent-tools). +The server decides which tools exist. Set `agent.readOnly` to drop the six action tools. Set `agent.tools.` to `false` to hide one inspector's tools and resources, and keep its tab. Turning an inspector off with `inspectors`, or blocking an action with `actions`, drops the matching tools too. See [Inspectors and agent tools](../getting-started/configuration.md#inspectors-and-agent-tools). ## Source scan These seven tools take no arguments. They all read your source. -| Tool | What it answers | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `get-routes` | Angular routes from your route files, with full URL path (parents and `loadChildren` prefixes included), kind (page, group, redirect or wildcard), guards, resolvers, and file and line. | -| `get-components` | Components and directives from `@Component` and `@Directive` classes, with class name, selector, kind, inputs, outputs, change detection (components only), and file and line. | -| `get-signals` | `signal()`, `computed()`, `linkedSignal()`, `effect()`, `toSignal()` and resource declarations (`resource`, `httpResource`, `rxResource`), plus signal inputs, models and queries. | -| `get-providers` | DI providers: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays, with token, file and where each one is provided. | -| `get-ngrx-store` | NgRx declarations: `@ngrx/store` actions, reducers, effects, selectors, features and store setup, and `@ngrx/signals` `signalStore` (with its members), `signalState` and `signalMethod`. | -| `get-pipes` | Custom `@Pipe` classes, and built-in pipes from `@angular/common` in use in templates, with purity, standalone status, and where each is declared or used. | -| `build-meta` | The project name, the Angular and TypeScript versions, SSR status, the Analog version in Analog apps, and a `builtAt` timestamp. | +| Tool | What it answers | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `get-routes` | Angular routes from your route files, with full URL path (parents and `loadChildren` prefixes included), kind (page, group, redirect or wildcard), guards, resolvers, and file and line. | +| `get-components` | Components and directives from `@Component` and `@Directive` classes, with class name, selector, kind, inputs, outputs, change detection (components only), and file and line. | +| `get-signals` | `signal()`, `computed()`, `linkedSignal()`, `effect()`, `toSignal()` and resource declarations (`resource`, `httpResource`, `rxResource`), plus signal inputs, models and queries. | +| `get-providers` | DI providers: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays, with token, file and where each one is provided. | +| `get-ngrx-store` | NgRx declarations: `@ngrx/store` actions (with their type strings in `types`), reducers, effects, selectors, features and store setup, and `@ngrx/signals` `signalStore` (with its members), `signalState` and `signalMethod`. | +| `get-pipes` | Custom `@Pipe` classes, and built-in pipes from `@angular/common` in use in templates, with purity, standalone status, and where each is declared or used. | +| `build-meta` | The project name, the Angular and TypeScript versions, SSR status, the Analog version in Analog apps, and a `builtAt` timestamp. | ## Components, signals and DI @@ -89,7 +89,7 @@ The live detail of one component instance: inputs, outputs and whether a parent | `selector` | yes | An instance id from the `component-tree` resource, a class name or host tag. | | `pageId` | no | Same as `page`. | -A class name or tag that matches several instances answers for the first and lists the ids of all of them. Secret-looking values are redacted. +A class name or tag that matches several instances answers for the first and lists the ids of all of them. When nothing matches and the page's tree stopped at a [limit](../inspectors/components.md#selection), `inspect-component` and `highlight` say which one, since the instance can be past it. Secret-looking values are redacted. ### defer-blocks @@ -110,7 +110,7 @@ Change detection cycles recorded with Angular's profiler: the slowest components | `record` | no | `start` starts a fresh recording, `stop` stops it and keeps the cycles, `clear` empties it. Leave out to read. | | `limit` | no | Rows per list. Default 10, at most 50. | -Without `page`, it reads the page that is recording, and `record` goes to every connected page. Recording is off until the panel or this tool starts it. Call it with `record: "start"`, use the app, then call it again without `record`. When older cycles were dropped at [`limits.cdCycles`](../getting-started/configuration.md#limits), the answer says how many. +Without `page`, it reads the page that is recording, and `record` goes to every connected page. The answer starts with the change detection mode of the page that last reported its injectors: zoneless, zone.js, or zoneless with zone.js still loaded. Recording is off until the panel or this tool starts it. Call it with `record: "start"`, use the app, then call it again without `record`. When older cycles were dropped at [`limits.cdCycles`](../getting-started/configuration.md#limits), the answer says how many. ### inspect-signals @@ -137,15 +137,15 @@ With `root` or a route path, the tool switches the page's graph to the effects o ### inspect-providers -The injectors a page reported. Element injectors list what each component injected and which injector supplied it. Environment injectors run from the platform down to the root and route injectors. Reads: page. +The injectors a page reported. Element injectors list what each component injected and which injector supplied it. Environment injectors run from the platform down to the root and route injectors, and list what the services they already created inject. Reads: page. | Argument | Required | Value | | ---------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | `selector` | no | A tag name, a component or directive class name, or an injector id. Returns only the matching element injectors, each with its lookup path resolved. | -| `token` | no | A token name, like `HttpClient`. Returns the injectors that provide it and the components that inject it. | +| `token` | no | A token name, like `HttpClient`. Returns the injectors that provide it and the components or services that inject it. | | `pageId` | no | Same as `page`. | -Without `selector` or `token`, the answer is the whole tree, cut off at 20,000 characters. When the page has more than 2000 element injectors, the answer says that it holds only the first 2000. +Without `selector` or `token`, the answer is the whole tree, cut off at 20,000 characters, and says which change detection mode the page runs. When the page has more than 2000 element injectors, the answer says that it holds only the first 2000. ## Router @@ -153,11 +153,11 @@ All router tools read the page, except `explain-render-mode`, which also reads y ### Read the current route -| Tool | What it answers | Arguments | -| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | -| `inspect-route` | The current route: URL, query params, fragment, title, the navigation in flight, the active route tree (component, params, data, guards, resolvers) and the outlet tree. With `selector`, the route a component was rendered for, or whether a link is active. | `selector`: component class, element tag or link text | -| `explain-navigation` | Recent navigations, newest first: who started each one, redirects and loops with the cause of each hop, per-phase timing, guard and resolver verdicts, lazy loads, and the cancel or error reason in plain language. | `url`, `id`, `limit` (1 to 50, default 5), `perf` | -| `export-navigation` | A markdown repro of one navigation, with router options, any loop it is part of and the relevant slice of the route config. Defaults to the latest one that did not succeed. | `id` | +| Tool | What it answers | Arguments | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | +| `inspect-route` | The current route: URL, query params, fragment, title, the navigation in flight, the active route tree (component, params, data, guards, resolvers) and the outlet tree with each outlet's `routerOutletData`. With `selector`, the route a component was rendered for, or whether a link is active. | `selector`: component class, element tag or link text | +| `explain-navigation` | Recent navigations, newest first: who started each one, redirects and loops with the cause of each hop, per-phase timing, guard and resolver verdicts, lazy loads, and the cancel or error reason in plain language. | `url`, `id`, `limit` (1 to 50, default 5), `perf` | +| `export-navigation` | A markdown repro of one navigation, with router options, any loop it is part of and the relevant slice of the route config. Defaults to the latest one that did not succeed. | `id` | Use `explain-navigation` for "why was I redirected". Pass `perf: true` for "why is navigation slow": it lists the slowest navigations and preloads. @@ -202,6 +202,20 @@ Use `explain-navigation` for "why was I redirected". Pass `perf: true` for "why If a `canMatch` guard or the navigation error handler redirects a `probe`, the probe stops the redirected navigation before it matches or renders anything, and the result names the target in `redirectedTo`. +## NgRx + +### Dispatch an action Action + +`dispatch-ngrx-action` dispatches an action to the `@ngrx/store` Store of the running app, in development only, and returns the new log entry: the action, its origin and the state diff. Reads: page. + +| Argument | Value | +| --------- | --------------------------------------------------------------------------------------------- | +| `type` | The action type, like `[Cart] Add Item`. `get-ngrx-store` lists the types it finds in source. | +| `payload` | The action props as a JSON object, like `{"id": 7}`. It cannot have a `type` key. | +| `seq` | The number of an action in the log, to dispatch that action again. Use it instead of `type`. | + +Without `page`, the tool picks the most recent page that has an `@ngrx/store` Store. While a restore holds Store DevTools on a past state, the action is logged but does not change the state, and the answer says so. Set [`actions.ngrx`](../getting-started/configuration.md#actions) to `false` to drop the tool. Read the live state and log with the [`ngrx-store` resource](./resources.md#ngrx-store). + ## Forms All forms tools read the page. They cover Signal Forms, reactive forms and template-driven forms. diff --git a/apps/docs/src/content/getting-started/configuration.md b/apps/docs/src/content/getting-started/configuration.md index 85c73f2..e47e3d4 100644 --- a/apps/docs/src/content/getting-started/configuration.md +++ b/apps/docs/src/content/getting-started/configuration.md @@ -119,11 +119,11 @@ interface NgDevtoolsConfig { ### Inspectors and agent tools -| Option | Default | What it does | -| -------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| `inspectors.` | `true` | `false` removes the inspector: no tab or dock, no page collector, no RPC functions, and no agent tools or resources. Its actions are blocked too. | -| `agent.readOnly` | `false` | `true` drops every agent tool that acts on the page or the server: `highlight`, `form-action`, `fill-form`, `navigate` and `analog-call-api`. | -| `agent.tools.` | `true` | `false` hides one inspector's agent tools and resources. The tab stays. | +| Option | Default | What it does | +| -------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inspectors.` | `true` | `false` removes the inspector: no tab or dock, no page collector, no RPC functions, and no agent tools or resources. Its actions are blocked too. | +| `agent.readOnly` | `false` | `true` drops every agent tool that acts on the page or the server: `highlight`, `form-action`, `fill-form`, `navigate`, `dispatch-ngrx-action` and `analog-call-api`. | +| `agent.tools.` | `true` | `false` hides one inspector's agent tools and resources. The tab stays. | `agent.tools` has the same keys as `inspectors`. An inspector that is off has no agent tools, whatever `agent.tools` says. @@ -137,7 +137,7 @@ Actions are the writes that the panel and agents make to your app or the server. | ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `actions.forms` | `true` | Form writes: set value, fill, mark touched, untouched, dirty or pristine, touch all, revalidate, reset, enable, disable, submit and restore. Drops `form-action` and `fill-form`. | | `actions.router` | `true` | Navigate, abort and replay. Drops the `navigate` agent tool. | -| `actions.ngrx` | `true` | Restoring NgRx state from the change log. | +| `actions.ngrx` | `true` | Restoring NgRx state from the change log and dispatching `@ngrx/store` actions. Drops the `dispatch-ngrx-action` agent tool. | | `actions.http` | `true` | Editing fault injection rules and clearing the HTTP timeline. | | `actions.analog` | `true` | The Analog request playground. Drops the `analog-call-api` agent tool. | | `actions` | `true` | All of the above. | diff --git a/apps/docs/src/content/getting-started/express.md b/apps/docs/src/content/getting-started/express.md index 3412299..3801cf8 100644 --- a/apps/docs/src/content/getting-started/express.md +++ b/apps/docs/src/content/getting-started/express.md @@ -12,7 +12,7 @@ description: Mount the devtools hub in the Express server of an Angular SSR app. In an *Angular app with server-side rendering, the devtools run inside your Express server. You add a middleware on the server and load the overlay in the browser. - This setup mounts the devtools in the Express server.ts that Angular SSR generates. For an Analog app, follow Vite and Analog instead. + This setup mounts the devtools in the Express server.ts that Angular SSR generates. For an Analog app, follow Vite and Analog instead. For a server on Hono, h3 or Fastify, follow Hono, h3 and Fastify. ## Setup at a glance diff --git a/apps/docs/src/content/getting-started/introduction.md b/apps/docs/src/content/getting-started/introduction.md index 62375a4..3577933 100644 --- a/apps/docs/src/content/getting-started/introduction.md +++ b/apps/docs/src/content/getting-started/introduction.md @@ -71,11 +71,12 @@ The inspectors are exposed as *MCP tools and resources, so a coding agent can re Your app's server hosts the devtools, and a script in the page sends live data to it. A floating button on the page opens the panel next to your app. -| Setup | Server part | Guide | -| ----------------------- | --------------------------- | ----------------------------------------- | -| Angular CLI with SSR | `initNgDevtoolsHub()` | [Angular CLI and Express](./express.md) | -| Analog | The Vite plugin | [Vite and Analog](./vite.md) | -| Chrome DevTools (extra) | One of the two setups above | [Chrome extension](./chrome-extension.md) | +| Setup | Server part | Guide | +| -------------------------- | ----------------------- | ------------------------------------------ | +| Angular CLI with SSR | `initNgDevtoolsHub()` | [Angular CLI and Express](./express.md) | +| SSR on Hono, h3 or Fastify | `initNgDevtoolsHub()` | [Hono, h3 and Fastify](./other-servers.md) | +| Analog | The Vite plugin | [Vite and Analog](./vite.md) | +| Chrome DevTools (extra) | One of the setups above | [Chrome extension](./chrome-extension.md) | ### Outside your app diff --git a/apps/docs/src/content/getting-started/other-servers.md b/apps/docs/src/content/getting-started/other-servers.md new file mode 100644 index 0000000..d1d8053 --- /dev/null +++ b/apps/docs/src/content/getting-started/other-servers.md @@ -0,0 +1,136 @@ +--- +title: Hono, h3 and Fastify +description: Mount the devtools hub in an Angular SSR server built on Hono, h3 or Fastify. +--- + + + Mount the devtools hub in an Angular SSR server that runs on Hono, h3 or Fastify instead of Express. + + +# Hono, h3 and Fastify + +*Angular SSR runs on Hono and h3 through [`createRequestHandler`](https://angular.dev/api/ssr/createRequestHandler), and on Fastify through [`createNodeRequestHandler`](https://angular.dev/api/ssr/node/createNodeRequestHandler). The devtools hub mounts in each of them. The browser part is the same as for Express: load the overlay as shown in [Angular CLI and Express](./express.md#load-the-overlay). + +## Two ways to mount the hub + +`initNgDevtoolsHub()` returns two request handlers for the same routes: + +| Handler | Signature | Outside `devtools.base` | +| ---------------- | ----------------------------------------- | ----------------------- | +| `handler` | `(request: Request) => Promise` | Answers 404. | +| `nodeMiddleware` | `(req, res, next) => void`, Connect style | Calls `next()`. | + +Hono and h3 take web-standard handlers, so they use `handler`. Fastify runs on Node, so it uses `nodeMiddleware`. + +### Route the base to `handler` + +`handler` doesn't fall through. Mount it on a catch-all route under `devtools.base` (`/__devframes/` by default), and register it before your Angular SSR route. Requests outside the base then reach your app. + +## Hono + +```ts +// src/server.ts +import {AngularAppEngine, createRequestHandler} from '@angular/ssr'; +import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub'; +import {Hono} from 'hono'; + +const angularApp = new AngularAppEngine(); +const devtools = initNgDevtoolsHub({ws: false}); +const app = new Hono(); + +app.all(`${devtools.base}*`, (c) => devtools.handler(c.req.raw)); +app.get('*', async (c) => (await angularApp.handle(c.req.raw)) ?? c.notFound()); + +export const reqHandler = createRequestHandler(app.fetch); +``` + +## h3 + +```ts +// src/server.ts +import {createRequestHandler} from '@angular/ssr'; +import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub'; +import {H3} from 'h3'; + +const devtools = initNgDevtoolsHub({ws: false}); +const app = new H3(); + +app.all(`${devtools.base}**`, (event) => devtools.handler(event.req)); +// ... your static files and Angular SSR routes + +export const reqHandler = createRequestHandler(app.fetch); +``` + +This sample uses h3 v2. With h3 v1, wrap the handler in `fromWebHandler()` on a router: ``router.use(`${devtools.base}**`, fromWebHandler(devtools.handler))``. + +## Fastify + +Fastify has no Connect middleware of its own. Hand requests under the base to `nodeMiddleware` in an `onRequest` hook, and call `reply.hijack()` so Fastify leaves the response to the hub: + +```ts +// src/server.ts +import {createNodeRequestHandler} from '@angular/ssr/node'; +import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub'; +import Fastify from 'fastify'; + +const devtools = initNgDevtoolsHub({ws: false}); +const app = Fastify(); + +app.addHook('onRequest', (request, reply, done) => { + if (!request.url.startsWith(devtools.base)) return done(); + reply.hijack(); + devtools.nodeMiddleware(request.raw, reply.raw); +}); +// ... your static files and Angular SSR routes + +export const reqHandler = createNodeRequestHandler(async (req, res) => { + await app.ready(); + app.server.emit('request', req, res); +}); +``` + +The hook runs before Fastify parses the body, so the MCP endpoint at `__mcp` still receives the raw request. + +## Pick a transport + +A web handler never sees WebSocket upgrades, and neither does a server that `ng serve` drives through `reqHandler`. Pick one of these: + +| Setting | Use it when | +| ----------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| `ws: false` | Always works. The browser connects over server-sent events on the same port, including under `ng serve`. | +| `ws: {sidecar: true}` | You want a WebSocket. It runs on its own port, picked automatically. | +| No `ws` option, `devtools.attach(server)` | You start a Node server yourself, such as `serve()` from `@hono/node-server` or Fastify's `app.server`. | + +`attach(server)` routes the server's `upgrade` events to the hub's WebSocket at `__ws`: + +```ts +// src/server.ts +import {serve} from '@hono/node-server'; + +const devtools = initNgDevtoolsHub(); +// ... mount devtools.handler on the Hono app as shown above + +const server = serve({fetch: app.fetch, port: 4000}); +devtools.attach(server); +``` + +The other hub options, access control and the production warning are the same as for Express. See [Hub options](./express.md#hub-options) and [Access control](./express.md#access-control). + +## Troubleshooting + + + + 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). + + + The hub advertises a WebSocket that no upgrade reaches. Pass ws: false, pass ws: {sidecar: true}, or call devtools.attach(server) on the Node server you start. + + + +## Where to next + + + + + + diff --git a/apps/docs/src/content/getting-started/overlay.md b/apps/docs/src/content/getting-started/overlay.md index 4ba9e5c..3f6f398 100644 --- a/apps/docs/src/content/getting-started/overlay.md +++ b/apps/docs/src/content/getting-started/overlay.md @@ -176,7 +176,9 @@ The overlay and the button do not start inside the devtools panel frame, so a mi ## Highlighting -When you hover a component in the devtools, the overlay draws an amber box around its element in the page. The box follows the element and clears after 2 seconds. +When you hover or focus a row in the devtools, the overlay draws an amber box around its element in the page. The box follows the element and stays until the pointer or focus leaves the row. The box also clears when the panel closes, reloads or loses its connection to the dev server. If that clear never reaches the page, the box clears after 60 seconds. A box drawn by the [`highlight` agent tool](../agents/tools.md) clears after 2 seconds. + +While you pick an element on the page, the box follows the pointer and clears when the pointer leaves the page or picking ends. - The box also works for SVG hosts, like `g[app-bar]` in a chart. - A host with `display: contents` has no box of its own, so the box goes around its children. diff --git a/apps/docs/src/content/guides/ngrx-signals-restore.md b/apps/docs/src/content/guides/ngrx-signals-restore.md index c7224af..7b6842d 100644 --- a/apps/docs/src/content/guides/ngrx-signals-restore.md +++ b/apps/docs/src/content/guides/ngrx-signals-restore.md @@ -124,7 +124,7 @@ export const appConfig: ApplicationConfig = { ``` - Without provideStoreDevtools(), the action log is read-only. + Without provideStoreDevtools(), action log entries cannot be restored. ## Where to next diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md index 9f88c44..efaa5cd 100644 --- a/apps/docs/src/content/inspectors/components.md +++ b/apps/docs/src/content/inspectors/components.md @@ -35,7 +35,7 @@ The page keeps the selection, so the panel, the page and the agent tools share i If the selected component is destroyed, for example by a route change or an item leaving a list, the detail pane says **The selected component was destroyed** and the selection clears. If the row had keyboard focus, focus moves to the next row, or to the row before it when the removed row was last. -The tree shows up to 2000 components, and walks up to 256 levels of DOM nesting. Past either limit, a notice says the page has more components than the tree shows. +The tree shows up to 2000 component instances, and walks up to 256 levels of DOM nesting. Past either limit, a notice names the limit, for example **Showing the first 2000 component instances. Others are not listed or searchable.**, and the count reads **2000+ instances**. The filter only searches the listed instances, so a component past the limit shows **No components match**. The [`inspect-component` and `highlight` tools](#agent-tools) say the same when they find no match on a cut-off tree. ### Detail header @@ -47,7 +47,7 @@ When a form exists in the same source file, a **Show … in Forms** button opens - **Change detection**: `OnPush` or `Eager`. - **Encapsulation**: `Emulated`, `None`, `ShadowDom` or `IsolatedShadowDom`. -- **Host path**: where the host element sits in the page. +- **Host path**: where the host element sits in the page, as the chain of component hosts from the root. When a component renders several hosts with the same tag, for example cards in a `@for` list wrapped in `
  • `, each one gets its position among them, like `app-list > app-card[2]`. - **Routed**: for routed components, the route and the outlet that rendered it. A fact shows **Unknown** when Angular does not report it. diff --git a/apps/docs/src/content/inspectors/dashboard.md b/apps/docs/src/content/inspectors/dashboard.md index 9aea249..ca3a99a 100644 --- a/apps/docs/src/content/inspectors/dashboard.md +++ b/apps/docs/src/content/inspectors/dashboard.md @@ -17,12 +17,13 @@ The Dashboard opens by default. The top block describes your workspace. The card The top block shows the project name and a chip for each of these: -| Chip | Shows | -| -------------- | ---------------------------------------------- | -| **Angular** | The installed Angular version. | -| **TypeScript** | The installed TypeScript version. | -| **SSR** | **On** or **Off**. | -| **Analog** | The Analog version. Shown in Analog apps only. | +| Chip | Shows | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Angular** | The installed Angular version. | +| **TypeScript** | The installed TypeScript version. | +| **SSR** | **On** or **Off**. | +| **Analog** | The Analog version. Shown in Analog apps only. | +| **Change detection** | **Zoneless**, **zone.js**, or **Zoneless, zone.js loaded** when the app is zoneless but still loads zone.js. Shown once a page reports its injectors. | ### Inspector cards @@ -45,7 +46,7 @@ A card shows **Counting…** while it loads. It shows **Count unavailable** when ### Configuration block -Below the cards, the **Configuration** block lists the devtools options that differ from the defaults, such as **Inspectors off**, **Blocked actions** and **Limits**. It says **Defaults** when nothing is changed. See [Configuration](../getting-started/configuration.md#check-the-active-configuration). +Below the cards, the **Configuration** block lists the devtools options that differ from the defaults, such as **Inspectors off**, **Blocked actions** and **Limits**. It says **Defaults** when nothing is changed. Until the panel connects, the block says **Loading…**, the stat cards stay hidden and the tab strip shows only **Dashboard** and the open tab, since the panel doesn't know yet which inspectors are on. See [Configuration](../getting-started/configuration.md#check-the-active-configuration). ## Where the data comes from @@ -61,6 +62,10 @@ The project name comes from `angular.json`. The devtools pick `defaultProject` w SSR is **On** when the build options of that project set `ssr` or `server`, or when it has a `server` target (Angular Universal). The devtools read `architect` in `angular.json` and `targets` in `project.json`. For *Analog apps, SSR follows the `ssr` option of `analog()`. +### Change detection mode + +The **Change detection** chip reads the running page, not the workspace. The page checks the `NgZone` its root injector created: Angular provides a no-op zone for zoneless apps and a real one with `provideZoneChangeDetection`. It also checks whether `Zone` is defined on the page. The chip comes from the [Injectors](./injectors.md) inspector, so it is hidden when that inspector is off. See [Zoneless](https://angular.dev/guide/zoneless) on angular.dev. + ### Counts The Components, Routes, NgRx and Pipes cards count the source scan. The Signals and Injectors cards use the live page when one is connected, and the source scan otherwise. Opened from the popup or the Chrome extension, they count the page the Dashboard belongs to, like the Signals and Injectors tabs. Opened on its own, they count the page that reported last. The live Signals count covers the graph of the one component the [Signals tab](./signals.md) shows, and counts its signals, computeds, linked signals and effects. diff --git a/apps/docs/src/content/inspectors/forms.md b/apps/docs/src/content/inspectors/forms.md index 9e9418a..59220ab 100644 --- a/apps/docs/src/content/inspectors/forms.md +++ b/apps/docs/src/content/inspectors/forms.md @@ -68,7 +68,7 @@ If the devtools server does not answer, the Submit view, the Lint view and the f The actions bar works on the selected form: - **Touch all**, **Revalidate** and **Focus first invalid**. -- **Pick field on page**: click a field in the app to select it. Esc cancels. +- **Pick field on page**: click a field in the app to select it. While picking, the button reads **Cancel picking**. Press it, or Escape in the panel or the app, to stop. The pick also stops after 12 seconds. - **Snapshot** saves the form's values as `s1`, `s2` and so on. **Restore** puts back the latest one. The button shows its name, like **Restore s2**. - **Reset** and **Submit**. diff --git a/apps/docs/src/content/inspectors/injectors.md b/apps/docs/src/content/inspectors/injectors.md index 93cee24..85831a5 100644 --- a/apps/docs/src/content/inspectors/injectors.md +++ b/apps/docs/src/content/inspectors/injectors.md @@ -37,6 +37,10 @@ Select an injector to see the **Lookup path**: the injectors Angular asks, in or For element injectors, **Injected here** lists each token requested at this level and the injector that answered. The block marks a token that nobody provides as **not provided anywhere**, and an optional token that nobody provides as **optional, not provided**. A provider with a `null` value, such as `useValue: null`, still counts as provided. When the element has more than one class, each row says which class asked. +### Injected by its services + +For environment injectors, **Injected by its services** lists what the services this injector created inject, and which injector answered. Each row says which service asked. Services that Angular has not created yet are left out, because reading their dependencies would create them. A `providedIn: 'root'` service shows on the root injector once something injects it. + ### Provides **Provides** lists each provider with its kind: `useClass`, `useValue`, `useFactory` or `useExisting`. A bare class shows as `useClass`. Chips mark **viewProviders** and **multi** providers. Providers that come from imported modules show the import path, as `via A › B`. @@ -107,11 +111,11 @@ Arrow keys, Home and End move the selection through the tree. The right arrow ex ## Agent tools -| Tool or resource | Kind | What it does | -| ------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| `ng-devtools:get-providers` | tool | DI providers from source: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays. | -| `ng-devtools:inspect-providers` | tool | The injector tree a page reported. `selector` narrows it to matching element injectors, `token` to where a token is provided and injected. | -| `ng-devtools:injector-tree` | resource | The live tree last reported by a page. | +| Tool or resource | Kind | What it does | +| ------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ng-devtools:get-providers` | tool | DI providers from source: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays. | +| `ng-devtools:inspect-providers` | tool | The injector tree a page reported, with what components and created services inject. `selector` narrows it to matching element injectors, `token` to where a token is provided and injected. | +| `ng-devtools:injector-tree` | resource | The live tree last reported by a page. | See [Tools](../agents/tools.md) and [Resources](../agents/resources.md). diff --git a/apps/docs/src/content/inspectors/ngrx-store.md b/apps/docs/src/content/inspectors/ngrx-store.md index 9287d89..905d27b 100644 --- a/apps/docs/src/content/inspectors/ngrx-store.md +++ b/apps/docs/src/content/inspectors/ngrx-store.md @@ -1,10 +1,10 @@ --- title: NgRx Store -description: Live NgRx signal stores and @ngrx/store state, with change logs, diffs and restore. +description: Live NgRx signal stores and @ngrx/store state, with change logs, diffs, restore and dispatch. --- - Your NgRx state as it changes. Signal stores and the classic Store, with a log of every change, a diff per entry, and restore. + Your NgRx state as it changes. Signal stores and the classic Store, with a log of every change, a diff per entry, restore and dispatch. # NgRx Store @@ -30,7 +30,7 @@ The tab labels a signal store with the matching declaration name from your sourc Select a store to see: - Its kind, scope and declaring file. The file appears when the store's state keys match a `signalStore` or `signalState` in your source. -- **Store DevTools on** or **read-only**, for the classic Store. +- **Store DevTools on** or **Store DevTools off**, for the classic Store. - **Referenced by**: the component fields that hold it. - **State**, **Computed** and **Methods**, with a call count per method. The tab tags `rxMethod` members. @@ -44,7 +44,11 @@ Signal stores get a **Change log**. The classic Store gets an **Action log**. Ea | `effect` | An NgRx effect. Effects send their actions through `Store.next`. | | `reactive` | `store.dispatch(() => action)`, which dispatches again when a signal changes. | -Open an entry to see its arguments, or the action and its **Origin** for the classic Store, and a **State diff** with the value before and after each change. The diff lists up to 50 changes. +Open an entry to see its arguments, or the action and its **Origin** for the classic Store, and a **State diff** with the value before and after each change. The diff lists up to 50 changes. An action entry also has **Dispatch again**. + +### Dispatch an action + +The classic Store gets a **Dispatch an action** form under the action log. **Type** suggests the action types from your source and the log. **Payload** takes the action props as a JSON object, like `{"id": 7}`, and cannot have a `type` key. **Dispatch** sends the action through `store.dispatch`, so the log gets a `dispatch` entry and the tab selects it. ### Source declarations @@ -52,7 +56,7 @@ The server scans your files for: - `signalStore` with its `withState`, `withComputed`, `withMethods`, `withProps`, `withHooks`, `withEntities` and `rxMethod` members. - `signalState` and `signalMethod`. -- `createAction`, `createActionGroup`, `createReducer`, `createEffect`, `createSelector`, `createFeatureSelector` and `createFeature`. +- `createAction`, `createActionGroup`, `createReducer`, `createEffect`, `createSelector`, `createFeatureSelector` and `createFeature`. An action shows its type strings, like `[Cart] Add Item`, when they are string literals. - Store setup: `provideStore`, `provideState`, `provideEffects`, and the `StoreModule` and `EffectsModule` calls. Filter by kind with the chips. @@ -117,18 +121,32 @@ The overlay finds stores through Angular's debug API, so the live section needs Restore sets every state key that differs back to its value right after that change. Every state signal must be writable. - Restore uses Store DevTools to jump to the state right after that action, and the log gets a Restore #N entry. Unless you restored the newest action, the store is then paused on that state: a Viewing a past state banner appears, and new actions are logged but do not change the state. Select Back to latest to resume. It needs provideStoreDevtools(). Without it, the log is read-only. + Restore uses Store DevTools to jump to the state right after that action, and the log gets a Restore #N entry. Unless you restored the newest action, the store is then paused on that state: a Viewing a past state banner appears, and new actions are logged but do not change the state. Select Back to latest to resume. It needs provideStoreDevtools(). Without it, entries cannot be restored, but you can still dispatch actions. +### Replay an action + + + + Pick an entry in the Action log. + + + Click Dispatch again. The Store gets a copy of the same action, and the log gets a new entry with its diff. + + + +To try another payload, type the action in **Dispatch an action** instead. + ## Agent tools -| Tool or resource | Kind | What it does | -| ---------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- | -| `ng-devtools:get-ngrx-store` | tool | NgRx declarations from source, with the members of each `signalStore`. | -| `ng-devtools:ngrx-store` | resource | The live stores per page, with state, computeds, methods, references and the change log. Classic Store actions carry an `origin`. | +| Tool or resource | Kind | What it does | +| ---------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `ng-devtools:get-ngrx-store` | tool | NgRx declarations from source, with the members of each `signalStore` and the type strings of each action. | +| `ng-devtools:dispatch-ngrx-action` | tool | Dispatches an action to the classic Store, or an action from the log again, and returns the new log entry. | +| `ng-devtools:ngrx-store` | resource | The live stores per page, with state, computeds, methods, references and the change log. Classic Store actions carry an `origin`. | -Agent access is read-only. No tool can restore a state. See [Tools](../agents/tools.md) and [Resources](../agents/resources.md). +No tool can restore a state. See [Dispatch an action](../agents/tools.md#dispatch-an-action) and [Resources](../agents/resources.md). ## Limits and gotchas @@ -152,6 +170,10 @@ The devtools replace state keys with secret-looking names with `[redacted]`, at The origin comes from the Store calls made while the page is connected. A `store.dispatch(() => action)` that started before the overlay connected shows as `dispatch`. An action sent straight to `ActionsSubject` has no origin. +### Write actions + +Restore, **Back to latest**, **Dispatch** and **Dispatch again** need [`actions.ngrx`](../getting-started/configuration.md#actions). With it off, the panel disables them and the server refuses them. + ### Log size The log keeps the last 200 entries. Set the count with [`limits.changeLog`](../getting-started/configuration.md#limits). Once older entries are dropped, the log says how many. The overlay logs a method call that changes nothing at most once per second. @@ -160,7 +182,13 @@ The log keeps the last 200 entries. Set the count with [`limits.changeLog`](../g - Store DevTools is not set up, so the log is read-only. The store detail shows read-only. Add provideStoreDevtools() to the app config. + Store DevTools is not set up, so entries cannot be restored. The store detail shows Store DevTools off. Add provideStoreDevtools() to the app config. + + + Store DevTools no longer holds it. The entry says Store DevTools no longer holds this action. With maxAge set, Store DevTools keeps only the last maxAge actions, while the log keeps 200 entries. Raise maxAge in provideStoreDevtools() to restore further back. Committing, resetting or importing the history in the Redux DevTools extension also removes the older actions, and no setting brings them back. + + + Store DevTools skipped it. An actionsBlocklist, actionsSafelist or predicate option filtered it out, or recording was paused in the Redux DevTools extension. The entry says Store DevTools never recorded this action. Change the filter so Store DevTools records the action next time. The entry fell out of the 200-entry log in the page. Pick a newer entry. diff --git a/apps/docs/src/content/inspectors/router.md b/apps/docs/src/content/inspectors/router.md index 5db808b..2d222da 100644 --- a/apps/docs/src/content/inspectors/router.md +++ b/apps/docs/src/content/inspectors/router.md @@ -21,7 +21,7 @@ The route the page is on: - The navigation in flight, with an **Abort** button. - The document title, query params and fragment. - **Active routes**: each active route with its component, params, data, and guards and resolvers. Tags mark lazy routes, inherited params, and whether a data value is static, resolved or inherited. The title row says when the title is inherited. -- **Outlets**: the outlet tree, with the inputs the router binds to each component. +- **Outlets**: the outlet tree, with the inputs the router binds to each component and the `routerOutletData` each outlet passes (what the routed component reads with `inject(ROUTER_OUTLET_DATA)`). The data shows as a redacted preview of at most 300 characters. ### Navigations @@ -34,7 +34,7 @@ Every navigation as one story: - Router warnings, and the cancel or error reason. The tab explains NG04xxx errors. - When the navigation error handler redirects, the navigation names the error handler as the cause and keeps the error that triggered it, with its error code. -Filter by URL, or check **Only problems** to keep the navigations that did not succeed and the ones in a loop. Each row has **Replay** and **Copy repro** (a markdown repro). **Export JSON** saves the list. +Filter by URL, or check **Only problems** to keep the navigations that did not succeed and the ones in a loop. Each row has **Replay** and **Copy repro** (a markdown repro). **Replay** is off for a navigation whose URL is redacted or not relative, and a note under the row says why. **Export JSON** saves the list. ### Loop detection @@ -58,9 +58,11 @@ The live route config. The tab merges lazy children in once they load, and marks - **Test a URL** and click **Predict** to see which route matches it, or the nearest ones. - **Probe in app** runs the real matcher without navigating. -- Fill in the params of a route and click **Go** to navigate to it. +- Fill in the params of a route and click **Go** to navigate to it. With a param left empty, **Go** marks the empty field and names the params to fill in. - **Read lazy** reads the routes of a lazy route that has not loaded. +The result of **Go** and **Read lazy** shows under the row you clicked. + ### Setup How the router is set up: `provideRouter` or `forRoot`, the effective options with **set** or **default** badges, the enabled features, the strategies, the base href and hydration. @@ -198,7 +200,7 @@ Without that recording, the guards listed for a navigation are candidates: the ` ### Guard recording is on by default -**Record each guard and resolver** in the **Navigations** view starts checked. Uncheck it to stop. Turning it off puts every original guard and resolver back. The page keeps the choice per browser tab, in `sessionStorage`, so it survives a reload. Agents use `navigate` with `action: "instrument"` and `on`. +**Record each guard and resolver** in the **Navigations** view starts checked. Uncheck it to stop. Turning it off puts every original guard and resolver back. The page keeps the choice per browser tab, in `sessionStorage`, so it survives a reload. If the page does not answer, the checkbox returns to its previous state and the view shows the error. Agents use `navigate` with `action: "instrument"` and `on`. ### Setup kind on Angular 20.0 to 20.3.4 diff --git a/apps/docs/src/content/inspectors/signals.md b/apps/docs/src/content/inspectors/signals.md index ae8c10d..9a7c237 100644 --- a/apps/docs/src/content/inspectors/signals.md +++ b/apps/docs/src/content/inspectors/signals.md @@ -42,6 +42,8 @@ Expand a card to see: - **Consumers**: the nodes and effects that read it. - **Value history**: recent values, newest first, each with a time and a source tag. +Click an entry under **Dependencies (producers)** or **Consumers** to open that node's card and move focus to it. If the name or kind filter hides the node, the tab clears both filters and says so. An internal signal of a resource opens the resource card. Unnamed nodes show their id, so this is the way to reach them. + ### Resources Angular builds each `resource()`, `httpResource()` and `rxResource()` from several internal signals, labeled `Resource#name.value`, `Resource#name.state` and so on. The tab folds them into one card under **Resources**, and leaves them out of the **Signals** list. Each card shows: @@ -94,10 +96,22 @@ Angular doesn't send a value for `linkedSignal` nodes. The overlay takes it from ### Exact and sampled values -Exact **set** entries come from a hook on signal writes. The overlay matches a write to a node by its label, so only signals with a `debugName` get exact entries. It samples everything else each time it reads the page, as **sampled** entries. +Exact **set** entries come from a hook on signal writes. The overlay matches a write to a node by its name, kind, version and value. It samples everything else each time it reads the page, as **sampled** entries. + +In a development build, the Angular compiler names most signals for you. It adds a `debugName` to `signal()`, `computed()`, `linkedSignal()`, `input()`, `model()`, queries, `effect()`, `resource()` and `httpResource()` when the call initializes a class field, a `this.name =` assignment or a variable. The name is the field or variable name. + +Entries are sampled instead of exact in these cases: + +| Case | Why | +| ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | +| A `computed()` | Nothing writes it, so there is no write to hook. Computeds always show sampled entries. | +| A signal created without a field or variable, such as `return signal(0)` or `{ count: signal(0) }` | The compiler has no name to add. | +| A signal a library creates, when the library was built without the name | The signal has no `debugName`. | +| Several live signals with the same name, kind, version and value, such as one component rendered twice | The overlay cannot tell which node the write belongs to. | +| The write hook did not load | The tab shows a notice: **The signal write hook did not load.** | - - Pass a debugName to signal() to get exact history entries and a readable label on the card. + + If a signal comes from a factory or helper that returns it directly, pass a debugName in its options, for example signal(0, { debugName: 'count' }). ## How to use it @@ -112,7 +126,7 @@ Exact **set** entries come from a hook on signal writes. The overlay matches a w Expand its card and read Dependencies (producers). - Open each producer. The one with a change at the same time is the cause. + Click each producer to open it. The one with a change at the same time is the cause. @@ -181,7 +195,7 @@ When the picked component is gone or has no graph, a notice appears and the tab The default follows the deepest component in the primary router outlet. It skips named outlets. Pick the component yourself to pin it. - Exact entries need a debugName on the signal. Without one, the overlay samples values each time it reads the page. + Computeds are never written, so their entries are always sampled. For a signal, check the notice at the top of the tab: if the write hook did not load, every entry is sampled. Otherwise the signal likely has no name, because a factory or helper created it without a field or variable. Pass a debugName in its options. See Exact and sampled values. A computed that nothing has read yet has no value. It fills in after its first read. diff --git a/apps/docs/src/content/inspectors/ssr-http.md b/apps/docs/src/content/inspectors/ssr-http.md index 9c92b0c..224dc55 100644 --- a/apps/docs/src/content/inspectors/ssr-http.md +++ b/apps/docs/src/content/inspectors/ssr-http.md @@ -63,6 +63,8 @@ Add a rule with these fields: A status of 400 or more fails the request with an `HttpErrorResponse`. A lower status returns the body as a mocked response. A body without a status returns it with status 200. A rule with only a delay passes the request through, later. A rule needs a status, a delay or a body, so **Add rule** stays off until it has one. The form clears after each added rule. The first enabled rule that matches wins. +The body follows the request's `responseType`. A `json` request gets the parsed JSON (or the raw string when it does not parse) with `content-type: application/json`. A `text` request gets the string with `text/plain`. A `blob` request gets a `Blob`, and an `arraybuffer` request an `ArrayBuffer`, both with `application/octet-stream`. The same value is the `error` of an injected failure. + ### Hydration - Whether hydration is on. diff --git a/apps/docs/src/content/security.md b/apps/docs/src/content/security.md index 8839bef..62ffa1c 100644 --- a/apps/docs/src/content/security.md +++ b/apps/docs/src/content/security.md @@ -135,7 +135,9 @@ A field's value is replaced with `[redacted]` when the field: - has a password, one-time-code or credit-card `autocomplete`, - sits inside `.sentry-mask`, `.rr-mask`, `[data-private]` or `[data-ng-devtools="mask"]`, - has a name that contains a secret word (password, token, card, cvv, apiKey and similar), or a name listed in `mask`, or -- sits inside a group or array whose name contains a secret word. The panel marks these fields `redacted (parent)`. +- sits inside a group or array whose name contains a secret word. + +The Fields view says why a field is redacted: **name looks secret**, **password input**, **autocomplete is a secret kind**, **marked as mask**, **inside a secret group** or **listed in mask**. The field details say the same where the Set editor is hidden, with a link to this section. Those values are also removed from error messages. The devtools don't write secret fields unless you unmask them (see [Opt fields in or out](#opt-fields-in-or-out)). Other values are sent as they are, so keep real credentials out of forms you inspect. @@ -160,6 +162,8 @@ You can also name secret and unmasked fields on the server, with the `redaction` Unmasking also changes what the devtools can write. A key listed in `unmask` on `window` can be written. The element marker only lifts the checks that come from the element (password type, `autocomplete` and mask markers), so a field with a secret-looking name is still not written. +A refused write names the reason and the unmask that lifts it. The panel, `form-action` and `fill-form` show the same message. + password, passwd, passphrase, passcode, pass, pwd, secret, token, otp, totp, pin, cvv, cvc, csc, ssn, iban, card, cc, credential, credentials, cookie, authorization and jwt. Names are split on camelCase and punctuation, so userPassword and card_number both match. The pairs apiKey, privateKey, secretKey, accessKey, ccNum, ccNumber, securityCode, sessionId and sessionKey match as well. Every inspector uses this list. diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts index 2448c0a..b718647 100644 --- a/apps/docs/src/ngmd.config.ts +++ b/apps/docs/src/ngmd.config.ts @@ -174,6 +174,7 @@ const config: NgmdConfig = { {label: 'Introduction', href: '/getting-started/introduction'}, {label: 'Installation', href: '/getting-started/installation'}, {label: 'Angular CLI and Express', href: '/getting-started/express'}, + {label: 'Hono, h3 and Fastify', href: '/getting-started/other-servers', status: 'new'}, {label: 'Vite and Analog', href: '/getting-started/vite'}, {label: 'Standalone CLI', href: '/getting-started/cli'}, {label: 'Configuration', href: '/getting-started/configuration', status: 'new'}, diff --git a/extension/ui/assets/browser-agent-rpc-BXhoSh1z-Cfmnc8tc.js b/extension/ui/assets/browser-agent-rpc-BXhoSh1z-CkzEjDUc.js similarity index 93% rename from extension/ui/assets/browser-agent-rpc-BXhoSh1z-Cfmnc8tc.js rename to extension/ui/assets/browser-agent-rpc-BXhoSh1z-CkzEjDUc.js index 0f85c4d..78272fc 100644 --- a/extension/ui/assets/browser-agent-rpc-BXhoSh1z-Cfmnc8tc.js +++ b/extension/ui/assets/browser-agent-rpc-BXhoSh1z-CkzEjDUc.js @@ -1 +1 @@ -import{t as e}from"./index-CT4NGk62.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a).catch(()=>{}))}))},s=a(o),l=e.events.on(`connection:status`,e=>{e===`connected`&&o()});return o(),()=>{n=!0,s(),l()}}export{l as setupBrowserAgentRpcBridge}; \ No newline at end of file +import{t as e}from"./index-DnyDdE8h.js";var t=Symbol.for(`devframe:browser-agent-registry`),{tools:n,listeners:r}=globalThis[t]??={tools:new Map,listeners:new Set};function i(){return[...n.values()]}function a(e){return r.add(e),()=>r.delete(e)}var o=`devframe:client-id`,s;function c(t=globalThis.window){try{let n=t?.sessionStorage;if(n){let t=n.getItem(o);return t||(t=e(),n.setItem(o,t)),t}}catch{}return s??=e(),s}function l(e){e.client.register({name:`devframe:agent:invoke-client-tool`,type:`action`,jsonSerializable:!0,handler:async(e,t)=>{let n=i().find(t=>t.id===e);if(!n)throw Error(`[devframe/agent] browser tool "${e}" not found`);return await n.invoke(t)}});let t=!1,n=!1,r=0,o=()=>{t||n||(t=!0,queueMicrotask(async()=>{if(t=!1,n)return;let a=i().map(({invoke:e,...t})=>t);(a.length!==0||r!==0)&&(r=a.length,await e.callOptional(`devframe:agent:sync-client-tools`,c(),a).catch(()=>{}))}))},s=a(o),l=e.events.on(`connection:status`,e=>{e===`connected`&&o()});return o(),()=>{n=!0,s(),l()}}export{l as setupBrowserAgentRpcBridge}; \ No newline at end of file diff --git a/extension/ui/assets/index-CT4NGk62.js b/extension/ui/assets/index-DnyDdE8h.js similarity index 69% rename from extension/ui/assets/index-CT4NGk62.js rename to extension/ui/assets/index-DnyDdE8h.js index 0dae4fe..b663c9b 100644 --- a/extension/ui/assets/index-CT4NGk62.js +++ b/extension/ui/assets/index-DnyDdE8h.js @@ -3,12 +3,12 @@ \r \v ᠎ - \u2028\u2029   `;`${tn}`,`${tn}`;var nn=(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})(nn||{}),rn=(function(e){return e[e.Plain=0]=`Plain`,e[e.TemplateLiteralPart=1]=`TemplateLiteralPart`,e[e.TemplateLiteralEnd=2]=`TemplateLiteralEnd`,e})(rn||{});nn.Character,S.StyleMap,S.ClassMap,S.StyleProp,S.ClassProp,S.Attribute,S.Property,S.Attribute,S.Control,S.DomProperty,S.DomProperty,S.Attribute,S.StyleMap,S.ClassMap,S.StyleProp,S.ClassProp,S.Listener,S.TwoWayListener,S.AnimationListener,S.StyleMap,S.ClassMap,S.StyleProp,S.ClassProp,S.Property,S.TwoWayProperty,S.DomProperty,S.Attribute,S.Animation,S.Control,Xt.Idle,x.deferOnIdle,x.deferPrefetchOnIdle,x.deferHydrateOnIdle,Xt.Immediate,x.deferOnImmediate,x.deferPrefetchOnImmediate,x.deferHydrateOnImmediate,Xt.Timer,x.deferOnTimer,x.deferPrefetchOnTimer,x.deferHydrateOnTimer,Xt.Hover,x.deferOnHover,x.deferPrefetchOnHover,x.deferHydrateOnHover,Xt.Interaction,x.deferOnInteraction,x.deferPrefetchOnInteraction,x.deferHydrateOnInteraction,Xt.Viewport,x.deferOnViewport,x.deferPrefetchOnViewport,x.deferHydrateOnViewport,Xt.Never,x.deferHydrateNever,x.deferHydrateNever,x.deferHydrateNever,x.pipeBind1,x.pipeBind2,x.pipeBind3,x.pipeBind4,x.textInterpolate,x.textInterpolate1,x.textInterpolate2,x.textInterpolate3,x.textInterpolate4,x.textInterpolate5,x.textInterpolate6,x.textInterpolate7,x.textInterpolate8,x.textInterpolateV,x.interpolate,x.interpolate1,x.interpolate2,x.interpolate3,x.interpolate4,x.interpolate5,x.interpolate6,x.interpolate7,x.interpolate8,x.interpolateV,x.pureFunction0,x.pureFunction1,x.pureFunction2,x.pureFunction3,x.pureFunction4,x.pureFunction5,x.pureFunction6,x.pureFunction7,x.pureFunction8,x.pureFunctionV,x.resolveWindow,x.resolveDocument,x.resolveBody,rt.HTML,x.sanitizeHtml,rt.RESOURCE_URL,x.sanitizeResourceUrl,rt.SCRIPT,x.sanitizeScript,rt.STYLE,x.sanitizeStyle,rt.URL,x.sanitizeUrl,rt.ATTRIBUTE_NO_BINDING,x.validateAttribute,rt.HTML,x.trustConstantHtml,rt.RESOURCE_URL,x.trustConstantResourceUrl;var an=(function(e){return e[e.None=0]=`None`,e[e.ViewContextRead=1]=`ViewContextRead`,e[e.ViewContextWrite=2]=`ViewContextWrite`,e[e.SideEffectful=4]=`SideEffectful`,e})(an||{});C.Tmpl,C.Tmpl,C.Both,C.Host,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Both,C.Both,C.Tmpl,C.Both,C.Both,C.Tmpl,C.Both,C.Tmpl,C.Both,C.Both,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Both,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Both,C.Both,C.Tmpl,C.Tmpl,C.Both,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Both,C.Tmpl,C.Both,C.Both,C.Both,C.Both,C.Both,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Tmpl,C.Both,C.Tmpl,C.Both,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Tmpl,C.Both,C.Both,C.Both,Pt.Property,Gt.Property,Pt.TwoWay,Gt.TwoWayProperty,Pt.Attribute,Gt.Attribute,Pt.Class,Gt.ClassName,Pt.Style,Gt.StyleProperty,Pt.LegacyAnimation,Gt.LegacyAnimation,Pt.Animation,Gt.Animation;var on=`%COMP%`;`${on}`,`${on}`,class e{static SINGLETON=new e;static veWillInferAnyFor(t){let n=e.SINGLETON;return t instanceof Nt?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 sn=null,cn=!1,ln=1,un=null,dn=Symbol(`SIGNAL`);function w(e){let t=sn;return sn=e,t}function fn(){return sn}var pn={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 mn(e){if(cn)throw Error(``);if(sn===null)return;sn.consumerOnSignalRead(e);let t=sn.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=sn.recomputing;if(r&&(n=t===void 0?sn.producers:t.nextProducer,n!==void 0&&n.producer===e)){sn.producersTail=n,n.lastReadVersion=e.version,n.knownValidAtEpoch=ln;return}let i=e.consumersTail;if(i!==void 0&&i.consumer===sn&&(!r||i.knownValidAtEpoch===ln))return;let a=kn(sn),o={producer:e,consumer:sn,nextProducer:n,prevConsumer:void 0,knownValidAtEpoch:ln,lastReadVersion:e.version,nextConsumer:void 0};sn.producersTail=o,t===void 0?sn.producers=o:t.nextProducer=o,a&&Dn(e,o)}function hn(){ln++}function gn(e){if((!kn(e)||e.dirty)&&(e.dirty||e.lastCleanEpoch!==ln)){if(!e.producerMustRecompute(e)&&!Tn(e)){bn(e);return}e.producerRecomputeValue(e),bn(e)}}function _n(e){if(e.consumers===void 0)return;let t=cn;cn=!0;try{for(let t=e.consumers;t!==void 0;t=t.nextConsumer){let e=t.consumer;e.dirty||yn(e)}}finally{cn=t}}function vn(){return sn?.consumerAllowSignalWrites!==!1}function yn(e){e.dirty=!0,_n(e),e.consumerMarkedDirty?.(e)}function bn(e){e.dirty=!1,e.lastCleanEpoch=ln}function xn(e){return e&&Sn(e),w(e)}function Sn(e){if(e.producersTail?.knownValidAtEpoch===ln){let t=e.producers;for(;t!==void 0;)t.knownValidAtEpoch=null,t=t.nextProducer}e.producersTail=void 0,e.recomputing=!0}function Cn(e,t){w(t),e&&wn(e)}function wn(e){e.recomputing=!1;let t=e.producersTail,n=t===void 0?e.producers:t.nextProducer;if(n!==void 0){if(kn(e))do n=On(n);while(n!==void 0);t===void 0?e.producers=void 0:t.nextProducer=void 0}}function Tn(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let e=t.producer,n=t.lastReadVersion;if(n!==e.version||(gn(e),n!==e.version))return!0}return!1}function En(e){if(kn(e)){let t=e.producers;for(;t!==void 0;)t=On(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function Dn(e,t){let n=e.consumersTail,r=kn(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)Dn(t.producer,t)}function On(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,!kn(t)){let e=t.producers;for(;e!==void 0;)e=On(e)}return n}function kn(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function An(e){un?.(e)}function jn(e,t){return Object.is(e,t)}function Mn(e,t){let n=Object.create(In);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(gn(n),mn(n),n.value===Fn)throw n.error;return n.value};return r[dn]=n,An(n),r}var Nn=Symbol(`UNSET`),Pn=Symbol(`COMPUTING`),Fn=Symbol(`ERRORED`),In={...pn,value:Nn,dirty:!0,error:null,equal:jn,kind:`computed`,producerMustRecompute(e){return e.value===Nn||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw Error(``);let t=e.value;e.value=Pn;let n=xn(e),r,i=!1;try{r=e.computation(),w(null),i=t!==Nn&&t!==Fn&&r!==Fn&&e.equal(t,r)}catch(t){r=Fn,e.error=t}finally{Cn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function Ln(){throw Error()}var Rn=Ln;function zn(e){Rn(e)}function Bn(e){Rn=e}var Vn=null;function Hn(e,t){let n=Object.create(Kn);n.value=e,t!==void 0&&(n.equal=t);let r=()=>Un(n);return r[dn]=n,An(n),[r,e=>Wn(n,e),e=>Gn(n,e)]}function Un(e){return mn(e),e.value}function Wn(e,t){vn()||zn(e),e.equal(e.value,t)||(e.value=t,qn(e))}function Gn(e,t){vn()||zn(e),Wn(e,t(e.value))}var Kn={...pn,equal:jn,value:void 0,kind:`signal`};function qn(e){e.version++,hn(),_n(e),Vn?.(e)}var Jn={...pn,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:`effect`};function Yn(e){if(e.dirty=!1,e.version>0&&!Tn(e))return;e.version++;let t=xn(e);try{e.cleanup(),e.fn()}finally{Cn(e,t)}}var Xn=void 0;function Zn(){return Xn}function Qn(e){let t=Xn;return Xn=e,t}var $n=Symbol(`NotFound`);function er(e){return e===$n||e?.name===`ɵNotFound`}function tr(e,t,n){let r=Object.create(ir);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(gn(r),mn(r),r.value===Fn)throw r.error;return r.value};return i[dn]=r,An(r),i}function nr(e,t){gn(e),Wn(e,t),bn(e)}function rr(e,t){if(gn(e),e.value===Fn)throw e.error;Gn(e,t),bn(e)}var ir={...pn,value:Nn,dirty:!0,error:null,equal:jn,kind:`linkedSignal`,producerMustRecompute(e){return e.value===Nn||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw Error(``);let t=e.value;e.value=Pn;let n=xn(e),r,i=!1;try{let n=e.source(),a=t!==Nn&&t!==Fn,o=a?{source:e.sourceValue,value:t}:void 0;r=e.computation(n,o),e.sourceValue=n,w(null),i=a&&r!==Fn&&e.equal(t,r)}catch(t){r=Fn,e.error=t}finally{Cn(e,n)}if(i){e.value=t;return}e.value=r,e.version++}};function ar(e){let t=w(null);try{return e()}finally{w(t)}}var or=function(e,t){return or=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])},or(e,t)};function sr(e,t){if(typeof t!=`function`&&t!==null)throw TypeError(`Class extends value `+String(t)+` is not a constructor or null`);or(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}function cr(e){var t=typeof Symbol==`function`&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length==`number`)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw TypeError(t?`Object is not iterable.`:`Symbol.iterator is not defined.`)}function lr(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 ur(e,t,n){if(n||arguments.length===2)for(var r=0,i=t.length,a;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,i=n.isStopped,a=n.observers;return r||i?gr:(this.currentObservers=null,a.push(e),new hr(function(){t.currentObservers=null,mr(a,e)}))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,i=t.isStopped;n?e.error(r):i&&e.complete()},t.prototype.asObservable=function(){var e=new Hr;return e.source=this,e},t.create=function(e,t){return new Qr(e,t)},t}(Hr),Qr=function(e){sr(t,e);function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return t.prototype.next=function(e){var t,n;(n=(t=this.destination)?.next)==null||n.call(t,e)},t.prototype.error=function(e){var t,n;(n=(t=this.destination)?.error)==null||n.call(t,e)},t.prototype.complete=function(){var e,t;(t=(e=this.destination)?.complete)==null||t.call(e)},t.prototype._subscribe=function(e){return this.source?.subscribe(e)??gr},t}(Zr),$r=function(e){sr(t,e);function t(t){var n=e.call(this)||this;return n._value=t,n}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var n=e.prototype._subscribe.call(this,t);return!n.closed&&t.next(this._value),n},t.prototype.getValue=function(){var e=this,t=e.hasError,n=e.thrownError,r=e._value;if(t)throw n;return this._throwIfClosed(),r},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(Zr);function ei(e,t){return qr(function(n,r){var i=0;n.subscribe(Jr(r,function(n){r.next(e.call(t,n,i++))}))})}var ti=`https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss`,T=class extends Error{code;constructor(e,t){super(ri(e,t)),this.code=e}};function ni(e){return`NG0${Math.abs(e)}`}function ri(e,t){return`${ni(e)}${t?`: `+t:``}`}function ii(e){for(let t in e)if(e[t]===ii)return t;throw Error(``)}function ai(e){if(typeof e==`string`)return e;if(Array.isArray(e))return`[${e.map(ai).join(`, `)}]`;if(e==null)return``+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return``+n;let r=n.indexOf(` -`);return r>=0?n.slice(0,r):n}function oi(e,t){return e?t?`${e} ${t}`:e:t||``}var si=ii({__forward_ref__:ii});function ci(e){return e.__forward_ref__=ci,e}function li(e){return ui(e)?e():e}function ui(e){return typeof e==`function`&&Object.hasOwn(e,si)&&e.__forward_ref__===ci}function di(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function fi(e){return pi(e,gi)}function pi(e,t){return Object.hasOwn(e,t)&&e[t]||null}function mi(e){return(e?.[gi]??null)||null}function hi(e){return e&&Object.hasOwn(e,_i)?e[_i]:null}var gi=ii({ɵprov:ii}),_i=ii({ɵinj:ii}),vi=class{_desc;ngMetadataName=`InjectionToken`;ɵprov;constructor(e,t){this._desc=e,this.ɵprov=void 0,typeof t==`number`?this.__NG_ELEMENT_ID__=t:t!==void 0&&(this.ɵprov=di({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function yi(e){return e&&!!e.ɵproviders}var bi=ii({ɵcmp:ii}),xi=ii({ɵdir:ii}),Si=ii({ɵpipe:ii}),Ci=ii({ɵfac:ii}),wi=ii({__NG_ELEMENT_ID__:ii}),Ti=ii({__NG_ENV_ID__:ii});function Ei(e){return ki(e,`@Component`),e[bi]||null}function Di(e){return ki(e,`@Directive`),e[xi]||null}function Oi(e){return ki(e,`@Pipe`),e[Si]||null}function ki(e,t){if(e==null)throw new T(-919,!1)}function Ai(e){return typeof e==`string`?e:e==null?``:String(e)}var ji=ii({ngErrorCode:ii}),Mi=ii({ngErrorMessage:ii}),Ni=ii({ngTokenPath:ii});function Pi(e,t){return Ii(``,-200,t)}function Fi(e,t){throw new T(-201,!1)}function Ii(e,t,n){let r=new T(t,e);return r[ji]=t,r[Mi]=e,n&&(r[Ni]=n),r}function Li(e){return e[ji]}var Ri;function zi(){return Ri}function Bi(e){let t=Ri;return Ri=e,t}function Vi(e,t,n){let r=fi(e);if(r&&r.providedIn==`root`)return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Fi(e,``)}var Hi=globalThis,Ui={},Wi=`__NG_DI_FLAG__`,Gi=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=Ji(t)||0;try{return this.injector.get(e,n&8?null:Ui,n)}catch(e){if(er(e))return e;throw e}}};function Ki(e,t=0){let n=Zn();if(n===void 0)throw new T(-203,!1);if(n===null)return Vi(e,void 0,t);{let r=Yi(t),i=n.retrieve(e,r);if(er(i)){if(r.optional)return null;throw i}return i}}function qi(e,t=0){return(zi()||Ki)(li(e),t)}function E(e,t){return qi(e,Ji(t))}function Ji(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function Yi(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function Xi(e){let t=[];for(let n=0;nArray.isArray(e)?ta(e,t):t(e))}function na(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ra(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ia(e,t,n,r){let i=e.length;if(i==t)e.push(n,r);else if(i===1)e.push(r,e[0]),e[0]=n;else{for(i--,e.push(e[i-1],e[i]);i>t;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function aa(e,t,n){let r=sa(e,t);return r>=0?e[r|1]=n:(r=~r,ia(e,r,t,n)),r}function oa(e,t){let n=sa(e,t);if(n>=0)return e[n|1]}function sa(e,t){return ca(e,t,1)}function ca(e,t,n){let r=0,i=e.length>>n;for(;i!==r;){let a=r+(i-r>>1),o=e[a<t?i=a:r=a+1}return~(i<{n.push(e)};return ta(t,e=>{let t=e;va(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&_a(i,a),n}function _a(e,t){for(let n=0;n{t(e,r)})}}function va(e,t,n,r){if(e=li(e),!e)return!1;let i=null,a=hi(e),o=!a&&Ei(e);if(!a&&!o){let t=e.ngModule;if(a=hi(t),a)i=t;else return!1}else if(o&&!o.standalone)return!1;else i=e;let s=r.has(i);if(o){if(s)return!1;if(r.add(i),o.dependencies){let e=typeof o.dependencies==`function`?o.dependencies():o.dependencies;for(let i of e)va(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{ta(a.imports,i=>{va(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&_a(e,t)}if(!s){let e=Qi(i)||(()=>new i);t({provide:i,useFactory:e,deps:ua},i),t({provide:pa,useValue:i,multi:!0},i),t({provide:da,useValue:()=>qi(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;ya(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function ya(e,t){for(let n of e)yi(n)&&(n=n.ɵproviders),Array.isArray(n)?ya(n,t):t(n)}var ba=ii({provide:String,useValue:ii});function xa(e){return typeof e==`object`&&!!e&&ba in e}function Sa(e){return!!(e&&e.useExisting)}function Ca(e){return!!(e&&e.useFactory)}function wa(e){return typeof e==`function`}var Ta=new vi(``),Ea={},Da={},Oa=void 0;function ka(){return Oa===void 0&&(Oa=new ma),Oa}var Aa=class{},ja=class extends Aa{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,t,n,r){super(),this.parent=t,this.source=n,this.scopes=r,Va(e,e=>this.processProvider(e)),this.records.set(fa,La(void 0,this)),r.has(`environment`)&&this.records.set(Aa,La(void 0,this));let i=this.records.get(Ta);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(pa,ua,{self:!0}))}retrieve(e,t){let n=Ji(t)||0;try{return this.get(e,Ui,n)}catch(e){if(er(e))return e;throw e}}destroy(){Ia(this),this._destroyed=!0;let e=w(null);try{for(let e of this._ngOnDestroyHooks)e.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let t of e)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),w(e)}}onDestroy(e){return Ia(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){Ia(this);let t=Qn(this),n=Bi(void 0);try{return e()}finally{Qn(t),Bi(n)}}get(e,t=Ui,n){if(Ia(this),Object.hasOwn(e,Ti))return e[Ti](this);let r=Ji(n),i=Qn(this),a=Bi(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=Ba(e)&&fi(e);t=n&&this.injectableDefInScope(n)?La(Ma(e),Ea):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?ka():this.parent;return t=r&8&&t===Ui?null:t,n.get(e,t)}catch(e){let t=Li(e);throw t===-200||t===-201?new T(t,null):e}finally{Bi(a),Qn(i)}}resolveInjectorInitializers(){let e=w(null),t=Qn(this),n=Bi(void 0);try{let e=this.get(da,ua,{self:!0});for(let t of e)t()}finally{Qn(t),Bi(n),w(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=li(e);let t=wa(e)?e:li(e&&e.provide),n=Pa(e);if(!wa(e)&&e.multi===!0){let n=this.records.get(t);n||(n=La(void 0,Ea,!0),n.factory=()=>Xi(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=w(null);try{if(t.value===Da)throw Pi(``);return t.value===Ea&&(t.value=Da,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&za(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{w(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=li(e.providedIn);return typeof t==`string`?t===`any`||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(e){let t=this._onDestroyHooks.indexOf(e);t!==-1&&this._onDestroyHooks.splice(t,1)}};function Ma(e){let t=fi(e),n=t===null?Qi(e):t.factory;if(n!==null)return n;if(e instanceof vi)throw new T(-204,!1);if(e instanceof Function)return Na(e);throw new T(-204,!1)}function Na(e){if(e.length>0)throw new T(-204,!1);let t=mi(e);return t===null?()=>new e:()=>t.factory(e)}function Pa(e){return xa(e)?La(void 0,e.useValue):La(Fa(e),Ea)}function Fa(e,t,n){let r;if(wa(e)){let t=li(e);return Qi(t)||Ma(t)}if(xa(e))r=()=>li(e.useValue);else if(Ca(e))r=()=>e.useFactory(...Xi(e.deps||[]));else if(Sa(e))r=(t,n)=>qi(li(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=li(e&&(e.useClass||e.provide));if(Ra(e))r=()=>new t(...Xi(e.deps));else return Qi(t)||Ma(t)}return r}function Ia(e){if(e.destroyed)throw new T(-205,!1)}function La(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Ra(e){return!!e.deps}function za(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function Ba(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function Va(e,t){for(let n of e)Array.isArray(n)?Va(n,t):n&&yi(n)?Va(n.ɵproviders,t):t(n)}function Ha(e,t){let n;e instanceof ja?(Ia(e),n=e):n=new Gi(e);let r=Qn(n),i=Bi(void 0);try{return t()}finally{Qn(r),Bi(i)}}function Ua(){return zi()!==void 0||Zn()!=null}var Wa=1;function Ga(e){return Array.isArray(e)&&typeof e[Wa]==`object`}function Ka(e){return Array.isArray(e)&&e[Wa]===!0}function qa(e){return!!(e.flags&4)}function Ja(e){return e.componentOffset>-1}function Ya(e){return(e.flags&1)==1}function Xa(e){return!!e.template}function Za(e){return!!(e[2]&512)}function Qa(e){return(e[2]&256)==256}var $a=(function(e){return e[e.NONE=0]=`NONE`,e[e.HTML=1]=`HTML`,e[e.STYLE=2]=`STYLE`,e[e.SCRIPT=3]=`SCRIPT`,e[e.URL=4]=`URL`,e[e.RESOURCE_URL=5]=`RESOURCE_URL`,e[e.ATTRIBUTE_NO_BINDING=6]=`ATTRIBUTE_NO_BINDING`,e})($a||{}),eo=`math`;function to(e){for(;Array.isArray(e);)e=e[0];return e}function no(e,t){return to(t[e])}function ro(e,t){return to(t[e.index])}function io(e,t){return e.data[t]}function ao(e,t){return e[t]}function oo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function so(e,t){let n=t[e];return Ga(n)?n:n[0]}function co(e){return(e[2]&128)==128}function lo(e){return Ka(e[3])}function uo(e,t){return t==null?null:e[t]}function fo(e){e[17]=0}function po(e){e[2]&1024||(e[2]|=1024,co(e)&&_o(e))}function mo(e,t){for(;e>0;)t=t[14],e--;return t}function ho(e){return!!(e[2]&9216||e[24]?.dirty)}function go(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),ho(e)&&_o(e)}function _o(e){e[10].changeDetectionScheduler?.notify(0);let t=bo(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!co(t)));)t=bo(t)}function vo(e,t){if(Qa(e))throw new T(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function yo(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function bo(e){let t=e[3];return Ka(t)?t[3]:t}function xo(e){return e[7]??=[]}function So(e){return e.cleanup??=[]}function Co(e,t,n,r){let i=xo(t);i.push(n),e.firstCreatePass&&So(e).push(r,i.length-1)}var D={lFrame:is(null),bindingsEnabled:!0,skipHydrationRootTNode:null},wo=!1;function To(){return D.lFrame.elementDepthCount}function Eo(){D.lFrame.elementDepthCount++}function Do(){D.lFrame.elementDepthCount--}function Oo(){return D.bindingsEnabled}function ko(){return D.skipHydrationRootTNode!==null}function Ao(e){return D.skipHydrationRootTNode===e}function jo(){D.skipHydrationRootTNode=null}function O(){return D.lFrame.lView}function Mo(){return D.lFrame.tView}function k(e){return D.lFrame.contextLView=e,e[8]}function A(e){return D.lFrame.contextLView=null,e}function No(){let e=Po();for(;e!==null&&e.type===64;)e=e.parent;return e}function Po(){return D.lFrame.currentTNode}function Fo(){let e=D.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Io(e,t){let n=D.lFrame;n.currentTNode=e,n.isParent=t}function Lo(){return D.lFrame.isParent}function Ro(){D.lFrame.isParent=!1}function zo(){return D.lFrame.contextLView}function Bo(){return wo}function Vo(e){let t=wo;return wo=e,t}function Ho(){let e=D.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Uo(){return D.lFrame.bindingIndex}function Wo(e){return D.lFrame.bindingIndex=e}function Go(){return D.lFrame.bindingIndex++}function Ko(e){let t=D.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function qo(){return D.lFrame.inI18n}function Jo(e,t){let n=D.lFrame;n.bindingIndex=n.bindingRootIndex=e,Xo(t)}function Yo(){return D.lFrame.currentDirectiveIndex}function Xo(e){D.lFrame.currentDirectiveIndex=e}function Zo(e){let t=D.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Qo(){return D.lFrame.currentQueryIndex}function $o(e){D.lFrame.currentQueryIndex=e}function es(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ts(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=es(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=D.lFrame=rs();return r.currentTNode=t,r.lView=e,!0}function ns(e){let t=rs(),n=e[1];D.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function rs(){let e=D.lFrame,t=e===null?null:e.child;return t===null?is(e):t}function is(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 as(){let e=D.lFrame;return D.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var os=as;function ss(){let e=as();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 cs(e){return(D.lFrame.contextLView=mo(e,D.lFrame.contextLView))[8]}function ls(){return D.lFrame.selectedIndex}function us(e){D.lFrame.selectedIndex=e}function ds(){let e=D.lFrame;return io(e.tView,e.selectedIndex)}function fs(){D.lFrame.currentNamespace=`svg`}function ps(){ms()}function ms(){D.lFrame.currentNamespace=null}function hs(){return D.lFrame.currentNamespace}var gs=!0;function _s(){return gs}function vs(e){gs=e}function ys(e,t=null,n=null,r){let i=bs(e,t,n,r);return i.resolveInjectorInitializers(),i}function bs(e,t=null,n=null,r,i=new Set){return new ja([n||ua,ha(e)],t||ka(),null,i)}var xs=class e{static THROW_IF_NOT_FOUND=Ui;static NULL=new ma;static create(e,t){if(Array.isArray(e))return ys({name:``},t,e,``);{let t=e.name??``;return ys({name:t},e.parent,e.providers,t)}}static ɵprov=di({token:e,providedIn:`any`,factory:()=>qi(fa)});static __NG_ELEMENT_ID__=-1},Ss=new vi(``),Cs=class{static __NG_ELEMENT_ID__=Ts;static __NG_ENV_ID__=e=>e},ws=class extends Cs{_lView;constructor(e){super(),this._lView=e}get destroyed(){return Qa(this._lView)}onDestroy(e){let t=this._lView;return vo(t,e),()=>yo(t,e)}};function Ts(){return new ws(O())}var Es=new vi(``),Ds=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new $r(!1);debugTaskTracker=E(Es,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new Hr(e=>{e.next(!1),e.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),this.debugTaskTracker?.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.debugTaskTracker?.remove(e),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Os=class extends Zr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,Ua()&&(this.destroyRef=E(Cs,{optional:!0})??void 0,this.pendingTasks=E(Ds,{optional:!0})??void 0)}emit(e){let t=w(null);try{super.next(e)}finally{w(t)}}subscribe(e,t,n){let r=e,i=t||(()=>null),a=n;if(e&&typeof e==`object`){let t=e;r=t.next?.bind(t),i=t.error?.bind(t),a=t.complete?.bind(t)}this.__isAsync&&(i=this.wrapInTimeout(i),r&&=this.wrapInTimeout(r),a&&=this.wrapInTimeout(a));let o=super.subscribe({next:r,error:i,complete:a});return e instanceof hr&&e.add(o),o}wrapInTimeout(e){return t=>{let n=this.pendingTasks?.add();setTimeout(()=>{try{e(t)}finally{n!==void 0&&this.pendingTasks?.remove(n)}})}}};function ks(...e){}function As(e){let t,n;function r(){e=ks;try{n!==void 0&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch{}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==`function`&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function js(e){return queueMicrotask(()=>e()),()=>{e=ks}}var Ms=`isAngularZone`,Ns=`isAngularZone_ID`,Ps=0,Fs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Os(!1);onMicrotaskEmpty=new Os(!1);onStable=new Os(!1);onError=new Os(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new T(908,!1);Zone.assertZonePatched();let a=this;a._nesting=0,a._outer=a._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(a._inner=a._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(a._inner=a._inner.fork(Zone.longStackTraceZoneSpec)),a.shouldCoalesceEventChangeDetection=!r&&n,a.shouldCoalesceRunChangeDetection=r,a.callbackScheduled=!1,a.scheduleInRootZone=i,zs(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(Ms)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new T(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new T(909,!1)}run(e,t,n){return this._inner.run(e,t,n)}runTask(e,t,n,r){let i=this._inner,a=i.scheduleEventTask(`NgZoneEvent: `+r,e,Is,ks,ks);try{return i.runTask(a,t,n)}finally{i.cancelTask(a)}}runGuarded(e,t,n){return this._inner.runGuarded(e,t,n)}runOutsideAngular(e){return this._outer.run(e)}},Is={};function Ls(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Rs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){As(()=>{e.callbackScheduled=!1,Bs(e),e.isCheckStableRunning=!0,Ls(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Bs(e)}function zs(e){let t=()=>{Rs(e)},n=Ps++;e._inner=e._inner.fork({name:`angular`,properties:{[Ms]:!0,[Ns]:n,[Ns+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Ws(s))return n.invokeTask(i,a,o,s);try{return Vs(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Hs(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Vs(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Gs(s)&&t(),Hs(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,Bs(e),Ls(e)):i.change==`macroTask`&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(t,n,r,i)=>(t.handleError(r,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}function Bs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Vs(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Hs(e){e._nesting--,Ls(e)}var Us=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Os;onMicrotaskEmpty=new Os;onStable=new Os;onError=new Os;run(e,t,n){return e.apply(t,n)}runGuarded(e,t,n){return e.apply(t,n)}runOutsideAngular(e){return e()}runTask(e,t,n,r){return e.apply(t,n)}};function Ws(e){return Ks(e,`__ignore_ng_zone__`)}function Gs(e){return Ks(e,`__scheduler_tick__`)}function Ks(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var qs=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},Js=new vi(``,{factory:()=>{let e=E(Fs),t=E(Aa),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(qs),n.handleError(r))})}}}),Ys={provide:da,useValue:()=>{E(qs,{optional:!0})},multi:!0};function j(e,t){let[n,r,i]=Hn(e,t?.equal),a=n;return a[dn],a.set=r,a.update=i,a.asReadonly=Xs.bind(a),a}function Xs(){let e=this[dn];if(e.readonlyFn===void 0){let t=()=>this();t[dn]=e,e.readonlyFn=t}return e.readonlyFn}var Zs=new vi(``,{factory:()=>Qs}),Qs=`ng`,$s=new vi(``),ec=new vi(``,{providedIn:`platform`,factory:()=>`unknown`}),tc=new vi(``,{factory:()=>E(Ss).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),nc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=rc}return e})();function rc(){return new nc(O(),No())}var ic=class{},ac=new vi(``,{factory:()=>!0}),oc=new vi(``),sc=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>new cc})}return e})(),cc=class{dirtyEffectCount=0;queues=new Map;add(e){this.enqueue(e),this.schedule(e)}schedule(e){e.dirty&&this.dirtyEffectCount++}remove(e){let t=e.zone,n=this.queues.get(t);n.has(e)&&(n.delete(e),e.dirty&&this.dirtyEffectCount--)}enqueue(e){let t=e.zone;this.queues.has(t)||this.queues.set(t,new Set);let n=this.queues.get(t);n.has(e)||n.add(e)}flush(){for(;this.dirtyEffectCount>0;){let e=!1;for(let[t,n]of this.queues)e||=t===null?this.flushQueue(n):t.run(()=>this.flushQueue(n));e||(this.dirtyEffectCount=0)}}flushQueue(e){let t=!1;for(let n of e)n.dirty&&(this.dirtyEffectCount--,t=!0,n.run());return t}},lc=class{[dn];constructor(e){this[dn]=e}destroy(){this[dn].destroy()}};function uc(e,t){let n=t?.injector??E(xs),r=t?.manualCleanup===!0?null:n.get(Cs),i,a=n.get(nc,null,{optional:!0}),o=n.get(ic);return a===null?i=hc(e,n.get(sc),o):(i=mc(a.view,o,e),r instanceof ws&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new lc(i)}var dc={...Jn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Vo(!1);try{Yn(this)}finally{Vo(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=w(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],w(e)}}},fc={...dc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},pc={...dc,consumerMarkedDirty(){this.view[2]|=8192,_o(this.view),this.notifier.notify(13)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function mc(e,t,n){let r=Object.create(pc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=gc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function hc(e,t,n){let r=Object.create(fc);return r.fn=gc(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<`u`?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function gc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function _c(e){return typeof e==`function`&&e[dn]!==void 0}function vc(e){return _c(e)&&typeof e.set==`function`}var yc=Symbol(`InputSignalNode#UNSET`),bc={...Kn,transformFn:void 0,applyValueToInputSignal(e,t){Wn(e,t)}};function xc(e){return{toString:e}.toString()}var Sc=(function(e){return e[e.TemplateCreateStart=0]=`TemplateCreateStart`,e[e.TemplateCreateEnd=1]=`TemplateCreateEnd`,e[e.TemplateUpdateStart=2]=`TemplateUpdateStart`,e[e.TemplateUpdateEnd=3]=`TemplateUpdateEnd`,e[e.LifecycleHookStart=4]=`LifecycleHookStart`,e[e.LifecycleHookEnd=5]=`LifecycleHookEnd`,e[e.OutputStart=6]=`OutputStart`,e[e.OutputEnd=7]=`OutputEnd`,e[e.BootstrapApplicationStart=8]=`BootstrapApplicationStart`,e[e.BootstrapApplicationEnd=9]=`BootstrapApplicationEnd`,e[e.BootstrapComponentStart=10]=`BootstrapComponentStart`,e[e.BootstrapComponentEnd=11]=`BootstrapComponentEnd`,e[e.ChangeDetectionStart=12]=`ChangeDetectionStart`,e[e.ChangeDetectionEnd=13]=`ChangeDetectionEnd`,e[e.ChangeDetectionSyncStart=14]=`ChangeDetectionSyncStart`,e[e.ChangeDetectionSyncEnd=15]=`ChangeDetectionSyncEnd`,e[e.AfterRenderHooksStart=16]=`AfterRenderHooksStart`,e[e.AfterRenderHooksEnd=17]=`AfterRenderHooksEnd`,e[e.ComponentStart=18]=`ComponentStart`,e[e.ComponentEnd=19]=`ComponentEnd`,e[e.DeferBlockStateStart=20]=`DeferBlockStateStart`,e[e.DeferBlockStateEnd=21]=`DeferBlockStateEnd`,e[e.DynamicComponentStart=22]=`DynamicComponentStart`,e[e.DynamicComponentEnd=23]=`DynamicComponentEnd`,e[e.HostBindingsUpdateStart=24]=`HostBindingsUpdateStart`,e[e.HostBindingsUpdateEnd=25]=`HostBindingsUpdateEnd`,e})(Sc||{}),Cc=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function wc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Tc=null,Ec=(()=>{Tc=Oc;let e=()=>Oc;return e.ngInherit=!0,e})();function Dc(){return Tc}function Oc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Ac),kc}function kc(){let e=Mc(this),t=e?.current;if(t){let n=e.previous;if(n===la)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Ac(e,t,n,r,i){let a=this.declaredInputs[r],o=Mc(e)||Nc(e,{previous:la,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Cc(l&&l.currentValue,n,c===la),wc(e,t,i,n)}var jc=`__ngSimpleChanges__`;function Mc(e){return Object.hasOwn(e,jc)&&e[jc]||null}function Nc(e,t){return e[jc]=t}var Pc=[],Fc=function(e,t=null,n){for(let r=0;r=r)break}else t[c]<0&&(e[17]+=65536),(s>14>16&&(e[2]&3)===t&&(e[2]+=16384,Hc(o,a)):Hc(o,a)}var Wc=-1,Gc=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,t,n,r){this.factory=e,this.name=r,this.canSeeViewProviders=t,this.injectImpl=n}};function Kc(e){return!!(e.flags&8)}function qc(e){return!!(e.flags&16)}function Jc(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function nl(e,t){let n=tl(e),r=t;for(;n>0;)r=r[14],n--;return r}var rl=!0;function il(e){let t=rl;return rl=e,t}var al=255,ol=5,sl=0,cl={};function ll(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,wi)&&(r=n[wi]),r??=n[wi]=sl++;let i=r&al,a=1<>ol)]|=a}function ul(e,t){let n=fl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,dl(r.data,e),dl(t,null),dl(r.blueprint,null));let i=pl(e,t),a=e.injectorIndex;if($c(i)){let e=el(i),n=nl(i,t),r=n[1].data;for(let i=0;i<8;i++)t[a+i]=n[e+i]|r[e+i]}return t[a+8]=i,a}function dl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function fl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function pl(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,i=t;for(;i!==null;){if(r=Ol(i),r===null)return Wc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Wc}function ml(e,t,n){ll(e,t,n)}function hl(e,t,n){if(n&8||e!==void 0)return e;Fi(t,`NodeInjector`)}function gl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=Bi(void 0);try{return i?i.get(t,r,n&8):Vi(t,r,n&8)}finally{Bi(a)}}return hl(r,t,n)}function _l(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Dl(e,t,n,r,cl);if(i!==cl)return i}let i=vl(e,t,n,r,cl);if(i!==cl)return i}return gl(t,n,r,i)}function vl(e,t,n,r,i){let a=Sl(n);if(typeof a==`function`){if(!ts(t,e,r))return r&1?hl(i,n,r):gl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Fi(n);else return e}finally{os()}}else if(typeof a==`number`){let i=null,o=fl(e,t),s=Wc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?pl(e,t):t[o+8],s===Wc||!wl(r,!1)?o=-1:(i=t[1],o=el(s),t=nl(s,t)));o!==-1;){let e=t[1];if(Cl(a,o,e.data)){let e=yl(o,t,n,i,r,c);if(e!==cl)return e}s=t[o+8],s!==Wc&&wl(r,t[1].data[o+8]===c)&&Cl(a,o,t)?(i=e,o=el(s),t=nl(s,t)):o=-1}}return i}function yl(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=bl(s,o,n,r==null?Ja(s)&&rl:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?cl:xl(t,o,c,s,i)}function bl(e,t,n,r,i){let a=e.providerIndexes,o=t.data,s=a&1048575,c=e.directiveStart,l=e.directiveEnd,u=a>>20,d=r?s:s+u,f=i?s+u:l;for(let e=d;e=c&&t.type===n)return e}if(i){let e=o[c];if(e&&Xa(e)&&e.type===n)return c}return null}function xl(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Gc){let s=a;if(s.resolving)throw Pi(``);let c=il(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?Bi(s.injectImpl):null;ts(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Ic(n,o[n],t)}finally{l!==null&&Bi(l),il(c),s.resolving=!1,os()}}return a}function Sl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,wi)?e[wi]:void 0;return typeof t==`number`?t>=0?t&al:El:t}function Cl(e,t,n){let r=1<>ol)]&r)}function wl(e,t){return!(e&2)&&!(e&1&&t)}var Tl=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return _l(this._tNode,this._lView,e,Ji(n),t)}};function El(){return new Tl(No(),O())}function Dl(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!Za(o);){let e=vl(a,o,n,r|2,cl);if(e!==cl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,cl,r);if(t!==cl)return t}t=Ol(o),o=o[14]}a=t}return i}function Ol(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function kl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function Al(){return jl(No(),O())}function jl(e,t){return new Ml(ro(e,t))}var Ml=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=Al}return e})();function Nl(e){return e instanceof Ml?e.nativeElement:e}function Pl(){return this._results[Symbol.iterator]()}var Fl=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new Zr}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,t){return this._results.reduce(e,t)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,t){this.dirty=!1;let n=ea(e);(this._changesDetected=!$i(this._results,n,t))&&(this._results=n,this.length=n.length,this.last=n[this.length-1],this.first=n[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=Pl};function Il(e){return(e.flags&128)==128}var Ll=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Ll||{}),Rl=new Map,zl=0;function Bl(){return zl++}function Vl(e){Rl.set(e[19],e)}function Hl(e){Rl.delete(e[19])}var Ul=`__ngContext__`;function Wl(e,t){Ga(t)?(e[Ul]=t[19],Vl(t)):e[Ul]=t}function Gl(e){return ql(e[12])}function Kl(e){return ql(e[4])}function ql(e){for(;e!==null&&!Ka(e);)e=e[4];return e}var Jl=void 0;function Yl(e){Jl=e}function Xl(){if(Jl!==void 0)return Jl;if(typeof document<`u`)return document;throw new T(210,!1)}var Zl=!1,Ql=new vi(``,{factory:()=>Zl}),$l=new WeakMap;function eu(e,t){if(typeof e!=`object`||!e)return;let n=$l.get(e);n||(n=new WeakSet,$l.set(e,n)),n.add(t)}function tu(e){return(e.flags&32)==32}var nu=()=>null;function ru(e,t,n=!1){return nu(e,t,n)}function iu(e,t){let n=e.contentQueries;if(n!==null){let r=w(null);try{for(let r=0;r|^->||--!>|)/g,gu=`​$1​`;function _u(e){return e.replace(mu,e=>e.replace(hu,gu))}function vu(e,t){return e.createText(t)}function yu(e,t,n){e.setValue(t,n)}function bu(e,t){return e.createComment(_u(t))}function xu(e,t,n){return e.createElement(t,n)}function Su(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Cu(e,t,n){e.appendChild(t,n)}function wu(e,t,n,r,i){r===null?Cu(e,t,n):Su(e,t,n,r,i)}function Tu(e,t,n,r){e.removeChild(null,t,n,r)}function Eu(e,t,n){e.setAttribute(t,`style`,n)}function Du(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Ou(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&Jc(e,t,r),i!==null&&Du(e,t,i),a!==null&&Eu(e,t,a)}function ku(e){let t=Au();return t?t.sanitize($a.URL,e)||``:uu(e,`URL`)?lu(e):pu(Ai(e))}function Au(){let e=O();return e&&e[10].sanitizer}function ju(e){return e.ownerDocument.defaultView}function Mu(e){return e.ownerDocument}function Nu(e,t,n){let r=e.length;for(;;){let i=e.indexOf(t,n);if(i===-1)return i;if(i===0||e.charCodeAt(i-1)<=32){let n=t.length;if(i+n===r||e.charCodeAt(i+n)<=32)return i}n=i+1}}var Pu=`ng-template`;function Fu(e,t,n,r){let i=0;if(r){for(;i-1){let e;for(;++ia?``:i[u+1].toLowerCase(),r&2&&l!==e){if(zu(r))return!1;o=!0}}}}}return zu(r)||o}function zu(e){return!(e&1)}function Bu(e,t,n,r){if(t===null)return-1;let i=0;if(r||!n){let n=!1;for(;i-1)for(n++;n0?`="`+t+`"`:``)+`]`}else r&8?i+=`.`+o:r&4&&(i+=` `+o)}else i!==``&&!zu(o)&&(t+=Wu(a,i),i=``),r=o,a||=!zu(r);n++}return i!==``&&(t+=Wu(a,i)),t}function Ku(e){return e.map(Gu).join(`,`)}function qu(e){let t=[],n=[],r=1,i=2;for(;r!1});function $u(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function ed(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function td(e){let t=ed(e,`transition-property`),n=ed(e,`transition-duration`),r=ed(e,`transition-delay`),i={propertyName:``,duration:0,animationName:void 0};for(let e=0;ei.duration&&(i.propertyName=t[e],i.duration=a)}return i}function nd(e){let t=ed(e,`animation-name`),n=ed(e,`animation-delay`),r=ed(e,`animation-duration`),i=ed(e,`animation-iteration-count`),a={animationName:``,propertyName:void 0,duration:0};for(let e=0;ea.duration&&s!==`infinite`&&(a.animationName=t[e],a.duration=o)}return a}function rd(e,t){return e!==void 0&&e.duration>t.duration}function id(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function ad(e){let t=e.effect?.getTiming();if(t===void 0)return;let n=typeof t.duration==`number`?t.duration:0,r=(t.delay??0)+n,i=e.playbackRate;return i!==void 0&&i!==0&&i!==1&&(r/=Math.abs(i)),r}function od(e,t){let n=getComputedStyle(e),r=nd(n),i=td(n),a=r.duration>i.duration?r:i;rd(t.get(e),a)||id(a)&&t.set(e,a)}function sd(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?od(e,t):cd(e,t,r)}function cd(e,t,n){let r={animationName:void 0,propertyName:void 0,duration:0};for(let e of n){if(e.effect?.getTiming()?.iterations===1/0)continue;let t=ad(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}rd(t.get(e),r)||id(r)&&t.set(e,r)}var ld=new Set,ud=!1,dd=1,fd=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function pd(e){return e[9].get(Qu,ud)}function md(e,t,n){let r=gd.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else gd.set(e,{classList:t,cleanupFns:n})}function hd(e){let t=gd.get(e);if(t){for(let e of t.cleanupFns)e();gd.delete(e)}_d.delete(e)}var gd=new WeakMap,_d=new WeakMap,vd=new WeakMap;function yd(e){return e?e[14]??e:null}var bd=new WeakSet;function xd(e,t,n){let r=vd.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=yd(n);for(let e=r.length-1;e>=0;e--){let{el:n,declarationView:s}=r[e],c=n.parentNode;n===t?(r.splice(e,1),bd.add(n),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}}))):(a&&n===a||c&&i&&c!==i&&(o===null||s===null||o===s))&&(r.splice(e,1),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}})),n.parentNode?.removeChild(n))}}function Sd(e,t,n){let r=yd(n),i=vd.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):vd.set(e,[{el:t,declarationView:r}])}function Cd(e){let t=e[26]??={};return t.enter??=new Map}function wd(e){let t=typeof e==`function`?e():e,n=Array.isArray(t)?t:null;return typeof t==`string`&&(n=t.trim().split(/\s+/).filter(e=>e)),n}function Td(e){return e.composedPath?e.composedPath()[0]:e.target}function Ed(e,t){let n=_d.get(t);if(n===void 0)return!0;if(t!==Td(e))return!1;let r=e.animation;if(r){let e=ad(r);if(e!==void 0&&e+dd{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Nd=[0,1,2,3],Pd=(()=>{class e{ngZone=E(Fs);scheduler=E(ic);errorHandler=E(qs,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){E(kd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Fc(Sc.AfterRenderHooksStart),this.executing=!0;for(let e of Nd)for(let t of this.sequences)if(!t.erroredOrDestroyed&&t.hooks[e])try{t.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let n=t.hooks[e];return n(t.pipelinedValue)},t.snapshot))}catch(e){t.erroredOrDestroyed=!0,this.errorHandler?.handleError(e)}this.executing=!1;for(let e of this.sequences)e.afterRun(),e.once&&(this.sequences.delete(e),e.destroy());for(let e of this.deferredRegistrations)this.sequences.add(e);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&Fc(Sc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),_o(t),t[2]|=8192)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,t){return t?t.run(Od.AFTER_NEXT_RENDER,e):e()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fd=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,t,n,r,i,a=null){this.impl=e,this.hooks=t,this.view=n,this.once=r,this.snapshot=a,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[25];e&&(this.view[25]=e.filter(e=>e!==this))}};function Id(e,t){let n=t?.injector??E(xs);return jd(`NgAfterNextRender`),Rd(e,n,t,!0)}function Ld(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Rd(e,t,n,r){let i=t.get(Md);i.impl??=t.get(Pd);let a=t.get(kd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(Cs),s=t.get(nc,null,{optional:!0}),c=new Fd(i.impl,Ld(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var zd=new vi(``,{factory:()=>{let e=E(Aa),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function Bd(e,t,n){let r=e.get(zd);if(Array.isArray(t))for(let e of t)r.queue.add(e),n?.detachedLeaveAnimationFns?.push(e);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function Vd(e,t){let n=e.get(zd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Hd(e,t){let n=e.get(zd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Ud(e){let t=e.get(zd);t.isScheduled||=(Id(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Wd(e){let t=e.get(zd);t.scheduler=Ud,t.scheduler(e)}function Gd(e,t){for(let[n,r]of t)Bd(e,r.animateFns)}function Kd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&Gd(r,i)}function qd(e,t,n,r){try{n.get(fa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Vd(n,i.enter.get(t.index).animateFns);let a=Jd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];Xd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&ld.add(e[19]),Bd(n,()=>Yd(e,t,i||void 0,a,r),i||void 0)}function Jd(e,t,n){let r=new Map,i=n?.leave;if(i&&i.has(t.index)&&r.set(t.index,i.get(t.index)),e&&i)for(let[n,a]of i){if(r.has(n))continue;let i=e[1].data[n].parent;for(;i;){if(i===t){r.set(n,a);break}i=i.parent}}return r}function Yd(e,t,n,r,i){let a=[];if(n&&n.leave)for(let[e]of r){if(!n.leave.has(e))continue;let t=n.leave.get(e);for(let e of t.animateFns){let{promise:t}=e();a.push(t)}n.detachedLeaveAnimationFns=void 0}if(e&&Xd(e,t,a),a.length>0){let t=n||e?.[26];if(t){let n=t.running;n&&a.push(n),t.running=Promise.allSettled(a),Qd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&ld.delete(e[19]),i(!0)})}else e&&ld.delete(e[19]),i(!1)}function Xd(e,t,n){if(t.type&12){let r=e[t.index];if(Ka(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,ld.delete(e[19])),n(!0)})}function $d(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;Ka(i)?c=i:Ga(i)&&(l=!0,i=i[0]);let u=to(i);e===0&&r!==null?(Kd(s,r,a,n),o==null?Cu(t,r,u):Su(t,r,u,o||null,!0)):e===1&&r!==null?(Kd(s,r,a,n),Su(t,r,u,o||null,!0),xd(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Sd(a,u,s),bd.delete(u),qd(s,a,n,e=>{if(bd.has(u)){bd.delete(u);return}Tu(t,u,l,e)})):e===3&&(bd.delete(u),qd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Cf(t,e,n,c,a,r,o)}}function ef(e,t){nf(e,t),t[0]=null,t[5]=null}function tf(e,t,n,r,i,a){r[0]=i,r[5]=t,bf(e,r,n,1,i,a)}function nf(e,t){t[10].changeDetectionScheduler?.notify(9),bf(e,t,t[11],2,null,null)}function rf(e){let t=e[12];if(!t)return sf(e[1],e);for(;t;){let n=null;if(Ga(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)Ga(t)&&sf(t[1],t),t=t[3];t===null&&(t=e),Ga(t)&&sf(t[1],t),n=t&&t[4]}t=n}}function af(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function of(e,t){if(Qa(t))return;let n=t[11];n.destroyNode&&bf(e,t,n,3,null,null),rf(t)}function sf(e,t){if(Qa(t))return;let n=w(null);try{t[2]&=-129,t[2]|=256,t[24]&&En(t[24]),lf(e,t),cf(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&Ka(t[3])){n!==t[3]&&af(n,t);let r=t[18];r!==null&&r.detachView(e)}Hl(t)}finally{w(n)}}function cf(e,t){let n=e.cleanup,r=t[7];if(n!==null)for(let e=0;e=0?r[t]():r[-t].unsubscribe(),e+=2}else{let t=r[n[e+1]];n[e].call(t)}r!==null&&(t[7]=null);let i=t[21];if(i!==null){t[21]=null;for(let e=0;e27&&Nf(e,t,27,!1),Fc(o?Sc.TemplateUpdateStart:Sc.TemplateCreateStart,i,n),n(r,i)}finally{us(a),Fc(o?Sc.TemplateUpdateEnd:Sc.TemplateCreateEnd,i,n)}}function Lf(e,t,n){Wf(e,t,n),(n.flags&64)==64&&Gf(e,t,n)}function Rf(e,t,n=ro){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a{_o(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function hp(e){let t=e[24]??Object.create(gp);return t.lView=e,t}var gp={...pn,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=bo(e.lView);for(;t&&!_p(t[1]);)t=bo(t);t&&po(t)},consumerOnSignalRead(){this.lView[24]=this}};function _p(e){return e.type!==2}function vp(e){if(e[23]===null)return;let t=!0;for(;t;){let n=!1;for(let t of e[23])if(t.dirty&&(n=!0,t.zone===null||Zone.current===t.zone?t.run():t.zone.run(()=>t.run()),e[23]===null))return;t=n&&!!(e[2]&8192)}}var yp=100;function bp(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{xp(e,t)}finally{n.end?.()}}function xp(e,t){let n=Bo();try{Vo(!0),Dp(e,t);let n=0;for(;ho(e);){if(n===yp)throw new T(103,!1);n++,Dp(e,1)}}finally{Vo(n)}}function Sp(e,t,n,r){if(Qa(t))return;let i=t[2];ns(t);let a=!0,o=null,s=null;_p(e)?(s=dp(t),o=xn(s)):fn()===null?(a=!1,s=hp(t),o=xn(s)):t[24]&&=(En(t[24]),null);try{fo(t),Wo(e.bindingStartIndex),n!==null&&If(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Rc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&zc(t,n,0,null),Bc(t,0)}if(wp(t),vp(t),Cp(t,0),e.contentQueries!==null&&iu(e,t),a){let n=e.contentCheckHooks;n!==null&&Rc(t,n)}else{let n=e.contentHooks;n!==null&&zc(t,n,1),Bc(t,1)}kp(e,t);let o=e.components;o!==null&&Op(t,o,0);let s=e.viewQuery;if(s!==null&&au(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Rc(t,n)}else{let n=e.viewHooks;n!==null&&zc(t,n,2),Bc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}lp(t),t[2]&=-73}catch(e){throw _o(t),e}finally{s!==null&&(Cn(s,o),a&&pp(s)),ss()}}function Cp(e,t){for(let n=Gl(e);n!==null;n=Kl(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ra(e,10+t);ef(r[1],r);let o=a[18];o!==null&&o.detachView(a[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Ip(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(Fp(e,n),ra(t,n))}this._attachedToViewContainer=!1}of(this._lView[1],this._lView)}onDestroy(e){vo(this._lView,e)}markForCheck(){Ap(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){go(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,bp(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new T(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=Za(this._lView),t=this._lView[16];t!==null&&!e&&af(t,this._lView),nf(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new T(902,!1);this._appRef=e;let t=Za(this._lView),n=this._lView[16];n!==null&&!t&&Lp(n,this._lView),go(this._lView)}},zp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=Bp;constructor(e,t,n){this._declarationLView=e,this._declarationTContainer=t,this.elementRef=n}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,t){return this.createEmbeddedViewImpl(e,t)}createEmbeddedViewImpl(e,t,n){return new Rp(ap(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function Bp(){return Vp(No(),O())}function Vp(e,t){return e.type&4?new zp(t,e,jl(e,t)):null}function Hp(e,t,n,r,i){let a=e.data[t];if(a===null)a=Up(e,t,n,r,i),qo()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Fo();a.injectorIndex=e===null?-1:e.injectorIndex}return Io(a,!0),a}function Up(e,t,n,r,i){let a=Po(),o=Lo(),s=o?a:a&&a.parent,c=e.data[t]=Gp(e,s,n,t,r,i);return Wp(e,c,a,o),c}function Wp(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function Gp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return ko()&&(s|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:o,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:s,providerIndexes:0,value:i,namespace:hs(),attrs:a,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function Kp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?qp(e,n):r.push(e);e[6]=r}function qp(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,Yp=()=>null;function Xp(e,t){return Jp(e,t)}function Zp(e,t,n){return Yp(e,t,n)}var Qp=class{},$p=class{},em=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>null})}return e})();function tm(e){return e.debugInfo?.className||e.type.name||null}var nm={},rm=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,nm,n);return r!==nm||t===nm?r:this.parentInjector.get(e,t,n)}};function im(e,t,n){return e[t]=n}function am(e,t){return e[t]}function om(e,t,n){if(n===Ju)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function sm(e,t,n,r){let i=om(e,t,n);return om(e,t+1,r)||i}function cm(e,t,n,r,i){let a=sm(e,t,n,r);return om(e,t+2,i)||a}function lm(e,t,n,r,i,a){let o=sm(e,t,n,r);return sm(e,t+2,i,a)||o}function um(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&eu(i,a),Ap(Ja(e)?so(e.index,t):t,5);let o=t[8],s=dm(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=dm(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function dm(e,t,n,r){let i=w(null);try{return Fc(Sc.OutputStart,t,n),n(r)!==!1}catch(t){return $f(e,t),!1}finally{Fc(Sc.OutputEnd,t,n),w(i)}}function fm(e,t,n,r,i,a,o,s){let c=Ya(e),l=!1,u=null;if(!r&&c&&(u=mm(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=ro(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);pm(a)||hm(r?t=>r(to(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function pm(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function mm(e,t,n,r){let i=e.cleanup;if(i!=null)for(let e=0;er?n[r]:null}typeof a==`string`&&(e+=2)}return null}function hm(e,t,n,r,i,a,o){let s=t.firstCreatePass?So(t):null,c=xo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function gm(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);hm(e.index,s,t,i,a,c,!0)}var _m=Symbol(`BINDING`),vm=new vi(``);function ym(e,t,n){let r=n?e.styles:null,i=n?e.classes:null,a=0;if(t!==null)for(let e=0;e0&&(n.directiveToIndex=new Map);for(let c=0;c0;){let n=e[--t];if(typeof n==`number`&&n<0)return n}return 0}function Nm(e,t,n){if(n){if(t.exportAs)for(let r=0;r{let[n,r,i]=e[t],a={propName:n,templateName:t,isSignal:(r&Pf.SignalBased)!==0};return i&&(a.transform=i),a})}function Vm(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Hm(e,t,n){let r=t instanceof Aa?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new rm(n,r):n}function Um(e){let t=e.get($p,null);if(t===null)throw new T(407,!1);return{rendererFactory:t,sanitizer:e.get(em,null),changeDetectionScheduler:e.get(ic,null),ngReflect:!1,tracingService:e.get(kd,null,{optional:!0})}}function Wm(e,t,n){let r=Km(e);return xu(t,r,r===`svg`?`svg`:r===`math`?eo:n)}function Gm(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new T(905,!1)}function Km(e){return(e.selectors[0][0]||`div`).toLowerCase()}var qm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Bm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Vm(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=Ku(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Fc(Sc.DynamicComponentStart);let s=w(null);try{let s=this.componentDef,c=Hm(s,r||this.ngModule,e),l=Um(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(tm(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{w(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Jm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?zf(l,r,s.encapsulation,t):Wm(s,l,o??null);Gm(u);let d=t.get(vm,null),f=Ym(u,()=>t.get(Ss,null)??Xl());d&&d.addHost(f);let p=a?.some(Zm)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Zm)),m=Of(null,c,null,512|Af(s),null,null,e,l,t,null,ru(u,t,!0));d&&Rm&&f instanceof ShadowRoot&&vo(m,()=>{d.removeHost(f)}),m[27]=u,ns(m);let h=null;try{let e=Fm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),Wl(u,m),Lf(c,m,e),ou(c,e,m),Im(c,e),n!==void 0&&$m(e,this.ngContentSelectors,n),h=so(e.index,m),m[8]=h[8],rp(c,m,null)}catch(e){throw h!==null&&Hl(h),Hl(m),e}finally{Fc(Sc.DynamicComponentEnd),ss()}return new Qm(this.componentType,m,!!p)}};function Jm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:qu(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[_m].requiredVars,e.create&&(e.targetIdx=0,(a??=[]).push(e)),e.update&&(e.targetIdx=0,(o??=[]).push(e));if(r)for(let e=0;e{if(n&1&&e)for(let t of e)t.create();if(n&2&&t)for(let e of t)e.update()}}function Zm(e){let t=e[_m].kind;return t===`input`||t===`twoWay`}var Qm=class extends Qp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=io(t[1],27),this.location=jl(this._tNode,t),this.instance=so(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new Rp(t,void 0),this.componentType=e}setInput(e,t){this._hasInputBindings;let n=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),t))return;let r=this._rootLView;ep(n,r[1],r,e,t),this.previousInputValues.set(e,t),Ap(so(n.index,r),1)}get injector(){return new Tl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function $m(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=th}return e})();function th(){return ah(No(),O())}var nh=class e extends eh{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return jl(this._hostTNode,this._hostLView)}get injector(){return new Tl(this._hostTNode,this._hostLView)}get parentInjector(){let e=pl(this._hostTNode,this._hostLView);if($c(e)){let t=nl(e,this._hostLView),n=el(e),r=t[1].data[n+8];return new Tl(r,t)}return new Tl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=rh(this._lContainer);return t!==null&&t[e]||null}get length(){return this._lContainer.length-10}createEmbeddedView(e,t,n){let r,i;typeof n==`number`?r=n:n!=null&&(r=n.index,i=n.injector);let a=Xp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,op(this._hostTNode,a)),o}createComponent(e,t,n,r,i,a,o){let s,c=t||{};s=c.index,n=c.injector,r=c.projectableNodes,i=c.environmentInjector||c.ngModuleRef,a=c.directives,o=c.bindings;let l=new qm(Ei(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Aa,null);e&&(i=e)}let d=Ei(l.componentType??{}),f=Xp(this._lContainer,d?.id??null),p=f?.firstChild??null,m=l.create(u,r,p,i,a,o,this._getHostElementNamespace());return this.insertImpl(m.hostView,s,op(this._hostTNode,f)),m}_getHostElementNamespace(){if(this._hostTNode.type&2){let e=this._hostTNode.parent??this._hostLView[5];return e!==null&&e.type&2&&typeof e.value==`string`&&e.value.toLowerCase()===`foreignobject`?null:e?.namespace??null}return this._hostTNode.namespace}insert(e,t){return this.insertImpl(e,t,!0)}insertImpl(t,n,r){let i=t._lView;if(lo(i)){let n=this.indexOf(t);if(n!==-1)this.detach(n);else{let n=i[3],r=new e(n,n[5],n[3]);r.detach(r.indexOf(t))}}let a=this._adjustIndex(n),o=this._lContainer;return Np(o,i,a,r),t.attachToViewContainerRef(),na(ih(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=rh(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);n&&(ra(ih(this._lContainer),t),of(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);return n&&ra(ih(this._lContainer),t)!=null?new Rp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function rh(e){return e[8]}function ih(e){return e[8]||=[]}function ah(e,t){let n,r=t[e.index];return Ka(r)?n=r:(n=jp(r,t,null,e),t[e.index]=n,Mf(t,n)),sh(n,t,e,r),new nh(n,e,t)}function oh(e,t){let n=e[11],r=n.createComment(``),i=ro(t,e);return Su(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var sh=uh,ch=()=>!1;function lh(e,t,n){return ch(e,t,n)}function uh(e,t,n,r){if(e[7])return;let i;i=n.type&8?to(r):oh(t,n),e[7]=i}var dh=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},fh=class e{queries;constructor(e=[]){this.queries=e}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries===null?n.length:t.contentQueries[0],i=[];for(let e=0;e0)r.push(o[e/2]);else{let i=a[e+1],o=t[-n];for(let e=10;ee.trim())}function Eh(e,t,n){e.queries===null&&(e.queries=new mh),e.queries.track(new hh(t,n))}function Dh(e,t){return e.queries.getByIndex(t)}function Oh(e,t){let n=e[1],r=Dh(n,t);return r.crossesNgTemplate?xh(n,e,t,[]):bh(n,e,r,t)}function kh(e,t,n){let r,i=Mn(()=>{r._dirtyCounter();let n=Nh(r,e);if(t&&n===void 0)throw new T(-951,!1);return n});return r=i[dn],r._dirtyCounter=j(0),r._flatValue=void 0,i}function Ah(e){return kh(!0,!1,e)}function jh(e){return kh(!0,!0,e)}function Mh(e,t){let n=e[dn];n._lView=O(),n._queryIndex=t,n._queryList=Sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function Nh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:ua;let i=Sh(n,r),a=Oh(n,r);return i.reset(a,Nl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function Ph(e){return!!e&&typeof e.then==`function`}function Fh(e){return!!e&&typeof e.subscribe==`function`}var Ih=class{},Lh=class extends Ih{injector;instance=null;constructor(e){super();let t=new ja([...e.providers,{provide:Ih,useValue:this}],e.parent||ka(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Rh(e,t,n=null){return new Lh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var zh=(()=>{class e{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let t=ga(!1,e.type),n=t.length>0?Rh([t],this._injector,``):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static ɵprov=di({token:e,providedIn:`environment`,factory:()=>new e(qi(Aa))})}return e})();function Bh(e){return xc(()=>{let t=Kh(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Ll.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(zh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||su.Emulated,styles:e.styles||ua,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&jd(`NgStandalone`),qh(n);let r=e.dependencies;return n.directiveDefs=Jh(r,Vh),n.pipeDefs=Jh(r,Oi),n.id=Yh(n),n})}function Vh(e){return Ei(e)||Di(e)}function Hh(e,t){if(e==null)return la;let n={};for(let r in e)if(Object.hasOwn(e,r)){let i=e[r],a,o,s,c;Array.isArray(i)?(s=i[0],a=i[1],o=i[2]??a,c=i[3]||null):(a=i,o=i,s=Pf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Uh(e){if(e==null)return la;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Wh(e){return xc(()=>{let t=Kh(e);return qh(t),t})}function Gh(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Kh(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||la,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||ua,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Hh(e.inputs,t),outputs:Uh(e.outputs),debugInfo:null}}function qh(e){e.features?.forEach(t=>t(e))}function Jh(e,t){return e?()=>{let n=typeof e==`function`?e():e,r=[];for(let e of n){let n=t(e);n!==null&&r.push(n)}return r}:null}function Yh(e){let t=0,n=typeof e.consts==`function`?``:e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let e of r.join(`|`))t=Math.imul(31,t)+e.charCodeAt(0)<<0;return t+=2147483648,`c`+t}var Xh=new vi(``),Zh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=E(Xh,{optional:!0})??[];injector=E(xs);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=Ha(this.injector,t);if(Ph(n))e.push(n);else if(Fh(n)){let t=new Promise((e,t)=>{n.subscribe({complete:e,error:t})});e.push(t)}}let t=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{t()}).catch(e=>{this.reject(e)}),e.length===0&&t(),this.initialized=!0}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function Qh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=Zc(e.mergedAttrs,e.attrs);let t=e.tView=Tf(2,e,i,a,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),t.queries=n.queries.embeddedTView(e))}s&&(e.flags|=s),Io(e,!1);let c=ng(n,t,e,r);_s()&&hf(n,t,c,e),Wl(c,t);let l=jp(c,t,c,e);t[r+27]=l,Mf(t,l),lh(l,e,t)}function $h(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=Hp(t,d,4,o||null,s||null),Oo()&&xm(t,e,f,uo(t.consts,l),qf),Lc(t,f)):f=t.data[d],Qh(f,e,t,n,r,i,a,c),Ya(f)&&Lf(t,e,f),l!=null&&Rf(e,f,u),f}function eg(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=Hp(t,d,4,o||null,s||null),l!=null){let e=uo(t.consts,l);f.localNames=[];for(let t=0;t{throw new T(600,``)})}var sg=10,cg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=E(Js);afterRenderManager=E(Md);zonelessEnabled=E(ac);rootEffectScheduler=E(sc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Zr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=E(Ds);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(ei(e=>!e))}constructor(){E(kd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=E(Aa);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=xs.NULL){return this._injector.get(Fs).run(()=>{if(Fc(Sc.BootstrapComponentStart),!this._injector.get(Zh).done)throw new T(405,``);let r=Ei(e),i=this._injector.get(Ih),a=new qm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=lg(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(ig,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),ug(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Fc(Sc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Fc(Sc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(Od.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Fc(Sc.ChangeDetectionEnd),new T(101,!1);let e=w(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,w(e),this.afterTick.next(),Fc(Sc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get($p,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++ho(e))){this.dirtyFlags|=2;return}this.dirtyFlags&=-8}attachView(e){let t=e;this._views.push(t),t.attachToAppRef(this)}detachView(e){let t=e;ug(this._views,t),t.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView);try{this.tick()}catch(e){this.internalErrorHandler(e)}this.components.push(e),this._injector.get(ag,[]).forEach(t=>t(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>ug(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new T(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function lg(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function ug(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function N(e,t,n,r){let i=O();return om(i,Go(),t)&&(Mo(),Jf(ds(),i,e,t,n,r)),N}function dg(e){if(jd(`NgAnimateEnter`),!fd)return dg;let t=O();if(pd(t))return dg;let n=No(),r=t[9].get(Fs);return Dd(Cd(t),n,()=>fg(t,n,e,r)),Wd(t[9]),Gd(t[9],Cd(t)),dg}function fg(e,t,n,r){let i=ro(t,e),a=e[11],o=wd(n),s=[],c=!1,l=e=>{if(Td(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{Td(e)===i&&(Ed(e,i)&&(c=!0),pg(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),md(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(sd(i,_d,fd),!_d.has(i))){for(let e of o)a.removeClass(i,e);hd(i)}})})}}function pg(e,t,n){let r=gd.get(t);if(Td(e)===t&&r&&Ed(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);hd(t)}}var mg=class{destroy(e){}updateValue(e,t){}swap(e,t){let n=Math.min(e,t),r=Math.max(e,t),i=this.detach(r);if(r-n>1){let e=this.detach(n);this.attach(n,i),this.attach(r,e)}else this.attach(n,i)}move(e,t){this.attach(t,this.detach(e))}};function hg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function gg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){w(r);let c=t.length-1;for(w(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=hg(o,r,o,l,n);if(u!==0){u<0&&e.updateValue(o,l),o++;continue}let d=e.at(s),f=t[c],p=hg(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),h=n(s,d),g=n(o,l);if(Object.is(g,h)){let t=n(c,f);Object.is(t,m)?(e.swap(o,s),e.updateValue(s,f),c--,s--):e.move(s,o),e.updateValue(o,l),o++;continue}if(i??=new bg,a??=yg(e,o,s,n),_g(e,i,o,g))e.updateValue(o,l),o++,s++;else if(a.has(g))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)vg(e,i,n,o,t[o]),o++}else if(t!=null){w(r);let c=t[Symbol.iterator]();w(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=hg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new bg,a??=yg(e,o,s,n);let u=n(o,r);if(_g(e,i,o,u))e.updateValue(o,r),o++,s++,l=c.next();else if(!a.has(u))e.attach(o,e.create(o,r)),o++,s++,l=c.next();else{let r=n(o,t);i.set(r,e.detach(o)),s--}}}for(;!l.done;)vg(e,i,n,e.length,l.value),l=c.next()}for(;o<=s;)e.destroy(e.detach(s--));i?.forEach(t=>{e.destroy(t)})}function _g(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function vg(e,t,n,r,i){if(_g(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function yg(e,t,n,r){let i=new Set;for(let a=t;a<=n;a++)i.add(r(a,e.at(a)));return i}var bg=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let t=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(t)?(this.kvMap.set(e,this._vMap.get(t)),this._vMap.delete(t)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,t){if(this.kvMap.has(e)){let n=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let r=this._vMap;for(;r.has(n);)n=r.get(n);r.set(n,t)}else this.kvMap.set(e,t)}forEach(e){for(let[t,n]of this.kvMap)if(e(n,t),this._vMap!==void 0){let r=this._vMap;for(;r.has(n);)n=r.get(n),e(n,t)}}};function P(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=O(),l=Mo();return eg(c,l,e,t,n,r,i,uo(l.consts,a),256,o,s),xg}function xg(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=O(),l=Mo();return eg(c,l,e,t,n,r,i,uo(l.consts,a),512,o,s),xg}function F(e,t){jd(`NgControlFlow`);let n=O(),r=Go(),i=n[r]===Ju?-1:n[r],a=i===-1?void 0:Dg(n,27+i);if(om(n,r,e)){let r=w(null);try{if(a!==void 0&&Pp(a,0),e!==-1){let r=27+e,i=Dg(n,r),a=Mg(n[1],r),o=Zp(i,a,n);Np(i,ap(n,a,t,{dehydratedView:o}),0,op(a,o))}}finally{w(r)}}else if(a!==void 0){let e=Mp(a,0);e!==void 0&&(e[8]=t)}}var Sg=class{lContainer;$implicit;$index;constructor(e,t,n){this.lContainer=e,this.$implicit=t,this.$index=n}get $count(){return this.lContainer.length-10}};function Cg(e){return e}function wg(e,t){return t}var Tg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function I(e,t,n,r,i,a,o,s,c,l,u,d,f){jd(`NgControlFlow`);let p=O(),m=Mo(),h=c!==void 0,g=O(),_=new Tg(h,s?o.bind(g[15][8]):o);g[27+e]=_,eg(p,m,e+1,t,n,r,i,uo(m.consts,a),256),h&&eg(p,m,e+2,c,l,u,d,uo(m.consts,f),512)}var Eg=class extends mg{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,t,n){super(),this.lContainer=e,this.hostLView=t,this.templateTNode=n}get length(){return this.lContainer.length-10}at(e){return this.getLView(e)[8].$implicit}attach(e,t){let n=t[6];this.needsIndexUpdate||=e!==this.length,Np(this.lContainer,t,e,op(this.templateTNode,n)),Og(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,kg(this.lContainer,e),Ag(this.lContainer,e)}create(e,t){let n=Xp(this.lContainer,this.templateTNode.tView.ssrId);return ap(this.hostLView,this.templateTNode,new Sg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){of(e[1],e)}updateValue(e,t){this.getLView(e)[8].$implicit=t}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e0){let e=n[9];Hd(e,r),ld.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function kg(e,t){if(e.length<=10)return;let n=e[10+t],r=n?n[26]:void 0;r&&r.leave&&r.leave.size>0&&(r.detachedLeaveAnimationFns=[])}function Ag(e,t){return Fp(e,t)}function jg(e,t){return Mp(e,t)}function Mg(e,t){return io(e,t)}function R(e,t,n){let r=O();return om(r,Go(),t)&&(Mo(),Vf(ds(),r,e,t,r[11],n)),R}function Ng(e,t,n,r,i){ep(t,e,n,i?`class`:`style`,r)}function z(e,t,n,r){let i=O(),a=i[1],o=e+27,s=a.firstCreatePass?Fm(o,i,2,t,qf,Oo(),n,r):a.data[o];if(Ja(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(tm(o),()=>(Pg(e,t,i,s,r),z))}}return Pg(e,t,i,s,r),z}function Pg(e,t,n,r,i){if(Zf(r,n,e,t,Ig),Ya(r)){let e=n[1];Lf(e,n,r),ou(e,r,n)}i!=null&&Rf(n,r)}function B(){let e=Mo(),t=Qf(No());return e.firstCreatePass&&Im(e,t),Ao(t)&&jo(),Do(),t.classesWithoutHost!=null&&Kc(t)&&Ng(e,t,O(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&qc(t)&&Ng(e,t,O(),t.stylesWithoutHost,!1),B}function V(e,t,n,r){return z(e,t,n,r),B(),V}function H(e,t,n,r){let i=O(),a=i[1],o=e+27,s=a.firstCreatePass?Lm(o,a,2,t,n,r):a.data[o];return Zf(s,i,e,t,Ig),r!=null&&Rf(i,s),H}function U(){return Ao(Qf(No()))&&jo(),Do(),U}function Fg(e,t,n,r){return H(e,t,n,r),U(),Fg}var Ig=(e,t,n,r,i)=>(vs(!0),xu(t[11],r,hs()));function Lg(e,t,n){let r=O(),i=r[1],a=e+27,o=i.firstCreatePass?Fm(a,r,8,`ng-container`,qf,Oo(),t,n):i.data[a];if(Zf(o,r,e,`ng-container`,Bg),Ya(o)){let e=r[1];Lf(e,r,o),ou(e,o,r)}return n!=null&&Rf(r,o),Lg}function Rg(){let e=Mo(),t=Qf(No());return e.firstCreatePass&&Im(e,t),Rg}function zg(e,t,n){return Lg(e,t,n),Rg(),zg}var Bg=(e,t,n,r,i)=>(vs(!0),bu(t[11],``));function W(){return O()}function Vg(e,t,n){let r=O();return om(r,Go(),t)&&(Mo(),Hf(ds(),r,e,t,r[11],n)),Vg}var Hg=void 0;function Ug(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Wg=[`en`,[[`a`,`p`],[`AM`,`PM`]],[[`AM`,`PM`]],[[`S`,`M`,`T`,`W`,`T`,`F`,`S`],[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`]],Hg,[[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],Hg,[[`B`,`A`],[`BC`,`AD`],[`Before Christ`,`Anno Domini`]],0,[6,0],[`M/d/yy`,`MMM d, y`,`MMMM d, y`,`EEEE, MMMM d, y`],[`h:mm a`,`h:mm:ss a`,`h:mm:ss a z`,`h:mm:ss a zzzz`],[`{1}, {0}`,Hg,Hg,Hg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ug],Gg=Object.create(null);function Kg(e){let t=Yg(e),n=qg(t);if(n)return n;let r=t.split(`-`)[0];if(n=qg(r),n)return n;if(r===`en`)return Wg;throw new T(701,!1)}function qg(e){if(!(e in Gg)){let t=Hi.ng&&Hi.ng.common&&Hi.ng.common.locales&&Hi.ng.common.locales[e];return t!==void 0&&(Gg[e]=t),t}return Gg[e]}var Jg={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencyCode:15,CurrencySymbol:16,CurrencyName:17,Currencies:18,Directionality:19,PluralCase:20,ExtraData:21};function Yg(e){return e.toLowerCase().replace(/_/g,`-`)}var Xg=`en-US`;function Zg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function G(e,t,n){let r=O(),i=Mo(),a=No();return $g(i,r,r[11],a,e,t,n),G}function Qg(e,t,n){let r=O(),i=Mo(),a=No();return(a.type&3||n)&&fm(a,i,r,n,r[11],e,t,um(a,r,t)),Qg}function $g(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=um(r,t,a),fm(r,e,t,o,n,i,a,c)&&(s=!1)),s){let e=r.outputs?.[i],n=r.hostDirectiveOutputs?.[i];if(n&&n.length)for(let e=0;e>17&32767}function a_(e){return(e&2)==2}function o_(e,t){return e&131071|t<<17}function s_(e){return e|2}function c_(e){return(e&131068)>>2}function l_(e,t){return e&-131069|t<<2}function u_(e){return(e&1)==1}function d_(e){return e|1}function f_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=i_(o),c=c_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||sa(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=i_(e[s+1]);e[r+1]=r_(t,s),t!==0&&(e[t+1]=l_(e[t+1],r)),e[s+1]=o_(e[s+1],r)}else e[r+1]=r_(s,0),s!==0&&(e[s+1]=l_(e[s+1],r)),s=r}else e[r+1]=r_(c,0),s===0?s=r:e[c+1]=l_(e[c+1],r),c=r;l&&(e[r+1]=s_(e[r+1])),m_(e,u,r,!0),m_(e,u,r,!1),p_(t,u,e,r,a),o=r_(s,c),a?t.classBindings=o:t.styleBindings=o}function p_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&sa(a,t)>=0&&(n[r+1]=d_(n[r+1]))}function m_(e,t,n,r){let i=e[n+1],a=t===null,o=r?i_(i):c_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];h_(n,t)&&(s=!0,e[o+1]=r?d_(i):s_(i)),o=r?i_(i):c_(i)}s&&(e[n+1]=r?s_(i):d_(i))}function h_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?sa(e,t)>=0:!1}var g_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function __(e){return e.substring(g_.key,g_.keyEnd)}function v_(e){return b_(e),y_(e,x_(e,0,g_.textEnd))}function y_(e,t){let n=g_.textEnd;return n===t?-1:(t=g_.keyEnd=S_(e,g_.key=t,n),x_(e,t,n))}function b_(e){g_.key=0,g_.keyEnd=0,g_.value=0,g_.valueEnd=0,g_.textEnd=e.length}function x_(e,t,n){for(;t32;)t++;return t}function C_(e,t,n){return E_(e,t,n,!1),C_}function q(e,t){return E_(e,t,null,!0),q}function w_(e){D_(L_,T_,e,!0)}function T_(e,t){for(let n=v_(t);n>=0;n=y_(t,n))aa(e,__(t),!0)}function E_(e,t,n,r){let i=O(),a=Mo(),o=Ko(2);if(a.firstUpdatePass&&k_(a,e,o,r),t!==Ju&&om(i,o,t)){let s=a.data[ls()];z_(a,s,i,i[11],e,i[o+1]=H_(t,n),r,o)}}function D_(e,t,n,r){let i=Mo(),a=Ko(2);i.firstUpdatePass&&k_(i,null,a,r);let o=O();if(n!==Ju&&om(o,a,n)){let s=i.data[ls()];if(U_(s,r)&&!O_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=oi(e,n||``)),Ng(i,s,o,n,r)}else R_(i,s,o,o[11],o[a+1],o[a+1]=I_(e,t,n),r,a)}}function O_(e,t){return t>=e.expandoStartIndex}function k_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[ls()],o=O_(e,n);U_(a,r)&&t===null&&!o&&(t=!1),t=A_(i,a,t,r),f_(i,a,t,n,o,r)}}function A_(e,t,n,r){let i=Zo(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=P_(null,e,t,n,r),n=F_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=P_(i,e,t,n,r),a===null){let n=j_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=P_(null,e,t,n[1],r),n=F_(n,t.attrs,r),M_(e,t,r,n))}else a=N_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function j_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(c_(r)!==0)return e[i_(r)]}function M_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[i_(i)]=r}function N_(e,t,n){let r,i=t.directiveEnd;for(let a=1+t.directiveStylingLast;a0;){let t=e[i],a=Array.isArray(t),c=a?t[1]:t,l=c===null,u=n[i+1];u===Ju&&(u=l?ua:void 0);let d=l?oa(u,r):c===r?u:void 0;if(a&&!V_(d)&&(d=oa(t,r)),V_(d)&&(s=d,o))return s;let f=e[i+1];i=o?i_(f):c_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=oa(e,r))}return s}function V_(e){return e!==void 0}function H_(e,t){return e==null||e===``||(typeof t==`string`?e=lu(e)+t:typeof e==`object`&&(e=ai(lu(e)))),e}function U_(e,t){return!!(e.flags&(t?8:16))}function J(e,t=``){let n=O(),r=Mo(),i=e+27,a=r.firstCreatePass?Hp(r,i,1,t,null):r.data[i],o=W_(r,n,a,t);n[i]=o,_s()&&hf(r,n,o,a),Io(a,!1)}var W_=(e,t,n,r)=>(vs(!0),vu(t[11],r));function G_(e,t,n,r=``){return om(e,Go(),n)?t+Ai(n)+r:Ju}function K_(e,t,n,r,i,a=``){let o=sm(e,Uo(),n,i);return Ko(2),o?t+Ai(n)+r+Ai(i)+a:Ju}function q_(e,t,n,r,i,a,o,s=``){let c=cm(e,Uo(),n,i,o);return Ko(3),c?t+Ai(n)+r+Ai(i)+a+Ai(o)+s:Ju}function J_(e,t,n,r,i,a,o,s,c,l=``){let u=lm(e,Uo(),n,i,o,c);return Ko(4),u?t+Ai(n)+r+Ai(i)+a+Ai(o)+s+Ai(c)+l:Ju}function Y(e){return X(``,e),Y}function X(e,t,n){let r=O(),i=G_(r,e,t,n);return i!==Ju&&Z_(r,ls(),i),X}function Z(e,t,n,r,i){let a=O(),o=K_(a,e,t,n,r,i);return o!==Ju&&Z_(a,ls(),o),Z}function Y_(e,t,n,r,i,a,o){let s=O(),c=q_(s,e,t,n,r,i,a,o);return c!==Ju&&Z_(s,ls(),c),Y_}function X_(e,t,n,r,i,a,o,s,c){let l=O(),u=J_(l,e,t,n,r,i,a,o,s,c);return u!==Ju&&Z_(l,ls(),u),X_}function Z_(e,t,n){let r=no(t,e);yu(e[11],r,n)}function Q_(e,t,n){vc(t)&&(t=t());let r=O();return om(r,Go(),t)&&(Mo(),Vf(ds(),r,e,t,r[11],n)),Q_}function $_(e,t){let n=vc(e);return n&&e.set(t),n}function ev(e,t){let n=O(),r=Mo(),i=No();return $g(r,n,n[11],i,e,t),ev}var tv={};function nv(e){jd(`NgLet`);let t=Mo(),n=O(),r=e+27;return Io(Hp(t,r,128,null,null),!1),oo(t,n,r,tv),nv}function rv(e){return oo(Mo(),O(),ls(),e),e}function iv(e){let t=ao(zo(),27+e);if(t===tv)throw new T(314,!1);return t}function av(e,t){let n=Ho()+e,r=O();return r[n]===Ju?im(r,n,t()):am(r,n)}function ov(e,t,n){return cv(O(),Ho(),e,t,n)}function sv(e,t){let n=e[t];return n===Ju?void 0:n}function cv(e,t,n,r,i,a){let o=t+n;return om(e,o,i)?im(e,o+1,a?r.call(a,i):r(i)):sv(e,o+1)}function lv(e,t,n,r,i,a,o){let s=t+n;return sm(e,s,i,a)?im(e,s+2,o?r.call(o,i,a):r(i,a)):sv(e,s+2)}function uv(e,t){let n=Mo(),r,i=e+27;n.firstCreatePass?(r=dv(t,n.pipeRegistry),n.data[i]=r,r.onDestroy&&(n.destroyHooks??=[]).push(i,r.onDestroy)):r=n.data[i];let a=r.factory||(r.factory=Qi(r.type,!0)),o=Bi(bm);try{let e=il(!1),t=a();return il(e),oo(n,O(),i,t),t}finally{Bi(o)}}function dv(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function fv(e,t,n){let r=e+27,i=O(),a=ao(i,r);return mv(i,r)?cv(i,Ho(),t,a.transform,n,a):a.transform(n)}function pv(e,t,n,r){let i=e+27,a=O(),o=ao(a,i);return mv(a,i)?lv(a,Ho(),t,o.transform,n,r,o):o.transform(n,r)}function mv(e,t){return e[1].data[t].pure}function hv(e,t){return Vp(e,t)}var gv=(()=>{class e{applicationErrorHandler=E(Js);appRef=E(cg);taskService=E(Ds);ngZone=E(Fs);zonelessEnabled=E(ac);tracing=E(kd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new hr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ns):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(E(oc,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let e=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(e);return}this.switchToMicrotaskScheduler(),this.taskService.remove(e)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let e=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})})}notify(e){if(!this.zonelessEnabled&&e===5)return;switch(e){case 0:case 2:this.appRef.dirtyFlags|=2;break;case 3:case 4:case 5:case 1:this.appRef.dirtyFlags|=4;break;case 6:this.appRef.dirtyFlags|=2;break;case 12:this.appRef.dirtyFlags|=16;break;case 13:this.appRef.dirtyFlags|=2;break;case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let t=this.useMicrotaskScheduler?js:As;this.pendingRenderTaskId=this.taskService.add(),this.cancelScheduledCallback=this.scheduleInRootZone?Zone.root.run(()=>t(()=>this.tick())):this.ngZone.runOutsideAngular(()=>t(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(`isAngularZone_ID`+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(e){this.applicationErrorHandler(e)}finally{this.taskService.remove(e),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function _v(){return[{provide:ic,useExisting:gv},{provide:Fs,useClass:Us},{provide:ac,useValue:!0}]}function vv(){return typeof $localize<`u`&&$localize.locale||`en-US`}var yv=new vi(``,{factory:()=>E(yv,{optional:!0,skipSelf:!0})||vv()}),bv=class{destroyed=!1;listeners=null;errorHandler=E(qs,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=E(Cs);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new T(953,!1);return(this.listeners??=[]).push(e),{unsubscribe:()=>{let t=this.listeners?this.listeners.indexOf(e):-1;t>-1&&(this.isEmitting?(this.hasNullListeners=!0,this.listeners[t]=null):this.listeners.splice(t,1))}}}emit(e){if(this.destroyed){console.warn(ri(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=w(null);try{for(let t of this.listeners)try{t!==null&&t(e)}catch(e){this.errorHandler?.handleError(e)}}finally{this.hasNullListeners&&(this.hasNullListeners=!1,this.listeners&&xv(this.listeners)),w(t),this.isEmitting=!1}}};function xv(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function Q(e,t){return Mn(e,t?.equal)}function Sv(e){return ar(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var Cv=e=>e;function wv(e,t){return typeof e==`function`?Tv(tr(e,Cv,t?.equal),t?.debugName,t?.set):Tv(tr(e.source,e.computation,e.equal),e.debugName,e.set)}function Tv(e,t,n){let r=e[dn],i=e;if(n!==void 0){let t=e=>nr(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Sv(e)),t)}else i.set=e=>nr(r,e),i.update=e=>rr(r,e);return i.asReadonly=Xs.bind(e),i}function Ev(e,t){let n=Object.create(bc);n.value=e,n.transformFn=t?.transform;function r(){if(mn(n),n.value===yc)throw new T(-950,null);return n.value}return r[dn]=n,r}function Dv(e){return new bv}function Ov(e,t){return Ev(e,t)}function kv(e){return Ev(yc,e)}var $=(Ov.required=kv,Ov);function Av(e,t){let n=Object.create(bc),r=new bv;n.value=e;function i(){return mn(n),jv(n.value),n.value}return i[dn]=n,i.asReadonly=Xs.bind(i),i.set=e=>{n.equal(n.value,e)||(Wn(n,e),r.emit(e))},i.update=e=>{jv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function jv(e){if(e===yc)throw new T(952,!1)}function Mv(e,t){return Av(e,t)}function Nv(e){return Av(yc,e)}var Pv=(Mv.required=Nv,Mv);function Fv(e,t){return Ah(t)}function Iv(e,t){return jh(t)}var Lv=(Fv.required=Iv,Fv),Rv=new vi(``),zv=new vi(``);function Bv(e){return!e.moduleRef}function Vv(e){let t=Bv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Fs);return n.run(()=>{Bv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Js),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),Bv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(Rv);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(Rv);n.add(t),e.moduleRef.onDestroy(()=>{ug(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return Uv(r,n,()=>{let n=t.get(Ds),r=n.add(),i=t.get(Zh);return i.runInitializers(),i.donePromise.then(()=>{if(Zg(t.get(yv,Xg)||`en-US`),!t.get(zv,!0))return Bv(e)?t.get(cg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Bv(e)){let n=t.get(cg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return Hv?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var Hv;function Uv(e,t,n){try{let r=n();return Ph(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Wv=null;function Gv(e=[],t){return xs.create({name:t,providers:[{provide:Ta,useValue:`platform`},{provide:Rv,useValue:new Set([()=>Wv=null])},...e]})}function Kv(e=[]){if(Wv)return Wv;let t=Gv(e);return Wv=t,og(),qv(t),t}function qv(e){let t=e.get($s,null);Ha(e,()=>{t?.forEach(e=>e())})}function Jv(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Fc(Sc.BootstrapApplicationStart);try{let e=i?.injector??Kv(r);return Vv({r3Injector:new Lh({providers:[_v(),Ys,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Fc(Sc.BootstrapApplicationEnd)}}var Yv=Symbol(`NOT_SET`),Xv=new Set,Zv={...Kn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Yv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(mn(r),r.value),r.signal[dn]=r,r.registerCleanupFn=e=>(r.cleanup??=new Set).add(e),this.nodes[e]=r,this.hooks[e]=e=>r.phaseFn(e)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();super.destroy();for(let e of this.nodes)if(e)try{for(let t of e.cleanup??Xv)t()}finally{En(e)}}};function $v(e,t){let n=t?.injector??E(xs),r=n.get(ic),i=n.get(Md),a=n.get(kd,null,{optional:!0});i.impl??=n.get(Pd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(nc,null,{optional:!0}),c=new Qv(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var ey=null;function ty(){return ey}function ny(e){ey??=e}var ry=class{},iy=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(iy||{}),ay=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(ay||{}),oy=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(oy||{}),sy={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 cy(e){return Kg(e)[Jg.LocaleId]}function ly(e,t,n){let r=Kg(e);return by(by([r[Jg.DayPeriodsFormat],r[Jg.DayPeriodsStandalone]],t),n)}function uy(e,t,n){let r=Kg(e);return by(by([r[Jg.DaysFormat],r[Jg.DaysStandalone]],t),n)}function dy(e,t,n){let r=Kg(e);return by(by([r[Jg.MonthsFormat],r[Jg.MonthsStandalone]],t),n)}function fy(e,t){let n=Kg(e)[Jg.Eras];return by(n,t)}function py(e,t){return by(Kg(e)[Jg.DateFormat],t)}function my(e,t){return by(Kg(e)[Jg.TimeFormat],t)}function hy(e,t){let n=Kg(e)[Jg.DateTimeFormat];return by(n,t)}function gy(e,t){let n=Kg(e),r=n[Jg.NumberSymbols][t];if(r===void 0){if(t===sy.CurrencyDecimal)return n[Jg.NumberSymbols][sy.Decimal];if(t===sy.CurrencyGroup)return n[Jg.NumberSymbols][sy.Group]}return r}function _y(e){if(!e[Jg.ExtraData])throw new T(2303,!1)}function vy(e){let t=Kg(e);return _y(t),(t[Jg.ExtraData][2]||[]).map(e=>typeof e==`string`?xy(e):[xy(e[0]),xy(e[1])])}function yy(e,t,n){let r=Kg(e);return _y(r),by(by([r[Jg.ExtraData][0],r[Jg.ExtraData][1]],t)||[],n)||[]}function by(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new T(2304,!1)}function xy(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Sy=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Cy=Object.create(null),wy=/((?:[^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]*)/,Ty=256;function Ey(e,t,n,r){let i=Yy(e);Dy(t),t=ky(n,t)||t;let a=[],o;for(;t;)if(o=wy.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=Ky(r,s),i=Jy(i,r));let c=``;return a.forEach(e=>{let t=Gy(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function Dy(e){if(e.length>Ty)throw new T(2300,!1)}function Oy(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function ky(e,t){let n=cy(e);if(Cy[n]??=Object.create(null),Cy[n][t])return Cy[n][t];let r=``;switch(t){case`shortDate`:r=py(e,oy.Short);break;case`mediumDate`:r=py(e,oy.Medium);break;case`longDate`:r=py(e,oy.Long);break;case`fullDate`:r=py(e,oy.Full);break;case`shortTime`:r=my(e,oy.Short);break;case`mediumTime`:r=my(e,oy.Medium);break;case`longTime`:r=my(e,oy.Long);break;case`fullTime`:r=my(e,oy.Full);break;case`short`:let t=ky(e,`shortTime`),n=ky(e,`shortDate`);r=Ay(hy(e,oy.Short),[t,n]);break;case`medium`:let i=ky(e,`mediumTime`),a=ky(e,`mediumDate`);r=Ay(hy(e,oy.Medium),[i,a]);break;case`long`:let o=ky(e,`longTime`),s=ky(e,`longDate`);r=Ay(hy(e,oy.Long),[o,s]);break;case`full`:let c=ky(e,`fullTime`),l=ky(e,`fullDate`);r=Ay(hy(e,oy.Full),[c,l])}return r&&(Cy[n][t]=r),r}function Ay(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function jy(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 My(s,t);let c=gy(o,sy.MinusSign);return jy(s,t,c,r,i)}}function Py(e,t){switch(e){case 0:return t.getFullYear();case 1:return t.getMonth();case 2:return t.getDate();case 3:return t.getHours();case 4:return t.getMinutes();case 5:return t.getSeconds();case 6:return t.getMilliseconds();case 7:return t.getDay();default:throw new T(2301,!1)}}function Fy(e,t,n=iy.Format,r=!1){return function(i,a){return Iy(i,a,e,t,n,r)}}function Iy(e,t,n,r,i,a){switch(n){case 2:return dy(t,i,r)[e.getMonth()];case 1:return uy(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=vy(t),a=yy(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?`+`:``)+jy(o,2,a)+jy(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+jy(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+jy(o,2,a)+`:`+jy(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+jy(o,2,a)+`:`+jy(Math.abs(i%60),2,a);default:throw new T(2310,!1)}}}var Ry=0,zy=4;function By(e){let t=Oy(e,Ry,1).getDay();return Oy(e,0,1+(t<=zy?zy:11)-t)}function Vy(e){let t=e.getDay(),n=t===0?-3:zy-t;return Oy(e.getFullYear(),e.getMonth(),e.getDate()+n)}function Hy(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=Vy(n),t=By(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return jy(i,e,gy(r,sy.MinusSign))}}function Uy(e,t=!1){return function(n,r){return jy(Vy(n).getFullYear(),e,gy(r,sy.MinusSign),t)}}var Wy=Object.create(null);function Gy(e){if(Wy[e])return Wy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Fy(3,ay.Abbreviated);break;case`GGGG`:t=Fy(3,ay.Wide);break;case`GGGGG`:t=Fy(3,ay.Narrow);break;case`y`:t=Ny(0,1,0,!1,!0);break;case`yy`:t=Ny(0,2,0,!0,!0);break;case`yyy`:t=Ny(0,3,0,!1,!0);break;case`yyyy`:t=Ny(0,4,0,!1,!0);break;case`Y`:t=Uy(1);break;case`YY`:t=Uy(2,!0);break;case`YYY`:t=Uy(3);break;case`YYYY`:t=Uy(4);break;case`M`:case`L`:t=Ny(1,1,1);break;case`MM`:case`LL`:t=Ny(1,2,1);break;case`MMM`:t=Fy(2,ay.Abbreviated);break;case`MMMM`:t=Fy(2,ay.Wide);break;case`MMMMM`:t=Fy(2,ay.Narrow);break;case`LLL`:t=Fy(2,ay.Abbreviated,iy.Standalone);break;case`LLLL`:t=Fy(2,ay.Wide,iy.Standalone);break;case`LLLLL`:t=Fy(2,ay.Narrow,iy.Standalone);break;case`w`:t=Hy(1);break;case`ww`:t=Hy(2);break;case`W`:t=Hy(1,!0);break;case`d`:t=Ny(2,1);break;case`dd`:t=Ny(2,2);break;case`c`:case`cc`:t=Ny(7,1);break;case`ccc`:t=Fy(1,ay.Abbreviated,iy.Standalone);break;case`cccc`:t=Fy(1,ay.Wide,iy.Standalone);break;case`ccccc`:t=Fy(1,ay.Narrow,iy.Standalone);break;case`cccccc`:t=Fy(1,ay.Short,iy.Standalone);break;case`E`:case`EE`:case`EEE`:t=Fy(1,ay.Abbreviated);break;case`EEEE`:t=Fy(1,ay.Wide);break;case`EEEEE`:t=Fy(1,ay.Narrow);break;case`EEEEEE`:t=Fy(1,ay.Short);break;case`a`:case`aa`:case`aaa`:t=Fy(0,ay.Abbreviated);break;case`aaaa`:t=Fy(0,ay.Wide);break;case`aaaaa`:t=Fy(0,ay.Narrow);break;case`b`:case`bb`:case`bbb`:t=Fy(0,ay.Abbreviated,iy.Standalone,!0);break;case`bbbb`:t=Fy(0,ay.Wide,iy.Standalone,!0);break;case`bbbbb`:t=Fy(0,ay.Narrow,iy.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Fy(0,ay.Abbreviated,iy.Format,!0);break;case`BBBB`:t=Fy(0,ay.Wide,iy.Format,!0);break;case`BBBBB`:t=Fy(0,ay.Narrow,iy.Format,!0);break;case`h`:t=Ny(3,1,-12);break;case`hh`:t=Ny(3,2,-12);break;case`H`:t=Ny(3,1);break;case`HH`:t=Ny(3,2);break;case`m`:t=Ny(4,1);break;case`mm`:t=Ny(4,2);break;case`s`:t=Ny(5,1);break;case`ss`:t=Ny(5,2);break;case`S`:t=Ny(6,1);break;case`SS`:t=Ny(6,2);break;case`SSS`:t=Ny(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=Ly(0);break;case`ZZZZZ`:t=Ly(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=Ly(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=Ly(2);break;default:return null}return Wy[e]=t,t}function Ky(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function qy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function Jy(e,t,n){let r=e.getTimezoneOffset();return qy(e,-1*(Ky(t,r)-r))}function Yy(e){if(Zy(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 Oy(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Sy))return Xy(n)}let t=new Date(e);if(!Zy(t))throw new T(2311,!1);return t}function Xy(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 Zy(e){return e instanceof Date&&!isNaN(e.valueOf())}var Qy=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=E(xs);constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let e=this._viewContainerRef;if(this._viewRef&&e.remove(e.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let t=this._createContextForwardProxy();this._viewRef=e.createEmbeddedView(this.ngTemplateOutlet,t,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===`outlet`?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,t,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,t,n):!1,get:(e,t,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,t,n)}})}static ɵfac=function(t){return new(t||e)(bm(eh))};static ɵdir=Wh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Ec]})}return e})();function $y(e,t){return new T(2100,!1)}var eb=`mediumDate`,tb=new vi(``),nb=new vi(``),rb=(()=>{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??eb,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Ey(t,e,i||this.locale,a)}catch(t){throw $y(e,t.message)}}static ɵfac=function(t){return new(t||e)(bm(yv,16),bm(tb,24),bm(nb,24))};static ɵpipe=Gh({name:`date`,type:e,pure:!0})}return e})(),ib=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=Gh({name:`json`,type:e,pure:!1})}return e})();function ab(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 ob=`browser`,sb=class{_doc;constructor(e){this._doc=e}manager},cb=(()=>{class e extends sb{constructor(e){super(e)}supports(e){return!0}addEventListener(e,t,n,r){return e.addEventListener(t,n,r),()=>this.removeEventListener(e,t,n,r)}removeEventListener(e,t,n,r){return e.removeEventListener(t,n,r)}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),lb=new vi(``),ub=(()=>{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 cb));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof cb);r&&this._plugins.push(r)}addEventListener(e,t,n,r){return this._findPluginFor(t).addEventListener(e,t,n,r)}getZone(){return this._zone}_findPluginFor(e){let t=this._eventNameToPlugin.get(e);if(t)return t;if(t=this._plugins.find(t=>t.supports(e)),!t)throw new T(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(qi(lb),qi(Fs))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),db=`ng-app-id`;function fb(e){for(let t of e)t.remove()}function pb(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function mb(e,t,n,r){let i=e.head?.querySelectorAll(`style[${db}="${t}"],link[${db}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(db),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 hb(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var gb=(()=>{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,mb(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,pb);t?.forEach(e=>this.addUsage(e,this.external,hb))}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&&(fb(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])fb(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,pb(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,hb(t,this.doc)))}}removeHost(e){this.hosts.delete(e);for(let t of[...this.inline.values(),...this.external.values()]){let n=[];for(let r of t.elements)r.parentNode===e?r.remove():n.push(r);t.elements=n}}addElement(e,t){return this.nonce&&t.setAttribute(`nonce`,this.nonce),e.appendChild(t)}static ɵfac=function(t){return new(t||e)(qi(Ss),qi(Zs),qi(tc,8),qi(ec))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),_b={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`},vb=/%COMP%/g,yb=`%COMP%`,bb=`_nghost-${yb}`,xb=`_ngcontent-${yb}`,Sb=!0,Cb=new vi(``,{factory:()=>Sb}),wb=new vi(``);function Tb(e){return xb.replace(vb,e)}function Eb(e){return bb.replace(vb,e)}function Db(e,t){return t.map(t=>t.replace(vb,e))}var Ob=(()=>{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 kb(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 Nb?n.applyToHost(e):n instanceof Mb&&n.applyStyles(),n}getOrCreateRenderer(e,t){let n=this.rendererByCompId,r=n.get(t.id);if(!r){let i=this.doc,a=this.ngZone,o=this.eventManager,s=this.sharedStylesHost,c=this.removeStylesOnCompDestroy,l=this.tracingService;switch(t.encapsulation){case su.Emulated:r=new Nb(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case su.ShadowDom:return new jb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case su.ExperimentalIsolatedShadowDom:return new jb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new Mb(o,s,t,c,i,a,l,this.cssVarNamespace)}n.set(t.id,r)}return r}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static ɵfac=function(t){return new(t||e)(qi(ub),qi(vm),qi(Zs),qi(Cb),qi(Ss),qi(Fs),qi(tc),qi(kd,8),qi(wb,8))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),kb=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(_b[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(Ab(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=Ab(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new T(-5106,!1);r.insertBefore(t,n)}}removeChild(e,t){t.remove()}selectRootElement(e,t){let n=typeof e==`string`?this.doc.querySelector(e):e;if(!n)throw new T(-5104,!1);return t||(n.textContent=``),n}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,t,n,r){if(r){t=r+`:`+t;let i=_b[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=_b[n];r?e.removeAttributeNS(r,t):e.removeAttribute(`${n}:${t}`)}else e.removeAttribute(t)}addClass(e,t){e.classList.add(t)}removeClass(e,t){e.classList.remove(t)}setStyle(e,t,n,r){let i=t.startsWith(`--`);i&&(t=t.replace(`%NS%`,this.cssVarNamespace)),i||r&(Yu.DashCase|Yu.Important)?e.style.setProperty(t,n,r&Yu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Yu.DashCase?e.style.removeProperty(t):e.style[t]=``}setProperty(e,t,n){e!=null&&(e[t]=n)}setValue(e,t){e.nodeValue=t}listen(e,t,n,r){if(typeof e==`string`&&(e=ty().getGlobalEventTarget(this.doc,e),!e))throw new T(-5102,!1);let i=this.decoratePreventDefault(n);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(e,t,i)),this.eventManager.addEventListener(e,t,i,r)}decoratePreventDefault(e){return t=>{if(t===`__ngUnwrap__`)return e;e(t)===!1&&t.preventDefault()}}};function Ab(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var jb=class extends kb{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=Db(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=hb(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)}},Mb=class extends kb{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?Db(c,l):l;this.styles=u.map(e=>e.replace(/%NS%/g,s)),this.styleUrls=n.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&ld.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Nb=class extends Mb{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=Tb(l),this.hostAttr=Eb(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}},Pb=class e extends ry{supportsDOMEvents=!0;static makeCurrent(){ny(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=Ib();return t==null?null:Lb(t)}resetBaseElement(){Fb=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return ab(document.cookie,e)}},Fb=null;function Ib(){return Fb||=document.head.querySelector(`base`),Fb?Fb.getAttribute(`href`):null}function Lb(e){return new URL(e,document.baseURI).pathname}var Rb=[`alt`,`control`,`meta`,`shift`],zb={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},Bb={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},Vb=(()=>{class e extends sb{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(()=>ty().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.`),Rb.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=zb[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`),Rb.forEach(t=>{if(t!==n){let n=Bb[t];n(e)&&(r+=t+`.`)}}),r+=n,r===t)}static eventCallback(t,n,r){return i=>{e.matchEventFullKeyCode(i,t)&&r.runGuarded(()=>n(i))}}static _normalizeKey(e){return e===`esc`?`escape`:e}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})();async function Hb(e,t,n){return Jv({rootComponent:e,...Ub(t,n)})}function Ub(e,t){return{platformRef:t?.platformRef,appProviders:[...Jb,...e?.providers??[]],platformProviders:qb}}function Wb(){Pb.makeCurrent()}function Gb(){return new qs}function Kb(){return Yl(document),document}var qb=[{provide:ec,useValue:ob},{provide:$s,useValue:Wb,multi:!0},{provide:Ss,useFactory:Kb}],Jb=[{provide:Ta,useValue:`root`},{provide:qs,useFactory:Gb},{provide:lb,useClass:cb,multi:!0},{provide:lb,useClass:Vb,multi:!0},Ob,{provide:vm,useClass:gb},{provide:gb,useExisting:vm},ub,{provide:$p,useExisting:Ob},[]];function Yb(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 $b({code:i,why:Zb(a.why,e),fix:Zb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:Zb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function nx(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 cx=Math.random.bind(Math),lx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function ux(e=21){let t=``,n=e;for(;n--;)t+=lx[cx()*64|0];return t}var dx=6e4,fx=e=>e,px=fx,{clearTimeout:mx,setTimeout:hx}=globalThis;function gx(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=fx,deserialize:s=px,resolver:c,bind:l=`rpc`,timeout:u=dx,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}=sx(),_=ux();s.i=_;let ee;async function v(n=s){return u>=0&&(ee=hx(()=>{try{if(t.onTimeoutError?.call(h,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}p.delete(_)},u),typeof ee==`object`&&(ee=ee.unref?.())),p.set(_,{resolve:d,reject:g,timeoutId:ee,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(h,s,v,d):await v()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{mx(ee),p.delete(_)}return l}let _={$call:(e,...t)=>g(e,t,!1),$callOptional:(e,...t)=>g(e,t,!1,!0),$callEvent:(e,...t)=>g(e,t,!0),$callRaw:e=>g(e.method,e.args,e.event,e.optional),$rejectPendingCalls:v,get $closed(){return f},get $meta(){return t.meta},$close:ee,$functions:e};h=d?new Proxy({},{get(t,n){if(Object.hasOwn(_,n))return _[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>g(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>g(n,e,!1);return i.asEvent=r,i}}):_;function ee(e){f=!0,p.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),p.clear(),i(te)}function v(e){let t=Array.from(p.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return p.clear(),t}async function te(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(h,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?h:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(h,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(h,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(h,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(mx(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(te),h}function _x(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var vx=Object.freeze({type:`object`,additionalProperties:!0});function yx(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return vx}return vx}function bx(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 Sx(e,t){return xx(e,t)??[e]}function Cx(e){return typeof e==`string`?`'${e}'`:new Dx().serialize(e)}var wx=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Tx=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[wx.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Ex(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})(),Ox=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],kx=[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],Ax=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,jx=[],Mx=class{_data=new Nx;_hash=new Nx([...Ox]);_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)jx[n]=e[t+n]|0;else{let e=jx[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=jx[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;jx[n]=t+jx[n-7]+i+jx[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+kx[n]+jx[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=Nx.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 Px(e){return new Mx().finalize(e).toBase64()}function Fx(e){return Px(Cx(e))}function Ix(e){return Fx(e)}function Lx(){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 Rx=/^[\w+.-]{2,}:\/\//;function zx(e){return e.endsWith(`/`)?e:`${e}/`}function Bx(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function Vx(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?zx(n)+e.replace(/^\.?\//,``):e);return n}function Hx(e,t){if(!t||t===`/`||Rx.test(e))return e;let n=Bx(t);return e.startsWith(n)?e:Vx(n,e)}function Ux(e,t){let n=e.match(Rx);return t+(n?e.slice(n[0].length):e)}var Wx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Gx(e=21){let t=``,n=e;for(;n--;)t+=Wx[Math.random()*64|0];return t}var Kx=Symbol.for(`immer-nothing`),qx=Symbol.for(`immer-draftable`),Jx=Symbol.for(`immer-state`),Yx=[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 Xx(e,...t){{let n=Yx[e],r=bS(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var Zx=Object,Qx=Zx.getPrototypeOf,$x=`constructor`,eS=`prototype`,tS=`configurable`,nS=`enumerable`,rS=`writable`,iS=`value`,aS=e=>!!e&&!!e[Jx];function oS(e){return e?lS(e)||gS(e)||!!e[qx]||!!e[$x]?.[qx]||_S(e)||vS(e):!1}var sS=Zx[eS][$x].toString(),cS=new WeakMap;function lS(e){if(!e||!yS(e))return!1;let t=Qx(e);if(t===null||t===Zx[eS])return!0;let n=Zx.hasOwnProperty.call(t,$x)&&t[$x];if(n===Object)return!0;if(!bS(n))return!1;let r=cS.get(n);return r===void 0&&(r=Function.toString.call(n),cS.set(n,r)),r===sS}function uS(e,t,n=!0){dS(e)===0?(n?Reflect.ownKeys(e):Zx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function dS(e){let t=e[Jx];return t?t.type_:gS(e)?1:_S(e)?2:vS(e)?3:0}var fS=(e,t,n=dS(e))=>n===2?e.has(t):Zx[eS].hasOwnProperty.call(e,t),pS=(e,t,n=dS(e))=>n===2?e.get(t):e[t],mS=(e,t,n,r=dS(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function hS(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var gS=Array.isArray,_S=e=>e instanceof Map,vS=e=>e instanceof Set,yS=e=>typeof e==`object`,bS=e=>typeof e==`function`,xS=e=>typeof e==`boolean`;function SS(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var CS=e=>yS(e)?e?.[Jx]:null,wS=e=>e.copy_||e.base_,TS=e=>e.modified_?e.copy_:e.base_;function ES(e,t){if(_S(e))return new Map(e);if(vS(e))return new Set(e);if(gS(e))return Array[eS].slice.call(e);let n=lS(e);if(t===!0||t===`class_only`&&!n){let t=Zx.getOwnPropertyDescriptors(e);delete t[Jx];let n=Reflect.ownKeys(t);for(let r=0;r1&&Zx.defineProperties(e,{set:kS,add:kS,clear:kS,delete:kS}),Zx.freeze(e),t&&uS(e,(e,t)=>{DS(t,!0)},!1),e)}function OS(){Xx(2)}var kS={[iS]:OS};function AS(e){return e===null||!yS(e)||Zx.isFrozen(e)}var jS=`MapSet`,MS=`Patches`,NS=`ArrayMethods`,PS={};function FS(e){let t=PS[e];return t||Xx(0,e),t}var IS=e=>!!PS[e];function LS(e,t){PS[e]||(PS[e]=t)}var RS,zS=()=>RS,BS=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:IS(jS)?FS(jS):void 0,arrayMethodsPlugin_:IS(NS)?FS(NS):void 0});function VS(e,t){t&&(e.patchPlugin_=FS(MS),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function HS(e){US(e),e.drafts_.forEach(GS),e.drafts_=null}function US(e){e===RS&&(RS=e.parent_)}var WS=e=>RS=BS(RS,e);function GS(e){let t=e[Jx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function KS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[Jx].modified_&&(HS(t),Xx(4)),oS(e)&&(e=qS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[Jx].base_,e,t)}else e=qS(t,n);return JS(t,e,!0),HS(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===Kx?void 0:e}function qS(e,t){if(AS(t))return t;let n=t[Jx];if(!n)return nC(t,e.handledSet_,e);if(!XS(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);eC(n,e)}return n.copy_}function JS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&DS(t,n)}function YS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var XS=(e,t)=>e.scope_===t,ZS=[];function QS(e,t,n,r){let i=wS(e),a=e.type_;if(r!==void 0&&pS(i,r,a)===t){mS(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;uS(i,(e,n)=>{if(aS(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??ZS;for(let e of o)mS(i,e,n,a)}function $S(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!XS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=TS(i);QS(e,i.draft_??i,a,n),eC(i,r)})}function eC(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)}YS(e)}}function tC(e,t,n){let{scope_:r}=e;if(aS(n)){let i=n[Jx];XS(i,r)&&i.callbacks_.push(function(){dC(e),QS(e,n,TS(i),t)})}else oS(n)&&e.callbacks_.push(function(){let i=wS(e);e.type_===3?i.has(n)&&nC(n,r.handledSet_,r):pS(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&nC(pS(e.copy_,t,e.type_),r.handledSet_,r)})}function nC(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||aS(e)||t.has(e)||!oS(e)||AS(e)?e:(t.add(e),uS(e,(r,i)=>{if(aS(i)){let t=i[Jx];XS(t,n)&&(mS(e,r,TS(t),e.type_),YS(t))}else oS(i)&&nC(i,t,n)}),e)}function rC(e,t){let n=gS(e),r={type_:+!!n,scope_:t?t.scope_:zS(),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=iC;n&&(i=[r],a=aC);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var iC={get(e,t){if(t===Jx)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=wS(e);if(!fS(i,t,e.type_))return cC(e,i,t);let a=i[t];if(e.finalized_||!oS(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&SS(t))return a;if(a===oC(e.base_,t)||sC(e,t,a)){dC(e);let n=e.type_===1?+t:t,r=pC(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in wS(e)},ownKeys(e){return Reflect.ownKeys(wS(e))},set(e,t,n){let r=lC(wS(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=oC(wS(e),t),i=r?.[Jx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(hS(n,r)&&(n!==void 0||fS(e.base_,t,e.type_)))return!0;dC(e),uC(e)}return e.copy_[t]===n&&(n!==void 0||fS(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),tC(e,t,n),!0)},deleteProperty(e,t){return dC(e),oC(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),uC(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=wS(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[rS]:!0,[tS]:e.type_!==1||t!==`length`,[nS]:r[nS],[iS]:n[t]}},defineProperty(){Xx(11)},getPrototypeOf(e){return Qx(e.base_)},setPrototypeOf(){Xx(12)}},aC={};for(let e in iC){let t=iC[e];aC[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}aC.deleteProperty=function(e,t){return isNaN(parseInt(t))&&Xx(13),aC.set.call(this,e,t,void 0)},aC.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&Xx(14),iC.set.call(this,e[0],t,n,e[0])};function oC(e,t){let n=e[Jx];return(n?wS(n):e)[t]}function sC(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!oS(n)||n[Jx]?!1:e.baseRefs_.has(n)}function cC(e,t,n){let r=lC(t,n);return r?iS in r?r[iS]:r.get?.call(e.draft_):void 0}function lC(e,t){if(!(t in e))return;let n=Qx(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Qx(n)}}function uC(e){e.modified_||(e.modified_=!0,e.parent_&&uC(e.parent_))}function dC(e){e.copy_||=(e.assigned_=new Map,ES(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var fC=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(bS(e)&&!bS(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}bS(t)||Xx(6),n!==void 0&&!bS(n)&&Xx(7);let r;if(oS(e)){let i=WS(this),a=pC(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?HS(i):US(i)}return VS(i,n),KS(r,i)}if(!e||!yS(e)){if(r=t(e),r===void 0&&(r=e),r===Kx&&(r=void 0),this.autoFreeze_&&DS(r,!0),n){let t=[],i=[];FS(MS).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}Xx(1,e)},this.produceWithPatches=(e,t)=>{if(bS(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]},xS(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),xS(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),xS(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){oS(e)||Xx(8),aS(e)&&(e=mC(e));let t=WS(this),n=pC(t,e,void 0);return n[Jx].isManual_=!0,US(t),n}finishDraft(e,t){let n=e&&e[Jx];(!n||!n.isManual_)&&Xx(9);let{scope_:r}=n;return VS(r,t),KS(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=FS(MS).applyPatches_;return aS(e)?r(e,t):this.produce(e,e=>r(e,t))}};function pC(e,t,n,r){let[i,a]=_S(t)?FS(jS).proxyMap_(t,n):vS(t)?FS(jS).proxySet_(t,n):rC(t,n);return(n?.scope_??zS()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?$S(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 mC(e){return aS(e)||Xx(10,e),hC(e)}function hC(e){if(!oS(e)||AS(e))return e;let t=e[Jx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=ES(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=ES(e,!0);return uS(n,(e,t)=>{mS(n,e,hC(t))},r),t&&(t.finalized_=!1),n}function gC(){Yx.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=CS(pS(e,n.key_)),i=pS(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||fS(e,o)))return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e{let u=pS(o,e,c),f=pS(s,e,c),p=l?fS(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===Kx?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(vS(e))return new Set(Array.from(e).map(u));let t=Object.create(Qx(e));for(let n in e)t[n]=u(e[n]);return fS(e,qx)&&(t[qx]=e[qx]),t}function d(e){return aS(e)?u(e):e}LS(MS,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var _C=new fC,vC=_C.produce,yC=_C.produceWithPatches.bind(_C),bC=_C.applyPatches.bind(_C),xC=1e3;function SC(e,t){if(e.add(t),e.size>xC){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function CC(e){let{enablePatches:t=!1}=e;t&&gC();let n=Lx(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=Gx())=>{i.has(t)||(gC(),r=bC(r,e),SC(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=Gx())=>{if(!i.has(a)){if(SC(i,a),t){let[t,i]=yC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=vC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var wC=typeof self==`object`?self:globalThis,TC=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),EC=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function DC(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=TC.has(e)?wC[e]:void 0;return n(new(r??wC.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`&&EC.has(a))return n(new wC[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function OC(e){return DC(new Map,e)(0)}var kC=``,{toString:AC}={},{keys:jC}=Object;function MC(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=AC.call(e).slice(8,-1);switch(n){case`Array`:return[1,kC];case`Object`:return[2,kC];case`Date`:return[3,kC];case`RegExp`:return[4,kC];case`Map`:return[5,kC];case`Set`:return[6,kC];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function NC([e,t]){return e===0&&(t===`function`||t===`symbol`)}function PC(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]=MC(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 jC(r))(e||!NC(MC(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||!(NC(MC(n))||NC(MC(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!NC(MC(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function FC(e,t={}){let n=[];return PC(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:IC,stringify:LC}=JSON,RC={json:!0,lossy:!0};function zC(e){return OC(IC(e))}function BC(e){return LC(FC(e,RC))}function VC(e){return OC(e)}function HC(e){return BC(e)}function UC(e){return zC(e)}var WC=256,GC=class extends Error{name=`StreamClosedError`};function KC(e={}){let t=e.id??Gx(),n=Math.max(0,e.replayWindow??0),r=Lx(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new GC(`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=JC(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 qC(e={}){let t=e.id??Gx(),n=Math.max(1,e.highWaterMark??WC),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 JC(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 YC=128;function XC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,YC)}var ZC=`modulepreload`,QC=function(e,t){return new URL(e,t).href},$C={},ew=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=QC(t,n),t=s(t),t in $C)return;$C[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`:ZC,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)})},tw=`__connection.json`,nw=`__DEVFRAME_CONNECTION__`,rw=`x-birpc-session`,iw=`__rpc-dump/index.json`,aw=`devframe:services`,ow=`devframe_otp`,sw=`devframe_auth_token`;rx.postMessage.remoteAssetsError;var cw=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Ix(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()}},lw=ox({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 uw(e){if(e.agent&&e.jsonSerializable===!1)throw lw.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function dw(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function fw(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 pw(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 gw(e,t){let n=e.handler;if(!n){let r=await hw(e,t);if(!r.handler)throw lw.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 pw(e.name,r,t),o=await a(...n);return await mw(e.name,i,o)}}var _w=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 gw(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 lw.DF0021({name:e.name});uw(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 lw.DF0022({name:e.name});uw(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 gw(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw lw.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 vw(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 bw(t,`undefined`,r,e);return n}return i!==null&&yw(i,r,e,t),n})}function yw(e,t,n,r){if(typeof e==`bigint`)throw bw(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw bw(r,`Map`,t,n);if(e instanceof Set)throw bw(r,`Set`,t,n);if(e instanceof Date)throw bw(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw bw(r,e.constructor?.name??`class instance`,t,n)}function bw(e,t,n,r){let i=xw(n,r);return lw.DF0020({name:e||``,type:t,path:i})}function xw(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var Sw=`__DEVFRAME_CONNECTION_META__`,Cw=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function ww(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 Tw(){return ww(nw)}function Ew(){return ww(Sw)}function Dw(e){if(e)return e;try{let e=localStorage.getItem(Cw);if(e)return e}catch{}return ww(Cw)}function Ow(e){globalThis[nw]=e,globalThis[Sw]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&kw(e.authToken)}function kw(e){try{localStorage.setItem(Cw,e)}catch{}globalThis[Cw]=e;let t=Tw();t&&(globalThis[nw]={...t,authToken:e})}function Aw(e){let t=Hx(tw,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function jw(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function Mw(){let e=Tw();if(e)return jw(e,Dw()??e.authToken??e.connectionMeta.authToken);let t=Ew();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??Aw(`./`),authToken:Dw(t.authToken)}}async function Nw(e={}){if(e.connection){let t=jw(e.connection,Dw(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return Ow(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:Aw(t[0]??`./`),authToken:Dw(e.authToken??e.connectionMeta.authToken)};return Ow(n),n}let n=Mw();if(n){let t=jw(n,Dw(e.authToken??n.authToken??n.connectionMeta.authToken));return Ow(t),t}let r=[];for(let n of t){let t=Hx(tw,n),i=Aw(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:Dw(e.authToken??r.authToken)};return Ow(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var Pw=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function Fw(e=ow){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function Iw(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 Lw(e=ow){let t=Fw(e);return t&&Iw(e),t}async function Rw(e,t={}){let n=Lw(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function zw(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(aw,{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 Bw(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:rx.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:rx.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=CC({initialValue:l?.initialValue,enablePatches:!1});async function d(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,c),l?.initialValue!==void 0){t.set(c,u);for(let e of i)e(c);return e.call(`devframe:rpc:server-state:get`,c).then(e=>{e!==void 0&&u.mutate(()=>o(c,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(c,s(c,u)),u}{let r=await e.call(`devframe:rpc:server-state:get`,c);u.mutate(()=>o(c,r)),t.set(c,u);for(let e of i)e(c);return n.set(c,s(c,u)),u}}return new Promise(t=>{if(e.isTrusted)d().then(t);else{t(u);let n=!1;e.events.on(rx.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var Vw=new Map;function Hw(e=Vw){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?vw(n,r??``):`s:${HC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?UC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function Uw(){}function Ww(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 Gw(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 Kw(e){let{onConnected:t=Uw,onError:n=Uw,onDisconnected:r=Uw,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${sw}=${encodeURIComponent(e.authToken)}`);let s=Hw(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=Ww(r);if(!e)break;r=e.rest;let{event:t,data:n}=Gw(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`,[rw]: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 qw(e,t){let{channel:n,rpcOptions:r={}}=t;return gx(e,{...n,timeout:-1,...r,proxify:!1})}function Jw(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(rx.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 Pw(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new Pw(`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(rx.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 Pw(`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(rx.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(rx.client.connectionError,e),m(new Pw(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new Pw(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),v=qw(a.functions,{channel:ee,rpcOptions:o});a.register({name:rx.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new Pw(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(rx.client.connectionError,e),m(e),i.emit(rx.client.isTrustedUpdated,!1)}});let te=n;async function ne(e){te=e;let t=await v.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new Pw(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(rx.client.connectionError,e)}return i.emit(rx.client.isTrustedUpdated,c),t.isTrusted}async function re(e){let t=(await v.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(te=t,c=!0,d.resolve(!0),f(`connected`),i.emit(rx.client.isTrustedUpdated,!0)),t}async function ie(e={}){await v.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function ae(){return c?!0:ne(te??``)}async function oe(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:ae,requestTrustWithToken:ne,requestTrustWithCode:re,requestAuthCode:ie,ensureTrusted:oe,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(rx.client.error,n,t),Promise.reject(n)):g(v.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(rx.client.error,t,String(e[0]));return}return v.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(rx.client.error,n,t),Promise.reject(n)):g(v.$callOptional(...e),t)},close:()=>{ee.close()}}}function Yw(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 Xw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=Yw(n.sse,r??`./`,location);return Jw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>Kw({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 Zw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:Qw(r)?Zw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function Qw(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function $w(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function eT(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function tT(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function nT(e){if(e.error)throw Zw(e.error);return e.output}function rT(e){return e.some(e=>e!=null)}function iT(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function aT(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?VC(e):e}function a(e,t){return i(iT(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 tT(r)?nT(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($w(r)){if(rT(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(eT(r)){let e=Ix(n),i=r.records[e];if(i)return nT(await s(i,r.serialization));if(r.fallback)return nT(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!rT(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 oT(e){let t=aT(await e.fetchJsonFromBases(iw),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 sT=``;function cT(e,t){return`${e}${sT}${t}`}function lT(e){let t=new Map,n=new Map;e.client.register({name:rx.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(cT(e,n))?._push(r,i)}}),e.client.register({name:rx.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=cT(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:rx.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=cT(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(rx.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(sT);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=cT(n,r),o=t.get(a);if(o)return o;let s=qC({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(rx.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=cT(t,r),a=n.get(i);if(a)return a;let o=KC({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 uT(){}var dT=new Map;function fT(e){let t=e.url;e.authToken&&(t=`${t}?${sw}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=uT,onError:i=uT,onDisconnected:a=uT,definitions:o=dT}=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=Hw(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 pT(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 Ux(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function mT(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=pT(n.websocket,r??`./`,location);return Jw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>fT({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 hT(e){return e.includes(`:`)}function gT(e,t){return hT(t)?t:`${e}:${t}`}function _T(e){return{async get(t){return(await e()).value()[t]},async set(t,n){(await e()).mutate(e=>{e[t]=n})},async delete(t){(await e()).mutate(e=>{delete e[t]})},async all(){return(await e()).value()},async onChange(t){return(await e()).on(`updated`,e=>t(e))}}}function vT(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=e.sharedState.get(r,{initialValue:{}}),i}return _T(a)}function yT(e,t){return{global:vT(e,t,`global`),project:vT(e,t,`project`)}}function bT(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(hT(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(gT(t,n),...r)),callEvent:((n,...r)=>e.callEvent(gT(t,n),...r)),callOptional:((n,...r)=>e.callOptional(gT(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(gT(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(gT(t,n),r,i),upload:(n,r)=>e.streaming.upload(gT(t,n),r)}},settings:yT(e,t),scope:e.scope}}function xT(){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 ST(e,t={}){let n=t.modelContext??xT();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=XC(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=_x(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:bx(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>CT(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 CT(e,t,n){try{let r=Sx(n,e.args?.length);return{content:[{type:`text`,text:wT(await(await gw(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:TT(e)}]}}}function wT(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function TT(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 ET(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 DT(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Lx(),a=Array.isArray(t)?t:[t],o=await Nw(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new cw({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new _w(f),m=e.webmcp===!1?void 0:ST(p),h,g=!1;async function _(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(Hx(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ee={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){if(await n.onRequest?.call(this,e,t,i),r&&d?.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);d.apply(e,n)}else await t(e)}}},v=ET(e.transport??`auto`,s),te=v===`static`?await oT({fetchJsonFromBases:_}):v===`sse`?Xw({...ee,sseOptions:e.sseOptions}):mT({...ee,wsOptions:e.wsOptions}),ne;try{ne=new BroadcastChannel(`devframe-auth`)}catch{}let re,ie=!1;function ae(e){return((...t)=>ie||!re?e(...t):re.then(()=>e(...t)))}function oe(){g=!0;try{h?.(),m?.()}finally{try{ne?.close()}finally{te.close?.()}}}let se={events:i,get isTrusted(){return te.isTrusted},get status(){return te.status},get connectionError(){return te.connectionError},get transport(){return te.transport??v},get connection(){return o},connectionMeta:s,ensureTrusted:te.ensureTrusted,requestTrust:te.requestTrust,requestTrustWithToken:async e=>(kw(e),o={...o,authToken:e},te.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await te.requestTrustWithCode(e);if(!t)return!1;kw(t),o={...o,authToken:t};try{ne?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>te.requestAuthCode(e),call:ae(te.call),callEvent:ae(te.callEvent),callOptional:ae(te.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:oe};se.sharedState=Bw(se),se.streaming=lT(se),se.services=zw(se);let ce=new Map;se.scope=(e=>{if(!e)return se;let t=ce.get(e);return t||(t=bT(se,e),ce.set(e,t)),t}),f.rpc=se;function le(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ue(){if(e.simpleAuth!==!1&&le()&&typeof globalThis.prompt==`function`)for(await se.requestAuthCode().catch(()=>{});!se.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await se.requestTrustWithCode(t))return}}async function de(){let t=await te.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await Rw(se,{param:n}):!1;t||r||se.isTrusted||await ue()}return re=de().then(()=>{ie=!0},()=>{ie=!0}),s.mcp&&ew(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-BXhoSh1z-Cfmnc8tc.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(se))}).catch(()=>{}),ne&&(ne.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&se.requestTrustWithToken(e.data.authToken)}),se}var OT=DT,kT=[`components`,`injectors`,`signals`,`ngrx`,`forms`,`router`,`pipes`,`http`,`analog`],AT=[`forms`,`router`,`ngrx`,`http`,`analog`],jT={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}},MT=`ng-devtools`;function NT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function PT(e,t){return typeof e==`boolean`?e:t}var FT=100,IT=100;function LT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=IT);return[...new Set(t)].slice(0,FT)}function RT(e,t){let{default:n,min:r,max:i}=jT[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function zT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function BT(e){let t=NT(e),n=NT(t.agent),r=NT(t.inspectors),i=NT(n.tools),a=NT(t.actions),o=PT(t.actions,!0),s=NT(t.redaction),c=NT(t.limits),l=zT(kT,e=>PT(r[e],!0));return{inspectors:l,agent:{readOnly:PT(n.readOnly,!1),tools:zT(kT,e=>l[e]&&PT(i[e],!0))},actions:zT(AT,e=>l[e]&&PT(a[e],o)),redaction:{secretNames:LT(s.secretNames),unmask:LT(s.unmask)},limits:Object.fromEntries(Object.keys(jT).map(e=>[e,RT(c[e],e)]))}}function VT(e){let t=e?.configs;return BT(t?.[MT])}function HT(e){return`${{forms:`Writing to forms`,router:`Navigating`,ngrx:`Restoring NgRx state`,http:`Changing HTTP mock rules and clearing HTTP calls`,analog:`Calling API routes`}[e]} is turned off in the devtools config (actions.${e}).`}var UT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`},WT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore`,http:`HTTP mocking`,analog:`Analog API calls`},GT={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`};function KT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=kT.filter(t=>e.inspectors[t]);return n(`Inspectors off`,kT.filter(t=>!e.inspectors[t]).map(e=>UT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>UT[e])),n(`Blocked actions`,AT.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>WT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(jT).filter(t=>e.limits[t]!==jT[t].default).map(t=>GT[t](e.limits[t]))),t}var qT=`ng-devtools-page-id`;function JT(){try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(qT)||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(e,t,n){return e?e.scope(`ng-devtools`).rpc.call(t,...n===void 0?[]:[n]):Promise.resolve(null)}function $T(e,t,n){return QT(e,t,n).then(e=>e,()=>null)}function eE(e){return e?.connectionMeta.backend===`static`}function tE(e){return VT(e?.connectionMeta)}function nE(e,t){return tE(e).actions[t]}var rE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`};function iE(e,t){let n=rE[e];return!n||t.inspectors[n]}function aE(e,t){e&1&&(fs(),Fg(0,`rect`,3)(1,`rect`,4)(2,`rect`,5)(3,`rect`,6))}function oE(e,t){e&1&&(fs(),Fg(0,`path`,7)(1,`path`,8)(2,`path`,9))}function sE(e,t){e&1&&(fs(),Fg(0,`circle`,10)(1,`path`,11)(2,`circle`,12))}function cE(e,t){e&1&&(fs(),Fg(0,`path`,1))}function lE(e,t){e&1&&(fs(),Fg(0,`path`,13)(1,`path`,14)(2,`path`,15)(3,`path`,16))}function uE(e,t){e&1&&(fs(),Fg(0,`ellipse`,17)(1,`path`,18)(2,`path`,19))}function dE(e,t){e&1&&(fs(),Fg(0,`rect`,20)(1,`path`,21)(2,`path`,22)(3,`path`,23))}function fE(e,t){e&1&&(fs(),Fg(0,`circle`,24)(1,`path`,25)(2,`path`,26))}function pE(e,t){e&1&&(fs(),Fg(0,`path`,27)(1,`path`,28)(2,`path`,29)(3,`path`,30)(4,`circle`,31))}function mE(e,t){e&1&&(fs(),Fg(0,`path`,2))}var hE=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:11,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M3 12h18`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`]],template:function(e,t){if(e&1&&(fs(),H(0,`svg`,0),P(1,aE,4,0)(2,oE,3,0)(3,sE,3,0)(4,cE,1,0,`:svg:path`,1)(5,lE,4,0)(6,uE,3,0)(7,dE,4,0)(8,fE,3,0)(9,pE,5,0)(10,mE,1,0,`:svg:path`,2),U()),e&2){let e;M(),F((e=t.name())===`dashboard`?1:e===`components`?2:e===`routes`?3:e===`signals`?4:e===`injectors`?5:e===`store`?6:e===`forms`?7:e===`network`?8:e===`pipes`?9:e===`analog`?10:-1)}},styles:[`[_nghost-%COMP%] { +`);return r>=0?n.slice(0,r):n}function oi(e,t){return e?t?`${e} ${t}`:e:t||``}var si=ii({__forward_ref__:ii});function ci(e){return e.__forward_ref__=ci,e}function li(e){return ui(e)?e():e}function ui(e){return typeof e==`function`&&Object.hasOwn(e,si)&&e.__forward_ref__===ci}function di(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function fi(e){return pi(e,gi)}function pi(e,t){return Object.hasOwn(e,t)&&e[t]||null}function mi(e){return(e?.[gi]??null)||null}function hi(e){return e&&Object.hasOwn(e,_i)?e[_i]:null}var gi=ii({ɵprov:ii}),_i=ii({ɵinj:ii}),vi=class{_desc;ngMetadataName=`InjectionToken`;ɵprov;constructor(e,t){this._desc=e,this.ɵprov=void 0,typeof t==`number`?this.__NG_ELEMENT_ID__=t:t!==void 0&&(this.ɵprov=di({token:this,providedIn:t.providedIn||`root`,factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function yi(e){return e&&!!e.ɵproviders}var bi=ii({ɵcmp:ii}),xi=ii({ɵdir:ii}),Si=ii({ɵpipe:ii}),Ci=ii({ɵfac:ii}),wi=ii({__NG_ELEMENT_ID__:ii}),Ti=ii({__NG_ENV_ID__:ii});function Ei(e){return ki(e,`@Component`),e[bi]||null}function Di(e){return ki(e,`@Directive`),e[xi]||null}function Oi(e){return ki(e,`@Pipe`),e[Si]||null}function ki(e,t){if(e==null)throw new T(-919,!1)}function Ai(e){return typeof e==`string`?e:e==null?``:String(e)}var ji=ii({ngErrorCode:ii}),Mi=ii({ngErrorMessage:ii}),Ni=ii({ngTokenPath:ii});function Pi(e,t){return Ii(``,-200,t)}function Fi(e,t){throw new T(-201,!1)}function Ii(e,t,n){let r=new T(t,e);return r[ji]=t,r[Mi]=e,n&&(r[Ni]=n),r}function Li(e){return e[ji]}var Ri;function zi(){return Ri}function Bi(e){let t=Ri;return Ri=e,t}function Vi(e,t,n){let r=fi(e);if(r&&r.providedIn==`root`)return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Fi(e,``)}var Hi=globalThis,Ui={},Wi=`__NG_DI_FLAG__`,Gi=class{injector;constructor(e){this.injector=e}retrieve(e,t){let n=Ji(t)||0;try{return this.injector.get(e,n&8?null:Ui,n)}catch(e){if(er(e))return e;throw e}}};function Ki(e,t=0){let n=Zn();if(n===void 0)throw new T(-203,!1);if(n===null)return Vi(e,void 0,t);{let r=Yi(t),i=n.retrieve(e,r);if(er(i)){if(r.optional)return null;throw i}return i}}function qi(e,t=0){return(zi()||Ki)(li(e),t)}function E(e,t){return qi(e,Ji(t))}function Ji(e){return e===void 0||typeof e==`number`?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function Yi(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function Xi(e){let t=[];for(let n=0;nArray.isArray(e)?ta(e,t):t(e))}function na(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ra(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ia(e,t,n,r){let i=e.length;if(i==t)e.push(n,r);else if(i===1)e.push(r,e[0]),e[0]=n;else{for(i--,e.push(e[i-1],e[i]);i>t;){let t=i-2;e[i]=e[t],i--}e[t]=n,e[t+1]=r}}function aa(e,t,n){let r=sa(e,t);return r>=0?e[r|1]=n:(r=~r,ia(e,r,t,n)),r}function oa(e,t){let n=sa(e,t);if(n>=0)return e[n|1]}function sa(e,t){return ca(e,t,1)}function ca(e,t,n){let r=0,i=e.length>>n;for(;i!==r;){let a=r+(i-r>>1),o=e[a<t?i=a:r=a+1}return~(i<{n.push(e)};return ta(t,e=>{let t=e;va(t,a,[],r)&&(i||=[],i.push(t))}),i!==void 0&&_a(i,a),n}function _a(e,t){for(let n=0;n{t(e,r)})}}function va(e,t,n,r){if(e=li(e),!e)return!1;let i=null,a=hi(e),o=!a&&Ei(e);if(!a&&!o){let t=e.ngModule;if(a=hi(t),a)i=t;else return!1}else if(o&&!o.standalone)return!1;else i=e;let s=r.has(i);if(o){if(s)return!1;if(r.add(i),o.dependencies){let e=typeof o.dependencies==`function`?o.dependencies():o.dependencies;for(let i of e)va(i,t,n,r)}}else if(a){if(a.imports!=null&&!s){r.add(i);let e;try{ta(a.imports,i=>{va(i,t,n,r)&&(e||=[],e.push(i))})}finally{}e!==void 0&&_a(e,t)}if(!s){let e=Qi(i)||(()=>new i);t({provide:i,useFactory:e,deps:ua},i),t({provide:pa,useValue:i,multi:!0},i),t({provide:da,useValue:()=>qi(i),multi:!0},i)}let o=a.providers;if(o!=null&&!s){let n=e;ya(o,e=>{t(e,n)})}}else return!1;return i!==e&&e.providers!==void 0}function ya(e,t){for(let n of e)yi(n)&&(n=n.ɵproviders),Array.isArray(n)?ya(n,t):t(n)}var ba=ii({provide:String,useValue:ii});function xa(e){return typeof e==`object`&&!!e&&ba in e}function Sa(e){return!!(e&&e.useExisting)}function Ca(e){return!!(e&&e.useFactory)}function wa(e){return typeof e==`function`}var Ta=new vi(``),Ea={},Da={},Oa=void 0;function ka(){return Oa===void 0&&(Oa=new ma),Oa}var Aa=class{},ja=class extends Aa{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,t,n,r){super(),this.parent=t,this.source=n,this.scopes=r,Va(e,e=>this.processProvider(e)),this.records.set(fa,La(void 0,this)),r.has(`environment`)&&this.records.set(Aa,La(void 0,this));let i=this.records.get(Ta);i!=null&&typeof i.value==`string`&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(pa,ua,{self:!0}))}retrieve(e,t){let n=Ji(t)||0;try{return this.get(e,Ui,n)}catch(e){if(er(e))return e;throw e}}destroy(){Ia(this),this._destroyed=!0;let e=w(null);try{for(let e of this._ngOnDestroyHooks)e.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let t of e)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),w(e)}}onDestroy(e){return Ia(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){Ia(this);let t=Qn(this),n=Bi(void 0);try{return e()}finally{Qn(t),Bi(n)}}get(e,t=Ui,n){if(Ia(this),Object.hasOwn(e,Ti))return e[Ti](this);let r=Ji(n),i=Qn(this),a=Bi(void 0);try{if(!(r&4)){let t=this.records.get(e);if(t===void 0){let n=Ba(e)&&fi(e);t=n&&this.injectableDefInScope(n)?La(Ma(e),Ea):null,this.records.set(e,t)}if(t!=null)return this.hydrate(e,t,r)}let n=r&2?ka():this.parent;return t=r&8&&t===Ui?null:t,n.get(e,t)}catch(e){let t=Li(e);throw t===-200||t===-201?new T(t,null):e}finally{Bi(a),Qn(i)}}resolveInjectorInitializers(){let e=w(null),t=Qn(this),n=Bi(void 0);try{let e=this.get(da,ua,{self:!0});for(let t of e)t()}finally{Qn(t),Bi(n),w(e)}}toString(){return`R3Injector[...]`}processProvider(e){e=li(e);let t=wa(e)?e:li(e&&e.provide),n=Pa(e);if(!wa(e)&&e.multi===!0){let n=this.records.get(t);n||(n=La(void 0,Ea,!0),n.factory=()=>Xi(n.multi),this.records.set(t,n)),t=e,n.multi.push(e)}this.records.set(t,n)}hydrate(e,t,n){let r=w(null);try{if(t.value===Da)throw Pi(``);return t.value===Ea&&(t.value=Da,t.value=t.factory(void 0,n)),typeof t.value==`object`&&t.value&&za(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{w(r)}}injectableDefInScope(e){if(!e.providedIn)return!1;let t=li(e.providedIn);return typeof t==`string`?t===`any`||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(e){let t=this._onDestroyHooks.indexOf(e);t!==-1&&this._onDestroyHooks.splice(t,1)}};function Ma(e){let t=fi(e),n=t===null?Qi(e):t.factory;if(n!==null)return n;if(e instanceof vi)throw new T(-204,!1);if(e instanceof Function)return Na(e);throw new T(-204,!1)}function Na(e){if(e.length>0)throw new T(-204,!1);let t=mi(e);return t===null?()=>new e:()=>t.factory(e)}function Pa(e){return xa(e)?La(void 0,e.useValue):La(Fa(e),Ea)}function Fa(e,t,n){let r;if(wa(e)){let t=li(e);return Qi(t)||Ma(t)}if(xa(e))r=()=>li(e.useValue);else if(Ca(e))r=()=>e.useFactory(...Xi(e.deps||[]));else if(Sa(e))r=(t,n)=>qi(li(e.useExisting),n!==void 0&&n&8?8:void 0);else{let t=li(e&&(e.useClass||e.provide));if(Ra(e))r=()=>new t(...Xi(e.deps));else return Qi(t)||Ma(t)}return r}function Ia(e){if(e.destroyed)throw new T(-205,!1)}function La(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function Ra(e){return!!e.deps}function za(e){return typeof e==`object`&&!!e&&typeof e.ngOnDestroy==`function`}function Ba(e){return typeof e==`function`||typeof e==`object`&&e.ngMetadataName===`InjectionToken`}function Va(e,t){for(let n of e)Array.isArray(n)?Va(n,t):n&&yi(n)?Va(n.ɵproviders,t):t(n)}function Ha(e,t){let n;e instanceof ja?(Ia(e),n=e):n=new Gi(e);let r=Qn(n),i=Bi(void 0);try{return t()}finally{Qn(r),Bi(i)}}function Ua(){return zi()!==void 0||Zn()!=null}var Wa=1;function Ga(e){return Array.isArray(e)&&typeof e[Wa]==`object`}function Ka(e){return Array.isArray(e)&&e[Wa]===!0}function qa(e){return!!(e.flags&4)}function Ja(e){return e.componentOffset>-1}function Ya(e){return(e.flags&1)==1}function Xa(e){return!!e.template}function Za(e){return!!(e[2]&512)}function Qa(e){return(e[2]&256)==256}var $a=(function(e){return e[e.NONE=0]=`NONE`,e[e.HTML=1]=`HTML`,e[e.STYLE=2]=`STYLE`,e[e.SCRIPT=3]=`SCRIPT`,e[e.URL=4]=`URL`,e[e.RESOURCE_URL=5]=`RESOURCE_URL`,e[e.ATTRIBUTE_NO_BINDING=6]=`ATTRIBUTE_NO_BINDING`,e})($a||{}),eo=`math`;function to(e){for(;Array.isArray(e);)e=e[0];return e}function no(e,t){return to(t[e])}function ro(e,t){return to(t[e.index])}function io(e,t){return e.data[t]}function ao(e,t){return e[t]}function oo(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function so(e,t){let n=t[e];return Ga(n)?n:n[0]}function co(e){return(e[2]&128)==128}function lo(e){return Ka(e[3])}function uo(e,t){return t==null?null:e[t]}function fo(e){e[17]=0}function po(e){e[2]&1024||(e[2]|=1024,co(e)&&_o(e))}function mo(e,t){for(;e>0;)t=t[14],e--;return t}function ho(e){return!!(e[2]&9216||e[24]?.dirty)}function go(e){e[10].changeDetectionScheduler?.notify(8),e[2]&64&&(e[2]|=1024),ho(e)&&_o(e)}function _o(e){e[10].changeDetectionScheduler?.notify(0);let t=bo(e);for(;t!==null&&!(t[2]&8192||(t[2]|=8192,!co(t)));)t=bo(t)}function vo(e,t){if(Qa(e))throw new T(911,!1);e[21]===null&&(e[21]=[]),e[21].push(t)}function yo(e,t){if(e[21]===null)return;let n=e[21].indexOf(t);n!==-1&&e[21].splice(n,1)}function bo(e){let t=e[3];return Ka(t)?t[3]:t}function xo(e){return e[7]??=[]}function So(e){return e.cleanup??=[]}function Co(e,t,n,r){let i=xo(t);i.push(n),e.firstCreatePass&&So(e).push(r,i.length-1)}var D={lFrame:is(null),bindingsEnabled:!0,skipHydrationRootTNode:null},wo=!1;function To(){return D.lFrame.elementDepthCount}function Eo(){D.lFrame.elementDepthCount++}function Do(){D.lFrame.elementDepthCount--}function Oo(){return D.bindingsEnabled}function ko(){return D.skipHydrationRootTNode!==null}function Ao(e){return D.skipHydrationRootTNode===e}function jo(){D.skipHydrationRootTNode=null}function O(){return D.lFrame.lView}function Mo(){return D.lFrame.tView}function k(e){return D.lFrame.contextLView=e,e[8]}function A(e){return D.lFrame.contextLView=null,e}function No(){let e=Po();for(;e!==null&&e.type===64;)e=e.parent;return e}function Po(){return D.lFrame.currentTNode}function Fo(){let e=D.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function Io(e,t){let n=D.lFrame;n.currentTNode=e,n.isParent=t}function Lo(){return D.lFrame.isParent}function Ro(){D.lFrame.isParent=!1}function zo(){return D.lFrame.contextLView}function Bo(){return wo}function Vo(e){let t=wo;return wo=e,t}function Ho(){let e=D.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Uo(){return D.lFrame.bindingIndex}function Wo(e){return D.lFrame.bindingIndex=e}function Go(){return D.lFrame.bindingIndex++}function Ko(e){let t=D.lFrame,n=t.bindingIndex;return t.bindingIndex+=e,n}function qo(){return D.lFrame.inI18n}function Jo(e,t){let n=D.lFrame;n.bindingIndex=n.bindingRootIndex=e,Xo(t)}function Yo(){return D.lFrame.currentDirectiveIndex}function Xo(e){D.lFrame.currentDirectiveIndex=e}function Zo(e){let t=D.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Qo(){return D.lFrame.currentQueryIndex}function $o(e){D.lFrame.currentQueryIndex=e}function es(e){let t=e[1];return t.type===2?t.declTNode:t.type===1?e[5]:null}function ts(e,t,n){if(n&4){let r=t,i=e;for(;r=r.parent,r===null&&!(n&1)&&(r=es(i),!(r===null||(i=i[14],r.type&10))););if(r===null)return!1;t=r,e=i}let r=D.lFrame=rs();return r.currentTNode=t,r.lView=e,!0}function ns(e){let t=rs(),n=e[1];D.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function rs(){let e=D.lFrame,t=e===null?null:e.child;return t===null?is(e):t}function is(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 as(){let e=D.lFrame;return D.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var os=as;function ss(){let e=as();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 cs(e){return(D.lFrame.contextLView=mo(e,D.lFrame.contextLView))[8]}function ls(){return D.lFrame.selectedIndex}function us(e){D.lFrame.selectedIndex=e}function ds(){let e=D.lFrame;return io(e.tView,e.selectedIndex)}function fs(){D.lFrame.currentNamespace=`svg`}function ps(){ms()}function ms(){D.lFrame.currentNamespace=null}function hs(){return D.lFrame.currentNamespace}var gs=!0;function _s(){return gs}function vs(e){gs=e}function ys(e,t=null,n=null,r){let i=bs(e,t,n,r);return i.resolveInjectorInitializers(),i}function bs(e,t=null,n=null,r,i=new Set){return new ja([n||ua,ha(e)],t||ka(),null,i)}var xs=class e{static THROW_IF_NOT_FOUND=Ui;static NULL=new ma;static create(e,t){if(Array.isArray(e))return ys({name:``},t,e,``);{let t=e.name??``;return ys({name:t},e.parent,e.providers,t)}}static ɵprov=di({token:e,providedIn:`any`,factory:()=>qi(fa)});static __NG_ELEMENT_ID__=-1},Ss=new vi(``),Cs=class{static __NG_ELEMENT_ID__=Ts;static __NG_ENV_ID__=e=>e},ws=class extends Cs{_lView;constructor(e){super(),this._lView=e}get destroyed(){return Qa(this._lView)}onDestroy(e){let t=this._lView;return vo(t,e),()=>yo(t,e)}};function Ts(){return new ws(O())}var Es=new vi(``),Ds=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new $r(!1);debugTaskTracker=E(Es,{optional:!0});get hasPendingTasks(){return!this.destroyed&&this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new Hr(e=>{e.next(!1),e.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),this.debugTaskTracker?.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.debugTaskTracker?.remove(e),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Os=class extends Zr{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,Ua()&&(this.destroyRef=E(Cs,{optional:!0})??void 0,this.pendingTasks=E(Ds,{optional:!0})??void 0)}emit(e){let t=w(null);try{super.next(e)}finally{w(t)}}subscribe(e,t,n){let r=e,i=t||(()=>null),a=n;if(e&&typeof e==`object`){let t=e;r=t.next?.bind(t),i=t.error?.bind(t),a=t.complete?.bind(t)}this.__isAsync&&(i=this.wrapInTimeout(i),r&&=this.wrapInTimeout(r),a&&=this.wrapInTimeout(a));let o=super.subscribe({next:r,error:i,complete:a});return e instanceof hr&&e.add(o),o}wrapInTimeout(e){return t=>{let n=this.pendingTasks?.add();setTimeout(()=>{try{e(t)}finally{n!==void 0&&this.pendingTasks?.remove(n)}})}}};function ks(...e){}function As(e){let t,n;function r(){e=ks;try{n!==void 0&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch{}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==`function`&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function js(e){return queueMicrotask(()=>e()),()=>{e=ks}}var Ms=`isAngularZone`,Ns=`isAngularZone_ID`,Ps=0,Fs=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Os(!1);onMicrotaskEmpty=new Os(!1);onStable=new Os(!1);onError=new Os(!1);constructor(e){let{enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1,scheduleInRootZone:i=!1}=e;if(typeof Zone>`u`)throw new T(908,!1);Zone.assertZonePatched();let a=this;a._nesting=0,a._outer=a._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(a._inner=a._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(a._inner=a._inner.fork(Zone.longStackTraceZoneSpec)),a.shouldCoalesceEventChangeDetection=!r&&n,a.shouldCoalesceRunChangeDetection=r,a.callbackScheduled=!1,a.scheduleInRootZone=i,zs(a)}static isInAngularZone(){return typeof Zone<`u`&&Zone.current.get(Ms)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new T(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new T(909,!1)}run(e,t,n){return this._inner.run(e,t,n)}runTask(e,t,n,r){let i=this._inner,a=i.scheduleEventTask(`NgZoneEvent: `+r,e,Is,ks,ks);try{return i.runTask(a,t,n)}finally{i.cancelTask(a)}}runGuarded(e,t,n){return this._inner.runGuarded(e,t,n)}runOutsideAngular(e){return this._outer.run(e)}},Is={};function Ls(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Rs(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){As(()=>{e.callbackScheduled=!1,Bs(e),e.isCheckStableRunning=!0,Ls(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Bs(e)}function zs(e){let t=()=>{Rs(e)},n=Ps++;e._inner=e._inner.fork({name:`angular`,properties:{[Ms]:!0,[Ns]:n,[Ns+n]:!0},onInvokeTask:(n,r,i,a,o,s)=>{if(Ws(s))return n.invokeTask(i,a,o,s);try{return Vs(e),n.invokeTask(i,a,o,s)}finally{(e.shouldCoalesceEventChangeDetection&&a.type===`eventTask`||e.shouldCoalesceRunChangeDetection)&&t(),Hs(e)}},onInvoke:(n,r,i,a,o,s,c)=>{try{return Vs(e),n.invoke(i,a,o,s,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!Gs(s)&&t(),Hs(e)}},onHasTask:(t,n,r,i)=>{t.hasTask(r,i),n===r&&(i.change==`microTask`?(e._hasPendingMicrotasks=i.microTask,Bs(e),Ls(e)):i.change==`macroTask`&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(t,n,r,i)=>(t.handleError(r,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}function Bs(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0)}function Vs(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Hs(e){e._nesting--,Ls(e)}var Us=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Os;onMicrotaskEmpty=new Os;onStable=new Os;onError=new Os;run(e,t,n){return e.apply(t,n)}runGuarded(e,t,n){return e.apply(t,n)}runOutsideAngular(e){return e()}runTask(e,t,n,r){return e.apply(t,n)}};function Ws(e){return Ks(e,`__ignore_ng_zone__`)}function Gs(e){return Ks(e,`__scheduler_tick__`)}function Ks(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var qs=class{_console=console;handleError(e){this._console.error(`ERROR`,e)}},Js=new vi(``,{factory:()=>{let e=E(Fs),t=E(Aa),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(qs),n.handleError(r))})}}}),Ys={provide:da,useValue:()=>{E(qs,{optional:!0})},multi:!0};function j(e,t){let[n,r,i]=Hn(e,t?.equal),a=n;return a[dn],a.set=r,a.update=i,a.asReadonly=Xs.bind(a),a}function Xs(){let e=this[dn];if(e.readonlyFn===void 0){let t=()=>this();t[dn]=e,e.readonlyFn=t}return e.readonlyFn}var Zs=new vi(``,{factory:()=>Qs}),Qs=`ng`,$s=new vi(``),ec=new vi(``,{providedIn:`platform`,factory:()=>`unknown`}),tc=new vi(``,{factory:()=>E(Ss).body?.querySelector(`[ngCspNonce]`)?.getAttribute(`ngCspNonce`)||null}),nc=(()=>{class e{view;node;constructor(e,t){this.view=e,this.node=t}static __NG_ELEMENT_ID__=rc}return e})();function rc(){return new nc(O(),No())}var ic=class{},ac=new vi(``,{factory:()=>!0}),oc=new vi(``),sc=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>new cc})}return e})(),cc=class{dirtyEffectCount=0;queues=new Map;add(e){this.enqueue(e),this.schedule(e)}schedule(e){e.dirty&&this.dirtyEffectCount++}remove(e){let t=e.zone,n=this.queues.get(t);n.has(e)&&(n.delete(e),e.dirty&&this.dirtyEffectCount--)}enqueue(e){let t=e.zone;this.queues.has(t)||this.queues.set(t,new Set);let n=this.queues.get(t);n.has(e)||n.add(e)}flush(){for(;this.dirtyEffectCount>0;){let e=!1;for(let[t,n]of this.queues)e||=t===null?this.flushQueue(n):t.run(()=>this.flushQueue(n));e||(this.dirtyEffectCount=0)}}flushQueue(e){let t=!1;for(let n of e)n.dirty&&(this.dirtyEffectCount--,t=!0,n.run());return t}},lc=class{[dn];constructor(e){this[dn]=e}destroy(){this[dn].destroy()}};function uc(e,t){let n=t?.injector??E(xs),r=t?.manualCleanup===!0?null:n.get(Cs),i,a=n.get(nc,null,{optional:!0}),o=n.get(ic);return a===null?i=hc(e,n.get(sc),o):(i=mc(a.view,o,e),r instanceof ws&&r._lView===a.view&&(r=null)),i.injector=n,r!==null&&(i.onDestroyFns=[r.onDestroy(()=>i.destroy())]),new lc(i)}var dc={...Jn,cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Vo(!1);try{Yn(this)}finally{Vo(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=w(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],w(e)}}},fc={...dc,consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}},pc={...dc,consumerMarkedDirty(){this.view[2]|=8192,_o(this.view),this.notifier.notify(13)},destroy(){if(En(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[23]?.delete(this)}};function mc(e,t,n){let r=Object.create(pc);return r.view=e,r.zone=typeof Zone<`u`?Zone.current:null,r.notifier=t,r.fn=gc(r,n),e[23]??=new Set,e[23].add(r),r.consumerMarkedDirty(r),r}function hc(e,t,n){let r=Object.create(fc);return r.fn=gc(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<`u`?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function gc(e,t){return()=>{t(t=>(e.cleanupFns??=[]).push(t))}}function _c(e){return typeof e==`function`&&e[dn]!==void 0}function vc(e){return _c(e)&&typeof e.set==`function`}var yc=Symbol(`InputSignalNode#UNSET`),bc={...Kn,transformFn:void 0,applyValueToInputSignal(e,t){Wn(e,t)}};function xc(e){return{toString:e}.toString()}var Sc=(function(e){return e[e.TemplateCreateStart=0]=`TemplateCreateStart`,e[e.TemplateCreateEnd=1]=`TemplateCreateEnd`,e[e.TemplateUpdateStart=2]=`TemplateUpdateStart`,e[e.TemplateUpdateEnd=3]=`TemplateUpdateEnd`,e[e.LifecycleHookStart=4]=`LifecycleHookStart`,e[e.LifecycleHookEnd=5]=`LifecycleHookEnd`,e[e.OutputStart=6]=`OutputStart`,e[e.OutputEnd=7]=`OutputEnd`,e[e.BootstrapApplicationStart=8]=`BootstrapApplicationStart`,e[e.BootstrapApplicationEnd=9]=`BootstrapApplicationEnd`,e[e.BootstrapComponentStart=10]=`BootstrapComponentStart`,e[e.BootstrapComponentEnd=11]=`BootstrapComponentEnd`,e[e.ChangeDetectionStart=12]=`ChangeDetectionStart`,e[e.ChangeDetectionEnd=13]=`ChangeDetectionEnd`,e[e.ChangeDetectionSyncStart=14]=`ChangeDetectionSyncStart`,e[e.ChangeDetectionSyncEnd=15]=`ChangeDetectionSyncEnd`,e[e.AfterRenderHooksStart=16]=`AfterRenderHooksStart`,e[e.AfterRenderHooksEnd=17]=`AfterRenderHooksEnd`,e[e.ComponentStart=18]=`ComponentStart`,e[e.ComponentEnd=19]=`ComponentEnd`,e[e.DeferBlockStateStart=20]=`DeferBlockStateStart`,e[e.DeferBlockStateEnd=21]=`DeferBlockStateEnd`,e[e.DynamicComponentStart=22]=`DynamicComponentStart`,e[e.DynamicComponentEnd=23]=`DynamicComponentEnd`,e[e.HostBindingsUpdateStart=24]=`HostBindingsUpdateStart`,e[e.HostBindingsUpdateEnd=25]=`HostBindingsUpdateEnd`,e})(Sc||{}),Cc=class{previousValue;currentValue;firstChange;constructor(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}isFirstChange(){return this.firstChange}};function wc(e,t,n,r){t===null?e[n]=r:t.applyValueToInputSignal(t,r)}var Tc=null,Ec=(()=>{Tc=Oc;let e=()=>Oc;return e.ngInherit=!0,e})();function Dc(){return Tc}function Oc(e){return e.type.prototype.ngOnChanges&&(e.setInput=Ac),kc}function kc(){let e=Mc(this),t=e?.current;if(t){let n=e.previous;if(n===la)e.previous=t;else for(let e in t)n[e]=t[e];e.current=null,this.ngOnChanges(t)}}function Ac(e,t,n,r,i){let a=this.declaredInputs[r],o=Mc(e)||Nc(e,{previous:la,current:null}),s=o.current||={},c=o.previous,l=c[a];s[a]=new Cc(l&&l.currentValue,n,c===la),wc(e,t,i,n)}var jc=`__ngSimpleChanges__`;function Mc(e){return Object.hasOwn(e,jc)&&e[jc]||null}function Nc(e,t){return e[jc]=t}var Pc=[],Fc=function(e,t=null,n){for(let r=0;r=r)break}else t[c]<0&&(e[17]+=65536),(s>14>16&&(e[2]&3)===t&&(e[2]+=16384,Hc(o,a)):Hc(o,a)}var Wc=-1,Gc=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,t,n,r){this.factory=e,this.name=r,this.canSeeViewProviders=t,this.injectImpl=n}};function Kc(e){return!!(e.flags&8)}function qc(e){return!!(e.flags&16)}function Jc(e,t,n){let r=0;for(;rt){o=a-1;break}}}for(;a>16}function nl(e,t){let n=tl(e),r=t;for(;n>0;)r=r[14],n--;return r}var rl=!0;function il(e){let t=rl;return rl=e,t}var al=255,ol=5,sl=0,cl={};function ll(e,t,n){let r;typeof n==`string`?r=n.charCodeAt(0)||0:Object.hasOwn(n,wi)&&(r=n[wi]),r??=n[wi]=sl++;let i=r&al,a=1<>ol)]|=a}function ul(e,t){let n=fl(e,t);if(n!==-1)return n;let r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,dl(r.data,e),dl(t,null),dl(r.blueprint,null));let i=pl(e,t),a=e.injectorIndex;if($c(i)){let e=el(i),n=nl(i,t),r=n[1].data;for(let i=0;i<8;i++)t[a+i]=n[e+i]|r[e+i]}return t[a+8]=i,a}function dl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function fl(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function pl(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,i=t;for(;i!==null;){if(r=Ol(i),r===null)return Wc;if(n++,i=i[14],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Wc}function ml(e,t,n){ll(e,t,n)}function hl(e,t,n){if(n&8||e!==void 0)return e;Fi(t,`NodeInjector`)}function gl(e,t,n,r){if(n&8&&r===void 0&&(r=null),!(n&3)){let i=e[9],a=Bi(void 0);try{return i?i.get(t,r,n&8):Vi(t,r,n&8)}finally{Bi(a)}}return hl(r,t,n)}function _l(e,t,n,r=0,i){if(e!==null){if(t[2]&2048&&!(r&2)){let i=Dl(e,t,n,r,cl);if(i!==cl)return i}let i=vl(e,t,n,r,cl);if(i!==cl)return i}return gl(t,n,r,i)}function vl(e,t,n,r,i){let a=Sl(n);if(typeof a==`function`){if(!ts(t,e,r))return r&1?hl(i,n,r):gl(t,n,r,i);try{let e;if(e=a(r),e==null&&!(r&8))Fi(n);else return e}finally{os()}}else if(typeof a==`number`){let i=null,o=fl(e,t),s=Wc,c=r&1?t[15][5]:null;for((o===-1||r&4)&&(s=o===-1?pl(e,t):t[o+8],s===Wc||!wl(r,!1)?o=-1:(i=t[1],o=el(s),t=nl(s,t)));o!==-1;){let e=t[1];if(Cl(a,o,e.data)){let e=yl(o,t,n,i,r,c);if(e!==cl)return e}s=t[o+8],s!==Wc&&wl(r,t[1].data[o+8]===c)&&Cl(a,o,t)?(i=e,o=el(s),t=nl(s,t)):o=-1}}return i}function yl(e,t,n,r,i,a){let o=t[1],s=o.data[e+8],c=bl(s,o,n,r==null?Ja(s)&&rl:r!=o&&!!(s.type&3),i&1&&a===s);return c===null?cl:xl(t,o,c,s,i)}function bl(e,t,n,r,i){let a=e.providerIndexes,o=t.data,s=a&1048575,c=e.directiveStart,l=e.directiveEnd,u=a>>20,d=r?s:s+u,f=i?s+u:l;for(let e=d;e=c&&t.type===n)return e}if(i){let e=o[c];if(e&&Xa(e)&&e.type===n)return c}return null}function xl(e,t,n,r,i){let a=e[n],o=t.data;if(a instanceof Gc){let s=a;if(s.resolving)throw Pi(``);let c=il(s.canSeeViewProviders);s.resolving=!0,o[n].type||o[n];let l=s.injectImpl?Bi(s.injectImpl):null;ts(e,r,0);try{a=e[n]=s.factory(void 0,i,o,e,r),t.firstCreatePass&&n>=r.directiveStart&&Ic(n,o[n],t)}finally{l!==null&&Bi(l),il(c),s.resolving=!1,os()}}return a}function Sl(e){if(typeof e==`string`)return e.charCodeAt(0)||0;let t=Object.hasOwn(e,wi)?e[wi]:void 0;return typeof t==`number`?t>=0?t&al:El:t}function Cl(e,t,n){let r=1<>ol)]&r)}function wl(e,t){return!(e&2)&&!(e&1&&t)}var Tl=class{_tNode;_lView;constructor(e,t){this._tNode=e,this._lView=t}get(e,t,n){return _l(this._tNode,this._lView,e,Ji(n),t)}};function El(){return new Tl(No(),O())}function Dl(e,t,n,r,i){let a=e,o=t;for(;a!==null&&o!==null&&o[2]&2048&&!Za(o);){let e=vl(a,o,n,r|2,cl);if(e!==cl)return e;r&=-5;let t=a.parent;if(!t){let e=o[20];if(e){let t=e.get(n,cl,r);if(t!==cl)return t}t=Ol(o),o=o[14]}a=t}return i}function Ol(e){let t=e[1],n=t.type;return n===2?t.declTNode:n===1?e[5]:null}function kl(e){return{token:e.token,providedIn:e.autoProvided===!1?null:`root`,factory:e.factory,value:void 0}}function Al(){return jl(No(),O())}function jl(e,t){return new Ml(ro(e,t))}var Ml=(()=>{class e{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=Al}return e})();function Nl(e){return e instanceof Ml?e.nativeElement:e}function Pl(){return this._results[Symbol.iterator]()}var Fl=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new Zr}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,t){return this._results.reduce(e,t)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,t){this.dirty=!1;let n=ea(e);(this._changesDetected=!$i(this._results,n,t))&&(this._results=n,this.length=n.length,this.last=n[this.length-1],this.first=n[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=Pl};function Il(e){return(e.flags&128)==128}var Ll=(function(e){return e[e.OnPush=0]=`OnPush`,e[e.Eager=1]=`Eager`,e[e.Default=1]=`Default`,e})(Ll||{}),Rl=new Map,zl=0;function Bl(){return zl++}function Vl(e){Rl.set(e[19],e)}function Hl(e){Rl.delete(e[19])}var Ul=`__ngContext__`;function Wl(e,t){Ga(t)?(e[Ul]=t[19],Vl(t)):e[Ul]=t}function Gl(e){return ql(e[12])}function Kl(e){return ql(e[4])}function ql(e){for(;e!==null&&!Ka(e);)e=e[4];return e}var Jl=void 0;function Yl(e){Jl=e}function Xl(){if(Jl!==void 0)return Jl;if(typeof document<`u`)return document;throw new T(210,!1)}var Zl=!1,Ql=new vi(``,{factory:()=>Zl}),$l=new WeakMap;function eu(e,t){if(typeof e!=`object`||!e)return;let n=$l.get(e);n||(n=new WeakSet,$l.set(e,n)),n.add(t)}function tu(e){return(e.flags&32)==32}var nu=()=>null;function ru(e,t,n=!1){return nu(e,t,n)}function iu(e,t){let n=e.contentQueries;if(n!==null){let r=w(null);try{for(let r=0;r|^->||--!>|)/g,gu=`​$1​`;function _u(e){return e.replace(mu,e=>e.replace(hu,gu))}function vu(e,t){return e.createText(t)}function yu(e,t,n){e.setValue(t,n)}function bu(e,t){return e.createComment(_u(t))}function xu(e,t,n){return e.createElement(t,n)}function Su(e,t,n,r,i){e.insertBefore(t,n,r,i)}function Cu(e,t,n){e.appendChild(t,n)}function wu(e,t,n,r,i){r===null?Cu(e,t,n):Su(e,t,n,r,i)}function Tu(e,t,n,r){e.removeChild(null,t,n,r)}function Eu(e,t,n){e.setAttribute(t,`style`,n)}function Du(e,t,n){n===``?e.removeAttribute(t,`class`):e.setAttribute(t,`class`,n)}function Ou(e,t,n){let{mergedAttrs:r,classes:i,styles:a}=n;r!==null&&Jc(e,t,r),i!==null&&Du(e,t,i),a!==null&&Eu(e,t,a)}function ku(e){let t=Au();return t?t.sanitize($a.URL,e)||``:uu(e,`URL`)?lu(e):pu(Ai(e))}function Au(){let e=O();return e&&e[10].sanitizer}function ju(e){return e.ownerDocument.defaultView}function Mu(e){return e.ownerDocument}function Nu(e,t,n){let r=e.length;for(;;){let i=e.indexOf(t,n);if(i===-1)return i;if(i===0||e.charCodeAt(i-1)<=32){let n=t.length;if(i+n===r||e.charCodeAt(i+n)<=32)return i}n=i+1}}var Pu=`ng-template`;function Fu(e,t,n,r){let i=0;if(r){for(;i-1){let e;for(;++ia?``:i[u+1].toLowerCase(),r&2&&l!==e){if(zu(r))return!1;o=!0}}}}}return zu(r)||o}function zu(e){return!(e&1)}function Bu(e,t,n,r){if(t===null)return-1;let i=0;if(r||!n){let n=!1;for(;i-1)for(n++;n0?`="`+t+`"`:``)+`]`}else r&8?i+=`.`+o:r&4&&(i+=` `+o)}else i!==``&&!zu(o)&&(t+=Wu(a,i),i=``),r=o,a||=!zu(r);n++}return i!==``&&(t+=Wu(a,i)),t}function Ku(e){return e.map(Gu).join(`,`)}function qu(e){let t=[],n=[],r=1,i=2;for(;r!1});function $u(e){if(!e)return 0;let t=e.toLowerCase().indexOf(`ms`)>-1?1:1e3;return parseFloat(e)*t}function ed(e,t){return e.getPropertyValue(t).split(`,`).map(e=>e.trim())}function td(e){let t=ed(e,`transition-property`),n=ed(e,`transition-duration`),r=ed(e,`transition-delay`),i={propertyName:``,duration:0,animationName:void 0};for(let e=0;ei.duration&&(i.propertyName=t[e],i.duration=a)}return i}function nd(e){let t=ed(e,`animation-name`),n=ed(e,`animation-delay`),r=ed(e,`animation-duration`),i=ed(e,`animation-iteration-count`),a={animationName:``,propertyName:void 0,duration:0};for(let e=0;ea.duration&&s!==`infinite`&&(a.animationName=t[e],a.duration=o)}return a}function rd(e,t){return e!==void 0&&e.duration>t.duration}function id(e){return(e.animationName!=null||e.propertyName!=null)&&e.duration>0}function ad(e){let t=e.effect?.getTiming();if(t===void 0)return;let n=typeof t.duration==`number`?t.duration:0,r=(t.delay??0)+n,i=e.playbackRate;return i!==void 0&&i!==0&&i!==1&&(r/=Math.abs(i)),r}function od(e,t){let n=getComputedStyle(e),r=nd(n),i=td(n),a=r.duration>i.duration?r:i;rd(t.get(e),a)||id(a)&&t.set(e,a)}function sd(e,t,n){if(!n)return;let r=e.getAnimations();return r.length===0?od(e,t):cd(e,t,r)}function cd(e,t,n){let r={animationName:void 0,propertyName:void 0,duration:0};for(let e of n){if(e.effect?.getTiming()?.iterations===1/0)continue;let t=ad(e)??0,n,i;e.animationName?i=e.animationName:n=e.transitionProperty,t>=r.duration&&(r={animationName:i,propertyName:n,duration:t})}rd(t.get(e),r)||id(r)&&t.set(e,r)}var ld=new Set,ud=!1,dd=1,fd=typeof document<`u`&&typeof document?.documentElement?.getAnimations==`function`;function pd(e){return e[9].get(Qu,ud)}function md(e,t,n){let r=gd.get(e);if(r){for(let e of t)r.classList.push(e);for(let e of n)r.cleanupFns.push(e)}else gd.set(e,{classList:t,cleanupFns:n})}function hd(e){let t=gd.get(e);if(t){for(let e of t.cleanupFns)e();gd.delete(e)}_d.delete(e)}var gd=new WeakMap,_d=new WeakMap,vd=new WeakMap;function yd(e){return e?e[14]??e:null}var bd=new WeakSet;function xd(e,t,n){let r=vd.get(e);if(!r||r.length===0)return;let i=t.parentNode,a=t.previousSibling,o=yd(n);for(let e=r.length-1;e>=0;e--){let{el:n,declarationView:s}=r[e],c=n.parentNode;n===t?(r.splice(e,1),bd.add(n),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}}))):(a&&n===a||c&&i&&c!==i&&(o===null||s===null||o===s))&&(r.splice(e,1),n.dispatchEvent(new CustomEvent(`animationend`,{detail:{cancel:!0}})),n.parentNode?.removeChild(n))}}function Sd(e,t,n){let r=yd(n),i=vd.get(e);i?i.some(e=>e.el===t)||i.push({el:t,declarationView:r}):vd.set(e,[{el:t,declarationView:r}])}function Cd(e){let t=e[26]??={};return t.enter??=new Map}function wd(e){let t=typeof e==`function`?e():e,n=Array.isArray(t)?t:null;return typeof t==`string`&&(n=t.trim().split(/\s+/).filter(e=>e)),n}function Td(e){return e.composedPath?e.composedPath()[0]:e.target}function Ed(e,t){let n=_d.get(t);if(n===void 0)return!0;if(t!==Td(e))return!1;let r=e.animation;if(r){let e=ad(r);if(e!==void 0&&e+dd{class e{impl=null;execute(){this.impl?.execute()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Nd=[0,1,2,3],Pd=(()=>{class e{ngZone=E(Fs);scheduler=E(ic);errorHandler=E(qs,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){E(kd,{optional:!0})}execute(){let e=this.sequences.size>0;e&&Fc(Sc.AfterRenderHooksStart),this.executing=!0;for(let e of Nd)for(let t of this.sequences)if(!t.erroredOrDestroyed&&t.hooks[e])try{t.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let n=t.hooks[e];return n(t.pipelinedValue)},t.snapshot))}catch(e){t.erroredOrDestroyed=!0,this.errorHandler?.handleError(e)}this.executing=!1;for(let e of this.sequences)e.afterRun(),e.once&&(this.sequences.delete(e),e.destroy());for(let e of this.deferredRegistrations)this.sequences.add(e);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&Fc(Sc.AfterRenderHooksEnd)}register(e){let{view:t}=e;t===void 0?this.executing?this.deferredRegistrations.add(e):this.addSequence(e):((t[25]??=[]).push(e),_o(t),t[2]|=8192)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,t){return t?t.run(Od.AFTER_NEXT_RENDER,e):e()}static ɵprov=di({token:e,providedIn:`root`,factory:()=>new e})}return e})(),Fd=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,t,n,r,i,a=null){this.impl=e,this.hooks=t,this.view=n,this.once=r,this.snapshot=a,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[25];e&&(this.view[25]=e.filter(e=>e!==this))}};function Id(e,t){let n=t?.injector??E(xs);return jd(`NgAfterNextRender`),Rd(e,n,t,!0)}function Ld(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function Rd(e,t,n,r){let i=t.get(Md);i.impl??=t.get(Pd);let a=t.get(kd,null,{optional:!0}),o=n?.manualCleanup===!0?null:t.get(Cs),s=t.get(nc,null,{optional:!0}),c=new Fd(i.impl,Ld(e),s?.view,r,o,a?.snapshot(null));return i.impl.register(c),c}var zd=new vi(``,{factory:()=>{let e=E(Aa),t=new Set;return e.onDestroy(()=>t.clear()),{queue:t,isScheduled:!1,scheduler:null,injector:e}}});function Bd(e,t,n){let r=e.get(zd);if(Array.isArray(t))for(let e of t)r.queue.add(e),n?.detachedLeaveAnimationFns?.push(e);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function Vd(e,t){let n=e.get(zd);if(Array.isArray(t))for(let e of t)n.queue.delete(e);else n.queue.delete(t)}function Hd(e,t){let n=e.get(zd);if(t.detachedLeaveAnimationFns){for(let e of t.detachedLeaveAnimationFns)n.queue.delete(e);t.detachedLeaveAnimationFns=void 0}}function Ud(e){let t=e.get(zd);t.isScheduled||=(Id(()=>{t.isScheduled=!1;for(let e of t.queue)e();t.queue.clear()},{injector:t.injector}),!0)}function Wd(e){let t=e.get(zd);t.scheduler=Ud,t.scheduler(e)}function Gd(e,t){for(let[n,r]of t)Bd(e,r.animateFns)}function Kd(e,t,n,r){let i=e?.[26]?.enter;t!==null&&i&&i.has(n.index)&&Gd(r,i)}function qd(e,t,n,r){try{n.get(fa)}catch{return r(!1)}let i=e?.[26];i?.enter?.has(t.index)&&Vd(n,i.enter.get(t.index).animateFns);let a=Jd(e,t,i);if(a.size===0){let n=!1;if(e){let r=[];Xd(e,t,r),n=r.length>0}if(!n)return r(!1)}e&&ld.add(e[19]),Bd(n,()=>Yd(e,t,i||void 0,a,r),i||void 0)}function Jd(e,t,n){let r=new Map,i=n?.leave;if(i&&i.has(t.index)&&r.set(t.index,i.get(t.index)),e&&i)for(let[n,a]of i){if(r.has(n))continue;let i=e[1].data[n].parent;for(;i;){if(i===t){r.set(n,a);break}i=i.parent}}return r}function Yd(e,t,n,r,i){let a=[];if(n&&n.leave)for(let[e]of r){if(!n.leave.has(e))continue;let t=n.leave.get(e);for(let e of t.animateFns){let{promise:t}=e();a.push(t)}n.detachedLeaveAnimationFns=void 0}if(e&&Xd(e,t,a),a.length>0){let t=n||e?.[26];if(t){let n=t.running;n&&a.push(n),t.running=Promise.allSettled(a),Qd(e,t.running,i)}else Promise.allSettled(a).then(()=>{e&&ld.delete(e[19]),i(!0)})}else e&&ld.delete(e[19]),i(!1)}function Xd(e,t,n){if(t.type&12){let r=e[t.index];if(Ka(r))for(let e=10;e{e[26]?.running===t&&(e[26].running=void 0,ld.delete(e[19])),n(!0)})}function $d(e,t,n,r,i,a,o,s){if(i!=null){let c,l=!1;Ka(i)?c=i:Ga(i)&&(l=!0,i=i[0]);let u=to(i);e===0&&r!==null?(Kd(s,r,a,n),o==null?Cu(t,r,u):Su(t,r,u,o||null,!0)):e===1&&r!==null?(Kd(s,r,a,n),Su(t,r,u,o||null,!0),xd(a,u,s)):e===2?(s?.[26]?.leave?.has(a.index)&&Sd(a,u,s),bd.delete(u),qd(s,a,n,e=>{if(bd.has(u)){bd.delete(u);return}Tu(t,u,l,e)})):e===3&&(bd.delete(u),qd(s,a,n,()=>{t.destroyNode(u)})),c!=null&&Cf(t,e,n,c,a,r,o)}}function ef(e,t){nf(e,t),t[0]=null,t[5]=null}function tf(e,t,n,r,i,a){r[0]=i,r[5]=t,bf(e,r,n,1,i,a)}function nf(e,t){t[10].changeDetectionScheduler?.notify(9),bf(e,t,t[11],2,null,null)}function rf(e){let t=e[12];if(!t)return sf(e[1],e);for(;t;){let n=null;if(Ga(t))n=t[12];else{let e=t[10];e&&(n=e)}if(!n){for(;t&&!t[4]&&t!==e;)Ga(t)&&sf(t[1],t),t=t[3];t===null&&(t=e),Ga(t)&&sf(t[1],t),n=t&&t[4]}t=n}}function af(e,t){let n=e[9],r=n.indexOf(t);n.splice(r,1)}function of(e,t){if(Qa(t))return;let n=t[11];n.destroyNode&&bf(e,t,n,3,null,null),rf(t)}function sf(e,t){if(Qa(t))return;let n=w(null);try{t[2]&=-129,t[2]|=256,t[24]&&En(t[24]),lf(e,t),cf(e,t),t[1].type===1&&t[11].destroy();let n=t[16];if(n!==null&&Ka(t[3])){n!==t[3]&&af(n,t);let r=t[18];r!==null&&r.detachView(e)}Hl(t)}finally{w(n)}}function cf(e,t){let n=e.cleanup,r=t[7];if(n!==null)for(let e=0;e=0?r[t]():r[-t].unsubscribe(),e+=2}else{let t=r[n[e+1]];n[e].call(t)}r!==null&&(t[7]=null);let i=t[21];if(i!==null){t[21]=null;for(let e=0;e27&&Nf(e,t,27,!1),Fc(o?Sc.TemplateUpdateStart:Sc.TemplateCreateStart,i,n),n(r,i)}finally{us(a),Fc(o?Sc.TemplateUpdateEnd:Sc.TemplateCreateEnd,i,n)}}function Lf(e,t,n){Wf(e,t,n),(n.flags&64)==64&&Gf(e,t,n)}function Rf(e,t,n=ro){let r=t.localNames;if(r!==null){let i=t.index+1;for(let a=0;a{_o(e.lView)},consumerOnSignalRead(){this.lView[24]=this}};function hp(e){let t=e[24]??Object.create(gp);return t.lView=e,t}var gp={...pn,consumerIsAlwaysLive:!0,kind:`template`,consumerMarkedDirty:e=>{let t=bo(e.lView);for(;t&&!_p(t[1]);)t=bo(t);t&&po(t)},consumerOnSignalRead(){this.lView[24]=this}};function _p(e){return e.type!==2}function vp(e){if(e[23]===null)return;let t=!0;for(;t;){let n=!1;for(let t of e[23])if(t.dirty&&(n=!0,t.zone===null||Zone.current===t.zone?t.run():t.zone.run(()=>t.run()),e[23]===null))return;t=n&&!!(e[2]&8192)}}var yp=100;function bp(e,t=0){let n=e[10].rendererFactory;n.begin?.();try{xp(e,t)}finally{n.end?.()}}function xp(e,t){let n=Bo();try{Vo(!0),Dp(e,t);let n=0;for(;ho(e);){if(n===yp)throw new T(103,!1);n++,Dp(e,1)}}finally{Vo(n)}}function Sp(e,t,n,r){if(Qa(t))return;let i=t[2];ns(t);let a=!0,o=null,s=null;_p(e)?(s=dp(t),o=xn(s)):fn()===null?(a=!1,s=hp(t),o=xn(s)):t[24]&&=(En(t[24]),null);try{fo(t),Wo(e.bindingStartIndex),n!==null&&If(e,t,n,2,r);let a=(i&3)==3;if(a){let n=e.preOrderCheckHooks;n!==null&&Rc(t,n,null)}else{let n=e.preOrderHooks;n!==null&&zc(t,n,0,null),Bc(t,0)}if(wp(t),vp(t),Cp(t,0),e.contentQueries!==null&&iu(e,t),a){let n=e.contentCheckHooks;n!==null&&Rc(t,n)}else{let n=e.contentHooks;n!==null&&zc(t,n,1),Bc(t,1)}kp(e,t);let o=e.components;o!==null&&Op(t,o,0);let s=e.viewQuery;if(s!==null&&au(2,s,r),a){let n=e.viewCheckHooks;n!==null&&Rc(t,n)}else{let n=e.viewHooks;n!==null&&zc(t,n,2),Bc(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[22]){for(let e of t[22])e();t[22]=null}lp(t),t[2]&=-73}catch(e){throw _o(t),e}finally{s!==null&&(Cn(s,o),a&&pp(s)),ss()}}function Cp(e,t){for(let n=Gl(e);n!==null;n=Kl(n))for(let e=10;e0&&(e[n-1][4]=r[4]);let a=ra(e,10+t);ef(r[1],r);let o=a[18];o!==null&&o.detachView(a[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}function Ip(e,t,n,r){let i=10+r,a=n.length;r>0&&(n[i-1][4]=t),r-1&&(Fp(e,n),ra(t,n))}this._attachedToViewContainer=!1}of(this._lView[1],this._lView)}onDestroy(e){vo(this._lView,e)}markForCheck(){Ap(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[2]&=-129}reattach(){go(this._lView),this._lView[2]|=128}detectChanges(){this._lView[2]|=1024,bp(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new T(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=Za(this._lView),t=this._lView[16];t!==null&&!e&&af(t,this._lView),nf(this._lView[1],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new T(902,!1);this._appRef=e;let t=Za(this._lView),n=this._lView[16];n!==null&&!t&&Lp(n,this._lView),go(this._lView)}},zp=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=Bp;constructor(e,t,n){this._declarationLView=e,this._declarationTContainer=t,this.elementRef=n}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,t){return this.createEmbeddedViewImpl(e,t)}createEmbeddedViewImpl(e,t,n){return new Rp(ap(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:t,dehydratedView:n}))}}return e})();function Bp(){return Vp(No(),O())}function Vp(e,t){return e.type&4?new zp(t,e,jl(e,t)):null}function Hp(e,t,n,r,i){let a=e.data[t];if(a===null)a=Up(e,t,n,r,i),qo()&&(a.flags|=32);else if(a.type&64){a.type=n,a.value=r,a.attrs=i;let e=Fo();a.injectorIndex=e===null?-1:e.injectorIndex}return Io(a,!0),a}function Up(e,t,n,r,i){let a=Po(),o=Lo(),s=o?a:a&&a.parent,c=e.data[t]=Gp(e,s,n,t,r,i);return Wp(e,c,a,o),c}function Wp(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function Gp(e,t,n,r,i,a){let o=t?t.injectorIndex:-1,s=0;return ko()&&(s|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:o,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:s,providerIndexes:0,value:i,namespace:hs(),attrs:a,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function Kp(e){let t=e[6]??[],n=e[3][11],r=[];for(let e of t)e.data.di===void 0?qp(e,n):r.push(e);e[6]=r}function qp(e,t){let n=0,r=e.firstChild;if(r){let i=e.data.r;for(;nnull,Yp=()=>null;function Xp(e,t){return Jp(e,t)}function Zp(e,t,n){return Yp(e,t,n)}var Qp=class{},$p=class{},em=(()=>{class e{static ɵprov=di({token:e,providedIn:`root`,factory:()=>null})}return e})();function tm(e){return e.debugInfo?.className||e.type.name||null}var nm={},rm=class{injector;parentInjector;constructor(e,t){this.injector=e,this.parentInjector=t}get(e,t,n){let r=this.injector.get(e,nm,n);return r!==nm||t===nm?r:this.parentInjector.get(e,t,n)}};function im(e,t,n){return e[t]=n}function am(e,t){return e[t]}function om(e,t,n){if(n===Ju)return!1;let r=e[t];return!Object.is(r,n)&&(e[t]=n,!0)}function sm(e,t,n,r){let i=om(e,t,n);return om(e,t+1,r)||i}function cm(e,t,n,r,i){let a=sm(e,t,n,r);return om(e,t+2,i)||a}function lm(e,t,n,r,i,a){let o=sm(e,t,n,r);return sm(e,t+2,i,a)||o}function um(e,t,n){return function r(i){let a=r.__ngNativeEl__;a!==void 0&&eu(i,a),Ap(Ja(e)?so(e.index,t):t,5);let o=t[8],s=dm(t,o,n,i),c=r.__ngNextListenerFn__;for(;c;)s=dm(t,o,c,i)&&s,c=c.__ngNextListenerFn__;return s}}function dm(e,t,n,r){let i=w(null);try{return Fc(Sc.OutputStart,t,n),n(r)!==!1}catch(t){return $f(e,t),!1}finally{Fc(Sc.OutputEnd,t,n),w(i)}}function fm(e,t,n,r,i,a,o,s){let c=Ya(e),l=!1,u=null;if(!r&&c&&(u=mm(t,n,a,e.index)),u!==null){let e=u.__ngLastListenerFn__||u;e.__ngNextListenerFn__=o,u.__ngLastListenerFn__=o,l=!0}else{let o=ro(e,n),c=r?r(o):o;r||(s.__ngNativeEl__=o);let l=i.listen(c,a,s);pm(a)||hm(r?t=>r(to(t[e.index])):e.index,t,n,a,s,l,!1)}return l}function pm(e){return e.startsWith(`animation`)||e.startsWith(`transition`)}function mm(e,t,n,r){let i=e.cleanup;if(i!=null)for(let e=0;er?n[r]:null}typeof a==`string`&&(e+=2)}return null}function hm(e,t,n,r,i,a,o){let s=t.firstCreatePass?So(t):null,c=xo(n),l=c.length;c.push(i,a),s&&s.push(r,e,l,(l+1)*(o?-1:1))}function gm(e,t,n,r,i,a){let o=t[n],s=t[1],c=o[s.data[n].outputs[r]].subscribe(a);hm(e.index,s,t,i,a,c,!0)}var _m=Symbol(`BINDING`),vm=new vi(``);function ym(e,t,n){let r=n?e.styles:null,i=n?e.classes:null,a=0;if(t!==null)for(let e=0;e0&&(n.directiveToIndex=new Map);for(let c=0;c0;){let n=e[--t];if(typeof n==`number`&&n<0)return n}return 0}function Nm(e,t,n){if(n){if(t.exportAs)for(let r=0;r{let[n,r,i]=e[t],a={propName:n,templateName:t,isSignal:(r&Pf.SignalBased)!==0};return i&&(a.transform=i),a})}function Vm(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Hm(e,t,n){let r=t instanceof Aa?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new rm(n,r):n}function Um(e){let t=e.get($p,null);if(t===null)throw new T(407,!1);return{rendererFactory:t,sanitizer:e.get(em,null),changeDetectionScheduler:e.get(ic,null),ngReflect:!1,tracingService:e.get(kd,null,{optional:!0})}}function Wm(e,t,n){let r=Km(e);return xu(t,r,r===`svg`?`svg`:r===`math`?eo:n)}function Gm(e){if((e&&`localName`in e&&typeof e.localName==`string`?e.localName:e?.tagName)?.toLowerCase()===`script`)throw new T(905,!1)}function Km(e){return(e.selectors[0][0]||`div`).toLowerCase()}var qm=class{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Bm(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Vm(this.componentDef.outputs),this.cachedOutputs}constructor(e,t){this.componentDef=e,this.ngModule=t,this.componentType=e.type,this.selector=Ku(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!t}create(e,t,n,r,i,a,o){Fc(Sc.DynamicComponentStart);let s=w(null);try{let s=this.componentDef,c=Hm(s,r||this.ngModule,e),l=Um(c),u=l.tracingService;return u&&u.componentCreate?u.componentCreate(tm(s),()=>this.createComponentRef(l,c,t,n,i,a,o)):this.createComponentRef(l,c,t,n,i,a,o)}finally{w(s)}}createComponentRef(e,t,n,r,i,a,o){let s=this.componentDef,c=Jm(r,s,a,i),l=e.rendererFactory.createRenderer(null,s),u=r?zf(l,r,s.encapsulation,t):Wm(s,l,o??null);Gm(u);let d=t.get(vm,null),f=Ym(u,()=>t.get(Ss,null)??Xl());d&&d.addHost(f);let p=a?.some(Zm)||i?.some(e=>typeof e!=`function`&&e.bindings.some(Zm)),m=Of(null,c,null,512|Af(s),null,null,e,l,t,null,ru(u,t,!0));d&&Rm&&f instanceof ShadowRoot&&vo(m,()=>{d.removeHost(f)}),m[27]=u,ns(m);let h=null;try{let e=Fm(27,m,2,`#host`,()=>c.directiveRegistry,!0,0);Ou(l,u,e),Wl(u,m),Lf(c,m,e),ou(c,e,m),Im(c,e),n!==void 0&&$m(e,this.ngContentSelectors,n),h=so(e.index,m),m[8]=h[8],rp(c,m,null)}catch(e){throw h!==null&&Hl(h),Hl(m),e}finally{Fc(Sc.DynamicComponentEnd),ss()}return new Qm(this.componentType,m,!!p)}};function Jm(e,t,n,r){let i=e?[`ng-version`,`22.1.7`]:qu(t.selectors[0]),a=null,o=null,s=0;if(n)for(let e of n)s+=e[_m].requiredVars,e.create&&(e.targetIdx=0,(a??=[]).push(e)),e.update&&(e.targetIdx=0,(o??=[]).push(e));if(r)for(let e=0;e{if(n&1&&e)for(let t of e)t.create();if(n&2&&t)for(let e of t)e.update()}}function Zm(e){let t=e[_m].kind;return t===`input`||t===`twoWay`}var Qm=class extends Qp{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,t,n){super(),this._rootLView=t,this._hasInputBindings=n,this._tNode=io(t[1],27),this.location=jl(this._tNode,t),this.instance=so(this._tNode.index,t)[8],this.hostView=this.changeDetectorRef=new Rp(t,void 0),this.componentType=e}setInput(e,t){this._hasInputBindings;let n=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),t))return;let r=this._rootLView;ep(n,r[1],r,e,t),this.previousInputValues.set(e,t),Ap(so(n.index,r),1)}get injector(){return new Tl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function $m(e,t,n){let r=e.projection=[];for(let e=0;e{class e{static __NG_ELEMENT_ID__=th}return e})();function th(){return ah(No(),O())}var nh=class e extends eh{_lContainer;_hostTNode;_hostLView;constructor(e,t,n){super(),this._lContainer=e,this._hostTNode=t,this._hostLView=n}get element(){return jl(this._hostTNode,this._hostLView)}get injector(){return new Tl(this._hostTNode,this._hostLView)}get parentInjector(){let e=pl(this._hostTNode,this._hostLView);if($c(e)){let t=nl(e,this._hostLView),n=el(e),r=t[1].data[n+8];return new Tl(r,t)}return new Tl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let t=rh(this._lContainer);return t!==null&&t[e]||null}get length(){return this._lContainer.length-10}createEmbeddedView(e,t,n){let r,i;typeof n==`number`?r=n:n!=null&&(r=n.index,i=n.injector);let a=Xp(this._lContainer,e.ssrId),o=e.createEmbeddedViewImpl(t||{},i,a);return this.insertImpl(o,r,op(this._hostTNode,a)),o}createComponent(e,t,n,r,i,a,o){let s,c=t||{};s=c.index,n=c.injector,r=c.projectableNodes,i=c.environmentInjector||c.ngModuleRef,a=c.directives,o=c.bindings;let l=new qm(Ei(e)),u=n||this.parentInjector;if(!i&&l.ngModule==null){let e=this.parentInjector.get(Aa,null);e&&(i=e)}let d=Ei(l.componentType??{}),f=Xp(this._lContainer,d?.id??null),p=f?.firstChild??null,m=l.create(u,r,p,i,a,o,this._getHostElementNamespace());return this.insertImpl(m.hostView,s,op(this._hostTNode,f)),m}_getHostElementNamespace(){if(this._hostTNode.type&2){let e=this._hostTNode.parent??this._hostLView[5];return e!==null&&e.type&2&&typeof e.value==`string`&&e.value.toLowerCase()===`foreignobject`?null:e?.namespace??null}return this._hostTNode.namespace}insert(e,t){return this.insertImpl(e,t,!0)}insertImpl(t,n,r){let i=t._lView;if(lo(i)){let n=this.indexOf(t);if(n!==-1)this.detach(n);else{let n=i[3],r=new e(n,n[5],n[3]);r.detach(r.indexOf(t))}}let a=this._adjustIndex(n),o=this._lContainer;return Np(o,i,a,r),t.attachToViewContainerRef(),na(ih(o),a,t),t}move(e,t){return this.insert(e,t)}indexOf(e){let t=rh(this._lContainer);return t===null?-1:t.indexOf(e)}remove(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);n&&(ra(ih(this._lContainer),t),of(n[1],n))}detach(e){let t=this._adjustIndex(e,-1),n=Fp(this._lContainer,t);return n&&ra(ih(this._lContainer),t)!=null?new Rp(n):null}_adjustIndex(e,t=0){return e??this.length+t}};function rh(e){return e[8]}function ih(e){return e[8]||=[]}function ah(e,t){let n,r=t[e.index];return Ka(r)?n=r:(n=jp(r,t,null,e),t[e.index]=n,Mf(t,n)),sh(n,t,e,r),new nh(n,e,t)}function oh(e,t){let n=e[11],r=n.createComment(``),i=ro(t,e);return Su(n,n.parentNode(i),r,n.nextSibling(i),!1),r}var sh=uh,ch=()=>!1;function lh(e,t,n){return ch(e,t,n)}function uh(e,t,n,r){if(e[7])return;let i;i=n.type&8?to(r):oh(t,n),e[7]=i}var dh=class e{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},fh=class e{queries;constructor(e=[]){this.queries=e}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries===null?n.length:t.contentQueries[0],i=[];for(let e=0;e0)r.push(o[e/2]);else{let i=a[e+1],o=t[-n];for(let e=10;ee.trim())}function Eh(e,t,n){e.queries===null&&(e.queries=new mh),e.queries.track(new hh(t,n))}function Dh(e,t){return e.queries.getByIndex(t)}function Oh(e,t){let n=e[1],r=Dh(n,t);return r.crossesNgTemplate?xh(n,e,t,[]):bh(n,e,r,t)}function kh(e,t,n){let r,i=Mn(()=>{r._dirtyCounter();let n=Nh(r,e);if(t&&n===void 0)throw new T(-951,!1);return n});return r=i[dn],r._dirtyCounter=j(0),r._flatValue=void 0,i}function Ah(e){return kh(!0,!1,e)}function jh(e){return kh(!0,!0,e)}function Mh(e,t){let n=e[dn];n._lView=O(),n._queryIndex=t,n._queryList=Sh(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(e=>e+1))}function Nh(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[2]&4)return t?void 0:ua;let i=Sh(n,r),a=Oh(n,r);return i.reset(a,Nl),t?i.first:i._changesDetected||e._flatValue===void 0?e._flatValue=i.toArray():e._flatValue}function Ph(e){return!!e&&typeof e.then==`function`}function Fh(e){return!!e&&typeof e.subscribe==`function`}var Ih=class{},Lh=class extends Ih{injector;instance=null;constructor(e){super();let t=new ja([...e.providers,{provide:Ih,useValue:this}],e.parent||ka(),e.debugName,new Set([`environment`]));this.injector=t,e.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Rh(e,t,n=null){return new Lh({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var zh=(()=>{class e{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let t=ga(!1,e.type),n=t.length>0?Rh([t],this._injector,``):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static ɵprov=di({token:e,providedIn:`environment`,factory:()=>new e(qi(Aa))})}return e})();function Bh(e){return xc(()=>{let t=Kh(e),n={...t,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection!==Ll.Eager,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?e=>e.get(zh).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||su.Emulated,styles:e.styles||ua,_:null,schemas:e.schemas||null,tView:null,id:``};t.standalone&&jd(`NgStandalone`),qh(n);let r=e.dependencies;return n.directiveDefs=Jh(r,Vh),n.pipeDefs=Jh(r,Oi),n.id=Yh(n),n})}function Vh(e){return Ei(e)||Di(e)}function Hh(e,t){if(e==null)return la;let n={};for(let r in e)if(Object.hasOwn(e,r)){let i=e[r],a,o,s,c;Array.isArray(i)?(s=i[0],a=i[1],o=i[2]??a,c=i[3]||null):(a=i,o=i,s=Pf.None,c=null),n[a]=[r,s,c],t[a]=o}return n}function Uh(e){if(e==null)return la;let t={};for(let n in e)Object.hasOwn(e,n)&&(t[e[n]]=n);return t}function Wh(e){return xc(()=>{let t=Kh(e);return qh(t),t})}function Gh(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Kh(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||la,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||ua,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,signalFormsInputPresence:null,inputs:Hh(e.inputs,t),outputs:Uh(e.outputs),debugInfo:null}}function qh(e){e.features?.forEach(t=>t(e))}function Jh(e,t){return e?()=>{let n=typeof e==`function`?e():e,r=[];for(let e of n){let n=t(e);n!==null&&r.push(n)}return r}:null}function Yh(e){let t=0,n=typeof e.consts==`function`?``:e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let e of r.join(`|`))t=Math.imul(31,t)+e.charCodeAt(0)<<0;return t+=2147483648,`c`+t}var Xh=new vi(``),Zh=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});appInits=E(Xh,{optional:!0})??[];injector=E(xs);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let t of this.appInits){let n=Ha(this.injector,t);if(Ph(n))e.push(n);else if(Fh(n)){let t=new Promise((e,t)=>{n.subscribe({complete:e,error:t})});e.push(t)}}let t=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{t()}).catch(e=>{this.reject(e)}),e.length===0&&t(),this.initialized=!0}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function Qh(e,t,n,r,i,a,o,s){if(n.firstCreatePass){e.mergedAttrs=Zc(e.mergedAttrs,e.attrs);let t=e.tView=Tf(2,e,i,a,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),t.queries=n.queries.embeddedTView(e))}s&&(e.flags|=s),Io(e,!1);let c=ng(n,t,e,r);_s()&&hf(n,t,c,e),Wl(c,t);let l=jp(c,t,c,e);t[r+27]=l,Mf(t,l),lh(l,e,t)}function $h(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;return t.firstCreatePass?(f=Hp(t,d,4,o||null,s||null),Oo()&&xm(t,e,f,uo(t.consts,l),qf),Lc(t,f)):f=t.data[d],Qh(f,e,t,n,r,i,a,c),Ya(f)&&Lf(t,e,f),l!=null&&Rf(e,f,u),f}function eg(e,t,n,r,i,a,o,s,c,l,u){let d=n+27,f;if(t.firstCreatePass){if(f=Hp(t,d,4,o||null,s||null),l!=null){let e=uo(t.consts,l);f.localNames=[];for(let t=0;t{throw new T(600,``)})}var sg=10,cg=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=E(Js);afterRenderManager=E(Md);zonelessEnabled=E(ac);rootEffectScheduler=E(sc);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new Zr;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=E(Ds);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(ei(e=>!e))}constructor(){E(kd,{optional:!0})}whenStable(){let e;return new Promise(t=>{e=this.isStable.subscribe({next:e=>{e&&t()}})}).finally(()=>{e.unsubscribe()})}_injector=E(Aa);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,t){return this.bootstrapImpl(e,t)}bootstrapImpl(e,t,n=xs.NULL){return this._injector.get(Fs).run(()=>{if(Fc(Sc.BootstrapComponentStart),!this._injector.get(Zh).done)throw new T(405,``);let r=Ei(e),i=this._injector.get(Ih),a=new qm(r,i);this.componentTypes.push(e);let{hostElement:o,directives:s,bindings:c}=lg(t),l=o||a.selector,u=a.create(n,[],l,i.injector,s,c),d=u.location.nativeElement,f=u.injector.get(ig,null);return f?.registerApplication(d),u.onDestroy(()=>{this.detachView(u.hostView),ug(this.components,u),f?.unregisterApplication(d)}),this._loadComponent(u),Fc(Sc.BootstrapComponentEnd,u),u})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Fc(Sc.ChangeDetectionStart),this.tracingSnapshot===null?this.tickImpl():this.tracingSnapshot.run(Od.CHANGE_DETECTION,this.tickImpl)}tickImpl=()=>{if(this._runningTick)throw Fc(Sc.ChangeDetectionEnd),new T(101,!1);let e=w(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,w(e),this.afterTick.next(),Fc(Sc.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get($p,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++ho(e))){this.dirtyFlags|=2;return}this.dirtyFlags&=-8}attachView(e){let t=e;this._views.push(t),t.attachToAppRef(this)}detachView(e){let t=e;ug(this._views,t),t.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView);try{this.tick()}catch(e){this.internalErrorHandler(e)}this.components.push(e),this._injector.get(ag,[]).forEach(t=>t(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>ug(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new T(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function lg(e){return e===void 0||typeof e==`string`||e instanceof Element?{hostElement:e}:e}function ug(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function N(e,t,n,r){let i=O();return om(i,Go(),t)&&(Mo(),Jf(ds(),i,e,t,n,r)),N}function dg(e){if(jd(`NgAnimateEnter`),!fd)return dg;let t=O();if(pd(t))return dg;let n=No(),r=t[9].get(Fs);return Dd(Cd(t),n,()=>fg(t,n,e,r)),Wd(t[9]),Gd(t[9],Cd(t)),dg}function fg(e,t,n,r){let i=ro(t,e),a=e[11],o=wd(n),s=[],c=!1,l=e=>{if(Td(e)!==i)return;let t=e instanceof AnimationEvent?`animationend`:`transitionend`;r.runOutsideAngular(()=>{a.listen(i,t,u)})},u=e=>{Td(e)===i&&(Ed(e,i)&&(c=!0),pg(e,i,a))};if(o&&o.length>0){r.runOutsideAngular(()=>{s.push(a.listen(i,`animationstart`,l)),s.push(a.listen(i,`transitionstart`,l))}),md(i,o,s);for(let e of o)a.addClass(i,e);r.runOutsideAngular(()=>{requestAnimationFrame(()=>{if(!c&&(sd(i,_d,fd),!_d.has(i))){for(let e of o)a.removeClass(i,e);hd(i)}})})}}function pg(e,t,n){let r=gd.get(t);if(Td(e)===t&&r&&Ed(e,t)){e.stopPropagation();for(let e of r.classList)n.removeClass(t,e);hd(t)}}var mg=class{destroy(e){}updateValue(e,t){}swap(e,t){let n=Math.min(e,t),r=Math.max(e,t),i=this.detach(r);if(r-n>1){let e=this.detach(n);this.attach(n,i),this.attach(r,e)}else this.attach(n,i)}move(e,t){this.attach(t,this.detach(e))}};function hg(e,t,n,r,i){return e===n&&Object.is(t,r)?1:Object.is(i(e,t),i(n,r))?-1:0}function gg(e,t,n,r){let i,a,o=0,s=e.length-1;if(Array.isArray(t)){w(r);let c=t.length-1;for(w(null);o<=s&&o<=c;){let r=e.at(o),l=t[o],u=hg(o,r,o,l,n);if(u!==0){u<0&&e.updateValue(o,l),o++;continue}let d=e.at(s),f=t[c],p=hg(s,d,c,f,n);if(p!==0){p<0&&e.updateValue(s,f),s--,c--;continue}let m=n(o,r),h=n(s,d),g=n(o,l);if(Object.is(g,h)){let t=n(c,f);Object.is(t,m)?(e.swap(o,s),e.updateValue(s,f),c--,s--):e.move(s,o),e.updateValue(o,l),o++;continue}if(i??=new bg,a??=yg(e,o,s,n),_g(e,i,o,g))e.updateValue(o,l),o++,s++;else if(a.has(g))i.set(m,e.detach(o)),s--;else{let n=e.create(o,t[o]);e.attach(o,n),o++,s++}}for(;o<=c;)vg(e,i,n,o,t[o]),o++}else if(t!=null){w(r);let c=t[Symbol.iterator]();w(null);let l=c.next();for(;!l.done&&o<=s;){let t=e.at(o),r=l.value,u=hg(o,t,o,r,n);if(u!==0)u<0&&e.updateValue(o,r),o++,l=c.next();else{i??=new bg,a??=yg(e,o,s,n);let u=n(o,r);if(_g(e,i,o,u))e.updateValue(o,r),o++,s++,l=c.next();else if(!a.has(u))e.attach(o,e.create(o,r)),o++,s++,l=c.next();else{let r=n(o,t);i.set(r,e.detach(o)),s--}}}for(;!l.done;)vg(e,i,n,e.length,l.value),l=c.next()}for(;o<=s;)e.destroy(e.detach(s--));i?.forEach(t=>{e.destroy(t)})}function _g(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function vg(e,t,n,r,i){if(_g(e,t,r,n(r,i)))e.updateValue(r,i);else{let t=e.create(r,i);e.attach(r,t)}}function yg(e,t,n,r){let i=new Set;for(let a=t;a<=n;a++)i.add(r(a,e.at(a)));return i}var bg=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let t=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(t)?(this.kvMap.set(e,this._vMap.get(t)),this._vMap.delete(t)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,t){if(this.kvMap.has(e)){let n=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let r=this._vMap;for(;r.has(n);)n=r.get(n);r.set(n,t)}else this.kvMap.set(e,t)}forEach(e){for(let[t,n]of this.kvMap)if(e(n,t),this._vMap!==void 0){let r=this._vMap;for(;r.has(n);)n=r.get(n),e(n,t)}}};function P(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=O(),l=Mo();return eg(c,l,e,t,n,r,i,uo(l.consts,a),256,o,s),xg}function xg(e,t,n,r,i,a,o,s){jd(`NgControlFlow`);let c=O(),l=Mo();return eg(c,l,e,t,n,r,i,uo(l.consts,a),512,o,s),xg}function F(e,t){jd(`NgControlFlow`);let n=O(),r=Go(),i=n[r]===Ju?-1:n[r],a=i===-1?void 0:Dg(n,27+i);if(om(n,r,e)){let r=w(null);try{if(a!==void 0&&Pp(a,0),e!==-1){let r=27+e,i=Dg(n,r),a=Mg(n[1],r),o=Zp(i,a,n);Np(i,ap(n,a,t,{dehydratedView:o}),0,op(a,o))}}finally{w(r)}}else if(a!==void 0){let e=Mp(a,0);e!==void 0&&(e[8]=t)}}var Sg=class{lContainer;$implicit;$index;constructor(e,t,n){this.lContainer=e,this.$implicit=t,this.$index=n}get $count(){return this.lContainer.length-10}};function Cg(e){return e}function wg(e,t){return t}var Tg=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,t,n){this.hasEmptyBlock=e,this.trackByFn=t,this.liveCollection=n}};function I(e,t,n,r,i,a,o,s,c,l,u,d,f){jd(`NgControlFlow`);let p=O(),m=Mo(),h=c!==void 0,g=O(),_=new Tg(h,s?o.bind(g[15][8]):o);g[27+e]=_,eg(p,m,e+1,t,n,r,i,uo(m.consts,a),256),h&&eg(p,m,e+2,c,l,u,d,uo(m.consts,f),512)}var Eg=class extends mg{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,t,n){super(),this.lContainer=e,this.hostLView=t,this.templateTNode=n}get length(){return this.lContainer.length-10}at(e){return this.getLView(e)[8].$implicit}attach(e,t){let n=t[6];this.needsIndexUpdate||=e!==this.length,Np(this.lContainer,t,e,op(this.templateTNode,n)),Og(this.lContainer,e)}detach(e){return this.needsIndexUpdate||=e!==this.length-1,kg(this.lContainer,e),Ag(this.lContainer,e)}create(e,t){let n=Xp(this.lContainer,this.templateTNode.tView.ssrId);return ap(this.hostLView,this.templateTNode,new Sg(this.lContainer,t,e),{dehydratedView:n})}destroy(e){of(e[1],e)}updateValue(e,t){this.getLView(e)[8].$implicit=t}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e0){let e=n[9];Hd(e,r),ld.delete(n[19]),r.detachedLeaveAnimationFns=void 0}}function kg(e,t){if(e.length<=10)return;let n=e[10+t],r=n?n[26]:void 0;r&&r.leave&&r.leave.size>0&&(r.detachedLeaveAnimationFns=[])}function Ag(e,t){return Fp(e,t)}function jg(e,t){return Mp(e,t)}function Mg(e,t){return io(e,t)}function R(e,t,n){let r=O();return om(r,Go(),t)&&(Mo(),Vf(ds(),r,e,t,r[11],n)),R}function Ng(e,t,n,r,i){ep(t,e,n,i?`class`:`style`,r)}function z(e,t,n,r){let i=O(),a=i[1],o=e+27,s=a.firstCreatePass?Fm(o,i,2,t,qf,Oo(),n,r):a.data[o];if(Ja(s)){let n=i[10].tracingService;if(n&&n.componentCreate){let o=a.data[s.directiveStart+s.componentOffset];return n.componentCreate(tm(o),()=>(Pg(e,t,i,s,r),z))}}return Pg(e,t,i,s,r),z}function Pg(e,t,n,r,i){if(Zf(r,n,e,t,Ig),Ya(r)){let e=n[1];Lf(e,n,r),ou(e,r,n)}i!=null&&Rf(n,r)}function B(){let e=Mo(),t=Qf(No());return e.firstCreatePass&&Im(e,t),Ao(t)&&jo(),Do(),t.classesWithoutHost!=null&&Kc(t)&&Ng(e,t,O(),t.classesWithoutHost,!0),t.stylesWithoutHost!=null&&qc(t)&&Ng(e,t,O(),t.stylesWithoutHost,!1),B}function V(e,t,n,r){return z(e,t,n,r),B(),V}function H(e,t,n,r){let i=O(),a=i[1],o=e+27,s=a.firstCreatePass?Lm(o,a,2,t,n,r):a.data[o];return Zf(s,i,e,t,Ig),r!=null&&Rf(i,s),H}function U(){return Ao(Qf(No()))&&jo(),Do(),U}function Fg(e,t,n,r){return H(e,t,n,r),U(),Fg}var Ig=(e,t,n,r,i)=>(vs(!0),xu(t[11],r,hs()));function Lg(e,t,n){let r=O(),i=r[1],a=e+27,o=i.firstCreatePass?Fm(a,r,8,`ng-container`,qf,Oo(),t,n):i.data[a];if(Zf(o,r,e,`ng-container`,Bg),Ya(o)){let e=r[1];Lf(e,r,o),ou(e,o,r)}return n!=null&&Rf(r,o),Lg}function Rg(){let e=Mo(),t=Qf(No());return e.firstCreatePass&&Im(e,t),Rg}function zg(e,t,n){return Lg(e,t,n),Rg(),zg}var Bg=(e,t,n,r,i)=>(vs(!0),bu(t[11],``));function W(){return O()}function Vg(e,t,n){let r=O();return om(r,Go(),t)&&(Mo(),Hf(ds(),r,e,t,r[11],n)),Vg}var Hg=void 0;function Ug(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,``).length;return t===1&&n===0?1:5}var Wg=[`en`,[[`a`,`p`],[`AM`,`PM`]],[[`AM`,`PM`]],[[`S`,`M`,`T`,`W`,`T`,`F`,`S`],[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`]],Hg,[[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],Hg,[[`B`,`A`],[`BC`,`AD`],[`Before Christ`,`Anno Domini`]],0,[6,0],[`M/d/yy`,`MMM d, y`,`MMMM d, y`,`EEEE, MMMM d, y`],[`h:mm a`,`h:mm:ss a`,`h:mm:ss a z`,`h:mm:ss a zzzz`],[`{1}, {0}`,Hg,Hg,Hg],[`.`,`,`,`;`,`%`,`+`,`-`,`E`,`×`,`‰`,`∞`,`NaN`,`:`],[`#,##0.###`,`#,##0%`,`¤#,##0.00`,`#E0`],`USD`,`$`,`US Dollar`,{},`ltr`,Ug],Gg=Object.create(null);function Kg(e){let t=Yg(e),n=qg(t);if(n)return n;let r=t.split(`-`)[0];if(n=qg(r),n)return n;if(r===`en`)return Wg;throw new T(701,!1)}function qg(e){if(!(e in Gg)){let t=Hi.ng&&Hi.ng.common&&Hi.ng.common.locales&&Hi.ng.common.locales[e];return t!==void 0&&(Gg[e]=t),t}return Gg[e]}var Jg={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencyCode:15,CurrencySymbol:16,CurrencyName:17,Currencies:18,Directionality:19,PluralCase:20,ExtraData:21};function Yg(e){return e.toLowerCase().replace(/_/g,`-`)}var Xg=`en-US`;function Zg(e){typeof e==`string`&&e.toLowerCase().replace(/_/g,`-`)}function G(e,t,n){let r=O(),i=Mo(),a=No();return $g(i,r,r[11],a,e,t,n),G}function Qg(e,t,n){let r=O(),i=Mo(),a=No();return(a.type&3||n)&&fm(a,i,r,n,r[11],e,t,um(a,r,t)),Qg}function $g(e,t,n,r,i,a,o){let s=!0,c=null;if((r.type&3||o)&&(c??=um(r,t,a),fm(r,e,t,o,n,i,a,c)&&(s=!1)),s){let e=r.outputs?.[i],n=r.hostDirectiveOutputs?.[i];if(n&&n.length)for(let e=0;e>17&32767}function a_(e){return(e&2)==2}function o_(e,t){return e&131071|t<<17}function s_(e){return e|2}function c_(e){return(e&131068)>>2}function l_(e,t){return e&-131069|t<<2}function u_(e){return(e&1)==1}function d_(e){return e|1}function f_(e,t,n,r,i,a){let o=a?t.classBindings:t.styleBindings,s=i_(o),c=c_(o);e[r]=n;let l=!1,u;if(Array.isArray(n)){let e=n;u=e[1],(u===null||sa(e,u)>0)&&(l=!0)}else u=n;if(i){if(c!==0){let t=i_(e[s+1]);e[r+1]=r_(t,s),t!==0&&(e[t+1]=l_(e[t+1],r)),e[s+1]=o_(e[s+1],r)}else e[r+1]=r_(s,0),s!==0&&(e[s+1]=l_(e[s+1],r)),s=r}else e[r+1]=r_(c,0),s===0?s=r:e[c+1]=l_(e[c+1],r),c=r;l&&(e[r+1]=s_(e[r+1])),m_(e,u,r,!0),m_(e,u,r,!1),p_(t,u,e,r,a),o=r_(s,c),a?t.classBindings=o:t.styleBindings=o}function p_(e,t,n,r,i){let a=i?e.residualClasses:e.residualStyles;a!=null&&typeof t==`string`&&sa(a,t)>=0&&(n[r+1]=d_(n[r+1]))}function m_(e,t,n,r){let i=e[n+1],a=t===null,o=r?i_(i):c_(i),s=!1;for(;o!==0&&(s===!1||a);){let n=e[o],i=e[o+1];h_(n,t)&&(s=!0,e[o+1]=r?d_(i):s_(i)),o=r?i_(i):c_(i)}s&&(e[n+1]=r?s_(i):d_(i))}function h_(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==`string`?sa(e,t)>=0:!1}var g_={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function __(e){return e.substring(g_.key,g_.keyEnd)}function v_(e){return b_(e),y_(e,x_(e,0,g_.textEnd))}function y_(e,t){let n=g_.textEnd;return n===t?-1:(t=g_.keyEnd=S_(e,g_.key=t,n),x_(e,t,n))}function b_(e){g_.key=0,g_.keyEnd=0,g_.value=0,g_.valueEnd=0,g_.textEnd=e.length}function x_(e,t,n){for(;t32;)t++;return t}function C_(e,t,n){return E_(e,t,n,!1),C_}function q(e,t){return E_(e,t,null,!0),q}function w_(e){D_(L_,T_,e,!0)}function T_(e,t){for(let n=v_(t);n>=0;n=y_(t,n))aa(e,__(t),!0)}function E_(e,t,n,r){let i=O(),a=Mo(),o=Ko(2);if(a.firstUpdatePass&&k_(a,e,o,r),t!==Ju&&om(i,o,t)){let s=a.data[ls()];z_(a,s,i,i[11],e,i[o+1]=H_(t,n),r,o)}}function D_(e,t,n,r){let i=Mo(),a=Ko(2);i.firstUpdatePass&&k_(i,null,a,r);let o=O();if(n!==Ju&&om(o,a,n)){let s=i.data[ls()];if(U_(s,r)&&!O_(i,a)){let e=r?s.classesWithoutHost:s.stylesWithoutHost;e!==null&&(n=oi(e,n||``)),Ng(i,s,o,n,r)}else R_(i,s,o,o[11],o[a+1],o[a+1]=I_(e,t,n),r,a)}}function O_(e,t){return t>=e.expandoStartIndex}function k_(e,t,n,r){let i=e.data;if(i[n+1]===null){let a=i[ls()],o=O_(e,n);U_(a,r)&&t===null&&!o&&(t=!1),t=A_(i,a,t,r),f_(i,a,t,n,o,r)}}function A_(e,t,n,r){let i=Zo(e),a=r?t.residualClasses:t.residualStyles;if(i===null)(r?t.classBindings:t.styleBindings)===0&&(n=P_(null,e,t,n,r),n=F_(n,t.attrs,r),a=null);else{let o=t.directiveStylingLast;if(o===-1||e[o]!==i){if(n=P_(i,e,t,n,r),a===null){let n=j_(e,t,r);n!==void 0&&Array.isArray(n)&&(n=P_(null,e,t,n[1],r),n=F_(n,t.attrs,r),M_(e,t,r,n))}else a=N_(e,t,r)}}return a!==void 0&&(r?t.residualClasses=a:t.residualStyles=a),n}function j_(e,t,n){let r=n?t.classBindings:t.styleBindings;if(c_(r)!==0)return e[i_(r)]}function M_(e,t,n,r){let i=n?t.classBindings:t.styleBindings;e[i_(i)]=r}function N_(e,t,n){let r,i=t.directiveEnd;for(let a=1+t.directiveStylingLast;a0;){let t=e[i],a=Array.isArray(t),c=a?t[1]:t,l=c===null,u=n[i+1];u===Ju&&(u=l?ua:void 0);let d=l?oa(u,r):c===r?u:void 0;if(a&&!V_(d)&&(d=oa(t,r)),V_(d)&&(s=d,o))return s;let f=e[i+1];i=o?i_(f):c_(f)}if(t!==null){let e=a?t.residualClasses:t.residualStyles;e!=null&&(s=oa(e,r))}return s}function V_(e){return e!==void 0}function H_(e,t){return e==null||e===``||(typeof t==`string`?e=lu(e)+t:typeof e==`object`&&(e=ai(lu(e)))),e}function U_(e,t){return!!(e.flags&(t?8:16))}function J(e,t=``){let n=O(),r=Mo(),i=e+27,a=r.firstCreatePass?Hp(r,i,1,t,null):r.data[i],o=W_(r,n,a,t);n[i]=o,_s()&&hf(r,n,o,a),Io(a,!1)}var W_=(e,t,n,r)=>(vs(!0),vu(t[11],r));function G_(e,t,n,r=``){return om(e,Go(),n)?t+Ai(n)+r:Ju}function K_(e,t,n,r,i,a=``){let o=sm(e,Uo(),n,i);return Ko(2),o?t+Ai(n)+r+Ai(i)+a:Ju}function q_(e,t,n,r,i,a,o,s=``){let c=cm(e,Uo(),n,i,o);return Ko(3),c?t+Ai(n)+r+Ai(i)+a+Ai(o)+s:Ju}function J_(e,t,n,r,i,a,o,s,c,l=``){let u=lm(e,Uo(),n,i,o,c);return Ko(4),u?t+Ai(n)+r+Ai(i)+a+Ai(o)+s+Ai(c)+l:Ju}function Y(e){return X(``,e),Y}function X(e,t,n){let r=O(),i=G_(r,e,t,n);return i!==Ju&&Z_(r,ls(),i),X}function Z(e,t,n,r,i){let a=O(),o=K_(a,e,t,n,r,i);return o!==Ju&&Z_(a,ls(),o),Z}function Y_(e,t,n,r,i,a,o){let s=O(),c=q_(s,e,t,n,r,i,a,o);return c!==Ju&&Z_(s,ls(),c),Y_}function X_(e,t,n,r,i,a,o,s,c){let l=O(),u=J_(l,e,t,n,r,i,a,o,s,c);return u!==Ju&&Z_(l,ls(),u),X_}function Z_(e,t,n){let r=no(t,e);yu(e[11],r,n)}function Q_(e,t,n){vc(t)&&(t=t());let r=O();return om(r,Go(),t)&&(Mo(),Vf(ds(),r,e,t,r[11],n)),Q_}function $_(e,t){let n=vc(e);return n&&e.set(t),n}function ev(e,t){let n=O(),r=Mo(),i=No();return $g(r,n,n[11],i,e,t),ev}var tv={};function nv(e){jd(`NgLet`);let t=Mo(),n=O(),r=e+27;return Io(Hp(t,r,128,null,null),!1),oo(t,n,r,tv),nv}function rv(e){return oo(Mo(),O(),ls(),e),e}function iv(e){let t=ao(zo(),27+e);if(t===tv)throw new T(314,!1);return t}function av(e,t,n=``){return G_(O(),e,t,n)}function ov(e,t){let n=Ho()+e,r=O();return r[n]===Ju?im(r,n,t()):am(r,n)}function sv(e,t,n){return lv(O(),Ho(),e,t,n)}function cv(e,t){let n=e[t];return n===Ju?void 0:n}function lv(e,t,n,r,i,a){let o=t+n;return om(e,o,i)?im(e,o+1,a?r.call(a,i):r(i)):cv(e,o+1)}function uv(e,t,n,r,i,a,o){let s=t+n;return sm(e,s,i,a)?im(e,s+2,o?r.call(o,i,a):r(i,a)):cv(e,s+2)}function dv(e,t){let n=Mo(),r,i=e+27;n.firstCreatePass?(r=fv(t,n.pipeRegistry),n.data[i]=r,r.onDestroy&&(n.destroyHooks??=[]).push(i,r.onDestroy)):r=n.data[i];let a=r.factory||(r.factory=Qi(r.type,!0)),o=Bi(bm);try{let e=il(!1),t=a();return il(e),oo(n,O(),i,t),t}finally{Bi(o)}}function fv(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function pv(e,t,n){let r=e+27,i=O(),a=ao(i,r);return hv(i,r)?lv(i,Ho(),t,a.transform,n,a):a.transform(n)}function mv(e,t,n,r){let i=e+27,a=O(),o=ao(a,i);return hv(a,i)?uv(a,Ho(),t,o.transform,n,r,o):o.transform(n,r)}function hv(e,t){return e[1].data[t].pure}function gv(e,t){return Vp(e,t)}var _v=(()=>{class e{applicationErrorHandler=E(Js);appRef=E(cg);taskService=E(Ds);ngZone=E(Fs);zonelessEnabled=E(ac);tracing=E(kd,{optional:!0});zoneIsDefined=typeof Zone<`u`&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new hr;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ns):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(E(oc,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let e=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(e);return}this.switchToMicrotaskScheduler(),this.taskService.remove(e)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let e=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})})}notify(e){if(!this.zonelessEnabled&&e===5)return;switch(e){case 0:case 2:this.appRef.dirtyFlags|=2;break;case 3:case 4:case 5:case 1:this.appRef.dirtyFlags|=4;break;case 6:this.appRef.dirtyFlags|=2;break;case 12:this.appRef.dirtyFlags|=16;break;case 13:this.appRef.dirtyFlags|=2;break;case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let t=this.useMicrotaskScheduler?js:As;this.pendingRenderTaskId=this.taskService.add(),this.cancelScheduledCallback=this.scheduleInRootZone?Zone.root.run(()=>t(()=>this.tick())):this.ngZone.runOutsideAngular(()=>t(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(`isAngularZone_ID`+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(e){this.applicationErrorHandler(e)}finally{this.taskService.remove(e),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static ɵfac=function(t){return new(t||e)};static ɵprov=kl({token:e,factory:e.ɵfac})}return e})();function vv(){return[{provide:ic,useExisting:_v},{provide:Fs,useClass:Us},{provide:ac,useValue:!0}]}function yv(){return typeof $localize<`u`&&$localize.locale||`en-US`}var bv=new vi(``,{factory:()=>E(bv,{optional:!0,skipSelf:!0})||yv()}),xv=class{destroyed=!1;listeners=null;errorHandler=E(qs,{optional:!0});isEmitting=!1;hasNullListeners=!1;destroyRef=E(Cs);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(e){if(this.destroyed)throw new T(953,!1);return(this.listeners??=[]).push(e),{unsubscribe:()=>{let t=this.listeners?this.listeners.indexOf(e):-1;t>-1&&(this.isEmitting?(this.hasNullListeners=!0,this.listeners[t]=null):this.listeners.splice(t,1))}}}emit(e){if(this.destroyed){console.warn(ri(953,!1));return}if(this.listeners===null)return;this.isEmitting=!0;let t=w(null);try{for(let t of this.listeners)try{t!==null&&t(e)}catch(e){this.errorHandler?.handleError(e)}}finally{this.hasNullListeners&&(this.hasNullListeners=!1,this.listeners&&Sv(this.listeners)),w(t),this.isEmitting=!1}}};function Sv(e){let t=e.length-1;for(;t>-1;)e[t]===null&&e.splice(t,1),t--}function Q(e,t){return Mn(e,t?.equal)}function Cv(e){return ar(e)}(class e extends Error{_brand;constructor(e){super(e)}static IDLE=new e(`IDLE`);static LOADING=new e(`LOADING`)});var wv=e=>e;function Tv(e,t){return typeof e==`function`?Ev(tr(e,wv,t?.equal),t?.debugName,t?.set):Ev(tr(e.source,e.computation,e.equal),e.debugName,e.set)}function Ev(e,t,n){let r=e[dn],i=e;if(n!==void 0){let t=e=>nr(r,e);i.set=e=>n(e,t),i.update=r=>n(r(Cv(e)),t)}else i.set=e=>nr(r,e),i.update=e=>rr(r,e);return i.asReadonly=Xs.bind(e),i}function Dv(e,t){let n=Object.create(bc);n.value=e,n.transformFn=t?.transform;function r(){if(mn(n),n.value===yc)throw new T(-950,null);return n.value}return r[dn]=n,r}function Ov(e){return new xv}function kv(e,t){return Dv(e,t)}function Av(e){return Dv(yc,e)}var $=(kv.required=Av,kv);function jv(e,t){let n=Object.create(bc),r=new xv;n.value=e;function i(){return mn(n),Mv(n.value),n.value}return i[dn]=n,i.asReadonly=Xs.bind(i),i.set=e=>{n.equal(n.value,e)||(Wn(n,e),r.emit(e))},i.update=e=>{Mv(n.value),i.set(e(n.value))},i.subscribe=r.subscribe.bind(r),i.destroyRef=r.destroyRef,i}function Mv(e){if(e===yc)throw new T(952,!1)}function Nv(e,t){return jv(e,t)}function Pv(e){return jv(yc,e)}var Fv=(Nv.required=Pv,Nv);function Iv(e,t){return Ah(t)}function Lv(e,t){return jh(t)}var Rv=(Iv.required=Lv,Iv),zv=new vi(``),Bv=new vi(``);function Vv(e){return!e.moduleRef}function Hv(e){let t=Vv(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Fs);return n.run(()=>{Vv(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Js),i;if(n.runOutsideAngular(()=>{i=n.onError.subscribe({next:r})}),Vv(e)){let n=()=>t.destroy(),r=e.platformInjector.get(zv);r.add(n),t.onDestroy(()=>{i.unsubscribe(),r.delete(n)})}else{let t=()=>e.moduleRef.destroy(),n=e.platformInjector.get(zv);n.add(t),e.moduleRef.onDestroy(()=>{ug(e.allPlatformModules,e.moduleRef),i.unsubscribe(),n.delete(t)})}return Wv(r,n,()=>{let n=t.get(Ds),r=n.add(),i=t.get(Zh);return i.runInitializers(),i.donePromise.then(()=>{if(Zg(t.get(bv,Xg)||`en-US`),!t.get(Bv,!0))return Vv(e)?t.get(cg):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Vv(e)){let n=t.get(cg);return e.rootComponent!==void 0&&n.bootstrap(e.rootComponent),n}return Uv?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>void n.remove(r))})})}var Uv;function Wv(e,t,n){try{let r=n();return Ph(r)?r.catch(n=>{throw t.runOutsideAngular(()=>e(n)),n}):r}catch(n){throw t.runOutsideAngular(()=>e(n)),n}}var Gv=null;function Kv(e=[],t){return xs.create({name:t,providers:[{provide:Ta,useValue:`platform`},{provide:zv,useValue:new Set([()=>Gv=null])},...e]})}function qv(e=[]){if(Gv)return Gv;let t=Kv(e);return Gv=t,og(),Jv(t),t}function Jv(e){let t=e.get($s,null);Ha(e,()=>{t?.forEach(e=>e())})}function Yv(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:i}=e;Fc(Sc.BootstrapApplicationStart);try{let e=i?.injector??qv(r);return Hv({r3Injector:new Lh({providers:[vv(),Ys,...n||[]],parent:e,debugName:``,runEnvironmentInitializers:!1}).injector,platformInjector:e,rootComponent:t})}catch(e){return Promise.reject(e)}finally{Fc(Sc.BootstrapApplicationEnd)}}var Xv=Symbol(`NOT_SET`),Zv=new Set,Qv={...Kn,kind:`afterRenderEffectPhase`,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Xv,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(mn(r),r.value),r.signal[dn]=r,r.registerCleanupFn=e=>(r.cleanup??=new Set).add(e),this.nodes[e]=r,this.hooks[e]=e=>r.phaseFn(e)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();super.destroy();for(let e of this.nodes)if(e)try{for(let t of e.cleanup??Zv)t()}finally{En(e)}}};function ey(e,t){let n=t?.injector??E(xs),r=n.get(ic),i=n.get(Md),a=n.get(kd,null,{optional:!0});i.impl??=n.get(Pd);let o=e;typeof o==`function`&&(o={mixedReadWrite:e});let s=n.get(nc,null,{optional:!0}),c=new $v(i.impl,[o.earlyRead,o.write,o.mixedReadWrite,o.read],s?.view,r,n,a?.snapshot(null));return i.impl.register(c),c}var ty=null;function ny(){return ty}function ry(e){ty??=e}var iy=class{},ay=(function(e){return e[e.Format=0]=`Format`,e[e.Standalone=1]=`Standalone`,e})(ay||{}),oy=(function(e){return e[e.Narrow=0]=`Narrow`,e[e.Abbreviated=1]=`Abbreviated`,e[e.Wide=2]=`Wide`,e[e.Short=3]=`Short`,e})(oy||{}),sy=(function(e){return e[e.Short=0]=`Short`,e[e.Medium=1]=`Medium`,e[e.Long=2]=`Long`,e[e.Full=3]=`Full`,e})(sy||{}),cy={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};function ly(e){return Kg(e)[Jg.LocaleId]}function uy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.DayPeriodsFormat],r[Jg.DayPeriodsStandalone]],t),n)}function dy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.DaysFormat],r[Jg.DaysStandalone]],t),n)}function fy(e,t,n){let r=Kg(e);return xy(xy([r[Jg.MonthsFormat],r[Jg.MonthsStandalone]],t),n)}function py(e,t){let n=Kg(e)[Jg.Eras];return xy(n,t)}function my(e,t){return xy(Kg(e)[Jg.DateFormat],t)}function hy(e,t){return xy(Kg(e)[Jg.TimeFormat],t)}function gy(e,t){let n=Kg(e)[Jg.DateTimeFormat];return xy(n,t)}function _y(e,t){let n=Kg(e),r=n[Jg.NumberSymbols][t];if(r===void 0){if(t===cy.CurrencyDecimal)return n[Jg.NumberSymbols][cy.Decimal];if(t===cy.CurrencyGroup)return n[Jg.NumberSymbols][cy.Group]}return r}function vy(e){if(!e[Jg.ExtraData])throw new T(2303,!1)}function yy(e){let t=Kg(e);return vy(t),(t[Jg.ExtraData][2]||[]).map(e=>typeof e==`string`?Sy(e):[Sy(e[0]),Sy(e[1])])}function by(e,t,n){let r=Kg(e);return vy(r),xy(xy([r[Jg.ExtraData][0],r[Jg.ExtraData][1]],t)||[],n)||[]}function xy(e,t){for(let n=t;n>-1;n--)if(e[n]!==void 0)return e[n];throw new T(2304,!1)}function Sy(e){let[t,n]=e.split(`:`);return{hours:+t,minutes:+n}}var Cy=/^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,wy=Object.create(null),Ty=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,Ey=256;function Dy(e,t,n,r){let i=Xy(e);Oy(t),t=Ay(n,t)||t;let a=[],o;for(;t;)if(o=Ty.exec(t),o){a=a.concat(o.slice(1));let e=a.pop();if(!e)break;t=e}else{a.push(t);break}let s=i.getTimezoneOffset();r&&(s=qy(r,s),i=Yy(i,r));let c=``;return a.forEach(e=>{let t=Ky(e);c+=t?t(i,n,s):e===`''`?`'`:e.replace(/(^'|'$)/g,``).replace(/''/g,`'`)}),c}function Oy(e){if(e.length>Ey)throw new T(2300,!1)}function ky(e,t,n){let r=new Date(0);return r.setFullYear(e,t,n),r.setHours(0,0,0),r}function Ay(e,t){let n=ly(e);if(wy[n]??=Object.create(null),wy[n][t])return wy[n][t];let r=``;switch(t){case`shortDate`:r=my(e,sy.Short);break;case`mediumDate`:r=my(e,sy.Medium);break;case`longDate`:r=my(e,sy.Long);break;case`fullDate`:r=my(e,sy.Full);break;case`shortTime`:r=hy(e,sy.Short);break;case`mediumTime`:r=hy(e,sy.Medium);break;case`longTime`:r=hy(e,sy.Long);break;case`fullTime`:r=hy(e,sy.Full);break;case`short`:let t=Ay(e,`shortTime`),n=Ay(e,`shortDate`);r=jy(gy(e,sy.Short),[t,n]);break;case`medium`:let i=Ay(e,`mediumTime`),a=Ay(e,`mediumDate`);r=jy(gy(e,sy.Medium),[i,a]);break;case`long`:let o=Ay(e,`longTime`),s=Ay(e,`longDate`);r=jy(gy(e,sy.Long),[o,s]);break;case`full`:let c=Ay(e,`fullTime`),l=Ay(e,`fullDate`);r=jy(gy(e,sy.Full),[c,l])}return r&&(wy[n][t]=r),r}function jy(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return Object.hasOwn(t,n)?t[n]:e})),e}function My(e,t,n=`-`,r,i){let a=``;(e<0||i&&e<=0)&&(i?e=-e+1:(e=-e,a=n));let o=String(e);for(;o.length0||s>-n)&&(s+=n),e===3)s===0&&n===-12&&(s=12);else if(e===6)return Ny(s,t);let c=_y(o,cy.MinusSign);return My(s,t,c,r,i)}}function Fy(e,t){switch(e){case 0:return t.getFullYear();case 1:return t.getMonth();case 2:return t.getDate();case 3:return t.getHours();case 4:return t.getMinutes();case 5:return t.getSeconds();case 6:return t.getMilliseconds();case 7:return t.getDay();default:throw new T(2301,!1)}}function Iy(e,t,n=ay.Format,r=!1){return function(i,a){return Ly(i,a,e,t,n,r)}}function Ly(e,t,n,r,i,a){switch(n){case 2:return fy(t,i,r)[e.getMonth()];case 1:return dy(t,i,r)[e.getDay()];case 0:let n=e.getHours(),o=e.getMinutes();if(a){let e=yy(t),a=by(t,i,r),s=e.findIndex(e=>{if(Array.isArray(e)){let[t,r]=e,i=n>=t.hours&&o>=t.minutes,a=n0?Math.floor(i/60):Math.ceil(i/60);switch(e){case 0:return(i>=0?`+`:``)+My(o,2,a)+My(Math.abs(i%60),2,a);case 1:return`GMT`+(i>=0?`+`:``)+My(o,1,a);case 2:return`GMT`+(i>=0?`+`:``)+My(o,2,a)+`:`+My(Math.abs(i%60),2,a);case 3:return r===0?`Z`:(i>=0?`+`:``)+My(o,2,a)+`:`+My(Math.abs(i%60),2,a);default:throw new T(2310,!1)}}}var zy=0,By=4;function Vy(e){let t=ky(e,zy,1).getDay();return ky(e,0,1+(t<=By?By:11)-t)}function Hy(e){let t=e.getDay(),n=t===0?-3:By-t;return ky(e.getFullYear(),e.getMonth(),e.getDate()+n)}function Uy(e,t=!1){return function(n,r){let i;if(t){let e=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,t=n.getDate();i=1+Math.floor((t+e)/7)}else{let e=Hy(n),t=Vy(e.getFullYear()),r=e.getTime()-t.getTime();i=1+Math.round(r/6048e5)}return My(i,e,_y(r,cy.MinusSign))}}function Wy(e,t=!1){return function(n,r){return My(Hy(n).getFullYear(),e,_y(r,cy.MinusSign),t)}}var Gy=Object.create(null);function Ky(e){if(Gy[e])return Gy[e];let t;switch(e){case`G`:case`GG`:case`GGG`:t=Iy(3,oy.Abbreviated);break;case`GGGG`:t=Iy(3,oy.Wide);break;case`GGGGG`:t=Iy(3,oy.Narrow);break;case`y`:t=Py(0,1,0,!1,!0);break;case`yy`:t=Py(0,2,0,!0,!0);break;case`yyy`:t=Py(0,3,0,!1,!0);break;case`yyyy`:t=Py(0,4,0,!1,!0);break;case`Y`:t=Wy(1);break;case`YY`:t=Wy(2,!0);break;case`YYY`:t=Wy(3);break;case`YYYY`:t=Wy(4);break;case`M`:case`L`:t=Py(1,1,1);break;case`MM`:case`LL`:t=Py(1,2,1);break;case`MMM`:t=Iy(2,oy.Abbreviated);break;case`MMMM`:t=Iy(2,oy.Wide);break;case`MMMMM`:t=Iy(2,oy.Narrow);break;case`LLL`:t=Iy(2,oy.Abbreviated,ay.Standalone);break;case`LLLL`:t=Iy(2,oy.Wide,ay.Standalone);break;case`LLLLL`:t=Iy(2,oy.Narrow,ay.Standalone);break;case`w`:t=Uy(1);break;case`ww`:t=Uy(2);break;case`W`:t=Uy(1,!0);break;case`d`:t=Py(2,1);break;case`dd`:t=Py(2,2);break;case`c`:case`cc`:t=Py(7,1);break;case`ccc`:t=Iy(1,oy.Abbreviated,ay.Standalone);break;case`cccc`:t=Iy(1,oy.Wide,ay.Standalone);break;case`ccccc`:t=Iy(1,oy.Narrow,ay.Standalone);break;case`cccccc`:t=Iy(1,oy.Short,ay.Standalone);break;case`E`:case`EE`:case`EEE`:t=Iy(1,oy.Abbreviated);break;case`EEEE`:t=Iy(1,oy.Wide);break;case`EEEEE`:t=Iy(1,oy.Narrow);break;case`EEEEEE`:t=Iy(1,oy.Short);break;case`a`:case`aa`:case`aaa`:t=Iy(0,oy.Abbreviated);break;case`aaaa`:t=Iy(0,oy.Wide);break;case`aaaaa`:t=Iy(0,oy.Narrow);break;case`b`:case`bb`:case`bbb`:t=Iy(0,oy.Abbreviated,ay.Standalone,!0);break;case`bbbb`:t=Iy(0,oy.Wide,ay.Standalone,!0);break;case`bbbbb`:t=Iy(0,oy.Narrow,ay.Standalone,!0);break;case`B`:case`BB`:case`BBB`:t=Iy(0,oy.Abbreviated,ay.Format,!0);break;case`BBBB`:t=Iy(0,oy.Wide,ay.Format,!0);break;case`BBBBB`:t=Iy(0,oy.Narrow,ay.Format,!0);break;case`h`:t=Py(3,1,-12);break;case`hh`:t=Py(3,2,-12);break;case`H`:t=Py(3,1);break;case`HH`:t=Py(3,2);break;case`m`:t=Py(4,1);break;case`mm`:t=Py(4,2);break;case`s`:t=Py(5,1);break;case`ss`:t=Py(5,2);break;case`S`:t=Py(6,1);break;case`SS`:t=Py(6,2);break;case`SSS`:t=Py(6,3);break;case`Z`:case`ZZ`:case`ZZZ`:t=Ry(0);break;case`ZZZZZ`:t=Ry(3);break;case`O`:case`OO`:case`OOO`:case`z`:case`zz`:case`zzz`:t=Ry(1);break;case`OOOO`:case`ZZZZ`:case`zzzz`:t=Ry(2);break;default:return null}return Gy[e]=t,t}function qy(e,t){e=e.replace(/:/g,``);let n=Date.parse(`Jan 01, 1970 00:00:00 `+e)/6e4;return isNaN(n)?t:n}function Jy(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function Yy(e,t,n){let r=e.getTimezoneOffset();return Jy(e,-1*(qy(t,r)-r))}function Xy(e){if(Qy(e))return e;if(typeof e==`number`&&!isNaN(e))return new Date(e);if(typeof e==`string`){if(e=e.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(e)){let[t,n=1,r=1]=e.split(`-`).map(e=>+e);return ky(t,n-1,r)}let t=parseFloat(e);if(!isNaN(e-t))return new Date(t);let n;if(n=e.match(Cy))return Zy(n)}let t=new Date(e);if(!Qy(t))throw new T(2311,!1);return t}function Zy(e){let t=new Date(0),n=0,r=0,i=e[8]?t.setUTCFullYear:t.setFullYear,a=e[8]?t.setUTCHours:t.setHours;e[9]&&(n=Number(e[9]+e[10]),r=Number(e[9]+e[11])),i.call(t,Number(e[1]),Number(e[2])-1,Number(e[3]));let o=Number(e[4]||0)-n,s=Number(e[5]||0)-r,c=Number(e[6]||0),l=Math.floor(parseFloat(`0.`+(e[7]||0))*1e3);return a.call(t,o,s,c,l),t}function Qy(e){return e instanceof Date&&!isNaN(e.valueOf())}var $y=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=E(xs);constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let e=this._viewContainerRef;if(this._viewRef&&e.remove(e.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let t=this._createContextForwardProxy();this._viewRef=e.createEmbeddedView(this.ngTemplateOutlet,t,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===`outlet`?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,t,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,t,n):!1,get:(e,t,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,t,n)}})}static ɵfac=function(t){return new(t||e)(bm(eh))};static ɵdir=Wh({type:e,selectors:[[``,`ngTemplateOutlet`,``]],inputs:{ngTemplateOutletContext:`ngTemplateOutletContext`,ngTemplateOutlet:`ngTemplateOutlet`,ngTemplateOutletInjector:`ngTemplateOutletInjector`},features:[Ec]})}return e})();function eb(e,t){return new T(2100,!1)}var tb=`mediumDate`,nb=new vi(``),rb=new vi(``),ib=(()=>{class e{locale;defaultTimezone;defaultOptions;constructor(e,t,n){this.locale=e,this.defaultTimezone=t,this.defaultOptions=n}transform(t,n,r,i){if(t==null||t===``||t!==t)return null;try{let e=n??this.defaultOptions?.dateFormat??tb,a=r??this.defaultOptions?.timezone??this.defaultTimezone??void 0;return Dy(t,e,i||this.locale,a)}catch(t){throw eb(e,t.message)}}static ɵfac=function(t){return new(t||e)(bm(bv,16),bm(nb,24),bm(rb,24))};static ɵpipe=Gh({name:`date`,type:e,pure:!0})}return e})(),ab=(()=>{class e{transform(e){return JSON.stringify(e,null,2)}static ɵfac=function(t){return new(t||e)};static ɵpipe=Gh({name:`json`,type:e,pure:!1})}return e})();function ob(e,t){t=encodeURIComponent(t);for(let n of e.split(`;`)){let e=n.indexOf(`=`),[r,i]=e==-1?[n,``]:[n.slice(0,e),n.slice(e+1)];if(r.trim()!==t)continue;let a=i;try{a=decodeURIComponent(i)}catch{}return a.length>1&&a[0]===`"`&&a[a.length-1]===`"`&&(a=a.slice(1,-1)),a}return null}var sb=`browser`,cb=class{_doc;constructor(e){this._doc=e}manager},lb=(()=>{class e extends cb{constructor(e){super(e)}supports(e){return!0}addEventListener(e,t,n,r){return e.addEventListener(t,n,r),()=>this.removeEventListener(e,t,n,r)}removeEventListener(e,t,n,r){return e.removeEventListener(t,n,r)}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),ub=new vi(``),db=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(e,t){this._zone=t,e.forEach(e=>{e.manager=this});let n=e.filter(e=>!(e instanceof lb));this._plugins=n.slice().reverse();let r=e.find(e=>e instanceof lb);r&&this._plugins.push(r)}addEventListener(e,t,n,r){return this._findPluginFor(t).addEventListener(e,t,n,r)}getZone(){return this._zone}_findPluginFor(e){let t=this._eventNameToPlugin.get(e);if(t)return t;if(t=this._plugins.find(t=>t.supports(e)),!t)throw new T(-5101,!1);return this._eventNameToPlugin.set(e,t),t}static ɵfac=function(t){return new(t||e)(qi(ub),qi(Fs))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),fb=`ng-app-id`;function pb(e){for(let t of e)t.remove()}function mb(e,t){let n=t.createElement(`style`);return n.textContent=e,n}function hb(e,t,n,r){let i=e.head?.querySelectorAll(`style[${fb}="${t}"],link[${fb}="${t}"]`);if(!i||i.length===0)return!1;for(let e of i)e.removeAttribute(fb),e instanceof HTMLLinkElement?r.set(e.href.slice(e.href.lastIndexOf(`/`)+1),{usage:0,elements:[e]}):e.textContent&&n.set(e.textContent,{usage:0,elements:[e]});return!0}function gb(e,t){let n=t.createElement(`link`);return n.setAttribute(`rel`,`stylesheet`),n.setAttribute(`href`,e),n}var _b=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(e,t,n,r={}){this.doc=e,this.appId=t,this.nonce=n,hb(e,t,this.inline,this.external)&&this.hosts.add(e.head)}addStyles(e,t){for(let t of e)this.addUsage(t,this.inline,mb);t?.forEach(e=>this.addUsage(e,this.external,gb))}removeStyles(e,t){for(let t of e)this.removeUsage(t,this.inline);t?.forEach(e=>this.removeUsage(e,this.external))}addUsage(e,t,n){let r=t.get(e);r?r.usage++:t.set(e,{usage:1,elements:[...this.hosts].map(t=>this.addElement(t,n(e,this.doc)))})}removeUsage(e,t){let n=t.get(e);n&&(n.usage--,n.usage<=0&&(pb(n.elements),t.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])pb(e);this.hosts.clear()}addHost(e){if(!this.hosts.has(e)){this.hosts.add(e);for(let[t,{elements:n}]of this.inline)n.push(this.addElement(e,mb(t,this.doc)));for(let[t,{elements:n}]of this.external)n.push(this.addElement(e,gb(t,this.doc)))}}removeHost(e){this.hosts.delete(e);for(let t of[...this.inline.values(),...this.external.values()]){let n=[];for(let r of t.elements)r.parentNode===e?r.remove():n.push(r);t.elements=n}}addElement(e,t){return this.nonce&&t.setAttribute(`nonce`,this.nonce),e.appendChild(t)}static ɵfac=function(t){return new(t||e)(qi(Ss),qi(Zs),qi(tc,8),qi(ec))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),vb={svg:`http://www.w3.org/2000/svg`,xhtml:`http://www.w3.org/1999/xhtml`,xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`,xmlns:`http://www.w3.org/2000/xmlns/`,math:`http://www.w3.org/1998/Math/MathML`},yb=/%COMP%/g,bb=`%COMP%`,xb=`_nghost-${bb}`,Sb=`_ngcontent-${bb}`,Cb=!0,wb=new vi(``,{factory:()=>Cb}),Tb=new vi(``);function Eb(e){return Sb.replace(yb,e)}function Db(e){return xb.replace(yb,e)}function Ob(e,t){return t.map(t=>t.replace(yb,e))}var kb=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;cssVarNamespace;constructor(e,t,n,r,i,a,o=null,s=null,c=null){this.eventManager=e,this.sharedStylesHost=t,this.appId=n,this.removeStylesOnCompDestroy=r,this.doc=i,this.ngZone=a,this.nonce=o,this.tracingService=s,this.cssVarNamespace=c??``,this.defaultRenderer=new Ab(e,i,a,this.tracingService,this.cssVarNamespace)}createRenderer(e,t){if(!e||!t)return this.defaultRenderer;let n=this.getOrCreateRenderer(e,t);return n instanceof Pb?n.applyToHost(e):n instanceof Nb&&n.applyStyles(),n}getOrCreateRenderer(e,t){let n=this.rendererByCompId,r=n.get(t.id);if(!r){let i=this.doc,a=this.ngZone,o=this.eventManager,s=this.sharedStylesHost,c=this.removeStylesOnCompDestroy,l=this.tracingService;switch(t.encapsulation){case su.Emulated:r=new Pb(o,s,t,this.appId,c,i,a,l,this.cssVarNamespace);break;case su.ShadowDom:return new Mb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace,s);case su.ExperimentalIsolatedShadowDom:return new Mb(o,e,t,i,a,this.nonce,l,this.cssVarNamespace);default:r=new Nb(o,s,t,c,i,a,l,this.cssVarNamespace)}n.set(t.id,r)}return r}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static ɵfac=function(t){return new(t||e)(qi(db),qi(vm),qi(Zs),qi(wb),qi(Ss),qi(Fs),qi(tc),qi(kd,8),qi(Tb,8))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})(),Ab=class{eventManager;doc;ngZone;tracingService;cssVarNamespace;data=Object.create(null);throwOnSyntheticProps=!0;constructor(e,t,n,r,i=``){this.eventManager=e,this.doc=t,this.ngZone=n,this.tracingService=r,this.cssVarNamespace=i}destroy(){}destroyNode=null;createElement(e,t){return t?this.doc.createElementNS(vb[t]||t,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,t){(jb(e)?e.content:e).appendChild(t)}insertBefore(e,t,n){if(e){let r=jb(e)?e.content:e;if(n!=null&&n.parentNode!==r)throw new T(-5106,!1);r.insertBefore(t,n)}}removeChild(e,t){t.remove()}selectRootElement(e,t){let n=typeof e==`string`?this.doc.querySelector(e):e;if(!n)throw new T(-5104,!1);return t||(n.textContent=``),n}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,t,n,r){if(r){t=r+`:`+t;let i=vb[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)}removeAttribute(e,t,n){if(n){let r=vb[n];r?e.removeAttributeNS(r,t):e.removeAttribute(`${n}:${t}`)}else e.removeAttribute(t)}addClass(e,t){e.classList.add(t)}removeClass(e,t){e.classList.remove(t)}setStyle(e,t,n,r){let i=t.startsWith(`--`);i&&(t=t.replace(`%NS%`,this.cssVarNamespace)),i||r&(Yu.DashCase|Yu.Important)?e.style.setProperty(t,n,r&Yu.Important?`important`:``):e.style[t]=n}removeStyle(e,t,n){let r=t.startsWith(`--`);r&&(t=t.replace(`%NS%`,this.cssVarNamespace)),r||n&Yu.DashCase?e.style.removeProperty(t):e.style[t]=``}setProperty(e,t,n){e!=null&&(e[t]=n)}setValue(e,t){e.nodeValue=t}listen(e,t,n,r){if(typeof e==`string`&&(e=ny().getGlobalEventTarget(this.doc,e),!e))throw new T(-5102,!1);let i=this.decoratePreventDefault(n);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(e,t,i)),this.eventManager.addEventListener(e,t,i,r)}decoratePreventDefault(e){return t=>{if(t===`__ngUnwrap__`)return e;e(t)===!1&&t.preventDefault()}}};function jb(e){return e.tagName===`TEMPLATE`&&e.content!==void 0}var Mb=class extends Ab{hostEl;sharedStylesHost;shadowRoot;constructor(e,t,n,r,i,a,o,s,c){super(e,r,i,o,s),this.hostEl=t,this.sharedStylesHost=c,this.shadowRoot=t.attachShadow({mode:`open`}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=Ob(n.id,l).map(e=>e.replace(/%NS%/g,s));for(let e of l){let t=document.createElement(`style`);a&&t.setAttribute(`nonce`,a),t.textContent=e,this.shadowRoot.appendChild(t)}let u=n.getExternalStyles?.();if(u)for(let e of u){let t=gb(e,r);a&&t.setAttribute(`nonce`,a),this.shadowRoot.appendChild(t)}}nodeOrShadowRoot(e){return e===this.hostEl?this.shadowRoot:e}appendChild(e,t){return super.appendChild(this.nodeOrShadowRoot(e),t)}insertBefore(e,t,n){return super.insertBefore(this.nodeOrShadowRoot(e),t,n)}removeChild(e,t){return super.removeChild(null,t)}parentNode(e){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(e)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},Nb=class extends Ab{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(e,t,n,r,i,a,o,s,c){super(e,i,a,o,s),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r;let l=n.styles,u=c?Ob(c,l):l;this.styles=u.map(e=>e.replace(/%NS%/g,s)),this.styleUrls=n.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&ld.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},Pb=class extends Nb{contentAttr;hostAttr;constructor(e,t,n,r,i,a,o,s,c){let l=r+`-`+n.id;super(e,t,n,i,a,o,s,c,l),this.contentAttr=Eb(l),this.hostAttr=Db(l)}applyToHost(e){this.applyStyles(),this.setAttribute(e,this.hostAttr,``)}createElement(e,t){let n=super.createElement(e,t);return super.setAttribute(n,this.contentAttr,``),n}},Fb=class e extends iy{supportsDOMEvents=!0;static makeCurrent(){ry(new e)}onAndCancel(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}dispatchEvent(e,t){e.dispatchEvent(t)}remove(e){e.remove()}createElement(e,t){return t||=this.getDefaultDocument(),t.createElement(e)}createHtmlDocument(){return document.implementation.createHTMLDocument(`fakeTitle`)}getDefaultDocument(){return document}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}isShadowRoot(e){return e instanceof DocumentFragment}getGlobalEventTarget(e,t){return t===`window`?window:t===`document`?e:t===`body`?e.body:null}getBaseHref(e){let t=Lb();return t==null?null:Rb(t)}resetBaseElement(){Ib=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return ob(document.cookie,e)}},Ib=null;function Lb(){return Ib||=document.head.querySelector(`base`),Ib?Ib.getAttribute(`href`):null}function Rb(e){return new URL(e,document.baseURI).pathname}var zb=[`alt`,`control`,`meta`,`shift`],Bb={"\b":`Backspace`," ":`Tab`,"":`Delete`,"\x1B":`Escape`,Del:`Delete`,Esc:`Escape`,Left:`ArrowLeft`,Right:`ArrowRight`,Up:`ArrowUp`,Down:`ArrowDown`,Menu:`ContextMenu`,Scroll:`ScrollLock`,Win:`OS`},Vb={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},Hb=(()=>{class e extends cb{constructor(e){super(e)}supports(t){return e.parseEventName(t)!=null}addEventListener(t,n,r,i){let a=e.parseEventName(n),o=e.eventCallback(a.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>ny().onAndCancel(t,a.domEventName,o,i))}static parseEventName(t){let n=t.toLowerCase().split(`.`),r=n.shift();if(n.length===0||r!==`keydown`&&r!==`keyup`)return null;let i=e._normalizeKey(n.pop()),a=``,o=n.indexOf(`code`);if(o>-1&&(n.splice(o,1),a=`code.`),zb.forEach(e=>{let t=n.indexOf(e);t>-1&&(n.splice(t,1),a+=e+`.`)}),a+=i,n.length!=0||i.length===0)return null;let s={};return s.domEventName=r,s.fullKey=a,s}static matchEventFullKeyCode(e,t){let n=Bb[e.key]||e.key,r=``;return t.indexOf(`code.`)>-1&&(n=e.code,r=`code.`),n==null||!n?!1:(n=n.toLowerCase(),n===` `?n=`space`:n===`.`&&(n=`dot`),zb.forEach(t=>{if(t!==n){let n=Vb[t];n(e)&&(r+=t+`.`)}}),r+=n,r===t)}static eventCallback(t,n,r){return i=>{e.matchEventFullKeyCode(i,t)&&r.runGuarded(()=>n(i))}}static _normalizeKey(e){return e===`esc`?`escape`:e}static ɵfac=function(t){return new(t||e)(qi(Ss))};static ɵprov=di({token:e,factory:e.ɵfac})}return e})();async function Ub(e,t,n){return Yv({rootComponent:e,...Wb(t,n)})}function Wb(e,t){return{platformRef:t?.platformRef,appProviders:[...Yb,...e?.providers??[]],platformProviders:Jb}}function Gb(){Fb.makeCurrent()}function Kb(){return new qs}function qb(){return Yl(document),document}var Jb=[{provide:ec,useValue:sb},{provide:$s,useValue:Gb,multi:!0},{provide:Ss,useFactory:qb}],Yb=[{provide:Ta,useValue:`root`},{provide:qs,useFactory:Kb},{provide:ub,useClass:lb,multi:!0},{provide:ub,useClass:Hb,multi:!0},kb,{provide:vm,useClass:_b},{provide:_b,useExisting:vm},db,{provide:$p,useExisting:kb},[]];function Xb(e,t){let n=`\x1B[${e}m`,r=`\x1B[${t}m`;return((e,...t)=>{if(Array.isArray(e)&&`raw`in e){let i=e,a=``;for(let e=0;e{let r=new ex({code:i,why:Qb(a.why,e),fix:Qb(a.fix,e),docs:o,cause:e.cause,sources:e.sources,data:Qb(a.data,e)},s);for(let e of t)e(r,n);return r};n[i]=s}return n}function rx(e){return t=>{let n=`${e.bold(e.red(`[${t.name}]`))} ${t.message}`,r=[];return t.fix&&r.push(`${e.dim(`fix:`)} ${t.fix}`),t.sources?.length&&r.push(`${e.dim(`sources:`)} ${t.sources.join(`, `)}`),t.docs&&r.push(`${e.dim(`see:`)} ${e.cyan(t.docs)}`),r.length===0?n:[n,...r.map((t,n)=>`${e.dim(n{e=n,t=r}),resolve:e,reject:t}}var lx=Math.random.bind(Math),ux=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function dx(e=21){let t=``,n=e;for(;n--;)t+=ux[lx()*64|0];return t}var fx=6e4,px=e=>e,mx=px,{clearTimeout:hx,setTimeout:gx}=globalThis;function _x(e,t){let{post:n,on:r,off:i=()=>{},eventNames:a=[],serialize:o=px,deserialize:s=mx,resolver:c,bind:l=`rpc`,timeout:u=fx,proxify:d=!0}=t,f=!1,p=new Map,m,h;async function g(e,r,i,a){if(f)throw Error(`[birpc] rpc is closed, cannot call "${e}"`);let s={m:e,a:r,t:`q`};a&&(s.o=!0);let c=async e=>n(o(e));if(i){await c(s);return}if(m)try{await m}finally{m=void 0}let{promise:l,resolve:d,reject:g}=cx(),_=dx();s.i=_;let ee;async function v(n=s){return u>=0&&(ee=gx(()=>{try{if(t.onTimeoutError?.call(h,e,r)!==!0)throw Error(`[birpc] timeout on calling "${e}"`)}catch(e){g(e)}p.delete(_)},u),typeof ee==`object`&&(ee=ee.unref?.())),p.set(_,{resolve:d,reject:g,timeoutId:ee,method:e}),await c(n),l}try{t.onRequest?await t.onRequest.call(h,s,v,d):await v()}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}finally{hx(ee),p.delete(_)}return l}let _={$call:(e,...t)=>g(e,t,!1),$callOptional:(e,...t)=>g(e,t,!1,!0),$callEvent:(e,...t)=>g(e,t,!0),$callRaw:e=>g(e.method,e.args,e.event,e.optional),$rejectPendingCalls:v,get $closed(){return f},get $meta(){return t.meta},$close:ee,$functions:e};h=d?new Proxy({},{get(t,n){if(Object.hasOwn(_,n))return _[n];if(n===`then`&&!a.includes(`then`)&&!(`then`in e))return;let r=(...e)=>g(n,e,!0);if(a.includes(n))return r.asEvent=r,r;let i=(...e)=>g(n,e,!1);return i.asEvent=r,i}}):_;function ee(e){f=!0,p.forEach(({reject:t,method:n})=>{let r=Error(`[birpc] rpc is closed, cannot call "${n}"`);if(e)return e.cause??=r,t(e);t(r)}),p.clear(),i(te)}function v(e){let t=Array.from(p.values()).map(({method:t,reject:n})=>e?e({method:t,reject:n}):n(Error(`[birpc]: rejected pending call "${t}".`)));return p.clear(),t}async function te(r,...i){let a;try{a=s(r)}catch(e){if(t.onGeneralError?.call(h,e)!==!0)throw e;return}if(a.t===`q`){let{m:r,a:s,o:u}=a,d,f,p=await(c?c.call(h,r,e[r]):e[r]);if(u&&(p||=()=>void 0),!p)f=Error(`[birpc] function "${r}" not found`);else try{d=await p.apply(l===`rpc`?h:e,s)}catch(e){f=e}if(a.i){if(f&&t.onFunctionError&&t.onFunctionError.call(h,f,r,s)===!0)return;if(!f)try{await n(o({t:`s`,i:a.i,r:d}),...i);return}catch(e){if(f=e,t.onGeneralError?.call(h,e,r,s)!==!0)throw e}try{await n(o({t:`s`,i:a.i,e:f}),...i)}catch(e){if(t.onGeneralError?.call(h,e,r,s)!==!0)throw e}}}else{let{i:e,r:t,e:n}=a,r=p.get(e);r&&(hx(r.timeoutId),n?r.reject(n):r.resolve(t)),p.delete(e)}}return m=r(te),h}function vx(e,t){return t.safety?t.safety:e===`static`||e===`query`||e==null?`read`:`action`}var yx=Object.freeze({type:`object`,additionalProperties:!0});function bx(e){let t=e[`~standard`];if(t.jsonSchema)try{return t.jsonSchema.input({target:`draft-2020-12`})}catch{return yx}return yx}function xx(e){if(!e||e.length===0)return{type:`object`,properties:{}};let t={},n=[];for(let r=0;rn[`arg${t}`]);if(`arg0`in n){let e=[];for(;`arg${e.length}`in n;)e.push(n[`arg${e.length}`]);return e}return Object.keys(n).length===0?[]:void 0}function Cx(e,t){return Sx(e,t)??[e]}function wx(e){return typeof e==`string`?`'${e}'`:new Ox().serialize(e)}var Tx=` _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,Ex=(function(){let e=new Uint8Array(128);for(let t=0;t<69;t++)e[Tx.charCodeAt(t)]=t+1;for(let t=65;t<=90;t++)e[t]=e[t+32];return e})();function Dx(e,t){if(e===t)return 0;let n=Math.min(e.length,t.length),r=0;for(let i=0;ia?-1:1)}return e.length===t.length?r:e.lengththis.compare(e[0],t[0])),r=`${e}{`;for(let e=0;ethis.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e})(),kx=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],Ax=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],jx=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Mx=[],Nx=class{_data=new Px;_hash=new Px([...kx]);_nDataBytes=0;_minBufferSize=0;finalize(e){e&&this._append(e);let t=this._nDataBytes*8,n=this._data.sigBytes*8;return this._data.words[n>>>5]|=128<<24-n%32,this._data.words[(n+64>>>9<<4)+14]=Math.floor(t/4294967296),this._data.words[(n+64>>>9<<4)+15]=t,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(e,t){let n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7];for(let n=0;n<64;n++){if(n<16)Mx[n]=e[t+n]|0;else{let e=Mx[n-15],t=(e<<25|e>>>7)^(e<<14|e>>>18)^e>>>3,r=Mx[n-2],i=(r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10;Mx[n]=t+Mx[n-7]+i+Mx[n-16]}let d=s&c^~s&l,f=r&i^r&a^i&a,p=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=(s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25),h=u+m+d+Ax[n]+Mx[n],g=p+f;u=l,l=c,c=s,s=o+h|0,o=a,a=i,i=r,r=h+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+s|0,n[5]=n[5]+c|0,n[6]=n[6]+l|0,n[7]=n[7]+u|0}_append(e){typeof e==`string`&&(e=Px.fromUtf8(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes}_process(e){let t,n=this._data.sigBytes/64;n=e?Math.ceil(n):Math.max((n|0)-this._minBufferSize,0);let r=n*16,i=Math.min(r*4,this._data.sigBytes);if(r){for(let e=0;e>>2]|=(n.charCodeAt(e)&255)<<24-e%4*8;return new e(i,r)}toBase64(){let e=[];for(let t=0;t>>2]>>>24-t%4*8&255,r=this.words[t+1>>>2]>>>24-(t+1)%4*8&255,i=this.words[t+2>>>2]>>>24-(t+2)%4*8&255,a=n<<16|r<<8|i;for(let n=0;n<4&&t*8+n*6>>6*(3-n)&63))}return e.join(``)}concat(e){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let t=0;t>>2]>>>24-t%4*8&255;this.words[this.sigBytes+t>>>2]|=n<<24-(this.sigBytes+t)%4*8}else for(let t=0;t>>2]=e.words[t>>>2];this.sigBytes+=e.sigBytes}};function Fx(e){return new Nx().finalize(e).toBase64()}function Ix(e){return Fx(wx(e))}function Lx(e){return Ix(e)}function Rx(){let e={};function t(t,...n){let r=e[t]||[];for(let e=0,t=r.length;e{e[t]=e[t]?.filter(e=>n!==e)}}function i(e,t){let n=r(e,((...e)=>(n(),t(...e))));return n}return{_listeners:e,emit:t,emitOnce:n,on:r,once:i}}var zx=/^[\w+.-]{2,}:\/\//;function Bx(e){return e.endsWith(`/`)?e:`${e}/`}function Vx(e){return(e.endsWith(`/`)?e.slice(0,-1):e)||`/`}function Hx(e,...t){let n=e;for(let e of t)e&&e!==`/`&&(n=n?Bx(n)+e.replace(/^\.?\//,``):e);return n}function Ux(e,t){if(!t||t===`/`||zx.test(e))return e;let n=Vx(t);return e.startsWith(n)?e:Hx(n,e)}function Wx(e,t){let n=e.match(zx);return t+(n?e.slice(n[0].length):e)}var Gx=`useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict`;function Kx(e=21){let t=``,n=e;for(;n--;)t+=Gx[Math.random()*64|0];return t}var qx=Symbol.for(`immer-nothing`),Jx=Symbol.for(`immer-draftable`),Yx=Symbol.for(`immer-state`),Xx=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},`This object has been frozen and should not be mutated`,function(e){return`Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? `+e},`An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.`,`Immer forbids circular references`,"The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},`Object.defineProperty() cannot be used on an Immer draft`,`Object.setPrototypeOf() cannot be used on an Immer draft`,`Immer only supports deleting array indices`,`Immer only supports setting array indices and the 'length' property`,function(e){return`'original' expects a draft, got: ${e}`}];function Zx(e,...t){{let n=Xx[e],r=xS(n)?n.apply(null,t):n;throw Error(`[Immer] ${r}`)}}var Qx=Object,$x=Qx.getPrototypeOf,eS=`constructor`,tS=`prototype`,nS=`configurable`,rS=`enumerable`,iS=`writable`,aS=`value`,oS=e=>!!e&&!!e[Yx];function sS(e){return e?uS(e)||_S(e)||!!e[Jx]||!!e[eS]?.[Jx]||vS(e)||yS(e):!1}var cS=Qx[tS][eS].toString(),lS=new WeakMap;function uS(e){if(!e||!bS(e))return!1;let t=$x(e);if(t===null||t===Qx[tS])return!0;let n=Qx.hasOwnProperty.call(t,eS)&&t[eS];if(n===Object)return!0;if(!xS(n))return!1;let r=lS.get(n);return r===void 0&&(r=Function.toString.call(n),lS.set(n,r)),r===cS}function dS(e,t,n=!0){fS(e)===0?(n?Reflect.ownKeys(e):Qx.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function fS(e){let t=e[Yx];return t?t.type_:_S(e)?1:vS(e)?2:yS(e)?3:0}var pS=(e,t,n=fS(e))=>n===2?e.has(t):Qx[tS].hasOwnProperty.call(e,t),mS=(e,t,n=fS(e))=>n===2?e.get(t):e[t],hS=(e,t,n,r=fS(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function gS(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var _S=Array.isArray,vS=e=>e instanceof Map,yS=e=>e instanceof Set,bS=e=>typeof e==`object`,xS=e=>typeof e==`function`,SS=e=>typeof e==`boolean`;function CS(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var wS=e=>bS(e)?e?.[Yx]:null,TS=e=>e.copy_||e.base_,ES=e=>e.modified_?e.copy_:e.base_;function DS(e,t){if(vS(e))return new Map(e);if(yS(e))return new Set(e);if(_S(e))return Array[tS].slice.call(e);let n=uS(e);if(t===!0||t===`class_only`&&!n){let t=Qx.getOwnPropertyDescriptors(e);delete t[Yx];let n=Reflect.ownKeys(t);for(let r=0;r1&&Qx.defineProperties(e,{set:AS,add:AS,clear:AS,delete:AS}),Qx.freeze(e),t&&dS(e,(e,t)=>{OS(t,!0)},!1),e)}function kS(){Zx(2)}var AS={[aS]:kS};function jS(e){return e===null||!bS(e)||Qx.isFrozen(e)}var MS=`MapSet`,NS=`Patches`,PS=`ArrayMethods`,FS={};function IS(e){let t=FS[e];return t||Zx(0,e),t}var LS=e=>!!FS[e];function RS(e,t){FS[e]||(FS[e]=t)}var zS,BS=()=>zS,VS=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:LS(MS)?IS(MS):void 0,arrayMethodsPlugin_:LS(PS)?IS(PS):void 0});function HS(e,t){t&&(e.patchPlugin_=IS(NS),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function US(e){WS(e),e.drafts_.forEach(KS),e.drafts_=null}function WS(e){e===zS&&(zS=e.parent_)}var GS=e=>zS=VS(zS,e);function KS(e){let t=e[Yx];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function qS(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[Yx].modified_&&(US(t),Zx(4)),sS(e)&&(e=JS(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[Yx].base_,e,t)}else e=JS(t,n);return YS(t,e,!0),US(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===qx?void 0:e}function JS(e,t){if(jS(t))return t;let n=t[Yx];if(!n)return rC(t,e.handledSet_,e);if(!ZS(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);tC(n,e)}return n.copy_}function YS(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&OS(t,n)}function XS(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var ZS=(e,t)=>e.scope_===t,QS=[];function $S(e,t,n,r){let i=TS(e),a=e.type_;if(r!==void 0&&mS(i,r,a)===t){hS(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;dS(i,(e,n)=>{if(oS(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??QS;for(let e of o)hS(i,e,n,a)}function eC(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!ZS(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=ES(i);$S(e,i.draft_??i,a,n),tC(i,r)})}function tC(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}XS(e)}}function nC(e,t,n){let{scope_:r}=e;if(oS(n)){let i=n[Yx];ZS(i,r)&&i.callbacks_.push(function(){fC(e),$S(e,n,ES(i),t)})}else sS(n)&&e.callbacks_.push(function(){let i=TS(e);e.type_===3?i.has(n)&&rC(n,r.handledSet_,r):mS(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&rC(mS(e.copy_,t,e.type_),r.handledSet_,r)})}function rC(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||oS(e)||t.has(e)||!sS(e)||jS(e)?e:(t.add(e),dS(e,(r,i)=>{if(oS(i)){let t=i[Yx];ZS(t,n)&&(hS(e,r,ES(t),e.type_),XS(t))}else sS(i)&&rC(i,t,n)}),e)}function iC(e,t){let n=_S(e),r={type_:+!!n,scope_:t?t.scope_:BS(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=aC;n&&(i=[r],a=oC);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var aC={get(e,t){if(t===Yx)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=TS(e);if(!pS(i,t,e.type_))return lC(e,i,t);let a=i[t];if(e.finalized_||!sS(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&CS(t))return a;if(a===sC(e.base_,t)||cC(e,t,a)){fC(e);let n=e.type_===1?+t:t,r=mC(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in TS(e)},ownKeys(e){return Reflect.ownKeys(TS(e))},set(e,t,n){let r=uC(TS(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=sC(TS(e),t),i=r?.[Yx];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(gS(n,r)&&(n!==void 0||pS(e.base_,t,e.type_)))return!0;fC(e),dC(e)}return e.copy_[t]===n&&(n!==void 0||pS(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),nC(e,t,n),!0)},deleteProperty(e,t){return fC(e),sC(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),dC(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=TS(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[iS]:!0,[nS]:e.type_!==1||t!==`length`,[rS]:r[rS],[aS]:n[t]}},defineProperty(){Zx(11)},getPrototypeOf(e){return $x(e.base_)},setPrototypeOf(){Zx(12)}},oC={};for(let e in aC){let t=aC[e];oC[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}oC.deleteProperty=function(e,t){return isNaN(parseInt(t))&&Zx(13),oC.set.call(this,e,t,void 0)},oC.set=function(e,t,n){return t!==`length`&&isNaN(parseInt(t))&&Zx(14),aC.set.call(this,e[0],t,n,e[0])};function sC(e,t){let n=e[Yx];return(n?TS(n):e)[t]}function cC(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!sS(n)||n[Yx]?!1:e.baseRefs_.has(n)}function lC(e,t,n){let r=uC(t,n);return r?aS in r?r[aS]:r.get?.call(e.draft_):void 0}function uC(e,t){if(!(t in e))return;let n=$x(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=$x(n)}}function dC(e){e.modified_||(e.modified_=!0,e.parent_&&dC(e.parent_))}function fC(e){e.copy_||=(e.assigned_=new Map,DS(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var pC=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(xS(e)&&!xS(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}xS(t)||Zx(6),n!==void 0&&!xS(n)&&Zx(7);let r;if(sS(e)){let i=GS(this),a=mC(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?US(i):WS(i)}return HS(i,n),qS(r,i)}if(!e||!bS(e)){if(r=t(e),r===void 0&&(r=e),r===qx&&(r=void 0),this.autoFreeze_&&OS(r,!0),n){let t=[],i=[];IS(NS).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}Zx(1,e)},this.produceWithPatches=(e,t)=>{if(xS(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},SS(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),SS(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),SS(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){sS(e)||Zx(8),oS(e)&&(e=hC(e));let t=GS(this),n=mC(t,e,void 0);return n[Yx].isManual_=!0,WS(t),n}finishDraft(e,t){let n=e&&e[Yx];(!n||!n.isManual_)&&Zx(9);let{scope_:r}=n;return HS(r,t),qS(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=IS(NS).applyPatches_;return oS(e)?r(e,t):this.produce(e,e=>r(e,t))}};function mC(e,t,n,r){let[i,a]=vS(t)?IS(MS).proxyMap_(t,n):yS(t)?IS(MS).proxySet_(t,n):iC(t,n);return(n?.scope_??BS()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?eC(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function hC(e){return oS(e)||Zx(10,e),gC(e)}function gC(e){if(!sS(e)||jS(e))return e;let t=e[Yx],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=DS(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=DS(e,!0);return dS(n,(e,t)=>{hS(n,e,gC(t))},r),t&&(t.finalized_=!1),n}function _C(){Xx.push(`Sets cannot have "replace" patches.`,function(e){return`Unsupported patch operation: `+e},function(e){return`Cannot apply patch, path doesn't resolve: `+e},`Patching reserved attributes like __proto__, prototype and constructor is not allowed`);function e(n,r=[]){if(n.key_!==void 0){let e=n.parent_.copy_??n.parent_.base_,t=wS(mS(e,n.key_)),i=mS(e,n.key_);if(i===void 0||i!==n.draft_&&i!==n.base_&&i!==n.copy_||t!=null&&t.base_!==n.base_)return null;let a=n.parent_.type_===3,o;if(a){let e=n.parent_;o=Array.from(e.drafts_.keys()).indexOf(n.key_)}else o=n.key_;if(!(a&&e.size>o||pS(e,o)))return null;r.push(o)}if(n.parent_)return e(n.parent_,r);r.reverse();try{t(n.copy_,r)}catch{return null}return r}function t(e,t){let n=e;for(let e=0;e{let u=mS(o,e,c),f=mS(s,e,c),p=l?pS(o,e)?n:`add`:r;if(u===f&&p===n)return;let m=t.concat(e);i.push(p===r?{op:p,path:m}:{op:p,path:m,value:d(f)}),a.push(p===`add`?{op:r,path:m}:p===r?{op:`add`,path:m,value:d(u)}:{op:n,path:m,value:d(u)})})}function s(e,t,n,i){let{base_:a,copy_:o}=e,s=0;a.forEach(e=>{if(!o.has(e)){let a=t.concat([s]);n.push({op:r,path:a,value:e}),i.unshift({op:`add`,path:a,value:e})}s++}),s=0,o.forEach(e=>{if(!a.has(e)){let a=t.concat([s]);n.push({op:`add`,path:a,value:e}),i.unshift({op:r,path:a,value:e})}s++})}function c(e,t,r){let{patches_:i,inversePatches_:a}=r;i.push({op:n,path:[],value:t===qx?void 0:t}),a.push({op:n,path:[],value:e})}function l(e,t){return t.forEach(t=>{let{path:i,op:a}=t,o=e;for(let e=0;e[e,u(t)]));if(yS(e))return new Set(Array.from(e).map(u));let t=Object.create($x(e));for(let n in e)t[n]=u(e[n]);return pS(e,Jx)&&(t[Jx]=e[Jx]),t}function d(e){return oS(e)?u(e):e}RS(NS,{applyPatches_:l,generatePatches_:i,generateReplacementPatches_:c,getPath:e})}globalThis.Iterator?.from;var vC=new pC,yC=vC.produce,bC=vC.produceWithPatches.bind(vC),xC=vC.applyPatches.bind(vC),SC=1e3;function CC(e,t){if(e.add(t),e.size>SC){let t=e.values().next().value;t!==void 0&&e.delete(t)}}function wC(e){let{enablePatches:t=!1}=e;t&&_C();let n=Rx(),r=e.initialValue,i=new Set;return{on:n.on,value:()=>r,patch:(e,t=Kx())=>{i.has(t)||(_C(),r=xC(r,e),CC(i,t),n.emit(`updated`,r,void 0,t))},mutate:(e,a=Kx())=>{if(!i.has(a)){if(CC(i,a),t){let[t,i]=bC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,i,a)}else{let t=yC(r,e);if(t===r)return;r=t,n.emit(`updated`,r,void 0,a)}}},syncIds:i}}var TC=typeof self==`object`?self:globalThis,EC=new Set([`Error`,`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`,`AggregateError`]),DC=new Set([`Boolean`,`Number`,`String`,`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float16Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`]);function OC(e,t){let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o)e[r(t)]=r(n);return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o,r=EC.has(e)?TC[e]:void 0;return n(new(r??TC.Error)(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}}if(typeof a==`string`&&DC.has(a))return n(new TC[a](o),i);throw TypeError(`unable to deserialize unsafe or unknown type: ${String(a)}`)};return r}function kC(e){return OC(new Map,e)(0)}var AC=``,{toString:jC}={},{keys:MC}=Object;function NC(e){let t=typeof e;if(t!==`object`||!e)return[0,t];let n=jC.call(e).slice(8,-1);switch(n){case`Array`:return[1,AC];case`Object`:return[2,AC];case`Date`:return[3,AC];case`RegExp`:return[4,AC];case`Map`:return[5,AC];case`Set`:return[6,AC];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:n.includes(`Error`)?[7,n]:[2,n]}function PC([e,t]){return e===0&&(t===`function`||t===`symbol`)}function FC(e,t,n,r){let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=r=>{if(n.has(r))return n.get(r);let[o,s]=NC(r);switch(o){case 0:{let t=r;switch(s){case`bigint`:o=8,t=r.toString();break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize ${s}`);t=null;break;case`undefined`:return i([-1],r)}return i([o,t],r)}case 1:{if(s){let e=r;return s===`DataView`?e=new Uint8Array(r.buffer):s===`ArrayBuffer`&&(e=new Uint8Array(r)),i([s,[...e]],r)}let e=[],t=i([o,e],r);for(let t of r)e.push(a(t));return t}case 2:{if(s)switch(s){case`BigInt`:return i([s,r.toString()],r);case`Boolean`:case`Number`:case`String`:return i([s,r.valueOf()],r)}if(t&&`toJSON`in r)return a(r.toJSON());let n=[],c=i([o,n],r);for(let t of MC(r))(e||!PC(NC(r[t])))&&n.push([a(t),a(r[t])]);return c}case 3:return i([o,r.toISOString()],r);case 4:{let{source:e,flags:t}=r;return i([o,{source:e,flags:t}],r)}case 5:{let t=[],n=i([o,t],r);for(let[n,i]of r)(e||!(PC(NC(n))||PC(NC(i))))&&t.push([a(n),a(i)]);return n}case 6:{let t=[],n=i([o,t],r);for(let n of r)(e||!PC(NC(n)))&&t.push(a(n));return n}}let{message:c}=r;return i([o,{name:s,message:c}],r)};return a}function IC(e,t={}){let n=[];return FC(!(t.json||t.lossy),!!t.json,new Map,n)(e),n}var{parse:LC,stringify:RC}=JSON,zC={json:!0,lossy:!0};function BC(e){return kC(LC(e))}function VC(e){return RC(IC(e,zC))}function HC(e){return kC(e)}function UC(e){return VC(e)}function WC(e){return BC(e)}var GC=256,KC=class extends Error{name=`StreamClosedError`};function qC(e={}){let t=e.id??Kx(),n=Math.max(0,e.replayWindow??0),r=Rx(),i=new AbortController,a=[],o=!1,s=0;function c(e){if(o)throw new KC(`Cannot write to a closed stream "${t}"`);s+=1,n>0&&(a.push({seq:s,chunk:e}),a.length>n&&(a.length-n===1?a.shift():a.splice(0,a.length-n))),r.emit(`chunk`,s,e)}function l(e){if(o)return;o=!0;let t=YC(e);i.abort(e),r.emit(`end`,t)}function u(){o||(o=!0,i.signal.aborted||i.abort(`stream closed`),r.emit(`end`,void 0))}function d(e){o||i.signal.aborted||i.abort(e??`aborted`)}let f=new WritableStream({write(e){c(e)},close(){u()},abort(e){l(e)}});return{id:t,signal:i.signal,get closed(){return o},get lastSeq(){return s},write:c,error:l,close:u,abort:d,writable:f,events:r,buffer:a}}function JC(e={}){let t=e.id??Kx(),n=Math.max(1,e.highWaterMark??GC),r=[],i=0,a=!1,o=!1,s,c,l,u;function d(){if(c){if(r.length>0){let e=r.shift(),t=c;c=void 0,t.resolve({value:e,done:!1});return}if(a){let e=c;if(c=void 0,s){let t=Error(s.message);t.name=s.name,e.reject(t)}else e.resolve({value:void 0,done:!0})}}}function f(){if(l){for(;r.length>0;){let e=r.shift();try{l.enqueue(e)}catch{break}}if(a&&l){try{if(s){let e=Error(s.message);e.name=s.name,l.error(e)}else l.close()}catch{}l=void 0}}}function p(t,s){if(!(a||o)&&!(t<=i)){if(i=t,r.push(s),r.length>n){let t=r.length-n;r.splice(0,t),e.onOverflow?.(t)}d(),u&&f()}}function m(e){a||(a=!0,s=e,d(),u&&f())}function h(){o||a||(o=!0,e.onCancel?.(),m(void 0))}function g(){return u||(u=new ReadableStream({start(e){l=e,f()},cancel(){h()}}),u)}return{id:t,get cancelled(){return o},get done(){return a},get lastSeenSeq(){return i},get readable(){return g()},cancel:h,_push:p,_end:m,[Symbol.asyncIterator](){return{next(){if(r.length>0)return Promise.resolve({value:r.shift(),done:!1});if(a){if(s){let e=Error(s.message);return e.name=s.name,Promise.reject(e)}return Promise.resolve({value:void 0,done:!0})}return new Promise((e,t)=>{c={resolve:e,reject:t}})},return(){return h(),Promise.resolve({value:void 0,done:!0})}}}}}function YC(e){if(e instanceof Error)return{name:e.name||`Error`,message:e.message};if(typeof e==`string`)return{name:`Error`,message:e};try{return{name:`Error`,message:JSON.stringify(e)}}catch{return{name:`Error`,message:String(e)}}}var XC=128;function ZC(e){return e.replace(/[^\w-]+/g,`_`).slice(0,XC)}var QC=`modulepreload`,$C=function(e,t){return new URL(e,t).href},ew={},tw=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=$C(t,n),t=s(t),t in ew)return;ew[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:QC,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},nw=`__connection.json`,rw=`__DEVFRAME_CONNECTION__`,iw=`x-birpc-session`,aw=`__rpc-dump/index.json`,ow=`devframe:services`,sw=`devframe_otp`,cw=`devframe_auth_token`;ix.postMessage.remoteAssetsError;var lw=class{cacheMap=new Map;options;keySerializer;constructor(e){this.options=e,this.keySerializer=e.keySerializer||(e=>Lx(e))}updateOptions(e){this.options={...this.options,...e}}cached(e,t){let n=this.cacheMap.get(e);if(n)return n.get(this.keySerializer(t))}has(e,t){return this.cacheMap.get(e)?.has(this.keySerializer(t))??!1}apply(e,t){let n=this.cacheMap.get(e.m)||new Map;n.set(this.keySerializer(e.a),t),this.cacheMap.set(e.m,n)}validate(e){return this.options.functions.includes(e)}clear(e){e?this.cacheMap.delete(e):this.cacheMap.clear()}},uw=sx({docsBase:`https://devfra.me/errors`,codes:{DF0019:{why:e=>`RPC function "${e.name}" has \`agent\` set but \`jsonSerializable\` is \`false\`; MCP requires JSON-serializable data.`,fix:"Remove `jsonSerializable: false`, or remove `agent` to keep it RPC-only."},DF0020:{why:e=>`RPC function "${e.name}" declares \`jsonSerializable: true\` but the value at "${e.path}" is a ${e.type}.`,fix:"Either drop `jsonSerializable: true` (falls back to structured-clone) or change the value to a JSON-safe shape."},DF0021:{why:e=>`RPC function "${e.name}" is already registered`,fix:"Use the `force` parameter to overwrite an existing registration."},DF0022:{why:e=>`RPC function "${e.name}" is not registered. Use register() to add new functions.`},DF0023:{why:e=>`RPC function "${e.name}" is not registered`},DF0024:{why:e=>`Either handler or setup function must be provided for RPC function "${e.name}"`},DF0025:{why:e=>`Function "${e.name}" not found in dump store`},DF0026:{why:e=>`No dump match for "${e.name}" with args: ${e.args}`},DF0027:{why:e=>`Function "${e.name}" with type "${e.type}" cannot have dump configuration. Only "static" and "query" types support dumps.`},DF0028:{why:e=>`Function "${e.name}" with type "${e.type}" cannot use \`snapshot: true\`. Only "query" functions support this sugar; "static" functions have equivalent default behavior already.`,fix:"Remove `snapshot: true`, or change the function type to `query`."},DF0043:{why:e=>`RPC function "${e.name}" received an invalid argument at position ${e.index}: ${e.issues}`,fix:"Pass a value that satisfies the `args` schema declared for this function."},DF0044:{why:e=>`RPC function "${e.name}" returned a value that failed its \`returns\` schema: ${e.issues}`,fix:"Make the handler return a value that satisfies the `returns` schema, or relax the schema."}}});function dw(e){if(e.agent&&e.jsonSerializable===!1)throw uw.DF0019({name:e.name});e.agent&&!e.jsonSerializable&&(e.jsonSerializable=!0)}async function fw(e,t){let n=e[`~standard`].validate(t);return n instanceof Promise?await n:n}function pw(e){return e.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `)}async function mw(e,t,n){let r=n.slice();if(!t||t.length===0)return r;for(let r=0;r{n.get(t)===r&&n.delete(t)}),n.set(t,r)),await r}if(!e.__promise){let n=Promise.resolve(e.setup(t));n.catch(()=>{e.__promise===n&&(e.__promise=void 0)}),e.__promise=n}return await e.__promise}async function _w(e,t){let n=e.handler;if(!n){let r=await gw(e,t);if(!r.handler)throw uw.DF0024({name:e.name});n=r.handler}let r=e.args,i=e.returns;if(!r&&!i)return n;let a=n;return async(...t)=>{let n=await mw(e.name,r,t),o=await a(...n);return await hw(e.name,i,o)}}var vw=class{context;definitions=new Map;functions;_onChanged=[];constructor(e){this.context=e;let t=this.definitions,n=this;this.functions=new Proxy({},{get(e,r){let i=t.get(r);if(i)return _w(i,n.context)},has(e,n){return t.has(n)},getOwnPropertyDescriptor(e,n){return{value:t.get(n)?.handler,configurable:!0,enumerable:!0}},ownKeys(){return Array.from(t.keys())}})}register(e,t=!1){if(this.definitions.has(e.name)&&!t)throw uw.DF0021({name:e.name});dw(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}update(e,t=!1){if(!this.definitions.has(e.name)&&!t)throw uw.DF0022({name:e.name});dw(e),this.definitions.set(e.name,e),this._onChanged.forEach(t=>t(e.name))}onChanged(e){return this._onChanged.push(e),()=>{let t=this._onChanged.indexOf(e);t!==-1&&this._onChanged.splice(t,1)}}async getHandler(e){return await _w(this.definitions.get(e),this.context)}getSchema(e){let t=this.definitions.get(e);if(!t)throw uw.DF0023({name:String(e)});return{args:t.args,returns:t.returns}}has(e){return this.definitions.has(e)}get(e){return this.definitions.get(e)}list(){return Array.from(this.definitions.keys())}};function yw(e,t=``){return JSON.stringify(e,function(e,n){let r=this,i=r==null?n:r[e];if(i===void 0){if(Array.isArray(r))throw xw(t,`undefined`,r,e);return n}return i!==null&&bw(i,r,e,t),n})}function bw(e,t,n,r){if(typeof e==`bigint`)throw xw(r,`BigInt`,t,n);if(typeof e!=`object`)return;if(e instanceof Map)throw xw(r,`Map`,t,n);if(e instanceof Set)throw xw(r,`Set`,t,n);if(e instanceof Date)throw xw(r,`Date`,t,n);if(Array.isArray(e))return;let i=Object.getPrototypeOf(e);if(i!==null&&i!==Object.prototype)throw xw(r,e.constructor?.name??`class instance`,t,n)}function xw(e,t,n,r){let i=Sw(n,r);return uw.DF0020({name:e||``,type:t,path:i})}function Sw(e,t){return Array.isArray(e)?`[${t}]`:t===``?``:t}var Cw=`__DEVFRAME_CONNECTION_META__`,ww=`__DEVFRAME_CONNECTION_AUTH_TOKEN__`;function Tw(e){let t=[()=>window?.[e],()=>globalThis?.[e],()=>parent.window?.[e]];for(let e of t)try{let t=e();if(t)return t}catch{}}function Ew(){return Tw(rw)}function Dw(){return Tw(Cw)}function Ow(e){if(e)return e;try{let e=localStorage.getItem(ww);if(e)return e}catch{}return Tw(ww)}function kw(e){globalThis[rw]=e,globalThis[Cw]={...e.connectionMeta,baseUrl:e.metaBaseUrl},e.authToken&&Aw(e.authToken)}function Aw(e){try{localStorage.setItem(ww,e)}catch{}globalThis[ww]=e;let t=Ew();t&&(globalThis[rw]={...t,authToken:e})}function jw(e){let t=Ux(nw,e);try{return new URL(t,globalThis.location?.href).href}catch{return t}}function Mw(e,t){return t&&t!==e.authToken?{...e,authToken:t}:e}function Nw(){let e=Ew();if(e)return Mw(e,Ow()??e.authToken??e.connectionMeta.authToken);let t=Dw();if(t)return{connectionMeta:t,metaBaseUrl:t.baseUrl??jw(`./`),authToken:Ow(t.authToken)}}async function Pw(e={}){if(e.connection){let t=Mw(e.connection,Ow(e.authToken??e.connection.authToken??e.connection.connectionMeta.authToken));return kw(t),t}let t=Array.isArray(e.baseURL)?e.baseURL:[e.baseURL??`./`];if(e.connectionMeta){let n={connectionMeta:e.connectionMeta,metaBaseUrl:jw(t[0]??`./`),authToken:Ow(e.authToken??e.connectionMeta.authToken)};return kw(n),n}let n=Nw();if(n){let t=Mw(n,Ow(e.authToken??n.authToken??n.connectionMeta.authToken));return kw(t),t}let r=[];for(let n of t){let t=Ux(nw,n),i=jw(n);try{let n=await fetch(t);if(!n.ok)throw Error(`Failed to fetch connection meta from ${i}: ${n.status}`);let r=await n.json(),a=n.url||i,o={connectionMeta:r,metaBaseUrl:r.baseUrl?new URL(r.baseUrl,a).href:a,authToken:Ow(e.authToken??r.authToken)};return kw(o),o}catch(e){r.push(e)}}throw Error(`Failed to get connection meta from ${t.join(`, `)}`,{cause:r})}var Fw=class extends Error{name=`DevframeConnectionError`;kind;constructor(e,t,n){super(t,n),this.kind=e}};function Iw(e=sw){try{let t=globalThis.location?.hash?.replace(/^#/,``)??``;return new URLSearchParams(t).get(e)||void 0}catch{return}}function Lw(e){try{let t=new URL(globalThis.location.href),n=new URLSearchParams(t.hash.replace(/^#/,``));if(!n.has(e))return;n.delete(e),t.hash=n.toString(),globalThis.history?.replaceState(globalThis.history.state,``,t.href)}catch{}}function Rw(e=sw){let t=Iw(e);return t&&Lw(e),t}async function zw(e,t={}){let n=Rw(t.param??`devframe_otp`);return n?e.isTrusted?!0:e.requestTrustWithCode(n):!1}function Bw(e){let t={},n=new WeakMap,r,i=()=>(r??=e.sharedState.get(ow,{initialValue:{}}).then(e=>(t=e.value(),e.on(`updated`,e=>{t=e}),e)),r);return i(),{state:i,has:e=>e in t,keys:()=>Object.keys(t),get:r=>{let i=t[r];if(!i)return;let a=n.get(i);return a||(a={...i,rpc:e.scope(i.scope).rpc},n.set(i,a)),a}}}function Vw(e){let t=new Map,n=new Map,r=new Map,i=new Set,a=e.connectionMeta.backend===`static`;function o(e,t){let n=r.get(e);return n&&typeof n==`object`&&!Array.isArray(n)&&typeof t==`object`&&!Array.isArray(t)?{...n,...t}:t}e.client.register({name:ix.broadcast.clientStateUpdated,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.mutate(()=>o(e,n),r)}}),e.client.register({name:ix.broadcast.clientStatePatch,type:`event`,handler:(e,n,r)=>{let i=t.get(e);i&&!i.syncIds.has(r)&&i.patch(n,r)}});function s(t,n){let r=[];return r.push(n.on(`updated`,(n,r,i)=>{a||(r?e.callEvent(`devframe:rpc:server-state:patch`,t,r,i):e.callEvent(`devframe:rpc:server-state:set`,t,n,i))})),()=>{for(let e of r)e()}}return{keys:()=>Array.from(t.keys()),onKeyAdded(e){return i.add(e),()=>{i.delete(e)}},delete(e){let i=n.get(e);n.delete(e);let a=t.delete(e);return r.delete(e),i?.(),a},get:async(c,l)=>{if(l?.initialValue!==void 0&&r.set(c,l.initialValue),t.has(c))return t.get(c);let u=wC({initialValue:l?.initialValue,enablePatches:!1});async function d(){if(a||e.callEvent(`devframe:rpc:server-state:subscribe`,c),l?.initialValue!==void 0){t.set(c,u);for(let e of i)e(c);return e.call(`devframe:rpc:server-state:get`,c).then(e=>{e!==void 0&&u.mutate(()=>o(c,e))}).catch(e=>{console.error(`Error getting server state`,e)}),n.set(c,s(c,u)),u}{let r=await e.call(`devframe:rpc:server-state:get`,c);u.mutate(()=>o(c,r)),t.set(c,u);for(let e of i)e(c);return n.set(c,s(c,u)),u}}return new Promise(t=>{if(e.isTrusted)d().then(t);else{t(u);let n=!1;e.events.on(ix.client.isTrustedUpdated,e=>{e&&!n&&(n=!0,d())})}})}}}var Hw=new Map;function Uw(e=Hw){let t=new Map;return{serialize:n=>{let r;return n.t===`q`?r=n.m:(r=t.get(n.i),t.delete(n.i)),!(n.t===`s`&&`e`in n)&&r&&e.get(r)?.jsonSerializable===!0?yw(n,r??``):`s:${UC(n)}`},deserialize:e=>{let n=e.startsWith(`s:`)?WC(e.slice(2)):JSON.parse(e);return n.t===`q`&&n.i&&n.m&&t.set(n.i,n.m),n}}}function Ww(){}function Gw(e){let t=e.search(/\n\n|\r\n\r\n/);if(!(t<0))return{frame:e.slice(0,t),rest:e.slice(t+(e[t]===`\r`?4:2))}}function Kw(e){let t=`message`,n=[];for(let r of e.split(/\r?\n/))r.startsWith(`:`)||(r.startsWith(`event:`)?t=r.slice(6).trimStart():r.startsWith(`data:`)&&n.push(r.slice(5).replace(/^ /,``)));return{event:t,data:n}}function qw(e){let{onConnected:t=Ww,onError:n=Ww,onDisconnected:r=Ww,definitions:i,fetch:a=globalThis.fetch.bind(globalThis)}=e,o=e.url;e.authToken&&(o=`${o}${o.includes(`?`)?`&`:`?`}${cw}=${encodeURIComponent(e.authToken)}`);let s=Uw(i),c=new AbortController,l=!1,u,d,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});function h(e){l||(l=!0,p(e),n(e),r())}function g(){l||(l=!0,p(Error(`Devframe SSE stream closed`)),r())}function _(e,n){if(e===`session`){f(n),t();return}u?.(n)}async function ee(e){let t=e.getReader();d=t;let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;for(r+=n.decode(i,{stream:!0});;){let e=Gw(r);if(!e)break;r=e.rest;let{event:t,data:n}=Kw(e.frame);n.length>0&&_(t,n.join(` +`))}}g()}return(async()=>{try{let e=await a(o,{headers:{accept:`text/event-stream`},signal:c.signal});if(!e.ok||!e.body)throw Error(`Devframe SSE stream request failed: ${e.status}`);await ee(e.body)}catch(e){if(c.signal.aborted){g();return}h(e instanceof Error?e:Error(String(e)))}})(),{close:()=>{l=!0,c.abort(),d?.cancel().catch(()=>{})},on:e=>{u=e},post:async e=>{let t;try{t=await m}catch{return}if(l){n(Error(`Devframe SSE channel is closed; message dropped`));return}try{let n=await a(o,{method:`POST`,headers:{"content-type":`text/plain; charset=utf-8`,[iw]:t},body:e});if(n.status===200){let e=await n.text();e&&u?.(e);return}if(!n.ok)throw Error(`Devframe SSE POST failed: ${n.status}`)}catch(e){n(e instanceof Error?e:Error(String(e)))}},serialize:s.serialize,deserialize:s.deserialize}}function Jw(e,t){let{channel:n,rpcOptions:r={}}=t;return _x(e,{...n,timeout:-1,...r,proxify:!1})}function Yw(e){let{transport:t,authToken:n,connectionMeta:r,events:i,clientRpc:a,rpcOptions:o={},callTimeout:s=0}=e,c=!1,l=`connecting`,u=null,d=Promise.withResolvers();function f(e,t=null){if(t?u=t:e===`connected`&&(u=null),e===l)return;let n=l;l=e,i.emit(ix.client.connectionStatus,e,n)}let p=new Set;function m(e){for(let t of[...p])t.reject(e)}function h(){return l===`disconnected`||l===`error`?new Fw(`connection`,`[devframe] Not connected to the devframe server`,{cause:u??void 0}):l===`unauthorized`?new Fw(`auth`,`[devframe] Not authorized by the devframe server`,{cause:u??void 0}):null}function g(e,t){return new Promise((n,r)=>{let a=!1,o,c={reject(e){a||(l(),i.emit(ix.client.error,e,t),r(e))}};function l(){a=!0,p.delete(c),o&&clearTimeout(o)}p.add(c),s>0&&(o=setTimeout(()=>{c.reject(new Fw(`timeout`,`[devframe] RPC call "${t}" timed out after ${s}ms`))},s)),e.then(e=>{a||(l(),n(e))},e=>{if(a)return;l();let n=e instanceof Error?e:Error(String(e));i.emit(ix.client.error,n,t),r(n)})})}let _=new Map;for(let e of r.jsonSerializableMethods??[])_.set(e,{jsonSerializable:!0});let ee=e.createChannel({definitions:_,onError(e){f(`error`,e),i.emit(ix.client.connectionError,e),m(new Fw(`connection`,`[devframe] Connection to the devframe server failed`,{cause:e}))},onDisconnected(){l!==`error`&&f(`disconnected`),m(new Fw(`connection`,`[devframe] Disconnected from the devframe server`,{cause:u??void 0}))}}),v=Jw(a.functions,{channel:ee,rpcOptions:o});a.register({name:ix.broadcast.authRevoked,type:`event`,handler:()=>{c=!1;let e=new Fw(`auth`,`[devframe] The devframe server revoked this client's trust`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e),m(e),i.emit(ix.client.isTrustedUpdated,!1)}});let te=n;async function ne(e){te=e;let t=await v.$call(`anonymous:devframe:auth`,{authToken:e,ua:navigator.userAgent,origin:location.origin});if(c=t.isTrusted,c)d.resolve(!0),f(`connected`);else{let e=new Fw(`auth`,`[devframe] The devframe server refused this client's credentials`);f(`unauthorized`,e),i.emit(ix.client.connectionError,e)}return i.emit(ix.client.isTrustedUpdated,c),t.isTrusted}async function re(e){let t=(await v.$call(`anonymous:devframe:auth:exchange`,{code:e,ua:navigator.userAgent,origin:location.origin}))?.authToken??null;return t&&(te=t,c=!0,d.resolve(!0),f(`connected`),i.emit(ix.client.isTrustedUpdated,!0)),t}async function ie(e={}){await v.$call(`anonymous:devframe:auth:request-code`,{ua:navigator.userAgent,origin:location.origin,...e.reissue?{reissue:!0}:{}})}async function ae(){return c?!0:ne(te??``)}async function oe(e=6e4){if(c&&d.resolve(!0),e<=0)return d.promise;let t;try{return await Promise.race([d.promise,new Promise((n,r)=>{t=setTimeout(()=>{r(Error(`[devframe] Timeout waiting for rpc to be trusted`))},e)})]),c}finally{clearTimeout(t)}}return{transport:t,get isTrusted(){return c},get status(){return l},get connectionError(){return u},requestTrust:ae,requestTrustWithToken:ne,requestTrustWithCode:re,requestAuthCode:ie,ensureTrusted:oe,call:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$call(...e),t)},callEvent:(...e)=>{let t=h();if(t){i.emit(ix.client.error,t,String(e[0]));return}return v.$callEvent(...e)},callOptional:(...e)=>{let t=String(e[0]),n=h();return n?(i.emit(ix.client.error,n,t),Promise.reject(n)):g(v.$callOptional(...e),t)},close:()=>{ee.close()}}}function Xw(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})();if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`;return new URL(e.path??`/`,`${r.protocol}//${t}`).href}return new URL(e.path??``,r).href}let i=e??``;return/^https?:\/\//i.test(i)?i:new URL(i,r).href}function Zw(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},sseOptions:s={},callTimeout:c=0}=e,l=Xw(n.sse,r??`./`,location);return Yw({transport:`sse`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>qw({url:l,authToken:t,definitions:e.definitions,...s,onConnected(){s.onConnected?.()},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(){e.onDisconnected(),s.onDisconnected?.()}})})}function Qw(e){let{name:t,message:n,cause:r,...i}=e,a=r instanceof Error?r:$w(r)?Qw(r):r,o=a===void 0?Error(n):Error(n,{cause:a});return o.name=t,Object.assign(o,i),o}function $w(e){return typeof e==`object`&&!!e&&typeof e.message==`string`&&typeof e.name==`string`}function eT(e){return typeof e==`object`&&!!e&&e.type===`static`&&typeof e.path==`string`}function tT(e){return typeof e==`object`&&!!e&&e.type===`query`&&typeof e.records==`object`&&e.records!==null}function nT(e){return typeof e==`object`&&!!e&&(`output`in e||`error`in e)}function rT(e){if(e.error)throw Qw(e.error);return e.output}function iT(e){return e.some(e=>e!=null)}function aT(e){return typeof e==`object`&&e&&`serialization`in e&&`data`in e?e.data:e}function oT(e,t){let n=new Map,r=new Map;function i(e,t){return t===`structured-clone`&&Array.isArray(e)?HC(e):e}function a(e,t){return i(aT(e),t)}async function o(e){n.has(e.path)||n.set(e.path,t(e.path).then(t=>a(t,e.serialization)));let r=await n.get(e.path);return nT(r)?rT(r):r}async function s(e,n){return r.has(e)||r.set(e,t(e).then(e=>a(e,n))),await r.get(e)}async function c(t,n){if(!(t in e))throw Error(`[devframe-rpc] Function "${t}" not found in dump store`);let r=e[t];if(eT(r)){if(iT(n))throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`);return await o(r)}if(tT(r)){let e=Lx(n),i=r.records[e];if(i)return rT(await s(i,r.serialization));if(r.fallback)return rT(await s(r.fallback,r.serialization));throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}if(!iT(n))return r;throw Error(`[devframe-rpc] No dump match for "${t}" with args: ${JSON.stringify(n)}`)}return{call:async(e,t)=>await c(e,t),callOptional:async(t,n)=>{if(t in e)return await c(t,n)},callEvent:async(e,t)=>{}}}async function sT(e){let t=oT(await e.fetchJsonFromBases(aw),e.fetchJsonFromBases);return{transport:`static`,isTrusted:!0,status:`connected`,connectionError:null,requestTrust:async()=>!0,requestTrustWithToken:async()=>!0,requestTrustWithCode:async()=>null,requestAuthCode:async()=>{},ensureTrusted:async()=>!0,call:(...e)=>t.call(e[0],e.slice(1)),callEvent:(...e)=>t.callEvent(e[0],e.slice(1)),callOptional:(...e)=>t.callOptional(e[0],e.slice(1)),close:()=>{}}}var cT=``;function lT(e,t){return`${e}${cT}${t}`}function uT(e){let t=new Map,n=new Map;e.client.register({name:ix.broadcast.streamingChunk,type:`event`,handler(e,n,r,i){t.get(lT(e,n))?._push(r,i)}}),e.client.register({name:ix.broadcast.streamingEnd,type:`event`,handler(e,n,r){let i=lT(e,n),a=t.get(i);a&&(a._end(r),t.delete(i))}}),e.client.register({name:ix.broadcast.streamingUploadCancel,type:`event`,handler(e,t){let r=lT(e,t),i=n.get(r);i&&(i.abort(`server cancelled upload`),n.delete(r))}}),e.events.on(ix.client.isTrustedUpdated,n=>{if(n)for(let[n,r]of t){if(r.cancelled||r.done)continue;let t=n.indexOf(cT);if(t<0)continue;let i=n.slice(0,t),a=n.slice(t+1);e.callEvent(`devframe:streaming:subscribe`,i,a,{afterSeq:r.lastSeenSeq})}});function r(n,r,i={}){let a=lT(n,r),o=t.get(a);if(o)return o;let s=JC({id:r,highWaterMark:i.highWaterMark,onOverflow(e){console.warn(`[devframe] DF0029: Stream "${n}#${r}" dropped ${e} chunk(s) after exceeding the client high-water mark.`)},onCancel(){e.callEvent(`devframe:streaming:cancel`,n,r),t.delete(a)}});if(t.set(a,s),e.isTrusted)e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:0});else{let i=e.events.on(ix.client.isTrustedUpdated,o=>{o&&(i(),t.has(a)&&!s.cancelled&&!s.done&&e.callEvent(`devframe:streaming:subscribe`,n,r,{afterSeq:s.lastSeenSeq}))})}return s}function i(t,r){let i=lT(t,r),a=n.get(i);if(a)return a;let o=qC({id:r});return o.events.on(`chunk`,(n,i)=>{e.callEvent(`devframe:streaming:upload-chunk`,t,r,n,i)}),o.events.on(`end`,a=>{e.callEvent(`devframe:streaming:upload-end`,t,r,a),n.delete(i)}),n.set(i,o),o}return{subscribe:r,upload:i}}function dT(){}var fT=new Map;function pT(e){let t=e.url;e.authToken&&(t=`${t}?${cw}=${encodeURIComponent(e.authToken)}`);let n=new WebSocket(t),{onConnected:r=dT,onError:i=dT,onDisconnected:a=dT,definitions:o=fT}=e;n.addEventListener(`open`,e=>{r(e)}),n.addEventListener(`error`,e=>{let t=e instanceof Error?e:Error(e.type);i(t)}),n.addEventListener(`close`,e=>{a(e)});let s=Uw(o);return{close:()=>{n.close()},on:e=>{n.addEventListener(`message`,t=>{e(t.data)})},post:e=>{if(n.readyState===WebSocket.OPEN){n.send(e);return}if(n.readyState===WebSocket.CONNECTING){let t=()=>{i(),n.readyState===WebSocket.OPEN&&n.send(e)},r=()=>i();function i(){n.removeEventListener(`open`,t),n.removeEventListener(`close`,r)}n.addEventListener(`open`,t),n.addEventListener(`close`,r);return}i(Error(`Devframe WebSocket is not open; message dropped`))},serialize:s.serialize,deserialize:s.deserialize}}function mT(e,t,n){let r=(()=>{try{return new URL(t,n.href)}catch{return new URL(n.href)}})(),i=r.protocol===`https:`?`wss:`:`ws:`;if(e&&typeof e==`object`){if(e.host!=null||e.port!=null){let t=e.host??`${r.hostname}:${e.port}`,n=new URL(e.path??`/`,`${i}//${t}`);return n.protocol=i,n.href}let t=new URL(e.path??``,r);return t.protocol=i,t.href}if(typeof e==`number`)return`${i}//${r.hostname}:${e}`;let a=e??``;if(/^wss?:\/\//i.test(a))return a;if(/^https?:\/\//i.test(a))return Wx(a,/^https/i.test(a)?`wss://`:`ws://`);let o=new URL(a,r);return o.protocol=i,o.href}function hT(e){let{authToken:t,connectionMeta:n,metaBaseUrl:r,events:i,clientRpc:a,rpcOptions:o={},wsOptions:s={},callTimeout:c=0}=e,l=mT(n.websocket,r??`./`,location);return Yw({transport:`websocket`,authToken:t,connectionMeta:n,events:i,clientRpc:a,rpcOptions:o,callTimeout:c,createChannel:e=>pT({url:l,authToken:t,definitions:e.definitions,...s,onConnected(e){s.onConnected?.(e)},onError(t){e.onError(t),s.onError?.(t)},onDisconnected(t){e.onDisconnected(),s.onDisconnected?.(t)}})})}function gT(e){return e.includes(`:`)}function _T(e,t){return gT(t)?t:`${e}:${t}`}function vT(e){return{async get(t){return(await e()).value()[t]},async set(t,n){(await e()).mutate(e=>{e[t]=n})},async delete(t){(await e()).mutate(e=>{delete e[t]})},async all(){return(await e()).value()},async onChange(t){return(await e()).on(`updated`,e=>t(e))}}}function yT(e,t,n){let r=`devframe:settings:${n}:${t}`,i;function a(){return i||=e.sharedState.get(r,{initialValue:{}}),i}return vT(a)}function bT(e,t){return{global:yT(e,t,`global`),project:yT(e,t,`project`)}}function xT(e,t){return{namespace:t,base:e,rpc:{namespace:t,register(n){if(gT(n.name))throw Error(`[devframe] Scoped client RPC registration for namespace "${t}" received an already-namespaced function name "${n.name}". Pass a bare name without a ":" separator.`);e.client.register({...n,name:`${t}:${n.name}`})},call:((n,...r)=>e.call(_T(t,n),...r)),callEvent:((n,...r)=>e.callEvent(_T(t,n),...r)),callOptional:((n,...r)=>e.callOptional(_T(t,n),...r)),sharedState:((n,r)=>e.sharedState.get(_T(t,n),r)),streaming:{subscribe:(n,r,i)=>e.streaming.subscribe(_T(t,n),r,i),upload:(n,r)=>e.streaming.upload(_T(t,n),r)}},settings:bT(e,t),scope:e.scope}}function ST(){if(typeof document<`u`){let e=document.modelContext;if(e)return e}if(typeof navigator<`u`){let e=navigator.modelContext;if(e)return e}}function CT(e,t={}){let n=t.modelContext??ST();if(!n)return()=>{};let r=n,i=new Map,a=new Map;function o(t,n){let o=ZC(t.name),s=a.get(o);if(s&&s!==t.name){console.warn(`[devframe] WebMCP tool name "${o}" (from "${t.name}") collides with "${s}"; keeping the first registration.`);return}let c=new AbortController,l=vx(t.type,n),u=r.registerTool({name:o,description:n.description,inputSchema:xx(t.args),annotations:{title:n.title??t.name,readOnlyHint:l===`read`,destructiveHint:l===`destructive`},execute:n=>wT(t,e.context,n)},{signal:c.signal});u&&`then`in u&&u.then(()=>{},()=>{}),a.set(o,t.name),i.set(t.name,()=>{c.abort(),u&&`unregister`in u&&typeof u.unregister==`function`&&u.unregister(),a.delete(o)})}function s(t){let n=t?[t]:[...e.definitions.keys()];for(let t of n){i.get(t)?.(),i.delete(t);let n=e.definitions.get(t),r=n?.agent;n&&r&&o(n,r)}}s();let c=e.onChanged(e=>s(e));return()=>{c();for(let e of i.values())e();i.clear()}}async function wT(e,t,n){try{let r=Cx(n,e.args?.length);return{content:[{type:`text`,text:TT(await(await _w(e,t))(...r))}]}}catch(e){return{isError:!0,content:[{type:`text`,text:ET(e)}]}}}function TT(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e,null,2)}function ET(e){if(!(e instanceof Error))return String(e);let t=e.cause instanceof Error?` (cause: ${e.cause.message})`:``;return`${e.name}: ${e.message}${t}`}function DT(e,t){if(t.backend===`static`)return`static`;let n=t.websocket!==void 0,r=t.sse!==void 0;if(e===`websocket`){if(!n)throw Error(`[devframe] transport: 'websocket' was requested, but this server does not advertise a WebSocket endpoint`);return`websocket`}if(e===`sse`){if(!r)throw Error(`[devframe] transport: 'sse' was requested, but this server does not advertise an SSE endpoint`);return`sse`}if(t.backend===`sse`&&r)return`sse`;if(n)return`websocket`;if(r)return`sse`;throw Error(`[devframe] This server advertises no RPC transport (backend "none"), so there is nothing to connect to. Enable the WebSocket or SSE endpoint on the server, or use its static/MCP surfaces instead.`)}async function OT(e={}){let{baseURL:t=`./`,rpcOptions:n={},cacheOptions:r=!1}=e,i=Rx(),a=Array.isArray(t)?t:[t],o=await Pw(e),{connectionMeta:s,metaBaseUrl:c,authToken:l}=o,u=a[0]??`./`;try{u=new URL(`.`,c).href}catch{}let d=new lw({functions:[],...typeof e.cacheOptions==`object`?e.cacheOptions:{}}),f={rpc:void 0},p=new vw(f),m=e.webmcp===!1?void 0:CT(p),h,g=!1;async function _(e){let t=[u,...a.filter(e=>e!==u)].filter(e=>e!=null),n=[];for(let r of t)try{return await fetch(Ux(e,r)).then(t=>{if(!t.ok)throw Error(`Failed to fetch ${e} from ${r}: ${t.status}`);return t.json()})}catch(e){n.push(e)}throw Error(`Failed to load ${e} from ${t.join(`, `)}`,{cause:n})}let ee={authToken:l,connectionMeta:s,metaBaseUrl:c,events:i,clientRpc:p,callTimeout:e.callTimeout,rpcOptions:{...n,async onRequest(e,t,i){if(await n.onRequest?.call(this,e,t,i),r&&d?.validate(e.m)){if(d.has(e.m,e.a))return i(d.cached(e.m,e.a));let n=await t(e);d.apply(e,n)}else await t(e)}}},v=DT(e.transport??`auto`,s),te=v===`static`?await sT({fetchJsonFromBases:_}):v===`sse`?Zw({...ee,sseOptions:e.sseOptions}):hT({...ee,wsOptions:e.wsOptions}),ne;try{ne=new BroadcastChannel(`devframe-auth`)}catch{}let re,ie=!1;function ae(e){return((...t)=>ie||!re?e(...t):re.then(()=>e(...t)))}function oe(){g=!0;try{h?.(),m?.()}finally{try{ne?.close()}finally{te.close?.()}}}let se={events:i,get isTrusted(){return te.isTrusted},get status(){return te.status},get connectionError(){return te.connectionError},get transport(){return te.transport??v},get connection(){return o},connectionMeta:s,ensureTrusted:te.ensureTrusted,requestTrust:te.requestTrust,requestTrustWithToken:async e=>(Aw(e),o={...o,authToken:e},te.requestTrustWithToken(e)),requestTrustWithCode:async e=>{let t=await te.requestTrustWithCode(e);if(!t)return!1;Aw(t),o={...o,authToken:t};try{ne?.postMessage({type:`auth-update`,authToken:t})}catch{}return!0},requestAuthCode:e=>te.requestAuthCode(e),call:ae(te.call),callEvent:ae(te.callEvent),callOptional:ae(te.callOptional),client:p,sharedState:void 0,services:void 0,streaming:void 0,cacheManager:d,scope:void 0,close:oe};se.sharedState=Vw(se),se.streaming=uT(se),se.services=Bw(se);let ce=new Map;se.scope=(e=>{if(!e)return se;let t=ce.get(e);return t||(t=xT(se,e),ce.set(e,t)),t}),f.rpc=se;function le(){try{return typeof window<`u`&&window.self===window.top}catch{return!1}}async function ue(){if(e.simpleAuth!==!1&&le()&&typeof globalThis.prompt==`function`)for(await se.requestAuthCode().catch(()=>{});!se.isTrusted;){let e=globalThis.prompt(`devframe: enter the authentication code shown in your terminal`);if(e==null)return;let t=e.trim();if(t&&await se.requestTrustWithCode(t))return}}async function de(){let t=await te.requestTrust(),n=e.otpParam??`devframe_otp`,r=n?await zw(se,{param:n}):!1;t||r||se.isTrusted||await ue()}return re=de().then(()=>{ie=!0},()=>{ie=!0}),s.mcp&&tw(async()=>{let{setupBrowserAgentRpcBridge:e}=await import(`./browser-agent-rpc-BXhoSh1z-CkzEjDUc.js`);return{setupBrowserAgentRpcBridge:e}},[],import.meta.url).then(({setupBrowserAgentRpcBridge:e})=>{g||(h=e(se))}).catch(()=>{}),ne&&(ne.onmessage=e=>{e.data?.type===`auth-update`&&e.data.authToken&&se.requestTrustWithToken(e.data.authToken)}),se}var kT=OT,AT=[`components`,`injectors`,`signals`,`ngrx`,`forms`,`router`,`pipes`,`http`,`analog`],jT=[`forms`,`router`,`ngrx`,`http`,`analog`],MT={refreshMs:{default:3e3,min:500,max:8e3},navigations:{default:50,min:5,max:500},formTimeline:{default:200,min:10,max:2e3},httpCalls:{default:200,min:10,max:2e3},changeLog:{default:200,min:10,max:2e3},cdCycles:{default:200,min:10,max:2e3}},NT=`ng-devtools`;function PT(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function FT(e,t){return typeof e==`boolean`?e:t}var IT=100,LT=100;function RT(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e&&e.length<=LT);return[...new Set(t)].slice(0,IT)}function zT(e,t){let{default:n,min:r,max:i}=MT[t];return typeof e!=`number`||!Number.isFinite(e)?n:Math.min(i,Math.max(r,Math.round(e)))}function BT(e,t){return Object.fromEntries(e.map(e=>[e,t(e)]))}function VT(e){let t=PT(e),n=PT(t.agent),r=PT(t.inspectors),i=PT(n.tools),a=PT(t.actions),o=FT(t.actions,!0),s=PT(t.redaction),c=PT(t.limits),l=BT(AT,e=>FT(r[e],!0));return{inspectors:l,agent:{readOnly:FT(n.readOnly,!1),tools:BT(AT,e=>l[e]&&FT(i[e],!0))},actions:BT(jT,e=>l[e]&&FT(a[e],o)),redaction:{secretNames:RT(s.secretNames),unmask:RT(s.unmask)},limits:Object.fromEntries(Object.keys(MT).map(e=>[e,zT(c[e],e)]))}}function HT(e){let t=e?.configs;return VT(t?.[NT])}function UT(e){return`${{forms:`Writing to forms`,router:`Navigating`,ngrx:`Restoring NgRx state and dispatching actions`,http:`Changing HTTP mock rules and clearing HTTP calls`,analog:`Calling API routes`}[e]} is turned off in the devtools config (actions.${e}).`}var WT={components:`Components`,injectors:`Injectors`,signals:`Signals`,ngrx:`NgRx`,forms:`Forms`,router:`Router`,pipes:`Pipes`,http:`HTTP`,analog:`Analog`},GT={forms:`Form writes`,router:`Navigation`,ngrx:`NgRx restore and dispatch`,http:`HTTP mocking`,analog:`Analog API calls`},KT={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`};function qT(e){let t=[],n=(e,n)=>{n.length&&t.push({label:e,value:n.join(`, `)})},r=AT.filter(t=>e.inspectors[t]);return n(`Inspectors off`,AT.filter(t=>!e.inspectors[t]).map(e=>WT[e])),n(`Agent`,e.agent.readOnly?[`Read-only`]:[]),n(`Hidden from the agent`,r.filter(t=>!e.agent.tools[t]).map(e=>WT[e])),n(`Blocked actions`,jT.filter(t=>e.inspectors[t]&&!e.actions[t]).map(e=>GT[e])),n(`Extra secret names`,e.redaction.secretNames),n(`Unmasked names`,e.redaction.unmask),n(`Limits`,Object.keys(MT).filter(t=>e.limits[t]!==MT[t].default).map(t=>KT[t](e.limits[t]))),t}var JT=`ng-devtools-page-id`;function YT(){try{return new URLSearchParams(location.search).get(`pageId`)||(window.top===window?null:sessionStorage.getItem(JT)||null)}catch{return null}}function XT(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 ZT(e,t){return e?t?e.pages?.[t]??null:e:null}function QT(e,t){return e?t?e.pages?.[t]??null:e.graph??null:null}function $T(e,t,n){return e?e.scope(`ng-devtools`).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(`ng-devtools`).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){return HT(e?.connectionMeta)}function iE(e,t){return rE(e).actions[t]}var aE={components:`components`,routes:`router`,signals:`signals`,injectors:`injectors`,store:`ngrx`,forms:`forms`,pipes:`pipes`,network:`http`,analog:`analog`};function oE(e,t){let n=aE[e];return!n||t.inspectors[n]}function sE(e,t){e&1&&(fs(),Fg(0,`rect`,3)(1,`rect`,4)(2,`rect`,5)(3,`rect`,6))}function cE(e,t){e&1&&(fs(),Fg(0,`path`,7)(1,`path`,8)(2,`path`,9))}function lE(e,t){e&1&&(fs(),Fg(0,`circle`,10)(1,`path`,11)(2,`circle`,12))}function uE(e,t){e&1&&(fs(),Fg(0,`path`,1))}function dE(e,t){e&1&&(fs(),Fg(0,`path`,13)(1,`path`,14)(2,`path`,15)(3,`path`,16))}function fE(e,t){e&1&&(fs(),Fg(0,`ellipse`,17)(1,`path`,18)(2,`path`,19))}function pE(e,t){e&1&&(fs(),Fg(0,`rect`,20)(1,`path`,21)(2,`path`,22)(3,`path`,23))}function mE(e,t){e&1&&(fs(),Fg(0,`circle`,24)(1,`path`,25)(2,`path`,26))}function hE(e,t){e&1&&(fs(),Fg(0,`path`,27)(1,`path`,28)(2,`path`,29)(3,`path`,30)(4,`circle`,31))}function gE(e,t){e&1&&(fs(),Fg(0,`path`,2))}var _E=class e{name=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-tab-icon`]],inputs:{name:[1,`name`]},decls:11,vars:1,consts:[[`viewBox`,`0 0 24 24`,`width`,`16`,`height`,`16`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`1.8`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`,`aria-hidden`,`true`],[`d`,`M22 12h-4l-3 9L9 3l-3 9H2`],[`d`,`m8 3 4 8 5-5 5 15H2L8 3z`],[`x`,`3`,`y`,`3`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`14`,`y`,`3`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`x`,`14`,`y`,`12`,`width`,`7`,`height`,`9`,`rx`,`1.5`],[`x`,`3`,`y`,`16`,`width`,`7`,`height`,`5`,`rx`,`1.5`],[`d`,`M12 2 3 7l9 5 9-5-9-5Z`],[`d`,`m3 12 9 5 9-5`],[`d`,`m3 17 9 5 9-5`],[`cx`,`6`,`cy`,`19`,`r`,`3`],[`d`,`M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15`],[`cx`,`18`,`cy`,`5`,`r`,`3`],[`d`,`M12 22v-5`],[`d`,`M9 8V2`],[`d`,`M15 8V2`],[`d`,`M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z`],[`cx`,`12`,`cy`,`5`,`rx`,`9`,`ry`,`3`],[`d`,`M3 5v14a9 3 0 0 0 18 0V5`],[`d`,`M3 12a9 3 0 0 0 18 0`],[`x`,`3`,`y`,`4`,`width`,`18`,`height`,`16`,`rx`,`2`],[`d`,`M7 9h10`],[`d`,`M7 13h6`],[`d`,`M7 17h8`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M3 12h18`],[`d`,`M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18Z`],[`d`,`M4 7h10`],[`d`,`M4 17h6`],[`d`,`m14 13 4 4-4 4`],[`d`,`M10 17h8`],[`cx`,`18`,`cy`,`7`,`r`,`3`]],template:function(e,t){if(e&1&&(fs(),H(0,`svg`,0),P(1,sE,4,0)(2,cE,3,0)(3,lE,3,0)(4,uE,1,0,`:svg:path`,1)(5,dE,4,0)(6,fE,3,0)(7,pE,4,0)(8,mE,3,0)(9,hE,5,0)(10,gE,1,0,`:svg:path`,2),U()),e&2){let e;M(),F((e=t.name())===`dashboard`?1:e===`components`?2:e===`routes`?3:e===`signals`?4:e===`injectors`?5:e===`store`?6:e===`forms`?7:e===`network`?8:e===`pipes`?9:e===`analog`?10:-1)}},styles:[`[_nghost-%COMP%] { display: inline-flex; flex-shrink: 0; -}`]})},gE=(e,t)=>t.tab,_E=(e,t)=>t.label;function vE(e,t){e&1&&J(0),e&2&&X(` `,K().meta()?.projectName,` `)}function yE(e,t){e&1&&J(0,` Project details unavailable `)}function bE(e,t){e&1&&J(0,` Loading… `)}function xE(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function SE(e,t){e&1&&J(0,` Check that the dev server is running, then reload the panel. `)}function CE(e,t){if(e&1&&(z(0,`p`,4),P(1,xE,4,0)(2,SE,1,0),B()),e&2){let e=K();M(),F(e.staticReport()?1:2)}}function wE(e,t){e&1&&(z(0,`li`,6)(1,`span`),J(2,`Analog`),B(),J(3),B()),e&2&&(M(3),Y(t))}function TE(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K().$implicit,t=K();M(),Y(t.cards()[e.tab]?.value),M(2),Y(t.cards()[e.tab]?.sub)}}function EE(e,t){e&1&&(z(0,`span`,19),J(1,`–`),B(),z(2,`span`,18),J(3,`Count unavailable`),B())}function DE(e,t){e&1&&(V(0,`span`,20),z(1,`span`,18),J(2,`Counting…`),B())}function OE(e,t){if(e&1){let e=W();z(0,`button`,11),G(`click`,function(){let t=k(e).$implicit;return A(K().navigate.emit(t.tab))}),z(1,`span`,12)(2,`span`,13),V(3,`app-tab-icon`,14),B(),z(4,`span`,15),J(5,`→`),B()(),z(6,`span`,16),J(7),B(),P(8,TE,4,2)(9,EE,4,0)(10,DE,3,0),B()}if(e&2){let e,n=t.$implicit,r=t.$index,i=K().stateOf(n.tab);C_(`animation-delay`,60*r,`ms`),N(`aria-busy`,i===`loading`),M(3),R(`name`,n.tab),M(4),Y(n.label),M(),F((e=i)===`ready`?8:e===`error`?9:10)}}function kE(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2),B(),z(3,`dd`),J(4),B()()),e&2){let e=t.$implicit;M(2),Y(e.label),M(2),Y(e.value)}}function AE(e,t){if(e&1&&(z(0,`dl`),I(1,kE,5,2,`div`,null,_E),B()),e&2){let e=K();M(),L(e.configItems())}}function jE(e,t){e&1&&(z(0,`p`),J(1,`Defaults`),B())}var ME=[{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`}],NE=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),PE={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 FE(e,t,n){return`${e} ${e===1?t:n}`}function IE(e,t){for(let n of e??[])t(n),IE(n.children,t)}function LE(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 · ${FE(t,`directive`,`directives`)}`}}function RE(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 · ${FE(t,`redirect`,`redirects`)}`}}function zE(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]=PE[e]??[e,e];return FE(t,n,r)});return{value:e.length,sub:n.join(` · `)}}var BE=class e{rpc=$(null);navigate=Dv();staticReport=Q(()=>eE(this.rpc()));meta=j(null);config=Q(()=>tE(this.rpc()));stats=Q(()=>ME.filter(e=>iE(e.tab,this.config())));configItems=Q(()=>KT(this.config()));metaState=j(`loading`);states=j({});rows=j({});injectorTree=j(null);signalGraph=j(null);pageId=JT();destroyRef=E(Cs);stopLive=[];liveInjectors=Q(()=>{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 IE(e.roots,r),IE(e.environment,r),{injectors:t,providers:n}});liveSignals=Q(()=>{let e=ZT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>NE.has(e.kind??``)).length:null});cards=Q(()=>{let e=this.rows(),t={};if(e.components&&(t.components=LE(e.components)),e.routes&&(t.routes=RE(e.routes)),e.store&&(t.store=zE(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();return r?t.injectors={value:r.injectors,sub:`live injectors · ${FE(r.providers,`provider`,`providers`)}`}:e.injectors&&(t.injectors={value:e.injectors.filter(e=>e.type!==`injection`).length,sub:`provider declarations in source`}),t});constructor(){uc(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`ng-devtools`);this.metaState.set(`loading`),this.states.set({}),this.rows.set({}),t.rpc.call(`build-meta`).then(e=>{this.meta.set(e),this.metaState.set(`ready`)}).catch(()=>this.metaState.set(`error`));let n=tE(e),r=e=>iE(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(`ng-devtools`).rpc,r=async(t,r)=>{try{let i=await n.sharedState(t);if(this.destroyRef.destroyed||this.rpc()!==e)return;r(i.value()),this.stopLive.push(i.on(`updated`,e=>r(e)))}catch{r(null)}};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))])}unwatch(){for(let e of this.stopLive.splice(0))e()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:31,vars:12,consts:[[`aria-labelledby`,`project-title`,1,`project`],[1,`project-head`],[1,`eyebrow`],[`id`,`project-title`],[1,`hint`],[1,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[`type`,`button`,1,`stat`,3,`click`],[1,`top`],[1,`icon`],[3,`name`],[`aria-hidden`,`true`,1,`go`],[1,`label`],[1,`big`],[1,`sub`],[1,`big`,`muted`],[`aria-hidden`,`true`,1,`big`,`skeleton`]],template:function(e,t){if(e&1&&(z(0,`section`,0)(1,`div`,1)(2,`p`,2),J(3,`Project`),B(),z(4,`h2`,3),P(5,vE,1,1)(6,yE,1,0)(7,bE,1,0),B(),P(8,CE,3,1,`p`,4),B(),z(9,`ul`,5)(10,`li`)(11,`span`),J(12,`Angular`),B(),J(13),B(),z(14,`li`)(15,`span`),J(16,`TypeScript`),B(),J(17),B(),z(18,`li`)(19,`span`),J(20,`SSR`),B(),J(21),B(),P(22,wE,4,1,`li`,6),B()(),z(23,`div`,7),I(24,OE,11,6,`button`,8,gE),B(),z(26,`section`,9)(27,`h2`,10),J(28,`Configuration`),B(),P(29,AE,3,0,`dl`)(30,jE,2,0,`p`),B()),e&2){let e,n;N(`aria-busy`,t.metaState()===`loading`),M(4),q(`muted`,t.metaState()!==`ready`),M(),F((e=t.metaState())===`ready`?5:e===`error`?6:7),M(3),F(t.metaState()===`error`?8:-1),M(),q(`pending`,t.metaState()===`loading`),M(4),Y(t.meta()?.angularVersion??`…`),M(4),Y(t.meta()?.typescript??`…`),M(4),Y(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),M(),F((n=t.meta()?.analog)?22:-1,n),M(2),L(t.stats()),M(5),F(t.configItems().length?29:30)}},dependencies:[hE],styles:[`[_nghost-%COMP%] { +}`]})},vE=(e,t)=>t.tab,yE=(e,t)=>t.label;function bE(e,t){e&1&&J(0),e&2&&X(` `,K().meta()?.projectName,` `)}function xE(e,t){e&1&&J(0,` Project details unavailable `)}function SE(e,t){e&1&&J(0,` Loading… `)}function CE(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function wE(e,t){e&1&&J(0,` Check that the dev server is running, then reload the panel. `)}function TE(e,t){if(e&1&&(z(0,`p`,4),P(1,CE,4,0)(2,wE,1,0),B()),e&2){let e=K();M(),F(e.staticReport()?1:2)}}function EE(e,t){e&1&&(z(0,`li`,6)(1,`span`),J(2,`Analog`),B(),J(3),B()),e&2&&(M(3),Y(t))}function DE(e,t){e&1&&(z(0,`li`)(1,`span`),J(2,`Change detection`),B(),J(3),B()),e&2&&(M(3),Y(t))}function OE(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K().$implicit,t=K();M(),Y(t.cards()[e.tab]?.value),M(2),Y(t.cards()[e.tab]?.sub)}}function kE(e,t){e&1&&(z(0,`span`,19),J(1,`–`),B(),z(2,`span`,18),J(3,`Count unavailable`),B())}function AE(e,t){e&1&&(V(0,`span`,20),z(1,`span`,18),J(2,`Counting…`),B())}function jE(e,t){if(e&1){let e=W();z(0,`button`,11),G(`click`,function(){let t=k(e).$implicit;return A(K().navigate.emit(t.tab))}),z(1,`span`,12)(2,`span`,13),V(3,`app-tab-icon`,14),B(),z(4,`span`,15),J(5,`→`),B()(),z(6,`span`,16),J(7),B(),P(8,OE,4,2)(9,kE,4,0)(10,AE,3,0),B()}if(e&2){let e,n=t.$implicit,r=t.$index,i=K().stateOf(n.tab);C_(`animation-delay`,60*r,`ms`),N(`aria-busy`,i===`loading`),M(3),R(`name`,n.tab),M(4),Y(n.label),M(),F((e=i)===`ready`?8:e===`error`?9:10)}}function ME(e,t){e&1&&(z(0,`p`),J(1,`Loading…`),B())}function NE(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2),B(),z(3,`dd`),J(4),B()()),e&2){let e=t.$implicit;M(2),Y(e.label),M(2),Y(e.value)}}function PE(e,t){if(e&1&&(z(0,`dl`),I(1,NE,5,2,`div`,null,yE),B()),e&2){let e=K();M(),L(e.configItems())}}function FE(e,t){e&1&&(z(0,`p`),J(1,`Defaults`),B())}var IE=[{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`}],LE={zoneless:`Zoneless`,zone:`zone.js`,"zone-unused":`Zoneless, zone.js loaded`};function RE(e){return e&&Object.hasOwn(LE,e)?LE[e]:null}var zE=new Set([`signal`,`computed`,`linkedSignal`,`effect`]),BE={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 VE(e,t,n){return`${e} ${e===1?t:n}`}function HE(e,t){for(let n of e??[])t(n),HE(n.children,t)}function UE(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 · ${VE(t,`directive`,`directives`)}`}}function WE(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 · ${VE(t,`redirect`,`redirects`)}`}}function GE(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]=BE[e]??[e,e];return VE(t,n,r)});return{value:e.length,sub:n.join(` · `)}}var KE=class e{rpc=$(null);navigate=Ov();staticReport=Q(()=>tE(this.rpc()));meta=j(null);config=Q(()=>rE(this.rpc()));stats=Q(()=>this.rpc()?IE.filter(e=>oE(e.tab,this.config())):[]);configItems=Q(()=>qT(this.config()));metaState=j(`loading`);states=j({});rows=j({});injectorTree=j(null);signalGraph=j(null);pageId=YT();destroyRef=E(Cs);stopLive=[];zone=Q(()=>RE(ZT(this.injectorTree(),this.pageId)?.zone));liveInjectors=Q(()=>{let e=ZT(this.injectorTree(),this.pageId);if(!e?.roots?.length)return null;let t=0,n=0,r=e=>{t++,n+=e.providers?.length??0};return HE(e.roots,r),HE(e.environment,r),{injectors:t,providers:n}});liveSignals=Q(()=>{let e=QT(this.signalGraph(),this.pageId);return e?.nodes?.length?e.nodes.filter(e=>zE.has(e.kind??``)).length:null});cards=Q(()=>{let e=this.rows(),t={};if(e.components&&(t.components=UE(e.components)),e.routes&&(t.routes=WE(e.routes)),e.store&&(t.store=GE(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();return r?t.injectors={value:r.injectors,sub:`live injectors · ${VE(r.providers,`provider`,`providers`)}`}:e.injectors&&(t.injectors={value:e.injectors.filter(e=>e.type!==`injection`).length,sub:`provider declarations in source`}),t});constructor(){uc(()=>{let e=this.rpc();if(!e)return;let t=e.scope(`ng-devtools`);this.metaState.set(`loading`),this.states.set({}),this.rows.set({}),t.rpc.call(`build-meta`).then(e=>{this.meta.set(e),this.metaState.set(`ready`)}).catch(()=>this.metaState.set(`error`));let n=rE(e),r=e=>oE(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(`ng-devtools`).rpc,r=async(t,r)=>{try{let i=await n.sharedState(t);if(this.destroyRef.destroyed||this.rpc()!==e)return;r(i.value()),this.stopLive.push(i.on(`updated`,e=>r(e)))}catch{r(null)}};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))])}unwatch(){for(let e of this.stopLive.splice(0))e()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-dashboard`]],inputs:{rpc:[1,`rpc`]},outputs:{navigate:`navigate`},decls:33,vars:14,consts:[[`aria-labelledby`,`project-title`,1,`project`],[1,`project-head`],[1,`eyebrow`],[`id`,`project-title`],[1,`hint`],[1,`chips`],[1,`analog`],[1,`grid`],[`type`,`button`,1,`stat`,3,`animation-delay`],[`aria-labelledby`,`config-title`,1,`config`],[`id`,`config-title`],[`type`,`button`,1,`stat`,3,`click`],[1,`top`],[1,`icon`],[3,`name`],[`aria-hidden`,`true`,1,`go`],[1,`label`],[1,`big`],[1,`sub`],[1,`big`,`muted`],[`aria-hidden`,`true`,1,`big`,`skeleton`]],template:function(e,t){if(e&1&&(z(0,`section`,0)(1,`div`,1)(2,`p`,2),J(3,`Project`),B(),z(4,`h2`,3),P(5,bE,1,1)(6,xE,1,0)(7,SE,1,0),B(),P(8,TE,3,1,`p`,4),B(),z(9,`ul`,5)(10,`li`)(11,`span`),J(12,`Angular`),B(),J(13),B(),z(14,`li`)(15,`span`),J(16,`TypeScript`),B(),J(17),B(),z(18,`li`)(19,`span`),J(20,`SSR`),B(),J(21),B(),P(22,EE,4,1,`li`,6),P(23,DE,4,1,`li`),B()(),z(24,`div`,7),I(25,jE,11,6,`button`,8,vE),B(),z(27,`section`,9)(28,`h2`,10),J(29,`Configuration`),B(),P(30,ME,2,0,`p`)(31,PE,3,0,`dl`)(32,FE,2,0,`p`),B()),e&2){let e,n,r;N(`aria-busy`,t.metaState()===`loading`),M(4),q(`muted`,t.metaState()!==`ready`),M(),F((e=t.metaState())===`ready`?5:e===`error`?6:7),M(3),F(t.metaState()===`error`?8:-1),M(),q(`pending`,t.metaState()===`loading`),M(4),Y(t.meta()?.angularVersion??`…`),M(4),Y(t.meta()?.typescript??`…`),M(4),Y(t.meta()?t.meta()?.ssr?`On`:`Off`:`…`),M(),F((n=t.meta()?.analog)?22:-1,n),M(),F((r=t.zone())?23:-1,r),M(2),L(t.stats()),M(2),N(`aria-busy`,!t.rpc()),M(3),F(t.rpc()?t.configItems().length?31:32:30)}},dependencies:[_E],styles:[`[_nghost-%COMP%] { display: block; max-width: 1200px; } @@ -302,7 +302,7 @@ h2.muted[_ngcontent-%COMP%] { .skeleton[_ngcontent-%COMP%] { animation: none; } -}`]})},VE=[`trigger`],HE=[`list`],UE=(e,t)=>t.value;function WE(e,t){if(e&1&&(H(0,`span`,4),J(1),U()),e&2){let e=K();M(),Y(e.current().hint)}}function GE(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.hint)}}function KE(e,t){if(e&1){let e=W();H(0,`li`,11),Qg(`pointerenter`,function(){let t=k(e).$index;return A(K(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=k(e).$index;return A(K(2).choose(t))}),fs(),H(1,`svg`,12),Fg(2,`path`,13),U(),ps(),H(3,`span`,14),J(4),U(),P(5,GE,2,1,`span`,15),U()}if(e&2){let e=t.$implicit,n=t.$index,r=K(2);q(`active`,n===r.active())(`selected`,e.value===r.value()),N(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),M(4),Y(e.label),M(),F(e.hint?5:-1)}}function qE(e,t){if(e&1&&(H(0,`li`,10),J(1),U()),e&2){let e=K(2);M(),Y(e.emptyText())}}function JE(e,t){if(e&1&&(H(0,`ul`,8,1),dg(`list-in`),I(2,KE,6,9,`li`,9,UE,!1,qE,2,1,`li`,10),U()),e&2){let e=K();q(`up`,e.dropUp()),N(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),M(2),L(e.options())}}var YE=0,XE=class e{options=$.required();value=Pv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++YE}`;open=j(!1);active=j(-1);dropUp=j(!1);current=Q(()=>this.options().find(e=>e.value===this.value())??null);host=E(Ml);injector=E(xs);trigger=Lv.required(`trigger`);list=Lv(`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=Bh({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&e_(t.trigger,VE,5)(t.list,HE,5),e&2&&t_(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&G(`pointerdown`,function(e){return t.onOutside(e)},Mu),e&2&&q(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:12,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`],[`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&&(H(0,`button`,2,0),Qg(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),H(2,`span`,3),J(3),U(),P(4,WE,2,1,`span`,4),fs(),H(5,`svg`,5),Fg(6,`path`,6),U()(),P(7,JE,5,5,`ul`,7)),e&2&&(Vg(`disabled`,t.disabled()),N(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),M(2),q(`placeholder`,!t.current()),M(),X(` `,t.current()?.label??t.placeholder(),` `),M(),F(t.current()?.hint?4:-1),M(3),F(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { +}`]})},qE=[`trigger`],JE=[`list`],YE=(e,t)=>t.value;function XE(e,t){if(e&1&&(H(0,`span`,4),J(1),U()),e&2){let e=K();M(),Y(e.current().hint)}}function ZE(e,t){if(e&1&&(H(0,`span`,15),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.hint)}}function QE(e,t){if(e&1){let e=W();H(0,`li`,11),Qg(`pointerenter`,function(){let t=k(e).$index;return A(K(2).active.set(t))})(`pointerdown`,function(e){return e.preventDefault()})(`click`,function(){let t=k(e).$index;return A(K(2).choose(t))}),fs(),H(1,`svg`,12),Fg(2,`path`,13),U(),ps(),H(3,`span`,14),J(4),U(),P(5,ZE,2,1,`span`,15),U()}if(e&2){let e=t.$implicit,n=t.$index,r=K(2);q(`active`,n===r.active())(`selected`,e.value===r.value()),N(`id`,r.uid+`-opt-`+n)(`aria-selected`,e.value===r.value())(`aria-disabled`,e.disabled||null),M(4),Y(e.label),M(),F(e.hint?5:-1)}}function $E(e,t){if(e&1&&(H(0,`li`,10),J(1),U()),e&2){let e=K(2);M(),Y(e.emptyText())}}function eD(e,t){if(e&1&&(H(0,`ul`,8,1),dg(`list-in`),I(2,QE,6,9,`li`,9,YE,!1,$E,2,1,`li`,10),U()),e&2){let e=K();q(`up`,e.dropUp()),N(`id`,e.uid+`-list`)(`aria-labelledby`,e.labelledBy()||e.uid+`-trigger`),M(2),L(e.options())}}var tD=0,nD=class e{options=$.required();value=Fv(null);placeholder=$(`Select…`);ariaLabel=$(``);labelledBy=$(``);disabled=$(!1);emptyText=$(`Nothing to choose`);uid=`app-select-${++tD}`;open=j(!1);active=j(-1);dropUp=j(!1);current=Q(()=>this.options().find(e=>e.value===this.value())??null);host=E(Ml);injector=E(xs);trigger=Rv.required(`trigger`);list=Rv(`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=Bh({type:e,selectors:[[`app-select`]],viewQuery:function(e,t){e&1&&e_(t.trigger,qE,5)(t.list,JE,5),e&2&&t_(2)},hostAttrs:[1,`app-select`],hostVars:2,hostBindings:function(e,t){e&1&&G(`pointerdown`,function(e){return t.onOutside(e)},Mu),e&2&&q(`open`,t.open())},inputs:{options:[1,`options`],value:[1,`value`],placeholder:[1,`placeholder`],ariaLabel:[1,`ariaLabel`],labelledBy:[1,`labelledBy`],disabled:[1,`disabled`],emptyText:[1,`emptyText`]},outputs:{value:`valueChange`},decls:8,vars:12,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`],[`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&&(H(0,`button`,2,0),Qg(`click`,function(){return t.toggle()})(`keydown`,function(e){return t.onKey(e)})(`blur`,function(e){return t.onBlur(e)}),H(2,`span`,3),J(3),U(),P(4,XE,2,1,`span`,4),fs(),H(5,`svg`,5),Fg(6,`path`,6),U()(),P(7,eD,5,5,`ul`,7)),e&2&&(Vg(`disabled`,t.disabled()),N(`id`,t.uid+`-trigger`)(`aria-controls`,t.uid+`-list`)(`aria-expanded`,t.open())(`aria-label`,t.ariaLabel()||null)(`aria-labelledby`,t.labelledBy()||null)(`aria-activedescendant`,t.open()&&t.active()>=0?t.uid+`-opt-`+t.active():null),M(2),q(`placeholder`,!t.current()),M(),X(` `,t.current()?.label??t.placeholder(),` `),M(),F(t.current()?.hint?4:-1),M(3),F(t.open()?7:-1))},styles:[`[_nghost-%COMP%] { position: relative; display: inline-flex; min-width: 0; @@ -489,7 +489,7 @@ li.selected[_ngcontent-%COMP%] .check[_ngcontent-%COMP%] { .chevron[_ngcontent-%COMP%] { transition: none; } -}`]})};function ZE(e,t){let n=t.trim().toLowerCase();if(!n)return{nodes:e,matches:0};let r=0,i=e=>e.name.toLowerCase().includes(n)||e.tag.toLowerCase().includes(n)||!!e.directives?.some(e=>e.toLowerCase().includes(n)),a=e=>e.flatMap(e=>{let t=i(e);t&&r++;let n=a(e.children);return t||n.length?[{...e,children:n}]:[]});return{nodes:a(e),matches:r}}function QE(e,t,n){return n?`${t} of ${e}`:`${e} ${e===1?`instance`:`instances`}`}function $E(e,t,n){return n.trim()?t?`${t} of ${e} ${e===1?`instance`:`instances`} match.`:`No components match.`:``}function eD(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&&!tD(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function tD(e,t){return e.some(e=>e.id===t||tD(e.children,t))}function nD(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}function rD(e){return new Date(e).toLocaleTimeString()}function iD(e,t){if(e&1&&(H(0,`p`,0),J(1),H(2,`code`),J(3),U(),J(4,` to keep more. `),H(5,`a`,1),J(6,`About limits`),U()()),e&2){let e=K();M(),X_(` Showing the latest `,e.max(),` `,e.what(),`. `,e.dropped(),` older `,e.dropped()===1?`entry was`:`entries were`,` dropped. Raise `),M(2),X(`limits.`,e.limit()),M(2),Vg(`href`,e.docsUrl,ku)}}var aD=`https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/getting-started/configuration.md#limits`,oD=class e{dropped=$(0);max=$.required();what=$.required();limit=$.required();docsUrl=aD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-limit-note`]],inputs:{dropped:[1,`dropped`],max:[1,`max`],what:[1,`what`],limit:[1,`limit`]},decls:1,vars:1,consts:[[1,`note`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&P(0,iD,7,6,`p`,0),e&2&&F(t.dropped()>0?0:-1)},styles:[`[_nghost-%COMP%] { +}`]})};function rD(e,t){let n=t.trim().toLowerCase();if(!n)return{nodes:e,matches:0};let r=0,i=e=>e.name.toLowerCase().includes(n)||e.tag.toLowerCase().includes(n)||!!e.directives?.some(e=>e.toLowerCase().includes(n)),a=e=>e.flatMap(e=>{let t=i(e);t&&r++;let n=a(e.children);return t||n.length?[{...e,children:n}]:[]});return{nodes:a(e),matches:r}}function iD(e,t,n,r=!1){let i=r?`${e}+`:`${e}`;return n?`${t} of ${i}`:`${i} ${e===1&&!r?`instance`:`instances`}`}function aD(e,t,n,r=!1){return n.trim()?t?`${t} of ${r?`${e}+`:`${e}`} ${e===1&&!r?`instance`:`instances`} match.`:`No components match.`:``}function oD(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 sD(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&&!cD(t.roots,i)?{pageId:r,selectedId:null,detailId:n,destroyed:i}:{pageId:r,selectedId:i,detailId:n,destroyed:null}}function cD(e,t){return e.some(e=>e.id===t||cD(e.children,t))}function lD(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}function uD(e){return new Date(e).toLocaleTimeString()}function dD(e,t){if(e&1&&(H(0,`p`,0),J(1),H(2,`code`),J(3),U(),J(4,` to keep more. `),H(5,`a`,1),J(6,`About limits`),U()()),e&2){let e=K();M(),X_(` Showing the latest `,e.max(),` `,e.what(),`. `,e.dropped(),` older `,e.dropped()===1?`entry was`:`entries were`,` dropped. Raise `),M(2),X(`limits.`,e.limit()),M(2),Vg(`href`,e.docsUrl,ku)}}var fD=`https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/getting-started/configuration.md#limits`,pD=class e{dropped=$(0);max=$.required();what=$.required();limit=$.required();docsUrl=fD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-limit-note`]],inputs:{dropped:[1,`dropped`],max:[1,`max`],what:[1,`what`],limit:[1,`limit`]},decls:1,vars:1,consts:[[1,`note`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&P(0,dD,7,6,`p`,0),e&2&&F(t.dropped()>0?0:-1)},styles:[`[_nghost-%COMP%] { display: block; } @@ -516,7 +516,7 @@ a[_ngcontent-%COMP%] { a[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; -}`]})},sD=(e,t)=>t.name,cD=(e,t)=>t.id;function lD(e,t){if(e&1){let e=W();z(0,`button`,12),G(`click`,function(){return k(e),A(K().clear())}),J(1,`Clear`),B()}}function uD(e,t){e&1&&(z(0,`p`,8),J(1,`This page can't record change detection. It needs Angular 20 or later.`),B())}function dD(e,t){if(e&1&&(z(0,`tr`)(1,`td`,16),J(2),B(),z(3,`td`,17),J(4),B(),z(5,`td`,17),J(6),B(),z(7,`td`,17),J(8),B()()),e&2){let e=t.$implicit,n=K(2);M(2),Y(e.name),M(2),Y(e.checks),M(2),Y(n.ms(e.ms)),M(2),Y(n.ms(e.maxMs))}}function fD(e,t){if(e&1&&(z(0,`span`,19),J(1,`after `),z(2,`span`,16),J(3),B()()),e&2){let e=K().$implicit;M(3),Y(e.trigger)}}function pD(e,t){if(e&1&&(z(0,`span`,20),J(1,` slowest `),z(2,`span`,16),J(3),B(),J(4),B()),e&2){let e=t,n=K(3);M(3),Y(e.name),M(),X(` `,n.ms(e.ms),` `)}}function mD(e,t){if(e&1&&(z(0,`li`)(1,`span`,18),J(2),B(),z(3,`span`,16),J(4),B(),z(5,`span`),J(6),B(),P(7,fD,4,1,`span`,19),P(8,pD,5,2,`span`,20),B()),e&2){let e,n=t.$implicit,r=K(2);M(2),Y(r.clock(n.at)),M(2),Y(r.ms(n.ms)),M(2),X_(` `,n.checks,` `,n.checks===1?`check`:`checks`,`, `,n.passes,` `,n.passes===1?`pass`:`passes`,` `),M(),F(n.trigger?7:-1),M(),F((e=n.components[0])?8:-1,e)}}function hD(e,t){if(e&1&&(z(0,`div`,10)(1,`div`)(2,`h3`),J(3,`Slowest components`),B(),z(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,13),J(8,`Component`),B(),z(9,`th`,14),J(10,`Checks`),B(),z(11,`th`,14),J(12,`Self time`),B(),z(13,`th`,14),J(14,`Slowest`),B()()(),z(15,`tbody`),I(16,dD,9,4,`tr`,null,sD),B()()(),z(18,`div`)(19,`h3`),J(20,`Latest cycles`),B(),z(21,`ol`,15),I(22,mD,9,8,`li`,null,cD),B()()()),e&2){let e=K();M(16),L(e.slowest()),M(6),L(e.latest())}}function gD(e,t){e&1&&(z(0,`p`,11),J(1,`Use the app. Cycles show up here as Angular runs change detection.`),B())}var _D=10,vD=class e{page=$(null);pageId=$(null);rpc=$(null);message=j(``);recording=Q(()=>this.page()?.recording===!0);cycles=Q(()=>this.page()?.cycles??[]);maxCycles=Q(()=>tE(this.rpc()).limits.cdCycles);slowest=Q(()=>[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms).slice(0,_D));latest=Q(()=>this.cycles().slice(-30).reverse());status=Q(()=>{if(this.message())return this.message();let e=this.cycles().length;return 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 rD(e)}async toggle(){await this.send({on:!this.recording()},this.recording()?``:`Starting…`)}async clear(){await this.send({clear:!0},``)}async send(e,t){this.message.set(t);try{await QT(this.rpc(),`request-change-detection-record`,{pageId:this.pageId(),...e}),this.message.set(``)}catch{this.message.set(`Could not reach the page.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-cd-recording`]],inputs:{page:[1,`page`],pageId:[1,`pageId`],rpc:[1,`rpc`]},decls:16,vars:10,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`role`,`status`,1,`status`],[1,`hint`],[1,`note`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`cd-grid`],[1,`empty`],[`type`,`button`,3,`click`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[1,`mono`],[1,`num`],[1,`when`],[1,`trigger`],[1,`top`]],template:function(e,t){e&1&&(z(0,`section`,0)(1,`div`,1)(2,`h2`,2),J(3,`Change detection`),B(),z(4,`button`,3),G(`click`,function(){return t.toggle()}),V(5,`span`,4),J(6),B(),P(7,lD,2,0,`button`,5),z(8,`p`,6),J(9),B()(),z(10,`p`,7),J(11,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked and the output that ran before it. Tree rows show how often each instance was checked. Times come from a development build. `),B(),P(12,uD,2,0,`p`,8),V(13,`app-limit-note`,9),P(14,hD,24,0,`div`,10)(15,gD,2,0,`p`,11),B()),e&2&&(M(4),q(`on`,t.recording()),R(`disabled`,!t.pageId()),M(2),X(` `,t.recording()?`Stop recording`:`Record`,` `),M(),F(t.cycles().length?7:-1),M(2),Y(t.status()),M(3),F(t.page()?.supported===!1?12:-1),M(),R(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),M(),F(t.slowest().length?14:t.recording()?15:-1))},dependencies:[oD],styles:[`[_nghost-%COMP%] { +}`]})},mD=(e,t)=>t.name,hD=(e,t)=>t.id;function gD(e,t){if(e&1){let e=W();z(0,`button`,12),G(`click`,function(){return k(e),A(K().clear())}),J(1,`Clear`),B()}}function _D(e,t){e&1&&(z(0,`p`,8),J(1,`This page can't record change detection. It needs Angular 20 or later.`),B())}function vD(e,t){if(e&1&&(z(0,`tr`)(1,`td`,16),J(2),B(),z(3,`td`,17),J(4),B(),z(5,`td`,17),J(6),B(),z(7,`td`,17),J(8),B()()),e&2){let e=t.$implicit,n=K(2);M(2),Y(e.name),M(2),Y(e.checks),M(2),Y(n.ms(e.ms)),M(2),Y(n.ms(e.maxMs))}}function yD(e,t){if(e&1&&(z(0,`span`,19),J(1,`after `),z(2,`span`,16),J(3),B()()),e&2){let e=K().$implicit;M(3),Y(e.trigger)}}function bD(e,t){if(e&1&&(z(0,`span`,20),J(1,` slowest `),z(2,`span`,16),J(3),B(),J(4),B()),e&2){let e=t,n=K(3);M(3),Y(e.name),M(),X(` `,n.ms(e.ms),` `)}}function xD(e,t){if(e&1&&(z(0,`li`)(1,`span`,18),J(2),B(),z(3,`span`,16),J(4),B(),z(5,`span`),J(6),B(),P(7,yD,4,1,`span`,19),P(8,bD,5,2,`span`,20),B()),e&2){let e,n=t.$implicit,r=K(2);M(2),Y(r.clock(n.at)),M(2),Y(r.ms(n.ms)),M(2),X_(` `,n.checks,` `,n.checks===1?`check`:`checks`,`, `,n.passes,` `,n.passes===1?`pass`:`passes`,` `),M(),F(n.trigger?7:-1),M(),F((e=n.components[0])?8:-1,e)}}function SD(e,t){if(e&1&&(z(0,`div`,10)(1,`div`)(2,`h3`),J(3,`Slowest components`),B(),z(4,`table`)(5,`thead`)(6,`tr`)(7,`th`,13),J(8,`Component`),B(),z(9,`th`,14),J(10,`Checks`),B(),z(11,`th`,14),J(12,`Self time`),B(),z(13,`th`,14),J(14,`Slowest`),B()()(),z(15,`tbody`),I(16,vD,9,4,`tr`,null,mD),B()()(),z(18,`div`)(19,`h3`),J(20,`Latest cycles`),B(),z(21,`ol`,15),I(22,xD,9,8,`li`,null,hD),B()()()),e&2){let e=K();M(16),L(e.slowest()),M(6),L(e.latest())}}function CD(e,t){e&1&&(z(0,`p`,11),J(1,`Use the app. Cycles show up here as Angular runs change detection.`),B())}var wD=10,TD=class e{page=$(null);pageId=$(null);rpc=$(null);message=j(``);recording=Q(()=>this.page()?.recording===!0);cycles=Q(()=>this.page()?.cycles??[]);maxCycles=Q(()=>rE(this.rpc()).limits.cdCycles);slowest=Q(()=>[...this.page()?.components??[]].sort((e,t)=>t.ms-e.ms).slice(0,wD));latest=Q(()=>this.cycles().slice(-30).reverse());status=Q(()=>{if(this.message())return this.message();let e=this.cycles().length;return 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 uD(e)}async toggle(){await this.send({on:!this.recording()},this.recording()?``:`Starting…`)}async clear(){await this.send({clear:!0},``)}async send(e,t){this.message.set(t);try{await $T(this.rpc(),`request-change-detection-record`,{pageId:this.pageId(),...e}),this.message.set(``)}catch{this.message.set(`Could not reach the page.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-cd-recording`]],inputs:{page:[1,`page`],pageId:[1,`pageId`],rpc:[1,`rpc`]},decls:16,vars:10,consts:[[`aria-labelledby`,`cd-heading`,1,`cd`],[1,`cd-head`],[`id`,`cd-heading`],[`type`,`button`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`dot`],[`type`,`button`],[`role`,`status`,1,`status`],[1,`hint`],[1,`note`],[`what`,`cycles`,`limit`,`cdCycles`,3,`dropped`,`max`],[1,`cd-grid`],[1,`empty`],[`type`,`button`,3,`click`],[`scope`,`col`],[`scope`,`col`,1,`num`],[`aria-label`,`Latest change detection cycles, newest first`,1,`cycles`],[1,`mono`],[1,`num`],[1,`when`],[1,`trigger`],[1,`top`]],template:function(e,t){e&1&&(z(0,`section`,0)(1,`div`,1)(2,`h2`,2),J(3,`Change detection`),B(),z(4,`button`,3),G(`click`,function(){return t.toggle()}),V(5,`span`,4),J(6),B(),P(7,gD,2,0,`button`,5),z(8,`p`,6),J(9),B()(),z(10,`p`,7),J(11,` Records each change detection cycle with Angular's profiler: how long it took, how many components it checked and the output that ran before it. Tree rows show how often each instance was checked. Times come from a development build. `),B(),P(12,_D,2,0,`p`,8),V(13,`app-limit-note`,9),P(14,SD,24,0,`div`,10)(15,CD,2,0,`p`,11),B()),e&2&&(M(4),q(`on`,t.recording()),R(`disabled`,!t.pageId()),M(2),X(` `,t.recording()?`Stop recording`:`Record`,` `),M(),F(t.cycles().length?7:-1),M(2),Y(t.status()),M(3),F(t.page()?.supported===!1?12:-1),M(),R(`dropped`,t.page()?.dropped??0)(`max`,t.maxCycles()),M(),F(t.slowest().length?14:t.recording()?15:-1))},dependencies:[pD],styles:[`[_nghost-%COMP%] { display: block; margin-top: 16px; } @@ -672,7 +672,7 @@ td.mono[_ngcontent-%COMP%] { .trigger[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%], .top[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%] { overflow-wrap: anywhere; -}`]})},yD=()=>[],bD=(e,t)=>t.node.id,xD=(e,t)=>t.outlet+t.route,SD=(e,t)=>t.formId,CD=(e,t)=>t.name+e,wD=(e,t)=>t.name,TD=(e,t)=>t.token+e,ED=(e,t)=>t.id;function DD(e,t){return this.sourceKey(t)}function OD(e,t){if(e&1){let e=W();z(0,`span`,23),J(1,`Page`),B(),z(2,`app-select`,24),G(`valueChange`,function(t){return k(e),A(K(2).selectPage(t))}),B()}if(e&2){let e=K(2);M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function kD(e,t){if(e&1&&(z(0,`p`,12),J(1),B()),e&2){let e=K(2);M(),Y(e.pickMessage())}}function AD(e,t){e&1&&(z(0,`p`,13),J(1,`The page has more components than the tree shows.`),B())}function jD(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,25),J(2),B(),z(3,`button`,26),G(`click`,function(){return k(e),A(K(2).setFilter(``))}),J(4,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No components match “`,e.filter().trim(),`”`)}}function MD(e,t){if(e&1){let e=W();z(0,`span`,35),G(`click`,function(t){k(e);let n=K().$implicit;return A(K(2).toggle(n.node.id,t))}),fs(),z(1,`svg`,36),V(2,`path`,37),B()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function ND(e,t){e&1&&V(0,`span`,29)}function PD(e,t){if(e&1&&(z(0,`span`,32),J(1),B()),e&2){let e=t.$implicit;M(),Y(e.route||`/`)}}function FD(e,t){if(e&1&&(z(0,`span`,33),J(1),z(2,`span`,15),J(3),B()()),e&2){let e=t;M(),X(` `,e),M(2),X(` `,e===1?`check`:`checks`,` while recording`)}}function ID(e,t){if(e&1&&(z(0,`span`,34),J(1),z(2,`span`,15),J(3),B()()),e&2){let e=K().$implicit;N(`title`,e.node.directives.join(`, `)),M(),X(` +`,e.node.directives.length,` `),M(2),X(` `,e.node.directives.length===1?`directive`:`directives`,` `)}}function LD(e,t){if(e&1){let e=W();z(0,`div`,27),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.node.id))})(`focus`,function(){let t=k(e).$implicit,n=K(2);return n.focusId.set(t.node.id),A(n.highlight(t.node.id))})(`blur`,function(){return k(e),A(K(2).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.node.id))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,MD,3,2,`span`,28)(2,ND,1,0,`span`,29),z(3,`span`,30),J(4),B(),z(5,`span`,31),J(6),B(),I(7,PD,2,1,`span`,32,xD),P(9,FD,4,2,`span`,33),P(10,ID,4,3,`span`,34),B()}if(e&2){let e,n=t.$implicit,r=K(2);C_(`--%NS%depth`,n.depth),q(`selected`,r.selectedId()===n.node.id),N(`aria-level`,n.depth+1)(`aria-expanded`,n.hasChildren?n.expanded:null)(`aria-selected`,r.selectedId()===n.node.id)(`tabindex`,r.rovingId()===n.node.id?0:-1)(`data-id`,n.node.id),M(),F(n.hasChildren?1:2),M(3),Y(n.node.name),M(2),X(`<`,n.node.tag,`>`),M(),L(r.routedById().get(n.node.id)??av(14,yD)),M(2),F((e=r.cdHosts()[n.node.id])?9:-1,e),M(),F(n.node.directives?.length?10:-1)}}function RD(e,t){if(e&1){let e=W();z(0,`button`,46),G(`click`,function(){let t=k(e).$implicit;return A(K(5).showForm.emit(t.formId))}),J(1),B()}if(e&2){let e=t.$implicit;M(),X(` Show `,e.label,` in Forms `)}}function zD(e,t){if(e&1&&(z(0,`div`,44),I(1,RD,2,1,`button`,45,SD),B()),e&2){let e=K(),t=K(3);M(),L(t.formsIn(e.file))}}function BD(e,t){if(e&1&&(z(0,`p`,43),J(1),B(),P(2,zD,3,0,`div`,44)),e&2){let e=t,n=K(3);M(),Z(``,e.file,`:`,e.line),M(),F(n.formsIn(e.file).length?2:-1)}}function VD(e,t){if(e&1&&(z(0,`dt`),J(1,`Routed`),B(),z(2,`dd`,48),J(3),B()),e&2){let e=t.$implicit;M(3),Z(``,e.route||`/`,` in outlet `,e.outlet)}}function HD(e,t){if(e&1&&(z(0,`span`,57),J(1),B()),e&2){let e=K().$implicit;M(),X(`(`,e.prop,`)`)}}function UD(e,t){if(e&1&&(z(0,`li`,55)(1,`span`,56),J(2),P(3,HD,2,1,`span`,57),B(),z(4,`pre`),J(5),uv(6,`json`),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.name,` `),M(),F(e.prop===e.name?-1:3),M(2),Y(fv(6,3,e.value))}}function WD(e,t){if(e&1&&(z(0,`ul`,51),I(1,UD,7,5,`li`,55,wD),B()),e&2){let e=K();M(),L(e.inputs)}}function GD(e,t){e&1&&(z(0,`p`,52),J(1,`No inputs.`),B())}function KD(e,t){if(e&1&&(z(0,`li`,59)(1,`span`,48),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=t.$implicit;q(`on`,e.listened),M(2),Y(e.name),M(2),Y(e.listened?`listened`:`no listener`)}}function qD(e,t){if(e&1&&(z(0,`ul`,53),I(1,KD,5,4,`li`,58,wD),B()),e&2){let e=K();M(),L(e.outputs)}}function JD(e,t){e&1&&(z(0,`p`,52),J(1,`No outputs.`),B())}function YD(e,t){if(e&1&&(z(0,`span`,61),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function XD(e,t){if(e&1&&(z(0,`li`,55)(1,`span`,56),J(2),P(3,YD,2,1,`span`,61),B(),z(4,`pre`),J(5),uv(6,`json`),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.name,` `),M(),F(e.kind?3:-1),M(2),Y(fv(6,3,e.value))}}function ZD(e,t){if(e&1&&(z(0,`ul`,51),I(1,XD,7,5,`li`,55,wD),B()),e&2){let e=K();M(),L(e.properties)}}function QD(e,t){e&1&&(z(0,`p`,52),J(1,`No other properties.`),B())}function $D(e,t){if(e&1&&(z(0,`li`,62),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function eO(e,t){if(e&1&&(z(0,`div`,49)(1,`h3`),J(2,` DOM listeners `),z(3,`span`,50),J(4),B()(),z(5,`ul`,53),I(6,$D,2,1,`li`,62,wg),B()()),e&2){let e=K();M(4),Y(e.listeners.length),M(2),L(e.listeners)}}function tO(e,t){if(e&1&&(z(0,`li`,55)(1,`span`,56),J(2),B(),z(3,`pre`),J(4),uv(5,`json`),B()()),e&2){let e=t.$implicit;M(2),Y(e.name),M(2),Y(fv(5,2,e.value))}}function nO(e,t){if(e&1&&(z(0,`ul`,51),I(1,tO,6,4,`li`,55,wD),B()),e&2){let e=K().$implicit;M(),L(e.inputs)}}function rO(e,t){if(e&1&&(z(0,`li`,59)(1,`span`,48),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=t.$implicit;q(`on`,e.listened),M(2),Y(e.name),M(2),Y(e.listened?`listened`:`no listener`)}}function iO(e,t){if(e&1&&(z(0,`ul`,53),I(1,rO,5,4,`li`,58,wD),B()),e&2){let e=K().$implicit;M(),L(e.outputs)}}function aO(e,t){e&1&&(z(0,`p`,52),J(1,`No inputs or outputs.`),B())}function oO(e,t){if(e&1&&(z(0,`div`,49)(1,`h3`)(2,`span`,48),J(3),B(),z(4,`span`,61),J(5,`directive on host`),B()(),P(6,nO,3,0,`ul`,51),P(7,iO,3,0,`ul`,53),P(8,aO,2,0,`p`,52),B()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),F(e.inputs.length?6:-1),M(),F(e.outputs.length?7:-1),M(),F(!e.inputs.length&&!e.outputs.length?8:-1)}}function sO(e,t){if(e&1&&(z(0,`span`,61),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function cO(e,t){if(e&1&&(z(0,`span`,65),J(1,`from `),z(2,`span`,48),J(3),B()()),e&2){let e=K().$implicit;M(3),Y(e.providedByName??`an injector`)}}function lO(e,t){e&1&&(z(0,`span`,66),J(1,`not provided`),B())}function uO(e,t){if(e&1&&(z(0,`li`,63)(1,`span`,64),J(2),B(),I(3,sO,2,1,`span`,61,wg),P(5,cO,4,1,`span`,65)(6,lO,2,0,`span`,66),B()),e&2){let e=t.$implicit;M(2),Y(e.token),M(),L(e.flags),M(2),F(e.providedBy?5:6)}}function dO(e,t){if(e&1&&(z(0,`ul`,54),I(1,uO,7,2,`li`,63,TD),B()),e&2){let e=K();M(),L(e.dependencies)}}function fO(e,t){e&1&&(z(0,`p`,52),J(1,`Nothing is injected through the constructor or inject().`),B())}function pO(e,t){if(e&1&&(z(0,`dl`,47)(1,`dt`),J(2,`Change detection`),B(),z(3,`dd`),J(4),B(),z(5,`dt`),J(6,`Encapsulation`),B(),z(7,`dd`),J(8),B(),z(9,`dt`),J(10,`Host path`),B(),z(11,`dd`,48),J(12),B(),I(13,VD,4,2,null,null,xD),B(),z(15,`div`,49)(16,`h3`),J(17,` Inputs `),z(18,`span`,50),J(19),B()(),P(20,WD,3,0,`ul`,51)(21,GD,2,0,`p`,52),B(),z(22,`div`,49)(23,`h3`),J(24,` Outputs `),z(25,`span`,50),J(26),B()(),P(27,qD,3,0,`ul`,53)(28,JD,2,0,`p`,52),B(),z(29,`div`,49)(30,`h3`),J(31,` Properties `),z(32,`span`,50),J(33),B()(),P(34,ZD,3,0,`ul`,51)(35,QD,2,0,`p`,52),B(),P(36,eO,8,1,`div`,49),I(37,oO,9,4,`div`,49,CD),z(39,`div`,49)(40,`h3`),J(41,` Injected `),z(42,`span`,50),J(43),B()(),P(44,dO,3,0,`ul`,54)(45,fO,2,0,`p`,52),B()),e&2){let e=t,n=K(),r=K(2);M(4),Y(e.changeDetection??`Unknown`),M(4),Y(e.encapsulation??`Unknown`),M(4),Y(e.path),M(),L(r.routedById().get(n.id)??av(12,yD)),M(6),Y(e.inputs.length),M(),F(e.inputs.length?20:21),M(6),Y(e.outputs.length),M(),F(e.outputs.length?27:28),M(6),Y(e.properties?.length??0),M(),F(e.properties?.length?34:35),M(2),F(e.listeners.length?36:-1),M(),L(e.directives),M(6),Y(e.dependencies.length),M(),F(e.dependencies.length?44:45)}}function mO(e,t){e&1&&(z(0,`div`,42),V(1,`span`,67),z(2,`p`,68),J(3,`Reading live values from the page…`),B()())}function hO(e,t){if(e&1&&(z(0,`section`,19)(1,`header`,38)(2,`span`,39),J(3,`component`),B(),z(4,`h2`,40),J(5),B(),z(6,`span`,41),J(7),B(),P(8,BD,3,3),B(),P(9,pO,46,13)(10,mO,4,0,`div`,42),B()),e&2){let e,n,r=t,i=K(2);M(5),Y(r.name),M(2),X(`<`,r.tag,`>`),M(),F((e=i.sourceFor(r))?8:-1,e),M(),F((n=i.detail())?9:10,n)}}function gO(e,t){e&1&&(z(0,`p`,25),J(1,`The selected component was destroyed`),B(),z(2,`p`,68)(3,`span`,48),J(4),B(),J(5,` is no longer on the page. Select another component to see its live values. `),B()),e&2&&(M(4),Y(t))}function _O(e,t){e&1&&(z(0,`p`,68),J(1,` Select a component to see its live inputs, properties, outputs, change detection and injected services. `),B())}function vO(e,t){if(e&1&&(z(0,`div`,20),P(1,gO,6,1)(2,_O,2,0,`p`,68),B()),e&2){let e,t=K(2);M(),F((e=t.destroyed())?1:2,e)}}function yO(e,t){e&1&&(z(0,`span`,61),J(1,`hydrate never`),B())}function bO(e,t){if(e&1&&(z(0,`span`,61),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.hydration)}}function xO(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,71),G(`click`,function(){let t=k(e).$implicit;return A(K(3).showOwner(t))})(`focus`,function(){let t=k(e).$implicit;return A(K(3).highlightBlock(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(3).highlightBlock(t))})(`mouseleave`,function(){return k(e),A(K(3).highlight(null))}),z(2,`span`,30),J(3),B(),z(4,`span`,72),J(5),B(),P(6,yO,2,0,`span`,61)(7,bO,2,1,`span`,61),z(8,`span`,73),J(9),B()()()}if(e&2){let e=t.$implicit;M(),R(`disabled`,!e.owner),M(2),Y(e.owner?.name??`Unknown component`),M(),w_(`state-`+e.state),M(),Y(e.state),M(),F(e.hydrateNever?6:e.hydration===`not-configured`?-1:7),M(3),Y(e.triggers.join(`, `)||`no triggers`)}}function SO(e,t){if(e&1&&(z(0,`section`,21)(1,`h2`,69),J(2,` Defer blocks `),z(3,`span`,50),J(4),B()(),z(5,`ul`,70),I(6,xO,10,7,`li`,null,ED),B()()),e&2){let e=K(2);M(4),Y(e.deferBlocks().length),M(2),L(e.deferBlocks())}}function CO(e,t){if(e&1&&V(0,`app-cd-recording`,22),e&2){let e=K(2);R(`page`,e.cdPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())}}function wO(e,t){if(e&1){let e=W();z(0,`p`,0),J(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. `),B(),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,6),G(`input`,function(t){return k(e),A(K().setFilter(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().setFilter(``))}),B()(),P(8,OD,3,2),z(9,`span`,7),J(10),B(),z(11,`button`,8),G(`click`,function(){k(e);let t=K();return A(t.picking()?t.cancelPick():t.pick())}),fs(),z(12,`svg`,9),V(13,`path`,10),B(),J(14),B()(),ps(),z(15,`p`,11),J(16),B(),P(17,kD,2,1,`p`,12),P(18,AD,2,0,`p`,13),z(19,`div`,14)(20,`div`)(21,`h2`,15),J(22,`Component tree`),B(),P(23,jD,5,1,`div`,16),z(24,`div`,17),G(`keydown`,function(t){return k(e),A(K().onTreeKey(t))}),I(25,LD,11,15,`div`,18,bD),B()(),P(27,hO,11,4,`section`,19)(28,vO,3,1,`div`,20),B(),P(29,SO,8,1,`section`,21),P(30,CO,1,3,`app-cd-recording`,22)}if(e&2){let e,t=K();M(7),R(`value`,t.filter()),M(),F(t.pageOptions().length>1?8:-1),M(2),Y(t.countLabel()),M(),q(`on`,t.picking()),M(3),X(` `,t.picking()?`Cancel pick`:`Pick component on page`,` `),M(2),Y(t.announcement()),M(),F(t.pickMessage()?17:-1),M(),F(t.page().truncated?18:-1),M(5),F(t.rows().length?-1:23),M(),R(`hidden`,!t.rows().length),M(),L(t.rows()),M(2),F((e=t.selectedNode())?27:28,e),M(2),F(t.deferBlocks().length?29:-1),M(),F(t.staticReport()?-1:30)}}function TO(e,t){e&1&&(z(0,`p`,74),J(1,` The page reported no component instances. The live tree needs a development build with Angular's debug API. Showing what the source declares instead. `),B())}function EO(e,t){e&1&&(z(0,`p`,13),J(1,` No page is connected, so this lists what the source declares. Open the app in a browser with the devtools connected to see each rendered instance. `),B())}function DO(e,t){if(e&1&&J(0),e&2){let e=K(3);Z(` `,e.filteredSource().length,` of `,e.source().length,` `)}}function OO(e,t){if(e&1&&J(0),e&2){let e=K(3);X_(` `,e.sourceCounts().components,` `,e.sourceCounts().components===1?`component`:`components`,` · `,e.sourceCounts().directives,` `,e.sourceCounts().directives===1?`directive`:`directives`,` `)}}function kO(e,t){if(e&1&&(z(0,`span`,76),P(1,DO,1,2)(2,OO,1,4),B()),e&2){let e=K(2);M(),F(e.filter().trim()?1:2)}}function AO(e,t){e&1&&(z(0,`div`,80),V(1,`span`,67),z(2,`p`,25),J(3,`Scanning components…`),B()())}function jO(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function MO(e,t){e&1&&J(0,` Check that the dev server is running, then try again. `)}function NO(e,t){if(e&1){let e=W();z(0,`div`,81)(1,`p`,25),J(2,`Could not load components`),B(),z(3,`p`,68),P(4,jO,4,0)(5,MO,1,0),B(),z(6,`button`,26),G(`click`,function(){return k(e),A(K(2).refresh())}),J(7,`Retry`),B()()}if(e&2){let e=K(2);M(4),F(e.staticReport()?4:5)}}function PO(e,t){e&1&&(z(0,`div`,72)(1,`p`,25),J(2,`No components found`),B(),z(3,`p`,68),J(4,`No @Component or @Directive was found in the source.`),B()())}function FO(e,t){if(e&1){let e=W();z(0,`div`,72)(1,`p`,25),J(2),B(),z(3,`button`,26),G(`click`,function(){return k(e),A(K(2).filter.set(``))}),J(4,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No components match “`,e.filter().trim(),`”`)}}function IO(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,K(3).bareName(e.className),` · `)}}function LO(e,t){if(e&1&&(z(0,`dt`),J(1,`Change detection`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.changeDetection??`Unknown`)}}function RO(e,t){if(e&1){let e=W();z(0,`button`,46),G(`click`,function(){let t=k(e).$implicit;return A(K(5).showForm.emit(t.formId))}),J(1),B()}if(e&2){let e=t.$implicit;M(),X(` Show `,e.label,` in Forms `)}}function zO(e,t){if(e&1&&(z(0,`div`,91)(1,`dl`,47)(2,`dt`),J(3,`Class`),B(),z(4,`dd`,48),J(5),B(),z(6,`dt`),J(7,`File`),B(),z(8,`dd`,48),J(9),B(),z(10,`dt`),J(11,`Standalone`),B(),z(12,`dd`),J(13),B(),P(14,LO,4,1),z(15,`dt`),J(16,`Inputs`),B(),z(17,`dd`,48),J(18),B(),z(19,`dt`),J(20,`Outputs`),B(),z(21,`dd`,48),J(22),B()(),I(23,RO,2,1,`button`,45,SD),B()),e&2){let e=K(),t=e.$implicit,n=e.$index,r=K(3);R(`id`,`ct-source-`+n),M(5),Y(r.bareName(t.className)),M(4),Z(``,t.file,`:`,t.line),M(4),Y(t.isStandalone?`Yes`:`No`),M(),F(t.kind===`component`?14:-1),M(4),Y(t.inputs.join(`, `)||`None`),M(4),Y(t.outputs.join(`, `)||`None`),M(),L(r.formsIn(t.file))}}function BO(e,t){if(e&1){let e=W();z(0,`li`,84)(1,`button`,85),G(`click`,function(){let t=k(e).$implicit,n=K(3);return A(n.openKey.set(n.openKey()===n.sourceKey(t)?null:n.sourceKey(t)))}),z(2,`span`,86),J(3),B(),z(4,`span`,87)(5,`span`,88),J(6),B(),z(7,`span`,89),P(8,IO,1,1),J(9),B()(),fs(),z(10,`svg`,90),V(11,`path`,37),B()(),P(12,zO,25,8,`div`,91),B()}if(e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`expanded`,r.openKey()===r.sourceKey(e)),M(),N(`aria-expanded`,r.openKey()===r.sourceKey(e))(`aria-controls`,r.openKey()===r.sourceKey(e)?`ct-source-`+n:null),M(),q(`directive`,e.kind===`directive`),M(),Y(e.kind),M(3),Y(r.sourceLabel(e)),M(2),F(e.selector?8:-1),M(),Z(` `,e.file,`:`,e.line,` `),M(3),F(r.openKey()===r.sourceKey(e)?12:-1)}}function VO(e,t){if(e&1&&(z(0,`ul`,82),I(1,BO,13,12,`li`,83,DD,!0),B()),e&2){let e=K(2);M(),L(e.filteredSource())}}function HO(e,t){if(e&1){let e=W();P(0,TO,2,0,`p`,74)(1,EO,2,0,`p`,13),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,75),G(`input`,function(t){return k(e),A(K().filter.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().filter.set(``))}),B()(),P(8,kO,3,1,`span`,76),z(9,`button`,77),G(`click`,function(){return k(e),A(K().refresh())}),fs(),z(10,`svg`,9),V(11,`path`,78)(12,`path`,79),B(),J(13,` Refresh `),B()(),P(14,AO,4,0,`div`,80)(15,NO,8,1,`div`,81)(16,PO,5,0,`div`,72)(17,FO,5,1,`div`,72)(18,VO,3,0,`ul`,82)}if(e&2){let e=K();F(+!e.page()),M(7),R(`value`,e.filter()),M(),F(e.source().length?8:-1),M(),q(`spinning`,e.loading()),N(`aria-busy`,e.loading()),M(5),F(e.loading()&&!e.source().length?14:e.error()&&!e.source().length?15:e.source().length?e.filteredSource().length?18:17:16)}}function UO(e){return e.replace(/^_(?=[A-Z])/,``)}var WO=class e{rpc=$(null);staticReport=Q(()=>eE(this.rpc()));focus=$(null);showForm=Dv();focusHandled=Dv();filter=j(``);loading=j(!1);error=j(!1);source=j([]);formOwners=j([]);pages=j({});chosenPageId=j(null);selectedId=j(null);destroyed=j(null);announcement=j(``);picking=j(!1);pickMessage=j(``);focusId=j(null);collapsed=j(new Set);openKey=j(null);outlets=j([]);pageId=JT();destroyRef=E(Cs);injector=E(xs);host=E(Ml);cleanups=[];selection={pageId:null,detailId:null};shownPageId=wv({source:()=>({pages:this.pages(),chosen:this.chosenPageId()}),computation:({pages:e,chosen:t},n)=>YT(e,{chosen:t,host:this.pageId,previous:n?.value??null})});page=Q(()=>{let e=this.shownPageId();return e?this.pages()[e]??null:null});pageOptions=Q(()=>Object.values(this.pages()).map(e=>({value:e.pageId,label:e.title||e.url||`Page ${e.pageId}`,hint:e.url})));live=Q(()=>(this.page()?.roots.length??0)>0);cdPages=j({});cdPage=Q(()=>{let e=this.page()?.pageId;return e?this.cdPages()[e]??null:null});cdHosts=Q(()=>this.cdPage()?.hosts??{});index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.id,a),i&&t.set(a.id,i),n(a.children,a.id)};return n(this.page()?.roots??[],null),{map:e,parents:t}});query=Q(()=>this.filter().trim().toLowerCase());filtered=Q(()=>ZE(this.page()?.roots??[],this.query()));deferBlocks=Q(()=>this.page()?.deferBlocks??[]);countLabel=Q(()=>QE(this.page()?.count??0,this.filtered().matches,!!this.query()));rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.query(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.filtered().nodes,0),e});selectedNode=Q(()=>{let e=this.selectedId();return e?this.index().map.get(e)??null:null});detail=Q(()=>{let e=this.page()?.detail;return e&&e.id===this.selectedId()?e:null});rovingId=Q(()=>{let e=this.rows(),t=new Set(e.map(e=>e.node.id)),n=this.focusId();if(n&&t.has(n))return n;let r=this.selectedId();return r&&t.has(r)?r:e[0]?.node.id??null});routedById=Q(()=>{let e=new Map,t=n=>{for(let r of n){if(r.activated&&r.devtoolsId){let t=e.get(r.devtoolsId)??[];t.push({route:r.route??``,outlet:r.outlet}),e.set(r.devtoolsId,t)}r.children&&t(r.children)}};return t(this.outlets()),e});sourceByClass=Q(()=>{let e=new Map;for(let t of this.source()){let n=UO(t.className);e.set(n,[...e.get(n)??[],t])}return e});filteredSource=Q(()=>{let e=this.query(),t=this.source();return e?t.filter(t=>t.selector.toLowerCase().includes(e)||t.className.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):t});sourceCounts=Q(()=>{let e=this.source().filter(e=>e.kind===`component`).length;return{components:e,directives:this.source().length-e}});constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.watch(e))}),uc(()=>{let e=this.focus();e&&this.live()&&Sv(()=>{this.index().map.has(e.id)&&this.reveal(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.highlight(null);for(let e of this.cleanups.splice(0))e()})}async watch(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`ng-devtools`);try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.applyPages(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.applyPages({})}try{let e=await t.rpc.sharedState(`change-detection`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.cdPages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.cdPages.set({})}try{let e=await t.rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages??[],n=this.pageId?t.find(e=>e.pageId===this.pageId):t.find(e=>e.snapshot)??t[0];this.outlets.set(n?.outlets??[])};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.outlets.set([])}}async refresh(){let e=this.rpc();if(!e)return;this.loading.set(!0);let t=e.scope(`ng-devtools`);try{this.source.set(await t.rpc.call(`get-components`)),this.error.set(!1)}catch{this.error.set(!0)}finally{this.loading.set(!1)}let n=await t.rpc.call(`forms-owners`).catch(()=>[]);this.formOwners.set(n??[])}formsIn(e){return this.formOwners().filter(t=>t.file===e)}sourceFor(e){let t=(this.sourceByClass().get(UO(e.name))??[]).filter(e=>e.kind===`component`);return t.find(t=>t.selector===e.tag)??t[0]??null}sourceKey(e){return`${e.file}#${e.className}`}sourceLabel(e){return e.selector?e.kind===`component`&&/^[a-z][\w-]*$/i.test(e.selector)?`<${e.selector}>`:e.selector:UO(e.className)}bareName(e){return UO(e)}applyPages(e){let t=document.activeElement,n=t instanceof HTMLElement&&this.host.nativeElement.contains(t)?t.closest(`.row`)?.dataset.id??null:null,r=n?this.rows().map(e=>e.node.id):[],i=this.index().map;if(this.pages.set(e),this.syncSelection(i),!n)return;let a=new Set(this.rows().map(e=>e.node.id));if(a.has(n))return;let o=nD(r,a,n);o&&(this.focusId.set(o),Id(()=>this.rowElement(o)?.focus(),{injector:this.injector}))}syncSelection(e=this.index().map){let t=this.page(),n=eD({...this.selection,selectedId:this.selectedId()},t?{pageId:t.pageId,roots:t.roots,detail:t.detail,truncated:t.truncated}:null),r=n.destroyed?e.get(n.destroyed)?.name:void 0;this.selection={pageId:n.pageId,detailId:n.detailId},n.selectedId!==this.selectedId()&&this.selectedId.set(n.selectedId),n.selectedId&&this.destroyed.set(null),n.destroyed&&(this.destroyed.set(r??`The component`),this.announcement.set(`The selected component was destroyed.`),this.sendSelection(null))}selectPage(e){e&&(this.chosenPageId.set(e),this.destroyed.set(null),this.syncSelection())}setFilter(e){this.filter.set(e);let{matches:t}=this.filtered();this.announcement.set($E(this.page()?.count??0,t,e))}async pick(){let e=this.rpc();if(!e||this.picking())return;this.picking.set(!0),this.say(`Click a component in the app. Press Escape to cancel.`);let t=await e.scope(`ng-devtools`).rpc.call(`request-component-pick`,{pageId:this.page()?.pageId}).catch(()=>({ok:!1,error:`Could not reach the devtools server.`}));if(this.picking.set(!1),!t?.ok||!t.id){this.say(t?.error??`No component was picked.`);return}t.pageId&&t.pageId!==this.page()?.pageId&&this.selectPage(t.pageId),this.say(`Picked ${t.name??`a component`}.`),this.destroyed.set(null),this.index().map.has(t.id)?this.reveal(t.id):this.selectedId.set(t.id)}cancelPick(){let e=this.rpc();e&&this.picking()&&e.scope(`ng-devtools`).rpc.call(`cancel-component-pick`,{pageId:this.page()?.pageId}).catch(()=>{})}say(e){this.pickMessage.set(e),this.announcement.set(e)}sendSelection(e){let t=this.rpc();t&&t.scope(`ng-devtools`).rpc.call(`select-component`,{pageId:this.page()?.pageId,id:e}).catch(()=>{})}rowElement(e){return this.host.nativeElement.querySelector(`.row[data-id="${CSS.escape(e)}"]`)}select(e){let t=this.selectedId()===e?null:e;this.selectedId.set(t),this.destroyed.set(null),this.focusId.set(e),this.sendSelection(t)}reveal(e){let{parents:t}=this.index();this.collapsed.update(n=>{let r=new Set(n);for(let n=t.get(e);n;n=t.get(n))r.delete(n);return r}),this.rows().some(t=>t.node.id===e)||this.setFilter(``),this.selectedId()!==e&&this.select(e),Id(()=>document.querySelector(`.row[data-id="${CSS.escape(e)}"]`)?.scrollIntoView({block:`nearest`}),{injector:this.injector})}toggle(e,t){t?.stopPropagation(),!this.query()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}highlight(e){let t=this.rpc();if(!t)return;let n=e?{pageId:this.page()?.pageId,id:e}:null;t.scope(`ng-devtools`).rpc.call(`request-page-highlight`,n).catch(()=>{})}highlightBlock(e){this.highlight(e.rootIds[0]??e.owner?.id??null)}showOwner(e){e.owner&&this.index().map.has(e.owner.id)&&this.reveal(e.owner.id)}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=t.findIndex(e=>e.node.id===this.rovingId()),r=Math.max(n,0),i=t[r],a=-1;switch(e.key){case`ArrowDown`:a=Math.min(r+1,t.length-1);break;case`ArrowUp`:a=Math.max(r-1,0);break;case`Home`:a=0;break;case`End`:a=t.length-1;break;case`ArrowRight`:i.hasChildren&&!i.expanded?this.toggle(i.node.id):i.hasChildren&&(a=r+1);break;case`ArrowLeft`:if(i.hasChildren&&i.expanded&&!this.query())this.toggle(i.node.id);else{let e=this.index().parents.get(i.node.id);a=t.findIndex(t=>t.node.id===e)}break;case`Enter`:case` `:this.select(i.node.id);break;default:return}if(e.preventDefault(),a>=0){let e=t[a].node.id;this.focusId.set(e),queueMicrotask(()=>{let t=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);t?.focus(),t?.scrollIntoView({block:`nearest`})})}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-component-tree`]],hostBindings:function(e,t){e&1&&G(`keydown.escape`,function(){return t.cancelPick()})},inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{showForm:`showForm`,focusHandled:`focusHandled`},decls:2,vars:1,consts:[[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Filter by class, tag or directive…`,`aria-label`,`Filter components by class, tag or directive`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[1,`count`],[`type`,`button`,1,`pick`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M4 4l6.5 16 2.3-6.7L19.5 11z`],[`role`,`status`,1,`sr-only`],[1,`pick-message`],[1,`notice`],[1,`layout`],[1,`sr-only`],[1,`state`,`compact`,`tree`],[`role`,`tree`,`aria-label`,`Component instances`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`ct-detail-title`,1,`detail`],[1,`detail`,`placeholder`],[`aria-labelledby`,`ct-defer-title`,1,`defer`],[3,`page`,`pageId`,`rpc`],[`id`,`ct-page-label`,1,`sr-only`],[`labelledBy`,`ct-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`state-title`],[`type`,`button`,3,`click`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[1,`name`,`mono`],[1,`tag`,`mono`],[1,`routed`],[1,`checks`],[1,`dirs`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[1,`detail-head`],[1,`badge`],[`id`,`ct-detail-title`,1,`mono`],[1,`mono`,`muted`],[`role`,`status`,1,`state`,`compact`],[1,`where`,`mono`],[1,`actions`],[`type`,`button`,1,`show-form`],[`type`,`button`,1,`show-form`,3,`click`],[1,`facts`],[1,`mono`],[1,`block`],[1,`pill`],[1,`props`],[1,`empty-line`],[1,`chips`],[1,`deps`],[1,`prop`],[1,`prop-name`,`mono`],[1,`muted`],[1,`chip`,3,`on`],[1,`chip`],[1,`chip-note`],[1,`flag`],[1,`chip`,`mono`],[1,`dep`],[1,`token`,`mono`],[1,`from`],[1,`from`,`missing`],[`aria-hidden`,`true`,1,`spinner`],[1,`state-hint`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`defer-list`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`,`disabled`],[1,`state`],[1,`triggers`,`mono`],[`role`,`status`,1,`notice`],[`type`,`search`,`placeholder`,`Filter by selector, class or file…`,`aria-label`,`Filter components by selector, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`count`],[`type`,`button`,1,`refresh`,3,`click`],[`d`,`M20 12a8 8 0 1 1-2.34-5.66`],[`d`,`M20 4v5h-5`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[`role`,`list`,1,`source-list`],[1,`source-item`,3,`expanded`],[1,`source-item`],[`type`,`button`,1,`source-toggle`,3,`click`],[1,`kind-flag`],[1,`row-main`],[1,`selector`,`mono`],[1,`file`,`mono`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[1,`inline-detail`,3,`id`]],template:function(e,t){e&1&&P(0,wO,31,14)(1,HO,19,7),e&2&&F(+!t.live())},dependencies:[XE,vD,ib],styles:[`[_nghost-%COMP%] { +}`]})},ED=()=>[],DD=(e,t)=>t.node.id,OD=(e,t)=>t.outlet+t.route,kD=(e,t)=>t.formId,AD=(e,t)=>t.name+e,jD=(e,t)=>t.name,MD=(e,t)=>t.token+e,ND=(e,t)=>t.id;function PD(e,t){return this.sourceKey(t)}function FD(e,t){if(e&1){let e=W();z(0,`span`,23),J(1,`Page`),B(),z(2,`app-select`,24),G(`valueChange`,function(t){return k(e),A(K(2).selectPage(t))}),B()}if(e&2){let e=K(2);M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function ID(e,t){if(e&1&&(z(0,`p`,12),J(1),B()),e&2){let e=K(2);M(),Y(e.pickMessage())}}function LD(e,t){if(e&1&&(z(0,`p`,13),J(1),B()),e&2){let e=K(2);M(),Y(e.truncationText())}}function RD(e,t){e&1&&(z(0,`p`,26),J(1,`The filter only searches the components the tree lists.`),B())}function zD(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,25),J(2),B(),P(3,RD,2,0,`p`,26),z(4,`button`,27),G(`click`,function(){return k(e),A(K(2).setFilter(``))}),J(5,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No components match “`,e.filter().trim(),`”`),M(),F(e.page().truncated?3:-1)}}function BD(e,t){if(e&1){let e=W();z(0,`span`,36),G(`click`,function(t){k(e);let n=K().$implicit;return A(K(2).toggle(n.node.id,t))}),fs(),z(1,`svg`,37),V(2,`path`,38),B()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function VD(e,t){e&1&&V(0,`span`,30)}function HD(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e.route||`/`)}}function UD(e,t){if(e&1&&(z(0,`span`,34),J(1),z(2,`span`,15),J(3),B()()),e&2){let e=t;M(),X(` `,e),M(2),X(` `,e===1?`check`:`checks`,` while recording`)}}function WD(e,t){if(e&1&&(z(0,`span`,35),J(1),z(2,`span`,15),J(3),B()()),e&2){let e=K().$implicit;N(`title`,e.node.directives.join(`, `)),M(),X(` +`,e.node.directives.length,` `),M(2),X(` `,e.node.directives.length===1?`directive`:`directives`,` `)}}function GD(e,t){if(e&1){let e=W();z(0,`div`,28),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.node.id))})(`focus`,function(){let t=k(e).$implicit,n=K(2);return n.focusId.set(t.node.id),A(n.highlight(t.node.id))})(`blur`,function(){return k(e),A(K(2).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.node.id))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,BD,3,2,`span`,29)(2,VD,1,0,`span`,30),z(3,`span`,31),J(4),B(),z(5,`span`,32),J(6),B(),I(7,HD,2,1,`span`,33,OD),P(9,UD,4,2,`span`,34),P(10,WD,4,3,`span`,35),B()}if(e&2){let e,n=t.$implicit,r=K(2);C_(`--%NS%depth`,n.depth),q(`selected`,r.selectedId()===n.node.id),N(`aria-level`,n.depth+1)(`aria-expanded`,n.hasChildren?n.expanded:null)(`aria-selected`,r.selectedId()===n.node.id)(`tabindex`,r.rovingId()===n.node.id?0:-1)(`data-id`,n.node.id),M(),F(n.hasChildren?1:2),M(3),Y(n.node.name),M(2),X(`<`,n.node.tag,`>`),M(),L(r.routedById().get(n.node.id)??ov(14,ED)),M(2),F((e=r.cdHosts()[n.node.id])?9:-1,e),M(),F(n.node.directives?.length?10:-1)}}function KD(e,t){if(e&1){let e=W();z(0,`button`,47),G(`click`,function(){let t=k(e).$implicit;return A(K(5).showForm.emit(t.formId))}),J(1),B()}if(e&2){let e=t.$implicit;M(),X(` Show `,e.label,` in Forms `)}}function qD(e,t){if(e&1&&(z(0,`div`,45),I(1,KD,2,1,`button`,46,kD),B()),e&2){let e=K(),t=K(3);M(),L(t.formsIn(e.file))}}function JD(e,t){if(e&1&&(z(0,`p`,44),J(1),B(),P(2,qD,3,0,`div`,45)),e&2){let e=t,n=K(3);M(),Z(``,e.file,`:`,e.line),M(),F(n.formsIn(e.file).length?2:-1)}}function YD(e,t){if(e&1&&(z(0,`dt`),J(1,`Routed`),B(),z(2,`dd`,49),J(3),B()),e&2){let e=t.$implicit;M(3),Z(``,e.route||`/`,` in outlet `,e.outlet)}}function XD(e,t){if(e&1&&(z(0,`span`,58),J(1),B()),e&2){let e=K().$implicit;M(),X(`(`,e.prop,`)`)}}function ZD(e,t){if(e&1&&(z(0,`li`,56)(1,`span`,57),J(2),P(3,XD,2,1,`span`,58),B(),z(4,`pre`),J(5),dv(6,`json`),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.name,` `),M(),F(e.prop===e.name?-1:3),M(2),Y(pv(6,3,e.value))}}function QD(e,t){if(e&1&&(z(0,`ul`,52),I(1,ZD,7,5,`li`,56,jD),B()),e&2){let e=K();M(),L(e.inputs)}}function $D(e,t){e&1&&(z(0,`p`,53),J(1,`No inputs.`),B())}function eO(e,t){if(e&1&&(z(0,`li`,60)(1,`span`,49),J(2),B(),z(3,`span`,61),J(4),B()()),e&2){let e=t.$implicit;q(`on`,e.listened),M(2),Y(e.name),M(2),Y(e.listened?`listened`:`no listener`)}}function tO(e,t){if(e&1&&(z(0,`ul`,54),I(1,eO,5,4,`li`,59,jD),B()),e&2){let e=K();M(),L(e.outputs)}}function nO(e,t){e&1&&(z(0,`p`,53),J(1,`No outputs.`),B())}function rO(e,t){if(e&1&&(z(0,`span`,62),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function iO(e,t){if(e&1&&(z(0,`li`,56)(1,`span`,57),J(2),P(3,rO,2,1,`span`,62),B(),z(4,`pre`),J(5),dv(6,`json`),B()()),e&2){let e=t.$implicit;M(2),X(` `,e.name,` `),M(),F(e.kind?3:-1),M(2),Y(pv(6,3,e.value))}}function aO(e,t){if(e&1&&(z(0,`ul`,52),I(1,iO,7,5,`li`,56,jD),B()),e&2){let e=K();M(),L(e.properties)}}function oO(e,t){e&1&&(z(0,`p`,53),J(1,`No other properties.`),B())}function sO(e,t){if(e&1&&(z(0,`li`,63),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function cO(e,t){if(e&1&&(z(0,`div`,50)(1,`h3`),J(2,` DOM listeners `),z(3,`span`,51),J(4),B()(),z(5,`ul`,54),I(6,sO,2,1,`li`,63,wg),B()()),e&2){let e=K();M(4),Y(e.listeners.length),M(2),L(e.listeners)}}function lO(e,t){if(e&1&&(z(0,`li`,56)(1,`span`,57),J(2),B(),z(3,`pre`),J(4),dv(5,`json`),B()()),e&2){let e=t.$implicit;M(2),Y(e.name),M(2),Y(pv(5,2,e.value))}}function uO(e,t){if(e&1&&(z(0,`ul`,52),I(1,lO,6,4,`li`,56,jD),B()),e&2){let e=K().$implicit;M(),L(e.inputs)}}function dO(e,t){if(e&1&&(z(0,`li`,60)(1,`span`,49),J(2),B(),z(3,`span`,61),J(4),B()()),e&2){let e=t.$implicit;q(`on`,e.listened),M(2),Y(e.name),M(2),Y(e.listened?`listened`:`no listener`)}}function fO(e,t){if(e&1&&(z(0,`ul`,54),I(1,dO,5,4,`li`,59,jD),B()),e&2){let e=K().$implicit;M(),L(e.outputs)}}function pO(e,t){e&1&&(z(0,`p`,53),J(1,`No inputs or outputs.`),B())}function mO(e,t){if(e&1&&(z(0,`div`,50)(1,`h3`)(2,`span`,49),J(3),B(),z(4,`span`,62),J(5,`directive on host`),B()(),P(6,uO,3,0,`ul`,52),P(7,fO,3,0,`ul`,54),P(8,pO,2,0,`p`,53),B()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),F(e.inputs.length?6:-1),M(),F(e.outputs.length?7:-1),M(),F(!e.inputs.length&&!e.outputs.length?8:-1)}}function hO(e,t){if(e&1&&(z(0,`span`,62),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function gO(e,t){if(e&1&&(z(0,`span`,66),J(1,`from `),z(2,`span`,49),J(3),B()()),e&2){let e=K().$implicit;M(3),Y(e.providedByName??`an injector`)}}function _O(e,t){e&1&&(z(0,`span`,67),J(1,`not provided`),B())}function vO(e,t){if(e&1&&(z(0,`li`,64)(1,`span`,65),J(2),B(),I(3,hO,2,1,`span`,62,wg),P(5,gO,4,1,`span`,66)(6,_O,2,0,`span`,67),B()),e&2){let e=t.$implicit;M(2),Y(e.token),M(),L(e.flags),M(2),F(e.providedBy?5:6)}}function yO(e,t){if(e&1&&(z(0,`ul`,55),I(1,vO,7,2,`li`,64,MD),B()),e&2){let e=K();M(),L(e.dependencies)}}function bO(e,t){e&1&&(z(0,`p`,53),J(1,`Nothing is injected through the constructor or inject().`),B())}function xO(e,t){if(e&1&&(z(0,`dl`,48)(1,`dt`),J(2,`Change detection`),B(),z(3,`dd`),J(4),B(),z(5,`dt`),J(6,`Encapsulation`),B(),z(7,`dd`),J(8),B(),z(9,`dt`),J(10,`Host path`),B(),z(11,`dd`,49),J(12),B(),I(13,YD,4,2,null,null,OD),B(),z(15,`div`,50)(16,`h3`),J(17,` Inputs `),z(18,`span`,51),J(19),B()(),P(20,QD,3,0,`ul`,52)(21,$D,2,0,`p`,53),B(),z(22,`div`,50)(23,`h3`),J(24,` Outputs `),z(25,`span`,51),J(26),B()(),P(27,tO,3,0,`ul`,54)(28,nO,2,0,`p`,53),B(),z(29,`div`,50)(30,`h3`),J(31,` Properties `),z(32,`span`,51),J(33),B()(),P(34,aO,3,0,`ul`,52)(35,oO,2,0,`p`,53),B(),P(36,cO,8,1,`div`,50),I(37,mO,9,4,`div`,50,AD),z(39,`div`,50)(40,`h3`),J(41,` Injected `),z(42,`span`,51),J(43),B()(),P(44,yO,3,0,`ul`,55)(45,bO,2,0,`p`,53),B()),e&2){let e=t,n=K(),r=K(2);M(4),Y(e.changeDetection??`Unknown`),M(4),Y(e.encapsulation??`Unknown`),M(4),Y(e.path),M(),L(r.routedById().get(n.id)??ov(12,ED)),M(6),Y(e.inputs.length),M(),F(e.inputs.length?20:21),M(6),Y(e.outputs.length),M(),F(e.outputs.length?27:28),M(6),Y(e.properties?.length??0),M(),F(e.properties?.length?34:35),M(2),F(e.listeners.length?36:-1),M(),L(e.directives),M(6),Y(e.dependencies.length),M(),F(e.dependencies.length?44:45)}}function SO(e,t){e&1&&(z(0,`div`,43),V(1,`span`,68),z(2,`p`,26),J(3,`Reading live values from the page…`),B()())}function CO(e,t){if(e&1&&(z(0,`section`,19)(1,`header`,39)(2,`span`,40),J(3,`component`),B(),z(4,`h2`,41),J(5),B(),z(6,`span`,42),J(7),B(),P(8,JD,3,3),B(),P(9,xO,46,13)(10,SO,4,0,`div`,43),B()),e&2){let e,n,r=t,i=K(2);M(5),Y(r.name),M(2),X(`<`,r.tag,`>`),M(),F((e=i.sourceFor(r))?8:-1,e),M(),F((n=i.detail())?9:10,n)}}function wO(e,t){e&1&&(z(0,`p`,25),J(1,`The selected component was destroyed`),B(),z(2,`p`,26)(3,`span`,49),J(4),B(),J(5,` is no longer on the page. Select another component to see its live values. `),B()),e&2&&(M(4),Y(t))}function TO(e,t){e&1&&(z(0,`p`,26),J(1,` Select a component to see its live inputs, properties, outputs, change detection and injected services. `),B())}function EO(e,t){if(e&1&&(z(0,`div`,20),P(1,wO,6,1)(2,TO,2,0,`p`,26),B()),e&2){let e,t=K(2);M(),F((e=t.destroyed())?1:2,e)}}function DO(e,t){e&1&&(z(0,`span`,62),J(1,`hydrate never`),B())}function OO(e,t){if(e&1&&(z(0,`span`,62),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.hydration)}}function kO(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,71),G(`click`,function(){let t=k(e).$implicit;return A(K(3).showOwner(t))})(`focus`,function(){let t=k(e).$implicit;return A(K(3).highlightBlock(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(3).highlightBlock(t))})(`mouseleave`,function(){return k(e),A(K(3).highlight(null))}),z(2,`span`,31),J(3),B(),z(4,`span`,72),J(5),B(),P(6,DO,2,0,`span`,62)(7,OO,2,1,`span`,62),z(8,`span`,73),J(9),B()()()}if(e&2){let e=t.$implicit;M(),R(`disabled`,!e.owner),M(2),Y(e.owner?.name??`Unknown component`),M(),w_(`state-`+e.state),M(),Y(e.state),M(),F(e.hydrateNever?6:e.hydration===`not-configured`?-1:7),M(3),Y(e.triggers.join(`, `)||`no triggers`)}}function AO(e,t){if(e&1&&(z(0,`section`,21)(1,`h2`,69),J(2,` Defer blocks `),z(3,`span`,51),J(4),B()(),z(5,`ul`,70),I(6,kO,10,7,`li`,null,ND),B()()),e&2){let e=K(2);M(4),Y(e.deferBlocks().length),M(2),L(e.deferBlocks())}}function jO(e,t){if(e&1&&V(0,`app-cd-recording`,22),e&2){let e=K(2);R(`page`,e.cdPage())(`pageId`,e.page().pageId)(`rpc`,e.rpc())}}function MO(e,t){if(e&1){let e=W();z(0,`p`,0),J(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. `),B(),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,6),G(`input`,function(t){return k(e),A(K().setFilter(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().setFilter(``))}),B()(),P(8,FD,3,2),z(9,`span`,7),J(10),B(),z(11,`button`,8),G(`click`,function(){k(e);let t=K();return A(t.picking()?t.cancelPick():t.pick())}),fs(),z(12,`svg`,9),V(13,`path`,10),B(),J(14),B()(),ps(),z(15,`p`,11),J(16),B(),P(17,ID,2,1,`p`,12),P(18,LD,2,1,`p`,13),z(19,`div`,14)(20,`div`)(21,`h2`,15),J(22,`Component tree`),B(),P(23,zD,6,2,`div`,16),z(24,`div`,17),G(`keydown`,function(t){return k(e),A(K().onTreeKey(t))}),I(25,GD,11,15,`div`,18,DD),B()(),P(27,CO,11,4,`section`,19)(28,EO,3,1,`div`,20),B(),P(29,AO,8,1,`section`,21),P(30,jO,1,3,`app-cd-recording`,22)}if(e&2){let e,t=K();M(7),R(`value`,t.filter()),M(),F(t.pageOptions().length>1?8:-1),M(2),Y(t.countLabel()),M(),q(`on`,t.picking()),M(3),X(` `,t.picking()?`Cancel pick`:`Pick component on page`,` `),M(2),Y(t.announcement()),M(),F(t.pickMessage()?17:-1),M(),F(t.page().truncated?18:-1),M(5),F(t.rows().length?-1:23),M(),R(`hidden`,!t.rows().length),M(),L(t.rows()),M(2),F((e=t.selectedNode())?27:28,e),M(2),F(t.deferBlocks().length?29:-1),M(),F(t.staticReport()?-1:30)}}function NO(e,t){e&1&&(z(0,`p`,13),J(1,` The page reported no component instances. The live tree needs a development build with Angular's debug API. Showing what the source declares instead. `),B())}function PO(e,t){e&1&&(z(0,`p`,74),J(1,` No page is connected, so this lists what the source declares. Open the app in a browser with the devtools connected to see each rendered instance. `),B())}function FO(e,t){if(e&1&&J(0),e&2){let e=K(3);Z(` `,e.filteredSource().length,` of `,e.source().length,` `)}}function IO(e,t){if(e&1&&J(0),e&2){let e=K(3);X_(` `,e.sourceCounts().components,` `,e.sourceCounts().components===1?`component`:`components`,` · `,e.sourceCounts().directives,` `,e.sourceCounts().directives===1?`directive`:`directives`,` `)}}function LO(e,t){if(e&1&&(z(0,`span`,76),P(1,FO,1,2)(2,IO,1,4),B()),e&2){let e=K(2);M(),F(e.filter().trim()?1:2)}}function RO(e,t){e&1&&(z(0,`div`,80),V(1,`span`,68),z(2,`p`,25),J(3,`Scanning components…`),B()())}function zO(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function BO(e,t){e&1&&J(0,` Check that the dev server is running, then try again. `)}function VO(e,t){if(e&1){let e=W();z(0,`div`,81)(1,`p`,25),J(2,`Could not load components`),B(),z(3,`p`,26),P(4,zO,4,0)(5,BO,1,0),B(),z(6,`button`,27),G(`click`,function(){return k(e),A(K(2).refresh())}),J(7,`Retry`),B()()}if(e&2){let e=K(2);M(4),F(e.staticReport()?4:5)}}function HO(e,t){e&1&&(z(0,`div`,72)(1,`p`,25),J(2,`No components found`),B(),z(3,`p`,26),J(4,`No @Component or @Directive was found in the source.`),B()())}function UO(e,t){if(e&1){let e=W();z(0,`div`,72)(1,`p`,25),J(2),B(),z(3,`button`,27),G(`click`,function(){return k(e),A(K(2).filter.set(``))}),J(4,`Clear filter`),B()()}if(e&2){let e=K(2);M(2),X(`No components match “`,e.filter().trim(),`”`)}}function WO(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,K(3).bareName(e.className),` · `)}}function GO(e,t){if(e&1&&(z(0,`dt`),J(1,`Change detection`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.changeDetection??`Unknown`)}}function KO(e,t){if(e&1){let e=W();z(0,`button`,47),G(`click`,function(){let t=k(e).$implicit;return A(K(5).showForm.emit(t.formId))}),J(1),B()}if(e&2){let e=t.$implicit;M(),X(` Show `,e.label,` in Forms `)}}function qO(e,t){if(e&1&&(z(0,`div`,91)(1,`dl`,48)(2,`dt`),J(3,`Class`),B(),z(4,`dd`,49),J(5),B(),z(6,`dt`),J(7,`File`),B(),z(8,`dd`,49),J(9),B(),z(10,`dt`),J(11,`Standalone`),B(),z(12,`dd`),J(13),B(),P(14,GO,4,1),z(15,`dt`),J(16,`Inputs`),B(),z(17,`dd`,49),J(18),B(),z(19,`dt`),J(20,`Outputs`),B(),z(21,`dd`,49),J(22),B()(),I(23,KO,2,1,`button`,46,kD),B()),e&2){let e=K(),t=e.$implicit,n=e.$index,r=K(3);R(`id`,`ct-source-`+n),M(5),Y(r.bareName(t.className)),M(4),Z(``,t.file,`:`,t.line),M(4),Y(t.isStandalone?`Yes`:`No`),M(),F(t.kind===`component`?14:-1),M(4),Y(t.inputs.join(`, `)||`None`),M(4),Y(t.outputs.join(`, `)||`None`),M(),L(r.formsIn(t.file))}}function JO(e,t){if(e&1){let e=W();z(0,`li`,84)(1,`button`,85),G(`click`,function(){let t=k(e).$implicit,n=K(3);return A(n.openKey.set(n.openKey()===n.sourceKey(t)?null:n.sourceKey(t)))}),z(2,`span`,86),J(3),B(),z(4,`span`,87)(5,`span`,88),J(6),B(),z(7,`span`,89),P(8,WO,1,1),J(9),B()(),fs(),z(10,`svg`,90),V(11,`path`,38),B()(),P(12,qO,25,8,`div`,91),B()}if(e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`expanded`,r.openKey()===r.sourceKey(e)),M(),N(`aria-expanded`,r.openKey()===r.sourceKey(e))(`aria-controls`,r.openKey()===r.sourceKey(e)?`ct-source-`+n:null),M(),q(`directive`,e.kind===`directive`),M(),Y(e.kind),M(3),Y(r.sourceLabel(e)),M(2),F(e.selector?8:-1),M(),Z(` `,e.file,`:`,e.line,` `),M(3),F(r.openKey()===r.sourceKey(e)?12:-1)}}function YO(e,t){if(e&1&&(z(0,`ul`,82),I(1,JO,13,12,`li`,83,PD,!0),B()),e&2){let e=K(2);M(),L(e.filteredSource())}}function XO(e,t){if(e&1){let e=W();P(0,NO,2,0,`p`,13)(1,PO,2,0,`p`,74),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,75),G(`input`,function(t){return k(e),A(K().filter.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().filter.set(``))}),B()(),P(8,LO,3,1,`span`,76),z(9,`button`,77),G(`click`,function(){return k(e),A(K().refresh())}),fs(),z(10,`svg`,9),V(11,`path`,78)(12,`path`,79),B(),J(13,` Refresh `),B()(),P(14,RO,4,0,`div`,80)(15,VO,8,1,`div`,81)(16,HO,5,0,`div`,72)(17,UO,5,1,`div`,72)(18,YO,3,0,`ul`,82)}if(e&2){let e=K();F(+!e.page()),M(7),R(`value`,e.filter()),M(),F(e.source().length?8:-1),M(),q(`spinning`,e.loading()),N(`aria-busy`,e.loading()),M(5),F(e.loading()&&!e.source().length?14:e.error()&&!e.source().length?15:e.source().length?e.filteredSource().length?18:17:16)}}function ZO(e){return e.replace(/^_(?=[A-Z])/,``)}var QO=class e{rpc=$(null);staticReport=Q(()=>tE(this.rpc()));focus=$(null);showForm=Ov();focusHandled=Ov();filter=j(``);loading=j(!1);error=j(!1);source=j([]);formOwners=j([]);pages=j({});chosenPageId=j(null);selectedId=j(null);destroyed=j(null);announcement=j(``);picking=j(!1);pickMessage=j(``);focusId=j(null);collapsed=j(new Set);openKey=j(null);outlets=j([]);pageId=YT();destroyRef=E(Cs);injector=E(xs);host=E(Ml);cleanups=[];selection={pageId:null,detailId:null};shownPageId=Tv({source:()=>({pages:this.pages(),chosen:this.chosenPageId()}),computation:({pages:e,chosen:t},n)=>XT(e,{chosen:t,host:this.pageId,previous:n?.value??null})});page=Q(()=>{let e=this.shownPageId();return e?this.pages()[e]??null:null});pageOptions=Q(()=>Object.values(this.pages()).map(e=>({value:e.pageId,label:e.title||e.url||`Page ${e.pageId}`,hint:e.url})));live=Q(()=>(this.page()?.roots.length??0)>0);cdPages=j({});cdPage=Q(()=>{let e=this.page()?.pageId;return e?this.cdPages()[e]??null:null});cdHosts=Q(()=>this.cdPage()?.hosts??{});index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.id,a),i&&t.set(a.id,i),n(a.children,a.id)};return n(this.page()?.roots??[],null),{map:e,parents:t}});query=Q(()=>this.filter().trim().toLowerCase());filtered=Q(()=>rD(this.page()?.roots??[],this.query()));deferBlocks=Q(()=>this.page()?.deferBlocks??[]);countLabel=Q(()=>iD(this.page()?.count??0,this.filtered().matches,!!this.query(),!!this.page()?.truncated));truncationText=Q(()=>oD(this.page()?.truncatedBy));rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.query(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.filtered().nodes,0),e});selectedNode=Q(()=>{let e=this.selectedId();return e?this.index().map.get(e)??null:null});detail=Q(()=>{let e=this.page()?.detail;return e&&e.id===this.selectedId()?e:null});rovingId=Q(()=>{let e=this.rows(),t=new Set(e.map(e=>e.node.id)),n=this.focusId();if(n&&t.has(n))return n;let r=this.selectedId();return r&&t.has(r)?r:e[0]?.node.id??null});routedById=Q(()=>{let e=new Map,t=n=>{for(let r of n){if(r.activated&&r.devtoolsId){let t=e.get(r.devtoolsId)??[];t.push({route:r.route??``,outlet:r.outlet}),e.set(r.devtoolsId,t)}r.children&&t(r.children)}};return t(this.outlets()),e});sourceByClass=Q(()=>{let e=new Map;for(let t of this.source()){let n=ZO(t.className);e.set(n,[...e.get(n)??[],t])}return e});filteredSource=Q(()=>{let e=this.query(),t=this.source();return e?t.filter(t=>t.selector.toLowerCase().includes(e)||t.className.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):t});sourceCounts=Q(()=>{let e=this.source().filter(e=>e.kind===`component`).length;return{components:e,directives:this.source().length-e}});constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.watch(e))}),uc(()=>{let e=this.focus();e&&this.live()&&Cv(()=>{this.index().map.has(e.id)&&this.reveal(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.highlight(null);for(let e of this.cleanups.splice(0))e()})}async watch(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`ng-devtools`);try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.applyPages(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.applyPages({})}try{let e=await t.rpc.sharedState(`change-detection`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.cdPages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.cdPages.set({})}try{let e=await t.rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages??[],n=this.pageId?t.find(e=>e.pageId===this.pageId):t.find(e=>e.snapshot)??t[0];this.outlets.set(n?.outlets??[])};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.outlets.set([])}}async refresh(){let e=this.rpc();if(!e)return;this.loading.set(!0);let t=e.scope(`ng-devtools`);try{this.source.set(await t.rpc.call(`get-components`)),this.error.set(!1)}catch{this.error.set(!0)}finally{this.loading.set(!1)}let n=await t.rpc.call(`forms-owners`).catch(()=>[]);this.formOwners.set(n??[])}formsIn(e){return this.formOwners().filter(t=>t.file===e)}sourceFor(e){let t=(this.sourceByClass().get(ZO(e.name))??[]).filter(e=>e.kind===`component`);return t.find(t=>t.selector===e.tag)??t[0]??null}sourceKey(e){return`${e.file}#${e.className}`}sourceLabel(e){return e.selector?e.kind===`component`&&/^[a-z][\w-]*$/i.test(e.selector)?`<${e.selector}>`:e.selector:ZO(e.className)}bareName(e){return ZO(e)}applyPages(e){let t=document.activeElement,n=t instanceof HTMLElement&&this.host.nativeElement.contains(t)?t.closest(`.row`)?.dataset.id??null:null,r=n?this.rows().map(e=>e.node.id):[],i=this.index().map;if(this.pages.set(e),this.syncSelection(i),!n)return;let a=new Set(this.rows().map(e=>e.node.id));if(a.has(n))return;let o=lD(r,a,n);o&&(this.focusId.set(o),Id(()=>this.rowElement(o)?.focus(),{injector:this.injector}))}syncSelection(e=this.index().map){let t=this.page(),n=sD({...this.selection,selectedId:this.selectedId()},t?{pageId:t.pageId,roots:t.roots,detail:t.detail,truncated:t.truncated}:null),r=n.destroyed?e.get(n.destroyed)?.name:void 0;this.selection={pageId:n.pageId,detailId:n.detailId},n.selectedId!==this.selectedId()&&this.selectedId.set(n.selectedId),n.selectedId&&this.destroyed.set(null),n.destroyed&&(this.destroyed.set(r??`The component`),this.announcement.set(`The selected component was destroyed.`),this.sendSelection(null))}selectPage(e){e&&(this.chosenPageId.set(e),this.destroyed.set(null),this.syncSelection())}setFilter(e){this.filter.set(e);let{matches:t}=this.filtered();this.announcement.set(aD(this.page()?.count??0,t,e,!!this.page()?.truncated))}async pick(){let e=this.rpc();if(!e||this.picking())return;this.picking.set(!0),this.say(`Click a component in the app. Press Escape to cancel.`);let t=await e.scope(`ng-devtools`).rpc.call(`request-component-pick`,{pageId:this.page()?.pageId}).catch(()=>({ok:!1,error:`Could not reach the devtools server.`}));if(this.picking.set(!1),!t?.ok||!t.id){this.say(t?.error??`No component was picked.`);return}t.pageId&&t.pageId!==this.page()?.pageId&&this.selectPage(t.pageId),this.say(`Picked ${t.name??`a component`}.`),this.destroyed.set(null),this.index().map.has(t.id)?this.reveal(t.id):this.selectedId.set(t.id)}cancelPick(){let e=this.rpc();e&&this.picking()&&e.scope(`ng-devtools`).rpc.call(`cancel-component-pick`,{pageId:this.page()?.pageId}).catch(()=>{})}say(e){this.pickMessage.set(e),this.announcement.set(e)}sendSelection(e){let t=this.rpc();t&&t.scope(`ng-devtools`).rpc.call(`select-component`,{pageId:this.page()?.pageId,id:e}).catch(()=>{})}rowElement(e){return this.host.nativeElement.querySelector(`.row[data-id="${CSS.escape(e)}"]`)}select(e){let t=this.selectedId()===e?null:e;this.selectedId.set(t),this.destroyed.set(null),this.focusId.set(e),this.sendSelection(t)}reveal(e){let{parents:t}=this.index();this.collapsed.update(n=>{let r=new Set(n);for(let n=t.get(e);n;n=t.get(n))r.delete(n);return r}),this.rows().some(t=>t.node.id===e)||this.setFilter(``),this.selectedId()!==e&&this.select(e),Id(()=>document.querySelector(`.row[data-id="${CSS.escape(e)}"]`)?.scrollIntoView({block:`nearest`}),{injector:this.injector})}toggle(e,t){t?.stopPropagation(),!this.query()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}highlight(e){let t=this.rpc();if(!t)return;let n=e?{pageId:this.page()?.pageId,id:e}:null;t.scope(`ng-devtools`).rpc.call(`request-page-highlight`,n).catch(()=>{})}highlightBlock(e){this.highlight(e.rootIds[0]??e.owner?.id??null)}showOwner(e){e.owner&&this.index().map.has(e.owner.id)&&this.reveal(e.owner.id)}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=t.findIndex(e=>e.node.id===this.rovingId()),r=Math.max(n,0),i=t[r],a=-1;switch(e.key){case`ArrowDown`:a=Math.min(r+1,t.length-1);break;case`ArrowUp`:a=Math.max(r-1,0);break;case`Home`:a=0;break;case`End`:a=t.length-1;break;case`ArrowRight`:i.hasChildren&&!i.expanded?this.toggle(i.node.id):i.hasChildren&&(a=r+1);break;case`ArrowLeft`:if(i.hasChildren&&i.expanded&&!this.query())this.toggle(i.node.id);else{let e=this.index().parents.get(i.node.id);a=t.findIndex(t=>t.node.id===e)}break;case`Enter`:case` `:this.select(i.node.id);break;default:return}if(e.preventDefault(),a>=0){let e=t[a].node.id;this.focusId.set(e),queueMicrotask(()=>{let t=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);t?.focus(),t?.scrollIntoView({block:`nearest`})})}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-component-tree`]],hostBindings:function(e,t){e&1&&G(`keydown.escape`,function(){return t.cancelPick()})},inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{showForm:`showForm`,focusHandled:`focusHandled`},decls:2,vars:1,consts:[[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Filter by class, tag or directive…`,`aria-label`,`Filter components by class, tag or directive`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[1,`count`],[`type`,`button`,1,`pick`,3,`click`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M4 4l6.5 16 2.3-6.7L19.5 11z`],[`role`,`status`,1,`sr-only`],[1,`pick-message`],[`role`,`status`,1,`notice`],[1,`layout`],[1,`sr-only`],[1,`state`,`compact`,`tree`],[`role`,`tree`,`aria-label`,`Component instances`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`ct-detail-title`,1,`detail`],[1,`detail`,`placeholder`],[`aria-labelledby`,`ct-defer-title`,1,`defer`],[3,`page`,`pageId`,`rpc`],[`id`,`ct-page-label`,1,`sr-only`],[`labelledBy`,`ct-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`state-title`],[1,`state-hint`],[`type`,`button`,3,`click`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[1,`name`,`mono`],[1,`tag`,`mono`],[1,`routed`],[1,`checks`],[1,`dirs`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[1,`detail-head`],[1,`badge`],[`id`,`ct-detail-title`,1,`mono`],[1,`mono`,`muted`],[`role`,`status`,1,`state`,`compact`],[1,`where`,`mono`],[1,`actions`],[`type`,`button`,1,`show-form`],[`type`,`button`,1,`show-form`,3,`click`],[1,`facts`],[1,`mono`],[1,`block`],[1,`pill`],[1,`props`],[1,`empty-line`],[1,`chips`],[1,`deps`],[1,`prop`],[1,`prop-name`,`mono`],[1,`muted`],[1,`chip`,3,`on`],[1,`chip`],[1,`chip-note`],[1,`flag`],[1,`chip`,`mono`],[1,`dep`],[1,`token`,`mono`],[1,`from`],[1,`from`,`missing`],[`aria-hidden`,`true`,1,`spinner`],[`id`,`ct-defer-title`,1,`defer-title`],[1,`defer-list`],[`type`,`button`,1,`defer-row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`,`disabled`],[1,`state`],[1,`triggers`,`mono`],[1,`notice`],[`type`,`search`,`placeholder`,`Filter by selector, class or file…`,`aria-label`,`Filter components by selector, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`count`],[`type`,`button`,1,`refresh`,3,`click`],[`d`,`M20 12a8 8 0 1 1-2.34-5.66`],[`d`,`M20 4v5h-5`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[`role`,`list`,1,`source-list`],[1,`source-item`,3,`expanded`],[1,`source-item`],[`type`,`button`,1,`source-toggle`,3,`click`],[1,`kind-flag`],[1,`row-main`],[1,`selector`,`mono`],[1,`file`,`mono`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`chevron`],[1,`inline-detail`,3,`id`]],template:function(e,t){e&1&&P(0,MO,31,14)(1,XO,19,7),e&2&&F(+!t.live())},dependencies:[nD,TD,ab],styles:[`[_nghost-%COMP%] { display: block; color: var(--%NS%text); font-size: 13px; @@ -1485,7 +1485,7 @@ pre[_ngcontent-%COMP%] { .inline-detail[_ngcontent-%COMP%] .show-form[_ngcontent-%COMP%] { margin: 0 16px; -}`]})};function GO(e){return e.line?`${e.file}:${e.line}`:e.file}function KO(e,t){let n=t.filter(t=>t.fullPath===e.fullPath&&t.redirectTo!==void 0==(e.redirectTo!==void 0));return n.find(t=>!!e.component&&t.component===e.component)??n.find(t=>!t.component||!e.component)}var qO=$T;function JO(e,t,n){return qO(e,`request-router-action`,{pageId:t,request:n})}function YO(e){return e===`succeeded`?`good`:e===`redirected`||e===`pending`||e===`skipped`?`warn`:e===`cancelled`||e===`failed`?`bad`:``}var XO=()=>[],ZO=(e,t)=>t[0],QO=(e,t)=>t.input;function $O(e,t){if(e&1&&(H(0,`p`,3),J(1,` The browser shows `),H(2,`code`),J(3),U(),J(4,`, not the router URL (skipLocationChange, browserUrl, a failed navigation or code that changed history). `),U()),e&2){let e=K();M(3),Y(e.browserUrl)}}function ek(e,t){if(e&1&&(H(0,`p`,12),J(1),U()),e&2){let e=K(3);M(),Y(e.navigationOff)}}function tk(e,t){if(e&1){let e=W();H(0,`div`,8),Fg(1,`span`,9),H(2,`span`,10),J(3,`Navigating to `),H(4,`code`),J(5),U(),J(6),U(),H(7,`button`,11),Qg(`click`,function(){return k(e),A(K(2).abort())}),J(8,` Abort `),U()(),P(9,ek,2,1,`p`,12)}if(e&2){let e=t,n=K(2);M(5),Y(e.url),M(),X(` (#`,e.id,`)`),M(),Vg(`disabled`,!n.navigationAllowed()),N(`aria-describedby`,n.navigationAllowed()?null:`route-current-writes-off`),M(2),F(n.navigationAllowed()?-1:9)}}function nk(e,t){if(e&1&&(H(0,`p`,4),J(1),U()),e&2){let e=K(2);M(),Y(e.message())}}function rk(e,t){if(e&1&&(H(0,`dt`),J(1,`Document title`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.title)}}function ik(e,t){if(e&1&&(H(0,`dt`),J(1,`Query params`),U(),H(2,`dd`)(3,`code`),J(4),uv(5,`json`),U()()),e&2){let e=K();M(4),Y(fv(5,1,e.queryParams))}}function ak(e,t){if(e&1&&(H(0,`dt`),J(1,`Fragment`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.fragment)}}function ok(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.outlet)}}function sk(e,t){e&1&&(H(0,`span`,14),J(1,`lazy`),U())}function ck(e,t){if(e&1&&(H(0,`div`,15),J(1),U()),e&2){let e=K().$implicit;M(),Z(` title `,e.route.title,``,e.route.ownTitle===!1?` (inherited)`:``,` `)}}function lk(e,t){if(e&1&&(H(0,`code`,16),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.component)}}function uk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function dk(e,t){e&1&&(H(0,`span`,14),J(1,`inherited`),U())}function fk(e,t){if(e&1&&(H(0,`div`,17)(1,`code`),J(2),uv(3,`json`),U(),P(4,dk,2,0,`span`,14),U()),e&2){let e=t.$implicit,n=K().$implicit;M(2),Z(``,e[0],`: `,fv(3,3,e[1])),M(2),F(n.route.paramSources?.[e[0]]===`inherited`?4:-1)}}function pk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function mk(e,t){e&1&&(H(0,`span`,14),J(1),U()),e&2&&(M(),Y(t))}function hk(e,t){if(e&1&&(H(0,`div`,18)(1,`code`),J(2),uv(3,`json`),U(),P(4,mk,2,1,`span`,14),U()),e&2){let e,n=t.$implicit,r=K().$implicit;M(2),Z(``,n[0],`: `,fv(3,3,n[1])),M(2),F((e=r.route.dataSources?.[n[0]])?4:-1,e)}}function gk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function _k(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function vk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function yk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function bk(e,t){if(e&1&&(H(0,`tr`)(1,`td`,13),J(2),P(3,ok,2,1,`span`,14),P(4,sk,2,0,`span`,14),P(5,ck,2,2,`div`,15),U(),H(6,`td`),P(7,lk,2,1,`code`,16)(8,uk,4,0),U(),H(9,`td`),I(10,fk,5,5,`div`,17,ZO,!1,pk,4,0),U(),H(13,`td`),I(14,hk,5,5,`div`,18,ZO,!1,gk,4,0),U(),H(17,`td`),I(18,_k,2,1,`span`,14,wg),I(20,vk,2,1,`span`,14,wg),P(22,yk,4,0),U()()),e&2){let e=t.$implicit,n=K(2);M(),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.depth===0&&!e.route.path?`(root)`:`/`+e.route.path,` `),M(),F(e.route.outlet===`primary`?-1:3),M(),F(e.route.lazy?4:-1),M(),F(e.route.title?5:-1),M(2),F(e.route.component?7:8),M(3),L(n.entries(e.route.params)),M(4),L(n.entries(e.route.data)),M(4),L(n.guardList(e.route)),M(2),L(e.route.resolvers??av(10,XO)),M(2),F(!n.guardList(e.route).length&&!e.route.resolvers?.length?22:-1)}}function xk(e,t){if(e&1&&(H(0,`code`),J(1),U(),J(2,` for `),H(3,`code`),J(4),U()),e&2){let e=K().$implicit;M(),Y(e.outlet.component??`?`),M(3),Y(e.outlet.route??`?`)}}function Sk(e,t){e&1&&(H(0,`span`,23),J(1,`not activated`),U())}function Ck(e,t){e&1&&(H(0,`span`,14),J(1,`detached by reuse strategy`),U())}function wk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Z(`input `,e.input,` ← `,e.source)}}function Tk(e,t){if(e&1&&(H(0,`li`)(1,`span`,14),J(2),U(),P(3,xk,5,2)(4,Sk,2,0,`span`,23),P(5,Ck,2,0,`span`,14),I(6,wk,2,2,`span`,14,QO),U()),e&2){let e=t.$implicit,n=K(3);C_(`padding-left`,10+e.depth*16,`px`),M(2),Y(e.outlet.outlet),M(),F(e.outlet.activated?3:4),M(2),F(e.outlet.detached?5:-1),M(),L(n.boundInputs(e.outlet))}}function Ek(e,t){if(e&1&&(H(0,`h3`),J(1,`Outlets`),U(),H(2,`ul`,21),I(3,Tk,8,5,`li`,22,Cg),U()),e&2){let e=K(2);M(3),L(e.outletRows())}}function Dk(e,t){if(e&1&&(H(0,`p`,1)(1,`span`,2),J(2,`URL`),U(),H(3,`code`),J(4),U()(),P(5,$O,5,1,`p`,3),P(6,tk,10,5),P(7,nk,2,1,`p`,4),H(8,`dl`,5),P(9,rk,4,1),P(10,ik,6,3),P(11,ak,5,1),U(),H(12,`h3`),J(13,`Active routes`),U(),H(14,`div`,6)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,7),J(19,`Route`),U(),H(20,`th`,7),J(21,`Component`),U(),H(22,`th`,7),J(23,`Params`),U(),H(24,`th`,7),J(25,`Data`),U(),H(26,`th`,7),J(27,`Guards and resolvers`),U()()(),H(28,`tbody`),I(29,bk,23,11,`tr`,null,Cg),U()()(),P(31,Ek,5,0)),e&2){let e,n=t,r=K();M(4),Y(n.url),M(),F(n.urlDrift&&n.browserUrl?5:-1),M(),F((e=n.pending)?6:-1,e),M(),F(r.message()?7:-1),M(2),F(n.title?9:-1),M(),F(r.hasKeys(n.queryParams)?10:-1),M(),F(n.fragment?11:-1),M(18),L(r.rows()),M(2),F(r.outletRows().length?31:-1)}}function Ok(e,t){e&1&&(H(0,`div`,0)(1,`p`,24),J(2,`This page reports no Router.`),U(),H(3,`p`,23),J(4,` Add `),H(5,`code`),J(6,`provideRouter()`),U(),J(7,` to the app config and navigate once to see the active routes here. `),U()())}var kk=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>nE(this.rpc(),`router`));navigationOff=HT(`router`);message=j(``);rows=Q(()=>{let e=[],t=(n,r)=>{e.push({route:n,depth:r});for(let e of n.children)t(e,r+1)},n=this.page().snapshot?.root;return n&&t(n,0),e});outletRows=Q(()=>{let e=[],t=(n,r)=>{for(let i of n)e.push({outlet:i,depth:r}),i.children&&t(i.children,r+1)};return t(this.page().outlets??[],0),e});hasKeys(e){return Object.keys(e).length>0}entries(e){return Object.entries(e)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}boundInputs(e){return(e.inputs??[]).filter(e=>e.source!==`unset`)}async abort(){let e=await JO(this.rpc(),this.page().pageId,{action:`abort`});this.message.set(e?.error?String(e.error):`Aborted navigation #${e?.aborted}`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-current`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:2,vars:1,consts:[[1,`empty`],[1,`url`],[1,`url-label`],[`role`,`note`,1,`note`],[`role`,`status`,1,`muted`],[1,`facts`],[`role`,`region`,`aria-label`,`Active routes`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[`role`,`status`,1,`pending`],[`aria-hidden`,`true`,1,`pulse`],[1,`pending-text`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`route-current-writes-off`,1,`muted`],[1,`path`],[1,`tag`],[1,`sub`],[1,`component`],[1,`entry`],[1,`entry`,`data`],[`aria-hidden`,`true`,1,`nil`],[1,`visually-hidden`],[1,`outlets`],[3,`padding-left`],[1,`muted`],[1,`empty-title`]],template:function(e,t){if(e&1&&P(0,Dk,32,8)(1,Ok,8,0,`div`,0),e&2){let e;F((e=t.page().snapshot)?0:1,e)}},dependencies:[ib],styles:[`.muted[_ngcontent-%COMP%] { +}`]})};function $O(e){return e.line?`${e.file}:${e.line}`:e.file}function ek(e,t){let n=t.filter(t=>t.fullPath===e.fullPath&&t.redirectTo!==void 0==(e.redirectTo!==void 0));return n.find(t=>!!e.component&&t.component===e.component)??n.find(t=>!t.component||!e.component)}var tk=eE;function nk(e){return e.startsWith(`/`)&&!e.startsWith(`//`)&&!/^\/*[a-z][a-z0-9+.-]*:/i.test(e)&&!e.includes(`[redacted]`)&&e.length<=2e3}async function rk(e,t,n){return await tk(e,`request-router-action`,{pageId:t,request:n})??{error:`Could not reach the page.`}}function ik(e){return e===`succeeded`?`good`:e===`redirected`||e===`pending`||e===`skipped`?`warn`:e===`cancelled`||e===`failed`?`bad`:``}var ak=()=>[],ok=(e,t)=>t[0],sk=(e,t)=>t.input;function ck(e,t){if(e&1&&(H(0,`p`,3),J(1,` The browser shows `),H(2,`code`),J(3),U(),J(4,`, not the router URL (skipLocationChange, browserUrl, a failed navigation or code that changed history). `),U()),e&2){let e=K();M(3),Y(e.browserUrl)}}function lk(e,t){if(e&1&&(H(0,`p`,12),J(1),U()),e&2){let e=K(3);M(),Y(e.navigationOff)}}function uk(e,t){if(e&1){let e=W();H(0,`div`,8),Fg(1,`span`,9),H(2,`span`,10),J(3,`Navigating to `),H(4,`code`),J(5),U(),J(6),U(),H(7,`button`,11),Qg(`click`,function(){return k(e),A(K(2).abort())}),J(8,` Abort `),U()(),P(9,lk,2,1,`p`,12)}if(e&2){let e=t,n=K(2);M(5),Y(e.url),M(),X(` (#`,e.id,`)`),M(),Vg(`disabled`,!n.navigationAllowed()),N(`aria-describedby`,n.navigationAllowed()?null:`route-current-writes-off`),M(2),F(n.navigationAllowed()?-1:9)}}function dk(e,t){if(e&1&&(H(0,`p`,4),J(1),U()),e&2){let e=K(2);M(),Y(e.message())}}function fk(e,t){if(e&1&&(H(0,`dt`),J(1,`Document title`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.title)}}function pk(e,t){if(e&1&&(H(0,`dt`),J(1,`Query params`),U(),H(2,`dd`)(3,`code`),J(4),dv(5,`json`),U()()),e&2){let e=K();M(4),Y(pv(5,1,e.queryParams))}}function mk(e,t){if(e&1&&(H(0,`dt`),J(1,`Fragment`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.fragment)}}function hk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.outlet)}}function gk(e,t){e&1&&(H(0,`span`,14),J(1,`lazy`),U())}function _k(e,t){if(e&1&&(H(0,`div`,15),J(1),U()),e&2){let e=K().$implicit;M(),Z(` title `,e.route.title,``,e.route.ownTitle===!1?` (inherited)`:``,` `)}}function vk(e,t){if(e&1&&(H(0,`code`,16),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.route.component)}}function yk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function bk(e,t){e&1&&(H(0,`span`,14),J(1,`inherited`),U())}function xk(e,t){if(e&1&&(H(0,`div`,17)(1,`code`),J(2),dv(3,`json`),U(),P(4,bk,2,0,`span`,14),U()),e&2){let e=t.$implicit,n=K().$implicit;M(2),Z(``,e[0],`: `,pv(3,3,e[1])),M(2),F(n.route.paramSources?.[e[0]]===`inherited`?4:-1)}}function Sk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function Ck(e,t){e&1&&(H(0,`span`,14),J(1),U()),e&2&&(M(),Y(t))}function wk(e,t){if(e&1&&(H(0,`div`,18)(1,`code`),J(2),dv(3,`json`),U(),P(4,Ck,2,1,`span`,14),U()),e&2){let e,n=t.$implicit,r=K().$implicit;M(2),Z(``,n[0],`: `,pv(3,3,n[1])),M(2),F((e=r.route.dataSources?.[n[0]])?4:-1,e)}}function Tk(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function Ek(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function Dk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function Ok(e,t){e&1&&(H(0,`span`,19),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function kk(e,t){if(e&1&&(H(0,`tr`)(1,`td`,13),J(2),P(3,hk,2,1,`span`,14),P(4,gk,2,0,`span`,14),P(5,_k,2,2,`div`,15),U(),H(6,`td`),P(7,vk,2,1,`code`,16)(8,yk,4,0),U(),H(9,`td`),I(10,xk,5,5,`div`,17,ok,!1,Sk,4,0),U(),H(13,`td`),I(14,wk,5,5,`div`,18,ok,!1,Tk,4,0),U(),H(17,`td`),I(18,Ek,2,1,`span`,14,wg),I(20,Dk,2,1,`span`,14,wg),P(22,Ok,4,0),U()()),e&2){let e=t.$implicit,n=K(2);M(),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.depth===0&&!e.route.path?`(root)`:`/`+e.route.path,` `),M(),F(e.route.outlet===`primary`?-1:3),M(),F(e.route.lazy?4:-1),M(),F(e.route.title?5:-1),M(2),F(e.route.component?7:8),M(3),L(n.entries(e.route.params)),M(4),L(n.entries(e.route.data)),M(4),L(n.guardList(e.route)),M(2),L(e.route.resolvers??ov(10,ak)),M(2),F(!n.guardList(e.route).length&&!e.route.resolvers?.length?22:-1)}}function Ak(e,t){if(e&1&&(H(0,`code`),J(1),U(),J(2,` for `),H(3,`code`),J(4),U()),e&2){let e=K().$implicit;M(),Y(e.outlet.component??`?`),M(3),Y(e.outlet.route??`?`)}}function jk(e,t){e&1&&(H(0,`span`,23),J(1,`not activated`),U())}function Mk(e,t){e&1&&(H(0,`span`,14),J(1,`detached by reuse strategy`),U())}function Nk(e,t){if(e&1&&(H(0,`span`,14),J(1),U()),e&2){let e=t.$implicit;M(),Z(`input `,e.input,` ← `,e.source)}}function Pk(e,t){if(e&1&&(H(0,`span`,24),J(1,`routerOutletData `),H(2,`code`),J(3),U()()),e&2){let e=K().$implicit;M(3),Y(e.outlet.data)}}function Fk(e,t){if(e&1&&(H(0,`li`)(1,`span`,14),J(2),U(),P(3,Ak,5,2)(4,jk,2,0,`span`,23),P(5,Mk,2,0,`span`,14),I(6,Nk,2,2,`span`,14,sk),P(8,Pk,4,1,`span`,24),U()),e&2){let e=t.$implicit,n=K(3);C_(`padding-left`,10+e.depth*16,`px`),M(2),Y(e.outlet.outlet),M(),F(e.outlet.activated?3:4),M(2),F(e.outlet.detached?5:-1),M(),L(n.boundInputs(e.outlet)),M(2),F(e.outlet.data===void 0?-1:8)}}function Ik(e,t){if(e&1&&(H(0,`h3`),J(1,`Outlets`),U(),H(2,`ul`,21),I(3,Fk,9,6,`li`,22,Cg),U()),e&2){let e=K(2);M(3),L(e.outletRows())}}function Lk(e,t){if(e&1&&(H(0,`p`,1)(1,`span`,2),J(2,`URL`),U(),H(3,`code`),J(4),U()(),P(5,ck,5,1,`p`,3),P(6,uk,10,5),P(7,dk,2,1,`p`,4),H(8,`dl`,5),P(9,fk,4,1),P(10,pk,6,3),P(11,mk,5,1),U(),H(12,`h3`),J(13,`Active routes`),U(),H(14,`div`,6)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,7),J(19,`Route`),U(),H(20,`th`,7),J(21,`Component`),U(),H(22,`th`,7),J(23,`Params`),U(),H(24,`th`,7),J(25,`Data`),U(),H(26,`th`,7),J(27,`Guards and resolvers`),U()()(),H(28,`tbody`),I(29,kk,23,11,`tr`,null,Cg),U()()(),P(31,Ik,5,0)),e&2){let e,n=t,r=K();M(4),Y(n.url),M(),F(n.urlDrift&&n.browserUrl?5:-1),M(),F((e=n.pending)?6:-1,e),M(),F(r.message()?7:-1),M(2),F(n.title?9:-1),M(),F(r.hasKeys(n.queryParams)?10:-1),M(),F(n.fragment?11:-1),M(18),L(r.rows()),M(2),F(r.outletRows().length?31:-1)}}function Rk(e,t){e&1&&(H(0,`div`,0)(1,`p`,25),J(2,`This page reports no Router.`),U(),H(3,`p`,23),J(4,` Add `),H(5,`code`),J(6,`provideRouter()`),U(),J(7,` to the app config and navigate once to see the active routes here. `),U()())}var zk=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>iE(this.rpc(),`router`));navigationOff=UT(`router`);message=j(``);rows=Q(()=>{let e=[],t=(n,r)=>{e.push({route:n,depth:r});for(let e of n.children)t(e,r+1)},n=this.page().snapshot?.root;return n&&t(n,0),e});outletRows=Q(()=>{let e=[],t=(n,r)=>{for(let i of n)e.push({outlet:i,depth:r}),i.children&&t(i.children,r+1)};return t(this.page().outlets??[],0),e});hasKeys(e){return Object.keys(e).length>0}entries(e){return Object.entries(e)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}boundInputs(e){return(e.inputs??[]).filter(e=>e.source!==`unset`)}async abort(){let e=await rk(this.rpc(),this.page().pageId,{action:`abort`});this.message.set(e.error?String(e.error):`Aborted navigation #${e.aborted}.`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-current`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:2,vars:1,consts:[[1,`empty`],[1,`url`],[1,`url-label`],[`role`,`note`,1,`note`],[`role`,`status`,1,`muted`],[1,`facts`],[`role`,`region`,`aria-label`,`Active routes`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[`role`,`status`,1,`pending`],[`aria-hidden`,`true`,1,`pulse`],[1,`pending-text`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`route-current-writes-off`,1,`muted`],[1,`path`],[1,`tag`],[1,`sub`],[1,`component`],[1,`entry`],[1,`entry`,`data`],[`aria-hidden`,`true`,1,`nil`],[1,`visually-hidden`],[1,`outlets`],[3,`padding-left`],[1,`muted`],[1,`outlet-data`],[1,`empty-title`]],template:function(e,t){if(e&1&&P(0,Lk,32,8)(1,Rk,8,0,`div`,0),e&2){let e;F((e=t.page().snapshot)?0:1,e)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -1907,7 +1907,13 @@ h3[_ngcontent-%COMP%] { .outlets[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover { background: var(--%NS%surface-2); -}`]})};function Ak(e,t){if(e&1&&(H(0,`span`,8),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().error,` error(s)`)}}function jk(e,t){if(e&1&&(H(0,`span`,9),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().warning,` warning(s)`)}}function Mk(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().info,` info`)}}function Nk(e,t){if(e&1&&(H(0,`span`,3),P(1,Ak,2,1,`span`,8),P(2,jk,2,1,`span`,9),P(3,Mk,2,1,`span`,10),U()),e&2){let e=K();M(),F(e.counts().error?1:-1),M(),F(e.counts().warning?2:-1),M(),F(e.counts().info?3:-1)}}function Pk(e,t){if(e&1){let e=W();H(0,`div`,4)(1,`p`,11),J(2,`The route checks could not run.`),U(),H(3,`p`,2),J(4,`The DevTools server did not answer. Check that it is still running.`),U(),H(5,`button`,1),Qg(`click`,function(){return k(e),A(K().run())}),J(6,`Retry`),U()()}}function Fk(e,t){e&1&&(H(0,`p`,5),J(1,`Checking…`),U())}function Ik(e,t){e&1&&J(0,` This page runs in events-only mode: it has no debug utils (a production build or an unusual setup), so it cannot report its route config. `)}function Lk(e,t){e&1&&J(0,` The page has not reported its route config yet. It appears after the app finishes bootstrapping. `)}function Rk(e,t){e&1&&J(0,` No page with a router is connected. `)}function zk(e,t){if(e&1&&(H(0,`div`,6)(1,`p`,11),J(2,`No checks ran.`),U(),H(3,`p`,2),P(4,Ik,1,0)(5,Lk,1,0)(6,Rk,1,0),U()()),e&2){let e;M(4),F((e=t)===`events-only`?4:e===`no-config`?5:6)}}function Bk(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,10),J(3),U(),H(4,`code`,13),J(5),U(),H(6,`code`,14),J(7),U()(),H(8,`p`,15),J(9),U(),H(10,`p`,16)(11,`span`,17),J(12,`Fix`),U(),H(13,`span`,18),J(14),H(15,`span`,2),J(16),U()()()()),e&2){let e=t.$implicit,n=K(2);N(`data-severity`,e.severity),M(2),N(`data-tone`,n.severityTone(e.severity)),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y(e.route),M(2),Y(e.message),M(5),X(``,e.fix,` `),M(2),X(`(Angular `,e.angular===`throws`?`throws`:e.angular===`warns`?`warns`:`does not warn`,`)`)}}function Vk(e,t){if(e&1&&(H(0,`ul`,7),I(1,Bk,17,8,`li`,null,Cg),U()),e&2){let e=K();N(`aria-busy`,e.checking()),M(),L(e.findings())}}function Hk(e,t){e&1&&(H(0,`div`,6)(1,`span`,19),fs(),H(2,`svg`,20),Fg(3,`path`,21),U()(),ps(),H(4,`p`,11),J(5,`No route config problems found.`),U(),H(6,`p`,2),J(7,`The check runs again after each navigation or config change.`),U()())}var Uk=class e{page=$.required();rpc=$(null);result=j(null);failed=j(!1);checking=j(!1);findings=Q(()=>{let e=this.result();return e?.checked?e.findings:[]});notChecked=Q(()=>{let e=this.result();return e&&!e.checked?e.reason:null});counts=Q(()=>{let e={error:0,warning:0,info:0};for(let t of this.findings())e[t.severity]++;return e});key=Q(()=>{let e=this.page(),t=e.navigations[e.navigations.length-1];return`${e.pageId}:${e.generation}:${t?.id}:${t?.outcome}`});seq=0;checkedPage=null;constructor(){uc(()=>{this.key(),Sv(()=>void this.run())})}severityTone(e){return e===`error`?`bad`:e===`warning`?`warn`:``}async run(){let e=++this.seq,t=this.page().pageId;t!==this.checkedPage&&this.result.set(null),this.checking.set(!0);let n=await qO(this.rpc(),`router-lint`,t);e===this.seq&&(this.checking.set(!1),this.failed.set(!n),n&&(this.result.set(n),this.checkedPage=t))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-lint`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:11,vars:4,consts:[[1,`toolbar`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`],[1,`summary`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`findings`],[`data-tone`,`bad`,1,`badge`],[`data-tone`,`warn`,1,`badge`],[1,`badge`],[1,`empty-title`],[1,`head`],[1,`rule`],[1,`route`],[1,`message`],[1,`fix`],[1,`fix-label`],[1,`fix-text`],[`aria-hidden`,`true`,1,`ok-mark`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`]],template:function(e,t){if(e&1&&(H(0,`div`,0)(1,`button`,1),Qg(`click`,function(){return t.run()}),J(2),U(),H(3,`span`,2),J(4,`Checks the live config, links and recent navigations. Lazy routes that have not loaded are skipped.`),U(),P(5,Nk,4,3,`span`,3),U(),P(6,Pk,7,0,`div`,4)(7,Fk,2,0,`p`,5)(8,zk,7,1,`div`,6)(9,Vk,3,1,`ul`,7)(10,Hk,8,0,`div`,6)),e&2){let e;M(),N(`aria-busy`,t.checking()),M(),X(` `,t.checking()?`Checking…`:`Check again`,` `),M(3),F(t.result()?.checked&&t.findings().length?5:-1),M(),F(t.failed()?6:t.result()?(e=t.notChecked())?8:t.findings().length?9:10:7,e)}},styles:[`.muted[_ngcontent-%COMP%] { +} + +.outlet-data[_ngcontent-%COMP%] { + display: block; + color: var(--%NS%text-2); + font-size: 12px; +}`]})};function Bk(e,t){if(e&1&&(H(0,`span`,8),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().error,` error(s)`)}}function Vk(e,t){if(e&1&&(H(0,`span`,9),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().warning,` warning(s)`)}}function Hk(e,t){if(e&1&&(H(0,`span`,10),J(1),U()),e&2){let e=K(2);M(),X(``,e.counts().info,` info`)}}function Uk(e,t){if(e&1&&(H(0,`span`,3),P(1,Bk,2,1,`span`,8),P(2,Vk,2,1,`span`,9),P(3,Hk,2,1,`span`,10),U()),e&2){let e=K();M(),F(e.counts().error?1:-1),M(),F(e.counts().warning?2:-1),M(),F(e.counts().info?3:-1)}}function Wk(e,t){if(e&1){let e=W();H(0,`div`,4)(1,`p`,11),J(2,`The route checks could not run.`),U(),H(3,`p`,2),J(4,`The DevTools server did not answer. Check that it is still running.`),U(),H(5,`button`,1),Qg(`click`,function(){return k(e),A(K().run())}),J(6,`Retry`),U()()}}function Gk(e,t){e&1&&(H(0,`p`,5),J(1,`Checking…`),U())}function Kk(e,t){e&1&&J(0,` This page runs in events-only mode: it has no debug utils (a production build or an unusual setup), so it cannot report its route config. `)}function qk(e,t){e&1&&J(0,` The page has not reported its route config yet. It appears after the app finishes bootstrapping. `)}function Jk(e,t){e&1&&J(0,` No page with a router is connected. `)}function Yk(e,t){if(e&1&&(H(0,`div`,6)(1,`p`,11),J(2,`No checks ran.`),U(),H(3,`p`,2),P(4,Kk,1,0)(5,qk,1,0)(6,Jk,1,0),U()()),e&2){let e;M(4),F((e=t)===`events-only`?4:e===`no-config`?5:6)}}function Xk(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,10),J(3),U(),H(4,`code`,13),J(5),U(),H(6,`code`,14),J(7),U()(),H(8,`p`,15),J(9),U(),H(10,`p`,16)(11,`span`,17),J(12,`Fix`),U(),H(13,`span`,18),J(14),H(15,`span`,2),J(16),U()()()()),e&2){let e=t.$implicit,n=K(2);N(`data-severity`,e.severity),M(2),N(`data-tone`,n.severityTone(e.severity)),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y(e.route),M(2),Y(e.message),M(5),X(``,e.fix,` `),M(2),X(`(Angular `,e.angular===`throws`?`throws`:e.angular===`warns`?`warns`:`does not warn`,`)`)}}function Zk(e,t){if(e&1&&(H(0,`ul`,7),I(1,Xk,17,8,`li`,null,Cg),U()),e&2){let e=K();N(`aria-busy`,e.checking()),M(),L(e.findings())}}function Qk(e,t){e&1&&(H(0,`div`,6)(1,`span`,19),fs(),H(2,`svg`,20),Fg(3,`path`,21),U()(),ps(),H(4,`p`,11),J(5,`No route config problems found.`),U(),H(6,`p`,2),J(7,`The check runs again after each navigation or config change.`),U()())}var $k=class e{page=$.required();rpc=$(null);result=j(null);failed=j(!1);checking=j(!1);findings=Q(()=>{let e=this.result();return e?.checked?e.findings:[]});notChecked=Q(()=>{let e=this.result();return e&&!e.checked?e.reason:null});counts=Q(()=>{let e={error:0,warning:0,info:0};for(let t of this.findings())e[t.severity]++;return e});key=Q(()=>{let e=this.page(),t=e.navigations[e.navigations.length-1];return`${e.pageId}:${e.generation}:${t?.id}:${t?.outcome}`});seq=0;checkedPage=null;constructor(){uc(()=>{this.key(),Cv(()=>void this.run())})}severityTone(e){return e===`error`?`bad`:e===`warning`?`warn`:``}async run(){let e=++this.seq,t=this.page().pageId;t!==this.checkedPage&&this.result.set(null),this.checking.set(!0);let n=await tk(this.rpc(),`router-lint`,t);e===this.seq&&(this.checking.set(!1),this.failed.set(!n),n&&(this.result.set(n),this.checkedPage=t))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-lint`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:11,vars:4,consts:[[1,`toolbar`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`],[1,`summary`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`findings`],[`data-tone`,`bad`,1,`badge`],[`data-tone`,`warn`,1,`badge`],[1,`badge`],[1,`empty-title`],[1,`head`],[1,`rule`],[1,`route`],[1,`message`],[1,`fix`],[1,`fix-label`],[1,`fix-text`],[`aria-hidden`,`true`,1,`ok-mark`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`]],template:function(e,t){if(e&1&&(H(0,`div`,0)(1,`button`,1),Qg(`click`,function(){return t.run()}),J(2),U(),H(3,`span`,2),J(4,`Checks the live config, links and recent navigations. Lazy routes that have not loaded are skipped.`),U(),P(5,Uk,4,3,`span`,3),U(),P(6,Wk,7,0,`div`,4)(7,Gk,2,0,`p`,5)(8,Yk,7,1,`div`,6)(9,Zk,3,1,`ul`,7)(10,Qk,8,0,`div`,6)),e&2){let e;M(),N(`aria-busy`,t.checking()),M(),X(` `,t.checking()?`Checking…`:`Check again`,` `),M(3),F(t.result()?.checked&&t.findings().length?5:-1),M(),F(t.failed()?6:t.result()?(e=t.notChecked())?8:t.findings().length?9:10:7,e)}},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -2329,7 +2335,7 @@ h3[_ngcontent-%COMP%] { .fix[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%] { font-size: 12px; -}`]})},Wk=(e,t)=>t.name,Gk=(e,t)=>t[0];function Kk(e,t){e&1&&(H(0,`p`,1),J(1,` Events-only mode: this build has no debug utils (production build or unusual setup), so the route config, lint and actions are limited. `),U())}function qk(e,t){if(e&1&&(H(0,`dt`),J(1,`Angular`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.angularVersion)}}function Jk(e,t){if(e&1&&(H(0,`dt`),J(1,`Base href`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.baseHref)}}function Yk(e,t){if(e&1&&(H(0,`dt`),J(1,`Hydration`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),X(``,e.hydrated,` component(s) hydrated from server HTML`)}}function Xk(e,t){if(e&1&&(H(0,`tr`)(1,`td`,5)(2,`code`),J(3),U()(),H(4,`td`)(5,`code`),J(6),U()(),H(7,`td`,6)(8,`span`,7),J(9),U()()()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),Y(e.value),M(2),N(`data-tone`,e.set?`warn`:``),M(),Y(e.set?`set`:`default`)}}function Zk(e,t){if(e&1&&(H(0,`li`)(1,`span`,7),J(2),U()()),e&2){let e=t.$implicit;M(),N(`data-tone`,e[1]===`off`?``:`good`),M(),Z(``,e[0],`: `,e[1])}}function Qk(e,t){if(e&1&&(H(0,`h3`),J(1,`Features`),U(),H(2,`ul`,8),I(3,Zk,3,3,`li`,null,Gk),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.features))}}function $k(e,t){if(e&1&&(H(0,`dt`),J(1),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=t.$implicit;M(),Y(e[0]),M(3),Y(e[1])}}function eA(e,t){if(e&1&&(H(0,`h3`),J(1,`Strategies`),U(),H(2,`dl`,2),I(3,$k,5,2,null,null,Gk),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.strategies))}}function tA(e,t){if(e&1&&(P(0,Kk,2,0,`p`,1),H(1,`dl`,2)(2,`dt`),J(3,`Set up with`),U(),H(4,`dd`),J(5),U(),P(6,qk,4,1),P(7,Jk,5,1),P(8,Yk,4,1),U(),H(9,`h3`),J(10,`Options`),U(),H(11,`div`,3)(12,`table`)(13,`thead`)(14,`tr`)(15,`th`,4),J(16,`Option`),U(),H(17,`th`,4),J(18,`Value`),U(),H(19,`th`,4),J(20,`Source`),U()()(),H(21,`tbody`),I(22,Xk,10,4,`tr`,null,Wk),U()()(),P(24,Qk,5,0),P(25,eA,5,0)),e&2){let e=t,n=K();F(e.mode===`events-only`?0:-1),M(5),Z(` `,e.setupKind,``,e.routers>1?`, `+e.routers+` routers on the page`:``,` `),M(),F(e.angularVersion?6:-1),M(),F(e.baseHref?7:-1),M(),F(e.hydrated?8:-1),M(14),L(e.options),M(2),F(n.entries(e.features).length?24:-1),M(),F(n.entries(e.strategies).length?25:-1)}}function nA(e,t){e&1&&(H(0,`div`,0)(1,`p`,9),J(2,`The page has not reported its router setup yet.`),U(),H(3,`p`,10),J(4,` It appears after the app finishes bootstrapping. Reload the app if it stays empty. `),U()())}var rA=class e{page=$.required();entries(e){return Object.entries(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-setup`]],inputs:{page:[1,`page`]},decls:2,vars:1,consts:[[1,`empty`],[`role`,`note`,1,`note`],[1,`facts`],[`role`,`region`,`aria-label`,`Router options`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`name`],[1,`source`],[1,`badge`],[1,`chips`],[1,`empty-title`],[1,`muted`]],template:function(e,t){if(e&1&&P(0,tA,26,8)(1,nA,5,0,`div`,0),e&2){let e;F((e=t.page().setup)?0:1,e)}},styles:[`.muted[_ngcontent-%COMP%] { +}`]})},eA=(e,t)=>t.name,tA=(e,t)=>t[0];function nA(e,t){e&1&&(H(0,`p`,1),J(1,` Events-only mode: this build has no debug utils (production build or unusual setup), so the route config, lint and actions are limited. `),U())}function rA(e,t){if(e&1&&(H(0,`dt`),J(1,`Angular`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),Y(e.angularVersion)}}function iA(e,t){if(e&1&&(H(0,`dt`),J(1,`Base href`),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=K();M(4),Y(e.baseHref)}}function aA(e,t){if(e&1&&(H(0,`dt`),J(1,`Hydration`),U(),H(2,`dd`),J(3),U()),e&2){let e=K();M(3),X(``,e.hydrated,` component(s) hydrated from server HTML`)}}function oA(e,t){if(e&1&&(H(0,`tr`)(1,`td`,5)(2,`code`),J(3),U()(),H(4,`td`)(5,`code`),J(6),U()(),H(7,`td`,6)(8,`span`,7),J(9),U()()()),e&2){let e=t.$implicit;M(3),Y(e.name),M(3),Y(e.value),M(2),N(`data-tone`,e.set?`warn`:``),M(),Y(e.set?`set`:`default`)}}function sA(e,t){if(e&1&&(H(0,`li`)(1,`span`,7),J(2),U()()),e&2){let e=t.$implicit;M(),N(`data-tone`,e[1]===`off`?``:`good`),M(),Z(``,e[0],`: `,e[1])}}function cA(e,t){if(e&1&&(H(0,`h3`),J(1,`Features`),U(),H(2,`ul`,8),I(3,sA,3,3,`li`,null,tA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.features))}}function lA(e,t){if(e&1&&(H(0,`dt`),J(1),U(),H(2,`dd`)(3,`code`),J(4),U()()),e&2){let e=t.$implicit;M(),Y(e[0]),M(3),Y(e[1])}}function uA(e,t){if(e&1&&(H(0,`h3`),J(1,`Strategies`),U(),H(2,`dl`,2),I(3,lA,5,2,null,null,tA),U()),e&2){let e=K(),t=K();M(3),L(t.entries(e.strategies))}}function dA(e,t){if(e&1&&(P(0,nA,2,0,`p`,1),H(1,`dl`,2)(2,`dt`),J(3,`Set up with`),U(),H(4,`dd`),J(5),U(),P(6,rA,4,1),P(7,iA,5,1),P(8,aA,4,1),U(),H(9,`h3`),J(10,`Options`),U(),H(11,`div`,3)(12,`table`)(13,`thead`)(14,`tr`)(15,`th`,4),J(16,`Option`),U(),H(17,`th`,4),J(18,`Value`),U(),H(19,`th`,4),J(20,`Source`),U()()(),H(21,`tbody`),I(22,oA,10,4,`tr`,null,eA),U()()(),P(24,cA,5,0),P(25,uA,5,0)),e&2){let e=t,n=K();F(e.mode===`events-only`?0:-1),M(5),Z(` `,e.setupKind,``,e.routers>1?`, `+e.routers+` routers on the page`:``,` `),M(),F(e.angularVersion?6:-1),M(),F(e.baseHref?7:-1),M(),F(e.hydrated?8:-1),M(14),L(e.options),M(2),F(n.entries(e.features).length?24:-1),M(),F(n.entries(e.strategies).length?25:-1)}}function fA(e,t){e&1&&(H(0,`div`,0)(1,`p`,9),J(2,`The page has not reported its router setup yet.`),U(),H(3,`p`,10),J(4,` It appears after the app finishes bootstrapping. Reload the app if it stays empty. `),U()())}var pA=class e{page=$.required();entries(e){return Object.entries(e)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-setup`]],inputs:{page:[1,`page`]},decls:2,vars:1,consts:[[1,`empty`],[`role`,`note`,1,`note`],[1,`facts`],[`role`,`region`,`aria-label`,`Router options`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`name`],[1,`source`],[1,`badge`],[1,`chips`],[1,`empty-title`],[1,`muted`]],template:function(e,t){if(e&1&&P(0,dA,26,8)(1,fA,5,0,`div`,0),e&2){let e;F((e=t.page().setup)?0:1,e)}},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -2660,7 +2666,7 @@ h3[_ngcontent-%COMP%] { .facts[_ngcontent-%COMP%] code[_ngcontent-%COMP%] { color: var(--%NS%text-strong); -}`]})},iA=(e,t)=>t.id,aA=(e,t)=>t.phase;function oA(e,t){if(e&1&&(z(0,`p`,6),J(1),B()),e&2){let e=K();M(),Y(e.message())}}function sA(e,t){if(e&1&&(z(0,`p`,7),J(1),B()),e&2){let e=K();M(),Y(e.navigationOff)}}function cA(e,t){e&1&&(z(0,`span`,16),J(1,`→`),B(),z(2,`span`,17),J(3,`then`),B())}function lA(e,t){if(e&1&&(P(0,cA,4,0),z(1,`code`),J(2),B()),e&2){let e=t.$implicit,n=t.$index;F(n===0?-1:0),M(2),Y(e)}}function uA(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),z(3,`span`,16),J(4,` → `),B(),z(5,`span`,17),J(6,` to `),B(),z(7,`code`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.from),M(6),Y(e.to),M(),X(`: `,n.hopCause(e),` `)}}function dA(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,12)(2,`span`,13),J(3),B(),I(4,lA,3,2,null,null,Cg),B(),z(6,`ol`,14),I(7,uA,10,3,`li`,null,Cg),B(),z(9,`p`,15),J(10),B()()),e&2){let e=t.$implicit,n=K(2);M(3),Y(n.loopTitle(e)),M(),L(e.cycle),M(3),L(e.hops),M(3),Y(n.loopMeta(e))}}function fA(e,t){if(e&1&&(z(0,`section`,9)(1,`h3`,10),J(2),B(),I(3,dA,11,2,`div`,11,Cg),B()),e&2){let e=K();M(2),X(` `,e.loops().length===1?`Loop detected`:e.loops().length+` loops detected`,` `),M(),L(e.loops())}}function pA(e,t){if(e&1&&(z(0,`span`),V(1,`i`),J(2),B()),e&2){let e=t.$implicit,n=K(2);M(),C_(`background`,n.color(e)),M(),Y(e)}}function mA(e,t){if(e&1&&(z(0,`time`),J(1),B()),e&2){let e=K().$implicit,t=K(2);M(),Y(t.time(e.startedAt))}}function hA(e,t){if(e&1&&(z(0,`span`,16),J(1,`→`),B(),z(2,`span`,17),J(3,`redirected to`),B(),z(4,`code`,25),J(5),B()),e&2){let e=K().$implicit;M(5),Y(e.finalUrl)}}function gA(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.endedAt===void 0&&e.outcome!==`pending`?`before DevTools connected`:`started before DevTools connected`)}}function _A(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.phases?.total,`ms`)}}function vA(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.endedAt-e.startedAt,`ms`)}}function yA(e,t){e&1&&(z(0,`span`,30),J(1,`probe`),B())}function bA(e,t){if(e&1&&(z(0,`span`,13),J(1,`loop`),z(2,`span`,17),J(3),B()()),e&2){let e=t,n=K(3);M(3),Z(`: part of `,n.loopTitle(e),` `,e.cycle.join(` then `))}}function xA(e,t){if(e&1&&V(0,`span`),e&2){let e=t.$implicit,n=K(4);C_(`width`,e.width,`%`)(`background`,n.color(e.phase)),N(`title`,e.phase+` `+e.ms+`ms`)}}function SA(e,t){if(e&1&&(z(0,`div`,31),I(1,xA,1,5,`span`,36,aA),B()),e&2){let e=K().$implicit,t=K(2);N(`aria-label`,t.barLabel(e)),M(),L(t.bars(e))}}function CA(e,t){if(e&1&&(z(0,`dt`),J(1,`From`),B(),z(2,`dd`)(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.from)}}function wA(e,t){if(e&1&&(z(0,`dt`),J(1,`Started by`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.caller,` (`,e.trigger,`)`)}}function TA(e,t){if(e&1&&(z(0,`dt`),J(1,`Extras`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.extras?.join(`, `))}}function EA(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirect of`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`#`,e.redirectedFrom)}}function DA(e,t){if(e&1&&(z(0,`div`),J(1,` This navigation: `),z(2,`code`),J(3),B(),J(4,` to `),z(5,`code`),J(6),B(),J(7),B()),e&2){let e=t.$implicit,n=K(4);M(3),Y(e.from),M(3),Y(e.to),M(),X(`, `,n.hopCause(e),` `)}}function OA(e,t){if(e&1&&(z(0,`dt`),J(1,`Loop`),B(),z(2,`dd`,37),J(3),I(4,DA,8,3,`div`,null,Cg),B()),e&2){let e=t,n=K().$implicit,r=K(2);M(3),X(` `,e.cycle.join(` → `),` `),M(),L(r.hopsOf(e,n))}}function kA(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirects to`),B(),z(2,`dd`)(3,`code`),J(4),B(),J(5),B()),e&2){let e=K().$implicit;M(4),Y(e.redirectTo),M(),X(` (`,e.redirectKind,`) `)}}function AA(e,t){if(e&1&&(z(0,`dt`),J(1,`Guards`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Z(``,e.guards.names.join(`, `)||`none`,`: `,t.guardResult(e))}}function jA(e,t){if(e&1&&(z(0,`div`)(1,`code`),J(2),B(),J(3),z(4,`code`),J(5),B(),J(6,`: `),z(7,`strong`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(e.guard),M(),X(` `,e.kind,` on `),M(2),Y(e.route),M(2),q(`bad`,n.isBad(e.result)),M(),Y(e.result),M(),X(` (`,e.ms,`ms) `)}}function MA(e,t){if(e&1&&(z(0,`dt`),J(1,`Runs`),B(),z(2,`dd`),I(3,jA,10,7,`div`,null,Cg),B()),e&2){let e=K().$implicit;M(3),L(e.runs)}}function NA(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` leaving `,e.checked.deactivate.join(`, `),`; `)}}function PA(e,t){if(e&1&&(z(0,`dt`),J(1,`Checked`),B(),z(2,`dd`),P(3,NA,1,1),J(4),B()),e&2){let e=K().$implicit;M(3),F(e.checked.deactivate.length?3:-1),M(),X(` entering `,e.checked.activate.join(`, `)||`nothing new`,` `)}}function FA(e,t){if(e&1&&(z(0,`dt`),J(1,`Resolvers`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.resolvers?.names?.join(`, `))}}function IA(e,t){if(e&1&&(z(0,`dt`),J(1,`Lazy loaded`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.lazyLoaded?.join(`, `))}}function LA(e,t){if(e&1&&(z(0,`dt`),J(1,`Reused`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(` `,e.reused?.join(`, `),` (component kept, only inputs and params change) `)}}function RA(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.requests.count,` request(s): `,e.requests.urls.join(`, `))}}function zA(e,t){if(e&1&&(z(0,`dt`),J(1,`Scroll`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.scroll)}}function BA(e,t){if(e&1&&(z(0,`dt`),J(1,`Title after`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.title)}}function VA(e,t){if(e&1&&(z(0,`dt`),J(1,`Warnings`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.warnings?.join(` · `))}}function HA(e,t){if(e&1&&(z(0,`dt`),J(1,`Reason`),B(),z(2,`dd`,37),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Y(t.reasonText(e))}}function UA(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`,37),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorCode)}}function WA(e,t){if(e&1&&(z(0,`dt`),J(1,`Error handler`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorHandler)}}function GA(e,t){if(e&1&&(z(0,`dt`),J(1,`Earlier`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(``,e.earlier,` navigation(s) before DevTools connected`)}}function KA(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,23),P(2,mA,2,1,`time`),z(3,`span`,24),J(4),B(),z(5,`code`,25),J(6),B(),P(7,hA,6,1),z(8,`span`,26)(9,`span`,27),J(10),B(),P(11,gA,2,1,`span`,28)(12,_A,2,1,`span`,29)(13,vA,2,1,`span`,29),P(14,yA,2,0,`span`,30),P(15,bA,4,2,`span`,13),B()(),P(16,SA,3,1,`div`,31),z(17,`dl`,32),P(18,CA,5,1),P(19,wA,4,2),P(20,TA,4,1),P(21,EA,4,1),P(22,OA,6,1),P(23,kA,6,2),P(24,AA,4,2),P(25,MA,5,0),P(26,PA,5,2),P(27,FA,4,1),P(28,IA,4,1),P(29,LA,4,1),P(30,RA,4,2),P(31,zA,4,1),P(32,BA,4,1),P(33,VA,4,1),P(34,HA,4,1),P(35,UA,4,1),P(36,WA,4,1),P(37,GA,4,1),B(),z(38,`div`,33)(39,`button`,34),G(`click`,function(){let t=k(e).$implicit;return A(K(2).replay(t))}),J(40,` Replay `),B(),z(41,`button`,35),G(`click`,function(){let t=k(e).$implicit;return A(K(2).copy(t))}),J(42,` Copy repro `),B()()()}if(e&2){let e,n,r=t.$implicit,i=K(2);q(`in-loop`,!!i.loopOf(r)),M(2),F(r.beforeConnect?-1:2),M(2),X(`#`,r.id),M(2),Y(r.url),M(),F(r.finalUrl&&r.finalUrl!==r.url?7:-1),M(2),N(`data-tone`,i.tone(r.outcome)),M(),Y(r.outcome),M(),F(r.beforeConnect?11:r.phases?.total===void 0?r.endedAt===void 0?-1:13:12),M(3),F(r.probe?14:-1),M(),F((e=i.loopOf(r))?15:-1,e),M(),F(i.bars(r).length?16:-1),M(2),F(r.from?18:-1),M(),F(r.caller?19:-1),M(),F(r.extras?.length?20:-1),M(),F(r.redirectedFrom===void 0?-1:21),M(),F((n=i.loopOf(r))?22:-1,n),M(),F(r.redirectTo?23:-1),M(),F(r.guards&&(r.guards.names.length||r.guards.passed===!1)?24:-1),M(),F(r.runs?.length?25:-1),M(),F(r.checked&&(r.checked.activate.length||r.checked.deactivate.length)?26:-1),M(),F(r.resolvers?.names?.length?27:-1),M(),F(r.lazyLoaded?.length?28:-1),M(),F(r.reused?.length?29:-1),M(),F(r.requests?30:-1),M(),F(r.scroll?31:-1),M(),F(r.title?32:-1),M(),F(r.warnings?.length?33:-1),M(),F(r.reason||r.code?34:-1),M(),F(r.errorCode?35:-1),M(),F(r.errorHandler?36:-1),M(),F(r.earlier?37:-1),M(2),R(`disabled`,!i.navigationAllowed()),N(`aria-describedby`,i.navigationAllowed()?null:`route-timeline-writes-off`)(`aria-label`,`Replay navigation `+r.id),M(2),N(`aria-label`,`Copy repro for navigation `+r.id)}}function qA(e,t){if(e&1&&(z(0,`div`,18)(1,`span`,19),J(2),B(),z(3,`div`,20),I(4,pA,3,3,`span`,null,wg),B()(),z(6,`ol`,21),I(7,KA,43,36,`li`,22,iA),B()),e&2){let e=K();M(2),Z(``,e.items().length,` of `,e.page().navigations.length,` navigation(s)`),M(2),L(e.phases),M(3),L(e.items())}}function JA(e,t){if(e&1){let e=W();z(0,`div`,38)(1,`p`,39),J(2,`No navigations match the current filters.`),B(),z(3,`p`,28),J(4),B(),z(5,`button`,35),G(`click`,function(){k(e);let t=K(2),n=n_(2);return t.clearFilters(),A(n.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2);M(4),X(` `,e.page().navigations.length,` navigation(s) are hidden. Clear the filters to see them. `)}}function YA(e,t){e&1&&(z(0,`div`,38)(1,`p`,39),J(2,`No navigations since DevTools connected.`),B(),z(3,`p`,28),J(4,`Earlier ones are not visible. Click a link in the app to record one.`),B()())}function XA(e,t){e&1&&P(0,JA,7,1,`div`,38)(1,YA,5,0,`div`,38),e&2&&F(+!K().page().navigations.length)}var ZA=[`recognize`,`guards`,`resolve`,`activate`],QA={recognize:`#60a5fa`,guards:`#f59e0b`,resolve:`#2dd4bf`,activate:`#34d399`},$A=class e{page=$.required();rpc=$(null);maxNavigations=Q(()=>tE(this.rpc()).limits.navigations);navigationAllowed=Q(()=>nE(this.rpc(),`router`));navigationOff=HT(`router`);phases=ZA;filter=j(``);onlyProblems=j(!1);message=j(``);loops=Q(()=>this.page().loops??[]);loopById=Q(()=>{let e=new Map;for(let t of this.loops())for(let n of t.ids)e.set(n,t);return e});items=Q(()=>{let e=this.filter().toLowerCase();return[...this.page().navigations].reverse().filter(t=>(!e||t.url.toLowerCase().includes(e)||!!t.finalUrl?.toLowerCase().includes(e))&&(!this.onlyProblems()||![`succeeded`,`pending`].includes(t.outcome)||this.loopById().has(t.id)))});loopOf(e){return this.loopById().get(e.id)}loopTitle(e){return e.kind===`burst`?`navigation loop`:`redirect loop`}hopsOf(e,t){return e.hops.filter(e=>e.id===t.id)}hopCause(e){return e.via===`navigate`?`#${e.id} started by ${e.by??`code`}`:`${e.via===`redirectTo`?`config`:`${e.via} redirect`}${e.by?` ${e.by}`:e.via===`redirectTo`?` redirectTo`:``} in #${e.id}`}loopMeta(e){let t=e.ids.length>1?`Navigations #${e.ids[0]} to #${e.ids[e.ids.length-1]}`:`Navigation #${e.ids[0]}`,n=e.bounces>1?`, came back ${e.bounces} times`:``,r=e.guards.length?` Guards involved: ${e.guards.join(`, `)}.`:``;return`${t}${n}; ${e.end}.${r}`}reasonText(e){return[e.code,e.reason].filter(Boolean).join(`: `)}clearFilters(){this.filter.set(``),this.onlyProblems.set(!1)}tone(e){return YO(e)}color(e){return QA[e]}bars(e){let t=e.phases?.total;return t?ZA.filter(t=>(e.phases?.[t]??0)>0).map(n=>({phase:n,ms:e.phases[n],width:Math.max(1,e.phases[n]/t*100)})):[]}barLabel(e){return`Phases: ${this.bars(e).map(e=>`${e.phase} ${e.ms}ms`).join(`, `)}`}guardResult(e){let t=e.guards?.passed;return t===!0?`passed`:t===!1?e.outcome===`redirected`?`redirected`:`blocked`:e.outcome===`pending`?`running`:`did not finish, navigation ${e.outcome}`}isBad(e){return e===`false`||/^(UrlTree|RedirectCommand|threw)/.test(e)}time=rD;async toggleInstrument(e){let t=e.target.checked,n=await JO(this.rpc(),this.page().pageId,{action:`instrument`,on:t});this.message.set(n?.error?String(n.error):t?`Recording each guard and resolver.`:`Stopped recording guards and resolvers.`)}async replay(e){this.message.set(`Replaying #${e.id}…`);let t=await JO(this.rpc(),this.page().pageId,{action:`replay`,id:e.id});if(!t||t.error){this.message.set(String(t?.error??`Replay failed.`));return}let n=t.replay;this.message.set(`Replay of #${e.id}: ${n?.outcome??`unknown`}${t.same?` (same as before)`:` (different from before)`}.`)}async copy(e){let t=await qO(this.rpc(),`router-export`,{pageId:this.page().pageId,id:e.id});if(!t){this.message.set(`Could not build the repro.`);return}try{await navigator.clipboard.writeText(t),this.message.set(`Copied a markdown repro of #${e.id}.`)}catch{this.message.set(`The clipboard is not available here.`)}}exportJson(){let e=new Blob([JSON.stringify(this.page().navigations,null,2)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`navigations-${this.page().pageId}.json`,n.click(),URL.revokeObjectURL(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-timeline`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:17,vars:9,consts:[[`filterInput`,``],[1,`toolbar`],[`type`,`text`,`aria-label`,`Filter navigations by URL`,`placeholder`,`Filter by URL`,1,`field`,3,`input`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`small`,`export`,3,`click`],[`role`,`status`,1,`message`],[`id`,`route-timeline-writes-off`,1,`message`],[`what`,`navigations`,`limit`,`navigations`,3,`dropped`,`max`],[`aria-labelledby`,`loops-heading`,1,`loops`],[`id`,`loops-heading`],[1,`loop`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`hops`],[1,`muted`,`loop-meta`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[1,`meta-row`],[1,`muted`,`count`],[`aria-hidden`,`true`,1,`legend`],[1,`navs`],[3,`in-loop`],[1,`head`],[1,`id`],[1,`url`],[1,`meta`],[1,`badge`],[1,`muted`],[1,`muted`,`ms`],[1,`tag`],[`role`,`img`,1,`bar`],[1,`details`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`button`,1,`small`,3,`click`],[3,`width`,`background`],[1,`reason`],[1,`empty`],[1,`empty-title`]],template:function(e,t){e&1&&(z(0,`div`,1)(1,`input`,2,0),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),z(3,`label`,3)(4,`input`,4),G(`change`,function(e){return t.onlyProblems.set(e.target.checked)}),B(),J(5,` Only problems `),B(),z(6,`label`,3)(7,`input`,4),G(`change`,function(e){return t.toggleInstrument(e)}),B(),J(8,` Record each guard and resolver `),B(),z(9,`button`,5),G(`click`,function(){return t.exportJson()}),J(10,`Export JSON`),B()(),P(11,oA,2,1,`p`,6),P(12,sA,2,1,`p`,7),V(13,`app-limit-note`,8),P(14,fA,5,1,`section`,9),P(15,qA,9,2)(16,XA,2,1)),e&2&&(M(),R(`value`,t.filter()),M(3),R(`checked`,t.onlyProblems()),M(3),R(`checked`,t.page().instrumented),M(4),F(t.message()?11:-1),M(),F(t.navigationAllowed()?-1:12),M(),R(`dropped`,t.page().dropped??0)(`max`,t.maxNavigations()),M(),F(t.loops().length?14:-1),M(),F(t.items().length?15:16))},dependencies:[oD],styles:[`.muted[_ngcontent-%COMP%] { +}`]})},mA=(e,t)=>t.id,hA=(e,t)=>t.phase;function gA(e,t){if(e&1&&(z(0,`p`,6),J(1),B()),e&2){let e=K();M(),Y(e.message())}}function _A(e,t){if(e&1&&(z(0,`p`,7),J(1),B()),e&2){let e=K();M(),Y(e.navigationOff)}}function vA(e,t){e&1&&(z(0,`span`,16),J(1,`→`),B(),z(2,`span`,17),J(3,`then`),B())}function yA(e,t){if(e&1&&(P(0,vA,4,0),z(1,`code`),J(2),B()),e&2){let e=t.$implicit,n=t.$index;F(n===0?-1:0),M(2),Y(e)}}function bA(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),z(3,`span`,16),J(4,` → `),B(),z(5,`span`,17),J(6,` to `),B(),z(7,`code`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(3);M(2),Y(e.from),M(6),Y(e.to),M(),X(`: `,n.hopCause(e),` `)}}function xA(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,12)(2,`span`,13),J(3),B(),I(4,yA,3,2,null,null,Cg),B(),z(6,`ol`,14),I(7,bA,10,3,`li`,null,Cg),B(),z(9,`p`,15),J(10),B()()),e&2){let e=t.$implicit,n=K(2);M(3),Y(n.loopTitle(e)),M(),L(e.cycle),M(3),L(e.hops),M(3),Y(n.loopMeta(e))}}function SA(e,t){if(e&1&&(z(0,`section`,9)(1,`h3`,10),J(2),B(),I(3,xA,11,2,`div`,11,Cg),B()),e&2){let e=K();M(2),X(` `,e.loops().length===1?`Loop detected`:e.loops().length+` loops detected`,` `),M(),L(e.loops())}}function CA(e,t){if(e&1&&(z(0,`span`),V(1,`i`),J(2),B()),e&2){let e=t.$implicit,n=K(2);M(),C_(`background`,n.color(e)),M(),Y(e)}}function wA(e,t){if(e&1&&(z(0,`time`),J(1),B()),e&2){let e=K().$implicit,t=K(2);M(),Y(t.time(e.startedAt))}}function TA(e,t){if(e&1&&(z(0,`span`,16),J(1,`→`),B(),z(2,`span`,17),J(3,`redirected to`),B(),z(4,`code`,25),J(5),B()),e&2){let e=K().$implicit;M(5),Y(e.finalUrl)}}function EA(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.endedAt===void 0&&e.outcome!==`pending`?`before DevTools connected`:`started before DevTools connected`)}}function DA(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.phases?.total,`ms`)}}function OA(e,t){if(e&1&&(z(0,`span`,29),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.endedAt-e.startedAt,`ms`)}}function kA(e,t){e&1&&(z(0,`span`,30),J(1,`probe`),B())}function AA(e,t){if(e&1&&(z(0,`span`,13),J(1,`loop`),z(2,`span`,17),J(3),B()()),e&2){let e=t,n=K(3);M(3),Z(`: part of `,n.loopTitle(e),` `,e.cycle.join(` then `))}}function jA(e,t){if(e&1&&V(0,`span`),e&2){let e=t.$implicit,n=K(4);C_(`width`,e.width,`%`)(`background`,n.color(e.phase)),N(`title`,e.phase+` `+e.ms+`ms`)}}function MA(e,t){if(e&1&&(z(0,`div`,31),I(1,jA,1,5,`span`,37,hA),B()),e&2){let e=K().$implicit,t=K(2);N(`aria-label`,t.barLabel(e)),M(),L(t.bars(e))}}function NA(e,t){if(e&1&&(z(0,`dt`),J(1,`From`),B(),z(2,`dd`)(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.from)}}function PA(e,t){if(e&1&&(z(0,`dt`),J(1,`Started by`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.caller,` (`,e.trigger,`)`)}}function FA(e,t){if(e&1&&(z(0,`dt`),J(1,`Extras`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.extras?.join(`, `))}}function IA(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirect of`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`#`,e.redirectedFrom)}}function LA(e,t){if(e&1&&(z(0,`div`),J(1,` This navigation: `),z(2,`code`),J(3),B(),J(4,` to `),z(5,`code`),J(6),B(),J(7),B()),e&2){let e=t.$implicit,n=K(4);M(3),Y(e.from),M(3),Y(e.to),M(),X(`, `,n.hopCause(e),` `)}}function RA(e,t){if(e&1&&(z(0,`dt`),J(1,`Loop`),B(),z(2,`dd`,38),J(3),I(4,LA,8,3,`div`,null,Cg),B()),e&2){let e=t,n=K().$implicit,r=K(2);M(3),X(` `,e.cycle.join(` → `),` `),M(),L(r.hopsOf(e,n))}}function zA(e,t){if(e&1&&(z(0,`dt`),J(1,`Redirects to`),B(),z(2,`dd`)(3,`code`),J(4),B(),J(5),B()),e&2){let e=K().$implicit;M(4),Y(e.redirectTo),M(),X(` (`,e.redirectKind,`) `)}}function BA(e,t){if(e&1&&(z(0,`dt`),J(1,`Guards`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Z(``,e.guards.names.join(`, `)||`none`,`: `,t.guardResult(e))}}function VA(e,t){if(e&1&&(z(0,`div`)(1,`code`),J(2),B(),J(3),z(4,`code`),J(5),B(),J(6,`: `),z(7,`strong`),J(8),B(),J(9),B()),e&2){let e=t.$implicit,n=K(4);M(2),Y(e.guard),M(),X(` `,e.kind,` on `),M(2),Y(e.route),M(2),q(`bad`,n.isBad(e.result)),M(),Y(e.result),M(),X(` (`,e.ms,`ms) `)}}function HA(e,t){if(e&1&&(z(0,`dt`),J(1,`Runs`),B(),z(2,`dd`),I(3,VA,10,7,`div`,null,Cg),B()),e&2){let e=K().$implicit;M(3),L(e.runs)}}function UA(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` leaving `,e.checked.deactivate.join(`, `),`; `)}}function WA(e,t){if(e&1&&(z(0,`dt`),J(1,`Checked`),B(),z(2,`dd`),P(3,UA,1,1),J(4),B()),e&2){let e=K().$implicit;M(3),F(e.checked.deactivate.length?3:-1),M(),X(` entering `,e.checked.activate.join(`, `)||`nothing new`,` `)}}function GA(e,t){if(e&1&&(z(0,`dt`),J(1,`Resolvers`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.resolvers?.names?.join(`, `))}}function KA(e,t){if(e&1&&(z(0,`dt`),J(1,`Lazy loaded`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.lazyLoaded?.join(`, `))}}function qA(e,t){if(e&1&&(z(0,`dt`),J(1,`Reused`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(` `,e.reused?.join(`, `),` (component kept, only inputs and params change) `)}}function JA(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Z(``,e.requests.count,` request(s): `,e.requests.urls.join(`, `))}}function YA(e,t){if(e&1&&(z(0,`dt`),J(1,`Scroll`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.scroll)}}function XA(e,t){if(e&1&&(z(0,`dt`),J(1,`Title after`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.title)}}function ZA(e,t){if(e&1&&(z(0,`dt`),J(1,`Warnings`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.warnings?.join(` · `))}}function QA(e,t){if(e&1&&(z(0,`dt`),J(1,`Reason`),B(),z(2,`dd`,38),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),Y(t.reasonText(e))}}function $A(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`,38),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorCode)}}function ej(e,t){if(e&1&&(z(0,`dt`),J(1,`Error handler`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),Y(e.errorHandler)}}function tj(e,t){if(e&1&&(z(0,`dt`),J(1,`Earlier`),B(),z(2,`dd`),J(3),B()),e&2){let e=K().$implicit;M(3),X(``,e.earlier,` navigation(s) before DevTools connected`)}}function nj(e,t){if(e&1&&(z(0,`p`,36),J(1,` Replay is off: the URL is redacted or not relative. `),B()),e&2){let e=K().$implicit;R(`id`,av(`replay-note-`,e.id))}}function rj(e,t){if(e&1){let e=W();z(0,`li`)(1,`div`,23),P(2,wA,2,1,`time`),z(3,`span`,24),J(4),B(),z(5,`code`,25),J(6),B(),P(7,TA,6,1),z(8,`span`,26)(9,`span`,27),J(10),B(),P(11,EA,2,1,`span`,28)(12,DA,2,1,`span`,29)(13,OA,2,1,`span`,29),P(14,kA,2,0,`span`,30),P(15,AA,4,2,`span`,13),B()(),P(16,MA,3,1,`div`,31),z(17,`dl`,32),P(18,NA,5,1),P(19,PA,4,2),P(20,FA,4,1),P(21,IA,4,1),P(22,RA,6,1),P(23,zA,6,2),P(24,BA,4,2),P(25,HA,5,0),P(26,WA,5,2),P(27,GA,4,1),P(28,KA,4,1),P(29,qA,4,1),P(30,JA,4,2),P(31,YA,4,1),P(32,XA,4,1),P(33,ZA,4,1),P(34,QA,4,1),P(35,$A,4,1),P(36,ej,4,1),P(37,tj,4,1),B(),z(38,`div`,33)(39,`button`,34),G(`click`,function(){let t=k(e).$implicit;return A(K(2).replay(t))}),J(40,` Replay `),B(),z(41,`button`,35),G(`click`,function(){let t=k(e).$implicit;return A(K(2).copy(t))}),J(42,` Copy repro `),B(),P(43,nj,2,2,`p`,36),B()()}if(e&2){let e,n,r=t.$implicit,i=K(2);q(`in-loop`,!!i.loopOf(r)),M(2),F(r.beforeConnect?-1:2),M(2),X(`#`,r.id),M(2),Y(r.url),M(),F(r.finalUrl&&r.finalUrl!==r.url?7:-1),M(2),N(`data-tone`,i.tone(r.outcome)),M(),Y(r.outcome),M(),F(r.beforeConnect?11:r.phases?.total===void 0?r.endedAt===void 0?-1:13:12),M(3),F(r.probe?14:-1),M(),F((e=i.loopOf(r))?15:-1,e),M(),F(i.bars(r).length?16:-1),M(2),F(r.from?18:-1),M(),F(r.caller?19:-1),M(),F(r.extras?.length?20:-1),M(),F(r.redirectedFrom===void 0?-1:21),M(),F((n=i.loopOf(r))?22:-1,n),M(),F(r.redirectTo?23:-1),M(),F(r.guards&&(r.guards.names.length||r.guards.passed===!1)?24:-1),M(),F(r.runs?.length?25:-1),M(),F(r.checked&&(r.checked.activate.length||r.checked.deactivate.length)?26:-1),M(),F(r.resolvers?.names?.length?27:-1),M(),F(r.lazyLoaded?.length?28:-1),M(),F(r.reused?.length?29:-1),M(),F(r.requests?30:-1),M(),F(r.scroll?31:-1),M(),F(r.title?32:-1),M(),F(r.warnings?.length?33:-1),M(),F(r.reason||r.code?34:-1),M(),F(r.errorCode?35:-1),M(),F(r.errorHandler?36:-1),M(),F(r.earlier?37:-1),M(2),R(`disabled`,!i.navigationAllowed()||!i.replayable(r)),N(`aria-describedby`,i.replayNote(r))(`aria-label`,`Replay navigation `+r.id),M(2),N(`aria-label`,`Copy repro for navigation `+r.id),M(2),F(i.replayable(r)?-1:43)}}function ij(e,t){if(e&1&&(z(0,`div`,18)(1,`span`,19),J(2),B(),z(3,`div`,20),I(4,CA,3,3,`span`,null,wg),B()(),z(6,`ol`,21),I(7,rj,44,37,`li`,22,mA),B()),e&2){let e=K();M(2),Z(``,e.items().length,` of `,e.page().navigations.length,` navigation(s)`),M(2),L(e.phases),M(3),L(e.items())}}function aj(e,t){if(e&1){let e=W();z(0,`div`,39)(1,`p`,40),J(2,`No navigations match the current filters.`),B(),z(3,`p`,28),J(4),B(),z(5,`button`,35),G(`click`,function(){k(e);let t=K(2),n=n_(2);return t.clearFilters(),A(n.focus())}),J(6,` Clear filters `),B()()}if(e&2){let e=K(2);M(4),X(` `,e.page().navigations.length,` navigation(s) are hidden. Clear the filters to see them. `)}}function oj(e,t){e&1&&(z(0,`div`,39)(1,`p`,40),J(2,`No navigations since DevTools connected.`),B(),z(3,`p`,28),J(4,`Earlier ones are not visible. Click a link in the app to record one.`),B()())}function sj(e,t){e&1&&P(0,aj,7,1,`div`,39)(1,oj,5,0,`div`,39),e&2&&F(+!K().page().navigations.length)}var cj=[`recognize`,`guards`,`resolve`,`activate`],lj={recognize:`#60a5fa`,guards:`#f59e0b`,resolve:`#2dd4bf`,activate:`#34d399`},uj=class e{page=$.required();rpc=$(null);maxNavigations=Q(()=>rE(this.rpc()).limits.navigations);navigationAllowed=Q(()=>iE(this.rpc(),`router`));navigationOff=UT(`router`);phases=cj;filter=j(``);onlyProblems=j(!1);message=j(``);loops=Q(()=>this.page().loops??[]);loopById=Q(()=>{let e=new Map;for(let t of this.loops())for(let n of t.ids)e.set(n,t);return e});items=Q(()=>{let e=this.filter().toLowerCase();return[...this.page().navigations].reverse().filter(t=>(!e||t.url.toLowerCase().includes(e)||!!t.finalUrl?.toLowerCase().includes(e))&&(!this.onlyProblems()||![`succeeded`,`pending`].includes(t.outcome)||this.loopById().has(t.id)))});loopOf(e){return this.loopById().get(e.id)}loopTitle(e){return e.kind===`burst`?`navigation loop`:`redirect loop`}hopsOf(e,t){return e.hops.filter(e=>e.id===t.id)}hopCause(e){return e.via===`navigate`?`#${e.id} started by ${e.by??`code`}`:`${e.via===`redirectTo`?`config`:`${e.via} redirect`}${e.by?` ${e.by}`:e.via===`redirectTo`?` redirectTo`:``} in #${e.id}`}loopMeta(e){let t=e.ids.length>1?`Navigations #${e.ids[0]} to #${e.ids[e.ids.length-1]}`:`Navigation #${e.ids[0]}`,n=e.bounces>1?`, came back ${e.bounces} times`:``,r=e.guards.length?` Guards involved: ${e.guards.join(`, `)}.`:``;return`${t}${n}; ${e.end}.${r}`}reasonText(e){return[e.code,e.reason].filter(Boolean).join(`: `)}clearFilters(){this.filter.set(``),this.onlyProblems.set(!1)}tone(e){return ik(e)}color(e){return lj[e]}bars(e){let t=e.phases?.total;return t?cj.filter(t=>(e.phases?.[t]??0)>0).map(n=>({phase:n,ms:e.phases[n],width:Math.max(1,e.phases[n]/t*100)})):[]}barLabel(e){return`Phases: ${this.bars(e).map(e=>`${e.phase} ${e.ms}ms`).join(`, `)}`}guardResult(e){let t=e.guards?.passed;return t===!0?`passed`:t===!1?e.outcome===`redirected`?`redirected`:`blocked`:e.outcome===`pending`?`running`:`did not finish, navigation ${e.outcome}`}isBad(e){return e===`false`||/^(UrlTree|RedirectCommand|threw)/.test(e)}time=uD;async toggleInstrument(e){let t=e.target,n=t.checked,r=await rk(this.rpc(),this.page().pageId,{action:`instrument`,on:n});if(r.error){t.checked=!!this.page().instrumented,this.message.set(String(r.error));return}this.message.set(n?`Recording each guard and resolver.`:`Stopped recording guards and resolvers.`)}replayable(e){return nk(e.url)}replayNote(e){return this.navigationAllowed()?this.replayable(e)?null:`replay-note-${e.id}`:`route-timeline-writes-off`}async replay(e){this.message.set(`Replaying #${e.id}…`);let t=await rk(this.rpc(),this.page().pageId,{action:`replay`,id:e.id});if(t.error){this.message.set(String(t.error));return}let n=t.replay;this.message.set(`Replay of #${e.id}: ${n?.outcome??`unknown`}${t.same?` (same as before)`:` (different from before)`}.`)}async copy(e){let t=await tk(this.rpc(),`router-export`,{pageId:this.page().pageId,id:e.id});if(!t){this.message.set(`Could not build the repro.`);return}try{await navigator.clipboard.writeText(t),this.message.set(`Copied a markdown repro of #${e.id}.`)}catch{this.message.set(`The clipboard is not available here.`)}}exportJson(){let e=new Blob([JSON.stringify(this.page().navigations,null,2)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`navigations-${this.page().pageId}.json`,n.click(),URL.revokeObjectURL(t)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-timeline`]],inputs:{page:[1,`page`],rpc:[1,`rpc`]},decls:17,vars:9,consts:[[`filterInput`,``],[1,`toolbar`],[`type`,`text`,`aria-label`,`Filter navigations by URL`,`placeholder`,`Filter by URL`,1,`field`,3,`input`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`small`,`export`,3,`click`],[`role`,`status`,1,`message`],[`id`,`route-timeline-writes-off`,1,`message`],[`what`,`navigations`,`limit`,`navigations`,3,`dropped`,`max`],[`aria-labelledby`,`loops-heading`,1,`loops`],[`id`,`loops-heading`],[1,`loop`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`hops`],[1,`muted`,`loop-meta`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[1,`meta-row`],[1,`muted`,`count`],[`aria-hidden`,`true`,1,`legend`],[1,`navs`],[3,`in-loop`],[1,`head`],[1,`id`],[1,`url`],[1,`meta`],[1,`badge`],[1,`muted`],[1,`muted`,`ms`],[1,`tag`],[`role`,`img`,1,`bar`],[1,`details`],[1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`button`,1,`small`,3,`click`],[1,`muted`,`replay-note`,3,`id`],[3,`width`,`background`],[1,`reason`],[1,`empty`],[1,`empty-title`]],template:function(e,t){e&1&&(z(0,`div`,1)(1,`input`,2,0),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),z(3,`label`,3)(4,`input`,4),G(`change`,function(e){return t.onlyProblems.set(e.target.checked)}),B(),J(5,` Only problems `),B(),z(6,`label`,3)(7,`input`,4),G(`change`,function(e){return t.toggleInstrument(e)}),B(),J(8,` Record each guard and resolver `),B(),z(9,`button`,5),G(`click`,function(){return t.exportJson()}),J(10,`Export JSON`),B()(),P(11,gA,2,1,`p`,6),P(12,_A,2,1,`p`,7),V(13,`app-limit-note`,8),P(14,SA,5,1,`section`,9),P(15,ij,9,2)(16,sj,2,1)),e&2&&(M(),R(`value`,t.filter()),M(3),R(`checked`,t.onlyProblems()),M(3),R(`checked`,t.page().instrumented),M(4),F(t.message()?11:-1),M(),F(t.navigationAllowed()?-1:12),M(),R(`dropped`,t.page().dropped??0)(`max`,t.maxNavigations()),M(),F(t.loops().length?14:-1),M(),F(t.items().length?15:16))},dependencies:[pD],styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -3227,6 +3233,12 @@ time[_ngcontent-%COMP%] { border-top: 1px solid var(--%NS%border); } +.replay-note[_ngcontent-%COMP%] { + align-self: center; + margin: 0; + font-size: 12px; +} + @media (max-width: 480px) { .details[_ngcontent-%COMP%] { grid-template-columns: minmax(0, 1fr); @@ -3238,7 +3250,7 @@ time[_ngcontent-%COMP%] { .export[_ngcontent-%COMP%] { margin-left: 0; } -}`]})},ej=()=>[],tj=(e,t)=>t.node.id;function nj(e,t){if(e&1&&(J(0,` with `),H(1,`code`),J(2),uv(3,`json`),U()),e&2){let e=K(2);M(2),Y(fv(3,1,e.params))}}function rj(e,t){if(e&1&&(H(0,`span`,15),J(1,`match`),U(),J(2,` Matches `),H(3,`code`,16),J(4),U(),P(5,nj,4,3)),e&2){let e=K(),t=K();M(4),Y(t.chainText(e)),M(),F(t.hasKeys(e.params)?5:-1)}}function ij(e,t){if(e&1&&(J(0,` Nearest: `),H(1,`code`),J(2),U()),e&2){let e=K(2);M(2),Y(e.nearest.join(`, `))}}function aj(e,t){if(e&1&&(H(0,`span`,17),J(1,`no match`),U(),J(2,` Matches no route (NG04002). `),P(3,ij,3,1)),e&2){let e=K();M(3),F(e.nearest.length?3:-1)}}function oj(e,t){if(e&1&&(H(0,`div`,14),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function sj(e,t){if(e&1&&(H(0,`div`,6),P(1,rj,6,2)(2,aj,4,1),I(3,oj,2,1,`div`,14,wg),U()),e&2){let e=t;N(`data-matched`,e.matched),M(),F(e.matched?1:2),M(2),L(e.notes)}}function cj(e,t){if(e&1&&(H(0,`p`,7),J(1),U()),e&2){let e=K();M(),Y(e.message())}}function lj(e,t){if(e&1&&(H(0,`p`,8),J(1),U()),e&2){let e=K();M(),Y(e.navigationOff)}}function uj(e,t){e&1&&J(0),e&2&&X(` `,t,` route(s) left out: the page lists at most 200 routes per level and 1000 in total. `)}function dj(e,t){if(e&1&&(H(0,`p`,11),J(1),P(2,uj,1,1),U()),e&2){let e,t=K();M(),Z(` Generation `,t.page().generation,` · `,t.rows().length,` route(s). Lazy routes show their children once loaded. `),M(),F((e=t.page().configTruncated)?2:-1,e)}}function fj(e,t){if(e&1&&(H(0,`div`,12)(1,`p`,18),J(2),U(),H(3,`p`,14),J(4),U()()),e&2){let e=K();M(2),X(` `,e.page().setup?.mode===`events-only`?`This build has no debug utils, so the live config cannot be read.`:`The page has not reported its route config yet.`,` `),M(2),X(` `,e.page().setup?.mode===`events-only`?`Run the app with the development build to inspect the live config.`:`It appears once the router initializes. Navigate in the app if it stays empty.`,` `)}}function pj(e,t){if(e&1){let e=W();H(0,`div`,12)(1,`p`,18),J(2,`No routes match the filter.`),U(),H(3,`p`,14),J(4,`Try a shorter path or a component name.`),U(),H(5,`button`,5),Qg(`click`,function(){k(e);let t=K(),n=n_(13);return t.filter.set(``),A(n.focus())}),J(6,` Clear filter `),U()()}}function mj(e,t){e&1&&(H(0,`span`,23),J(1,`active`),U())}function hj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=K().$implicit;M(),X(`lazy `,e.node.lazy)}}function gj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=K().$implicit;M(),X(`outlet `,e.node.outlet)}}function _j(e,t){if(e&1&&(H(0,`span`,24)(1,`span`,20),J(2,`declared in `),U(),J(3),U()),e&2){let e=K().$implicit;M(3),Y(e.source)}}function vj(e,t){if(e&1&&(H(0,`span`,25),J(1,`redirect `),H(2,`span`,29),J(3,`→`),U(),H(4,`code`),J(5),U()()),e&2){let e=K().$implicit;M(5),Y(e.node.redirectTo)}}function yj(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.component??(e.node.lazy===`unloaded`?`lazy, not loaded yet`:e.node.kind),` `)}}function bj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function xj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function Sj(e,t){e&1&&(H(0,`span`,30),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function Cj(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.title,` `)}}function wj(e,t){e&1&&(H(0,`span`,30),J(1,`–`),U(),H(2,`span`,20),J(3,`none`),U())}function Tj(e,t){if(e&1){let e=W();H(0,`input`,33),Qg(`input`,function(t){let n=k(e).$implicit,r=K(2).$implicit;return A(K(2).setParam(r.node.id,n,t.target.value))}),U()}if(e&2){let e=t.$implicit,n=K(2).$implicit;Vg(`placeholder`,e),N(`aria-label`,e+` for `+n.node.fullPath)}}function Ej(e,t){if(e&1){let e=W();I(0,Tj,1,2,`input`,31,wg),H(2,`button`,32),Qg(`click`,function(){k(e);let t=K().$implicit;return A(K(2).navigate(t.node))}),J(3,` Go `),U()}if(e&2){let e=K().$implicit,t=K(2);L(t.params(e.node)),M(2),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`)(`aria-label`,`Navigate to `+e.node.fullPath)}}function Dj(e,t){if(e&1){let e=W();H(0,`button`,5),Qg(`click`,function(){k(e);let t=K().$implicit;return A(K(2).resolveLazy(t.node))}),J(1,` Read lazy `),U()}if(e&2){let e=K().$implicit;N(`aria-label`,`Read lazy routes of `+e.node.fullPath)}}function Oj(e,t){if(e&1&&(H(0,`tr`)(1,`td`,22),J(2),P(3,mj,2,0,`span`,23),P(4,hj,2,1,`span`,23),P(5,gj,2,1,`span`,23),P(6,_j,4,1,`span`,24),U(),H(7,`td`),P(8,vj,6,1,`span`,25)(9,yj,1,1),U(),H(10,`td`),I(11,bj,2,1,`span`,23,wg),I(13,xj,2,1,`span`,23,wg),P(15,Sj,4,0),U(),H(16,`td`),P(17,Cj,1,1)(18,wj,4,0),U(),H(19,`td`,26)(20,`div`,27),P(21,Ej,4,3),P(22,Dj,2,1,`button`,28),U()()()),e&2){let e=t.$implicit,n=K(2);q(`active`,n.isActive(e.node)),M(),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.node.fullPath,` `),M(),F(n.isActive(e.node)?3:-1),M(),F(e.node.lazy?4:-1),M(),F(e.node.outlet?5:-1),M(),F(e.source?6:-1),M(2),F(e.node.redirectTo===void 0?9:8),M(3),L(n.guardList(e.node)),M(2),L(e.node.resolvers??av(14,ej)),M(2),F(!n.guardList(e.node).length&&!e.node.resolvers?.length?15:-1),M(2),F(e.node.title?17:18),M(4),F(n.canNavigate(e.node)?21:-1),M(),F(e.node.kind===`lazy`&&e.node.lazy===`unloaded`?22:-1)}}function kj(e,t){if(e&1&&(H(0,`div`,13)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,19),J(5,`Path`),U(),H(6,`th`,19),J(7,`Target`),U(),H(8,`th`,19),J(9,`Guards and resolvers`),U(),H(10,`th`,19),J(11,`Title`),U(),H(12,`th`,19)(13,`span`,20),J(14,`Actions`),U()()()(),H(15,`tbody`),I(16,Oj,23,15,`tr`,21,tj),U()()()),e&2){let e=K();M(16),L(e.rows())}}var Aj=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>nE(this.rpc(),`router`));navigationOff=HT(`router`);sources=$([]);filter=j(``);testUrl=j(``);match=j(null);message=j(``);paramValues=new Map;active=Q(()=>new Set(this.page().activeIds??[]));rows=Q(()=>{let e=this.filter().toLowerCase(),t=this.sources(),n=[],r=(i,a)=>{for(let o of i){let i=KO(o,t),s=i&&GO(i);(!e||o.fullPath.toLowerCase().includes(e)||o.component?.toLowerCase().includes(e)||s?.toLowerCase().includes(e))&&n.push({node:o,depth:a,source:s}),o.children&&r(o.children,a+1)}};return r(this.page().config??[],0),n});hasKeys(e){return Object.keys(e).length>0}isActive(e){return this.active().has(e.id)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}params(e){return(e.fullPath.match(/:([A-Za-z0-9_]+)/g)??[]).map(e=>e.slice(1))}canNavigate(e){return e.redirectTo===void 0&&!e.outlet&&!e.fullPath.includes(`**`)&&(!!e.component||e.kind===`component`||e.kind===`lazy`)}setParam(e,t,n){this.paramValues.set(e,{...this.paramValues.get(e),[t]:n})}chainText(e){return e.chain.map(e=>e.fullPath).join(` → `)}async predict(){let e=this.testUrl().trim();e&&this.match.set(await qO(this.rpc(),`router-match`,{pageId:this.page().pageId,url:e}))}async probe(){let e=this.testUrl().trim();if(!e)return;this.message.set(`Running the real matcher in the app…`);let t=await JO(this.rpc(),this.page().pageId,{action:`probe`,url:e});if(!t||t.error){this.message.set(String(t?.error??`Probe failed.`));return}this.message.set(t.matched?`The app recognized ${e} and its canMatch guards passed. The probe stopped before canActivate guards and resolvers, so those did not run. See the probe entry in Navigations.`:typeof t.redirectedTo==`string`?`A canMatch guard or the navigation error handler redirected ${e} to ${t.redirectedTo}. The probe stopped that navigation before it rendered anything.`:`The app could not recognize ${e}: ${String(t.reason??``)}`)}async navigate(e){let t=this.paramValues.get(e.id)??{};this.message.set(`Navigating to ${e.fullPath}…`);let n=await JO(this.rpc(),this.page().pageId,{action:`navigate`,pattern:e.fullPath,params:t});this.message.set(!n||n.error?String(n?.error??`Navigation failed.`):`Navigation #${n.id}: ${n.outcome}${n.finalUrl?` at ${n.finalUrl}`:``}.`)}async resolveLazy(e){let t=await JO(this.rpc(),this.page().pageId,{action:`resolve-lazy`,id:e.id});if(!t||t.error){this.message.set(String(t?.error??`Could not read the lazy routes.`));return}let n=t.routes??[];this.message.set(`${e.fullPath} declares ${n.length} route(s): ${n.map(e=>`/${e.path}`).join(`, `)}. The router loads them for real on the first navigation that needs them.`)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-tree`]],inputs:{page:[1,`page`],rpc:[1,`rpc`],sources:[1,`sources`]},decls:18,vars:7,consts:[[`filterInput`,``],[1,`test`,3,`submit`],[`for`,`test-url`],[`id`,`test-url`,`type`,`text`,`placeholder`,`/users/42`,1,`field`,3,`input`,`value`],[`type`,`submit`,1,`small`,`primary`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`result`],[`role`,`status`,1,`message`],[`id`,`route-tree-writes-off`,1,`message`],[1,`filter-row`],[`type`,`text`,`aria-label`,`Filter routes`,`placeholder`,`Filter by path, component or file`,1,`field`,`filter`,3,`input`,`value`],[1,`muted`,`summary`],[1,`empty`],[`role`,`region`,`aria-label`,`Live route config`,`tabindex`,`0`,1,`table-scroll`],[1,`muted`],[`data-tone`,`good`,1,`badge`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`empty-title`],[`scope`,`col`],[1,`visually-hidden`],[3,`active`],[1,`path`],[1,`tag`],[1,`src`],[1,`redirect`],[1,`actions`],[1,`actions-inner`],[`type`,`button`,1,`small`],[`aria-hidden`,`true`],[`aria-hidden`,`true`,1,`nil`],[`type`,`text`,1,`field`,`param`,3,`placeholder`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`text`,1,`field`,`param`,3,`input`,`placeholder`]],template:function(e,t){if(e&1){let e=W();H(0,`form`,1),Qg(`submit`,function(n){return k(e),n.preventDefault(),A(t.predict())}),H(1,`label`,2),J(2,`Test a URL`),U(),H(3,`input`,3),Qg(`input`,function(e){return t.testUrl.set(e.target.value)}),U(),H(4,`button`,4),J(5,`Predict`),U(),H(6,`button`,5),Qg(`click`,function(){return t.probe()}),J(7,`Probe in app`),U()(),P(8,sj,5,2,`div`,6),P(9,cj,2,1,`p`,7),P(10,lj,2,1,`p`,8),H(11,`div`,9)(12,`input`,10,0),Qg(`input`,function(e){return t.filter.set(e.target.value)}),U(),P(14,dj,3,3,`p`,11),U(),P(15,fj,5,2,`div`,12)(16,pj,7,0,`div`,12)(17,kj,18,0,`div`,13)}if(e&2){let e;M(3),Vg(`value`,t.testUrl()),M(5),F((e=t.match())?8:-1,e),M(),F(t.message()?9:-1),M(),F(t.navigationAllowed()?-1:10),M(2),Vg(`value`,t.filter()),M(2),F(t.page().config?14:-1),M(),F(t.page().config?t.rows().length?17:16:15)}},dependencies:[ib],styles:[`.muted[_ngcontent-%COMP%] { +}`]})},dj=()=>[],fj=(e,t)=>t.node.id;function pj(e,t){if(e&1&&(J(0,` with `),H(1,`code`),J(2),dv(3,`json`),U()),e&2){let e=K(2);M(2),Y(pv(3,1,e.params))}}function mj(e,t){if(e&1&&(H(0,`span`,16),J(1,`match`),U(),J(2,` Matches `),H(3,`code`,17),J(4),U(),P(5,pj,4,3)),e&2){let e=K(),t=K();M(4),Y(t.chainText(e)),M(),F(t.hasKeys(e.params)?5:-1)}}function hj(e,t){if(e&1&&(J(0,` Nearest: `),H(1,`code`),J(2),U()),e&2){let e=K(2);M(2),Y(e.nearest.join(`, `))}}function gj(e,t){if(e&1&&(H(0,`span`,18),J(1,`no match`),U(),J(2,` Matches no route (NG04002). `),P(3,hj,3,1)),e&2){let e=K();M(3),F(e.nearest.length?3:-1)}}function _j(e,t){if(e&1&&(H(0,`div`,15),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function vj(e,t){if(e&1&&(H(0,`div`,7),P(1,mj,6,2)(2,gj,4,1),I(3,_j,2,1,`div`,15,wg),U()),e&2){let e=t;N(`data-matched`,e.matched),M(),F(e.matched?1:2),M(2),L(e.notes)}}function yj(e,t){if(e&1&&(H(0,`p`,8),J(1),U()),e&2){let e=K();M(),Y(e.message())}}function bj(e,t){if(e&1&&(H(0,`p`,9),J(1),U()),e&2){let e=K();M(),Y(e.navigationOff)}}function xj(e,t){e&1&&J(0),e&2&&X(` `,t,` route(s) left out: the page lists at most 200 routes per level and 1000 in total. `)}function Sj(e,t){if(e&1&&(H(0,`p`,12),J(1),P(2,xj,1,1),U()),e&2){let e,t=K();M(),Z(` Generation `,t.page().generation,` · `,t.rows().length,` route(s). Lazy routes show their children once loaded. `),M(),F((e=t.page().configTruncated)?2:-1,e)}}function Cj(e,t){if(e&1&&(H(0,`div`,13)(1,`p`,19),J(2),U(),H(3,`p`,15),J(4),U()()),e&2){let e=K();M(2),X(` `,e.page().setup?.mode===`events-only`?`This build has no debug utils, so the live config cannot be read.`:`The page has not reported its route config yet.`,` `),M(2),X(` `,e.page().setup?.mode===`events-only`?`Run the app with the development build to inspect the live config.`:`It appears once the router initializes. Navigate in the app if it stays empty.`,` `)}}function wj(e,t){if(e&1){let e=W();H(0,`div`,13)(1,`p`,19),J(2,`No routes match the filter.`),U(),H(3,`p`,15),J(4,`Try a shorter path or a component name.`),U(),H(5,`button`,6),Qg(`click`,function(){k(e);let t=K(),n=n_(13);return t.filter.set(``),A(n.focus())}),J(6,` Clear filter `),U()()}}function Tj(e,t){e&1&&(H(0,`span`,23),J(1,`active`),U())}function Ej(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=K().$implicit;M(),X(`lazy `,e.node.lazy)}}function Dj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=K().$implicit;M(),X(`outlet `,e.node.outlet)}}function Oj(e,t){if(e&1&&(H(0,`span`,24)(1,`span`,21),J(2,`declared in `),U(),J(3),U()),e&2){let e=K().$implicit;M(3),Y(e.source)}}function kj(e,t){if(e&1&&(H(0,`span`,25),J(1,`redirect `),H(2,`span`,30),J(3,`→`),U(),H(4,`code`),J(5),U()()),e&2){let e=K().$implicit;M(5),Y(e.node.redirectTo)}}function Aj(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.component??(e.node.lazy===`unloaded`?`lazy, not loaded yet`:e.node.kind),` `)}}function jj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function Mj(e,t){if(e&1&&(H(0,`span`,23),J(1),U()),e&2){let e=t.$implicit;M(),X(`resolve `,e)}}function Nj(e,t){e&1&&(H(0,`span`,31),J(1,`–`),U(),H(2,`span`,21),J(3,`none`),U())}function Pj(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.node.title,` `)}}function Fj(e,t){e&1&&(H(0,`span`,31),J(1,`–`),U(),H(2,`span`,21),J(3,`none`),U())}function Ij(e,t){if(e&1){let e=W();H(0,`input`,34),Qg(`input`,function(t){let n=k(e).$implicit,r=K(2).$implicit;return A(K(2).setParam(r.node.id,n,t.target.value))}),U()}if(e&2){let e=t.$implicit,n=K(2).$implicit,r=K(2);Vg(`placeholder`,e),N(`aria-label`,e+` for `+n.node.fullPath)(`aria-invalid`,r.isInvalid(n.node,e)?`true`:null)(`aria-describedby`,r.isInvalid(n.node,e)?`route-tree-row-result`:null)}}function Lj(e,t){if(e&1){let e=W();I(0,Ij,1,4,`input`,32,wg),H(2,`button`,33),Qg(`click`,function(){k(e);let t=K().$implicit,n=n_(1);return A(K(2).navigate(t.node,n))}),J(3,` Go `),U()}if(e&2){let e=K().$implicit,t=K(2);L(t.params(e.node)),M(2),Vg(`disabled`,!t.navigationAllowed()),N(`aria-describedby`,t.navigationAllowed()?null:`route-tree-writes-off`)(`aria-label`,`Navigate to `+e.node.fullPath)}}function Rj(e,t){if(e&1){let e=W();H(0,`button`,6),Qg(`click`,function(){k(e);let t=K().$implicit;return A(K(2).resolveLazy(t.node))}),J(1,` Read lazy `),U()}if(e&2){let e=K().$implicit;N(`aria-label`,`Read lazy routes of `+e.node.fullPath)}}function zj(e,t){if(e&1&&(H(0,`tr`,29)(1,`td`,35)(2,`p`,36),J(3),U()()()),e&2){let e=K(3);M(3),Y(e.rowResult()?.text)}}function Bj(e,t){if(e&1&&(H(0,`tr`,null,1)(2,`td`,22),J(3),P(4,Tj,2,0,`span`,23),P(5,Ej,2,1,`span`,23),P(6,Dj,2,1,`span`,23),P(7,Oj,4,1,`span`,24),U(),H(8,`td`),P(9,kj,6,1,`span`,25)(10,Aj,1,1),U(),H(11,`td`),I(12,jj,2,1,`span`,23,wg),I(14,Mj,2,1,`span`,23,wg),P(16,Nj,4,0),U(),H(17,`td`),P(18,Pj,1,1)(19,Fj,4,0),U(),H(20,`td`,26)(21,`div`,27),P(22,Lj,4,3),P(23,Rj,2,1,`button`,28),U()()(),P(24,zj,4,1,`tr`,29)),e&2){let e=t.$implicit,n=K(2);q(`active`,n.isActive(e.node)),M(2),C_(`padding-left`,14+e.depth*16,`px`),M(),X(` `,e.node.fullPath,` `),M(),F(n.isActive(e.node)?4:-1),M(),F(e.node.lazy?5:-1),M(),F(e.node.outlet?6:-1),M(),F(e.source?7:-1),M(2),F(e.node.redirectTo===void 0?10:9),M(3),L(n.guardList(e.node)),M(2),L(e.node.resolvers??ov(15,dj)),M(2),F(!n.guardList(e.node).length&&!e.node.resolvers?.length?16:-1),M(2),F(e.node.title?18:19),M(4),F(n.canNavigate(e.node)?22:-1),M(),F(e.node.kind===`lazy`&&e.node.lazy===`unloaded`?23:-1),M(),F(n.rowResult()?.id===e.node.id?24:-1)}}function Vj(e,t){if(e&1&&(H(0,`div`,14)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,20),J(5,`Path`),U(),H(6,`th`,20),J(7,`Target`),U(),H(8,`th`,20),J(9,`Guards and resolvers`),U(),H(10,`th`,20),J(11,`Title`),U(),H(12,`th`,20)(13,`span`,21),J(14,`Actions`),U()()()(),H(15,`tbody`),I(16,Bj,25,16,null,null,fj),U()()()),e&2){let e=K();M(16),L(e.rows())}}var Hj=class e{page=$.required();rpc=$(null);navigationAllowed=Q(()=>iE(this.rpc(),`router`));navigationOff=UT(`router`);sources=$([]);filter=j(``);testUrl=j(``);match=j(null);message=j(``);rowResult=j(null);paramValues=j({});checkedRow=j(null);active=Q(()=>new Set(this.page().activeIds??[]));rows=Q(()=>{let e=this.filter().toLowerCase(),t=this.sources(),n=[],r=(i,a)=>{for(let o of i){let i=ek(o,t),s=i&&$O(i);(!e||o.fullPath.toLowerCase().includes(e)||o.component?.toLowerCase().includes(e)||s?.toLowerCase().includes(e))&&n.push({node:o,depth:a,source:s}),o.children&&r(o.children,a+1)}};return r(this.page().config??[],0),n});hasKeys(e){return Object.keys(e).length>0}isActive(e){return this.active().has(e.id)}guardList(e){return Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`))}params(e){return(e.fullPath.match(/:([A-Za-z0-9_]+)/g)??[]).map(e=>e.slice(1))}canNavigate(e){return e.redirectTo===void 0&&!e.outlet&&!e.fullPath.includes(`**`)&&(!!e.component||e.kind===`component`||e.kind===`lazy`)}setParam(e,t,n){this.paramValues.update(r=>({...r,[e]:{...r[e],[t]:n}}))}missingParams(e){let t=this.paramValues()[e.id]??{};return this.params(e).filter(e=>!t[e])}isInvalid(e,t){return this.checkedRow()===e.id&&!this.paramValues()[e.id]?.[t]}chainText(e){return e.chain.map(e=>e.fullPath).join(` → `)}async predict(){let e=this.testUrl().trim();e&&this.match.set(await tk(this.rpc(),`router-match`,{pageId:this.page().pageId,url:e}))}async probe(){let e=this.testUrl().trim();if(!e)return;this.message.set(`Running the real matcher in the app…`);let t=await rk(this.rpc(),this.page().pageId,{action:`probe`,url:e});if(t.error){this.message.set(String(t.error));return}this.message.set(t.matched?`The app recognized ${e} and its canMatch guards passed. The probe stopped before canActivate guards and resolvers, so those did not run. See the probe entry in Navigations.`:typeof t.redirectedTo==`string`?`A canMatch guard or the navigation error handler redirected ${e} to ${t.redirectedTo}. The probe stopped that navigation before it rendered anything.`:`The app could not recognize ${e}: ${String(t.reason??``)}`)}async navigate(e,t){let n=this.missingParams(e);if(n.length){this.checkedRow.set(e.id),this.rowResult.set({id:e.id,text:`Fill in ${n.map(e=>`:${e}`).join(`, `)} to navigate.`}),Array.from(t?.querySelectorAll(`input.param`)??[]).find(e=>!e.value)?.focus();return}this.checkedRow.set(null),this.rowResult.set({id:e.id,text:`Navigating to ${e.fullPath}…`});let r=await rk(this.rpc(),this.page().pageId,{action:`navigate`,pattern:e.fullPath,params:this.paramValues()[e.id]??{}});this.rowResult.set({id:e.id,text:r.error?String(r.error):`Navigation #${r.id}: ${r.outcome}${r.finalUrl?` at ${r.finalUrl}`:``}.`})}async resolveLazy(e){let t=await rk(this.rpc(),this.page().pageId,{action:`resolve-lazy`,id:e.id});if(t.error){this.rowResult.set({id:e.id,text:String(t.error)});return}let n=t.routes??[];this.rowResult.set({id:e.id,text:`${e.fullPath} declares ${n.length} route(s): ${n.map(e=>`/${e.path}`).join(`, `)}. The router loads them for real on the first navigation that needs them.`})}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-tree`]],inputs:{page:[1,`page`],rpc:[1,`rpc`],sources:[1,`sources`]},decls:18,vars:7,consts:[[`filterInput`,``],[`rowEl`,``],[1,`test`,3,`submit`],[`for`,`test-url`],[`id`,`test-url`,`type`,`text`,`placeholder`,`/users/42`,1,`field`,3,`input`,`value`],[`type`,`submit`,1,`small`,`primary`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`result`],[`role`,`status`,1,`message`],[`id`,`route-tree-writes-off`,1,`message`],[1,`filter-row`],[`type`,`text`,`aria-label`,`Filter routes`,`placeholder`,`Filter by path, component or file`,1,`field`,`filter`,3,`input`,`value`],[1,`muted`,`summary`],[1,`empty`],[`role`,`region`,`aria-label`,`Live route config`,`tabindex`,`0`,1,`table-scroll`],[1,`muted`],[`data-tone`,`good`,1,`badge`],[1,`chain`],[`data-tone`,`bad`,1,`badge`],[1,`empty-title`],[`scope`,`col`],[1,`visually-hidden`],[1,`path`],[1,`tag`],[1,`src`],[1,`redirect`],[1,`actions`],[1,`actions-inner`],[`type`,`button`,1,`small`],[1,`row-result`],[`aria-hidden`,`true`],[`aria-hidden`,`true`,1,`nil`],[`type`,`text`,1,`field`,`param`,3,`placeholder`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`type`,`text`,1,`field`,`param`,3,`input`,`placeholder`],[`colspan`,`5`],[`id`,`route-tree-row-result`,`role`,`status`]],template:function(e,t){if(e&1){let e=W();H(0,`form`,2),Qg(`submit`,function(n){return k(e),n.preventDefault(),A(t.predict())}),H(1,`label`,3),J(2,`Test a URL`),U(),H(3,`input`,4),Qg(`input`,function(e){return t.testUrl.set(e.target.value)}),U(),H(4,`button`,5),J(5,`Predict`),U(),H(6,`button`,6),Qg(`click`,function(){return t.probe()}),J(7,`Probe in app`),U()(),P(8,vj,5,2,`div`,7),P(9,yj,2,1,`p`,8),P(10,bj,2,1,`p`,9),H(11,`div`,10)(12,`input`,11,0),Qg(`input`,function(e){return t.filter.set(e.target.value)}),U(),P(14,Sj,3,3,`p`,12),U(),P(15,Cj,5,2,`div`,13)(16,wj,7,0,`div`,13)(17,Vj,18,0,`div`,14)}if(e&2){let e;M(3),Vg(`value`,t.testUrl()),M(5),F((e=t.match())?8:-1,e),M(),F(t.message()?9:-1),M(),F(t.navigationAllowed()?-1:10),M(2),Vg(`value`,t.filter()),M(2),F(t.page().config?14:-1),M(),F(t.page().config?t.rows().length?17:16:15)}},dependencies:[ab],styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -3687,11 +3699,27 @@ tr.active[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child { font-size: 12px; } +.param[aria-invalid=true][_ngcontent-%COMP%] { + border-color: var(--%NS%danger); +} + +.row-result[_ngcontent-%COMP%] td[_ngcontent-%COMP%] { + padding-top: 0; + background: transparent; +} + +.row-result[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { + margin: 0; + color: var(--%NS%text); + font-size: 13px; + overflow-wrap: anywhere; +} + @media (max-width: 480px) { .filter[_ngcontent-%COMP%] { flex-basis: 100%; } -}`]})},jj=(e,t)=>t.id;function Mj(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return k(e),A(K(2).pageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function Nj(e,t){e&1&&P(0,Mj,4,2,`div`,4),e&2&&F(K().pages().length>1?0:-1)}function Pj(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,7),J(2,`Could not load the live router state.`),B(),z(3,`p`,8),J(4,` Check that the dev server with ng-devtools is still running, then retry. `),B(),z(5,`button`,9),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Retry`),B()()}}function Fj(e,t){e&1&&(z(0,`p`,2),J(1,`Loading the live router state…`),B())}function Ij(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K(3);M(),Y(e.problems()),M(2),X(`, `,e.problems(),` problem navigations`)}}function Lj(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selected.set(t.id))}),J(1),P(2,Ij,4,2),B()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`router-tab-`+e.id),N(`aria-selected`,e.id===n.selected())(`aria-controls`,`router-panel-`+e.id)(`tabindex`,e.id===n.selected()?0:-1),M(),X(` `,e.label,` `),M(),F(e.id===`navigations`&&n.problems()>0?2:-1)}}function Rj(e,t){if(e&1&&V(0,`app-route-current`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function zj(e,t){if(e&1&&V(0,`app-route-timeline`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function Bj(e,t){if(e&1&&V(0,`app-route-tree`,14),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())(`sources`,t.sources())}}function Vj(e,t){e&1&&V(0,`app-route-setup`,15),e&2&&R(`page`,K())}function Hj(e,t){if(e&1&&V(0,`app-route-lint`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function Uj(e,t){if(e&1){let e=W();z(0,`div`,10),G(`keydown`,function(t){return k(e),A(K().onKey(t))}),I(1,Lj,3,6,`button`,11,jj),B(),z(3,`div`,12),P(4,Rj,1,2,`app-route-current`,13)(5,zj,1,2,`app-route-timeline`,13)(6,Bj,1,3,`app-route-tree`,14)(7,Vj,1,1,`app-route-setup`,15)(8,Hj,1,2,`app-route-lint`,13),B()}if(e&2){let e,t=K();M(),L(t.tabs),M(2),R(`id`,`router-panel-`+t.selected()),N(`aria-labelledby`,`router-tab-`+t.selected()),M(),F((e=t.selected())===`current`?4:e===`navigations`?5:e===`routes`?6:e===`setup`?7:e===`lint`?8:-1)}}function Wj(e,t){e&1&&(z(0,`div`,3)(1,`p`,7),J(2,`No page is reporting router state yet.`),B(),z(3,`p`,8),J(4,` Open the app in a browser. This view updates as soon as a page connects. `),B()())}var Gj=[{id:`current`,label:`Current`},{id:`navigations`,label:`Navigations`},{id:`routes`,label:`Routes`},{id:`setup`,label:`Setup`},{id:`lint`,label:`Lint`}],Kj=class e{rpc=$(null);sources=$([]);tabs=Gj;selected=j(`current`);pages=j([]);hostPageId=JT();loading=j(!0);failed=j(!1);pageId=wv({source:this.pages,computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId&&e.snapshot)?.pageId??e.find(e=>e.snapshot)?.pageId??e[0]?.pageId??null});unsubscribe=null;destroyRef=E(Cs);page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.pageId())??e[0]??null});problems=Q(()=>(this.page()?.navigations??[]).filter(e=>!e.probe&&[`failed`,`cancelled`,`redirected`].includes(e.outcome)).length);constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{this.pages.set(e?.pages??[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.snapshot?.url??e.pageId,hint:e.pageId})));onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.selected()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.selected.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#router-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-live-route`]],inputs:{rpc:[1,`rpc`],sources:[1,`sources`]},decls:8,vars:2,consts:[[1,`section-head`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`page-pick`],[`id`,`live-route-page-label`,1,`page-label`],[`labelledBy`,`live-route-page-label`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`retry`,3,`click`],[`role`,`tablist`,`aria-label`,`Router views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`page`,`rpc`],[3,`page`,`rpc`,`sources`],[3,`page`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[`aria-hidden`,`true`,1,`count`],[1,`visually-hidden`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`h2`),J(2,`Live router`),B(),P(3,Nj,1,1),B(),P(4,Pj,7,0,`div`,1)(5,Fj,2,0,`p`,2)(6,Uj,9,3)(7,Wj,5,0,`div`,3)),e&2){let e,n;M(3),F((e=t.page())?3:-1,e),M(),F(t.failed()?4:t.loading()?5:(n=t.page())?6:7,n)}},dependencies:[kk,Uk,rA,$A,Aj,XE],styles:[`[_nghost-%COMP%] { +}`]})},Uj=(e,t)=>t.id;function Wj(e,t){if(e&1){let e=W();z(0,`div`,4)(1,`span`,5),J(2,`Page`),B(),z(3,`app-select`,6),G(`valueChange`,function(t){return k(e),A(K(2).pageId.set(t))}),B()()}if(e&2){let e=K(),t=K();M(3),R(`options`,t.pageOptions())(`value`,e.pageId)}}function Gj(e,t){e&1&&P(0,Wj,4,2,`div`,4),e&2&&F(K().pages().length>1?0:-1)}function Kj(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,7),J(2,`Could not load the live router state.`),B(),z(3,`p`,8),J(4,` Check that the dev server with ng-devtools is still running, then retry. `),B(),z(5,`button`,9),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Retry`),B()()}}function qj(e,t){e&1&&(z(0,`p`,2),J(1,`Loading the live router state…`),B())}function Jj(e,t){if(e&1&&(z(0,`span`,17),J(1),B(),z(2,`span`,18),J(3),B()),e&2){let e=K(3);M(),Y(e.problems()),M(2),X(`, `,e.problems(),` problem navigations`)}}function Yj(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selected.set(t.id))}),J(1),P(2,Jj,4,2),B()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`router-tab-`+e.id),N(`aria-selected`,e.id===n.selected())(`aria-controls`,`router-panel-`+e.id)(`tabindex`,e.id===n.selected()?0:-1),M(),X(` `,e.label,` `),M(),F(e.id===`navigations`&&n.problems()>0?2:-1)}}function Xj(e,t){if(e&1&&V(0,`app-route-current`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function Zj(e,t){if(e&1&&V(0,`app-route-timeline`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function Qj(e,t){if(e&1&&V(0,`app-route-tree`,14),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())(`sources`,t.sources())}}function $j(e,t){e&1&&V(0,`app-route-setup`,15),e&2&&R(`page`,K())}function eM(e,t){if(e&1&&V(0,`app-route-lint`,13),e&2){let e=K(),t=K();R(`page`,e)(`rpc`,t.rpc())}}function tM(e,t){if(e&1){let e=W();z(0,`div`,10),G(`keydown`,function(t){return k(e),A(K().onKey(t))}),I(1,Yj,3,6,`button`,11,Uj),B(),z(3,`div`,12),P(4,Xj,1,2,`app-route-current`,13)(5,Zj,1,2,`app-route-timeline`,13)(6,Qj,1,3,`app-route-tree`,14)(7,$j,1,1,`app-route-setup`,15)(8,eM,1,2,`app-route-lint`,13),B()}if(e&2){let e,t=K();M(),L(t.tabs),M(2),R(`id`,`router-panel-`+t.selected()),N(`aria-labelledby`,`router-tab-`+t.selected()),M(),F((e=t.selected())===`current`?4:e===`navigations`?5:e===`routes`?6:e===`setup`?7:e===`lint`?8:-1)}}function nM(e,t){e&1&&(z(0,`div`,3)(1,`p`,7),J(2,`No page is reporting router state yet.`),B(),z(3,`p`,8),J(4,` Open the app in a browser. This view updates as soon as a page connects. `),B()())}var rM=[{id:`current`,label:`Current`},{id:`navigations`,label:`Navigations`},{id:`routes`,label:`Routes`},{id:`setup`,label:`Setup`},{id:`lint`,label:`Lint`}],iM=class e{rpc=$(null);sources=$([]);tabs=rM;selected=j(`current`);pages=j([]);hostPageId=YT();loading=j(!0);failed=j(!1);pageId=Tv({source:this.pages,computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId&&e.snapshot)?.pageId??e.find(e=>e.snapshot)?.pageId??e[0]?.pageId??null});unsubscribe=null;destroyRef=E(Cs);page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.pageId())??e[0]??null});problems=Q(()=>(this.page()?.navigations??[]).filter(e=>!e.probe&&[`failed`,`cancelled`,`redirected`].includes(e.outcome)).length);constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`router`);if(this.destroyRef.destroyed)return;let n=e=>{this.pages.set(e?.pages??[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.snapshot?.url??e.pageId,hint:e.pageId})));onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.selected()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.selected.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#router-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-live-route`]],inputs:{rpc:[1,`rpc`],sources:[1,`sources`]},decls:8,vars:2,consts:[[1,`section-head`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[1,`empty`],[1,`page-pick`],[`id`,`live-route-page-label`,1,`page-label`],[`labelledBy`,`live-route-page-label`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`retry`,3,`click`],[`role`,`tablist`,`aria-label`,`Router views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`page`,`rpc`],[3,`page`,`rpc`,`sources`],[3,`page`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[`aria-hidden`,`true`,1,`count`],[1,`visually-hidden`]],template:function(e,t){if(e&1&&(z(0,`div`,0)(1,`h2`),J(2,`Live router`),B(),P(3,Gj,1,1),B(),P(4,Kj,7,0,`div`,1)(5,qj,2,0,`p`,2)(6,tM,9,3)(7,nM,5,0,`div`,3)),e&2){let e,n;M(3),F((e=t.page())?3:-1,e),M(),F(t.failed()?4:t.loading()?5:(n=t.page())?6:7,n)}},dependencies:[zk,$k,pA,uj,Hj,nD],styles:[`[_nghost-%COMP%] { display: grid; gap: 16px; min-width: 0; @@ -3856,7 +3884,7 @@ h2[_ngcontent-%COMP%] { line-height: 16px; text-align: center; font-variant-numeric: tabular-nums; -}`]})};function qj(e,t){e&1&&J(0,` The Routes tab above shows what the router uses. `)}function Jj(e,t){if(e&1){let e=W();z(0,`button`,13),G(`click`,function(){k(e);let t=K();return A(t.expanded.set(!t.expanded()))}),J(1),B()}if(e&2){let e=K();N(`aria-expanded`,e.expanded()),M(),X(` `,e.expanded()?`Hide table`:`Show table`,` `)}}function Yj(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function Xj(e,t){e&1&&J(0,` Check that the dev server is running, then refresh. `)}function Zj(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,14),J(2,`Could not scan the route files.`),B(),z(3,`p`,15),P(4,Yj,4,0)(5,Xj,1,0),B()()),e&2){let e=K();M(4),F(e.staticReport()?4:5)}}function Qj(e,t){e&1&&(z(0,`p`,12),J(1,`Scanning routes…`),B())}function $j(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,14),J(2,`No routes match the filter.`),B(),z(3,`p`,15),J(4,`Search by path, component, guard, title or file name.`),B(),z(5,`button`,10),G(`click`,function(){k(e);let t=K(2),n=n_(12);return t.filter.set(``),A(n.focus())}),J(6,` Clear filter `),B()()}}function eM(e,t){e&1&&(z(0,`div`,16)(1,`p`,14),J(2,`No routes found.`),B(),z(3,`p`,15),J(4,` Routes are read from `),z(5,`code`),J(6,`*.routes.ts`),B(),J(7,` and `),z(8,`code`),J(9,`*routing.module.ts`),B(),J(10,` files, the files they lazy load, plus Analog pages. Add one and refresh. `),B()())}function tM(e,t){e&1&&P(0,$j,7,0,`div`,16)(1,eM,11,0,`div`,16),e&2&&F(+!K().routes().length)}function nM(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function rM(e,t){if(e&1&&(z(0,`span`,22)(1,`span`,25),J(2,`→`),B(),z(3,`span`,26),J(4,`redirects to`),B(),J(5),B()),e&2){let e=K().$implicit;M(5),X(` `,e.redirectTo)}}function iM(e,t){if(e&1&&(z(0,`code`,23),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function aM(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function oM(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function sM(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function cM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.title,` `)}}function lM(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function uM(e,t){if(e&1&&(z(0,`tr`)(1,`td`,20),J(2),P(3,nM,2,1,`span`,21),B(),z(4,`td`),P(5,rM,6,1,`span`,22)(6,iM,2,1,`code`,23)(7,aM,4,0),B(),z(8,`td`),I(9,oM,2,1,`span`,21,Cg,!1,sM,4,0),B(),z(12,`td`),P(13,cM,1,1)(14,lM,4,0),B(),z(15,`td`,24),J(16),B()()),e&2){let e=t.$implicit,n=K(2);M(2),X(` `,e.fullPath,` `),M(),F(e.kind===`page`?-1:3),M(2),F(e.redirectTo===void 0?e.component?6:7:5),M(4),L(n.checks(e)),M(4),F(e.title?13:14),M(3),Y(n.location(e))}}function dM(e,t){if(e&1&&(z(0,`p`,17),J(1),B(),z(2,`div`,18)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,19),J(7,`Path`),B(),z(8,`th`,19),J(9,`Component / Target`),B(),z(10,`th`,19),J(11,`Guards and resolvers`),B(),z(12,`th`,19),J(13,`Title`),B(),z(14,`th`,19),J(15,`Declared in`),B()()(),z(16,`tbody`),I(17,uM,17,6,`tr`,null,Cg),B()()()),e&2){let e=K();M(),Y_(` `,e.filtered().length,` of `,e.routes().length,` route entries, `,e.navigable(),` navigable `),M(16),L(e.filtered())}}var fM=class e{rpc=$(null);staticReport=Q(()=>eE(this.rpc()));routes=j([]);filter=j(``);loading=j(!1);error=j(!1);live=Lv(Kj);liveHasConfig=Q(()=>!!this.live()?.page()?.config);expanded=wv(()=>!this.liveHasConfig());navigable=Q(()=>this.filtered().filter(e=>e.kind===`page`).length);filtered=Q(()=>{let e=this.filter().toLowerCase().trim(),t=this.routes();return e?t.filter(t=>t.fullPath.toLowerCase().includes(e)||t.component&&t.component.toLowerCase().includes(e)||t.redirectTo&&t.redirectTo.toLowerCase().includes(e)||t.title&&t.title.toLowerCase().includes(e)||this.checks(t).some(t=>t.toLowerCase().includes(e))||t.file.toLowerCase().includes(e)):t});constructor(){uc(()=>{this.rpc()&&this.refresh()})}checks(e){return[...Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`)),...(e.resolvers??[]).map(e=>`resolve ${e}`)]}location(e){return GO(e)}onFilterInput(e){let t=e.target;this.filter.set(t?.value??``)}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.error.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`get-routes`);this.routes.set(t)}catch{this.error.set(!0)}finally{this.loading.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-inspector`]],viewQuery:function(e,t){e&1&&e_(t.live,Kj,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:19,vars:9,consts:[[`filterInput`,``],[3,`rpc`,`sources`],[`aria-labelledby`,`config-heading`,1,`config`],[1,`section-head`],[`id`,`config-heading`],[1,`muted`,`hint`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`],[`id`,`config-body`,1,`config-body`,3,`hidden`],[1,`toolbar`],[`type`,`text`,`aria-label`,`Filter source routes`,`placeholder`,`Filter routes…`,1,`field`,3,`input`,`value`],[`type`,`button`,1,`small`,3,`click`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`,3,`click`],[1,`empty-title`],[1,`muted`],[1,`empty`],[1,`muted`,`count`],[`role`,`region`,`aria-label`,`Source route config table`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`path`],[1,`tag`],[1,`redirect`],[1,`component`],[1,`file`],[`aria-hidden`,`true`],[1,`visually-hidden`],[`aria-hidden`,`true`,1,`nil`]],template:function(e,t){e&1&&(V(0,`app-live-route`,1),z(1,`section`,2)(2,`div`,3)(3,`h2`,4),J(4,`Source route config`),B(),z(5,`span`,5),J(6,` Read from your source files. `),P(7,qj,1,0),B(),P(8,Jj,2,2,`button`,6),B(),z(9,`div`,7)(10,`div`,8)(11,`input`,9,0),G(`input`,function(e){return t.onFilterInput(e)}),B(),z(13,`button`,10),G(`click`,function(){return t.refresh()}),J(14),B()(),P(15,Zj,6,1,`div`,11)(16,Qj,2,0,`p`,12)(17,tM,2,1)(18,dM,19,3),B()()),e&2&&(R(`rpc`,t.rpc())(`sources`,t.routes()),M(7),F(t.liveHasConfig()?7:-1),M(),F(t.liveHasConfig()?8:-1),M(),R(`hidden`,!t.expanded()),M(2),R(`value`,t.filter()),M(2),N(`aria-busy`,t.loading()),M(),X(` `,t.loading()?`Scanning…`:`Refresh`,` `),M(),F(t.error()?15:t.loading()&&t.routes().length===0?16:t.filtered().length===0?17:18))},dependencies:[Kj],styles:[`.muted[_ngcontent-%COMP%] { +}`]})};function aM(e,t){e&1&&J(0,` The Routes tab above shows what the router uses. `)}function oM(e,t){if(e&1){let e=W();z(0,`button`,13),G(`click`,function(){k(e);let t=K();return A(t.expanded.set(!t.expanded()))}),J(1),B()}if(e&2){let e=K();N(`aria-expanded`,e.expanded()),M(),X(` `,e.expanded()?`Hide table`:`Show table`,` `)}}function sM(e,t){e&1&&(J(0,` Run `),z(1,`code`),J(2,`ng-devtools build`),B(),J(3,` again to rebuild the report. `))}function cM(e,t){e&1&&J(0,` Check that the dev server is running, then refresh. `)}function lM(e,t){if(e&1&&(z(0,`div`,11)(1,`p`,14),J(2,`Could not scan the route files.`),B(),z(3,`p`,15),P(4,sM,4,0)(5,cM,1,0),B()()),e&2){let e=K();M(4),F(e.staticReport()?4:5)}}function uM(e,t){e&1&&(z(0,`p`,12),J(1,`Scanning routes…`),B())}function dM(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`p`,14),J(2,`No routes match the filter.`),B(),z(3,`p`,15),J(4,`Search by path, component, guard, title or file name.`),B(),z(5,`button`,10),G(`click`,function(){k(e);let t=K(2),n=n_(12);return t.filter.set(``),A(n.focus())}),J(6,` Clear filter `),B()()}}function fM(e,t){e&1&&(z(0,`div`,16)(1,`p`,14),J(2,`No routes found.`),B(),z(3,`p`,15),J(4,` Routes are read from `),z(5,`code`),J(6,`*.routes.ts`),B(),J(7,` and `),z(8,`code`),J(9,`*routing.module.ts`),B(),J(10,` files, the files they lazy load, plus Analog pages. Add one and refresh. `),B()())}function pM(e,t){e&1&&P(0,dM,7,0,`div`,16)(1,fM,11,0,`div`,16),e&2&&F(+!K().routes().length)}function mM(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.kind)}}function hM(e,t){if(e&1&&(z(0,`span`,22)(1,`span`,25),J(2,`→`),B(),z(3,`span`,26),J(4,`redirects to`),B(),J(5),B()),e&2){let e=K().$implicit;M(5),X(` `,e.redirectTo)}}function gM(e,t){if(e&1&&(z(0,`code`,23),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function _M(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function vM(e,t){if(e&1&&(z(0,`span`,21),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function yM(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function bM(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.title,` `)}}function xM(e,t){e&1&&(z(0,`span`,27),J(1,`–`),B(),z(2,`span`,26),J(3,`none`),B())}function SM(e,t){if(e&1&&(z(0,`tr`)(1,`td`,20),J(2),P(3,mM,2,1,`span`,21),B(),z(4,`td`),P(5,hM,6,1,`span`,22)(6,gM,2,1,`code`,23)(7,_M,4,0),B(),z(8,`td`),I(9,vM,2,1,`span`,21,Cg,!1,yM,4,0),B(),z(12,`td`),P(13,bM,1,1)(14,xM,4,0),B(),z(15,`td`,24),J(16),B()()),e&2){let e=t.$implicit,n=K(2);M(2),X(` `,e.fullPath,` `),M(),F(e.kind===`page`?-1:3),M(2),F(e.redirectTo===void 0?e.component?6:7:5),M(4),L(n.checks(e)),M(4),F(e.title?13:14),M(3),Y(n.location(e))}}function CM(e,t){if(e&1&&(z(0,`p`,17),J(1),B(),z(2,`div`,18)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,19),J(7,`Path`),B(),z(8,`th`,19),J(9,`Component / Target`),B(),z(10,`th`,19),J(11,`Guards and resolvers`),B(),z(12,`th`,19),J(13,`Title`),B(),z(14,`th`,19),J(15,`Declared in`),B()()(),z(16,`tbody`),I(17,SM,17,6,`tr`,null,Cg),B()()()),e&2){let e=K();M(),Y_(` `,e.filtered().length,` of `,e.routes().length,` route entries, `,e.navigable(),` navigable `),M(16),L(e.filtered())}}var wM=class e{rpc=$(null);staticReport=Q(()=>tE(this.rpc()));routes=j([]);filter=j(``);loading=j(!1);error=j(!1);live=Rv(iM);liveHasConfig=Q(()=>!!this.live()?.page()?.config);expanded=Tv(()=>!this.liveHasConfig());navigable=Q(()=>this.filtered().filter(e=>e.kind===`page`).length);filtered=Q(()=>{let e=this.filter().toLowerCase().trim(),t=this.routes();return e?t.filter(t=>t.fullPath.toLowerCase().includes(e)||t.component&&t.component.toLowerCase().includes(e)||t.redirectTo&&t.redirectTo.toLowerCase().includes(e)||t.title&&t.title.toLowerCase().includes(e)||this.checks(t).some(t=>t.toLowerCase().includes(e))||t.file.toLowerCase().includes(e)):t});constructor(){uc(()=>{this.rpc()&&this.refresh()})}checks(e){return[...Object.entries(e.guards??{}).flatMap(([e,t])=>t.map(t=>`${e} ${t}`)),...(e.resolvers??[]).map(e=>`resolve ${e}`)]}location(e){return $O(e)}onFilterInput(e){let t=e.target;this.filter.set(t?.value??``)}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.error.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`get-routes`);this.routes.set(t)}catch{this.error.set(!0)}finally{this.loading.set(!1)}}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-route-inspector`]],viewQuery:function(e,t){e&1&&e_(t.live,iM,5),e&2&&t_()},inputs:{rpc:[1,`rpc`]},decls:19,vars:9,consts:[[`filterInput`,``],[3,`rpc`,`sources`],[`aria-labelledby`,`config-heading`,1,`config`],[1,`section-head`],[`id`,`config-heading`],[1,`muted`,`hint`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`],[`id`,`config-body`,1,`config-body`,3,`hidden`],[1,`toolbar`],[`type`,`text`,`aria-label`,`Filter source routes`,`placeholder`,`Filter routes…`,1,`field`,3,`input`,`value`],[`type`,`button`,1,`small`,3,`click`],[`role`,`alert`,1,`empty`],[`role`,`status`,1,`muted`,`empty`],[`type`,`button`,`aria-controls`,`config-body`,1,`small`,`toggle`,3,`click`],[1,`empty-title`],[1,`muted`],[1,`empty`],[1,`muted`,`count`],[`role`,`region`,`aria-label`,`Source route config table`,`tabindex`,`0`,1,`table-scroll`],[`scope`,`col`],[1,`path`],[1,`tag`],[1,`redirect`],[1,`component`],[1,`file`],[`aria-hidden`,`true`],[1,`visually-hidden`],[`aria-hidden`,`true`,1,`nil`]],template:function(e,t){e&1&&(V(0,`app-live-route`,1),z(1,`section`,2)(2,`div`,3)(3,`h2`,4),J(4,`Source route config`),B(),z(5,`span`,5),J(6,` Read from your source files. `),P(7,aM,1,0),B(),P(8,oM,2,2,`button`,6),B(),z(9,`div`,7)(10,`div`,8)(11,`input`,9,0),G(`input`,function(e){return t.onFilterInput(e)}),B(),z(13,`button`,10),G(`click`,function(){return t.refresh()}),J(14),B()(),P(15,lM,6,1,`div`,11)(16,uM,2,0,`p`,12)(17,pM,2,1)(18,CM,19,3),B()()),e&2&&(R(`rpc`,t.rpc())(`sources`,t.routes()),M(7),F(t.liveHasConfig()?7:-1),M(),F(t.liveHasConfig()?8:-1),M(),R(`hidden`,!t.expanded()),M(2),R(`value`,t.filter()),M(2),N(`aria-busy`,t.loading()),M(),X(` `,t.loading()?`Scanning…`:`Refresh`,` `),M(),F(t.error()?15:t.loading()&&t.routes().length===0?16:t.filtered().length===0?17:18))},dependencies:[iM],styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); font-size: 13px; line-height: 1.5; @@ -4237,7 +4265,7 @@ h2[_ngcontent-%COMP%] { font-family: var(--%NS%font-mono); font-size: 12px; overflow-wrap: anywhere; -}`]})},pM=e=>({id:e,label:`Status history`}),mM=e=>({id:e,label:`Value history`}),hM=(e,t)=>t.kind,gM=(e,t)=>t.name+t.file+t.line,_M=(e,t)=>t.epoch,vM=(e,t)=>t.id;function yM(e,t){if(e&1){let e=W();z(0,`div`,3)(1,`span`,10),J(2,`Graph of`),B(),z(3,`app-select`,11),G(`valueChange`,function(t){return k(e),A(K().pickComponent(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.componentOptions())(`value`,e.pickerValue())}}function bM(e,t){if(e&1&&(z(0,`span`,14),J(1),B()),e&2){let e=K(2);M(),Y(e.sourceNote(e.graph().source))}}function xM(e,t){if(e&1&&(z(0,`p`,4)(1,`span`,12),J(2),B(),z(3,`span`,13),J(4),B(),P(5,bM,2,1,`span`,14),B()),e&2){let e=t,n=K();M(2),Y(e.name),M(2),Y(e.path),M(),F(n.graph().source?5:-1)}}function SM(e,t){if(e&1&&(z(0,`p`,4)(1,`span`,12),J(2),B(),z(3,`span`,14),J(4,`environment injector`),B()()),e&2){let e=K();M(2),Y(e.injectorLabel(t))}}function CM(e,t){e&1&&(z(0,`p`,5),J(1,` The picked component or injector is gone or has no signal graph, so this shows another one. `),B())}function wM(e,t){e&1&&J(0,` The effects registered on this injector and the signals they read. A signal that no effect reads is not part of the graph. Pick a kind to filter. `)}function TM(e,t){e&1&&J(0,` The live signal graph of one component. Only signals that its template or an effect has read appear here; a signal nothing has read yet is not part of the graph. Pick a kind to filter. `)}function EM(e,t){e&1&&J(0,` Every signal, computed and effect found in your source. Pick a kind to filter. `)}function DM(e,t){e&1&&(z(0,`p`,5),J(1,` The live signal graph needs Angular 20.1 or later. This list comes from a source scan. `),B())}function OM(e,t){if(e&1&&(z(0,`p`,5),J(1),B()),e&2){let e=K();M(),Z(` Showing `,e.graph().nodes.length,` of `,t,` signals. The rest and their edges are left out. `)}}function kM(e,t){if(e&1){let e=W();z(0,`button`,15),G(`click`,function(){let t=k(e).$implicit,n=K(2);return A(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,18),z(2,`span`,19),J(3),B(),z(4,`span`,16),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.kind),M(2),Y(e.count)}}function AM(e,t){if(e&1){let e=W();z(0,`div`,7)(1,`button`,15),G(`click`,function(){return k(e),A(K().kind.set(null))}),J(2,` All `),z(3,`span`,16),J(4),B()(),I(5,kM,6,7,`button`,17,hM),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.kindTotal()),M(),L(e.kindCounts())}}function jM(e,t){e&1&&(z(0,`div`,8),V(1,`span`,20),z(2,`p`,21),J(3,`Scanning source for signals…`),B()())}function MM(e,t){e&1&&(z(0,`div`,9)(1,`p`,21),J(2,`No signals found.`),B(),z(3,`p`,22),J(4,` No `),z(5,`code`),J(6,`signal()`),B(),J(7,`, `),z(8,`code`),J(9,`computed()`),B(),J(10,` or `),z(11,`code`),J(12,`effect()`),B(),J(13,` calls were found in your source. To see the live graph, run Angular 20.1 or later with the overlay connected and select a component. `),B()())}function NM(e,t){if(e&1&&(z(0,`span`,32),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`in <`,e.component,`>`)}}function PM(e,t){if(e&1&&(z(0,`div`,25)(1,`div`,27)(2,`span`,28),J(3),B(),z(4,`span`,29),J(5),B()(),z(6,`div`,30)(7,`span`,31),J(8),B(),P(9,NM,4,1),B()()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.name),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.component?9:-1)}}function FM(e,t){if(e&1){let e=W();z(0,`div`,26)(1,`p`,21),J(2,`No signals match.`),B(),z(3,`p`,22),J(4,`Try a different name or kind.`),B(),z(5,`button`,33),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(6,`Clear filters`),B()()}}function IM(e,t){if(e&1&&(z(0,`p`,23),J(1,`Signals from source scan (static analysis):`),B(),z(2,`div`,24),I(3,PM,10,8,`div`,25,gM,!1,FM,7,0,`div`,26),B()),e&2){let e=K();M(3),L(e.filteredSourceSignals())}}function LM(e,t){if(e&1&&(z(0,`span`,39),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.missed,` earlier not captured`)}}function RM(e,t){if(e&1&&(z(0,`li`)(1,`span`,37)(2,`time`),J(3),uv(4,`date`),B(),z(5,`span`,38),J(6),B(),z(7,`span`),J(8),B(),P(9,LM,2,1,`span`,39),B(),z(10,`pre`),J(11),uv(12,`json`),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(pv(4,7,e.at,`HH:mm:ss.SSS`)),M(2),w_(`source-`+e.source),M(),Y(n.sourceLabel(e.source)),M(2),X(`epoch `,e.epoch),M(),F(e.missed?9:-1),M(2),Y(fv(12,10,e.value))}}function zM(e,t){if(e&1&&(z(0,`h4`,34),J(1),B(),z(2,`p`,35),J(3),B(),z(4,`ol`,36),I(5,RM,13,12,`li`,null,_M),B()),e&2){let e=K(),t=e.id,n=e.label,r=K();R(`id`,`history-heading-`+t),M(),Y(n),M(2),Y(r.historySummary(t)),M(),N(`aria-labelledby`,`history-heading-`+t),M(),L(r.selectedHistory())}}function BM(e,t){e&1&&P(0,zM,7,4),e&2&&F(K().selectedHistory().length?0:-1)}function VM(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;w_(`tone-`+K(2).statusTone(e.status)),M(),Y(e.status)}}function HM(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function UM(e,t){if(e&1&&(z(0,`span`,46),J(1),uv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(fv(2,1,e.error))}}function WM(e,t){if(e&1&&(z(0,`span`,46),J(1),uv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(fv(2,1,e.value))}}function GM(e,t){e&1&&(z(0,`p`,22),J(1,` This resource has no name. Pass `),z(2,`code`),J(3,`debugName`),B(),J(4,` to `),z(5,`code`),J(6,`resource()`),B(),J(7,` or `),z(8,`code`),J(9,`httpResource()`),B(),J(10,` to name it here. `),B())}function KM(e,t){if(e&1&&(z(0,`dt`),J(1,`Loading`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.isLoading?`yes`:`no`)}}function qM(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP status`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.statusCode)}}function JM(e,t){if(e&1&&(z(0,`dt`),J(1,`Params`),B(),z(2,`dd`)(3,`pre`,52),J(4),uv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Params of `+e.name),M(),Y(fv(5,2,e.params))}}function YM(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,52),J(4),uv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Value of `+e.name),M(),Y(fv(5,2,e.value))}}function XM(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`)(3,`pre`,52),J(4),uv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Error of `+e.name),M(),Y(fv(5,2,e.error))}}function ZM(e,t){if(e&1&&(z(0,`li`)(1,`span`,53),J(2),B(),z(3,`span`,54),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function QM(e,t){if(e&1&&(z(0,`ul`,34),I(1,ZM,5,4,`li`,null,vM),B()),e&2){let e=K(2).$implicit,t=K(2);R(`id`,`resource-internals-`+e.id),M(),L(t.internalsOf(e))}}function $M(e,t){if(e&1){let e=W();z(0,`div`,47)(1,`h3`,49),J(2),B(),P(3,GM,11,0,`p`,22),z(4,`dl`)(5,`dt`),J(6,`Status`),B(),z(7,`dd`),J(8),B(),P(9,KM,4,1),P(10,qM,4,1),P(11,JM,6,4),P(12,YM,6,4),P(13,XM,6,4),B(),zg(14,50),z(15,`button`,51),G(`click`,function(){k(e);let t=K(3);return A(t.showInternals.set(!t.showInternals()))}),J(16),B(),P(17,QM,3,1,`ul`,34),B()}if(e&2){let e=K().$implicit,t=K(2),n=n_(17);R(`id`,`signal-detail-`+e.id),M(2),Y(e.name),M(),F(e.named?-1:3),M(5),Y(e.status??`unknown`),M(),F(e.isLoading===void 0?-1:9),M(),F(e.statusCode===void 0?-1:10),M(),F(e.params===void 0?-1:11),M(),F(e.value===void 0?-1:12),M(),F(e.error===void 0?-1:13),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,ov(16,pM,e.id)),M(),N(`aria-expanded`,t.showInternals())(`aria-controls`,`resource-internals-`+e.id),M(),Z(` `,t.showInternals()?`Hide`:`Show`,` internal signals (`,e.nodeIds.length,`) `),M(),F(t.showInternals()?17:-1)}}function eN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,42),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.id))}),z(2,`span`,27)(3,`span`,28),J(4,`resource`),B(),z(5,`span`,29),J(6),B(),P(7,VM,2,3,`span`,43),P(8,HM,2,2,`span`,44),V(9,`span`,45),B(),P(10,UM,3,3,`span`,46)(11,WM,3,3,`span`,46),B(),P(12,$M,18,18,`div`,47),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id),M(2),C_(`background`,r.kindColor(`resource`)),M(3),Y(n.name),M(),F(n.status?7:-1),M(),F((e=n.changes)?8:-1,e),M(2),F(n.error===void 0?n.value===void 0?-1:11:10),M(2),F(r.selectedId()===n.id?12:-1)}}function tN(e,t){if(e&1&&(z(0,`h2`,40),J(1,`Resources`),B(),z(2,`ul`,41),I(3,eN,13,11,`li`,null,vM),B()),e&2){let e=K();M(3),L(e.filteredResources())}}function nN(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function rN(e,t){if(e&1&&(z(0,`span`,46),J(1),uv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(fv(2,1,e.value))}}function iN(e,t){if(e&1&&(z(0,`span`,32),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Deps: `,t.getDependencies(e).length)}}function aN(e,t){if(e&1&&(z(0,`span`,32),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Consumers: `,t.getConsumers(e).length)}}function oN(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,52),J(4),uv(5,`json`),B()()),e&2){let e=K(4);M(3),N(`aria-label`,`Value of `+(e.selectedNode().label??`signal`)),M(),Y(fv(5,2,e.selectedNode().value))}}function sN(e,t){if(e&1&&(z(0,`li`)(1,`span`,53),J(2),B(),z(3,`span`,54),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function cN(e,t){if(e&1&&(z(0,`h4`),J(1,`Dependencies (producers)`),B(),z(2,`ul`),I(3,sN,5,4,`li`,null,vM),B()),e&2){let e=K(4);M(3),L(e.getDependencies(e.selectedNode()))}}function lN(e,t){if(e&1&&(z(0,`li`)(1,`span`,53),J(2),B(),z(3,`span`,54),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function uN(e,t){if(e&1&&(z(0,`h4`),J(1,`Consumers`),B(),z(2,`ul`),I(3,lN,5,4,`li`,null,vM),B()),e&2){let e=K(4);M(3),L(e.getConsumers(e.selectedNode()))}}function dN(e,t){if(e&1&&(z(0,`div`,47)(1,`h3`,49),J(2),B(),z(3,`dl`)(4,`dt`),J(5,`Kind`),B(),z(6,`dd`),J(7),B(),z(8,`dt`),J(9,`Epoch`),B(),z(10,`dd`),J(11),B(),P(12,oN,6,4),B(),P(13,cN,5,0),P(14,uN,5,0),zg(15,50),B()),e&2){let e=K().$implicit,t=K(2),n=n_(17);R(`id`,`signal-detail-`+e.id),M(2),Y(t.selectedNode().label??t.selectedNode().id),M(5),Y(t.selectedNode().kind),M(4),Y(t.selectedNode().epoch),M(),F(t.selectedNode().value===void 0?-1:12),M(),F(t.getDependencies(t.selectedNode()).length?13:-1),M(),F(t.getConsumers(t.selectedNode()).length?14:-1),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,ov(9,mM,e.id))}}function fN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,42),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.id))}),z(2,`span`,27)(3,`span`,28),J(4),B(),z(5,`span`,29),J(6),B(),P(7,nN,2,2,`span`,44),V(8,`span`,45),B(),P(9,rN,3,3,`span`,46),z(10,`span`,30)(11,`span`),J(12),B(),P(13,iN,4,1),P(14,aN,4,1),B()(),P(15,dN,16,11,`div`,47),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id),M(2),C_(`background`,r.kindColor(n.kind)),M(),Y(n.kind),M(2),Y(n.label??`(unnamed)`),M(),F((e=r.changeCount(n.id))?7:-1,e),M(2),F(n.value===void 0?-1:9),M(3),X(`Epoch: `,n.epoch),M(),F(r.getDependencies(n).length?13:-1),M(),F(r.getConsumers(n).length?14:-1),M(),F(r.selectedId()===n.id&&r.selectedNode()?15:-1)}}function pN(e,t){if(e&1){let e=W();z(0,`button`,33),G(`click`,function(){return k(e),A(K(3).clearFilters())}),J(1,`Clear filters`),B()}}function mN(e,t){if(e&1&&(z(0,`li`,56)(1,`p`,21),J(2),B(),z(3,`p`,22),J(4),B(),P(5,pN,2,0,`button`,57),B()),e&2){let e=K(2);M(2),X(` `,e.visibleNodes().length?`No signals match.`:`No signals in this graph.`,` `),M(2),X(` `,e.visibleNodes().length?`Try a different name or kind.`:`Select a component that reads signals, or interact with the page to create some.`,` `),M(),F(e.visibleNodes().length?5:-1)}}function hN(e,t){if(e&1&&(z(0,`h2`,40),J(1,`Signals`),B(),z(2,`ul`,55),I(3,fN,16,14,`li`,null,vM,!1,mN,6,3,`li`,56),B()),e&2){let e=K();M(3),L(e.filteredNodes())}}var gN=`follow`,_N=`env:`,vN=50,yN={selected:`picked`,routed:`rendered by the router`,root:`first component with signals`},bN={write:`set`,sample:`sampled`,initial:`initial`},xN={resolved:`ok`,local:`ok`,loading:`warn`,reloading:`warn`,error:`danger`},SN={signal:`#facc15`,computed:`#60a5fa`,linkedSignal:`#34d399`,effect:`#fb923c`,template:`#94a3b8`,afterRenderEffectPhase:`#f472b6`,childSignalProp:`#fef08a`,"input (signal)":`#f59e0b`,"input.required (signal)":`#f59e0b`,"output (signal)":`#ec4899`,"model (signal)":`#14b8a6`,"model.required (signal)":`#14b8a6`,"viewChild (signal)":`#a3e635`,"viewChild.required (signal)":`#a3e635`,"viewChildren (signal)":`#a3e635`,"contentChild (signal)":`#fda4af`,"contentChild.required (signal)":`#fda4af`,"contentChildren (signal)":`#fda4af`,resource:`#06b6d4`,unknown:`var(--text-2)`},CN=class e{rpc=$(null);destroyRef=E(Cs);pageId=JT();cleanups=[];treePages=j({});picked=j(null);graph=j(null);unsupported=j(!1);showInternals=j(!1);sourceSignals=j([]);sourceLoaded=j(!1);filter=j(``);kind=j(null);resources=Q(()=>this.graph()?.resources??[]);internalIds=Q(()=>new Set(this.resources().flatMap(e=>e.nodeIds)));visibleNodes=Q(()=>{let e=this.internalIds();return(this.graph()?.nodes??[]).filter(t=>!e.has(t.id))});kindCounts=Q(()=>{let e=this.graph()?[...this.visibleNodes().map(e=>e.kind),...this.resources().map(()=>`resource`)]:this.sourceSignals().map(e=>e.kind),t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return[...t].map(([e,t])=>({kind:e,count:t}))});kindTotal=Q(()=>this.kindCounts().reduce((e,t)=>e+t.count,0));selectedId=j(null);selectedNode=Q(()=>this.graph()?.nodes.find(e=>e.id===this.selectedId())??null);selectedHistory=Q(()=>{let e=this.selectedId();return e?[...this.graph()?.history?.[e]??[]].reverse():[]});kindLegend=Object.entries(SN).map(([e,t])=>({kind:e,color:t}));filteredResources=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return t&&t!==`resource`?[]:this.resources().filter(t=>!e||t.name.toLowerCase().includes(e)||`resource`.includes(e))});filteredNodes=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.visibleNodes().filter(n=>(!t||n.kind===t)&&(!e||(n.label??``).toLowerCase().includes(e)||n.kind.toLowerCase().includes(e))).sort((e,t)=>e.id.localeCompare(t.id,void 0,{numeric:!0}))});filteredSourceSignals=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.sourceSignals().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.toLowerCase().includes(e)||n.file.toLowerCase().includes(e)))});targetPageId=Q(()=>this.pageId??this.graph()?.pageId??this.latestTreePage()?.pageId??null);latestTreePage=Q(()=>{let e=null;for(let[t,n]of Object.entries(this.treePages())){let r=n.reportedAt??0;(!e||r>e.reportedAt)&&(e={pageId:t,reportedAt:r})}return e});componentOptions=Q(()=>{let e=this.targetPageId(),t=(e?this.treePages()[e]?.roots:void 0)??[],n=[],r=e=>{for(let t of e)n.push(t),r(t.children)};r(t);let i=this.graph()?.environments??[];if(!n.length&&!i.length)return[];let a=new Map;for(let e of n)a.set(e.name,(a.get(e.name)??0)+1);let o=new Map,s=[{value:gN,label:`Follow the routed component`,hint:`automatic`},...i.map(e=>({value:_N+e.id,label:this.injectorLabel(e),hint:`injector`}))];for(let e of n){let t=(o.get(e.name)??0)+1;o.set(e.name,t),s.push({value:e.id,label:(a.get(e.name)??0)>1?`${e.name} #${t}`:e.name,hint:`<${e.tag}>`})}return s});pickerValue=Q(()=>{let e=this.picked();return e&&this.componentOptions().some(t=>t.value===e)?e:gN});constructor(){uc(()=>{let e=this.rpc();e&&(this.loadSignalGraph(e),this.loadSourceSignals(e))}),this.destroyRef.onDestroy(()=>{for(let e of this.cleanups.splice(0))e()})}async loadSignalGraph(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`ng-devtools`);try{let e=await t.rpc.sharedState(`signal-graph`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=(this.pageId?t?.pages?.[this.pageId]:t?.graph)??null;this.unsupported.set(!!n?.unsupported);let r=n?.unsupported?null:n,i=e=>e?.component?.id??e?.injector?.id;i(r)!==i(this.graph())&&this.selectedId.set(null),this.graph.set(r)};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.graph.set(null)}try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.treePages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.treePages.set({})}}pickComponent(e){let t=e&&e!==gN?e:null;this.picked.set(t);let n=this.rpc();if(!n)return;let r=this.targetPageId()??void 0,i=t?.startsWith(_N)?{pageId:r,env:t.slice(4)}:{pageId:r,id:t};n.scope(`ng-devtools`).rpc.call(`select-signal-target`,i).catch(()=>{})}injectorLabel(e){return e.name===`Root`?`Root services`:e.name}sourceNote(e){return yN[e]}async loadSourceSignals(e){let t=e.scope(`ng-devtools`);try{let e=await t.rpc.call(`get-signals`);this.sourceSignals.set(e)}catch{}finally{this.sourceLoaded.set(!0)}}clearFilters(){this.filter.set(``),this.kind.set(null)}select(e){this.selectedId.set(this.selectedId()===e?null:e),this.showInternals.set(!1)}changeCount(e){let t=this.graph(),n=t?.nodes.find(t=>t.id===e)?.changes??t?.resources?.find(t=>t.id===e)?.changes;return n===void 0?(t?.history?.[e]??[]).reduce((e,t)=>e+(t.source===`initial`?0:1+(t.missed??0)),0):n}historySummary(e){let t=this.changeCount(e),n=this.graph()?.history?.[e]?.length??0;return t?`${`${t} ${t===1?`change`:`changes`} recorded`}${n>=vN&&t>=n?`, showing the last ${n}`:``}, newest first.`:`No changes recorded yet. The entry below is the value seen first.`}statusTone(e){return xN[e]??`neutral`}internalsOf(e){let t=new Set(e.nodeIds);return(this.graph()?.nodes??[]).filter(e=>t.has(e.id))}sourceLabel(e){return bN[e]}kindColor(e){return SN[e]??SN.unknown}getDependencies(e){let t=this.graph();if(!t)return[];let n=t.nodes.findIndex(t=>t.id===e.id);return t.edges.filter(e=>e.consumer===n).map(e=>t.nodes[e.producer]).filter(Boolean)}getConsumers(e){let t=this.graph();if(!t)return[];let n=t.nodes.findIndex(t=>t.id===e.id);return t.edges.filter(e=>e.producer===n).map(e=>t.nodes[e.consumer]).filter(Boolean)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-signal-inspector`]],inputs:{rpc:[1,`rpc`]},decls:20,vars:13,consts:[[`historyTpl`,``],[1,`toolbar`],[`type`,`text`,`placeholder`,`Filter by name or kind…`,`aria-label`,`Filter signals by name or kind`,3,`input`,`value`],[1,`picker`],[1,`showing`],[`role`,`status`,1,`fallback`],[1,`intro`],[`role`,`group`,`aria-label`,`Filter by kind`,1,`kinds`],[`role`,`status`,1,`empty`],[1,`empty`],[`id`,`signals-component-label`,1,`label-key`],[`labelledBy`,`signals-component-label`,3,`valueChange`,`options`,`value`],[1,`showing-name`],[1,`mono`],[1,`source-note`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[`aria-hidden`,`true`,1,`dot`],[1,`chip-text`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`hint`],[1,`source-label`],[1,`nodes`],[1,`node-card`],[`role`,`status`,1,`empty`,`compact`],[1,`node-header`],[1,`kind-badge`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[`aria-hidden`,`true`,1,`sep`],[`type`,`button`,1,`reset`,3,`click`],[3,`id`],[1,`history-summary`],[`tabindex`,`0`,1,`history`,`scroll-box`],[1,`history-meta`],[1,`source-tag`],[1,`missed`],[1,`list-heading`],[`role`,`list`,1,`nodes`,`resources`],[`type`,`button`,1,`node-card`,3,`click`],[1,`status-tag`,3,`class`],[1,`changed-badge`],[`aria-hidden`,`true`,1,`chevron`],[1,`node-value`],[1,`detail-panel`,3,`id`],[1,`status-tag`],[1,`detail-title`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`type`,`button`,1,`reset`,`internals-toggle`,3,`click`],[`role`,`region`,`tabindex`,`0`,1,`scroll-box`],[1,`kind-badge`,`sm`],[1,`rel-label`],[`role`,`list`,1,`nodes`],[1,`empty`,`compact`],[`type`,`button`,1,`reset`]],template:function(e,t){if(e&1&&(z(0,`div`,1)(1,`input`,2),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),P(2,yM,4,2,`div`,3),B(),P(3,xM,6,3,`p`,4)(4,SM,5,1,`p`,4),P(5,CM,2,0,`p`,5),z(6,`p`,6),P(7,wM,1,0)(8,TM,1,0)(9,EM,1,0),B(),P(10,DM,2,0,`p`,5),P(11,OM,2,2,`p`,5),P(12,AM,7,4,`div`,7),P(13,jM,4,0,`div`,8),P(14,MM,14,0,`div`,9),P(15,IM,6,1),tg(16,BM,1,1,`ng-template`,null,0,hv),P(18,tN,5,0),P(19,hN,6,1)),e&2){let e,n;M(),R(`value`,t.filter()),M(),F(t.componentOptions().length?2:-1),M(),F((e=t.graph()?.component)?3:(e=t.graph()?.injector)?4:-1,e),M(2),F(t.graph()&&t.picked()&&t.graph().source!==`selected`?5:-1),M(2),F(t.graph()?.injector?7:t.graph()?8:9),M(3),F(t.unsupported()?10:-1),M(),F((n=t.graph()?.nodeCount)?11:-1,n),M(),F(t.kindCounts().length?12:-1),M(),F(!t.graph()&&!t.sourceLoaded()?13:-1),M(),F(!t.graph()&&t.sourceLoaded()&&t.sourceSignals().length===0?14:-1),M(),F(!t.graph()&&t.sourceSignals().length>0?15:-1),M(3),F(t.graph()&&t.filteredResources().length?18:-1),M(),F(t.graph()&&(t.visibleNodes().length||!t.filteredResources().length)?19:-1)}},dependencies:[Qy,XE,rb,ib],styles:[`[_nghost-%COMP%] { +}`]})},TM=e=>({id:e,label:`Status history`}),EM=e=>({id:e,label:`Value history`}),DM=(e,t)=>t.kind,OM=(e,t)=>t.name+t.file+t.line,kM=(e,t)=>t.epoch,AM=(e,t)=>t.id;function jM(e,t){if(e&1){let e=W();z(0,`div`,3)(1,`span`,11),J(2,`Graph of`),B(),z(3,`app-select`,12),G(`valueChange`,function(t){return k(e),A(K().pickComponent(t))}),B()()}if(e&2){let e=K();M(3),R(`options`,e.componentOptions())(`value`,e.pickerValue())}}function MM(e,t){if(e&1&&(z(0,`span`,15),J(1),B()),e&2){let e=K(2);M(),Y(e.sourceNote(e.graph().source))}}function NM(e,t){if(e&1&&(z(0,`p`,4)(1,`span`,13),J(2),B(),z(3,`span`,14),J(4),B(),P(5,MM,2,1,`span`,15),B()),e&2){let e=t,n=K();M(2),Y(e.name),M(2),Y(e.path),M(),F(n.graph().source?5:-1)}}function PM(e,t){if(e&1&&(z(0,`p`,4)(1,`span`,13),J(2),B(),z(3,`span`,15),J(4,`environment injector`),B()()),e&2){let e=K();M(2),Y(e.injectorLabel(t))}}function FM(e,t){e&1&&(z(0,`p`,5),J(1,` The picked component or injector is gone or has no signal graph, so this shows another one. `),B())}function IM(e,t){e&1&&J(0,` The effects registered on this injector and the signals they read. A signal that no effect reads is not part of the graph. Pick a kind to filter. `)}function LM(e,t){e&1&&J(0,` The live signal graph of one component. Only signals that its template or an effect has read appear here; a signal nothing has read yet is not part of the graph. Pick a kind to filter. `)}function RM(e,t){e&1&&J(0,` Every signal, computed and effect found in your source. Pick a kind to filter. `)}function zM(e,t){e&1&&(z(0,`p`,5),J(1,` The live signal graph needs Angular 20.1 or later. This list comes from a source scan. `),B())}function BM(e,t){e&1&&(z(0,`p`,5),J(1,` The signal write hook did not load. Value history shows sampled values only, with no exact set entries. `),B())}function VM(e,t){if(e&1&&(z(0,`p`,5),J(1),B()),e&2){let e=K();M(),Z(` Showing `,e.graph().nodes.length,` of `,t,` signals. The rest and their edges are left out. `)}}function HM(e,t){if(e&1){let e=W();z(0,`button`,16),G(`click`,function(){let t=k(e).$implicit,n=K(2);return A(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,19),z(2,`span`,20),J(3),B(),z(4,`span`,17),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.kind),M(2),Y(e.count)}}function UM(e,t){if(e&1){let e=W();z(0,`div`,7)(1,`button`,16),G(`click`,function(){return k(e),A(K().kind.set(null))}),J(2,` All `),z(3,`span`,17),J(4),B()(),I(5,HM,6,7,`button`,18,DM),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.kindTotal()),M(),L(e.kindCounts())}}function WM(e,t){e&1&&(z(0,`div`,8),V(1,`span`,21),z(2,`p`,22),J(3,`Scanning source for signals…`),B()())}function GM(e,t){e&1&&(z(0,`div`,9)(1,`p`,22),J(2,`No signals found.`),B(),z(3,`p`,23),J(4,` No `),z(5,`code`),J(6,`signal()`),B(),J(7,`, `),z(8,`code`),J(9,`computed()`),B(),J(10,` or `),z(11,`code`),J(12,`effect()`),B(),J(13,` calls were found in your source. To see the live graph, run Angular 20.1 or later with the overlay connected and select a component. `),B()())}function KM(e,t){if(e&1&&(z(0,`span`,33),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit;M(3),X(`in <`,e.component,`>`)}}function qM(e,t){if(e&1&&(z(0,`div`,26)(1,`div`,28)(2,`span`,29),J(3),B(),z(4,`span`,30),J(5),B()(),z(6,`div`,31)(7,`span`,32),J(8),B(),P(9,KM,4,1),B()()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.name),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.component?9:-1)}}function JM(e,t){if(e&1){let e=W();z(0,`div`,27)(1,`p`,22),J(2,`No signals match.`),B(),z(3,`p`,23),J(4,`Try a different name or kind.`),B(),z(5,`button`,34),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(6,`Clear filters`),B()()}}function YM(e,t){if(e&1&&(z(0,`p`,24),J(1,`Signals from source scan (static analysis):`),B(),z(2,`div`,25),I(3,qM,10,8,`div`,26,OM,!1,JM,7,0,`div`,27),B()),e&2){let e=K();M(3),L(e.filteredSourceSignals())}}function XM(e,t){if(e&1&&(z(0,`span`,40),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.missed,` earlier not captured`)}}function ZM(e,t){if(e&1&&(z(0,`li`)(1,`span`,38)(2,`time`),J(3),dv(4,`date`),B(),z(5,`span`,39),J(6),B(),z(7,`span`),J(8),B(),P(9,XM,2,1,`span`,40),B(),z(10,`pre`),J(11),dv(12,`json`),B()()),e&2){let e=t.$implicit,n=K(3);M(3),Y(mv(4,7,e.at,`HH:mm:ss.SSS`)),M(2),w_(`source-`+e.source),M(),Y(n.sourceLabel(e.source)),M(2),X(`epoch `,e.epoch),M(),F(e.missed?9:-1),M(2),Y(pv(12,10,e.value))}}function QM(e,t){if(e&1&&(z(0,`h4`,35),J(1),B(),z(2,`p`,36),J(3),B(),z(4,`ol`,37),I(5,ZM,13,12,`li`,null,kM),B()),e&2){let e=K(),t=e.id,n=e.label,r=K();R(`id`,`history-heading-`+t),M(),Y(n),M(2),Y(r.historySummary(t)),M(),N(`aria-labelledby`,`history-heading-`+t),M(),L(r.selectedHistory())}}function $M(e,t){e&1&&P(0,QM,7,4),e&2&&F(K().selectedHistory().length?0:-1)}function eN(e,t){if(e&1&&(z(0,`span`,49),J(1),B()),e&2){let e=K().$implicit;w_(`tone-`+K(2).statusTone(e.status)),M(),Y(e.status)}}function tN(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function nN(e,t){if(e&1&&(z(0,`span`,47),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.error))}}function rN(e,t){if(e&1&&(z(0,`span`,47),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function iN(e,t){e&1&&(z(0,`p`,23),J(1,` This resource has no name. Pass `),z(2,`code`),J(3,`debugName`),B(),J(4,` to `),z(5,`code`),J(6,`resource()`),B(),J(7,` or `),z(8,`code`),J(9,`httpResource()`),B(),J(10,` to name it here. `),B())}function aN(e,t){if(e&1&&(z(0,`dt`),J(1,`Loading`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.isLoading?`yes`:`no`)}}function oN(e,t){if(e&1&&(z(0,`dt`),J(1,`HTTP status`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(2).$implicit;M(3),Y(e.statusCode)}}function sN(e,t){if(e&1&&(z(0,`dt`),J(1,`Params`),B(),z(2,`dd`)(3,`pre`,53),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Params of `+e.name),M(),Y(pv(5,2,e.params))}}function cN(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,53),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Value of `+e.name),M(),Y(pv(5,2,e.value))}}function lN(e,t){if(e&1&&(z(0,`dt`),J(1,`Error`),B(),z(2,`dd`)(3,`pre`,53),J(4),dv(5,`json`),B()()),e&2){let e=K(2).$implicit;M(3),N(`aria-label`,`Error of `+e.name),M(),Y(pv(5,2,e.error))}}function uN(e,t){if(e&1&&(z(0,`li`)(1,`span`,54),J(2),B(),z(3,`span`,55),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function dN(e,t){if(e&1&&(z(0,`ul`,35),I(1,uN,5,4,`li`,null,AM),B()),e&2){let e=K(2).$implicit,t=K(2);R(`id`,`resource-internals-`+e.id),M(),L(t.internalsOf(e))}}function fN(e,t){if(e&1){let e=W();z(0,`div`,48)(1,`h3`,50),J(2),B(),P(3,iN,11,0,`p`,23),z(4,`dl`)(5,`dt`),J(6,`Status`),B(),z(7,`dd`),J(8),B(),P(9,aN,4,1),P(10,oN,4,1),P(11,sN,6,4),P(12,cN,6,4),P(13,lN,6,4),B(),zg(14,51),z(15,`button`,52),G(`click`,function(){k(e);let t=K(3);return A(t.showInternals.set(!t.showInternals()))}),J(16),B(),P(17,dN,3,1,`ul`,35),B()}if(e&2){let e=K().$implicit,t=K(2),n=n_(18);R(`id`,`signal-detail-`+e.id),M(2),Y(e.name),M(),F(e.named?-1:3),M(5),Y(e.status??`unknown`),M(),F(e.isLoading===void 0?-1:9),M(),F(e.statusCode===void 0?-1:10),M(),F(e.params===void 0?-1:11),M(),F(e.value===void 0?-1:12),M(),F(e.error===void 0?-1:13),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,sv(16,TM,e.id)),M(),N(`aria-expanded`,t.showInternals())(`aria-controls`,`resource-internals-`+e.id),M(),Z(` `,t.showInternals()?`Hide`:`Show`,` internal signals (`,e.nodeIds.length,`) `),M(),F(t.showInternals()?17:-1)}}function pN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,43),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.id))}),z(2,`span`,28)(3,`span`,29),J(4,`resource`),B(),z(5,`span`,30),J(6),B(),P(7,eN,2,3,`span`,44),P(8,tN,2,2,`span`,45),V(9,`span`,46),B(),P(10,nN,3,3,`span`,47)(11,rN,3,3,`span`,47),B(),P(12,fN,18,18,`div`,48),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(`resource`)),M(3),Y(n.name),M(),F(n.status?7:-1),M(),F((e=n.changes)?8:-1,e),M(2),F(n.error===void 0?n.value===void 0?-1:11:10),M(2),F(r.selectedId()===n.id?12:-1)}}function mN(e,t){if(e&1&&(z(0,`h2`,41),J(1,`Resources`),B(),z(2,`ul`,42),I(3,pN,13,12,`li`,null,AM),B()),e&2){let e=K();M(3),L(e.filteredResources())}}function hN(e,t){if(e&1&&(z(0,`span`,45),J(1),B()),e&2){let e=t;M(),Z(``,e,` `,e===1?`change`:`changes`)}}function gN(e,t){if(e&1&&(z(0,`span`,47),J(1),dv(2,`json`),B()),e&2){let e=K().$implicit;M(),Y(pv(2,1,e.value))}}function _N(e,t){if(e&1&&(z(0,`span`,33),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Deps: `,t.getDependencies(e).length)}}function vN(e,t){if(e&1&&(z(0,`span`,33),J(1,`·`),B(),z(2,`span`),J(3),B()),e&2){let e=K().$implicit,t=K(2);M(3),X(`Consumers: `,t.getConsumers(e).length)}}function yN(e,t){if(e&1&&(z(0,`dt`),J(1,`Value`),B(),z(2,`dd`)(3,`pre`,53),J(4),dv(5,`json`),B()()),e&2){let e=K(4);M(3),N(`aria-label`,`Value of `+(e.selectedNode().label??`signal`)),M(),Y(pv(5,2,e.selectedNode().value))}}function bN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,58),G(`click`,function(){let t=k(e).$implicit;return A(K(5).jumpTo(t))}),z(2,`span`,54),J(3),B(),z(4,`span`,55),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function xN(e,t){if(e&1&&(z(0,`h4`),J(1,`Dependencies (producers)`),B(),z(2,`ul`),I(3,bN,6,5,`li`,null,AM),B()),e&2){let e=K(4);M(3),L(e.getDependencies(e.selectedNode()))}}function SN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,58),G(`click`,function(){let t=k(e).$implicit;return A(K(5).jumpTo(t))}),z(2,`span`,54),J(3),B(),z(4,`span`,55),J(5),B()()()}if(e&2){let e=t.$implicit,n=K(5);M(),N(`aria-label`,`Go to `+e.kind+` `+(e.label??e.id)),M(),C_(`background`,n.kindColor(e.kind)),M(),Y(e.kind),M(2),Y(e.label??e.id)}}function CN(e,t){if(e&1&&(z(0,`h4`),J(1,`Consumers`),B(),z(2,`ul`),I(3,SN,6,5,`li`,null,AM),B()),e&2){let e=K(4);M(3),L(e.getConsumers(e.selectedNode()))}}function wN(e,t){if(e&1&&(z(0,`div`,48)(1,`h3`,50),J(2),B(),z(3,`dl`)(4,`dt`),J(5,`Kind`),B(),z(6,`dd`),J(7),B(),z(8,`dt`),J(9,`Epoch`),B(),z(10,`dd`),J(11),B(),P(12,yN,6,4),B(),P(13,xN,5,0),P(14,CN,5,0),zg(15,51),B()),e&2){let e=K().$implicit,t=K(2),n=n_(18);R(`id`,`signal-detail-`+e.id),M(2),Y(t.selectedNode().label??t.selectedNode().id),M(5),Y(t.selectedNode().kind),M(4),Y(t.selectedNode().epoch),M(),F(t.selectedNode().value===void 0?-1:12),M(),F(t.getDependencies(t.selectedNode()).length?13:-1),M(),F(t.getConsumers(t.selectedNode()).length?14:-1),M(),R(`ngTemplateOutlet`,n)(`ngTemplateOutletContext`,sv(9,EM,e.id))}}function TN(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,43),G(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.id))}),z(2,`span`,28)(3,`span`,29),J(4),B(),z(5,`span`,30),J(6),B(),P(7,hN,2,2,`span`,45),V(8,`span`,46),B(),P(9,gN,3,3,`span`,47),z(10,`span`,31)(11,`span`),J(12),B(),P(13,_N,4,1),P(14,vN,4,1),B()(),P(15,wN,16,11,`div`,48),B()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`selected`,r.selectedId()===n.id),N(`aria-expanded`,r.selectedId()===n.id)(`aria-controls`,`signal-detail-`+n.id)(`data-card`,n.id),M(2),C_(`background`,r.kindColor(n.kind)),M(),Y(n.kind),M(2),Y(n.label??`(unnamed)`),M(),F((e=r.changeCount(n.id))?7:-1,e),M(2),F(n.value===void 0?-1:9),M(3),X(`Epoch: `,n.epoch),M(),F(r.getDependencies(n).length?13:-1),M(),F(r.getConsumers(n).length?14:-1),M(),F(r.selectedId()===n.id&&r.selectedNode()?15:-1)}}function EN(e,t){if(e&1){let e=W();z(0,`button`,34),G(`click`,function(){return k(e),A(K(3).clearFilters())}),J(1,`Clear filters`),B()}}function DN(e,t){if(e&1&&(z(0,`li`,57)(1,`p`,22),J(2),B(),z(3,`p`,23),J(4),B(),P(5,EN,2,0,`button`,59),B()),e&2){let e=K(2);M(2),X(` `,e.visibleNodes().length?`No signals match.`:`No signals in this graph.`,` `),M(2),X(` `,e.visibleNodes().length?`Try a different name or kind.`:`Select a component that reads signals, or interact with the page to create some.`,` `),M(),F(e.visibleNodes().length?5:-1)}}function ON(e,t){if(e&1&&(z(0,`h2`,41),J(1,`Signals`),B(),z(2,`ul`,56),I(3,TN,16,15,`li`,null,AM,!1,DN,6,3,`li`,57),B()),e&2){let e=K();M(3),L(e.filteredNodes())}}var kN=`follow`,AN=`env:`,jN=50,MN={selected:`picked`,routed:`rendered by the router`,root:`first component with signals`},NN={write:`set`,sample:`sampled`,initial:`initial`},PN={resolved:`ok`,local:`ok`,loading:`warn`,reloading:`warn`,error:`danger`},FN={signal:`#facc15`,computed:`#60a5fa`,linkedSignal:`#34d399`,effect:`#fb923c`,template:`#94a3b8`,afterRenderEffectPhase:`#f472b6`,childSignalProp:`#fef08a`,"input (signal)":`#f59e0b`,"input.required (signal)":`#f59e0b`,"output (signal)":`#ec4899`,"model (signal)":`#14b8a6`,"model.required (signal)":`#14b8a6`,"viewChild (signal)":`#a3e635`,"viewChild.required (signal)":`#a3e635`,"viewChildren (signal)":`#a3e635`,"contentChild (signal)":`#fda4af`,"contentChild.required (signal)":`#fda4af`,"contentChildren (signal)":`#fda4af`,resource:`#06b6d4`,unknown:`var(--text-2)`},IN=class e{rpc=$(null);destroyRef=E(Cs);host=E(Ml);injector=E(xs);pageId=YT();cleanups=[];treePages=j({});picked=j(null);graph=j(null);unsupported=j(!1);showInternals=j(!1);sourceSignals=j([]);sourceLoaded=j(!1);filter=j(``);kind=j(null);resources=Q(()=>this.graph()?.resources??[]);internalIds=Q(()=>new Set(this.resources().flatMap(e=>e.nodeIds)));visibleNodes=Q(()=>{let e=this.internalIds();return(this.graph()?.nodes??[]).filter(t=>!e.has(t.id))});kindCounts=Q(()=>{let e=this.graph()?[...this.visibleNodes().map(e=>e.kind),...this.resources().map(()=>`resource`)]:this.sourceSignals().map(e=>e.kind),t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return[...t].map(([e,t])=>({kind:e,count:t}))});kindTotal=Q(()=>this.kindCounts().reduce((e,t)=>e+t.count,0));selectedId=j(null);selectedNode=Q(()=>this.graph()?.nodes.find(e=>e.id===this.selectedId())??null);jumpedPast=j(null);jumpNote=Q(()=>{let e=this.jumpedPast();return!e||this.filter()||this.kind()||this.selectedId()!==e.id?``:`Cleared the filters to show ${e.label}.`});selectedHistory=Q(()=>{let e=this.selectedId();return e?[...this.graph()?.history?.[e]??[]].reverse():[]});kindLegend=Object.entries(FN).map(([e,t])=>({kind:e,color:t}));filteredResources=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return t&&t!==`resource`?[]:this.resources().filter(t=>!e||t.name.toLowerCase().includes(e)||`resource`.includes(e))});filteredNodes=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.visibleNodes().filter(n=>(!t||n.kind===t)&&(!e||(n.label??``).toLowerCase().includes(e)||n.kind.toLowerCase().includes(e))).sort((e,t)=>e.id.localeCompare(t.id,void 0,{numeric:!0}))});filteredSourceSignals=Q(()=>{let e=this.filter().toLowerCase(),t=this.kind();return this.sourceSignals().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.toLowerCase().includes(e)||n.file.toLowerCase().includes(e)))});targetPageId=Q(()=>this.pageId??this.graph()?.pageId??this.latestTreePage()?.pageId??null);latestTreePage=Q(()=>{let e=null;for(let[t,n]of Object.entries(this.treePages())){let r=n.reportedAt??0;(!e||r>e.reportedAt)&&(e={pageId:t,reportedAt:r})}return e});componentOptions=Q(()=>{let e=this.targetPageId(),t=(e?this.treePages()[e]?.roots:void 0)??[],n=[],r=e=>{for(let t of e)n.push(t),r(t.children)};r(t);let i=this.graph()?.environments??[];if(!n.length&&!i.length)return[];let a=new Map;for(let e of n)a.set(e.name,(a.get(e.name)??0)+1);let o=new Map,s=[{value:kN,label:`Follow the routed component`,hint:`automatic`},...i.map(e=>({value:AN+e.id,label:this.injectorLabel(e),hint:`injector`}))];for(let e of n){let t=(o.get(e.name)??0)+1;o.set(e.name,t),s.push({value:e.id,label:(a.get(e.name)??0)>1?`${e.name} #${t}`:e.name,hint:`<${e.tag}>`})}return s});pickerValue=Q(()=>{let e=this.picked();return e&&this.componentOptions().some(t=>t.value===e)?e:kN});constructor(){uc(()=>{let e=this.rpc();e&&(this.loadSignalGraph(e),this.loadSourceSignals(e))}),this.destroyRef.onDestroy(()=>{for(let e of this.cleanups.splice(0))e()})}async loadSignalGraph(e){for(let e of this.cleanups.splice(0))e();let t=e.scope(`ng-devtools`);try{let e=await t.rpc.sharedState(`signal-graph`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e,n=(this.pageId?t?.pages?.[this.pageId]:t?.graph)??null;this.unsupported.set(!!n?.unsupported);let r=n?.unsupported?null:n,i=e=>e?.component?.id??e?.injector?.id;i(r)!==i(this.graph())&&this.selectedId.set(null),this.graph.set(r)};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.graph.set(null)}try{let e=await t.rpc.sharedState(`component-tree`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e?.pages;this.treePages.set(t&&typeof t==`object`?t:{})};n(e.value()),this.cleanups.push(e.on(`updated`,n))}catch{this.treePages.set({})}}pickComponent(e){let t=e&&e!==kN?e:null;this.picked.set(t);let n=this.rpc();if(!n)return;let r=this.targetPageId()??void 0,i=t?.startsWith(AN)?{pageId:r,env:t.slice(4)}:{pageId:r,id:t};n.scope(`ng-devtools`).rpc.call(`select-signal-target`,i).catch(()=>{})}injectorLabel(e){return e.name===`Root`?`Root services`:e.name}sourceNote(e){return MN[e]}async loadSourceSignals(e){let t=e.scope(`ng-devtools`);try{let e=await t.rpc.call(`get-signals`);this.sourceSignals.set(e)}catch{}finally{this.sourceLoaded.set(!0)}}clearFilters(){this.filter.set(``),this.kind.set(null)}select(e){this.selectedId.set(this.selectedId()===e?null:e),this.showInternals.set(!1)}jumpTo(e){let t=this.resources().find(t=>t.nodeIds.includes(e.id)),n=t?.id??e.id,r=t?!this.filteredResources().some(e=>e.id===n):!this.filteredNodes().some(e=>e.id===n);r&&this.clearFilters(),this.jumpedPast.set(r?{id:n,label:t?.name??e.label??e.id}:null),this.selectedId.set(n),this.showInternals.set(!!t),Id(()=>{let e=[...this.host.nativeElement.querySelectorAll(`.node-card[data-card]`)].find(e=>e.dataset.card===n);e?.scrollIntoView?.({block:`nearest`}),e?.focus({preventScroll:!0})},{injector:this.injector})}changeCount(e){let t=this.graph(),n=t?.nodes.find(t=>t.id===e)?.changes??t?.resources?.find(t=>t.id===e)?.changes;return n===void 0?(t?.history?.[e]??[]).reduce((e,t)=>e+(t.source===`initial`?0:1+(t.missed??0)),0):n}historySummary(e){let t=this.changeCount(e),n=this.graph()?.history?.[e]?.length??0;return t?`${`${t} ${t===1?`change`:`changes`} recorded`}${n>=jN&&t>=n?`, showing the last ${n}`:``}, newest first.`:`No changes recorded yet. The entry below is the value seen first.`}statusTone(e){return PN[e]??`neutral`}internalsOf(e){let t=new Set(e.nodeIds);return(this.graph()?.nodes??[]).filter(e=>t.has(e.id))}sourceLabel(e){return NN[e]}kindColor(e){return FN[e]??FN.unknown}getDependencies(e){let t=this.graph();if(!t)return[];let n=t.nodes.findIndex(t=>t.id===e.id);return t.edges.filter(e=>e.consumer===n).map(e=>t.nodes[e.producer]).filter(Boolean)}getConsumers(e){let t=this.graph();if(!t)return[];let n=t.nodes.findIndex(t=>t.id===e.id);return t.edges.filter(e=>e.producer===n).map(e=>t.nodes[e.consumer]).filter(Boolean)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-signal-inspector`]],inputs:{rpc:[1,`rpc`]},decls:23,vars:15,consts:[[`historyTpl`,``],[1,`toolbar`],[`type`,`text`,`placeholder`,`Filter by name or kind…`,`aria-label`,`Filter signals by name or kind`,3,`input`,`value`],[1,`picker`],[1,`showing`],[`role`,`status`,1,`fallback`],[1,`intro`],[`role`,`group`,`aria-label`,`Filter by kind`,1,`kinds`],[`role`,`status`,1,`empty`],[1,`empty`],[`role`,`status`,1,`jump-note`],[`id`,`signals-component-label`,1,`label-key`],[`labelledBy`,`signals-component-label`,3,`valueChange`,`options`,`value`],[1,`showing-name`],[1,`mono`],[1,`source-note`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[`aria-hidden`,`true`,1,`dot`],[1,`chip-text`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`hint`],[1,`source-label`],[1,`nodes`],[1,`node-card`],[`role`,`status`,1,`empty`,`compact`],[1,`node-header`],[1,`kind-badge`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[`aria-hidden`,`true`,1,`sep`],[`type`,`button`,1,`reset`,3,`click`],[3,`id`],[1,`history-summary`],[`tabindex`,`0`,1,`history`,`scroll-box`],[1,`history-meta`],[1,`source-tag`],[1,`missed`],[1,`list-heading`],[`role`,`list`,1,`nodes`,`resources`],[`type`,`button`,1,`node-card`,3,`click`],[1,`status-tag`,3,`class`],[1,`changed-badge`],[`aria-hidden`,`true`,1,`chevron`],[1,`node-value`],[1,`detail-panel`,3,`id`],[1,`status-tag`],[1,`detail-title`],[3,`ngTemplateOutlet`,`ngTemplateOutletContext`],[`type`,`button`,1,`reset`,`internals-toggle`,3,`click`],[`role`,`region`,`tabindex`,`0`,1,`scroll-box`],[1,`kind-badge`,`sm`],[1,`rel-label`],[`role`,`list`,1,`nodes`],[1,`empty`,`compact`],[`type`,`button`,1,`rel-link`,3,`click`],[`type`,`button`,1,`reset`]],template:function(e,t){if(e&1&&(z(0,`div`,1)(1,`input`,2),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),P(2,jM,4,2,`div`,3),B(),P(3,NM,6,3,`p`,4)(4,PM,5,1,`p`,4),P(5,FM,2,0,`p`,5),z(6,`p`,6),P(7,IM,1,0)(8,LM,1,0)(9,RM,1,0),B(),P(10,zM,2,0,`p`,5),P(11,BM,2,0,`p`,5),P(12,VM,2,2,`p`,5),P(13,UM,7,4,`div`,7),P(14,WM,4,0,`div`,8),P(15,GM,14,0,`div`,9),P(16,YM,6,1),tg(17,$M,1,1,`ng-template`,null,0,gv),z(19,`p`,10),J(20),B(),P(21,mN,5,0),P(22,ON,6,1)),e&2){let e,n;M(),R(`value`,t.filter()),M(),F(t.componentOptions().length?2:-1),M(),F((e=t.graph()?.component)?3:(e=t.graph()?.injector)?4:-1,e),M(2),F(t.graph()&&t.picked()&&t.graph().source!==`selected`?5:-1),M(2),F(t.graph()?.injector?7:t.graph()?8:9),M(3),F(t.unsupported()?10:-1),M(),F(t.graph()?.writeHook===!1?11:-1),M(),F((n=t.graph()?.nodeCount)?12:-1,n),M(),F(t.kindCounts().length?13:-1),M(),F(!t.graph()&&!t.sourceLoaded()?14:-1),M(),F(!t.graph()&&t.sourceLoaded()&&t.sourceSignals().length===0?15:-1),M(),F(!t.graph()&&t.sourceSignals().length>0?16:-1),M(4),Y(t.jumpNote()),M(),F(t.graph()&&t.filteredResources().length?21:-1),M(),F(t.graph()&&(t.visibleNodes().length||!t.filteredResources().length)?22:-1)}},dependencies:[$y,nD,ib,ab],styles:[`[_nghost-%COMP%] { display: block; min-width: 0; color: var(--%NS%text); @@ -4835,7 +4863,8 @@ button.node-card[_ngcontent-%COMP%] { font-size: 13px; } -.detail-panel[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%] { +.detail-panel[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%], +.rel-link[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; @@ -4844,14 +4873,42 @@ button.node-card[_ngcontent-%COMP%] { padding: 4px 8px; color: var(--%NS%text-2); border-radius: 6px; - transition: background-color 0.15s var(--%NS%ease); } -.detail-panel[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover { +.detail-panel[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:has(> .rel-link) { + padding: 0; +} + +.rel-link[_ngcontent-%COMP%] { + width: 100%; + font: inherit; + text-align: left; + background: none; + border: 0; + cursor: pointer; + transition: background-color 0.15s var(--%NS%ease), color 0.15s var(--%NS%ease); +} + +.rel-link[_ngcontent-%COMP%]:hover { background: var(--%NS%surface-2); color: var(--%NS%text); } +.rel-link[_ngcontent-%COMP%]:focus-visible { + outline: 2px solid var(--%NS%accent); + outline-offset: 2px; +} + +.jump-note[_ngcontent-%COMP%] { + margin: 0; + font-size: 12px; + color: var(--%NS%text-2); +} + +.jump-note[_ngcontent-%COMP%]:not(:empty) { + margin-bottom: 8px; +} + .rel-label[_ngcontent-%COMP%] { min-width: 0; font-family: var(--%NS%font-mono); @@ -4946,7 +5003,7 @@ button.node-card[_ngcontent-%COMP%] { dd[_ngcontent-%COMP%] + dt[_ngcontent-%COMP%] { margin-top: 8px; } -}`]})},wN=(e,t)=>t.node.injector.id,TN=(e,t)=>t.id,EN=(e,t)=>t.from+t.token+e,DN=(e,t)=>t.token+e,ON=(e,t)=>t.type,kN=(e,t)=>t.token+t.file+t.line;function AN(e,t){if(e&1){let e=W();H(0,`label`,12)(1,`input`,13),Qg(`change`,function(){k(e);let t=K(2);return A(t.componentsOnly.set(!t.componentsOnly()))}),U(),J(2,` Components only `),U()}if(e&2){let e=K(2);M(),Vg(`checked`,e.componentsOnly())}}function jN(e,t){e&1&&(H(0,`p`,14),fs(),H(1,`svg`,21),Fg(2,`circle`,22)(3,`path`,23),U(),ps(),H(4,`span`)(5,`strong`),J(6,`This page has more than 2000 element injectors.`),U(),J(7,` Only the first 2000 are shown, so a lookup path or a provider can point to one that is not listed. `),U()())}function MN(e,t){if(e&1){let e=W();H(0,`button`,26),Qg(`click`,function(){let t=k(e).$implicit;return A(K(3).reveal(t.id))}),Fg(1,`span`,27),H(2,`span`,28),J(3),U(),H(4,`span`,29),J(5),U()()}if(e&2){let e=t.$implicit,n=K(3);M(),C_(`background`,n.tone(e.kind)),M(2),Y(e.label),M(2),Y(e.tokens)}}function NN(e,t){if(e&1&&(H(0,`div`,15)(1,`span`,24),J(2,`Provided by`),U(),I(3,MN,6,4,`button`,25,TN),U()),e&2){let e=K(2);M(3),L(e.providedBy())}}function PN(e,t){if(e&1){let e=W();H(0,`div`,16),J(1),H(2,`button`,30),Qg(`click`,function(){return k(e),A(K(2).query.set(``))}),J(3,`Clear search`),U()()}if(e&2){let e=K(2);M(),X(` Nothing here matches “`,e.query().trim(),`”. `)}}function FN(e,t){e&1&&J(0,` None of them provide anything themselves. `)}function IN(e,t){e&1&&J(0,` Turn off “Components only” to see directives. `)}function LN(e,t){e&1&&J(0,` Try a different search. `)}function RN(e,t){if(e&1&&(H(0,`div`,1)(1,`p`,31),J(2,`No injectors to show`),U(),H(3,`p`,32),P(4,FN,1,0)(5,IN,1,0)(6,LN,1,0),U()()),e&2){let e=K(2);M(4),F(e.onlyProviding()?4:e.componentsOnly()&&e.view()===`element`?5:6)}}function zN(e,t){if(e&1){let e=W();H(0,`span`,43),Qg(`click`,function(t){k(e);let n=K().$implicit;return A(K(2).toggle(n.node.injector.id,t))}),fs(),H(1,`svg`,44),Fg(2,`path`,45),U()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function BN(e,t){e&1&&Fg(0,`span`,35)}function VN(e,t){if(e&1&&(H(0,`span`,39),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.node.injector.component)}}function HN(e,t){if(e&1&&(H(0,`span`,39),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.node.injector.directives.join(`, `))}}function UN(e,t){if(e&1&&(H(0,`span`,41),fs(),H(1,`svg`,21),Fg(2,`path`,46),U(),ps(),H(3,`span`,37),J(4,`injects`),U(),J(5),U()),e&2){let e=K().$implicit;N(`title`,e.node.dependencies.length+` injected`),M(5),X(` `,e.node.dependencies.length,` `)}}function WN(e,t){if(e&1&&(H(0,`span`,42),fs(),H(1,`svg`,21),Fg(2,`path`,47),U(),ps(),H(3,`span`,37),J(4,`provides`),U(),J(5),U()),e&2){let e=K().$implicit;N(`title`,e.node.injector.providerCount+` provided`),M(5),X(` `,e.node.injector.providerCount,` `)}}function GN(e,t){if(e&1){let e=W();H(0,`div`,33),Qg(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.node.injector.id))})(`focus`,function(){let t=k(e).$implicit,n=K(2);return n.focusId.set(t.node.injector.id),A(n.highlight(t.node))})(`blur`,function(){return k(e),A(K(2).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.node))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,zN,3,2,`span`,34)(2,BN,1,0,`span`,35),H(3,`span`,36),J(4),U(),H(5,`span`,37),J(6),U(),H(7,`span`,38),J(8),U(),P(9,VN,2,1,`span`,39)(10,HN,2,1,`span`,39),H(11,`span`,40),P(12,UN,6,2,`span`,41),P(13,WN,6,2,`span`,42),U()()}if(e&2){let e=t.$implicit,n=K(2);C_(`--%NS%depth`,e.depth),q(`selected`,n.selected()?.injector?.id===e.node.injector.id),N(`aria-level`,e.depth+1)(`aria-expanded`,e.hasChildren?e.expanded:null)(`aria-selected`,n.selected()?.injector?.id===e.node.injector.id)(`tabindex`,n.rovingId()===e.node.injector.id?0:-1)(`data-id`,e.node.injector.id),M(),F(e.hasChildren?1:2),M(2),C_(`--%NS%tone`,n.tone(n.kind(e.node))),N(`title`,n.kind(e.node)),M(),Y(n.kind(e.node)[0].toUpperCase()),M(2),Y(n.kind(e.node)),M(2),Y(n.label(e.node)),M(),F(e.node.injector.component?9:e.node.injector.directives?.length?10:-1),M(3),F((e.node.dependencies?.length??0)>0?12:-1),M(),F(e.node.injector.providerCount>0?13:-1)}}function KN(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit;q(`is-component`,e===K(2).injector.component),M(),Y(e)}}function qN(e,t){if(e&1&&(H(0,`ul`,51),I(1,KN,2,3,`li`,58,wg),U()),e&2){let e=K();M(),L(e.injector.directives)}}function JN(e,t){if(e&1&&(H(0,`span`,59),Fg(1,`span`,27),J(2,` Null injector `),H(3,`span`,61),J(4,`throws NullInjectorError`),U()()),e&2){let e=K(4);M(),C_(`background`,e.tone(`null`))}}function YN(e,t){if(e&1&&(H(0,`span`,63),J(1),H(2,`span`,37),J(3),U()()),e&2){let e=K(2).$implicit;M(),X(` `,e.providers,` `),M(2),Y(e.providers===1?`provider`:`providers`)}}function XN(e,t){if(e&1){let e=W();H(0,`button`,62),Qg(`click`,function(){k(e);let t=K().$implicit;return A(K(3).reveal(t.id))}),Fg(1,`span`,27),H(2,`span`,28),J(3),U(),P(4,YN,4,2,`span`,63),U()}if(e&2){let e=K().$implicit,t=K(3);M(),C_(`background`,t.tone(e.kind)),M(2),Y(e.label),M(),F(e.providers?4:-1)}}function ZN(e,t){if(e&1&&(H(0,`li`),P(1,JN,5,2,`span`,59)(2,XN,5,4,`button`,60),U()),e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`current`,n===0),M(),F(e.id===r.nullId?1:2)}}function QN(e,t){if(e&1&&(H(0,`span`,69),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function $N(e,t){if(e&1&&(H(0,`span`),J(1),U()),e&2){let e=K().$implicit;M(),X(`for `,e.from)}}function eP(e,t){if(e&1){let e=W();H(0,`button`,74),Qg(`click`,function(){let t=k(e);return A(K(6).reveal(t))}),Fg(1,`span`,27),J(2,` from `),H(3,`span`,28),J(4),U()()}if(e&2){let e=t,n=K(6);M(),C_(`background`,n.tone(n.kindById(e))),M(3),Y(n.labelById(e))}}function tP(e,t){e&1&&(H(0,`span`,72),J(1,`optional, not provided`),U())}function nP(e,t){e&1&&(H(0,`span`,73),J(1,`not provided anywhere`),U())}function rP(e,t){if(e&1&&(H(0,`li`,66)(1,`div`,67)(2,`span`,68),J(3),U(),I(4,QN,2,1,`span`,69,wg),U(),H(6,`div`,70),P(7,$N,2,1,`span`),P(8,eP,5,3,`button`,71)(9,tP,2,0,`span`,72)(10,nP,2,0,`span`,73),U()()),e&2){let e,n=t.$implicit,r=K(3);q(`hit`,K(2).matches(n.token)),M(3),Y(n.token),M(),L(n.flags),M(3),F(r.injector.directives&&r.injector.directives.length>1?7:-1),M(),F((e=n.providedBy)?8:n.flags.includes(`optional`)?9:10,e)}}function iP(e,t){if(e&1&&(H(0,`ul`,64),I(1,rP,11,5,`li`,65,EN),U()),e&2){let e=K(2);M(),L(e.dependencies)}}function aP(e,t){e&1&&(H(0,`p`,57),J(1,`Nothing is injected through the constructor or inject().`),U())}function oP(e,t){if(e&1&&(H(0,`div`,52)(1,`h3`),J(2,` Injected here `),H(3,`span`,6),J(4),U()(),P(5,iP,3,0,`ul`,64)(6,aP,2,0,`p`,57),U()),e&2){let e=K();M(4),Y(e.dependencies?.length??0),M(),F(e.dependencies?.length?5:6)}}function sP(e,t){e&1&&(H(0,`span`,69),J(1,`viewProviders`),U())}function cP(e,t){e&1&&(H(0,`span`,69),J(1,`multi`),U())}function lP(e,t){if(e&1&&(H(0,`div`,70),J(1),U()),e&2){let e=K().$implicit;M(),X(`via `,e.importPath.join(` › `))}}function uP(e,t){if(e&1&&(H(0,`li`,76)(1,`div`,67)(2,`span`,68),J(3),U(),H(4,`span`,77),J(5),U(),P(6,sP,2,0,`span`,69),P(7,cP,2,0,`span`,69),U(),P(8,lP,2,1,`div`,70),U()),e&2){let e=t.$implicit,n=K(4);q(`hit`,n.matches(e.token)),M(3),Y(e.token),M(2),Y(e.type===`unknown`?`provider`:`use`+n.capital(e.type)),M(),F(e.isViewProvider?6:-1),M(),F(e.multi?7:-1),M(),F(e.importPath?.length?8:-1)}}function dP(e,t){if(e&1&&(H(0,`ul`,56),I(1,uP,9,7,`li`,75,DN),U()),e&2){let e=K();M(),L(e.providers)}}function fP(e,t){e&1&&J(0,` No providers or viewProviders on this element. `)}function pP(e,t){e&1&&J(0,` This injector has no providers of its own. `)}function mP(e,t){if(e&1&&(H(0,`p`,57),P(1,fP,1,0)(2,pP,1,0),U()),e&2){let e=K();M(),F(e.injector.type===`element`?1:2)}}function hP(e,t){if(e&1&&(H(0,`section`,20)(1,`header`,48)(2,`span`,49),J(3),U(),H(4,`h2`,50),J(5),U(),P(6,qN,3,0,`ul`,51),U(),H(7,`div`,52)(8,`h3`),J(9,`Lookup path`),U(),H(10,`p`,53),J(11,`Angular asks these injectors in order until one has the token.`),U(),H(12,`ol`,54),I(13,ZN,3,3,`li`,55,TN),U()(),P(15,oP,7,2,`div`,52),H(16,`div`,52)(17,`h3`),J(18,` Provides `),H(19,`span`,6),J(20),U()(),P(21,dP,3,0,`ul`,56)(22,mP,3,1,`p`,57),U()()),e&2){let e=t,n=K(2);M(2),C_(`--%NS%tone`,n.tone(n.kind(e))),M(),Y(n.kind(e)),M(2),Y(n.label(e)),M(),F(e.injector.directives?.length?6:-1),M(7),L(n.path()),M(2),F(e.injector.type===`element`?15:-1),M(5),Y(e.providers.length),M(),F(e.providers.length?21:22)}}function gP(e,t){if(e&1){let e=W();H(0,`p`,2),J(1,` Every component and directive gets an injector. When it asks for a token, Angular walks up this tree, then through the environment injectors, until something provides it. `),U(),H(2,`div`,3)(3,`div`,4)(4,`button`,5),Qg(`click`,function(){return k(e),A(K().setView(`element`))}),J(5,` Elements `),H(6,`span`,6),J(7),U()(),H(8,`button`,5),Qg(`click`,function(){return k(e),A(K().setView(`environment`))}),J(9,` Environment `),H(10,`span`,6),J(11),U()()(),H(12,`div`,7),fs(),H(13,`svg`,8),Fg(14,`circle`,9)(15,`path`,10),U(),ps(),H(16,`input`,11),Qg(`input`,function(t){return k(e),A(K().query.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().query.set(``))}),U()(),P(17,AN,3,1,`label`,12),H(18,`label`,12)(19,`input`,13),Qg(`change`,function(){k(e);let t=K();return A(t.onlyProviding.set(!t.onlyProviding()))}),U(),J(20,` With providers `),U()(),P(21,jN,8,0,`p`,14),P(22,NN,5,0,`div`,15)(23,PN,4,1,`div`,16),H(24,`div`,17),P(25,RN,7,1,`div`,1),H(26,`div`,18),Qg(`keydown`,function(t){return k(e),A(K().onTreeKey(t))}),I(27,GN,14,19,`div`,19,wN),U(),P(29,hP,23,8,`section`,20),U()}if(e&2){let e,t=K();M(4),q(`active`,t.view()===`element`),N(`aria-pressed`,t.view()===`element`),M(3),Y(t.elementCount()),M(),q(`active`,t.view()===`environment`),N(`aria-pressed`,t.view()===`environment`),M(3),Y(t.environmentCount()),M(5),Vg(`value`,t.query()),M(),F(t.view()===`element`?17:-1),M(2),Vg(`checked`,t.onlyProviding()),M(2),F(t.truncated()?21:-1),M(),F(t.providedBy().length?22:t.query().trim()&&!t.rows().length?23:-1),M(3),F(t.rows().length?-1:25),M(),Vg(`hidden`,!t.rows().length),N(`aria-label`,t.view()===`element`?`Element injectors`:`Environment injectors`),M(),L(t.rows()),M(2),F((e=t.selected())?29:-1,e)}}function _P(e,t){e&1&&(H(0,`div`,0),Fg(1,`span`,78),H(2,`p`,31),J(3,`Loading dependency injection data…`),U()())}function vP(e,t){e&1&&(H(0,`div`,1)(1,`p`,31),J(2,`No DI data found`),U(),H(3,`p`,32),J(4,` Open the app in a browser with the devtools connected to see its live injectors. No providers, injectables or inject() calls were found in the source either. `),U()())}function yP(e,t){if(e&1){let e=W();H(0,`div`,1)(1,`p`,31),J(2),U(),H(3,`p`,32),J(4,`Try part of a token name or a file path.`),U(),H(5,`button`,5),Qg(`click`,function(){return k(e),A(K(2).query.set(``))}),J(6,`Clear filter`),U()()}if(e&2){let e=K(2);M(2),X(`No providers match “`,e.query(),`”`)}}function bP(e,t){if(e&1&&(H(0,`span`,88),J(1),U()),e&2){let e=K().$implicit;M(),X(`providedIn: `,e.providedIn)}}function xP(e,t){if(e&1&&(H(0,`span`,90),J(1),U()),e&2){let e=K().$implicit;M(),X(`as `,e.source)}}function SP(e,t){if(e&1&&(H(0,`li`,85)(1,`div`,86)(2,`span`,87),J(3),U(),P(4,bP,2,1,`span`,88),U(),H(5,`div`,89)(6,`span`,54),J(7),U(),P(8,xP,2,1,`span`,90),U()()),e&2){let e=t.$implicit;M(3),Y(e.token),M(),F(e.providedIn?4:-1),M(3),Z(``,e.file,`:`,e.line),M(),F(e.source!==`class`&&e.source!==`providers array`?8:-1)}}function CP(e,t){if(e&1&&(H(0,`section`,82)(1,`h2`),J(2),H(3,`span`,83),J(4),U()(),H(5,`ul`,84),I(6,SP,9,5,`li`,85,kN),U()()),e&2){let e=t.$implicit;M(2),X(` `,e.label,` `),M(2),Y(e.items.length),M(2),L(e.items)}}function wP(e,t){if(e&1&&(H(0,`div`,81),I(1,CP,8,2,`section`,82,ON),U()),e&2){let e=K(2);M(),L(e.groupedProviders())}}function TP(e,t){if(e&1){let e=W();H(0,`div`,3)(1,`div`,7),fs(),H(2,`svg`,8),Fg(3,`circle`,9)(4,`path`,10),U(),ps(),H(5,`input`,79),Qg(`input`,function(t){return k(e),A(K().query.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().query.set(``))}),U()(),H(6,`span`,80),J(7),U()(),H(8,`p`,14),fs(),H(9,`svg`,21),Fg(10,`circle`,22)(11,`path`,23),U(),ps(),H(12,`span`)(13,`strong`),J(14,`DI from source scan (static analysis).`),U(),J(15,` Connect the overlay on Angular 20 or later to see the live injector tree. `),U()(),P(16,yP,7,1,`div`,1)(17,wP,3,0,`div`,81)}if(e&2){let e=K();M(5),Vg(`value`,e.query()),M(2),Z(` `,e.sourceMatchCount(),` of `,e.sourceProviders().length,` `),M(9),F(e.groupedProviders().length===0?16:17)}}var EP=`inj-null`,DP={component:`var(--accent)`,directive:`#7cb4ff`,environment:`var(--ok)`,null:`var(--text-3)`};function OP(e){return e.injector.type===`element`?e.injector.component?`component`:`directive`:`environment`}function kP(e){return e.injector.type===`element`?`<${e.injector.name}>`:e.injector.name}function AP(e){return Array.isArray(e)}var jP=class e{rpc=$(null);nullId=EP;roots=j([]);environment=j([]);sourceProviders=j([]);loaded=j(!1);truncated=j(!1);view=j(`element`);query=j(``);onlyProviding=j(!1);componentsOnly=j(!0);collapsed=j(new Set);selectedId=j(null);focusId=j(null);index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.injector.id,a),i&&t.set(a.injector.id,i),n(a.children,a.injector.id)};return n(this.roots(),null),n(this.environment(),null),{map:e,parents:t}});elementCount=Q(()=>this.count(this.roots()));environmentCount=Q(()=>this.count(this.environment()));visible=Q(()=>{let e=this.view()===`element`?this.roots():this.environment();this.view()===`element`&&this.componentsOnly()&&(e=this.prune(e,e=>!!e.injector.component)),this.onlyProviding()&&(e=this.prune(e,e=>e.providers.length>0));let t=this.normalizedQuery();return t&&(e=this.prune(e,e=>this.nodeMatches(e,t))),e});rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.normalizedQuery(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.injector.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.visible(),0),e});selected=Q(()=>{let e=this.selectedId();return(e?this.index().map.get(e):void 0)??this.rows()[0]?.node??null});rovingId=Q(()=>{let e=this.rows(),t=this.focusId()??this.selected()?.injector.id;return t&&e.some(e=>e.node.injector.id===t)?t:e[0]?.node.injector.id??null});path=Q(()=>{let e=this.selected();if(!e)return[];let{map:t,parents:n}=this.index(),r=e.injector.path??[];if(!r.length){r=[e.injector.id];let t=n.get(e.injector.id);for(;t;)r.push(t),t=n.get(t);r.push(EP)}return r.map(e=>{let n=t.get(e);return{id:e,label:n?kP(n):e===EP?`Null injector`:`Not listed`,kind:n?OP(n):`null`,providers:n?.providers.length??0}})});providedBy=Q(()=>{let e=this.normalizedQuery();if(!e)return[];let t=[];for(let n of this.index().map.values()){let r=n.providers.filter(t=>t.token.toLowerCase().includes(e));r.length&&t.push({id:n.injector.id,label:kP(n),kind:OP(n),tokens:r.map(e=>e.token).join(`, `)})}return t.slice(0,12)});groupedProviders=Q(()=>{let e=this.normalizedQuery(),t=e?this.sourceProviders().filter(t=>t.token.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):this.sourceProviders(),n=[{type:`root-provider`,label:`Root Providers (provide*)`,items:[]},{type:`injectable`,label:`Injectable Services`,items:[]},{type:`injection`,label:`inject() Calls`,items:[]},{type:`provider`,label:`Component Providers`,items:[]}];for(let e of t)n.find(t=>t.type===e.type)?.items.push(e);return n.filter(e=>e.items.length>0)});sourceMatchCount=Q(()=>this.groupedProviders().reduce((e,t)=>e+t.items.length,0));normalizedQuery=Q(()=>this.query().trim().toLowerCase());destroyRef=E(Cs);stopTree=null;constructor(){uc(()=>{let e=this.rpc();e&&(this.loadInjectorTree(e),this.loadSourceProviders(e))}),this.destroyRef.onDestroy(()=>{this.stopTree?.(),this.highlight(null)})}label(e){return kP(e)}kind(e){return OP(e)}tone(e){return DP[e]??DP.null}kindById(e){let t=this.index().map.get(e);return t?OP(t):`null`}labelById(e){let t=this.index().map.get(e);return t?kP(t):e===EP?`Null injector`:`not listed`}capital(e){return e.charAt(0).toUpperCase()+e.slice(1)}matches(e){let t=this.normalizedQuery();return!!t&&e.toLowerCase().includes(t)}setView(e){this.view()!==e&&(this.view.set(e),this.selectedId.set(null),this.focusId.set(null))}select(e){this.selectedId.set(e),this.focusId.set(e)}toggle(e,t){t?.stopPropagation(),!this.normalizedQuery()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}reveal(e){let t=this.index().map.get(e);if(!t)return;this.setView(t.injector.type===`element`?`element`:`environment`);let{parents:n}=this.index();this.collapsed.update(t=>{let r=new Set(t),i=n.get(e);for(;i;)r.delete(i),i=n.get(i);return r}),this.onlyProviding()&&t.providers.length===0&&this.onlyProviding.set(!1),t.injector.type===`element`&&!t.injector.component&&this.componentsOnly.set(!1),this.select(e),queueMicrotask(()=>this.focusRow(e,!1))}highlight(e){let t=this.rpc();if(!t)return;let n=e?.injector.type===`element`?e.injector.selector??null:null;t.scope(`ng-devtools`).rpc.call(`request-page-highlight`,n).catch(()=>{})}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=this.rovingId(),r=t.findIndex(e=>e.node.injector.id===n),i=Math.max(r,0),a=t[i],o=-1;switch(e.key){case`ArrowDown`:o=Math.min(i+1,t.length-1);break;case`ArrowUp`:o=Math.max(i-1,0);break;case`Home`:o=0;break;case`End`:o=t.length-1;break;case`ArrowRight`:a.hasChildren&&!a.expanded?this.toggle(a.node.injector.id):a.hasChildren&&(o=i+1);break;case`ArrowLeft`:if(a.hasChildren&&a.expanded&&!this.normalizedQuery())this.toggle(a.node.injector.id);else{let e=this.index().parents.get(a.node.injector.id);o=t.findIndex(t=>t.node.injector.id===e)}break;case`Enter`:case` `:this.select(a.node.injector.id);break;default:return}if(e.preventDefault(),o>=0){let e=t[o].node.injector.id;this.focusId.set(e),this.selectedId.set(e),queueMicrotask(()=>this.focusRow(e,!0))}}focusRow(e,t){let n=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);n&&(t&&n.focus(),n.scrollIntoView({block:`nearest`}))}async loadInjectorTree(e){this.stopTree?.(),this.stopTree=null;let t=e.scope(`ng-devtools`),n;try{n=await t.rpc.sharedState(`injector-tree`)}catch{return}if(this.destroyRef.destroyed)return;let r=JT(),i=e=>{let t=e,n=(r?t?.pages?.[r]:void 0)??t;AP(n?.roots)&&this.roots.set(n.roots),AP(n?.environment)&&this.environment.set(n.environment),this.truncated.set(n?.truncated===!0)};i(n.value()),this.stopTree=n.on(`updated`,i)}async loadSourceProviders(e){let t=e.scope(`ng-devtools`);try{this.sourceProviders.set(await t.rpc.call(`get-providers`))}catch{this.sourceProviders.set([])}finally{this.loaded.set(!0)}}count(e){return e.reduce((e,t)=>e+1+this.count(t.children),0)}nodeMatches(e,t){let n=e.injector;return n.name.toLowerCase().includes(t)||!!n.component?.toLowerCase().includes(t)||!!n.directives?.some(e=>e.toLowerCase().includes(t))||e.providers.some(e=>e.token.toLowerCase().includes(t))||!!e.dependencies?.some(e=>e.token.toLowerCase().includes(t))}prune(e,t){let n=[];for(let r of e){let e=this.prune(r.children,t);(t(r)||e.length)&&n.push({...r,children:e})}return n}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-di-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`status`,1,`state`],[1,`state`],[1,`intro`],[1,`toolbar`],[`role`,`group`,`aria-label`,`Injector tree`,1,`segmented`],[`type`,`button`,3,`click`],[1,`pill`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a token, component or injector…`,`aria-label`,`Find a token, component or injector`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[1,`checkbox`],[`type`,`checkbox`,3,`change`,`checked`],[1,`notice`],[`role`,`status`,1,`where`],[`role`,`status`,1,`where`,`muted`],[1,`layout`],[`role`,`tree`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`di-detail-title`,1,`detail`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[1,`where-label`],[`type`,`button`,1,`chip`],[`type`,`button`,1,`chip`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`mono`],[1,`chip-tokens`],[`type`,`button`,1,`link`,3,`click`],[1,`state-title`],[1,`state-hint`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[`aria-hidden`,`true`,1,`kind`],[1,`sr-only`],[1,`name`,`mono`],[1,`sub`],[1,`meta`],[1,`count`],[1,`count`,`provides`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[`d`,`M12 5v14M5 12l7 7 7-7`],[`d`,`M21 8 12 3 3 8v8l9 5 9-5z`],[1,`detail-head`],[1,`badge`],[`id`,`di-detail-title`,1,`mono`],[`aria-label`,`Classes on this element`,1,`classes`],[1,`block`],[1,`hint`],[1,`path`],[3,`current`],[1,`providers`],[1,`empty-line`],[3,`is-component`],[1,`step`,`null`],[`type`,`button`,1,`step`],[1,`hint-inline`],[`type`,`button`,1,`step`,3,`click`],[1,`step-count`],[1,`deps`],[1,`dep`,3,`hit`],[1,`dep`],[1,`dep-main`],[1,`token`,`mono`],[1,`flag`],[1,`dep-meta`],[`type`,`button`,1,`from`],[1,`from`,`absent`],[1,`from`,`missing`],[`type`,`button`,1,`from`,3,`click`],[1,`provider`,3,`hit`],[1,`provider`],[1,`flag`,`kind-flag`],[`aria-hidden`,`true`,1,`spinner`],[`type`,`search`,`placeholder`,`Filter by token or file…`,`aria-label`,`Filter by token or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`total`],[1,`source-providers`],[1,`provider-group`],[1,`section-count`],[`role`,`list`,1,`provider-list`],[1,`provider-card`],[1,`provider-header`],[1,`token`],[1,`provided-in`],[1,`provider-meta`],[1,`as`]],template:function(e,t){e&1&&P(0,gP,30,17)(1,_P,4,0,`div`,0)(2,vP,5,0,`div`,1)(3,TP,18,4),e&2&&F(t.roots().length>0?0:t.loaded()?t.sourceProviders().length===0?2:3:1)},styles:[`[_nghost-%COMP%] { +}`]})},LN=(e,t)=>t.node.injector.id,RN=(e,t)=>t.id,zN=(e,t)=>t.from+t.token+e,BN=(e,t)=>t.token+e,VN=(e,t)=>t.type,HN=(e,t)=>t.token+t.file+t.line;function UN(e,t){if(e&1){let e=W();H(0,`label`,12)(1,`input`,13),Qg(`change`,function(){k(e);let t=K(2);return A(t.componentsOnly.set(!t.componentsOnly()))}),U(),J(2,` Components only `),U()}if(e&2){let e=K(2);M(),Vg(`checked`,e.componentsOnly())}}function WN(e,t){e&1&&(H(0,`p`,14),fs(),H(1,`svg`,21),Fg(2,`circle`,22)(3,`path`,23),U(),ps(),H(4,`span`)(5,`strong`),J(6,`This page has more than 2000 element injectors.`),U(),J(7,` Only the first 2000 are shown, so a lookup path or a provider can point to one that is not listed. `),U()())}function GN(e,t){if(e&1){let e=W();H(0,`button`,26),Qg(`click`,function(){let t=k(e).$implicit;return A(K(3).reveal(t.id))}),Fg(1,`span`,27),H(2,`span`,28),J(3),U(),H(4,`span`,29),J(5),U()()}if(e&2){let e=t.$implicit,n=K(3);M(),C_(`background`,n.tone(e.kind)),M(2),Y(e.label),M(2),Y(e.tokens)}}function KN(e,t){if(e&1&&(H(0,`div`,15)(1,`span`,24),J(2,`Provided by`),U(),I(3,GN,6,4,`button`,25,RN),U()),e&2){let e=K(2);M(3),L(e.providedBy())}}function qN(e,t){if(e&1){let e=W();H(0,`div`,16),J(1),H(2,`button`,30),Qg(`click`,function(){return k(e),A(K(2).query.set(``))}),J(3,`Clear search`),U()()}if(e&2){let e=K(2);M(),X(` Nothing here matches “`,e.query().trim(),`”. `)}}function JN(e,t){e&1&&J(0,` None of them provide anything themselves. `)}function YN(e,t){e&1&&J(0,` Turn off “Components only” to see directives. `)}function XN(e,t){e&1&&J(0,` Try a different search. `)}function ZN(e,t){if(e&1&&(H(0,`div`,1)(1,`p`,31),J(2,`No injectors to show`),U(),H(3,`p`,32),P(4,JN,1,0)(5,YN,1,0)(6,XN,1,0),U()()),e&2){let e=K(2);M(4),F(e.onlyProviding()?4:e.componentsOnly()&&e.view()===`element`?5:6)}}function QN(e,t){if(e&1){let e=W();H(0,`span`,43),Qg(`click`,function(t){k(e);let n=K().$implicit;return A(K(2).toggle(n.node.injector.id,t))}),fs(),H(1,`svg`,44),Fg(2,`path`,45),U()()}if(e&2){let e=K().$implicit;q(`open`,e.expanded)}}function $N(e,t){e&1&&Fg(0,`span`,35)}function eP(e,t){if(e&1&&(H(0,`span`,39),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.node.injector.component)}}function tP(e,t){if(e&1&&(H(0,`span`,39),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.node.injector.directives.join(`, `))}}function nP(e,t){if(e&1&&(H(0,`span`,41),fs(),H(1,`svg`,21),Fg(2,`path`,46),U(),ps(),H(3,`span`,37),J(4,`injects`),U(),J(5),U()),e&2){let e=K().$implicit;N(`title`,e.node.dependencies.length+` injected`),M(5),X(` `,e.node.dependencies.length,` `)}}function rP(e,t){if(e&1&&(H(0,`span`,42),fs(),H(1,`svg`,21),Fg(2,`path`,47),U(),ps(),H(3,`span`,37),J(4,`provides`),U(),J(5),U()),e&2){let e=K().$implicit;N(`title`,e.node.injector.providerCount+` provided`),M(5),X(` `,e.node.injector.providerCount,` `)}}function iP(e,t){if(e&1){let e=W();H(0,`div`,33),Qg(`click`,function(){let t=k(e).$implicit;return A(K(2).select(t.node.injector.id))})(`focus`,function(){let t=k(e).$implicit,n=K(2);return n.focusId.set(t.node.injector.id),A(n.highlight(t.node))})(`blur`,function(){return k(e),A(K(2).highlight(null))})(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.node))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,QN,3,2,`span`,34)(2,$N,1,0,`span`,35),H(3,`span`,36),J(4),U(),H(5,`span`,37),J(6),U(),H(7,`span`,38),J(8),U(),P(9,eP,2,1,`span`,39)(10,tP,2,1,`span`,39),H(11,`span`,40),P(12,nP,6,2,`span`,41),P(13,rP,6,2,`span`,42),U()()}if(e&2){let e=t.$implicit,n=K(2);C_(`--%NS%depth`,e.depth),q(`selected`,n.selected()?.injector?.id===e.node.injector.id),N(`aria-level`,e.depth+1)(`aria-expanded`,e.hasChildren?e.expanded:null)(`aria-selected`,n.selected()?.injector?.id===e.node.injector.id)(`tabindex`,n.rovingId()===e.node.injector.id?0:-1)(`data-id`,e.node.injector.id),M(),F(e.hasChildren?1:2),M(2),C_(`--%NS%tone`,n.tone(n.kind(e.node))),N(`title`,n.kind(e.node)),M(),Y(n.kind(e.node)[0].toUpperCase()),M(2),Y(n.kind(e.node)),M(2),Y(n.label(e.node)),M(),F(e.node.injector.component?9:e.node.injector.directives?.length?10:-1),M(3),F((e.node.dependencies?.length??0)>0?12:-1),M(),F(e.node.injector.providerCount>0?13:-1)}}function aP(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit;q(`is-component`,e===K(2).injector.component),M(),Y(e)}}function oP(e,t){if(e&1&&(H(0,`ul`,51),I(1,aP,2,3,`li`,58,wg),U()),e&2){let e=K();M(),L(e.injector.directives)}}function sP(e,t){if(e&1&&(H(0,`span`,59),Fg(1,`span`,27),J(2,` Null injector `),H(3,`span`,61),J(4,`throws NullInjectorError`),U()()),e&2){let e=K(4);M(),C_(`background`,e.tone(`null`))}}function cP(e,t){if(e&1&&(H(0,`span`,63),J(1),H(2,`span`,37),J(3),U()()),e&2){let e=K(2).$implicit;M(),X(` `,e.providers,` `),M(2),Y(e.providers===1?`provider`:`providers`)}}function lP(e,t){if(e&1){let e=W();H(0,`button`,62),Qg(`click`,function(){k(e);let t=K().$implicit;return A(K(3).reveal(t.id))}),Fg(1,`span`,27),H(2,`span`,28),J(3),U(),P(4,cP,4,2,`span`,63),U()}if(e&2){let e=K().$implicit,t=K(3);M(),C_(`background`,t.tone(e.kind)),M(2),Y(e.label),M(),F(e.providers?4:-1)}}function uP(e,t){if(e&1&&(H(0,`li`),P(1,sP,5,2,`span`,59)(2,lP,5,4,`button`,60),U()),e&2){let e=t.$implicit,n=t.$index,r=K(3);q(`current`,n===0),M(),F(e.id===r.nullId?1:2)}}function dP(e,t){e&1&&(H(0,`p`,53),J(1,`Only services this injector has already created are listed.`),U())}function fP(e,t){if(e&1&&(H(0,`span`,69),J(1),U()),e&2){let e=t.$implicit;M(),Y(e)}}function pP(e,t){if(e&1&&(H(0,`span`),J(1),U()),e&2){let e=K().$implicit;M(),X(`for `,e.from)}}function mP(e,t){if(e&1){let e=W();H(0,`button`,74),Qg(`click`,function(){let t=k(e);return A(K(6).reveal(t))}),Fg(1,`span`,27),J(2,` from `),H(3,`span`,28),J(4),U()()}if(e&2){let e=t,n=K(6);M(),C_(`background`,n.tone(n.kindById(e))),M(3),Y(n.labelById(e))}}function hP(e,t){e&1&&(H(0,`span`,72),J(1,`optional, not provided`),U())}function gP(e,t){e&1&&(H(0,`span`,73),J(1,`not provided anywhere`),U())}function _P(e,t){if(e&1&&(H(0,`li`,66)(1,`div`,67)(2,`span`,68),J(3),U(),I(4,fP,2,1,`span`,69,wg),U(),H(6,`div`,70),P(7,pP,2,1,`span`),P(8,mP,5,3,`button`,71)(9,hP,2,0,`span`,72)(10,gP,2,0,`span`,73),U()()),e&2){let e,n=t.$implicit,r=K(3);q(`hit`,K(2).matches(n.token)),M(3),Y(n.token),M(),L(n.flags),M(3),F(r.injector.type!==`element`||r.injector.directives&&r.injector.directives.length>1?7:-1),M(),F((e=n.providedBy)?8:n.flags.includes(`optional`)?9:10,e)}}function vP(e,t){if(e&1&&(H(0,`ul`,64),I(1,_P,11,5,`li`,65,zN),U()),e&2){let e=K(2);M(),L(e.dependencies)}}function yP(e,t){e&1&&(H(0,`p`,57),J(1,`Nothing is injected through the constructor or inject().`),U())}function bP(e,t){e&1&&(H(0,`p`,57),J(1,`No service created here has injected anything yet.`),U())}function xP(e,t){if(e&1&&(H(0,`div`,52)(1,`h3`),J(2),H(3,`span`,6),J(4),U()(),P(5,dP,2,0,`p`,53),P(6,vP,3,0,`ul`,64)(7,yP,2,0,`p`,57)(8,bP,2,0,`p`,57),U()),e&2){let e=K();M(2),X(` `,e.injector.type===`element`?`Injected here`:`Injected by its services`,` `),M(2),Y(e.dependencies?.length??0),M(),F(e.injector.type===`element`?-1:5),M(),F(e.dependencies?.length?6:e.injector.type===`element`?7:8)}}function SP(e,t){e&1&&(H(0,`span`,69),J(1,`viewProviders`),U())}function CP(e,t){e&1&&(H(0,`span`,69),J(1,`multi`),U())}function wP(e,t){if(e&1&&(H(0,`div`,70),J(1),U()),e&2){let e=K().$implicit;M(),X(`via `,e.importPath.join(` › `))}}function TP(e,t){if(e&1&&(H(0,`li`,76)(1,`div`,67)(2,`span`,68),J(3),U(),H(4,`span`,77),J(5),U(),P(6,SP,2,0,`span`,69),P(7,CP,2,0,`span`,69),U(),P(8,wP,2,1,`div`,70),U()),e&2){let e=t.$implicit,n=K(4);q(`hit`,n.matches(e.token)),M(3),Y(e.token),M(2),Y(e.type===`unknown`?`provider`:`use`+n.capital(e.type)),M(),F(e.isViewProvider?6:-1),M(),F(e.multi?7:-1),M(),F(e.importPath?.length?8:-1)}}function EP(e,t){if(e&1&&(H(0,`ul`,56),I(1,TP,9,7,`li`,75,BN),U()),e&2){let e=K();M(),L(e.providers)}}function DP(e,t){e&1&&J(0,` No providers or viewProviders on this element. `)}function OP(e,t){e&1&&J(0,` This injector has no providers of its own. `)}function kP(e,t){if(e&1&&(H(0,`p`,57),P(1,DP,1,0)(2,OP,1,0),U()),e&2){let e=K();M(),F(e.injector.type===`element`?1:2)}}function AP(e,t){if(e&1&&(H(0,`section`,20)(1,`header`,48)(2,`span`,49),J(3),U(),H(4,`h2`,50),J(5),U(),P(6,oP,3,0,`ul`,51),U(),H(7,`div`,52)(8,`h3`),J(9,`Lookup path`),U(),H(10,`p`,53),J(11,`Angular asks these injectors in order until one has the token.`),U(),H(12,`ol`,54),I(13,uP,3,3,`li`,55,RN),U()(),P(15,xP,9,4,`div`,52),H(16,`div`,52)(17,`h3`),J(18,` Provides `),H(19,`span`,6),J(20),U()(),P(21,EP,3,0,`ul`,56)(22,kP,3,1,`p`,57),U()()),e&2){let e=t,n=K(2);M(2),C_(`--%NS%tone`,n.tone(n.kind(e))),M(),Y(n.kind(e)),M(2),Y(n.label(e)),M(),F(e.injector.directives?.length?6:-1),M(7),L(n.path()),M(2),F(e.injector.type===`element`||e.dependencies?15:-1),M(5),Y(e.providers.length),M(),F(e.providers.length?21:22)}}function jP(e,t){if(e&1){let e=W();H(0,`p`,2),J(1,` Every component and directive gets an injector. When it asks for a token, Angular walks up this tree, then through the environment injectors, until something provides it. `),U(),H(2,`div`,3)(3,`div`,4)(4,`button`,5),Qg(`click`,function(){return k(e),A(K().setView(`element`))}),J(5,` Elements `),H(6,`span`,6),J(7),U()(),H(8,`button`,5),Qg(`click`,function(){return k(e),A(K().setView(`environment`))}),J(9,` Environment `),H(10,`span`,6),J(11),U()()(),H(12,`div`,7),fs(),H(13,`svg`,8),Fg(14,`circle`,9)(15,`path`,10),U(),ps(),H(16,`input`,11),Qg(`input`,function(t){return k(e),A(K().query.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().query.set(``))}),U()(),P(17,UN,3,1,`label`,12),H(18,`label`,12)(19,`input`,13),Qg(`change`,function(){k(e);let t=K();return A(t.onlyProviding.set(!t.onlyProviding()))}),U(),J(20,` With providers `),U()(),P(21,WN,8,0,`p`,14),P(22,KN,5,0,`div`,15)(23,qN,4,1,`div`,16),H(24,`div`,17),P(25,ZN,7,1,`div`,1),H(26,`div`,18),Qg(`keydown`,function(t){return k(e),A(K().onTreeKey(t))}),I(27,iP,14,19,`div`,19,LN),U(),P(29,AP,23,8,`section`,20),U()}if(e&2){let e,t=K();M(4),q(`active`,t.view()===`element`),N(`aria-pressed`,t.view()===`element`),M(3),Y(t.elementCount()),M(),q(`active`,t.view()===`environment`),N(`aria-pressed`,t.view()===`environment`),M(3),Y(t.environmentCount()),M(5),Vg(`value`,t.query()),M(),F(t.view()===`element`?17:-1),M(2),Vg(`checked`,t.onlyProviding()),M(2),F(t.truncated()?21:-1),M(),F(t.providedBy().length?22:t.query().trim()&&!t.rows().length?23:-1),M(3),F(t.rows().length?-1:25),M(),Vg(`hidden`,!t.rows().length),N(`aria-label`,t.view()===`element`?`Element injectors`:`Environment injectors`),M(),L(t.rows()),M(2),F((e=t.selected())?29:-1,e)}}function MP(e,t){e&1&&(H(0,`div`,0),Fg(1,`span`,78),H(2,`p`,31),J(3,`Loading dependency injection data…`),U()())}function NP(e,t){e&1&&(H(0,`div`,1)(1,`p`,31),J(2,`No DI data found`),U(),H(3,`p`,32),J(4,` Open the app in a browser with the devtools connected to see its live injectors. No providers, injectables or inject() calls were found in the source either. `),U()())}function PP(e,t){if(e&1){let e=W();H(0,`div`,1)(1,`p`,31),J(2),U(),H(3,`p`,32),J(4,`Try part of a token name or a file path.`),U(),H(5,`button`,5),Qg(`click`,function(){return k(e),A(K(2).query.set(``))}),J(6,`Clear filter`),U()()}if(e&2){let e=K(2);M(2),X(`No providers match “`,e.query(),`”`)}}function FP(e,t){if(e&1&&(H(0,`span`,88),J(1),U()),e&2){let e=K().$implicit;M(),X(`providedIn: `,e.providedIn)}}function IP(e,t){if(e&1&&(H(0,`span`,90),J(1),U()),e&2){let e=K().$implicit;M(),X(`as `,e.source)}}function LP(e,t){if(e&1&&(H(0,`li`,85)(1,`div`,86)(2,`span`,87),J(3),U(),P(4,FP,2,1,`span`,88),U(),H(5,`div`,89)(6,`span`,54),J(7),U(),P(8,IP,2,1,`span`,90),U()()),e&2){let e=t.$implicit;M(3),Y(e.token),M(),F(e.providedIn?4:-1),M(3),Z(``,e.file,`:`,e.line),M(),F(e.source!==`class`&&e.source!==`providers array`?8:-1)}}function RP(e,t){if(e&1&&(H(0,`section`,82)(1,`h2`),J(2),H(3,`span`,83),J(4),U()(),H(5,`ul`,84),I(6,LP,9,5,`li`,85,HN),U()()),e&2){let e=t.$implicit;M(2),X(` `,e.label,` `),M(2),Y(e.items.length),M(2),L(e.items)}}function zP(e,t){if(e&1&&(H(0,`div`,81),I(1,RP,8,2,`section`,82,VN),U()),e&2){let e=K(2);M(),L(e.groupedProviders())}}function BP(e,t){if(e&1){let e=W();H(0,`div`,3)(1,`div`,7),fs(),H(2,`svg`,8),Fg(3,`circle`,9)(4,`path`,10),U(),ps(),H(5,`input`,79),Qg(`input`,function(t){return k(e),A(K().query.set(t.target.value))})(`keydown.escape`,function(){return k(e),A(K().query.set(``))}),U()(),H(6,`span`,80),J(7),U()(),H(8,`p`,14),fs(),H(9,`svg`,21),Fg(10,`circle`,22)(11,`path`,23),U(),ps(),H(12,`span`)(13,`strong`),J(14,`DI from source scan (static analysis).`),U(),J(15,` Connect the overlay on Angular 20 or later to see the live injector tree. `),U()(),P(16,PP,7,1,`div`,1)(17,zP,3,0,`div`,81)}if(e&2){let e=K();M(5),Vg(`value`,e.query()),M(2),Z(` `,e.sourceMatchCount(),` of `,e.sourceProviders().length,` `),M(9),F(e.groupedProviders().length===0?16:17)}}var VP=`inj-null`,HP={component:`var(--accent)`,directive:`#7cb4ff`,environment:`var(--ok)`,null:`var(--text-3)`};function UP(e){return e.injector.type===`element`?e.injector.component?`component`:`directive`:`environment`}function WP(e){return e.injector.type===`element`?`<${e.injector.name}>`:e.injector.name}function GP(e){return Array.isArray(e)}var KP=class e{rpc=$(null);nullId=VP;roots=j([]);environment=j([]);sourceProviders=j([]);loaded=j(!1);truncated=j(!1);view=j(`element`);query=j(``);onlyProviding=j(!1);componentsOnly=j(!0);collapsed=j(new Set);selectedId=j(null);focusId=j(null);index=Q(()=>{let e=new Map,t=new Map,n=(r,i)=>{for(let a of r)e.set(a.injector.id,a),i&&t.set(a.injector.id,i),n(a.children,a.injector.id)};return n(this.roots(),null),n(this.environment(),null),{map:e,parents:t}});elementCount=Q(()=>this.count(this.roots()));environmentCount=Q(()=>this.count(this.environment()));visible=Q(()=>{let e=this.view()===`element`?this.roots():this.environment();this.view()===`element`&&this.componentsOnly()&&(e=this.prune(e,e=>!!e.injector.component)),this.onlyProviding()&&(e=this.prune(e,e=>e.providers.length>0));let t=this.normalizedQuery();return t&&(e=this.prune(e,e=>this.nodeMatches(e,t))),e});rows=Q(()=>{let e=[],t=this.collapsed(),n=!!this.normalizedQuery(),r=(i,a)=>{for(let o of i){let i=n||!t.has(o.injector.id);e.push({node:o,depth:a,hasChildren:o.children.length>0,expanded:i}),i&&r(o.children,a+1)}};return r(this.visible(),0),e});selected=Q(()=>{let e=this.selectedId();return(e?this.index().map.get(e):void 0)??this.rows()[0]?.node??null});rovingId=Q(()=>{let e=this.rows(),t=this.focusId()??this.selected()?.injector.id;return t&&e.some(e=>e.node.injector.id===t)?t:e[0]?.node.injector.id??null});path=Q(()=>{let e=this.selected();if(!e)return[];let{map:t,parents:n}=this.index(),r=e.injector.path??[];if(!r.length){r=[e.injector.id];let t=n.get(e.injector.id);for(;t;)r.push(t),t=n.get(t);r.push(VP)}return r.map(e=>{let n=t.get(e);return{id:e,label:n?WP(n):e===VP?`Null injector`:`Not listed`,kind:n?UP(n):`null`,providers:n?.providers.length??0}})});providedBy=Q(()=>{let e=this.normalizedQuery();if(!e)return[];let t=[];for(let n of this.index().map.values()){let r=n.providers.filter(t=>t.token.toLowerCase().includes(e));r.length&&t.push({id:n.injector.id,label:WP(n),kind:UP(n),tokens:r.map(e=>e.token).join(`, `)})}return t.slice(0,12)});groupedProviders=Q(()=>{let e=this.normalizedQuery(),t=e?this.sourceProviders().filter(t=>t.token.toLowerCase().includes(e)||t.file.toLowerCase().includes(e)):this.sourceProviders(),n=[{type:`root-provider`,label:`Root Providers (provide*)`,items:[]},{type:`injectable`,label:`Injectable Services`,items:[]},{type:`injection`,label:`inject() Calls`,items:[]},{type:`provider`,label:`Component Providers`,items:[]}];for(let e of t)n.find(t=>t.type===e.type)?.items.push(e);return n.filter(e=>e.items.length>0)});sourceMatchCount=Q(()=>this.groupedProviders().reduce((e,t)=>e+t.items.length,0));normalizedQuery=Q(()=>this.query().trim().toLowerCase());destroyRef=E(Cs);stopTree=null;constructor(){uc(()=>{let e=this.rpc();e&&(this.loadInjectorTree(e),this.loadSourceProviders(e))}),this.destroyRef.onDestroy(()=>{this.stopTree?.(),this.highlight(null)})}label(e){return WP(e)}kind(e){return UP(e)}tone(e){return HP[e]??HP.null}kindById(e){let t=this.index().map.get(e);return t?UP(t):`null`}labelById(e){let t=this.index().map.get(e);return t?WP(t):e===VP?`Null injector`:`not listed`}capital(e){return e.charAt(0).toUpperCase()+e.slice(1)}matches(e){let t=this.normalizedQuery();return!!t&&e.toLowerCase().includes(t)}setView(e){this.view()!==e&&(this.view.set(e),this.selectedId.set(null),this.focusId.set(null))}select(e){this.selectedId.set(e),this.focusId.set(e)}toggle(e,t){t?.stopPropagation(),!this.normalizedQuery()&&this.collapsed.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}reveal(e){let t=this.index().map.get(e);if(!t)return;this.setView(t.injector.type===`element`?`element`:`environment`);let{parents:n}=this.index();this.collapsed.update(t=>{let r=new Set(t),i=n.get(e);for(;i;)r.delete(i),i=n.get(i);return r}),this.onlyProviding()&&t.providers.length===0&&this.onlyProviding.set(!1),t.injector.type===`element`&&!t.injector.component&&this.componentsOnly.set(!1),this.select(e),queueMicrotask(()=>this.focusRow(e,!1))}highlight(e){let t=this.rpc();if(!t)return;let n=e?.injector.type===`element`?e.injector.selector??null:null;t.scope(`ng-devtools`).rpc.call(`request-page-highlight`,n).catch(()=>{})}onTreeKey(e){let t=this.rows();if(!t.length)return;let n=this.rovingId(),r=t.findIndex(e=>e.node.injector.id===n),i=Math.max(r,0),a=t[i],o=-1;switch(e.key){case`ArrowDown`:o=Math.min(i+1,t.length-1);break;case`ArrowUp`:o=Math.max(i-1,0);break;case`Home`:o=0;break;case`End`:o=t.length-1;break;case`ArrowRight`:a.hasChildren&&!a.expanded?this.toggle(a.node.injector.id):a.hasChildren&&(o=i+1);break;case`ArrowLeft`:if(a.hasChildren&&a.expanded&&!this.normalizedQuery())this.toggle(a.node.injector.id);else{let e=this.index().parents.get(a.node.injector.id);o=t.findIndex(t=>t.node.injector.id===e)}break;case`Enter`:case` `:this.select(a.node.injector.id);break;default:return}if(e.preventDefault(),o>=0){let e=t[o].node.injector.id;this.focusId.set(e),this.selectedId.set(e),queueMicrotask(()=>this.focusRow(e,!0))}}focusRow(e,t){let n=document.querySelector(`.row[data-id="${CSS.escape(e)}"]`);n&&(t&&n.focus(),n.scrollIntoView({block:`nearest`}))}async loadInjectorTree(e){this.stopTree?.(),this.stopTree=null;let t=e.scope(`ng-devtools`),n;try{n=await t.rpc.sharedState(`injector-tree`)}catch{return}if(this.destroyRef.destroyed)return;let r=YT(),i=e=>{let t=e,n=(r?t?.pages?.[r]:void 0)??t;GP(n?.roots)&&this.roots.set(n.roots),GP(n?.environment)&&this.environment.set(n.environment),this.truncated.set(n?.truncated===!0)};i(n.value()),this.stopTree=n.on(`updated`,i)}async loadSourceProviders(e){let t=e.scope(`ng-devtools`);try{this.sourceProviders.set(await t.rpc.call(`get-providers`))}catch{this.sourceProviders.set([])}finally{this.loaded.set(!0)}}count(e){return e.reduce((e,t)=>e+1+this.count(t.children),0)}nodeMatches(e,t){let n=e.injector;return n.name.toLowerCase().includes(t)||!!n.component?.toLowerCase().includes(t)||!!n.directives?.some(e=>e.toLowerCase().includes(t))||e.providers.some(e=>e.token.toLowerCase().includes(t))||!!e.dependencies?.some(e=>e.token.toLowerCase().includes(t))}prune(e,t){let n=[];for(let r of e){let e=this.prune(r.children,t);(t(r)||e.length)&&n.push({...r,children:e})}return n}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-di-inspector`]],inputs:{rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`status`,1,`state`],[1,`state`],[1,`intro`],[1,`toolbar`],[`role`,`group`,`aria-label`,`Injector tree`,1,`segmented`],[`type`,`button`,3,`click`],[1,`pill`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a token, component or injector…`,`aria-label`,`Find a token, component or injector`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[1,`checkbox`],[`type`,`checkbox`,3,`change`,`checked`],[1,`notice`],[`role`,`status`,1,`where`],[`role`,`status`,1,`where`,`muted`],[1,`layout`],[`role`,`tree`,1,`tree`,3,`keydown`,`hidden`],[`role`,`treeitem`,1,`row`,3,`selected`,`--%NS%depth`],[`aria-labelledby`,`di-detail-title`,1,`detail`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[1,`where-label`],[`type`,`button`,1,`chip`],[`type`,`button`,1,`chip`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`mono`],[1,`chip-tokens`],[`type`,`button`,1,`link`,3,`click`],[1,`state-title`],[1,`state-hint`],[`role`,`treeitem`,1,`row`,3,`click`,`focus`,`blur`,`mouseenter`,`mouseleave`],[`aria-hidden`,`true`,1,`twisty`,3,`open`],[`aria-hidden`,`true`,1,`twisty-space`],[`aria-hidden`,`true`,1,`kind`],[1,`sr-only`],[1,`name`,`mono`],[1,`sub`],[1,`meta`],[1,`count`],[1,`count`,`provides`],[`aria-hidden`,`true`,1,`twisty`,3,`click`],[`viewBox`,`0 0 24 24`],[`d`,`m9 6 6 6-6 6`],[`d`,`M12 5v14M5 12l7 7 7-7`],[`d`,`M21 8 12 3 3 8v8l9 5 9-5z`],[1,`detail-head`],[1,`badge`],[`id`,`di-detail-title`,1,`mono`],[`aria-label`,`Classes on this element`,1,`classes`],[1,`block`],[1,`hint`],[1,`path`],[3,`current`],[1,`providers`],[1,`empty-line`],[3,`is-component`],[1,`step`,`null`],[`type`,`button`,1,`step`],[1,`hint-inline`],[`type`,`button`,1,`step`,3,`click`],[1,`step-count`],[1,`deps`],[1,`dep`,3,`hit`],[1,`dep`],[1,`dep-main`],[1,`token`,`mono`],[1,`flag`],[1,`dep-meta`],[`type`,`button`,1,`from`],[1,`from`,`absent`],[1,`from`,`missing`],[`type`,`button`,1,`from`,3,`click`],[1,`provider`,3,`hit`],[1,`provider`],[1,`flag`,`kind-flag`],[`aria-hidden`,`true`,1,`spinner`],[`type`,`search`,`placeholder`,`Filter by token or file…`,`aria-label`,`Filter by token or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`aria-live`,`polite`,1,`total`],[1,`source-providers`],[1,`provider-group`],[1,`section-count`],[`role`,`list`,1,`provider-list`],[1,`provider-card`],[1,`provider-header`],[1,`token`],[1,`provided-in`],[1,`provider-meta`],[1,`as`]],template:function(e,t){e&1&&P(0,jP,30,17)(1,MP,4,0,`div`,0)(2,NP,5,0,`div`,1)(3,BP,18,4),e&2&&F(t.roots().length>0?0:t.loaded()?t.sourceProviders().length===0?2:3:1)},styles:[`[_nghost-%COMP%] { display: block; color: var(--%NS%text); font-size: 13px; @@ -5815,11 +5872,11 @@ button[_ngcontent-%COMP%] { .provider-meta[_ngcontent-%COMP%] .as[_ngcontent-%COMP%] { color: var(--%NS%text-2); -}`]})},MP=`@type`;function NP(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&MP in e}function PP(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function FP(e,t=``){if(e===null)return`null`;if(typeof e==`string`)return JSON.stringify(e);if(typeof e!=`object`)return String(e);let n=t+` `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+FP(e,n)).join(`, -`)}\n${t}]`:`[]`;if(NP(e)){let r=e;switch(r[MP]){case`undefined`:return`undefined`;case`Date`:return`Date(${r.value})`;case`bigint`:return`${r.value}n`;case`symbol`:return`Symbol(${r.value})`;case`function`:return`ƒ ${r.name}()`;case`Error`:return`${r.name??`Error`}: ${r.message}`;case`Element`:return`<${r.value}>`;case`Map`:{let e=r.entries??[];if(!e.length)return`Map(${r.size}) {}`;let i=e.map(([e,t])=>`${n}${FP(e,n)} => ${FP(t,n)}`);return`Map(${r.size}) {\n${i.join(`, -`)}\n${t}}`}case`Set`:{let e=r.values??[];return e.length?`Set(${r.size}) {\n${e.map(e=>n+FP(e,n)).join(`, -`)}\n${t}}`:`Set(${r.size}) {}`}default:return String(r.value??r[MP])}}let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${PP(e)}: ${FP(t,n)}`).join(`, -`)}\n${t}}`:`{}`}function IP(e,t=120){let n=FP(e).replace(/\s*\n\s*/g,` `);return n.length>t?`${n.slice(0,t-1)}…`:n}var LP=[`cancelButton`],RP=[`restoreButton`],zP=[`stateTree`],BP=[`latestButton`],VP=(e,t)=>t.id,HP=(e,t)=>t.seq,UP=(e,t)=>t.key,WP=(e,t)=>t.name,GP=(e,t)=>t.path,KP=(e,t)=>t.kind,qP=(e,t)=>t.name+t.file+t.line;function JP(e,t){if(e&1){let e=W();z(0,`span`,20),J(1,`Page`),B(),z(2,`app-select`,21),G(`valueChange`,function(t){return k(e),A(K().selectPage(t))}),B()}if(e&2){let e=K();M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function YP(e,t){if(e&1&&(z(0,`span`,11),J(1),B()),e&2){let e=K();M(),Y(e.liveStores().length)}}function XP(e,t){if(e&1){let e=W();z(0,`div`,12)(1,`p`,22),J(2,`Could not load the live store state.`),B(),z(3,`p`,23),J(4,`Check that the dev server with ng-devtools is still running.`),B(),z(5,`button`,24),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Retry`),B()()}}function ZP(e,t){e&1&&(z(0,`div`,13)(1,`p`,22),J(2,`No page is reporting NgRx state yet.`),B(),z(3,`p`,23),J(4,` Open the app in a browser. Stores show up here as soon as the page creates them. `),B()())}function QP(e,t){e&1&&(z(0,`p`,22),J(1,`No signal store instance on this page yet.`),B(),z(2,`p`,23),J(3,` A `),z(4,`code`),J(5,`signalStore`),B(),J(6,` is created the first time something injects it. Navigate to a page that uses the store and it appears here. `),B())}function $P(e,t){e&1&&(z(0,`p`,22),J(1,`The @ngrx/store Store was not found on this page.`),B(),z(2,`p`,23),J(3,` Check that `),z(4,`code`),J(5,`provideStore()`),B(),J(6,` or `),z(7,`code`),J(8,`StoreModule.forRoot()`),B(),J(9,` is part of the providers of the running app. `),B())}function eF(e,t){e&1&&(z(0,`p`,22),J(1,`This page has no NgRx store.`),B(),z(2,`p`,23),J(3,` Stores from `),z(4,`code`),J(5,`@ngrx/signals`),B(),J(6,` (`),z(7,`code`),J(8,`signalStore`),B(),J(9,`, `),z(10,`code`),J(11,`signalState`),B(),J(12,`) and `),z(13,`code`),J(14,`@ngrx/store`),B(),J(15,` are listed here once the app creates them. `),B())}function tF(e,t){if(e&1&&(z(0,`div`,13),P(1,QP,7,0)(2,$P,10,0)(3,eF,16,0),B()),e&2){let e=K();M(),F(e.usesSignals()?1:e.usesClassic()?2:3)}}function nF(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,28),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selectStore(t.id))}),z(2,`span`,29),V(3,`span`,30),z(4,`span`,31),J(5),B()(),z(6,`span`,32),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.id===n.store()?.id),N(`aria-pressed`,e.id===n.store()?.id),M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.label),M(2),X_(` `,n.kindLabel(e.kind),` · `,e.scope,` · `,n.changeCount(e.id),` `,n.changeCount(e.id)===1?`change`:`changes`,` `)}}function rF(e,t){e&1&&(z(0,`li`,26),J(1,`No stores match this filter.`),B())}function iF(e,t){if(e&1&&(z(0,`span`,36),J(1),B()),e&2){let e=t;R(`title`,e),M(),Y(e)}}function aF(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=K();M(),Y(e.classic.devtools?`Store DevTools on`:`read-only`)}}function oF(e,t){if(e&1&&(z(0,`code`),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function sF(e,t){if(e&1&&(z(0,`p`,37),J(1,` Referenced by `),I(2,oF,3,2,null,null,wg),B()),e&2){let e=K();M(2),L(e.signal.references)}}function cF(e,t){if(e&1&&(z(0,`p`,51),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function lF(e,t){if(e&1){let e=W();z(0,`div`,38)(1,`p`)(2,`strong`),J(3,`Viewing a past state.`),B(),J(4,` New actions are logged but do not change the state until you go back to the latest state. `),B(),z(5,`button`,50,1),G(`click`,function(){return k(e),A(K(3).backToLatest())}),J(7,` Back to latest `),B(),P(8,cF,2,1,`p`,51),B()}if(e&2){let e=K(3);M(5),R(`disabled`,e.busy()||!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-latest-off`),M(3),F(e.canRestore()?-1:8)}}function uF(e,t){if(e&1&&(z(0,`dt`),J(1),B(),z(2,`dd`)(3,`code`,57),J(4),B()()),e&2){let e=t.$implicit;M(),Y(e.key),M(2),R(`title`,e.full),M(),Y(e.value)}}function dF(e,t){if(e&1&&(z(0,`dl`,53),I(1,uF,5,3,null,null,UP),B()),e&2){let e=K(4);M(),L(e.computedEntries())}}function fF(e,t){e&1&&(z(0,`p`,54),J(1,`No computed signals.`),B())}function pF(e,t){e&1&&(z(0,`span`,59),J(1,`rxMethod`),B())}function mF(e,t){if(e&1&&(z(0,`li`,58),J(1),P(2,pF,2,0,`span`,59),z(3,`span`,60),J(4),B()()),e&2){let e=t.$implicit;M(),X(` `,e.name,` `),M(),F(e.rx?2:-1),M(2),Z(``,e.calls,` `,e.calls===1?`call`:`calls`)}}function hF(e,t){if(e&1&&(z(0,`ul`,56),I(1,mF,5,4,`li`,58,WP),B()),e&2){let e=K();M(),L(e.methods)}}function gF(e,t){e&1&&(z(0,`p`,54),J(1,`No methods.`),B())}function _F(e,t){if(e&1&&(z(0,`section`,43)(1,`h4`,52),J(2,`Computed`),B(),P(3,dF,3,0,`dl`,53)(4,fF,2,0,`p`,54),z(5,`h4`,55),J(6,`Methods`),B(),P(7,hF,3,0,`ul`,56)(8,gF,2,0,`p`,54),B()),e&2){let e=K(3);M(3),F(e.computedEntries().length?3:4),M(4),F(t.methods.length?7:8)}}function vF(e,t){if(e&1&&(z(0,`span`,59),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function yF(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,61),G(`click`,function(){let t=k(e).$implicit;return A(K(3).selectEntry(t.seq))}),z(2,`span`,62),J(3),B(),z(4,`span`,63),J(5),B(),z(6,`span`,64),P(7,vF,2,1,`span`,59),J(8),B()()()}if(e&2){let e=t.$implicit,n=K(3);M(),q(`selected`,e.seq===n.selectedSeq()),N(`aria-pressed`,e.seq===n.selectedSeq()),M(2),X(`#`,e.seq),M(),R(`title`,e.type),M(),Y(e.type),M(2),F(e.origin?7:-1),M(),Z(` `,e.diff.length===0?`no change`:e.diff.length+(e.diff.length===1?` change`:` changes`),` · `,n.formatTime(e.timestamp))}}function bF(e,t){e&1&&J(0,` No entries match this filter. `)}function xF(e,t){e&1&&J(0,` No actions dispatched since the page connected. `)}function SF(e,t){e&1&&J(0,` No state changes yet. Method calls and patchState writes that change the state are recorded here. `)}function CF(e,t){if(e&1&&(z(0,`li`,26),P(1,bF,1,0)(2,xF,1,0)(3,SF,1,0),B()),e&2){let e=K(),t=K(2);M(),F(t.filter()?1:e.classic?2:3)}}function wF(e,t){if(e&1&&(z(0,`dt`),J(1,`Origin`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(),t=K(3);M(3),Y(t.originText(e.origin))}}function TF(e,t){if(e&1&&(z(0,`dt`),J(1,`Action`),B(),z(2,`dd`)(3,`pre`,69),J(4),B()()),e&2){let e=K(),t=K(3);M(4),Y(t.prettyText(e.action))}}function EF(e,t){if(e&1&&(z(0,`dt`),J(1,`Arguments`),B(),z(2,`dd`)(3,`pre`,69),J(4),B()()),e&2){let e=K(),t=K(3);M(4),Y(t.prettyText(e.args))}}function DF(e,t){if(e&1&&(z(0,`code`,74),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.shortText(e.before))}}function OF(e,t){e&1&&(z(0,`span`,76),J(1,`→`),B(),z(2,`span`,77),J(3,`became`),B())}function kF(e,t){if(e&1&&(z(0,`code`,75),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.shortText(e.after))}}function AF(e,t){if(e&1&&(z(0,`li`)(1,`span`,71),J(2),B(),z(3,`code`,72),J(4),B(),z(5,`span`,73),P(6,DF,2,1,`code`,74),P(7,OF,4,0),P(8,kF,2,1,`code`,75),B()()),e&2){let e=t.$implicit,n=K(5);w_(`diff-row `+e.op),M(2),Y(n.opLabel(e.op)),M(2),Y(e.path),M(2),F(e.op===`add`?-1:6),M(),F(e.op===`change`?7:-1),M(),F(e.op===`remove`?-1:8)}}function jF(e,t){if(e&1&&(z(0,`ul`,67),I(1,AF,9,7,`li`,70,GP),B()),e&2){let e=K();M(),L(e.diff)}}function MF(e,t){e&1&&(z(0,`p`,54),J(1,`The state did not change.`),B())}function NF(e,t){e&1&&J(0),e&2&&X(` Store DevTools jumps the app state to the state right after action #`,K(3).seq,`. Until you go back to the latest state, new actions are logged but do not change the state. `)}function PF(e,t){if(e&1&&J(0),e&2){let e=K(3);Z(` This sets every state key of `,K().label,` back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function FF(e,t){if(e&1){let e=W();z(0,`div`,79),G(`keydown.escape`,function(t){return k(e),A(K(5).cancelRestore(t))}),z(1,`p`,80),P(2,NF,1,1)(3,PF,1,2),B(),z(4,`div`,81)(5,`button`,50),G(`click`,function(){k(e);let t=K(2);return A(K(3).restore(t.seq,t.source===`store`))}),J(6,` Restore `),B(),z(7,`button`,24,2),G(`click`,function(){return k(e),A(K(5).cancelRestore())}),J(9,` Cancel `),B()()()}if(e&2){let e=K(2),t=K(3);M(2),F(e.source===`store`?2:3),M(3),R(`disabled`,t.busy())}}function IF(e,t){if(e&1&&(z(0,`p`,83),J(1),B()),e&2){let e=K(6);M(),Y(e.restoreOff)}}function LF(e,t){if(e&1){let e=W();z(0,`button`,82,3),G(`click`,function(){k(e);let t=K(2);return A(K(3).askRestore(t.seq))}),J(2,` Restore this state `),B(),P(3,IF,2,1,`p`,83)}if(e&2){let e=K(5);R(`disabled`,!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-writes-off`),M(3),F(e.canRestore()?-1:3)}}function RF(e,t){if(e&1&&P(0,FF,10,2,`div`,78)(1,LF,4,3),e&2){let e=K();F(K(3).confirmSeq()===e.seq?0:1)}}function zF(e,t){e&1&&(z(0,`p`,68),J(1,` Time travel for @ngrx/store needs `),z(2,`code`),J(3,`provideStoreDevtools()`),B(),J(4,`. Without it this log is read-only. `),B())}function BF(e,t){if(e&1&&(z(0,`section`,49)(1,`h5`,65),J(2),B(),z(3,`dl`,53)(4,`dt`),J(5,`Time`),B(),z(6,`dd`),J(7),B(),P(8,wF,4,1),P(9,TF,5,1),P(10,EF,5,1),B(),z(11,`h6`,66),J(12,`State diff`),B(),P(13,jF,3,0,`ul`,67)(14,MF,2,0,`p`,54),P(15,RF,2,1)(16,zF,5,0,`p`,68),B()),e&2){let e=t,n=K(3);M(2),Z(`#`,e.seq,` `,e.type),M(5),Y(n.formatTime(e.timestamp)),M(),F(e.origin?8:-1),M(),F(e.action===void 0?-1:9),M(),F(e.args?.length?10:-1),M(3),F(e.diff.length?13:14),M(2),F(e.restorable?15:e.source===`store`?16:-1)}}function VF(e,t){if(e&1&&(z(0,`div`,27)(1,`div`,33)(2,`h3`),J(3),B(),z(4,`div`,34)(5,`span`,35),J(6),B(),z(7,`span`,35),J(8),B(),P(9,iF,2,2,`span`,36),P(10,aF,2,1,`span`,35),B(),P(11,sF,4,0,`p`,37),B(),P(12,lF,9,3,`div`,38),z(13,`div`,39)(14,`section`,40)(15,`h4`,41),J(16,`State`),B(),z(17,`pre`,42,0),J(19),B()(),P(20,_F,9,2,`section`,43),B(),z(21,`section`,44)(22,`h4`,45),J(23),z(24,`span`,11),J(25),B()(),V(26,`app-limit-note`,46),z(27,`div`,47)(28,`ul`,48),I(29,yF,9,9,`li`,null,HP,!1,CF,4,1,`li`,26),B(),P(32,BF,17,8,`section`,49),B()()()),e&2){let e,n,r,i=t,a=K(2);M(3),Y(i.label),M(3),Y(a.kindLabel(i.kind)),M(2),X(`scope: `,i.scope),M(),F((e=i.signal?.declaredIn)?9:-1,e),M(),F(i.classic?10:-1),M(),F(i.signal?.references?.length?11:-1),M(),F(i.classic?.paused?12:-1),M(7),Y(a.stateText()),M(),F((n=i.signal)?20:-1,n),M(3),X(` `,i.classic?`Action log`:`Change log`,` `),M(2),Y(a.storeLog().length),M(),R(`dropped`,a.page()?.dropped??0)(`max`,a.maxLog()),M(2),N(`aria-label`,i.classic?`Actions`:`Changes`),M(),L(a.storeLog()),M(3),F((r=a.entry())?32:-1,r)}}function HF(e,t){if(e&1&&(z(0,`div`,14)(1,`ul`,25),I(2,nF,8,10,`li`,null,VP,!1,rF,2,0,`li`,26),B(),P(5,VF,33,16,`div`,27),B()),e&2){let e,t=K();M(2),L(t.filteredStores()),M(3),F((e=t.store())?5:-1,e)}}function UF(e,t){if(e&1&&(z(0,`span`,11),J(1),B()),e&2){let e=K();M(),Y(e.sourceEntries().length)}}function WF(e,t){e&1&&(z(0,`div`,18),V(1,`span`,84),z(2,`p`,22),J(3,`Scanning source for NgRx declarations…`),B()())}function GF(e,t){e&1&&(z(0,`div`,19)(1,`p`,22),J(2,`No NgRx declarations found in source.`),B(),z(3,`p`,23),J(4,` The scan looks for `),z(5,`code`),J(6,`signalStore`),B(),J(7,`, `),z(8,`code`),J(9,`signalState`),B(),J(10,`, `),z(11,`code`),J(12,`signalMethod`),B(),J(13,`, `),z(14,`code`),J(15,`createAction`),B(),J(16,`, `),z(17,`code`),J(18,`createReducer`),B(),J(19,`, `),z(20,`code`),J(21,`createEffect`),B(),J(22,`, `),z(23,`code`),J(24,`createSelector`),B(),J(25,` and `),z(26,`code`),J(27,`createFeature`),B(),J(28,`. `),B()())}function KF(e,t){if(e&1){let e=W();z(0,`button`,86),G(`click`,function(){let t=k(e).$implicit,n=K(2);return A(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,30),z(2,`span`,91),J(3),B(),z(4,`span`,87),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(n.kindLabel(e.kind)),M(2),Y(e.count)}}function qF(e,t){if(e&1&&(z(0,`p`,96),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function JF(e,t){if(e&1&&(z(0,`li`,90)(1,`div`,92),V(2,`span`,30),z(3,`span`,93),J(4),B(),z(5,`span`,35),J(6),B()(),z(7,`div`,94)(8,`span`,95),J(9),B()(),P(10,qF,2,1,`p`,96),B()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.name),M(2),Y(n.kindLabel(e.kind)),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.detail?10:-1)}}function YF(e,t){if(e&1){let e=W();z(0,`li`,18)(1,`p`,22),J(2,`No declarations match.`),B(),z(3,`button`,24),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(4,`Clear filters`),B()()}}function XF(e,t){if(e&1){let e=W();z(0,`div`,85)(1,`button`,86),G(`click`,function(){return k(e),A(K().kind.set(null))}),J(2,` All `),z(3,`span`,87),J(4),B()(),I(5,KF,6,7,`button`,88,KP),B(),z(7,`ul`,89),I(8,JF,11,8,`li`,90,qP,!1,YF,5,0,`li`,18),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.sourceEntries().length),M(),L(e.groupedEntries()),M(3),L(e.filteredEntries())}}var ZF={action:`#f59e0b`,reducer:`#a78bfa`,effect:`#fb923c`,selector:`#60a5fa`,feature:`#34d399`,"store-setup":`#94a3b8`,"signal-store":`#e879f9`,"signal-state":`#22d3ee`,"signal-method":`#fb7185`,store:`#a78bfa`},QF={"signal-store":`signalStore`,"signal-state":`signalState`,"signal-method":`signalMethod`,"store-setup":`store setup`,store:`@ngrx/store`},$F={dispatch:`store.dispatch(action)`,effect:`NgRx effect (Store.next)`,reactive:`store.dispatch(() => action)`},eI=new Set([`action`,`reducer`,`effect`,`selector`,`feature`,`store-setup`]),tI=class e{rpc=$(null);canRestore=Q(()=>nE(this.rpc(),`ngrx`));restoreOff=HT(`ngrx`);filter=j(``);kind=j(null);sourceEntries=j([]);sourceLoaded=j(!1);pages=j([]);failed=j(!1);selectedPageId=j(null);hostPageId=JT();maxLog=Q(()=>tE(this.rpc()).limits.changeLog);selectedStoreId=j(null);selectedSeq=j(null);confirmSeq=j(null);busy=j(!1);focusLatest=j(!1);focusConfirm=j(null);cancelButton=Lv(`cancelButton`);restoreButton=Lv(`restoreButton`);stateTree=Lv(`stateTree`);latestButton=Lv(`latestButton`);message=j(``);destroyRef=E(Cs);unsubscribe=null;page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.selectedPageId())??e.find(e=>e.pageId===this.hostPageId)??e[0]??null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url,hint:e.url})));liveStores=Q(()=>{let e=this.page();if(!e)return[];let t=e.stores.map(e=>({id:e.id,label:e.name??e.references[0]??e.className,kind:e.kind,scope:e.scope,signal:e}));return e.classic&&t.push({id:`store`,label:`Store`,kind:`store`,scope:e.classic.scope,classic:e.classic}),t});filteredStores=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.liveStores().filter(t=>t.label.toLowerCase().includes(e)||t.kind.includes(e)||(t.signal?.stateKeys??[]).some(t=>t.toLowerCase().includes(e))||(this.page()?.log??[]).some(n=>n.storeId===t.id&&n.type.toLowerCase().includes(e))):this.liveStores()});store=Q(()=>{let e=this.liveStores();return e.find(e=>e.id===this.selectedStoreId())??e[0]??null});stateText=Q(()=>{let e=this.store();return e?FP(e.signal?e.signal.state:e.classic?.state):``});computedEntries=Q(()=>Object.entries(this.store()?.signal?.computed??{}).map(([e,t])=>({key:e,value:IP(t,160),full:FP(t)})));storeLog=Q(()=>{let e=this.store()?.id,t=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(n=>n.storeId===e&&(!t||n.type.toLowerCase().includes(t)||this.storeMatches(t))).reverse()});entry=Q(()=>this.storeLog().find(e=>e.seq===this.selectedSeq())??null);usesSignals=Q(()=>this.sourceEntries().some(e=>e.kind===`signal-store`||e.kind===`signal-state`));usesClassic=Q(()=>this.sourceEntries().some(e=>eI.has(e.kind)));filteredEntries=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind();return this.sourceEntries().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.includes(e)||(n.detail??``).toLowerCase().includes(e)))});groupedEntries=Q(()=>{let e=new Map;for(let t of this.sourceEntries())e.set(t.kind,(e.get(t.kind)??0)+1);return[...e.entries()].map(([e,t])=>({kind:e,count:t}))});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),$v(()=>{let e=this.latestButton();e&&this.focusLatest()&&!this.busy()&&(this.focusLatest.set(!1),e.nativeElement.focus())}),uc(()=>{let e=this.focusConfirm(),t=e===`cancel`?this.cancelButton():this.restoreButton();e&&t&&(this.focusConfirm.set(null),t.nativeElement.focus())}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}storeMatches(e){let t=this.store();return!!t&&t.label.toLowerCase().includes(e)}async load(e){this.failed.set(!1),QT(e,`get-ngrx-store`).then(e=>this.sourceEntries.set(Array.isArray(e)?e:[])).catch(()=>this.sourceEntries.set([])).finally(()=>this.sourceLoaded.set(!0));try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`ngrx-store`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.pages.set(Array.isArray(t?.pages)?t.pages:[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}}retry(){let e=this.rpc();e&&this.load(e)}selectPage(e){this.selectedPageId.set(e),this.selectedStoreId.set(null),this.selectedSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectStore(e){this.selectedStoreId.set(e),this.selectedSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectEntry(e){this.selectedSeq.set(this.selectedSeq()===e?null:e),this.confirmSeq.set(null),this.message.set(``)}askRestore(e){this.confirmSeq.set(e),this.focusConfirm.set(`cancel`)}cancelRestore(e){e?.preventDefault(),this.confirmSeq.set(null),this.focusConfirm.set(`restore`)}async restore(e,t){let n=this.page();if(!n)return;this.busy.set(!0),this.focusLatest.set(!1);let r=!1;try{let i=await QT(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:{type:`restore`,seq:e}});this.message.set(i?.error??i?.message??`Restored.`),r=t&&!i?.error&&!!i?.paused}catch{this.message.set(`Could not reach the page to restore the state.`)}finally{this.busy.set(!1),this.confirmSeq.set(null),this.focusLatest.set(r),r||this.stateTree()?.nativeElement.focus()}}async backToLatest(){let e=this.page();if(e){this.busy.set(!0);try{let t=await QT(this.rpc(),`request-ngrx-action`,{pageId:e.pageId,request:{type:`latest`}});this.focusLatest.set(!1),this.stateTree()?.nativeElement.focus(),this.message.set(t?.error??t?.message??`Back on the latest state.`)}catch{this.message.set(`Could not reach the page to go back to the latest state.`)}finally{this.busy.set(!1)}}}clearFilters(){this.filter.set(``),this.kind.set(null)}changeCount(e){return(this.page()?.log??[]).filter(t=>t.storeId===e).length}kindColor(e){return ZF[e]??`var(--text-3)`}kindLabel(e){return QF[e]??e}originText(e){return $F[e]??e}opLabel(e){return e===`add`?`added`:e===`remove`?`removed`:`changed`}prettyText(e){return FP(e)}shortText(e){return IP(e)}formatTime=rD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-store-inspector`]],viewQuery:function(e,t){e&1&&e_(t.cancelButton,LP,5)(t.restoreButton,RP,5)(t.stateTree,zP,5)(t.latestButton,BP,5),e&2&&t_(4)},inputs:{rpc:[1,`rpc`]},decls:25,vars:10,consts:[[`stateTree`,``],[`latestButton`,``],[`cancelButton`,``],[`restoreButton`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter stores, changes and declarations…`,`aria-label`,`Filter stores, changes and source declarations`,3,`input`,`value`],[1,`status`],[`aria-hidden`,`true`,1,`live-dot`],[`aria-labelledby`,`ngrx-live-heading`,1,`block`],[1,`section-head`],[`id`,`ngrx-live-heading`],[1,`pill`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`live-layout`],[`role`,`status`,1,`message`],[`aria-labelledby`,`ngrx-source-heading`,1,`block`],[`id`,`ngrx-source-heading`],[`role`,`status`,1,`empty`,`compact`],[1,`empty`,`compact`],[`id`,`ngrx-page-label`,1,`visually-hidden`],[`labelledBy`,`ngrx-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`hint`],[`type`,`button`,1,`btn`,3,`click`],[`aria-label`,`Stores on this page`,1,`store-list`],[1,`muted`,`pad`],[1,`store-detail`],[`type`,`button`,1,`store-item`,3,`click`],[1,`store-top`],[`aria-hidden`,`true`,1,`dot`],[1,`store-name`],[1,`store-meta`],[1,`detail-head`],[1,`chips`],[1,`chip`],[1,`chip`,`mono`,3,`title`],[1,`refs`],[1,`paused`],[1,`facts`],[`aria-labelledby`,`ngrx-state-heading`,1,`fact`],[`id`,`ngrx-state-heading`],[`tabindex`,`0`,`aria-labelledby`,`ngrx-state-heading`,1,`tree`],[`aria-labelledby`,`ngrx-computed-heading`,1,`fact`],[`aria-labelledby`,`ngrx-log-heading`,1,`log`],[`id`,`ngrx-log-heading`],[`what`,`changes on this page`,`limit`,`changeLog`,3,`dropped`,`max`],[1,`log-layout`],[1,`log-list`],[`aria-labelledby`,`ngrx-entry-heading`,1,`entry`],[`type`,`button`,1,`btn`,`primary`,3,`click`,`disabled`],[`id`,`store-latest-off`,1,`hint`,`small`],[`id`,`ngrx-computed-heading`],[1,`kv`],[1,`muted`],[`id`,`ngrx-methods-heading`,1,`spaced`],[`aria-labelledby`,`ngrx-methods-heading`,1,`methods`],[3,`title`],[1,`chip`,`mono`],[1,`tag`],[1,`calls`],[`type`,`button`,1,`log-item`,3,`click`],[1,`seq`],[1,`log-type`,3,`title`],[1,`log-meta`],[`id`,`ngrx-entry-heading`],[1,`sub`],[1,`diff`],[1,`hint`,`small`],[1,`code`],[3,`class`],[1,`op`],[1,`path`],[1,`values`],[1,`before`],[1,`after`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[`role`,`group`,`aria-labelledby`,`ngrx-confirm-text`,1,`confirm`],[`role`,`group`,`aria-labelledby`,`ngrx-confirm-text`,1,`confirm`,3,`keydown.escape`],[`id`,`ngrx-confirm-text`],[1,`actions`],[`type`,`button`,1,`btn`,`restore`,3,`click`,`disabled`],[`id`,`store-writes-off`,1,`hint`,`small`],[`aria-hidden`,`true`,1,`spinner`],[`role`,`group`,`aria-label`,`Filter declarations by kind`,1,`kinds`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[1,`nodes`],[1,`node-card`],[1,`chip-text`],[1,`node-header`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[1,`detail`]],template:function(e,t){e&1&&(z(0,`div`,4)(1,`input`,5),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),P(2,JP,3,2),z(3,`span`,6),V(4,`span`,7),J(5),B()(),z(6,`section`,8)(7,`div`,9)(8,`h2`,10),J(9,`Live stores`),B(),P(10,YP,2,1,`span`,11),B(),P(11,XP,7,0,`div`,12)(12,ZP,5,0,`div`,13)(13,tF,4,1,`div`,13)(14,HF,6,2,`div`,14),z(15,`p`,15),J(16),B()(),z(17,`section`,16)(18,`div`,9)(19,`h2`,17),J(20,`Source declarations`),B(),P(21,UF,2,1,`span`,11),B(),P(22,WF,4,0,`div`,18)(23,GF,29,0,`div`,19)(24,XF,11,5),B()),e&2&&(M(),R(`value`,t.filter()),M(),F(t.pages().length>1?2:-1),M(),q(`on`,!!t.page()),M(2),X(` `,t.page()?`Live`:`No page connected`,` `),M(5),F(t.liveStores().length?10:-1),M(),F(t.failed()?11:t.page()?t.liveStores().length?14:13:12),M(5),Y(t.message()),M(5),F(t.sourceEntries().length?21:-1),M(),F(t.sourceLoaded()?t.sourceEntries().length===0?23:24:22))},dependencies:[oD,XE],styles:[`[_nghost-%COMP%] { +}`]})},qP=`@type`;function JP(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&qP in e}function YP(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function XP(e,t=``){if(e===null)return`null`;if(typeof e==`string`)return JSON.stringify(e);if(typeof e!=`object`)return String(e);let n=t+` `;if(Array.isArray(e))return e.length?`[\n${e.map(e=>n+XP(e,n)).join(`, +`)}\n${t}]`:`[]`;if(JP(e)){let r=e;switch(r[qP]){case`undefined`:return`undefined`;case`Date`:return`Date(${r.value})`;case`bigint`:return`${r.value}n`;case`symbol`:return`Symbol(${r.value})`;case`function`:return`ƒ ${r.name}()`;case`Error`:return`${r.name??`Error`}: ${r.message}`;case`Element`:return`<${r.value}>`;case`Map`:{let e=r.entries??[];if(!e.length)return`Map(${r.size}) {}`;let i=e.map(([e,t])=>`${n}${XP(e,n)} => ${XP(t,n)}`);return`Map(${r.size}) {\n${i.join(`, +`)}\n${t}}`}case`Set`:{let e=r.values??[];return e.length?`Set(${r.size}) {\n${e.map(e=>n+XP(e,n)).join(`, +`)}\n${t}}`:`Set(${r.size}) {}`}default:return String(r.value??r[qP])}}let r=Object.entries(e);return r.length?`{\n${r.map(([e,t])=>`${n}${YP(e)}: ${XP(t,n)}`).join(`, +`)}\n${t}}`:`{}`}function ZP(e,t=120){let n=XP(e).replace(/\s*\n\s*/g,` `);return n.length>t?`${n.slice(0,t-1)}…`:n}var QP=[`cancelButton`],$P=[`restoreButton`],eF=[`stateTree`],tF=[`latestButton`],nF=(e,t)=>t.id,rF=(e,t)=>t.seq,iF=(e,t)=>t.key,aF=(e,t)=>t.name,oF=(e,t)=>t.path,sF=(e,t)=>t.kind,cF=(e,t)=>t.name+t.file+t.line;function lF(e,t){if(e&1){let e=W();z(0,`span`,20),J(1,`Page`),B(),z(2,`app-select`,21),G(`valueChange`,function(t){return k(e),A(K().selectPage(t))}),B()}if(e&2){let e=K();M(2),R(`options`,e.pageOptions())(`value`,e.page()?.pageId??null)}}function uF(e,t){if(e&1&&(z(0,`span`,11),J(1),B()),e&2){let e=K();M(),Y(e.liveStores().length)}}function dF(e,t){if(e&1){let e=W();z(0,`div`,12)(1,`p`,22),J(2,`Could not load the live store state.`),B(),z(3,`p`,23),J(4,`Check that the dev server with ng-devtools is still running.`),B(),z(5,`button`,24),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Retry`),B()()}}function fF(e,t){e&1&&(z(0,`div`,13)(1,`p`,22),J(2,`No page is reporting NgRx state yet.`),B(),z(3,`p`,23),J(4,` Open the app in a browser. Stores show up here as soon as the page creates them. `),B()())}function pF(e,t){e&1&&(z(0,`p`,22),J(1,`No signal store instance on this page yet.`),B(),z(2,`p`,23),J(3,` A `),z(4,`code`),J(5,`signalStore`),B(),J(6,` is created the first time something injects it. Navigate to a page that uses the store and it appears here. `),B())}function mF(e,t){e&1&&(z(0,`p`,22),J(1,`The @ngrx/store Store was not found on this page.`),B(),z(2,`p`,23),J(3,` Check that `),z(4,`code`),J(5,`provideStore()`),B(),J(6,` or `),z(7,`code`),J(8,`StoreModule.forRoot()`),B(),J(9,` is part of the providers of the running app. `),B())}function hF(e,t){e&1&&(z(0,`p`,22),J(1,`This page has no NgRx store.`),B(),z(2,`p`,23),J(3,` Stores from `),z(4,`code`),J(5,`@ngrx/signals`),B(),J(6,` (`),z(7,`code`),J(8,`signalStore`),B(),J(9,`, `),z(10,`code`),J(11,`signalState`),B(),J(12,`) and `),z(13,`code`),J(14,`@ngrx/store`),B(),J(15,` are listed here once the app creates them. `),B())}function gF(e,t){if(e&1&&(z(0,`div`,13),P(1,pF,7,0)(2,mF,10,0)(3,hF,16,0),B()),e&2){let e=K();M(),F(e.usesSignals()?1:e.usesClassic()?2:3)}}function _F(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,28),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selectStore(t.id))}),z(2,`span`,29),V(3,`span`,30),z(4,`span`,31),J(5),B()(),z(6,`span`,32),J(7),B()()()}if(e&2){let e=t.$implicit,n=K(2);M(),q(`selected`,e.id===n.store()?.id),N(`aria-pressed`,e.id===n.store()?.id),M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.label),M(2),X_(` `,n.kindLabel(e.kind),` · `,e.scope,` · `,n.changeCount(e.id),` `,n.changeCount(e.id)===1?`change`:`changes`,` `)}}function vF(e,t){e&1&&(z(0,`li`,26),J(1,`No stores match this filter.`),B())}function yF(e,t){if(e&1&&(z(0,`span`,36),J(1),B()),e&2){let e=t;R(`title`,e),M(),Y(e)}}function bF(e,t){if(e&1&&(z(0,`span`,35),J(1),B()),e&2){let e=K();M(),Y(e.classic.devtools?`Store DevTools on`:`Store DevTools off`)}}function xF(e,t){if(e&1&&(z(0,`code`),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function SF(e,t){if(e&1&&(z(0,`p`,37),J(1,` Referenced by `),I(2,xF,3,2,null,null,wg),B()),e&2){let e=K();M(2),L(e.signal.references)}}function CF(e,t){if(e&1&&(z(0,`p`,52),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function wF(e,t){if(e&1){let e=W();z(0,`div`,38)(1,`p`)(2,`strong`),J(3,`Viewing a past state.`),B(),J(4,` New actions are logged but do not change the state until you go back to the latest state. `),B(),z(5,`button`,51,1),G(`click`,function(){return k(e),A(K(3).backToLatest())}),J(7,` Back to latest `),B(),P(8,CF,2,1,`p`,52),B()}if(e&2){let e=K(3);M(5),R(`disabled`,e.busy()||!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-latest-off`),M(3),F(e.canRestore()?-1:8)}}function TF(e,t){if(e&1&&(z(0,`dt`),J(1),B(),z(2,`dd`)(3,`code`,58),J(4),B()()),e&2){let e=t.$implicit;M(),Y(e.key),M(2),R(`title`,e.full),M(),Y(e.value)}}function EF(e,t){if(e&1&&(z(0,`dl`,54),I(1,TF,5,3,null,null,iF),B()),e&2){let e=K(4);M(),L(e.computedEntries())}}function DF(e,t){e&1&&(z(0,`p`,55),J(1,`No computed signals.`),B())}function OF(e,t){e&1&&(z(0,`span`,60),J(1,`rxMethod`),B())}function kF(e,t){if(e&1&&(z(0,`li`,59),J(1),P(2,OF,2,0,`span`,60),z(3,`span`,61),J(4),B()()),e&2){let e=t.$implicit;M(),X(` `,e.name,` `),M(),F(e.rx?2:-1),M(2),Z(``,e.calls,` `,e.calls===1?`call`:`calls`)}}function AF(e,t){if(e&1&&(z(0,`ul`,57),I(1,kF,5,4,`li`,59,aF),B()),e&2){let e=K();M(),L(e.methods)}}function jF(e,t){e&1&&(z(0,`p`,55),J(1,`No methods.`),B())}function MF(e,t){if(e&1&&(z(0,`section`,43)(1,`h4`,53),J(2,`Computed`),B(),P(3,EF,3,0,`dl`,54)(4,DF,2,0,`p`,55),z(5,`h4`,56),J(6,`Methods`),B(),P(7,AF,3,0,`ul`,57)(8,jF,2,0,`p`,55),B()),e&2){let e=K(3);M(3),F(e.computedEntries().length?3:4),M(4),F(t.methods.length?7:8)}}function NF(e,t){if(e&1&&(z(0,`span`,60),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function PF(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,62),G(`click`,function(){let t=k(e).$implicit;return A(K(3).selectEntry(t.seq))}),z(2,`span`,63),J(3),B(),z(4,`span`,64),J(5),B(),z(6,`span`,65),P(7,NF,2,1,`span`,60),J(8),B()()()}if(e&2){let e=t.$implicit,n=K(3);M(),q(`selected`,e.seq===n.selectedSeq()),N(`aria-pressed`,e.seq===n.selectedSeq()),M(2),X(`#`,e.seq),M(),R(`title`,e.type),M(),Y(e.type),M(2),F(e.origin?7:-1),M(),Z(` `,e.diff.length===0?`no change`:e.diff.length+(e.diff.length===1?` change`:` changes`),` · `,n.formatTime(e.timestamp))}}function FF(e,t){e&1&&J(0,` No entries match this filter. `)}function IF(e,t){e&1&&J(0,` No actions dispatched since the page connected. `)}function LF(e,t){e&1&&J(0,` No state changes yet. Method calls and patchState writes that change the state are recorded here. `)}function RF(e,t){if(e&1&&(z(0,`li`,26),P(1,FF,1,0)(2,IF,1,0)(3,LF,1,0),B()),e&2){let e=K(),t=K(2);M(),F(t.filter()?1:e.classic?2:3)}}function zF(e,t){if(e&1&&(z(0,`dt`),J(1,`Origin`),B(),z(2,`dd`),J(3),B()),e&2){let e=K(),t=K(3);M(3),Y(t.originText(e.origin))}}function BF(e,t){if(e&1&&(z(0,`dt`),J(1,`Action`),B(),z(2,`dd`)(3,`pre`,71),J(4),B()()),e&2){let e=K(),t=K(3);M(4),Y(t.prettyText(e.action))}}function VF(e,t){if(e&1&&(z(0,`dt`),J(1,`Arguments`),B(),z(2,`dd`)(3,`pre`,71),J(4),B()()),e&2){let e=K(),t=K(3);M(4),Y(t.prettyText(e.args))}}function HF(e,t){if(e&1&&(z(0,`code`,76),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.shortText(e.before))}}function UF(e,t){e&1&&(z(0,`span`,78),J(1,`→`),B(),z(2,`span`,79),J(3,`became`),B())}function WF(e,t){if(e&1&&(z(0,`code`,77),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.shortText(e.after))}}function GF(e,t){if(e&1&&(z(0,`li`)(1,`span`,73),J(2),B(),z(3,`code`,74),J(4),B(),z(5,`span`,75),P(6,HF,2,1,`code`,76),P(7,UF,4,0),P(8,WF,2,1,`code`,77),B()()),e&2){let e=t.$implicit,n=K(5);w_(`diff-row `+e.op),M(2),Y(n.opLabel(e.op)),M(2),Y(e.path),M(2),F(e.op===`add`?-1:6),M(),F(e.op===`change`?7:-1),M(),F(e.op===`remove`?-1:8)}}function KF(e,t){if(e&1&&(z(0,`ul`,68),I(1,GF,9,7,`li`,72,oF),B()),e&2){let e=K();M(),L(e.diff)}}function qF(e,t){e&1&&(z(0,`p`,55),J(1,`The state did not change.`),B())}function JF(e,t){e&1&&J(0),e&2&&X(` Store DevTools jumps the app state to the state right after action #`,K(2).seq,`. Until you go back to the latest state, new actions are logged but do not change the state. `)}function YF(e,t){if(e&1&&J(0),e&2){let e=K(2);Z(` This sets every state key of `,K().label,` back to its value right after change #`,e.seq,`. Components that read the store update at once, and a new "Restore" entry is added to the log. `)}}function XF(e,t){if(e&1){let e=W();z(0,`div`,80),G(`keydown.escape`,function(t){return k(e),A(K(4).cancelRestore(t))}),z(1,`p`,81),P(2,JF,1,1)(3,YF,1,2),B(),z(4,`div`,82)(5,`button`,51),G(`click`,function(){k(e);let t=K();return A(K(3).restore(t.seq,t.source===`store`))}),J(6,` Restore `),B(),z(7,`button`,24,2),G(`click`,function(){return k(e),A(K(4).cancelRestore())}),J(9,` Cancel `),B()()()}if(e&2){let e=K(),t=K(3);M(2),F(e.source===`store`?2:3),M(3),R(`disabled`,t.busy())}}function ZF(e,t){if(e&1){let e=W();z(0,`button`,87,3),G(`click`,function(){k(e);let t=K(2);return A(K(3).askRestore(t.seq))}),J(2,` Restore this state `),B()}if(e&2){let e=K(5);R(`disabled`,!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-writes-off`)}}function QF(e,t){if(e&1){let e=W();z(0,`button`,88),G(`click`,function(){k(e);let t=K(2);return A(K(3).dispatchAgain(t.seq))}),J(1,` Dispatch again `),B()}if(e&2){let e=K(5);R(`disabled`,e.busy()||!e.canRestore()),N(`aria-describedby`,e.canRestore()?null:`store-writes-off`)}}function $F(e,t){if(e&1&&(z(0,`p`,86),J(1),B()),e&2){let e=K(5);M(),Y(e.restoreOff)}}function eI(e,t){if(e&1&&(z(0,`div`,83),P(1,ZF,3,2,`button`,84),P(2,QF,2,2,`button`,85),B(),P(3,$F,2,1,`p`,86)),e&2){let e=K(),t=K(3);M(),F(e.restorable?1:-1),M(),F(t.canAgain(e)?2:-1),M(),F(t.canRestore()?-1:3)}}function tI(e,t){e&1&&(J(0,` Store DevTools no longer holds this action, so this state cannot be restored. It was dropped past `),z(1,`code`),J(2,`maxAge`),B(),J(3,`, or the Store DevTools history was committed, reset or imported. `))}function nI(e,t){e&1&&(J(0,` Store DevTools never recorded this action, so this state cannot be restored. An `),z(1,`code`),J(2,`actionsBlocklist`),B(),J(3,`, `),z(4,`code`),J(5,`actionsSafelist`),B(),J(6,` or `),z(7,`code`),J(8,`predicate`),B(),J(9,` option filtered it out, or recording was paused. `))}function rI(e,t){e&1&&(J(0,` Time travel for @ngrx/store needs `),z(1,`code`),J(2,`provideStoreDevtools()`),B(),J(3,`. Without it, entries cannot be restored. `))}function iI(e,t){if(e&1&&(z(0,`p`,70),P(1,tI,4,0)(2,nI,10,0)(3,rI,4,0),B()),e&2){let e=K();M(),F(e.unrestorable===`dropped`?1:e.unrestorable===`not-recorded`?2:3)}}function aI(e,t){if(e&1&&(z(0,`section`,49)(1,`h5`,66),J(2),B(),z(3,`dl`,54)(4,`dt`),J(5,`Time`),B(),z(6,`dd`),J(7),B(),P(8,zF,4,1),P(9,BF,5,1),P(10,VF,5,1),B(),z(11,`h6`,67),J(12,`State diff`),B(),P(13,KF,3,0,`ul`,68)(14,qF,2,0,`p`,55),P(15,XF,10,2,`div`,69),P(16,eI,4,3),P(17,iI,4,1,`p`,70),B()),e&2){let e=t,n=K(3);M(2),Z(`#`,e.seq,` `,e.type),M(5),Y(n.formatTime(e.timestamp)),M(),F(e.origin?8:-1),M(),F(e.action===void 0?-1:9),M(),F(e.args?.length?10:-1),M(3),F(e.diff.length?13:14),M(2),F(e.restorable&&n.confirmSeq()===e.seq?15:-1),M(),F(n.confirmSeq()!==e.seq&&(e.restorable||n.canAgain(e))?16:-1),M(),F(!e.restorable&&e.source===`store`?17:-1)}}function oI(e,t){if(e&1&&V(0,`option`,93),e&2){let e=t.$implicit;R(`value`,e)}}function sI(e,t){if(e&1&&(z(0,`p`,98),J(1),B()),e&2){let e=K(4);M(),Y(e.restoreOff)}}function cI(e,t){if(e&1){let e=W();z(0,`section`,50)(1,`h4`,89),J(2,`Dispatch an action`),B(),z(3,`form`,90),G(`submit`,function(t){return k(e),A(K(3).dispatchAction(t))}),z(4,`label`)(5,`span`),J(6,`Type`),B(),z(7,`input`,91),G(`input`,function(t){return k(e),A(K(3).dispatchType.set(t.target.value))}),B()(),z(8,`datalist`,92),I(9,oI,1,1,`option`,93,wg),B(),z(11,`label`)(12,`span`),J(13,`Payload `),z(14,`span`,94),J(15,`(JSON object, optional)`),B()(),z(16,`textarea`,95),G(`input`,function(t){return k(e),A(K(3).dispatchPayload.set(t.target.value))}),B()(),z(17,`p`,96),J(18),B(),z(19,`div`,82)(20,`button`,97),J(21,` Dispatch `),B()(),P(22,sI,2,1,`p`,98),B()()}if(e&2){let e=K(3);M(7),R(`value`,e.dispatchType()),M(2),L(e.actionTypes()),M(7),R(`value`,e.dispatchPayload()),N(`aria-invalid`,e.payloadError()?`true`:null),M(2),Y(e.payloadError()),M(2),R(`disabled`,e.busy()||!e.canRestore()||!e.dispatchRequest()),N(`aria-describedby`,e.canRestore()?null:`store-dispatch-off`),M(2),F(e.canRestore()?-1:22)}}function lI(e,t){if(e&1&&(z(0,`div`,27)(1,`div`,33)(2,`h3`),J(3),B(),z(4,`div`,34)(5,`span`,35),J(6),B(),z(7,`span`,35),J(8),B(),P(9,yF,2,2,`span`,36),P(10,bF,2,1,`span`,35),B(),P(11,SF,4,0,`p`,37),B(),P(12,wF,9,3,`div`,38),z(13,`div`,39)(14,`section`,40)(15,`h4`,41),J(16,`State`),B(),z(17,`pre`,42,0),J(19),B()(),P(20,MF,9,2,`section`,43),B(),z(21,`section`,44)(22,`h4`,45),J(23),z(24,`span`,11),J(25),B()(),V(26,`app-limit-note`,46),z(27,`div`,47)(28,`ul`,48),I(29,PF,9,9,`li`,null,rF,!1,RF,4,1,`li`,26),B(),P(32,aI,18,10,`section`,49),B()(),P(33,cI,23,7,`section`,50),B()),e&2){let e,n,r,i=t,a=K(2);M(3),Y(i.label),M(3),Y(a.kindLabel(i.kind)),M(2),X(`scope: `,i.scope),M(),F((e=i.signal?.declaredIn)?9:-1,e),M(),F(i.classic?10:-1),M(),F(i.signal?.references?.length?11:-1),M(),F(i.classic?.paused?12:-1),M(7),Y(a.stateText()),M(),F((n=i.signal)?20:-1,n),M(3),X(` `,i.classic?`Action log`:`Change log`,` `),M(2),Y(a.storeLog().length),M(),R(`dropped`,a.page()?.dropped??0)(`max`,a.maxLog()),M(2),N(`aria-label`,i.classic?`Actions`:`Changes`),M(),L(a.storeLog()),M(3),F((r=a.entry())?32:-1,r),M(),F(i.classic?33:-1)}}function uI(e,t){if(e&1&&(z(0,`div`,14)(1,`ul`,25),I(2,_F,8,10,`li`,null,nF,!1,vF,2,0,`li`,26),B(),P(5,lI,34,17,`div`,27),B()),e&2){let e,t=K();M(2),L(t.filteredStores()),M(3),F((e=t.store())?5:-1,e)}}function dI(e,t){if(e&1&&(z(0,`span`,11),J(1),B()),e&2){let e=K();M(),Y(e.sourceEntries().length)}}function fI(e,t){e&1&&(z(0,`div`,18),V(1,`span`,99),z(2,`p`,22),J(3,`Scanning source for NgRx declarations…`),B()())}function pI(e,t){e&1&&(z(0,`div`,19)(1,`p`,22),J(2,`No NgRx declarations found in source.`),B(),z(3,`p`,23),J(4,` The scan looks for `),z(5,`code`),J(6,`signalStore`),B(),J(7,`, `),z(8,`code`),J(9,`signalState`),B(),J(10,`, `),z(11,`code`),J(12,`signalMethod`),B(),J(13,`, `),z(14,`code`),J(15,`createAction`),B(),J(16,`, `),z(17,`code`),J(18,`createReducer`),B(),J(19,`, `),z(20,`code`),J(21,`createEffect`),B(),J(22,`, `),z(23,`code`),J(24,`createSelector`),B(),J(25,` and `),z(26,`code`),J(27,`createFeature`),B(),J(28,`. `),B()())}function mI(e,t){if(e&1){let e=W();z(0,`button`,101),G(`click`,function(){let t=k(e).$implicit,n=K(2);return A(n.kind.set(n.kind()===t.kind?null:t.kind))}),V(1,`span`,30),z(2,`span`,106),J(3),B(),z(4,`span`,102),J(5),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.kind()===e.kind),N(`aria-pressed`,n.kind()===e.kind),M(),C_(`background`,n.kindColor(e.kind)),M(2),Y(n.kindLabel(e.kind)),M(2),Y(e.count)}}function hI(e,t){if(e&1&&(z(0,`p`,111),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.detail)}}function gI(e,t){if(e&1&&(z(0,`li`,105)(1,`div`,107),V(2,`span`,30),z(3,`span`,108),J(4),B(),z(5,`span`,35),J(6),B()(),z(7,`div`,109)(8,`span`,110),J(9),B()(),P(10,hI,2,1,`p`,111),B()),e&2){let e=t.$implicit,n=K(2);M(2),C_(`background`,n.kindColor(e.kind)),M(2),Y(e.name),M(2),Y(n.kindLabel(e.kind)),M(2),R(`title`,e.file+`:`+e.line),M(),Z(``,e.file,`:`,e.line),M(),F(e.detail?10:-1)}}function _I(e,t){if(e&1){let e=W();z(0,`li`,18)(1,`p`,22),J(2,`No declarations match.`),B(),z(3,`button`,24),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(4,`Clear filters`),B()()}}function vI(e,t){if(e&1){let e=W();z(0,`div`,100)(1,`button`,101),G(`click`,function(){return k(e),A(K().kind.set(null))}),J(2,` All `),z(3,`span`,102),J(4),B()(),I(5,mI,6,7,`button`,103,sF),B(),z(7,`ul`,104),I(8,gI,11,8,`li`,105,cF,!1,_I,5,0,`li`,18),B()}if(e&2){let e=K();M(),q(`active`,!e.kind()),N(`aria-pressed`,!e.kind()),M(3),Y(e.sourceEntries().length),M(),L(e.groupedEntries()),M(3),L(e.filteredEntries())}}var yI={action:`#f59e0b`,reducer:`#a78bfa`,effect:`#fb923c`,selector:`#60a5fa`,feature:`#34d399`,"store-setup":`#94a3b8`,"signal-store":`#e879f9`,"signal-state":`#22d3ee`,"signal-method":`#fb7185`,store:`#a78bfa`},bI={"signal-store":`signalStore`,"signal-state":`signalState`,"signal-method":`signalMethod`,"store-setup":`store setup`,store:`@ngrx/store`},xI={dispatch:`store.dispatch(action)`,effect:`NgRx effect (Store.next)`,reactive:`store.dispatch(() => action)`};function SI(e){if(!e.trim())return{};let t;try{t=JSON.parse(e)}catch{return{error:`The payload is not valid JSON.`}}return!t||typeof t!=`object`||Array.isArray(t)?{error:`The payload must be a JSON object, like {"id": 7}.`}:Object.prototype.hasOwnProperty.call(t,`type`)?{error:`The payload cannot have a "type" key. Put the action type in the Type field.`}:{payload:t}}var CI=new Set([`action`,`reducer`,`effect`,`selector`,`feature`,`store-setup`]),wI=class e{rpc=$(null);canRestore=Q(()=>iE(this.rpc(),`ngrx`));restoreOff=UT(`ngrx`);filter=j(``);kind=j(null);sourceEntries=j([]);sourceLoaded=j(!1);pages=j([]);failed=j(!1);selectedPageId=j(null);hostPageId=YT();maxLog=Q(()=>rE(this.rpc()).limits.changeLog);selectedStoreId=j(null);selectedSeq=j(null);confirmSeq=j(null);busy=j(!1);focusLatest=j(!1);focusConfirm=j(null);cancelButton=Rv(`cancelButton`);restoreButton=Rv(`restoreButton`);stateTree=Rv(`stateTree`);latestButton=Rv(`latestButton`);message=j(``);destroyRef=E(Cs);unsubscribe=null;page=Q(()=>{let e=this.pages();return e.find(e=>e.pageId===this.selectedPageId())??e.find(e=>e.pageId===this.hostPageId)??e[0]??null});pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url,hint:e.url})));liveStores=Q(()=>{let e=this.page();if(!e)return[];let t=e.stores.map(e=>({id:e.id,label:e.name??e.references[0]??e.className,kind:e.kind,scope:e.scope,signal:e}));return e.classic&&t.push({id:`store`,label:`Store`,kind:`store`,scope:e.classic.scope,classic:e.classic}),t});filteredStores=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.liveStores().filter(t=>t.label.toLowerCase().includes(e)||t.kind.includes(e)||(t.signal?.stateKeys??[]).some(t=>t.toLowerCase().includes(e))||(this.page()?.log??[]).some(n=>n.storeId===t.id&&n.type.toLowerCase().includes(e))):this.liveStores()});store=Q(()=>{let e=this.liveStores();return e.find(e=>e.id===this.selectedStoreId())??e[0]??null});stateText=Q(()=>{let e=this.store();return e?XP(e.signal?e.signal.state:e.classic?.state):``});computedEntries=Q(()=>Object.entries(this.store()?.signal?.computed??{}).map(([e,t])=>({key:e,value:ZP(t,160),full:XP(t)})));storeLog=Q(()=>{let e=this.store()?.id,t=this.filter().trim().toLowerCase();return(this.page()?.log??[]).filter(n=>n.storeId===e&&(!t||n.type.toLowerCase().includes(t)||this.storeMatches(t))).reverse()});entry=Q(()=>this.storeLog().find(e=>e.seq===this.selectedSeq())??null);dispatchType=j(``);dispatchPayload=j(``);actionTypes=Q(()=>{let e=new Set;for(let t of this.sourceEntries())for(let n of t.types??[])e.add(n);for(let t of this.page()?.log??[])t.source===`store`&&t.action!==void 0&&e.add(t.type);return[...e].sort().slice(0,200)});payloadError=Q(()=>SI(this.dispatchPayload()).error??``);dispatchRequest=Q(()=>{let e=this.dispatchType().trim(),{payload:t,error:n}=SI(this.dispatchPayload());return!e||n?null:{type:`dispatch`,action:e,...t?{payload:t}:{}}});usesSignals=Q(()=>this.sourceEntries().some(e=>e.kind===`signal-store`||e.kind===`signal-state`));usesClassic=Q(()=>this.sourceEntries().some(e=>CI.has(e.kind)));filteredEntries=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind();return this.sourceEntries().filter(n=>(!t||n.kind===t)&&(!e||n.name.toLowerCase().includes(e)||n.kind.includes(e)||(n.detail??``).toLowerCase().includes(e)))});groupedEntries=Q(()=>{let e=new Map;for(let t of this.sourceEntries())e.set(t.kind,(e.get(t.kind)??0)+1);return[...e.entries()].map(([e,t])=>({kind:e,count:t}))});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),ey(()=>{let e=this.latestButton();e&&this.focusLatest()&&!this.busy()&&(this.focusLatest.set(!1),e.nativeElement.focus())}),uc(()=>{let e=this.focusConfirm(),t=e===`cancel`?this.cancelButton():this.restoreButton();e&&t&&(this.focusConfirm.set(null),t.nativeElement.focus())}),this.destroyRef.onDestroy(()=>this.unsubscribe?.())}storeMatches(e){let t=this.store();return!!t&&t.label.toLowerCase().includes(e)}async load(e){this.failed.set(!1),$T(e,`get-ngrx-store`).then(e=>this.sourceEntries.set(Array.isArray(e)?e:[])).catch(()=>this.sourceEntries.set([])).finally(()=>this.sourceLoaded.set(!0));try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`ngrx-store`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.pages.set(Array.isArray(t?.pages)?t.pages:[])};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}}retry(){let e=this.rpc();e&&this.load(e)}selectPage(e){this.selectedPageId.set(e),this.selectedStoreId.set(null),this.selectedSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectStore(e){this.selectedStoreId.set(e),this.selectedSeq.set(null),this.confirmSeq.set(null),this.message.set(``)}selectEntry(e){this.selectedSeq.set(this.selectedSeq()===e?null:e),this.confirmSeq.set(null),this.message.set(``)}askRestore(e){this.confirmSeq.set(e),this.focusConfirm.set(`cancel`)}cancelRestore(e){e?.preventDefault(),this.confirmSeq.set(null),this.focusConfirm.set(`restore`)}async restore(e,t){let n=this.page();if(!n)return;this.busy.set(!0),this.focusLatest.set(!1);let r=!1;try{let i=await $T(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:{type:`restore`,seq:e}});this.message.set(i?.error??i?.message??`Restored.`),r=t&&!i?.error&&!!i?.paused}catch{this.message.set(`Could not reach the page to restore the state.`)}finally{this.busy.set(!1),this.confirmSeq.set(null),this.focusLatest.set(r),r||this.stateTree()?.nativeElement.focus()}}async backToLatest(){let e=this.page();if(e){this.busy.set(!0);try{let t=await $T(this.rpc(),`request-ngrx-action`,{pageId:e.pageId,request:{type:`latest`}});this.focusLatest.set(!1),this.stateTree()?.nativeElement.focus(),this.message.set(t?.error??t?.message??`Back on the latest state.`)}catch{this.message.set(`Could not reach the page to go back to the latest state.`)}finally{this.busy.set(!1)}}}canAgain(e){return e.source===`store`&&e.action!==void 0}async dispatchAction(e){e.preventDefault();let t=this.dispatchRequest();t&&await this.send(t,`Could not reach the page to dispatch the action.`)}dispatchAgain(e){return this.send({type:`dispatch-again`,seq:e},`Could not reach the page to dispatch the action again.`)}async send(e,t){let n=this.page();if(n&&!this.busy()){this.busy.set(!0);try{let t=await $T(this.rpc(),`request-ngrx-action`,{pageId:n.pageId,request:e});this.message.set(t?.error??t?.message??`Dispatched.`),t?.entry&&(this.selectedStoreId.set(`store`),this.selectedSeq.set(t.entry.seq))}catch{this.message.set(t)}finally{this.busy.set(!1)}}}clearFilters(){this.filter.set(``),this.kind.set(null)}changeCount(e){return(this.page()?.log??[]).filter(t=>t.storeId===e).length}kindColor(e){return yI[e]??`var(--text-3)`}kindLabel(e){return bI[e]??e}originText(e){return xI[e]??e}opLabel(e){return e===`add`?`added`:e===`remove`?`removed`:`changed`}prettyText(e){return XP(e)}shortText(e){return ZP(e)}formatTime=uD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-store-inspector`]],viewQuery:function(e,t){e&1&&e_(t.cancelButton,QP,5)(t.restoreButton,$P,5)(t.stateTree,eF,5)(t.latestButton,tF,5),e&2&&t_(4)},inputs:{rpc:[1,`rpc`]},decls:25,vars:10,consts:[[`stateTree`,``],[`latestButton`,``],[`cancelButton`,``],[`restoreButton`,``],[1,`toolbar`],[`type`,`search`,`placeholder`,`Filter stores, changes and declarations…`,`aria-label`,`Filter stores, changes and source declarations`,3,`input`,`value`],[1,`status`],[`aria-hidden`,`true`,1,`live-dot`],[`aria-labelledby`,`ngrx-live-heading`,1,`block`],[1,`section-head`],[`id`,`ngrx-live-heading`],[1,`pill`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`live-layout`],[`role`,`status`,1,`message`],[`aria-labelledby`,`ngrx-source-heading`,1,`block`],[`id`,`ngrx-source-heading`],[`role`,`status`,1,`empty`,`compact`],[1,`empty`,`compact`],[`id`,`ngrx-page-label`,1,`visually-hidden`],[`labelledBy`,`ngrx-page-label`,1,`page-select`,3,`valueChange`,`options`,`value`],[1,`empty-title`],[1,`hint`],[`type`,`button`,1,`btn`,3,`click`],[`aria-label`,`Stores on this page`,1,`store-list`],[1,`muted`,`pad`],[1,`store-detail`],[`type`,`button`,1,`store-item`,3,`click`],[1,`store-top`],[`aria-hidden`,`true`,1,`dot`],[1,`store-name`],[1,`store-meta`],[1,`detail-head`],[1,`chips`],[1,`chip`],[1,`chip`,`mono`,3,`title`],[1,`refs`],[1,`paused`],[1,`facts`],[`aria-labelledby`,`ngrx-state-heading`,1,`fact`],[`id`,`ngrx-state-heading`],[`tabindex`,`0`,`aria-labelledby`,`ngrx-state-heading`,1,`tree`],[`aria-labelledby`,`ngrx-computed-heading`,1,`fact`],[`aria-labelledby`,`ngrx-log-heading`,1,`log`],[`id`,`ngrx-log-heading`],[`what`,`changes on this page`,`limit`,`changeLog`,3,`dropped`,`max`],[1,`log-layout`],[1,`log-list`],[`aria-labelledby`,`ngrx-entry-heading`,1,`entry`],[`aria-labelledby`,`ngrx-dispatch-heading`,1,`dispatch`],[`type`,`button`,1,`btn`,`primary`,3,`click`,`disabled`],[`id`,`store-latest-off`,1,`hint`,`small`],[`id`,`ngrx-computed-heading`],[1,`kv`],[1,`muted`],[`id`,`ngrx-methods-heading`,1,`spaced`],[`aria-labelledby`,`ngrx-methods-heading`,1,`methods`],[3,`title`],[1,`chip`,`mono`],[1,`tag`],[1,`calls`],[`type`,`button`,1,`log-item`,3,`click`],[1,`seq`],[1,`log-type`,3,`title`],[1,`log-meta`],[`id`,`ngrx-entry-heading`],[1,`sub`],[1,`diff`],[`role`,`group`,`aria-labelledby`,`ngrx-confirm-text`,1,`confirm`],[1,`hint`,`small`],[1,`code`],[3,`class`],[1,`op`],[1,`path`],[1,`values`],[1,`before`],[1,`after`],[`aria-hidden`,`true`,1,`arrow`],[1,`visually-hidden`],[`role`,`group`,`aria-labelledby`,`ngrx-confirm-text`,1,`confirm`,3,`keydown.escape`],[`id`,`ngrx-confirm-text`],[1,`actions`],[1,`entry-actions`],[`type`,`button`,1,`btn`,`restore`,3,`disabled`],[`type`,`button`,1,`btn`,3,`disabled`],[`id`,`store-writes-off`,1,`hint`,`small`],[`type`,`button`,1,`btn`,`restore`,3,`click`,`disabled`],[`type`,`button`,1,`btn`,3,`click`,`disabled`],[`id`,`ngrx-dispatch-heading`],[1,`dispatch-form`,3,`submit`],[`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`list`,`ngrx-action-types`,`placeholder`,`e.g. [Cart] Add Item`,3,`input`,`value`],[`id`,`ngrx-action-types`],[3,`value`],[1,`optional`],[`rows`,`3`,`spellcheck`,`false`,`placeholder`,`e.g. {"id": 7}`,`aria-describedby`,`ngrx-payload-error`,3,`input`,`value`],[`id`,`ngrx-payload-error`,1,`field-error`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`id`,`store-dispatch-off`,1,`hint`,`small`],[`aria-hidden`,`true`,1,`spinner`],[`role`,`group`,`aria-label`,`Filter declarations by kind`,1,`kinds`],[`type`,`button`,1,`kind-chip`,3,`click`],[1,`count`],[`type`,`button`,1,`kind-chip`,3,`active`],[1,`nodes`],[1,`node-card`],[1,`chip-text`],[1,`node-header`],[1,`node-label`],[1,`node-meta`],[1,`file`,3,`title`],[1,`detail`]],template:function(e,t){e&1&&(z(0,`div`,4)(1,`input`,5),G(`input`,function(e){return t.filter.set(e.target.value)}),B(),P(2,lF,3,2),z(3,`span`,6),V(4,`span`,7),J(5),B()(),z(6,`section`,8)(7,`div`,9)(8,`h2`,10),J(9,`Live stores`),B(),P(10,uF,2,1,`span`,11),B(),P(11,dF,7,0,`div`,12)(12,fF,5,0,`div`,13)(13,gF,4,1,`div`,13)(14,uI,6,2,`div`,14),z(15,`p`,15),J(16),B()(),z(17,`section`,16)(18,`div`,9)(19,`h2`,17),J(20,`Source declarations`),B(),P(21,dI,2,1,`span`,11),B(),P(22,fI,4,0,`div`,18)(23,pI,29,0,`div`,19)(24,vI,11,5),B()),e&2&&(M(),R(`value`,t.filter()),M(),F(t.pages().length>1?2:-1),M(),q(`on`,!!t.page()),M(2),X(` `,t.page()?`Live`:`No page connected`,` `),M(5),F(t.liveStores().length?10:-1),M(),F(t.failed()?11:t.page()?t.liveStores().length?14:13:12),M(5),Y(t.message()),M(5),F(t.sourceEntries().length?21:-1),M(),F(t.sourceLoaded()?t.sourceEntries().length===0?23:24:22))},dependencies:[pD,nD],styles:[`[_nghost-%COMP%] { display: grid; gap: 24px; min-width: 0; @@ -6415,11 +6472,91 @@ pre[_ngcontent-%COMP%] { line-height: 1.5; } -.actions[_ngcontent-%COMP%] { +.actions[_ngcontent-%COMP%], +.entry-actions[_ngcontent-%COMP%] { display: flex; + flex-wrap: wrap; gap: 8px; } +.entry-actions[_ngcontent-%COMP%] { + margin-top: 14px; +} + +.entry-actions[_ngcontent-%COMP%] .btn.restore[_ngcontent-%COMP%] { + margin-top: 0; +} + +.dispatch[_ngcontent-%COMP%] { + min-width: 0; + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--%NS%border); +} + +.dispatch-form[_ngcontent-%COMP%] { + display: grid; + gap: 10px; + max-width: 560px; +} + +.dispatch-form[_ngcontent-%COMP%] label[_ngcontent-%COMP%] { + display: grid; + gap: 6px; + color: var(--%NS%text-2); + font-size: 12px; + font-weight: 500; +} + +.optional[_ngcontent-%COMP%] { + color: var(--%NS%text-3); + font-weight: 400; +} + +.dispatch-form[_ngcontent-%COMP%] input[_ngcontent-%COMP%] { + width: 100%; + font-family: var(--%NS%font-mono); + font-size: 12.5px; +} + +textarea[_ngcontent-%COMP%] { + width: 100%; + min-width: 0; + padding: 8px 10px; + border: 1px solid var(--%NS%border-strong); + border-radius: var(--%NS%radius-sm); + background: var(--%NS%bg); + color: var(--%NS%text); + font-family: var(--%NS%font-mono); + font-size: 12px; + resize: vertical; + transition: border-color 0.15s var(--%NS%ease), box-shadow 0.15s var(--%NS%ease); +} + +textarea[_ngcontent-%COMP%]::placeholder { + color: var(--%NS%text-3); +} + +textarea[_ngcontent-%COMP%]:focus-visible { + outline: none; + border-color: var(--%NS%accent); + box-shadow: 0 0 0 3px var(--%NS%accent-soft); +} + +textarea[aria-invalid=true][_ngcontent-%COMP%] { + border-color: color-mix(in srgb, var(--%NS%danger) 60%, transparent); +} + +.field-error[_ngcontent-%COMP%] { + margin: -4px 0 0; + color: var(--%NS%danger); + font-size: 12px; +} + +.field-error[_ngcontent-%COMP%]:empty { + display: none; +} + .paused[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; @@ -6604,7 +6741,7 @@ pre[_ngcontent-%COMP%] { .kv[_ngcontent-%COMP%] { grid-template-columns: minmax(0, 1fr); } -}`]})};function nI(e){return e.split(`@`)[1]??``}var rI={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},iI={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},aI=$T;async function oI(e,t){return await aI(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function sI(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}.`:``}`}function cI(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(/`/g,``).replace(/\*\*/g,``)}var lI=[`heading`];function uI(e,t){if(e&1){let e=W();H(0,`div`,6)(1,`p`,14),J(2,`Could not explain this field. The devtools server did not answer.`),U(),H(3,`button`,10),Qg(`click`,function(){return k(e),A(K().retry())}),J(4,`Try again`),U()()}}function dI(e,t){if(e&1&&(H(0,`pre`,7),J(1),U()),e&2){let e=K();N(`aria-busy`,e.text()===null?`true`:null),M(),Y(e.text()??`Loading…`)}}function fI(e,t){if(e&1){let e=W();H(0,`div`,8)(1,`label`,15),J(2),U(),H(3,`input`,16),Qg(`input`,function(t){return k(e),A(K().draft.set(t.target.value))})(`keydown.enter`,function(){return k(e),A(K().setValue())}),U(),H(4,`button`,17),Qg(`click`,function(){return k(e),A(K().setValue())}),J(5,` Set `),U()()}if(e&2){let e=K();M(2),X(`New value for `,e.node().path),M(),Vg(`value`,e.draft()),M(),Vg(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`field-writes-off`)}}function pI(e,t){if(e&1&&(H(0,`p`,12),J(1),U()),e&2){let e=K();M(),Y(e.writesOff)}}var mI=class e{form=$.required();node=$.required();version=$(0);rpc=$(null);closed=Dv();canWrite=Q(()=>nE(this.rpc(),`forms`));writesOff=HT(`forms`);target=Q(()=>`${this.form().id}|${this.node().path}`);text=wv({source:this.target,computation:()=>null});failed=wv({source:this.target,computation:()=>!1});attempt=j(0);heading=Lv.required(`heading`);host=E(Ml);draft=wv({source:this.target,computation:()=>``});message=wv({source:this.target,computation:()=>``});constructor(){uc(()=>{let e=this.form().id,t=this.node().path;this.version(),this.attempt();let n=this.rpc();Sv(()=>this.load(n,e,t))}),$v(()=>{this.target();let e=Sv(this.heading).nativeElement;this.host.nativeElement.scrollIntoView?.({block:`nearest`}),e.focus({preventScroll:!0})})}async load(e,t,n){if(!e)return;let r=await aI(e,`forms-explain`,{kind:`field`,form:t,path:n});if(this.form().id===t&&this.node().path===n){if(r===null){this.failed.set(!0);return}this.failed.set(!1),this.text.set(cI(r))}}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async act(e){let t=await oI(this.rpc(),{action:e,formId:this.form().id,path:this.node().path});this.message.set(t.expression?`${sI(t)} ${t.expression}`:sI(t))}async setValue(){let e=await oI(this.rpc(),{action:`set-value`,formId:this.form().id,path:this.node().path,value:this.draft(),coerce:!0,mode:`user`});this.message.set(sI(e))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-field-detail`]],viewQuery:function(e,t){e&1&&e_(t.heading,lI,5),e&2&&t_()},hostAttrs:[`role`,`region`,`aria-labelledby`,`forms-field-heading`],inputs:{form:[1,`form`],node:[1,`node`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{closed:`closed`},decls:25,vars:11,consts:[[`heading`,``],[1,`head`],[1,`section-label`],[`id`,`forms-field-heading`,`tabindex`,`-1`],[1,`tag`],[`type`,`button`,1,`small`,`close`,3,`click`],[`role`,`alert`,1,`failed`],[1,`explain`],[1,`editor`],[`role`,`group`,`aria-label`,`Field actions`,1,`row`],[`type`,`button`,1,`small`,3,`click`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`field-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[1,`muted`],[`for`,`field-value`,1,`sr-only`],[`id`,`field-value`,`type`,`text`,`placeholder`,`New value, read as the current value's type`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field-input`,3,`input`,`keydown.enter`,`value`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`]],template:function(e,t){e&1&&(H(0,`div`,1)(1,`span`,2),J(2,`Field`),U(),H(3,`h3`,3,0),J(5),U(),H(6,`span`,4),J(7),U(),H(8,`button`,5),Qg(`click`,function(){return t.closed.emit()}),J(9,` Close `),U()(),P(10,uI,5,0,`div`,6)(11,dI,2,2,`pre`,7),P(12,fI,6,4,`div`,8),H(13,`div`,9)(14,`button`,10),Qg(`click`,function(){return t.act(`focus`)}),J(15,`Focus`),U(),H(16,`button`,11),Qg(`click`,function(){return t.act(`mark-touched`)}),J(17,` Touch `),U(),H(18,`button`,11),Qg(`click`,function(){return t.act(`revalidate`)}),J(19,` Revalidate `),U(),H(20,`button`,10),Qg(`click`,function(){return t.act(`store-as-global`)}),J(21,`Store as global`),U()(),P(22,pI,2,1,`p`,12),H(23,`p`,13),J(24),U()),e&2&&(M(5),Y(t.node().path||`(form)`),M(2),Y(t.node().type),M(),N(`aria-label`,`Close details for `+(t.node().path||`the form`)),M(2),F(t.failed()?10:11),M(2),F(t.node().type===`control`&&!t.node().redacted?12:-1),M(4),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(2),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(4),F(t.canWrite()?-1:22),M(2),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] { +}`]})};function TI(e){return e.split(`@`)[1]??``}var EI={signal:`Signal Forms`,reactive:`Reactive`,template:`Template-driven`},DI={own:`validator`,directive:`template attribute`,tree:`cross-field rule`,async:`async`,parse:`parse`,submission:`server`,schema:`schema`,manual:`setErrors`},OI=eE,kI={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 AI(e){return kI[e]??e}var jI=`https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/security.md#opt-fields-in-or-out`;async function MI(e,t){return await OI(e,`request-form-action`,t)??{ok:!1,error:`The devtools server did not answer.`}}function NI(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}.`:``}`}function PI(e){return(e??``).replace(/^_Labels, paths.*_\n\n/,``).replace(/`/g,``).replace(/\*\*/g,``)}var FI=[`heading`];function II(e,t){if(e&1){let e=W();H(0,`div`,6)(1,`p`,9),J(2,`Could not explain this field. The devtools server did not answer.`),U(),H(3,`button`,11),Qg(`click`,function(){return k(e),A(K().retry())}),J(4,`Try again`),U()()}}function LI(e,t){if(e&1&&(H(0,`pre`,7),J(1),U()),e&2){let e=K();N(`aria-busy`,e.text()===null?`true`:null),M(),Y(e.text()??`Loading…`)}}function RI(e,t){if(e&1){let e=W();H(0,`div`,8)(1,`label`,15),J(2),U(),H(3,`input`,16),Qg(`input`,function(t){return k(e),A(K().draft.set(t.target.value))})(`keydown.enter`,function(){return k(e),A(K().setValue())}),U(),H(4,`button`,17),Qg(`click`,function(){return k(e),A(K().setValue())}),J(5,` Set `),U()()}if(e&2){let e=K();M(2),X(`New value for `,e.node().path),M(),Vg(`value`,e.draft()),M(),Vg(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`field-writes-off`)}}function zI(e,t){if(e&1&&(H(0,`p`,9),J(1),H(2,`a`,18),J(3,`How to unmask it`),U()()),e&2){let e=K();M(),X(` No Set editor: this field is redacted (`,e.redactLabel(e.node().redacted),`). `),M(),Vg(`href`,e.unmaskDocsUrl,ku)}}function BI(e,t){if(e&1&&(H(0,`p`,13),J(1),U()),e&2){let e=K();M(),Y(e.writesOff)}}var VI=class e{form=$.required();node=$.required();version=$(0);rpc=$(null);closed=Ov();canWrite=Q(()=>iE(this.rpc(),`forms`));writesOff=UT(`forms`);redactLabel=AI;unmaskDocsUrl=jI;target=Q(()=>`${this.form().id}|${this.node().path}`);text=Tv({source:this.target,computation:()=>null});failed=Tv({source:this.target,computation:()=>!1});attempt=j(0);heading=Rv.required(`heading`);host=E(Ml);draft=Tv({source:this.target,computation:()=>``});message=Tv({source:this.target,computation:()=>``});constructor(){uc(()=>{let e=this.form().id,t=this.node().path;this.version(),this.attempt();let n=this.rpc();Cv(()=>this.load(n,e,t))}),ey(()=>{this.target();let e=Cv(this.heading).nativeElement;this.host.nativeElement.scrollIntoView?.({block:`nearest`}),e.focus({preventScroll:!0})})}async load(e,t,n){if(!e)return;let r=await OI(e,`forms-explain`,{kind:`field`,form:t,path:n});if(this.form().id===t&&this.node().path===n){if(r===null){this.failed.set(!0);return}this.failed.set(!1),this.text.set(PI(r))}}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async act(e){let t=await MI(this.rpc(),{action:e,formId:this.form().id,path:this.node().path});this.message.set(t.expression?`${NI(t)} ${t.expression}`:NI(t))}async setValue(){let e=await MI(this.rpc(),{action:`set-value`,formId:this.form().id,path:this.node().path,value:this.draft(),coerce:!0,mode:`user`});this.message.set(NI(e))}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-field-detail`]],viewQuery:function(e,t){e&1&&e_(t.heading,FI,5),e&2&&t_()},hostAttrs:[`role`,`region`,`aria-labelledby`,`forms-field-heading`],inputs:{form:[1,`form`],node:[1,`node`],version:[1,`version`],rpc:[1,`rpc`]},outputs:{closed:`closed`},decls:26,vars:11,consts:[[`heading`,``],[1,`head`],[1,`section-label`],[`id`,`forms-field-heading`,`tabindex`,`-1`],[1,`tag`],[`type`,`button`,1,`small`,`close`,3,`click`],[`role`,`alert`,1,`failed`],[1,`explain`],[1,`editor`],[1,`muted`],[`role`,`group`,`aria-label`,`Field actions`,1,`row`],[`type`,`button`,1,`small`,3,`click`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`id`,`field-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`for`,`field-value`,1,`sr-only`],[`id`,`field-value`,`type`,`text`,`placeholder`,`New value, read as the current value's type`,`autocomplete`,`off`,`spellcheck`,`false`,1,`field-input`,3,`input`,`keydown.enter`,`value`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`target`,`_blank`,`rel`,`noopener noreferrer`,3,`href`]],template:function(e,t){e&1&&(H(0,`div`,1)(1,`span`,2),J(2,`Field`),U(),H(3,`h3`,3,0),J(5),U(),H(6,`span`,4),J(7),U(),H(8,`button`,5),Qg(`click`,function(){return t.closed.emit()}),J(9,` Close `),U()(),P(10,II,5,0,`div`,6)(11,LI,2,2,`pre`,7),P(12,RI,6,4,`div`,8)(13,zI,4,2,`p`,9),H(14,`div`,10)(15,`button`,11),Qg(`click`,function(){return t.act(`focus`)}),J(16,`Focus`),U(),H(17,`button`,12),Qg(`click`,function(){return t.act(`mark-touched`)}),J(18,` Touch `),U(),H(19,`button`,12),Qg(`click`,function(){return t.act(`revalidate`)}),J(20,` Revalidate `),U(),H(21,`button`,11),Qg(`click`,function(){return t.act(`store-as-global`)}),J(22,`Store as global`),U()(),P(23,BI,2,1,`p`,13),H(24,`p`,14),J(25),U()),e&2&&(M(5),Y(t.node().path||`(form)`),M(2),Y(t.node().type),M(),N(`aria-label`,`Close details for `+(t.node().path||`the form`)),M(2),F(t.failed()?10:11),M(2),F(t.node().type===`control`&&!t.node().redacted?12:t.node().type===`control`?13:-1),M(5),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(2),Vg(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`field-writes-off`),M(4),F(t.canWrite()?-1:23),M(2),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); } @@ -6859,6 +6996,12 @@ h3[_ngcontent-%COMP%]:focus { outline: none; } +a[_ngcontent-%COMP%] { + color: var(--%NS%accent); + border-radius: 2px; +} + +a[_ngcontent-%COMP%]:focus-visible, h3[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--%NS%accent); outline-offset: 2px; @@ -6904,7 +7047,7 @@ h3[_ngcontent-%COMP%]:focus-visible { .status[_ngcontent-%COMP%]:empty { height: 0; margin: -12px 0 0; -}`]})};function hI(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,4),J(2,`Could not explain this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,2),Qg(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),U()()}}function gI(e,t){if(e&1&&(H(0,`section`,5)(1,`h3`,6),J(2,`Submit`),U(),H(3,`pre`,7),J(4),U()(),H(5,`section`,8)(6,`h3`,9),J(7,`Payload`),U(),H(8,`pre`,7),J(9),U()()),e&2){let e=K();M(3),N(`aria-busy`,e.submit()===null?`true`:null),M(),Y(e.submit()??`Loading…`),M(4),N(`aria-busy`,e.payload()===null?`true`:null),M(),Y(e.payload()??`Loading…`)}}function _I(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,3),J(2,`Could not check this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,4),Qg(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),U()()}}function vI(e,t){e&1&&(H(0,`div`,1),Fg(1,`span`,5),H(2,`p`),J(3,`Checking the form for problems…`),U()())}function yI(e,t){e&1&&(H(0,`div`,2)(1,`span`,6),fs(),H(2,`svg`,7),Fg(3,`path`,8),U()(),ps(),H(4,`p`,3),J(5,`No problems found`),U(),H(6,`p`),J(7,`For generic accessibility checks, run axe on the page.`),U()())}function bI(e,t){if(e&1&&(H(0,`span`,15),J(1,`at `),H(2,`code`),J(3),U()()),e&2){let e=K().$implicit;M(3),Y(e.path)}}function xI(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,13),J(3),U(),H(4,`code`,14),J(5),U(),P(6,bI,4,1,`span`,15),U(),H(7,`p`,16),J(8),U(),H(9,`p`,17)(10,`span`,18),J(11,`Fix`),U(),J(12),U()()),e&2){let e=t.$implicit;N(`data-severity`,e.severity),M(2),N(`data-tone`,e.severity===`info`?``:e.severity===`error`?`bad`:`warn`),M(),Y(e.severity),M(2),Y(e.rule),M(),F(e.path?6:-1),M(2),Y(e.message),M(4),X(` `,e.fix)}}function SI(e,t){if(e&1&&(H(0,`p`,9)(1,`span`,10),J(2),U(),J(3),U(),H(4,`ul`,11),I(5,xI,13,7,`li`,null,Cg),U()),e&2){let e=K();M(2),Y(e.findings().length),M(),X(` `,e.findings().length===1?`finding`:`findings`,` `),M(2),L(e.findings())}}var CI=class e{formId=$.required();version=$(0);rpc=$(null);submit=wv({source:this.formId,computation:()=>null});payload=wv({source:this.formId,computation:()=>null});failed=wv({source:this.formId,computation:()=>!1});message=j(``);attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Sv(async()=>{let[n,r]=await Promise.all([aI(t,`forms-explain`,{kind:`submit`,form:e}),aI(t,`forms-explain`,{kind:`payload`,form:e})]);if(this.formId()===e){if(n===null||r===null){this.failed.set(!0);return}this.failed.set(!1),this.submit.set(cI(n)),this.payload.set(cI(r))}})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async copyFixture(){let e=(await aI(this.rpc(),`forms-explain`,{kind:`fixture`,form:this.formId()})??``).match(/```ts\n([\s\S]*?)```/)?.[1];if(!e){this.message.set(`No test fixture is available for this form.`);return}try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`Clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-submit`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:7,vars:2,consts:[[`role`,`alert`,1,`empty-state`],[1,`fixture`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`status`],[1,`empty-title`],[`aria-labelledby`,`forms-submit-title`,1,`block`],[`id`,`forms-submit-title`,1,`section-label`],[1,`explain`],[`aria-labelledby`,`forms-payload-title`,1,`block`],[`id`,`forms-payload-title`,1,`section-label`]],template:function(e,t){e&1&&(P(0,hI,7,0,`div`,0)(1,gI,10,4),H(2,`div`,1)(3,`button`,2),Qg(`click`,function(){return t.copyFixture()}),J(4,`Copy test fixture`),U(),H(5,`span`,3),J(6),U()()),e&2&&(F(+!t.failed()),M(6),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] { +}`]})};function HI(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,4),J(2,`Could not explain this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,2),Qg(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),U()()}}function UI(e,t){if(e&1&&(H(0,`section`,5)(1,`h3`,6),J(2,`Submit`),U(),H(3,`pre`,7),J(4),U()(),H(5,`section`,8)(6,`h3`,9),J(7,`Payload`),U(),H(8,`pre`,7),J(9),U()()),e&2){let e=K();M(3),N(`aria-busy`,e.submit()===null?`true`:null),M(),Y(e.submit()??`Loading…`),M(4),N(`aria-busy`,e.payload()===null?`true`:null),M(),Y(e.payload()??`Loading…`)}}function WI(e,t){if(e&1){let e=W();H(0,`div`,0)(1,`p`,3),J(2,`Could not check this form`),U(),H(3,`p`),J(4,`The devtools server did not answer. Check that the app is running, then try again.`),U(),H(5,`button`,4),Qg(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),U()()}}function GI(e,t){e&1&&(H(0,`div`,1),Fg(1,`span`,5),H(2,`p`),J(3,`Checking the form for problems…`),U()())}function KI(e,t){e&1&&(H(0,`div`,2)(1,`span`,6),fs(),H(2,`svg`,7),Fg(3,`path`,8),U()(),ps(),H(4,`p`,3),J(5,`No problems found`),U(),H(6,`p`),J(7,`For generic accessibility checks, run axe on the page.`),U()())}function qI(e,t){if(e&1&&(H(0,`span`,15),J(1,`at `),H(2,`code`),J(3),U()()),e&2){let e=K().$implicit;M(3),Y(e.path)}}function JI(e,t){if(e&1&&(H(0,`li`)(1,`div`,12)(2,`span`,13),J(3),U(),H(4,`code`,14),J(5),U(),P(6,qI,4,1,`span`,15),U(),H(7,`p`,16),J(8),U(),H(9,`p`,17)(10,`span`,18),J(11,`Fix`),U(),J(12),U()()),e&2){let e=t.$implicit;N(`data-severity`,e.severity),M(2),N(`data-tone`,e.severity===`info`?``:e.severity===`error`?`bad`:`warn`),M(),Y(e.severity),M(2),Y(e.rule),M(),F(e.path?6:-1),M(2),Y(e.message),M(4),X(` `,e.fix)}}function YI(e,t){if(e&1&&(H(0,`p`,9)(1,`span`,10),J(2),U(),J(3),U(),H(4,`ul`,11),I(5,JI,13,7,`li`,null,Cg),U()),e&2){let e=K();M(2),Y(e.findings().length),M(),X(` `,e.findings().length===1?`finding`:`findings`,` `),M(2),L(e.findings())}}var XI=class e{formId=$.required();version=$(0);rpc=$(null);submit=Tv({source:this.formId,computation:()=>null});payload=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});message=j(``);attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let[n,r]=await Promise.all([OI(t,`forms-explain`,{kind:`submit`,form:e}),OI(t,`forms-explain`,{kind:`payload`,form:e})]);if(this.formId()===e){if(n===null||r===null){this.failed.set(!0);return}this.failed.set(!1),this.submit.set(PI(n)),this.payload.set(PI(r))}})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}async copyFixture(){let e=(await OI(this.rpc(),`forms-explain`,{kind:`fixture`,form:this.formId()})??``).match(/```ts\n([\s\S]*?)```/)?.[1];if(!e){this.message.set(`No test fixture is available for this form.`);return}try{await navigator.clipboard.writeText(e),this.message.set(`Copied.`)}catch{this.message.set(`Clipboard is not available here.`)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-submit`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:7,vars:2,consts:[[`role`,`alert`,1,`empty-state`],[1,`fixture`],[`type`,`button`,1,`small`,3,`click`],[`role`,`status`,1,`status`],[1,`empty-title`],[`aria-labelledby`,`forms-submit-title`,1,`block`],[`id`,`forms-submit-title`,1,`section-label`],[1,`explain`],[`aria-labelledby`,`forms-payload-title`,1,`block`],[`id`,`forms-payload-title`,1,`section-label`]],template:function(e,t){e&1&&(P(0,HI,7,0,`div`,0)(1,UI,10,4),H(2,`div`,1)(3,`button`,2),Qg(`click`,function(){return t.copyFixture()}),J(4,`Copy test fixture`),U(),H(5,`span`,3),J(6),U()()),e&2&&(F(+!t.failed()),M(6),Y(t.message()))},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); } @@ -7141,7 +7284,7 @@ code[_ngcontent-%COMP%] { flex-wrap: wrap; gap: 8px 12px; align-items: center; -}`]})},wI=class e{formId=$.required();version=$(0);rpc=$(null);findings=wv({source:this.formId,computation:()=>null});failed=wv({source:this.formId,computation:()=>!1});attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Sv(async()=>{let n=await aI(t,`forms-lint`,{form:e});this.formId()===e&&(this.failed.set(n===null),n&&this.findings.set(n))})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-lint`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty-state`],[`role`,`status`,1,`empty-state`],[1,`empty-state`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-hidden`,`true`,1,`ok-icon`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`],[1,`summary`],[1,`tabular`],[1,`findings`],[1,`meta`],[1,`tag`,`severity`],[1,`rule`],[1,`muted`,`path`],[1,`message`],[1,`fix`],[1,`fix-label`]],template:function(e,t){e&1&&P(0,_I,7,0,`div`,0)(1,vI,4,0,`div`,1)(2,yI,8,0,`div`,2)(3,SI,7,2),e&2&&F(t.failed()?0:t.findings()===null?1:t.findings().length?3:2)},styles:[`.muted[_ngcontent-%COMP%] { +}`]})},ZI=class e{formId=$.required();version=$(0);rpc=$(null);findings=Tv({source:this.formId,computation:()=>null});failed=Tv({source:this.formId,computation:()=>!1});attempt=j(0);constructor(){uc(()=>{let e=this.formId();this.version(),this.attempt();let t=this.rpc();t&&Cv(async()=>{let n=await OI(t,`forms-lint`,{form:e});this.formId()===e&&(this.failed.set(n===null),n&&this.findings.set(n))})})}retry(){this.failed.set(!1),this.attempt.update(e=>e+1)}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-lint`]],inputs:{formId:[1,`formId`],version:[1,`version`],rpc:[1,`rpc`]},decls:4,vars:1,consts:[[`role`,`alert`,1,`empty-state`],[`role`,`status`,1,`empty-state`],[1,`empty-state`],[1,`empty-title`],[`type`,`button`,1,`small`,3,`click`],[`aria-hidden`,`true`,1,`spinner`],[`aria-hidden`,`true`,1,`ok-icon`],[`width`,`16`,`height`,`16`,`viewBox`,`0 0 24 24`,`fill`,`none`,`stroke`,`currentColor`,`stroke-width`,`2.5`,`stroke-linecap`,`round`,`stroke-linejoin`,`round`],[`d`,`M20 6 9 17l-5-5`],[1,`summary`],[1,`tabular`],[1,`findings`],[1,`meta`],[1,`tag`,`severity`],[1,`rule`],[1,`muted`,`path`],[1,`message`],[1,`fix`],[1,`fix-label`]],template:function(e,t){e&1&&P(0,WI,7,0,`div`,0)(1,GI,4,0,`div`,1)(2,KI,8,0,`div`,2)(3,YI,7,2),e&2&&F(t.failed()?0:t.findings()===null?1:t.findings().length?3:2)},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); } @@ -7466,7 +7609,7 @@ code[_ngcontent-%COMP%] { font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; -}`]})},TI=()=>[],EI=(e,t)=>t.formId+`#`+t.seq;function DI(e,t){e&1&&Fg(0,`span`,5)}function OI(e,t){if(e&1){let e=W();H(0,`label`)(1,`input`,11),Qg(`change`,function(){let t=k(e).$implicit;return A(K().filter.set(t))}),U(),J(2),U()}if(e&2){let e=t.$implicit,n=K();M(),Vg(`value`,e)(`checked`,e===n.filter()),M(),X(` `,e,` `)}}function kI(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.outcome===`ran`?``:`bad`),M(),Y(e.outcome)}}function AI(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;M(),X(`×`,e.count)}}function jI(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function MI(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.ms>1e3?`warn`:``),M(),X(`pending `,e.ms,`ms`)}}function NI(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.renders>20?`warn`:``),M(),Z(``,e.renders,` renders: `,(e.rendered??av(3,TI)).join(`, `))}}function PI(e,t){if(e&1&&(H(0,`span`,19),J(1),U(),H(2,`span`,20),J(3,`→`),U(),H(4,`span`,8),J(5,`changed to`),U()),e&2){let e=K(2).$implicit;M(),Y(e.prev)}}function FI(e,t){if(e&1&&(H(0,`div`,17),P(1,PI,6,1),J(2),U()),e&2){let e=K().$implicit;M(),F(e.prev===void 0?-1:1),M(),X(` `,e.detail,` `)}}function II(e,t){if(e&1&&(H(0,`span`,18),J(1),U()),e&2){let e=K().$implicit;M(),X(`from `,e.caller)}}function LI(e,t){if(e&1&&(H(0,`li`)(1,`time`),J(2),U(),H(3,`div`,12)(4,`div`,13)(5,`code`,14),J(6),U(),H(7,`span`,15),J(8),U(),P(9,kI,2,2,`span`,16),P(10,AI,2,1,`span`,16),P(11,jI,2,1,`span`,16),P(12,MI,2,2,`span`,16),P(13,NI,2,4,`span`,16),U(),P(14,FI,3,2,`div`,17),P(15,II,2,1,`span`,18),U()()),e&2){let e=t.$implicit,n=K(2);N(`data-type`,e.type),M(),N(`datetime`,n.iso(e.timestamp)),M(),Y(n.time(e.timestamp)),M(4),Y(e.path||`(form)`),M(2),Y(e.type),M(),F(e.outcome?9:-1),M(),F(e.count&&e.count>1?10:-1),M(),F(e.origin?11:-1),M(),F(e.ms===void 0?-1:12),M(),F(e.renders?13:-1),M(),F(e.prev!==void 0||e.detail?14:-1),M(),F(e.caller?15:-1)}}function RI(e,t){if(e&1&&(H(0,`ol`,9),I(1,LI,16,12,`li`,null,EI),U()),e&2){let e=K();M(),L(e.shown())}}function zI(e,t){if(e&1&&(H(0,`div`,10)(1,`p`,21),J(2),U(),H(3,`p`),J(4,`Pick another source above, or interact with the form to record more.`),U()()),e&2){let e=K();M(2),X(`No changes from `,e.filter())}}function BI(e,t){e&1&&(H(0,`div`,10)(1,`p`,21),J(2,`No changes yet`),U(),H(3,`p`),J(4,`Type into the form to see them here.`),U()())}var VI=[`all`,`user`,`code`,`devtools`],HI=class e{events=$.required();recording=$(!1);record=Dv();origins=VI;filter=j(`all`);shown=Q(()=>{let e=this.filter();return this.events().filter(t=>e===`all`||t.origin===e).slice(-100).reverse()});iso(e){return new Date(e).toISOString()}time=rD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-timeline`]],inputs:{events:[1,`events`],recording:[1,`recording`]},outputs:{record:`record`},decls:17,vars:5,consts:[[1,`toolbar`],[1,`record`],[`type`,`checkbox`,3,`change`,`checked`],[1,`record-text`],[1,`record-title`],[`aria-hidden`,`true`,1,`rec-dot`],[1,`record-hint`],[1,`chips`],[1,`sr-only`],[1,`events`],[1,`empty-state`],[`type`,`radio`,`name`,`timeline-origin`,3,`change`,`value`,`checked`],[1,`body`],[1,`line`],[1,`path`],[1,`event-type`],[1,`tag`],[1,`detail`],[1,`caller`],[1,`prev`],[`aria-hidden`,`true`,1,`arrow`],[1,`empty-title`]],template:function(e,t){e&1&&(H(0,`div`,0)(1,`label`,1)(2,`input`,2),Qg(`change`,function(){return t.record.emit(!t.recording())}),U(),H(3,`span`,3)(4,`span`,4),P(5,DI,1,0,`span`,5),J(6,` Record details `),U(),H(7,`span`,6),J(8,`Record calling code, validator changes and renders per keystroke`),U()()(),H(9,`fieldset`,7)(10,`legend`,8),J(11,`Show changes from`),U(),I(12,OI,3,3,`label`,null,wg),U()(),P(14,RI,3,0,`ol`,9)(15,zI,5,1,`div`,10)(16,BI,5,0,`div`,10)),e&2&&(M(),q(`on`,t.recording()),M(),Vg(`checked`,t.recording()),M(3),F(t.recording()?5:-1),M(7),L(t.origins),M(2),F(t.shown().length?14:t.events().length?15:16))},styles:[`.muted[_ngcontent-%COMP%] { +}`]})},QI=()=>[],$I=(e,t)=>t.formId+`#`+t.seq;function eL(e,t){e&1&&Fg(0,`span`,5)}function tL(e,t){if(e&1){let e=W();H(0,`label`)(1,`input`,11),Qg(`change`,function(){let t=k(e).$implicit;return A(K().filter.set(t))}),U(),J(2),U()}if(e&2){let e=t.$implicit,n=K();M(),Vg(`value`,e)(`checked`,e===n.filter()),M(),X(` `,e,` `)}}function nL(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.outcome===`ran`?``:`bad`),M(),Y(e.outcome)}}function rL(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;M(),X(`×`,e.count)}}function iL(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;M(),Y(e.origin)}}function aL(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.ms>1e3?`warn`:``),M(),X(`pending `,e.ms,`ms`)}}function oL(e,t){if(e&1&&(H(0,`span`,16),J(1),U()),e&2){let e=K().$implicit;N(`data-tone`,e.renders>20?`warn`:``),M(),Z(``,e.renders,` renders: `,(e.rendered??ov(3,QI)).join(`, `))}}function sL(e,t){if(e&1&&(H(0,`span`,19),J(1),U(),H(2,`span`,20),J(3,`→`),U(),H(4,`span`,8),J(5,`changed to`),U()),e&2){let e=K(2).$implicit;M(),Y(e.prev)}}function cL(e,t){if(e&1&&(H(0,`div`,17),P(1,sL,6,1),J(2),U()),e&2){let e=K().$implicit;M(),F(e.prev===void 0?-1:1),M(),X(` `,e.detail,` `)}}function lL(e,t){if(e&1&&(H(0,`span`,18),J(1),U()),e&2){let e=K().$implicit;M(),X(`from `,e.caller)}}function uL(e,t){if(e&1&&(H(0,`li`)(1,`time`),J(2),U(),H(3,`div`,12)(4,`div`,13)(5,`code`,14),J(6),U(),H(7,`span`,15),J(8),U(),P(9,nL,2,2,`span`,16),P(10,rL,2,1,`span`,16),P(11,iL,2,1,`span`,16),P(12,aL,2,2,`span`,16),P(13,oL,2,4,`span`,16),U(),P(14,cL,3,2,`div`,17),P(15,lL,2,1,`span`,18),U()()),e&2){let e=t.$implicit,n=K(2);N(`data-type`,e.type),M(),N(`datetime`,n.iso(e.timestamp)),M(),Y(n.time(e.timestamp)),M(4),Y(e.path||`(form)`),M(2),Y(e.type),M(),F(e.outcome?9:-1),M(),F(e.count&&e.count>1?10:-1),M(),F(e.origin?11:-1),M(),F(e.ms===void 0?-1:12),M(),F(e.renders?13:-1),M(),F(e.prev!==void 0||e.detail?14:-1),M(),F(e.caller?15:-1)}}function dL(e,t){if(e&1&&(H(0,`ol`,9),I(1,uL,16,12,`li`,null,$I),U()),e&2){let e=K();M(),L(e.shown())}}function fL(e,t){if(e&1&&(H(0,`div`,10)(1,`p`,21),J(2),U(),H(3,`p`),J(4,`Pick another source above, or interact with the form to record more.`),U()()),e&2){let e=K();M(2),X(`No changes from `,e.filter())}}function pL(e,t){e&1&&(H(0,`div`,10)(1,`p`,21),J(2,`No changes yet`),U(),H(3,`p`),J(4,`Type into the form to see them here.`),U()())}var mL=[`all`,`user`,`code`,`devtools`],hL=class e{events=$.required();recording=$(!1);record=Ov();origins=mL;filter=j(`all`);shown=Q(()=>{let e=this.filter();return this.events().filter(t=>e===`all`||t.origin===e).slice(-100).reverse()});iso(e){return new Date(e).toISOString()}time=uD;static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-timeline`]],inputs:{events:[1,`events`],recording:[1,`recording`]},outputs:{record:`record`},decls:17,vars:5,consts:[[1,`toolbar`],[1,`record`],[`type`,`checkbox`,3,`change`,`checked`],[1,`record-text`],[1,`record-title`],[`aria-hidden`,`true`,1,`rec-dot`],[1,`record-hint`],[1,`chips`],[1,`sr-only`],[1,`events`],[1,`empty-state`],[`type`,`radio`,`name`,`timeline-origin`,3,`change`,`value`,`checked`],[1,`body`],[1,`line`],[1,`path`],[1,`event-type`],[1,`tag`],[1,`detail`],[1,`caller`],[1,`prev`],[`aria-hidden`,`true`,1,`arrow`],[1,`empty-title`]],template:function(e,t){e&1&&(H(0,`div`,0)(1,`label`,1)(2,`input`,2),Qg(`change`,function(){return t.record.emit(!t.recording())}),U(),H(3,`span`,3)(4,`span`,4),P(5,eL,1,0,`span`,5),J(6,` Record details `),U(),H(7,`span`,6),J(8,`Record calling code, validator changes and renders per keystroke`),U()()(),H(9,`fieldset`,7)(10,`legend`,8),J(11,`Show changes from`),U(),I(12,tL,3,3,`label`,null,wg),U()(),P(14,dL,3,0,`ol`,9)(15,fL,5,1,`div`,10)(16,pL,5,0,`div`,10)),e&2&&(M(),q(`on`,t.recording()),M(),Vg(`checked`,t.recording()),M(3),F(t.recording()?5:-1),M(7),L(t.origins),M(2),F(t.shown().length?14:t.events().length?15:16))},styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); } @@ -7936,7 +8079,7 @@ time[_ngcontent-%COMP%] { justify-content: center; padding: 0 8px; } -}`]})},UI=()=>[],WI=(e,t)=>t.id,GI=(e,t)=>t.node.path;function KI(e,t){e&1&&(z(0,`div`,0),V(1,`span`,4),z(2,`p`),J(3,`Connecting to the devtools server…`),B()())}function qI(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,5),J(2,`Could not load forms`),B(),z(3,`p`,6),J(4,` The devtools server did not answer. Check that the app is running, then try again. `),B(),z(5,`button`,7),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),B()()}}function JI(e,t){e&1&&(z(0,`div`,0),V(1,`span`,4),z(2,`p`),J(3,`Loading forms…`),B()())}function YI(e,t){e&1&&(z(0,`div`,2)(1,`p`,5),J(2,`No forms on the page yet`),B(),z(3,`p`,6),J(4,` Open a page that renders a form. Signal Forms, reactive and template-driven forms all show up here, in development builds. `),B()())}function XI(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`,5),J(2,`No forms on this page`),B(),z(3,`p`,6),J(4),B(),z(5,`button`,7),G(`click`,function(){return k(e),A(K().allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}if(e&2){let e=K();M(4),Z(` Other connected tabs report `,e.forms().length,` `,e.forms().length===1?`form`:`forms`,`. `)}}function ZI(e,t){if(e&1){let e=W();z(0,`label`,11)(1,`input`,15),G(`change`,function(t){return k(e),A(K(2).allPages.set(t.target.checked))}),B(),J(2,` All pages `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.allPages())}}function QI(e,t){e&1&&(z(0,`span`,22),J(1),z(2,`span`,21),J(3,` errors`),B()()),e&2&&(M(),Y(t))}function $I(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,16),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selectForm(t.id))}),V(2,`span`,17),z(3,`span`,18),J(4),B(),z(5,`span`,19),J(6),z(7,`span`,20),J(8),B(),z(9,`span`,21),J(10),B()(),P(11,QI,4,1,`span`,22),B()()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`active`,n.id===r.selected()?.id),N(`aria-current`,n.id===r.selected()?.id?`true`:null),M(),N(`data-status`,n.root.status),M(),N(`title`,n.label),M(),Y(n.label),M(2),X(``,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),X(`, `,n.root.status),M(),F((e=r.counts().get(n.id)?.errors)?11:-1,e)}}function eL(e,t){if(e&1){let e=W();z(0,`section`,13)(1,`h2`,23),J(2),B(),z(3,`p`,24),J(4,` This form is no longer on the page. It comes back here if the page renders it again. `),B(),z(5,`button`,7),G(`click`,function(){k(e);let t=K(2);return A(t.selectForm(t.visible()[0].id))}),J(6),B()()}if(e&2){let e=K(2);M(2),Y(t),M(4),X(` Show `,e.visible()[0].label,` `)}}function tL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K();M(),Y(e.submitted?`submitted`:`not submitted`)}}function nL(e,t){e&1&&(z(0,`span`),J(1,`submitting`),B())}function rL(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),J(3),z(4,`code`,45),J(5),B()()),e&2){let e=t.$implicit;M(2),Y(e.path||`(form)`),M(),X(` `,e.message,` `),M(2),Y(e.kind)}}function iL(e,t){if(e&1&&(z(0,`details`,30)(1,`summary`),J(2),B(),z(3,`ul`),I(4,rL,6,3,`li`,null,Cg),B()()),e&2){let e=K();M(2),X(`Error summary (`,e.errorSummary.length,`)`),M(2),L(e.errorSummary)}}function aL(e,t){if(e&1){let e=W();z(0,`button`,33),G(`click`,function(){return k(e),A(K(3).confirmAct(`restore`))}),J(1),B()}if(e&2){let e=K(3);q(`armed`,e.armed()===`restore`),R(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`forms-writes-off`)(`title`,`Restore `+e.snapshot()),M(),X(` `,e.armed()===`restore`?`Confirm restore`:`Restore `+e.snapshot(),` `)}}function oL(e,t){if(e&1&&(z(0,`p`,39),J(1),B()),e&2){let e=K(3);M(),Y(e.writesOff)}}function sL(e,t){if(e&1){let e=W();z(0,`button`,46),G(`click`,function(){let t=k(e).$implicit;return A(K(3).tab_.set(t.id))}),J(1),B()}if(e&2){let e=t.$implicit,n=K(3);R(`id`,`forms-tab-`+e.id),N(`aria-selected`,e.id===n.tab_())(`aria-controls`,`forms-panel-`+e.id)(`tabindex`,e.id===n.tab_()?0:-1),M(),X(` `,e.label,` `)}}function cL(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,15),G(`change`,function(){let t=k(e).$implicit;return A(K(4).toggleChip(t.id))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K(4);M(),R(`checked`,n.active().has(e.id)),M(),X(` `,e.label,` `)}}function lL(e,t){if(e&1&&(z(0,`div`,6),J(1,` typed `),z(2,`code`),J(3),uv(4,`json`),B(),J(5,`, not in the model yet `),B()),e&2){let e=K(2).$implicit;M(3),Y(fv(4,1,e.node.uncommitted))}}function uL(e,t){if(e&1&&(z(0,`div`,6),J(1,` resets to `),z(2,`code`),J(3),uv(4,`json`),B()()),e&2){let e=K(2).$implicit;M(3),Y(fv(4,1,e.node.defaultValue))}}function dL(e,t){if(e&1&&(z(0,`code`),J(1),uv(2,`json`),B(),P(3,lL,6,3,`div`,6),P(4,uL,5,3,`div`,6)),e&2){let e=K().$implicit;M(),Y(fv(2,3,e.node.value)),M(2),F(e.node.uncommitted===void 0?-1:3),M(),F(e.node.defaultValue===void 0?-1:4)}}function fL(e,t){e&1&&(z(0,`span`,6),J(1,`not created yet`),B())}function pL(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;N(`data-status`,e.node.status),M(),Y(e.node.status)}}function mL(e,t){e&1&&(z(0,`span`),J(1,`touched`),B())}function hL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.changed===!1?`dirty, unchanged`:`dirty`)}}function gL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`not validated (`,e.node.skipped,`)`)}}function _L(e,t){if(e&1&&(z(0,`span`,61),J(1),B()),e&2){let e=K().$implicit;M(),X(`stale: `,e.node.stale.join(`, `))}}function vL(e,t){e&1&&(z(0,`span`,61),J(1,`view out of sync`),B())}function yL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`redacted (`,e.node.redacted,`)`)}}function bL(e,t){e&1&&(z(0,`span`),J(1,`required`),B())}function xL(e,t){e&1&&(z(0,`span`),J(1,`readonly`),B())}function SL(e,t){e&1&&(z(0,`span`),J(1,`hidden`),B())}function CL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`updates on `,e.node.updateOn)}}function wL(e,t){e&1&&(z(0,`span`),J(1,`debouncing`),B())}function TL(e,t){e&1&&(z(0,`span`),J(1,`validators`),B())}function EL(e,t){e&1&&(z(0,`span`),J(1,`async validator`),B())}function DL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function OL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.accessor)}}function kL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`name `,e.node.name)}}function AL(e,t){if(e&1&&(z(0,`span`),J(1),uv(2,`json`),B()),e&2){let e=t.$implicit;M(),X(`metadata `,fv(2,1,e))}}function jL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),X(`disabled: `,e)}}function ML(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit;M(),X(`at `,e.params.path)}}function NL(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.sourceText(e))}}function PL(e,t){if(e&1&&(z(0,`div`),J(1),z(2,`code`,45),J(3),B(),P(4,ML,2,1,`span`,64),P(5,NL,2,1,`span`,64),B()),e&2){let e=t.$implicit,n=K().$implicit,r=K(4);M(),X(` `,r.errorText(n.node,e),` `),M(2),Y(e.kind),M(),F(e.kind===`standardSchema`&&e.params?.path?4:-1),M(),F(e.source?5:-1)}}function FL(e,t){e&1&&(z(0,`div`,63),J(1,`not shown to the user`),B())}function IL(e,t){if(e&1&&(z(0,`tr`)(1,`td`,65),J(2),B()()),e&2){let e=K().$implicit;M(),C_(`padding-left`,28+e.depth*16,`px`),M(),Z(` `,e.node.truncated,` more fields under `,e.node.path||`the form`,` not shown `)}}function LL(e,t){if(e&1){let e=W();z(0,`tr`,54),G(`mouseenter`,function(){let t=k(e).$implicit,n=K(2);return A(K(2).highlight(n.id,t.node.path))})(`mouseleave`,function(){return k(e),A(K(4).highlight(null,``))}),z(1,`th`,55)(2,`button`,56),G(`focus`,function(){let t=k(e).$implicit,n=K(2);return A(K(2).highlight(n.id,t.node.path))})(`blur`,function(){return k(e),A(K(4).highlight(null,``))})(`click`,function(){let t=k(e).$implicit;return A(K(4).toggleField(t.node.path))}),J(3),B(),z(4,`span`,57),J(5),B()(),z(6,`td`,58),P(7,dL,5,5),B(),z(8,`td`,59),P(9,fL,2,0,`span`,6)(10,pL,2,2,`span`,28),B(),z(11,`td`,60),P(12,mL,2,0,`span`),P(13,hL,2,1,`span`),P(14,gL,2,1,`span`),P(15,_L,2,1,`span`,61),P(16,vL,2,0,`span`,61),P(17,yL,2,1,`span`),P(18,bL,2,0,`span`),P(19,xL,2,0,`span`),P(20,SL,2,0,`span`),P(21,CL,2,1,`span`),P(22,wL,2,0,`span`),P(23,TL,2,0,`span`),P(24,EL,2,0,`span`),I(25,DL,2,1,`span`,null,wg),P(27,OL,2,1,`span`),P(28,kL,2,1,`span`),I(29,AL,3,3,`span`,null,Cg),I(31,jL,2,1,`span`,null,Cg),B(),z(33,`td`,62),I(34,PL,6,4,`div`,null,Cg),P(36,FL,2,0,`div`,63),B()(),P(37,IL,3,4,`tr`)}if(e&2){let e=t.$implicit,n=K(4);q(`invalid`,e.node.errors.length),M(),C_(`padding-left`,12+e.depth*16,`px`),M(),N(`aria-label`,`Show details for `+(e.node.path||`the form`))(`aria-pressed`,e.node.path===n.fieldPath())(`title`,e.node.path||`(form)`),M(),X(` `,e.node.key||`(form)`,` `),M(2),Y(e.node.type),M(2),F(e.node.type===`control`?7:-1),M(2),F(e.node.materialized===!1?9:10),M(3),F(e.node.touched?12:-1),M(),F(e.node.dirty?13:-1),M(),F(e.node.skipped?14:-1),M(),F(e.node.stale?.length?15:-1),M(),F(e.node.dom?.drift===void 0?-1:16),M(),F(e.node.redacted?17:-1),M(),F(e.node.required?18:-1),M(),F(e.node.readonly?19:-1),M(),F(e.node.hidden?20:-1),M(),F(e.node.updateOn?21:-1),M(),F(e.node.debouncing?22:-1),M(),F(e.node.validators?.sync?23:-1),M(),F(e.node.validators?.async?24:-1),M(),L(n.constraintList(e.node)),M(2),F(e.node.accessor?27:-1),M(),F(e.node.name?28:-1),M(),L(e.node.metadata??av(28,UI)),M(2),L(e.node.disabledReasons??av(29,UI)),M(3),L(e.node.errors),M(2),F(e.node.errors.length&&e.node.dom?.errorShown===!1?36:-1),M(),F(e.node.truncated?37:-1)}}function RL(e,t){e&1&&J(0),e&2&&X(` No field path matches "`,K(5).filter(),`". `)}function zL(e,t){e&1&&J(0,` No field matches the selected filters. `)}function BL(e,t){if(e&1&&(z(0,`tr`)(1,`td`,66),P(2,RL,1,1)(3,zL,1,0),B()()),e&2){let e=K(4);M(2),F(e.filter()?2:3)}}function VL(e,t){if(e&1){let e=W();z(0,`app-forms-field-detail`,67),G(`closed`,function(){return k(e),A(K(4).closeField())}),B()}if(e&2){let e=K(2),n=K(2);R(`form`,e)(`node`,t)(`version`,n.version())(`rpc`,n.rpc())}}function HL(e,t){if(e&1){let e=W();z(0,`div`,47)(1,`input`,48),G(`input`,function(t){return k(e),A(K(3).onFilter(t))}),B(),z(2,`fieldset`,49)(3,`legend`,21),J(4,`Show only fields that are`),B(),I(5,cL,3,2,`label`,null,WI),B()(),z(7,`div`,50)(8,`table`,51)(9,`thead`)(10,`tr`)(11,`th`,52),J(12,`Field`),B(),z(13,`th`,52),J(14,`Value`),B(),z(15,`th`,52),J(16,`Status`),B(),z(17,`th`,52),J(18,`State`),B(),z(19,`th`,52),J(20,`Errors`),B()()(),z(21,`tbody`),I(22,LL,38,30,null,null,GI,!1,BL,4,1,`tr`),B()()(),P(25,VL,1,4,`app-forms-field-detail`,53)}if(e&2){let e,t=K(3);M(),R(`value`,t.filter()),M(4),L(t.chips),M(17),L(t.rows()),M(3),F((e=t.selectedNode())?25:-1,e)}}function UL(e,t){if(e&1){let e=W();V(0,`app-limit-note`,68),z(1,`app-forms-timeline`,69),G(`record`,function(t){return k(e),A(K(3).setRecording(t))}),B()}if(e&2){let e=K(3);R(`dropped`,e.droppedEvents())(`max`,e.maxEvents()),M(),R(`events`,e.selectedEvents())(`recording`,e.recording())}}function WL(e,t){if(e&1&&V(0,`app-forms-submit`,44),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function GL(e,t){if(e&1&&V(0,`app-forms-lint`,44),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function KL(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`div`,25)(2,`h2`,23),J(3),B(),z(4,`p`,26),J(5),z(6,`code`),J(7),B()()(),z(8,`div`,27)(9,`span`,28),J(10),B(),z(11,`span`),J(12),B(),z(13,`span`),J(14),B(),P(15,tL,2,1,`span`),P(16,nL,2,0,`span`),z(17,`span`,29)(18,`b`),J(19),B(),J(20,` fields · `),z(21,`b`),J(22),B(),J(23,` errors`),B()(),P(24,iL,6,1,`details`,30),z(25,`div`,31)(26,`div`,32)(27,`button`,33),G(`click`,function(){return k(e),A(K(2).act(`touch-all`))}),J(28,` Touch all `),B(),z(29,`button`,33),G(`click`,function(){return k(e),A(K(2).act(`revalidate`))}),J(30,` Revalidate `),B(),z(31,`button`,7),G(`click`,function(){return k(e),A(K(2).act(`focus-first-invalid`))}),J(32,` Focus first invalid `),B(),z(33,`button`,7),G(`click`,function(){return k(e),A(K(2).pick())}),J(34,`Pick field on page`),B(),V(35,`span`,34),z(36,`button`,7),G(`click`,function(){return k(e),A(K(2).act(`snapshot`))}),J(37,`Snapshot`),B(),P(38,aL,2,6,`button`,35),V(39,`span`,36),z(40,`button`,37),G(`click`,function(){return k(e),A(K(2).confirmAct(`reset`))}),J(41),B(),z(42,`button`,38),G(`click`,function(){return k(e),A(K(2).confirmAct(`submit`))}),J(43),B()(),P(44,oL,2,1,`p`,39),z(45,`p`,40),J(46),B()(),z(47,`div`,41),G(`keydown`,function(t){return k(e),A(K(2).onKey(t))}),I(48,sL,2,5,`button`,42,WI),B(),z(50,`div`,43),P(51,HL,26,3)(52,UL,2,4)(53,WL,1,3,`app-forms-submit`,44)(54,GL,1,3,`app-forms-lint`,44),B()()}if(e&2){let e,n=t,r=K(2);M(3),Y(n.label),M(2),X(` `,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),N(`data-status`,n.root.status),M(),Y(n.root.status),M(2),Y(n.root.dirty?`dirty`:`pristine`),M(2),Y(n.root.touched?`touched`:`untouched`),M(),F(n.submitted===void 0?-1:15),M(),F(n.root.submitting?16:-1),M(3),Y(r.counts().get(n.id)?.fields),M(2),q(`has-errors`,r.counts().get(n.id)?.errors),M(),Y(r.counts().get(n.id)?.errors),M(2),F(n.errorSummary?.length?24:-1),M(3),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(2),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(9),F(r.snapshot()?38:-1),M(2),q(`armed`,r.armed()===`reset`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`reset`?`Confirm reset`:`Reset`,` `),M(),q(`armed`,r.armed()===`submit`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`submit`?`Confirm submit`:`Submit`,` `),M(),F(r.canWrite()?-1:44),M(2),Y(r.message()),M(2),L(r.tabs),M(2),R(`id`,`forms-panel-`+r.tab_()),N(`aria-labelledby`,`forms-tab-`+r.tab_()),M(),F((e=r.tab_())===`fields`?51:e===`timeline`?52:e===`submit`?53:e===`lint`?54:-1)}}function qL(e,t){if(e&1&&(z(0,`div`,3)(1,`div`,8)(2,`h2`,9),J(3,` Forms `),z(4,`span`,10),J(5),B()(),P(6,ZI,3,1,`label`,11),z(7,`ul`,12),I(8,$I,12,10,`li`,null,WI),B()(),P(10,eL,7,2,`section`,13)(11,KL,55,34,`section`,14),B()),e&2){let e,t=K();M(5),Y(t.visible().length),M(),F(t.hostPageId&&(t.allPages()||t.otherPages())?6:-1),M(2),L(t.visible()),M(2),F((e=t.missing())?10:(e=t.selected())?11:-1,e)}}var JL=[{id:`fields`,label:`Fields`},{id:`timeline`,label:`Timeline`},{id:`submit`,label:`Submit`},{id:`lint`,label:`Lint`}],YL=[{id:`invalid`,label:`Invalid`},{id:`dirty`,label:`Dirty`},{id:`touched`,label:`Touched`},{id:`disabled`,label:`Disabled`},{id:`hidden-error`,label:`Error not shown`}];function XL(e,t){switch(t){case`invalid`:return e.errors.length>0;case`dirty`:return e.dirty&&e.type===`control`;case`touched`:return e.touched&&e.type===`control`;case`disabled`:return e.status===`DISABLED`;case`hidden-error`:return e.dom?.errorShown===!1}}function ZL(e){return e.errors.length+(e.children??[]).reduce((e,t)=>e+ZL(t),0)}function QL(e){return e.children?e.children.reduce((e,t)=>e+QL(t),0):+(e.type===`control`&&e.materialized!==!1)}var $L=class e{rpc=$(null);focus=$(null);canWrite=Q(()=>nE(this.rpc(),`forms`));writesOff=HT(`forms`);focusHandled=Dv();forms=j([]);events=j([]);loading=j(!0);failed=j(!1);selectedId=j(null);selectedLabel=j(null);hostPageId=JT();allPages=j(!1);visible=Q(()=>{let e=this.forms(),t=this.hostPageId;return t&&!this.allPages()?e.filter(e=>nI(e.id)===t):e});otherPages=Q(()=>this.forms().some(e=>nI(e.id)!==this.hostPageId));instrumented=j([]);recording=Q(()=>{let e=this.selected()?.id??``;return this.instrumented().some(t=>e.endsWith(`@${t}`))});filter=j(``);tabs=JL;chips=YL;tab_=j(`fields`);active=j(new Set);fieldPath=j(null);version=j(0);message=j(``);armed=j(null);snapshot=j(null);unsubscribe=null;destroyRef=E(Cs);host=E(Ml);counts=Q(()=>new Map(this.visible().map(e=>[e.id,{fields:QL(e.root),errors:ZL(e.root)}])));selected=Q(()=>{let e=this.visible(),t=this.selectedId();if(t===null)return e[0]??null;let n=this.selectedLabel(),r=nI(t);return e.find(e=>e.id===t)??e.find(e=>e.label===n&&nI(e.id)===r)??e.find(e=>e.label===n)??null});missing=Q(()=>this.selectedId()!==null&&!this.selected()&&this.visible().length?this.selectedLabel()??this.selectedId():null);rows=Q(()=>{let e=this.selected();if(!e)return[];let t=this.filter().toLowerCase(),n=Array.from(this.active()),r=[],i=(e,a)=>{let o=r.length,s=(!t||e.path.toLowerCase().includes(t))&&n.every(t=>XL(e,t));for(let t of e.children??[])s=i(t,a+1)||s;return s&&r.splice(o,0,{node:e,depth:a}),s};return i(e.root,0),r});selectedNode=Q(()=>{let e=this.fieldPath(),t=this.selected();if(e===null||!t)return null;let n=t=>t.path===e?t:(t.children??[]).map(n).find(Boolean)??null;return n(t.root)});dropped=j({});droppedEvents=Q(()=>{let e=this.selected()?.id;return e?this.dropped()[nI(e)]??0:0});maxEvents=Q(()=>tE(this.rpc()).limits.formTimeline);selectedEvents=Q(()=>{let e=this.selected()?.id;return this.events().filter(t=>t.formId===e).slice(-200)});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.focus();e&&Sv(()=>{this.selectForm(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),this.highlight(null,``)})}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`forms`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.forms.set(t?.forms??[]),this.events.set(t?.events??[]),this.instrumented.set(t?.instrumented??[]),this.dropped.set(t?.dropped??{}),this.version.update(e=>e+1)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}async pick(){let e=this.selected();if(!e)return;this.message.set(`Click a field in the app (Esc cancels).`);let t=await oI(this.rpc(),{action:`pick`,formId:e.id}),n=t;if(!t.ok||!n.formId){this.message.set(sI(t));return}this.selectForm(n.formId),this.tab_.set(`fields`),this.fieldPath.set(n.path??``),this.message.set(`Picked ${n.path||`(form)`}.`)}async setRecording(e){let t=this.selected();if(!t)return;let n=await oI(this.rpc(),{action:`instrument`,formId:t.id,value:e});this.message.set(sI(n))}selectForm(e){this.hostPageId&&nI(e)&&nI(e)!==this.hostPageId&&this.allPages.set(!0),this.selectedId.set(e),this.selectedLabel.set(this.forms().find(t=>t.id===e)?.label??null),this.filter.set(``),this.fieldPath.set(null),this.snapshot.set(null),this.armed.set(null)}toggleField(e){this.fieldPath.update(t=>t===e?null:e)}closeField(){let e=this.host.nativeElement,t=e.querySelector(`button.field[aria-pressed="true"]`)??e.querySelector(`.table-scroll`);this.fieldPath.set(null),t?.focus()}toggleChip(e){this.active.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}async act(e,t={}){let n=this.selected();if(!n)return;this.armed.set(null);let r=await oI(this.rpc(),{action:e,formId:n.id,...t});r.snapshot&&this.snapshot.set(r.snapshot),this.message.set(sI(r))}confirmAct(e){if(this.armed()!==e){this.armed.set(e),this.message.set(`Press "Confirm ${e}" to ${e} the form in the app.`);return}this.act(e,{confirm:!0,snapshot:this.snapshot()??void 0})}onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.tab_()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.tab_.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#forms-tab-${t[r]}`)?.focus())}sourceText(e){let t=iI[e.source??``]??e.source??``;return e.from===void 0?t:`${t} on ${e.from||`the form`}`}onFilter(e){this.filter.set(e.target.value)}highlight(e,t){let n=this.rpc();n&&n.scope(`ng-devtools`).rpc.callEvent(`request-form-highlight`,e?{formId:e,path:t}:null)}kindLabel(e){return rI[e]}constraintList(e){return Object.entries(e.constraints??{}).map(([e,t])=>`${e} ${t}`)}errorText(e,t){return/^[a-z]/.test(t.message)?`${e.key||`The form`} ${t.message}`:t.message}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-inspector`]],inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{focusHandled:`focusHandled`},decls:6,vars:1,consts:[[`role`,`status`,1,`empty`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`layout`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`small`,3,`click`],[1,`sidebar`],[`id`,`forms-list-heading`,1,`list-heading`],[1,`list-count`],[1,`page-toggle`],[`aria-labelledby`,`forms-list-heading`,1,`form-list`],[`aria-labelledby`,`forms-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`forms-detail-title`,1,`detail`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`form-item`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`label`],[1,`kind`],[1,`id`],[1,`sr-only`],[1,`count`],[`id`,`forms-detail-title`],[`role`,`status`,1,`muted`],[1,`detail-head`],[1,`detail-meta`],[1,`summary`],[1,`badge`],[1,`totals`],[1,`error-summary`],[1,`action-bar`],[`role`,`group`,`aria-label`,`Form actions`,1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`divider`],[`type`,`button`,1,`small`,3,`armed`,`disabled`],[`aria-hidden`,`true`,1,`spacer`],[`type`,`button`,1,`small`,`danger`,3,`click`,`disabled`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`id`,`forms-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`role`,`tablist`,`aria-label`,`Form views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`formId`,`version`,`rpc`],[1,`kind-tag`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`filters`],[`type`,`search`,`placeholder`,`Filter fields by path`,`aria-label`,`Filter fields by path`,`autocomplete`,`off`,`spellcheck`,`false`,1,`filter`,3,`input`,`value`],[1,`chips`],[`role`,`region`,`aria-label`,`Fields`,`tabindex`,`0`,1,`table-scroll`],[1,`fields`],[`scope`,`col`],[3,`form`,`node`,`version`,`rpc`],[3,`mouseenter`,`mouseleave`],[`scope`,`row`,1,`name`],[`type`,`button`,1,`field`,3,`focus`,`blur`,`click`],[1,`type`],[1,`value`],[1,`status-cell`],[1,`flags`],[1,`warn`],[1,`errors`],[1,`unseen`],[1,`source`],[`colspan`,`5`,1,`muted`,`truncated`],[`colspan`,`5`,1,`no-match`],[3,`closed`,`form`,`node`,`version`,`rpc`],[`what`,`form events on this page`,`limit`,`formTimeline`,3,`dropped`,`max`],[3,`record`,`events`,`recording`]],template:function(e,t){e&1&&P(0,KI,4,0,`div`,0)(1,qI,7,0,`div`,1)(2,JI,4,0,`div`,0)(3,YI,5,0,`div`,2)(4,XI,7,2,`div`,2)(5,qL,12,3,`div`,3),e&2&&F(t.rpc()?t.failed()?1:t.loading()?2:t.forms().length?t.visible().length?5:4:3:0)},dependencies:[mI,HI,CI,wI,oD,ib],styles:[`.muted[_ngcontent-%COMP%] { +}`]})},gL=()=>[],_L=(e,t)=>t.id,vL=(e,t)=>t.node.path;function yL(e,t){e&1&&(z(0,`div`,0),V(1,`span`,4),z(2,`p`),J(3,`Connecting to the devtools server…`),B()())}function bL(e,t){if(e&1){let e=W();z(0,`div`,1)(1,`p`,5),J(2,`Could not load forms`),B(),z(3,`p`,6),J(4,` The devtools server did not answer. Check that the app is running, then try again. `),B(),z(5,`button`,7),G(`click`,function(){return k(e),A(K().retry())}),J(6,`Try again`),B()()}}function xL(e,t){e&1&&(z(0,`div`,0),V(1,`span`,4),z(2,`p`),J(3,`Loading forms…`),B()())}function SL(e,t){e&1&&(z(0,`div`,2)(1,`p`,5),J(2,`No forms on the page yet`),B(),z(3,`p`,6),J(4,` Open a page that renders a form. Signal Forms, reactive and template-driven forms all show up here, in development builds. `),B()())}function CL(e,t){if(e&1){let e=W();z(0,`div`,2)(1,`p`,5),J(2,`No forms on this page`),B(),z(3,`p`,6),J(4),B(),z(5,`button`,7),G(`click`,function(){return k(e),A(K().allPages.set(!0))}),J(6,` Show forms from all pages `),B()()}if(e&2){let e=K();M(4),Z(` Other connected tabs report `,e.forms().length,` `,e.forms().length===1?`form`:`forms`,`. `)}}function wL(e,t){if(e&1){let e=W();z(0,`label`,11)(1,`input`,15),G(`change`,function(t){return k(e),A(K(2).allPages.set(t.target.checked))}),B(),J(2,` All pages `),B()}if(e&2){let e=K(2);M(),R(`checked`,e.allPages())}}function TL(e,t){e&1&&(z(0,`span`,22),J(1),z(2,`span`,21),J(3,` errors`),B()()),e&2&&(M(),Y(t))}function EL(e,t){if(e&1){let e=W();z(0,`li`)(1,`button`,16),G(`click`,function(){let t=k(e).$implicit;return A(K(2).selectForm(t.id))}),V(2,`span`,17),z(3,`span`,18),J(4),B(),z(5,`span`,19),J(6),z(7,`span`,20),J(8),B(),z(9,`span`,21),J(10),B()(),P(11,TL,4,1,`span`,22),B()()}if(e&2){let e,n=t.$implicit,r=K(2);M(),q(`active`,n.id===r.selected()?.id),N(`aria-current`,n.id===r.selected()?.id?`true`:null),M(),N(`data-status`,n.root.status),M(),N(`title`,n.label),M(),Y(n.label),M(2),X(``,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),X(`, `,n.root.status),M(),F((e=r.counts().get(n.id)?.errors)?11:-1,e)}}function DL(e,t){if(e&1){let e=W();z(0,`section`,13)(1,`h2`,23),J(2),B(),z(3,`p`,24),J(4,` This form is no longer on the page. It comes back here if the page renders it again. `),B(),z(5,`button`,7),G(`click`,function(){k(e);let t=K(2);return A(t.selectForm(t.visible()[0].id))}),J(6),B()()}if(e&2){let e=K(2);M(2),Y(t),M(4),X(` Show `,e.visible()[0].label,` `)}}function OL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K();M(),Y(e.submitted?`submitted`:`not submitted`)}}function kL(e,t){e&1&&(z(0,`span`),J(1,`submitting`),B())}function AL(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),J(3),z(4,`code`,45),J(5),B()()),e&2){let e=t.$implicit;M(2),Y(e.path||`(form)`),M(),X(` `,e.message,` `),M(2),Y(e.kind)}}function jL(e,t){if(e&1&&(z(0,`details`,30)(1,`summary`),J(2),B(),z(3,`ul`),I(4,AL,6,3,`li`,null,Cg),B()()),e&2){let e=K();M(2),X(`Error summary (`,e.errorSummary.length,`)`),M(2),L(e.errorSummary)}}function ML(e,t){if(e&1){let e=W();z(0,`button`,33),G(`click`,function(){return k(e),A(K(3).confirmAct(`restore`))}),J(1),B()}if(e&2){let e=K(3);q(`armed`,e.armed()===`restore`),R(`disabled`,!e.canWrite()),N(`aria-describedby`,e.canWrite()?null:`forms-writes-off`)(`title`,`Restore `+e.snapshot()),M(),X(` `,e.armed()===`restore`?`Confirm restore`:`Restore `+e.snapshot(),` `)}}function NL(e,t){if(e&1&&(z(0,`p`,39),J(1),B()),e&2){let e=K(3);M(),Y(e.writesOff)}}function PL(e,t){if(e&1){let e=W();z(0,`button`,46),G(`click`,function(){let t=k(e).$implicit;return A(K(3).tab_.set(t.id))}),J(1),B()}if(e&2){let e=t.$implicit,n=K(3);R(`id`,`forms-tab-`+e.id),N(`aria-selected`,e.id===n.tab_())(`aria-controls`,`forms-panel-`+e.id)(`tabindex`,e.id===n.tab_()?0:-1),M(),X(` `,e.label,` `)}}function FL(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,15),G(`change`,function(){let t=k(e).$implicit;return A(K(4).toggleChip(t.id))}),B(),J(2),B()}if(e&2){let e=t.$implicit,n=K(4);M(),R(`checked`,n.active().has(e.id)),M(),X(` `,e.label,` `)}}function IL(e,t){if(e&1&&(z(0,`div`,6),J(1,` typed `),z(2,`code`),J(3),dv(4,`json`),B(),J(5,`, not in the model yet `),B()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.uncommitted))}}function LL(e,t){if(e&1&&(z(0,`div`,6),J(1,` resets to `),z(2,`code`),J(3),dv(4,`json`),B()()),e&2){let e=K(2).$implicit;M(3),Y(pv(4,1,e.node.defaultValue))}}function RL(e,t){if(e&1&&(z(0,`code`),J(1),dv(2,`json`),B(),P(3,IL,6,3,`div`,6),P(4,LL,5,3,`div`,6)),e&2){let e=K().$implicit;M(),Y(pv(2,3,e.node.value)),M(2),F(e.node.uncommitted===void 0?-1:3),M(),F(e.node.defaultValue===void 0?-1:4)}}function zL(e,t){e&1&&(z(0,`span`,6),J(1,`not created yet`),B())}function BL(e,t){if(e&1&&(z(0,`span`,28),J(1),B()),e&2){let e=K().$implicit;N(`data-status`,e.node.status),M(),Y(e.node.status)}}function VL(e,t){e&1&&(z(0,`span`),J(1,`touched`),B())}function HL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.changed===!1?`dirty, unchanged`:`dirty`)}}function UL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`not validated (`,e.node.skipped,`)`)}}function WL(e,t){if(e&1&&(z(0,`span`,61),J(1),B()),e&2){let e=K().$implicit;M(),X(`stale: `,e.node.stale.join(`, `))}}function GL(e,t){e&1&&(z(0,`span`,61),J(1,`view out of sync`),B())}function KL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit,t=K(4);M(),X(`redacted: `,t.redactLabel(e.node.redacted))}}function qL(e,t){e&1&&(z(0,`span`),J(1,`required`),B())}function JL(e,t){e&1&&(z(0,`span`),J(1,`readonly`),B())}function YL(e,t){e&1&&(z(0,`span`),J(1,`hidden`),B())}function XL(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`updates on `,e.node.updateOn)}}function ZL(e,t){e&1&&(z(0,`span`),J(1,`debouncing`),B())}function QL(e,t){e&1&&(z(0,`span`),J(1,`validators`),B())}function $L(e,t){e&1&&(z(0,`span`),J(1,`async validator`),B())}function eR(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function tR(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.node.accessor)}}function nR(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(`name `,e.node.name)}}function rR(e,t){if(e&1&&(z(0,`span`),J(1),dv(2,`json`),B()),e&2){let e=t.$implicit;M(),X(`metadata `,pv(2,1,e))}}function iR(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=t.$implicit;M(),X(`disabled: `,e)}}function aR(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit;M(),X(`at `,e.params.path)}}function oR(e,t){if(e&1&&(z(0,`span`,64),J(1),B()),e&2){let e=K().$implicit,t=K(5);M(),Y(t.sourceText(e))}}function sR(e,t){if(e&1&&(z(0,`div`),J(1),z(2,`code`,45),J(3),B(),P(4,aR,2,1,`span`,64),P(5,oR,2,1,`span`,64),B()),e&2){let e=t.$implicit,n=K().$implicit,r=K(4);M(),X(` `,r.errorText(n.node,e),` `),M(2),Y(e.kind),M(),F(e.kind===`standardSchema`&&e.params?.path?4:-1),M(),F(e.source?5:-1)}}function cR(e,t){e&1&&(z(0,`div`,63),J(1,`not shown to the user`),B())}function lR(e,t){if(e&1&&(z(0,`tr`)(1,`td`,65),J(2),B()()),e&2){let e=K().$implicit;M(),C_(`padding-left`,28+e.depth*16,`px`),M(),Z(` `,e.node.truncated,` more fields under `,e.node.path||`the form`,` not shown `)}}function uR(e,t){if(e&1){let e=W();z(0,`tr`,54),G(`mouseenter`,function(){let t=k(e).$implicit,n=K(2);return A(K(2).highlight(n.id,t.node.path))})(`mouseleave`,function(){return k(e),A(K(4).highlight(null,``))}),z(1,`th`,55)(2,`button`,56),G(`focus`,function(){let t=k(e).$implicit,n=K(2);return A(K(2).highlight(n.id,t.node.path))})(`blur`,function(){return k(e),A(K(4).highlight(null,``))})(`click`,function(){let t=k(e).$implicit;return A(K(4).toggleField(t.node.path))}),J(3),B(),z(4,`span`,57),J(5),B()(),z(6,`td`,58),P(7,RL,5,5),B(),z(8,`td`,59),P(9,zL,2,0,`span`,6)(10,BL,2,2,`span`,28),B(),z(11,`td`,60),P(12,VL,2,0,`span`),P(13,HL,2,1,`span`),P(14,UL,2,1,`span`),P(15,WL,2,1,`span`,61),P(16,GL,2,0,`span`,61),P(17,KL,2,1,`span`),P(18,qL,2,0,`span`),P(19,JL,2,0,`span`),P(20,YL,2,0,`span`),P(21,XL,2,1,`span`),P(22,ZL,2,0,`span`),P(23,QL,2,0,`span`),P(24,$L,2,0,`span`),I(25,eR,2,1,`span`,null,wg),P(27,tR,2,1,`span`),P(28,nR,2,1,`span`),I(29,rR,3,3,`span`,null,Cg),I(31,iR,2,1,`span`,null,Cg),B(),z(33,`td`,62),I(34,sR,6,4,`div`,null,Cg),P(36,cR,2,0,`div`,63),B()(),P(37,lR,3,4,`tr`)}if(e&2){let e=t.$implicit,n=K(4);q(`invalid`,e.node.errors.length),M(),C_(`padding-left`,12+e.depth*16,`px`),M(),N(`aria-label`,`Show details for `+(e.node.path||`the form`))(`aria-pressed`,e.node.path===n.fieldPath())(`title`,e.node.path||`(form)`),M(),X(` `,e.node.key||`(form)`,` `),M(2),Y(e.node.type),M(2),F(e.node.type===`control`?7:-1),M(2),F(e.node.materialized===!1?9:10),M(3),F(e.node.touched?12:-1),M(),F(e.node.dirty?13:-1),M(),F(e.node.skipped?14:-1),M(),F(e.node.stale?.length?15:-1),M(),F(e.node.dom?.drift===void 0?-1:16),M(),F(e.node.redacted?17:-1),M(),F(e.node.required?18:-1),M(),F(e.node.readonly?19:-1),M(),F(e.node.hidden?20:-1),M(),F(e.node.updateOn?21:-1),M(),F(e.node.debouncing?22:-1),M(),F(e.node.validators?.sync?23:-1),M(),F(e.node.validators?.async?24:-1),M(),L(n.constraintList(e.node)),M(2),F(e.node.accessor?27:-1),M(),F(e.node.name?28:-1),M(),L(e.node.metadata??ov(28,gL)),M(2),L(e.node.disabledReasons??ov(29,gL)),M(3),L(e.node.errors),M(2),F(e.node.errors.length&&e.node.dom?.errorShown===!1?36:-1),M(),F(e.node.truncated?37:-1)}}function dR(e,t){e&1&&J(0),e&2&&X(` No field path matches "`,K(5).filter(),`". `)}function fR(e,t){e&1&&J(0,` No field matches the selected filters. `)}function pR(e,t){if(e&1&&(z(0,`tr`)(1,`td`,66),P(2,dR,1,1)(3,fR,1,0),B()()),e&2){let e=K(4);M(2),F(e.filter()?2:3)}}function mR(e,t){if(e&1){let e=W();z(0,`app-forms-field-detail`,67),G(`closed`,function(){return k(e),A(K(4).closeField())}),B()}if(e&2){let e=K(2),n=K(2);R(`form`,e)(`node`,t)(`version`,n.version())(`rpc`,n.rpc())}}function hR(e,t){if(e&1){let e=W();z(0,`div`,47)(1,`input`,48),G(`input`,function(t){return k(e),A(K(3).onFilter(t))}),B(),z(2,`fieldset`,49)(3,`legend`,21),J(4,`Show only fields that are`),B(),I(5,FL,3,2,`label`,null,_L),B()(),z(7,`div`,50)(8,`table`,51)(9,`thead`)(10,`tr`)(11,`th`,52),J(12,`Field`),B(),z(13,`th`,52),J(14,`Value`),B(),z(15,`th`,52),J(16,`Status`),B(),z(17,`th`,52),J(18,`State`),B(),z(19,`th`,52),J(20,`Errors`),B()()(),z(21,`tbody`),I(22,uR,38,30,null,null,vL,!1,pR,4,1,`tr`),B()()(),P(25,mR,1,4,`app-forms-field-detail`,53)}if(e&2){let e,t=K(3);M(),R(`value`,t.filter()),M(4),L(t.chips),M(17),L(t.rows()),M(3),F((e=t.selectedNode())?25:-1,e)}}function gR(e,t){if(e&1){let e=W();V(0,`app-limit-note`,68),z(1,`app-forms-timeline`,69),G(`record`,function(t){return k(e),A(K(3).setRecording(t))}),B()}if(e&2){let e=K(3);R(`dropped`,e.droppedEvents())(`max`,e.maxEvents()),M(),R(`events`,e.selectedEvents())(`recording`,e.recording())}}function _R(e,t){if(e&1&&V(0,`app-forms-submit`,44),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function vR(e,t){if(e&1&&V(0,`app-forms-lint`,44),e&2){let e=K(),t=K(2);R(`formId`,e.id)(`version`,t.version())(`rpc`,t.rpc())}}function yR(e,t){if(e&1){let e=W();z(0,`section`,14)(1,`div`,25)(2,`h2`,23),J(3),B(),z(4,`p`,26),J(5),z(6,`code`),J(7),B()()(),z(8,`div`,27)(9,`span`,28),J(10),B(),z(11,`span`),J(12),B(),z(13,`span`),J(14),B(),P(15,OL,2,1,`span`),P(16,kL,2,0,`span`),z(17,`span`,29)(18,`b`),J(19),B(),J(20,` fields · `),z(21,`b`),J(22),B(),J(23,` errors`),B()(),P(24,jL,6,1,`details`,30),z(25,`div`,31)(26,`div`,32)(27,`button`,33),G(`click`,function(){return k(e),A(K(2).act(`touch-all`))}),J(28,` Touch all `),B(),z(29,`button`,33),G(`click`,function(){return k(e),A(K(2).act(`revalidate`))}),J(30,` Revalidate `),B(),z(31,`button`,7),G(`click`,function(){return k(e),A(K(2).act(`focus-first-invalid`))}),J(32,` Focus first invalid `),B(),z(33,`button`,7),G(`click`,function(){k(e);let t=K(2);return A(t.picking()?t.cancelPick():t.pick())}),J(34),B(),V(35,`span`,34),z(36,`button`,7),G(`click`,function(){return k(e),A(K(2).act(`snapshot`))}),J(37,`Snapshot`),B(),P(38,ML,2,6,`button`,35),V(39,`span`,36),z(40,`button`,37),G(`click`,function(){return k(e),A(K(2).confirmAct(`reset`))}),J(41),B(),z(42,`button`,38),G(`click`,function(){return k(e),A(K(2).confirmAct(`submit`))}),J(43),B()(),P(44,NL,2,1,`p`,39),z(45,`p`,40),J(46),B()(),z(47,`div`,41),G(`keydown`,function(t){return k(e),A(K(2).onKey(t))}),I(48,PL,2,5,`button`,42,_L),B(),z(50,`div`,43),P(51,hR,26,3)(52,gR,2,4)(53,_R,1,3,`app-forms-submit`,44)(54,vR,1,3,`app-forms-lint`,44),B()()}if(e&2){let e,n=t,r=K(2);M(3),Y(n.label),M(2),X(` `,r.kindLabel(n.kind),` · `),M(2),Y(n.id),M(2),N(`data-status`,n.root.status),M(),Y(n.root.status),M(2),Y(n.root.dirty?`dirty`:`pristine`),M(2),Y(n.root.touched?`touched`:`untouched`),M(),F(n.submitted===void 0?-1:15),M(),F(n.root.submitting?16:-1),M(3),Y(r.counts().get(n.id)?.fields),M(2),q(`has-errors`,r.counts().get(n.id)?.errors),M(),Y(r.counts().get(n.id)?.errors),M(2),F(n.errorSummary?.length?24:-1),M(3),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(2),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(4),q(`on`,r.picking()),N(`aria-pressed`,!!r.picking()),M(),X(` `,r.picking()?`Cancel picking`:`Pick field on page`,` `),M(4),F(r.snapshot()?38:-1),M(2),q(`armed`,r.armed()===`reset`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`reset`?`Confirm reset`:`Reset`,` `),M(),q(`armed`,r.armed()===`submit`),R(`disabled`,!r.canWrite()),N(`aria-describedby`,r.canWrite()?null:`forms-writes-off`),M(),X(` `,r.armed()===`submit`?`Confirm submit`:`Submit`,` `),M(),F(r.canWrite()?-1:44),M(2),Y(r.message()),M(2),L(r.tabs),M(2),R(`id`,`forms-panel-`+r.tab_()),N(`aria-labelledby`,`forms-tab-`+r.tab_()),M(),F((e=r.tab_())===`fields`?51:e===`timeline`?52:e===`submit`?53:e===`lint`?54:-1)}}function bR(e,t){if(e&1&&(z(0,`div`,3)(1,`div`,8)(2,`h2`,9),J(3,` Forms `),z(4,`span`,10),J(5),B()(),P(6,wL,3,1,`label`,11),z(7,`ul`,12),I(8,EL,12,10,`li`,null,_L),B()(),P(10,DL,7,2,`section`,13)(11,yR,55,38,`section`,14),B()),e&2){let e,t=K();M(5),Y(t.visible().length),M(),F(t.hostPageId&&(t.allPages()||t.otherPages())?6:-1),M(2),L(t.visible()),M(2),F((e=t.missing())?10:(e=t.selected())?11:-1,e)}}var xR=[{id:`fields`,label:`Fields`},{id:`timeline`,label:`Timeline`},{id:`submit`,label:`Submit`},{id:`lint`,label:`Lint`}],SR=[{id:`invalid`,label:`Invalid`},{id:`dirty`,label:`Dirty`},{id:`touched`,label:`Touched`},{id:`disabled`,label:`Disabled`},{id:`hidden-error`,label:`Error not shown`}];function CR(e,t){switch(t){case`invalid`:return e.errors.length>0;case`dirty`:return e.dirty&&e.type===`control`;case`touched`:return e.touched&&e.type===`control`;case`disabled`:return e.status===`DISABLED`;case`hidden-error`:return e.dom?.errorShown===!1}}function wR(e){return e.errors.length+(e.children??[]).reduce((e,t)=>e+wR(t),0)}function TR(e){return e.children?e.children.reduce((e,t)=>e+TR(t),0):+(e.type===`control`&&e.materialized!==!1)}var ER=class e{rpc=$(null);focus=$(null);canWrite=Q(()=>iE(this.rpc(),`forms`));redactLabel=AI;writesOff=UT(`forms`);focusHandled=Ov();forms=j([]);events=j([]);loading=j(!0);failed=j(!1);selectedId=j(null);selectedLabel=j(null);hostPageId=YT();allPages=j(!1);visible=Q(()=>{let e=this.forms(),t=this.hostPageId;return t&&!this.allPages()?e.filter(e=>TI(e.id)===t):e});otherPages=Q(()=>this.forms().some(e=>TI(e.id)!==this.hostPageId));instrumented=j([]);recording=Q(()=>{let e=this.selected()?.id??``;return this.instrumented().some(t=>e.endsWith(`@${t}`))});filter=j(``);tabs=xR;chips=SR;tab_=j(`fields`);active=j(new Set);fieldPath=j(null);version=j(0);message=j(``);armed=j(null);snapshot=j(null);picking=j(null);pickSeq=0;unsubscribe=null;destroyRef=E(Cs);host=E(Ml);counts=Q(()=>new Map(this.visible().map(e=>[e.id,{fields:TR(e.root),errors:wR(e.root)}])));selected=Q(()=>{let e=this.visible(),t=this.selectedId();if(t===null)return e[0]??null;let n=this.selectedLabel(),r=TI(t);return e.find(e=>e.id===t)??e.find(e=>e.label===n&&TI(e.id)===r)??e.find(e=>e.label===n)??null});missing=Q(()=>this.selectedId()!==null&&!this.selected()&&this.visible().length?this.selectedLabel()??this.selectedId():null);rows=Q(()=>{let e=this.selected();if(!e)return[];let t=this.filter().toLowerCase(),n=Array.from(this.active()),r=[],i=(e,a)=>{let o=r.length,s=(!t||e.path.toLowerCase().includes(t))&&n.every(t=>CR(e,t));for(let t of e.children??[])s=i(t,a+1)||s;return s&&r.splice(o,0,{node:e,depth:a}),s};return i(e.root,0),r});selectedNode=Q(()=>{let e=this.fieldPath(),t=this.selected();if(e===null||!t)return null;let n=t=>t.path===e?t:(t.children??[]).map(n).find(Boolean)??null;return n(t.root)});dropped=j({});droppedEvents=Q(()=>{let e=this.selected()?.id;return e?this.dropped()[TI(e)]??0:0});maxEvents=Q(()=>rE(this.rpc()).limits.formTimeline);selectedEvents=Q(()=>{let e=this.selected()?.id;return this.events().filter(t=>t.formId===e).slice(-200)});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),uc(()=>{let e=this.focus();e&&Cv(()=>{this.selectForm(e.id),this.focusHandled.emit()})}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),this.highlight(null,``)})}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`forms`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.forms.set(t?.forms??[]),this.events.set(t?.events??[]),this.instrumented.set(t?.instrumented??[]),this.dropped.set(t?.dropped??{}),this.version.update(e=>e+1)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}retry(){let e=this.rpc();e&&this.load(e)}async pick(){let e=this.selected();if(!e)return;let t=++this.pickSeq;this.picking.set(e.id),this.message.set(`Click a field in the app. Press Escape or Cancel picking to stop.`);let n=await MI(this.rpc(),{action:`pick`,formId:e.id});if(t!==this.pickSeq)return;this.picking.set(null);let r=n;if(!n.ok||!r.formId){this.message.set(NI(n));return}this.selectForm(r.formId),this.tab_.set(`fields`),this.fieldPath.set(r.path??``),this.message.set(`Picked ${r.path||`(form)`}.`)}cancelPick(){let e=this.picking();e&&MI(this.rpc(),{action:`cancel-pick`,formId:e})}async setRecording(e){let t=this.selected();if(!t)return;let n=await MI(this.rpc(),{action:`instrument`,formId:t.id,value:e});this.message.set(NI(n))}selectForm(e){this.hostPageId&&TI(e)&&TI(e)!==this.hostPageId&&this.allPages.set(!0),this.selectedId.set(e),this.selectedLabel.set(this.forms().find(t=>t.id===e)?.label??null),this.filter.set(``),this.fieldPath.set(null),this.snapshot.set(null),this.armed.set(null)}toggleField(e){this.fieldPath.update(t=>t===e?null:e)}closeField(){let e=this.host.nativeElement,t=e.querySelector(`button.field[aria-pressed="true"]`)??e.querySelector(`.table-scroll`);this.fieldPath.set(null),t?.focus()}toggleChip(e){this.active.update(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}async act(e,t={}){let n=this.selected();if(!n)return;this.armed.set(null);let r=await MI(this.rpc(),{action:e,formId:n.id,...t});r.snapshot&&this.snapshot.set(r.snapshot),this.message.set(NI(r))}confirmAct(e){if(this.armed()!==e){this.armed.set(e),this.message.set(`Press "Confirm ${e}" to ${e} the form in the app.`);return}this.act(e,{confirm:!0,snapshot:this.snapshot()??void 0})}onKey(e){let t=this.tabs.map(e=>e.id),n=t.indexOf(this.tab_()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.tab_.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#forms-tab-${t[r]}`)?.focus())}sourceText(e){let t=DI[e.source??``]??e.source??``;return e.from===void 0?t:`${t} on ${e.from||`the form`}`}onFilter(e){this.filter.set(e.target.value)}highlight(e,t){let n=this.rpc();n&&n.scope(`ng-devtools`).rpc.callEvent(`request-form-highlight`,e?{formId:e,path:t}:null)}kindLabel(e){return EI[e]}constraintList(e){return Object.entries(e.constraints??{}).map(([e,t])=>`${e} ${t}`)}errorText(e,t){return/^[a-z]/.test(t.message)?`${e.key||`The form`} ${t.message}`:t.message}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-forms-inspector`]],hostBindings:function(e,t){e&1&&G(`keydown.escape`,function(){return t.cancelPick()})},inputs:{rpc:[1,`rpc`],focus:[1,`focus`]},outputs:{focusHandled:`focusHandled`},decls:6,vars:1,consts:[[`role`,`status`,1,`empty`],[`role`,`alert`,1,`empty`],[1,`empty`],[1,`layout`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`type`,`button`,1,`small`,3,`click`],[1,`sidebar`],[`id`,`forms-list-heading`,1,`list-heading`],[1,`list-count`],[1,`page-toggle`],[`aria-labelledby`,`forms-list-heading`,1,`form-list`],[`aria-labelledby`,`forms-detail-title`,1,`detail`,`gone`],[`aria-labelledby`,`forms-detail-title`,1,`detail`],[`type`,`checkbox`,3,`change`,`checked`],[`type`,`button`,1,`form-item`,3,`click`],[`aria-hidden`,`true`,1,`dot`],[1,`label`],[1,`kind`],[1,`id`],[1,`sr-only`],[1,`count`],[`id`,`forms-detail-title`],[`role`,`status`,1,`muted`],[1,`detail-head`],[1,`detail-meta`],[1,`summary`],[1,`badge`],[1,`totals`],[1,`error-summary`],[1,`action-bar`],[`role`,`group`,`aria-label`,`Form actions`,1,`actions`],[`type`,`button`,1,`small`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`divider`],[`type`,`button`,1,`small`,3,`armed`,`disabled`],[`aria-hidden`,`true`,1,`spacer`],[`type`,`button`,1,`small`,`danger`,3,`click`,`disabled`],[`type`,`button`,1,`small`,`primary`,3,`click`,`disabled`],[`id`,`forms-writes-off`,1,`muted`],[`role`,`status`,1,`status`],[`role`,`tablist`,`aria-label`,`Form views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[3,`formId`,`version`,`rpc`],[1,`kind-tag`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`filters`],[`type`,`search`,`placeholder`,`Filter fields by path`,`aria-label`,`Filter fields by path`,`autocomplete`,`off`,`spellcheck`,`false`,1,`filter`,3,`input`,`value`],[1,`chips`],[`role`,`region`,`aria-label`,`Fields`,`tabindex`,`0`,1,`table-scroll`],[1,`fields`],[`scope`,`col`],[3,`form`,`node`,`version`,`rpc`],[3,`mouseenter`,`mouseleave`],[`scope`,`row`,1,`name`],[`type`,`button`,1,`field`,3,`focus`,`blur`,`click`],[1,`type`],[1,`value`],[1,`status-cell`],[1,`flags`],[1,`warn`],[1,`errors`],[1,`unseen`],[1,`source`],[`colspan`,`5`,1,`muted`,`truncated`],[`colspan`,`5`,1,`no-match`],[3,`closed`,`form`,`node`,`version`,`rpc`],[`what`,`form events on this page`,`limit`,`formTimeline`,3,`dropped`,`max`],[3,`record`,`events`,`recording`]],template:function(e,t){e&1&&P(0,yL,4,0,`div`,0)(1,bL,7,0,`div`,1)(2,xL,4,0,`div`,0)(3,SL,5,0,`div`,2)(4,CL,7,2,`div`,2)(5,bR,12,3,`div`,3),e&2&&F(t.rpc()?t.failed()?1:t.loading()?2:t.forms().length?t.visible().length?5:4:3:0)},dependencies:[VI,hL,XI,ZI,pD,ab],styles:[`.muted[_ngcontent-%COMP%] { color: var(--%NS%text-2); } @@ -8521,6 +8664,12 @@ code[_ngcontent-%COMP%] { max-width: 240px; } +.small.on[_ngcontent-%COMP%] { + background: var(--%NS%accent-soft); + border-color: var(--%NS%accent-line); + color: var(--%NS%text-strong); +} + .status[_ngcontent-%COMP%]:empty { height: 0; margin-top: -8px; @@ -8925,7 +9074,7 @@ code[_ngcontent-%COMP%] { .divider[_ngcontent-%COMP%] { display: none; } -}`]})},eR=(e,t)=>t.file+t.name,tR=(e,t)=>t.file+`:`+t.line,nR=(e,t)=>t.name;function rR(e,t){e&1&&(z(0,`p`,13),fs(),z(1,`svg`,26),V(2,`circle`,27)(3,`path`,28),B(),ps(),z(4,`span`),J(5),B()()),e&2&&(M(5),Y(t))}function iR(e,t){if(e&1&&(z(0,`p`,13),fs(),z(1,`svg`,26),V(2,`circle`,27)(3,`path`,28),B(),ps(),z(4,`span`)(5,`strong`),J(6),B(),J(7,` Pipe prototypes are patched in the inspected page to count calls and keep the last input and output. Stop recording when you are done. `),B()()),e&2){let e=K();M(6),X(`Recording on `,e.instrumentedPages().length,` page(s).`)}}function aR(e,t){e&1&&(z(0,`div`,14),V(1,`span`,29),z(2,`p`,30),J(3,`Scanning pipes…`),B()())}function oR(e,t){if(e&1){let e=W();z(0,`div`,15)(1,`p`,30),J(2,`Couldn't load pipes`),B(),z(3,`p`,31),J(4,`The devtools server did not answer. Check that it is running.`),B(),z(5,`button`,32),G(`click`,function(){return k(e),A(K().refresh())}),J(6,`Try again`),B()()}}function sR(e,t){e&1&&(z(0,`div`,16)(1,`p`,30),J(2,`No pipes found`),B(),z(3,`p`,31),J(4,` No @Pipe classes were found in the source, and no template uses a built-in pipe yet. `),B()())}function cR(e,t){e&1&&(z(0,`span`,43),J(1,`stale?`),B())}function lR(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){K();let e=iv(0);M(),X(``,e.instanceCount,` live`)}}function uR(e,t){e&1&&(z(0,`span`,45),J(1,`built-in`),B())}function dR(e,t){e&1&&(z(0,`span`,45),J(1,`NgModule`),B())}function fR(e,t){if(e&1&&(z(0,`span`,47),J(1),B()),e&2){let e=K().$implicit;M(),X(`+`,(e.usageCount??1)-1,` more`)}}function pR(e,t){if(e&1){let e=W();nv(0),z(1,`li`)(2,`button`,38),G(`click`,function(){let t=k(e).$implicit;return A(K(3).select(t))})(`mouseenter`,function(){k(e);let t=iv(0);return A(K(3).highlightPipe(t))})(`mouseleave`,function(){return k(e),A(K(3).highlight(null))})(`focus`,function(){k(e);let t=iv(0);return A(K(3).highlightPipe(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))}),z(3,`span`,39)(4,`span`,40),J(5),B(),z(6,`span`,41),J(7),B()(),z(8,`span`,42),P(9,cR,2,0,`span`,43),P(10,lR,2,1,`span`,44),P(11,uR,2,0,`span`,45),P(12,dR,2,0,`span`,45),z(13,`span`,45),J(14),B()(),z(15,`span`,46),J(16),P(17,fR,2,1,`span`,47),B()()()}if(e&2){let e=t.$implicit,n=K(3),r=rv(n.liveFor(e.name));M(2),q(`selected`,n.isSelected(e)),N(`aria-current`,n.isSelected(e)||null),M(3),Y(e.name),M(2),Y(e.className),M(2),F(r?.stale?9:-1),M(),F(r?10:-1),M(),F(e.builtin?11:-1),M(),F(e.isStandalone?-1:12),M(),q(`impure`,!e.isPure),M(),Y(e.isPure?`pure`:`impure`),M(2),Z(` `,e.file,`:`,e.line,` `),M(),F(e.builtin&&(e.usageCount??0)>1?17:-1)}}function mR(e,t){if(e&1){let e=W();z(0,`ul`,37),G(`keydown`,function(t){return k(e),A(K(2).onListKey(t))}),I(1,pR,18,16,`li`,null,eR),B()}if(e&2){let e=K(2);M(),L(e.filtered())}}function hR(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(3).filter().trim(),`” in this view. `)}function gR(e,t){e&1&&J(0,` None of the pipes fit this filter. `)}function _R(e,t){if(e&1){let e=W();z(0,`div`,35)(1,`p`,30),J(2,`No pipes match`),B(),z(3,`p`,31),P(4,hR,1,1)(5,gR,1,0),B(),z(6,`button`,32),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(7,`Clear filters`),B()()}if(e&2){let e=K(2);M(4),F(e.filter().trim()?4:5)}}function vR(e,t){e&1&&(z(0,`span`,45),J(1,`built-in`),B())}function yR(e,t){if(e&1&&(z(0,`dt`),J(1,`File`),B(),z(2,`dd`,51),J(3),B()),e&2){let e=K();M(3),Z(``,e.file,`:`,e.line)}}function bR(e,t){if(e&1&&(z(0,`li`,51),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e.file,`:`,e.line)}}function xR(e,t){if(e&1&&(z(0,`div`,50)(1,`h3`),J(2,` Used in templates `),z(3,`span`,21),J(4),B()(),z(5,`ul`,53),I(6,bR,2,2,`li`,51,tR),B()()),e&2){let e=K();M(4),Y(e.usageCount),M(2),L(e.usages)}}function SR(e,t){e&1&&(z(0,`p`,54)(1,`span`,43),J(2,`experimental`),B(),J(3,` This pure pipe got an argument whose contents changed while its reference stayed the same, so it may be showing a stale value. `),B())}function CR(e,t){if(e&1){let e=W();z(0,`button`,59),G(`click`,function(){let t=k(e);return A(K(5).highlight(t,!0))})(`mouseenter`,function(){let t=k(e);return A(K(5).highlight(t))})(`mouseleave`,function(){return k(e),A(K(5).highlight(null))})(`focus`,function(){let t=k(e);return A(K(5).highlight(t))})(`blur`,function(){return k(e),A(K(5).highlight(null))}),z(1,`span`,51),J(2),B(),z(3,`span`,60),J(4),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.name+` on the page`),M(2),Y(e.name),M(2),Y(e.count)}}function wR(e,t){if(e&1&&(z(0,`span`,58)(1,`span`,51),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=K().$implicit;M(2),Y(e.name),M(2),Y(e.count)}}function TR(e,t){if(e&1&&(z(0,`li`),P(1,CR,5,3,`button`,57)(2,wR,5,2,`span`,58),B()),e&2){let e,n=t.$implicit;M(),F((e=n.targets?.[0])?1:2,e)}}function ER(e,t){if(e&1&&(z(0,`li`,61),J(1),z(2,`span`,62),J(3),B()()),e&2){let e=t.$implicit,n=K(6);M(),Z(` `,n.describe(e.lastArgs),` → `,n.describe(e.lastResult),` `),M(2),X(``,e.callCount,`×`)}}function DR(e,t){if(e&1&&(z(0,`dt`),J(1,`Per instance`),B(),z(2,`dd`)(3,`ul`,53),I(4,ER,4,3,`li`,61,Cg),B()()),e&2){let e=K();M(4),L(e.instances)}}function OR(e,t){if(e&1&&(z(0,`dt`),J(1,`Last caller`),B(),z(2,`dd`,61),J(3),B()),e&2){let e=K();M(3),Y(e.lastCaller)}}function kR(e,t){if(e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`),J(3),B(),z(4,`dt`),J(5,`Last input`),B(),z(6,`dd`,61),J(7),B(),z(8,`dt`),J(9,`Last output`),B(),z(10,`dd`,61),J(11),B(),P(12,DR,6,0),P(13,OR,4,1)),e&2){let e=t,n=K(4);M(3),Y(e.callCount),M(4),Y(n.describe(e.lastArgs)),M(4),Y(n.describe(e.lastResult)),M(),F(e.instances?.length?12:-1),M(),F(e.lastCaller?13:-1)}}function AR(e,t){e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`,63),J(3,`None recorded yet.`),B())}function jR(e,t){e&1&&(z(0,`p`,56),J(1,`Turn on “Record calls” to see call counts and values.`),B())}function MR(e,t){if(e&1&&(P(0,SR,4,0,`p`,54),z(1,`dl`)(2,`dt`),J(3,`Instances`),B(),z(4,`dd`),J(5),B(),z(6,`dt`),J(7,`Used by`),B(),z(8,`dd`)(9,`ul`,55),I(10,TR,3,1,`li`,null,nR),B()(),P(12,kR,14,5)(13,AR,4,0),B(),P(14,jR,2,0,`p`,56)),e&2){let e,n=t,r=K(3);F(n.stale?0:-1),M(5),Y(n.instanceCount),M(5),L(n.components),M(2),F((e=n.call)?12:r.instrumenting()?13:-1,e),M(2),F(!n.call&&!r.instrumenting()?14:-1)}}function NR(e,t){e&1&&(z(0,`p`,52),J(1,` Not in use on the connected page. Open a view that uses it, or connect the app. `),B())}function PR(e,t){if(e&1&&(z(0,`header`,48)(1,`h2`,49),J(2),B(),z(3,`span`,45),J(4),B(),P(5,vR,2,0,`span`,45),B(),z(6,`div`,50)(7,`h3`),J(8,`Declaration`),B(),z(9,`dl`)(10,`dt`),J(11,`Class`),B(),z(12,`dd`,51),J(13),B(),z(14,`dt`),J(15,`Source`),B(),z(16,`dd`),J(17),B(),P(18,yR,4,2),z(19,`dt`),J(20,`Standalone`),B(),z(21,`dd`),J(22),B(),z(23,`dt`),J(24,`Pure`),B(),z(25,`dd`),J(26),B()()(),P(27,xR,8,1,`div`,50),z(28,`div`,50)(29,`h3`),J(30,`Live on the page`),B(),P(31,MR,15,4)(32,NR,2,0,`p`,52),B()),e&2){let e,n=t,r=K(2);M(2),Y(n.name),M(),q(`impure`,!n.isPure),M(),Y(n.isPure?`pure`:`impure`),M(),F(n.builtin?5:-1),M(8),Y(n.className),M(4),Y(n.builtin?`@angular/common`:`This project`),M(),F(n.builtin?-1:18),M(4),Y(n.isStandalone?`Yes`:`No, declared in an NgModule`),M(4),X(` `,n.isPure?`Yes, reruns only when an input changes`:`No, reruns on every check`,` `),M(),F(n.builtin&&n.usages?.length?27:-1),M(4),F((e=r.liveFor(n.name))?31:32,e)}}function FR(e,t){e&1&&(z(0,`h2`,64),J(1,`Pipe details`),B(),z(2,`div`,65)(3,`p`,30),J(4,`Pick a pipe`),B(),z(5,`p`,31),J(6,` See where it is declared, which components use it and what it last returned. `),B()())}function IR(e,t){if(e&1&&(z(0,`div`,17)(1,`div`,33),P(2,mR,3,0,`ul`,34)(3,_R,8,1,`div`,35),B(),z(4,`section`,36),P(5,PR,33,12)(6,FR,7,0),B()()),e&2){let e,t=K();M(2),F(t.filtered().length?2:3),M(3),F((e=t.selected())?5:6,e)}}function LR(e,t){if(e&1){let e=W();z(0,`button`,73),G(`click`,function(){let t=k(e);return A(K(3).highlight(t))})(`focus`,function(){let t=k(e);return A(K(3).highlight(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))}),J(1),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(),X(` `,e.component,` `)}}function RR(e,t){if(e&1&&(z(0,`span`,71),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function zR(e,t){e&1&&(z(0,`span`,45),J(1,`no source`),B())}function BR(e,t){e&1&&(z(0,`span`,43),J(1,`duplicate subscription`),B())}function VR(e,t){e&1&&(z(0,`span`,43),J(1,`resubscribing`),B())}function HR(e,t){if(e&1){let e=W();z(0,`li`,69),G(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.target))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,LR,2,2,`button`,70)(2,RR,2,1,`span`,71),P(3,zR,2,0,`span`,45),P(4,BR,2,0,`span`,43),P(5,VR,2,0,`span`,43),z(6,`span`,72),J(7),B()()}if(e&2){let e,n=t.$implicit;M(),F((e=n.target)?1:2,e),M(2),F(n.hasSource?-1:3),M(),F(n.duplicate?4:-1),M(),F(n.resubscribing?5:-1),M(2),Y(n.latestValue??`no value yet`)}}function UR(e,t){if(e&1&&(z(0,`section`,18)(1,`h2`,66),J(2,` Async subscriptions `),z(3,`span`,21),J(4),B()(),z(5,`p`,56),J(6,` Each `),z(7,`span`,51),J(8,`| async`),B(),J(9,` subscribes on its own. Two on the same source mean the work runs twice. A source that changes on every check, like `),z(10,`span`,51),J(11,`getData() | async`),B(),J(12,`, resubscribes each time. `),B(),z(13,`ul`,67),I(14,HR,8,5,`li`,68,Cg),B()()),e&2){let e=K();M(4),Y(e.async().length),M(10),L(e.async())}}function WR(e,t){e&1&&(z(0,`span`,21),J(1),B()),e&2&&(M(),Y(t.length))}function GR(e,t){e&1&&(z(0,`p`,22),J(1,`Couldn't run the lint check. Try Refresh.`),B())}function KR(e,t){e&1&&(z(0,`p`,23),J(1,`Checking…`),B())}function qR(e,t){e&1&&(z(0,`p`,24),J(1,`No problems found.`),B())}function JR(e,t){if(e&1&&(z(0,`li`,74)(1,`div`,75)(2,`span`,76),J(3),B(),z(4,`code`,77),J(5),B(),z(6,`span`,78),J(7),B()(),z(8,`p`,79),J(9),B(),z(10,`p`,80)(11,`span`,81),J(12,`Fix`),B(),J(13),B()()),e&2){let e=t.$implicit;M(2),N(`data-tone`,e.severity),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y_(``,e.pipe,` · `,e.file,`:`,e.line),M(2),Y(e.message),M(4),X(` `,e.fix)}}function YR(e,t){if(e&1&&(z(0,`ul`,25),I(1,JR,14,8,`li`,74,Cg),B()),e&2){let e=K();M(),L(e.lint())}}var XR=5e3,ZR=[{value:`all`,label:`All pipes`},{value:`custom`,label:`Custom`},{value:`builtin`,label:`Built-in`},{value:`impure`,label:`Impure`},{value:`live`,label:`On the page`}],QR=class e{destroyRef=E(Cs);host=E(Ml);rpc=$(null);kindOptions=ZR;pipes=j([]);filter=j(``);kind=j(`all`);loading=j(!1);loadFailed=j(!1);selected=j(null);live=j([]);async=j([]);lint=j(null);lintFailed=j(!1);instrumentedPages=j([]);instrumenting=Q(()=>this.instrumentedPages().length>0);pendingRecord=j(null);recordMessage=j(null);recordLabel=Q(()=>{let e=this.pendingRecord();return e===null?this.instrumenting()?`Stop recording`:`Record calls`:e?`Starting…`:`Stopping…`});pendingTimer;liveByName=Q(()=>new Map(this.live().map(e=>[e.name,e])));filtered=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind()??`all`,n=this.liveByName();return this.pipes().filter(r=>t===`custom`&&r.builtin||t===`builtin`&&!r.builtin||t===`impure`&&r.isPure||t===`live`&&!n.has(r.name)?!1:!e||r.name.toLowerCase().includes(e)||r.className.toLowerCase().includes(e)||r.file.toLowerCase().includes(e))});unsubscribe;constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.loadLive(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.pendingTimer),this.highlight(null)})}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.loadFailed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`get-pipes`);this.pipes.set(t);let n=this.selected();if(n){let e=t.find(e=>e.name===n.name&&e.file===n.file);this.selected.set(e??null)}}catch{this.loadFailed.set(!0)}finally{this.loading.set(!1)}this.loadLint(e)}}async loadLint(e){this.lintFailed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`pipe-lint`);this.lint.set(t)}catch{this.lintFailed.set(!0)}}async loadLive(e){try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.live.set(t?.pipes??[]),this.async.set(t?.async??[]);let n=t?.instrumented??[];this.instrumentedPages.set(n),this.pendingRecord()===n.length>0&&this.settleRecord(null)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}async toggleInstrument(){let e=this.rpc();if(!e||this.pendingRecord()!==null)return;let t=!this.instrumenting();this.recordMessage.set(null),this.pendingRecord.set(t);let n;try{n=await e.scope(`ng-devtools`).rpc.call(`request-instrument-pipes`,t)}catch{this.settleRecord(`Couldn't reach the devtools server. Try again.`);return}if(this.pendingRecord()===t){if(n?.pages===0){this.settleRecord(`No page is connected. Open your app in the browser with the devtools running, then record again.`);return}clearTimeout(this.pendingTimer),this.pendingTimer=setTimeout(()=>{this.pendingRecord()===t&&this.settleRecord(t?`No page confirmed recording. Reload the app and try again.`:`No page confirmed it stopped recording. Reload the app to stop it.`)},XR)}}settleRecord(e){clearTimeout(this.pendingTimer),this.pendingRecord.set(null),e!==null&&this.recordMessage.set(e)}liveFor(e){return this.liveByName().get(e)}describe(e){if(Array.isArray(e))return e.map(e=>this.describe(e)).join(`, `);if(typeof e==`string`)return e.length>80?`${e.slice(0,80)}…`:e;try{let t=JSON.stringify(e);return t&&t.length>120?`${t.slice(0,120)}…`:t??String(e)}catch{return String(e)}}isSelected(e){let t=this.selected();return t!==null&&t.name===e.name&&t.file===e.file}select(e){this.selected.set(this.isSelected(e)?null:e)}clearFilters(){this.filter.set(``),this.kind.set(`all`)}highlightPipe(e){this.highlight(e?.components.find(e=>e.targets?.length)?.targets?.[0])}highlight(e,t=!1){let n=this.rpc();n&&n.scope(`ng-devtools`).rpc.call(`request-page-highlight`,e?{...e,...t?{reveal:t}:{}}:null).catch(()=>{})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-pipe-row]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-pipes-inspector`]],inputs:{rpc:[1,`rpc`]},decls:32,vars:18,consts:[[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a pipe, class or file…`,`aria-label`,`Find a pipe, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show pipes`,3,`valueChange`,`options`,`value`],[`aria-live`,`polite`,1,`total`],[1,`actions`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,1,`record`,3,`click`],[`aria-hidden`,`true`,1,`rec-dot`],[`role`,`status`,1,`notice`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[1,`state`],[1,`layout`],[`aria-labelledby`,`async-title`,1,`section`],[`aria-labelledby`,`lint-title`,1,`section`],[`id`,`lint-title`],[1,`pill`],[`role`,`alert`,1,`empty-line`],[`role`,`status`,1,`empty-line`],[1,`empty-line`,`ok`],[1,`findings`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[`aria-hidden`,`true`,1,`spinner`],[1,`state-title`],[1,`state-hint`],[`type`,`button`,3,`click`],[1,`list-wrap`],[`aria-label`,`Pipes`,1,`pipe-list`],[`role`,`status`,1,`state`,`compact`],[`id`,`pipe-detail`,`aria-labelledby`,`pipe-detail-title`,1,`detail`],[`aria-label`,`Pipes`,1,`pipe-list`,3,`keydown`],[`type`,`button`,`data-pipe-row`,``,`aria-controls`,`pipe-detail`,1,`row`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`row-main`],[1,`name`,`mono`],[1,`sub`,`mono`],[1,`row-meta`],[1,`chip`,`warn`],[1,`chip`,`live`],[1,`chip`],[1,`row-file`,`mono`],[1,`more`],[1,`detail-head`],[`id`,`pipe-detail-title`,1,`mono`],[1,`block`],[1,`mono`],[1,`empty-line`],[1,`sites`],[`role`,`note`,1,`warning`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`component`],[1,`component`],[`type`,`button`,1,`component`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`count`],[1,`mono`,`value`],[1,`calls`],[1,`muted`],[`id`,`pipe-detail-title`,1,`visually-hidden`],[1,`state`,`compact`],[`id`,`async-title`],[1,`async-list`],[1,`async-row`],[1,`async-row`,3,`mouseenter`,`mouseleave`],[`type`,`button`,1,`component-name`,`mono`],[1,`mono`,`component-name`],[1,`mono`,`value`,`latest`],[`type`,`button`,1,`component-name`,`mono`,3,`click`,`focus`,`blur`],[1,`finding`],[1,`finding-head`],[1,`severity`],[1,`mono`,`rule`],[1,`where`,`mono`],[1,`finding-message`],[1,`finding-fix`],[1,`fix-label`]],template:function(e,t){if(e&1&&(z(0,`p`,0),J(1,` Pipes declared in your source and the built-in pipes your templates use. Live data shows which components use each pipe on the page; turn on recording to capture calls and the last input and output. `),B(),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,6),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B()(),z(8,`app-select`,7),ev(`valueChange`,function(e){return $_(t.kind,e)||(t.kind=e),e}),B(),z(9,`span`,8),J(10),B(),z(11,`div`,9)(12,`button`,10),G(`click`,function(){return t.refresh()}),J(13,`Refresh`),B(),z(14,`button`,11),G(`click`,function(){return t.toggleInstrument()}),V(15,`span`,12),J(16),B()()(),P(17,rR,6,1,`p`,13),P(18,iR,8,1,`p`,13),P(19,aR,4,0,`div`,14)(20,oR,7,0,`div`,15)(21,sR,5,0,`div`,16)(22,IR,7,2,`div`,17),P(23,UR,16,1,`section`,18),z(24,`section`,19)(25,`h2`,20),J(26,` Lint `),P(27,WR,2,1,`span`,21),B(),P(28,GR,2,0,`p`,22)(29,KR,2,0,`p`,23)(30,qR,2,0,`p`,24)(31,YR,3,0,`ul`,25),B()),e&2){let e,n;M(7),R(`value`,t.filter()),M(),R(`options`,t.kindOptions),Q_(`value`,t.kind),M(2),Z(``,t.filtered().length,` of `,t.pipes().length),M(2),R(`disabled`,t.loading()),M(2),q(`on`,t.instrumenting()),N(`aria-pressed`,t.instrumenting())(`aria-busy`,t.pendingRecord()!==null)(`aria-disabled`,t.pendingRecord()!==null),M(2),X(` `,t.recordLabel(),` `),M(),F((e=t.recordMessage())?17:-1,e),M(),F(t.instrumenting()?18:-1),M(),F(t.loading()&&t.pipes().length===0?19:t.loadFailed()&&t.pipes().length===0?20:t.pipes().length===0?21:22),M(4),F(t.async().length>0?23:-1),M(4),F((n=t.lint())?27:-1,n),M(),F(t.lintFailed()?28:t.lint()===null?29:t.lint().length?31:30)}},dependencies:[XE],styles:[`[_nghost-%COMP%] { +}`]})},DR=(e,t)=>t.file+t.name,OR=(e,t)=>t.file+`:`+t.line,kR=(e,t)=>t.name;function AR(e,t){e&1&&(z(0,`p`,13),fs(),z(1,`svg`,26),V(2,`circle`,27)(3,`path`,28),B(),ps(),z(4,`span`),J(5),B()()),e&2&&(M(5),Y(t))}function jR(e,t){if(e&1&&(z(0,`p`,13),fs(),z(1,`svg`,26),V(2,`circle`,27)(3,`path`,28),B(),ps(),z(4,`span`)(5,`strong`),J(6),B(),J(7,` Pipe prototypes are patched in the inspected page to count calls and keep the last input and output. Stop recording when you are done. `),B()()),e&2){let e=K();M(6),X(`Recording on `,e.instrumentedPages().length,` page(s).`)}}function MR(e,t){e&1&&(z(0,`div`,14),V(1,`span`,29),z(2,`p`,30),J(3,`Scanning pipes…`),B()())}function NR(e,t){if(e&1){let e=W();z(0,`div`,15)(1,`p`,30),J(2,`Couldn't load pipes`),B(),z(3,`p`,31),J(4,`The devtools server did not answer. Check that it is running.`),B(),z(5,`button`,32),G(`click`,function(){return k(e),A(K().refresh())}),J(6,`Try again`),B()()}}function PR(e,t){e&1&&(z(0,`div`,16)(1,`p`,30),J(2,`No pipes found`),B(),z(3,`p`,31),J(4,` No @Pipe classes were found in the source, and no template uses a built-in pipe yet. `),B()())}function FR(e,t){e&1&&(z(0,`span`,43),J(1,`stale?`),B())}function IR(e,t){if(e&1&&(z(0,`span`,44),J(1),B()),e&2){K();let e=iv(0);M(),X(``,e.instanceCount,` live`)}}function LR(e,t){e&1&&(z(0,`span`,45),J(1,`built-in`),B())}function RR(e,t){e&1&&(z(0,`span`,45),J(1,`NgModule`),B())}function zR(e,t){if(e&1&&(z(0,`span`,47),J(1),B()),e&2){let e=K().$implicit;M(),X(`+`,(e.usageCount??1)-1,` more`)}}function BR(e,t){if(e&1){let e=W();nv(0),z(1,`li`)(2,`button`,38),G(`click`,function(){let t=k(e).$implicit;return A(K(3).select(t))})(`mouseenter`,function(){k(e);let t=iv(0);return A(K(3).highlightPipe(t))})(`mouseleave`,function(){return k(e),A(K(3).highlight(null))})(`focus`,function(){k(e);let t=iv(0);return A(K(3).highlightPipe(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))}),z(3,`span`,39)(4,`span`,40),J(5),B(),z(6,`span`,41),J(7),B()(),z(8,`span`,42),P(9,FR,2,0,`span`,43),P(10,IR,2,1,`span`,44),P(11,LR,2,0,`span`,45),P(12,RR,2,0,`span`,45),z(13,`span`,45),J(14),B()(),z(15,`span`,46),J(16),P(17,zR,2,1,`span`,47),B()()()}if(e&2){let e=t.$implicit,n=K(3),r=rv(n.liveFor(e.name));M(2),q(`selected`,n.isSelected(e)),N(`aria-current`,n.isSelected(e)||null),M(3),Y(e.name),M(2),Y(e.className),M(2),F(r?.stale?9:-1),M(),F(r?10:-1),M(),F(e.builtin?11:-1),M(),F(e.isStandalone?-1:12),M(),q(`impure`,!e.isPure),M(),Y(e.isPure?`pure`:`impure`),M(2),Z(` `,e.file,`:`,e.line,` `),M(),F(e.builtin&&(e.usageCount??0)>1?17:-1)}}function VR(e,t){if(e&1){let e=W();z(0,`ul`,37),G(`keydown`,function(t){return k(e),A(K(2).onListKey(t))}),I(1,BR,18,16,`li`,null,DR),B()}if(e&2){let e=K(2);M(),L(e.filtered())}}function HR(e,t){e&1&&J(0),e&2&&X(` Nothing matches “`,K(3).filter().trim(),`” in this view. `)}function UR(e,t){e&1&&J(0,` None of the pipes fit this filter. `)}function WR(e,t){if(e&1){let e=W();z(0,`div`,35)(1,`p`,30),J(2,`No pipes match`),B(),z(3,`p`,31),P(4,HR,1,1)(5,UR,1,0),B(),z(6,`button`,32),G(`click`,function(){return k(e),A(K(2).clearFilters())}),J(7,`Clear filters`),B()()}if(e&2){let e=K(2);M(4),F(e.filter().trim()?4:5)}}function GR(e,t){e&1&&(z(0,`span`,45),J(1,`built-in`),B())}function KR(e,t){if(e&1&&(z(0,`dt`),J(1,`File`),B(),z(2,`dd`,51),J(3),B()),e&2){let e=K();M(3),Z(``,e.file,`:`,e.line)}}function qR(e,t){if(e&1&&(z(0,`li`,51),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e.file,`:`,e.line)}}function JR(e,t){if(e&1&&(z(0,`div`,50)(1,`h3`),J(2,` Used in templates `),z(3,`span`,21),J(4),B()(),z(5,`ul`,53),I(6,qR,2,2,`li`,51,OR),B()()),e&2){let e=K();M(4),Y(e.usageCount),M(2),L(e.usages)}}function YR(e,t){e&1&&(z(0,`p`,54)(1,`span`,43),J(2,`experimental`),B(),J(3,` This pure pipe got an argument whose contents changed while its reference stayed the same, so it may be showing a stale value. `),B())}function XR(e,t){if(e&1){let e=W();z(0,`button`,59),G(`click`,function(){let t=k(e);return A(K(5).highlight(t,!0))})(`mouseenter`,function(){let t=k(e);return A(K(5).highlight(t))})(`mouseleave`,function(){return k(e),A(K(5).highlight(null))})(`focus`,function(){let t=k(e);return A(K(5).highlight(t))})(`blur`,function(){return k(e),A(K(5).highlight(null))}),z(1,`span`,51),J(2),B(),z(3,`span`,60),J(4),B()()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.name+` on the page`),M(2),Y(e.name),M(2),Y(e.count)}}function ZR(e,t){if(e&1&&(z(0,`span`,58)(1,`span`,51),J(2),B(),z(3,`span`,60),J(4),B()()),e&2){let e=K().$implicit;M(2),Y(e.name),M(2),Y(e.count)}}function QR(e,t){if(e&1&&(z(0,`li`),P(1,XR,5,3,`button`,57)(2,ZR,5,2,`span`,58),B()),e&2){let e,n=t.$implicit;M(),F((e=n.targets?.[0])?1:2,e)}}function $R(e,t){if(e&1&&(z(0,`li`,61),J(1),z(2,`span`,62),J(3),B()()),e&2){let e=t.$implicit,n=K(6);M(),Z(` `,n.describe(e.lastArgs),` → `,n.describe(e.lastResult),` `),M(2),X(``,e.callCount,`×`)}}function ez(e,t){if(e&1&&(z(0,`dt`),J(1,`Per instance`),B(),z(2,`dd`)(3,`ul`,53),I(4,$R,4,3,`li`,61,Cg),B()()),e&2){let e=K();M(4),L(e.instances)}}function tz(e,t){if(e&1&&(z(0,`dt`),J(1,`Last caller`),B(),z(2,`dd`,61),J(3),B()),e&2){let e=K();M(3),Y(e.lastCaller)}}function nz(e,t){if(e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`),J(3),B(),z(4,`dt`),J(5,`Last input`),B(),z(6,`dd`,61),J(7),B(),z(8,`dt`),J(9,`Last output`),B(),z(10,`dd`,61),J(11),B(),P(12,ez,6,0),P(13,tz,4,1)),e&2){let e=t,n=K(4);M(3),Y(e.callCount),M(4),Y(n.describe(e.lastArgs)),M(4),Y(n.describe(e.lastResult)),M(),F(e.instances?.length?12:-1),M(),F(e.lastCaller?13:-1)}}function rz(e,t){e&1&&(z(0,`dt`),J(1,`Calls`),B(),z(2,`dd`,63),J(3,`None recorded yet.`),B())}function iz(e,t){e&1&&(z(0,`p`,56),J(1,`Turn on “Record calls” to see call counts and values.`),B())}function az(e,t){if(e&1&&(P(0,YR,4,0,`p`,54),z(1,`dl`)(2,`dt`),J(3,`Instances`),B(),z(4,`dd`),J(5),B(),z(6,`dt`),J(7,`Used by`),B(),z(8,`dd`)(9,`ul`,55),I(10,QR,3,1,`li`,null,kR),B()(),P(12,nz,14,5)(13,rz,4,0),B(),P(14,iz,2,0,`p`,56)),e&2){let e,n=t,r=K(3);F(n.stale?0:-1),M(5),Y(n.instanceCount),M(5),L(n.components),M(2),F((e=n.call)?12:r.instrumenting()?13:-1,e),M(2),F(!n.call&&!r.instrumenting()?14:-1)}}function oz(e,t){e&1&&(z(0,`p`,52),J(1,` Not in use on the connected page. Open a view that uses it, or connect the app. `),B())}function sz(e,t){if(e&1&&(z(0,`header`,48)(1,`h2`,49),J(2),B(),z(3,`span`,45),J(4),B(),P(5,GR,2,0,`span`,45),B(),z(6,`div`,50)(7,`h3`),J(8,`Declaration`),B(),z(9,`dl`)(10,`dt`),J(11,`Class`),B(),z(12,`dd`,51),J(13),B(),z(14,`dt`),J(15,`Source`),B(),z(16,`dd`),J(17),B(),P(18,KR,4,2),z(19,`dt`),J(20,`Standalone`),B(),z(21,`dd`),J(22),B(),z(23,`dt`),J(24,`Pure`),B(),z(25,`dd`),J(26),B()()(),P(27,JR,8,1,`div`,50),z(28,`div`,50)(29,`h3`),J(30,`Live on the page`),B(),P(31,az,15,4)(32,oz,2,0,`p`,52),B()),e&2){let e,n=t,r=K(2);M(2),Y(n.name),M(),q(`impure`,!n.isPure),M(),Y(n.isPure?`pure`:`impure`),M(),F(n.builtin?5:-1),M(8),Y(n.className),M(4),Y(n.builtin?`@angular/common`:`This project`),M(),F(n.builtin?-1:18),M(4),Y(n.isStandalone?`Yes`:`No, declared in an NgModule`),M(4),X(` `,n.isPure?`Yes, reruns only when an input changes`:`No, reruns on every check`,` `),M(),F(n.builtin&&n.usages?.length?27:-1),M(4),F((e=r.liveFor(n.name))?31:32,e)}}function cz(e,t){e&1&&(z(0,`h2`,64),J(1,`Pipe details`),B(),z(2,`div`,65)(3,`p`,30),J(4,`Pick a pipe`),B(),z(5,`p`,31),J(6,` See where it is declared, which components use it and what it last returned. `),B()())}function lz(e,t){if(e&1&&(z(0,`div`,17)(1,`div`,33),P(2,VR,3,0,`ul`,34)(3,WR,8,1,`div`,35),B(),z(4,`section`,36),P(5,sz,33,12)(6,cz,7,0),B()()),e&2){let e,t=K();M(2),F(t.filtered().length?2:3),M(3),F((e=t.selected())?5:6,e)}}function uz(e,t){if(e&1){let e=W();z(0,`button`,73),G(`click`,function(){let t=k(e);return A(K(3).highlight(t))})(`focus`,function(){let t=k(e);return A(K(3).highlight(t))})(`blur`,function(){return k(e),A(K(3).highlight(null))}),J(1),B()}if(e&2){let e=K().$implicit;N(`aria-label`,`Highlight `+e.component+` on the page`),M(),X(` `,e.component,` `)}}function dz(e,t){if(e&1&&(z(0,`span`,71),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.component)}}function fz(e,t){e&1&&(z(0,`span`,45),J(1,`no source`),B())}function pz(e,t){e&1&&(z(0,`span`,43),J(1,`duplicate subscription`),B())}function mz(e,t){e&1&&(z(0,`span`,43),J(1,`resubscribing`),B())}function hz(e,t){if(e&1){let e=W();z(0,`li`,69),G(`mouseenter`,function(){let t=k(e).$implicit;return A(K(2).highlight(t.target))})(`mouseleave`,function(){return k(e),A(K(2).highlight(null))}),P(1,uz,2,2,`button`,70)(2,dz,2,1,`span`,71),P(3,fz,2,0,`span`,45),P(4,pz,2,0,`span`,43),P(5,mz,2,0,`span`,43),z(6,`span`,72),J(7),B()()}if(e&2){let e,n=t.$implicit;M(),F((e=n.target)?1:2,e),M(2),F(n.hasSource?-1:3),M(),F(n.duplicate?4:-1),M(),F(n.resubscribing?5:-1),M(2),Y(n.latestValue??`no value yet`)}}function gz(e,t){if(e&1&&(z(0,`section`,18)(1,`h2`,66),J(2,` Async subscriptions `),z(3,`span`,21),J(4),B()(),z(5,`p`,56),J(6,` Each `),z(7,`span`,51),J(8,`| async`),B(),J(9,` subscribes on its own. Two on the same source mean the work runs twice. A source that changes on every check, like `),z(10,`span`,51),J(11,`getData() | async`),B(),J(12,`, resubscribes each time. `),B(),z(13,`ul`,67),I(14,hz,8,5,`li`,68,Cg),B()()),e&2){let e=K();M(4),Y(e.async().length),M(10),L(e.async())}}function _z(e,t){e&1&&(z(0,`span`,21),J(1),B()),e&2&&(M(),Y(t.length))}function vz(e,t){e&1&&(z(0,`p`,22),J(1,`Couldn't run the lint check. Try Refresh.`),B())}function yz(e,t){e&1&&(z(0,`p`,23),J(1,`Checking…`),B())}function bz(e,t){e&1&&(z(0,`p`,24),J(1,`No problems found.`),B())}function xz(e,t){if(e&1&&(z(0,`li`,74)(1,`div`,75)(2,`span`,76),J(3),B(),z(4,`code`,77),J(5),B(),z(6,`span`,78),J(7),B()(),z(8,`p`,79),J(9),B(),z(10,`p`,80)(11,`span`,81),J(12,`Fix`),B(),J(13),B()()),e&2){let e=t.$implicit;M(2),N(`data-tone`,e.severity),M(),Y(e.severity),M(2),Y(e.rule),M(2),Y_(``,e.pipe,` · `,e.file,`:`,e.line),M(2),Y(e.message),M(4),X(` `,e.fix)}}function Sz(e,t){if(e&1&&(z(0,`ul`,25),I(1,xz,14,8,`li`,74,Cg),B()),e&2){let e=K();M(),L(e.lint())}}var Cz=5e3,wz=[{value:`all`,label:`All pipes`},{value:`custom`,label:`Custom`},{value:`builtin`,label:`Built-in`},{value:`impure`,label:`Impure`},{value:`live`,label:`On the page`}],Tz=class e{destroyRef=E(Cs);host=E(Ml);rpc=$(null);kindOptions=wz;pipes=j([]);filter=j(``);kind=j(`all`);loading=j(!1);loadFailed=j(!1);selected=j(null);live=j([]);async=j([]);lint=j(null);lintFailed=j(!1);instrumentedPages=j([]);instrumenting=Q(()=>this.instrumentedPages().length>0);pendingRecord=j(null);recordMessage=j(null);recordLabel=Q(()=>{let e=this.pendingRecord();return e===null?this.instrumenting()?`Stop recording`:`Record calls`:e?`Starting…`:`Stopping…`});pendingTimer;liveByName=Q(()=>new Map(this.live().map(e=>[e.name,e])));filtered=Q(()=>{let e=this.filter().trim().toLowerCase(),t=this.kind()??`all`,n=this.liveByName();return this.pipes().filter(r=>t===`custom`&&r.builtin||t===`builtin`&&!r.builtin||t===`impure`&&r.isPure||t===`live`&&!n.has(r.name)?!1:!e||r.name.toLowerCase().includes(e)||r.className.toLowerCase().includes(e)||r.file.toLowerCase().includes(e))});unsubscribe;constructor(){uc(()=>{let e=this.rpc();e&&(this.refresh(),this.loadLive(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.pendingTimer),this.highlight(null)})}async refresh(){let e=this.rpc();if(e){this.loading.set(!0),this.loadFailed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`get-pipes`);this.pipes.set(t);let n=this.selected();if(n){let e=t.find(e=>e.name===n.name&&e.file===n.file);this.selected.set(e??null)}}catch{this.loadFailed.set(!0)}finally{this.loading.set(!1)}this.loadLint(e)}}async loadLint(e){this.lintFailed.set(!1);try{let t=await e.scope(`ng-devtools`).rpc.call(`pipe-lint`);this.lint.set(t)}catch{this.lintFailed.set(!0)}}async loadLive(e){try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`pipe-usage`);if(this.destroyRef.destroyed)return;let n=e=>{let t=e;this.live.set(t?.pipes??[]),this.async.set(t?.async??[]);let n=t?.instrumented??[];this.instrumentedPages.set(n),this.pendingRecord()===n.length>0&&this.settleRecord(null)};n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{}}async toggleInstrument(){let e=this.rpc();if(!e||this.pendingRecord()!==null)return;let t=!this.instrumenting();this.recordMessage.set(null),this.pendingRecord.set(t);let n;try{n=await e.scope(`ng-devtools`).rpc.call(`request-instrument-pipes`,t)}catch{this.settleRecord(`Couldn't reach the devtools server. Try again.`);return}if(this.pendingRecord()===t){if(n?.pages===0){this.settleRecord(`No page is connected. Open your app in the browser with the devtools running, then record again.`);return}clearTimeout(this.pendingTimer),this.pendingTimer=setTimeout(()=>{this.pendingRecord()===t&&this.settleRecord(t?`No page confirmed recording. Reload the app and try again.`:`No page confirmed it stopped recording. Reload the app to stop it.`)},Cz)}}settleRecord(e){clearTimeout(this.pendingTimer),this.pendingRecord.set(null),e!==null&&this.recordMessage.set(e)}liveFor(e){return this.liveByName().get(e)}describe(e){if(Array.isArray(e))return e.map(e=>this.describe(e)).join(`, `);if(typeof e==`string`)return e.length>80?`${e.slice(0,80)}…`:e;try{let t=JSON.stringify(e);return t&&t.length>120?`${t.slice(0,120)}…`:t??String(e)}catch{return String(e)}}isSelected(e){let t=this.selected();return t!==null&&t.name===e.name&&t.file===e.file}select(e){this.selected.set(this.isSelected(e)?null:e)}clearFilters(){this.filter.set(``),this.kind.set(`all`)}highlightPipe(e){this.highlight(e?.components.find(e=>e.targets?.length)?.targets?.[0])}highlight(e,t=!1){let n=this.rpc();n&&n.scope(`ng-devtools`).rpc.call(`request-page-highlight`,e?{...e,...t?{reveal:t}:{}}:null).catch(()=>{})}onListKey(e){if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=Array.from(this.host.nativeElement.querySelectorAll(`[data-pipe-row]`));if(!t.length)return;let n=t.indexOf(document.activeElement),r=n;r=e.key===`ArrowDown`?Math.min(n+1,t.length-1):e.key===`ArrowUp`?Math.max(n-1,0):e.key===`Home`?0:t.length-1,e.preventDefault(),t[r]?.focus()}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-pipes-inspector`]],inputs:{rpc:[1,`rpc`]},decls:32,vars:18,consts:[[1,`intro`],[1,`toolbar`],[1,`search`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`,1,`search-icon`],[`cx`,`11`,`cy`,`11`,`r`,`7`],[`d`,`m20 20-3.5-3.5`],[`type`,`search`,`placeholder`,`Find a pipe, class or file…`,`aria-label`,`Find a pipe, class or file`,`autocomplete`,`off`,`spellcheck`,`false`,3,`input`,`keydown.escape`,`value`],[`ariaLabel`,`Show pipes`,3,`valueChange`,`options`,`value`],[`aria-live`,`polite`,1,`total`],[1,`actions`],[`type`,`button`,3,`click`,`disabled`],[`type`,`button`,1,`record`,3,`click`],[`aria-hidden`,`true`,1,`rec-dot`],[`role`,`status`,1,`notice`],[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`],[1,`state`],[1,`layout`],[`aria-labelledby`,`async-title`,1,`section`],[`aria-labelledby`,`lint-title`,1,`section`],[`id`,`lint-title`],[1,`pill`],[`role`,`alert`,1,`empty-line`],[`role`,`status`,1,`empty-line`],[1,`empty-line`,`ok`],[1,`findings`],[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`cx`,`12`,`cy`,`12`,`r`,`9`],[`d`,`M12 11v5M12 8h.01`],[`aria-hidden`,`true`,1,`spinner`],[1,`state-title`],[1,`state-hint`],[`type`,`button`,3,`click`],[1,`list-wrap`],[`aria-label`,`Pipes`,1,`pipe-list`],[`role`,`status`,1,`state`,`compact`],[`id`,`pipe-detail`,`aria-labelledby`,`pipe-detail-title`,1,`detail`],[`aria-label`,`Pipes`,1,`pipe-list`,3,`keydown`],[`type`,`button`,`data-pipe-row`,``,`aria-controls`,`pipe-detail`,1,`row`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`row-main`],[1,`name`,`mono`],[1,`sub`,`mono`],[1,`row-meta`],[1,`chip`,`warn`],[1,`chip`,`live`],[1,`chip`],[1,`row-file`,`mono`],[1,`more`],[1,`detail-head`],[`id`,`pipe-detail-title`,1,`mono`],[1,`block`],[1,`mono`],[1,`empty-line`],[1,`sites`],[`role`,`note`,1,`warning`],[1,`chips`],[1,`hint`],[`type`,`button`,1,`component`],[1,`component`],[`type`,`button`,1,`component`,3,`click`,`mouseenter`,`mouseleave`,`focus`,`blur`],[1,`count`],[1,`mono`,`value`],[1,`calls`],[1,`muted`],[`id`,`pipe-detail-title`,1,`visually-hidden`],[1,`state`,`compact`],[`id`,`async-title`],[1,`async-list`],[1,`async-row`],[1,`async-row`,3,`mouseenter`,`mouseleave`],[`type`,`button`,1,`component-name`,`mono`],[1,`mono`,`component-name`],[1,`mono`,`value`,`latest`],[`type`,`button`,1,`component-name`,`mono`,3,`click`,`focus`,`blur`],[1,`finding`],[1,`finding-head`],[1,`severity`],[1,`mono`,`rule`],[1,`where`,`mono`],[1,`finding-message`],[1,`finding-fix`],[1,`fix-label`]],template:function(e,t){if(e&1&&(z(0,`p`,0),J(1,` Pipes declared in your source and the built-in pipes your templates use. Live data shows which components use each pipe on the page; turn on recording to capture calls and the last input and output. `),B(),z(2,`div`,1)(3,`div`,2),fs(),z(4,`svg`,3),V(5,`circle`,4)(6,`path`,5),B(),ps(),z(7,`input`,6),G(`input`,function(e){return t.filter.set(e.target.value)})(`keydown.escape`,function(){return t.filter.set(``)}),B()(),z(8,`app-select`,7),ev(`valueChange`,function(e){return $_(t.kind,e)||(t.kind=e),e}),B(),z(9,`span`,8),J(10),B(),z(11,`div`,9)(12,`button`,10),G(`click`,function(){return t.refresh()}),J(13,`Refresh`),B(),z(14,`button`,11),G(`click`,function(){return t.toggleInstrument()}),V(15,`span`,12),J(16),B()()(),P(17,AR,6,1,`p`,13),P(18,jR,8,1,`p`,13),P(19,MR,4,0,`div`,14)(20,NR,7,0,`div`,15)(21,PR,5,0,`div`,16)(22,lz,7,2,`div`,17),P(23,gz,16,1,`section`,18),z(24,`section`,19)(25,`h2`,20),J(26,` Lint `),P(27,_z,2,1,`span`,21),B(),P(28,vz,2,0,`p`,22)(29,yz,2,0,`p`,23)(30,bz,2,0,`p`,24)(31,Sz,3,0,`ul`,25),B()),e&2){let e,n;M(7),R(`value`,t.filter()),M(),R(`options`,t.kindOptions),Q_(`value`,t.kind),M(2),Z(``,t.filtered().length,` of `,t.pipes().length),M(2),R(`disabled`,t.loading()),M(2),q(`on`,t.instrumenting()),N(`aria-pressed`,t.instrumenting())(`aria-busy`,t.pendingRecord()!==null)(`aria-disabled`,t.pendingRecord()!==null),M(2),X(` `,t.recordLabel(),` `),M(),F((e=t.recordMessage())?17:-1,e),M(),F(t.instrumenting()?18:-1),M(),F(t.loading()&&t.pipes().length===0?19:t.loadFailed()&&t.pipes().length===0?20:t.pipes().length===0?21:22),M(4),F(t.async().length>0?23:-1),M(4),F((n=t.lint())?27:-1,n),M(),F(t.lintFailed()?28:t.lint()===null?29:t.lint().length?31:30)}},dependencies:[nD],styles:[`[_nghost-%COMP%] { display: block; color: var(--%NS%text); font-size: 13px; @@ -9614,7 +9763,7 @@ button.component-name[_ngcontent-%COMP%] { .spinner[_ngcontent-%COMP%] { animation: none; } -}`]})},$R=()=>[],ez=()=>[`/`],tz=(e,t)=>t.id,nz=(e,t)=>t.route.id,rz=(e,t)=>t[0],iz=(e,t)=>t.file+t.method,az=(e,t)=>t.path,oz=(e,t)=>t.mode,sz=(e,t)=>t.file,cz=(e,t)=>t.rule;function lz(e,t){e&1&&(z(0,`div`,0),V(1,`span`,2),z(2,`span`),J(3,`Reading the project…`),B()())}function uz(e,t){e&1&&(z(0,`div`,1)(1,`h2`,3),J(2,`This app is not an Analog app.`),B(),z(3,`p`,4),J(4,` Add `),z(5,`code`),J(6,`ngDevtools()`),B(),J(7,` from `),z(8,`code`),J(9,`@santoshyadavdev/ng-devtools/vite`),B(),J(10,` next to `),z(11,`code`),J(12,`analog()`),B(),J(13,` in vite.config.ts and run the Analog dev server. `),B()())}function dz(e,t){if(e&1&&(z(0,`div`,9)(1,`span`,7),J(2,`Open in the browser`),B(),z(3,`span`,13),J(4),B()()),e&2){let e=t;M(3),R(`title`,e.url),M(),Y(e.url)}}function fz(e,t){if(e&1){let e=W();z(0,`button`,14),G(`click`,function(){let t=k(e).$implicit;return A(K(2).view.set(t.id))}),J(1),z(2,`span`,15),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`analog-tab-`+e.id),N(`aria-selected`,e.id===n.view())(`aria-controls`,`analog-panel-`+e.id)(`tabindex`,e.id===n.view()?0:-1),M(),X(` `,e.label,` `),M(),N(`data-tone`,e.tone),M(),Y(e.count)}}function pz(e,t){e&1&&(z(0,`div`,24),J(1),B()),e&2&&(M(),Y(t))}function mz(e,t){if(e&1&&(z(0,`li`)(1,`span`,29),J(2),B(),z(3,`span`,32),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(2),Y(n.short(e.file)??e.fullPath),M(),N(`data-kind`,e.kind),M(),Y(e.kind)}}function hz(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e[0],` = `,e[1])}}function gz(e,t){if(e&1&&(z(0,`div`,31),I(1,hz,2,2,`span`,33,rz),B()),e&2){let e=K(2),t=K(3);M(),L(t.paramList(e.match.params))}}function _z(e,t){if(e&1&&(z(0,`strong`,29),J(1),B(),J(2,` renders `),z(3,`ol`,30),I(4,mz,5,3,`li`,null,tz),B(),P(6,gz,3,0,`div`,31)),e&2){let e=K(),t=K(3);M(),Y(e.url),M(3),L(e.match.chain),M(2),F(t.paramList(e.match.params).length?6:-1)}}function vz(e,t){if(e&1&&(z(0,`li`)(1,`span`,29),J(2),B(),z(3,`span`,4),J(4),B()()),e&2){let e=t.$implicit,n=K(6);M(2),Y(n.short(e.file)??e.path),M(2),Y(e.reason)}}function yz(e,t){if(e&1&&(z(0,`ul`,34),I(1,vz,5,2,`li`,null,Cg),B()),e&2){let e=K(2);M(),L(e.match.rejected.slice(0,5))}}function bz(e,t){if(e&1&&(z(0,`strong`,29),J(1),B(),J(2,` matches no file route. Angular throws NG04002 "Cannot match any routes". `),P(3,yz,3,0,`ul`,34)),e&2){let e=K();M(),Y(e.url),M(2),F(e.match.rejected.length?3:-1)}}function xz(e,t){if(e&1&&(z(0,`div`,25),P(1,_z,7,2)(2,bz,4,2),B()),e&2){let e=t;N(`data-tone`,e.match.matched?`good`:`bad`),M(),F(e.match.matched?1:2)}}function Sz(e,t){e&1&&(z(0,`span`,36),J(1,`└`),B())}function Cz(e,t){e&1&&(z(0,`span`,38),J(1,`open`),B())}function wz(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.route.file)),M(),Y(t.base(e.route.file))}}function Tz(e,t){e&1&&(z(0,`span`,4),J(1,`folder only`),B())}function Ez(e,t){if(e&1&&(z(0,`span`,41),J(1),B()),e&2){let e=t.$implicit;M(),X(``,e,`()`)}}function Dz(e,t){if(e&1&&(z(0,`span`,42),J(1),B()),e&2){let e=K().$implicit;M(),X(`"`,e.route.title,`"`)}}function Oz(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=K().$implicit;M(),Y(e)}}function kz(e,t){if(e&1&&P(0,Oz,2,1,`span`,33),e&2){let e=t.$implicit;F(e===`title`?-1:0)}}function Az(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`div`,35),P(3,Sz,2,0,`span`,36),z(4,`span`,37),J(5),B(),z(6,`span`,32),J(7),B(),P(8,Cz,2,0,`span`,38),B()(),z(9,`td`),P(10,wz,4,2,`span`,39)(11,Tz,2,0,`span`,4),B(),z(12,`td`)(13,`div`,40),I(14,Ez,2,1,`span`,41,wg),B()(),z(16,`td`),P(17,Dz,2,1,`span`,42),I(18,kz,1,1,null,null,wg),B()()),e&2){let e=t.$implicit,n=K(3);q(`open`,n.isOpen(e.route))(`dim`,e.route.kind===`group`||e.route.kind===`implicit`),M(2),C_(`padding-left`,e.depth*16,`px`),M(),F(e.depth?3:-1),M(2),Y(e.route.fullPath),M(),N(`data-kind`,e.route.kind),M(),Y(n.kindText(e.route)),M(),F(n.isOpen(e.route)?8:-1),M(2),F(e.route.file?10:11),M(4),L(n.serverExports(e.route)),M(3),F(e.route.title?17:-1),M(),L(e.route.routeMeta??av(13,$R))}}function jz(e,t){e&1&&J(0,` No route matches the filter. Try part of a path or a file name. `)}function Mz(e,t){e&1&&J(0,` No file routes yet. Add a .page.ts file under src/app/pages. `)}function Nz(e,t){if(e&1&&(z(0,`tr`)(1,`td`,44),P(2,jz,1,0)(3,Mz,1,0),B()()),e&2){let e=K(3);M(2),F(e.filter().trim()?2:3)}}function Pz(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`form`,17),G(`submit`,function(t){k(e);let n=K(2);return t.preventDefault(),A(n.explain())}),z(2,`label`,18),J(3,`Test a URL`),B(),z(4,`input`,19),G(`input`,function(t){return k(e),A(K(2).testUrl.set(t.target.value))}),B(),z(5,`button`,20),J(6),B()(),z(7,`label`,21),J(8,`Filter routes`),B(),z(9,`input`,22),G(`input`,function(t){return k(e),A(K(2).filter.set(t.target.value))}),B()(),z(10,`div`,23),P(11,pz,2,1,`div`,24)(12,xz,3,2,`div`,25),B(),z(13,`div`,26)(14,`table`)(15,`thead`)(16,`tr`)(17,`th`,27),J(18,`Route`),B(),z(19,`th`,27),J(20,`File`),B(),z(21,`th`,27),J(22,`Data`),B(),z(23,`th`,27),J(24,`Route meta`),B()()(),z(25,`tbody`),I(26,Az,20,14,`tr`,28,nz,!1,Nz,4,1,`tr`),B()()()}if(e&2){let e,t=K(2);M(4),R(`value`,t.testUrl()),M(),R(`disabled`,t.explaining()),M(),X(` `,t.explaining()?`Explaining…`:`Explain`,` `),M(3),R(`value`,t.filter()),M(2),F((e=t.explainError())?11:(e=t.explained())?12:-1,e),M(15),L(t.routeRows())}}function Fz(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function Iz(e,t){if(e&1&&(z(0,`div`,45)(1,`strong`),J(2,`load() ran twice`),B(),J(3,` for `),I(4,Fz,3,2,null,null,wg),J(6,` : once while server rendering, again in the browser. TransferState did not serve the server result. `),B()),e&2){let e=K(3);M(4),L(e.duplicates())}}function Lz(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function Rz(e,t){if(e&1&&(z(0,`div`,45)(1,`strong`),J(2,`Server function read ran twice`),B(),J(3,`: `),I(4,Lz,3,2,null,null,wg),J(6,` ran while server rendering, then again in the browser. The browser did not use the TransferState seed. `),B()),e&2){let e=K(3);M(4),L(e.refetchedFns())}}function zz(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,63),G(`change`,function(){let t=k(e).$implicit;return A(K(3).kind.set(t))}),B(),J(2),z(3,`span`,4),J(4),B()()}if(e&2){let e=t.$implicit,n=K(3);q(`on`,n.kind()===e),M(),R(`checked`,n.kind()===e),M(),X(` `,n.kindLabel(e),` `),M(2),Y(n.kindCount(e))}}function Bz(e,t){if(e&1&&(z(0,`strong`,68),J(1),B(),z(2,`span`,71),J(3),B()),e&2){let e=t,n=K(5);M(),Y(e.name),M(2),Y(n.short(e.file))}}function Vz(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.url)}}function Hz(e,t){e&1&&(z(0,`span`,32),J(1,`ran during server rendering`),B())}function Uz(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` to `,e.location,` `)}}function Wz(e,t){if(e&1&&(z(0,`span`,32),J(1),P(2,Uz,1,1),B()),e&2){let e=K().$implicit,t=K(4);N(`data-tone`,t.outcomeTone(e.outcome)),M(),X(``,t.outcomeLabel(e.outcome),` `),M(),F(e.location?2:-1)}}function Gz(e,t){if(e&1&&(z(0,`span`,32),J(1),B()),e&2){let e=K().$implicit;N(`data-mode`,e.render===`ssr`?`ssr`:`client`),M(),Y(e.render===`ssr`?`server rendered`:`client only`)}}function Kz(e,t){if(e&1&&(z(0,`details`)(1,`summary`),J(2,`Response`),B(),z(3,`pre`,72),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(4),Y(t.pretty(e.preview))}}function qz(e,t){e&1&&(z(0,`span`,4),J(1,`in process`),B())}function Jz(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.ms,` ms `)}}function Yz(e,t){if(e&1&&(z(0,`tr`)(1,`td`,65),J(2),B(),z(3,`td`)(4,`span`,32),J(5),B()(),z(6,`td`,66)(7,`div`,40)(8,`span`,67),J(9),B(),P(10,Bz,4,2)(11,Vz,2,1,`span`,68),P(12,Hz,2,0,`span`,32),P(13,Wz,3,3,`span`,32),P(14,Gz,2,2,`span`,32),B(),P(15,Kz,5,1,`details`),B(),z(16,`td`)(17,`span`,69),J(18),B()(),z(19,`td`,70),P(20,qz,2,0,`span`,4)(21,Jz,1,1),B(),z(22,`td`,4),J(23),B()()),e&2){let e,n=t.$implicit,r=K(4);M(2),Y(r.time(n.at)),M(2),N(`data-call`,n.kind),M(),Y(r.kindLabel(n.kind)),M(3),N(`data-method`,n.method),M(),Y(n.method),M(),F((e=r.fnOf(n))?10:11,e),M(2),F(n.seeded?12:-1),M(),F(n.outcome?13:-1),M(),F(n.render?14:-1),M(),F(n.preview?15:-1),M(2),N(`data-status`,r.statusClass(n.status)),M(),Y(n.status),M(2),F(n.seeded?20:21),M(3),Y(n.from)}}function Xz(e,t){if(e&1&&(z(0,`div`,51)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,27),J(5,`At`),B(),z(6,`th`,27),J(7,`Kind`),B(),z(8,`th`,27),J(9,`Request`),B(),z(10,`th`,27),J(11,`Status`),B(),z(12,`th`,64),J(13,`Duration`),B(),z(14,`th`,27),J(15,`From`),B()()(),z(16,`tbody`),I(17,Yz,24,14,`tr`,null,tz),B()()()),e&2){let e=K(3);M(17),L(e.calls())}}function Zz(e,t){e&1&&J(0,` No calls of this kind yet. `)}function Qz(e,t){e&1&&J(0,` No calls yet. `)}function $z(e,t){if(e&1&&(z(0,`div`,52)(1,`p`,73),P(2,Zz,1,0)(3,Qz,1,0),B(),z(4,`p`,4),J(5,` Navigate in the app to see page renders, load() fetches, form actions, server functions and API calls. `),B()()),e&2){let e=K(3);M(2),F(e.allCalls().length?2:3)}}function eB(e,t){if(e&1){let e=W();z(0,`tr`)(1,`td`)(2,`span`,67),J(3),B()(),z(4,`td`,29),J(5),B(),z(6,`td`)(7,`span`,39)(8,`span`,43),J(9),B(),J(10),B()(),z(11,`td`,74)(12,`button`,75),G(`click`,function(){let t=k(e).$implicit;return A(K(3).tryApi(t))}),J(13,` Try `),B()()()}if(e&2){let e=t.$implicit,n=K(3);M(2),N(`data-method`,e.method),M(),Y(e.method),M(2),Y(e.path),M(4),Y(n.dir(e.file)),M(),Y(n.base(e.file)),M(2),N(`aria-label`,`Try `+e.method+` `+e.path)}}function tB(e,t){e&1&&(z(0,`tr`)(1,`td`,44),J(2,` No API routes. Add a handler under src/server/routes to test it here. `),B()())}function nB(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`span`,67),J(3),B()(),z(4,`td`,29),J(5),B(),z(6,`td`)(7,`span`,39)(8,`span`,43),J(9),B(),J(10),B()(),z(11,`td`,77),J(12),B()()),e&2){let e=t.$implicit,n=K(4);M(2),N(`data-method`,e.method),M(),Y(e.method),M(2),Y(e.name),M(4),Y(n.dir(e.file)),M(),Y(n.base(e.file)),M(2),Y(n.fnCalls(e.id))}}function rB(e,t){if(e&1&&(z(0,`h2`),J(1,`Server functions`),B(),z(2,`div`,76)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,27),J(7,`Method`),B(),z(8,`th`,27),J(9,`Name`),B(),z(10,`th`,27),J(11,`File`),B(),z(12,`th`,64),J(13,`Calls`),B()()(),z(14,`tbody`),I(15,nB,13,6,`tr`,null,tz),B()()()),e&2){let e=K(3);M(15),L(e.serverFns())}}function iB(e,t){if(e&1&&(z(0,`p`,59),J(1),B()),e&2){let e=K(3);M(),Y(e.callsOff)}}function aB(e,t){if(e&1&&(z(0,`p`,60),J(1),B()),e&2){let e=K(3);M(),X(` Tick "This request can change data on the dev server" below to send a `,e.method(),` request. `)}}function oB(e,t){if(e&1){let e=W();z(0,`label`,78),J(1,`JSON body`),B(),z(2,`textarea`,79),G(`input`,function(t){return k(e),A(K(3).apiBody.set(t.target.value))}),B(),z(3,`label`,80)(4,`input`,81),G(`change`,function(){k(e);let t=K(3);return A(t.confirmSend.set(!t.confirmSend()))}),B(),J(5,` This request can change data on the dev server`),B()}if(e&2){let e=K(3);M(2),R(`value`,e.apiBody()),M(2),R(`checked`,e.confirmSend())}}function sB(e,t){if(e&1&&(z(0,`p`,61),J(1),B()),e&2){let e=K(3);M(),Z(`Sending `,e.method(),` `,e.apiPath().trim(),`…`)}}function cB(e,t){if(e&1&&(z(0,`div`,55)(1,`span`,82),J(2,`Refused`),B(),z(3,`span`),J(4),B()()),e&2){let e=K();M(4),Y(e.error)}}function lB(e,t){if(e&1&&(z(0,`div`,55)(1,`span`,69),J(2),B(),z(3,`span`,4),J(4),B()(),z(5,`pre`,72),J(6),B()),e&2){let e=K(),t=K(3);M(),N(`data-status`,t.statusClass(e.status??0)),M(),Y(e.status),M(2),Z(``,e.ms,` ms · `,e.type||`no content type`),M(2),Y(t.pretty(e.body??``))}}function uB(e,t){e&1&&(z(0,`div`,62),P(1,cB,5,1,`div`,55)(2,lB,7,5),B()),e&2&&(M(),F(t.error?1:2))}function dB(e,t){if(e&1){let e=W();P(0,Iz,7,0,`div`,45),P(1,Rz,7,0,`div`,45),z(2,`div`,46)(3,`fieldset`,47)(4,`legend`,48),J(5,`Show calls of kind`),B(),I(6,zz,5,5,`label`,49,wg),B(),z(8,`button`,50),G(`click`,function(){return k(e),A(K(2).clearCalls())}),J(9,` Clear calls `),B()(),P(10,Xz,19,0,`div`,51)(11,$z,6,1,`div`,52),z(12,`h2`),J(13,`API routes`),B(),z(14,`div`,53)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,27),J(19,`Method`),B(),z(20,`th`,27),J(21,`Path`),B(),z(22,`th`,27),J(23,`File`),B(),z(24,`th`,27)(25,`span`,48),J(26,`Actions`),B()()()(),z(27,`tbody`),I(28,eB,14,6,`tr`,null,iz,!1,tB,3,0,`tr`),B()()(),P(31,rB,17,0),z(32,`form`,54),G(`submit`,function(t){k(e);let n=K(2);return t.preventDefault(),A(n.send())}),z(33,`h2`),J(34,`Request playground`),B(),z(35,`div`,55)(36,`app-select`,56),G(`valueChange`,function(t){return k(e),A(K(2).method.set(t??`GET`))}),B(),z(37,`label`,57),J(38,`Path`),B(),z(39,`input`,58),G(`input`,function(t){return k(e),A(K(2).apiPath.set(t.target.value))}),B(),z(40,`button`,20),J(41),B()(),P(42,iB,2,1,`p`,59)(43,aB,2,1,`p`,60),P(44,oB,6,2),P(45,sB,2,2,`p`,61)(46,uB,3,1,`div`,62),B()}if(e&2){let e,t=K(2);F(t.duplicates().length?0:-1),M(),F(t.refetchedFns().length?1:-1),M(5),L(t.kinds),M(2),R(`disabled`,!t.allCalls().length),M(2),F(t.calls().length?10:11),M(18),L(t.project().api),M(3),F(t.serverFns().length?31:-1),M(5),R(`options`,t.methodOptions)(`value`,t.method()),M(3),R(`value`,t.apiPath()),M(),R(`disabled`,!t.canSend()),N(`aria-describedby`,t.sendHintId()),M(),X(` `,t.sending()?`Sending…`:`Send`,` `),M(),F(t.canCall()?t.needsConfirm()?43:-1:42),M(2),F(t.method()===`GET`?-1:44),M(),F(t.sending()?45:(e=t.response())?46:-1,e)}}function fB(e,t){if(e&1&&(z(0,`span`,32),J(1),B()),e&2){let e=t.$implicit;N(`data-mode`,e.mode),M(),Z(``,e.label,` · `,e.count)}}function pB(e,t){if(e&1&&(z(0,`div`,31),I(1,fB,2,3,`span`,32,oz),B()),e&2){let e=K(3);M(),L(e.modeCounts())}}function mB(e,t){e&1&&(z(0,`span`,87),J(1,`differs from config`),B())}function hB(e,t){if(e&1&&(z(0,`div`,40)(1,`span`,69),J(2),B(),z(3,`span`,86),J(4),B(),P(5,mB,2,0,`span`,87),B()),e&2){let e=t,n=K().$implicit,r=K(3);M(),N(`data-status`,r.statusClass(e.status)),M(),Y(e.status),M(2),Z(``,e.render===`client`?`client only`:`server rendered`,` · `,e.ms,` ms`),M(),F(r.mismatch(n)?5:-1)}}function gB(e,t){e&1&&(z(0,`span`,85),J(1,`not requested yet`),B())}function _B(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.file)),M(),Y(t.base(e.file))}}function vB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),J(2),B(),z(3,`td`)(4,`div`,40)(5,`span`,32),J(6),B(),z(7,`span`,85),J(8),B()()(),z(9,`td`),P(10,hB,6,5,`div`,40)(11,gB,2,0,`span`,85),B(),z(12,`td`),P(13,_B,4,2,`span`,39),B()()),e&2){let e,n=t.$implicit,r=K(3);M(2),Y(n.path),M(3),N(`data-mode`,n.mode),M(),Y(r.modeLabel(n.mode)),M(2),Y(n.reason),M(2),F((e=n.last)?10:11,e),M(3),F(n.file?13:-1)}}function yB(e,t){e&1&&(z(0,`tr`)(1,`td`,44),J(2,` No page routes to render yet. Add a .page.ts file under src/app/pages. `),B()())}function bB(e,t){e&1&&(z(0,`p`,4),J(1,` prerender.routes is a function, so the list is known only at build time. `),B())}function xB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function SB(e,t){e&1&&(z(0,`span`,85),J(1,`default, nothing configured`),B())}function CB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function wB(e,t){if(e&1&&(z(0,`dt`),J(1,`From routeRules`),B(),z(2,`dd`),I(3,CB,2,1,`span`,33,wg),B()),e&2){let e=K(2);M(3),L(e.fromRules)}}function TB(e,t){if(e&1&&(z(0,`span`,90),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function EB(e,t){if(e&1&&(z(0,`dt`),J(1,`Static, not listed`),B(),z(2,`dd`),I(3,TB,2,1,`span`,90,wg),B()),e&2){let e=K(2);M(3),L(e.staticMissing)}}function DB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function OB(e,t){if(e&1&&(z(0,`dt`),J(1,`Need explicit entries`),B(),z(2,`dd`),I(3,DB,2,1,`span`,33,wg),B()),e&2){let e=K(2);M(3),L(e.dynamic)}}function kB(e,t){if(e&1&&(z(0,`span`,91),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function AB(e,t){if(e&1&&(J(0,` · missing `),I(1,kB,2,1,`span`,91,wg)),e&2){let e=K(3);M(),L(e.notBuilt)}}function jB(e,t){if(e&1&&(J(0),P(1,AB,3,0)),e&2){let e=K(2);X(` `,e.built.length,` page(s) in dist/analog/public `),M(),F(e.notBuilt.length?1:-1)}}function MB(e,t){e&1&&(z(0,`span`,85),J(1,`no build yet`),B())}function NB(e,t){if(e&1&&(z(0,`dl`,88)(1,`dt`),J(2,`Listed`),B(),z(3,`dd`),I(4,xB,2,1,`span`,33,wg),P(6,SB,2,0,`span`,85),B(),P(7,wB,5,0),P(8,EB,5,0),P(9,OB,5,0),z(10,`dt`),J(11,`Build output`),B(),z(12,`dd`,89),P(13,jB,2,2)(14,MB,2,0,`span`,85),B()()),e&2){let e=K();M(4),L(e.listed??av(5,ez)),M(2),F(e.listed?-1:6),M(),F(e.fromRules?.length?7:-1),M(),F(e.staticMissing.length?8:-1),M(),F(e.dynamic.length?9:-1),M(4),F(e.built.length?13:14)}}function PB(e,t){e&1&&(z(0,`div`,84)(1,`h2`),J(2,`Prerender plan`),B(),P(3,bB,2,0,`p`,4)(4,NB,15,6,`dl`,88),B()),e&2&&(M(3),F(t.dynamicConfig?3:4))}function FB(e,t){if(e&1&&(P(0,pB,3,0,`div`,31),z(1,`div`,83)(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,27),J(6,`Route`),B(),z(7,`th`,27),J(8,`Configured`),B(),z(9,`th`,27),J(10,`Last request`),B(),z(11,`th`,27),J(12,`File`),B()()(),z(13,`tbody`),I(14,vB,14,6,`tr`,null,az,!1,yB,3,0,`tr`),B()()(),P(17,PB,5,1,`div`,84)),e&2){let e,t=K(2);F(t.modeCounts().length?0:-1),M(14),L(t.renderRows()),M(3),F((e=t.plan())?17:-1,e)}}function IB(e,t){if(e&1&&(z(0,`div`)(1,`span`,94),J(2),B()()),e&2){let e=K().$implicit;M(2),Y(e.error)}}function LB(e,t){if(e&1&&(z(0,`div`)(1,`span`,87),J(2),B()()),e&2){let e=K(5);M(2),X(`takes over `,e.base(t))}}function RB(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`strong`),J(3),B(),P(4,IB,3,1,`div`),P(5,LB,3,1,`div`),B(),z(6,`td`,37),J(7),B(),z(8,`td`,29),J(9),B(),z(10,`td`,93),J(11),B(),z(12,`td`)(13,`span`,39)(14,`span`,43),J(15),B(),J(16),B()()()),e&2){let e,n=t.$implicit,r=K(4);M(3),Y(n.attributes.title||`(no title)`),M(),F(n.error?4:-1),M(),F((e=r.shadowed(n.file))?5:-1,e),M(2),Y(r.contentUrl(n.file)??``),M(2),Y(n.slug),M(2),Y(n.attributes.date||``),M(4),Y(r.dir(n.file)),M(),Y(r.base(n.file))}}function zB(e,t){if(e&1&&(z(0,`div`,92)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,27),J(5,`Title`),B(),z(6,`th`,27),J(7,`URL`),B(),z(8,`th`,27),J(9,`Slug`),B(),z(10,`th`,27),J(11,`Date`),B(),z(12,`th`,27),J(13,`File`),B()()(),z(14,`tbody`),I(15,RB,17,8,`tr`,null,sz),B()()()),e&2){let e=K(3);M(15),L(e.project().content)}}function BB(e,t){e&1&&(z(0,`div`,52)(1,`p`,73),J(2,`No markdown files under src/content.`),B(),z(3,`p`,4),J(4,` Add a .md file there to see its title, slug, date and the URL it serves. `),B()())}function VB(e,t){e&1&&P(0,zB,17,0,`div`,92)(1,BB,5,0,`div`,52),e&2&&F(+!K(2).project().content.length)}function HB(e,t){if(e&1&&(z(0,`span`,15),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.items.length)}}function UB(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(5);M(2),Y(t.dir(e.file)),M(),Y(t.base(e.file))}}function WB(e,t){if(e&1&&(z(0,`span`,37),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.path)}}function GB(e,t){if(e&1&&(z(0,`p`,102),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.message)}}function KB(e,t){if(e&1&&(z(0,`li`),P(1,UB,4,2,`span`,39),P(2,WB,2,1,`span`,37),P(3,GB,2,1,`p`,102),B()),e&2){let e=t.$implicit;M(),F(e.file?1:-1),M(),F(e.path&&e.path!==e.file?2:-1),M(),F(e.message?3:-1)}}function qB(e,t){if(e&1&&(z(0,`li`)(1,`div`,97)(2,`span`,32),J(3),B(),z(4,`strong`,98),J(5),B(),P(6,HB,2,1,`span`,15),B(),z(7,`p`),J(8),B(),z(9,`ul`,99),I(10,KB,4,3,`li`,null,Cg),B(),z(12,`div`,100)(13,`strong`),J(14,`How to fix`),B(),J(15),B(),z(16,`span`,101),J(17),B()()),e&2){let e=t.$implicit,n=K(4);N(`data-tone`,n.tone(e.severity)),M(2),N(`data-tone`,n.tone(e.severity)),M(),Y(e.severity),M(2),Y(e.title),M(),F(e.items.length>1?6:-1),M(2),Y(e.summary),M(2),L(e.items),M(5),X(` `,e.fix),M(2),Y(e.rule)}}function JB(e,t){if(e&1&&(z(0,`p`,4),J(1),B(),z(2,`ul`,96),I(3,qB,18,8,`li`,null,cz),B()),e&2){let e=K(3);M(),Z(` `,e.findings().length,` issue(s) in `,e.lintCards().length,` group(s). Each card says what is wrong, where, and how to fix it. `),M(2),L(e.lintCards())}}function YB(e,t){e&1&&(z(0,`div`,95)(1,`strong`),J(2,`No Analog problems found.`),B(),J(3,` Routes, server files, prerender config and content all check out. `),B())}function XB(e,t){e&1&&P(0,JB,5,2)(1,YB,4,0,`div`,95),e&2&&F(+!K(2).findings().length)}function ZB(e,t){if(e&1){let e=W();z(0,`section`,5)(1,`div`,6)(2,`span`,7),J(3,`Analog`),B(),z(4,`span`,8),J(5),B()(),z(6,`div`,6)(7,`span`,7),J(8,`Pages`),B(),z(9,`span`,8),J(10),B()(),z(11,`div`,6)(12,`span`,7),J(13,`API routes`),B(),z(14,`span`,8),J(15),B()(),z(16,`div`,6)(17,`span`,7),J(18,`Server calls`),B(),z(19,`span`,8),J(20),B()(),z(21,`div`,6)(22,`span`,7),J(23,`Issues`),B(),z(24,`span`,8),J(25),B()(),P(26,dz,5,2,`div`,9),B(),z(27,`div`,10),G(`keydown`,function(t){return k(e),A(K().onKey(t))}),I(28,fz,4,7,`button`,11,tz),B(),z(30,`div`,12),P(31,Pz,29,6)(32,dB,47,15)(33,FB,18,3)(34,VB,2,1)(35,XB,2,1),B()}if(e&2){let e,t,n=K();M(5),Y(n.project().version||`unknown`),M(5),Y(n.pageCount()),M(5),Y(n.project().api.length),M(5),Y(n.allCalls().length),M(),N(`data-tone`,n.findings().length?`warn`:`good`),M(4),Y(n.findings().length),M(),F((e=n.page())?26:-1,e),M(2),L(n.views()),M(2),R(`id`,`analog-panel-`+n.view()),N(`aria-labelledby`,`analog-tab-`+n.view()),M(),F((t=n.view())===`routes`?31:t===`server`?32:t===`render`?33:t===`content`?34:t===`lint`?35:-1)}}var QB={"scan-error":{title:`A folder could not be read`,summary:`Its files are missing from routes, API routes and lint results.`},"duplicate-url":{title:`Two files serve the same URL`,summary:`Only one of them is reachable; the other never renders.`},"sibling-params":{title:`Two dynamic pages in one folder`,summary:`Both are [param] pages at the same level, so the first one always wins.`},"missing-default-export":{title:`Page has no default export`,summary:`Analog needs the component as the default export, so the page renders nothing.`},"redirect-with-component":{title:`Redirect page also exports a component`,summary:`The redirect runs first, so the component never shows.`},"redirect-path-match":{title:`Redirect matches too much`,summary:`An empty-path redirect without pathMatch "full" catches every URL below it.`},"layout-without-outlet":{title:`Layout has no router-outlet`,summary:`The layout has child pages, but without they never render.`},"server-without-load":{title:`.server.ts without load or action`,summary:`The server file exports no load, action or server function, so Analog calls nothing.`},"orphan-server-file":{title:`.server.ts without a page`,summary:`No page file sits next to it, so its load never runs.`},"api-method-suffix":{title:`Unknown method suffix on an API file`,summary:`The suffix is not an HTTP method, so it becomes part of the URL.`},"duplicate-api-route":{title:`Two handlers for one API route`,summary:`Two files answer the same method and path.`},"api-outside-prefix":{title:`Server route outside the API prefix`,summary:`During vite dev only routes under the prefix reach Nitro.`},"prerender-unknown-route":{title:`Prerender entry matches no page`,summary:`prerender.routes lists a path that no page file serves.`},"prerender-missing-root":{title:`Home page is not prerendered`,summary:`static is on, but prerender.routes leaves out /.`},"content-frontmatter":{title:`Broken frontmatter`,summary:`The markdown frontmatter cannot be read.`},"duplicate-slug":{title:`Two posts share a slug`,summary:`injectContent picks one of them at random.`},"content-shadows-page":{title:`Markdown file takes over a page`,summary:`Files under src/content are routes too, so these URLs render the markdown file instead of the [param] page.`},"load-fetched-twice":{title:`load() runs twice`,summary:`These pages fetched their data while rendering on the server and again in the browser.`},"fn-fetched-twice":{title:`Server function read runs twice`,summary:`These reads ran while rendering on the server and again in the browser right after hydration.`},"restart-needed":{title:`New pages need a restart`,summary:`These page files exist, but the running router does not know them yet.`},"hydration-error":{title:`Hydration error`,summary:`The browser DOM did not match the server HTML.`},"api-not-found":{title:`API call failed with 404 or 405`,summary:`A request hit a path or method that no server route handles.`}},$B=new Set([`missing-default-export`,`redirect-with-component`,`redirect-path-match`,`layout-without-outlet`,`server-without-load`,`orphan-server-file`,`load-fetched-twice`,`restart-needed`,`prerender-missing-root`]),eV={ssr:`SSR`,ssg:`Prerendered`,client:`Client only`,cached:`Cached`,redirect:`Redirect`},tV={all:`All`,page:`Pages`,load:`load()`,action:`Actions`,fn:`Server fn`,api:`API`},nV={success:`succeeded`,redirect:`redirected`,invalid:`validation errors`,error:`failed`},rV={success:`good`,redirect:`info`,invalid:`warn`,error:`bad`};function iV(e,t=0,n=[]){for(let r of e)n.push({route:r,depth:t}),iV(r.children,t+1,n);return n}var aV=class e{rpc=$(null);canCall=Q(()=>nE(this.rpc(),`analog`));callsOff=HT(`analog`);kinds=[`all`,`page`,`load`,`action`,`fn`,`api`];methods=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];methodOptions=this.methods.map(e=>({value:e,label:e}));view=j(`routes`);project=j(null);state=j({});findings=j([]);renderRows=j([]);plan=j(null);filter=j(``);testUrl=j(``);explained=j(null);explainError=j(``);explaining=j(!1);kind=j(`all`);method=j(`GET`);apiPath=j(``);apiBody=j(``);confirmSend=j(!1);response=j(null);sending=j(!1);needsConfirm=Q(()=>this.method()!==`GET`&&!this.confirmSend());canSend=Q(()=>this.canCall()&&!this.sending()&&!this.needsConfirm());sendHintId=Q(()=>this.canCall()?this.needsConfirm()?`analog-confirm-hint`:null:`analog-calls-off`);unsubscribe=null;refreshTimer;refreshRun=0;destroyRef=E(Cs);page=Q(()=>this.state().pages?.[0]??null);openFiles=Q(()=>new Set((this.page()?.chain??[]).map(e=>e.file)));allCalls=Q(()=>this.state().calls??[]);calls=Q(()=>{let e=this.kind();return this.allCalls().filter(t=>e===`all`||t.kind===e).slice(-150).reverse()});allRoutes=Q(()=>iV(this.project()?.routes??[]));pageCount=Q(()=>this.allRoutes().filter(e=>e.route.file&&e.route.kind!==`layout`).length);routeRows=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.allRoutes().filter(t=>t.route.fullPath.toLowerCase().includes(e)||!!t.route.file?.toLowerCase().includes(e)):this.allRoutes()});serverFns=Q(()=>this.project()?.serverFns??[]);fnById=Q(()=>new Map(this.serverFns().map(e=>[e.id,e])));refetchedFns=Q(()=>Array.from(new Set((this.state().refetches??[]).map(e=>this.fnById().get(e.id)?.name??e.id))));duplicates=Q(()=>Array.from(new Set((this.state().duplicates??[]).map(e=>e.route))));modeCounts=Q(()=>[`ssr`,`ssg`,`cached`,`client`,`redirect`].map(e=>({mode:e,label:eV[e],count:this.renderRows().filter(t=>t.mode===e).length})).filter(e=>e.count));lintCards=Q(()=>{let e={error:0,warning:1,info:2},t=new Map;for(let e of this.findings()){let n=t.get(e.rule);if(!n){let r=QB[e.rule];n={rule:e.rule,severity:e.severity,title:r?.title??e.rule,summary:r?.summary??e.message,fix:e.fix,items:[]},t.set(e.rule,n)}let r=$B.has(e.rule)||e.message===n.summary?void 0:e.message;n.items.some(t=>t.file===e.file&&t.path===e.path&&t.message===r)||n.items.push({file:e.file,path:e.path,message:r})}return Array.from(t.values()).sort((t,n)=>e[t.severity]-e[n.severity])});views=Q(()=>{let e=this.findings().length;return[{id:`routes`,label:`Routes`,count:this.pageCount(),tone:``},{id:`server`,label:`Server`,count:this.allCalls().length,tone:``},{id:`render`,label:`Render`,count:this.renderRows().length,tone:``},{id:`content`,label:`Content`,count:this.project()?.content.length??0,tone:``},{id:`lint`,label:`Lint`,count:e,tone:e?`warn`:``}]});constructor(){uc(()=>{let e=this.rpc();e&&Sv(()=>void this.load(e))}),uc(()=>{let e=this.view();this.state(),Sv(()=>this.scheduleRefresh(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.refreshTimer)})}async load(e){let t=await $T(e,`analog-project`);if(!this.destroyRef.destroyed){this.project.set(t);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`analog`);if(this.destroyRef.destroyed)return;let n=e=>this.state.set(e??{});n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.state.set({})}this.destroyRef.destroyed||await this.refresh(this.view())}}scheduleRefresh(e){clearTimeout(this.refreshTimer),this.refreshTimer=setTimeout(()=>void this.refresh(e),300)}async refresh(e){let t=this.rpc();if(!t)return;let n=++this.refreshRun,[r,i]=await Promise.all([$T(t,`analog-lint`),$T(t,`analog-render`)]);if(n===this.refreshRun&&(this.findings.set(r??[]),this.renderRows.set(i?.rows??[]),this.plan.set(i?.plan??null),e===`routes`||e===`content`)){let e=await $T(t,`analog-project`);e&&n===this.refreshRun&&this.project.set(e)}}isOpen(e){return!!e.file&&this.openFiles().has(e.file)}kindText(e){return e.catchAll?e.catchAll===`optional`?`optional catch-all`:`catch-all`:e.kind===`implicit`?`folder`:e.kind}serverExports(e){return(e.serverExports??[]).filter(e=>e===`load`||e===`action`)}short(e){return e?.replace(/^\/src\/app\//,``).replace(/^\//,``)}dir(e){let t=this.short(e)??e;return t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)+1):``}base(e){return e.slice(e.lastIndexOf(`/`)+1)}paramList(e){return Object.entries(e)}kindLabel(e){return tV[e]}kindCount(e){return e===`all`?this.allCalls().length:this.allCalls().filter(t=>t.kind===e).length}modeLabel(e){return eV[e]}mismatch(e){return!e.last?.render||e.mode===`redirect`?!1:e.mode===`client`?e.last.render!==`client`:e.last.render===`client`}fnOf(e){return e.kind===`fn`&&e.route?this.fnById().get(e.route):void 0}fnCalls(e){return this.allCalls().filter(t=>t.kind===`fn`&&t.route===e).length}outcomeLabel(e){return nV[e]}outcomeTone(e){return rV[e]}statusClass(e){return e>=500||e===0?`bad`:e>=400?`warn`:`good`}tone(e){return e===`error`?`bad`:e===`warning`?`warn`:`info`}shadowed(e){return this.findings().find(t=>t.rule===`content-shadows-page`&&t.file===e)?.message.match(/(\/\S+\.page\.ts)/)?.[1]}contentUrl(e){return this.allRoutes().find(t=>t.route.file===e)?.route.fullPath}pretty(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}time=rD;tryApi(e){this.method.set(e.method===`ANY`?`GET`:e.method),this.apiPath.set(e.path.replace(/:(\w+)/g,`1`).replace(`**`,`x`)),this.response.set(null),queueMicrotask(()=>document.getElementById(`api-path`)?.focus())}async clearCalls(){await $T(this.rpc(),`analog-clear-calls`)}async explain(){let e=this.testUrl().trim();if(!e){this.explained.set(null),this.explainError.set(`Type a URL to explain, for example /products/42.`);return}this.explaining.set(!0),this.explainError.set(``);try{let t=await QT(this.rpc(),`analog-explain-url`,e);if(!t)throw Error(`The devtools server did not answer`);this.explained.set({url:e,match:t})}catch(t){let n=String(t?.message||`The devtools server did not answer`);this.explained.set(null),this.explainError.set(`Could not explain ${e}. ${n.replace(/\.?$/,`.`)}`)}finally{this.explaining.set(!1)}}async send(){let e=this.apiPath().trim();if(!e||this.sending()||this.needsConfirm())return;let t;if(this.method()!==`GET`&&this.apiBody().trim())try{t=JSON.parse(this.apiBody())}catch{this.response.set({error:`The body is not valid JSON.`});return}this.response.set(null),this.sending.set(!0);try{let n=await $T(this.rpc(),`analog-call-api`,{method:this.method(),path:e,body:t,confirm:this.confirmSend()});this.response.set(n??{error:`No answer from the devtools server.`})}finally{this.sending.set(!1)}}onKey(e){let t=this.views().map(e=>e.id),n=t.indexOf(this.view()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.view.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#analog-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-analog-inspector`]],inputs:{rpc:[1,`rpc`]},decls:3,vars:1,consts:[[`role`,`status`,1,`loading`],[1,`empty`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`aria-label`,`Analog summary`,1,`summary`],[1,`stat`],[1,`label`],[1,`value`],[1,`stat`,`wide`],[`role`,`tablist`,`aria-label`,`Analog views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[1,`value`,`mono`,3,`title`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`count`],[1,`toolbar`],[1,`inline`,`explain`,3,`submit`],[`for`,`analog-url`],[`id`,`analog-url`,`type`,`text`,`placeholder`,`/products/42`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`for`,`route-filter`,1,`sr-only`],[`id`,`route-filter`,`type`,`search`,`placeholder`,`Filter by path or file`,1,`field`,`filter`,3,`input`,`value`],[`role`,`status`,1,`explain-result`],[`data-tone`,`bad`,1,`callout`],[1,`callout`],[`role`,`region`,`aria-label`,`File routes`,`tabindex`,`0`,1,`table-wrap`],[`scope`,`col`],[3,`open`,`dim`],[1,`mono`],[1,`chain`],[1,`chips`],[1,`pill`],[1,`chip`,`mono`],[1,`plain`],[1,`route`],[`aria-hidden`,`true`,1,`guide`],[1,`mono`,`path`],[1,`pill`,`live`],[1,`file`],[1,`meta`],[`data-kind`,`load`,1,`pill`],[1,`chip`],[1,`dir`],[`colspan`,`4`,1,`empty-row`],[`data-tone`,`warn`,`role`,`note`,1,`callout`],[1,`calls-bar`],[1,`segmented`],[1,`sr-only`],[3,`on`],[`type`,`button`,1,`btn`,`ghost`,3,`click`,`disabled`],[`role`,`region`,`aria-label`,`Server calls`,`tabindex`,`0`,1,`table-wrap`],[1,`empty-box`],[`role`,`region`,`aria-label`,`API routes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`,`playground`,3,`submit`],[1,`row`],[`ariaLabel`,`Method`,1,`method-select`,3,`valueChange`,`options`,`value`],[`for`,`api-path`,1,`sr-only`],[`id`,`api-path`,`type`,`text`,`placeholder`,`/api/v1/products`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`id`,`analog-calls-off`,1,`muted`],[`id`,`analog-confirm-hint`,1,`muted`],[`role`,`status`,1,`muted`],[`role`,`status`,1,`response`],[`type`,`radio`,`name`,`analog-kind`,1,`sr-only`,3,`change`,`checked`],[`scope`,`col`,1,`num`],[1,`muted`,`nowrap`],[1,`request`],[1,`method`],[1,`mono`,`url`],[1,`status`],[1,`num`,`nowrap`],[1,`mono`,`muted`],[1,`code`],[1,`empty-lead`],[1,`actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`],[`role`,`region`,`aria-label`,`Server functions`,`tabindex`,`0`,1,`table-wrap`],[1,`num`,`tnum`],[`for`,`api-body`],[`id`,`api-body`,`rows`,`3`,`placeholder`,`{"name": "Ada"}`,1,`field`,`mono`,3,`input`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`data-status`,`bad`,1,`status`],[`role`,`region`,`aria-label`,`Render modes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`],[1,`muted`,`small`],[1,`muted`,`small`,`tnum`],[`data-tone`,`warn`,1,`pill`],[1,`facts`],[1,`tnum`],[`data-tone`,`warn`,1,`chip`,`mono`],[`data-tone`,`bad`,1,`chip`,`mono`],[`role`,`region`,`aria-label`,`Content files`,`tabindex`,`0`,1,`table-wrap`],[1,`muted`,`nowrap`,`tnum`],[`data-tone`,`bad`,1,`pill`],[`data-tone`,`good`,`role`,`status`,1,`callout`],[1,`findings`],[1,`finding-head`],[1,`finding-title`],[1,`where`],[1,`fix`],[1,`rule`,`mono`],[1,`detail`]],template:function(e,t){e&1&&P(0,lz,4,0,`div`,0)(1,uz,14,0,`div`,1)(2,ZB,36,10),e&2&&F(t.project()===null?0:t.project().analog?2:1)},dependencies:[XE],styles:[`@charset "UTF-8"; +}`]})},Ez=()=>[],Dz=()=>[`/`],Oz=(e,t)=>t.id,kz=(e,t)=>t.route.id,Az=(e,t)=>t[0],jz=(e,t)=>t.file+t.method,Mz=(e,t)=>t.path,Nz=(e,t)=>t.mode,Pz=(e,t)=>t.file,Fz=(e,t)=>t.rule;function Iz(e,t){e&1&&(z(0,`div`,0),V(1,`span`,2),z(2,`span`),J(3,`Reading the project…`),B()())}function Lz(e,t){e&1&&(z(0,`div`,1)(1,`h2`,3),J(2,`This app is not an Analog app.`),B(),z(3,`p`,4),J(4,` Add `),z(5,`code`),J(6,`ngDevtools()`),B(),J(7,` from `),z(8,`code`),J(9,`@santoshyadavdev/ng-devtools/vite`),B(),J(10,` next to `),z(11,`code`),J(12,`analog()`),B(),J(13,` in vite.config.ts and run the Analog dev server. `),B()())}function Rz(e,t){if(e&1&&(z(0,`div`,9)(1,`span`,7),J(2,`Open in the browser`),B(),z(3,`span`,13),J(4),B()()),e&2){let e=t;M(3),R(`title`,e.url),M(),Y(e.url)}}function zz(e,t){if(e&1){let e=W();z(0,`button`,14),G(`click`,function(){let t=k(e).$implicit;return A(K(2).view.set(t.id))}),J(1),z(2,`span`,15),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);R(`id`,`analog-tab-`+e.id),N(`aria-selected`,e.id===n.view())(`aria-controls`,`analog-panel-`+e.id)(`tabindex`,e.id===n.view()?0:-1),M(),X(` `,e.label,` `),M(),N(`data-tone`,e.tone),M(),Y(e.count)}}function Bz(e,t){e&1&&(z(0,`div`,24),J(1),B()),e&2&&(M(),Y(t))}function Vz(e,t){if(e&1&&(z(0,`li`)(1,`span`,29),J(2),B(),z(3,`span`,32),J(4),B()()),e&2){let e=t.$implicit,n=K(5);M(2),Y(n.short(e.file)??e.fullPath),M(),N(`data-kind`,e.kind),M(),Y(e.kind)}}function Hz(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Z(``,e[0],` = `,e[1])}}function Uz(e,t){if(e&1&&(z(0,`div`,31),I(1,Hz,2,2,`span`,33,Az),B()),e&2){let e=K(2),t=K(3);M(),L(t.paramList(e.match.params))}}function Wz(e,t){if(e&1&&(z(0,`strong`,29),J(1),B(),J(2,` renders `),z(3,`ol`,30),I(4,Vz,5,3,`li`,null,Oz),B(),P(6,Uz,3,0,`div`,31)),e&2){let e=K(),t=K(3);M(),Y(e.url),M(3),L(e.match.chain),M(2),F(t.paramList(e.match.params).length?6:-1)}}function Gz(e,t){if(e&1&&(z(0,`li`)(1,`span`,29),J(2),B(),z(3,`span`,4),J(4),B()()),e&2){let e=t.$implicit,n=K(6);M(2),Y(n.short(e.file)??e.path),M(2),Y(e.reason)}}function Kz(e,t){if(e&1&&(z(0,`ul`,34),I(1,Gz,5,2,`li`,null,Cg),B()),e&2){let e=K(2);M(),L(e.match.rejected.slice(0,5))}}function qz(e,t){if(e&1&&(z(0,`strong`,29),J(1),B(),J(2,` matches no file route. Angular throws NG04002 "Cannot match any routes". `),P(3,Kz,3,0,`ul`,34)),e&2){let e=K();M(),Y(e.url),M(2),F(e.match.rejected.length?3:-1)}}function Jz(e,t){if(e&1&&(z(0,`div`,25),P(1,Wz,7,2)(2,qz,4,2),B()),e&2){let e=t;N(`data-tone`,e.match.matched?`good`:`bad`),M(),F(e.match.matched?1:2)}}function Yz(e,t){e&1&&(z(0,`span`,36),J(1,`└`),B())}function Xz(e,t){e&1&&(z(0,`span`,38),J(1,`open`),B())}function Zz(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.route.file)),M(),Y(t.base(e.route.file))}}function Qz(e,t){e&1&&(z(0,`span`,4),J(1,`folder only`),B())}function $z(e,t){if(e&1&&(z(0,`span`,41),J(1),B()),e&2){let e=t.$implicit;M(),X(``,e,`()`)}}function eB(e,t){if(e&1&&(z(0,`span`,42),J(1),B()),e&2){let e=K().$implicit;M(),X(`"`,e.route.title,`"`)}}function tB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=K().$implicit;M(),Y(e)}}function nB(e,t){if(e&1&&P(0,tB,2,1,`span`,33),e&2){let e=t.$implicit;F(e===`title`?-1:0)}}function rB(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`div`,35),P(3,Yz,2,0,`span`,36),z(4,`span`,37),J(5),B(),z(6,`span`,32),J(7),B(),P(8,Xz,2,0,`span`,38),B()(),z(9,`td`),P(10,Zz,4,2,`span`,39)(11,Qz,2,0,`span`,4),B(),z(12,`td`)(13,`div`,40),I(14,$z,2,1,`span`,41,wg),B()(),z(16,`td`),P(17,eB,2,1,`span`,42),I(18,nB,1,1,null,null,wg),B()()),e&2){let e=t.$implicit,n=K(3);q(`open`,n.isOpen(e.route))(`dim`,e.route.kind===`group`||e.route.kind===`implicit`),M(2),C_(`padding-left`,e.depth*16,`px`),M(),F(e.depth?3:-1),M(2),Y(e.route.fullPath),M(),N(`data-kind`,e.route.kind),M(),Y(n.kindText(e.route)),M(),F(n.isOpen(e.route)?8:-1),M(2),F(e.route.file?10:11),M(4),L(n.serverExports(e.route)),M(3),F(e.route.title?17:-1),M(),L(e.route.routeMeta??ov(13,Ez))}}function iB(e,t){e&1&&J(0,` No route matches the filter. Try part of a path or a file name. `)}function aB(e,t){e&1&&J(0,` No file routes yet. Add a .page.ts file under src/app/pages. `)}function oB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,44),P(2,iB,1,0)(3,aB,1,0),B()()),e&2){let e=K(3);M(2),F(e.filter().trim()?2:3)}}function sB(e,t){if(e&1){let e=W();z(0,`div`,16)(1,`form`,17),G(`submit`,function(t){k(e);let n=K(2);return t.preventDefault(),A(n.explain())}),z(2,`label`,18),J(3,`Test a URL`),B(),z(4,`input`,19),G(`input`,function(t){return k(e),A(K(2).testUrl.set(t.target.value))}),B(),z(5,`button`,20),J(6),B()(),z(7,`label`,21),J(8,`Filter routes`),B(),z(9,`input`,22),G(`input`,function(t){return k(e),A(K(2).filter.set(t.target.value))}),B()(),z(10,`div`,23),P(11,Bz,2,1,`div`,24)(12,Jz,3,2,`div`,25),B(),z(13,`div`,26)(14,`table`)(15,`thead`)(16,`tr`)(17,`th`,27),J(18,`Route`),B(),z(19,`th`,27),J(20,`File`),B(),z(21,`th`,27),J(22,`Data`),B(),z(23,`th`,27),J(24,`Route meta`),B()()(),z(25,`tbody`),I(26,rB,20,14,`tr`,28,kz,!1,oB,4,1,`tr`),B()()()}if(e&2){let e,t=K(2);M(4),R(`value`,t.testUrl()),M(),R(`disabled`,t.explaining()),M(),X(` `,t.explaining()?`Explaining…`:`Explain`,` `),M(3),R(`value`,t.filter()),M(2),F((e=t.explainError())?11:(e=t.explained())?12:-1,e),M(15),L(t.routeRows())}}function cB(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function lB(e,t){if(e&1&&(z(0,`div`,45)(1,`strong`),J(2,`load() ran twice`),B(),J(3,` for `),I(4,cB,3,2,null,null,wg),J(6,` : once while server rendering, again in the browser. TransferState did not serve the server result. `),B()),e&2){let e=K(3);M(4),L(e.duplicates())}}function uB(e,t){if(e&1&&(z(0,`span`,29),J(1),B(),J(2)),e&2){let e=t.$implicit,n=t.$index,r=t.$count;M(),Y(e),M(),X(``,n===r-1?``:`, `,` `)}}function dB(e,t){if(e&1&&(z(0,`div`,45)(1,`strong`),J(2,`Server function read ran twice`),B(),J(3,`: `),I(4,uB,3,2,null,null,wg),J(6,` ran while server rendering, then again in the browser. The browser did not use the TransferState seed. `),B()),e&2){let e=K(3);M(4),L(e.refetchedFns())}}function fB(e,t){if(e&1){let e=W();z(0,`label`)(1,`input`,63),G(`change`,function(){let t=k(e).$implicit;return A(K(3).kind.set(t))}),B(),J(2),z(3,`span`,4),J(4),B()()}if(e&2){let e=t.$implicit,n=K(3);q(`on`,n.kind()===e),M(),R(`checked`,n.kind()===e),M(),X(` `,n.kindLabel(e),` `),M(2),Y(n.kindCount(e))}}function pB(e,t){if(e&1&&(z(0,`strong`,68),J(1),B(),z(2,`span`,71),J(3),B()),e&2){let e=t,n=K(5);M(),Y(e.name),M(2),Y(n.short(e.file))}}function mB(e,t){if(e&1&&(z(0,`span`,68),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.url)}}function hB(e,t){e&1&&(z(0,`span`,32),J(1,`ran during server rendering`),B())}function gB(e,t){if(e&1&&J(0),e&2){let e=K(2).$implicit;X(` to `,e.location,` `)}}function _B(e,t){if(e&1&&(z(0,`span`,32),J(1),P(2,gB,1,1),B()),e&2){let e=K().$implicit,t=K(4);N(`data-tone`,t.outcomeTone(e.outcome)),M(),X(``,t.outcomeLabel(e.outcome),` `),M(),F(e.location?2:-1)}}function vB(e,t){if(e&1&&(z(0,`span`,32),J(1),B()),e&2){let e=K().$implicit;N(`data-mode`,e.render===`ssr`?`ssr`:`client`),M(),Y(e.render===`ssr`?`server rendered`:`client only`)}}function yB(e,t){if(e&1&&(z(0,`details`)(1,`summary`),J(2,`Response`),B(),z(3,`pre`,72),J(4),B()()),e&2){let e=K().$implicit,t=K(4);M(4),Y(t.pretty(e.preview))}}function bB(e,t){e&1&&(z(0,`span`,4),J(1,`in process`),B())}function xB(e,t){if(e&1&&J(0),e&2){let e=K().$implicit;X(` `,e.ms,` ms `)}}function SB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,65),J(2),B(),z(3,`td`)(4,`span`,32),J(5),B()(),z(6,`td`,66)(7,`div`,40)(8,`span`,67),J(9),B(),P(10,pB,4,2)(11,mB,2,1,`span`,68),P(12,hB,2,0,`span`,32),P(13,_B,3,3,`span`,32),P(14,vB,2,2,`span`,32),B(),P(15,yB,5,1,`details`),B(),z(16,`td`)(17,`span`,69),J(18),B()(),z(19,`td`,70),P(20,bB,2,0,`span`,4)(21,xB,1,1),B(),z(22,`td`,4),J(23),B()()),e&2){let e,n=t.$implicit,r=K(4);M(2),Y(r.time(n.at)),M(2),N(`data-call`,n.kind),M(),Y(r.kindLabel(n.kind)),M(3),N(`data-method`,n.method),M(),Y(n.method),M(),F((e=r.fnOf(n))?10:11,e),M(2),F(n.seeded?12:-1),M(),F(n.outcome?13:-1),M(),F(n.render?14:-1),M(),F(n.preview?15:-1),M(2),N(`data-status`,r.statusClass(n.status)),M(),Y(n.status),M(2),F(n.seeded?20:21),M(3),Y(n.from)}}function CB(e,t){if(e&1&&(z(0,`div`,51)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,27),J(5,`At`),B(),z(6,`th`,27),J(7,`Kind`),B(),z(8,`th`,27),J(9,`Request`),B(),z(10,`th`,27),J(11,`Status`),B(),z(12,`th`,64),J(13,`Duration`),B(),z(14,`th`,27),J(15,`From`),B()()(),z(16,`tbody`),I(17,SB,24,14,`tr`,null,Oz),B()()()),e&2){let e=K(3);M(17),L(e.calls())}}function wB(e,t){e&1&&J(0,` No calls of this kind yet. `)}function TB(e,t){e&1&&J(0,` No calls yet. `)}function EB(e,t){if(e&1&&(z(0,`div`,52)(1,`p`,73),P(2,wB,1,0)(3,TB,1,0),B(),z(4,`p`,4),J(5,` Navigate in the app to see page renders, load() fetches, form actions, server functions and API calls. `),B()()),e&2){let e=K(3);M(2),F(e.allCalls().length?2:3)}}function DB(e,t){if(e&1){let e=W();z(0,`tr`)(1,`td`)(2,`span`,67),J(3),B()(),z(4,`td`,29),J(5),B(),z(6,`td`)(7,`span`,39)(8,`span`,43),J(9),B(),J(10),B()(),z(11,`td`,74)(12,`button`,75),G(`click`,function(){let t=k(e).$implicit;return A(K(3).tryApi(t))}),J(13,` Try `),B()()()}if(e&2){let e=t.$implicit,n=K(3);M(2),N(`data-method`,e.method),M(),Y(e.method),M(2),Y(e.path),M(4),Y(n.dir(e.file)),M(),Y(n.base(e.file)),M(2),N(`aria-label`,`Try `+e.method+` `+e.path)}}function OB(e,t){e&1&&(z(0,`tr`)(1,`td`,44),J(2,` No API routes. Add a handler under src/server/routes to test it here. `),B()())}function kB(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`span`,67),J(3),B()(),z(4,`td`,29),J(5),B(),z(6,`td`)(7,`span`,39)(8,`span`,43),J(9),B(),J(10),B()(),z(11,`td`,77),J(12),B()()),e&2){let e=t.$implicit,n=K(4);M(2),N(`data-method`,e.method),M(),Y(e.method),M(2),Y(e.name),M(4),Y(n.dir(e.file)),M(),Y(n.base(e.file)),M(2),Y(n.fnCalls(e.id))}}function AB(e,t){if(e&1&&(z(0,`h2`),J(1,`Server functions`),B(),z(2,`div`,76)(3,`table`)(4,`thead`)(5,`tr`)(6,`th`,27),J(7,`Method`),B(),z(8,`th`,27),J(9,`Name`),B(),z(10,`th`,27),J(11,`File`),B(),z(12,`th`,64),J(13,`Calls`),B()()(),z(14,`tbody`),I(15,kB,13,6,`tr`,null,Oz),B()()()),e&2){let e=K(3);M(15),L(e.serverFns())}}function jB(e,t){if(e&1&&(z(0,`p`,59),J(1),B()),e&2){let e=K(3);M(),Y(e.callsOff)}}function MB(e,t){if(e&1&&(z(0,`p`,60),J(1),B()),e&2){let e=K(3);M(),X(` Tick "This request can change data on the dev server" below to send a `,e.method(),` request. `)}}function NB(e,t){if(e&1){let e=W();z(0,`label`,78),J(1,`JSON body`),B(),z(2,`textarea`,79),G(`input`,function(t){return k(e),A(K(3).apiBody.set(t.target.value))}),B(),z(3,`label`,80)(4,`input`,81),G(`change`,function(){k(e);let t=K(3);return A(t.confirmSend.set(!t.confirmSend()))}),B(),J(5,` This request can change data on the dev server`),B()}if(e&2){let e=K(3);M(2),R(`value`,e.apiBody()),M(2),R(`checked`,e.confirmSend())}}function PB(e,t){if(e&1&&(z(0,`p`,61),J(1),B()),e&2){let e=K(3);M(),Z(`Sending `,e.method(),` `,e.apiPath().trim(),`…`)}}function FB(e,t){if(e&1&&(z(0,`div`,55)(1,`span`,82),J(2,`Refused`),B(),z(3,`span`),J(4),B()()),e&2){let e=K();M(4),Y(e.error)}}function IB(e,t){if(e&1&&(z(0,`div`,55)(1,`span`,69),J(2),B(),z(3,`span`,4),J(4),B()(),z(5,`pre`,72),J(6),B()),e&2){let e=K(),t=K(3);M(),N(`data-status`,t.statusClass(e.status??0)),M(),Y(e.status),M(2),Z(``,e.ms,` ms · `,e.type||`no content type`),M(2),Y(t.pretty(e.body??``))}}function LB(e,t){e&1&&(z(0,`div`,62),P(1,FB,5,1,`div`,55)(2,IB,7,5),B()),e&2&&(M(),F(t.error?1:2))}function RB(e,t){if(e&1){let e=W();P(0,lB,7,0,`div`,45),P(1,dB,7,0,`div`,45),z(2,`div`,46)(3,`fieldset`,47)(4,`legend`,48),J(5,`Show calls of kind`),B(),I(6,fB,5,5,`label`,49,wg),B(),z(8,`button`,50),G(`click`,function(){return k(e),A(K(2).clearCalls())}),J(9,` Clear calls `),B()(),P(10,CB,19,0,`div`,51)(11,EB,6,1,`div`,52),z(12,`h2`),J(13,`API routes`),B(),z(14,`div`,53)(15,`table`)(16,`thead`)(17,`tr`)(18,`th`,27),J(19,`Method`),B(),z(20,`th`,27),J(21,`Path`),B(),z(22,`th`,27),J(23,`File`),B(),z(24,`th`,27)(25,`span`,48),J(26,`Actions`),B()()()(),z(27,`tbody`),I(28,DB,14,6,`tr`,null,jz,!1,OB,3,0,`tr`),B()()(),P(31,AB,17,0),z(32,`form`,54),G(`submit`,function(t){k(e);let n=K(2);return t.preventDefault(),A(n.send())}),z(33,`h2`),J(34,`Request playground`),B(),z(35,`div`,55)(36,`app-select`,56),G(`valueChange`,function(t){return k(e),A(K(2).method.set(t??`GET`))}),B(),z(37,`label`,57),J(38,`Path`),B(),z(39,`input`,58),G(`input`,function(t){return k(e),A(K(2).apiPath.set(t.target.value))}),B(),z(40,`button`,20),J(41),B()(),P(42,jB,2,1,`p`,59)(43,MB,2,1,`p`,60),P(44,NB,6,2),P(45,PB,2,2,`p`,61)(46,LB,3,1,`div`,62),B()}if(e&2){let e,t=K(2);F(t.duplicates().length?0:-1),M(),F(t.refetchedFns().length?1:-1),M(5),L(t.kinds),M(2),R(`disabled`,!t.allCalls().length),M(2),F(t.calls().length?10:11),M(18),L(t.project().api),M(3),F(t.serverFns().length?31:-1),M(5),R(`options`,t.methodOptions)(`value`,t.method()),M(3),R(`value`,t.apiPath()),M(),R(`disabled`,!t.canSend()),N(`aria-describedby`,t.sendHintId()),M(),X(` `,t.sending()?`Sending…`:`Send`,` `),M(),F(t.canCall()?t.needsConfirm()?43:-1:42),M(2),F(t.method()===`GET`?-1:44),M(),F(t.sending()?45:(e=t.response())?46:-1,e)}}function zB(e,t){if(e&1&&(z(0,`span`,32),J(1),B()),e&2){let e=t.$implicit;N(`data-mode`,e.mode),M(),Z(``,e.label,` · `,e.count)}}function BB(e,t){if(e&1&&(z(0,`div`,31),I(1,zB,2,3,`span`,32,Nz),B()),e&2){let e=K(3);M(),L(e.modeCounts())}}function VB(e,t){e&1&&(z(0,`span`,87),J(1,`differs from config`),B())}function HB(e,t){if(e&1&&(z(0,`div`,40)(1,`span`,69),J(2),B(),z(3,`span`,86),J(4),B(),P(5,VB,2,0,`span`,87),B()),e&2){let e=t,n=K().$implicit,r=K(3);M(),N(`data-status`,r.statusClass(e.status)),M(),Y(e.status),M(2),Z(``,e.render===`client`?`client only`:`server rendered`,` · `,e.ms,` ms`),M(),F(r.mismatch(n)?5:-1)}}function UB(e,t){e&1&&(z(0,`span`,85),J(1,`not requested yet`),B())}function WB(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(3);M(2),Y(t.dir(e.file)),M(),Y(t.base(e.file))}}function GB(e,t){if(e&1&&(z(0,`tr`)(1,`td`,37),J(2),B(),z(3,`td`)(4,`div`,40)(5,`span`,32),J(6),B(),z(7,`span`,85),J(8),B()()(),z(9,`td`),P(10,HB,6,5,`div`,40)(11,UB,2,0,`span`,85),B(),z(12,`td`),P(13,WB,4,2,`span`,39),B()()),e&2){let e,n=t.$implicit,r=K(3);M(2),Y(n.path),M(3),N(`data-mode`,n.mode),M(),Y(r.modeLabel(n.mode)),M(2),Y(n.reason),M(2),F((e=n.last)?10:11,e),M(3),F(n.file?13:-1)}}function KB(e,t){e&1&&(z(0,`tr`)(1,`td`,44),J(2,` No page routes to render yet. Add a .page.ts file under src/app/pages. `),B()())}function qB(e,t){e&1&&(z(0,`p`,4),J(1,` prerender.routes is a function, so the list is known only at build time. `),B())}function JB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function YB(e,t){e&1&&(z(0,`span`,85),J(1,`default, nothing configured`),B())}function XB(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function ZB(e,t){if(e&1&&(z(0,`dt`),J(1,`From routeRules`),B(),z(2,`dd`),I(3,XB,2,1,`span`,33,wg),B()),e&2){let e=K(2);M(3),L(e.fromRules)}}function QB(e,t){if(e&1&&(z(0,`span`,90),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function $B(e,t){if(e&1&&(z(0,`dt`),J(1,`Static, not listed`),B(),z(2,`dd`),I(3,QB,2,1,`span`,90,wg),B()),e&2){let e=K(2);M(3),L(e.staticMissing)}}function eV(e,t){if(e&1&&(z(0,`span`,33),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function tV(e,t){if(e&1&&(z(0,`dt`),J(1,`Need explicit entries`),B(),z(2,`dd`),I(3,eV,2,1,`span`,33,wg),B()),e&2){let e=K(2);M(3),L(e.dynamic)}}function nV(e,t){if(e&1&&(z(0,`span`,91),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function rV(e,t){if(e&1&&(J(0,` · missing `),I(1,nV,2,1,`span`,91,wg)),e&2){let e=K(3);M(),L(e.notBuilt)}}function iV(e,t){if(e&1&&(J(0),P(1,rV,3,0)),e&2){let e=K(2);X(` `,e.built.length,` page(s) in dist/analog/public `),M(),F(e.notBuilt.length?1:-1)}}function aV(e,t){e&1&&(z(0,`span`,85),J(1,`no build yet`),B())}function oV(e,t){if(e&1&&(z(0,`dl`,88)(1,`dt`),J(2,`Listed`),B(),z(3,`dd`),I(4,JB,2,1,`span`,33,wg),P(6,YB,2,0,`span`,85),B(),P(7,ZB,5,0),P(8,$B,5,0),P(9,tV,5,0),z(10,`dt`),J(11,`Build output`),B(),z(12,`dd`,89),P(13,iV,2,2)(14,aV,2,0,`span`,85),B()()),e&2){let e=K();M(4),L(e.listed??ov(5,Dz)),M(2),F(e.listed?-1:6),M(),F(e.fromRules?.length?7:-1),M(),F(e.staticMissing.length?8:-1),M(),F(e.dynamic.length?9:-1),M(4),F(e.built.length?13:14)}}function sV(e,t){e&1&&(z(0,`div`,84)(1,`h2`),J(2,`Prerender plan`),B(),P(3,qB,2,0,`p`,4)(4,oV,15,6,`dl`,88),B()),e&2&&(M(3),F(t.dynamicConfig?3:4))}function cV(e,t){if(e&1&&(P(0,BB,3,0,`div`,31),z(1,`div`,83)(2,`table`)(3,`thead`)(4,`tr`)(5,`th`,27),J(6,`Route`),B(),z(7,`th`,27),J(8,`Configured`),B(),z(9,`th`,27),J(10,`Last request`),B(),z(11,`th`,27),J(12,`File`),B()()(),z(13,`tbody`),I(14,GB,14,6,`tr`,null,Mz,!1,KB,3,0,`tr`),B()()(),P(17,sV,5,1,`div`,84)),e&2){let e,t=K(2);F(t.modeCounts().length?0:-1),M(14),L(t.renderRows()),M(3),F((e=t.plan())?17:-1,e)}}function lV(e,t){if(e&1&&(z(0,`div`)(1,`span`,94),J(2),B()()),e&2){let e=K().$implicit;M(2),Y(e.error)}}function uV(e,t){if(e&1&&(z(0,`div`)(1,`span`,87),J(2),B()()),e&2){let e=K(5);M(2),X(`takes over `,e.base(t))}}function dV(e,t){if(e&1&&(z(0,`tr`)(1,`td`)(2,`strong`),J(3),B(),P(4,lV,3,1,`div`),P(5,uV,3,1,`div`),B(),z(6,`td`,37),J(7),B(),z(8,`td`,29),J(9),B(),z(10,`td`,93),J(11),B(),z(12,`td`)(13,`span`,39)(14,`span`,43),J(15),B(),J(16),B()()()),e&2){let e,n=t.$implicit,r=K(4);M(3),Y(n.attributes.title||`(no title)`),M(),F(n.error?4:-1),M(),F((e=r.shadowed(n.file))?5:-1,e),M(2),Y(r.contentUrl(n.file)??``),M(2),Y(n.slug),M(2),Y(n.attributes.date||``),M(4),Y(r.dir(n.file)),M(),Y(r.base(n.file))}}function fV(e,t){if(e&1&&(z(0,`div`,92)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,27),J(5,`Title`),B(),z(6,`th`,27),J(7,`URL`),B(),z(8,`th`,27),J(9,`Slug`),B(),z(10,`th`,27),J(11,`Date`),B(),z(12,`th`,27),J(13,`File`),B()()(),z(14,`tbody`),I(15,dV,17,8,`tr`,null,Pz),B()()()),e&2){let e=K(3);M(15),L(e.project().content)}}function pV(e,t){e&1&&(z(0,`div`,52)(1,`p`,73),J(2,`No markdown files under src/content.`),B(),z(3,`p`,4),J(4,` Add a .md file there to see its title, slug, date and the URL it serves. `),B()())}function mV(e,t){e&1&&P(0,fV,17,0,`div`,92)(1,pV,5,0,`div`,52),e&2&&F(+!K(2).project().content.length)}function hV(e,t){if(e&1&&(z(0,`span`,15),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.items.length)}}function gV(e,t){if(e&1&&(z(0,`span`,39)(1,`span`,43),J(2),B(),J(3),B()),e&2){let e=K().$implicit,t=K(5);M(2),Y(t.dir(e.file)),M(),Y(t.base(e.file))}}function _V(e,t){if(e&1&&(z(0,`span`,37),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.path)}}function vV(e,t){if(e&1&&(z(0,`p`,102),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.message)}}function yV(e,t){if(e&1&&(z(0,`li`),P(1,gV,4,2,`span`,39),P(2,_V,2,1,`span`,37),P(3,vV,2,1,`p`,102),B()),e&2){let e=t.$implicit;M(),F(e.file?1:-1),M(),F(e.path&&e.path!==e.file?2:-1),M(),F(e.message?3:-1)}}function bV(e,t){if(e&1&&(z(0,`li`)(1,`div`,97)(2,`span`,32),J(3),B(),z(4,`strong`,98),J(5),B(),P(6,hV,2,1,`span`,15),B(),z(7,`p`),J(8),B(),z(9,`ul`,99),I(10,yV,4,3,`li`,null,Cg),B(),z(12,`div`,100)(13,`strong`),J(14,`How to fix`),B(),J(15),B(),z(16,`span`,101),J(17),B()()),e&2){let e=t.$implicit,n=K(4);N(`data-tone`,n.tone(e.severity)),M(2),N(`data-tone`,n.tone(e.severity)),M(),Y(e.severity),M(2),Y(e.title),M(),F(e.items.length>1?6:-1),M(2),Y(e.summary),M(2),L(e.items),M(5),X(` `,e.fix),M(2),Y(e.rule)}}function xV(e,t){if(e&1&&(z(0,`p`,4),J(1),B(),z(2,`ul`,96),I(3,bV,18,8,`li`,null,Fz),B()),e&2){let e=K(3);M(),Z(` `,e.findings().length,` issue(s) in `,e.lintCards().length,` group(s). Each card says what is wrong, where, and how to fix it. `),M(2),L(e.lintCards())}}function SV(e,t){e&1&&(z(0,`div`,95)(1,`strong`),J(2,`No Analog problems found.`),B(),J(3,` Routes, server files, prerender config and content all check out. `),B())}function CV(e,t){e&1&&P(0,xV,5,2)(1,SV,4,0,`div`,95),e&2&&F(+!K(2).findings().length)}function wV(e,t){if(e&1){let e=W();z(0,`section`,5)(1,`div`,6)(2,`span`,7),J(3,`Analog`),B(),z(4,`span`,8),J(5),B()(),z(6,`div`,6)(7,`span`,7),J(8,`Pages`),B(),z(9,`span`,8),J(10),B()(),z(11,`div`,6)(12,`span`,7),J(13,`API routes`),B(),z(14,`span`,8),J(15),B()(),z(16,`div`,6)(17,`span`,7),J(18,`Server calls`),B(),z(19,`span`,8),J(20),B()(),z(21,`div`,6)(22,`span`,7),J(23,`Issues`),B(),z(24,`span`,8),J(25),B()(),P(26,Rz,5,2,`div`,9),B(),z(27,`div`,10),G(`keydown`,function(t){return k(e),A(K().onKey(t))}),I(28,zz,4,7,`button`,11,Oz),B(),z(30,`div`,12),P(31,sB,29,6)(32,RB,47,15)(33,cV,18,3)(34,mV,2,1)(35,CV,2,1),B()}if(e&2){let e,t,n=K();M(5),Y(n.project().version||`unknown`),M(5),Y(n.pageCount()),M(5),Y(n.project().api.length),M(5),Y(n.allCalls().length),M(),N(`data-tone`,n.findings().length?`warn`:`good`),M(4),Y(n.findings().length),M(),F((e=n.page())?26:-1,e),M(2),L(n.views()),M(2),R(`id`,`analog-panel-`+n.view()),N(`aria-labelledby`,`analog-tab-`+n.view()),M(),F((t=n.view())===`routes`?31:t===`server`?32:t===`render`?33:t===`content`?34:t===`lint`?35:-1)}}var TV={"scan-error":{title:`A folder could not be read`,summary:`Its files are missing from routes, API routes and lint results.`},"duplicate-url":{title:`Two files serve the same URL`,summary:`Only one of them is reachable; the other never renders.`},"sibling-params":{title:`Two dynamic pages in one folder`,summary:`Both are [param] pages at the same level, so the first one always wins.`},"missing-default-export":{title:`Page has no default export`,summary:`Analog needs the component as the default export, so the page renders nothing.`},"redirect-with-component":{title:`Redirect page also exports a component`,summary:`The redirect runs first, so the component never shows.`},"redirect-path-match":{title:`Redirect matches too much`,summary:`An empty-path redirect without pathMatch "full" catches every URL below it.`},"layout-without-outlet":{title:`Layout has no router-outlet`,summary:`The layout has child pages, but without they never render.`},"server-without-load":{title:`.server.ts without load or action`,summary:`The server file exports no load, action or server function, so Analog calls nothing.`},"orphan-server-file":{title:`.server.ts without a page`,summary:`No page file sits next to it, so its load never runs.`},"api-method-suffix":{title:`Unknown method suffix on an API file`,summary:`The suffix is not an HTTP method, so it becomes part of the URL.`},"duplicate-api-route":{title:`Two handlers for one API route`,summary:`Two files answer the same method and path.`},"api-outside-prefix":{title:`Server route outside the API prefix`,summary:`During vite dev only routes under the prefix reach Nitro.`},"prerender-unknown-route":{title:`Prerender entry matches no page`,summary:`prerender.routes lists a path that no page file serves.`},"prerender-missing-root":{title:`Home page is not prerendered`,summary:`static is on, but prerender.routes leaves out /.`},"content-frontmatter":{title:`Broken frontmatter`,summary:`The markdown frontmatter cannot be read.`},"duplicate-slug":{title:`Two posts share a slug`,summary:`injectContent picks one of them at random.`},"content-shadows-page":{title:`Markdown file takes over a page`,summary:`Files under src/content are routes too, so these URLs render the markdown file instead of the [param] page.`},"load-fetched-twice":{title:`load() runs twice`,summary:`These pages fetched their data while rendering on the server and again in the browser.`},"fn-fetched-twice":{title:`Server function read runs twice`,summary:`These reads ran while rendering on the server and again in the browser right after hydration.`},"restart-needed":{title:`New pages need a restart`,summary:`These page files exist, but the running router does not know them yet.`},"hydration-error":{title:`Hydration error`,summary:`The browser DOM did not match the server HTML.`},"api-not-found":{title:`API call failed with 404 or 405`,summary:`A request hit a path or method that no server route handles.`}},EV=new Set([`missing-default-export`,`redirect-with-component`,`redirect-path-match`,`layout-without-outlet`,`server-without-load`,`orphan-server-file`,`load-fetched-twice`,`restart-needed`,`prerender-missing-root`]),DV={ssr:`SSR`,ssg:`Prerendered`,client:`Client only`,cached:`Cached`,redirect:`Redirect`},OV={all:`All`,page:`Pages`,load:`load()`,action:`Actions`,fn:`Server fn`,api:`API`},kV={success:`succeeded`,redirect:`redirected`,invalid:`validation errors`,error:`failed`},AV={success:`good`,redirect:`info`,invalid:`warn`,error:`bad`};function jV(e,t=0,n=[]){for(let r of e)n.push({route:r,depth:t}),jV(r.children,t+1,n);return n}var MV=class e{rpc=$(null);canCall=Q(()=>iE(this.rpc(),`analog`));callsOff=UT(`analog`);kinds=[`all`,`page`,`load`,`action`,`fn`,`api`];methods=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];methodOptions=this.methods.map(e=>({value:e,label:e}));view=j(`routes`);project=j(null);state=j({});findings=j([]);renderRows=j([]);plan=j(null);filter=j(``);testUrl=j(``);explained=j(null);explainError=j(``);explaining=j(!1);kind=j(`all`);method=j(`GET`);apiPath=j(``);apiBody=j(``);confirmSend=j(!1);response=j(null);sending=j(!1);needsConfirm=Q(()=>this.method()!==`GET`&&!this.confirmSend());canSend=Q(()=>this.canCall()&&!this.sending()&&!this.needsConfirm());sendHintId=Q(()=>this.canCall()?this.needsConfirm()?`analog-confirm-hint`:null:`analog-calls-off`);unsubscribe=null;refreshTimer;refreshRun=0;destroyRef=E(Cs);page=Q(()=>this.state().pages?.[0]??null);openFiles=Q(()=>new Set((this.page()?.chain??[]).map(e=>e.file)));allCalls=Q(()=>this.state().calls??[]);calls=Q(()=>{let e=this.kind();return this.allCalls().filter(t=>e===`all`||t.kind===e).slice(-150).reverse()});allRoutes=Q(()=>jV(this.project()?.routes??[]));pageCount=Q(()=>this.allRoutes().filter(e=>e.route.file&&e.route.kind!==`layout`).length);routeRows=Q(()=>{let e=this.filter().trim().toLowerCase();return e?this.allRoutes().filter(t=>t.route.fullPath.toLowerCase().includes(e)||!!t.route.file?.toLowerCase().includes(e)):this.allRoutes()});serverFns=Q(()=>this.project()?.serverFns??[]);fnById=Q(()=>new Map(this.serverFns().map(e=>[e.id,e])));refetchedFns=Q(()=>Array.from(new Set((this.state().refetches??[]).map(e=>this.fnById().get(e.id)?.name??e.id))));duplicates=Q(()=>Array.from(new Set((this.state().duplicates??[]).map(e=>e.route))));modeCounts=Q(()=>[`ssr`,`ssg`,`cached`,`client`,`redirect`].map(e=>({mode:e,label:DV[e],count:this.renderRows().filter(t=>t.mode===e).length})).filter(e=>e.count));lintCards=Q(()=>{let e={error:0,warning:1,info:2},t=new Map;for(let e of this.findings()){let n=t.get(e.rule);if(!n){let r=TV[e.rule];n={rule:e.rule,severity:e.severity,title:r?.title??e.rule,summary:r?.summary??e.message,fix:e.fix,items:[]},t.set(e.rule,n)}let r=EV.has(e.rule)||e.message===n.summary?void 0:e.message;n.items.some(t=>t.file===e.file&&t.path===e.path&&t.message===r)||n.items.push({file:e.file,path:e.path,message:r})}return Array.from(t.values()).sort((t,n)=>e[t.severity]-e[n.severity])});views=Q(()=>{let e=this.findings().length;return[{id:`routes`,label:`Routes`,count:this.pageCount(),tone:``},{id:`server`,label:`Server`,count:this.allCalls().length,tone:``},{id:`render`,label:`Render`,count:this.renderRows().length,tone:``},{id:`content`,label:`Content`,count:this.project()?.content.length??0,tone:``},{id:`lint`,label:`Lint`,count:e,tone:e?`warn`:``}]});constructor(){uc(()=>{let e=this.rpc();e&&Cv(()=>void this.load(e))}),uc(()=>{let e=this.view();this.state(),Cv(()=>this.scheduleRefresh(e))}),this.destroyRef.onDestroy(()=>{this.unsubscribe?.(),clearTimeout(this.refreshTimer)})}async load(e){let t=await eE(e,`analog-project`);if(!this.destroyRef.destroyed){this.project.set(t);try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`analog`);if(this.destroyRef.destroyed)return;let n=e=>this.state.set(e??{});n(t.value()),this.unsubscribe?.(),this.unsubscribe=t.on(`updated`,n)}catch{this.state.set({})}this.destroyRef.destroyed||await this.refresh(this.view())}}scheduleRefresh(e){clearTimeout(this.refreshTimer),this.refreshTimer=setTimeout(()=>void this.refresh(e),300)}async refresh(e){let t=this.rpc();if(!t)return;let n=++this.refreshRun,[r,i]=await Promise.all([eE(t,`analog-lint`),eE(t,`analog-render`)]);if(n===this.refreshRun&&(this.findings.set(r??[]),this.renderRows.set(i?.rows??[]),this.plan.set(i?.plan??null),e===`routes`||e===`content`)){let e=await eE(t,`analog-project`);e&&n===this.refreshRun&&this.project.set(e)}}isOpen(e){return!!e.file&&this.openFiles().has(e.file)}kindText(e){return e.catchAll?e.catchAll===`optional`?`optional catch-all`:`catch-all`:e.kind===`implicit`?`folder`:e.kind}serverExports(e){return(e.serverExports??[]).filter(e=>e===`load`||e===`action`)}short(e){return e?.replace(/^\/src\/app\//,``).replace(/^\//,``)}dir(e){let t=this.short(e)??e;return t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)+1):``}base(e){return e.slice(e.lastIndexOf(`/`)+1)}paramList(e){return Object.entries(e)}kindLabel(e){return OV[e]}kindCount(e){return e===`all`?this.allCalls().length:this.allCalls().filter(t=>t.kind===e).length}modeLabel(e){return DV[e]}mismatch(e){return!e.last?.render||e.mode===`redirect`?!1:e.mode===`client`?e.last.render!==`client`:e.last.render===`client`}fnOf(e){return e.kind===`fn`&&e.route?this.fnById().get(e.route):void 0}fnCalls(e){return this.allCalls().filter(t=>t.kind===`fn`&&t.route===e).length}outcomeLabel(e){return kV[e]}outcomeTone(e){return AV[e]}statusClass(e){return e>=500||e===0?`bad`:e>=400?`warn`:`good`}tone(e){return e===`error`?`bad`:e===`warning`?`warn`:`info`}shadowed(e){return this.findings().find(t=>t.rule===`content-shadows-page`&&t.file===e)?.message.match(/(\/\S+\.page\.ts)/)?.[1]}contentUrl(e){return this.allRoutes().find(t=>t.route.file===e)?.route.fullPath}pretty(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}time=uD;tryApi(e){this.method.set(e.method===`ANY`?`GET`:e.method),this.apiPath.set(e.path.replace(/:(\w+)/g,`1`).replace(`**`,`x`)),this.response.set(null),queueMicrotask(()=>document.getElementById(`api-path`)?.focus())}async clearCalls(){await eE(this.rpc(),`analog-clear-calls`)}async explain(){let e=this.testUrl().trim();if(!e){this.explained.set(null),this.explainError.set(`Type a URL to explain, for example /products/42.`);return}this.explaining.set(!0),this.explainError.set(``);try{let t=await $T(this.rpc(),`analog-explain-url`,e);if(!t)throw Error(`The devtools server did not answer`);this.explained.set({url:e,match:t})}catch(t){let n=String(t?.message||`The devtools server did not answer`);this.explained.set(null),this.explainError.set(`Could not explain ${e}. ${n.replace(/\.?$/,`.`)}`)}finally{this.explaining.set(!1)}}async send(){let e=this.apiPath().trim();if(!e||this.sending()||this.needsConfirm())return;let t;if(this.method()!==`GET`&&this.apiBody().trim())try{t=JSON.parse(this.apiBody())}catch{this.response.set({error:`The body is not valid JSON.`});return}this.response.set(null),this.sending.set(!0);try{let n=await eE(this.rpc(),`analog-call-api`,{method:this.method(),path:e,body:t,confirm:this.confirmSend()});this.response.set(n??{error:`No answer from the devtools server.`})}finally{this.sending.set(!1)}}onKey(e){let t=this.views().map(e=>e.id),n=t.indexOf(this.view()),r=n;if(e.key===`ArrowRight`)r=(n+1)%t.length;else if(e.key===`ArrowLeft`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else return;e.preventDefault(),this.view.set(t[r]);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`#analog-tab-${t[r]}`)?.focus())}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-analog-inspector`]],inputs:{rpc:[1,`rpc`]},decls:3,vars:1,consts:[[`role`,`status`,1,`loading`],[1,`empty`],[`aria-hidden`,`true`,1,`spinner`],[1,`empty-title`],[1,`muted`],[`aria-label`,`Analog summary`,1,`summary`],[1,`stat`],[1,`label`],[1,`value`],[1,`stat`,`wide`],[`role`,`tablist`,`aria-label`,`Analog views`,1,`tabs`,3,`keydown`],[`type`,`button`,`role`,`tab`,3,`id`],[`role`,`tabpanel`,1,`panel`,3,`id`],[1,`value`,`mono`,3,`title`],[`type`,`button`,`role`,`tab`,3,`click`,`id`],[1,`count`],[1,`toolbar`],[1,`inline`,`explain`,3,`submit`],[`for`,`analog-url`],[`id`,`analog-url`,`type`,`text`,`placeholder`,`/products/42`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`type`,`submit`,1,`btn`,`primary`,3,`disabled`],[`for`,`route-filter`,1,`sr-only`],[`id`,`route-filter`,`type`,`search`,`placeholder`,`Filter by path or file`,1,`field`,`filter`,3,`input`,`value`],[`role`,`status`,1,`explain-result`],[`data-tone`,`bad`,1,`callout`],[1,`callout`],[`role`,`region`,`aria-label`,`File routes`,`tabindex`,`0`,1,`table-wrap`],[`scope`,`col`],[3,`open`,`dim`],[1,`mono`],[1,`chain`],[1,`chips`],[1,`pill`],[1,`chip`,`mono`],[1,`plain`],[1,`route`],[`aria-hidden`,`true`,1,`guide`],[1,`mono`,`path`],[1,`pill`,`live`],[1,`file`],[1,`meta`],[`data-kind`,`load`,1,`pill`],[1,`chip`],[1,`dir`],[`colspan`,`4`,1,`empty-row`],[`data-tone`,`warn`,`role`,`note`,1,`callout`],[1,`calls-bar`],[1,`segmented`],[1,`sr-only`],[3,`on`],[`type`,`button`,1,`btn`,`ghost`,3,`click`,`disabled`],[`role`,`region`,`aria-label`,`Server calls`,`tabindex`,`0`,1,`table-wrap`],[1,`empty-box`],[`role`,`region`,`aria-label`,`API routes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`,`playground`,3,`submit`],[1,`row`],[`ariaLabel`,`Method`,1,`method-select`,3,`valueChange`,`options`,`value`],[`for`,`api-path`,1,`sr-only`],[`id`,`api-path`,`type`,`text`,`placeholder`,`/api/v1/products`,1,`field`,`grow`,`mono`,3,`input`,`value`],[`id`,`analog-calls-off`,1,`muted`],[`id`,`analog-confirm-hint`,1,`muted`],[`role`,`status`,1,`muted`],[`role`,`status`,1,`response`],[`type`,`radio`,`name`,`analog-kind`,1,`sr-only`,3,`change`,`checked`],[`scope`,`col`,1,`num`],[1,`muted`,`nowrap`],[1,`request`],[1,`method`],[1,`mono`,`url`],[1,`status`],[1,`num`,`nowrap`],[1,`mono`,`muted`],[1,`code`],[1,`empty-lead`],[1,`actions`],[`type`,`button`,1,`btn`,`ghost`,3,`click`],[`role`,`region`,`aria-label`,`Server functions`,`tabindex`,`0`,1,`table-wrap`],[1,`num`,`tnum`],[`for`,`api-body`],[`id`,`api-body`,`rows`,`3`,`placeholder`,`{"name": "Ada"}`,1,`field`,`mono`,3,`input`,`value`],[1,`check`],[`type`,`checkbox`,3,`change`,`checked`],[`data-status`,`bad`,1,`status`],[`role`,`region`,`aria-label`,`Render modes`,`tabindex`,`0`,1,`table-wrap`],[1,`card`],[1,`muted`,`small`],[1,`muted`,`small`,`tnum`],[`data-tone`,`warn`,1,`pill`],[1,`facts`],[1,`tnum`],[`data-tone`,`warn`,1,`chip`,`mono`],[`data-tone`,`bad`,1,`chip`,`mono`],[`role`,`region`,`aria-label`,`Content files`,`tabindex`,`0`,1,`table-wrap`],[1,`muted`,`nowrap`,`tnum`],[`data-tone`,`bad`,1,`pill`],[`data-tone`,`good`,`role`,`status`,1,`callout`],[1,`findings`],[1,`finding-head`],[1,`finding-title`],[1,`where`],[1,`fix`],[1,`rule`,`mono`],[1,`detail`]],template:function(e,t){e&1&&P(0,Iz,4,0,`div`,0)(1,Lz,14,0,`div`,1)(2,wV,36,10),e&2&&F(t.project()===null?0:t.project().analog?2:1)},dependencies:[nD],styles:[`@charset "UTF-8"; [_nghost-%COMP%] { --%NS%good: var(--%NS%ok); --%NS%bad: var(--%NS%danger); @@ -10692,7 +10841,7 @@ h2[_ngcontent-%COMP%] { color: var(--%NS%text-strong); font-size: 15px; font-weight: 600; -}`]})},oV=(e,t)=>t.id,sV=(e,t)=>t.side+t.id,cV=(e,t)=>t.key;function lV(e,t){e&1&&(z(0,`div`,0),V(1,`span`,43),z(2,`span`),J(3,`Loading…`),B()())}function uV(e,t){e&1&&(z(0,`div`,1)(1,`strong`),J(2,`Could not reach the devtools server.`),B(),z(3,`span`),J(4,`Check that the app's dev server is running with the devtools plugin, then reopen this panel.`),B()())}function dV(e,t){e&1&&(z(0,`span`,48),J(1,`transfer cache`),B())}function fV(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),X(`delayed `,e.delayMs,` ms`)}}function pV(e,t){e&1&&(z(0,`span`,57),J(1,`mocked`),B())}function mV(e,t){e&1&&(z(0,`span`,58),J(1,`faulted`),B())}function hV(e,t){if(e&1&&(z(0,`span`,59),J(1,`rule `),z(2,`code`),J(3),B()()),e&2){let e=t;R(`title`,`Matched rule: `+e),M(3),Y(e)}}function gV(e,t){if(e&1){let e=W();z(0,`tr`,47),G(`click`,function(){let t=k(e).$implicit;return A(K(2).openCall(t.id))}),z(1,`td`)(2,`span`,48),J(3),B()(),z(4,`td`,49),J(5),B(),z(6,`td`,50)(7,`button`,51),J(8),B()(),z(9,`td`,52),J(10),B(),z(11,`td`,53),V(12,`span`,54),J(13),B(),z(14,`td`,55),J(15),B(),z(16,`td`)(17,`div`,56),P(18,dV,2,0,`span`,48),P(19,fV,2,1,`span`,48),P(20,pV,2,0,`span`,57),P(21,mV,2,0,`span`,58),P(22,hV,4,2,`span`,59),B()()()}if(e&2){let e,n=t.$implicit,r=K(2);q(`selected`,r.selectedCall()?.id===n.id),M(2),q(`server`,n.side===`server`),M(),Y(n.side===`server`?`SSR`:`Client`),M(2),Y(n.method),M(2),R(`title`,n.url),N(`data-call-id`,n.id)(`aria-pressed`,r.selectedCall()?.id===n.id)(`aria-controls`,r.selectedCall()?`call-preview`:null),M(),X(` `,n.url,` `),M(),R(`title`,n.pageUrl??``),M(),X(` `,n.pageUrl??``,` `),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(2),X(``,r.statusLabel(n),` `),M(2),X(``,n.durationMs,` ms`),M(3),F(n.cacheHit?18:-1),M(),F(n.delayMs?19:-1),M(),F(n.mocked?20:-1),M(),F(n.faulted?21:-1),M(),F((e=r.rulePatternOf(n))?22:-1,e)}}function _V(e,t){if(e&1&&(z(0,`div`,12)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,44),J(5,`Side`),B(),z(6,`th`,44),J(7,`Method`),B(),z(8,`th`,44),J(9,`URL`),B(),z(10,`th`,44),J(11,`Page`),B(),z(12,`th`,44),J(13,`Status`),B(),z(14,`th`,45),J(15,`Time`),B(),z(16,`th`,44),J(17,`Notes`),B()()(),z(18,`tbody`),I(19,gV,23,26,`tr`,46,sV),B()()()),e&2){let e=K();M(19),L(e.timeline())}}function vV(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No requests yet.`),B(),z(3,`p`,31),J(4,` Add `),z(5,`code`),J(6,`withNgDevtools()`),B(),J(7,` to `),z(8,`code`),J(9,`provideHttpClient`),B(),J(10,`, then load a page of the app. `),B()())}function yV(e,t){e&1&&(z(0,`p`,66),J(1,` Matched rule `),z(2,`code`),J(3),B()()),e&2&&(M(3),Y(t))}function bV(e,t){if(e&1){let e=W();z(0,`div`,60),G(`keydown.escape`,function(){return k(e),A(K().closePreview())}),z(1,`div`,61)(2,`h3`,62),J(3,`Response preview`),B(),z(4,`button`,63),G(`click`,function(){return k(e),A(K().closePreview())}),J(5,`Close`),B()(),z(6,`p`,64)(7,`span`,49),J(8),B(),z(9,`span`,53),J(10),B(),z(11,`span`,65),J(12),B()(),P(13,yV,4,1,`p`,66),z(14,`pre`),J(15),B()()}if(e&2){let e,n=t,r=K();M(8),Y(n.method),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(),Y(r.statusLabel(n)),M(),R(`title`,n.url),M(),Y(n.url),M(),F((e=r.rulePatternOf(n))?13:-1,e),M(),q(`error`,!!n.error&&!n.cancelled),M(),Y(n.error??n.preview??`(no body)`)}}function xV(e,t){if(e&1&&(z(0,`p`,17),J(1),B()),e&2){let e=K();M(),Y(e.writesOff)}}function SV(e,t){e&1&&(z(0,`p`,31),J(1,` SSR mocks are not transferred to the client: the browser requests the URL again and gets the real response unless the rule also applies on the client. `),B())}function CV(e,t){e&1&&(z(0,`span`),J(1,`passthrough`),B())}function wV(e,t){if(e&1&&(z(0,`span`,53),J(1),B()),e&2){let e=K().$implicit,t=K();q(`ok`,t.statusTone(e.status)===`ok`)(`redirect`,t.statusTone(e.status)===`redirect`)(`bad`,t.statusTone(e.status)===`bad`),M(),Y(e.status)}}function TV(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.delayMs,` ms`)}}function EV(e,t){e&1&&(z(0,`span`),J(1,`mock body`),B())}function DV(e,t){e&1&&(z(0,`p`,74),J(1,` The SSR mock is not written to TransferState, so the browser requests this URL again. `),B())}function OV(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,67)(2,`input`,68),G(`change`,function(){let t=k(e).$implicit;return A(K().toggleRule(t.id))}),B(),z(3,`code`,69)(4,`span`,70),J(5),B(),J(6),B()(),z(7,`button`,71),G(`click`,function(){let t=k(e).$implicit;return A(K().removeRule(t.id))}),J(8,` Remove `),B(),z(9,`span`,72)(10,`span`),J(11),B(),P(12,CV,2,0,`span`)(13,wV,2,7,`span`,73),P(14,TV,2,1,`span`),P(15,EV,2,0,`span`),B(),P(16,DV,2,0,`p`,74),B()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Enable rule for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(e.method||`ANY`),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Remove rule for `+e.pattern),M(4),Y(n.targetLabel(e.target)),M(),F(e.status===void 0?12:13),M(2),F(e.delayMs?14:-1),M(),F(e.body?15:-1),M(),F(n.mocksOnServer(e)?16:-1)}}function kV(e,t){e&1&&(z(0,`li`,38),J(1,`No rules. SSR rules apply on the next page load.`),B())}function AV(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`DOM nodes hydrated`),B(),z(3,`dd`),J(4),B()(),z(5,`div`)(6,`dt`),J(7,`DOM nodes skipped`),B(),z(8,`dd`),J(9),B()(),z(10,`div`)(11,`dt`),J(12,`Mismatched components`),B(),z(13,`dd`),J(14),B()()),e&2){let e=t;M(4),Y(e.hydrated),M(5),Y(e.skipped),M(4),q(`bad`,e.mismatched>0),M(),Y(e.mismatched)}}function jV(e,t){if(e&1&&(z(0,`span`,77)(1,`span`,78),J(2,`Expected`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.expected)}}function MV(e,t){if(e&1&&(z(0,`span`,77)(1,`span`,78),J(2,`Actual`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.actual)}}function NV(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),P(3,jV,5,1,`span`,77),P(4,MV,5,1,`span`,77),B()),e&2){let e=t.$implicit;M(2),Y(`<`+e.component+`>`),M(),F(e.expected?3:-1),M(),F(e.actual?4:-1)}}function PV(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`ul`,76),I(3,NV,5,3,`li`,null,Cg),B()),e&2){let e=K();M(),X(`Mismatches (`,e.mismatches.length,`)`),M(2),L(e.mismatches)}}function FV(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B()()),e&2){let e=t.$implicit;M(2),Y(e)}}function IV(e,t){if(e&1&&(z(0,`h3`),J(1,`ngSkipHydration hosts`),B(),z(2,`ul`,79),I(3,FV,3,1,`li`,null,Cg),B()),e&2){let e=K();M(3),L(e.skipHydrationHosts)}}function LV(e,t){e&1&&(z(0,`h3`),J(1,`Warnings`),B(),z(2,`p`,31),J(3,` Not captured: add `),z(4,`code`),J(5,`provideNgDevtoolsHttp()`),B(),J(6,` to the app providers. `),B())}function RV(e,t){if(e&1&&(z(0,`pre`,80),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function zV(e,t){e&1&&(z(0,`p`,81),J(1,`No hydration warnings.`),B())}function BV(e,t){if(e&1&&(z(0,`h3`),J(1),B(),I(2,RV,2,1,`pre`,80,Cg,!1,zV,2,0,`p`,81)),e&2){let e=K();M(),X(`Warnings (`,e.warnings.length,`)`),M(),L(e.warnings)}}function VV(e,t){if(e&1&&(z(0,`dl`,75)(1,`div`)(2,`dt`),J(3,`Enabled`),B(),z(4,`dd`)(5,`span`,48),J(6),B()()(),z(7,`div`)(8,`dt`),J(9,`Hydrated components`),B(),z(10,`dd`),J(11),B()(),z(12,`div`)(13,`dt`),J(14,`Hydrated nodes`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Skipped components`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`Incremental defer blocks`),B(),z(25,`dd`),J(26),B()(),P(27,AV,15,5),B(),P(28,PV,5,1),P(29,IV,5,0),P(30,LV,7,0)(31,BV,5,2)),e&2){let e,n=t;M(5),q(`on`,n.enabled)(`off-tag`,!n.enabled),M(),Y(n.enabled?`yes`:`no (client render only)`),M(5),Y(n.hydratedComponents??`n/a`),M(5),Y(n.hydratedNodes??`n/a`),M(5),Y(n.componentsSkippedHydration??`n/a`),M(5),Y(n.deferBlocksWithIncrementalHydration??`n/a`),M(),F((e=n.nodes)?27:-1,e),M(),F(n.mismatches?.length?28:-1),M(),F(n.skipHydrationHosts.length?29:-1),M(),F(n.warningsCaptured===!1?30:31)}}function HV(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No hydration data for this page.`),B(),z(3,`p`,31),J(4,`Open a server rendered page of the app to see its stats.`),B()())}function UV(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No TransferState script: this page was not server rendered.`),B()())}function WV(e,t){if(e&1&&(z(0,`p`,83),J(1),B()),e&2){let e=K(2);M(),Y(e.error)}}function GV(e,t){e&1&&(z(0,`span`,48),J(1),B()),e&2&&(M(),Y(t))}function KV(e,t){if(e&1&&(z(0,`span`,48),J(1),B(),z(2,`span`,86),J(3),B()),e&2){let e=t,n=K().$implicit,r=K(3);q(`server`,r.statusTone(e.status)===`ok`)(`fault`,r.statusTone(e.status)===`bad`),M(),X(`HTTP `,e.status),M(2),Y(e.url??n.key)}}function qV(e,t){if(e&1&&(z(0,`span`,86),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.key)}}function JV(e,t){if(e&1&&(z(0,`details`)(1,`summary`),V(2,`span`,85),P(3,GV,2,1,`span`,48),P(4,KV,4,6)(5,qV,2,1,`span`,86),z(6,`span`,87),J(7),B()(),z(8,`pre`),J(9),uv(10,`json`),B()()),e&2){let e,n,r=t.$implicit,i=K(3);M(3),F((e=i.payloadLabel(r))?3:-1,e),M(),F((n=r.http)?4:5,n),M(3),X(``,r.size,` B`),M(2),Y(fv(10,4,r.value))}}function YV(e,t){if(e&1&&(z(0,`p`,82),J(1),B(),P(2,WV,2,1,`p`,83),z(3,`div`,84),I(4,JV,11,6,`details`,null,cV),B()),e&2){let e=K();M(),Y_(` `,e.entries.length,` entr`,e.entries.length===1?`y`:`ies`,`, `,e.size,` bytes `),M(),F(e.error?2:-1),M(2),L(e.entries)}}function XV(e,t){e&1&&P(0,UV,3,0,`div`,13)(1,YV,6,4),e&2&&F(+!!t.found)}function ZV(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`Open a page of the app to see its payload.`),B()())}var QV={pattern:``,method:``,target:`both`,status:``,delayMs:``,body:``},$V=50,eH=class e{rpc=$(null);canWrite=Q(()=>nE(this.rpc(),`http`));writesOff=HT(`http`);loading=j(!1);failed=j(!1);serverCalls=j([]);pages=j([]);payloads=j({});serverDropped=j(0);rules=j([]);hostPageId=JT();selectedPageId=wv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId)?.pageId??e[0]?.pageId??null});selectedCallId=j(null);draft=j({...QV});message=j(``);bodyPlaceholder=`{ "error": "Service unavailable" }`;unsubscribe=[];destroyRef=E(Cs);injector=E(xs);host=E(Ml);selected=Q(()=>this.pages().find(e=>e.pageId===this.selectedPageId())??null);selectedPayload=Q(()=>{let e=this.selectedPageId();return e?this.payloads()[e]??null:null});maxCalls=Q(()=>tE(this.rpc()).limits.httpCalls);droppedCalls=Q(()=>(this.selected()?.dropped??0)+this.serverDropped());pageServerCalls=Q(()=>{let e=this.selected()?.initialUrl;return e?this.serverCalls().filter(t=>!t.pageUrl||t.pageUrl===e):this.serverCalls()});timeline=Q(()=>[...this.pageServerCalls(),...this.selected()?.calls??[]].sort((e,t)=>t.at-e.at));selectedCall=Q(()=>this.timeline().find(e=>e.id===this.selectedCallId())??null);draftMocksOnServer=Q(()=>{let e=this.draftRule();return!!e&&this.mocksOnServer(e)});statusError=Q(()=>{let e=this.draft().status.trim();if(!e)return``;let t=Number(e);return Number.isInteger(t)&&t>=100&&t<=599?``:`Set a status from 100 to 599.`});draftRule=Q(()=>{let e=this.draft(),t=e.pattern.trim();if(!t||this.bodyError()||this.statusError()||this.rules().length>=$V)return null;let n=e.body.trim(),r=Math.min(Math.max(Math.round(Number(e.delayMs))||0,0),1e4),i=e.status.trim()?Number(e.status):n?200:void 0;return i===void 0&&!r?null:{pattern:t,enabled:!0,target:e.target,...e.method?{method:e.method}:{},...i===void 0?{}:{status:i},...r?{delayMs:r}:{},...n?{body:n}:{}}});draftHint=Q(()=>{let e=this.draft();return this.rules().length>=$V?`You can add up to ${$V} rules. Remove one to add another.`:e.pattern.trim()?this.statusError()?this.statusError():this.bodyError()?``:this.draftRule()?!e.status.trim()&&e.body.trim()?`With no status, the mock body returns 200.`:``:`Set a status, a delay or a mock body.`:`Enter a URL pattern to add a rule.`});bodyError=Q(()=>{let e=this.draft().body.trim();if(!e)return``;try{return JSON.parse(e),``}catch{return`The mock body must be valid JSON.`}});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.stopListening())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=e.scope(`ng-devtools`).rpc,[n,r]=await Promise.all([t.sharedState(`http`),t.sharedState(`http-payloads`)]);if(this.destroyRef.destroyed)return;let i=e=>{let t=e;this.serverCalls.set(t?.serverCalls??[]),this.serverDropped.set(t?.serverDropped??0),this.pages.set(t?.pages??[]),this.rules.set(t?.rules??[])},a=e=>this.payloads.set(e?.pages??{});i(n.value()),a(r.value()),this.stopListening(),this.unsubscribe=[n.on(`updated`,i),r.on(`updated`,a)]}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}statusLabel(e){return e.cancelled?`cancelled`:e.status?String(e.status):`ERR`}callTone(e){return e.cancelled?`neutral`:this.statusTone(e.status)}rulePatternOf(e){return e.rulePattern?e.rulePattern:e.ruleId?this.rules().find(t=>t.id===e.ruleId)?.pattern??null:null}openCall(e){this.selectedCallId.set(e),Id(()=>this.host.nativeElement.querySelector(`#preview-heading`)?.focus(),{injector:this.injector})}closePreview(){let e=this.selectedCallId();this.selectedCallId.set(null),e&&[...this.host.nativeElement.querySelectorAll(`button[data-call-id]`)].find(t=>t.dataset.callId===e)?.focus()}stopListening(){for(let e of this.unsubscribe.splice(0))e()}statusTone(e){return e===void 0?`neutral`:e===0||e>=400?`bad`:e>=300?`redirect`:e>=200?`ok`:`neutral`}mocksOnServer(e){return e.target!==`client`&&e.status!==void 0&&e.status<400}payloadLabel(e){return e.source===`hydration`?`hydration annotations`:e.fn?`Analog server function ${e.fn.name??e.fn.id}`:e.source===`analog`?`Analog`:null}targetLabel(e){return e===`both`?`SSR + client`:e===`server`?`SSR only`:`Client only`}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url})));methodOptions=[{value:``,label:`Any`},...[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].map(e=>({value:e,label:e}))];targetOptions=[{value:`both`,label:`SSR + client`},{value:`server`,label:`SSR only`},{value:`client`,label:`Client only`}];selectPage(e){e&&this.selectedPageId.set(e),this.selectedCallId.set(null)}setDraft(e,t){this.draft.update(n=>({...n,[e]:t}))}patch(e,t){let n=t.target.value;this.draft.update(t=>({...t,[e]:n}))}async addRule(e){e.preventDefault();let t=this.draftRule();if(!t)return;let n={id:`r${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,...t};await this.saveRules([...this.rules(),n],`Rule added.`,n)&&(this.draft.set({...QV}),this.host.nativeElement.querySelector(`#rule-pattern`)?.focus())}toggleRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Rule updated.`,t)}removeRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().filter(t=>t.id!==e),`Rule removed.`,t)}async clearCalls(){try{await QT(this.rpc(),`clear-http-calls`),this.selectedCallId.set(null),this.message.set(`Timeline cleared.`)}catch{this.message.set(`Could not clear the timeline.`)}}async saveRules(e,t,n){try{let r=await QT(this.rpc(),`set-http-rules`,e);return this.rules.set(Array.isArray(r)?r:e),this.message.set(n.target===`client`?t:`${t} Reload the page to apply it to SSR.`),!0}catch{return this.message.set(`Could not save the rules.`),!1}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-network-inspector`]],inputs:{rpc:[1,`rpc`]},decls:76,vars:32,consts:[[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`,`error`],[1,`toolbar`],[1,`page-picker`],[`id`,`page-picker-label`],[`labelledBy`,`page-picker-label`,`emptyText`,`No connected page`,`placeholder`,`No connected page`,3,`valueChange`,`options`,`value`],[`type`,`button`,3,`click`,`disabled`],[`role`,`status`,1,`message`],[1,`grid`],[`aria-labelledby`,`timeline-heading`,1,`panel`,`wide`],[`id`,`timeline-heading`],[`what`,`HTTP calls`,`limit`,`httpCalls`,3,`dropped`,`max`],[1,`table-wrap`],[1,`empty`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`],[`aria-labelledby`,`rules-heading`,1,`panel`],[`id`,`rules-heading`],[`id`,`http-writes-off`,1,`muted`,`small`],[1,`rule-form`,3,`submit`],[1,`hint`],[`id`,`rule-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /api/products`,3,`input`,`value`],[1,`row`],[1,`field-group`],[`id`,`rule-method-label`],[`labelledBy`,`rule-method-label`,3,`valueChange`,`options`,`value`],[`id`,`rule-target-label`],[`labelledBy`,`rule-target-label`,3,`valueChange`,`options`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`100`,`max`,`599`,`placeholder`,`e.g. 500`,`aria-describedby`,`rule-hint`,3,`input`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`0`,`max`,`10000`,`placeholder`,`0`,3,`input`,`value`],[`rows`,`3`,`spellcheck`,`false`,`aria-describedby`,`body-error`,3,`input`,`placeholder`,`value`],[`id`,`body-error`,1,`field-error`],[1,`muted`,`small`],[`id`,`rule-hint`,1,`muted`,`small`],[1,`form-actions`],[`type`,`submit`,3,`disabled`],[1,`rules-heading`],[1,`rules`],[3,`off`],[1,`empty-rule`],[`aria-labelledby`,`hydration-heading`,1,`panel`],[`id`,`hydration-heading`],[`aria-labelledby`,`payload-heading`,1,`panel`,`wide`],[`id`,`payload-heading`],[`aria-hidden`,`true`,1,`spinner`],[`scope`,`col`],[`scope`,`col`,1,`num`],[3,`selected`],[3,`click`],[1,`tag`],[1,`method`],[1,`url`],[`type`,`button`,1,`link`,3,`title`],[1,`page-url`,3,`title`],[1,`status`],[`aria-hidden`,`true`,1,`dot`],[1,`num`],[1,`notes`],[1,`tag`,`mock`],[1,`tag`,`fault`],[1,`tag`,`rule-ref`,3,`title`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`,3,`keydown.escape`],[1,`preview-head`],[`id`,`preview-heading`,`tabindex`,`-1`],[`type`,`button`,1,`ghost`,3,`click`],[1,`preview-meta`],[1,`preview-url`,3,`title`],[1,`preview-rule`],[1,`inline`],[`type`,`checkbox`,3,`change`,`checked`,`disabled`],[1,`rule-pattern`,3,`title`],[1,`rule-method`],[`type`,`button`,1,`link`,`remove`,3,`click`,`disabled`],[1,`rule-meta`],[1,`status`,3,`ok`,`redirect`,`bad`],[1,`rule-note`],[1,`stats`],[1,`plain`,`mismatches`],[1,`mismatch-row`],[1,`mismatch-label`],[1,`plain`],[1,`warn`],[1,`muted`,`small`,`ok-note`],[1,`muted`,`small`,`summary-line`],[`role`,`alert`,1,`bad`],[1,`entries`],[`aria-hidden`,`true`,1,`chevron`],[1,`entry-key`],[1,`entry-size`]],template:function(e,t){if(e&1&&(P(0,lV,4,0,`div`,0)(1,uV,5,0,`div`,1),z(2,`div`,2)(3,`div`,3)(4,`span`,4),J(5,`Page`),B(),z(6,`app-select`,5),G(`valueChange`,function(e){return t.selectPage(e)}),B()(),z(7,`button`,6),G(`click`,function(){return t.clearCalls()}),J(8,` Clear timeline `),B(),z(9,`p`,7),J(10),B()(),z(11,`div`,8)(12,`section`,9)(13,`h2`,10),J(14),B(),V(15,`app-limit-note`,11),P(16,_V,21,0,`div`,12)(17,vV,11,0,`div`,13),P(18,bV,16,14,`div`,14),B(),z(19,`section`,15)(20,`h2`,16),J(21,`Fault injection`),B(),P(22,xV,2,1,`p`,17),z(23,`form`,18),G(`submit`,function(e){return t.addRule(e)}),z(24,`label`)(25,`span`),J(26,`URL pattern `),z(27,`span`,19),J(28,`(substring or * glob)`),B()(),z(29,`input`,20),G(`input`,function(e){return t.patch(`pattern`,e)}),B()(),z(30,`div`,21)(31,`div`,22)(32,`span`,23),J(33,`Method`),B(),z(34,`app-select`,24),G(`valueChange`,function(e){return t.setDraft(`method`,e??``)}),B()(),z(35,`div`,22)(36,`span`,25),J(37,`Apply on`),B(),z(38,`app-select`,26),G(`valueChange`,function(e){return t.setDraft(`target`,e??`both`)}),B()()(),z(39,`div`,21)(40,`label`),J(41,` Status `),z(42,`input`,27),G(`input`,function(e){return t.patch(`status`,e)}),B()(),z(43,`label`),J(44,` Delay (ms) `),z(45,`input`,28),G(`input`,function(e){return t.patch(`delayMs`,e)}),B()()(),z(46,`label`)(47,`span`),J(48,`Mock JSON body `),z(49,`span`,19),J(50,`(optional)`),B()(),z(51,`textarea`,29),G(`input`,function(e){return t.patch(`body`,e)}),B()(),z(52,`p`,30),J(53),B(),P(54,SV,2,0,`p`,31),z(55,`p`,32),J(56),B(),z(57,`div`,33)(58,`button`,34),J(59,` Add rule `),B()()(),z(60,`h3`,35),J(61),B(),z(62,`ul`,36),I(63,OV,17,17,`li`,37,oV,!1,kV,2,0,`li`,38),B()(),z(66,`section`,39)(67,`h2`,40),J(68,`Hydration`),B(),P(69,VV,32,13)(70,HV,5,0,`div`,13),B(),z(71,`section`,41)(72,`h2`,42),J(73,`TransferState payload`),B(),P(74,XV,2,1)(75,ZV,3,0,`div`,13),B()()),e&2){let e,n,r;F(t.loading()?0:t.failed()?1:-1),M(6),R(`options`,t.pageOptions())(`value`,t.selected()?.pageId??null),M(),R(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),Y(t.message()),M(4),X(`HTTP timeline (`,t.timeline().length,`)`),M(),R(`dropped`,t.droppedCalls())(`max`,t.maxCalls()),M(),F(t.timeline().length?16:17),M(2),F((e=t.selectedCall())?18:-1,e),M(4),F(t.canWrite()?-1:22),M(7),R(`value`,t.draft().pattern),M(5),R(`options`,t.methodOptions)(`value`,t.draft().method),M(4),R(`options`,t.targetOptions)(`value`,t.draft().target),M(4),R(`value`,t.draft().status),N(`aria-invalid`,t.statusError()?`true`:null),M(3),R(`value`,t.draft().delayMs),M(6),R(`placeholder`,t.bodyPlaceholder)(`value`,t.draft().body),N(`aria-invalid`,t.bodyError()?`true`:null),M(2),Y(t.bodyError()),M(),F(t.draftMocksOnServer()?54:-1),M(2),Y(t.draftHint()),M(2),R(`disabled`,!t.canWrite()||!t.draftRule()),N(`aria-describedby`,t.canWrite()?`rule-hint`:`http-writes-off`),M(3),X(`Rules (`,t.rules().length,`)`),M(2),L(t.rules()),M(6),F((n=t.selected()?.hydration)?69:70,n),M(5),F((r=t.selectedPayload())?74:75,r)}},dependencies:[oD,XE,ib],styles:[`@charset "UTF-8"; +}`]})},NV=(e,t)=>t.id,PV=(e,t)=>t.side+t.id,FV=(e,t)=>t.key;function IV(e,t){e&1&&(z(0,`div`,0),V(1,`span`,43),z(2,`span`),J(3,`Loading…`),B()())}function LV(e,t){e&1&&(z(0,`div`,1)(1,`strong`),J(2,`Could not reach the devtools server.`),B(),z(3,`span`),J(4,`Check that the app's dev server is running with the devtools plugin, then reopen this panel.`),B()())}function RV(e,t){e&1&&(z(0,`span`,48),J(1,`transfer cache`),B())}function zV(e,t){if(e&1&&(z(0,`span`,48),J(1),B()),e&2){let e=K().$implicit;M(),X(`delayed `,e.delayMs,` ms`)}}function BV(e,t){e&1&&(z(0,`span`,57),J(1,`mocked`),B())}function VV(e,t){e&1&&(z(0,`span`,58),J(1,`faulted`),B())}function HV(e,t){if(e&1&&(z(0,`span`,59),J(1,`rule `),z(2,`code`),J(3),B()()),e&2){let e=t;R(`title`,`Matched rule: `+e),M(3),Y(e)}}function UV(e,t){if(e&1){let e=W();z(0,`tr`,47),G(`click`,function(){let t=k(e).$implicit;return A(K(2).openCall(t.id))}),z(1,`td`)(2,`span`,48),J(3),B()(),z(4,`td`,49),J(5),B(),z(6,`td`,50)(7,`button`,51),J(8),B()(),z(9,`td`,52),J(10),B(),z(11,`td`,53),V(12,`span`,54),J(13),B(),z(14,`td`,55),J(15),B(),z(16,`td`)(17,`div`,56),P(18,RV,2,0,`span`,48),P(19,zV,2,1,`span`,48),P(20,BV,2,0,`span`,57),P(21,VV,2,0,`span`,58),P(22,HV,4,2,`span`,59),B()()()}if(e&2){let e,n=t.$implicit,r=K(2);q(`selected`,r.selectedCall()?.id===n.id),M(2),q(`server`,n.side===`server`),M(),Y(n.side===`server`?`SSR`:`Client`),M(2),Y(n.method),M(2),R(`title`,n.url),N(`data-call-id`,n.id)(`aria-pressed`,r.selectedCall()?.id===n.id)(`aria-controls`,r.selectedCall()?`call-preview`:null),M(),X(` `,n.url,` `),M(),R(`title`,n.pageUrl??``),M(),X(` `,n.pageUrl??``,` `),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(2),X(``,r.statusLabel(n),` `),M(2),X(``,n.durationMs,` ms`),M(3),F(n.cacheHit?18:-1),M(),F(n.delayMs?19:-1),M(),F(n.mocked?20:-1),M(),F(n.faulted?21:-1),M(),F((e=r.rulePatternOf(n))?22:-1,e)}}function WV(e,t){if(e&1&&(z(0,`div`,12)(1,`table`)(2,`thead`)(3,`tr`)(4,`th`,44),J(5,`Side`),B(),z(6,`th`,44),J(7,`Method`),B(),z(8,`th`,44),J(9,`URL`),B(),z(10,`th`,44),J(11,`Page`),B(),z(12,`th`,44),J(13,`Status`),B(),z(14,`th`,45),J(15,`Time`),B(),z(16,`th`,44),J(17,`Notes`),B()()(),z(18,`tbody`),I(19,UV,23,26,`tr`,46,PV),B()()()),e&2){let e=K();M(19),L(e.timeline())}}function GV(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No requests yet.`),B(),z(3,`p`,31),J(4,` Add `),z(5,`code`),J(6,`withNgDevtools()`),B(),J(7,` to `),z(8,`code`),J(9,`provideHttpClient`),B(),J(10,`, then load a page of the app. `),B()())}function KV(e,t){e&1&&(z(0,`p`,66),J(1,` Matched rule `),z(2,`code`),J(3),B()()),e&2&&(M(3),Y(t))}function qV(e,t){if(e&1){let e=W();z(0,`div`,60),G(`keydown.escape`,function(){return k(e),A(K().closePreview())}),z(1,`div`,61)(2,`h3`,62),J(3,`Response preview`),B(),z(4,`button`,63),G(`click`,function(){return k(e),A(K().closePreview())}),J(5,`Close`),B()(),z(6,`p`,64)(7,`span`,49),J(8),B(),z(9,`span`,53),J(10),B(),z(11,`span`,65),J(12),B()(),P(13,KV,4,1,`p`,66),z(14,`pre`),J(15),B()()}if(e&2){let e,n=t,r=K();M(8),Y(n.method),M(),q(`ok`,r.callTone(n)===`ok`)(`redirect`,r.callTone(n)===`redirect`)(`bad`,r.callTone(n)===`bad`),M(),Y(r.statusLabel(n)),M(),R(`title`,n.url),M(),Y(n.url),M(),F((e=r.rulePatternOf(n))?13:-1,e),M(),q(`error`,!!n.error&&!n.cancelled),M(),Y(n.error??n.preview??`(no body)`)}}function JV(e,t){if(e&1&&(z(0,`p`,17),J(1),B()),e&2){let e=K();M(),Y(e.writesOff)}}function YV(e,t){e&1&&(z(0,`p`,31),J(1,` SSR mocks are not transferred to the client: the browser requests the URL again and gets the real response unless the rule also applies on the client. `),B())}function XV(e,t){e&1&&(z(0,`span`),J(1,`passthrough`),B())}function ZV(e,t){if(e&1&&(z(0,`span`,53),J(1),B()),e&2){let e=K().$implicit,t=K();q(`ok`,t.statusTone(e.status)===`ok`)(`redirect`,t.statusTone(e.status)===`redirect`)(`bad`,t.statusTone(e.status)===`bad`),M(),Y(e.status)}}function QV(e,t){if(e&1&&(z(0,`span`),J(1),B()),e&2){let e=K().$implicit;M(),X(``,e.delayMs,` ms`)}}function $V(e,t){e&1&&(z(0,`span`),J(1,`mock body`),B())}function eH(e,t){e&1&&(z(0,`p`,74),J(1,` The SSR mock is not written to TransferState, so the browser requests this URL again. `),B())}function tH(e,t){if(e&1){let e=W();z(0,`li`)(1,`label`,67)(2,`input`,68),G(`change`,function(){let t=k(e).$implicit;return A(K().toggleRule(t.id))}),B(),z(3,`code`,69)(4,`span`,70),J(5),B(),J(6),B()(),z(7,`button`,71),G(`click`,function(){let t=k(e).$implicit;return A(K().removeRule(t.id))}),J(8,` Remove `),B(),z(9,`span`,72)(10,`span`),J(11),B(),P(12,XV,2,0,`span`)(13,ZV,2,7,`span`,73),P(14,QV,2,1,`span`),P(15,$V,2,0,`span`),B(),P(16,eH,2,0,`p`,74),B()}if(e&2){let e=t.$implicit,n=K();q(`off`,!e.enabled),M(2),R(`checked`,e.enabled)(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Enable rule for `+e.pattern),M(),R(`title`,e.pattern),M(2),Y(e.method||`ANY`),M(),X(` `,e.pattern),M(),R(`disabled`,!n.canWrite()),N(`aria-describedby`,n.canWrite()?null:`http-writes-off`)(`aria-label`,`Remove rule for `+e.pattern),M(4),Y(n.targetLabel(e.target)),M(),F(e.status===void 0?12:13),M(2),F(e.delayMs?14:-1),M(),F(e.body?15:-1),M(),F(n.mocksOnServer(e)?16:-1)}}function nH(e,t){e&1&&(z(0,`li`,38),J(1,`No rules. SSR rules apply on the next page load.`),B())}function rH(e,t){if(e&1&&(z(0,`div`)(1,`dt`),J(2,`DOM nodes hydrated`),B(),z(3,`dd`),J(4),B()(),z(5,`div`)(6,`dt`),J(7,`DOM nodes skipped`),B(),z(8,`dd`),J(9),B()(),z(10,`div`)(11,`dt`),J(12,`Mismatched components`),B(),z(13,`dd`),J(14),B()()),e&2){let e=t;M(4),Y(e.hydrated),M(5),Y(e.skipped),M(4),q(`bad`,e.mismatched>0),M(),Y(e.mismatched)}}function iH(e,t){if(e&1&&(z(0,`span`,77)(1,`span`,78),J(2,`Expected`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.expected)}}function aH(e,t){if(e&1&&(z(0,`span`,77)(1,`span`,78),J(2,`Actual`),B(),z(3,`code`),J(4),B()()),e&2){let e=K().$implicit;M(4),Y(e.actual)}}function oH(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B(),P(3,iH,5,1,`span`,77),P(4,aH,5,1,`span`,77),B()),e&2){let e=t.$implicit;M(2),Y(`<`+e.component+`>`),M(),F(e.expected?3:-1),M(),F(e.actual?4:-1)}}function sH(e,t){if(e&1&&(z(0,`h3`),J(1),B(),z(2,`ul`,76),I(3,oH,5,3,`li`,null,Cg),B()),e&2){let e=K();M(),X(`Mismatches (`,e.mismatches.length,`)`),M(2),L(e.mismatches)}}function cH(e,t){if(e&1&&(z(0,`li`)(1,`code`),J(2),B()()),e&2){let e=t.$implicit;M(2),Y(e)}}function lH(e,t){if(e&1&&(z(0,`h3`),J(1,`ngSkipHydration hosts`),B(),z(2,`ul`,79),I(3,cH,3,1,`li`,null,Cg),B()),e&2){let e=K();M(3),L(e.skipHydrationHosts)}}function uH(e,t){e&1&&(z(0,`h3`),J(1,`Warnings`),B(),z(2,`p`,31),J(3,` Not captured: add `),z(4,`code`),J(5,`provideNgDevtoolsHttp()`),B(),J(6,` to the app providers. `),B())}function dH(e,t){if(e&1&&(z(0,`pre`,80),J(1),B()),e&2){let e=t.$implicit;M(),Y(e)}}function fH(e,t){e&1&&(z(0,`p`,81),J(1,`No hydration warnings.`),B())}function pH(e,t){if(e&1&&(z(0,`h3`),J(1),B(),I(2,dH,2,1,`pre`,80,Cg,!1,fH,2,0,`p`,81)),e&2){let e=K();M(),X(`Warnings (`,e.warnings.length,`)`),M(),L(e.warnings)}}function mH(e,t){if(e&1&&(z(0,`dl`,75)(1,`div`)(2,`dt`),J(3,`Enabled`),B(),z(4,`dd`)(5,`span`,48),J(6),B()()(),z(7,`div`)(8,`dt`),J(9,`Hydrated components`),B(),z(10,`dd`),J(11),B()(),z(12,`div`)(13,`dt`),J(14,`Hydrated nodes`),B(),z(15,`dd`),J(16),B()(),z(17,`div`)(18,`dt`),J(19,`Skipped components`),B(),z(20,`dd`),J(21),B()(),z(22,`div`)(23,`dt`),J(24,`Incremental defer blocks`),B(),z(25,`dd`),J(26),B()(),P(27,rH,15,5),B(),P(28,sH,5,1),P(29,lH,5,0),P(30,uH,7,0)(31,pH,5,2)),e&2){let e,n=t;M(5),q(`on`,n.enabled)(`off-tag`,!n.enabled),M(),Y(n.enabled?`yes`:`no (client render only)`),M(5),Y(n.hydratedComponents??`n/a`),M(5),Y(n.hydratedNodes??`n/a`),M(5),Y(n.componentsSkippedHydration??`n/a`),M(5),Y(n.deferBlocksWithIncrementalHydration??`n/a`),M(),F((e=n.nodes)?27:-1,e),M(),F(n.mismatches?.length?28:-1),M(),F(n.skipHydrationHosts.length?29:-1),M(),F(n.warningsCaptured===!1?30:31)}}function hH(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No hydration data for this page.`),B(),z(3,`p`,31),J(4,`Open a server rendered page of the app to see its stats.`),B()())}function gH(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`No TransferState script: this page was not server rendered.`),B()())}function _H(e,t){if(e&1&&(z(0,`p`,83),J(1),B()),e&2){let e=K(2);M(),Y(e.error)}}function vH(e,t){e&1&&(z(0,`span`,48),J(1),B()),e&2&&(M(),Y(t))}function yH(e,t){if(e&1&&(z(0,`span`,48),J(1),B(),z(2,`span`,86),J(3),B()),e&2){let e=t,n=K().$implicit,r=K(3);q(`server`,r.statusTone(e.status)===`ok`)(`fault`,r.statusTone(e.status)===`bad`),M(),X(`HTTP `,e.status),M(2),Y(e.url??n.key)}}function bH(e,t){if(e&1&&(z(0,`span`,86),J(1),B()),e&2){let e=K().$implicit;M(),Y(e.key)}}function xH(e,t){if(e&1&&(z(0,`details`)(1,`summary`),V(2,`span`,85),P(3,vH,2,1,`span`,48),P(4,yH,4,6)(5,bH,2,1,`span`,86),z(6,`span`,87),J(7),B()(),z(8,`pre`),J(9),dv(10,`json`),B()()),e&2){let e,n,r=t.$implicit,i=K(3);M(3),F((e=i.payloadLabel(r))?3:-1,e),M(),F((n=r.http)?4:5,n),M(3),X(``,r.size,` B`),M(2),Y(pv(10,4,r.value))}}function SH(e,t){if(e&1&&(z(0,`p`,82),J(1),B(),P(2,_H,2,1,`p`,83),z(3,`div`,84),I(4,xH,11,6,`details`,null,FV),B()),e&2){let e=K();M(),Y_(` `,e.entries.length,` entr`,e.entries.length===1?`y`:`ies`,`, `,e.size,` bytes `),M(),F(e.error?2:-1),M(2),L(e.entries)}}function CH(e,t){e&1&&P(0,gH,3,0,`div`,13)(1,SH,6,4),e&2&&F(+!!t.found)}function wH(e,t){e&1&&(z(0,`div`,13)(1,`p`),J(2,`Open a page of the app to see its payload.`),B()())}var TH={pattern:``,method:``,target:`both`,status:``,delayMs:``,body:``},EH=50,DH=class e{rpc=$(null);canWrite=Q(()=>iE(this.rpc(),`http`));writesOff=UT(`http`);loading=j(!1);failed=j(!1);serverCalls=j([]);pages=j([]);payloads=j({});serverDropped=j(0);rules=j([]);hostPageId=YT();selectedPageId=Tv({source:()=>this.pages(),computation:(e,t)=>t?.value&&e.some(e=>e.pageId===t.value)?t.value:e.find(e=>e.pageId===this.hostPageId)?.pageId??e[0]?.pageId??null});selectedCallId=j(null);draft=j({...TH});message=j(``);bodyPlaceholder=`{ "error": "Service unavailable" }`;unsubscribe=[];destroyRef=E(Cs);injector=E(xs);host=E(Ml);selected=Q(()=>this.pages().find(e=>e.pageId===this.selectedPageId())??null);selectedPayload=Q(()=>{let e=this.selectedPageId();return e?this.payloads()[e]??null:null});maxCalls=Q(()=>rE(this.rpc()).limits.httpCalls);droppedCalls=Q(()=>(this.selected()?.dropped??0)+this.serverDropped());pageServerCalls=Q(()=>{let e=this.selected()?.initialUrl;return e?this.serverCalls().filter(t=>!t.pageUrl||t.pageUrl===e):this.serverCalls()});timeline=Q(()=>[...this.pageServerCalls(),...this.selected()?.calls??[]].sort((e,t)=>t.at-e.at));selectedCall=Q(()=>this.timeline().find(e=>e.id===this.selectedCallId())??null);draftMocksOnServer=Q(()=>{let e=this.draftRule();return!!e&&this.mocksOnServer(e)});statusError=Q(()=>{let e=this.draft().status.trim();if(!e)return``;let t=Number(e);return Number.isInteger(t)&&t>=100&&t<=599?``:`Set a status from 100 to 599.`});draftRule=Q(()=>{let e=this.draft(),t=e.pattern.trim();if(!t||this.bodyError()||this.statusError()||this.rules().length>=EH)return null;let n=e.body.trim(),r=Math.min(Math.max(Math.round(Number(e.delayMs))||0,0),1e4),i=e.status.trim()?Number(e.status):n?200:void 0;return i===void 0&&!r?null:{pattern:t,enabled:!0,target:e.target,...e.method?{method:e.method}:{},...i===void 0?{}:{status:i},...r?{delayMs:r}:{},...n?{body:n}:{}}});draftHint=Q(()=>{let e=this.draft();return this.rules().length>=EH?`You can add up to ${EH} rules. Remove one to add another.`:e.pattern.trim()?this.statusError()?this.statusError():this.bodyError()?``:this.draftRule()?!e.status.trim()&&e.body.trim()?`With no status, the mock body returns 200.`:``:`Set a status, a delay or a mock body.`:`Enter a URL pattern to add a rule.`});bodyError=Q(()=>{let e=this.draft().body.trim();if(!e)return``;try{return JSON.parse(e),``}catch{return`The mock body must be valid JSON.`}});constructor(){uc(()=>{let e=this.rpc();e&&this.load(e)}),this.destroyRef.onDestroy(()=>this.stopListening())}async load(e){this.loading.set(!0),this.failed.set(!1);try{let t=e.scope(`ng-devtools`).rpc,[n,r]=await Promise.all([t.sharedState(`http`),t.sharedState(`http-payloads`)]);if(this.destroyRef.destroyed)return;let i=e=>{let t=e;this.serverCalls.set(t?.serverCalls??[]),this.serverDropped.set(t?.serverDropped??0),this.pages.set(t?.pages??[]),this.rules.set(t?.rules??[])},a=e=>this.payloads.set(e?.pages??{});i(n.value()),a(r.value()),this.stopListening(),this.unsubscribe=[n.on(`updated`,i),r.on(`updated`,a)]}catch{this.failed.set(!0)}finally{this.loading.set(!1)}}statusLabel(e){return e.cancelled?`cancelled`:e.status?String(e.status):`ERR`}callTone(e){return e.cancelled?`neutral`:this.statusTone(e.status)}rulePatternOf(e){return e.rulePattern?e.rulePattern:e.ruleId?this.rules().find(t=>t.id===e.ruleId)?.pattern??null:null}openCall(e){this.selectedCallId.set(e),Id(()=>this.host.nativeElement.querySelector(`#preview-heading`)?.focus(),{injector:this.injector})}closePreview(){let e=this.selectedCallId();this.selectedCallId.set(null),e&&[...this.host.nativeElement.querySelectorAll(`button[data-call-id]`)].find(t=>t.dataset.callId===e)?.focus()}stopListening(){for(let e of this.unsubscribe.splice(0))e()}statusTone(e){return e===void 0?`neutral`:e===0||e>=400?`bad`:e>=300?`redirect`:e>=200?`ok`:`neutral`}mocksOnServer(e){return e.target!==`client`&&e.status!==void 0&&e.status<400}payloadLabel(e){return e.source===`hydration`?`hydration annotations`:e.fn?`Analog server function ${e.fn.name??e.fn.id}`:e.source===`analog`?`Analog`:null}targetLabel(e){return e===`both`?`SSR + client`:e===`server`?`SSR only`:`Client only`}pageOptions=Q(()=>this.pages().map(e=>({value:e.pageId,label:e.title||e.url})));methodOptions=[{value:``,label:`Any`},...[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].map(e=>({value:e,label:e}))];targetOptions=[{value:`both`,label:`SSR + client`},{value:`server`,label:`SSR only`},{value:`client`,label:`Client only`}];selectPage(e){e&&this.selectedPageId.set(e),this.selectedCallId.set(null)}setDraft(e,t){this.draft.update(n=>({...n,[e]:t}))}patch(e,t){let n=t.target.value;this.draft.update(t=>({...t,[e]:n}))}async addRule(e){e.preventDefault();let t=this.draftRule();if(!t)return;let n={id:`r${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,...t};await this.saveRules([...this.rules(),n],`Rule added.`,n)&&(this.draft.set({...TH}),this.host.nativeElement.querySelector(`#rule-pattern`)?.focus())}toggleRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().map(t=>t.id===e?{...t,enabled:!t.enabled}:t),`Rule updated.`,t)}removeRule(e){let t=this.rules().find(t=>t.id===e);t&&this.saveRules(this.rules().filter(t=>t.id!==e),`Rule removed.`,t)}async clearCalls(){try{await $T(this.rpc(),`clear-http-calls`),this.selectedCallId.set(null),this.message.set(`Timeline cleared.`)}catch{this.message.set(`Could not clear the timeline.`)}}async saveRules(e,t,n){try{let r=await $T(this.rpc(),`set-http-rules`,e);return this.rules.set(Array.isArray(r)?r:e),this.message.set(n.target===`client`?t:`${t} Reload the page to apply it to SSR.`),!0}catch{return this.message.set(`Could not save the rules.`),!1}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-network-inspector`]],inputs:{rpc:[1,`rpc`]},decls:76,vars:32,consts:[[`role`,`status`,1,`state`],[`role`,`alert`,1,`state`,`error`],[1,`toolbar`],[1,`page-picker`],[`id`,`page-picker-label`],[`labelledBy`,`page-picker-label`,`emptyText`,`No connected page`,`placeholder`,`No connected page`,3,`valueChange`,`options`,`value`],[`type`,`button`,3,`click`,`disabled`],[`role`,`status`,1,`message`],[1,`grid`],[`aria-labelledby`,`timeline-heading`,1,`panel`,`wide`],[`id`,`timeline-heading`],[`what`,`HTTP calls`,`limit`,`httpCalls`,3,`dropped`,`max`],[1,`table-wrap`],[1,`empty`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`],[`aria-labelledby`,`rules-heading`,1,`panel`],[`id`,`rules-heading`],[`id`,`http-writes-off`,1,`muted`,`small`],[1,`rule-form`,3,`submit`],[1,`hint`],[`id`,`rule-pattern`,`required`,``,`spellcheck`,`false`,`autocomplete`,`off`,`placeholder`,`e.g. /api/products`,3,`input`,`value`],[1,`row`],[1,`field-group`],[`id`,`rule-method-label`],[`labelledBy`,`rule-method-label`,3,`valueChange`,`options`,`value`],[`id`,`rule-target-label`],[`labelledBy`,`rule-target-label`,3,`valueChange`,`options`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`100`,`max`,`599`,`placeholder`,`e.g. 500`,`aria-describedby`,`rule-hint`,3,`input`,`value`],[`type`,`number`,`inputmode`,`numeric`,`min`,`0`,`max`,`10000`,`placeholder`,`0`,3,`input`,`value`],[`rows`,`3`,`spellcheck`,`false`,`aria-describedby`,`body-error`,3,`input`,`placeholder`,`value`],[`id`,`body-error`,1,`field-error`],[1,`muted`,`small`],[`id`,`rule-hint`,1,`muted`,`small`],[1,`form-actions`],[`type`,`submit`,3,`disabled`],[1,`rules-heading`],[1,`rules`],[3,`off`],[1,`empty-rule`],[`aria-labelledby`,`hydration-heading`,1,`panel`],[`id`,`hydration-heading`],[`aria-labelledby`,`payload-heading`,1,`panel`,`wide`],[`id`,`payload-heading`],[`aria-hidden`,`true`,1,`spinner`],[`scope`,`col`],[`scope`,`col`,1,`num`],[3,`selected`],[3,`click`],[1,`tag`],[1,`method`],[1,`url`],[`type`,`button`,1,`link`,3,`title`],[1,`page-url`,3,`title`],[1,`status`],[`aria-hidden`,`true`,1,`dot`],[1,`num`],[1,`notes`],[1,`tag`,`mock`],[1,`tag`,`fault`],[1,`tag`,`rule-ref`,3,`title`],[`id`,`call-preview`,`role`,`region`,`aria-labelledby`,`preview-heading`,1,`preview`,3,`keydown.escape`],[1,`preview-head`],[`id`,`preview-heading`,`tabindex`,`-1`],[`type`,`button`,1,`ghost`,3,`click`],[1,`preview-meta`],[1,`preview-url`,3,`title`],[1,`preview-rule`],[1,`inline`],[`type`,`checkbox`,3,`change`,`checked`,`disabled`],[1,`rule-pattern`,3,`title`],[1,`rule-method`],[`type`,`button`,1,`link`,`remove`,3,`click`,`disabled`],[1,`rule-meta`],[1,`status`,3,`ok`,`redirect`,`bad`],[1,`rule-note`],[1,`stats`],[1,`plain`,`mismatches`],[1,`mismatch-row`],[1,`mismatch-label`],[1,`plain`],[1,`warn`],[1,`muted`,`small`,`ok-note`],[1,`muted`,`small`,`summary-line`],[`role`,`alert`,1,`bad`],[1,`entries`],[`aria-hidden`,`true`,1,`chevron`],[1,`entry-key`],[1,`entry-size`]],template:function(e,t){if(e&1&&(P(0,IV,4,0,`div`,0)(1,LV,5,0,`div`,1),z(2,`div`,2)(3,`div`,3)(4,`span`,4),J(5,`Page`),B(),z(6,`app-select`,5),G(`valueChange`,function(e){return t.selectPage(e)}),B()(),z(7,`button`,6),G(`click`,function(){return t.clearCalls()}),J(8,` Clear timeline `),B(),z(9,`p`,7),J(10),B()(),z(11,`div`,8)(12,`section`,9)(13,`h2`,10),J(14),B(),V(15,`app-limit-note`,11),P(16,WV,21,0,`div`,12)(17,GV,11,0,`div`,13),P(18,qV,16,14,`div`,14),B(),z(19,`section`,15)(20,`h2`,16),J(21,`Fault injection`),B(),P(22,JV,2,1,`p`,17),z(23,`form`,18),G(`submit`,function(e){return t.addRule(e)}),z(24,`label`)(25,`span`),J(26,`URL pattern `),z(27,`span`,19),J(28,`(substring or * glob)`),B()(),z(29,`input`,20),G(`input`,function(e){return t.patch(`pattern`,e)}),B()(),z(30,`div`,21)(31,`div`,22)(32,`span`,23),J(33,`Method`),B(),z(34,`app-select`,24),G(`valueChange`,function(e){return t.setDraft(`method`,e??``)}),B()(),z(35,`div`,22)(36,`span`,25),J(37,`Apply on`),B(),z(38,`app-select`,26),G(`valueChange`,function(e){return t.setDraft(`target`,e??`both`)}),B()()(),z(39,`div`,21)(40,`label`),J(41,` Status `),z(42,`input`,27),G(`input`,function(e){return t.patch(`status`,e)}),B()(),z(43,`label`),J(44,` Delay (ms) `),z(45,`input`,28),G(`input`,function(e){return t.patch(`delayMs`,e)}),B()()(),z(46,`label`)(47,`span`),J(48,`Mock JSON body `),z(49,`span`,19),J(50,`(optional)`),B()(),z(51,`textarea`,29),G(`input`,function(e){return t.patch(`body`,e)}),B()(),z(52,`p`,30),J(53),B(),P(54,YV,2,0,`p`,31),z(55,`p`,32),J(56),B(),z(57,`div`,33)(58,`button`,34),J(59,` Add rule `),B()()(),z(60,`h3`,35),J(61),B(),z(62,`ul`,36),I(63,tH,17,17,`li`,37,NV,!1,nH,2,0,`li`,38),B()(),z(66,`section`,39)(67,`h2`,40),J(68,`Hydration`),B(),P(69,mH,32,13)(70,hH,5,0,`div`,13),B(),z(71,`section`,41)(72,`h2`,42),J(73,`TransferState payload`),B(),P(74,CH,2,1)(75,wH,3,0,`div`,13),B()()),e&2){let e,n,r;F(t.loading()?0:t.failed()?1:-1),M(6),R(`options`,t.pageOptions())(`value`,t.selected()?.pageId??null),M(),R(`disabled`,!t.canWrite()),N(`aria-describedby`,t.canWrite()?null:`http-writes-off`),M(3),Y(t.message()),M(4),X(`HTTP timeline (`,t.timeline().length,`)`),M(),R(`dropped`,t.droppedCalls())(`max`,t.maxCalls()),M(),F(t.timeline().length?16:17),M(2),F((e=t.selectedCall())?18:-1,e),M(4),F(t.canWrite()?-1:22),M(7),R(`value`,t.draft().pattern),M(5),R(`options`,t.methodOptions)(`value`,t.draft().method),M(4),R(`options`,t.targetOptions)(`value`,t.draft().target),M(4),R(`value`,t.draft().status),N(`aria-invalid`,t.statusError()?`true`:null),M(3),R(`value`,t.draft().delayMs),M(6),R(`placeholder`,t.bodyPlaceholder)(`value`,t.draft().body),N(`aria-invalid`,t.bodyError()?`true`:null),M(2),Y(t.bodyError()),M(),F(t.draftMocksOnServer()?54:-1),M(2),Y(t.draftHint()),M(2),R(`disabled`,!t.canWrite()||!t.draftRule()),N(`aria-describedby`,t.canWrite()?`rule-hint`:`http-writes-off`),M(3),X(`Rules (`,t.rules().length,`)`),M(2),L(t.rules()),M(6),F((n=t.selected()?.hydration)?69:70,n),M(5),F((r=t.selectedPayload())?74:75,r)}},dependencies:[pD,nD,ab],styles:[`@charset "UTF-8"; [_nghost-%COMP%] { display: block; color: var(--%NS%text); @@ -11597,7 +11746,7 @@ summary[_ngcontent-%COMP%]:hover .entry-key[_ngcontent-%COMP%] { .message[_ngcontent-%COMP%] { text-align: left; } -}`]})};function tH(e,t){e&1&&(fs(),H(0,`svg`,9),Fg(1,`path`,20),U())}function nH(e,t){e&1&&(fs(),H(0,`svg`,10),Fg(1,`path`,21)(2,`path`,22)(3,`path`,23)(4,`path`,24),U())}function rH(e,t){e&1&&(fs(),H(0,`svg`,9),Fg(1,`path`,25)(2,`path`,26)(3,`path`,27)(4,`path`,28)(5,`path`,29)(6,`path`,30),U())}function iH(e,t){if(e&1&&(H(0,`a`,15),Fg(1,`img`,31),H(2,`span`,32)(3,`span`,33),J(4,`Being built by`),U(),H(5,`strong`),J(6),U(),H(7,`span`,34),J(8),U()(),H(9,`span`,35),J(10,`→`),U(),H(11,`span`,36),J(12,`(opens in a new tab)`),U()()),e&2){let e=t,n=K();Vg(`href`,`https://github.com/santoshyadavdev/angular-devtools/pull/`+n.info().pr,ku),M(),Vg(`src`,`https://github.com/`+e.login+`.png?size=96`,ku),M(5),Y(e.name),M(2),Z(`@`,e.login,` · PR #`,n.info().pr)}}function aH(e,t){if(e&1&&(H(0,`a`,16)(1,`span`,32)(2,`strong`),J(3),U()(),H(4,`span`,35),J(5,`→`),U(),H(6,`span`,36),J(7,`(opens in a new tab)`),U()()),e&2){let e=t;Vg(`href`,e.href,ku),M(3),Y(e.label)}}function oH(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit,n=t.$index;C_(`animation-delay`,200+n*120,`ms`),M(),Y(e)}}var sH=class e{info=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-coming-soon`]],hostVars:2,hostBindings:function(e,t){e&2&&C_(`--%NS%brand`,t.info().color)},inputs:{info:[1,`info`]},decls:29,vars:7,consts:[[`aria-labelledby`,`soon-title`,1,`soon`],[`aria-hidden`,`true`,1,`stage`],[1,`ring`,`r1`],[1,`ring`,`r2`],[1,`orbit`,`o1`],[1,`dot`],[1,`orbit`,`o2`],[1,`orbit`,`o3`],[1,`logo`],[`viewBox`,`0 0 256 256`,`width`,`96`,`height`,`96`],[`viewBox`,`0 0 256 182`,`width`,`104`,`height`,`74`],[1,`badge`],[`aria-hidden`,`true`,1,`spark`],[`id`,`soon-title`],[1,`summary`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,3,`href`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,`cta`,3,`href`],[1,`plans-title`],[1,`plans`],[3,`animation-delay`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`width`,`40`,`height`,`40`,`alt`,``,3,`src`],[1,`who`],[1,`by`],[1,`login`],[`aria-hidden`,`true`,1,`go`],[1,`sr-only`]],template:function(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,1),Fg(2,`span`,2)(3,`span`,3),H(4,`span`,4),Fg(5,`span`,5),U(),H(6,`span`,6),Fg(7,`span`,5),U(),H(8,`span`,7),Fg(9,`span`,5),U(),H(10,`div`,8),P(11,tH,2,0,`:svg:svg`,9)(12,nH,5,0,`:svg:svg`,10)(13,rH,7,0,`:svg:svg`,9),U()(),H(14,`p`,11)(15,`span`,12),J(16,`✦`),U(),J(17),U(),H(18,`h2`,13),J(19),U(),H(20,`p`,14),J(21),U(),P(22,iH,13,5,`a`,15),P(23,aH,8,2,`a`,16),H(24,`h3`,17),J(25),U(),H(26,`ul`,18),I(27,oH,2,3,`li`,19,wg),U()()),e&2){let e,n,r;M(11),F((e=t.info().id)===`nativescript`?11:e===`analog`?12:e===`capacitor`?13:-1),M(6),X(` `,t.info().badge),M(2),Y(t.info().heading),M(2),Y(t.info().summary),M(),F((n=t.info().author)?22:-1,n),M(),F((r=t.info().link)?23:-1,r),M(2),X(` `,t.info().link?`In an `+t.info().name+` app`:`On the roadmap`,` `),M(2),L(t.info().plans)}},styles:[`[_nghost-%COMP%] { +}`]})};function OH(e,t){e&1&&(fs(),H(0,`svg`,9),Fg(1,`path`,20),U())}function kH(e,t){e&1&&(fs(),H(0,`svg`,10),Fg(1,`path`,21)(2,`path`,22)(3,`path`,23)(4,`path`,24),U())}function AH(e,t){e&1&&(fs(),H(0,`svg`,9),Fg(1,`path`,25)(2,`path`,26)(3,`path`,27)(4,`path`,28)(5,`path`,29)(6,`path`,30),U())}function jH(e,t){if(e&1&&(H(0,`a`,15),Fg(1,`img`,31),H(2,`span`,32)(3,`span`,33),J(4,`Being built by`),U(),H(5,`strong`),J(6),U(),H(7,`span`,34),J(8),U()(),H(9,`span`,35),J(10,`→`),U(),H(11,`span`,36),J(12,`(opens in a new tab)`),U()()),e&2){let e=t,n=K();Vg(`href`,`https://github.com/santoshyadavdev/angular-devtools/pull/`+n.info().pr,ku),M(),Vg(`src`,`https://github.com/`+e.login+`.png?size=96`,ku),M(5),Y(e.name),M(2),Z(`@`,e.login,` · PR #`,n.info().pr)}}function MH(e,t){if(e&1&&(H(0,`a`,16)(1,`span`,32)(2,`strong`),J(3),U()(),H(4,`span`,35),J(5,`→`),U(),H(6,`span`,36),J(7,`(opens in a new tab)`),U()()),e&2){let e=t;Vg(`href`,e.href,ku),M(3),Y(e.label)}}function NH(e,t){if(e&1&&(H(0,`li`),J(1),U()),e&2){let e=t.$implicit,n=t.$index;C_(`animation-delay`,200+n*120,`ms`),M(),Y(e)}}var PH=class e{info=$.required();static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-coming-soon`]],hostVars:2,hostBindings:function(e,t){e&2&&C_(`--%NS%brand`,t.info().color)},inputs:{info:[1,`info`]},decls:29,vars:7,consts:[[`aria-labelledby`,`soon-title`,1,`soon`],[`aria-hidden`,`true`,1,`stage`],[1,`ring`,`r1`],[1,`ring`,`r2`],[1,`orbit`,`o1`],[1,`dot`],[1,`orbit`,`o2`],[1,`orbit`,`o3`],[1,`logo`],[`viewBox`,`0 0 256 256`,`width`,`96`,`height`,`96`],[`viewBox`,`0 0 256 182`,`width`,`104`,`height`,`74`],[1,`badge`],[`aria-hidden`,`true`,1,`spark`],[`id`,`soon-title`],[1,`summary`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,3,`href`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`author`,`cta`,3,`href`],[1,`plans-title`],[1,`plans`],[3,`animation-delay`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`width`,`40`,`height`,`40`,`alt`,``,3,`src`],[1,`who`],[1,`by`],[1,`login`],[`aria-hidden`,`true`,1,`go`],[1,`sr-only`]],template:function(e,t){if(e&1&&(H(0,`section`,0)(1,`div`,1),Fg(2,`span`,2)(3,`span`,3),H(4,`span`,4),Fg(5,`span`,5),U(),H(6,`span`,6),Fg(7,`span`,5),U(),H(8,`span`,7),Fg(9,`span`,5),U(),H(10,`div`,8),P(11,OH,2,0,`:svg:svg`,9)(12,kH,5,0,`:svg:svg`,10)(13,AH,7,0,`:svg:svg`,9),U()(),H(14,`p`,11)(15,`span`,12),J(16,`✦`),U(),J(17),U(),H(18,`h2`,13),J(19),U(),H(20,`p`,14),J(21),U(),P(22,jH,13,5,`a`,15),P(23,MH,8,2,`a`,16),H(24,`h3`,17),J(25),U(),H(26,`ul`,18),I(27,NH,2,3,`li`,19,wg),U()()),e&2){let e,n,r;M(11),F((e=t.info().id)===`nativescript`?11:e===`analog`?12:e===`capacitor`?13:-1),M(6),X(` `,t.info().badge),M(2),Y(t.info().heading),M(2),Y(t.info().summary),M(),F((n=t.info().author)?22:-1,n),M(),F((r=t.info().link)?23:-1,r),M(2),X(` `,t.info().link?`In an `+t.info().name+` app`:`On the roadmap`,` `),M(2),L(t.info().plans)}},styles:[`[_nghost-%COMP%] { display: block; min-height: 100%; background: radial-gradient(60% 50% at 50% 18%, color-mix(in srgb, var(--%NS%brand) 22%, transparent), transparent 70%); @@ -11959,7 +12108,7 @@ h2[_ngcontent-%COMP%] { .author[_ngcontent-%COMP%]:hover .go[_ngcontent-%COMP%] { transform: none; } -}`]})},cH=` +}`]})},FH=` .devframes-dock-entry button { transition: opacity 0.2s, filter 0.2s, background-color 0.2s, transform 0.3s; } @@ -11990,7 +12139,7 @@ h2[_ngcontent-%COMP%] { transition: none; } } -`;function lH(e,t=50){let n=e?.querySelector(`devframes-dock-standalone`)?.shadowRoot;if(n){if(n.querySelector(`style[data-ng-devtools]`))return;let t=e.createElement(`style`);t.dataset.ngDevtools=``,t.textContent=cH,n.append(t);return}t>0&&setTimeout(()=>lH(e,t-1),100)}var uH=`__DEVFRAME_HUB_CLIENT_CONTEXT__`,dH=`ng-devtools:`;function fH(){try{return window.parent===window?void 0:window.parent[uH]}catch{return}}function pH(e,t,n=50){let r=fH();if(!r){if(n<=0||window.parent===window)return()=>{};let r=()=>{},i=setTimeout(()=>r=pH(e,t,n-1),100);return()=>{clearTimeout(i),r()}}let i=e.map(e=>r.docks.getStateById(dH+e)?.events.on(`entry:activated`,()=>t(e))??(()=>{})),a=r.docks.selectedId,o=e.find(e=>dH+e===a);return o&&t(o),()=>i.forEach(e=>e())}async function mH(e){let t=fH();if(!t)return!1;try{return await t.docks.switchEntry(dH+e)}catch{return!1}}var hH=`ng-devtools-tab`;function gH(e,t,n){let r=new URLSearchParams(e.replace(/^#/,``)).get(`tab`)||t;return n.find(e=>e===r)}function _H(e){try{return sessionStorage.getItem(`${hH}:${e}`)}catch{return null}}function vH(e,t){try{sessionStorage.setItem(`${hH}:${e}`,t)}catch{}}function yH(e,t){try{return new URL(e,t.href).origin===t.origin}catch{return!1}}function bH(e,t){if(t.protocol!==`chrome-extension:`)return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function xH(e=location){let t=new URLSearchParams(e.search).get(`baseURL`);if(t&&(yH(t,e)||bH(t,e)))return t;if(!(e.pathname.includes(`__ng-devtools`)||e.pathname.includes(`__devframes/`)))return[`/__ng-devtools/`,`./`]}var SH=[`nav`],CH=[`main`],wH=(e,t)=>t.id;function TH(e,t){e&1&&(fs(),z(0,`svg`,4),V(1,`path`,18),B())}function EH(e,t){e&1&&(fs(),z(0,`svg`,4),V(1,`path`,19)(2,`path`,20)(3,`path`,21)(4,`path`,22)(5,`path`,23)(6,`path`,24),B())}function DH(e,t){e&1&&(fs(),z(0,`svg`,5),V(1,`path`,25)(2,`path`,26)(3,`path`,27)(4,`path`,28),B())}function OH(e,t){e&1&&(fs(),z(0,`svg`,6),V(1,`path`,29),B())}function kH(e,t){e&1&&(fs(),z(0,`svg`,7)(1,`defs`)(2,`linearGradient`,30),V(3,`stop`,31)(4,`stop`,32)(5,`stop`,33)(6,`stop`,34)(7,`stop`,35)(8,`stop`,36),B()(),V(9,`path`,37),B())}function AH(e,t){e&1&&(fs(),z(0,`svg`,8),V(1,`path`,38),B())}function jH(e,t){if(e&1){let e=W();z(0,`button`,40),G(`click`,function(){let t=k(e).$implicit;return A(K(2).switchTab(t.id))}),V(1,`app-tab-icon`,41),z(2,`span`),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.tab()===e.id),N(`aria-current`,n.tab()===e.id?`page`:null),M(),R(`name`,e.id),M(2),Y(e.label)}}function MH(e,t){e&1&&I(0,jH,4,5,`button`,39,wH),e&2&&L(K().tabs())}function NH(e,t){e&1&&(z(0,`p`,15),J(1,` Can't reach the devtools server. Check that the dev server is running, then reload. `),B())}function PH(e,t){e&1&&V(0,`app-coming-soon`,16),e&2&&R(`info`,t)}function FH(e,t){e&1&&(z(0,`p`,17),J(1,` This inspector is turned off in the devtools config (`),z(2,`code`),J(3,`inspectors`),B(),J(4,`). `),B())}function IH(e,t){if(e&1){let e=W();z(0,`app-dashboard`,44),G(`navigate`,function(t){return k(e),A(K(2).switchTab(t))}),B()}e&2&&R(`rpc`,K(2).rpc())}function LH(e,t){if(e&1){let e=W();z(0,`app-component-tree`,45),G(`focusHandled`,function(){return k(e),A(K(2).componentFocus.set(null))})(`showForm`,function(t){return k(e),A(K(2).showForm(t))}),B()}if(e&2){let e=K(2);R(`rpc`,e.rpc())(`focus`,e.componentFocus())}}function RH(e,t){e&1&&V(0,`app-route-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function zH(e,t){e&1&&V(0,`app-signal-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function BH(e,t){e&1&&V(0,`app-di-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function VH(e,t){e&1&&V(0,`app-store-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function HH(e,t){e&1&&V(0,`app-network-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function UH(e,t){if(e&1){let e=W();z(0,`app-forms-inspector`,46),G(`focusHandled`,function(){return k(e),A(K(2).formFocus.set(null))}),B()}if(e&2){let e=K(2);R(`rpc`,e.rpc())(`focus`,e.formFocus())}}function WH(e,t){e&1&&V(0,`app-pipes-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function GH(e,t){e&1&&V(0,`app-analog-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function KH(e,t){if(e&1&&P(0,IH,1,1,`app-dashboard`,42)(1,LH,1,2,`app-component-tree`,43)(2,RH,1,1,`app-route-inspector`,42)(3,zH,1,1,`app-signal-inspector`,42)(4,BH,1,1,`app-di-inspector`,42)(5,VH,1,1,`app-store-inspector`,42)(6,HH,1,1,`app-network-inspector`,42)(7,UH,1,2,`app-forms-inspector`,43)(8,WH,1,1,`app-pipes-inspector`,42)(9,GH,1,1,`app-analog-inspector`,42),e&2){let e;F((e=K().tab())===`dashboard`?0:e===`components`?1:e===`routes`?2:e===`signals`?3:e===`injectors`?4:e===`store`?5:e===`network`?6:e===`forms`?7:e===`pipes`?8:e===`analog`?9:-1)}}var qH=[`angular`,`ngrx`,`analog`,`nativescript`,`capacitor`],JH={angular:`Angular`,ngrx:`NgRx Store`,analog:`Analog`,nativescript:`NativeScript`,capacitor:`Capacitor`},YH={ngrx:`#d770e8`,analog:`#ff5470`,nativescript:`#8196ff`,capacitor:`#53b9ff`},XH={ngrx:`store`,analog:`analog`},ZH={store:`ngrx`,analog:`analog`},QH={nativescript:{id:`nativescript`,name:`NativeScript`,badge:`Coming Soon`,heading:`NativeScript Support`,summary:`Inspect NativeScript Angular apps running natively on iOS and Android, with the same tools.`,color:`#3c5afd`,plans:[`Native overlay that reports the component tree from the device`,`Standalone devtools server your phone or simulator connects to`,`Example NativeScript app to try it end to end`],pr:16,author:{name:`Nathan Walker`,login:`NathanWalker`}},capacitor:{id:`capacitor`,name:`Capacitor`,badge:`Coming Soon`,heading:`Capacitor Support`,summary:`Connect Ionic and Capacitor apps running in a device WebView back to these tools.`,color:`#119eff`,plans:[`Manual overlay start for apps that load from capacitor:// or a device`,`Connection settings passed in, no cross-origin probing`,`Setup guides for the Android emulator and iOS simulator`],pr:21,author:{name:`Erkam Yaman`,login:`erkamyaman`}}},$H={id:`analog`,name:`Analog`,badge:`Not in this app`,heading:`This app doesn’t use Analog`,summary:`In an Analog app this dock shows your file routes, server load() and API calls, render modes and route lint.`,color:`#dd0330`,plans:[`Which page, layout and .server.ts files render a URL`,`Every load(), server function and API call with timing`,`SSR, prerendered or client only, per page`],link:{label:`Get started with Analog`,href:`https://analogjs.org/docs/getting-started`}};function eU(){let e=new URLSearchParams(location.search).get(`view`);return qH.find(t=>t===e)??null}Hb(class e{analog=j(!1);allTabs=[{id:`dashboard`,label:`Dashboard`},{id:`analog`,label:`Analog`},{id:`components`,label:`Components`},{id:`routes`,label:`Routes`},{id:`signals`,label:`Signals`},{id:`injectors`,label:`Injectors`},{id:`store`,label:`Store`},{id:`forms`,label:`Forms`},{id:`pipes`,label:`Pipes`},{id:`network`,label:`SSR & HTTP`}];view=j(eU());viewAccent=Q(()=>{let e=this.view();return(e&&YH[e])??null});title=Q(()=>{let e=this.view();return e?JH[e]:`Angular DevTools`});analogKnown=j(!1);comingSoon=Q(()=>{let e=this.view();return e===`analog`?this.analogKnown()&&!this.analog()?$H:void 0:e?QH[e]:void 0});config=Q(()=>tE(this.rpc()));tabEnabled=iE;tabs=Q(()=>{if(this.comingSoon())return[];let e=this.view(),t=e?XH[e]:void 0,n=this.allTabs.filter(e=>iE(e.id,this.config()));return t?n.filter(e=>e.id===t):n.filter(t=>(t.id!==`analog`||this.analog())&&!(e===`angular`&&ZH[t.id]))});tab=wv(()=>{let e=this.view();return e&&XH[e]||`dashboard`});rpc=j(null);connected=j(!1);connectionFailed=j(!1);hiddenPages=j([]);pageId=JT();backgroundNote=Q(()=>{let e=this.hiddenPages();return this.pageId?e.includes(this.pageId)?`Tab in background, showing the last data.`:``:e.length?e.length===1?`A tab is in the background, showing its last data.`:`${e.length} tabs are in the background, showing their last data.`:``});stopVisibility=()=>{};stopFollowing=()=>{};nav=Lv(`nav`);main=Lv(`main`);injector=E(xs);navObserver;navFade=j({start:!1,end:!1});constructor(){Id(()=>{let e=this.nav()?.nativeElement;e&&typeof ResizeObserver<`u`&&(this.navObserver=new ResizeObserver(()=>this.measureNav()),this.navObserver.observe(e))}),$v(()=>{this.tab(),this.tabs(),Sv(()=>{this.revealActiveTab(),this.measureNav()})})}measureNav(){let e=this.nav()?.nativeElement;if(!e)return;let t=e.scrollWidth-e.clientWidth,n=e.scrollLeft>1,r=t>1&&e.scrollLeftn?e.scrollLeft=Math.max(0,n):e.scrollLeftthis.showView(e)));try{window.parent!==window&&lH(window.parent.document)}catch{}let e=gH(location.hash,_H(this.tabScope()),this.tabs().map(e=>e.id));e&&this.tab.set(e);let t=xH();OT(t?{baseURL:t}:{}).then(e=>{this.rpc.set(e),this.connected.set(!0),this.watchVisibility(e),e.scope(`ng-devtools`).rpc.call(`analog-project`).then(e=>{let t=!!e?.analog;this.analog.set(t),this.analogKnown.set(!0),!t&&this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)},()=>{this.analogKnown.set(!0),this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)}),e.events.on(`connection:status`,e=>{this.connected.set(e===`connected`)})},()=>{this.connectionFailed.set(!0),this.analogKnown.set(!0)})}ngOnDestroy(){this.stopFollowing(),this.stopVisibility(),this.navObserver?.disconnect()}showView(e){if(e===this.view())return;this.view.set(e);let t=new URL(location.href);t.searchParams.set(`view`,e),t.hash=``,history.replaceState(history.state,``,t)}formFocus=j(null);componentFocus=wv({source:this.tab,computation:()=>null});showForm(e){this.formFocus.set({id:e}),this.switchTab(`forms`)}inspectFromPanel({source:e,origin:t,data:n}){if(e!==window.parent||t!==location.origin)return;let r=n;r?.type===`ng-devtools:inspect-component`&&typeof r.id==`string`&&this.tab()===`components`&&this.config().inspectors.components&&this.componentFocus.set({id:r.id})}switchTab(e){let t=ZH[e];if(this.view()===`angular`&&t){this.activateDock(t,e);return}this.setTab(e),history.replaceState(history.state,``,`#tab=${e}`)}setTab(e){this.keepFocus(),this.tab.set(e),vH(this.tabScope(),e)}tabScope(){return this.view()??`panel`}async watchVisibility(e){try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`page-visibility`),n=e=>{let t=e?.hidden;this.hiddenPages.set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])};n(t.value()),this.stopVisibility(),this.stopVisibility=t.on(`updated`,n)}catch{}}keepFocus(){let e=document.activeElement,t=this.main()?.nativeElement;(!e||e===document.body||t?.contains(e))&&Id(()=>{let e=document.activeElement;e&&e!==document.body||(this.nav()?.nativeElement.querySelector(`button.active`)??this.main()?.nativeElement)?.focus()},{injector:this.injector})}async activateDock(e,t){if(await mH(e))return;if(window.parent===window){this.keepFocus(),this.showView(e);return}let n=this.rpc();if(!n?.call){this.setTab(t);return}try{await n.call(`hub:docks:activate`,{dockId:`ng-devtools:${e}`}),this.keepFocus(),this.showView(e)}catch{this.setTab(t)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-root`]],viewQuery:function(e,t){e&1&&e_(t.nav,SH,5)(t.main,CH,5),e&2&&t_(2)},hostVars:2,hostBindings:function(e,t){e&1&&G(`message`,function(e){return t.inspectFromPanel(e)},ju),e&2&&C_(`--%NS%accent`,t.viewAccent())},decls:26,vars:18,consts:[[`nav`,``],[`main`,``],[1,`brand`],[1,`mark`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 256 256`,`aria-hidden`,`true`],[`width`,`24`,`height`,`17`,`viewBox`,`0 0 256 182`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 24 24`,`fill`,`currentColor`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`fill`,`currentColor`,`aria-hidden`,`true`],[1,`title`],[`aria-label`,`Inspectors`,3,`scroll`],[`role`,`status`,1,`status`],[`aria-hidden`,`true`,1,`dot`],[`tabindex`,`-1`],[`role`,`status`,1,`background-note`],[`role`,`alert`,1,`connection-error`],[3,`info`],[1,`turned-off`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`d`,`M12.024.017V0L12 .008L11.976 0v.017L.812 3.892l1.605 14.875l9.559 5.207V24l.024-.013l.024.013v-.026l9.559-5.207l1.605-14.875zm6.868 14.244q-1.64 3.948-6.031 4.166c-2.829 0-4.661-1.7-4.66-1.7q-1.745-1.359-2.398-3.417c-.695-.76-.702-.841-.774-1.145c-.072-.303.045-.388.249-.685q.204-.298.098-.85q-.26-.36-.3-1.128q0-.37.496-.783q.495-.413.607-.632q.083-.119.065-1.031q-.006-.897.995-.975c1-.08 1.565-.832 1.879-1.174c.21-.228.52-.339.91-.341c.551-.026 1.052.185 1.484.62c1.075-.055 2.176.235 3.292.863q2.379 1.414 2.596 3.055q-.257 2.158-5.788-.113q-2.895.819-2.846 3.552q0 2.508 2.422 3.643c-.787-.772-1.122-1.422-1.01-1.959q2.456 2.906 5.588 2.173c-.92.032-1.65-.264-2.198-.893q2.116-.05 3.998-1.972c-.724.576-1.482.794-2.284.657q3.26-2.563 2.307-5.98l-.002-.006a3.02 3.02 0 0 1 .788 2.03q.023 1.175-.795 2.477q.613-.478 1.413-2.047c.23 2.117-.625 3.724-2.574 4.825q.934-.085 2.473-1.23m-5.567-6.63a.319.319 0 1 1 .638 0a.319.319 0 0 1-.638 0`],[`id`,`ng-grad`,`x1`,`49`,`x2`,`226`,`y1`,`214`,`y2`,`130`,`gradientUnits`,`userSpaceOnUse`],[`stop-color`,`#E40035`],[`offset`,`.24`,`stop-color`,`#F60A48`],[`offset`,`.352`,`stop-color`,`#F20755`],[`offset`,`.494`,`stop-color`,`#DC087D`],[`offset`,`.745`,`stop-color`,`#9717E7`],[`offset`,`1`,`stop-color`,`#6C00F5`],[`fill`,`url(#ng-grad)`,`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`type`,`button`,3,`active`],[`type`,`button`,3,`click`],[3,`name`],[3,`rpc`],[3,`rpc`,`focus`],[3,`navigate`,`rpc`],[3,`focusHandled`,`showForm`,`rpc`,`focus`],[3,`focusHandled`,`rpc`,`focus`]],template:function(e,t){if(e&1&&(z(0,`header`)(1,`h1`,2)(2,`span`,3),P(3,TH,2,0,`:svg:svg`,4)(4,EH,7,0,`:svg:svg`,4)(5,DH,5,0,`:svg:svg`,5)(6,OH,2,0,`:svg:svg`,6)(7,kH,10,0,`:svg:svg`,7)(8,AH,2,0,`:svg:svg`,8),B(),z(9,`span`,9),J(10),B()(),z(11,`nav`,10,0),G(`scroll`,function(){return t.measureNav()}),P(13,MH,2,0),B(),z(14,`span`,11)(15,`span`,12),V(16,`span`),B(),J(17),B()(),z(18,`main`,13,1)(20,`p`,14),J(21),B(),P(22,NH,2,0,`p`,15)(23,PH,1,1,`app-coming-soon`,16)(24,FH,5,0,`p`,17)(25,KH,10,1),B()),e&2){let e;M(2),q(`ng-mark`,t.view()===`angular`),M(),F(t.view()===`nativescript`?3:t.view()===`capacitor`?4:t.view()===`analog`?5:t.view()===`ngrx`?6:t.view()===`angular`?7:8),M(6),q(`ng-text`,t.view()===`angular`),M(),Y(t.title()),M(),q(`fade-start`,t.navFade().start)(`fade-end`,t.navFade().end),M(2),F(t.tabs().length>1?13:-1),M(),q(`connected`,t.connected())(`failed`,t.connectionFailed()),M(3),X(` `,t.connected()?`Live`:t.connectionFailed()?`Disconnected`:`Connecting…`,` `),M(4),Y(t.backgroundNote()),M(),F(t.connectionFailed()?22:(e=t.comingSoon())?23:t.tabEnabled(t.tab(),t.config())?25:24,e)}},dependencies:[BE,WO,fM,CN,jP,tI,$L,QR,aV,eH,sH,hE],styles:[`[_nghost-%COMP%] { +`;function IH(e,t=50){let n=e?.querySelector(`devframes-dock-standalone`)?.shadowRoot;if(n){if(n.querySelector(`style[data-ng-devtools]`))return;let t=e.createElement(`style`);t.dataset.ngDevtools=``,t.textContent=FH,n.append(t);return}t>0&&setTimeout(()=>IH(e,t-1),100)}var LH=`__DEVFRAME_HUB_CLIENT_CONTEXT__`,RH=`ng-devtools:`;function zH(){try{return window.parent===window?void 0:window.parent[LH]}catch{return}}function BH(e,t,n=50){let r=zH();if(!r){if(n<=0||window.parent===window)return()=>{};let r=()=>{},i=setTimeout(()=>r=BH(e,t,n-1),100);return()=>{clearTimeout(i),r()}}let i=e.map(e=>r.docks.getStateById(RH+e)?.events.on(`entry:activated`,()=>t(e))??(()=>{})),a=r.docks.selectedId,o=e.find(e=>RH+e===a);return o&&t(o),()=>i.forEach(e=>e())}async function VH(e){let t=zH();if(!t)return!1;try{return await t.docks.switchEntry(RH+e)}catch{return!1}}var HH=`ng-devtools-tab`;function UH(e,t,n){let r=new URLSearchParams(e.replace(/^#/,``)).get(`tab`)||t;return n.find(e=>e===r)}function WH(e){try{return sessionStorage.getItem(`${HH}:${e}`)}catch{return null}}function GH(e,t){try{sessionStorage.setItem(`${HH}:${e}`,t)}catch{}}function KH(e,t){try{return new URL(e,t.href).origin===t.origin}catch{return!1}}function qH(e,t){if(t.protocol!==`chrome-extension:`)return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function JH(e=location){let t=new URLSearchParams(e.search).get(`baseURL`);if(t&&(KH(t,e)||qH(t,e)))return t;if(!(e.pathname.includes(`__ng-devtools`)||e.pathname.includes(`__devframes/`)))return[`/__ng-devtools/`,`./`]}var YH=[`nav`],XH=[`main`],ZH=(e,t)=>t.id;function QH(e,t){e&1&&(fs(),z(0,`svg`,4),V(1,`path`,18),B())}function $H(e,t){e&1&&(fs(),z(0,`svg`,4),V(1,`path`,19)(2,`path`,20)(3,`path`,21)(4,`path`,22)(5,`path`,23)(6,`path`,24),B())}function eU(e,t){e&1&&(fs(),z(0,`svg`,5),V(1,`path`,25)(2,`path`,26)(3,`path`,27)(4,`path`,28),B())}function tU(e,t){e&1&&(fs(),z(0,`svg`,6),V(1,`path`,29),B())}function nU(e,t){e&1&&(fs(),z(0,`svg`,7)(1,`defs`)(2,`linearGradient`,30),V(3,`stop`,31)(4,`stop`,32)(5,`stop`,33)(6,`stop`,34)(7,`stop`,35)(8,`stop`,36),B()(),V(9,`path`,37),B())}function rU(e,t){e&1&&(fs(),z(0,`svg`,8),V(1,`path`,38),B())}function iU(e,t){if(e&1){let e=W();z(0,`button`,40),G(`click`,function(){let t=k(e).$implicit;return A(K(2).switchTab(t.id))}),V(1,`app-tab-icon`,41),z(2,`span`),J(3),B()()}if(e&2){let e=t.$implicit,n=K(2);q(`active`,n.tab()===e.id),N(`aria-current`,n.tab()===e.id?`page`:null),M(),R(`name`,e.id),M(2),Y(e.label)}}function aU(e,t){e&1&&I(0,iU,4,5,`button`,39,ZH),e&2&&L(K().tabs())}function oU(e,t){e&1&&(z(0,`p`,15),J(1,` Can't reach the devtools server. Check that the dev server is running, then reload. `),B())}function sU(e,t){e&1&&V(0,`app-coming-soon`,16),e&2&&R(`info`,t)}function cU(e,t){e&1&&(z(0,`p`,17),J(1,` This inspector is turned off in the devtools config (`),z(2,`code`),J(3,`inspectors`),B(),J(4,`). `),B())}function lU(e,t){if(e&1){let e=W();z(0,`app-dashboard`,44),G(`navigate`,function(t){return k(e),A(K(2).switchTab(t))}),B()}e&2&&R(`rpc`,K(2).rpc())}function uU(e,t){if(e&1){let e=W();z(0,`app-component-tree`,45),G(`focusHandled`,function(){return k(e),A(K(2).componentFocus.set(null))})(`showForm`,function(t){return k(e),A(K(2).showForm(t))}),B()}if(e&2){let e=K(2);R(`rpc`,e.rpc())(`focus`,e.componentFocus())}}function dU(e,t){e&1&&V(0,`app-route-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function fU(e,t){e&1&&V(0,`app-signal-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function pU(e,t){e&1&&V(0,`app-di-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function mU(e,t){e&1&&V(0,`app-store-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function hU(e,t){e&1&&V(0,`app-network-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function gU(e,t){if(e&1){let e=W();z(0,`app-forms-inspector`,46),G(`focusHandled`,function(){return k(e),A(K(2).formFocus.set(null))}),B()}if(e&2){let e=K(2);R(`rpc`,e.rpc())(`focus`,e.formFocus())}}function _U(e,t){e&1&&V(0,`app-pipes-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function vU(e,t){e&1&&V(0,`app-analog-inspector`,42),e&2&&R(`rpc`,K(2).rpc())}function yU(e,t){if(e&1&&P(0,lU,1,1,`app-dashboard`,42)(1,uU,1,2,`app-component-tree`,43)(2,dU,1,1,`app-route-inspector`,42)(3,fU,1,1,`app-signal-inspector`,42)(4,pU,1,1,`app-di-inspector`,42)(5,mU,1,1,`app-store-inspector`,42)(6,hU,1,1,`app-network-inspector`,42)(7,gU,1,2,`app-forms-inspector`,43)(8,_U,1,1,`app-pipes-inspector`,42)(9,vU,1,1,`app-analog-inspector`,42),e&2){let e;F((e=K().tab())===`dashboard`?0:e===`components`?1:e===`routes`?2:e===`signals`?3:e===`injectors`?4:e===`store`?5:e===`network`?6:e===`forms`?7:e===`pipes`?8:e===`analog`?9:-1)}}var bU=[`angular`,`ngrx`,`analog`,`nativescript`,`capacitor`],xU={angular:`Angular`,ngrx:`NgRx Store`,analog:`Analog`,nativescript:`NativeScript`,capacitor:`Capacitor`},SU={ngrx:`#d770e8`,analog:`#ff5470`,nativescript:`#8196ff`,capacitor:`#53b9ff`},CU={ngrx:`store`,analog:`analog`},wU={store:`ngrx`,analog:`analog`},TU={nativescript:{id:`nativescript`,name:`NativeScript`,badge:`Coming Soon`,heading:`NativeScript Support`,summary:`Inspect NativeScript Angular apps running natively on iOS and Android, with the same tools.`,color:`#3c5afd`,plans:[`Native overlay that reports the component tree from the device`,`Standalone devtools server your phone or simulator connects to`,`Example NativeScript app to try it end to end`],pr:16,author:{name:`Nathan Walker`,login:`NathanWalker`}},capacitor:{id:`capacitor`,name:`Capacitor`,badge:`Coming Soon`,heading:`Capacitor Support`,summary:`Connect Ionic and Capacitor apps running in a device WebView back to these tools.`,color:`#119eff`,plans:[`Manual overlay start for apps that load from capacitor:// or a device`,`Connection settings passed in, no cross-origin probing`,`Setup guides for the Android emulator and iOS simulator`],pr:21,author:{name:`Erkam Yaman`,login:`erkamyaman`}}},EU={id:`analog`,name:`Analog`,badge:`Not in this app`,heading:`This app doesn’t use Analog`,summary:`In an Analog app this dock shows your file routes, server load() and API calls, render modes and route lint.`,color:`#dd0330`,plans:[`Which page, layout and .server.ts files render a URL`,`Every load(), server function and API call with timing`,`SSR, prerendered or client only, per page`],link:{label:`Get started with Analog`,href:`https://analogjs.org/docs/getting-started`}};function DU(){let e=new URLSearchParams(location.search).get(`view`);return bU.find(t=>t===e)??null}Ub(class e{analog=j(!1);allTabs=[{id:`dashboard`,label:`Dashboard`},{id:`analog`,label:`Analog`},{id:`components`,label:`Components`},{id:`routes`,label:`Routes`},{id:`signals`,label:`Signals`},{id:`injectors`,label:`Injectors`},{id:`store`,label:`Store`},{id:`forms`,label:`Forms`},{id:`pipes`,label:`Pipes`},{id:`network`,label:`SSR & HTTP`}];view=j(DU());viewAccent=Q(()=>{let e=this.view();return(e&&SU[e])??null});title=Q(()=>{let e=this.view();return e?xU[e]:`Angular DevTools`});analogKnown=j(!1);comingSoon=Q(()=>{let e=this.view();return e===`analog`?this.analogKnown()&&!this.analog()?EU:void 0:e?TU[e]:void 0});config=Q(()=>rE(this.rpc()));tabEnabled=oE;availableTabs=Q(()=>{if(this.comingSoon())return[];let e=this.view(),t=e?CU[e]:void 0,n=this.allTabs.filter(e=>oE(e.id,this.config()));return t?n.filter(e=>e.id===t):n.filter(t=>(t.id!==`analog`||this.analog())&&!(e===`angular`&&wU[t.id]))});tabs=Q(()=>{let e=this.availableTabs();if(this.rpc())return e;let t=this.tab();return e.filter(e=>e.id===`dashboard`||e.id===t)});tab=Tv(()=>{let e=this.view();return e&&CU[e]||`dashboard`});rpc=j(null);connected=j(!1);connectionFailed=j(!1);hiddenPages=j([]);pageId=YT();backgroundNote=Q(()=>{let e=this.hiddenPages();return this.pageId?e.includes(this.pageId)?`Tab in background, showing the last data.`:``:e.length?e.length===1?`A tab is in the background, showing its last data.`:`${e.length} tabs are in the background, showing their last data.`:``});stopVisibility=()=>{};stopFollowing=()=>{};stopHighlights=()=>{};nav=Rv(`nav`);main=Rv(`main`);injector=E(xs);navObserver;navFade=j({start:!1,end:!1});constructor(){Id(()=>{let e=this.nav()?.nativeElement;e&&typeof ResizeObserver<`u`&&(this.navObserver=new ResizeObserver(()=>this.measureNav()),this.navObserver.observe(e))}),ey(()=>{this.tab(),this.tabs(),Cv(()=>{this.revealActiveTab(),this.measureNav()})})}measureNav(){let e=this.nav()?.nativeElement;if(!e)return;let t=e.scrollWidth-e.clientWidth,n=e.scrollLeft>1,r=t>1&&e.scrollLeftn?e.scrollLeft=Math.max(0,n):e.scrollLeftthis.showView(e)));try{window.parent!==window&&IH(window.parent.document)}catch{}let e=UH(location.hash,WH(this.tabScope()),this.availableTabs().map(e=>e.id));e&&this.tab.set(e),this.stopHighlights=nE(()=>this.rpc());let t=JH();kT(t?{baseURL:t}:{}).then(e=>{this.rpc.set(e),this.connected.set(!0),this.watchVisibility(e),e.scope(`ng-devtools`).rpc.call(`analog-project`).then(e=>{let t=!!e?.analog;this.analog.set(t),this.analogKnown.set(!0),!t&&this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)},()=>{this.analogKnown.set(!0),this.tab()===`analog`&&!this.view()&&this.tab.set(`dashboard`)}),e.events.on(`connection:status`,e=>{this.connected.set(e===`connected`)})},()=>{this.connectionFailed.set(!0),this.analogKnown.set(!0)})}ngOnDestroy(){this.stopFollowing(),this.stopVisibility(),this.stopHighlights(),this.navObserver?.disconnect()}showView(e){if(e===this.view())return;this.view.set(e);let t=new URL(location.href);t.searchParams.set(`view`,e),t.hash=``,history.replaceState(history.state,``,t)}formFocus=j(null);componentFocus=Tv({source:this.tab,computation:()=>null});showForm(e){this.formFocus.set({id:e}),this.switchTab(`forms`)}inspectFromPanel({source:e,origin:t,data:n}){if(e!==window.parent||t!==location.origin)return;let r=n;r?.type===`ng-devtools:inspect-component`&&typeof r.id==`string`&&this.tab()===`components`&&this.config().inspectors.components&&this.componentFocus.set({id:r.id})}switchTab(e){let t=wU[e];if(this.view()===`angular`&&t){this.activateDock(t,e);return}this.setTab(e),history.replaceState(history.state,``,`#tab=${e}`)}setTab(e){this.keepFocus(),this.tab.set(e),GH(this.tabScope(),e)}tabScope(){return this.view()??`panel`}async watchVisibility(e){try{let t=await e.scope(`ng-devtools`).rpc.sharedState(`page-visibility`),n=e=>{let t=e?.hidden;this.hiddenPages.set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])};n(t.value()),this.stopVisibility(),this.stopVisibility=t.on(`updated`,n)}catch{}}keepFocus(){let e=document.activeElement,t=this.main()?.nativeElement;(!e||e===document.body||t?.contains(e))&&Id(()=>{let e=document.activeElement;e&&e!==document.body||(this.nav()?.nativeElement.querySelector(`button.active`)??this.main()?.nativeElement)?.focus()},{injector:this.injector})}async activateDock(e,t){if(await VH(e))return;if(window.parent===window){this.keepFocus(),this.showView(e);return}let n=this.rpc();if(!n?.call){this.setTab(t);return}try{await n.call(`hub:docks:activate`,{dockId:`ng-devtools:${e}`}),this.keepFocus(),this.showView(e)}catch{this.setTab(t)}}static ɵfac=function(t){return new(t||e)};static ɵcmp=Bh({type:e,selectors:[[`app-root`]],viewQuery:function(e,t){e&1&&e_(t.nav,YH,5)(t.main,XH,5),e&2&&t_(2)},hostVars:2,hostBindings:function(e,t){e&1&&G(`message`,function(e){return t.inspectFromPanel(e)},ju),e&2&&C_(`--%NS%accent`,t.viewAccent())},decls:26,vars:18,consts:[[`nav`,``],[`main`,``],[1,`brand`],[1,`mark`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 256 256`,`aria-hidden`,`true`],[`width`,`24`,`height`,`17`,`viewBox`,`0 0 256 182`,`aria-hidden`,`true`],[`width`,`22`,`height`,`22`,`viewBox`,`0 0 24 24`,`fill`,`currentColor`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`aria-hidden`,`true`],[`width`,`20`,`height`,`22`,`viewBox`,`0 0 223 236`,`fill`,`currentColor`,`aria-hidden`,`true`],[1,`title`],[`aria-label`,`Inspectors`,3,`scroll`],[`role`,`status`,1,`status`],[`aria-hidden`,`true`,1,`dot`],[`tabindex`,`-1`],[`role`,`status`,1,`background-note`],[`role`,`alert`,1,`connection-error`],[3,`info`],[1,`turned-off`],[`fill`,`#3c5afd`,`d`,`M237.248 18.752q18.061 18.06 18.748 45.247V192c-.457 18.12-6.707 33.207-18.748 45.247c-12.04 12.04-27.127 18.291-45.251 18.752H63.999q-27.187-.69-45.247-18.752C6.712 225.208.46 210.121 0 192.001V64q.69-27.187 18.752-45.247Q36.812.692 63.999 0h127.998c18.124.46 33.211 6.711 45.251 18.752m-17.655 103q-6.033-6.003-6.28-15.066V64q-.192-9.063-6.221-15.091c-4.02-4.023-9.054-6.093-15.095-6.22h-21.312v106.626L85.315 42.687H63.999c-6.042.128-11.072 2.198-15.091 6.221c-4.023 4.02-6.093 9.05-6.22 15.09v42.688q-.249 9.063-6.281 15.066q-6.03 5.996-15.091 6.246q9.062.255 15.09 6.25c4.024 4.002 6.115 9.024 6.281 15.066V192c.128 6.037 2.198 11.072 6.221 15.091q6.03 6.03 15.09 6.22h21.317V106.687l85.37 106.627h21.312c6.041-.128 11.076-2.202 15.095-6.221s6.093-9.054 6.22-15.09v-42.688q.249-9.063 6.281-15.066q6.03-5.995 15.091-6.25q-9.062-.25-15.09-6.246`],[`fill`,`#53b9ff`,`d`,`M39.863 54.115L.311 93.716l60.995 61.179L0 216.385l39.428 39.619l61.43-61.507l61.097 61.068l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m140.517 154.896l-39.658 39.601l61.097 61.069l39.552-39.602z`],[`fill-opacity`,`.2`,`d`,`m140.517 154.896l-39.658 39.601l15.267 15.182z`],[`fill`,`#53b9ff`,`d`,`M194.57 100.985L256 39.478L216.431 0l-61.412 61.384L93.917.311L54.365 39.913L216.01 201.761l39.552-39.602z`],[`fill`,`#119eff`,`d`,`m115.36 100.987l39.659-39.602L93.917.313L54.365 39.914z`],[`fill-opacity`,`.2`,`d`,`m115.359 100.985l39.659-39.601l-15.271-15.186z`],[`fill`,`#c30f2e`,`d`,`M152.228.001L48.455 181.046H256L152.228 0z`],[`fill`,`#dd0330`,`d`,`M88.314 26.967L0 181.52h176.628L88.315 26.967z`],[`fill`,`#fff`,`d`,`M18.167 135.294h220.236v-2.419H18.167z`],[`fill`,`#fff`,`d`,`M204.38 170.667c-.861 0-1.67-.358-2.348-1.034c-4.045-4.063-4.221-20.586-4.026-45.33c.11-13.521.257-32.043-1.9-33.504c-2.104.873-2.315 16.172-2.451 26.301c-.162 11.785-.327 23.98-2.242 30.189c-.57 1.84-1.306 3.525-2.786 3.39c-2.086-.185-2.76-3.48-4.317-16.478c-.647-5.4-1.317-10.98-2.101-13.14a11 11 0 0 0-.269-.66c-.835 1.889-1.8 7.079-2.47 10.682c-.927 4.976-1.803 9.676-2.9 11.726c-.847 1.575-2.19 3.63-4.067 3.231c-2.558-.537-3.323-5.693-3.552-8.719c0-25.455-3.33-28.417-3.997-28.753l-.107.081l-.162-.036c-2.377 1.038-2.506 9.294-2.627 17.276c-.096 5.856-.198 12.492-1.053 18.701c-1.108 8.05-2.448 9.603-4.115 9.507c-3.838-.262-3.95-13.482-3.95-14.987c0-.472.012-1.028.027-1.642c.074-3.076.205-8.8-1.687-10.604c-.25-.239-.603-.515-.879-.437c-1.347.339-2.745 4.714-3.209 6.153c-.147.457-.265.833-.364 1.09c-.078.214-.177.515-.294.88c-1.02 3.095-2.18 6.183-4.16 6.944c-.732.284-1.498.222-2.216-.183c-.953-.541-1.73-1.646-2.455-3.482c-.397-1.016-.735-2.046-1.082-3.081c-.419-1.263-.85-2.569-1.384-3.808c-.419-.965-1.464-1.4-2.796-1.164c-2.768.494-3.232 3.29-3.622 7.5c-.07.733-.137 1.452-.228 2.128c-.011.198-.501 6.38-.814 8.344c-.865 5.39-2.002 7.512-3.89 7.358c-4.66-.398-6.798-20.836-6.684-29.47c.088-6.592-1.104-9-1.818-9.382c-.074-.034-.189-.096-.46.095c-.843.571-1.594 2.348-1.363 4.215c2.566 20.32.674 43.592-3.96 48.833c-1.46 1.649-3.448 1.627-4.832.236c-4.049-4.064-4.218-20.586-4.026-45.33c.11-13.521.254-32.043-1.9-33.504c-2.105.873-2.311 16.172-2.45 26.301c-.163 11.785-.329 23.98-2.246 30.189c-.57 1.84-1.307 3.525-2.782 3.39c-2.091-.186-2.761-3.48-4.321-16.478c-.649-5.4-1.319-10.98-2.101-13.14c-.1-.273-.189-.49-.27-.66c-.832 1.889-1.796 7.079-2.466 10.682c-.927 4.976-1.803 9.676-2.904 11.726c-.846 1.575-2.19 3.63-4.063 3.231c-2.558-.537-3.324-5.693-3.552-8.719c-.003-25.455-3.33-28.417-3.997-28.753l-.106.081l-.166-.036c-2.374 1.038-2.503 9.293-2.629 17.276c-.091 5.856-.194 12.492-1.048 18.701c-1.107 8.05-2.437 9.618-4.111 9.507c-3.846-.262-3.958-13.482-3.958-14.987c0-.472.016-1.028.03-1.642c.074-3.076.207-8.8-1.685-10.604c-.25-.239-.603-.515-.88-.438c-1.347.34-2.75 4.715-3.206 6.155a47 47 0 0 1-.364 1.09q-.16.432-.298.875c-1.02 3.096-2.18 6.187-4.155 6.95c-.736.282-1.506.22-2.22-.185c-.953-.541-1.734-1.646-2.454-3.482c-.398-1.016-.74-2.046-1.083-3.081c-.42-1.263-.854-2.569-1.387-3.808c-.416-.965-1.465-1.4-2.797-1.164c-3.188.567-3.943 4.52-4.55 9.238l-.106.839l-2.411-.32l.114-.824c.527-4.137 1.328-10.39 6.53-11.31c2.446-.435 4.585.581 5.446 2.583c.578 1.34 1.031 2.695 1.466 4.008c.324.99.654 1.98 1.037 2.959c.674 1.708 1.197 2.15 1.392 2.257c1.218-.38 2.462-4.167 2.873-5.414c.13-.402.24-.732.328-.968c.085-.233.195-.571.328-.98c1.097-3.43 2.474-7.144 4.918-7.762c.747-.191 1.903-.166 3.157 1.035c2.665 2.544 2.525 8.48 2.433 12.41c-.014.59-.028 1.126-.028 1.583c0 6.272.93 10.655 1.64 12.16c.367-.77.998-2.63 1.598-7.007c.831-6.066.938-12.624 1.027-18.41c.161-10.24.275-17.663 3.982-19.408c.552-.339 1.469-.522 2.436-.033c3.586 1.803 5.326 11.885 5.326 30.817c.225 2.926 1.013 6.006 1.66 6.448c.004-.066.53-.39 1.394-2.01c.925-1.718 1.845-6.665 2.655-11.026c1.792-9.614 2.606-12.989 4.726-13.166c1.615-.158 2.362 1.896 2.676 2.76c.883 2.422 1.537 7.888 2.23 13.678c.54 4.49 1.31 10.902 2.094 13.497c.084-.228.18-.5.283-.836c1.815-5.878 1.98-17.887 2.14-29.507c.22-16.14.503-26.139 3.448-28.226a2.44 2.44 0 0 1 2.233-.316c3.448 1.144 3.714 11.254 3.519 35.8c-.14 17.799-.313 39.952 3.323 43.603c.317.32.542.32.622.32c.17 0 .413-.161.67-.452c3.681-4.162 6.01-26.022 3.372-46.927c-.328-2.602.677-5.337 2.392-6.514c.946-.652 2.036-.736 2.978-.232c2.145 1.14 3.187 5.024 3.102 11.546c-.15 11.387 2.584 24.714 4.37 26.842c.282-.471.842-1.763 1.379-5.145c.301-1.87.799-8.153.806-8.216c.09-.71.155-1.398.217-2.097c.369-3.924.82-8.804 5.613-9.654c2.444-.435 4.583.577 5.448 2.583c.577 1.34 1.027 2.695 1.46 4.008c.332.99.664 1.98 1.046 2.959c.67 1.708 1.197 2.15 1.387 2.257c1.218-.38 2.467-4.167 2.875-5.41c.132-.402.243-.737.328-.973c.088-.228.195-.57.324-.979c1.1-3.43 2.477-7.144 4.924-7.762c.74-.191 1.9-.166 3.154 1.035c2.665 2.543 2.526 8.48 2.437 12.41q-.029.792-.033 1.583c0 6.272.931 10.655 1.641 12.16c.365-.77.994-2.63 1.601-7.007c.832-6.066.931-12.624 1.027-18.41c.159-10.24.273-17.663 3.98-19.408c.55-.339 1.467-.522 2.44-.033c3.58 1.803 5.325 11.884 5.325 30.817c.224 2.926 1.012 6.006 1.656 6.448c.008-.066.526-.39 1.399-2.01c.923-1.718 1.84-6.665 2.653-11.026c1.786-9.614 2.602-12.989 4.722-13.166c1.62-.158 2.367 1.896 2.68 2.76c.88 2.422 1.535 7.888 2.233 13.678c.534 4.49 1.304 10.902 2.092 13.497c.08-.228.176-.5.28-.836c1.813-5.878 1.976-17.887 2.138-29.507c.216-16.14.504-26.139 3.448-28.226a2.45 2.45 0 0 1 2.234-.316c3.452 1.144 3.718 11.254 3.52 35.8c-.141 17.799-.314 39.952 3.319 43.603c.324.32.544.32.63.32c.165 0 .408-.161.662-.452c3.687-4.162 6.014-26.022 3.375-46.927c-.342-2.723.43-5.47 1.84-6.526c.71-.537 1.575-.647 2.37-.313c2.054.877 3.445 4.63 4.255 11.484c.339 2.87.641 5.974.931 9.036c.641 6.683 1.509 15.69 2.684 17.67c.36-.46 1.096-1.704 2.19-5.038l2.307.753c-1.696 5.157-3.026 7.1-4.755 6.902c-2.69-.299-3.468-5.734-4.84-20.055c-.29-3.048-.59-6.132-.928-8.989c-1.03-8.74-2.782-9.532-2.801-9.54c-.342.174-1.137 1.992-.842 4.31c2.558 20.32.673 43.597-3.964 48.834c-.747.842-1.587 1.27-2.485 1.27`],[`d`,`M12.024.017V0L12 .008L11.976 0v.017L.812 3.892l1.605 14.875l9.559 5.207V24l.024-.013l.024.013v-.026l9.559-5.207l1.605-14.875zm6.868 14.244q-1.64 3.948-6.031 4.166c-2.829 0-4.661-1.7-4.66-1.7q-1.745-1.359-2.398-3.417c-.695-.76-.702-.841-.774-1.145c-.072-.303.045-.388.249-.685q.204-.298.098-.85q-.26-.36-.3-1.128q0-.37.496-.783q.495-.413.607-.632q.083-.119.065-1.031q-.006-.897.995-.975c1-.08 1.565-.832 1.879-1.174c.21-.228.52-.339.91-.341c.551-.026 1.052.185 1.484.62c1.075-.055 2.176.235 3.292.863q2.379 1.414 2.596 3.055q-.257 2.158-5.788-.113q-2.895.819-2.846 3.552q0 2.508 2.422 3.643c-.787-.772-1.122-1.422-1.01-1.959q2.456 2.906 5.588 2.173c-.92.032-1.65-.264-2.198-.893q2.116-.05 3.998-1.972c-.724.576-1.482.794-2.284.657q3.26-2.563 2.307-5.98l-.002-.006a3.02 3.02 0 0 1 .788 2.03q.023 1.175-.795 2.477q.613-.478 1.413-2.047c.23 2.117-.625 3.724-2.574 4.825q.934-.085 2.473-1.23m-5.567-6.63a.319.319 0 1 1 .638 0a.319.319 0 0 1-.638 0`],[`id`,`ng-grad`,`x1`,`49`,`x2`,`226`,`y1`,`214`,`y2`,`130`,`gradientUnits`,`userSpaceOnUse`],[`stop-color`,`#E40035`],[`offset`,`.24`,`stop-color`,`#F60A48`],[`offset`,`.352`,`stop-color`,`#F20755`],[`offset`,`.494`,`stop-color`,`#DC087D`],[`offset`,`.745`,`stop-color`,`#9717E7`],[`offset`,`1`,`stop-color`,`#6C00F5`],[`fill`,`url(#ng-grad)`,`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`d`,`m222.077 39.192-8.019 125.923L137.387 0l84.69 39.192Zm-53.105 162.825-57.933 33.056-57.934-33.056 11.783-28.556h92.301l11.783 28.556ZM111.039 62.675l30.357 73.803H80.681l30.358-73.803ZM7.937 165.115 0 39.192 84.69 0 7.937 165.115Z`],[`type`,`button`,3,`active`],[`type`,`button`,3,`click`],[3,`name`],[3,`rpc`],[3,`rpc`,`focus`],[3,`navigate`,`rpc`],[3,`focusHandled`,`showForm`,`rpc`,`focus`],[3,`focusHandled`,`rpc`,`focus`]],template:function(e,t){if(e&1&&(z(0,`header`)(1,`h1`,2)(2,`span`,3),P(3,QH,2,0,`:svg:svg`,4)(4,$H,7,0,`:svg:svg`,4)(5,eU,5,0,`:svg:svg`,5)(6,tU,2,0,`:svg:svg`,6)(7,nU,10,0,`:svg:svg`,7)(8,rU,2,0,`:svg:svg`,8),B(),z(9,`span`,9),J(10),B()(),z(11,`nav`,10,0),G(`scroll`,function(){return t.measureNav()}),P(13,aU,2,0),B(),z(14,`span`,11)(15,`span`,12),V(16,`span`),B(),J(17),B()(),z(18,`main`,13,1)(20,`p`,14),J(21),B(),P(22,oU,2,0,`p`,15)(23,sU,1,1,`app-coming-soon`,16)(24,cU,5,0,`p`,17)(25,yU,10,1),B()),e&2){let e;M(2),q(`ng-mark`,t.view()===`angular`),M(),F(t.view()===`nativescript`?3:t.view()===`capacitor`?4:t.view()===`analog`?5:t.view()===`ngrx`?6:t.view()===`angular`?7:8),M(6),q(`ng-text`,t.view()===`angular`),M(),Y(t.title()),M(),q(`fade-start`,t.navFade().start)(`fade-end`,t.navFade().end),M(2),F(t.availableTabs().length>1?13:-1),M(),q(`connected`,t.connected())(`failed`,t.connectionFailed()),M(3),X(` `,t.connected()?`Live`:t.connectionFailed()?`Disconnected`:`Connecting…`,` `),M(4),Y(t.backgroundNote()),M(),F(t.connectionFailed()?22:(e=t.comingSoon())?23:t.tabEnabled(t.tab(),t.config())?25:24,e)}},dependencies:[KE,QO,wM,IN,KP,wI,ER,Tz,MV,DH,PH,_E],styles:[`[_nghost-%COMP%] { --%NS%accent-soft: color-mix(in srgb, var(--%NS%accent) 12%, transparent); --%NS%accent-line: color-mix(in srgb, var(--%NS%accent) 45%, transparent); display: flex; @@ -12312,4 +12461,4 @@ main[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] { flex-shrink: 1; gap: 8px; } -}`]})}).catch(console.error);export{Gx as t}; \ No newline at end of file +}`]})}).catch(console.error);export{Kx as t}; \ No newline at end of file diff --git a/extension/ui/index.html b/extension/ui/index.html index 4bfdce2..c43e53c 100644 --- a/extension/ui/index.html +++ b/extension/ui/index.html @@ -7,7 +7,7 @@ Angular DevTools - + diff --git a/packages/ng-devtools/package.json b/packages/ng-devtools/package.json index c4b4050..b6975d2 100644 --- a/packages/ng-devtools/package.json +++ b/packages/ng-devtools/package.json @@ -99,6 +99,7 @@ "devDependencies": { "@angular/common": "^22.1.0", "@angular/core": "^22.1.0", + "hono": "4.13.8", "rxjs": "~7.8.0", "tsdown": "^0.23.0" }, diff --git a/packages/ng-devtools/src/__tests__/agent-tools.test.ts b/packages/ng-devtools/src/__tests__/agent-tools.test.ts index 4b083e1..d79033b 100644 --- a/packages/ng-devtools/src/__tests__/agent-tools.test.ts +++ b/packages/ng-devtools/src/__tests__/agent-tools.test.ts @@ -63,6 +63,41 @@ describe('agent tools', () => { expect(await push('ping-change-detection', 'p1')).toEqual({ known: false }); }); + it('report the change detection mode and what services inject', async () => { + const { push, call, injectorState } = await boot(); + const rootEnv = { + injector: { id: 'root-1', type: 'environment', name: 'Root', providerCount: 1 }, + providers: [{ token: 'HttpClient', type: 'class', isViewProvider: false }], + children: [], + dependencies: [{ from: 'Api', token: 'HttpClient', flags: [], providedBy: 'root-1' }], + }; + await push('push-injector-tree', { + pageId: 'p1', + roots: [injectorRoot('app-root')], + environment: [rootEnv], + zone: 'zone-unused', + }); + expect(await injectorState()).toMatchObject({ zone: 'zone-unused' }); + expect(await call('change-detection', '')).toMatch( + /^Page `p1` runs zoneless change detection, but zone\.js is still loaded\./, + ); + const tree = await call('inspect-providers', ''); + expect(tree).toContain('Page `p1` runs zoneless change detection'); + expect(tree).toContain('"from":"Api"'); + expect(await call('inspect-providers', '', { token: 'HttpClient' })).toContain( + '"injectedBy":[{"id":"root-1","name":"Root","from":"Api"', + ); + + await push('push-injector-tree', { + pageId: 'p1', + roots: [injectorRoot('app-root')], + environment: [], + zone: 'bogus', + }); + expect(await injectorState()).toMatchObject({ zone: null }); + expect(await call('change-detection', '')).toMatch(/^No change detection recording yet/); + }); + it('say so when nothing has been reported', async () => { const { call } = await boot(); // Worded after the data, not the connection: an empty tree is what both a @@ -252,6 +287,49 @@ describe('agent tools', () => { ]); }); + it('forgets a signal page on request and moves the shown graph to the latest remaining page', async () => { + vi.useFakeTimers({ toFake: ['Date'] }); + const { ctx, push, call } = await boot(); + const signalState = async () => + ( + await ( + ctx.rpc as unknown as { + sharedState: { + get: (key: string) => Promise<{ value: () => Record }>; + }; + } + ).sharedState.get('ng-devtools:signal-graph') + ).value(); + const graph = (pageId: string, label: string) => ({ + pageId, + componentSelector: 'app-root', + nodes: [{ id: 'a', kind: 'signal', label, epoch: 0 }], + edges: [], + }); + vi.setSystemTime(1000); + await push('push-signal-graph', graph('p1', 'first')); + vi.setSystemTime(2000); + await push('push-signal-graph', graph('p2', 'second')); + vi.setSystemTime(3000); + await push('push-signal-graph', graph('p3', 'third')); + + await push('forget-signal-page', 'p1'); + expect(Object.keys((await signalState())['pages'] as object).sort()).toEqual(['p2', 'p3']); + expect(await signalState()).toMatchObject({ graph: { pageId: 'p3' } }); + + await push('forget-signal-page', 'p3'); + expect(Object.keys((await signalState())['pages'] as object)).toEqual(['p2']); + expect(await signalState()).toMatchObject({ graph: { pageId: 'p2' } }); + expect(await push('ping-signal-graph', 'p3')).toEqual({ known: false }); + expect(JSON.parse(await call('inspect-signals', 'app-root'))).toMatchObject({ + nodes: [{ label: 'second' }], + }); + + await push('forget-signal-page', 'p2'); + expect(await signalState()).toMatchObject({ graph: null, pages: {} }); + expect(await call('inspect-signals', 'app-root')).toMatch(/no signal graph/i); + }); + it('keeps injector trees per page, forgets a page on request and ignores reports without a page', async () => { vi.useFakeTimers({ toFake: ['Date'] }); const { push, call, injectorState } = await boot(); @@ -409,7 +487,7 @@ describe('agent tools', () => { expect(broadcast).toHaveBeenCalledWith( expect.objectContaining({ method: 'ng-devtools:highlight-in-page', - args: [{ pageId: 'p1', selector: '.promo', reveal: true }], + args: [{ pageId: 'p1', selector: '.promo', reveal: true, durationMs: 2000 }], }), ); }); diff --git a/packages/ng-devtools/src/__tests__/component-agent.test.ts b/packages/ng-devtools/src/__tests__/component-agent.test.ts index ae17a47..02a1021 100644 --- a/packages/ng-devtools/src/__tests__/component-agent.test.ts +++ b/packages/ng-devtools/src/__tests__/component-agent.test.ts @@ -117,6 +117,33 @@ describe('component agent tools', () => { } }); + it('says a component may be past the cap when the tree is truncated', async () => { + const { ctx, push, call } = await boot(); + vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async () => {}) as never); + await push('push-component-tree', { + pageId: 'p1', + roots, + count: 2000, + truncated: true, + truncatedBy: { components: 2000, depth: 'x' }, + detail: null, + }); + const state = ( + await ( + ctx.rpc as unknown as { + sharedState: { get: (key: string) => Promise<{ value: () => unknown }> }; + } + ).sharedState.get('ng-devtools:component-tree') + ).value() as { pages: Record }; + expect(state.pages['p1']).toMatchObject({ truncated: true, truncatedBy: { components: 2000 } }); + expect(state.pages['p1']).not.toHaveProperty('truncatedBy.depth'); + const note = + 'stops at the first 2000 component instances, so instances past it are not listed or searchable'; + expect(await call('inspect-component', { selector: 'Missing' })).toContain(note); + expect(await call('highlight', { selector: '.missing' })).toContain(note); + expect(await call('inspect-component', { selector: 'c2', page: 'p1' })).not.toContain(note); + }); + it('inspect-component and highlight narrow the search to one page', async () => { const { ctx, push, call } = await boot(); await push('push-component-tree', { pageId: 'p1', roots, count: 3, detail: null }); diff --git a/packages/ng-devtools/src/__tests__/component-pick.test.ts b/packages/ng-devtools/src/__tests__/component-pick.test.ts index b26d4d4..2785baf 100644 --- a/packages/ng-devtools/src/__tests__/component-pick.test.ts +++ b/packages/ng-devtools/src/__tests__/component-pick.test.ts @@ -52,6 +52,18 @@ describe('startComponentPick', () => { expect(later.defaultPrevented).toBe(false); }); + it('keeps the hover box while the pointer stays and clears it when the pointer leaves the page', async () => { + const { pick, highlight, card } = setup(); + const button = card.querySelector('button')!; + button.dispatchEvent(new MouseEvent('mouseover', { bubbles: true })); + button.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, relatedTarget: card })); + expect(highlight.clear).not.toHaveBeenCalled(); + button.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, relatedTarget: null })); + expect(highlight.clear).toHaveBeenCalledTimes(1); + pick.cancel(); + await pick.result; + }); + it('ignores the devtools popup and says when a click is outside any component', async () => { const { pick, highlight } = setup(); const fab = document.querySelector('.fab')!; diff --git a/packages/ng-devtools/src/__tests__/component-tree.test.ts b/packages/ng-devtools/src/__tests__/component-tree.test.ts index 849ee39..1cb7511 100644 --- a/packages/ng-devtools/src/__tests__/component-tree.test.ts +++ b/packages/ng-devtools/src/__tests__/component-tree.test.ts @@ -115,6 +115,73 @@ describe('collectComponentTree', () => { expect(hostPath(ng, inner)).toBe('app-root > app-shadow > app-widget'); }); + it('indexes hosts wrapped in list items under their nearest component', () => { + document.body.innerHTML = ` +
      +
    • +
    `; + const [root] = document.getElementsByTagName('app-root'); + const list = document.querySelector('app-list')!; + const [first, second] = Array.from(document.querySelectorAll('app-card')); + const { ng } = fakeNg( + new Map([ + [root, new _App()], + [list, new Shell()], + [first, new Card()], + [second, new Card()], + ]), + ); + expect(hostPath(ng, first)).toBe('app-root > app-list > app-card[1]'); + expect(hostPath(ng, second)).toBe('app-root > app-list > app-card[2]'); + expect(hostPath(ng, list)).toBe('app-root > app-list'); + }); + + it('indexes hosts inside shadow roots and ignores hosts of nested components', () => { + document.body.innerHTML = ``; + const [root] = document.getElementsByTagName('app-root'); + const host = document.querySelector('app-shadow')!; + const shadow = host.attachShadow({ mode: 'open' }); + shadow.innerHTML = `
    + `; + const [first, second, nested] = Array.from(shadow.querySelectorAll('app-widget')); + const card = shadow.querySelector('app-card')!; + const { ng } = fakeNg( + new Map([ + [root, new _App()], + [host, new Shell()], + [first, new Widget()], + [second, new Widget()], + [card, new Card()], + [nested, new Widget()], + ]), + ); + expect(hostPath(ng, first)).toBe('app-root > app-shadow > app-widget[1]'); + expect(hostPath(ng, second)).toBe('app-root > app-shadow > app-widget[2]'); + expect(hostPath(ng, nested)).toBe('app-root > app-shadow > app-card > app-widget'); + }); + + it('reports which cap stopped the tree', () => { + document.body.innerHTML = ``; + const [root] = document.getElementsByTagName('app-root'); + const instances = new Map([[root, new _App()]]); + for (let i = 0; i < 2000; i++) { + const card = document.createElement('app-card'); + root.appendChild(card); + instances.set(card, new Card()); + } + const { ng } = fakeNg(instances); + const wide = collectComponentTree(ng); + expect(wide).toMatchObject({ count: 2000, truncated: true, truncatedBy: { components: 2000 } }); + expect(wide.truncatedBy?.depth).toBeUndefined(); + + root.innerHTML = ''; + let parent: Element = root; + for (let i = 0; i < 300; i++) parent = parent.appendChild(document.createElement('div')); + const deep = collectComponentTree(fakeNg(new Map([[root, new _App()]])).ng); + expect(deep).toMatchObject({ count: 1, truncated: true, truncatedBy: { depth: 256 } }); + expect(deep.truncatedBy?.components).toBeUndefined(); + }, 20_000); + it('reports nothing without the debug API instead of guessing from tag names', () => { document.body.innerHTML = ``; expect(collectComponentTree(undefined)).toEqual({ roots: [], count: 0, detail: null }); diff --git a/packages/ng-devtools/src/__tests__/config.test.ts b/packages/ng-devtools/src/__tests__/config.test.ts index 1a00057..91dcde8 100644 --- a/packages/ng-devtools/src/__tests__/config.test.ts +++ b/packages/ng-devtools/src/__tests__/config.test.ts @@ -223,7 +223,14 @@ describe('agent tool and RPC registration', () => { it('registers everything by default', async () => { const { tools, actionTools } = await boot(); expect(actionTools.sort()).toEqual( - ['analog-call-api', 'fill-form', 'form-action', 'highlight', 'navigate'].sort(), + [ + 'analog-call-api', + 'dispatch-ngrx-action', + 'fill-form', + 'form-action', + 'highlight', + 'navigate', + ].sort(), ); expect(tools).toContain('inspect-forms'); }); @@ -236,7 +243,9 @@ describe('agent tool and RPC registration', () => { it('drops the agent tools of a blocked action and keeps the rest', async () => { const forms = await boot({ actions: { forms: false } }); - expect(forms.actionTools.sort()).toEqual(['analog-call-api', 'highlight', 'navigate'].sort()); + expect(forms.actionTools.sort()).toEqual( + ['analog-call-api', 'dispatch-ngrx-action', 'highlight', 'navigate'].sort(), + ); expect(forms.tools).toEqual(expect.arrayContaining(['inspect-forms', 'form-history'])); const router = await boot({ actions: { router: false } }); expect(router.actionTools).not.toContain('navigate'); @@ -245,6 +254,9 @@ describe('agent tool and RPC registration', () => { const analog = await boot({ actions: { analog: false } }); expect(analog.actionTools).not.toContain('analog-call-api'); expect(analog.tools).toContain('analog-lint'); + const ngrx = await boot({ actions: { ngrx: false } }); + expect(ngrx.actionTools).not.toContain('dispatch-ngrx-action'); + expect(ngrx.tools).toContain('get-ngrx-store'); }); it('leaves out the RPC functions, tools and resources of a disabled inspector', async () => { diff --git a/packages/ng-devtools/src/__tests__/extension-panel-bridge.test.ts b/packages/ng-devtools/src/__tests__/extension-panel-bridge.test.ts new file mode 100644 index 0000000..c64a182 --- /dev/null +++ b/packages/ng-devtools/src/__tests__/extension-panel-bridge.test.ts @@ -0,0 +1,201 @@ +// @vitest-environment jsdom +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { runInNewContext } from 'node:vm'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +const root = join(import.meta.dirname, '../../../../extension'); +const source = readFileSync(join(root, 'panel-bridge.js'), 'utf8'); +const html = readFileSync(join(root, 'panel.html'), 'utf8'); + +type Listener = () => void; + +interface Setup { + origin?: string; + pageId?: string | null; + granted?: boolean; + grant?: boolean; + fetch?: (url: string) => Promise; +} + +const offline = () => Promise.reject(new TypeError('Failed to fetch')); + +function open(setup: Setup = {}) { + const body = new DOMParser().parseFromString(html, 'text/html').body; + body.querySelector('script')?.remove(); + document.body.innerHTML = body.innerHTML; + + const origin = setup.origin ?? 'http://localhost:4200'; + let granted = setup.granted ?? true; + const navigated: Listener[] = []; + const fetch = vi.fn((url: string) => (setup.fetch ?? offline)(url)); + const request = vi.fn(async () => { + granted = setup.grant ?? false; + return granted; + }); + const chrome = { + runtime: { getURL: (path: string) => `chrome-extension://ext-id/${path}` }, + permissions: { contains: vi.fn(async () => granted), request }, + devtools: { + inspectedWindow: { + eval: (expression: string, callback: (result: unknown, error?: unknown) => void) => + queueMicrotask(() => + callback( + expression === 'location.origin' + ? origin + : expression.includes('ng-devtools-page-id') + ? (setup.pageId ?? null) + : null, + ), + ), + }, + network: { onNavigated: { addListener: (l: Listener) => navigated.push(l) } }, + panels: { elements: { onSelectionChanged: { addListener: () => {} } } }, + }, + }; + runInNewContext(source, { + chrome, + document, + location, + fetch, + AbortSignal, + URL, + setTimeout, + }); + + const $ = (id: string) => document.getElementById(id) as T; + return { + fetch, + request, + navigate: () => navigated.forEach((l) => l()), + status: $('status'), + message: () => $('status-message').textContent, + tried: () => [...$('status-tried').querySelectorAll('li')].map((li) => li.textContent), + triedList: $('status-tried'), + allow: $('status-allow'), + docs: $('status-docs'), + frame: $('devtools-frame'), + }; +} + +const found = (path: string) => (url: string) => + url.endsWith(path) + ? Promise.resolve(new Response('{}', { status: 200 })) + : Promise.resolve(new Response('', { status: 404 })); + +describe('extension panel bridge', () => { + beforeEach(() => vi.useFakeTimers()); + afterEach(() => { + vi.useRealTimers(); + document.body.innerHTML = ''; + }); + + it('announces detection in a status region without the setup link', () => { + const panel = open(); + expect(panel.status.getAttribute('role')).toBe('status'); + expect(panel.message()).toBe('Detecting Angular app…'); + expect(panel.frame.style.display).toBe('none'); + }); + + it('explains that only http and https pages can connect', async () => { + const panel = open({ origin: 'chrome://newtab' }); + await vi.advanceTimersByTimeAsync(500); + expect(panel.message()).toMatch(/pages served over http or https/); + expect(panel.docs.hidden).toBe(false); + expect(panel.allow.hidden).toBe(true); + expect(panel.fetch).not.toHaveBeenCalled(); + }); + + it('asks for access to a non-loopback host, then detects once granted', async () => { + const panel = open({ + origin: 'https://app.example.com', + granted: false, + grant: true, + fetch: found('/__ng-devtools/__devframe/__connection.json'), + }); + await vi.advanceTimersByTimeAsync(500); + expect(panel.message()).toBe( + 'Allow Angular DevTools to reach the devtools server on app.example.com.', + ); + expect(panel.allow.hidden).toBe(false); + expect(panel.fetch).not.toHaveBeenCalled(); + + panel.allow.click(); + await vi.advanceTimersByTimeAsync(0); + expect(panel.request).toHaveBeenCalledWith({ origins: ['https://app.example.com/*'] }); + expect(panel.frame.style.display).toBe('block'); + expect(panel.status.classList.contains('hidden')).toBe(true); + }); + + it('stays on the prompt when access is declined', async () => { + const panel = open({ origin: 'https://app.example.com', granted: false, grant: false }); + await vi.advanceTimersByTimeAsync(500); + panel.allow.click(); + await vi.advanceTimersByTimeAsync(0); + expect(panel.message()).toMatch(/^Allow Angular DevTools/); + expect(panel.fetch).not.toHaveBeenCalled(); + }); + + it('lists every URL it tried once when no server answers', async () => { + const panel = open(); + await vi.advanceTimersByTimeAsync(500); + expect(panel.message()).toBe('No devtools server answered on http://localhost:4200. Tried:'); + const tried = panel.tried(); + expect(tried.length).toBeGreaterThan(1); + expect(new Set(tried).size).toBe(tried.length); + expect(tried).toContain('http://localhost:4200/__devframe/__connection.json'); + expect(panel.fetch.mock.calls.map(([url]) => url)).toEqual(tried); + expect(panel.triedList.hidden).toBe(false); + expect(panel.triedList.getAttribute('aria-label')).toBe('URLs tried'); + expect(panel.docs.hidden).toBe(false); + }); + + it('loads the panel with the base URL and page id of the server it found', async () => { + const panel = open({ + pageId: 'page-1', + fetch: found('/__devframes/ng-devtools/__connection.json'), + }); + await vi.advanceTimersByTimeAsync(500); + const src = new URL(panel.frame.src); + expect(`${src.protocol}//${src.host}${src.pathname}`).toBe( + 'chrome-extension://ext-id/ui/index.html', + ); + expect(src.searchParams.get('baseURL')).toBe('http://localhost:4200/__devframes/ng-devtools/'); + expect(src.searchParams.get('pageId')).toBe('page-1'); + expect(panel.frame.style.display).toBe('block'); + expect(panel.status.classList.contains('hidden')).toBe(true); + }); + + it('leaves the page id out when the page has none', async () => { + const panel = open({ fetch: found('/__ng-devtools/__devframe/__connection.json') }); + await vi.advanceTimersByTimeAsync(500); + expect(new URL(panel.frame.src).searchParams.has('pageId')).toBe(false); + }); + + it('drops a detection that finishes after a navigation and detects again', async () => { + let answer: (response: Response) => void = () => {}; + let slow = true; + const panel = open({ + fetch: (url) => + slow + ? new Promise((resolve) => (answer = resolve)) + : found('/__ng-devtools/__devframe/__connection.json')(url), + }); + await vi.advanceTimersByTimeAsync(500); + expect(panel.fetch).toHaveBeenCalledTimes(1); + + panel.navigate(); + expect(panel.message()).toBe('Detecting Angular app…'); + slow = false; + answer(new Response('{}', { status: 200 })); + await vi.advanceTimersByTimeAsync(0); + expect(panel.frame.style.display).toBe('none'); + expect(panel.message()).toBe('Detecting Angular app…'); + + await vi.advanceTimersByTimeAsync(1000); + expect(panel.frame.style.display).toBe('block'); + expect(new URL(panel.frame.src).searchParams.get('baseURL')).toBe( + 'http://localhost:4200/__ng-devtools/', + ); + }); +}); diff --git a/packages/ng-devtools/src/__tests__/forms-actions.test.ts b/packages/ng-devtools/src/__tests__/forms-actions.test.ts index 7a7dbf6..b0f54c8 100644 --- a/packages/ng-devtools/src/__tests__/forms-actions.test.ts +++ b/packages/ng-devtools/src/__tests__/forms-actions.test.ts @@ -192,7 +192,8 @@ describe('form actions on reactive forms', () => { value: 'x', }); expect(result).toMatchObject({ ok: false }); - expect(result.error).toContain('looks secret'); + expect(result.error).toContain('is redacted (name looks secret)'); + expect(result.error).toContain('to unmask on window.__NG_DEVTOOLS_FORMS__'); expect(form.controls.password.value).toBe(''); result = await runFormAction(ctx, { @@ -440,6 +441,51 @@ describe('form actions on template-driven and Signal Forms', () => { }); }); +class Vault { + form = new FormGroup({ + pin: new FormControl(''), + code: new FormControl(''), + shown: new FormControl(''), + tokens: new FormGroup({ label: new FormControl('') }), + }); +} +Component({ + selector: 'vault-form', + imports: [ReactiveFormsModule], + template: ` +
    + + + +
    +
    + `, +})(Vault); + +describe('secret refusals', () => { + it('names the reason and the unmask that lifts it', async () => { + const fixture = await render(Vault); + const ctx = contextFor(fixture.nativeElement); + const write = (path: string) => + runFormAction(ctx, { action: 'set-value', formId: 'form-1', path, value: '1' }); + + const pin = await write('pin'); + expect(pin.error).toContain('is redacted (name looks secret)'); + expect(pin.error).toContain('add "pin" to unmask on window.__NG_DEVTOOLS_FORMS__'); + expect(pin.error).not.toContain('data-ng-devtools'); + + const code = await write('code'); + expect(code.error).toContain('is redacted (password input)'); + expect(code.error).toContain('add data-ng-devtools="unmask" to the field, or add "code"'); + + const label = await write('tokens.label'); + expect(label.error).toContain('is redacted (inside a secret group)'); + expect(label.error).toContain('add "tokens" to unmask'); + + expect((await write('shown')).ok).toBe(true); + }); +}); + describe('secret safety for group writes', () => { it('refuses a group write that would touch a secret field', async () => { const fixture = await render(Signup); @@ -454,7 +500,8 @@ describe('secret safety for group writes', () => { path: 'account', value: { name: 'b', apiKey: 'stolen' }, }); - expect(result.error).toContain('secret field "apiKey"'); + expect(result.error).toContain('secret field "apiKey" (name looks secret)'); + expect(result.error).toContain('add "apiKey" to unmask'); expect(account.controls.account.controls.apiKey.value).toBe('k'); const allowed = await runFormAction(ctx, { action: 'set-value', diff --git a/packages/ng-devtools/src/__tests__/forms-collector.test.ts b/packages/ng-devtools/src/__tests__/forms-collector.test.ts index 5072d87..333b246 100644 --- a/packages/ng-devtools/src/__tests__/forms-collector.test.ts +++ b/packages/ng-devtools/src/__tests__/forms-collector.test.ts @@ -57,17 +57,12 @@ function harness(maxEvents?: number) { }, }, }; - const collector = attachForms( - my, - 'pg', - () => (globalThis as any).ng, - { show: () => {}, clear: () => {} }, - maxEvents, - ); + const highlight = { show: vi.fn(), clear: vi.fn() }; + const collector = attachForms(my, 'pg', () => (globalThis as any).ng, highlight, maxEvents); stops.push(collector.stop); const reports = () => calls.filter((c) => c.name === 'push-forms').map((c) => c.args[0]); const lastEvents = (): FormEvent[] => reports().at(-1)?.events ?? []; - return { calls, handlers, collector, reports, lastEvents }; + return { calls, handlers, collector, reports, lastEvents, highlight }; } const tick = (ms = 120) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -289,6 +284,15 @@ describe('forms collector', () => { h.handlers.get('form-action')!({ requestId: 'p1', request: { action: 'pick', formId } }); await tick(20); const clicked = document.getElementById('email')!; + clicked.dispatchEvent(new MouseEvent('mouseover', { bubbles: true })); + expect(h.highlight.show).toHaveBeenLastCalledWith(clicked); + h.highlight.clear.mockClear(); + clicked.dispatchEvent( + new MouseEvent('mouseout', { bubbles: true, relatedTarget: document.body }), + ); + expect(h.highlight.clear).not.toHaveBeenCalled(); + clicked.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, relatedTarget: null })); + expect(h.highlight.clear).toHaveBeenCalledTimes(1); let reachedApp = false; clicked.addEventListener('click', () => (reachedApp = true)); clicked.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); @@ -298,6 +302,29 @@ describe('forms collector', () => { expect(reachedApp).toBe(false); }); + it('cancels a pick from the panel', async () => { + await mount(Login); + const h = harness(); + h.collector.push(); + await tick(); + const formId = h.reports().at(-1).forms[0].id; + h.handlers.get('form-action')!({ requestId: 'p1', request: { action: 'pick', formId } }); + await tick(20); + h.handlers.get('form-action')!({ requestId: 'c1', request: { action: 'cancel-pick', formId } }); + await tick(20); + const answers = h.calls.filter((c) => c.name === 'form-action-result').map((c) => c.args[0]); + expect(answers.find((a) => a.requestId === 'p1').result).toMatchObject({ + ok: false, + error: 'Picking cancelled.', + }); + expect(answers.find((a) => a.requestId === 'c1').result).toMatchObject({ ok: true }); + let reachedApp = false; + const clicked = document.getElementById('email')!; + clicked.addEventListener('click', () => (reachedApp = true)); + clicked.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); + expect(reachedApp).toBe(true); + }); + it('captures NG01xxx setup errors from console.error without leaking tokens', async () => { const original = console.error; console.error = () => {}; diff --git a/packages/ng-devtools/src/__tests__/forms-mcp.test.ts b/packages/ng-devtools/src/__tests__/forms-mcp.test.ts index 3680a42..fc1c94e 100644 --- a/packages/ng-devtools/src/__tests__/forms-mcp.test.ts +++ b/packages/ng-devtools/src/__tests__/forms-mcp.test.ts @@ -257,6 +257,9 @@ describe('forms MCP tools', () => { const age = await call('explain-field', { form: 'form-1', path: 'age' }); expect(age).toContain('Uncommitted: the input holds 30, which reaches the model on blur.'); expect(age).toContain('Stale:'); + expect(await call('explain-field', { form: 'form-1', path: 'password' })).toContain( + 'Value: "[redacted]" (redacted: name looks secret).', + ); const card = await call('explain-field', { form: 'Profile', path: 'card' }); expect(card).toContain('Validation is skipped because the field is hidden.'); expect(await call('explain-field', { form: 'Profile', path: 'nope' })).toContain( diff --git a/packages/ng-devtools/src/__tests__/http.test.ts b/packages/ng-devtools/src/__tests__/http.test.ts index 385883e..ec88a61 100644 --- a/packages/ng-devtools/src/__tests__/http.test.ts +++ b/packages/ng-devtools/src/__tests__/http.test.ts @@ -10,6 +10,7 @@ import { type EnvironmentInjector, } from '@angular/core'; import { + HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, @@ -378,6 +379,38 @@ describe('interceptor', () => { expect(parseBody('{"a":1}')).toEqual({ a: 1 }); }); + it('builds mock bodies and content types that match the response type', async () => { + const answer = (responseType: 'json' | 'text' | 'blob' | 'arraybuffer', status: number) => + new Promise<{ body: unknown; type: string | null }>((resolve) => + run(new HttpRequest('GET', '/api/products', null, { responseType }), () => { + throw new Error('the request should not reach the backend'); + }).subscribe({ + next: (event) => { + if (event instanceof HttpResponse) + resolve({ body: event.body, type: event.headers.get('content-type') }); + }, + error: (error: HttpErrorResponse) => + resolve({ body: error.error, type: error.headers.get('content-type') }), + }), + ); + for (const status of [200, 500]) { + storeRules([rule({ status, body: '{"a":1}' })]); + const json = await answer('json', status); + expect(json).toEqual({ body: { a: 1 }, type: 'application/json' }); + const text = await answer('text', status); + expect(text).toEqual({ body: '{"a":1}', type: 'text/plain' }); + const blob = await answer('blob', status); + expect(blob.body).toBeInstanceOf(Blob); + expect(await (blob.body as Blob).text()).toBe('{"a":1}'); + expect(blob.type).toBe('application/octet-stream'); + const buffer = await answer('arraybuffer', status); + expect(buffer.body).toBeInstanceOf(ArrayBuffer); + expect(new TextDecoder().decode(buffer.body as ArrayBuffer)).toBe('{"a":1}'); + expect(buffer.type).toBe('application/octet-stream'); + } + expect(httpRegistry().calls?.[2]).toMatchObject({ mocked: true, preview: '{"a":1}' }); + }); + it('records a request cancelled during a delay rule', () => { vi.useFakeTimers(); storeRules([rule({ status: undefined, delayMs: 1000 })]); diff --git a/packages/ng-devtools/src/__tests__/hub.test.ts b/packages/ng-devtools/src/__tests__/hub.test.ts index 9f3660d..351ccf6 100644 --- a/packages/ng-devtools/src/__tests__/hub.test.ts +++ b/packages/ng-devtools/src/__tests__/hub.test.ts @@ -1,4 +1,5 @@ import { connect } from 'node:net'; +import { Hono } from 'hono'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { hubDefaultOrigins, initNgDevtoolsHub, type NgDevtoolsHubOptions } from '../hub.ts'; import { makeProject } from './analog-fixture.ts'; @@ -102,6 +103,36 @@ async function sseStatus( return res.status; } +describe('ng-devtools hub behind a web router', () => { + it('answers under its base and lets other routes reach the app', async () => { + const cwd = makeProject({ 'package.json': '{}' }); + const devtools = initNgDevtoolsHub({ cwd, ws: false, auth: false }); + hubs.push(devtools); + await devtools.ready; + const app = new Hono(); + app.all(`${devtools.base}*`, (c) => devtools.handler(c.req.raw)); + app.get('*', (c) => c.text('angular app')); + const get = (path: string) => app.request(`http://localhost${path}`); + + const meta = await get('/__devframes/__connection.json'); + expect(meta.status).toBe(200); + expect(await meta.json()).toHaveProperty('backend'); + expect((await get('/__devframes/ng-devtools/__connection.json')).status).toBe(200); + expect((await get('/__devframes/')).status).toBe(200); + const page = await get('/trips/42'); + expect(page.status).toBe(200); + expect(await page.text()).toBe('angular app'); + }); + + it('answers 404 outside its base instead of falling through', async () => { + const cwd = makeProject({ 'package.json': '{}' }); + const devtools = initNgDevtoolsHub({ cwd, ws: false, auth: false }); + hubs.push(devtools); + await devtools.ready; + expect((await devtools.handler(new Request('http://localhost/trips/42'))).status).toBe(404); + }); +}); + describe('ng-devtools hub origins', () => { it('accepts loopback pages and the Chrome extension by default, and nothing else', () => { for (const origin of [ diff --git a/packages/ng-devtools/src/__tests__/injector-tree.test.ts b/packages/ng-devtools/src/__tests__/injector-tree.test.ts index bb487b5..f12d94c 100644 --- a/packages/ng-devtools/src/__tests__/injector-tree.test.ts +++ b/packages/ng-devtools/src/__tests__/injector-tree.test.ts @@ -6,6 +6,7 @@ import { providerKind, tokenName, } from '../injector-tree.ts'; +import { zoneModeOf } from '../zone-mode.ts'; class ElementRef { static __NG_ELEMENT_ID__ = 1; @@ -279,6 +280,95 @@ describe('collectInjectorTree', () => { ]); }); + it('lists what the services an environment injector created inject, and never creates one', () => { + const { ng } = fakeNg(); + class Http {} + class Api {} + class Pending {} + const NOT_YET = {}; + const rootEnv = ng.ɵgetInjectorResolutionPath({ kind: 'node' })[1]; + rootEnv.records = new Map([ + [Api, { factory: () => new Api(), value: new Api() }], + [Pending, { factory: () => new Pending(), value: NOT_YET }], + [Http, { factory: () => new Http(), value: new Http() }], + [API_URL, { factory: undefined, value: '/api' }], + ]); + const asked: unknown[] = []; + const lookup = ng.ɵgetDependenciesFromInjectable; + ng.ɵgetDependenciesFromInjectable = (inj: any, token: unknown) => { + if (inj.kind === 'node') return lookup(inj, token); + asked.push(token); + return token === Api + ? { + dependencies: [ + { token: Http, flags: {}, providedIn: rootEnv }, + { token: API_URL, flags: { optional: true } }, + ], + } + : { dependencies: [] }; + }; + const { environment } = collectInjectorTree(ng); + const root = environment[0].children[0]; + expect(root.dependencies).toEqual([ + { from: 'Api', token: 'Http', flags: [], providedBy: root.injector.id }, + { from: 'Api', token: 'API_URL', flags: ['optional'], providedBy: root.injector.id }, + ]); + expect(environment[0].dependencies).toEqual([]); + expect(asked).toEqual([Api, Http]); + collectInjectorTree(ng); + expect(asked).toEqual([Api, Http]); + }); + + it('lists a service dependency once when the service injects it several times', () => { + const { ng } = fakeNg(); + class Zone {} + class Destroy {} + const rootEnv = ng.ɵgetInjectorResolutionPath({ kind: 'node' })[1]; + rootEnv.records = new Map([ + [Zone, { factory: () => new Zone(), value: new Zone() }], + ]); + const lookup = ng.ɵgetDependenciesFromInjectable; + ng.ɵgetDependenciesFromInjectable = (inj: any, token: unknown) => { + if (inj.kind === 'node') return lookup(inj, token); + const dep = { token: Destroy, flags: { optional: true }, providedIn: rootEnv }; + return token === Zone + ? { dependencies: [dep, dep, dep, { ...dep, flags: {} }, dep] } + : { dependencies: [] }; + }; + const root = collectInjectorTree(ng).environment[0].children[0]; + expect(root.dependencies).toEqual([ + { from: 'Zone', token: 'Destroy', flags: ['optional'], providedBy: root.injector.id }, + { from: 'Zone', token: 'Destroy', flags: [], providedBy: root.injector.id }, + ]); + }); + + it('reports the change detection mode from the NgZone the root injector created', () => { + class NgZone { + _inner = {}; + run() {} + } + class NoopNgZone { + run() {} + } + const root = (zone: object | undefined) => ({ + records: new Map([[NgZone, { factory: () => zone, value: zone }]]), + }); + expect(zoneModeOf(root(new NgZone()), { Zone: {} })).toBe('zone'); + expect(zoneModeOf(root(new NoopNgZone()), {})).toBe('zoneless'); + expect(zoneModeOf(root(new NoopNgZone()), { Zone: {} })).toBe('zone-unused'); + expect(zoneModeOf(root({}), {})).toBeNull(); + expect(zoneModeOf({ records: new Map() }, {})).toBeNull(); + expect(zoneModeOf(null)).toBeNull(); + + const { ng } = fakeNg(); + const rootEnv = ng.ɵgetInjectorResolutionPath({ kind: 'node' })[1]; + expect(collectInjectorTree(ng)).not.toHaveProperty('zone'); + Object.assign(rootEnv, root(new NoopNgZone())); + expect(collectInjectorTree(ng).zone).toBe( + typeof (globalThis as { Zone?: unknown }).Zone === 'undefined' ? 'zoneless' : 'zone-unused', + ); + }); + it('returns nothing without the Angular debug APIs', () => { expect(collectInjectorTree(undefined)).toEqual({ roots: [], environment: [] }); }); diff --git a/packages/ng-devtools/src/__tests__/ngrx-collector.test.ts b/packages/ng-devtools/src/__tests__/ngrx-collector.test.ts index 6913efe..a84892b 100644 --- a/packages/ng-devtools/src/__tests__/ngrx-collector.test.ts +++ b/packages/ng-devtools/src/__tests__/ngrx-collector.test.ts @@ -2,7 +2,8 @@ import { signal } from '@angular/core'; import { describe, expect, it, vi } from 'vitest'; import { createNgrxCollector } from '../ngrx-collector.ts'; -import { diff, serialize } from '../ngrx-shared.ts'; +import { attachNgrx } from '../ngrx-overlay.ts'; +import { diff, serialize, type NgrxPageReport } from '../ngrx-shared.ts'; import { mergeNgrxReport, nameStore, ngrxStateOf, type NgrxPages } from '../rpc/ngrx-tools.ts'; const SIGNAL = Symbol('SIGNAL'); @@ -487,7 +488,7 @@ describe('ngrx collector with Store DevTools', () => { () => {}, ); collector.collect(); - return { store, collector, current }; + return { store, collector, current, ng, lifted }; } it('logs a restore with its diff so the next action is not blamed for it', () => { @@ -533,6 +534,47 @@ describe('ngrx collector with Store DevTools', () => { expect(collector.run({ type: 'latest' }).message).toMatch(/already/); }); + it('tells the server about entries Store DevTools dropped after they were sent', async () => { + const { store, ng, lifted } = setupDevtools(); + const pages: NgrxPages = new Map(); + const reports: NgrxPageReport[] = []; + const my = { + rpc: { + call: async (name: string, report: unknown) => { + if (name !== 'push-ngrx-state') return undefined; + reports.push(report as NgrxPageReport); + return { seq: mergeNgrxReport(pages, report as NgrxPageReport, []) }; + }, + register: () => {}, + }, + }; + const overlay = attachNgrx(my, 'p1', () => ng as any); + try { + await overlay.push(); + store.dispatch({ type: 'inc' }); + store.dispatch({ type: 'inc' }); + await overlay.push(); + const log = () => ngrxStateOf(pages).pages[0].log; + expect(log().map((e) => e.restorable)).toEqual([true, true]); + delete lifted.actionsById[1]; + await overlay.push(); + expect(reports.at(-1)).toMatchObject({ + log: [], + unrestorable: [{ seq: 1, reason: 'dropped' }], + }); + expect(log().map((e) => [e.restorable, e.unrestorable])).toEqual([ + [false, 'dropped'], + [true, undefined], + ]); + store.dispatch({ type: 'inc' }); + await overlay.push(); + expect(reports.at(-1)?.unrestorable).toBeUndefined(); + expect(log().map((e) => e.restorable)).toEqual([false, true, true]); + } finally { + overlay.stop(); + } + }); + it('does not call a restore to the newest action paused', () => { const { store, collector } = setupDevtools(); store.dispatch({ type: 'inc' }); @@ -635,6 +677,49 @@ describe('ngrx tools', () => { expect(ngrxStateOf(pages).pages[0].dropped).toBe(3); expect(ngrxStateOf(pages).pages[0]).not.toHaveProperty('session'); }); + + it('marks earlier entries the page can no longer restore', () => { + const pages: NgrxPages = new Map(); + const entry = (seq: number) => ({ + seq, + source: 'store' as const, + storeId: 'store', + type: 'inc', + timestamp: 0, + diff: [], + restorable: true, + }); + const report = (log: ReturnType[], unrestorable?: unknown) => ({ + pageId: 'p1', + session: 's1', + url: '/', + title: '', + stores: [], + classic: { state: {}, devtools: true, scope: 'root' }, + log, + ...(unrestorable ? { unrestorable: unrestorable as NgrxPageReport['unrestorable'] } : {}), + }); + mergeNgrxReport(pages, report([entry(1), entry(2)]), []); + mergeNgrxReport( + pages, + report( + [entry(3)], + [ + { seq: 1, reason: 'dropped' }, + { seq: 2, reason: 'bogus' }, + { seq: 9, reason: 'not-recorded' }, + ], + ) as NgrxPageReport, + [], + ); + expect( + ngrxStateOf(pages).pages[0].log.map((e) => [e.seq, e.restorable, e.unrestorable]), + ).toEqual([ + [1, false, 'dropped'], + [2, true, undefined], + [3, true, undefined], + ]); + }); }); describe('ngrx collector with @ngrx/signals', () => { @@ -872,7 +957,11 @@ async function testBed() { describe('ngrx collector with @ngrx/store', () => { async function realStore( - options: { devtools?: { maxAge?: number }; hide?: string[]; store?: boolean } = {}, + options: { + devtools?: { maxAge?: number; actionsBlocklist?: string[] }; + hide?: string[]; + store?: boolean; + } = {}, ) { const TestBed = await testBed(); const { EnvironmentInjector } = await import('@angular/core'); @@ -982,10 +1071,128 @@ describe('ngrx collector with @ngrx/store', () => { const { store, collector, add } = await realStore({ devtools: { maxAge: 3 } }); collector.collect(); for (let i = 0; i < 5; i++) store.dispatch(add({ by: 1 })); - expect(collector.run({ type: 'restore', seq: 1 }).error).toMatch(/no longer holds this action/); + expect(collector.run({ type: 'restore', seq: 1 }).error).toMatch( + /no longer holds this action.*maxAge/, + ); + expect(collector.logSince(0)[0]).toMatchObject({ restorable: false, unrestorable: 'dropped' }); expect(collector.run({ type: 'restore', seq: 5 })).toMatchObject({ ok: true }); }); + it('does not blame maxAge when the Store DevTools history was committed', async () => { + const { TestBed, store, collector, add } = await realStore({ devtools: { maxAge: 25 } }); + const { StoreDevtools } = await import('@ngrx/store-devtools'); + collector.collect(); + store.dispatch(add({ by: 1 })); + TestBed.inject(StoreDevtools).commit(); + collector.collect(); + expect(collector.logSince(0)[0]).toMatchObject({ restorable: false, unrestorable: 'dropped' }); + const error = collector.run({ type: 'restore', seq: 1 }).error; + expect(error).toMatch(/no longer holds this action/); + expect(error).toMatch(/committed, reset or imported/); + }); + + it('marks the actions Store DevTools dropped past maxAge as not restorable', async () => { + const { store, collector, add } = await realStore({ devtools: { maxAge: 3 } }); + collector.collect(); + for (let i = 0; i < 5; i++) store.dispatch(add({ by: 1 })); + expect(collector.logSince(0).every((e) => e.restorable)).toBe(true); + collector.collect(); + expect(collector.logSince(0).map((e) => [e.seq, e.restorable, e.unrestorable])).toEqual([ + [1, false, 'dropped'], + [2, false, 'dropped'], + [3, false, 'dropped'], + [4, true, undefined], + [5, true, undefined], + ]); + const first = collector.unrestorableSince(0); + expect(first.updates).toEqual([1, 2, 3].map((seq) => ({ seq, reason: 'dropped' }))); + store.dispatch(add({ by: 1 })); + collector.collect(); + expect(collector.unrestorableSince(first.last).updates).toEqual([ + { seq: 4, reason: 'dropped' }, + ]); + expect(collector.run({ type: 'restore', seq: 2 }).error).toMatch(/no longer holds this action/); + }); + + it('marks an action Store DevTools never recorded as not restorable', async () => { + const { store, collector, add } = await realStore({ + devtools: { actionsBlocklist: ['Skip'] }, + }); + collector.collect(); + store.dispatch(add({ by: 1 })); + store.dispatch({ type: '[Counter] Skip' }); + collector.collect(); + expect(collector.logSince(0).map((e) => [e.type, e.restorable, e.unrestorable])).toEqual([ + ['[Counter] Add', true, undefined], + ['[Counter] Skip', false, 'not-recorded'], + ]); + expect(collector.unrestorableSince(0).updates).toEqual([]); + expect(collector.run({ type: 'restore', seq: 2 }).error).toMatch( + /never recorded this action.*actionsBlocklist/, + ); + }); + + it('dispatches an action with a payload and returns its log entry', async () => { + const { store, collector } = await realStore(); + collector.collect(); + const result = collector.run({ + type: 'dispatch', + action: '[Counter] Add', + payload: { by: 5 }, + }); + expect(result).toMatchObject({ + ok: true, + message: 'Dispatched [Counter] Add as #1.', + entry: { + seq: 1, + type: '[Counter] Add', + action: { type: '[Counter] Add', by: 5 }, + origin: 'dispatch', + diff: [{ path: 'count', op: 'change', before: 0, after: 5 }], + }, + }); + let count: unknown; + store.select('count').subscribe((value) => (count = value)); + expect(count).toBe(5); + const again = collector.run({ type: 'dispatch-again', seq: 1 }); + expect(again).toMatchObject({ ok: true, entry: { seq: 2, action: { by: 5 } } }); + expect(count).toBe(10); + expect(collector.run({ type: 'dispatch-again', seq: 9 }).error).toMatch(/no longer/); + }); + + it('refuses a dispatch with a bad type or payload, or without a Store', async () => { + const { collector } = await realStore(); + collector.collect(); + const bad = (action: unknown, payload?: unknown) => + collector.run({ type: 'dispatch', action, payload } as never).error; + expect(bad('')).toMatch(/non-empty string/); + expect(bad(7)).toMatch(/non-empty string/); + expect(bad('x'.repeat(201))).toMatch(/longer than 200/); + expect(bad('[A]\nB')).toMatch(/control characters/); + expect(bad('[A] B', [1])).toMatch(/JSON object/); + expect(bad('[A] B', { type: 'other' })).toMatch(/"type" key/); + expect(bad('[A] B', { big: 'x'.repeat(20_001) })).toMatch(/larger than/); + expect(collector.logSince(0)).toEqual([]); + const none = await realStore({ store: false }); + none.collector.collect(); + expect(none.collector.run({ type: 'dispatch', action: '[A] B' }).error).toMatch( + /No @ngrx\/store Store/, + ); + }); + + it('does not dispatch a restore entry again and notes a paused store', async () => { + const { store, collector, add } = await realStore({ devtools: {} }); + collector.collect(); + store.dispatch(add({ by: 1 })); + store.dispatch(add({ by: 2 })); + collector.run({ type: 'restore', seq: 1 }); + expect(collector.run({ type: 'dispatch-again', seq: 3 }).error).toMatch( + /Only an @ngrx\/store action/, + ); + const result = collector.run({ type: 'dispatch', action: '[Counter] Add', payload: { by: 5 } }); + expect(result.message).toMatch(/as #4\. The store is paused/); + }); + it('falls back to ActionsSubject when ScannedActionsSubject is not found', async () => { const { store, collector, add } = await realStore({ hide: ['ScannedActionsSubject'] }); expect(collector.collect().classic).toMatchObject({ state: { count: 0 } }); diff --git a/packages/ng-devtools/src/__tests__/ngrx-mcp.test.ts b/packages/ng-devtools/src/__tests__/ngrx-mcp.test.ts index 55f46cb..36c5bfd 100644 --- a/packages/ng-devtools/src/__tests__/ngrx-mcp.test.ts +++ b/packages/ng-devtools/src/__tests__/ngrx-mcp.test.ts @@ -1,21 +1,24 @@ import { createHostContext } from 'devframe/node'; -import { describe, expect, it } from 'vitest'; -import ngDevtools from '../devframe.ts'; +import { describe, expect, it, vi } from 'vitest'; +import ngDevtools, { createNgDevtools } from '../devframe.ts'; import type { NgrxPageReport } from '../ngrx-shared.ts'; +import type { NgDevtoolsConfig } from '../config.ts'; -async function boot() { +async function boot(config?: NgDevtoolsConfig) { const host = { mountStatic: () => {}, resolveOrigin: () => 'http://localhost', getStorageDir: () => '', }; const ctx = await createHostContext({ cwd: process.cwd(), mode: 'dev', host: host as never }); - await ngDevtools.setup(ctx as never); + await (config ? createNgDevtools(config) : ngDevtools).setup(ctx as never); const push = (name: string, payload: unknown) => ctx.rpc.invokeLocal(`ng-devtools:${name}` as never, ...([payload] as never)); const read = async (id: string) => ((await ctx.agent.read(`ng-devtools:${id}`)) as { text: string }).text; - return { ctx, push, read }; + const call = async (tool: string, args: Record) => + ((await ctx.agent.invoke(`ng-devtools:${tool}`, args)) as { markdown: string }).markdown; + return { ctx, push, read, call }; } const entry = (seq: number, type: string, origin: 'dispatch' | 'effect' | 'reactive') => ({ @@ -58,3 +61,92 @@ describe('ngrx-store resource', () => { ]); }); }); + +type Broadcast = { + method: string; + args: [{ requestId: string; pageId: string; request: unknown }]; +}; + +const page = (pageId: string, classic: boolean): NgrxPageReport => ({ + pageId, + session: 's1', + url: '/', + title: 'App', + stores: [], + classic: classic ? { state: { count: 0 }, devtools: false, scope: 'root' } : null, + log: [], +}); + +describe('dispatch-ngrx-action tool', () => { + it('sends the action to the page with a Store and returns the log entry', async () => { + const { ctx, push, call } = await boot(); + await push('push-ngrx-state', page('p1', true)); + await push('push-ngrx-state', page('p2', false)); + const sent: Broadcast[] = []; + vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async (options: Broadcast) => { + if (!options.method.endsWith('ngrx-action')) return; + sent.push(options); + const { requestId } = options.args[0]; + const result = { + ok: true, + message: 'Dispatched [Cart] Add Item as #4.', + entry: { + ...entry(4, '[Cart] Add Item', 'dispatch'), + action: { type: '[Cart] Add Item', id: 7 }, + }, + }; + setTimeout(() => void push('ngrx-action-result', { requestId, result }), 5); + }) as never); + + const text = await call('dispatch-ngrx-action', { + type: '[Cart] Add Item', + payload: { id: 7 }, + }); + expect(sent[0].args[0]).toMatchObject({ + pageId: 'p1', + request: { type: 'dispatch', action: '[Cart] Add Item', payload: { id: 7 } }, + }); + expect(text).toContain('Dispatched [Cart] Add Item as #4.'); + expect(text).toContain('untrusted data'); + expect(text).toContain('"id": 7'); + + await call('dispatch-ngrx-action', { seq: 4 }); + expect(sent[1].args[0].request).toEqual({ type: 'dispatch-again', seq: 4 }); + }); + + it('checks the page, the Store and the action before it sends anything', async () => { + const { ctx, push, call } = await boot(); + const broadcast = vi.spyOn(ctx.rpc, 'broadcast').mockImplementation((async () => {}) as never); + expect(await call('dispatch-ngrx-action', { type: '[A] B' })).toMatch( + /No connected page has an @ngrx\/store Store/, + ); + await push('push-ngrx-state', page('p1', true)); + await push('push-ngrx-state', page('p2', false)); + expect(await call('dispatch-ngrx-action', { page: 'p2', type: '[A] B' })).toMatch( + /`p2` has no @ngrx\/store Store/, + ); + expect(await call('dispatch-ngrx-action', { page: 'p9', type: '[A] B' })).toMatch( + /No page `p9`/, + ); + expect(await call('dispatch-ngrx-action', { type: '' })).toMatch(/non-empty string/); + expect(await call('dispatch-ngrx-action', { type: '[A] B', payload: { type: 'x' } })).toMatch( + /"type" key/, + ); + expect(await call('dispatch-ngrx-action', { seq: 'x' })).toMatch(/log entry number/); + expect( + broadcast.mock.calls.filter(([o]) => + (o as unknown as Broadcast).method.endsWith('ngrx-action'), + ), + ).toEqual([]); + }); + + it('is left out when the ngrx write action is off, and the RPC refuses dispatches', async () => { + const { ctx, push } = await boot({ actions: { ngrx: false } }); + const tools = ctx.agent.list().tools.map((tool) => tool.id); + expect(tools).not.toContain('ng-devtools:dispatch-ngrx-action'); + expect(tools).toContain('ng-devtools:get-ngrx-store'); + expect( + await push('request-ngrx-action', { request: { type: 'dispatch', action: '[A] B' } }), + ).toEqual({ error: expect.stringContaining('dispatching actions') }); + }); +}); diff --git a/packages/ng-devtools/src/__tests__/overlay-config.test.ts b/packages/ng-devtools/src/__tests__/overlay-config.test.ts index 6f9030b..ec66c0e 100644 --- a/packages/ng-devtools/src/__tests__/overlay-config.test.ts +++ b/packages/ng-devtools/src/__tests__/overlay-config.test.ts @@ -99,6 +99,30 @@ describe('overlay collectors', () => { expect(calls).toContain('forget-router-page'); }); + it('forget the signal page on pagehide and push the graph again when the page comes back', async () => { + document.body.innerHTML = ''; + vi.stubGlobal('ng', { + ɵgetSignalGraph: () => ({ nodes: [], edges: [] }), + getInjector: () => ({}), + getComponent: (el: Element) => (el.tagName === 'APP-ROOT' ? {} : null), + }); + try { + await start({ limits: { refreshMs: 500 } }); + expect(calls).toContain('push-signal-graph'); + calls.length = 0; + dispatchEvent(new Event('pagehide')); + expect(calls).toContain('forget-signal-page'); + calls.length = 0; + dispatchEvent(new Event('pageshow')); + await new Promise((resolve) => setTimeout(resolve, 700)); + expect(calls).toContain('push-signal-graph'); + expect(calls).not.toContain('ping-signal-graph'); + } finally { + vi.unstubAllGlobals(); + document.body.innerHTML = ''; + } + }); + it('poll on the default fallback interval without a config', async () => { const interval = vi.spyOn(globalThis, 'setInterval'); await start(); diff --git a/packages/ng-devtools/src/__tests__/page-highlight.test.ts b/packages/ng-devtools/src/__tests__/page-highlight.test.ts index 070b5f5..e9e8b34 100644 --- a/packages/ng-devtools/src/__tests__/page-highlight.test.ts +++ b/packages/ng-devtools/src/__tests__/page-highlight.test.ts @@ -1,6 +1,11 @@ // @vitest-environment jsdom import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { clearHighlight, highlightBox, showHighlight } from '../page-highlight.ts'; +import { + clearHighlight, + HIGHLIGHT_SAFETY_MS, + highlightBox, + showHighlight, +} from '../page-highlight.ts'; const handlers = new Map void>(); @@ -102,6 +107,36 @@ describe('page highlight', () => { expect(box()?.style.zIndex).toBe('2147483645'); }); + it('keeps a panel highlight until a clear arrives, and an agent highlight clears itself', async () => { + vi.stubGlobal('BroadcastChannel', undefined); + const { initOverlay } = await import('../overlay.ts'); + const stop = await initOverlay(); + vi.useFakeTimers(); + try { + document.body.innerHTML = ''; + place(document.querySelector('app-card')!, { x: 1, y: 2, width: 3, height: 4 }); + handlers.get('highlight-in-page')!('app-card'); + vi.advanceTimersByTime(10_000); + expect(box()).toBeDefined(); + handlers.get('highlight-in-page')!(null); + expect(box()).toBeUndefined(); + + handlers.get('highlight-in-page')!('app-card'); + vi.advanceTimersByTime(HIGHLIGHT_SAFETY_MS); + expect(box()).toBeUndefined(); + + handlers.get('highlight-in-page')!({ selector: '.card', reveal: true, durationMs: 2000 }); + vi.advanceTimersByTime(1900); + expect(box()).toBeDefined(); + vi.advanceTimersByTime(200); + expect(box()).toBeUndefined(); + } finally { + vi.useRealTimers(); + stop(); + vi.unstubAllGlobals(); + } + }); + it('accepts an SVG element from the highlight-in-page request', async () => { vi.stubGlobal('BroadcastChannel', undefined); const { initOverlay } = await import('../overlay.ts'); diff --git a/packages/ng-devtools/src/__tests__/panel-component-tree.test.ts b/packages/ng-devtools/src/__tests__/panel-component-tree.test.ts index 405c7e9..10bb986 100644 --- a/packages/ng-devtools/src/__tests__/panel-component-tree.test.ts +++ b/packages/ng-devtools/src/__tests__/panel-component-tree.test.ts @@ -5,6 +5,7 @@ import { filterTree, nearestRow, reconcileSelection, + truncationNotice, type TreeNode, } from '../../../../app/src/pages/component-tree-state.ts'; import { injectorTreeFor, pickPage, signalGraphFor } from '../../../../app/src/live-pages.ts'; @@ -38,6 +39,22 @@ describe('Components filter count', () => { expect(countText(5, 0, true)).toBe('0 of 5'); }); + it('marks the count as a lower bound and names the cap when the tree is truncated', () => { + expect(countText(2000, 0, false, true)).toBe('2000+ instances'); + expect(countText(2000, 3, true, true)).toBe('3 of 2000+'); + expect(filterAnnouncement(2000, 3, 'card', true)).toBe('3 of 2000+ instances match.'); + expect(truncationNotice({ components: 2000 })).toBe( + 'Showing the first 2000 component instances. Others are not listed or searchable.', + ); + expect(truncationNotice({ depth: 256 })).toBe( + 'Components nested more than 256 elements deep are not listed or searchable.', + ); + expect(truncationNotice({ components: 2000, depth: 256 })).toMatch( + /first 2000 component instances, and none nested more than 256 elements deep\. Others/, + ); + expect(truncationNotice()).toBe('The page has more components than the tree shows.'); + }); + it('announces the filter result, and nothing once the filter is cleared', () => { expect(filterAnnouncement(5, 2, 'card')).toBe('2 of 5 instances match.'); expect(filterAnnouncement(5, 0, 'zzz')).toBe('No components match.'); diff --git a/packages/ng-devtools/src/__tests__/panel-highlight-sessions.test.ts b/packages/ng-devtools/src/__tests__/panel-highlight-sessions.test.ts new file mode 100644 index 0000000..df0e89b --- /dev/null +++ b/packages/ng-devtools/src/__tests__/panel-highlight-sessions.test.ts @@ -0,0 +1,56 @@ +import { createHostContext } from 'devframe/node'; +import { describe, expect, it, vi } from 'vitest'; +import ngDevtools from '../devframe.ts'; + +async function boot() { + const host = { + mountStatic: () => {}, + resolveOrigin: () => 'http://localhost', + getStorageDir: () => '', + }; + const ctx = await createHostContext({ cwd: process.cwd(), mode: 'dev', host: host as never }); + await ngDevtools.setup(ctx as never); + const rpc = ctx.rpc as unknown as { + broadcast: (options: { method: string; args: unknown[] }) => Promise; + getCurrentRpcSession: () => unknown; + _emitSessionDisconnected: (meta: { id: number }) => void; + }; + const broadcast = vi.spyOn(rpc, 'broadcast').mockResolvedValue(undefined); + const as = (id: number, name: string, arg: unknown) => { + rpc.getCurrentRpcSession = () => ({ meta: { id } }); + return ctx.rpc.invokeLocal(`ng-devtools:${name}` as never, ...([arg] as never)); + }; + const sent = () => broadcast.mock.calls.map(([call]) => [call.method, call.args[0]]); + return { rpc, broadcast, as, sent }; +} + +describe('panel highlights and their connection', () => { + it('clears the page and form highlights when the panel that drew them disconnects', async () => { + const { rpc, broadcast, as, sent } = await boot(); + await as(1, 'request-page-highlight', { pageId: 'p1', id: 'c1' }); + await as(1, 'request-form-highlight', { formId: 'f1', path: 'name' }); + broadcast.mockClear(); + + rpc._emitSessionDisconnected({ id: 1 }); + expect(sent()).toEqual([ + ['ng-devtools:highlight-in-page', null], + ['ng-devtools:highlight-form-field', null], + ]); + }); + + it('leaves a highlight drawn by another panel or already cleared', async () => { + const { rpc, broadcast, as, sent } = await boot(); + await as(1, 'request-page-highlight', 'app-card'); + await as(2, 'request-page-highlight', 'app-list'); + await as(3, 'request-form-highlight', { formId: 'f1', path: 'name' }); + await as(3, 'request-form-highlight', null); + broadcast.mockClear(); + + rpc._emitSessionDisconnected({ id: 1 }); + rpc._emitSessionDisconnected({ id: 3 }); + expect(sent()).toEqual([]); + + rpc._emitSessionDisconnected({ id: 2 }); + expect(sent()).toEqual([['ng-devtools:highlight-in-page', null]]); + }); +}); diff --git a/packages/ng-devtools/src/__tests__/router-features.test.ts b/packages/ng-devtools/src/__tests__/router-features.test.ts index 865e59c..925d91c 100644 --- a/packages/ng-devtools/src/__tests__/router-features.test.ts +++ b/packages/ng-devtools/src/__tests__/router-features.test.ts @@ -7,6 +7,7 @@ import { PreloadAllModules, RedirectCommand, Router, + RouterOutlet, RouterPreloader, provideRouter, withNavigationErrorHandler, @@ -318,6 +319,63 @@ describe('router features on a real Router', () => { }); }); +describe('routerOutletData', () => { + class Shell {} + Component({ + selector: 'app-shell', + imports: [RouterOutlet], + template: ` + `, + })(Shell); + + it('previews the data the primary and a named outlet pass, redacted', async () => { + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + provideRouter([ + { + path: 'shell', + component: Shell, + children: [ + { path: '', component: Page }, + { path: 'side', component: Page, outlet: 'side' }, + ], + }, + ]), + ], + }); + const harness = await RouterTestingHarness.create(); + harness.fixture.componentInstance.routerOutletData.set({ user: 'Ada', ids: [1, 2] }); + await harness.navigateByUrl('/shell/(side:side)'); + harness.detectChanges(); + const outlets = outletsOf(TestBed.inject(Router) as never); + expect(outlets[0]).toMatchObject({ + outlet: 'primary', + component: 'Shell', + data: '{"user":"Ada","ids":[1,2]}', + }); + const side = outlets[0].children?.find((outlet) => outlet.outlet === 'side'); + expect(side).toMatchObject({ activated: true, component: 'Page' }); + expect(side?.data).toContain('"panel":"filters"'); + expect(side?.data).not.toContain('abc123'); + const primary = outlets[0].children?.find((outlet) => outlet.outlet === 'primary'); + expect(primary?.data).toBeUndefined(); + }); + + it('caps a large preview', async () => { + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ providers: [provideRouter([{ path: '', component: Page }])] }); + const harness = await RouterTestingHarness.create(); + harness.fixture.componentInstance.routerOutletData.set( + Object.fromEntries(Array.from({ length: 30 }, (_, i) => [`key${i}`, 'x'.repeat(100)])), + ); + await harness.navigateByUrl('/'); + const data = outletsOf(TestBed.inject(Router) as never)[0].data ?? ''; + expect(data.length).toBeLessThanOrEqual(301); + expect(data.endsWith('…')).toBe(true); + }); +}); + describe('preloads', () => { it('records preloads that run between navigations', async () => { TestBed.resetTestingModule(); diff --git a/packages/ng-devtools/src/__tests__/router-tools.test.ts b/packages/ng-devtools/src/__tests__/router-tools.test.ts index 34b1b26..27c9fae 100644 --- a/packages/ng-devtools/src/__tests__/router-tools.test.ts +++ b/packages/ng-devtools/src/__tests__/router-tools.test.ts @@ -284,6 +284,34 @@ describe('dropped navigations', () => { }); describe('router tool text', () => { + it('lists the routerOutletData each outlet passes', () => { + const outlets = [ + { + outlet: 'primary', + activated: true, + component: 'Shell', + route: '/shell', + data: '{"user":"Ada"}', + children: [ + { outlet: 'side', activated: true, component: 'Filters', route: '/side', data: '"x"' }, + { outlet: 'primary', activated: true, component: 'List', route: '/shell' }, + ], + }, + ]; + const text = inspectRouteText(state({ outlets }), {}, 1_000); + expect(text).toContain( + '- outlet `primary`: `Shell` for `/shell`\n - routerOutletData (ROUTER_OUTLET_DATA): `{"user":"Ada"}`', + ); + expect(text).toContain( + ' - outlet `side`: `Filters` for `/side`\n - routerOutletData (ROUTER_OUTLET_DATA): `"x"`', + ); + expect(text.match(/routerOutletData/g)).toHaveLength(2); + expect(inspectRouteText(state({ outlets }), { selector: 'Filters' }, 1_000)).toContain( + 'routerOutletData (ROUTER_OUTLET_DATA): `"x"`', + ); + expect(isRouterReport({ pageId: 'a', snapshot: null, navigations: [], outlets })).toBe(true); + }); + it('describes the active route tree', () => { const text = inspectRouteText(state(), {}, 1_000); expect(text).toContain('come from the running page'); diff --git a/packages/ng-devtools/src/__tests__/signal-history.test.ts b/packages/ng-devtools/src/__tests__/signal-history.test.ts index f93cb74..87248f4 100644 --- a/packages/ng-devtools/src/__tests__/signal-history.test.ts +++ b/packages/ng-devtools/src/__tests__/signal-history.test.ts @@ -271,7 +271,7 @@ describe('installSignalWriteHook', () => { core.fire({ debugName: 'x' }); expect(prev).toHaveBeenCalledTimes(1); expect(onWrite).toHaveBeenCalledTimes(1); - restore(); + restore!(); expect(core.get()).toBe(prev); }); @@ -281,7 +281,7 @@ describe('installSignalWriteHook', () => { const restore = await installSignalWriteHook(onWrite, async () => core); const later = vi.fn(); core.setPostSignalSetFn(later); - restore(); + restore!(); expect(core.get()).toBe(later); core.fire({ debugName: 'x' }); expect(onWrite).not.toHaveBeenCalled(); @@ -298,10 +298,18 @@ describe('installSignalWriteHook', () => { expect(() => core.fire({ debugName: 'x' })).not.toThrow(); }); - it('returns a no-op when the primitives cannot load', async () => { + it('returns null when the primitives cannot load', async () => { const restore = await installSignalWriteHook(vi.fn(), async () => { throw new Error('missing'); }); - expect(() => restore()).not.toThrow(); + expect(restore).toBeNull(); + }); + + it('returns null when the primitives lack the write hook', async () => { + expect(await installSignalWriteHook(vi.fn(), async () => ({}) as never)).toBeNull(); + }); + + it('returns a restore function when the hook installs', async () => { + expect(await installSignalWriteHook(vi.fn(), async () => fakeCore())).toBeTypeOf('function'); }); }); diff --git a/packages/ng-devtools/src/component-pick.ts b/packages/ng-devtools/src/component-pick.ts index 3346556..ece6adc 100644 --- a/packages/ng-devtools/src/component-pick.ts +++ b/packages/ng-devtools/src/component-pick.ts @@ -40,6 +40,9 @@ export function startComponentPick(options: PickOptions): { if (host instanceof HTMLElement) options.highlight.show(host); else options.highlight.clear(); }; + const onLeave = (event: MouseEvent) => { + if (!event.relatedTarget) options.highlight.clear(); + }; const onClick = (event: Event) => { if (ownElement(event.target)) return; event.preventDefault(); @@ -71,6 +74,7 @@ export function startComponentPick(options: PickOptions): { finish = () => {}; doc.removeEventListener('click', onClick, true); doc.removeEventListener('mouseover', onHover, true); + doc.removeEventListener('mouseout', onLeave, true); doc.removeEventListener('keydown', onKey, true); clearTimeout(timer); options.highlight.clear(); @@ -80,6 +84,7 @@ export function startComponentPick(options: PickOptions): { popup?.setAttribute('data-picking', ''); doc.addEventListener('click', onClick, true); doc.addEventListener('mouseover', onHover, true); + doc.addEventListener('mouseout', onLeave, true); doc.addEventListener('keydown', onKey, true); }); return { result, cancel: () => finish({ ok: false, error: 'Picking cancelled.' }) }; diff --git a/packages/ng-devtools/src/component-tree.ts b/packages/ng-devtools/src/component-tree.ts index f9d795e..4726a5d 100644 --- a/packages/ng-devtools/src/component-tree.ts +++ b/packages/ng-devtools/src/component-tree.ts @@ -90,18 +90,37 @@ export function componentHosts( return out; } +function hostsUnder(ng: ComponentDebugNg, scope: Element, tagName: string): Element[] { + const out: Element[] = []; + const visit = (el: Element, depth: number) => { + if (depth > MAX_DEPTH) return; + for (const child of childElements(el)) { + if (componentAt(ng, child)) { + if (child.tagName === tagName) out.push(child); + } else { + visit(child, depth + 1); + } + } + }; + visit(scope, 0); + return out; +} + export function hostPath(ng: ComponentDebugNg, el: Element): string { - const parts: string[] = []; + const chain: Element[] = []; + let top: Element = el; for (let node: Element | null = el; node; node = parentOf(node)) { - if (!componentAt(ng, node)) continue; - const tag = node.tagName.toLowerCase(); - const parent = node.parentNode; - const twins = parent - ? Array.from(parent.children).filter((c) => c.tagName === node!.tagName) - : []; - parts.unshift(twins.length > 1 ? `${tag}[${twins.indexOf(node) + 1}]` : tag); + top = node; + if (componentAt(ng, node)) chain.unshift(node); } - return parts.join(' > '); + return chain + .map((node, i) => { + const tag = node.tagName.toLowerCase(); + const scope = i > 0 ? chain[i - 1] : top === node ? null : top; + const twins = scope ? hostsUnder(ng, scope, node.tagName) : [node]; + return twins.length > 1 ? `${tag}[${twins.indexOf(node) + 1}]` : tag; + }) + .join(' > '); } export function componentHostOf(ng: ComponentDebugNg | undefined, el: Element): Element | null { @@ -276,6 +295,7 @@ export function collectComponentTree( const visit = (el: Element, out: LiveComponentNode[], depth: number) => { if (depth > MAX_DEPTH) { report.truncated = true; + report.truncatedBy = { ...report.truncatedBy, depth: MAX_DEPTH }; return; } const instance = componentAt(ng, el); @@ -283,6 +303,7 @@ export function collectComponentTree( if (instance) { if (report.count >= MAX_COMPONENTS) { report.truncated = true; + report.truncatedBy = { ...report.truncatedBy, components: MAX_COMPONENTS }; return; } report.count++; diff --git a/packages/ng-devtools/src/config.ts b/packages/ng-devtools/src/config.ts index f4e27e3..56b3e7d 100644 --- a/packages/ng-devtools/src/config.ts +++ b/packages/ng-devtools/src/config.ts @@ -319,7 +319,7 @@ export const ROUTER_WRITE_ACTIONS: readonly string[] = ['navigate', 'abort', 're export const ACTION_TOOLS: Record = { forms: ['form-action', 'fill-form'], router: ['navigate'], - ngrx: [], + ngrx: ['dispatch-ngrx-action'], http: [], analog: ['analog-call-api'], }; @@ -328,7 +328,7 @@ export function actionBlockedMessage(action: NgDevtoolsAction): string { const what = { forms: 'Writing to forms', router: 'Navigating', - ngrx: 'Restoring NgRx state', + ngrx: 'Restoring NgRx state and dispatching actions', http: 'Changing HTTP mock rules and clearing HTTP calls', analog: 'Calling API routes', }[action]; @@ -356,6 +356,7 @@ export const RPC_INSPECTOR: Record = { 'get-signals': 'signals', 'push-signal-graph': 'signals', 'ping-signal-graph': 'signals', + 'forget-signal-page': 'signals', 'select-signal-target': 'signals', 'get-providers': 'injectors', 'push-injector-tree': 'injectors', @@ -411,6 +412,7 @@ export const AGENT_INSPECTOR: Record = { 'injector-tree': 'injectors', 'inspect-providers': 'injectors', 'ngrx-store': 'ngrx', + 'dispatch-ngrx-action': 'ngrx', forms: 'forms', 'inspect-forms': 'forms', 'explain-form-invalid': 'forms', @@ -454,6 +456,7 @@ export const PAGE_AGENT_ENTRIES: readonly string[] = [ 'injector-tree', 'inspect-providers', 'ngrx-store', + 'dispatch-ngrx-action', 'forms', 'inspect-forms', 'explain-form-invalid', @@ -531,7 +534,7 @@ const INSPECTOR_LABEL: Record = { const ACTION_LABEL: Record = { forms: 'Form writes', router: 'Navigation', - ngrx: 'NgRx restore', + ngrx: 'NgRx restore and dispatch', http: 'HTTP mocking', analog: 'Analog API calls', }; diff --git a/packages/ng-devtools/src/devframe.ts b/packages/ng-devtools/src/devframe.ts index 1810613..08f8303 100644 --- a/packages/ng-devtools/src/devframe.ts +++ b/packages/ng-devtools/src/devframe.ts @@ -13,6 +13,7 @@ import { injectorMatches, isEnvironmentRequest } from './signal-graph.ts'; import { getProviders } from './rpc/get-providers.ts'; import { getNgrxStore, scanNgrxStore } from './rpc/get-ngrx-store.ts'; import { + dispatchResultText, expireNgrxPages, isNgrxReport, mergeNgrxReport, @@ -20,7 +21,12 @@ import { type NgrxDeclaration, type NgrxPages, } from './rpc/ngrx-tools.ts'; -import type { NgrxState } from './ngrx-shared.ts'; +import { + dispatchProblem, + type NgrxRequest, + type NgrxRequestResult, + type NgrxState, +} from './ngrx-shared.ts'; import type { ComponentDetail, ComponentPage, @@ -29,7 +35,9 @@ import type { LiveComponentNode, SignalChange, SignalGraph, + ZoneMode, } from './types.ts'; +import { ZONE_MODES, zoneModeText } from './zone-mode.ts'; import { deferBlocksText, expireComponentPages, @@ -38,6 +46,7 @@ import { latestComponentPage, otherMatchesText, toComponentPage, + truncationText, } from './rpc/component-tools.ts'; import { explainFormsText, @@ -154,6 +163,7 @@ import pkg from '../package.json' with { type: 'json' }; type PageGraph = SignalGraph & { pageId?: string }; const ENV_WAIT_MS = 1500; +const AGENT_HIGHLIGHT_MS = 2000; const clientAssets: RemoteAssets = { package: pkg.name, @@ -294,6 +304,7 @@ const ngDevtools = defineDevframe({ environment: [] as InjectorTreeNode[], pages: {} as Record, truncated: false, + zone: null as ZoneMode | null, selectedInjectorId: null as string | null, }, }); @@ -307,6 +318,7 @@ const ngDevtools = defineDevframe({ draft.roots = latest?.roots ?? []; draft.environment = latest?.environment ?? []; draft.truncated = latest?.truncated === true; + draft.zone = latest?.zone ?? null; }); const ngrxStoreState = await my.rpc.sharedState('ngrx-store', { @@ -732,22 +744,24 @@ const ngDevtools = defineDevframe({ }, }); + const forgetSignalPages = (ids: string[]) => { + for (const id of ids) signalPages.delete(id); + signalGraphState.mutate((draft) => { + for (const id of ids) delete draft.pages[id]; + const ownerId = draft.graph?.pageId; + if (ownerId && ids.includes(ownerId)) { + const latest = [...signalPages.values()].sort((a, b) => b.reportedAt - a.reportedAt)[0]; + draft.graph = latest?.graph ?? null; + } + }); + }; + const expiry = setInterval(() => { if (visibility.expire()) applyVisibility(); const staleHttp = [...httpPages].filter(([id, p]) => Date.now() - p.reportedAt > liveTtl(id)); if (staleHttp.length) forgetHttpPages(staleHttp.map(([id]) => id)); const stale = [...signalPages].filter(([id, p]) => Date.now() - p.reportedAt > liveTtl(id)); - if (stale.length) { - for (const [id] of stale) signalPages.delete(id); - signalGraphState.mutate((draft) => { - for (const [id] of stale) delete draft.pages[id]; - const ownerId = draft.graph?.pageId; - if (ownerId && stale.some(([id]) => id === ownerId)) { - const latest = [...signalPages.values()].sort((a, b) => b.reportedAt - a.reportedAt)[0]; - draft.graph = latest?.graph ?? null; - } - }); - } + if (stale.length) forgetSignalPages(stale.map(([id]) => id)); if (expireComponentPages(componentPages, Date.now(), liveTtl)) applyComponentPages(); if (expireCdPages(cdPages, Date.now(), liveTtl)) applyCd(); const staleInjectors = [...injectorPages].filter( @@ -793,11 +807,17 @@ const ngDevtools = defineDevframe({ }, }); + const highlightSessions = trackPageSessions(ctx.rpc, (kinds) => { + for (const method of kinds) void my.rpc.broadcast({ method, args: [null], optional: true }); + }); + register({ name: 'request-form-highlight', type: 'action', jsonSerializable: true, handler: (target: { formId: string; path: string } | null) => { + if (target) highlightSessions.bind('highlight-form-field'); + else highlightSessions.unbind('highlight-form-field'); void my.rpc.broadcast({ method: 'highlight-form-field', args: [target], @@ -821,6 +841,8 @@ const ngDevtools = defineDevframe({ : typeof selector === 'string' ? selector : ''; + if (target) highlightSessions.bind('highlight-in-page'); + else highlightSessions.unbind('highlight-in-page'); void my.rpc.broadcast({ method: 'highlight-in-page', args: [target], optional: true }); }, }); @@ -1170,6 +1192,15 @@ const ngDevtools = defineDevframe({ }, }); + register({ + name: 'forget-signal-page', + type: 'action', + jsonSerializable: true, + handler: (pageId: unknown) => { + if (typeof pageId === 'string' && signalPages.has(pageId)) forgetSignalPages([pageId]); + }, + }); + register({ name: 'push-injector-tree', type: 'action', @@ -1180,10 +1211,12 @@ const ngDevtools = defineDevframe({ roots?: unknown; environment?: unknown; truncated?: unknown; + zone?: unknown; } | null, ) => { const pageId = report?.pageId; if (typeof pageId !== 'string' || !pageId || pageId.length >= 50) return; + const zone = ZONE_MODES.find((mode) => mode === report?.zone); injectorPages.set(pageId, { pageId, roots: (Array.isArray(report?.roots) ? report.roots : []) as InjectorTreeNode[], @@ -1191,6 +1224,7 @@ const ngDevtools = defineDevframe({ ? report.environment : []) as InjectorTreeNode[], ...(report?.truncated === true ? { truncated: true } : {}), + ...(zone ? { zone } : {}), reportedAt: Date.now(), }); applyInjectorPages(); @@ -1252,34 +1286,34 @@ const ngDevtools = defineDevframe({ }, }); + const requestNgrxAction = (page: unknown, request: unknown) => + new Promise((resolve) => { + if (!config.actions.ngrx) return resolve({ error: actionBlockedMessage('ngrx') }); + const pageId = typeof page === 'string' ? page : ngrxStateOf(ngrxPages).pages[0]?.pageId; + const requestId = `n${++ngrxSeq}`; + const timer = setTimeout(() => { + pendingNgrx.delete(requestId); + resolve({ error: 'No page answered within 10s. Is the app open in a browser?' }); + }, 10_000); + timer.unref?.(); + pendingNgrx.set(requestId, (result) => { + clearTimeout(timer); + pendingNgrx.delete(requestId); + resolve((result ?? {}) as NgrxRequestResult); + }); + void my.rpc.broadcast({ + method: 'ngrx-action', + args: [{ requestId, pageId, request }], + optional: true, + }); + }); + register({ name: 'request-ngrx-action', type: 'action', jsonSerializable: true, handler: (message: { pageId?: unknown; request?: unknown }) => - new Promise((resolve) => { - if (!config.actions.ngrx) return resolve({ error: actionBlockedMessage('ngrx') }); - const pageId = - typeof message?.pageId === 'string' - ? message.pageId - : ngrxStateOf(ngrxPages).pages[0]?.pageId; - const requestId = `n${++ngrxSeq}`; - const timer = setTimeout(() => { - pendingNgrx.delete(requestId); - resolve({ error: 'No page answered within 10s. Is the app open in a browser?' }); - }, 10_000); - timer.unref?.(); - pendingNgrx.set(requestId, (result) => { - clearTimeout(timer); - pendingNgrx.delete(requestId); - resolve(result); - }); - void my.rpc.broadcast({ - method: 'ngrx-action', - args: [{ requestId, pageId, request: message?.request }], - optional: true, - }); - }), + requestNgrxAction(message?.pageId, message?.request), }); // Agent resources @@ -1287,7 +1321,7 @@ const ngDevtools = defineDevframe({ id: 'ng-devtools:component-tree', name: 'Angular Component Tree', description: - 'Live component instances per connected page, as JSON: `pages[pageId].roots` is a tree with one node per rendered instance (`id` instance id, `name` class name, `tag` host tag, `directives` on the host), `count`, and `detail` (live input values, outputs, other properties, listeners, change detection, encapsulation and injected dependencies) for the selected instance: the one picked in the panel, on the page, or through ng-devtools:highlight or ng-devtools:inspect-component. `detail.properties` lists the other own fields (signals and resources unwrapped). `nodes` repeats the roots of the most recent page. Empty when no page is connected.', + 'Live component instances per connected page, as JSON: `pages[pageId].roots` is a tree with one node per rendered instance (`id` instance id, `name` class name, `tag` host tag, `directives` on the host), `count`, `truncated` and `truncatedBy` (`components` or `depth`, the cap that stopped collection, when the page has more instances than it lists), and `detail` (live input values, outputs, other properties, listeners, change detection, encapsulation and injected dependencies) for the selected instance: the one picked in the panel, on the page, or through ng-devtools:highlight or ng-devtools:inspect-component. `detail.properties` lists the other own fields (signals and resources unwrapped). `nodes` repeats the roots of the most recent page. Empty when no page is connected.', mimeType: 'application/json', read: () => ({ text: JSON.stringify(componentTree.value(), null, 2) }), }); @@ -1305,7 +1339,7 @@ const ngDevtools = defineDevframe({ id: 'ng-devtools:injector-tree', name: 'Angular Injector Tree', description: - 'DI injector hierarchy last reported by a connected page (`pages[pageId]`, `roots` and `environment` are the latest), with providers at each level. `truncated: true` means the page has more element injectors than it reports (the first 2000), so the rest are missing. Empty when no page is connected.', + 'DI injector hierarchy last reported by a connected page (`pages[pageId]`, `roots` and `environment` are the latest), with providers at each level. Element injectors list what their components and directives inject; environment injectors list what the services they already created inject. `zone` is the change detection mode: `zoneless`, `zone` (zone.js) or `zone-unused` (zoneless with zone.js still loaded). `truncated: true` means the page has more element injectors than it reports (the first 2000), so the rest are missing. Empty when no page is connected.', mimeType: 'application/json', read: () => ({ text: JSON.stringify(injectorTreeState.value(), null, 2) }), }); @@ -1314,7 +1348,7 @@ const ngDevtools = defineDevframe({ id: 'ng-devtools:ngrx-store', name: 'NgRx Store State', description: - 'Live NgRx state per connected page: each @ngrx/signals store (state, computed values, methods, the component fields that reference it) and the @ngrx/store state, plus a change log with a per-entry state diff (method calls, patchState writes, dispatched actions and restores). An @ngrx/store action entry has an `origin`: `dispatch` (Store.dispatch, usually a component or service), `effect` (sent by an NgRx effect through Store.next) or `reactive` (Store.dispatch with a function); it is missing for actions sent another way. `classic.paused` is true after a restore jumped Store DevTools to a past state: new actions are logged but do not change the state until the panel goes back to the latest state. Empty when no page is connected.', + 'Live NgRx state per connected page: each @ngrx/signals store (state, computed values, methods, the component fields that reference it) and the @ngrx/store state, plus a change log with a per-entry state diff (method calls, patchState writes, dispatched actions and restores). An @ngrx/store action entry has an `origin`: `dispatch` (Store.dispatch, usually a component or service), `effect` (sent by an NgRx effect through Store.next) or `reactive` (Store.dispatch with a function); it is missing for actions sent another way. `classic.paused` is true after a restore jumped Store DevTools to a past state: new actions are logged but do not change the state until the panel goes back to the latest state. An @ngrx/store entry with `unrestorable` cannot be restored: `dropped` means Store DevTools no longer holds the action (dropped past its `maxAge`, or its history was committed, reset or imported), `not-recorded` means it never recorded it (filtered out, or recording paused). Empty when no page is connected.', mimeType: 'application/json', read: () => ({ text: JSON.stringify(ngrxStoreState.value(), null, 2) }), }); @@ -1401,7 +1435,7 @@ const ngDevtools = defineDevframe({ const shown = typeof target === 'string' ? { selector: target } : target; void my.rpc.broadcast({ method: 'highlight-in-page', - args: [{ ...shown, reveal: true }], + args: [{ ...shown, reveal: true, durationMs: AGENT_HIGHLIGHT_MS }], optional: true, }); void my.rpc.broadcast({ @@ -1411,6 +1445,7 @@ const ngDevtools = defineDevframe({ }); if (hit) selectComponentOnPage(hit.pageId, hit.node.id); const others = otherMatchesText(hits, args.selector); + const cut = hit ? '' : truncationText(pages); const otherPages = [ ...new Set(hits.map((entry) => entry.pageId).filter((id) => id !== hit?.pageId)), ]; @@ -1420,7 +1455,7 @@ const ngDevtools = defineDevframe({ return { markdown: hit ? `Sent a highlight request for \`${hit.node.name}\` (\`<${hit.node.tag}>\`, instance \`${hit.node.id}\` on page \`${hit.pageId}\`) and selected it.${also}${others ? `\n\n${others}` : ''}` - : `Sent a highlight request for \`${args.selector}\`${page ? ` to page \`${page}\`` : ''}. It only shows if the selector matches an element on the page. No component instance matched, so the selection did not change.`, + : `Sent a highlight request for \`${args.selector}\`${page ? ` to page \`${page}\`` : ''}. It only shows if the selector matches an element on the page. No component instance matched, so the selection did not change.${cut ? ` ${cut}` : ''}`, }; }, }); @@ -1453,7 +1488,14 @@ const ngDevtools = defineDevframe({ const [hit] = hits; if (!hit) { return { - markdown: `No component instance matches \`${args.selector}\`. Pass an instance id, class name or host tag from the ng-devtools:component-tree resource.`, + markdown: [ + `No component instance matches \`${args.selector}\`. Pass an instance id, class name or host tag from the ng-devtools:component-tree resource.`, + truncationText( + [...componentPages.values()].filter((entry) => !page || entry.pageId === page), + ), + ] + .filter(Boolean) + .join(' '), }; } selectComponentOnPage(hit.pageId, hit.node.id); @@ -1501,7 +1543,7 @@ const ngDevtools = defineDevframe({ agent.registerTool({ id: 'ng-devtools:change-detection', description: - 'Change detection cycles recorded with Angular\'s profiler (Angular 20+, development build): the slowest components by self time, the most often checked components, and the latest cycles with duration, component checks, sync passes and the output that ran before each one. Recording is off until the panel or this tool starts it; pass `record: "start"`, use the app, then call again without `record`. `stop` keeps the recording, `clear` empties it.', + 'Change detection cycles recorded with Angular\'s profiler (Angular 20+, development build): the slowest components by self time, the most often checked components, and the latest cycles with duration, component checks, sync passes and the output that ran before each one. Recording is off until the panel or this tool starts it; pass `record: "start"`, use the app, then call again without `record`. `stop` keeps the recording, `clear` empties it. The answer starts with the change detection mode the page runs: zoneless, zone.js, or zoneless with zone.js still loaded.', safety: 'read', inputSchema: { type: 'object', @@ -1526,7 +1568,10 @@ const ngDevtools = defineDevframe({ : 'Recording cleared.'; return { markdown: next }; } - return { markdown: changeDetectionText(cdState.value() as CdState, args ?? {}) }; + const text = changeDetectionText(cdState.value() as CdState, args ?? {}); + const injectors = args?.page ? injectorPages.get(args.page) : latestInjectorPage(); + const mode = injectors ? zoneModeText(injectors.zone, injectors.pageId) : ''; + return { markdown: mode ? `${mode}\n\n${text}` : text }; }, }); @@ -1609,7 +1654,7 @@ const ngDevtools = defineDevframe({ agent.registerTool({ id: 'ng-devtools:inspect-providers', description: - 'Get the DI injectors a running page reported. With no arguments, returns the whole tree (element and environment injectors with their providers), cut off at 20,000 characters. `selector` returns only the matching element injectors, each with what it injects and its lookup path resolved to names and provided tokens. `token` returns which injectors provide that token and which components inject it. Each open tab reports its own tree; `page` picks one and defaults to the most recent. Says so when the page reported only part of a large tree.', + 'Get the DI injectors a running page reported. With no arguments, returns the whole tree (element and environment injectors with their providers, and what the services each environment injector already created inject), cut off at 20,000 characters. `selector` returns only the matching element injectors, each with what it injects and its lookup path resolved to names and provided tokens. `token` returns which injectors provide that token and which components or services inject it. Each open tab reports its own tree; `page` picks one and defaults to the most recent. Says so when the page reported only part of a large tree.', safety: 'read', inputSchema: { type: 'object', @@ -1651,7 +1696,7 @@ const ngDevtools = defineDevframe({ agent.registerTool({ id: 'ng-devtools:inspect-route', description: - 'The route the running page is on right now: URL (and the browser URL when it differs), query params, fragment, document title, any navigation in flight, the active route tree (component, params and data with where each value comes from, own or inherited title, guards, resolvers) and the outlet tree with router-bound inputs. Pass `selector` (a component class, element tag or link text) to see the route a component was rendered for, or whether a link counts as active. Secret-looking values are redacted.', + 'The route the running page is on right now: URL (and the browser URL when it differs), query params, fragment, document title, any navigation in flight, the active route tree (component, params and data with where each value comes from, own or inherited title, guards, resolvers) and the outlet tree with router-bound inputs and a preview of the `routerOutletData` each outlet passes (`ROUTER_OUTLET_DATA`). Pass `selector` (a component class, element tag or link text) to see the route a component was rendered for, or whether a link counts as active. Secret-looking values are redacted.', safety: 'read', inputSchema: { type: 'object', @@ -1900,6 +1945,64 @@ const ngDevtools = defineDevframe({ }, }); + agent.registerTool({ + id: 'ng-devtools:dispatch-ngrx-action', + description: + 'Dispatches an action to the @ngrx/store Store of the running app (development only) and returns the resulting action log entry: the action, its origin and the state diff it caused. Pass `type` (for example "[Cart] Add Item") and an optional JSON object `payload` whose keys become the action props, or `seq` to dispatch an action from the log again. get-ngrx-store lists the action types found in source. While a restore keeps Store DevTools on a past state, the action is logged but does not change the state. Needs the NgRx write action (actions.ngrx).', + safety: 'action', + inputSchema: { + type: 'object', + properties: { + page: pageProperty, + type: { type: 'string', description: 'Action type, for example "[Cart] Add Item".' }, + payload: { + type: 'object', + description: 'Action props as a JSON object, for example {"id": 7}. No "type" key.', + }, + seq: { + type: 'integer', + description: 'Log entry number of an action to dispatch again, instead of type.', + }, + }, + }, + handler: async (args: { + page?: string; + type?: unknown; + payload?: unknown; + seq?: unknown; + }) => { + const pages = ngrxStateOf(ngrxPages).pages; + const page = pageArgument(args); + if (page && !ngrxPages.has(page)) { + return { markdown: unknownPageText(page, pages, 'NgRx state') }; + } + const target = page ? ngrxPages.get(page) : pages.find((p) => p.classic); + if (!target?.classic) { + return { + markdown: page + ? `Page \`${page}\` has no @ngrx/store Store, so there is nothing to dispatch to.` + : 'No connected page has an @ngrx/store Store. Open the app in a browser; the Store shows up once provideStore() or StoreModule.forRoot() runs.', + }; + } + let request: NgrxRequest; + if (args.seq !== undefined) { + if (!Number.isInteger(args.seq)) return { markdown: 'seq must be a log entry number.' }; + request = { type: 'dispatch-again', seq: args.seq as number }; + } else { + const problem = dispatchProblem(args.type, args.payload); + if (problem) return { markdown: problem }; + request = { + type: 'dispatch', + action: args.type as string, + ...(args.payload !== undefined + ? { payload: args.payload as Record } + : {}), + }; + } + return { markdown: dispatchResultText(await requestNgrxAction(target.pageId, request)) }; + }, + }); + const noForms = `No forms have been reported. Live data needs a page: connect through the MCP endpoint of the server that runs the app, with the app open in a browser, on a page that renders a form. The stdio server has no page attached and only ever reports this.`; const unknownFormPage = (args: unknown) => { const page = pageArgument(args as Record | undefined); diff --git a/packages/ng-devtools/src/forms-actions.ts b/packages/ng-devtools/src/forms-actions.ts index 3a83f07..15f4493 100644 --- a/packages/ng-devtools/src/forms-actions.ts +++ b/packages/ng-devtools/src/forms-actions.ts @@ -8,7 +8,13 @@ import { type FormsDebugApi, type FoundForm, } from './forms.ts'; -import { isRedactedKey, redactReason } from './forms-privacy.ts'; +import { + REDACT_LABELS, + isRedactedKey, + redactReason, + unmaskHint, + type RedactReason, +} from './forms-privacy.ts'; import { fieldPath, submitSetup } from './forms-read.ts'; import { clip } from './text.ts'; @@ -35,6 +41,7 @@ export const FORM_ACTIONS = [ 'locate', 'instrument', 'pick', + 'cancel-pick', ] as const; export type FormActionName = (typeof FORM_ACTIONS)[number]; @@ -291,12 +298,22 @@ function rawValue(found: FoundForm, node: AnyRecord): unknown { ); } -function lastKey(path: string, found: FoundForm): string { - return path ? path.split('.').pop()! : ''; +function secretOf( + path: string, + element: Element | null, +): { key: string; reason: RedactReason } | null { + const keys = path.split('.'); + for (const [i, key] of keys.entries()) { + const reason = redactReason(key); + if (reason) return { key, reason: i < keys.length - 1 ? 'parent' : reason }; + } + const key = keys.at(-1)!; + const reason = element && redactReason(key, element); + return reason ? { key, reason } : null; } -function isSecretPath(path: string): boolean { - return path.split('.').some((key) => !!redactReason(key)); +function secretRefusal(key: string, reason: RedactReason): string { + return `is redacted (${REDACT_LABELS[reason]}). DevTools never writes secret fields; to write it, ${unmaskHint(reason, key)}`; } function elementFor(ctx: ActionContext, found: FoundForm, path: string): Element | null { @@ -310,10 +327,8 @@ function refusal( path: string, force = false, ): string | null { - const element = elementFor(ctx, found, path); - if (isSecretPath(path) || (element && redactReason(lastKey(path, found), element))) { - return 'looks secret (password, token, card…); DevTools never writes secret fields'; - } + const secret = secretOf(path, elementFor(ctx, found, path)); + if (secret) return secretRefusal(secret.key, secret.reason); if (found.kind === 'signal') { if (read(() => node['hidden'](), false)) return 'is hidden'; if (read(() => node['readonly'](), false)) return 'is readonly'; @@ -487,7 +502,9 @@ function writeValue( const current = rawValue(found, node); const secret = secretInside(value); if (secret) { - return `contains the secret field "${secret}"; DevTools never writes secret fields`; + const key = secret.split('.').pop()!; + const reason = redactReason(key) ?? 'key'; + return `contains the secret field "${secret}" (${REDACT_LABELS[reason]}). DevTools never writes secret fields; to write it, ${unmaskHint(reason, key)}`; } if (current && typeof current === 'object' && !(current instanceof Date)) { const guarded = guardedFields(ctx, found, node, path, force); diff --git a/packages/ng-devtools/src/forms-collector.ts b/packages/ng-devtools/src/forms-collector.ts index 3fe8a67..16e4687 100644 --- a/packages/ng-devtools/src/forms-collector.ts +++ b/packages/ng-devtools/src/forms-collector.ts @@ -498,6 +498,7 @@ export function attachForms( const finish = (result: FormActionResult) => { document.removeEventListener('click', onClick, true); document.removeEventListener('mouseover', onHover, true); + document.removeEventListener('mouseout', onLeave, true); document.removeEventListener('keydown', onKey, true); clearTimeout(timer); highlight.clear(); @@ -507,6 +508,9 @@ export function attachForms( const onHover = (event: Event) => { if (event.target instanceof HTMLElement) highlight.show(event.target); }; + const onLeave = (event: MouseEvent) => { + if (!event.relatedTarget) highlight.clear(); + }; const onClick = (event: Event) => { event.preventDefault(); event.stopPropagation(); @@ -525,6 +529,7 @@ export function attachForms( cancelPick = () => finish(failed('Picking cancelled.')); document.addEventListener('click', onClick, true); document.addEventListener('mouseover', onHover, true); + document.addEventListener('mouseout', onLeave, true); document.addEventListener('keydown', onKey, true); }); } @@ -663,6 +668,11 @@ export function attachForms( void pick(ctx).then(respond); return; } + if (request.action === 'cancel-pick') { + const active = cancelPick; + active?.(); + return respond({ ok: true, message: active ? 'Picking cancelled.' : 'No pick to cancel.' }); + } devtoolsSincePush = true; runFormAction(ctx, request).then( (result) => { diff --git a/packages/ng-devtools/src/forms-privacy.ts b/packages/ng-devtools/src/forms-privacy.ts index fe2aaec..6d803a4 100644 --- a/packages/ng-devtools/src/forms-privacy.ts +++ b/packages/ng-devtools/src/forms-privacy.ts @@ -2,6 +2,23 @@ export const REDACTED = '[redacted]'; export type RedactReason = 'key' | 'input-type' | 'autocomplete' | 'marker' | 'parent' | 'config'; +export const REDACT_LABELS: Record = { + 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', +}; + +/** How to let DevTools write a field redacted for `reason`; `key` is the name that matched. */ +export function unmaskHint(reason: RedactReason, key: string): string { + const byKey = `add "${key}" to unmask on window.__NG_DEVTOOLS_FORMS__ or to redaction.unmask`; + return reason === 'key' || reason === 'parent' || reason === 'config' + ? byKey + : `add data-ng-devtools="unmask" to the field, or ${byKey}`; +} + const SECRET_WORDS = new Set([ 'password', 'passwd', diff --git a/packages/ng-devtools/src/http.ts b/packages/ng-devtools/src/http.ts index 8673692..27f2a5d 100644 --- a/packages/ng-devtools/src/http.ts +++ b/packages/ng-devtools/src/http.ts @@ -38,8 +38,17 @@ export { decodePayload, type PayloadEntry, type PayloadSummary } from './http-pa const MAX_WARNINGS = 50; const PREVIEW_CHARS = 2000; +function mockContentType(responseType = 'json'): string { + if (responseType === 'text') return 'text/plain'; + if (responseType === 'blob' || responseType === 'arraybuffer') return 'application/octet-stream'; + return 'application/json'; +} + export function parseBody(body: string | undefined, responseType = 'json'): unknown { if (responseType === 'text') return body ?? ''; + if (responseType === 'blob') return new Blob([body ?? ''], { type: mockContentType('blob') }); + if (responseType === 'arraybuffer') + return Uint8Array.from(new TextEncoder().encode(body ?? '')).buffer; if (body === undefined || body === '') return null; try { return JSON.parse(body); @@ -208,6 +217,7 @@ export const ngDevtoolsHttpInterceptor: HttpInterceptorFn = (req, next) => { let source: Observable>; if (status !== undefined) { const body = parseBody(rule?.body, req.responseType); + const headers = new HttpHeaders({ 'content-type': mockContentType(req.responseType) }); source = status >= 400 ? throwError( @@ -217,6 +227,7 @@ export const ngDevtoolsHttpInterceptor: HttpInterceptorFn = (req, next) => { statusText: 'Injected by Angular DevTools', url, error: body, + headers, }), ) : of( @@ -225,7 +236,7 @@ export const ngDevtoolsHttpInterceptor: HttpInterceptorFn = (req, next) => { statusText: 'Mocked by Angular DevTools', url, body, - headers: new HttpHeaders({ 'content-type': 'application/json' }), + headers, }), ); } else { @@ -246,7 +257,7 @@ export const ngDevtoolsHttpInterceptor: HttpInterceptorFn = (req, next) => { done({ status: event.status, cacheHit: side === 'client' ? cacheable && (sync || fromPayload) : !mocked && sync, - preview: preview(event.body), + preview: preview(mocked ? rule?.body : event.body), }); } subscriber.next(event); diff --git a/packages/ng-devtools/src/injector-tree.ts b/packages/ng-devtools/src/injector-tree.ts index 41fc8ea..b54ac6d 100644 --- a/packages/ng-devtools/src/injector-tree.ts +++ b/packages/ng-devtools/src/injector-tree.ts @@ -6,6 +6,7 @@ import type { ProviderInfo, } from './types.ts'; import { isComment, parentOf, walkElements } from './dom-walk.ts'; +import { zoneModeOf } from './zone-mode.ts'; interface ProviderRecord { token: unknown; @@ -259,6 +260,67 @@ interface ElementEntry { } export const MAX_INJECTOR_NODES = 2000; +export const MAX_SERVICE_DEPENDENCIES = 500; + +interface InjectorRecord { + factory?: unknown; + value?: unknown; + multi?: unknown; +} + +function ownRecords(injector: unknown): [unknown, InjectorRecord][] { + const records = (injector as { records?: unknown } | null)?.records; + if (!(records instanceof Map)) return []; + return [...records.entries()].filter( + (entry): entry is [unknown, InjectorRecord] => !!entry[1] && typeof entry[1] === 'object', + ); +} + +/** + * Whether the injector already holds an instance for a record. A record still + * waiting to be created holds an empty placeholder object (or one mid-creation), + * and asking Angular for its dependencies would create it. + */ +function isCreated(record: InjectorRecord): boolean { + const { value } = record; + if (value === undefined || value === null) return false; + if (typeof value !== 'object') return true; + return !(Object.getPrototypeOf(value) === Object.prototype && Object.keys(value).length === 0); +} + +const serviceDependencies = new WeakMap>(); + +/** What the services an environment injector already created inject. */ +function environmentDependencies( + ng: DebugNg, + injector: object, + records: RecordReader, +): DependencyInfo[] { + let known = serviceDependencies.get(injector); + if (!known) { + known = new Map(); + serviceDependencies.set(injector, known); + } + const out: DependencyInfo[] = []; + const seen = new Set(); + for (const [token, record] of ownRecords(injector)) { + if (out.length >= MAX_SERVICE_DEPENDENCIES) break; + if (typeof token !== 'function' || typeof record.factory !== 'function') continue; + if (record.multi || !isCreated(record)) continue; + let deps = known.get(token); + if (!deps) { + deps = dependenciesOf(ng, injector, [token], false, records); + known.set(token, deps); + } + for (const dep of deps) { + const key = `${dep.from}|${dep.token}|${dep.flags.join(',')}|${dep.providedBy}`; + if (seen.has(key)) continue; + seen.add(key); + out.push(dep); + } + } + return out.slice(0, MAX_SERVICE_DEPENDENCIES); +} const elementEntries = new WeakMap(); @@ -362,6 +424,7 @@ export function collectInjectorTree( }, providers, children: [], + dependencies: environmentDependencies(ng, injector, records), }, }); }); @@ -403,5 +466,13 @@ export function collectInjectorTree( else environment.push(env.node); } - return truncated ? { roots, environment, truncated } : { roots, environment }; + const report: InjectorTreeReport = truncated + ? { roots, environment, truncated } + : { roots, environment }; + const root = [...envs.keys()].find((injector) => + (injector as { scopes?: Set }).scopes?.has?.('root'), + ); + const zone = root ? zoneModeOf(root) : null; + if (zone) report.zone = zone; + return report; } diff --git a/packages/ng-devtools/src/ngrx-collector.ts b/packages/ng-devtools/src/ngrx-collector.ts index 6689c88..c399a00 100644 --- a/packages/ng-devtools/src/ngrx-collector.ts +++ b/packages/ng-devtools/src/ngrx-collector.ts @@ -3,6 +3,7 @@ import { walkElements } from './dom-walk.ts'; import { className, tokenName } from './injector-tree.ts'; import { diff, + dispatchProblem, referenceDiff, serialize, serializeSlice, @@ -13,6 +14,8 @@ import { type NgrxRequest, type NgrxRequestResult, type NgrxSignalStoreInfo, + type NgrxUnrestorable, + type NgrxUnrestorableUpdate, } from './ngrx-shared.ts'; import { registeredPatchState } from './ngrx-register.ts'; @@ -169,6 +172,8 @@ export interface NgrxCollector { }; logSince(seq: number): NgrxLogEntry[]; lastSeq(): number; + /** Entries that became unrestorable after update number `after`, and the last update number. */ + unrestorableSince(after: number): { updates: NgrxUnrestorableUpdate[]; last: number }; run(request: NgrxRequest): NgrxRequestResult; stop(): void; } @@ -194,12 +199,15 @@ export function createNgrxCollector( let seq = 0; let classic: Classic | null = null; let classicMisses = 0; + let lost: (NgrxUnrestorableUpdate & { at: number })[] = []; + let lostSeq = 0; const append = (entry: Omit, keep: Saved) => { const full = { ...entry, seq: ++seq }; log.push(full); saved.set(full.seq, keep); while (log.length > maxLog) saved.delete(log.shift()!.seq); + if (lost.some((u) => u.seq < log[0].seq)) lost = lost.filter((u) => u.seq >= log[0].seq); onChange(); return full; }; @@ -372,7 +380,12 @@ export function createNgrxCollector( return fromSource !== undefined ? fromSource : syncValue(store); }; - const logClassic = (c: Classic, type: string, action: unknown, withAction: boolean) => { + const logClassic = ( + c: Classic, + type: string, + action: unknown, + withAction: boolean, + ): NgrxLogEntry => { const raw = classicState(c.store); const next = serialize(raw); let changes = diff(c.last, next, MAX_DIFF).map((entry) => ({ @@ -389,7 +402,8 @@ export function createNgrxCollector( withAction && action && typeof action === 'object' ? c.origins.get(action) : undefined; c.last = next; c.lastRaw = raw; - append( + const held = c.devtools ? holds(c.devtools, action) : false; + return append( { source: 'store', storeId: 'store', @@ -402,7 +416,8 @@ export function createNgrxCollector( ...(origin ? { origin } : {}), timestamp: Date.now(), diff: changes, - restorable: !!c.devtools, + restorable: held, + ...(c.devtools && !held ? { unrestorable: 'not-recorded' as const } : {}), }, { kind: 'classic', action }, ); @@ -411,6 +426,37 @@ export function createNgrxCollector( const liftedOf = (devtools: AnyRecord) => syncValue(devtools['liftedState']) as AnyRecord | undefined; + const heldActions = (devtools: AnyRecord): Set => { + const byId = (liftedOf(devtools)?.['actionsById'] ?? {}) as Record; + return new Set(read(() => Object.values(byId).map((lifted) => lifted?.['action']), [])); + }; + + const holds = (devtools: AnyRecord, action: unknown): boolean => { + const lifted = liftedOf(devtools); + const staged = (lifted?.['stagedActionIds'] ?? []) as number[]; + const newest = read( + () => lifted?.['actionsById']?.[staged[staged.length - 1]]?.['action'], + null, + ); + if (action === undefined) return false; + return newest === action || heldActions(devtools).has(action); + }; + + const markDropped = () => { + const devtools = classic?.devtools; + if (!devtools) return; + const open = log.filter((entry) => entry.source === 'store' && entry.restorable); + if (!open.length) return; + const held = heldActions(devtools); + for (const entry of open) { + const keep = saved.get(entry.seq); + if (keep?.kind !== 'classic' || held.has(keep.action)) continue; + entry.restorable = false; + entry.unrestorable = 'dropped'; + lost.push({ seq: entry.seq, reason: 'dropped', at: ++lostSeq }); + } + }; + const isPaused = (devtools: AnyRecord | null) => { if (!devtools) return false; const lifted = liftedOf(devtools); @@ -654,6 +700,7 @@ export function createNgrxCollector( discover(ng); discovered = true; } + markDropped(); return report(); }; @@ -679,8 +726,53 @@ export function createNgrxCollector( return { ok: true, message: 'Back on the latest state. New actions change the state again.' }; }; + const NOT_HELD: Record = { + dropped: + 'Store DevTools no longer holds this action, so it cannot be restored. It was dropped past maxAge, or the Store DevTools history was committed, reset or imported.', + 'not-recorded': + 'Store DevTools never recorded this action, so it cannot be restored. An actionsBlocklist, actionsSafelist or predicate option filtered it out, or recording was paused.', + }; + + const dispatch = (action: Record, label: string): NgrxRequestResult => { + const c = classic; + if (!c) return { error: 'No @ngrx/store Store was found on this page.' }; + const after = seq; + c.store['dispatch'](action); + const entry = log.find( + (e) => e.seq > after && (saved.get(e.seq) as AnyRecord)?.['action'] === action, + ); + const paused = isPaused(c.devtools) ? ` ${PAUSED_NOTE}` : ''; + if (!entry) { + return { + ok: true, + message: `Dispatched ${label}. Its log entry appears once the store handles it.${paused}`, + }; + } + return { ok: true, message: `Dispatched ${label} as #${entry.seq}.${paused}`, entry }; + }; + + const dispatchAgain = (at: unknown): NgrxRequestResult => { + if (typeof at !== 'number') return { error: 'Unknown request.' }; + const entry = log.find((e) => e.seq === at); + const keep = saved.get(at); + if (!entry || !keep) return { error: 'This action is no longer in the page history.' }; + if (keep.kind !== 'classic' || entry.action === undefined) { + return { error: 'Only an @ngrx/store action from the log can be dispatched again.' }; + } + const raw = keep.action; + if (!raw || typeof raw !== 'object') + return { error: 'This action cannot be dispatched again.' }; + return dispatch({ ...(raw as Record) }, `#${at} again`); + }; + const run = (request: NgrxRequest): NgrxRequestResult => { if (request?.type === 'latest') return backToLatest(); + if (request?.type === 'dispatch') { + const problem = dispatchProblem(request.action, request.payload); + if (problem) return { error: problem }; + return dispatch({ ...(request.payload ?? {}), type: request.action }, request.action); + } + if (request?.type === 'dispatch-again') return dispatchAgain(request.seq); if (!request || request.type !== 'restore' || typeof request.seq !== 'number') { return { error: 'Unknown request.' }; } @@ -726,11 +818,22 @@ export function createNgrxCollector( const id = Object.keys(actionsById).find( (key) => actionsById[key]?.['action'] === entry.action, ); - if (id === undefined) return { error: 'Store DevTools no longer holds this action.' }; + const logged = log.find((e) => e.seq === request.seq); + const notHeld = () => { + const reason = logged?.unrestorable ?? 'dropped'; + if (logged && logged.restorable) { + logged.restorable = false; + logged.unrestorable = reason; + lost.push({ seq: logged.seq, reason, at: ++lostSeq }); + onChange(); + } + return { error: NOT_HELD[reason] }; + }; + if (id === undefined) return notHeld(); if (typeof devtools['jumpToAction'] === 'function') devtools['jumpToAction'](Number(id)); else { const index = ((lifted?.['stagedActionIds'] ?? []) as number[]).indexOf(Number(id)); - if (index < 0) return { error: 'Store DevTools no longer holds this action.' }; + if (index < 0) return notHeld(); devtools['jumpToState'](index); } logClassic(c, `Restore #${request.seq}`, entry.action, false); @@ -743,6 +846,10 @@ export function createNgrxCollector( collect, logSince: (after) => log.filter((entry) => entry.seq > after), lastSeq: () => seq, + unrestorableSince: (after) => ({ + updates: lost.filter((u) => u.at > after).map(({ seq, reason }) => ({ seq, reason })), + last: lostSeq, + }), run, stop: () => { classic?.stop(); diff --git a/packages/ng-devtools/src/ngrx-overlay.ts b/packages/ng-devtools/src/ngrx-overlay.ts index e06e149..06a9e48 100644 --- a/packages/ng-devtools/src/ngrx-overlay.ts +++ b/packages/ng-devtools/src/ngrx-overlay.ts @@ -24,6 +24,7 @@ export function attachNgrx( ) { const session = Math.random().toString(36).slice(2, 10); let sentSeq = 0; + let sentLost = 0; let lastBody = ''; let lastPushAt = 0; let timer: ReturnType | undefined; @@ -48,9 +49,11 @@ export function attachNgrx( try { const { stores, classic } = collector.collect(rediscover); const log = collector.logSince(sentSeq); + const lost = collector.unrestorableSince(sentLost); if (!stores.length && !classic && !log.length && !lastBody) return; const body = JSON.stringify({ stores, classic }); - if (!log.length && body === lastBody && Date.now() - lastPushAt < HEARTBEAT_MS) return; + const quiet = !log.length && !lost.updates.length; + if (quiet && body === lastBody && Date.now() - lastPushAt < HEARTBEAT_MS) return; lastBody = body; lastPushAt = Date.now(); const report: NgrxPageReport = { @@ -61,10 +64,12 @@ export function attachNgrx( stores, classic, log, + ...(lost.updates.length ? { unrestorable: lost.updates } : {}), }; const answer = (await my.rpc.call('push-ngrx-state', report)) as { seq?: unknown } | undefined; sentSeq = typeof answer?.seq === 'number' ? answer.seq : collector.lastSeq(); + sentLost = lost.last; } catch { return; } finally { diff --git a/packages/ng-devtools/src/ngrx-shared.ts b/packages/ng-devtools/src/ngrx-shared.ts index 02e42ef..6045c39 100644 --- a/packages/ng-devtools/src/ngrx-shared.ts +++ b/packages/ng-devtools/src/ngrx-shared.ts @@ -31,6 +31,9 @@ export interface NgrxDiffEntry { export type NgrxActionOrigin = 'dispatch' | 'effect' | 'reactive'; +/** Why Store DevTools cannot restore an @ngrx/store entry: it no longer holds the action (dropped past `maxAge`, or the history was committed, reset or imported), or never recorded it. */ +export type NgrxUnrestorable = 'dropped' | 'not-recorded'; + export interface NgrxLogEntry { seq: number; source: 'signal-store' | 'store'; @@ -42,6 +45,12 @@ export interface NgrxLogEntry { timestamp: number; diff: NgrxDiffEntry[]; restorable: boolean; + unrestorable?: NgrxUnrestorable; +} + +export interface NgrxUnrestorableUpdate { + seq: number; + reason: NgrxUnrestorable; } export interface NgrxPageReport { @@ -52,9 +61,11 @@ export interface NgrxPageReport { stores: NgrxSignalStoreInfo[]; classic: NgrxClassicStoreInfo | null; log: NgrxLogEntry[]; + /** Entries sent earlier that Store DevTools can no longer restore. */ + unrestorable?: NgrxUnrestorableUpdate[]; } -export interface NgrxPage extends Omit { +export interface NgrxPage extends Omit { reportedAt: number; /** Older change log entries removed at `limits.changeLog`. */ dropped?: number; @@ -64,15 +75,51 @@ export interface NgrxState { pages: NgrxPage[]; } -export type NgrxRequest = { type: 'restore'; seq: number } | { type: 'latest' }; +export type NgrxRequest = + | { type: 'restore'; seq: number } + | { type: 'latest' } + | { type: 'dispatch'; action: string; payload?: Record } + | { type: 'dispatch-again'; seq: number }; export interface NgrxRequestResult { ok?: boolean; message?: string; error?: string; + entry?: NgrxLogEntry; paused?: boolean; } +export const MAX_ACTION_TYPE = 200; +export const MAX_ACTION_PAYLOAD = 20_000; + +/** Checks an action type and payload sent from the panel or an agent. Returns the problem, or null. */ +export function dispatchProblem(type: unknown, payload: unknown): string | null { + if (typeof type !== 'string' || !type.trim()) + return 'The action type must be a non-empty string.'; + if (type.length > MAX_ACTION_TYPE) { + return `The action type is longer than ${MAX_ACTION_TYPE} characters.`; + } + if (/[\u0000-\u001f\u007f]/.test(type)) return 'The action type has control characters.'; + if (payload === undefined) return null; + if (!payload || typeof payload !== 'object' || Array.isArray(payload)) { + return 'The payload must be a JSON object, like {"id": 7}.'; + } + if (Object.prototype.hasOwnProperty.call(payload, 'type')) { + return 'The payload cannot have a "type" key. Put the action type in the type field.'; + } + let json: string | undefined; + try { + json = JSON.stringify(payload); + } catch { + json = undefined; + } + if (json === undefined) return 'The payload must be plain JSON.'; + if (json.length > MAX_ACTION_PAYLOAD) { + return `The payload is larger than ${MAX_ACTION_PAYLOAD} characters of JSON.`; + } + return null; +} + export interface SerializeOptions { depth?: number; maxKeys?: number; diff --git a/packages/ng-devtools/src/overlay.ts b/packages/ng-devtools/src/overlay.ts index 3252e59..90e3eb6 100644 --- a/packages/ng-devtools/src/overlay.ts +++ b/packages/ng-devtools/src/overlay.ts @@ -236,10 +236,9 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void) Date.now, (value, name) => graphValue(name, value), ); - const restoreSignalHook = on.signals - ? await installSignalWriteHook(signalHistory.onWrite) - : () => {}; - if (!own(restoreSignalHook)) return; + const restoreSignalHook = on.signals ? await installSignalWriteHook(signalHistory.onWrite) : null; + if (!own(restoreSignalHook ?? (() => {}))) return; + const writeHookMissing = on.signals && !restoreSignalHook; let signalTarget: SignalTarget = null; let lastSignalKey = ''; @@ -277,6 +276,7 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void) } const answer = (await my.rpc.call('push-signal-graph', { ...graph, + ...(writeHookMissing ? { writeHook: false as const } : {}), pageId, ...(full ? { history } : { historyDelta: history }), })) as { delta?: boolean } | undefined; @@ -502,21 +502,32 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void) jsonSerializable: true, handler: ( selector: - string | { pageId?: string; id?: string; selector?: string; reveal?: boolean } | null, + | string + | { + pageId?: string; + id?: string; + selector?: string; + reveal?: boolean; + durationMs?: number; + } + | null, ) => { clearHighlight(); if (selector && typeof selector === 'object') { if (selector.pageId && selector.pageId !== pageId) return; - const reveal = selector.reveal === true; + const options = { + reveal: selector.reveal === true, + ...(typeof selector.durationMs === 'number' ? { durationMs: selector.durationMs } : {}), + }; if (typeof selector.id === 'string') { const host = elementById(selector.id); - if (host instanceof Element) showHighlight(host, { reveal }); + if (host instanceof Element) showHighlight(host, options); return; } - if (typeof selector.selector === 'string') highlightSelector(selector.selector, reveal); + if (typeof selector.selector === 'string') highlightSelector(selector.selector, options); return; } - if (typeof selector === 'string') highlightSelector(selector, false); + if (typeof selector === 'string') highlightSelector(selector, {}); }, }); @@ -614,6 +625,9 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void) forget('router', 'forget-router-page'); forget('pipes', 'forget-pipes-page'); forget('components', 'forget-component-page'); + lastSignalKey = ''; + historyDelta = false; + forget('signals', 'forget-signal-page'); cd?.leave(); lastInjectorJson = ''; forget('injectors', 'forget-injector-page'); @@ -653,7 +667,7 @@ async function startOverlay(options: OverlayOptions, own: (cleanup: () => void) }); } -function highlightSelector(selector: string, reveal: boolean) { +function highlightSelector(selector: string, options: { reveal?: boolean; durationMs?: number }) { if (!selector) return; // The selector comes from an agent, so it may not be valid CSS. let el: Element | null = null; @@ -662,7 +676,7 @@ function highlightSelector(selector: string, reveal: boolean) { } catch { return; } - if (el) showHighlight(el, { reveal }); + if (el) showHighlight(el, options); } function findAngularElements(): Element[] { @@ -681,14 +695,15 @@ export async function installSignalWriteHook( onWrite: (node: RawSignalNode) => void, load: () => Promise<{ setPostSignalSetFn: (fn: SignalSetHook) => SignalSetHook }> = () => import('@angular/core/primitives/signals') as never, -): Promise<() => void> { +): Promise<(() => void) | null> { let setHook: (fn: SignalSetHook) => SignalSetHook; try { ({ setPostSignalSetFn: setHook } = await load()); } catch { // Without the hook, history falls back to poll samples only. - return () => {}; + return null; } + if (typeof setHook !== 'function') return null; let prev: SignalSetHook = null; let active = true; const hook = (node: RawSignalNode) => { diff --git a/packages/ng-devtools/src/page-highlight.ts b/packages/ng-devtools/src/page-highlight.ts index a204f8b..fd0256f 100644 --- a/packages/ng-devtools/src/page-highlight.ts +++ b/packages/ng-devtools/src/page-highlight.ts @@ -4,6 +4,9 @@ let highlightEl: HTMLElement | null = null; let highlightTimer: ReturnType | undefined; let highlightFrame = 0; +/** How long a box stays when nothing clears it, such as a lost clear from the panel. */ +export const HIGHLIGHT_SAFETY_MS = 60_000; + interface Box { top: number; left: number; @@ -38,11 +41,14 @@ export function highlightBox(el: Element): Box | null { } /** - * Draws the box over `el` for two seconds and returns whether anything was - * drawn. `reveal` scrolls it into view first, for an explicit request rather - * than a hover. + * Draws the box over `el` until `clearHighlight()` or `durationMs` (default + * `HIGHLIGHT_SAFETY_MS`), and returns whether anything was drawn. `reveal` + * scrolls it into view first, for an explicit request rather than a hover. */ -export function showHighlight(el: Element, options: { reveal?: boolean } = {}): boolean { +export function showHighlight( + el: Element, + options: { reveal?: boolean; durationMs?: number } = {}, +): boolean { clearHighlight(); const first = highlightBox(el); if (!first) return false; @@ -92,7 +98,13 @@ export function showHighlight(el: Element, options: { reveal?: boolean } = {}): highlightFrame = requestAnimationFrame(follow); }; follow(); - highlightTimer = setTimeout(clearHighlight, 2000); + const duration = options.durationMs; + highlightTimer = setTimeout( + clearHighlight, + typeof duration === 'number' && duration > 0 + ? Math.min(duration, HIGHLIGHT_SAFETY_MS) + : HIGHLIGHT_SAFETY_MS, + ); return true; } diff --git a/packages/ng-devtools/src/router-links.ts b/packages/ng-devtools/src/router-links.ts index f129d27..9c14592 100644 --- a/packages/ng-devtools/src/router-links.ts +++ b/packages/ng-devtools/src/router-links.ts @@ -8,6 +8,7 @@ import { type RouterDebugApi, } from './router.ts'; import { elementId } from './element-id.ts'; +import { serialize } from './serialize.ts'; export interface OutletInfo { outlet: string; @@ -18,6 +19,7 @@ export interface OutletInfo { activated: boolean; detached?: boolean; inputs?: { input: string; source: string }[]; + data?: string; children?: OutletInfo[]; } @@ -34,6 +36,17 @@ export interface LinkInfo { const MAX_OUTLETS = 100; const MAX_LINKS = 100; +const MAX_DATA_PREVIEW = 300; + +function outletData(outlet: AnyRecord | null): string | undefined { + const value = read(() => { + const data = outlet?.['routerOutletData']; + return typeof data === 'function' ? (data as () => unknown)() : undefined; + }, undefined); + if (value === undefined) return undefined; + const preview = serialize(value, { depth: 3, keys: 20, items: 20, text: 200, budget: 200 }); + return clip(JSON.stringify(preview) ?? String(preview), MAX_DATA_PREVIEW); +} function elementOf(outlet: AnyRecord | null): Element | null { return read( @@ -91,6 +104,8 @@ export function outletsOf(router: AnyRecord): OutletInfo[] { if (inputs) info.inputs = inputs; } } + const data = outletData(outlet); + if (data !== undefined) info.data = data; if (read(() => !!context['attachRef'], false)) info.detached = true; const children = visit( read(() => context['children'] as AnyRecord, null), diff --git a/packages/ng-devtools/src/rpc/__tests__/get-ngrx-store.test.ts b/packages/ng-devtools/src/rpc/__tests__/get-ngrx-store.test.ts index 9e0dc2a..39fccac 100644 --- a/packages/ng-devtools/src/rpc/__tests__/get-ngrx-store.test.ts +++ b/packages/ng-devtools/src/rpc/__tests__/get-ngrx-store.test.ts @@ -51,6 +51,58 @@ describe('get-ngrx-store', () => { }); }); +describe('get-ngrx-store action types', () => { + it('reads the type strings of createAction and createActionGroup', async () => { + const entries = await storeFor( + [ + "import { createAction, createActionGroup, emptyProps, props } from '@ngrx/store';", + "export const addItem = createAction('[Cart] Add Item', props<{ id: number }>());", + 'export const clear = createAction(`[Cart] Clear`);', + 'export const dynamic = createAction(`[${source}] Dynamic`);', + 'export const CartActions = createActionGroup({', + " source: 'Cart Page',", + ' events: {', + " 'Remove Item': props<{ id: number }>(),", + ' opened: emptyProps(),', + ' },', + '});', + ].join('\n'), + ); + const actions = entries.filter((e) => e.kind === 'action'); + expect(actions.map((e) => [e.name, e.types, e.detail])).toEqual([ + ['addItem', ['[Cart] Add Item'], '[Cart] Add Item'], + ['clear', ['[Cart] Clear'], '[Cart] Clear'], + ['dynamic', undefined, undefined], + [ + 'CartActions', + ['[Cart Page] Remove Item', '[Cart Page] opened'], + '[Cart Page] Remove Item, [Cart Page] opened', + ], + ]); + }); + + it('unescapes the quotes and backslashes in an action type', async () => { + const entries = await storeFor( + [ + 'export const add = createAction("[Cart] Don\'t \\"Add\\"");', + "export const profile = createAction('[Auth] User\\'s Profile');", + 'export const path = createAction(`[Files] C:\\\\tmp \\u0041`);', + 'export const Group = createActionGroup({', + " source: 'Team\\'s',", + " events: { 'It\\'s Open': emptyProps() },", + '});', + ].join('\n'), + ); + const actions = entries.filter((e) => e.kind === 'action'); + expect(actions.map((e) => e.types)).toEqual([ + ['[Cart] Don\'t "Add"'], + ["[Auth] User's Profile"], + ['[Files] C:\\tmp A'], + ["[Team's] It's Open"], + ]); + }); +}); + describe('get-ngrx-store members', () => { it('lists the members of a signal store', async () => { const entries = await storeFor( diff --git a/packages/ng-devtools/src/rpc/__tests__/pipe-explain.test.ts b/packages/ng-devtools/src/rpc/__tests__/pipe-explain.test.ts new file mode 100644 index 0000000..f05e631 --- /dev/null +++ b/packages/ng-devtools/src/rpc/__tests__/pipe-explain.test.ts @@ -0,0 +1,43 @@ +import { mkdirSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { fixtureDir } from './fixture-dir.ts'; +import { describe, expect, it } from 'vitest'; +import { explainPipeText } from '../pipe-explain.ts'; +import type { PipesState } from '../pipes-tools.ts'; + +function fixture(): string { + const dir = fixtureDir('ng-devtools-pipe-explain-'); + mkdirSync(join(dir, 'src')); + writeFileSync( + join(dir, 'src', 'app.ts'), + ` + @Pipe({ name: 'appPrice' }) + export class PricePipe implements PipeTransform { + transform(value: number) { return value; } + } + `, + ); + return dir; +} + +function state(instrumented: string[]): PipesState { + return { pipes: [], async: [], reportedAt: 0, instrumented }; +} + +describe('explainPipeText', () => { + it('names the Record calls button when recording is off', () => { + const text = explainPipeText('appPrice', fixture(), state([])); + expect(text).toContain('`PricePipe`'); + expect(text).toContain('**Live:** unknown, recording is off.'); + expect(text).toContain('Click **Record calls** in the Pipes panel'); + const live = text.split('\n').find((line) => line.startsWith('**Live:**')); + expect(live).not.toContain('Instrument'); + expect(live).not.toContain('—'); + }); + + it('says the pipe was not seen when recording is on', () => { + const text = explainPipeText('appPrice', fixture(), state(['page-1'])); + expect(text).toContain('**Live:** not seen on the currently connected page.'); + expect(text).not.toContain('Record calls'); + }); +}); diff --git a/packages/ng-devtools/src/rpc/component-tools.ts b/packages/ng-devtools/src/rpc/component-tools.ts index 5edce60..dd7a60b 100644 --- a/packages/ng-devtools/src/rpc/component-tools.ts +++ b/packages/ng-devtools/src/rpc/component-tools.ts @@ -25,12 +25,38 @@ export function toComponentPage(report: Omit, now = reportedAt: now, }; if (report.truncated) page.truncated = true; + const cap = (value: unknown) => + typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined; + const components = cap(report.truncatedBy?.components); + const depth = cap(report.truncatedBy?.depth); + if (report.truncated && (components || depth)) { + page.truncatedBy = { + ...(components ? { components } : {}), + ...(depth ? { depth } : {}), + }; + } if (typeof report.url === 'string') page.url = redactUrl(report.url.slice(0, 2000)); if (typeof report.title === 'string') page.title = redactMessage(report.title.slice(0, 200)); if (Array.isArray(report.deferBlocks)) page.deferBlocks = report.deferBlocks.slice(0, 500); return page; } +export function truncationText(pages: Iterable): string { + const notes: string[] = []; + for (const page of pages) { + if (!page.truncated) continue; + const by = page.truncatedBy ?? {}; + const caps = [ + ...(by.components ? [`the first ${by.components} component instances`] : []), + ...(by.depth ? [`${by.depth} levels of DOM nesting`] : []), + ]; + notes.push( + `The tree of page \`${page.pageId}\` stops at ${caps.length ? caps.join(' and ') : 'its size limit'}, so instances past it are not listed or searchable.`, + ); + } + return notes.join(' '); +} + export function latestComponentPage(pages: Iterable): ComponentPage | undefined { let latest: ComponentPage | undefined; for (const page of pages) { diff --git a/packages/ng-devtools/src/rpc/forms-explain.ts b/packages/ng-devtools/src/rpc/forms-explain.ts index 166950f..fa6062d 100644 --- a/packages/ng-devtools/src/rpc/forms-explain.ts +++ b/packages/ng-devtools/src/rpc/forms-explain.ts @@ -5,6 +5,7 @@ import { type FormEvent, type FormFieldNode, } from '../forms.ts'; +import { REDACT_LABELS } from '../forms-privacy.ts'; import { lintForm, lintSetupErrors, type FormLintFinding } from './forms-lint.ts'; import { UNTRUSTED, @@ -115,7 +116,7 @@ export function explainFieldText( const lines = [`${where} in ${code(form.label)} (${form.kind}, ${form.id}): ${flags(node)}.`]; if (node.type === 'control') { lines.push( - `Value: ${detailOf(node.value)}${node.redacted ? ` (redacted: ${node.redacted})` : ''}.`, + `Value: ${detailOf(node.value)}${node.redacted ? ` (redacted: ${REDACT_LABELS[node.redacted] ?? node.redacted})` : ''}.`, ); } if (node.uncommitted !== undefined) { diff --git a/packages/ng-devtools/src/rpc/get-ngrx-store.ts b/packages/ng-devtools/src/rpc/get-ngrx-store.ts index cf6c457..54dcbe3 100644 --- a/packages/ng-devtools/src/rpc/get-ngrx-store.ts +++ b/packages/ng-devtools/src/rpc/get-ngrx-store.ts @@ -29,6 +29,7 @@ const NgrxStoreEntrySchema = v.object({ file: v.string(), line: v.number(), detail: v.optional(v.string()), + types: v.optional(v.array(v.string())), members: v.optional( v.object({ state: v.optional(v.array(v.string())), @@ -51,7 +52,7 @@ export const getNgrxStore = defineRpcFunction({ returns: describable(v.array(NgrxStoreEntrySchema)), agent: { description: - 'Scan source files for NgRx declarations: @ngrx/store actions, reducers, effects, selectors, features and store setup, and @ngrx/signals signalStore, signalState and signalMethod. Each entry has name, kind, file and line. A signalStore entry also lists its members (withState keys, withComputed, withMethods, withProps, withHooks, withEntities and rxMethod names) in `members` and `detail`. Read the ng-devtools:ngrx-store resource for the live state and change log.', + 'Scan source files for NgRx declarations: @ngrx/store actions, reducers, effects, selectors, features and store setup, and @ngrx/signals signalStore, signalState and signalMethod. Each entry has name, kind, file and line. An action entry lists the action type strings of its createAction or createActionGroup call in `types` (for example "[Cart] Add Item"), when they are string literals. A signalStore entry also lists its members (withState keys, withComputed, withMethods, withProps, withHooks, withEntities and rxMethod names) in `members` and `detail`. Read the ng-devtools:ngrx-store resource for the live state and change log.', title: 'List NgRx store entries from source', }, setup: (ctx) => ({ @@ -74,6 +75,8 @@ interface NgrxStoreEntry { file: string; line: number; detail?: string; + /** Action type strings, for an `action` entry whose types are string literals. */ + types?: string[]; members?: SignalStoreMembers; } @@ -182,6 +185,16 @@ function scanFile(full: string, cwd: string, out: NgrxStoreEntry[]) { : name; const entry: NgrxStoreEntry = { name: displayName, kind, file: relPath, line: lineNum }; + if (kind === 'action') { + const open = match.index + match[0].length - 1; + const types = match[0].includes('createActionGroup') + ? actionGroupTypes(content, raw, open) + : [stringAt(content, raw, open + 1)].filter((t): t is string => !!t); + if (types.length) { + entry.types = types; + entry.detail = types.join(', '); + } + } if (kind === 'signal-store') { const open = content.indexOf('(', match.index + match[0].length - 1); const members = signalStoreMembers(content, raw, open); @@ -224,6 +237,69 @@ function splitTop(text: string): { text: string; start: number }[] { return parts; } +function skipSpace(content: string, at: number): number { + while (at < content.length && /\s/.test(content[at])) at++; + return at; +} + +function stringAt(content: string, raw: string, at: number): string | undefined { + const start = skipSpace(content, at); + const quote = content[start]; + if (quote !== "'" && quote !== '"' && quote !== '`') return undefined; + const end = content.indexOf(quote, start + 1); + if (end < 0) return undefined; + const text = raw.slice(start + 1, end); + return quote === '`' && text.includes('${') ? undefined : unescapeLiteral(text); +} + +const ESCAPES: Record = { + n: '\n', + r: '\r', + t: '\t', + b: '\b', + f: '\f', + v: '\v', + 0: '\0', +}; + +function unescapeLiteral(text: string): string { + return text.replace( + /\\(?:u\{([0-9a-fA-F]+)\}|u([0-9a-fA-F]{4})|x([0-9a-fA-F]{2})|(\r\n|[\s\S]))/g, + (_, braced: string, hex4: string, hex2: string, ch: string) => { + const code = braced ?? hex4 ?? hex2; + if (code) return String.fromCodePoint(parseInt(code, 16)); + if (ch === '\n' || ch === '\r' || ch === '\r\n' || ch === '\u2028' || ch === '\u2029') + return ''; + return ESCAPES[ch] ?? ch; + }, + ); +} + +function actionGroupTypes(content: string, raw: string, open: number): string[] { + const at = skipSpace(content, open + 1); + if (content[at] !== '{') return []; + const close = matchDelimiter(content, at, '{', '}'); + let source: string | undefined; + let events = -1; + for (const part of splitTop(content.slice(at + 1, close))) { + const key = /^\s*(source|events)\s*:\s*/.exec(part.text); + if (!key) continue; + const value = at + 1 + part.start + key[0].length; + if (key[1] === 'source') source = stringAt(content, raw, value); + else if (content[value] === '{') events = value; + } + if (!source || events < 0) return []; + const end = matchDelimiter(content, events, '{', '}'); + const types: string[] = []; + for (const part of splitTop(content.slice(events + 1, end))) { + const name = + stringAt(content, raw, events + 1 + part.start) ?? + /^\s*([A-Za-z_$][\w$]*)\s*:/.exec(part.text)?.[1]; + if (name) types.push(`[${source}] ${name}`); + } + return types; +} + function objectKeys(content: string, open: number): { key: string; value: string }[] { const close = matchDelimiter(content, open, '{', '}'); const keys: { key: string; value: string }[] = []; diff --git a/packages/ng-devtools/src/rpc/injector-tools.ts b/packages/ng-devtools/src/rpc/injector-tools.ts index 6ded900..bef5961 100644 --- a/packages/ng-devtools/src/rpc/injector-tools.ts +++ b/packages/ng-devtools/src/rpc/injector-tools.ts @@ -1,5 +1,6 @@ import { MAX_INJECTOR_NODES, NULL_INJECTOR_ID } from '../injector-tree.ts'; import type { InjectorPage, InjectorTreeNode } from '../types.ts'; +import { zoneModeText } from '../zone-mode.ts'; export const MAX_TOOL_CHARS = 20_000; @@ -64,8 +65,9 @@ export function inspectProvidersText( const token = args.token?.trim(); if (!selector && !token) { + const zone = zoneModeText(page.zone, pageId); return capped( - `This is the injector tree for the whole page \`${pageId}\`. Element injectors list what each component and directive injected and which injector supplied it (\`providedBy\` is an injector id). Environment injectors run from the platform down to the root and any route injectors. To look at one component or one token, ${NARROW}.${notes}\n\nElement injectors:\n\n${JSON.stringify(roots)}\n\nEnvironment injectors:\n\n${JSON.stringify(environment)}`, + `This is the injector tree for the whole page \`${pageId}\`. Element injectors list what each component and directive injected and which injector supplied it (\`providedBy\` is an injector id). Environment injectors run from the platform down to the root and any route injectors; their \`dependencies\` list what the services they already created inject (\`from\` is the service). To look at one component or one token, ${NARROW}.${zone ? ` ${zone}` : ''}${notes}\n\nElement injectors:\n\n${JSON.stringify(roots)}\n\nEnvironment injectors:\n\n${JSON.stringify(environment)}`, ); } @@ -109,7 +111,7 @@ export function inspectProvidersText( provider, })), ); - const injectedBy = matched.flatMap((node) => + const injectedBy = (selector ? matched : all).flatMap((node) => (node.dependencies ?? []) .filter((dep) => dep.token.toLowerCase() === want) .map((dep) => ({ diff --git a/packages/ng-devtools/src/rpc/ngrx-tools.ts b/packages/ng-devtools/src/rpc/ngrx-tools.ts index 0216404..34077e8 100644 --- a/packages/ng-devtools/src/rpc/ngrx-tools.ts +++ b/packages/ng-devtools/src/rpc/ngrx-tools.ts @@ -2,14 +2,17 @@ import type { NgrxLogEntry, NgrxPage, NgrxPageReport, + NgrxRequestResult, NgrxSignalStoreInfo, NgrxState, + NgrxUnrestorable, } from '../ngrx-shared.ts'; import type { SignalStoreMembers } from './get-ngrx-store.ts'; import { PAGE_TTL_MS, fixedTtl, type PageTtl } from './page-ttl.ts'; export const NGRX_PAGE_EXPIRES_MS = PAGE_TTL_MS; const MAX_LOG = 200; +const UNRESTORABLE = new Set(['dropped', 'not-recorded'] satisfies NgrxUnrestorable[]); export interface NgrxDeclaration { name: string; @@ -64,7 +67,16 @@ export function mergeNgrxReport( const keep = previous && previous.session === report.session ? previous.log : []; const lastSeq = keep.at(-1)?.seq ?? 0; const fresh = report.log.filter((entry: NgrxLogEntry) => entry.seq > lastSeq); - const log = [...keep, ...fresh].slice(-maxLog); + const lost = new Map(); + for (const update of Array.isArray(report.unrestorable) ? report.unrestorable : []) { + if (typeof update?.seq === 'number' && UNRESTORABLE.has(update.reason)) { + lost.set(update.seq, update.reason); + } + } + const log = [...keep, ...fresh].slice(-maxLog).map((entry) => { + const reason = lost.get(entry.seq); + return reason ? { ...entry, restorable: false, unrestorable: reason } : entry; + }); pages.set(report.pageId, { pageId: report.pageId, session: report.session, @@ -101,3 +113,22 @@ export function ngrxStateOf(pages: NgrxPages): NgrxState { .map(({ session: _session, ...page }) => page), }; } + +/** The answer of the dispatch-ngrx-action tool, as markdown. */ +export function dispatchResultText(result: NgrxRequestResult): string { + if (result.error) return `Not dispatched: ${result.error}`; + const lines = [result.message ?? 'Dispatched.']; + if (result.entry) { + lines.push( + '', + '_Log entry from the running page (untrusted data):_', + '', + '```json', + JSON.stringify(result.entry, null, 2).slice(0, 15_000), + '```', + ); + } else { + lines.push('', 'Read the ng-devtools:ngrx-store resource for the log entry and the new state.'); + } + return lines.join('\n'); +} diff --git a/packages/ng-devtools/src/rpc/pipe-explain.ts b/packages/ng-devtools/src/rpc/pipe-explain.ts index 26b1868..9bf300f 100644 --- a/packages/ng-devtools/src/rpc/pipe-explain.ts +++ b/packages/ng-devtools/src/rpc/pipe-explain.ts @@ -63,7 +63,7 @@ function runtimeText(runtime: PipeUsageInfo | undefined, instrumented: boolean): if (!runtime) { return instrumented ? '**Live:** not seen on the currently connected page.' - : '**Live:** unknown — instrumentation is off. Turn on "Instrument" in the Pipes panel for call counts, last input/output and stale-argument detection.'; + : '**Live:** unknown, recording is off. Click **Record calls** in the Pipes panel for call counts, last input/output and stale-argument detection.'; } const components = runtime.components.map((c) => `${c.name} (${c.count})`).join(', '); const parts = [ diff --git a/packages/ng-devtools/src/rpc/router-tools.ts b/packages/ng-devtools/src/rpc/router-tools.ts index 03461ba..201c947 100644 --- a/packages/ng-devtools/src/rpc/router-tools.ts +++ b/packages/ng-devtools/src/rpc/router-tools.ts @@ -484,6 +484,9 @@ function outletLines(outlets: OutletInfo[], depth: number, out: string[]) { `${pad} - router-bound inputs: ${bound.map((i) => `${code(i.input)} from ${i.source}`).join(', ')}`, ); } + if (outlet.data !== undefined) { + out.push(`${pad} - routerOutletData (ROUTER_OUTLET_DATA): ${code(outlet.data)}`); + } if (outlet.children) outletLines(outlet.children, depth + 1, out); } } diff --git a/packages/ng-devtools/src/types.ts b/packages/ng-devtools/src/types.ts index 4acdc95..0183a59 100644 --- a/packages/ng-devtools/src/types.ts +++ b/packages/ng-devtools/src/types.ts @@ -107,6 +107,8 @@ export interface SignalGraph { nodeCount?: number; /** True when the Angular version reports nodes without ids (before 20.1). */ unsupported?: boolean; + /** False when the signal write hook did not load, so history holds samples only. */ + writeHook?: false; source?: 'selected' | 'routed' | 'root'; pageId?: string; /** Recent value changes, keyed by node or resource id, oldest first. */ @@ -171,6 +173,8 @@ export interface ComponentTreeReport { roots: LiveComponentNode[]; count: number; truncated?: boolean; + /** The caps that stopped collection: `components` instances, or `depth` DOM levels. */ + truncatedBy?: { components?: number; depth?: number }; detail: ComponentDetail | null; /** Missing when the page's Angular exposes no defer block util. */ deferBlocks?: DeferBlockInfo[]; @@ -214,10 +218,14 @@ export interface InjectorTreeNode { dependencies?: DependencyInfo[]; } +/** `zone-unused`: zoneless, with zone.js still loaded on the page. */ +export type ZoneMode = 'zoneless' | 'zone' | 'zone-unused'; + export interface InjectorTreeReport { roots: InjectorTreeNode[]; environment: InjectorTreeNode[]; truncated?: boolean; + zone?: ZoneMode; } export interface InjectorPage extends InjectorTreeReport { diff --git a/packages/ng-devtools/src/zone-mode.ts b/packages/ng-devtools/src/zone-mode.ts new file mode 100644 index 0000000..198ff65 --- /dev/null +++ b/packages/ng-devtools/src/zone-mode.ts @@ -0,0 +1,44 @@ +import type { ZoneMode } from './types.ts'; + +/** + * How the app runs change detection, read from the `NgZone` its root injector + * created: `NoopNgZone` when zoneless, a real `NgZone` (with an `_inner` zone) + * after `provideZoneChangeDetection`. `null` when there is none yet. + */ +export function zoneModeOf( + rootInjector: unknown, + global: { Zone?: unknown } = globalThis as { Zone?: unknown }, +): ZoneMode | null { + const records = (rootInjector as { records?: unknown } | null)?.records; + if (!(records instanceof Map)) return null; + for (const [token, record] of records) { + if (typeof token !== 'function' || token.name.replace(/^_(?=[A-Z])/, '') !== 'NgZone') continue; + const zone = (record as { value?: unknown } | null)?.value; + if ( + !zone || + typeof zone !== 'object' || + typeof (zone as { run?: unknown }).run !== 'function' + ) { + return null; + } + if ('_inner' in zone) return 'zone'; + return typeof global.Zone === 'undefined' ? 'zoneless' : 'zone-unused'; + } + return null; +} + +export const ZONE_MODES: readonly ZoneMode[] = ['zoneless', 'zone', 'zone-unused']; + +export function zoneModeText(mode: ZoneMode | null | undefined, pageId: string): string { + const page = `Page \`${pageId}\``; + switch (mode) { + case 'zoneless': + return `${page} runs zoneless change detection, and zone.js is not loaded.`; + case 'zone': + return `${page} runs change detection with zone.js (\`provideZoneChangeDetection\`).`; + case 'zone-unused': + return `${page} runs zoneless change detection, but zone.js is still loaded. Angular does not use it, so it can likely come out of the polyfills.`; + default: + return ''; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 438ddcd..6dc2230 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,6 +368,9 @@ importers: '@angular/core': specifier: ^22.1.0 version: 22.1.7(@angular/compiler@22.1.7)(rxjs@7.8.2)(zone.js@0.16.3) + hono: + specifier: 4.13.8 + version: 4.13.8 rxjs: specifier: ~7.8.0 version: 7.8.2