pdm-ui-kit 0.1.50 → 0.3.0

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 (68) hide show
  1. package/README.md +356 -4
  2. package/esm2020/lib/components/alert-dialog/alert-dialog.component.mjs +3 -3
  3. package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +37 -4
  4. package/esm2020/lib/components/button-group/button-group.component.mjs +208 -182
  5. package/esm2020/lib/components/calendar/calendar.component.mjs +3 -3
  6. package/esm2020/lib/components/card/card.component.mjs +36 -53
  7. package/esm2020/lib/components/combobox/combobox.component.mjs +136 -14
  8. package/esm2020/lib/components/command/command.component.mjs +3 -3
  9. package/esm2020/lib/components/context-menu/context-menu.component.mjs +121 -42
  10. package/esm2020/lib/components/data-table/data-table.component.mjs +214 -16
  11. package/esm2020/lib/components/date-picker/date-picker.component.mjs +66 -54
  12. package/esm2020/lib/components/dialog/dialog.component.mjs +171 -38
  13. package/esm2020/lib/components/draggable-table/draggable-table.component.mjs +300 -0
  14. package/esm2020/lib/components/drawer/drawer.component.mjs +123 -16
  15. package/esm2020/lib/components/dropdown-menu/dropdown-menu.component.mjs +3 -2
  16. package/esm2020/lib/components/hover-card/hover-card.component.mjs +185 -24
  17. package/esm2020/lib/components/input/input.component.mjs +15 -15
  18. package/esm2020/lib/components/input-group/input-group.component.mjs +14 -14
  19. package/esm2020/lib/components/menubar/menubar.component.mjs +105 -29
  20. package/esm2020/lib/components/navigation-menu/navigation-menu.component.mjs +25 -3
  21. package/esm2020/lib/components/pagination/pagination.component.mjs +3 -3
  22. package/esm2020/lib/components/popover/popover.component.mjs +107 -73
  23. package/esm2020/lib/components/select/select.component.mjs +26 -23
  24. package/esm2020/lib/components/sheet/sheet.component.mjs +68 -12
  25. package/esm2020/lib/components/sidebar/sidebar.component.mjs +52 -5
  26. package/esm2020/lib/components/table/table.component.mjs +165 -192
  27. package/esm2020/lib/components/tabs/tabs.component.mjs +6 -6
  28. package/esm2020/lib/components/toggle-group/toggle-group.component.mjs +6 -6
  29. package/esm2020/lib/components/tooltip/tooltip.component.mjs +162 -19
  30. package/esm2020/lib/overlay/z-index-helper.mjs +69 -0
  31. package/esm2020/lib/pdm-ui-kit.module.mjs +5 -1
  32. package/esm2020/lib/utils/responsive.mjs +143 -0
  33. package/esm2020/lib/utils/z-index.mjs +90 -0
  34. package/esm2020/public-api.mjs +67 -63
  35. package/fesm2015/pdm-ui-kit.mjs +2628 -847
  36. package/fesm2015/pdm-ui-kit.mjs.map +1 -1
  37. package/fesm2020/pdm-ui-kit.mjs +2630 -845
  38. package/fesm2020/pdm-ui-kit.mjs.map +1 -1
  39. package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -1
  40. package/lib/components/button-group/button-group.component.d.ts +8 -2
  41. package/lib/components/card/card.component.d.ts +32 -19
  42. package/lib/components/combobox/combobox.component.d.ts +20 -3
  43. package/lib/components/context-menu/context-menu.component.d.ts +17 -8
  44. package/lib/components/data-table/data-table.component.d.ts +172 -14
  45. package/lib/components/date-picker/date-picker.component.d.ts +5 -6
  46. package/lib/components/dialog/dialog.component.d.ts +38 -4
  47. package/lib/components/draggable-table/draggable-table.component.d.ts +74 -0
  48. package/lib/components/drawer/drawer.component.d.ts +65 -7
  49. package/lib/components/hover-card/hover-card.component.d.ts +27 -4
  50. package/lib/components/input/input.component.d.ts +3 -3
  51. package/lib/components/input-group/input-group.component.d.ts +1 -1
  52. package/lib/components/menubar/menubar.component.d.ts +16 -8
  53. package/lib/components/navigation-menu/navigation-menu.component.d.ts +22 -1
  54. package/lib/components/popover/popover.component.d.ts +13 -12
  55. package/lib/components/select/select.component.d.ts +4 -5
  56. package/lib/components/sheet/sheet.component.d.ts +30 -3
  57. package/lib/components/sidebar/sidebar.component.d.ts +39 -1
  58. package/lib/components/table/table.component.d.ts +47 -26
  59. package/lib/components/tabs/tabs.component.d.ts +1 -1
  60. package/lib/components/toggle-group/toggle-group.component.d.ts +1 -1
  61. package/lib/components/tooltip/tooltip.component.d.ts +21 -3
  62. package/lib/overlay/z-index-helper.d.ts +36 -0
  63. package/lib/pdm-ui-kit.module.d.ts +42 -41
  64. package/lib/utils/responsive.d.ts +107 -0
  65. package/lib/utils/z-index.d.ts +69 -0
  66. package/package.json +10 -8
  67. package/public-api.d.ts +66 -62
  68. package/src/lib/styles/tokens.css +182 -0
@@ -1,25 +1,56 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, } from "@angular/core";
2
+ import { responsive } from "../../utils/responsive";
3
+ import { Z_INDEX } from "../../utils/z-index";
2
4
  import * as i0 from "@angular/core";
3
5
  import * as i1 from "@angular/common";
6
+ /**
7
+ * Modal/Dialog component con soporte responsive
8
+ *
9
+ * MEJORADO en v0.2.0:
10
+ * - Modo 'responsive' (default): fullscreen en mobile, modal en desktop
11
+ * - Tamaños predefinidos: sm, md, lg, xl
12
+ * - Mejor manejo de scroll en mobile
13
+ *
14
+ * @example
15
+ * // Responsive (recomendado)
16
+ * <pdm-dialog [open]="isOpen" size="responsive">
17
+ * <p>Content</p>
18
+ * </pdm-dialog>
19
+ *
20
+ * @example
21
+ * // Tamaño fijo
22
+ * <pdm-dialog [open]="isOpen" size="lg">
23
+ * <p>Content</p>
24
+ * </pdm-dialog>
25
+ */
4
26
  export class PdmDialogComponent {
5
27
  constructor() {
6
28
  this.open = false;
7
- this.variant = 'default';
8
- this.size = 'desktop';
9
- this.title = 'Edit profile';
10
- this.description = '';
29
+ this.variant = "default";
30
+ /**
31
+ * Tamaño del dialog
32
+ * - responsive: fullscreen mobile, modal desktop (recomendado)
33
+ * - sm: 400px max
34
+ * - md: 500px max
35
+ * - lg: 640px max (default)
36
+ * - xl: 800px max
37
+ * - desktop/mobile/mobile-fullscreen: legacy, deprecado
38
+ */
39
+ this.size = "responsive";
40
+ this.title = "Edit profile";
41
+ this.description = "";
11
42
  this.closeOnBackdrop = true;
12
43
  this.closeOnEsc = true;
13
44
  this.showCloseButton = true;
14
45
  this.showHeader = true;
15
46
  this.showFooter = true;
16
- this.primaryActionText = 'Save changes';
17
- this.secondaryActionText = 'Cancel';
18
- this.alignFooter = 'right';
19
- this.headerClassName = '';
20
- this.bodyClassName = '';
21
- this.footerClassName = '';
22
- this.className = '';
47
+ this.primaryActionText = "Save changes";
48
+ this.secondaryActionText = "Cancel";
49
+ this.alignFooter = "right";
50
+ this.headerClassName = "";
51
+ this.bodyClassName = "";
52
+ this.footerClassName = "";
53
+ this.className = "";
23
54
  this.openChange = new EventEmitter();
24
55
  this.primaryAction = new EventEmitter();
25
56
  this.secondaryAction = new EventEmitter();
@@ -44,47 +75,149 @@ export class PdmDialogComponent {
44
75
  }
45
76
  }
46
77
  get panelClassName() {
78
+ // Legacy sizes (backward compatibility)
79
+ if (this.size === "desktop") {
80
+ return this.buildPanelClasses([
81
+ "max-w-[640px]",
82
+ "max-h-[calc(100vh-2rem)]",
83
+ "rounded-[10px]",
84
+ ]);
85
+ }
86
+ if (this.size === "mobile") {
87
+ return this.buildPanelClasses([
88
+ "max-w-[320px]",
89
+ "min-h-[240px]",
90
+ "rounded-[10px]",
91
+ ]);
92
+ }
93
+ if (this.size === "mobile-fullscreen") {
94
+ return this.buildPanelClasses([
95
+ "max-w-[320px]",
96
+ "h-[min(100dvh,640px)]",
97
+ "rounded-none",
98
+ "sm:rounded-[10px]",
99
+ ]);
100
+ }
101
+ // New responsive mode (recomendado)
102
+ if (this.size === "responsive") {
103
+ return this.buildPanelClasses([
104
+ // Mobile: fullscreen con bordes redondeados solo arriba
105
+ "w-full",
106
+ "h-full",
107
+ "max-h-[100dvh]",
108
+ "rounded-t-[10px]",
109
+ "sm:rounded-[10px]",
110
+ // Desktop: modal centrado
111
+ "sm:w-auto",
112
+ "sm:h-auto",
113
+ "sm:max-w-[640px]",
114
+ "sm:max-h-[calc(100vh-4rem)]",
115
+ ]);
116
+ }
117
+ // New size options
118
+ const sizeMap = {
119
+ sm: "sm:max-w-[400px]",
120
+ md: "sm:max-w-[500px]",
121
+ lg: "sm:max-w-[640px]",
122
+ xl: "sm:max-w-[800px]",
123
+ };
124
+ const maxWidth = sizeMap[this.size] || sizeMap.lg;
125
+ return this.buildPanelClasses([
126
+ // Mobile: fullscreen
127
+ "w-full",
128
+ "h-full",
129
+ "max-h-[100dvh]",
130
+ "rounded-t-[10px]",
131
+ // Desktop: modal
132
+ "sm:rounded-[10px]",
133
+ "sm:w-auto",
134
+ "sm:h-auto",
135
+ maxWidth,
136
+ "sm:max-h-[calc(100vh-4rem)]",
137
+ ]);
138
+ }
139
+ buildPanelClasses(sizeClasses) {
47
140
  const base = [
48
- 'relative z-10 w-full border border-border bg-background text-foreground shadow-lg',
49
- this.size === 'desktop' ? 'max-w-[640px] max-h-[calc(100vh-2rem)] rounded-[10px] overflow-visible' : '',
50
- this.size === 'mobile' ? 'max-w-[320px] min-h-[240px] rounded-[10px] overflow-visible' : '',
51
- this.size === 'mobile-fullscreen'
52
- ? 'max-w-[320px] h-[min(100dvh,640px)] rounded-none sm:rounded-[10px] overflow-visible'
53
- : '',
54
- this.className
141
+ "relative",
142
+ Z_INDEX.modal,
143
+ "flex",
144
+ "flex-col",
145
+ "border",
146
+ "border-border",
147
+ "bg-background",
148
+ "text-foreground",
149
+ "shadow-lg",
150
+ "overflow-hidden",
151
+ ...sizeClasses,
152
+ this.className,
55
153
  ];
56
- return base.filter(Boolean).join(' ');
154
+ return base.filter(Boolean).join(" ");
57
155
  }
58
156
  get bodyWrapperClassName() {
157
+ // min-h-0 is CRITICAL for flex child to shrink and allow internal scroll
59
158
  const base = [
60
- 'min-h-0 flex-1',
61
- this.size === 'mobile-fullscreen' ? 'overflow-y-auto px-4 py-6' : 'px-6 py-6',
62
- this.bodyClassName
159
+ "flex-1",
160
+ "min-h-0",
161
+ "overflow-y-auto",
162
+ "px-4",
163
+ "py-6",
164
+ "sm:px-6",
165
+ this.bodyClassName,
63
166
  ];
64
- return base.filter(Boolean).join(' ');
167
+ return base.filter(Boolean).join(" ");
65
168
  }
66
169
  get headerWrapperClassName() {
67
- return ['flex items-start justify-between gap-3 p-4', this.headerClassName].filter(Boolean).join(' ');
170
+ const base = [
171
+ "flex",
172
+ "items-start",
173
+ "justify-between",
174
+ "gap-3",
175
+ "p-4",
176
+ "sm:p-6",
177
+ "border-b",
178
+ "border-border",
179
+ this.headerClassName,
180
+ ];
181
+ return base.filter(Boolean).join(" ");
68
182
  }
69
183
  get footerWrapperClassName() {
70
- const effectiveAlign = this.alignFooter === 'right' && this.variant === 'custom-close' ? 'left' : this.alignFooter;
184
+ const effectiveAlign = this.alignFooter === "right" && this.variant === "custom-close"
185
+ ? "left"
186
+ : this.alignFooter;
71
187
  const base = [
72
- 'p-4',
73
- effectiveAlign === 'full-width'
74
- ? 'flex flex-col gap-2'
75
- : effectiveAlign === 'left'
76
- ? 'flex items-center gap-2 justify-start'
77
- : 'flex items-center gap-2 justify-end',
78
- this.footerClassName
188
+ "p-4",
189
+ "sm:p-6",
190
+ "border-t",
191
+ "border-border",
192
+ // Mobile: siempre full-width
193
+ "flex",
194
+ "flex-col",
195
+ "gap-2",
196
+ // Desktop: según alignFooter
197
+ effectiveAlign === "full-width"
198
+ ? "sm:flex-col"
199
+ : "sm:flex-row sm:items-center",
200
+ effectiveAlign === "left" ? "sm:justify-start" : "",
201
+ effectiveAlign === "right" ? "sm:justify-end" : "",
202
+ this.footerClassName,
79
203
  ];
80
- return base.filter(Boolean).join(' ');
204
+ return base.filter(Boolean).join(" ");
205
+ }
206
+ get containerClassName() {
207
+ // Container con backdrop z-40
208
+ // Mobile: fullscreen desde el bottom
209
+ // Desktop: centrado
210
+ return responsive({
211
+ default: `fixed inset-x-0 bottom-0 ${Z_INDEX.modalBackdrop} flex items-end justify-center`,
212
+ sm: `fixed inset-0 ${Z_INDEX.modalBackdrop} flex items-center justify-center p-4`,
213
+ });
81
214
  }
82
215
  }
83
216
  PdmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
- PdmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDialogComponent, selector: "pdm-dialog", inputs: { open: "open", variant: "variant", size: "size", title: "title", description: "description", closeOnBackdrop: "closeOnBackdrop", closeOnEsc: "closeOnEsc", showCloseButton: "showCloseButton", showHeader: "showHeader", showFooter: "showFooter", primaryActionText: "primaryActionText", secondaryActionText: "secondaryActionText", alignFooter: "alignFooter", headerClassName: "headerClassName", bodyClassName: "bodyClassName", footerClassName: "footerClassName", className: "className" }, outputs: { openChange: "openChange", primaryAction: "primaryAction", secondaryAction: "secondaryAction" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<div *ngIf=\"open\" class=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div class=\"absolute inset-0 bg-foreground/30\" (click)=\"onBackdropClick()\"></div>\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
217
+ PdmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDialogComponent, selector: "pdm-dialog", inputs: { open: "open", variant: "variant", size: "size", title: "title", description: "description", closeOnBackdrop: "closeOnBackdrop", closeOnEsc: "closeOnEsc", showCloseButton: "showCloseButton", showHeader: "showHeader", showFooter: "showFooter", primaryActionText: "primaryActionText", secondaryActionText: "secondaryActionText", alignFooter: "alignFooter", headerClassName: "headerClassName", bodyClassName: "bodyClassName", footerClassName: "footerClassName", className: "className" }, outputs: { openChange: "openChange", primaryAction: "primaryAction", secondaryAction: "secondaryAction" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
85
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDialogComponent, decorators: [{
86
219
  type: Component,
87
- args: [{ selector: 'pdm-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"open\" class=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div class=\"absolute inset-0 bg-foreground/30\" (click)=\"onBackdropClick()\"></div>\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n" }]
220
+ args: [{ selector: "pdm-dialog", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", styles: [":host{display:block}\n"] }]
88
221
  }], propDecorators: { open: [{
89
222
  type: Input
90
223
  }], variant: [{
@@ -127,6 +260,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
127
260
  type: Output
128
261
  }], onEsc: [{
129
262
  type: HostListener,
130
- args: ['document:keydown.escape']
263
+ args: ["document:keydown.escape"]
131
264
  }] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFXOUcsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQU1XLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixZQUFPLEdBQXFCLFNBQVMsQ0FBQztRQUN0QyxTQUFJLEdBQWtCLFNBQVMsQ0FBQztRQUNoQyxVQUFLLEdBQUcsY0FBYyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHNCQUFpQixHQUFHLGNBQWMsQ0FBQztRQUNuQyx3QkFBbUIsR0FBRyxRQUFRLENBQUM7UUFDL0IsZ0JBQVcsR0FBeUIsT0FBTyxDQUFDO1FBQzVDLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDekMsb0JBQWUsR0FBRyxJQUFJLFlB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LGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHUCxLQUFLO3NCQURKLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGRtRGlhbG9nVmFyaWFudCA9ICdkZWZhdWx0JyB8ICdjdXN0b20tY2xvc2UnO1xuZXhwb3J0IHR5cGUgUGRtRGlhbG9nU2l6ZSA9ICdkZXNrdG9wJyB8ICdtb2JpbGUnIHwgJ21vYmlsZS1mdWxsc2NyZWVuJztcbmV4cG9ydCB0eXBlIFBkbURpYWxvZ0Zvb3RlckFsaWduID0gJ3JpZ2h0JyB8ICdmdWxsLXdpZHRoJyB8ICdsZWZ0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EaWFsb2dDb21wb25lbnQge1xuICBASW5wdXQoKSBvcGVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZhcmlhbnQ6IFBkbURpYWxvZ1ZhcmlhbnQgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIHNpemU6IFBkbURpYWxvZ1NpemUgPSAnZGVza3RvcCc7XG4gIEBJbnB1dCgpIHRpdGxlID0gJ0VkaXQgcHJvZmlsZSc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uID0gJyc7XG4gIEBJbnB1dCgpIGNsb3NlT25CYWNrZHJvcCA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25Fc2MgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2xvc2VCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93SGVhZGVyID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0Zvb3RlciA9IHRydWU7XG4gIEBJbnB1dCgpIHByaW1hcnlBY3Rpb25UZXh0ID0gJ1NhdmUgY2hhbmdlcyc7XG4gIEBJbnB1dCgpIHNlY29uZGFyeUFjdGlvblRleHQgPSAnQ2FuY2VsJztcbiAgQElucHV0KCkgYWxpZ25Gb290ZXI6IFBkbURpYWxvZ0Zvb3RlckFsaWduID0gJ3JpZ2h0JztcbiAgQElucHV0KCkgaGVhZGVyQ2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGJvZHlDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgZm9vdGVyQ2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgcHJpbWFyeUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlY29uZGFyeUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4gJiYgdGhpcy5jbG9zZU9uRXNjKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgb25QcmltYXJ5QWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMucHJpbWFyeUFjdGlvbi5lbWl0KCk7XG4gIH1cblxuICBvblNlY29uZGFyeUFjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZGFyeUFjdGlvbi5lbWl0KCk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VPbkJhY2tkcm9wKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IFtcbiAgICAgICdyZWxhdGl2ZSB6LTEwIHctZnVsbCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctbGcnLFxuICAgICAgdGhpcy5zaXplID09PSAnZGVza3RvcCcgPyAnbWF4LXctWzY0MHB4XSBtYXgtaC1bY2FsYygxMDB2aC0ycmVtKV0gcm91bmRlZC1bMTBweF0gb3ZlcmZsb3ctdmlzaWJsZScgOiAnJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ21vYmlsZScgPyAnbWF4LXctWzMyMHB4XSBtaW4taC1bMjQwcHhdIHJvdW5kZWQtWzEwcHhdIG92ZXJmbG93LXZpc2libGUnIDogJycsXG4gICAgICB0aGlzLnNpemUgPT09ICdtb2JpbGUtZnVsbHNjcmVlbidcbiAgICAgICAgPyAnbWF4LXctWzMyMHB4XSBoLVttaW4oMTAwZHZoLDY0MHB4KV0gcm91bmRlZC1ub25lIHNtOnJvdW5kZWQtWzEwcHhdIG92ZXJmbG93LXZpc2libGUnXG4gICAgICAgIDogJycsXG4gICAgICB0aGlzLmNsYXNzTmFtZVxuICAgIF07XG5cbiAgICByZXR1cm4gYmFzZS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IGJvZHlXcmFwcGVyQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IFtcbiAgICAgICdtaW4taC0wIGZsZXgtMScsXG4gICAgICB0aGlzLnNpemUgPT09ICdtb2JpbGUtZnVsbHNjcmVlbicgPyAnb3ZlcmZsb3cteS1hdXRvIHB4LTQgcHktNicgOiAncHgtNiBweS02JyxcbiAgICAgIHRoaXMuYm9keUNsYXNzTmFtZVxuICAgIF07XG5cbiAgICByZXR1cm4gYmFzZS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IGhlYWRlcldyYXBwZXJDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtMyBwLTQnLCB0aGlzLmhlYWRlckNsYXNzTmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBmb290ZXJXcmFwcGVyQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZWZmZWN0aXZlQWxpZ24gPVxuICAgICAgdGhpcy5hbGlnbkZvb3RlciA9PT0gJ3JpZ2h0JyAmJiB0aGlzLnZhcmlhbnQgPT09ICdjdXN0b20tY2xvc2UnID8gJ2xlZnQnIDogdGhpcy5hbGlnbkZvb3RlcjtcblxuICAgIGNvbnN0IGJhc2UgPSBbXG4gICAgICAncC00JyxcbiAgICAgIGVmZmVjdGl2ZUFsaWduID09PSAnZnVsbC13aWR0aCdcbiAgICAgICAgPyAnZmxleCBmbGV4LWNvbCBnYXAtMidcbiAgICAgICAgOiBlZmZlY3RpdmVBbGlnbiA9PT0gJ2xlZnQnXG4gICAgICAgICAgPyAnZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIganVzdGlmeS1zdGFydCdcbiAgICAgICAgICA6ICdmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBqdXN0aWZ5LWVuZCcsXG4gICAgICB0aGlzLmZvb3RlckNsYXNzTmFtZVxuICAgIF07XG5cbiAgICByZXR1cm4gYmFzZS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwib3BlblwiIGNsYXNzPVwiZml4ZWQgaW5zZXQtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNFwiPlxuICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMCBiZy1mb3JlZ3JvdW5kLzMwXCIgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygpXCI+PC9kaXY+XG4gIDxzZWN0aW9uIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIFtuZ0NsYXNzXT1cInBhbmVsQ2xhc3NOYW1lXCI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dIZWFkZXJcIiBbbmdDbGFzc109XCJoZWFkZXJXcmFwcGVyQ2xhc3NOYW1lXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWluLXctMFwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJtLTAgdGV4dC1sZyBmb250LXNlbWlib2xkIGxlYWRpbmctbm9uZSB0cmFja2luZy10aWdodCB0ZXh0LWZvcmVncm91bmRcIj57eyB0aXRsZSB9fTwvaDI+XG4gICAgICAgIDxwICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cIm0tMCBtdC0yIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93Q2xvc2VCdXR0b25cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTYgdy02IGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbSBib3JkZXItMCBiZy10cmFuc3BhcmVudCBwLTAgdGV4dC1mb3JlZ3JvdW5kIG9wYWNpdHktNzAgcmluZy1vZmZzZXQtYmFja2dyb3VuZCB0cmFuc2l0aW9uLW9wYWNpdHkgaG92ZXI6b3BhY2l0eS0xMDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXJpbmcgZm9jdXM6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgZGlhbG9nXCJcbiAgICAgID5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk02IDZMMTggMThNMTggNkw2IDE4XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgW25nQ2xhc3NdPVwiYm9keVdyYXBwZXJDbGFzc05hbWVcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93Rm9vdGVyXCIgW25nQ2xhc3NdPVwiZm9vdGVyV3JhcHBlckNsYXNzTmFtZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhbnQgPT09ICdjdXN0b20tY2xvc2UnOyBlbHNlIGRlZmF1bHRBY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGgtOSBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc21cIlxuICAgICAgICAgIChjbGljayk9XCJvblNlY29uZGFyeUFjdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHNlY29uZGFyeUFjdGlvblRleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC05IGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2Vjb25kYXJ5QWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgc2Vjb25kYXJ5QWN0aW9uVGV4dCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC05IGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBiZy1wcmltYXJ5IHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHNoYWRvdy1zbVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUHJpbWFyeUFjdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHByaW1hcnlBY3Rpb25UZXh0IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxuPC9kaXY+XG4iXX0=
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFtQjlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBYUgsTUFBTSxPQUFPLGtCQUFrQjtJQVovQjtRQWFVLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixZQUFPLEdBQXFCLFNBQVMsQ0FBQztRQUUvQzs7Ozs7Ozs7V0FRRztRQUNNLFNBQUksR0FBa0IsWUFBWSxDQUFDO1FBRW5DLFVBQUssR0FBRyxjQUFjLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsc0JBQWlCLEdBQUcsY0FBYyxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLFFBQVEsQ0FBQztRQUMvQixnQkFBVyxHQUF5QixPQUFPLENBQUM7UUFDNUMsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FB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QkFBdkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdQLEtBQUs7c0JBREosWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RMaXN0ZW5lcixcblx0SW5wdXQsXG5cdE91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHJlc3BvbnNpdmUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzcG9uc2l2ZVwiO1xuaW1wb3J0IHsgWl9JTkRFWCB9IGZyb20gXCIuLi8uLi91dGlscy96LWluZGV4XCI7XG5cbmV4cG9ydCB0eXBlIFBkbURpYWxvZ1ZhcmlhbnQgPSBcImRlZmF1bHRcIiB8IFwiY3VzdG9tLWNsb3NlXCI7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdyZXNwb25zaXZlJyBtb2RlIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MC4zLjBcbiAqL1xuZXhwb3J0IHR5cGUgUGRtRGlhbG9nU2l6ZSA9XG5cdHwgXCJkZXNrdG9wXCJcblx0fCBcIm1vYmlsZVwiXG5cdHwgXCJtb2JpbGUtZnVsbHNjcmVlblwiXG5cdHwgXCJzbVwiXG5cdHwgXCJtZFwiXG5cdHwgXCJsZ1wiXG5cdHwgXCJ4bFwiXG5cdHwgXCJyZXNwb25zaXZlXCI7XG5cbmV4cG9ydCB0eXBlIFBkbURpYWxvZ0Zvb3RlckFsaWduID0gXCJyaWdodFwiIHwgXCJmdWxsLXdpZHRoXCIgfCBcImxlZnRcIjtcblxuLyoqXG4gKiBNb2RhbC9EaWFsb2cgY29tcG9uZW50IGNvbiBzb3BvcnRlIHJlc3BvbnNpdmVcbiAqXG4gKiBNRUpPUkFETyBlbiB2MC4yLjA6XG4gKiAtIE1vZG8gJ3Jlc3BvbnNpdmUnIChkZWZhdWx0KTogZnVsbHNjcmVlbiBlbiBtb2JpbGUsIG1vZGFsIGVuIGRlc2t0b3BcbiAqIC0gVGFtYcOxb3MgcHJlZGVmaW5pZG9zOiBzbSwgbWQsIGxnLCB4bFxuICogLSBNZWpvciBtYW5lam8gZGUgc2Nyb2xsIGVuIG1vYmlsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXNwb25zaXZlIChyZWNvbWVuZGFkbylcbiAqIDxwZG0tZGlhbG9nIFtvcGVuXT1cImlzT3BlblwiIHNpemU9XCJyZXNwb25zaXZlXCI+XG4gKiAgIDxwPkNvbnRlbnQ8L3A+XG4gKiA8L3BkbS1kaWFsb2c+XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRhbWHDsW8gZmlqb1xuICogPHBkbS1kaWFsb2cgW29wZW5dPVwiaXNPcGVuXCIgc2l6ZT1cImxnXCI+XG4gKiAgIDxwPkNvbnRlbnQ8L3A+XG4gKiA8L3BkbS1kaWFsb2c+XG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJwZG0tZGlhbG9nXCIsXG5cdHRlbXBsYXRlVXJsOiBcIi4vZGlhbG9nLmNvbXBvbmVudC5odG1sXCIsXG5cdHN0eWxlczogW1xuXHRcdGBcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIGAsXG5cdF0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EaWFsb2dDb21wb25lbnQge1xuXHRASW5wdXQoKSBvcGVuID0gZmFsc2U7XG5cdEBJbnB1dCgpIHZhcmlhbnQ6IFBkbURpYWxvZ1ZhcmlhbnQgPSBcImRlZmF1bHRcIjtcblxuXHQvKipcblx0ICogVGFtYcOxbyBkZWwgZGlhbG9nXG5cdCAqIC0gcmVzcG9uc2l2ZTogZnVsbHNjcmVlbiBtb2JpbGUsIG1vZGFsIGRlc2t0b3AgKHJlY29tZW5kYWRvKVxuXHQgKiAtIHNtOiA0MDBweCBtYXhcblx0ICogLSBtZDogNTAwcHggbWF4XG5cdCAqIC0gbGc6IDY0MHB4IG1heCAoZGVmYXVsdClcblx0ICogLSB4bDogODAwcHggbWF4XG5cdCAqIC0gZGVza3RvcC9tb2JpbGUvbW9iaWxlLWZ1bGxzY3JlZW46IGxlZ2FjeSwgZGVwcmVjYWRvXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBQZG1EaWFsb2dTaXplID0gXCJyZXNwb25zaXZlXCI7XG5cblx0QElucHV0KCkgdGl0bGUgPSBcIkVkaXQgcHJvZmlsZVwiO1xuXHRASW5wdXQoKSBkZXNjcmlwdGlvbiA9IFwiXCI7XG5cdEBJbnB1dCgpIGNsb3NlT25CYWNrZHJvcCA9IHRydWU7XG5cdEBJbnB1dCgpIGNsb3NlT25Fc2MgPSB0cnVlO1xuXHRASW5wdXQoKSBzaG93Q2xvc2VCdXR0b24gPSB0cnVlO1xuXHRASW5wdXQoKSBzaG93SGVhZGVyID0gdHJ1ZTtcblx0QElucHV0KCkgc2hvd0Zvb3RlciA9IHRydWU7XG5cdEBJbnB1dCgpIHByaW1hcnlBY3Rpb25UZXh0ID0gXCJTYXZlIGNoYW5nZXNcIjtcblx0QElucHV0KCkgc2Vjb25kYXJ5QWN0aW9uVGV4dCA9IFwiQ2FuY2VsXCI7XG5cdEBJbnB1dCgpIGFsaWduRm9vdGVyOiBQZG1EaWFsb2dGb290ZXJBbGlnbiA9IFwicmlnaHRcIjtcblx0QElucHV0KCkgaGVhZGVyQ2xhc3NOYW1lID0gXCJcIjtcblx0QElucHV0KCkgYm9keUNsYXNzTmFtZSA9IFwiXCI7XG5cdEBJbnB1dCgpIGZvb3RlckNsYXNzTmFtZSA9IFwiXCI7XG5cdEBJbnB1dCgpIGNsYXNzTmFtZSA9IFwiXCI7XG5cblx0QE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cdEBPdXRwdXQoKSBwcmltYXJ5QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXHRAT3V0cHV0KCkgc2Vjb25kYXJ5QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG5cdEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDprZXlkb3duLmVzY2FwZVwiKVxuXHRvbkVzYygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vcGVuICYmIHRoaXMuY2xvc2VPbkVzYykge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdGNsb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcblx0fVxuXG5cdG9uUHJpbWFyeUFjdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLnByaW1hcnlBY3Rpb24uZW1pdCgpO1xuXHR9XG5cblx0b25TZWNvbmRhcnlBY3Rpb24oKTogdm9pZCB7XG5cdFx0dGhpcy5zZWNvbmRhcnlBY3Rpb24uZW1pdCgpO1xuXHR9XG5cblx0b25CYWNrZHJvcENsaWNrKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNsb3NlT25CYWNrZHJvcCkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBwYW5lbENsYXNzTmFtZSgpOiBzdHJpbmcge1xuXHRcdC8vIExlZ2FjeSBzaXplcyAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcblx0XHRpZiAodGhpcy5zaXplID09PSBcImRlc2t0b3BcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYnVpbGRQYW5lbENsYXNzZXMoW1xuXHRcdFx0XHRcIm1heC13LVs2NDBweF1cIixcblx0XHRcdFx0XCJtYXgtaC1bY2FsYygxMDB2aC0ycmVtKV1cIixcblx0XHRcdFx0XCJyb3VuZGVkLVsxMHB4XVwiLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2l6ZSA9PT0gXCJtb2JpbGVcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYnVpbGRQYW5lbENsYXNzZXMoW1xuXHRcdFx0XHRcIm1heC13LVszMjBweF1cIixcblx0XHRcdFx0XCJtaW4taC1bMjQwcHhdXCIsXG5cdFx0XHRcdFwicm91bmRlZC1bMTBweF1cIixcblx0XHRcdF0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpemUgPT09IFwibW9iaWxlLWZ1bGxzY3JlZW5cIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYnVpbGRQYW5lbENsYXNzZXMoW1xuXHRcdFx0XHRcIm1heC13LVszMjBweF1cIixcblx0XHRcdFx0XCJoLVttaW4oMTAwZHZoLDY0MHB4KV1cIixcblx0XHRcdFx0XCJyb3VuZGVkLW5vbmVcIixcblx0XHRcdFx0XCJzbTpyb3VuZGVkLVsxMHB4XVwiLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0Ly8gTmV3IHJlc3BvbnNpdmUgbW9kZSAocmVjb21lbmRhZG8pXG5cdFx0aWYgKHRoaXMuc2l6ZSA9PT0gXCJyZXNwb25zaXZlXCIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJ1aWxkUGFuZWxDbGFzc2VzKFtcblx0XHRcdFx0Ly8gTW9iaWxlOiBmdWxsc2NyZWVuIGNvbiBib3JkZXMgcmVkb25kZWFkb3Mgc29sbyBhcnJpYmFcblx0XHRcdFx0XCJ3LWZ1bGxcIixcblx0XHRcdFx0XCJoLWZ1bGxcIixcblx0XHRcdFx0XCJtYXgtaC1bMTAwZHZoXVwiLFxuXHRcdFx0XHRcInJvdW5kZWQtdC1bMTBweF1cIixcblx0XHRcdFx0XCJzbTpyb3VuZGVkLVsxMHB4XVwiLFxuXHRcdFx0XHQvLyBEZXNrdG9wOiBtb2RhbCBjZW50cmFkb1xuXHRcdFx0XHRcInNtOnctYXV0b1wiLFxuXHRcdFx0XHRcInNtOmgtYXV0b1wiLFxuXHRcdFx0XHRcInNtOm1heC13LVs2NDBweF1cIixcblx0XHRcdFx0XCJzbTptYXgtaC1bY2FsYygxMDB2aC00cmVtKV1cIixcblx0XHRcdF0pO1xuXHRcdH1cblxuXHRcdC8vIE5ldyBzaXplIG9wdGlvbnNcblx0XHRjb25zdCBzaXplTWFwID0ge1xuXHRcdFx0c206IFwic206bWF4LXctWzQwMHB4XVwiLFxuXHRcdFx0bWQ6IFwic206bWF4LXctWzUwMHB4XVwiLFxuXHRcdFx0bGc6IFwic206bWF4LXctWzY0MHB4XVwiLFxuXHRcdFx0eGw6IFwic206bWF4LXctWzgwMHB4XVwiLFxuXHRcdH07XG5cblx0XHRjb25zdCBtYXhXaWR0aCA9IHNpemVNYXBbdGhpcy5zaXplIGFzIGtleW9mIHR5cGVvZiBzaXplTWFwXSB8fCBzaXplTWFwLmxnO1xuXG5cdFx0cmV0dXJuIHRoaXMuYnVpbGRQYW5lbENsYXNzZXMoW1xuXHRcdFx0Ly8gTW9iaWxlOiBmdWxsc2NyZWVuXG5cdFx0XHRcInctZnVsbFwiLFxuXHRcdFx0XCJoLWZ1bGxcIixcblx0XHRcdFwibWF4LWgtWzEwMGR2aF1cIixcblx0XHRcdFwicm91bmRlZC10LVsxMHB4XVwiLFxuXHRcdFx0Ly8gRGVza3RvcDogbW9kYWxcblx0XHRcdFwic206cm91bmRlZC1bMTBweF1cIixcblx0XHRcdFwic206dy1hdXRvXCIsXG5cdFx0XHRcInNtOmgtYXV0b1wiLFxuXHRcdFx0bWF4V2lkdGgsXG5cdFx0XHRcInNtOm1heC1oLVtjYWxjKDEwMHZoLTRyZW0pXVwiLFxuXHRcdF0pO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZFBhbmVsQ2xhc3NlcyhzaXplQ2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdGNvbnN0IGJhc2UgPSBbXG5cdFx0XHRcInJlbGF0aXZlXCIsXG5cdFx0XHRaX0lOREVYLm1vZGFsLCAvLyB6LTUwIC0gZGViZSBlc3RhciBzb2JyZSBiYWNrZHJvcCAoei00MClcblx0XHRcdFwiZmxleFwiLFxuXHRcdFx0XCJmbGV4LWNvbFwiLFxuXHRcdFx0XCJib3JkZXJcIixcblx0XHRcdFwiYm9yZGVyLWJvcmRlclwiLFxuXHRcdFx0XCJiZy1iYWNrZ3JvdW5kXCIsXG5cdFx0XHRcInRleHQtZm9yZWdyb3VuZFwiLFxuXHRcdFx0XCJzaGFkb3ctbGdcIixcblx0XHRcdFwib3ZlcmZsb3ctaGlkZGVuXCIsXG5cdFx0XHQuLi5zaXplQ2xhc3Nlcyxcblx0XHRcdHRoaXMuY2xhc3NOYW1lLFxuXHRcdF07XG5cblx0XHRyZXR1cm4gYmFzZS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG5cdH1cblxuXHRnZXQgYm9keVdyYXBwZXJDbGFzc05hbWUoKTogc3RyaW5nIHtcblx0XHQvLyBtaW4taC0wIGlzIENSSVRJQ0FMIGZvciBmbGV4IGNoaWxkIHRvIHNocmluayBhbmQgYWxsb3cgaW50ZXJuYWwgc2Nyb2xsXG5cdFx0Y29uc3QgYmFzZSA9IFtcblx0XHRcdFwiZmxleC0xXCIsXG5cdFx0XHRcIm1pbi1oLTBcIixcblx0XHRcdFwib3ZlcmZsb3cteS1hdXRvXCIsXG5cdFx0XHRcInB4LTRcIixcblx0XHRcdFwicHktNlwiLFxuXHRcdFx0XCJzbTpweC02XCIsXG5cdFx0XHR0aGlzLmJvZHlDbGFzc05hbWUsXG5cdFx0XTtcblxuXHRcdHJldHVybiBiYXNlLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcblx0fVxuXG5cdGdldCBoZWFkZXJXcmFwcGVyQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgYmFzZSA9IFtcblx0XHRcdFwiZmxleFwiLFxuXHRcdFx0XCJpdGVtcy1zdGFydFwiLFxuXHRcdFx0XCJqdXN0aWZ5LWJldHdlZW5cIixcblx0XHRcdFwiZ2FwLTNcIixcblx0XHRcdFwicC00XCIsXG5cdFx0XHRcInNtOnAtNlwiLFxuXHRcdFx0XCJib3JkZXItYlwiLFxuXHRcdFx0XCJib3JkZXItYm9yZGVyXCIsXG5cdFx0XHR0aGlzLmhlYWRlckNsYXNzTmFtZSxcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGJhc2UuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO1xuXHR9XG5cblx0Z2V0IGZvb3RlcldyYXBwZXJDbGFzc05hbWUoKTogc3RyaW5nIHtcblx0XHRjb25zdCBlZmZlY3RpdmVBbGlnbiA9XG5cdFx0XHR0aGlzLmFsaWduRm9vdGVyID09PSBcInJpZ2h0XCIgJiYgdGhpcy52YXJpYW50ID09PSBcImN1c3RvbS1jbG9zZVwiXG5cdFx0XHRcdD8gXCJsZWZ0XCJcblx0XHRcdFx0OiB0aGlzLmFsaWduRm9vdGVyO1xuXG5cdFx0Y29uc3QgYmFzZSA9IFtcblx0XHRcdFwicC00XCIsXG5cdFx0XHRcInNtOnAtNlwiLFxuXHRcdFx0XCJib3JkZXItdFwiLFxuXHRcdFx0XCJib3JkZXItYm9yZGVyXCIsXG5cdFx0XHQvLyBNb2JpbGU6IHNpZW1wcmUgZnVsbC13aWR0aFxuXHRcdFx0XCJmbGV4XCIsXG5cdFx0XHRcImZsZXgtY29sXCIsXG5cdFx0XHRcImdhcC0yXCIsXG5cdFx0XHQvLyBEZXNrdG9wOiBzZWfDum4gYWxpZ25Gb290ZXJcblx0XHRcdGVmZmVjdGl2ZUFsaWduID09PSBcImZ1bGwtd2lkdGhcIlxuXHRcdFx0XHQ/IFwic206ZmxleC1jb2xcIlxuXHRcdFx0XHQ6IFwic206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCIsXG5cdFx0XHRlZmZlY3RpdmVBbGlnbiA9PT0gXCJsZWZ0XCIgPyBcInNtOmp1c3RpZnktc3RhcnRcIiA6IFwiXCIsXG5cdFx0XHRlZmZlY3RpdmVBbGlnbiA9PT0gXCJyaWdodFwiID8gXCJzbTpqdXN0aWZ5LWVuZFwiIDogXCJcIixcblx0XHRcdHRoaXMuZm9vdGVyQ2xhc3NOYW1lLFxuXHRcdF07XG5cblx0XHRyZXR1cm4gYmFzZS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG5cdH1cblxuXHRnZXQgY29udGFpbmVyQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG5cdFx0Ly8gQ29udGFpbmVyIGNvbiBiYWNrZHJvcCB6LTQwXG5cdFx0Ly8gTW9iaWxlOiBmdWxsc2NyZWVuIGRlc2RlIGVsIGJvdHRvbVxuXHRcdC8vIERlc2t0b3A6IGNlbnRyYWRvXG5cdFx0cmV0dXJuIHJlc3BvbnNpdmUoe1xuXHRcdFx0ZGVmYXVsdDogYGZpeGVkIGluc2V0LXgtMCBib3R0b20tMCAke1pfSU5ERVgubW9kYWxCYWNrZHJvcH0gZmxleCBpdGVtcy1lbmQganVzdGlmeS1jZW50ZXJgLFxuXHRcdFx0c206IGBmaXhlZCBpbnNldC0wICR7Wl9JTkRFWC5tb2RhbEJhY2tkcm9wfSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTRgLFxuXHRcdH0pO1xuXHR9XG59XG4iLCI8ZGl2ICpuZ0lmPVwib3BlblwiIFtuZ0NsYXNzXT1cImNvbnRhaW5lckNsYXNzTmFtZVwiPlxuICA8IS0tIEJhY2tkcm9wIC0tPlxuICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMCBiZy1mb3JlZ3JvdW5kLzMwIGJhY2tkcm9wLWJsdXItc21cIiAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKClcIj48L2Rpdj5cbiAgXG4gIDwhLS0gRGlhbG9nIFBhbmVsIC0tPlxuICA8c2VjdGlvbiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBbbmdDbGFzc109XCJwYW5lbENsYXNzTmFtZVwiPlxuICAgIDwhLS0gSGVhZGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJzaG93SGVhZGVyXCIgW25nQ2xhc3NdPVwiaGVhZGVyV3JhcHBlckNsYXNzTmFtZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTAgZmxleC0xXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cIm0tMCB0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0IHRleHQtZm9yZWdyb3VuZFwiPnt7IHRpdGxlIH19PC9oMj5cbiAgICAgICAgPHAgKm5nSWY9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwibS0wIG10LTIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBkZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dDbG9zZUJ1dHRvblwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGgtNiB3LTYgZmxleC1zaHJpbmstMCBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc20gYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0wIHRleHQtZm9yZWdyb3VuZCBvcGFjaXR5LTcwIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgdHJhbnNpdGlvbi1vcGFjaXR5IGhvdmVyOm9wYWNpdHktMTAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yaW5nIGZvY3VzOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIGRpYWxvZ1wiXG4gICAgICA+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzPVwiaC00IHctNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNiA2TDE4IDE4TTE4IDZMNiAxOFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48L3BhdGg+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPGRpdiBbbmdDbGFzc109XCJib2R5V3JhcHBlckNsYXNzTmFtZVwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb290ZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cInNob3dGb290ZXJcIiBbbmdDbGFzc109XCJmb290ZXJXcmFwcGVyQ2xhc3NOYW1lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFudCA9PT0gJ2N1c3RvbS1jbG9zZSc7IGVsc2UgZGVmYXVsdEFjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC05IHctZnVsbCBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gc206dy1hdXRvXCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWNvbmRhcnlBY3Rpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBzZWNvbmRhcnlBY3Rpb25UZXh0IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFjdGlvbnM+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGgtOSB3LWZ1bGwgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHNtOnctYXV0b1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2Vjb25kYXJ5QWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgc2Vjb25kYXJ5QWN0aW9uVGV4dCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC05IHctZnVsbCBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYmctcHJpbWFyeSBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBzaGFkb3ctc20gc206dy1hdXRvXCJcbiAgICAgICAgICAoY2xpY2spPVwib25QcmltYXJ5QWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcHJpbWFyeUFjdGlvblRleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L2Rpdj5cbiJdfQ==