{"version":3,"file":"ngx-t-forms-api-endpoint-config.component-CZm3Z_7B.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-endpoint-config/api-endpoint-config-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-endpoint-config/api-endpoint-config-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-endpoint-config/api-endpoint-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-endpoint-config/api-endpoint-config.component.html"],"sourcesContent":["import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ViewEncapsulation,\n  computed,\n  inject,\n  linkedSignal,\n  signal,\n} from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { take } from 'rxjs';\nimport type { Observable } from 'rxjs';\n\nimport type {\n  APIDataFetchingConfigurationInterface,\n  FormColumnInputs,\n  HeaderTemplate,\n  IPostmanCollectionConfig,\n  MinimumInputRequiredInterface,\n  PayloadTemplate,\n  QueryTemplate,\n  RequestBodyMode,\n  TreeNode,\n} from 'ngx-t-forms-types';\n\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { ApiValueAccessRulesComponent } from '../api-value-access-rules/api-value-access-rules.component';\nimport { HeaderTemplateEditorComponent } from '../header-template-editor/header-template-editor.component';\nimport { PayloadTemplateEditorComponent } from '../payload-template-editor/payload-template-editor.component';\nimport { RequiredInputsComponent } from '../required-inputs/required-inputs.component';\nimport { RestApiCallSetupComponent } from '../rest-api-call-setup/rest-api-call-setup.component';\nimport {\n  bodyModeOf,\n  dependencyLabels,\n  deriveConfiguredRequest,\n  headerCountOf,\n  methodColorOf,\n  minInputsOf,\n  paramCountOf,\n  payloadDefaultOf,\n  readinessOf,\n  sendsBody,\n  waitsForLabels,\n} from './api-endpoint-config.logic';\n\n/**\n * Everything the editor dialog needs from its opener. Signals keep the dialog\n * live against the host's state (autoSave merges the parent hands back flow\n * straight into the open dialog), and the callbacks keep the HOST the single\n * owner of every mutation — the dialog itself never patches the config.\n */\nexport interface ApiEndpointDialogContext {\n  /** Which slot is being configured — copy only; behaviour is identical. */\n  kind: 'value' | 'options';\n  /** The live fetch-slot configuration. */\n  config: Signal<APIDataFetchingConfigurationInterface | undefined>;\n  /** All form inputs, offered as bindings by the hosted editors. */\n  formInputs: Signal<readonly FormColumnInputs[]>;\n  /** Postman collection behind the endpoint picker + response mapping. */\n  postmanCollectionConfig: Signal<IPostmanCollectionConfig | undefined>;\n  /** Optional HTTP GET hook, forwarded to the endpoint picker (parity). */\n  httpGetDataFunction: Signal<\n    ((url: string, options: Record<string, unknown>) => Observable<unknown>) | undefined\n  >;\n  /** Disables every hosted editor (the dialog stays viewable read-only). */\n  disabled: Signal<boolean>;\n  /** Validation errors surfaced by the parent editor. */\n  errors: Signal<IConfigElementError[] | undefined>;\n  endpointChanged(cfg: APIDataFetchingConfigurationInterface | undefined): void;\n  queryChanged(template: QueryTemplate): void;\n  headersChanged(template: HeaderTemplate): void;\n  bodyModeChanged(mode: RequestBodyMode): void;\n  minInputsChanged(minInputs: MinimumInputRequiredInterface[]): void;\n  payloadChanged(template: PayloadTemplate): void;\n  rulesChanged(rules: TreeNode[] | Record<string, TreeNode[] | string> | string): void;\n}\n\n/** Tab order — fixed, so indices are meaningful across the template. */\nexport const enum ApiDialogTab {\n  Endpoint = 0,\n  Params = 1,\n  Headers = 2,\n  Body = 3,\n  Response = 4,\n}\n\n/**\n * Full-screen editor for one `matOptions.fetch.<slot>` API configuration,\n * arranged the way request tools like Postman arrange theirs so the mental\n * model transfers: a method + URL bar on top, then Params · Headers · Body ·\n * Response tabs, with a readiness rail in the footer.\n *\n * Opened by {@link ApiEndpointConfigComponent}, which passes an\n * {@link ApiEndpointDialogContext} and remains the single owner of every\n * mutation — this dialog only renders state and forwards edits. First-time\n * users land on a three-step guide and the Endpoint tab; picking an endpoint\n * advances to the next step that needs them — Body for a body-bearing method,\n * otherwise straight to the response mapping.\n *\n * Internal editor; not part of the public API.\n */\n@Component({\n  selector: 'lib-api-endpoint-config-dialog',\n  templateUrl: './api-endpoint-config-dialog.component.html',\n  styleUrl: './api-endpoint-config-dialog.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { class: 'lib-api-endpoint-config-dialog' },\n  imports: [\n    MatDialogModule,\n    MatButtonModule,\n    MatIconModule,\n    MatProgressSpinnerModule,\n    MatTabsModule,\n    MatTooltipModule,\n    ApiValueAccessRulesComponent,\n    HeaderTemplateEditorComponent,\n    PayloadTemplateEditorComponent,\n    RequiredInputsComponent,\n    RestApiCallSetupComponent,\n  ],\n})\nexport class ApiEndpointConfigDialogComponent {\n  /** The opener-supplied context; see {@link ApiEndpointDialogContext}. */\n  protected readonly data = inject(MAT_DIALOG_DATA) as ApiEndpointDialogContext;\n\n  readonly #formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN);\n  readonly #destroyRef = inject(DestroyRef);\n\n  /** The live configuration, read through the opener's signal. */\n  protected readonly config = computed(() => this.data.config());\n\n  /** True once the slot carries a usable endpoint. */\n  protected readonly hasEndpoint = computed<boolean>(() => Boolean(this.config()?.httpEndPoint));\n\n  /** Token colour for the request bar's method badge. */\n  protected readonly methodColor = computed<string>(() => methodColorOf(this.config()));\n\n  /** POST/PUT carry a body; the Body tab is disabled otherwise. */\n  protected readonly sendsBody = computed<boolean>(() => sendsBody(this.config()));\n\n  /** Active body mechanism — unset means mapped inputs (runtime parity). */\n  protected readonly bodyMode = computed<RequestBodyMode>(() => bodyModeOf(this.config()));\n\n  /** Query parameter count for the Params tab badge. */\n  protected readonly paramCount = computed<number>(() => paramCountOf(this.config()));\n\n  /** Header count for the Headers tab badge. */\n  protected readonly headerCount = computed<number>(() => headerCountOf(this.config()));\n\n  /** Editor default for the query panel: the endpoint's captured params. */\n  protected readonly queryDefault = computed<QueryTemplate | undefined>(() =>\n    nonEmpty(this.config()?.capturedQuery),\n  );\n\n  /** Editor default for the header panel: the endpoint's captured headers. */\n  protected readonly headerDefault = computed<HeaderTemplate | undefined>(() =>\n    nonEmpty(this.config()?.capturedHeaders),\n  );\n\n  /** Editor default for template mode, derived from the captured body/mapping. */\n  protected readonly payloadDefault = computed<PayloadTemplate>(() =>\n    payloadDefaultOf(this.config()),\n  );\n\n  /** The configured minimum-input mapping. */\n  protected readonly minInputs = computed<MinimumInputRequiredInterface[]>(() =>\n    minInputsOf(this.config()),\n  );\n\n  /** The readiness rail shown in the footer. */\n  protected readonly readiness = computed(() => readinessOf(this.config(), this.data.kind));\n\n  /** Friendly labels of the live fields the fetch waits for at fill time. */\n  protected readonly waitsFor = computed<readonly string[]>(() =>\n    waitsForLabels(this.config(), this.data.formInputs()),\n  );\n\n  /** Copy for the header subtitle, per slot kind. */\n  protected readonly kindLabel = computed<string>(() =>\n    this.data.kind === 'options' ? 'Options data source' : 'Field value data source',\n  );\n\n  /** Label of the last tab — mapping copy differs per slot kind. */\n  protected readonly responseLabel = computed<string>(() =>\n    this.data.kind === 'options' ? 'Options mapping' : 'Response',\n  );\n\n  /**\n   * The endpoint's Postman documentation, verbatim (whitespace preserved).\n   * The Docs tab exists only when the request actually carries a description.\n   */\n  protected readonly docs = computed<string | undefined>(() => {\n    const captured = this.config()?.capturedDocs;\n    return captured?.trim() ? captured : undefined;\n  });\n\n  /**\n   * Active tab index. A `linkedSignal` (per the library decision tree — follows\n   * a source, the user overrides locally): the user's tab choice sticks while\n   * an endpoint exists, and losing the endpoint (cleared while the dialog is\n   * open) snaps the selection back to the Endpoint tab — every other tab is\n   * disabled then, so nothing else is honest to show. No `effect()` writes.\n   */\n  protected readonly selectedTab = linkedSignal<boolean, number>({\n    source: this.hasEndpoint,\n    computation: (has, previous) =>\n      has ? previous?.value ?? ApiDialogTab.Endpoint : ApiDialogTab.Endpoint,\n  });\n\n  /** Exposes the enum to the template. */\n  protected readonly Tab = {\n    Endpoint: ApiDialogTab.Endpoint as number,\n    Params: ApiDialogTab.Params as number,\n    Headers: ApiDialogTab.Headers as number,\n    Body: ApiDialogTab.Body as number,\n    Response: ApiDialogTab.Response as number,\n  };\n\n  /**\n   * Forwards an endpoint selection (or clear) to the opener and, on a fresh\n   * pick, advances to the next step that actually needs the author:\n   * - a body-bearing endpoint (POST/PUT) lands on **Body** — the one thing\n   *   that must be configured before the fetch is meaningful;\n   * - anything else (GET) skips straight to the **Response / Options mapping**\n   *   tab, since params/headers arrive pre-captured from Postman.\n   */\n  protected onEndpointChanged(cfg: APIDataFetchingConfigurationInterface | undefined): void {\n    this.data.endpointChanged(cfg);\n    if (!cfg?.httpEndPoint) return;\n    this.selectedTab.set(sendsBody(cfg) ? ApiDialogTab.Body : ApiDialogTab.Response);\n  }\n\n  /** Body-mode chip handler — forwards to the opener, discards nothing. */\n  protected setBodyMode(mode: RequestBodyMode): void {\n    if (this.bodyMode() === mode) return;\n    this.data.bodyModeChanged(mode);\n  }\n\n  // ── Run API call — refresh the sample response from the CONFIGURED request ──\n\n  readonly #running = signal<boolean>(false);\n  readonly #liveResponse = signal<object | undefined>(undefined);\n  readonly #lastRunTime = signal<string | undefined>(undefined);\n  readonly #runError = signal<string | undefined>(undefined);\n\n  /** True while a test run is in flight. */\n  protected readonly running = this.#running.asReadonly();\n\n  /** The last run's response — overrides the Postman sample in the Response tab. */\n  protected readonly liveResponse = this.#liveResponse.asReadonly();\n\n  /** Wall-clock label of the last successful run (freshness note). */\n  protected readonly lastRunTime = this.#lastRunTime.asReadonly();\n\n  /** Human-readable failure of the last run, if any. */\n  protected readonly runError = this.#runError.asReadonly();\n\n  /** Labels of live-bound values a run sends empty (named, never silent). */\n  protected readonly runUnresolved = computed<readonly string[]>(() => {\n    const request = deriveConfiguredRequest(this.config());\n    return request ? dependencyLabels(this.data.formInputs(), request.unresolved) : [];\n  });\n\n  /** Tooltip: what Run does, and exactly what it cannot know at build time. */\n  protected readonly runTooltip = computed<string>(() => {\n    const base =\n      'Sends this request exactly as configured — URL, params, headers and body — and refreshes the sample response.';\n    const unresolved = this.runUnresolved();\n    return unresolved.length > 0\n      ? `${base} Values bound to live fields (${unresolved.join(', ')}) are sent empty.`\n      : base;\n  });\n\n  /**\n   * Runs the CONFIGURED request now and replaces the sample response with the\n   * live result. This is the whole point of the old \"Data Sync\" mode, made\n   * honest: the saved Postman example can be stale or payload-dependent, and\n   * the request sent here is the one this dialog's tabs describe — no separate\n   * hand-authored payload. Values bound to live form fields cannot be known at\n   * build time; they are sent empty and named in the freshness note.\n   */\n  protected runApiCall(): void {\n    if (this.#running()) return;\n    const request = deriveConfiguredRequest(this.config());\n    if (!request) return;\n\n    const fb = this.#formsConfig.formBuilder;\n    const req$: Observable<unknown> =\n      request.method === 'GET'\n        ? fb.httpGetDataFunction(request.url, request.options)\n        : request.method === 'PUT' && fb.httpPutDataFunction\n          ? fb.httpPutDataFunction(request.url, request.body, request.options)\n          : fb.httpPostDataFunction(request.url, request.body, request.options);\n\n    this.#running.set(true);\n    this.#runError.set(undefined);\n    req$.pipe(take(1), takeUntilDestroyed(this.#destroyRef)).subscribe({\n      next: (response: unknown) => {\n        this.#liveResponse.set((response ?? {}) as object);\n        this.#lastRunTime.set(\n          new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),\n        );\n        this.#running.set(false);\n        // The point of the run is the fresh response — land where it shows.\n        this.selectedTab.set(ApiDialogTab.Response);\n      },\n      error: (err: { error?: { message?: string } | string; message?: string }) => {\n        this.#running.set(false);\n        const detail = typeof err?.error === 'string' ? err.error : err?.error?.message;\n        this.#runError.set(detail || err?.message || 'The request failed.');\n      },\n    });\n  }\n}\n\n/** The map itself when it carries entries; `undefined` otherwise. */\nfunction nonEmpty<T extends object>(map: T | undefined): T | undefined {\n  return map && Object.keys(map).length > 0 ? map : undefined;\n}\n","<header class=\"aed__header\">\n  <div class=\"aed__heading\">\n    <h2 class=\"aed__title\">API call setup</h2>\n    <p class=\"aed__subtitle\">{{ kindLabel() }}</p>\n  </div>\n  <button\n    mat-icon-button\n    mat-dialog-close\n    class=\"aed__close\"\n    aria-label=\"Close API call setup\">\n    <mat-icon aria-hidden=\"true\">close</mat-icon>\n  </button>\n</header>\n\n@if (hasEndpoint()) {\n  <!-- Request bar — the Postman-style anchor: method, endpoint, change affordance. -->\n  <div class=\"aed__request-bar\">\n    <span class=\"aed__method\" [style.color]=\"methodColor()\">{{ config()?.httpMethod }}</span>\n    <div class=\"aed__request-id\">\n      <span class=\"aed__request-name\">{{ config()?.name }}</span>\n      <span class=\"aed__request-url\" [matTooltip]=\"config()?.httpEndPoint ?? ''\">\n        {{ config()?.httpEndPoint }}\n      </span>\n    </div>\n    <button\n      mat-stroked-button\n      class=\"aed__change\"\n      [disabled]=\"data.disabled()\"\n      (click)=\"selectedTab.set(Tab.Endpoint)\">\n      <mat-icon aria-hidden=\"true\">swap_horiz</mat-icon>\n      Change endpoint\n    </button>\n  </div>\n} @else {\n  <!-- First-run guide: the whole flow in one glance. -->\n  <ol class=\"aed__steps\" aria-label=\"Setup steps\">\n    <li class=\"aed__step aed__step--active\"><span class=\"aed__step-n\">1</span>Pick an endpoint</li>\n    <li class=\"aed__step\"><span class=\"aed__step-n\">2</span>Bind request inputs</li>\n    <li class=\"aed__step\"><span class=\"aed__step-n\">3</span>Map the response</li>\n  </ol>\n}\n\n<mat-dialog-content class=\"aed__content\">\n  <div class=\"aed__tabs-shell\">\n  <mat-tab-group\n    class=\"aed__tabs\"\n    [mat-stretch-tabs]=\"false\"\n    animationDuration=\"150ms\"\n    [selectedIndex]=\"selectedTab()\"\n    (selectedIndexChange)=\"selectedTab.set($event)\">\n\n    <mat-tab label=\"Endpoint\">\n      <section class=\"aed__pane\">\n        <p class=\"aed__hint\">\n          Choose which API this field calls. Endpoints come from your organisation's Postman\n          collection — pick one and its method, URL, parameters and headers are captured for you.\n        </p>\n        <lib-rest-api-call-setup\n          [postmanCollectionConfig]=\"data.postmanCollectionConfig()\"\n          [httpGetDataFunction]=\"data.httpGetDataFunction()\"\n          [disabled]=\"data.disabled()\"\n          [value]=\"config()\"\n          [errors]=\"data.errors() || []\"\n          (valueChanged)=\"onEndpointChanged($event)\" />\n      </section>\n    </mat-tab>\n\n    <mat-tab [disabled]=\"!hasEndpoint()\">\n      <ng-template mat-tab-label>\n        Params\n        @if (paramCount() > 0) {\n          <span class=\"aed__count\">{{ paramCount() }}</span>\n        }\n      </ng-template>\n      <section class=\"aed__pane\">\n        <p class=\"aed__hint\">\n          Query parameters sent on the URL — one <code>\"name\": \"value\"</code> pair each. Type\n          <code>$</code> to bind a value to a live form field; the request then waits for that\n          field at fill time. Everything else is sent as a fixed value.\n        </p>\n        <lib-header-template-editor\n          kind=\"query\"\n          [value]=\"config()?.queryTemplate\"\n          [defaultTemplate]=\"queryDefault()\"\n          [formInputs]=\"data.formInputs()\"\n          [disabled]=\"data.disabled()\"\n          [showHint]=\"false\"\n          (valueChanged)=\"data.queryChanged($event)\" />\n      </section>\n    </mat-tab>\n\n    <mat-tab [disabled]=\"!hasEndpoint()\">\n      <ng-template mat-tab-label>\n        Headers\n        @if (headerCount() > 0) {\n          <span class=\"aed__count\">{{ headerCount() }}</span>\n        }\n      </ng-template>\n      <section class=\"aed__pane\">\n        <p class=\"aed__hint\">\n          Headers sent with the request — the endpoint's own headers are prefilled. Type\n          <code>$</code> to swap any value for a live form field; everything else is sent as a\n          fixed value.\n        </p>\n        <lib-header-template-editor\n          [value]=\"config()?.headerTemplate\"\n          [defaultTemplate]=\"headerDefault()\"\n          [formInputs]=\"data.formInputs()\"\n          [disabled]=\"data.disabled()\"\n          [showHint]=\"false\"\n          (valueChanged)=\"data.headersChanged($event)\" />\n      </section>\n    </mat-tab>\n\n    <mat-tab [disabled]=\"!hasEndpoint() || !sendsBody()\">\n      <ng-template mat-tab-label>\n        Body\n        @if (hasEndpoint() && !sendsBody()) {\n          <span class=\"aed__na\">n/a</span>\n        }\n      </ng-template>\n      <section class=\"aed__pane\">\n        <p class=\"aed__hint\">\n          The request body, built from live form values. Map fields one by one, or author a JSON\n          template when the payload is nested (type <code>$</code> to insert a field) —\n          switching modes never discards the other. <strong>Run API call</strong> sends exactly\n          this body, with defaults filled in.\n        </p>\n        <div class=\"aed__mode\" role=\"group\" aria-label=\"Request body mechanism\">\n          <button\n            type=\"button\"\n            class=\"aed__mode-chip\"\n            [class.aed__mode-chip--active]=\"bodyMode() === 'mappedInputs'\"\n            [disabled]=\"data.disabled()\"\n            (click)=\"setBodyMode('mappedInputs')\">\n            Map inputs\n          </button>\n          <button\n            type=\"button\"\n            class=\"aed__mode-chip\"\n            [class.aed__mode-chip--active]=\"bodyMode() === 'template'\"\n            [disabled]=\"data.disabled()\"\n            (click)=\"setBodyMode('template')\">\n            JSON template\n          </button>\n        </div>\n\n        @if (bodyMode() === 'template') {\n          <lib-payload-template-editor\n            [value]=\"config()?.backEndConfig?.payloadTemplate\"\n            [defaultTemplate]=\"payloadDefault()\"\n            [formInputs]=\"data.formInputs()\"\n            [disabled]=\"data.disabled()\"\n            [showHint]=\"false\"\n            (valueChanged)=\"data.payloadChanged($event)\" />\n        } @else {\n          <lib-required-inputs\n            [value]=\"minInputs()\"\n            [formInputs]=\"data.formInputs()\"\n            [disabled]=\"data.disabled()\"\n            (valueChanged)=\"data.minInputsChanged($event)\" />\n        }\n      </section>\n    </mat-tab>\n\n    <mat-tab [disabled]=\"!hasEndpoint()\">\n      <ng-template mat-tab-label>{{ responseLabel() }}</ng-template>\n      <section class=\"aed__pane\">\n        <p class=\"aed__hint\">\n          Where in the response the data lives. Walk the sample below and pick the values this\n          field should read. The sample starts as the endpoint's saved Postman example — press\n          <strong>Run API call</strong> (top right) to replace it with a live response built from\n          this configuration.\n        </p>\n        <lib-api-value-access-rules\n          [value]=\"$any(config()?.valueAccessRules) || []\"\n          [formInputs]=\"$any(data.formInputs())\"\n          [mapToData]=\"config()?._id\"\n          [postmanCollectionConfig]=\"data.postmanCollectionConfig()\"\n          [liveResponse]=\"liveResponse()\"\n          [showSync]=\"false\"\n          [disabled]=\"data.disabled()\"\n          (valueChanged)=\"data.rulesChanged($event)\" />\n      </section>\n    </mat-tab>\n\n    @if (docs(); as documentation) {\n      <!-- Last tab, conditionally present — earlier tab indices stay stable. -->\n      <mat-tab label=\"Docs\" [disabled]=\"!hasEndpoint()\">\n        <section class=\"aed__pane\">\n          <p class=\"aed__hint\">\n            The endpoint's documentation, exactly as written in your organisation's Postman\n            collection.\n          </p>\n          <pre class=\"aed__docs\">{{ documentation }}</pre>\n        </section>\n      </mat-tab>\n    }\n\n  </mat-tab-group>\n\n  @if (hasEndpoint()) {\n    <!-- Postman's Send, for the builder: runs the CONFIGURED request to\n         refresh the sample response the mapping tree walks. Rendered AFTER the\n         tab group so it stacks above Material's tab header and stays clickable. -->\n    <button\n      mat-flat-button\n      class=\"aed__run\"\n      [disabled]=\"running()\"\n      [matTooltip]=\"runTooltip()\"\n      [attr.aria-busy]=\"running()\"\n      (click)=\"runApiCall()\">\n      @if (running()) {\n        <mat-spinner diameter=\"16\" />\n      } @else {\n        <mat-icon aria-hidden=\"true\">play_arrow</mat-icon>\n      }\n      {{ running() ? 'Running…' : 'Run API call' }}\n    </button>\n  }\n  </div>\n</mat-dialog-content>\n\n<footer class=\"aed__footer\">\n  <div class=\"aed__status\">\n    <div class=\"aed__chips\">\n      @for (item of readiness(); track item.label) {\n        <span class=\"aed__chip\" [attr.data-state]=\"item.state\">\n          <!-- Glyph + colour + border style: state is never colour-only. -->\n          {{ item.state === 'done' ? '✓ ' : item.state === 'pending' ? '• ' : '' }}{{ item.label }}\n        </span>\n      }\n    </div>\n    @if (hasEndpoint()) {\n      @if (waitsFor().length > 0) {\n        <p class=\"aed__waits\">\n          Waits for {{ waitsFor().join(', ') }} before fetching — the same gate the form applies\n          at fill time.\n        </p>\n      } @else {\n        <p class=\"aed__waits\">Fetches as soon as the form loads — no live fields are bound.</p>\n      }\n      @if (runError(); as err) {\n        <p class=\"aed__run-note aed__run-note--error\">Run failed: {{ err }}</p>\n      } @else if (lastRunTime(); as time) {\n        <p class=\"aed__run-note\">\n          Fresh response · {{ time }}@if (runUnresolved().length > 0) {\n            — sent without live values: {{ runUnresolved().join(', ') }}\n          }\n        </p>\n      }\n    }\n  </div>\n  <button mat-flat-button mat-dialog-close class=\"aed__done\">Done</button>\n</footer>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ViewEncapsulation,\n  computed,\n  inject,\n  input,\n  linkedSignal,\n  output,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { Observable } from 'rxjs';\n\nimport type {\n  APIDataFetchingConfigurationInterface,\n  FormColumnInputs,\n  HeaderTemplate,\n  IPostmanCollectionConfig,\n  MinimumInputRequiredInterface,\n  PayloadTemplate,\n  QueryTemplate,\n  RequestBodyMode,\n  TreeNode,\n} from 'ngx-t-forms-types';\n\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\nimport { ErrorListComponent } from '../_shared/error-list/error-list.component';\nimport {\n  ApiEndpointConfigDialogComponent,\n  type ApiEndpointDialogContext,\n} from './api-endpoint-config-dialog.component';\nimport {\n  type ReadinessItem,\n  headerCountOf,\n  methodColorOf,\n  paramCountOf,\n  readinessOf,\n  waitsForLabels,\n} from './api-endpoint-config.logic';\n\n/**\n * Entry point for a whole `matOptions.fetch.<slot>` API configuration.\n *\n * The element editor's sidebar is too narrow to author a request in, so this\n * component renders only the CURRENT STATE — an invitation card before an\n * endpoint is picked, a summary card (method, endpoint, per-area status chips,\n * the waits-for line) after — and opens the Postman-style\n * {@link ApiEndpointConfigDialogComponent} for the actual editing. It remains\n * the single owner of every mutation: the dialog reads live state through\n * signals and forwards edits back into the patch methods here, so autoSave\n * merge-back behaves exactly as it did when the editors were inline.\n *\n * Emits the COMPLETE fetch config on every change. Selecting a new endpoint\n * REPLACES the slot (the legacy per-row `clearOnChange` semantics); editing a\n * slice merges over the current value.\n *\n * Internal editor consumed by `t-dynamic-data-edit`; not part of the public API.\n *\n * @example\n *   <lib-api-endpoint-config [value]=\"fetchConfig()\" [formInputs]=\"inputs()\"\n *     [postmanCollectionConfig]=\"postman()\" (valueChanged)=\"onConfig($event)\" />\n */\n@Component({\n  selector: 'lib-api-endpoint-config',\n  templateUrl: './api-endpoint-config.component.html',\n  styleUrl: './api-endpoint-config.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { class: 'lib-api-endpoint-config' },\n  imports: [\n    EmptyStateComponent,\n    ErrorListComponent,\n    MatButtonModule,\n    MatIconModule,\n    MatTooltipModule,\n  ],\n})\nexport class ApiEndpointConfigComponent {\n  readonly #dialog = inject(MatDialog);\n  readonly #destroyRef = inject(DestroyRef);\n\n  /** Current fetch-slot configuration (`undefined` until an endpoint is picked). */\n  readonly value = input<APIDataFetchingConfigurationInterface | undefined>(undefined);\n\n  /** Which slot is being configured — copy only; behaviour is identical. */\n  readonly kind = input<'value' | 'options'>('value');\n\n  /** All form inputs, offered as bindings by the hosted editors. */\n  readonly formInputs = input<readonly FormColumnInputs[]>([]);\n\n  /** Postman collection behind the endpoint picker + response mapping. */\n  readonly postmanCollectionConfig = input<IPostmanCollectionConfig | undefined>(undefined);\n\n  /** Optional HTTP GET hook, forwarded to the endpoint picker (parity). */\n  readonly httpGetDataFunction = input<\n    ((url: string, options: Record<string, unknown>) => Observable<unknown>) | undefined\n  >(undefined);\n\n  /** Disables editing; the dialog stays openable for read-only review. */\n  readonly disabled = input<boolean>(false);\n\n  /** Validation errors surfaced by the parent editor. */\n  readonly errors = input<IConfigElementError[] | undefined>([]);\n\n  /** Optional id supplied by the parent editor. */\n  readonly id = input<string | undefined>(undefined);\n\n  /** Emits the complete fetch config on every change (`undefined` on clear). */\n  readonly valueChanged = output<APIDataFetchingConfigurationInterface | undefined>();\n\n  /**\n   * The configuration being edited: follows the parent `value`, and local\n   * patches override it until the parent hands a new value down (autoSave\n   * merge-back). `linkedSignal` per the library decision tree — a source the\n   * user can override locally.\n   */\n  protected readonly config = linkedSignal<APIDataFetchingConfigurationInterface | undefined>(\n    () => this.value(),\n  );\n\n  /** True once the slot carries a usable endpoint. */\n  protected readonly hasEndpoint = computed<boolean>(() => Boolean(this.config()?.httpEndPoint));\n\n  /** Token colour for the summary card's method badge. */\n  protected readonly methodColor = computed<string>(() => methodColorOf(this.config()));\n\n  /**\n   * Summary chips: request-area counts (Params, Headers) followed by the\n   * readiness rail's Body / mapping entries — one glance answers \"what is\n   * configured, what still needs me\".\n   */\n  protected readonly summaryChips = computed<readonly ReadinessItem[]>(() => {\n    const cfg = this.config();\n    const params = paramCountOf(cfg);\n    const headers = headerCountOf(cfg);\n    const chips: ReadinessItem[] = [\n      { label: params > 0 ? `Params · ${params}` : 'Params', state: params > 0 ? 'done' : 'skip' },\n      { label: headers > 0 ? `Headers · ${headers}` : 'Headers', state: headers > 0 ? 'done' : 'skip' },\n    ];\n    for (const item of readinessOf(cfg, this.kind())) {\n      if (item.label !== 'Endpoint') chips.push(item);\n    }\n    return chips;\n  });\n\n  /** Friendly labels of the live fields the fetch waits for at fill time. */\n  protected readonly waitsFor = computed<readonly string[]>(() =>\n    waitsForLabels(this.config(), this.formInputs()),\n  );\n\n  /** Invitation copy, adapted to whether a Postman collection is available. */\n  protected readonly inviteMessage = computed<string>(() =>\n    this.postmanCollectionConfig()\n      ? 'No API connected yet. Pick an endpoint, bind its request to live form fields, and map the response — all in one guided setup.'\n      : 'No Postman collection configured. Add a collection id and API key to pick an endpoint.',\n  );\n\n  /** The open editor dialog, if any — guards against double-opening. */\n  #dialogRef: MatDialogRef<ApiEndpointConfigDialogComponent> | null = null;\n\n  constructor() {\n    this.#destroyRef.onDestroy(() => this.#dialogRef?.close());\n  }\n\n  /**\n   * Opens the Postman-style editor dialog. The dialog reads live state through\n   * the context's signals and forwards every edit back into this component's\n   * patch methods, so the emit semantics are identical to the old inline\n   * editors. Opening while `disabled` is allowed — the hosted editors render\n   * read-only, which is how a locked configuration is reviewed.\n   */\n  protected openDialog(): void {\n    if (this.#dialogRef) return;\n\n    const context: ApiEndpointDialogContext = {\n      kind: this.kind(),\n      config: this.config.asReadonly(),\n      formInputs: this.formInputs,\n      postmanCollectionConfig: this.postmanCollectionConfig,\n      httpGetDataFunction: this.httpGetDataFunction,\n      disabled: this.disabled,\n      errors: this.errors,\n      endpointChanged: (cfg) => this.onEndpointChanged(cfg),\n      queryChanged: (template) => this.onQueryChanged(template),\n      headersChanged: (template) => this.onHeadersChanged(template),\n      bodyModeChanged: (mode) => this.setBodyMode(mode),\n      minInputsChanged: (minInputs) => this.onMinInputsChanged(minInputs),\n      payloadChanged: (template) => this.onPayloadChanged(template),\n      rulesChanged: (rules) => this.onRulesChanged(rules),\n    };\n\n    this.#dialogRef = this.#dialog.open(ApiEndpointConfigDialogComponent, {\n      data: context,\n      width: 'min(1080px, 96vw)',\n      maxWidth: '96vw',\n      maxHeight: '92vh',\n      autoFocus: 'first-tabbable',\n      panelClass: 'lib-api-endpoint-dialog-panel',\n    });\n    this.#dialogRef\n      .afterClosed()\n      .pipe(takeUntilDestroyed(this.#destroyRef))\n      .subscribe(() => (this.#dialogRef = null));\n  }\n\n  /** Clears the configured endpoint (and with it the whole slot). */\n  protected clearConfig(): void {\n    this.onEndpointChanged(undefined);\n  }\n\n  /**\n   * A fresh endpoint selection (or a clear) REPLACES the whole slot — sub-config\n   * authored against the previous endpoint must not survive the switch, which is\n   * exactly what the legacy `ApiCall` row's `clearOnChange` guaranteed.\n   */\n  protected onEndpointChanged(cfg: APIDataFetchingConfigurationInterface | undefined): void {\n    this.config.set(cfg);\n    this.valueChanged.emit(cfg);\n  }\n\n  protected onQueryChanged(template: QueryTemplate): void {\n    this.#patch({ queryTemplate: template });\n  }\n\n  protected onHeadersChanged(template: HeaderTemplate): void {\n    this.#patch({ headerTemplate: template });\n  }\n\n  /**\n   * Mode toggles never discard either body configuration — `requestBodyMode`\n   * alone decides which one the runtime uses (the historical clear-on-toggle\n   * destroyed authored work; see the runtime contract on RequestBodyMode).\n   */\n  protected setBodyMode(mode: RequestBodyMode): void {\n    if ((this.config()?.backEndConfig?.requestBodyMode === 'template' ? 'template' : 'mappedInputs') === mode) {\n      return;\n    }\n    this.#patchBackEnd({ requestBodyMode: mode });\n  }\n\n  protected onMinInputsChanged(minInputs: MinimumInputRequiredInterface[]): void {\n    this.#patchBackEnd({ minimumInputRequired: minInputs });\n  }\n\n  protected onPayloadChanged(template: PayloadTemplate): void {\n    this.#patchBackEnd({ payloadTemplate: template });\n  }\n\n  protected onRulesChanged(rules: TreeNode[] | Record<string, TreeNode[] | string> | string): void {\n    this.#patch({\n      valueAccessRules: rules as APIDataFetchingConfigurationInterface['valueAccessRules'],\n    });\n  }\n\n  #patch(partial: Partial<APIDataFetchingConfigurationInterface>): void {\n    const current = this.config();\n    if (!current) return;\n    const next: APIDataFetchingConfigurationInterface = { ...current, ...partial };\n    this.config.set(next);\n    this.valueChanged.emit(next);\n  }\n\n  #patchBackEnd(\n    partial: Partial<APIDataFetchingConfigurationInterface['backEndConfig']>,\n  ): void {\n    const current = this.config();\n    if (!current) return;\n    this.#patch({ backEndConfig: { ...current.backEndConfig, ...partial } });\n  }\n}\n","<div class=\"aec\">\n  @if (!hasEndpoint()) {\n    <!-- INVITE — nothing configured yet; the dialog is where setup happens. -->\n    <div class=\"aec-invite\">\n      <lib-empty-state icon=\"cloud_sync\" [message]=\"inviteMessage()\" />\n      <button\n        mat-flat-button\n        class=\"aec-invite__cta\"\n        [disabled]=\"!postmanCollectionConfig() || disabled()\"\n        [matTooltip]=\"postmanCollectionConfig() ? '' : 'Configure a Postman collection first'\"\n        (click)=\"openDialog()\">\n        <mat-icon aria-hidden=\"true\">cloud_sync</mat-icon>\n        Set up API call\n      </button>\n    </div>\n  } @else {\n    <!-- SUMMARY — what is configured, at a glance; editing happens in the dialog. -->\n    <div class=\"aec-summary\">\n      <div class=\"aec-summary__endpoint\">\n        <span class=\"aec-summary__method\" [style.color]=\"methodColor()\">\n          {{ config()?.httpMethod }}\n        </span>\n        <div class=\"aec-summary__id\">\n          <p class=\"aec-summary__name\">{{ config()?.name }}</p>\n          <p class=\"aec-summary__url\" [matTooltip]=\"config()?.httpEndPoint ?? ''\">\n            {{ config()?.httpEndPoint }}\n          </p>\n        </div>\n      </div>\n\n      <div class=\"aec__chips\">\n        @for (item of summaryChips(); track item.label) {\n          <span class=\"aec__chip\" [attr.data-state]=\"item.state\">\n            <!-- Glyph + colour + border style: state is never colour-only. -->\n            {{ item.state === 'done' ? '✓ ' : item.state === 'pending' ? '• ' : '' }}{{ item.label }}\n          </span>\n        }\n      </div>\n\n      @if (waitsFor().length > 0) {\n        <p class=\"aec__waits\">\n          Waits for {{ waitsFor().join(', ') }} before fetching — the same gate the\n          form applies at fill time.\n        </p>\n      } @else {\n        <p class=\"aec__waits\">Fetches as soon as the form loads — no live fields are bound.</p>\n      }\n\n      <div class=\"aec-summary__actions\">\n        <button mat-flat-button (click)=\"openDialog()\">\n          <mat-icon aria-hidden=\"true\">tune</mat-icon>\n          {{ disabled() ? 'View setup' : 'Configure' }}\n        </button>\n        <button\n          mat-button\n          [disabled]=\"disabled()\"\n          matTooltip=\"Remove this API call and start over\"\n          (click)=\"clearConfig()\">\n          Clear\n        </button>\n      </div>\n    </div>\n  }\n\n  <lib-error-list [errors]=\"errors() || []\" />\n</div>\n"],"names":["i6","i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+FA;;;;;;;;;;;;;;AAcG;MAsBU,gCAAgC,CAAA;AArB7C,IAAA,WAAA,GAAA;;AAuBqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,eAAe,CAA6B;AAEpE,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC/C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGtB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,6EAAC;;AAG3C,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAU,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,kFAAC;;AAG3E,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,kFAAC;;AAGlE,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAU,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,gFAAC;;AAG7D,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAkB,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,+EAAC;;AAGrE,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAS,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,iFAAC;;AAGhE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,kFAAC;;AAGlE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA4B,MACpE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,mFACvC;;AAGkB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAA6B,MACtE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,oFACzC;;AAGkB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAkB,MAC5D,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,qFAChC;;AAGkB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAkC,MACvE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,gFAC3B;;QAGkB,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gFAAC;;QAGtE,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAoB,MACxD,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtD;;QAGkB,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAS,MAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,qBAAqB,GAAG,yBAAyB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjF;;QAGkB,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAS,MAClD,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,iBAAiB,GAAG,UAAU,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC9D;AAED;;;AAGG;AACgB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAqB,MAAK;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY;AAC5C,YAAA,OAAO,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG,SAAS;AAChD,QAAA,CAAC,2EAAC;AAEF;;;;;;AAMG;AACgB,QAAA,IAAA,CAAA,WAAW,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,aAAA,EAAA,8BAAA,EAAA,CAAA,EAC3C,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,WAAW,EAAE,CAAC,GAAG,EAAE,QAAQ,KACzB,GAAG,GAAG,QAAQ,EAAE,KAAK,IAAA,CAAA,+BAA2B,CAAA,+BAClD;;AAGiB,QAAA,IAAA,CAAA,GAAG,GAAG;AACvB,YAAA,QAAQ,EAAE,CAAA;AACV,YAAA,MAAM,EAAE,CAAA;AACR,YAAA,OAAO,EAAE,CAAA;AACT,YAAA,IAAI,EAAE,CAAA;AACN,YAAA,QAAQ,EAAE,CAAA;SACX;;AAwBQ,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,+EAAC;AACjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAqB,SAAS,oFAAC;AACrD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAqB,SAAS,mFAAC;AACpD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAqB,SAAS,gFAAC;;AAGvC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;AAGpC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;;AAG9C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAG5C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAGtC,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAoB,MAAK;YAClE,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtD,OAAO,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE;AACpF,QAAA,CAAC,oFAAC;;AAGiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;YACpD,MAAM,IAAI,GACR,+GAA+G;AACjH,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG;kBACvB,CAAA,EAAG,IAAI,CAAA,8BAAA,EAAiC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA;kBAC7D,IAAI;AACV,QAAA,CAAC,iFAAC;AA0CH,IAAA;AA5LU,IAAA,YAAY;AACZ,IAAA,WAAW;AA4FpB;;;;;;;AAOG;AACO,IAAA,iBAAiB,CAAC,GAAsD,EAAA;AAChF,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC9B,IAAI,CAAC,GAAG,EAAE,YAAY;YAAE;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAE,CAAA,2BAAoB,CAAA,6BAAuB;IAClF;;AAGU,IAAA,WAAW,CAAC,IAAqB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI;YAAE;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IACjC;;AAIS,IAAA,QAAQ;AACR,IAAA,aAAa;AACb,IAAA,YAAY;AACZ,IAAA,SAAS;AA8BlB;;;;;;;AAOG;IACO,UAAU,GAAA;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW;AACxC,QAAA,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK;AACjB,cAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO;cACnD,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,EAAE,CAAC;AAC/B,kBAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO;AACnE,kBAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC;AAE3E,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,YAAA,IAAI,EAAE,CAAC,QAAiB,KAAI;gBAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAY;gBAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAC1E;AACD,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;AAExB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,+BAAuB;YAC7C,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAgE,KAAI;AAC1E,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBACxB,MAAM,MAAM,GAAG,OAAO,GAAG,EAAE,KAAK,KAAK,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO;AAC/E,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,qBAAqB,CAAC;YACrE,CAAC;AACF,SAAA,CAAC;IACJ;+GA/LW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhC,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gCAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnI7C,izTA+PA,EAAA,MAAA,EAAA,CAAA,4xJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzII,eAAe,gWACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,4BAA4B,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,6BAA6B,sMAC7B,8BAA8B,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGhB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBArB5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,EAAA,eAAA,EAGzB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAA,OAAA,EACxC;wBACP,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,wBAAwB;wBACxB,aAAa;wBACb,gBAAgB;wBAChB,4BAA4B;wBAC5B,6BAA6B;wBAC7B,8BAA8B;wBAC9B,uBAAuB;wBACvB,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,izTAAA,EAAA,MAAA,EAAA,CAAA,4xJAAA,CAAA,EAAA;;AAoMH;AACA,SAAS,QAAQ,CAAmB,GAAkB,EAAA;IACpD,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,SAAS;AAC7D;;AE1RA;;;;;;;;;;;;;;;;;;;;;AAqBG;MAgBU,0BAA0B,CAAA;AAC5B,IAAA,OAAO;AACP,IAAA,WAAW;;AA+EpB,IAAA,UAAU;AAEV,IAAA,WAAA,GAAA;AAlFS,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAoD,SAAS,4EAAC;;AAG3E,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAsB,OAAO,2EAAC;;AAG1C,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAA8B,EAAE,iFAAC;;AAGnD,QAAA,IAAA,CAAA,uBAAuB,GAAG,KAAK,CAAuC,SAAS,8FAAC;;AAGhF,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAElC,SAAS,0FAAC;;AAGH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoC,EAAE,6EAAC;;AAGrD,QAAA,IAAA,CAAA,EAAE,GAAG,KAAK,CAAqB,SAAS,yEAAC;;QAGzC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAqD;AAEnF;;;;;AAKG;QACgB,IAAA,CAAA,MAAM,GAAG,YAAY,CACtC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnB;;AAGkB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAU,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,kFAAC;;AAG3E,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,kFAAC;AAErF;;;;AAIG;AACgB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA2B,MAAK;AACxE,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC;AAChC,YAAA,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC;AAClC,YAAA,MAAM,KAAK,GAAoB;AAC7B,gBAAA,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE;AAC5F,gBAAA,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE;aAClG;AACD,YAAA,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;AAChD,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,mFAAC;;AAGiB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAoB,MACxD,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,+EACjD;;QAGkB,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAS,MAClD,IAAI,CAAC,uBAAuB;AAC1B,cAAE;cACA,wFAAwF,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC7F;;QAGD,IAAA,CAAA,UAAU,GAA0D,IAAI;AAGtE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;IAC5D;AAEA;;;;;;AAMG;IACO,UAAU,GAAA;QAClB,IAAI,IAAI,CAAC,UAAU;YAAE;AAErB,QAAA,MAAM,OAAO,GAA6B;AACxC,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YAChC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YACrD,YAAY,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;YACzD,cAAc,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC7D,eAAe,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACjD,gBAAgB,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;YACnE,cAAc,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC7D,YAAY,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;SACpD;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE;AACpE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,UAAU,EAAE,+BAA+B;AAC5C,SAAA,CAAC;AACF,QAAA,IAAI,CAAC;AACF,aAAA,WAAW;AACX,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,aAAA,SAAS,CAAC,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C;;IAGU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;IACnC;AAEA;;;;AAIG;AACO,IAAA,iBAAiB,CAAC,GAAsD,EAAA;AAChF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B;AAEU,IAAA,cAAc,CAAC,QAAuB,EAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1C;AAEU,IAAA,gBAAgB,CAAC,QAAwB,EAAA;QACjD,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC3C;AAEA;;;;AAIG;AACO,IAAA,WAAW,CAAC,IAAqB,EAAA;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,eAAe,KAAK,UAAU,GAAG,UAAU,GAAG,cAAc,MAAM,IAAI,EAAE;YACzG;QACF;QACA,IAAI,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAC/C;AAEU,IAAA,kBAAkB,CAAC,SAA0C,EAAA;QACrE,IAAI,CAAC,aAAa,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC;IACzD;AAEU,IAAA,gBAAgB,CAAC,QAAyB,EAAA;QAClD,IAAI,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;IACnD;AAEU,IAAA,cAAc,CAAC,KAAgE,EAAA;QACvF,IAAI,CAAC,MAAM,CAAC;AACV,YAAA,gBAAgB,EAAE,KAAkE;AACrF,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,CAAC,OAAuD,EAAA;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,IAAI,GAA0C,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE;AAC9E,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,aAAa,CACX,OAAwE,EAAA;AAExE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;IAC1E;+GA/LW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnFvC,89EAkEA,EAAA,MAAA,EAAA,CAAA,6rDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDUI,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAftC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAA,OAAA,EACjC;wBACP,mBAAmB;wBACnB,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,89EAAA,EAAA,MAAA,EAAA,CAAA,6rDAAA,CAAA,EAAA;;;;;"}