@gnggln/ng-ui-system 1.0.0-alpha.16 → 1.0.0-alpha.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/base-layout/lib/components/base-layout/base-layout.component.d.ts +30 -2
  2. package/base-layout/lib/components/base-layout/base-layout.types.d.ts +14 -0
  3. package/base-layout/lib/components/base-layout/index.d.ts +1 -1
  4. package/base-layout/lib/components/button/button.component.d.ts +8 -2
  5. package/base-layout/lib/components/button/button.types.d.ts +5 -0
  6. package/blackbox/lib/components/button/button.component.d.ts +8 -2
  7. package/blackbox/lib/components/button/button.types.d.ts +5 -0
  8. package/button/lib/components/button/button.component.d.ts +8 -2
  9. package/button/lib/components/button/button.types.d.ts +5 -0
  10. package/crud-table/lib/components/button/button.component.d.ts +8 -2
  11. package/crud-table/lib/components/button/button.types.d.ts +5 -0
  12. package/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  13. package/crud-table/lib/components/form-builder/types/schema.types.d.ts +20 -2
  14. package/esm2022/base-layout/lib/components/base-layout/base-layout.component.mjs +71 -16
  15. package/esm2022/base-layout/lib/components/base-layout/base-layout.types.mjs +1 -1
  16. package/esm2022/base-layout/lib/components/base-layout/index.mjs +1 -1
  17. package/esm2022/base-layout/lib/components/button/button-area.component.mjs +3 -1
  18. package/esm2022/base-layout/lib/components/button/button.component.mjs +21 -5
  19. package/esm2022/base-layout/lib/components/button/button.types.mjs +1 -1
  20. package/esm2022/blackbox/lib/components/button/button-area.component.mjs +3 -1
  21. package/esm2022/blackbox/lib/components/button/button.component.mjs +21 -5
  22. package/esm2022/blackbox/lib/components/button/button.types.mjs +1 -1
  23. package/esm2022/button/lib/components/button/button-area.component.mjs +3 -1
  24. package/esm2022/button/lib/components/button/button.component.mjs +21 -5
  25. package/esm2022/button/lib/components/button/button.types.mjs +1 -1
  26. package/esm2022/crud-table/lib/components/button/button-area.component.mjs +3 -1
  27. package/esm2022/crud-table/lib/components/button/button.component.mjs +21 -5
  28. package/esm2022/crud-table/lib/components/button/button.types.mjs +1 -1
  29. package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +3 -3
  30. package/esm2022/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  31. package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +1 -1
  32. package/esm2022/form-builder/lib/components/button/button-area.component.mjs +3 -1
  33. package/esm2022/form-builder/lib/components/button/button.component.mjs +21 -5
  34. package/esm2022/form-builder/lib/components/button/button.types.mjs +1 -1
  35. package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +3 -3
  36. package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +176 -39
  37. package/esm2022/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  38. package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +1 -1
  39. package/esm2022/form-builder-editor/lib/components/button/button-area.component.mjs +3 -1
  40. package/esm2022/form-builder-editor/lib/components/button/button.component.mjs +21 -5
  41. package/esm2022/form-builder-editor/lib/components/button/button.types.mjs +1 -1
  42. package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +3 -3
  43. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  44. package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +1 -1
  45. package/esm2022/lib/components/base-layout/base-layout.component.mjs +71 -16
  46. package/esm2022/lib/components/base-layout/base-layout.types.mjs +1 -1
  47. package/esm2022/lib/components/base-layout/index.mjs +1 -1
  48. package/esm2022/lib/components/button/button-area.component.mjs +3 -1
  49. package/esm2022/lib/components/button/button.component.mjs +21 -5
  50. package/esm2022/lib/components/button/button.types.mjs +1 -1
  51. package/esm2022/lib/components/form-builder/form-builder.component.mjs +3 -3
  52. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +176 -39
  53. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  54. package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
  55. package/esm2022/modal/lib/components/button/button.component.mjs +21 -5
  56. package/esm2022/modal/lib/components/button/button.types.mjs +1 -1
  57. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +92 -19
  58. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -1
  59. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +22 -4
  60. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -1
  61. package/fesm2022/gnggln-ng-ui-system-button.mjs +22 -4
  62. package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -1
  63. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +165 -118
  64. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -1
  65. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +165 -118
  66. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -1
  67. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +340 -156
  68. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -1
  69. package/fesm2022/gnggln-ng-ui-system-modal.mjs +20 -4
  70. package/fesm2022/gnggln-ng-ui-system-modal.mjs.map +1 -1
  71. package/fesm2022/gnggln-ng-ui-system.mjs +409 -170
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  73. package/form-builder/lib/components/button/button.component.d.ts +8 -2
  74. package/form-builder/lib/components/button/button.types.d.ts +5 -0
  75. package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +14 -2
  76. package/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  77. package/form-builder/lib/components/form-builder/types/schema.types.d.ts +20 -2
  78. package/form-builder-editor/lib/components/button/button.component.d.ts +8 -2
  79. package/form-builder-editor/lib/components/button/button.types.d.ts +5 -0
  80. package/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  81. package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +20 -2
  82. package/lib/components/base-layout/base-layout.component.d.ts +30 -2
  83. package/lib/components/base-layout/base-layout.types.d.ts +14 -0
  84. package/lib/components/base-layout/index.d.ts +1 -1
  85. package/lib/components/button/button.component.d.ts +8 -2
  86. package/lib/components/button/button.types.d.ts +5 -0
  87. package/lib/components/form-builder/form-wizard.component.d.ts +14 -2
  88. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  89. package/lib/components/form-builder/types/schema.types.d.ts +20 -2
  90. package/modal/lib/components/button/button.component.d.ts +8 -2
  91. package/modal/lib/components/button/button.types.d.ts +5 -0
  92. package/package.json +18 -18
@@ -2,6 +2,12 @@ import { type OnInit } from '@angular/core';
2
2
  import type { UiButtonAreaAlign, UiButtonDescriptor } from '../button/button.types';
3
3
  import type { UiBackButtonConfig } from './base-layout.types';
4
4
  import * as i0 from "@angular/core";
5
+ /** Stato letto dalla rotta foglia per header/footer opzionali e `data-route-id`. */
6
+ interface UiBaseLayoutRouteSnapshotFlags {
7
+ breadcrumbOff: boolean;
8
+ footerNavOff: boolean;
9
+ routeId: string | null;
10
+ }
5
11
  /**
6
12
  * Full-page layout component that combines a page header (breadcrumbs + title),
7
13
  * a main content area via `<ng-content>`, and a sticky footer action bar
@@ -10,6 +16,14 @@ import * as i0 from "@angular/core";
10
16
  * Optionally renders an automatic "back" button in the footer, derived from
11
17
  * the breadcrumb trail (navigates to the parent breadcrumb).
12
18
  *
19
+ * ### Route `data`
20
+ *
21
+ * Sulla rotta attiva (foglia) puoi impostare:
22
+ *
23
+ * - `breadcrumbOff: true` — nasconde `ui-page-header`
24
+ * - `footerNavOff: true` — nasconde `ui-base-layout__footer`
25
+ * - `id: string` — valorizza `data-route-id` sul contenitore `.ui-base-layout`
26
+ *
13
27
  * @selector ui-base-layout
14
28
  *
15
29
  * @example
@@ -60,6 +74,15 @@ export declare class UiBaseLayoutComponent implements OnInit {
60
74
  private readonly activatedRoute;
61
75
  private readonly breadcrumbService;
62
76
  private readonly destroyRef;
77
+ /**
78
+ * Flag derivati dalla catena attiva (`breadcrumbOff`, `footerNavOff`, `id`).
79
+ * Aggiornati a ogni `NavigationEnd`.
80
+ */
81
+ protected readonly routeSnapshotFlags: import("@angular/core").WritableSignal<UiBaseLayoutRouteSnapshotFlags>;
82
+ /** Header visibile se abilitato da input e non disattivato da `data.breadcrumbOff`. */
83
+ protected readonly effectiveShowHeader: () => boolean;
84
+ /** Footer azioni visibile se ci sono azioni visibili e non disattivato da `data.footerNavOff`. */
85
+ protected readonly effectiveShowFooterNav: () => boolean;
63
86
  /**
64
87
  * Merged action list (back button + consumer actions).
65
88
  * Computed on every change-detection check so it stays in sync
@@ -69,8 +92,12 @@ export declare class UiBaseLayoutComponent implements OnInit {
69
92
  /** Whether the footer should render (at least one non-hidden action exists). */
70
93
  get hasVisibleActions(): boolean;
71
94
  ngOnInit(): void;
72
- /** @internal Aggiorna lo stato dei breadcrumb nel service dalla rotta corrente. */
73
- private refreshBreadcrumbs;
95
+ /** @internal Allinea breadcrumb service e flag layout alla rotta corrente. */
96
+ private syncFromActivatedRoute;
97
+ /** @internal Legge `breadcrumbOff`, `footerNavOff`, `id` dalla catena `pathFromRoot` / foglia. */
98
+ private refreshRouteSnapshotFlags;
99
+ /** @internal Percorre fino al `ActivatedRoute` foglia sotto il punto di iniezione. */
100
+ private deepestChildRoute;
74
101
  /** @internal Determina se il back button deve essere nascosto per la rotta corrente. */
75
102
  private shouldHideBackButton;
76
103
  /** @internal Naviga al breadcrumb genitore o esegue il fallback alla home route. */
@@ -78,3 +105,4 @@ export declare class UiBaseLayoutComponent implements OnInit {
78
105
  static ɵfac: i0.ɵɵFactoryDeclaration<UiBaseLayoutComponent, never>;
79
106
  static ɵcmp: i0.ɵɵComponentDeclaration<UiBaseLayoutComponent, "ui-base-layout", never, { "showHeader": { "alias": "showHeader"; "required": false; }; "title": { "alias": "title"; "required": false; }; "homeRoute": { "alias": "homeRoute"; "required": false; }; "showHome": { "alias": "showHome"; "required": false; }; "updateDocumentTitle": { "alias": "updateDocumentTitle"; "required": false; }; "titleSuffix": { "alias": "titleSuffix"; "required": false; }; "showBackButton": { "alias": "showBackButton"; "required": false; }; "backButtonConfig": { "alias": "backButtonConfig"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "footerAlign": { "alias": "footerAlign"; "required": false; }; "footerGap": { "alias": "footerGap"; "required": false; }; }, {}, never, ["*"], true, never>;
80
107
  }
108
+ export {};
@@ -4,6 +4,20 @@
4
4
  */
5
5
  import { UiButtonDescriptor, UiButtonAreaAlign } from '../button/button.types';
6
6
  export { UiButtonDescriptor, UiButtonAreaAlign };
7
+ /**
8
+ * Chiavi opzionali di `data` sulla rotta attiva riconosciute da `UiBaseLayoutComponent`.
9
+ *
10
+ * - `id`: stessa risalita usata dai breadcrumb (dal segmento foglia verso il root: primo `id` trovato).
11
+ * - `breadcrumbOff` / `footerNavOff`: se `true` su **qualsiasi** segmento in `pathFromRoot`, l’area viene nascosta.
12
+ */
13
+ export interface UiBaseLayoutRouteData {
14
+ /** Identificativo stabile della rotta; reso come `data-route-id` sul wrapper `.ui-base-layout`. */
15
+ id?: string;
16
+ /** Se `true`, non viene renderizzato `ui-page-header` (breadcrumb e titolo). */
17
+ breadcrumbOff?: boolean;
18
+ /** Se `true`, non viene renderizzata la barra `ui-base-layout__footer` (azioni / indietro). */
19
+ footerNavOff?: boolean;
20
+ }
7
21
  /**
8
22
  * Configuration for the automatic "back" button rendered in the footer action area.
9
23
  *
@@ -10,4 +10,4 @@
10
10
  * ```
11
11
  */
12
12
  export { UiBaseLayoutComponent } from './base-layout.component';
13
- export { UiBackButtonConfig } from './base-layout.types';
13
+ export { UiBackButtonConfig, UiBaseLayoutRouteData } from './base-layout.types';
@@ -17,8 +17,8 @@ import * as i0 from "@angular/core";
17
17
  * <!-- Loading -->
18
18
  * <ui-button label="Submitting..." variant="primary" [loading]="true" />
19
19
  *
20
- * <!-- Icon-only -->
21
- * <ui-button icon="trash-2" variant="warn" ariaLabel="Delete item" (click)="delete()" />
20
+ * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->
21
+ * <ui-button icon="trash-2" variant="warn" tooltip="Elimina" (click)="delete()" />
22
22
  * ```
23
23
  */
24
24
  export declare class UiButtonComponent {
@@ -46,6 +46,12 @@ export declare class UiButtonComponent {
46
46
  ariaLabel?: string;
47
47
  /** Additional CSS class for edge cases. */
48
48
  customClass?: string;
49
+ /**
50
+ * Nome accessibile risolto per il pulsante nativo.
51
+ * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile
52
+ * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).
53
+ */
54
+ get effectiveAriaLabel(): string | undefined;
49
55
  /** Computed icon pixel size based on button size. */
50
56
  get iconSize(): number;
51
57
  /** Assembled CSS class string for the native button element. */
@@ -40,6 +40,11 @@ export interface UiButtonDescriptor {
40
40
  label: string;
41
41
  /** Tooltip text shown on hover. */
42
42
  tooltip?: string;
43
+ /**
44
+ * Nome accessibile esplicito (override).
45
+ * Per pulsanti solo icona senza `label`, se omesso si usa `tooltip` come `aria-label`.
46
+ */
47
+ ariaLabel?: string;
43
48
  /**
44
49
  * Click handler. Supports both sync and async callbacks.
45
50
  * Receives the native MouseEvent as argument.
@@ -17,8 +17,8 @@ import * as i0 from "@angular/core";
17
17
  * <!-- Loading -->
18
18
  * <ui-button label="Submitting..." variant="primary" [loading]="true" />
19
19
  *
20
- * <!-- Icon-only -->
21
- * <ui-button icon="trash-2" variant="warn" ariaLabel="Delete item" (click)="delete()" />
20
+ * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->
21
+ * <ui-button icon="trash-2" variant="warn" tooltip="Elimina" (click)="delete()" />
22
22
  * ```
23
23
  */
24
24
  export declare class UiButtonComponent {
@@ -46,6 +46,12 @@ export declare class UiButtonComponent {
46
46
  ariaLabel?: string;
47
47
  /** Additional CSS class for edge cases. */
48
48
  customClass?: string;
49
+ /**
50
+ * Nome accessibile risolto per il pulsante nativo.
51
+ * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile
52
+ * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).
53
+ */
54
+ get effectiveAriaLabel(): string | undefined;
49
55
  /** Computed icon pixel size based on button size. */
50
56
  get iconSize(): number;
51
57
  /** Assembled CSS class string for the native button element. */
@@ -40,6 +40,11 @@ export interface UiButtonDescriptor {
40
40
  label: string;
41
41
  /** Tooltip text shown on hover. */
42
42
  tooltip?: string;
43
+ /**
44
+ * Nome accessibile esplicito (override).
45
+ * Per pulsanti solo icona senza `label`, se omesso si usa `tooltip` come `aria-label`.
46
+ */
47
+ ariaLabel?: string;
43
48
  /**
44
49
  * Click handler. Supports both sync and async callbacks.
45
50
  * Receives the native MouseEvent as argument.
@@ -17,8 +17,8 @@ import * as i0 from "@angular/core";
17
17
  * <!-- Loading -->
18
18
  * <ui-button label="Submitting..." variant="primary" [loading]="true" />
19
19
  *
20
- * <!-- Icon-only -->
21
- * <ui-button icon="trash-2" variant="warn" ariaLabel="Delete item" (click)="delete()" />
20
+ * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->
21
+ * <ui-button icon="trash-2" variant="warn" tooltip="Elimina" (click)="delete()" />
22
22
  * ```
23
23
  */
24
24
  export declare class UiButtonComponent {
@@ -46,6 +46,12 @@ export declare class UiButtonComponent {
46
46
  ariaLabel?: string;
47
47
  /** Additional CSS class for edge cases. */
48
48
  customClass?: string;
49
+ /**
50
+ * Nome accessibile risolto per il pulsante nativo.
51
+ * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile
52
+ * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).
53
+ */
54
+ get effectiveAriaLabel(): string | undefined;
49
55
  /** Computed icon pixel size based on button size. */
50
56
  get iconSize(): number;
51
57
  /** Assembled CSS class string for the native button element. */
@@ -40,6 +40,11 @@ export interface UiButtonDescriptor {
40
40
  label: string;
41
41
  /** Tooltip text shown on hover. */
42
42
  tooltip?: string;
43
+ /**
44
+ * Nome accessibile esplicito (override).
45
+ * Per pulsanti solo icona senza `label`, se omesso si usa `tooltip` come `aria-label`.
46
+ */
47
+ ariaLabel?: string;
43
48
  /**
44
49
  * Click handler. Supports both sync and async callbacks.
45
50
  * Receives the native MouseEvent as argument.
@@ -17,8 +17,8 @@ import * as i0 from "@angular/core";
17
17
  * <!-- Loading -->
18
18
  * <ui-button label="Submitting..." variant="primary" [loading]="true" />
19
19
  *
20
- * <!-- Icon-only -->
21
- * <ui-button icon="trash-2" variant="warn" ariaLabel="Delete item" (click)="delete()" />
20
+ * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->
21
+ * <ui-button icon="trash-2" variant="warn" tooltip="Elimina" (click)="delete()" />
22
22
  * ```
23
23
  */
24
24
  export declare class UiButtonComponent {
@@ -46,6 +46,12 @@ export declare class UiButtonComponent {
46
46
  ariaLabel?: string;
47
47
  /** Additional CSS class for edge cases. */
48
48
  customClass?: string;
49
+ /**
50
+ * Nome accessibile risolto per il pulsante nativo.
51
+ * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile
52
+ * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).
53
+ */
54
+ get effectiveAriaLabel(): string | undefined;
49
55
  /** Computed icon pixel size based on button size. */
50
56
  get iconSize(): number;
51
57
  /** Assembled CSS class string for the native button element. */
@@ -40,6 +40,11 @@ export interface UiButtonDescriptor {
40
40
  label: string;
41
41
  /** Tooltip text shown on hover. */
42
42
  tooltip?: string;
43
+ /**
44
+ * Nome accessibile esplicito (override).
45
+ * Per pulsanti solo icona senza `label`, se omesso si usa `tooltip` come `aria-label`.
46
+ */
47
+ ariaLabel?: string;
43
48
  /**
44
49
  * Click handler. Supports both sync and async callbacks.
45
50
  * Receives the native MouseEvent as argument.
@@ -2,11 +2,10 @@ import { EventEmitter } from '@angular/core';
2
2
  import { UiFormErrorDetail } from '../../types/validation.types';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
- * Componente per il riepilogo errori del form.
5
+ * Riepilogo stato validazione del form.
6
6
  *
7
- * Mostra un indicatore con il conteggio degli errori e un dropdown
8
- * con il dettaglio per campo. Click su un errore emette `fieldClick`
9
- * per consentire lo scroll-to-field con highlight nel form builder.
7
+ * Con errori: indicatore + dropdown hover/click per il dettaglio e navigazione ai campi.
8
+ * Senza errori: messaggio di stato positivo fisso (no dropdown), UI prevedibile.
10
9
  *
11
10
  * @selector ui-form-error-summary
12
11
  */
@@ -15,14 +14,18 @@ export declare class UiFormErrorSummaryComponent {
15
14
  errors: UiFormErrorDetail[];
16
15
  /** Conteggio totale degli errori (somma di tutti i messaggi). */
17
16
  totalErrorCount: number;
17
+ /** Testo mostrato quando non ci sono errori. */
18
+ validMessage: string;
18
19
  /** Emesso quando l'utente clicca su un errore per navigare al campo. */
19
20
  fieldClick: EventEmitter<string>;
20
- /** @internal Stato del dropdown. */
21
+ /** @internal Stato del dropdown (solo con errori). */
21
22
  showDropdown: boolean;
23
+ /** True se il form ha almeno un errore da mostrare nel summary. */
24
+ get hasErrors(): boolean;
22
25
  /** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */
23
26
  get displayCount(): number;
24
27
  /** @internal Gestione click su errore. */
25
28
  onFieldClick(fieldKey: string): void;
26
29
  static ɵfac: i0.ɵɵFactoryDeclaration<UiFormErrorSummaryComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<UiFormErrorSummaryComponent, "ui-form-error-summary", never, { "errors": { "alias": "errors"; "required": false; }; "totalErrorCount": { "alias": "totalErrorCount"; "required": false; }; }, { "fieldClick": "fieldClick"; }, never, never, true, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFormErrorSummaryComponent, "ui-form-error-summary", never, { "errors": { "alias": "errors"; "required": false; }; "totalErrorCount": { "alias": "totalErrorCount"; "required": false; }; "validMessage": { "alias": "validMessage"; "required": false; }; }, { "fieldClick": "fieldClick"; }, never, never, true, never>;
28
31
  }
@@ -147,8 +147,15 @@ export interface UiFormBuilderConfig {
147
147
  columns?: number;
148
148
  /** Mostra i pulsanti di azione (submit/reset). @default true */
149
149
  showButtons?: boolean;
150
- /** Nasconde l'intero footer (pulsanti + error summary). */
150
+ /** Nasconde solo l'area pulsanti del footer (`ui-button-area`), non il summary errori. */
151
151
  hideFooter?: boolean;
152
+ /**
153
+ * Nasconde del tutto il blocco `ui-form-error-summary`.
154
+ * Se assente/falsy il summary è visibile anche senza errori (stato ok prevedibile).
155
+ */
156
+ hideErrorSummary?: boolean;
157
+ /** Messaggio nel summary quando il form non ha errori (stato ok). */
158
+ errorSummaryValidMessage?: string;
152
159
  /** Label personalizzate per i pulsanti. */
153
160
  buttonLabels?: {
154
161
  submit?: string;
@@ -168,7 +175,7 @@ export interface UiFormBuilderConfig {
168
175
  * showProgress: true,
169
176
  * progressStyle: 'steps',
170
177
  * allowBackNavigation: true,
171
- * buttonLabels: { next: 'Avanti', previous: 'Indietro', finish: 'Completa' },
178
+ * buttonLabels: { submit: 'Salva e prosegui', previous: 'Indietro', finish: 'Completa' },
172
179
  * };
173
180
  * ```
174
181
  */
@@ -193,10 +200,21 @@ export interface UiWizardConfig {
193
200
  showNavigationButtons?: boolean;
194
201
  /** Posizione dei pulsanti di navigazione. @default 'bottom' */
195
202
  navigationPosition?: 'top' | 'bottom' | 'both';
203
+ /**
204
+ * Consente di saltare a uno step già completato cliccando bullet o titolo step
205
+ * quando `progressStyle` è `'steps'`. @default true
206
+ */
207
+ allowStepIndicatorNavigation?: boolean;
196
208
  /** Label personalizzate per i pulsanti del wizard. */
197
209
  buttonLabels?: {
198
210
  previous?: string;
211
+ /** Label pulsante avanti; se assente si usa `submit`. */
199
212
  next?: string;
213
+ /**
214
+ * Alias di convenienza (come `submit` sul form builder) per il pulsante «avanti» / salva e prosegui.
215
+ * Usato solo se `next` non è valorizzato.
216
+ */
217
+ submit?: string;
200
218
  finish?: string;
201
219
  save?: string;
202
220
  };
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, Input, inject, ViewEncapsulation, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, Input, inject, signal, ViewEncapsulation, } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
4
4
  import { debounceTime, filter } from 'rxjs/operators';
@@ -14,6 +14,14 @@ import * as i0 from "@angular/core";
14
14
  * Optionally renders an automatic "back" button in the footer, derived from
15
15
  * the breadcrumb trail (navigates to the parent breadcrumb).
16
16
  *
17
+ * ### Route `data`
18
+ *
19
+ * Sulla rotta attiva (foglia) puoi impostare:
20
+ *
21
+ * - `breadcrumbOff: true` — nasconde `ui-page-header`
22
+ * - `footerNavOff: true` — nasconde `ui-base-layout__footer`
23
+ * - `id: string` — valorizza `data-route-id` sul contenitore `.ui-base-layout`
24
+ *
17
25
  * @selector ui-base-layout
18
26
  *
19
27
  * @example
@@ -65,6 +73,19 @@ export class UiBaseLayoutComponent {
65
73
  this.activatedRoute = inject(ActivatedRoute);
66
74
  this.breadcrumbService = inject(UiBreadcrumbService);
67
75
  this.destroyRef = inject(DestroyRef);
76
+ /**
77
+ * Flag derivati dalla catena attiva (`breadcrumbOff`, `footerNavOff`, `id`).
78
+ * Aggiornati a ogni `NavigationEnd`.
79
+ */
80
+ this.routeSnapshotFlags = signal({
81
+ breadcrumbOff: false,
82
+ footerNavOff: false,
83
+ routeId: null,
84
+ });
85
+ /** Header visibile se abilitato da input e non disattivato da `data.breadcrumbOff`. */
86
+ this.effectiveShowHeader = () => this.showHeader && !this.routeSnapshotFlags().breadcrumbOff;
87
+ /** Footer azioni visibile se ci sono azioni visibili e non disattivato da `data.footerNavOff`. */
88
+ this.effectiveShowFooterNav = () => !this.routeSnapshotFlags().footerNavOff && this.hasVisibleActions;
68
89
  }
69
90
  /**
70
91
  * Merged action list (back button + consumer actions).
@@ -92,25 +113,59 @@ export class UiBaseLayoutComponent {
92
113
  return this.mergedActions.some((a) => !a.hidden);
93
114
  }
94
115
  ngOnInit() {
95
- this.refreshBreadcrumbs();
116
+ this.syncFromActivatedRoute();
96
117
  this.router.events
97
118
  .pipe(filter((event) => event instanceof NavigationEnd), debounceTime(50), takeUntilDestroyed(this.destroyRef))
98
- .subscribe(() => this.refreshBreadcrumbs());
119
+ .subscribe(() => this.syncFromActivatedRoute());
99
120
  }
100
- /** @internal Aggiorna lo stato dei breadcrumb nel service dalla rotta corrente. */
101
- refreshBreadcrumbs() {
121
+ /** @internal Allinea breadcrumb service e flag layout alla rotta corrente. */
122
+ syncFromActivatedRoute() {
123
+ this.refreshRouteSnapshotFlags();
102
124
  this.breadcrumbService.getBreadcrumbsForRoute(this.activatedRoute);
103
125
  }
126
+ /** @internal Legge `breadcrumbOff`, `footerNavOff`, `id` dalla catena `pathFromRoot` / foglia. */
127
+ refreshRouteSnapshotFlags() {
128
+ const deepest = this.deepestChildRoute(this.activatedRoute);
129
+ let breadcrumbOff = false;
130
+ let footerNavOff = false;
131
+ for (const seg of deepest.pathFromRoot) {
132
+ const d = seg.snapshot.data;
133
+ if (!d)
134
+ continue;
135
+ // biome-ignore lint/complexity/useLiteralKeys: chiavi documentate in UiBaseLayoutRouteData
136
+ if (d['breadcrumbOff'] === true)
137
+ breadcrumbOff = true;
138
+ // biome-ignore lint/complexity/useLiteralKeys: chiavi documentate in UiBaseLayoutRouteData
139
+ if (d['footerNavOff'] === true)
140
+ footerNavOff = true;
141
+ }
142
+ let routeId = null;
143
+ let cursor = deepest;
144
+ while (cursor) {
145
+ const raw = cursor.snapshot.data?.['id'];
146
+ if (typeof raw === 'string' && raw.length > 0) {
147
+ routeId = raw;
148
+ break;
149
+ }
150
+ cursor = cursor.parent;
151
+ }
152
+ this.routeSnapshotFlags.set({ breadcrumbOff, footerNavOff, routeId });
153
+ }
154
+ /** @internal Percorre fino al `ActivatedRoute` foglia sotto il punto di iniezione. */
155
+ deepestChildRoute(route) {
156
+ let deepest = route;
157
+ while (deepest.firstChild) {
158
+ deepest = deepest.firstChild;
159
+ }
160
+ return deepest;
161
+ }
104
162
  /** @internal Determina se il back button deve essere nascosto per la rotta corrente. */
105
163
  shouldHideBackButton() {
106
164
  const currentPath = this.router.url.split('?')[0].split('#')[0];
107
165
  if (currentPath === this.homeRoute) {
108
166
  return true;
109
167
  }
110
- let deepestRoute = this.activatedRoute;
111
- while (deepestRoute.firstChild) {
112
- deepestRoute = deepestRoute.firstChild;
113
- }
168
+ const deepestRoute = this.deepestChildRoute(this.activatedRoute);
114
169
  // biome-ignore lint/complexity/useLiteralKeys: <explanation>
115
170
  if (deepestRoute.snapshot.data?.['hideBackButton'] === true) {
116
171
  return true;
@@ -123,8 +178,8 @@ export class UiBaseLayoutComponent {
123
178
  }
124
179
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBaseLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
125
180
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiBaseLayoutComponent, isStandalone: true, selector: "ui-base-layout", inputs: { showHeader: "showHeader", title: "title", homeRoute: "homeRoute", showHome: "showHome", updateDocumentTitle: "updateDocumentTitle", titleSuffix: "titleSuffix", showBackButton: "showBackButton", backButtonConfig: "backButtonConfig", actions: "actions", footerAlign: "footerAlign", footerGap: "footerGap" }, host: { classAttribute: "ui-base-layout-host" }, ngImport: i0, template: `
126
- <div class="ui-base-layout">
127
- @if (showHeader) {
181
+ <div class="ui-base-layout" [attr.data-route-id]="routeSnapshotFlags().routeId">
182
+ @if (effectiveShowHeader()) {
128
183
  <ui-page-header
129
184
  [title]="title"
130
185
  [homeRoute]="homeRoute"
@@ -138,7 +193,7 @@ export class UiBaseLayoutComponent {
138
193
  <ng-content />
139
194
  </main>
140
195
 
141
- @if (hasVisibleActions) {
196
+ @if (effectiveShowFooterNav()) {
142
197
  <aside
143
198
  class="ui-base-layout__footer"
144
199
  aria-label="Page actions"
@@ -160,8 +215,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
160
215
  args: [{ selector: 'ui-base-layout', standalone: true, imports: [UiPageHeaderComponent, UiButtonAreaComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
161
216
  class: 'ui-base-layout-host',
162
217
  }, template: `
163
- <div class="ui-base-layout">
164
- @if (showHeader) {
218
+ <div class="ui-base-layout" [attr.data-route-id]="routeSnapshotFlags().routeId">
219
+ @if (effectiveShowHeader()) {
165
220
  <ui-page-header
166
221
  [title]="title"
167
222
  [homeRoute]="homeRoute"
@@ -175,7 +230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
175
230
  <ng-content />
176
231
  </main>
177
232
 
178
- @if (hasVisibleActions) {
233
+ @if (effectiveShowFooterNav()) {
179
234
  <aside
180
235
  class="ui-base-layout__footer"
181
236
  aria-label="Page actions"
@@ -214,4 +269,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
214
269
  }], footerGap: [{
215
270
  type: Input
216
271
  }] } });
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxheW91dC9iYXNlLWxheW91dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBRzdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUE0Q0gsTUFBTSxPQUFPLHFCQUFxQjtJQTNDbEM7UUE0Q0UsZ0VBQWdFO1FBQ3ZELGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0IsaUZBQWlGO1FBQ3hFLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFcEIsK0NBQStDO1FBQ3RDLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFFekIsZ0VBQWdFO1FBQ3ZELGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekIsMkRBQTJEO1FBQ2xELHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUVyQywyQ0FBMkM7UUFDbEMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7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O1FBQzdELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG9GQUFvRjtJQUM1RSxZQUFZO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7K0dBL0dVLHFCQUFxQjttR0FBckIscUJBQXFCLHViQWxDdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQlQscWxCQXJDUyxxQkFBcUIsNklBQUUscUJBQXFCOzs0RkF3QzNDLHFCQUFxQjtrQkEzQ2pDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsbUJBQ3RDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLHFCQUFxQjtxQkFDN0IsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVDs4QkFLUSxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIERlc3Ryb3lSZWYsXHJcbiAgSW5wdXQsXHJcbiAgaW5qZWN0LFxyXG4gIHR5cGUgT25Jbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcblxyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB0eXBlIHsgVWlCdXR0b25BcmVhQWxpZ24sIFVpQnV0dG9uRGVzY3JpcHRvciB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkFyZWFDb21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLWFyZWEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlCcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4uL3BhZ2UtaGVhZGVyL2JyZWFkY3J1bWIuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpUGFnZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB0eXBlIHsgVWlCYWNrQnV0dG9uQ29uZmlnIH0gZnJvbSAnLi9iYXNlLWxheW91dC50eXBlcyc7XHJcblxyXG4vKipcclxuICogRnVsbC1wYWdlIGxheW91dCBjb21wb25lbnQgdGhhdCBjb21iaW5lcyBhIHBhZ2UgaGVhZGVyIChicmVhZGNydW1icyArIHRpdGxlKSxcclxuICogYSBtYWluIGNvbnRlbnQgYXJlYSB2aWEgYDxuZy1jb250ZW50PmAsIGFuZCBhIHN0aWNreSBmb290ZXIgYWN0aW9uIGJhclxyXG4gKiBwb3dlcmVkIGJ5IGBVaUJ1dHRvbkFyZWFDb21wb25lbnRgLlxyXG4gKlxyXG4gKiBPcHRpb25hbGx5IHJlbmRlcnMgYW4gYXV0b21hdGljIFwiYmFja1wiIGJ1dHRvbiBpbiB0aGUgZm9vdGVyLCBkZXJpdmVkIGZyb21cclxuICogdGhlIGJyZWFkY3J1bWIgdHJhaWwgKG5hdmlnYXRlcyB0byB0aGUgcGFyZW50IGJyZWFkY3J1bWIpLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktYmFzZS1sYXlvdXRcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktYmFzZS1sYXlvdXQgW2FjdGlvbnNdPVwicGFnZUFjdGlvbnNcIiBmb290ZXJBbGlnbj1cImVuZFwiPlxyXG4gKiAgIDxwPllvdXIgcGFnZSBjb250ZW50IGhlcmU8L3A+XHJcbiAqIDwvdWktYmFzZS1sYXlvdXQ+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDwhLS0gV2l0aCBiYWNrIGJ1dHRvbiBhbmQgY3VzdG9tIHRpdGxlIC0tPlxyXG4gKiA8dWktYmFzZS1sYXlvdXRcclxuICogICB0aXRsZT1cIkRldHRhZ2xpbyB1dGVudGVcIlxyXG4gKiAgIFtzaG93QmFja0J1dHRvbl09XCJ0cnVlXCJcclxuICogICBbYWN0aW9uc109XCJbXHJcbiAqICAgICB7IGlkOiAnc2F2ZScsIGxhYmVsOiAnU2FsdmEnLCB2YXJpYW50OiAncHJpbWFyeScsIGljb246ICdzYXZlJywgYWN0aW9uOiBzYXZlIH0sXHJcbiAqICAgXVwiXHJcbiAqID5cclxuICogICA8YXBwLXVzZXItZGV0YWlsIC8+XHJcbiAqIDwvdWktYmFzZS1sYXlvdXQ+XHJcbiAqIGBgYFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1iYXNlLWxheW91dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVWlQYWdlSGVhZGVyQ29tcG9uZW50LCBVaUJ1dHRvbkFyZWFDb21wb25lbnRdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6ICd1aS1iYXNlLWxheW91dC1ob3N0JyxcclxuICB9LFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidWktYmFzZS1sYXlvdXRcIj5cclxuICAgICAgQGlmIChzaG93SGVhZGVyKSB7XHJcbiAgICAgICAgPHVpLXBhZ2UtaGVhZGVyXHJcbiAgICAgICAgICBbdGl0bGVdPVwidGl0bGVcIlxyXG4gICAgICAgICAgW2hvbWVSb3V0ZV09XCJob21lUm91dGVcIlxyXG4gICAgICAgICAgW3Nob3dIb21lXT1cInNob3dIb21lXCJcclxuICAgICAgICAgIFt1cGRhdGVEb2N1bWVudFRpdGxlXT1cInVwZGF0ZURvY3VtZW50VGl0bGVcIlxyXG4gICAgICAgICAgW3RpdGxlU3VmZml4XT1cInRpdGxlU3VmZml4XCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8bWFpbiBjbGFzcz1cInVpLWJhc2UtbGF5b3V0X19jb250ZW50XCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgLz5cclxuICAgICAgPC9tYWluPlxyXG5cclxuICAgICAgQGlmIChoYXNWaXNpYmxlQWN0aW9ucykge1xyXG4gICAgICAgIDxhc2lkZVxyXG4gICAgICAgICAgY2xhc3M9XCJ1aS1iYXNlLWxheW91dF9fZm9vdGVyXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJQYWdlIGFjdGlvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx1aS1idXR0b24tYXJlYVxyXG4gICAgICAgICAgICBbYnV0dG9uc109XCJtZXJnZWRBY3Rpb25zXCJcclxuICAgICAgICAgICAgW2FsaWduXT1cImZvb3RlckFsaWduXCJcclxuICAgICAgICAgICAgW2dhcF09XCJmb290ZXJHYXBcIlxyXG4gICAgICAgICAgICBbc3RhY2tPbk1vYmlsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgYXJpYUxhYmVsPVwiUGFnZSBhY3Rpb25zXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9hc2lkZT5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZVVybDogJy4vYmFzZS1sYXlvdXQuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlCYXNlTGF5b3V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvKiogV2hldGhlciB0byBkaXNwbGF5IHRoZSBwYWdlIGhlYWRlciAoYnJlYWRjcnVtYnMgKyB0aXRsZSkuICovXHJcbiAgQElucHV0KCkgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gIC8qKiBPdmVycmlkZSB0aGUgYXV0by1kZXRlY3RlZCBwYWdlIHRpdGxlLiBQYXNzZWQgdGhyb3VnaCB0byBgdWktcGFnZS1oZWFkZXJgLiAqL1xyXG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XHJcblxyXG4gIC8qKiBSb3V0ZSBwYXRoIGZvciB0aGUgSG9tZSBicmVhZGNydW1iIGxpbmsuICovXHJcbiAgQElucHV0KCkgaG9tZVJvdXRlID0gJy8nO1xyXG5cclxuICAvKiogV2hldGhlciB0byBkaXNwbGF5IHRoZSBIb21lIGxpbmsgaW4gdGhlIGJyZWFkY3J1bWIgdHJhaWwuICovXHJcbiAgQElucHV0KCkgc2hvd0hvbWUgPSB0cnVlO1xyXG5cclxuICAvKiogV2hlbiBgdHJ1ZWAsIHVwZGF0ZXMgYGRvY3VtZW50LnRpdGxlYCBvbiBuYXZpZ2F0aW9uLiAqL1xyXG4gIEBJbnB1dCgpIHVwZGF0ZURvY3VtZW50VGl0bGUgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN1ZmZpeCBhcHBlbmRlZCB0byBgZG9jdW1lbnQudGl0bGVgLiAqL1xyXG4gIEBJbnB1dCgpIHRpdGxlU3VmZml4ID0gJyc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgYW4gYXV0b21hdGljIFwiYmFja1wiIGJ1dHRvbiBiYXNlZCBvbiBicmVhZGNydW1icy4gKi9cclxuICBASW5wdXQoKSBzaG93QmFja0J1dHRvbiA9IHRydWU7XHJcblxyXG4gIC8qKiBDb25maWd1cmF0aW9uIG92ZXJyaWRlcyBmb3IgdGhlIGF1dG9tYXRpYyBiYWNrIGJ1dHRvbi4gKi9cclxuICBASW5wdXQoKSBiYWNrQnV0dG9uQ29uZmlnOiBVaUJhY2tCdXR0b25Db25maWcgPSB7fTtcclxuXHJcbiAgLyoqIEFycmF5IG9mIGJ1dHRvbiBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvb3RlciBhY3Rpb24gYXJlYS4gKi9cclxuICBASW5wdXQoKSBhY3Rpb25zOiBVaUJ1dHRvbkRlc2NyaXB0b3JbXSA9IFtdO1xyXG5cclxuICAvKiogSG9yaXpvbnRhbCBhbGlnbm1lbnQgb2YgdGhlIGZvb3RlciBidXR0b24gYXJlYS4gKi9cclxuICBASW5wdXQoKSBmb290ZXJBbGlnbjogVWlCdXR0b25BcmVhQWxpZ24gPSAnc3RhcnQnO1xyXG5cclxuICAvKiogR2FwIHNpemUgYmV0d2VlbiBmb290ZXIgYnV0dG9ucy4gKi9cclxuICBASW5wdXQoKSBmb290ZXJHYXA6ICd4cycgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnID0gJ3NtJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBicmVhZGNydW1iU2VydmljZSA9IGluamVjdChVaUJyZWFkY3J1bWJTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogTWVyZ2VkIGFjdGlvbiBsaXN0IChiYWNrIGJ1dHRvbiArIGNvbnN1bWVyIGFjdGlvbnMpLlxyXG4gICAqIENvbXB1dGVkIG9uIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gY2hlY2sgc28gaXQgc3RheXMgaW4gc3luY1xyXG4gICAqIHdpdGggYm90aCBuYXZpZ2F0aW9uIHN0YXRlIChicmVhZGNydW1icykgYW5kIGlucHV0IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgZ2V0IG1lcmdlZEFjdGlvbnMoKTogVWlCdXR0b25EZXNjcmlwdG9yW10ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBVaUJ1dHRvbkRlc2NyaXB0b3JbXSA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnNob3dCYWNrQnV0dG9uKSB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICBpZDogJ19fdWktYmFjaycsXHJcbiAgICAgICAgbGFiZWw6IHRoaXMuYmFja0J1dHRvbkNvbmZpZy5sYWJlbCA/PyAnSW5kaWV0cm8nLFxyXG4gICAgICAgIGljb246ICh0aGlzLmJhY2tCdXR0b25Db25maWcuaWNvbiBhcyBhbnkpID8/ICdhcnJvdy1sZWZ0JyxcclxuICAgICAgICBpY29uUG9zaXRpb246ICdsZWFkaW5nJyxcclxuICAgICAgICB2YXJpYW50OiAodGhpcy5iYWNrQnV0dG9uQ29uZmlnLnZhcmlhbnQgYXMgYW55KSA/PyAnb3V0bGluZScsXHJcbiAgICAgICAgaGlkZGVuOiB0aGlzLnNob3VsZEhpZGVCYWNrQnV0dG9uKCksXHJcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm5hdmlnYXRlQmFjaygpLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHQucHVzaCguLi50aGlzLmFjdGlvbnMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBmb290ZXIgc2hvdWxkIHJlbmRlciAoYXQgbGVhc3Qgb25lIG5vbi1oaWRkZW4gYWN0aW9uIGV4aXN0cykuICovXHJcbiAgZ2V0IGhhc1Zpc2libGVBY3Rpb25zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQWN0aW9ucy5zb21lKChhKSA9PiAhYS5oaWRkZW4pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hCcmVhZGNydW1icygpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSg1MCksXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2hCcmVhZGNydW1icygpKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgQWdnaW9ybmEgbG8gc3RhdG8gZGVpIGJyZWFkY3J1bWIgbmVsIHNlcnZpY2UgZGFsbGEgcm90dGEgY29ycmVudGUuICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoQnJlYWRjcnVtYnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmdldEJyZWFkY3J1bWJzRm9yUm91dGUodGhpcy5hY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIERldGVybWluYSBzZSBpbCBiYWNrIGJ1dHRvbiBkZXZlIGVzc2VyZSBuYXNjb3N0byBwZXIgbGEgcm90dGEgY29ycmVudGUuICovXHJcbiAgcHJpdmF0ZSBzaG91bGRIaWRlQmFja0J1dHRvbigpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcclxuICAgIGlmIChjdXJyZW50UGF0aCA9PT0gdGhpcy5ob21lUm91dGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRlZXBlc3RSb3V0ZSA9IHRoaXMuYWN0aXZhdGVkUm91dGU7XHJcbiAgICB3aGlsZSAoZGVlcGVzdFJvdXRlLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgZGVlcGVzdFJvdXRlID0gZGVlcGVzdFJvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VMaXRlcmFsS2V5czogPGV4cGxhbmF0aW9uPlxyXG4gICAgaWYgKGRlZXBlc3RSb3V0ZS5zbmFwc2hvdC5kYXRhPy5bJ2hpZGVCYWNrQnV0dG9uJ10gPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBOYXZpZ2EgYWwgYnJlYWRjcnVtYiBnZW5pdG9yZSBvIGVzZWd1ZSBpbCBmYWxsYmFjayBhbGxhIGhvbWUgcm91dGUuICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZUJhY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLm5hdmlnYXRlQmFjayh0aGlzLmhvbWVSb3V0ZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxheW91dC9iYXNlLWxheW91dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUVOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQVU3RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUE0Q0gsTUFBTSxPQUFPLHFCQUFxQjtJQTNDbEM7UUE0Q0UsZ0VBQWdFO1FBQ3ZELGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0IsaUZBQWlGO1FBQ3hFLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFcEIsK0NBQStDO1FBQ3RDLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFFekIsZ0VBQWdFO1FBQ3ZELGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekIsMkRBQTJEO1FBQ2xELHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUVyQywyQ0FBMkM7UUFDbEMsZ0JB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RUFBRSxxQkFBcUIsQ0FBQyxtQkFDdEMsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUscUJBQXFCO3FCQUM3QixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUOzhCQUtRLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRGVzdHJveVJlZixcclxuICBJbnB1dCxcclxuICBpbmplY3QsXHJcbiAgc2lnbmFsLFxyXG4gIHR5cGUgT25Jbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcblxyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB0eXBlIHsgVWlCdXR0b25BcmVhQWxpZ24sIFVpQnV0dG9uRGVzY3JpcHRvciB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkFyZWFDb21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLWFyZWEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlCcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4uL3BhZ2UtaGVhZGVyL2JyZWFkY3J1bWIuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpUGFnZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB0eXBlIHsgVWlCYWNrQnV0dG9uQ29uZmlnIH0gZnJvbSAnLi9iYXNlLWxheW91dC50eXBlcyc7XHJcblxyXG4vKiogU3RhdG8gbGV0dG8gZGFsbGEgcm90dGEgZm9nbGlhIHBlciBoZWFkZXIvZm9vdGVyIG9wemlvbmFsaSBlIGBkYXRhLXJvdXRlLWlkYC4gKi9cclxuaW50ZXJmYWNlIFVpQmFzZUxheW91dFJvdXRlU25hcHNob3RGbGFncyB7XHJcbiAgYnJlYWRjcnVtYk9mZjogYm9vbGVhbjtcclxuICBmb290ZXJOYXZPZmY6IGJvb2xlYW47XHJcbiAgcm91dGVJZDogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZ1bGwtcGFnZSBsYXlvdXQgY29tcG9uZW50IHRoYXQgY29tYmluZXMgYSBwYWdlIGhlYWRlciAoYnJlYWRjcnVtYnMgKyB0aXRsZSksXHJcbiAqIGEgbWFpbiBjb250ZW50IGFyZWEgdmlhIGA8bmctY29udGVudD5gLCBhbmQgYSBzdGlja3kgZm9vdGVyIGFjdGlvbiBiYXJcclxuICogcG93ZXJlZCBieSBgVWlCdXR0b25BcmVhQ29tcG9uZW50YC5cclxuICpcclxuICogT3B0aW9uYWxseSByZW5kZXJzIGFuIGF1dG9tYXRpYyBcImJhY2tcIiBidXR0b24gaW4gdGhlIGZvb3RlciwgZGVyaXZlZCBmcm9tXHJcbiAqIHRoZSBicmVhZGNydW1iIHRyYWlsIChuYXZpZ2F0ZXMgdG8gdGhlIHBhcmVudCBicmVhZGNydW1iKS5cclxuICpcclxuICogIyMjIFJvdXRlIGBkYXRhYFxyXG4gKlxyXG4gKiBTdWxsYSByb3R0YSBhdHRpdmEgKGZvZ2xpYSkgcHVvaSBpbXBvc3RhcmU6XHJcbiAqXHJcbiAqIC0gYGJyZWFkY3J1bWJPZmY6IHRydWVgIOKAlCBuYXNjb25kZSBgdWktcGFnZS1oZWFkZXJgXHJcbiAqIC0gYGZvb3Rlck5hdk9mZjogdHJ1ZWAg4oCUIG5hc2NvbmRlIGB1aS1iYXNlLWxheW91dF9fZm9vdGVyYFxyXG4gKiAtIGBpZDogc3RyaW5nYCDigJQgdmFsb3JpenphIGBkYXRhLXJvdXRlLWlkYCBzdWwgY29udGVuaXRvcmUgYC51aS1iYXNlLWxheW91dGBcclxuICpcclxuICogQHNlbGVjdG9yIHVpLWJhc2UtbGF5b3V0XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHVpLWJhc2UtbGF5b3V0IFthY3Rpb25zXT1cInBhZ2VBY3Rpb25zXCIgZm9vdGVyQWxpZ249XCJlbmRcIj5cclxuICogICA8cD5Zb3VyIHBhZ2UgY29udGVudCBoZXJlPC9wPlxyXG4gKiA8L3VpLWJhc2UtbGF5b3V0PlxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8IS0tIFdpdGggYmFjayBidXR0b24gYW5kIGN1c3RvbSB0aXRsZSAtLT5cclxuICogPHVpLWJhc2UtbGF5b3V0XHJcbiAqICAgdGl0bGU9XCJEZXR0YWdsaW8gdXRlbnRlXCJcclxuICogICBbc2hvd0JhY2tCdXR0b25dPVwidHJ1ZVwiXHJcbiAqICAgW2FjdGlvbnNdPVwiW1xyXG4gKiAgICAgeyBpZDogJ3NhdmUnLCBsYWJlbDogJ1NhbHZhJywgdmFyaWFudDogJ3ByaW1hcnknLCBpY29uOiAnc2F2ZScsIGFjdGlvbjogc2F2ZSB9LFxyXG4gKiAgIF1cIlxyXG4gKiA+XHJcbiAqICAgPGFwcC11c2VyLWRldGFpbCAvPlxyXG4gKiA8L3VpLWJhc2UtbGF5b3V0PlxyXG4gKiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktYmFzZS1sYXlvdXQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1VpUGFnZUhlYWRlckNvbXBvbmVudCwgVWlCdXR0b25BcmVhQ29tcG9uZW50XSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAndWktYmFzZS1sYXlvdXQtaG9zdCcsXHJcbiAgfSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWJhc2UtbGF5b3V0XCIgW2F0dHIuZGF0YS1yb3V0ZS1pZF09XCJyb3V0ZVNuYXBzaG90RmxhZ3MoKS5yb3V0ZUlkXCI+XHJcbiAgICAgIEBpZiAoZWZmZWN0aXZlU2hvd0hlYWRlcigpKSB7XHJcbiAgICAgICAgPHVpLXBhZ2UtaGVhZGVyXHJcbiAgICAgICAgICBbdGl0bGVdPVwidGl0bGVcIlxyXG4gICAgICAgICAgW2hvbWVSb3V0ZV09XCJob21lUm91dGVcIlxyXG4gICAgICAgICAgW3Nob3dIb21lXT1cInNob3dIb21lXCJcclxuICAgICAgICAgIFt1cGRhdGVEb2N1bWVudFRpdGxlXT1cInVwZGF0ZURvY3VtZW50VGl0bGVcIlxyXG4gICAgICAgICAgW3RpdGxlU3VmZml4XT1cInRpdGxlU3VmZml4XCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8bWFpbiBjbGFzcz1cInVpLWJhc2UtbGF5b3V0X19jb250ZW50XCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgLz5cclxuICAgICAgPC9tYWluPlxyXG5cclxuICAgICAgQGlmIChlZmZlY3RpdmVTaG93Rm9vdGVyTmF2KCkpIHtcclxuICAgICAgICA8YXNpZGVcclxuICAgICAgICAgIGNsYXNzPVwidWktYmFzZS1sYXlvdXRfX2Zvb3RlclwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFnZSBhY3Rpb25zXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dWktYnV0dG9uLWFyZWFcclxuICAgICAgICAgICAgW2J1dHRvbnNdPVwibWVyZ2VkQWN0aW9uc1wiXHJcbiAgICAgICAgICAgIFthbGlnbl09XCJmb290ZXJBbGlnblwiXHJcbiAgICAgICAgICAgIFtnYXBdPVwiZm9vdGVyR2FwXCJcclxuICAgICAgICAgICAgW3N0YWNrT25Nb2JpbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIGFyaWFMYWJlbD1cIlBhZ2UgYWN0aW9uc1wiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvYXNpZGU+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Jhc2UtbGF5b3V0LmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpQmFzZUxheW91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLyoqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgcGFnZSBoZWFkZXIgKGJyZWFkY3J1bWJzICsgdGl0bGUpLiAqL1xyXG4gIEBJbnB1dCgpIHNob3dIZWFkZXIgPSB0cnVlO1xyXG5cclxuICAvKiogT3ZlcnJpZGUgdGhlIGF1dG8tZGV0ZWN0ZWQgcGFnZSB0aXRsZS4gUGFzc2VkIHRocm91Z2ggdG8gYHVpLXBhZ2UtaGVhZGVyYC4gKi9cclxuICBASW5wdXQoKSB0aXRsZSA9ICcnO1xyXG5cclxuICAvKiogUm91dGUgcGF0aCBmb3IgdGhlIEhvbWUgYnJlYWRjcnVtYiBsaW5rLiAqL1xyXG4gIEBJbnB1dCgpIGhvbWVSb3V0ZSA9ICcvJztcclxuXHJcbiAgLyoqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgSG9tZSBsaW5rIGluIHRoZSBicmVhZGNydW1iIHRyYWlsLiAqL1xyXG4gIEBJbnB1dCgpIHNob3dIb21lID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFdoZW4gYHRydWVgLCB1cGRhdGVzIGBkb2N1bWVudC50aXRsZWAgb24gbmF2aWdhdGlvbi4gKi9cclxuICBASW5wdXQoKSB1cGRhdGVEb2N1bWVudFRpdGxlID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdWZmaXggYXBwZW5kZWQgdG8gYGRvY3VtZW50LnRpdGxlYC4gKi9cclxuICBASW5wdXQoKSB0aXRsZVN1ZmZpeCA9ICcnO1xyXG5cclxuICAvKiogV2hldGhlciB0byBzaG93IGFuIGF1dG9tYXRpYyBcImJhY2tcIiBidXR0b24gYmFzZWQgb24gYnJlYWRjcnVtYnMuICovXHJcbiAgQElucHV0KCkgc2hvd0JhY2tCdXR0b24gPSB0cnVlO1xyXG5cclxuICAvKiogQ29uZmlndXJhdGlvbiBvdmVycmlkZXMgZm9yIHRoZSBhdXRvbWF0aWMgYmFjayBidXR0b24uICovXHJcbiAgQElucHV0KCkgYmFja0J1dHRvbkNvbmZpZzogVWlCYWNrQnV0dG9uQ29uZmlnID0ge307XHJcblxyXG4gIC8qKiBBcnJheSBvZiBidXR0b24gZGVzY3JpcHRvcnMgZm9yIHRoZSBmb290ZXIgYWN0aW9uIGFyZWEuICovXHJcbiAgQElucHV0KCkgYWN0aW9uczogVWlCdXR0b25EZXNjcmlwdG9yW10gPSBbXTtcclxuXHJcbiAgLyoqIEhvcml6b250YWwgYWxpZ25tZW50IG9mIHRoZSBmb290ZXIgYnV0dG9uIGFyZWEuICovXHJcbiAgQElucHV0KCkgZm9vdGVyQWxpZ246IFVpQnV0dG9uQXJlYUFsaWduID0gJ3N0YXJ0JztcclxuXHJcbiAgLyoqIEdhcCBzaXplIGJldHdlZW4gZm9vdGVyIGJ1dHRvbnMuICovXHJcbiAgQElucHV0KCkgZm9vdGVyR2FwOiAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJyA9ICdzbSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYnJlYWRjcnVtYlNlcnZpY2UgPSBpbmplY3QoVWlCcmVhZGNydW1iU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG5cclxuICAvKipcclxuICAgKiBGbGFnIGRlcml2YXRpIGRhbGxhIGNhdGVuYSBhdHRpdmEgKGBicmVhZGNydW1iT2ZmYCwgYGZvb3Rlck5hdk9mZmAsIGBpZGApLlxyXG4gICAqIEFnZ2lvcm5hdGkgYSBvZ25pIGBOYXZpZ2F0aW9uRW5kYC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVTbmFwc2hvdEZsYWdzID0gc2lnbmFsPFVpQmFzZUxheW91dFJvdXRlU25hcHNob3RGbGFncz4oe1xyXG4gICAgYnJlYWRjcnVtYk9mZjogZmFsc2UsXHJcbiAgICBmb290ZXJOYXZPZmY6IGZhbHNlLFxyXG4gICAgcm91dGVJZDogbnVsbCxcclxuICB9KTtcclxuXHJcbiAgLyoqIEhlYWRlciB2aXNpYmlsZSBzZSBhYmlsaXRhdG8gZGEgaW5wdXQgZSBub24gZGlzYXR0aXZhdG8gZGEgYGRhdGEuYnJlYWRjcnVtYk9mZmAuICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVmZmVjdGl2ZVNob3dIZWFkZXIgPSAoKSA9PlxyXG4gICAgdGhpcy5zaG93SGVhZGVyICYmICF0aGlzLnJvdXRlU25hcHNob3RGbGFncygpLmJyZWFkY3J1bWJPZmY7XHJcblxyXG4gIC8qKiBGb290ZXIgYXppb25pIHZpc2liaWxlIHNlIGNpIHNvbm8gYXppb25pIHZpc2liaWxpIGUgbm9uIGRpc2F0dGl2YXRvIGRhIGBkYXRhLmZvb3Rlck5hdk9mZmAuICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVmZmVjdGl2ZVNob3dGb290ZXJOYXYgPSAoKSA9PlxyXG4gICAgIXRoaXMucm91dGVTbmFwc2hvdEZsYWdzKCkuZm9vdGVyTmF2T2ZmICYmIHRoaXMuaGFzVmlzaWJsZUFjdGlvbnM7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlZCBhY3Rpb24gbGlzdCAoYmFjayBidXR0b24gKyBjb25zdW1lciBhY3Rpb25zKS5cclxuICAgKiBDb21wdXRlZCBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIGNoZWNrIHNvIGl0IHN0YXlzIGluIHN5bmNcclxuICAgKiB3aXRoIGJvdGggbmF2aWdhdGlvbiBzdGF0ZSAoYnJlYWRjcnVtYnMpIGFuZCBpbnB1dCBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIGdldCBtZXJnZWRBY3Rpb25zKCk6IFVpQnV0dG9uRGVzY3JpcHRvcltdIHtcclxuICAgIGNvbnN0IHJlc3VsdDogVWlCdXR0b25EZXNjcmlwdG9yW10gPSBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93QmFja0J1dHRvbikge1xyXG4gICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgaWQ6ICdfX3VpLWJhY2snLFxyXG4gICAgICAgIGxhYmVsOiB0aGlzLmJhY2tCdXR0b25Db25maWcubGFiZWwgPz8gJ0luZGlldHJvJyxcclxuICAgICAgICBpY29uOiAodGhpcy5iYWNrQnV0dG9uQ29uZmlnLmljb24gYXMgYW55KSA/PyAnYXJyb3ctbGVmdCcsXHJcbiAgICAgICAgaWNvblBvc2l0aW9uOiAnbGVhZGluZycsXHJcbiAgICAgICAgdmFyaWFudDogKHRoaXMuYmFja0J1dHRvbkNvbmZpZy52YXJpYW50IGFzIGFueSkgPz8gJ291dGxpbmUnLFxyXG4gICAgICAgIGhpZGRlbjogdGhpcy5zaG91bGRIaWRlQmFja0J1dHRvbigpLFxyXG4gICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5uYXZpZ2F0ZUJhY2soKSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0LnB1c2goLi4udGhpcy5hY3Rpb25zKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGUgZm9vdGVyIHNob3VsZCByZW5kZXIgKGF0IGxlYXN0IG9uZSBub24taGlkZGVuIGFjdGlvbiBleGlzdHMpLiAqL1xyXG4gIGdldCBoYXNWaXNpYmxlQWN0aW9ucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1lcmdlZEFjdGlvbnMuc29tZSgoYSkgPT4gIWEuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zeW5jRnJvbUFjdGl2YXRlZFJvdXRlKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcclxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY0Zyb21BY3RpdmF0ZWRSb3V0ZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgQWxsaW5lYSBicmVhZGNydW1iIHNlcnZpY2UgZSBmbGFnIGxheW91dCBhbGxhIHJvdHRhIGNvcnJlbnRlLiAqL1xyXG4gIHByaXZhdGUgc3luY0Zyb21BY3RpdmF0ZWRSb3V0ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVmcmVzaFJvdXRlU25hcHNob3RGbGFncygpO1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5nZXRCcmVhZGNydW1ic0ZvclJvdXRlKHRoaXMuYWN0aXZhdGVkUm91dGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBMZWdnZSBgYnJlYWRjcnVtYk9mZmAsIGBmb290ZXJOYXZPZmZgLCBgaWRgIGRhbGxhIGNhdGVuYSBgcGF0aEZyb21Sb290YCAvIGZvZ2xpYS4gKi9cclxuICBwcml2YXRlIHJlZnJlc2hSb3V0ZVNuYXBzaG90RmxhZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWVwZXN0ID0gdGhpcy5kZWVwZXN0Q2hpbGRSb3V0ZSh0aGlzLmFjdGl2YXRlZFJvdXRlKTtcclxuXHJcbiAgICBsZXQgYnJlYWRjcnVtYk9mZiA9IGZhbHNlO1xyXG4gICAgbGV0IGZvb3Rlck5hdk9mZiA9IGZhbHNlO1xyXG4gICAgZm9yIChjb25zdCBzZWcgb2YgZGVlcGVzdC5wYXRoRnJvbVJvb3QpIHtcclxuICAgICAgY29uc3QgZCA9IHNlZy5zbmFwc2hvdC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoIWQpIGNvbnRpbnVlO1xyXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUxpdGVyYWxLZXlzOiBjaGlhdmkgZG9jdW1lbnRhdGUgaW4gVWlCYXNlTGF5b3V0Um91dGVEYXRhXHJcbiAgICAgIGlmIChkWydicmVhZGNydW1iT2ZmJ10gPT09IHRydWUpIGJyZWFkY3J1bWJPZmYgPSB0cnVlO1xyXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUxpdGVyYWxLZXlzOiBjaGlhdmkgZG9jdW1lbnRhdGUgaW4gVWlCYXNlTGF5b3V0Um91dGVEYXRhXHJcbiAgICAgIGlmIChkWydmb290ZXJOYXZPZmYnXSA9PT0gdHJ1ZSkgZm9vdGVyTmF2T2ZmID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm91dGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgY3Vyc29yOiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGwgPSBkZWVwZXN0O1xyXG4gICAgd2hpbGUgKGN1cnNvcikge1xyXG4gICAgICBjb25zdCByYXcgPSBjdXJzb3Iuc25hcHNob3QuZGF0YT8uWydpZCddO1xyXG4gICAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgJiYgcmF3Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICByb3V0ZUlkID0gcmF3O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnNvciA9IGN1cnNvci5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yb3V0ZVNuYXBzaG90RmxhZ3Muc2V0KHsgYnJlYWRjcnVtYk9mZiwgZm9vdGVyTmF2T2ZmLCByb3V0ZUlkIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBQZXJjb3JyZSBmaW5vIGFsIGBBY3RpdmF0ZWRSb3V0ZWAgZm9nbGlhIHNvdHRvIGlsIHB1bnRvIGRpIGluaWV6aW9uZS4gKi9cclxuICBwcml2YXRlIGRlZXBlc3RDaGlsZFJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IEFjdGl2YXRlZFJvdXRlIHtcclxuICAgIGxldCBkZWVwZXN0ID0gcm91dGU7XHJcbiAgICB3aGlsZSAoZGVlcGVzdC5maXJzdENoaWxkKSB7XHJcbiAgICAgIGRlZXBlc3QgPSBkZWVwZXN0LmZpcnN0Q2hpbGQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVlcGVzdDtcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgRGV0ZXJtaW5hIHNlIGlsIGJhY2sgYnV0dG9uIGRldmUgZXNzZXJlIG5hc2Nvc3RvIHBlciBsYSByb3R0YSBjb3JyZW50ZS4gKi9cclxuICBwcml2YXRlIHNob3VsZEhpZGVCYWNrQnV0dG9uKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdO1xyXG4gICAgaWYgKGN1cnJlbnRQYXRoID09PSB0aGlzLmhvbWVSb3V0ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkZWVwZXN0Um91dGUgPSB0aGlzLmRlZXBlc3RDaGlsZFJvdXRlKHRoaXMuYWN0aXZhdGVkUm91dGUpO1xyXG5cclxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlTGl0ZXJhbEtleXM6IDxleHBsYW5hdGlvbj5cclxuICAgIGlmIChkZWVwZXN0Um91dGUuc25hcHNob3QuZGF0YT8uWydoaWRlQmFja0J1dHRvbiddID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgTmF2aWdhIGFsIGJyZWFkY3J1bWIgZ2VuaXRvcmUgbyBlc2VndWUgaWwgZmFsbGJhY2sgYWxsYSBob21lIHJvdXRlLiAqL1xyXG4gIHByaXZhdGUgbmF2aWdhdGVCYWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5uYXZpZ2F0ZUJhY2sodGhpcy5ob21lUm91dGUpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -3,4 +3,4 @@
3
3
  * Types and interfaces for UiBaseLayout component.
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sYXlvdXQudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtbGF5b3V0L2Jhc2UtbGF5b3V0LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9iYXNlLWxheW91dFxyXG4gKiBUeXBlcyBhbmQgaW50ZXJmYWNlcyBmb3IgVWlCYXNlTGF5b3V0IGNvbXBvbmVudC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBVaUJ1dHRvbkRlc2NyaXB0b3IsIFVpQnV0dG9uQXJlYUFsaWduIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi50eXBlcyc7XHJcblxyXG4vLyBSZS1leHBvcnQgZm9yIGNvbnN1bWVyIGNvbnZlbmllbmNlXHJcbmV4cG9ydCB7IFVpQnV0dG9uRGVzY3JpcHRvciwgVWlCdXR0b25BcmVhQWxpZ24gfTtcclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgYXV0b21hdGljIFwiYmFja1wiIGJ1dHRvbiByZW5kZXJlZCBpbiB0aGUgZm9vdGVyIGFjdGlvbiBhcmVhLlxyXG4gKlxyXG4gKiBAdXNhZ2VOb3Rlc1xyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGJhY2tDb25maWc6IFVpQmFja0J1dHRvbkNvbmZpZyA9IHtcclxuICogICBsYWJlbDogJ0luZGlldHJvJyxcclxuICogICBpY29uOiAnYXJyb3ctbGVmdCcsXHJcbiAqICAgdmFyaWFudDogJ291dGxpbmUnLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVWlCYWNrQnV0dG9uQ29uZmlnIHtcclxuICAvKiogTGFiZWwgdGV4dCBmb3IgdGhlIGJhY2sgYnV0dG9uLiBAZGVmYXVsdCAnSW5kaWV0cm8nICovXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqIEx1Y2lkZSBpY29uIG5hbWUuIEBkZWZhdWx0ICdhcnJvdy1sZWZ0JyAqL1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgLyoqIFZpc3VhbCB2YXJpYW50LiBAZGVmYXVsdCAnb3V0bGluZScgKi9cclxuICB2YXJpYW50Pzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sYXlvdXQudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtbGF5b3V0L2Jhc2UtbGF5b3V0LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbW9kdWxlIG5nLXVpLXN5c3RlbS9iYXNlLWxheW91dFxyXG4gKiBUeXBlcyBhbmQgaW50ZXJmYWNlcyBmb3IgVWlCYXNlTGF5b3V0IGNvbXBvbmVudC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBVaUJ1dHRvbkRlc2NyaXB0b3IsIFVpQnV0dG9uQXJlYUFsaWduIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi50eXBlcyc7XHJcblxyXG4vLyBSZS1leHBvcnQgZm9yIGNvbnN1bWVyIGNvbnZlbmllbmNlXHJcbmV4cG9ydCB7IFVpQnV0dG9uRGVzY3JpcHRvciwgVWlCdXR0b25BcmVhQWxpZ24gfTtcclxuXHJcbi8qKlxyXG4gKiBDaGlhdmkgb3B6aW9uYWxpIGRpIGBkYXRhYCBzdWxsYSByb3R0YSBhdHRpdmEgcmljb25vc2NpdXRlIGRhIGBVaUJhc2VMYXlvdXRDb21wb25lbnRgLlxyXG4gKlxyXG4gKiAtIGBpZGA6IHN0ZXNzYSByaXNhbGl0YSB1c2F0YSBkYWkgYnJlYWRjcnVtYiAoZGFsIHNlZ21lbnRvIGZvZ2xpYSB2ZXJzbyBpbCByb290OiBwcmltbyBgaWRgIHRyb3ZhdG8pLlxyXG4gKiAtIGBicmVhZGNydW1iT2ZmYCAvIGBmb290ZXJOYXZPZmZgOiBzZSBgdHJ1ZWAgc3UgKipxdWFsc2lhc2kqKiBzZWdtZW50byBpbiBgcGF0aEZyb21Sb290YCwgbOKAmWFyZWEgdmllbmUgbmFzY29zdGEuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVpQmFzZUxheW91dFJvdXRlRGF0YSB7XHJcbiAgLyoqIElkZW50aWZpY2F0aXZvIHN0YWJpbGUgZGVsbGEgcm90dGE7IHJlc28gY29tZSBgZGF0YS1yb3V0ZS1pZGAgc3VsIHdyYXBwZXIgYC51aS1iYXNlLWxheW91dGAuICovXHJcbiAgaWQ/OiBzdHJpbmc7XHJcbiAgLyoqIFNlIGB0cnVlYCwgbm9uIHZpZW5lIHJlbmRlcml6emF0byBgdWktcGFnZS1oZWFkZXJgIChicmVhZGNydW1iIGUgdGl0b2xvKS4gKi9cclxuICBicmVhZGNydW1iT2ZmPzogYm9vbGVhbjtcclxuICAvKiogU2UgYHRydWVgLCBub24gdmllbmUgcmVuZGVyaXp6YXRhIGxhIGJhcnJhIGB1aS1iYXNlLWxheW91dF9fZm9vdGVyYCAoYXppb25pIC8gaW5kaWV0cm8pLiAqL1xyXG4gIGZvb3Rlck5hdk9mZj86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgYXV0b21hdGljIFwiYmFja1wiIGJ1dHRvbiByZW5kZXJlZCBpbiB0aGUgZm9vdGVyIGFjdGlvbiBhcmVhLlxyXG4gKlxyXG4gKiBAdXNhZ2VOb3Rlc1xyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGJhY2tDb25maWc6IFVpQmFja0J1dHRvbkNvbmZpZyA9IHtcclxuICogICBsYWJlbDogJ0luZGlldHJvJyxcclxuICogICBpY29uOiAnYXJyb3ctbGVmdCcsXHJcbiAqICAgdmFyaWFudDogJ291dGxpbmUnLFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVWlCYWNrQnV0dG9uQ29uZmlnIHtcclxuICAvKiogTGFiZWwgdGV4dCBmb3IgdGhlIGJhY2sgYnV0dG9uLiBAZGVmYXVsdCAnSW5kaWV0cm8nICovXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqIEx1Y2lkZSBpY29uIG5hbWUuIEBkZWZhdWx0ICdhcnJvdy1sZWZ0JyAqL1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgLyoqIFZpc3VhbCB2YXJpYW50LiBAZGVmYXVsdCAnb3V0bGluZScgKi9cclxuICB2YXJpYW50Pzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
@@ -11,4 +11,4 @@
11
11
  */
12
12
  // Components
13
13
  export { UiBaseLayoutComponent } from './base-layout.component';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtbGF5b3V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxhQUFhO0FBQ2IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogbmctdWktc3lzdGVtIOKAlCBCYXNlIExheW91dCBlbnRyeSBwb2ludC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQge1xyXG4gKiAgIFVpQmFzZUxheW91dENvbXBvbmVudCxcclxuICogICBVaUJhY2tCdXR0b25Db25maWcsXHJcbiAqIH0gZnJvbSAnbmctdWktc3lzdGVtJztcclxuICogYGBgXHJcbiAqL1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5leHBvcnQgeyBVaUJhc2VMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtbGF5b3V0LmNvbXBvbmVudCc7XHJcblxyXG4vLyBUeXBlc1xyXG5leHBvcnQgeyBVaUJhY2tCdXR0b25Db25maWcgfSBmcm9tICcuL2Jhc2UtbGF5b3V0LnR5cGVzJztcclxuIl19
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtbGF5b3V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxhQUFhO0FBQ2IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogbmctdWktc3lzdGVtIOKAlCBCYXNlIExheW91dCBlbnRyeSBwb2ludC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQge1xyXG4gKiAgIFVpQmFzZUxheW91dENvbXBvbmVudCxcclxuICogICBVaUJhY2tCdXR0b25Db25maWcsXHJcbiAqIH0gZnJvbSAnbmctdWktc3lzdGVtJztcclxuICogYGBgXHJcbiAqL1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5leHBvcnQgeyBVaUJhc2VMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtbGF5b3V0LmNvbXBvbmVudCc7XHJcblxyXG4vLyBUeXBlc1xyXG5leHBvcnQgeyBVaUJhY2tCdXR0b25Db25maWcsIFVpQmFzZUxheW91dFJvdXRlRGF0YSB9IGZyb20gJy4vYmFzZS1sYXlvdXQudHlwZXMnO1xyXG4iXX0=