@acrodata/gui 2.7.0 → 2.9.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 (62) hide show
  1. package/button-toggle/button-toggle.d.ts +0 -2
  2. package/button-toggle/button-toggle.scss +1 -1
  3. package/codearea/codearea-dialog.d.ts +1 -5
  4. package/codearea/codearea-dialog.scss +1 -1
  5. package/codearea/codearea.d.ts +1 -5
  6. package/codearea/codearea.scss +2 -2
  7. package/combobox/combobox.d.ts +1 -2
  8. package/combobox/combobox.scss +1 -1
  9. package/fesm2022/acrodata-gui.mjs +220 -227
  10. package/fesm2022/acrodata-gui.mjs.map +1 -1
  11. package/field-group/field-group.d.ts +1 -2
  12. package/field-group/field-group.scss +1 -1
  13. package/file-uploader/file-uploader-config.d.ts +0 -1
  14. package/file-uploader/file-uploader.d.ts +2 -4
  15. package/file-uploader/file-uploader.scss +1 -1
  16. package/fill/fill-picker.d.ts +3 -4
  17. package/fill/fill-picker.scss +7 -7
  18. package/fill/fill.d.ts +1 -2
  19. package/fill/fill.scss +4 -4
  20. package/gui-form.d.ts +1 -2
  21. package/gui-form.scss +5 -5
  22. package/gui-icons.d.ts +2 -5
  23. package/gui-utils.d.ts +1 -2
  24. package/image-select/image-select.d.ts +1 -2
  25. package/image-select/image-select.scss +8 -1
  26. package/inline-group/inline-group.scss +1 -1
  27. package/input-number/input-number.d.ts +0 -2
  28. package/input-text/input-text.d.ts +0 -2
  29. package/package.json +1 -3
  30. package/select/select.d.ts +0 -2
  31. package/select/select.scss +1 -1
  32. package/slider/slider.d.ts +0 -2
  33. package/switch/switch.d.ts +0 -2
  34. package/textarea/textarea.d.ts +0 -2
  35. package/esm2022/acrodata-gui.mjs +0 -5
  36. package/esm2022/button-toggle/button-toggle.mjs +0 -69
  37. package/esm2022/button-toggle/icon.mjs +0 -33
  38. package/esm2022/codearea/codearea-config.mjs +0 -20
  39. package/esm2022/codearea/codearea-dialog.mjs +0 -70
  40. package/esm2022/codearea/codearea.mjs +0 -147
  41. package/esm2022/combobox/combobox.mjs +0 -82
  42. package/esm2022/field-group/field-group.mjs +0 -30
  43. package/esm2022/field-label/field-label.mjs +0 -31
  44. package/esm2022/file-uploader/file-uploader-config.mjs +0 -43
  45. package/esm2022/file-uploader/file-uploader.mjs +0 -141
  46. package/esm2022/fill/fill-picker.mjs +0 -165
  47. package/esm2022/fill/fill.mjs +0 -85
  48. package/esm2022/gui-form.mjs +0 -304
  49. package/esm2022/gui-icons.mjs +0 -100
  50. package/esm2022/gui-module.mjs +0 -201
  51. package/esm2022/gui-utils.mjs +0 -128
  52. package/esm2022/icon-button-wrapper/icon-button-wrapper.mjs +0 -13
  53. package/esm2022/image-select/image-select.mjs +0 -79
  54. package/esm2022/inline-group/inline-group.mjs +0 -19
  55. package/esm2022/input-number/input-number.mjs +0 -58
  56. package/esm2022/input-text/input-text.mjs +0 -59
  57. package/esm2022/interface.mjs +0 -2
  58. package/esm2022/public-api.mjs +0 -30
  59. package/esm2022/select/select.mjs +0 -69
  60. package/esm2022/slider/slider.mjs +0 -85
  61. package/esm2022/switch/switch.mjs +0 -59
  62. package/esm2022/textarea/textarea.mjs +0 -59
@@ -1,304 +0,0 @@
1
- import { NgTemplateOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
3
- import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
4
- import { MatIconButton } from '@angular/material/button';
5
- import { MatExpansionPanel, MatExpansionPanelContent, MatExpansionPanelHeader, } from '@angular/material/expansion';
6
- import { MatIcon } from '@angular/material/icon';
7
- import { MatTab, MatTabContent, MatTabGroup, MatTabLabel } from '@angular/material/tabs';
8
- import { Subscription, mergeWith, of } from 'rxjs';
9
- import { GuiButtonToggle } from './button-toggle/button-toggle';
10
- import { GuiCodearea } from './codearea/codearea';
11
- import { GuiCombobox } from './combobox/combobox';
12
- import { GuiFieldGroup } from './field-group/field-group';
13
- import { GuiFieldLabel } from './field-label/field-label';
14
- import { GuiFileUploader } from './file-uploader/file-uploader';
15
- import { GuiFill } from './fill/fill';
16
- import { GuiEjsPipe, GuiFlexDirective, compareValues, getModelFromConfig, getValueByPath, } from './gui-utils';
17
- import { GuiIconButtonWrapper } from './icon-button-wrapper/icon-button-wrapper';
18
- import { GuiImageSelect } from './image-select/image-select';
19
- import { GuiInlineGroup } from './inline-group/inline-group';
20
- import { GuiInputNumber } from './input-number/input-number';
21
- import { GuiInputText } from './input-text/input-text';
22
- import { GuiSelect } from './select/select';
23
- import { GuiSlider } from './slider/slider';
24
- import { GuiSwitch } from './switch/switch';
25
- import { GuiTextarea } from './textarea/textarea';
26
- import * as i0 from "@angular/core";
27
- import * as i1 from "./gui-icons";
28
- import * as i2 from "@angular/forms";
29
- let nextUniqueId = 0;
30
- export class GuiForm {
31
- constructor(iconsRegistry) {
32
- /**
33
- * The form instance which allow to track model value and validation status.
34
- */
35
- this.form = new FormGroup({});
36
- /**
37
- * The field configurations for building the form.
38
- */
39
- this.config = {};
40
- /**
41
- * The model to be represented by the form.
42
- */
43
- this.model = {};
44
- /**
45
- * Fired on model value change
46
- */
47
- this.modelChange = new EventEmitter();
48
- this.formFields = [];
49
- this.formSubscription = Subscription.EMPTY;
50
- this.controlSubscriptions = [];
51
- // Unique id for this form
52
- this.uid = `gui-form-${nextUniqueId++}`;
53
- iconsRegistry.add('horizontal', 'vertical', 'copy', 'add', 'delete');
54
- }
55
- ngOnChanges(changes) {
56
- if (changes['config']) {
57
- getModelFromConfig(this.config, this.model);
58
- this.form.controls = {}; // reset controls
59
- this.formFields = this.getFormFieldArray(this.form, this.config, this.model);
60
- }
61
- if (changes['model'] && this.model && Object.keys(this.model).length > 0) {
62
- this.form.patchValue(this.model);
63
- }
64
- }
65
- ngOnInit() {
66
- this.formSubscription = this.form.valueChanges.subscribe(value => {
67
- Object.assign(this.model, value);
68
- this.modelChange.emit(value);
69
- });
70
- }
71
- ngOnDestroy() {
72
- this.formSubscription.unsubscribe();
73
- this.controlSubscriptions.forEach(s => s.unsubscribe());
74
- }
75
- /**
76
- * Convert the object config to array config and register into the reactive form.
77
- *
78
- * @param form The reactive form instance
79
- * @param config The config of the form fields
80
- * @param model The value of the form control
81
- * @param defaultValue The default value of the form field
82
- * @param parentType The type of the form field parent
83
- * @returns
84
- */
85
- getFormFieldArray(form, config = {}, model = {}, defaultValue = null, parentType = 'group') {
86
- const tempArr = [];
87
- for (const key of Object.keys(config)) {
88
- // Inferring the form type by the data type of `children`
89
- // 1. `undefined` => FormControl
90
- // 2. `array` => FormArray
91
- // 3. `object` => FormGroup
92
- const _children = config[key].template ? [] : config[key].children;
93
- const _type = !_children ? 'control' : Array.isArray(_children) ? 'array' : 'group';
94
- const item = {
95
- ...config[key],
96
- _type,
97
- key,
98
- parentType,
99
- model: model[key],
100
- default: defaultValue?.[key] ?? config[key].default,
101
- index: Number(key), // the string key will be `NaN`
102
- show: true,
103
- };
104
- // The `group` type generally have no `default`, so we should
105
- // set the default value manually
106
- if (item.children && model[key] == null && item.default == null) {
107
- item.model = model[key] = item._type === 'array' ? [] : {};
108
- }
109
- // Generate model by the `default` key of the field config
110
- if (typeof model === 'object' && model[key] == null) {
111
- model[key] = item.default;
112
- }
113
- // Special judgment on `tabs` type, the `children` key will be ignored if
114
- // there has a `template` key
115
- if (item.template) {
116
- // If the model is an array, the default value of the form field
117
- // will use the model's value
118
- if (Array.isArray(item.model)) {
119
- item.default = item.model;
120
- }
121
- if (item.default?.length) {
122
- item.children = item.default.map((value) => {
123
- return {
124
- default: value,
125
- ...item.template,
126
- };
127
- });
128
- }
129
- else {
130
- item.children = [];
131
- }
132
- }
133
- // Parse the `showIf` conditions
134
- if (item.showIf) {
135
- const setVisibility = (compareWith) => {
136
- if (item.showIf.logicalType === '$or') {
137
- item.show = item.showIf.conditions.some(c => compareWith(c));
138
- }
139
- else {
140
- item.show = item.showIf.conditions.every(c => compareWith(c));
141
- }
142
- };
143
- // Set the init visibility of the field
144
- setVisibility(c => {
145
- const cfg = getValueByPath(config, c[0]) ?? getValueByPath(this.config, c[0]);
146
- const val = getValueByPath(model, c[0]) ?? getValueByPath(this.model, c[0]);
147
- return compareValues(val ?? cfg?.['default'], c[2], c[1]);
148
- });
149
- // Delay the subscription to make sure all the form controls have been created
150
- setTimeout(() => {
151
- const getControl = (path) => form.get(path) || this.form.get(path);
152
- const controls = item.showIf.conditions.map(c => getControl(c[0]));
153
- const valueChanges$ = controls.map(control => control?.valueChanges || of());
154
- const subscription = of()
155
- .pipe(mergeWith(...valueChanges$))
156
- .subscribe(() => {
157
- setVisibility(c => compareValues(getControl(c[0])?.value, c[2], c[1]));
158
- });
159
- this.controlSubscriptions.push(subscription);
160
- });
161
- }
162
- if (item._type === 'control') {
163
- const formState = { value: item.default, disabled: item.disabled };
164
- if (form instanceof FormGroup) {
165
- form.registerControl(item.key, new FormControl(formState));
166
- }
167
- else if (form instanceof FormArray) {
168
- form.insert(item.index || form.length, new FormControl(formState), { emitEvent: false });
169
- }
170
- }
171
- else if (item._type === 'array') {
172
- let formArray = new FormArray([]);
173
- if (form instanceof FormGroup) {
174
- formArray = form.registerControl(item.key, new FormArray([]));
175
- }
176
- else if (form instanceof FormArray) {
177
- form.insert(item.index || form.length, formArray, { emitEvent: false });
178
- }
179
- item.children = this.getFormFieldArray(formArray, item.children, item.model, item.default, item.type);
180
- item.selectedIndex = 0;
181
- }
182
- else if (item._type === 'group') {
183
- let formGroup = new FormGroup({});
184
- if (form instanceof FormGroup) {
185
- formGroup = form.registerControl(item.key, new FormGroup({}));
186
- }
187
- else if (form instanceof FormArray) {
188
- form.insert(item.index || form.length, formGroup, { emitEvent: false });
189
- }
190
- item.children = this.getFormFieldArray(formGroup, item.children, item.model, item.default, item.type);
191
- }
192
- tempArr.push(item);
193
- }
194
- return tempArr;
195
- }
196
- /**
197
- * Add a tab item.
198
- *
199
- * @param e The mouse event
200
- * @param formArray The reactive form instance
201
- * @param tabs The config of the tabs field
202
- * @param copy Whether to copy the current tab
203
- * @param index The index of the tabs array
204
- */
205
- addTab(e, formArray, tabs, copy, index) {
206
- e.stopPropagation();
207
- const insertIndex = index !== void 0 ? index + 1 : copy ? tabs.selectedIndex + 1 : tabs.children.length;
208
- // Save the index of the insertion in the config
209
- tabs.template.index = insertIndex;
210
- // The key in the object and the index in the array should be the same
211
- tabs.children.forEach((child, index) => {
212
- if (index >= insertIndex) {
213
- child.index += 1;
214
- child.key = child.index + ''; // convert to string
215
- }
216
- });
217
- const formValue = formArray.get(insertIndex - 1 + '')?.value;
218
- // The constructed object looks like this `[{ key: 'tab', children: template }]`
219
- // The key should preferably be `null`
220
- const newTab = this.getFormFieldArray(formArray, { [insertIndex]: tabs.template }, copy ? { [insertIndex]: formValue } : {}, copy ? { [insertIndex]: formValue } : null, 'tabs');
221
- tabs.children.splice(insertIndex, 0, newTab[0]);
222
- // update the form model
223
- formArray.patchValue(formArray.value);
224
- }
225
- /**
226
- * Remove a tab item.
227
- *
228
- * @param e The mouse event
229
- * @param formArray The reactive form instance
230
- * @param tabs The config of the tabs field
231
- * @param index The index of the tabs array
232
- */
233
- removeTab(e, formArray, tabs, index) {
234
- e.stopPropagation();
235
- const removeIndex = index === void 0 ? tabs.selectedIndex : index;
236
- tabs.children.forEach((child, index) => {
237
- if (index > removeIndex) {
238
- child.index -= 1;
239
- child.key = child.index + ''; // convert to string
240
- }
241
- });
242
- tabs.children.splice(removeIndex, 1);
243
- formArray.removeAt(removeIndex);
244
- }
245
- /**
246
- * Change the display mode of tabs.
247
- *
248
- * @param e The mouse event
249
- * @param tabs The config of the tabs field
250
- * @param mode The display mode of tabs
251
- */
252
- changeTabsMode(e, tabs, mode) {
253
- e.stopPropagation();
254
- tabs.mode = mode;
255
- }
256
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiForm, deps: [{ token: i1.GuiIconsRegistry }], target: i0.ɵɵFactoryTarget.Component }); }
257
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: GuiForm, isStandalone: true, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { properties: { "attr.id": "uid" }, classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\" />\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('codearea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-codearea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <button class=\"gui-list-item-title\" type=\"button\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: controlItem, formGroup: form.get([item.key, menuChild.key])\n }\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: menuChild, formGroup: form.get(item.key)\n }\" />\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "directive", type: MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "directive", type: GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "component", type: GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFill, selector: "gui-fill", inputs: ["config", "disabled", "type"] }, { kind: "component", type: GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "component", type: GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }, { kind: "component", type: GuiCombobox, selector: "gui-combobox", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiCodearea, selector: "gui-codearea", inputs: ["config", "disabled", "setup", "height", "language"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
258
- }
259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiForm, decorators: [{
260
- type: Component,
261
- args: [{ selector: 'gui-form', host: {
262
- '[attr.id]': 'uid',
263
- 'class': 'gui-form',
264
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
265
- ReactiveFormsModule,
266
- NgTemplateOutlet,
267
- MatExpansionPanel,
268
- MatExpansionPanelHeader,
269
- MatExpansionPanelContent,
270
- MatIconButton,
271
- MatIcon,
272
- MatTabGroup,
273
- MatTab,
274
- MatTabLabel,
275
- MatTabContent,
276
- GuiFieldGroup,
277
- GuiFlexDirective,
278
- GuiInputText,
279
- GuiInputNumber,
280
- GuiSelect,
281
- GuiSwitch,
282
- GuiSlider,
283
- GuiButtonToggle,
284
- GuiFill,
285
- GuiFileUploader,
286
- GuiImageSelect,
287
- GuiTextarea,
288
- GuiInlineGroup,
289
- GuiFieldLabel,
290
- GuiIconButtonWrapper,
291
- GuiEjsPipe,
292
- GuiCombobox,
293
- GuiCodearea,
294
- ], template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\" />\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('codearea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-codearea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <button class=\"gui-list-item-title\" type=\"button\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: controlItem, formGroup: form.get([item.key, menuChild.key])\n }\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: menuChild, formGroup: form.get(item.key)\n }\" />\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
295
- }], ctorParameters: () => [{ type: i1.GuiIconsRegistry }], propDecorators: { form: [{
296
- type: Input
297
- }], config: [{
298
- type: Input
299
- }], model: [{
300
- type: Input
301
- }], modelChange: [{
302
- type: Output
303
- }] } });
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVB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Z0ZBQ2IsZ0JBQWdCLHFFQUNoQixZQUFZLDJGQUNaLGNBQWMsNkZBQ2QsU0FBUyx1RkFDVCxTQUFTLHVGQUNULFNBQVMsdUZBQ1QsZUFBZSw4RkFDZixPQUFPLDZGQUNQLGVBQWUsaUpBQ2YsY0FBYyx5R0FDZCxXQUFXLHlGQUNYLGNBQWMsaUZBQ2QsYUFBYSx5RkFDYixvQkFBb0IsK0RBQ3BCLFVBQVUsNENBQ1YsV0FBVyxxR0FDWCxXQUFXOzs0RkFHRixPQUFPO2tCQTNDbkIsU0FBUzsrQkFDRSxVQUFVLFFBR2Q7d0JBQ0osV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLE9BQU8sRUFBRSxVQUFVO3FCQUNwQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixPQUFPO3dCQUNQLFdBQVc7d0JBQ1gsTUFBTTt3QkFDTixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxTQUFTO3dCQUNULFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsVUFBVTt3QkFDVixXQUFXO3dCQUNYLFdBQVc7cUJBQ1o7cUZBTVEsSUFBSTtzQkFBWixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7XG4gIE1hdEV4cGFuc2lvblBhbmVsLFxuICBNYXRFeHBhbnNpb25QYW5lbENvbnRlbnQsXG4gIE1hdEV4cGFuc2lvblBhbmVsSGVhZGVyLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VGFiLCBNYXRUYWJDb250ZW50LCBNYXRUYWJHcm91cCwgTWF0VGFiTGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgbWVyZ2VXaXRoLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBHdWlCdXR0b25Ub2dnbGUgfSBmcm9tICcuL2J1dHRvbi10b2dnbGUvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBHdWlDb2RlYXJlYSB9IGZyb20gJy4vY29kZWFyZWEvY29kZWFyZWEnO1xuaW1wb3J0IHsgR3VpQ29tYm9ib3ggfSBmcm9tICcuL2NvbWJvYm94L2NvbWJvYm94JztcbmltcG9ydCB7IEd1aUZpZWxkR3JvdXAgfSBmcm9tICcuL2ZpZWxkLWdyb3VwL2ZpZWxkLWdyb3VwJztcbmltcG9ydCB7IEd1aUZpZWxkTGFiZWwgfSBmcm9tICcuL2ZpZWxkLWxhYmVsL2ZpZWxkLWxhYmVsJztcbmltcG9ydCB7IEd1aUZpbGVVcGxvYWRlciB9IGZyb20gJy4vZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyJztcbmltcG9ydCB7IEd1aUZpbGwgfSBmcm9tICcuL2ZpbGwvZmlsbCc7XG5pbXBvcnQge1xuICBHdWlFanNQaXBlLFxuICBHdWlGbGV4RGlyZWN0aXZlLFxuICBjb21wYXJlVmFsdWVzLFxuICBnZXRNb2RlbEZyb21Db25maWcsXG4gIGdldFZhbHVlQnlQYXRoLFxufSBmcm9tICcuL2d1aS11dGlscyc7XG5pbXBvcnQgeyBHdWlJY29uQnV0dG9uV3JhcHBlciB9IGZyb20gJy4vaWNvbi1idXR0b24td3JhcHBlci9pY29uLWJ1dHRvbi13cmFwcGVyJztcbmltcG9ydCB7IEd1aUltYWdlU2VsZWN0IH0gZnJvbSAnLi9pbWFnZS1zZWxlY3QvaW1hZ2Utc2VsZWN0JztcbmltcG9ydCB7IEd1aUlubGluZUdyb3VwIH0gZnJvbSAnLi9pbmxpbmUtZ3JvdXAvaW5saW5lLWdyb3VwJztcbmltcG9ydCB7IEd1aUlucHV0TnVtYmVyIH0gZnJvbSAnLi9pbnB1dC1udW1iZXIvaW5wdXQtbnVtYmVyJztcbmltcG9ydCB7IEd1aUlucHV0VGV4dCB9IGZyb20gJy4vaW5wdXQtdGV4dC9pbnB1dC10ZXh0JztcbmltcG9ydCB7IEd1aUNvbmRpdGlvbiwgR3VpQ29udHJvbCwgR3VpRmllbGRUeXBlLCBHdWlGaWVsZHMsIEd1aVRhYnNNb2RlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3VpU2VsZWN0IH0gZnJvbSAnLi9zZWxlY3Qvc2VsZWN0JztcbmltcG9ydCB7IEd1aVNsaWRlciB9IGZyb20gJy4vc2xpZGVyL3NsaWRlcic7XG5pbXBvcnQgeyBHdWlTd2l0Y2ggfSBmcm9tICcuL3N3aXRjaC9zd2l0Y2gnO1xuaW1wb3J0IHsgR3VpVGV4dGFyZWEgfSBmcm9tICcuL3RleHRhcmVhL3RleHRhcmVhJztcblxuaW1wb3J0IHsgR3VpSWNvbnNSZWdpc3RyeSB9IGZyb20gJy4vZ3VpLWljb25zJztcblxubGV0IG5leHRVbmlxdWVJZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2d1aS1mb3JtLmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ3VpLWZvcm0uc2NzcycsXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuaWRdJzogJ3VpZCcsXG4gICAgJ2NsYXNzJzogJ2d1aS1mb3JtJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTWF0RXhwYW5zaW9uUGFuZWwsXG4gICAgTWF0RXhwYW5zaW9uUGFuZWxIZWFkZXIsXG4gICAgTWF0RXhwYW5zaW9uUGFuZWxDb250ZW50LFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0SWNvbixcbiAgICBNYXRUYWJHcm91cCxcbiAgICBNYXRUYWIsXG4gICAgTWF0VGFiTGFiZWwsXG4gICAgTWF0VGFiQ29udGVudCxcbiAgICBHdWlGaWVsZEdyb3VwLFxuICAgIEd1aUZsZXhEaXJlY3RpdmUsXG4gICAgR3VpSW5wdXRUZXh0LFxuICAgIEd1aUlucHV0TnVtYmVyLFxuICAgIEd1aVNlbGVjdCxcbiAgICBHdWlTd2l0Y2gsXG4gICAgR3VpU2xpZGVyLFxuICAgIEd1aUJ1dHRvblRvZ2dsZSxcbiAgICBHdWlGaWxsLFxuICAgIEd1aUZpbGVVcGxvYWRlcixcbiAgICBHdWlJbWFnZVNlbGVjdCxcbiAgICBHdWlUZXh0YXJlYSxcbiAgICBHdWlJbmxpbmVHcm91cCxcbiAgICBHdWlGaWVsZExhYmVsLFxuICAgIEd1aUljb25CdXR0b25XcmFwcGVyLFxuICAgIEd1aUVqc1BpcGUsXG4gICAgR3VpQ29tYm9ib3gsXG4gICAgR3VpQ29kZWFyZWEsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEd1aUZvcm0gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGluc3RhbmNlIHdoaWNoIGFsbG93IHRvIHRyYWNrIG1vZGVsIHZhbHVlIGFuZCB2YWxpZGF0aW9uIHN0YXR1cy5cbiAgICovXG4gIEBJbnB1dCgpIGZvcm0gPSBuZXcgRm9ybUdyb3VwPGFueT4oe30pO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQgY29uZmlndXJhdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBmb3JtLlxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnOiBHdWlGaWVsZHMgPSB7fTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3JtLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAvKipcbiAgICogRmlyZWQgb24gbW9kZWwgdmFsdWUgY2hhbmdlXG4gICAqL1xuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZm9ybUZpZWxkczogR3VpQ29udHJvbFtdID0gW107XG5cbiAgZm9ybVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBjb250cm9sU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgZm9ybVxuICB1aWQgPSBgZ3VpLWZvcm0tJHtuZXh0VW5pcXVlSWQrK31gO1xuXG4gIGNvbnN0cnVjdG9yKGljb25zUmVnaXN0cnk6IEd1aUljb25zUmVnaXN0cnkpIHtcbiAgICBpY29uc1JlZ2lzdHJ5LmFkZCgnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCcsICdjb3B5JywgJ2FkZCcsICdkZWxldGUnKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIGdldE1vZGVsRnJvbUNvbmZpZyh0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHMgPSB7fTsgLy8gcmVzZXQgY29udHJvbHNcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkodGhpcy5mb3JtLCB0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10gJiYgdGhpcy5tb2RlbCAmJiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHZhbHVlKTtcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnXG4gICkge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIC8vIEluZmVycmluZyB0aGUgZm9ybSB0eXBlIGJ5IHRoZSBkYXRhIHR5cGUgb2YgYGNoaWxkcmVuYFxuICAgICAgLy8gMS4gYHVuZGVmaW5lZGAgPT4gRm9ybUNvbnRyb2xcbiAgICAgIC8vIDIuIGBhcnJheWAgICAgID0+IEZvcm1BcnJheVxuICAgICAgLy8gMy4gYG9iamVjdGAgICAgPT4gRm9ybUdyb3VwXG4gICAgICBjb25zdCBfY2hpbGRyZW4gPSAoY29uZmlnIGFzIGFueSlba2V5XS50ZW1wbGF0ZSA/IFtdIDogKGNvbmZpZyBhcyBhbnkpW2tleV0uY2hpbGRyZW47XG4gICAgICBjb25zdCBfdHlwZSA9ICFfY2hpbGRyZW4gPyAnY29udHJvbCcgOiBBcnJheS5pc0FycmF5KF9jaGlsZHJlbikgPyAnYXJyYXknIDogJ2dyb3VwJztcblxuICAgICAgY29uc3QgaXRlbTogR3VpQ29udHJvbCA9IHtcbiAgICAgICAgLi4uKGNvbmZpZyBhcyBhbnkpW2tleV0sXG4gICAgICAgIF90eXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgIG1vZGVsOiBtb2RlbFtrZXldLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWU/LltrZXldID8/IChjb25maWcgYXMgYW55KVtrZXldLmRlZmF1bHQsXG4gICAgICAgIGluZGV4OiBOdW1iZXIoa2V5KSwgLy8gdGhlIHN0cmluZyBrZXkgd2lsbCBiZSBgTmFOYFxuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIGBncm91cGAgdHlwZSBnZW5lcmFsbHkgaGF2ZSBubyBgZGVmYXVsdGAsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG1hbnVhbGx5XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBtb2RlbFtrZXldID09IG51bGwgJiYgaXRlbS5kZWZhdWx0ID09IG51bGwpIHtcbiAgICAgICAgaXRlbS5tb2RlbCA9IG1vZGVsW2tleV0gPSBpdGVtLl90eXBlID09PSAnYXJyYXknID8gW10gOiB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbW9kZWwgYnkgdGhlIGBkZWZhdWx0YCBrZXkgb2YgdGhlIGZpZWxkIGNvbmZpZ1xuICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ29iamVjdCcgJiYgbW9kZWxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIG1vZGVsW2tleV0gPSBpdGVtLmRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwganVkZ21lbnQgb24gYHRhYnNgIHR5cGUsIHRoZSBgY2hpbGRyZW5gIGtleSB3aWxsIGJlIGlnbm9yZWQgaWZcbiAgICAgIC8vIHRoZXJlIGhhcyBhIGB0ZW1wbGF0ZWAga2V5XG4gICAgICBpZiAoaXRlbS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBJZiB0aGUgbW9kZWwgaXMgYW4gYXJyYXksIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAgICAgIC8vIHdpbGwgdXNlIHRoZSBtb2RlbCdzIHZhbHVlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0ubW9kZWwpKSB7XG4gICAgICAgICAgaXRlbS5kZWZhdWx0ID0gaXRlbS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5kZWZhdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gaXRlbS5kZWZhdWx0Lm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGVmYXVsdDogdmFsdWUsXG4gICAgICAgICAgICAgIC4uLml0ZW0udGVtcGxhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSB0aGUgYHNob3dJZmAgY29uZGl0aW9uc1xuICAgICAgaWYgKGl0ZW0uc2hvd0lmKSB7XG4gICAgICAgIGNvbnN0IHNldFZpc2liaWxpdHkgPSAoY29tcGFyZVdpdGg6IChjb25kaXRpb246IEd1aUNvbmRpdGlvbikgPT4gYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnNob3dJZiEubG9naWNhbFR5cGUgPT09ICckb3InKSB7XG4gICAgICAgICAgICBpdGVtLnNob3cgPSBpdGVtLnNob3dJZiEuY29uZGl0aW9ucy5zb21lKGMgPT4gY29tcGFyZVdpdGgoYykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnNob3cgPSBpdGVtLnNob3dJZiEuY29uZGl0aW9ucy5ldmVyeShjID0+IGNvbXBhcmVXaXRoKGMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IHRoZSBpbml0IHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkXG4gICAgICAgIHNldFZpc2liaWxpdHkoYyA9PiB7XG4gICAgICAgICAgY29uc3QgY2ZnID0gZ2V0VmFsdWVCeVBhdGgoY29uZmlnLCBjWzBdKSA/PyBnZXRWYWx1ZUJ5UGF0aCh0aGlzLmNvbmZpZywgY1swXSk7XG4gICAgICAgICAgY29uc3QgdmFsID0gZ2V0VmFsdWVCeVBhdGgobW9kZWwsIGNbMF0pID8/IGdldFZhbHVlQnlQYXRoKHRoaXMubW9kZWwsIGNbMF0pO1xuICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVzKHZhbCA/PyBjZmc/LlsnZGVmYXVsdCddLCBjWzJdLCBjWzFdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVsYXkgdGhlIHN1YnNjcmlwdGlvbiB0byBtYWtlIHN1cmUgYWxsIHRoZSBmb3JtIGNvbnRyb2xzIGhhdmUgYmVlbiBjcmVhdGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdldENvbnRyb2wgPSAocGF0aDogc3RyaW5nKSA9PiBmb3JtLmdldChwYXRoKSB8fCB0aGlzLmZvcm0uZ2V0KHBhdGgpO1xuXG4gICAgICAgICAgY29uc3QgY29udHJvbHMgPSBpdGVtLnNob3dJZiEuY29uZGl0aW9ucy5tYXAoYyA9PiBnZXRDb250cm9sKGNbMF0pKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZXMkID0gY29udHJvbHMubWFwKGNvbnRyb2wgPT4gY29udHJvbD8udmFsdWVDaGFuZ2VzIHx8IG9mKCkpO1xuICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9mKClcbiAgICAgICAgICAgIC5waXBlKG1lcmdlV2l0aCguLi52YWx1ZUNoYW5nZXMkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KGMgPT4gY29tcGFyZVZhbHVlcyhnZXRDb250cm9sKGNbMF0pPy52YWx1ZSwgY1syXSwgY1sxXSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLl90eXBlID09PSAnY29udHJvbCcpIHtcbiAgICAgICAgY29uc3QgZm9ybVN0YXRlID0geyB2YWx1ZTogaXRlbS5kZWZhdWx0LCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCB9O1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5fdHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBsZXQgZm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheTxhbnk+KFtdKTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtQXJyYXkgPSBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1BcnJheShbXSkpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgZm9ybUFycmF5LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgICAgICBmb3JtQXJyYXksXG4gICAgICAgICAgaXRlbS5jaGlsZHJlbixcbiAgICAgICAgICBpdGVtLm1vZGVsLFxuICAgICAgICAgIGl0ZW0uZGVmYXVsdCxcbiAgICAgICAgICBpdGVtLnR5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBpdGVtLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtR3JvdXAgPSBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Hcm91cCh7fSkpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgZm9ybUdyb3VwLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgICAgICBmb3JtR3JvdXAsXG4gICAgICAgICAgaXRlbS5jaGlsZHJlbixcbiAgICAgICAgICBpdGVtLm1vZGVsLFxuICAgICAgICAgIGl0ZW0uZGVmYXVsdCxcbiAgICAgICAgICBpdGVtLnR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGVtcEFyci5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wQXJyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybUFycmF5IFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gY29weSAgICAgIFdoZXRoZXIgdG8gY29weSB0aGUgY3VycmVudCB0YWJcbiAgICogQHBhcmFtIGluZGV4ICAgICBUaGUgaW5kZXggb2YgdGhlIHRhYnMgYXJyYXlcbiAgICovXG4gIGFkZFRhYihlOiBNb3VzZUV2ZW50LCBmb3JtQXJyYXk6IEZvcm1BcnJheSwgdGFiczogR3VpQ29udHJvbCwgY29weT86IGJvb2xlYW4sIGluZGV4PzogbnVtYmVyKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBpbnNlcnRJbmRleCA9XG4gICAgICBpbmRleCAhPT0gdm9pZCAwID8gaW5kZXggKyAxIDogY29weSA/IHRhYnMuc2VsZWN0ZWRJbmRleCEgKyAxIDogdGFicy5jaGlsZHJlbiEubGVuZ3RoO1xuICAgIC8vIFNhdmUgdGhlIGluZGV4IG9mIHRoZSBpbnNlcnRpb24gaW4gdGhlIGNvbmZpZ1xuICAgIHRhYnMudGVtcGxhdGUhLmluZGV4ID0gaW5zZXJ0SW5kZXg7XG4gICAgLy8gVGhlIGtleSBpbiB0aGUgb2JqZWN0IGFuZCB0aGUgaW5kZXggaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgc2FtZVxuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID49IGluc2VydEluZGV4KSB7XG4gICAgICAgIGNoaWxkLmluZGV4ISArPSAxO1xuICAgICAgICBjaGlsZC5rZXkgPSBjaGlsZC5pbmRleCArICcnOyAvLyBjb252ZXJ0IHRvIHN0cmluZ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybUFycmF5LmdldChpbnNlcnRJbmRleCAtIDEgKyAnJyk/LnZhbHVlO1xuICAgIC8vIFRoZSBjb25zdHJ1Y3RlZCBvYmplY3QgbG9va3MgbGlrZSB0aGlzIGBbeyBrZXk6ICd0YWInLCBjaGlsZHJlbjogdGVtcGxhdGUgfV1gXG4gICAgLy8gVGhlIGtleSBzaG91bGQgcHJlZmVyYWJseSBiZSBgbnVsbGBcbiAgICBjb25zdCBuZXdUYWIgPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgZm9ybUFycmF5LFxuICAgICAgeyBbaW5zZXJ0SW5kZXhdOiB0YWJzLnRlbXBsYXRlIH0gYXMgR3VpRmllbGRzLFxuICAgICAgY29weSA/IHsgW2luc2VydEluZGV4XTogZm9ybVZhbHVlIH0gOiB7fSxcbiAgICAgIGNvcHkgPyB7IFtpbnNlcnRJbmRleF06IGZvcm1WYWx1ZSB9IDogbnVsbCxcbiAgICAgICd0YWJzJ1xuICAgICk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKGluc2VydEluZGV4LCAwLCBuZXdUYWJbMF0pO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBmb3JtIG1vZGVsXG4gICAgZm9ybUFycmF5LnBhdGNoVmFsdWUoZm9ybUFycmF5LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0YWIgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgICAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGZvcm1BcnJheSBUaGUgcmVhY3RpdmUgZm9ybSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGFicyAgICAgIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIGluZGV4ICAgICBUaGUgaW5kZXggb2YgdGhlIHRhYnMgYXJyYXlcbiAgICovXG4gIHJlbW92ZVRhYihlOiBNb3VzZUV2ZW50LCBmb3JtQXJyYXk6IEZvcm1BcnJheSwgdGFiczogR3VpQ29udHJvbCwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gaW5kZXggPT09IHZvaWQgMCA/IHRhYnMuc2VsZWN0ZWRJbmRleCEgOiBpbmRleDtcbiAgICB0YWJzLmNoaWxkcmVuIS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IHJlbW92ZUluZGV4KSB7XG4gICAgICAgIGNoaWxkLmluZGV4ISAtPSAxO1xuICAgICAgICBjaGlsZC5rZXkgPSBjaGlsZC5pbmRleCArICcnOyAvLyBjb252ZXJ0IHRvIHN0cmluZ1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRhYnMuY2hpbGRyZW4hLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KHJlbW92ZUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGRpc3BsYXkgbW9kZSBvZiB0YWJzLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIHRhYnMgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gbW9kZSBUaGUgZGlzcGxheSBtb2RlIG9mIHRhYnNcbiAgICovXG4gIGNoYW5nZVRhYnNNb2RlKGU6IE1vdXNlRXZlbnQsIHRhYnM6IEd1aUNvbnRyb2wsIG1vZGU/OiBHdWlUYWJzTW9kZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGFicy5tb2RlID0gbW9kZTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gIEBmb3IgKGl0ZW0gb2YgZm9ybUZpZWxkczsgdHJhY2sgaXRlbSkge1xuICAgIDxkaXY+XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtfVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNjb250cm9sVHlwZSBsZXQtaXRlbSBsZXQtcGFyZW50PVwicGFyZW50XCIgbGV0LWZvcm09XCJmb3JtR3JvdXBcIj5cbiAgQGlmIChpdGVtLnNob3cpIHtcbiAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgQHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIEBjYXNlICgndGV4dCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWlucHV0LXRleHQgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbnB1dC1udW1iZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdzZWxlY3QnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdzd2l0Y2gnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1zd2l0Y2ggW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdzbGlkZXInKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1zbGlkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdidXR0b25Ub2dnbGUnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1idXR0b24tdG9nZ2xlIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZmlsbCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGwgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdmaWxlJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsZS11cGxvYWRlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ltYWdlJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwiaW1hZ2VcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3ZpZGVvJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwidmlkZW9cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2F1ZGlvJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwiYXVkaW9cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ltYWdlU2VsZWN0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW1hZ2Utc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiBbYXBwZW5kVG9dPVwiJyMnK3VpZFwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdjb21ib2JveCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWNvbWJvYm94IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiBbYXBwZW5kVG9dPVwiJyMnK3VpZFwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd0ZXh0YXJlYScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXRleHRhcmVhIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnY29kZWFyZWEnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1jb2RlYXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2hpZGRlbicpIHtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2lubGluZScpIHtcbiAgICAgICAgICA8Z3VpLWlubGluZS1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiPlxuICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KVxuICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZ3VpLWlubGluZS1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2dyb3VwJykge1xuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtmb3JtR3JvdXBOYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgIFsoZXhwYW5kZWQpXT1cIml0ZW0uZXhwYW5kZWRcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgPCEtLSBMYXp5IHJlbmRlcmluZyAtLT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRFeHBhbnNpb25QYW5lbENvbnRlbnQ+XG4gICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KVxuICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd0YWJzJykge1xuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtmb3JtQXJyYXlOYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgIFsoZXhwYW5kZWQpXT1cIml0ZW0uZXhwYW5kZWRcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICAgIDwhLS0gU2hvdyBvcGVyYXRpb24gYnV0dG9ucyB3aGVuIHBhbmVsIG9wZW5lZCAtLT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgPGd1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtjb2xvcl09XCJpdGVtLm1vZGUhPT0nbGlzdCc/J3ByaW1hcnknOicnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRhYnNNb2RlKCRldmVudCwgaXRlbSwgJ25vcm1hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiaG9yaXpvbnRhbFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlPT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdsaXN0JylcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJ2ZXJ0aWNhbFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29weVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9ndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgIDwhLS0gTGF6eSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0ubW9kZSE9PSdsaXN0Jykge1xuICAgICAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBtb2RlIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLXRhYnNcIiBkaXNhYmxlUmlwcGxlXG4gICAgICAgICAgICAgICAgICBbbWF0LXN0cmV0Y2gtdGFic109XCJmYWxzZVwiIFsoc2VsZWN0ZWRJbmRleCldPVwiaXRlbS5zZWxlY3RlZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWIgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBbZGlzYWJsZWRdPVwidGFiLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIXRhYi5jaGlsZHJlbiB8fCB0YWIuY2hpbGRyZW4ubGVuZ3RoPT09MCB8fCB0YWIudHlwZT09PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRhYi5jaGlsZHJlbj8ubGVuZ3RoPjAgJiYgdGFiLnR5cGUhPT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgaV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIFZlcnRpY2FsIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWIgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmd1aS1saXN0LWl0ZW0tYWN0aXZlXT1cIml0ZW0uc2VsZWN0ZWRJbmRleD09PWlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS10aXRsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXRlbS5zZWxlY3RlZEluZGV4PWlcIj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLnRlbXBsYXRlICYmIChpdGVtLmFkZGFibGUgfHwgaXRlbS5hZGRhYmxlPT09dW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIHRydWUsIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvcHlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBmYWxzZSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghdGFiLmNoaWxkcmVuIHx8IHRhYi5jaGlsZHJlbi5sZW5ndGg9PT0wIHx8IHRhYi50eXBlPT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnbWVudScpIHtcbiAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS1tZW51XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIiBkaXNhYmxlUmlwcGxlPlxuICAgICAgICAgICAgQGZvciAobWVudUNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIG1lbnVDaGlsZCkge1xuICAgICAgICAgICAgICA8bWF0LXRhYiBbbGFiZWxdPVwibWVudUNoaWxkLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51Q2hpbGQuZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICAgIEBpZiAobWVudUNoaWxkLnR5cGU9PT0nbWVudUl0ZW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTXVzdCB3cmFwIHdpdGggZGl2IC0tPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb250cm9sSXRlbSBvZiBtZW51Q2hpbGQuY2hpbGRyZW47IHRyYWNrIGNvbnRyb2xJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJtZW51Q2hpbGQua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY29udHJvbEl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBtZW51Q2hpbGQua2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwhLS0gU3VwcG9ydCBmb3IgdW5saW1pdGVkIG5lc3RpbmcgLS0+XG4gICAgICAgICAgICAgICAgICBAaWYgKG1lbnVDaGlsZC50eXBlPT09J21lbnUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogbWVudUNoaWxkLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KVxuICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,100 +0,0 @@
1
- import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/icon";
4
- import * as i2 from "@angular/platform-browser";
5
- export const svgIcons = {
6
- horizontal: `
7
- <svg viewBox="0 0 24 24">
8
- <path d="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z"></path>
9
- </svg>
10
- `,
11
- vertical: `
12
- <svg viewBox="0 0 24 24">
13
- <path d="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z"></path>
14
- </svg>
15
- `,
16
- add: `
17
- <svg viewBox="0 0 24 24">
18
- <path d="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z"></path>
19
- </svg>
20
- `,
21
- delete: `
22
- <svg viewBox="0 0 24 24">
23
- <path d="M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"></path>
24
- </svg>
25
- `,
26
- copy: `
27
- <svg viewBox="0 0 24 24">
28
- <path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path>
29
- </svg>
30
- `,
31
- link: `
32
- <svg viewBox="0 0 24 24">
33
- <path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path>
34
- </svg>
35
- `,
36
- clear: `
37
- <svg viewBox="0 0 24 24">
38
- <path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
39
- </svg>
40
- `,
41
- file: `
42
- <svg viewBox="0 0 24 24">
43
- <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z"></path>
44
- </svg>
45
- `,
46
- upload: `
47
- <svg viewBox="0 0 24 24">
48
- <path d="M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 2L6.46 7.46L7.88 8.88L11 5.75V15H13V5.75L16.13 8.88L17.55 7.45L12 2Z"></path>
49
- </svg>
50
- `,
51
- expand: `
52
- <svg viewBox="0 0 24 24">
53
- <path fill="currentColor" d="M10,21V19H6.41L10.91,14.5L9.5,13.09L5,17.59V14H3V21H10M14.5,10.91L19,6.41V10H21V3H14V5H17.59L13.09,9.5L14.5,10.91Z"></path>
54
- </svg>`,
55
- wrap: `
56
- <svg viewBox="0 0 24 24">
57
- <path fill="currentColor" d="M21,5H3V7H21V5M3,19H10V17H3V19M3,13H18C19,13 20,13.43 20,15C20,16.57 19,17 18,17H16V15L12,18L16,21V19H18C20.95,19 22,17.73 22,15C22,12.28 21,11 18,11H3V13Z"></path>
58
- </svg>`,
59
- solid: `
60
- <svg viewBox="0 0 24 24">
61
- <path fill="currentColor" fill-rule="evenodd" d="M9 9h6v6H9z"></path>
62
- <path fill="currentColor" fill-rule="evenodd" d="M8 7h8a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1M6 8a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2zm3 7V9h6v6zM8 8.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5z"></path>
63
- </svg>`,
64
- gradient: `
65
- <svg viewBox="0 0 24 24">
66
- <path fill="currentColor" fill-rule="evenodd" d="M8 7h8a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1M6 8a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2zm3.75.875a.875.875 0 1 1-1.75 0 .875.875 0 0 1 1.75 0m3.791.625a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25m-1.458.875a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m0 3.12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.458 2.245a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25m.625-3.865a.625.625 0 1 1-1.25 0 .625.625 0 0 1 1.25 0M8.875 15.99a.875.875 0 1 0 0-1.75.875.875 0 0 0 0 1.75m.875-4.115a.875.875 0 1 1-1.75 0 .875.875 0 0 1 1.75 0m5.75-1a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1m.5 2.623a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0"></path>
67
- </svg>`,
68
- image: `
69
- <svg viewBox="0 0 24 24">
70
- <path fill="currentColor" fill-rule="evenodd" d="M16 7H8a1 1 0 0 0-1 1v5.668l2.521-2.522a.5.5 0 0 1 .708 0l5.85 5.85A1 1 0 0 0 17 16V8a1 1 0 0 0-1-1M6 14.875V16a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2zM8 17h6.668l-4.793-4.793L7 15.082V16a1 1 0 0 0 1 1m7-7a1 1 0 1 1-2 0 1 1 0 0 1 2 0m1 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0"></path>
71
- </svg>
72
- `,
73
- };
74
- /** Injection token that can be used to provide the default icons. */
75
- export const GUI_ICONS_CONFIG = new InjectionToken('gui-icons-config');
76
- export class GuiIconsRegistry {
77
- constructor(_iconRegistry, _sanitizer, _defaultIcons) {
78
- this._iconRegistry = _iconRegistry;
79
- this._sanitizer = _sanitizer;
80
- this._defaultIcons = _defaultIcons;
81
- }
82
- add(...iconNames) {
83
- const icons = Object.assign(svgIcons, this._defaultIcons);
84
- iconNames.forEach(k => {
85
- this._iconRegistry.addSvgIconLiteral(k, this._sanitizer.bypassSecurityTrustHtml(icons[k]));
86
- });
87
- }
88
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiIconsRegistry, deps: [{ token: i1.MatIconRegistry }, { token: i2.DomSanitizer }, { token: GUI_ICONS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
89
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiIconsRegistry, providedIn: 'root' }); }
90
- }
91
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiIconsRegistry, decorators: [{
92
- type: Injectable,
93
- args: [{ providedIn: 'root' }]
94
- }], ctorParameters: () => [{ type: i1.MatIconRegistry }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{
95
- type: Optional
96
- }, {
97
- type: Inject,
98
- args: [GUI_ICONS_CONFIG]
99
- }] }] });
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWljb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS1pY29ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBSTdFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixVQUFVLEVBQUU7Ozs7R0FJWDtJQUNELFFBQVEsRUFBRTs7OztHQUlUO0lBQ0QsR0FBRyxFQUFFOzs7O0dBSUo7SUFDRCxNQUFNLEVBQUU7Ozs7R0FJUDtJQUNELElBQUksRUFBRTs7OztHQUlMO0lBQ0QsSUFBSSxFQUFFOzs7O0dBSUw7SUFDRCxLQUFLLEVBQUU7Ozs7R0FJTjtJQUNELElBQUksRUFBRTs7OztHQUlMO0lBQ0QsTUFBTSxFQUFFOzs7O0dBSVA7SUFDRCxNQUFNLEVBQUU7OztTQUdEO0lBQ1AsSUFBSSxFQUFFOzs7U0FHQztJQUNQLEtBQUssRUFBRTs7OztTQUlBO0lBQ1AsUUFBUSxFQUFFOzs7U0FHSDtJQUNQLEtBQUssRUFBRTs7OztHQUlOO0NBQ0YsQ0FBQztBQU1GLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBaUIsa0JBQWtCLENBQUMsQ0FBQztBQUd2RixNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1UsYUFBOEIsRUFDOUIsVUFBd0IsRUFDYyxhQUE4QjtRQUZwRSxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDOUIsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUNjLGtCQUFhLEdBQWIsYUFBYSxDQUFpQjtJQUMzRSxDQUFDO0lBRUosR0FBRyxDQUFDLEdBQUcsU0FBd0I7UUFDN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FaVSxnQkFBZ0IsNkVBSUwsZ0JBQWdCO21IQUozQixnQkFBZ0IsY0FESCxNQUFNOzs0RkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBSzdCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEljb25SZWdpc3RyeSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBjb25zdCBzdmdJY29ucyA9IHtcbiAgaG9yaXpvbnRhbDogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTE2LDEyQTIsMiAwIDAsMSAxOCwxMEEyLDIgMCAwLDEgMjAsMTJBMiwyIDAgMCwxIDE4LDE0QTIsMiAwIDAsMSAxNiwxMk0xMCwxMkEyLDIgMCAwLDEgMTIsMTBBMiwyIDAgMCwxIDE0LDEyQTIsMiAwIDAsMSAxMiwxNEEyLDIgMCAwLDEgMTAsMTJNNCwxMkEyLDIgMCAwLDEgNiwxMEEyLDIgMCAwLDEgOCwxMkEyLDIgMCAwLDEgNiwxNEEyLDIgMCAwLDEgNCwxMlpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICB2ZXJ0aWNhbDogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTEyLDE2QTIsMiAwIDAsMSAxNCwxOEEyLDIgMCAwLDEgMTIsMjBBMiwyIDAgMCwxIDEwLDE4QTIsMiAwIDAsMSAxMiwxNk0xMiwxMEEyLDIgMCAwLDEgMTQsMTJBMiwyIDAgMCwxIDEyLDE0QTIsMiAwIDAsMSAxMCwxMkEyLDIgMCAwLDEgMTIsMTBNMTIsNEEyLDIgMCAwLDEgMTQsNkEyLDIgMCAwLDEgMTIsOEEyLDIgMCAwLDEgMTAsNkEyLDIgMCAwLDEgMTIsNFpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBhZGQ6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0xOSwxM0gxM1YxOUgxMVYxM0g1VjExSDExVjVIMTNWMTFIMTlWMTNaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgZGVsZXRlOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNOSwzVjRINFY2SDVWMTlBMiwyIDAgMCwwIDcsMjFIMTdBMiwyIDAgMCwwIDE5LDE5VjZIMjBWNEgxNVYzSDlNNyw2SDE3VjE5SDdWNk05LDhWMTdIMTFWOEg5TTEzLDhWMTdIMTVWOEgxM1pcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBjb3B5OiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5LDIxSDhWN0gxOU0xOSw1SDhBMiwyIDAgMCwwIDYsN1YyMUEyLDIgMCAwLDAgOCwyM0gxOUEyLDIgMCAwLDAgMjEsMjFWN0EyLDIgMCAwLDAgMTksNU0xNiwxSDRBMiwyIDAgMCwwIDIsM1YxN0g0VjNIMTZWMVpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBsaW5rOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMy45IDEyYzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xaDRWN0g3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1aDR2LTEuOUg3Yy0xLjcxIDAtMy4xLTEuMzktMy4xLTMuMXpNOCAxM2g4di0ySDh2MnptOS02aC00djEuOWg0YzEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xcy0xLjM5IDMuMS0zLjEgMy4xaC00VjE3aDRjMi43NiAwIDUtMi4yNCA1LTVzLTIuMjQtNS01LTV6XCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgY2xlYXI6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0xOSw2LjQxTDE3LjU5LDVMMTIsMTAuNTlMNi40MSw1TDUsNi40MUwxMC41OSwxMkw1LDE3LjU5TDYuNDEsMTlMMTIsMTMuNDFMMTcuNTksMTlMMTksMTcuNTlMMTMuNDEsMTJMMTksNi40MVpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBmaWxlOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMTQsMkg2QTIsMiAwIDAsMCA0LDRWMjBBMiwyIDAgMCwwIDYsMjJIMThBMiwyIDAgMCwwIDIwLDIwVjhMMTQsMk0xOCwyMEg2VjRIMTNWOUgxOFYyMFpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICB1cGxvYWQ6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0yIDEySDRWMTdIMjBWMTJIMjJWMTdDMjIgMTguMTEgMjEuMTEgMTkgMjAgMTlINEMyLjkgMTkgMiAxOC4xMSAyIDE3VjEyTTEyIDJMNi40NiA3LjQ2TDcuODggOC44OEwxMSA1Ljc1VjE1SDEzVjUuNzVMMTYuMTMgOC44OEwxNy41NSA3LjQ1TDEyIDJaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgZXhwYW5kOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTEwLDIxVjE5SDYuNDFMMTAuOTEsMTQuNUw5LjUsMTMuMDlMNSwxNy41OVYxNEgzVjIxSDEwTTE0LjUsMTAuOTFMMTksNi40MVYxMEgyMVYzSDE0VjVIMTcuNTlMMTMuMDksOS41TDE0LjUsMTAuOTFaXCI+PC9wYXRoPlxuICA8L3N2Zz5gLFxuICB3cmFwOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIxLDVIM1Y3SDIxVjVNMywxOUgxMFYxN0gzVjE5TTMsMTNIMThDMTksMTMgMjAsMTMuNDMgMjAsMTVDMjAsMTYuNTcgMTksMTcgMTgsMTdIMTZWMTVMMTIsMThMMTYsMjFWMTlIMThDMjAuOTUsMTkgMjIsMTcuNzMgMjIsMTVDMjIsMTIuMjggMjEsMTEgMTgsMTFIM1YxM1pcIj48L3BhdGg+XG4gIDwvc3ZnPmAsXG4gIHNvbGlkOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk05IDloNnY2SDl6XCI+PC9wYXRoPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IDdoOGExIDEgMCAwIDEgMSAxdjhhMSAxIDAgMCAxLTEgMUg4YTEgMSAwIDAgMS0xLTFWOGExIDEgMCAwIDEgMS0xTTYgOGEyIDIgMCAwIDEgMi0yaDhhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJIOGEyIDIgMCAwIDEtMi0yem0zIDdWOWg2djZ6TTggOC41YS41LjUgMCAwIDEgLjUtLjVoN2EuNS41IDAgMCAxIC41LjV2N2EuNS41IDAgMCAxLS41LjVoLTdhLjUuNSAwIDAgMS0uNS0uNXpcIj48L3BhdGg+XG4gIDwvc3ZnPmAsXG4gIGdyYWRpZW50OiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IDdoOGExIDEgMCAwIDEgMSAxdjhhMSAxIDAgMCAxLTEgMUg4YTEgMSAwIDAgMS0xLTFWOGExIDEgMCAwIDEgMS0xTTYgOGEyIDIgMCAwIDEgMi0yaDhhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJIOGEyIDIgMCAwIDEtMi0yem0zLjc1Ljg3NWEuODc1Ljg3NSAwIDEgMS0xLjc1IDAgLjg3NS44NzUgMCAwIDEgMS43NSAwbTMuNzkxLjYyNWEuNjI1LjYyNSAwIDEgMCAwLTEuMjUuNjI1LjYyNSAwIDAgMCAwIDEuMjVtLTEuNDU4Ljg3NWEuNzUuNzUgMCAxIDEtMS41IDAgLjc1Ljc1IDAgMCAxIDEuNSAwbTAgMy4xMmEuNzUuNzUgMCAxIDEtMS41IDAgLjc1Ljc1IDAgMCAxIDEuNSAwbTEuNDU4IDIuMjQ1YS42MjUuNjI1IDAgMSAwIDAtMS4yNS42MjUuNjI1IDAgMCAwIDAgMS4yNW0uNjI1LTMuODY1YS42MjUuNjI1IDAgMSAxLTEuMjUgMCAuNjI1LjYyNSAwIDAgMSAxLjI1IDBNOC44NzUgMTUuOTlhLjg3NS44NzUgMCAxIDAgMC0xLjc1Ljg3NS44NzUgMCAwIDAgMCAxLjc1bS44NzUtNC4xMTVhLjg3NS44NzUgMCAxIDEtMS43NSAwIC44NzUuODc1IDAgMCAxIDEuNzUgMG01Ljc1LTFhLjUuNSAwIDEgMCAwLTEgLjUuNSAwIDAgMCAwIDFtLjUgMi42MjNhLjUuNSAwIDEgMS0xIDAgLjUuNSAwIDAgMSAxIDBcIj48L3BhdGg+XG4gIDwvc3ZnPmAsXG4gIGltYWdlOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xNiA3SDhhMSAxIDAgMCAwLTEgMXY1LjY2OGwyLjUyMS0yLjUyMmEuNS41IDAgMCAxIC43MDggMGw1Ljg1IDUuODVBMSAxIDAgMCAwIDE3IDE2VjhhMSAxIDAgMCAwLTEtMU02IDE0Ljg3NVYxNmEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJIOGEyIDIgMCAwIDAtMiAyek04IDE3aDYuNjY4bC00Ljc5My00Ljc5M0w3IDE1LjA4MlYxNmExIDEgMCAwIDAgMSAxbTctN2ExIDEgMCAxIDEtMiAwIDEgMSAwIDAgMSAyIDBtMSAwYTIgMiAwIDEgMS00IDAgMiAyIDAgMCAxIDQgMFwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG59O1xuXG5leHBvcnQgdHlwZSBHdWlJY29uVHlwZSA9IGtleW9mIHR5cGVvZiBzdmdJY29ucztcblxuZXhwb3J0IHR5cGUgR3VpSWNvbnNDb25maWcgPSBSZWNvcmQ8R3VpSWNvblR5cGUsIHN0cmluZz47XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHRoZSBkZWZhdWx0IGljb25zLiAqL1xuZXhwb3J0IGNvbnN0IEdVSV9JQ09OU19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48R3VpSWNvbnNDb25maWc+KCdndWktaWNvbnMtY29uZmlnJyk7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgR3VpSWNvbnNSZWdpc3RyeSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ljb25SZWdpc3RyeTogTWF0SWNvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR1VJX0lDT05TX0NPTkZJRykgcHJpdmF0ZSBfZGVmYXVsdEljb25zPzogR3VpSWNvbnNDb25maWdcbiAgKSB7fVxuXG4gIGFkZCguLi5pY29uTmFtZXM6IEd1aUljb25UeXBlW10pIHtcbiAgICBjb25zdCBpY29ucyA9IE9iamVjdC5hc3NpZ24oc3ZnSWNvbnMsIHRoaXMuX2RlZmF1bHRJY29ucyk7XG4gICAgaWNvbk5hbWVzLmZvckVhY2goayA9PiB7XG4gICAgICB0aGlzLl9pY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoaywgdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGljb25zW2tdKSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==