kwikid-forms 0.3.21 → 0.5.1

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 (93) hide show
  1. package/bundles/kwikid-forms.umd.js +7199 -7736
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.component.js +403 -0
  4. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.definitions.js +6 -0
  5. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.helper.js +29 -0
  6. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.module.js +39 -0
  7. package/esm2015/lib/builder/builder-form-editor/builder.form-editor.constants.js +189 -0
  8. package/esm2015/lib/builder/builder-form-editor/builder.form-editor.service.js +43 -0
  9. package/esm2015/lib/builder/builder-form-list/builder-forms-list.component.js +99 -0
  10. package/esm2015/lib/builder/builder-form-list/builder-forms-list.module.js +40 -0
  11. package/esm2015/lib/builder/builder.component.js +111 -258
  12. package/esm2015/lib/builder/builder.helper.js +78 -0
  13. package/esm2015/lib/builder/builder.module.js +15 -75
  14. package/esm2015/lib/kwikid-forms.module.js +4 -4
  15. package/esm2015/lib/renderer/config-converter/config-converter.constants.js +74 -0
  16. package/esm2015/lib/renderer/config-converter/config-converter.helper.js +49 -0
  17. package/esm2015/lib/renderer/config-converter/config-converter.js +514 -0
  18. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +5 -1
  19. package/esm2015/lib/renderer/form-view/form-view.component.js +198 -60
  20. package/esm2015/lib/renderer/form-view/form-view.module.js +7 -6
  21. package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +17 -2
  22. package/esm2015/lib/renderer/forms-list/forms-list.component.js +6 -6
  23. package/esm2015/lib/renderer/forms-list/forms-list.module.js +7 -5
  24. package/esm2015/lib/renderer/renderer.component.js +73 -27
  25. package/esm2015/lib/renderer/renderer.definitions.js +6 -0
  26. package/fesm2015/kwikid-forms.js +1820 -4292
  27. package/fesm2015/kwikid-forms.js.map +1 -1
  28. package/lib/builder/builder-form-editor/builder-form-editor.component.d.ts +108 -0
  29. package/lib/builder/builder-form-editor/builder-form-editor.definitions.d.ts +5 -0
  30. package/lib/builder/builder-form-editor/builder-form-editor.helper.d.ts +3 -0
  31. package/lib/builder/builder-form-editor/builder-form-editor.module.d.ts +11 -0
  32. package/lib/builder/builder-form-editor/builder.form-editor.constants.d.ts +696 -0
  33. package/lib/builder/builder-form-editor/builder.form-editor.service.d.ts +7 -0
  34. package/lib/builder/builder-form-list/builder-forms-list.component.d.ts +20 -0
  35. package/lib/builder/builder-form-list/builder-forms-list.module.d.ts +11 -0
  36. package/lib/builder/builder.component.d.ts +15 -34
  37. package/lib/builder/builder.helper.d.ts +1 -0
  38. package/lib/builder/builder.module.d.ts +7 -21
  39. package/lib/kwikid-forms.module.d.ts +1 -1
  40. package/lib/renderer/config-converter/config-converter.constants.d.ts +73 -0
  41. package/lib/renderer/config-converter/config-converter.d.ts +5 -0
  42. package/lib/renderer/config-converter/config-converter.helper.d.ts +7 -0
  43. package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +11 -7
  44. package/lib/renderer/form-view/form-view.component.d.ts +20 -7
  45. package/lib/renderer/form-view/form-view.module.d.ts +7 -9
  46. package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +1 -0
  47. package/lib/renderer/forms-list/forms-list.module.d.ts +5 -6
  48. package/lib/renderer/renderer.definitions.d.ts +5 -0
  49. package/package.json +4 -17
  50. package/esm2015/lib/builder/element-config-editor/editors/basic/checkbox-config.editor.component.js +0 -72
  51. package/esm2015/lib/builder/element-config-editor/editors/basic/date-config.editor.component.js +0 -72
  52. package/esm2015/lib/builder/element-config-editor/editors/basic/dropdown-with-search-config.editor.component.js +0 -302
  53. package/esm2015/lib/builder/element-config-editor/editors/basic/number-config.editor.component.js +0 -72
  54. package/esm2015/lib/builder/element-config-editor/editors/basic/otp-config.editor.component.js +0 -130
  55. package/esm2015/lib/builder/element-config-editor/editors/basic/phone-config.editor.component.js +0 -132
  56. package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +0 -396
  57. package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +0 -132
  58. package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +0 -698
  59. package/esm2015/lib/builder/element-config-editor/editors/document/aadhaar-number-config.editor.component.js +0 -130
  60. package/esm2015/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.js +0 -135
  61. package/esm2015/lib/builder/element-config-editor/editors/document-element-config.editor.component.js +0 -610
  62. package/esm2015/lib/builder/element-config-editor/editors/other/html-config.editor.component.js +0 -120
  63. package/esm2015/lib/builder/element-config-editor/editors/other/title-config.editor.component.js +0 -121
  64. package/esm2015/lib/builder/element-config-editor/editors/other-element-config.editor.component.js +0 -214
  65. package/esm2015/lib/builder/element-config-editor/element-config-editor.component.js +0 -97
  66. package/esm2015/lib/builder/shared/elements.js +0 -81
  67. package/esm2015/lib/builder/shared/helpers.js +0 -6
  68. package/esm2015/lib/renderer/config-converter.helper.js +0 -552
  69. package/esm2015/lib/renderer/form-view/pipes/safe-html.pipe.js +0 -25
  70. package/esm2015/lib/renderer/form-view/pipes/safe-url.pipe.js +0 -25
  71. package/esm2015/lib/renderer/forms-list/pipes/safe-html.pipe.js +0 -25
  72. package/lib/builder/element-config-editor/editors/basic/checkbox-config.editor.component.d.ts +0 -16
  73. package/lib/builder/element-config-editor/editors/basic/date-config.editor.component.d.ts +0 -16
  74. package/lib/builder/element-config-editor/editors/basic/dropdown-with-search-config.editor.component.d.ts +0 -24
  75. package/lib/builder/element-config-editor/editors/basic/number-config.editor.component.d.ts +0 -16
  76. package/lib/builder/element-config-editor/editors/basic/otp-config.editor.component.d.ts +0 -16
  77. package/lib/builder/element-config-editor/editors/basic/phone-config.editor.component.d.ts +0 -16
  78. package/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.d.ts +0 -25
  79. package/lib/builder/element-config-editor/editors/basic/text-config.editor.component.d.ts +0 -16
  80. package/lib/builder/element-config-editor/editors/basic-element-config.editor.component.d.ts +0 -20
  81. package/lib/builder/element-config-editor/editors/document/aadhaar-number-config.editor.component.d.ts +0 -16
  82. package/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.d.ts +0 -16
  83. package/lib/builder/element-config-editor/editors/document-element-config.editor.component.d.ts +0 -20
  84. package/lib/builder/element-config-editor/editors/other/html-config.editor.component.d.ts +0 -16
  85. package/lib/builder/element-config-editor/editors/other/title-config.editor.component.d.ts +0 -16
  86. package/lib/builder/element-config-editor/editors/other-element-config.editor.component.d.ts +0 -20
  87. package/lib/builder/element-config-editor/element-config-editor.component.d.ts +0 -20
  88. package/lib/builder/shared/elements.d.ts +0 -34
  89. package/lib/builder/shared/helpers.d.ts +0 -1
  90. package/lib/renderer/config-converter.helper.d.ts +0 -9
  91. package/lib/renderer/form-view/pipes/safe-html.pipe.d.ts +0 -15
  92. package/lib/renderer/form-view/pipes/safe-url.pipe.d.ts +0 -15
  93. package/lib/renderer/forms-list/pipes/safe-html.pipe.d.ts +0 -15
@@ -1,132 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, EventEmitter, Input, Output } from "@angular/core";
3
- import { FormControl, FormGroup } from "@angular/forms";
4
- import { logMethod } from "kwikid-toolkit";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "kwikui";
7
- import * as i2 from "@angular/forms";
8
- export class BasicPhoneConfigEditor {
9
- constructor() {
10
- this.saveBasicClickCounter = 0;
11
- this.elementConfig = {
12
- properties: {
13
- countryCode: "+91",
14
- removeCountryCodeFromValue: true,
15
- phoneMaskAfterCountryCode: "##########"
16
- }
17
- };
18
- this.updateElement = new EventEmitter();
19
- this.basicPhoneFormGroup = undefined;
20
- }
21
- ngOnInit() {
22
- this.createBasicPhoneFormGroup();
23
- }
24
- ngOnChanges(changes) {
25
- var _a;
26
- const verifyChange = (key) => {
27
- return changes.hasOwnProperty(key) && !changes[key].firstChange;
28
- };
29
- if (verifyChange("elementConfig")) {
30
- this.elementConfig = changes.elementConfig.currentValue;
31
- (_a = this.basicPhoneFormGroup) === null || _a === void 0 ? void 0 : _a.reset(this.elementConfig);
32
- }
33
- if (verifyChange("saveBasicClickCounter")) {
34
- if (changes.saveBasicClickCounter.previousValue !==
35
- changes.saveBasicClickCounter.currentValue) {
36
- this.saveBasicClickCounter = changes.saveBasicClickCounter.currentValue;
37
- this.handleOnSave();
38
- }
39
- }
40
- }
41
- createBasicPhoneFormGroup() {
42
- this.basicPhoneFormGroup = new FormGroup({
43
- properties: new FormGroup({
44
- mask: new FormControl(this.elementConfig.properties.mask, {
45
- updateOn: "change"
46
- })
47
- })
48
- });
49
- this.basicPhoneFormGroup.updateValueAndValidity();
50
- }
51
- handleOnSave() {
52
- let basicElementConfig = this.basicPhoneFormGroup.getRawValue();
53
- this.updateElement.emit({
54
- basicElementConfig: basicElementConfig
55
- });
56
- }
57
- }
58
- /** @nocollapse */ BasicPhoneConfigEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicPhoneConfigEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- /** @nocollapse */ BasicPhoneConfigEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BasicPhoneConfigEditor, selector: "basic-phone-config-editor", inputs: { saveBasicClickCounter: "saveBasicClickCounter", elementConfig: "elementConfig" }, outputs: { updateElement: "updateElement" }, usesOnChanges: true, ngImport: i0, template: `
60
- <form [formGroup]="basicPhoneFormGroup">
61
- <div formGroupName="properties">
62
- <div class="form-group-title">Properties</div>
63
- <div class="form-group">
64
- <kwikui-input
65
- [label]="'Mask'"
66
- [id]="'basic-phone-config-mask'"
67
- [type]="'text'"
68
- [formControlName]="'mask'"
69
- [formControl]="
70
- basicPhoneFormGroup.controls.properties['controls'].mask
71
- "
72
- [disabled]="false"
73
- [placeholder]="'Please enter your mask'"
74
- [focus]="false"
75
- [invalid]="false"
76
- [case]="'default'"
77
- size="m"
78
- ></kwikui-input>
79
- </div>
80
- </div>
81
- </form>
82
- `, isInline: true, styles: [""], components: [{ type: i1.KwikUIInputComponent, selector: "kwikui-input", inputs: ["label", "id", "type", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "validators", "case", "size", "icon", "properties"], outputs: ["getKeyValue"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
83
- __decorate([
84
- logMethod
85
- ], BasicPhoneConfigEditor.prototype, "ngOnInit", null);
86
- __decorate([
87
- logMethod
88
- ], BasicPhoneConfigEditor.prototype, "ngOnChanges", null);
89
- __decorate([
90
- logMethod
91
- ], BasicPhoneConfigEditor.prototype, "createBasicPhoneFormGroup", null);
92
- __decorate([
93
- logMethod
94
- ], BasicPhoneConfigEditor.prototype, "handleOnSave", null);
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicPhoneConfigEditor, decorators: [{
96
- type: Component,
97
- args: [{
98
- selector: "basic-phone-config-editor",
99
- template: `
100
- <form [formGroup]="basicPhoneFormGroup">
101
- <div formGroupName="properties">
102
- <div class="form-group-title">Properties</div>
103
- <div class="form-group">
104
- <kwikui-input
105
- [label]="'Mask'"
106
- [id]="'basic-phone-config-mask'"
107
- [type]="'text'"
108
- [formControlName]="'mask'"
109
- [formControl]="
110
- basicPhoneFormGroup.controls.properties['controls'].mask
111
- "
112
- [disabled]="false"
113
- [placeholder]="'Please enter your mask'"
114
- [focus]="false"
115
- [invalid]="false"
116
- [case]="'default'"
117
- size="m"
118
- ></kwikui-input>
119
- </div>
120
- </div>
121
- </form>
122
- `,
123
- styles: [``]
124
- }]
125
- }], ctorParameters: function () { return []; }, propDecorators: { saveBasicClickCounter: [{
126
- type: Input
127
- }], elementConfig: [{
128
- type: Input
129
- }], updateElement: [{
130
- type: Output
131
- }], ngOnInit: [], ngOnChanges: [], createBasicPhoneFormGroup: [], handleOnSave: [] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtY29uZmlnLmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2VsZW1lbnQtY29uZmlnLWVkaXRvci9lZGl0b3JzL2Jhc2ljL3Bob25lLWNvbmZpZy5lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBOEIzQyxNQUFNLE9BQU8sc0JBQXNCO0lBa0JqQztRQWhCQSwwQkFBcUIsR0FBVyxDQUFDLENBQUM7UUFHbEMsa0JBQWEsR0FBUTtZQUNuQixVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLDBCQUEwQixFQUFFLElBQUk7Z0JBQ2hDLHlCQUF5QixFQUFFLFlBQVk7YUFDeEM7U0FDRixDQUFDO1FBR0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXhDLHdCQUFtQixHQUFjLFNBQVMsQ0FBQztJQUU1QixDQUFDO0lBR2hCLFFBQVE7UUFDTixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBR0QsV0FBVyxDQUFDLE9BQXNCOztRQUNoQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ25DLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDbEUsQ0FBQyxDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztZQUN4RCxNQUFBLElBQUksQ0FBQyxtQkFBbUIsMENBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksWUFBWSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDekMsSUFDRSxPQUFPLENBQUMscUJBQXFCLENBQUMsYUFBYTtnQkFDM0MsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFDMUM7Z0JBQ0EsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUM7Z0JBRXhFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUdELHlCQUF5QjtRQUN2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDdkMsVUFBVSxFQUFFLElBQUksU0FBUyxDQUFDO2dCQUN4QixJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO29CQUN4RCxRQUFRLEVBQUUsUUFBUTtpQkFDbkIsQ0FBQzthQUNILENBQUM7U0FDSCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBR0QsWUFBWTtRQUNWLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWhFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3RCLGtCQUFrQixFQUFFLGtCQUFrQjtTQUN2QyxDQUFDLENBQUM7SUFDTCxDQUFDOzt1SUFsRVUsc0JBQXNCOzJIQUF0QixzQkFBc0IsK05BMUJ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQ7QUF3QkQ7SUFEQyxTQUFTO3NEQUdUO0FBR0Q7SUFEQyxTQUFTO3lEQW9CVDtBQUdEO0lBREMsU0FBUzt1RUFVVDtBQUdEO0lBREMsU0FBUzswREFPVDs0RkFsRVUsc0JBQXNCO2tCQTVCbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJUO29CQUNELE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztpQkFDYjswRUFHQyxxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixLQUFLO2dCQVVOLGFBQWE7c0JBRFosTUFBTTtnQkFRUCxRQUFRLE1BS1IsV0FBVyxNQXNCWCx5QkFBeUIsTUFZekIsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IGxvZ01ldGhvZCB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYmFzaWMtcGhvbmUtY29uZmlnLWVkaXRvclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYmFzaWNQaG9uZUZvcm1Hcm91cFwiPlxuICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwicHJvcGVydGllc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC10aXRsZVwiPlByb3BlcnRpZXM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8a3dpa3VpLWlucHV0XG4gICAgICAgICAgICBbbGFiZWxdPVwiJ01hc2snXCJcbiAgICAgICAgICAgIFtpZF09XCInYmFzaWMtcGhvbmUtY29uZmlnLW1hc2snXCJcbiAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidtYXNrJ1wiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiXG4gICAgICAgICAgICAgIGJhc2ljUGhvbmVGb3JtR3JvdXAuY29udHJvbHMucHJvcGVydGllc1snY29udHJvbHMnXS5tYXNrXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIGVudGVyIHlvdXIgbWFzaydcIlxuICAgICAgICAgICAgW2ZvY3VzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtpbnZhbGlkXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjYXNlXT1cIidkZWZhdWx0J1wiXG4gICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgPjwva3dpa3VpLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIEJhc2ljUGhvbmVDb25maWdFZGl0b3IgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBzYXZlQmFzaWNDbGlja0NvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KClcbiAgZWxlbWVudENvbmZpZzogYW55ID0ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGNvdW50cnlDb2RlOiBcIis5MVwiLFxuICAgICAgcmVtb3ZlQ291bnRyeUNvZGVGcm9tVmFsdWU6IHRydWUsXG4gICAgICBwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlOiBcIiMjIyMjIyMjIyNcIlxuICAgIH1cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljUGhvbmVGb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZUJhc2ljUGhvbmVGb3JtR3JvdXAoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZWxlbWVudENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5lbGVtZW50Q29uZmlnID0gY2hhbmdlcy5lbGVtZW50Q29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuYmFzaWNQaG9uZUZvcm1Hcm91cD8ucmVzZXQodGhpcy5lbGVtZW50Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcInNhdmVCYXNpY0NsaWNrQ291bnRlclwiKSkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5wcmV2aW91c1ZhbHVlICE9PVxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNhdmVCYXNpY0NsaWNrQ291bnRlciA9IGNoYW5nZXMuc2F2ZUJhc2ljQ2xpY2tDb3VudGVyLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICB0aGlzLmhhbmRsZU9uU2F2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgY3JlYXRlQmFzaWNQaG9uZUZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2ljUGhvbmVGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHByb3BlcnRpZXM6IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBtYXNrOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5lbGVtZW50Q29uZmlnLnByb3BlcnRpZXMubWFzaywge1xuICAgICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMuYmFzaWNQaG9uZUZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uU2F2ZSgpIHtcbiAgICBsZXQgYmFzaWNFbGVtZW50Q29uZmlnID0gdGhpcy5iYXNpY1Bob25lRm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQuZW1pdCh7XG4gICAgICBiYXNpY0VsZW1lbnRDb25maWc6IGJhc2ljRWxlbWVudENvbmZpZ1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,396 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, EventEmitter, Input, Output } from "@angular/core";
3
- import { FormArray, FormControl, FormGroup } from "@angular/forms";
4
- import { logMethod, setMissingKeyValue } from "kwikid-toolkit";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "kwikui";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "@angular/common";
9
- export class BasicRadioConfigEditor {
10
- constructor() {
11
- this.optionType = {
12
- label: "",
13
- disabled: false,
14
- description: ""
15
- };
16
- this.saveBasicClickCounter = 0;
17
- this.elementConfig = {
18
- properties: {
19
- orientation: "horizontal"
20
- },
21
- options: []
22
- };
23
- this.updateElement = new EventEmitter();
24
- this.basicRadioFormGroup = undefined;
25
- }
26
- ngOnInit() {
27
- this.createBasicRadioFormGroup();
28
- }
29
- ngOnChanges(changes) {
30
- var _a;
31
- const verifyChange = (key) => {
32
- return changes.hasOwnProperty(key) && !changes[key].firstChange;
33
- };
34
- if (verifyChange("elementConfig")) {
35
- this.elementConfig = changes.elementConfig.currentValue;
36
- (_a = this.basicRadioFormGroup) === null || _a === void 0 ? void 0 : _a.reset(this.elementConfig);
37
- }
38
- if (verifyChange("saveBasicClickCounter")) {
39
- if (changes.saveBasicClickCounter.previousValue !==
40
- changes.saveBasicClickCounter.currentValue) {
41
- this.saveBasicClickCounter = changes.saveBasicClickCounter.currentValue;
42
- this.handleOnSave();
43
- }
44
- }
45
- }
46
- createBasicRadioFormGroup() {
47
- let optionsFormArray = [];
48
- this.elementConfig = setMissingKeyValue(this.elementConfig, "options", [
49
- this.optionType
50
- ]);
51
- for (let option of this.elementConfig.options) {
52
- optionsFormArray.push(this.createOptionConfigFormGroup(option));
53
- }
54
- this.basicRadioFormGroup = new FormGroup({
55
- properties: new FormGroup({
56
- orientation: new FormControl(this.elementConfig.properties.orientation, {
57
- updateOn: "change"
58
- })
59
- }),
60
- options: new FormArray(optionsFormArray)
61
- });
62
- this.basicRadioFormGroup.updateValueAndValidity();
63
- }
64
- handleOnSave() {
65
- let basicElementConfig = this.basicRadioFormGroup.getRawValue();
66
- this.updateElement.emit({
67
- basicElementConfig: basicElementConfig
68
- });
69
- }
70
- get optionsArray() {
71
- return this.basicRadioFormGroup.get("options");
72
- }
73
- createOptionConfigFormGroup(optionConfig) {
74
- const optionFormGroup = new FormGroup({
75
- label: new FormControl(optionConfig.label, {
76
- updateOn: "change"
77
- }),
78
- disabled: new FormControl(optionConfig.disabled, {
79
- updateOn: "change"
80
- }),
81
- description: new FormControl(optionConfig.description, {
82
- updateOn: "change"
83
- })
84
- });
85
- return optionFormGroup;
86
- }
87
- addOption() {
88
- const options = this.basicRadioFormGroup.get("options");
89
- options.push(this.createOptionConfigFormGroup(this.optionType));
90
- }
91
- removeOption(optionIndex) {
92
- const options = this.basicRadioFormGroup.get("options");
93
- if (options.length > 1) {
94
- options.removeAt(optionIndex);
95
- }
96
- else {
97
- this.addOption();
98
- // options.reset();
99
- }
100
- }
101
- }
102
- /** @nocollapse */ BasicRadioConfigEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicRadioConfigEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
- /** @nocollapse */ BasicRadioConfigEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BasicRadioConfigEditor, selector: "basic-radio-config-editor", inputs: { saveBasicClickCounter: "saveBasicClickCounter", elementConfig: "elementConfig" }, outputs: { updateElement: "updateElement" }, usesOnChanges: true, ngImport: i0, template: `
104
- <form [formGroup]="basicRadioFormGroup">
105
- <fieldset>
106
- <legend class="form-group-title">Options</legend>
107
- <div formArrayName="options">
108
- <ng-container
109
- *ngFor="let option of optionsArray.controls; let i = index"
110
- >
111
- <div [formGroupName]="i">
112
- <div class="form-group">
113
- <kwikui-input
114
- [label]="'Label'"
115
- [id]="'basic-radio-config-placeholder'"
116
- [type]="'text'"
117
- [formControlName]="'label'"
118
- [formControl]="
119
- basicRadioFormGroup['controls'].options['controls'][i][
120
- 'controls'
121
- ].label
122
- "
123
- [disabled]="false"
124
- [placeholder]="'Please enter your label'"
125
- [focus]="false"
126
- [invalid]="false"
127
- [case]="'default'"
128
- size="m"
129
- ></kwikui-input>
130
- </div>
131
- <div class="form-group">
132
- <kwikui-select-combobox
133
- [options]="[true, false]"
134
- [label]="'disabled'"
135
- [id]="'basic-radio-config-disabled'"
136
- size="m"
137
- [formControlName]="'disabled'"
138
- [formControl]="
139
- basicRadioFormGroup['controls'].options['controls'][i][
140
- 'controls'
141
- ].disabled
142
- "
143
- [focus]="false"
144
- [disabled]="false"
145
- [invalid]="false"
146
- [placeholder]="'Please select either true or false'"
147
- ></kwikui-select-combobox>
148
- </div>
149
- <div class="form-group">
150
- <kwikui-input
151
- [label]="'Description'"
152
- [id]="'basic-radio-config-description'"
153
- [type]="'text'"
154
- [formControlName]="'description'"
155
- [formControl]="
156
- basicRadioFormGroup['controls'].options['controls'][i][
157
- 'controls'
158
- ].description
159
- "
160
- [disabled]="false"
161
- [placeholder]="'Please enter your description'"
162
- [focus]="false"
163
- [invalid]="false"
164
- [case]="'default'"
165
- size="m"
166
- ></kwikui-input>
167
- </div>
168
- <div class="form-array-actions">
169
- <kwikui-button
170
- [disabled]="false"
171
- label="Remove"
172
- [showLoader]="false"
173
- styles=""
174
- class="save-button"
175
- type="button"
176
- appearance="secondary"
177
- icon=""
178
- iconRight=""
179
- [shape]="'rounded'"
180
- size="s"
181
- (onClick)="removeOption(i)"
182
- ></kwikui-button>
183
- <kwikui-button
184
- [disabled]="false"
185
- label="Add"
186
- [showLoader]="false"
187
- styles=""
188
- class="save-button"
189
- type="button"
190
- appearance="secondary"
191
- icon=""
192
- iconRight=""
193
- [shape]="'rounded'"
194
- size="s"
195
- (onClick)="addOption()"
196
- ></kwikui-button>
197
- </div>
198
- </div>
199
- </ng-container>
200
- </div>
201
- </fieldset>
202
-
203
- <div formGroupName="properties">
204
- <fieldset>
205
- <legend class="form-group-title">Miscellaneous</legend>
206
- <div class="form-group">
207
- <kwikui-select-combobox
208
- [options]="['horizontal', 'vertical']"
209
- [label]="'Orientation'"
210
- [id]="'basic-radio-config-orientation'"
211
- size="m"
212
- [formControlName]="'orientation'"
213
- [formControl]="
214
- basicRadioFormGroup['controls'].properties['controls']
215
- .orientation
216
- "
217
- [focus]="false"
218
- [disabled]="false"
219
- [invalid]="false"
220
- [placeholder]="'Please select orientation'"
221
- ></kwikui-select-combobox>
222
- </div>
223
- </fieldset>
224
- </div>
225
- </form>
226
- `, isInline: true, styles: ["\n .form-array-actions {\n display: flex;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n }\n "], components: [{ type: i1.KwikUIInputComponent, selector: "kwikui-input", inputs: ["label", "id", "type", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "validators", "case", "size", "icon", "properties"], outputs: ["getKeyValue"] }, { type: i1.KwikUISelectComboboxComponent, selector: "kwikui-select-combobox", inputs: ["label", "id", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "options", "size", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i1.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["disabled", "id", "label", "showLoader", "styles", "class", "type", "appearance", "icon", "iconRight", "shape", "size"], outputs: ["onClick"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
227
- __decorate([
228
- logMethod
229
- ], BasicRadioConfigEditor.prototype, "ngOnInit", null);
230
- __decorate([
231
- logMethod
232
- ], BasicRadioConfigEditor.prototype, "ngOnChanges", null);
233
- __decorate([
234
- logMethod
235
- ], BasicRadioConfigEditor.prototype, "createBasicRadioFormGroup", null);
236
- __decorate([
237
- logMethod
238
- ], BasicRadioConfigEditor.prototype, "handleOnSave", null);
239
- __decorate([
240
- logMethod
241
- ], BasicRadioConfigEditor.prototype, "createOptionConfigFormGroup", null);
242
- __decorate([
243
- logMethod
244
- ], BasicRadioConfigEditor.prototype, "addOption", null);
245
- __decorate([
246
- logMethod
247
- ], BasicRadioConfigEditor.prototype, "removeOption", null);
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicRadioConfigEditor, decorators: [{
249
- type: Component,
250
- args: [{
251
- selector: "basic-radio-config-editor",
252
- template: `
253
- <form [formGroup]="basicRadioFormGroup">
254
- <fieldset>
255
- <legend class="form-group-title">Options</legend>
256
- <div formArrayName="options">
257
- <ng-container
258
- *ngFor="let option of optionsArray.controls; let i = index"
259
- >
260
- <div [formGroupName]="i">
261
- <div class="form-group">
262
- <kwikui-input
263
- [label]="'Label'"
264
- [id]="'basic-radio-config-placeholder'"
265
- [type]="'text'"
266
- [formControlName]="'label'"
267
- [formControl]="
268
- basicRadioFormGroup['controls'].options['controls'][i][
269
- 'controls'
270
- ].label
271
- "
272
- [disabled]="false"
273
- [placeholder]="'Please enter your label'"
274
- [focus]="false"
275
- [invalid]="false"
276
- [case]="'default'"
277
- size="m"
278
- ></kwikui-input>
279
- </div>
280
- <div class="form-group">
281
- <kwikui-select-combobox
282
- [options]="[true, false]"
283
- [label]="'disabled'"
284
- [id]="'basic-radio-config-disabled'"
285
- size="m"
286
- [formControlName]="'disabled'"
287
- [formControl]="
288
- basicRadioFormGroup['controls'].options['controls'][i][
289
- 'controls'
290
- ].disabled
291
- "
292
- [focus]="false"
293
- [disabled]="false"
294
- [invalid]="false"
295
- [placeholder]="'Please select either true or false'"
296
- ></kwikui-select-combobox>
297
- </div>
298
- <div class="form-group">
299
- <kwikui-input
300
- [label]="'Description'"
301
- [id]="'basic-radio-config-description'"
302
- [type]="'text'"
303
- [formControlName]="'description'"
304
- [formControl]="
305
- basicRadioFormGroup['controls'].options['controls'][i][
306
- 'controls'
307
- ].description
308
- "
309
- [disabled]="false"
310
- [placeholder]="'Please enter your description'"
311
- [focus]="false"
312
- [invalid]="false"
313
- [case]="'default'"
314
- size="m"
315
- ></kwikui-input>
316
- </div>
317
- <div class="form-array-actions">
318
- <kwikui-button
319
- [disabled]="false"
320
- label="Remove"
321
- [showLoader]="false"
322
- styles=""
323
- class="save-button"
324
- type="button"
325
- appearance="secondary"
326
- icon=""
327
- iconRight=""
328
- [shape]="'rounded'"
329
- size="s"
330
- (onClick)="removeOption(i)"
331
- ></kwikui-button>
332
- <kwikui-button
333
- [disabled]="false"
334
- label="Add"
335
- [showLoader]="false"
336
- styles=""
337
- class="save-button"
338
- type="button"
339
- appearance="secondary"
340
- icon=""
341
- iconRight=""
342
- [shape]="'rounded'"
343
- size="s"
344
- (onClick)="addOption()"
345
- ></kwikui-button>
346
- </div>
347
- </div>
348
- </ng-container>
349
- </div>
350
- </fieldset>
351
-
352
- <div formGroupName="properties">
353
- <fieldset>
354
- <legend class="form-group-title">Miscellaneous</legend>
355
- <div class="form-group">
356
- <kwikui-select-combobox
357
- [options]="['horizontal', 'vertical']"
358
- [label]="'Orientation'"
359
- [id]="'basic-radio-config-orientation'"
360
- size="m"
361
- [formControlName]="'orientation'"
362
- [formControl]="
363
- basicRadioFormGroup['controls'].properties['controls']
364
- .orientation
365
- "
366
- [focus]="false"
367
- [disabled]="false"
368
- [invalid]="false"
369
- [placeholder]="'Please select orientation'"
370
- ></kwikui-select-combobox>
371
- </div>
372
- </fieldset>
373
- </div>
374
- </form>
375
- `,
376
- styles: [
377
- `
378
- .form-array-actions {
379
- display: flex;
380
- flex-direction: row;
381
- align-content: center;
382
- justify-content: center;
383
- align-items: center;
384
- gap: 1rem;
385
- }
386
- `
387
- ]
388
- }]
389
- }], ctorParameters: function () { return []; }, propDecorators: { saveBasicClickCounter: [{
390
- type: Input
391
- }], elementConfig: [{
392
- type: Input
393
- }], updateElement: [{
394
- type: Output
395
- }], ngOnInit: [], ngOnChanges: [], createBasicRadioFormGroup: [], handleOnSave: [], createOptionConfigFormGroup: [], addOption: [], removeOption: [] } });
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tY29uZmlnLmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2VsZW1lbnQtY29uZmlnLWVkaXRvci9lZGl0b3JzL2Jhc2ljL3JhZGlvLWNvbmZpZy5lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUE2SS9ELE1BQU0sT0FBTyxzQkFBc0I7SUF1QmpDO1FBdEJTLGVBQVUsR0FBRztZQUNwQixLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxLQUFLO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUdGLDBCQUFxQixHQUFXLENBQUMsQ0FBQztRQUdsQyxrQkFBYSxHQUFRO1lBQ25CLFVBQVUsRUFBRTtnQkFDVixXQUFXLEVBQUUsWUFBWTthQUMxQjtZQUNELE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUdGLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV4Qyx3QkFBbUIsR0FBYyxTQUFTLENBQUM7SUFFNUIsQ0FBQztJQUdoQixRQUFRO1FBQ04sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUdELFdBQVcsQ0FBQyxPQUFzQjs7UUFDaEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUNuQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFD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eUJBQXlCLE1BMEJ6QixZQUFZLE1BYVosMkJBQTJCLE1BZ0IzQixTQUFTLE1BTVQsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgbG9nTWV0aG9kLCBzZXRNaXNzaW5nS2V5VmFsdWUgfSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImJhc2ljLXJhZGlvLWNvbmZpZy1lZGl0b3JcIixcbiAgdGVtcGxhdGU6IGBcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImJhc2ljUmFkaW9Gb3JtR3JvdXBcIj5cbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cImZvcm0tZ3JvdXAtdGl0bGVcIj5PcHRpb25zPC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cIm9wdGlvbnNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidMYWJlbCdcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidiYXNpYy1yYWRpby1jb25maWctcGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidsYWJlbCdcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIlxuICAgICAgICAgICAgICAgICAgICBiYXNpY1JhZGlvRm9ybUdyb3VwWydjb250cm9scyddLm9wdGlvbnNbJ2NvbnRyb2xzJ11baV1bXG4gICAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2xzJ1xuICAgICAgICAgICAgICAgICAgICBdLmxhYmVsXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIGVudGVyIHlvdXIgbGFiZWwnXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbY2FzZV09XCInZGVmYXVsdCdcIlxuICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1zZWxlY3QtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt0cnVlLCBmYWxzZV1cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidkaXNhYmxlZCdcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidiYXNpYy1yYWRpby1jb25maWctZGlzYWJsZWQnXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2Rpc2FibGVkJ1wiXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiXG4gICAgICAgICAgICAgICAgICAgIGJhc2ljUmFkaW9Gb3JtR3JvdXBbJ2NvbnRyb2xzJ10ub3B0aW9uc1snY29udHJvbHMnXVtpXVtcbiAgICAgICAgICAgICAgICAgICAgICAnY29udHJvbHMnXG4gICAgICAgICAgICAgICAgICAgIF0uZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIHNlbGVjdCBlaXRoZXIgdHJ1ZSBvciBmYWxzZSdcIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1zZWxlY3QtY29tYm9ib3g+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxrd2lrdWktaW5wdXRcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInRGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCInYmFzaWMtcmFkaW8tY29uZmlnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJcbiAgICAgICAgICAgICAgICAgICAgYmFzaWNSYWRpb0Zvcm1Hcm91cFsnY29udHJvbHMnXS5vcHRpb25zWydjb250cm9scyddW2ldW1xuICAgICAgICAgICAgICAgICAgICAgICdjb250cm9scydcbiAgICAgICAgICAgICAgICAgICAgXS5kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1BsZWFzZSBlbnRlciB5b3VyIGRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Nhc2VdPVwiJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hcnJheS1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZXM9XCJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cIlwiXG4gICAgICAgICAgICAgICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgW3NoYXBlXT1cIidyb3VuZGVkJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJyZW1vdmVPcHRpb24oaSlcIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkFkZFwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZXM9XCJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cIlwiXG4gICAgICAgICAgICAgICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgW3NoYXBlXT1cIidyb3VuZGVkJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRPcHRpb24oKVwiXG4gICAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwiZm9ybS1ncm91cC10aXRsZVwiPk1pc2NlbGxhbmVvdXM8L2xlZ2VuZD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGt3aWt1aS1zZWxlY3QtY29tYm9ib3hcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ11cIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCInYmFzaWMtcmFkaW8tY29uZmlnLW9yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInb3JpZW50YXRpb24nXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIlxuICAgICAgICAgICAgICAgIGJhc2ljUmFkaW9Gb3JtR3JvdXBbJ2NvbnRyb2xzJ10ucHJvcGVydGllc1snY29udHJvbHMnXVxuICAgICAgICAgICAgICAgICAgLm9yaWVudGF0aW9uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidQbGVhc2Ugc2VsZWN0IG9yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICA+PC9rd2lrdWktc2VsZWN0LWNvbWJvYm94PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZm9ybS1hcnJheS1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxcmVtO1xuICAgICAgfVxuICAgIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBCYXNpY1JhZGlvQ29uZmlnRWRpdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmVhZG9ubHkgb3B0aW9uVHlwZSA9IHtcbiAgICBsYWJlbDogXCJcIixcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfTtcblxuICBASW5wdXQoKVxuICBzYXZlQmFzaWNDbGlja0NvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KClcbiAgZWxlbWVudENvbmZpZzogYW55ID0ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIlxuICAgIH0sXG4gICAgb3B0aW9uczogW11cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljUmFkaW9Gb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZWxlbWVudENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5lbGVtZW50Q29uZmlnID0gY2hhbmdlcy5lbGVtZW50Q29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cD8ucmVzZXQodGhpcy5lbGVtZW50Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcInNhdmVCYXNpY0NsaWNrQ291bnRlclwiKSkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5wcmV2aW91c1ZhbHVlICE9PVxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNhdmVCYXNpY0NsaWNrQ291bnRlciA9IGNoYW5nZXMuc2F2ZUJhc2ljQ2xpY2tDb3VudGVyLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICB0aGlzLmhhbmRsZU9uU2F2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgY3JlYXRlQmFzaWNSYWRpb0Zvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICBsZXQgb3B0aW9uc0Zvcm1BcnJheSA9IFtdO1xuXG4gICAgdGhpcy5lbGVtZW50Q29uZmlnID0gc2V0TWlzc2luZ0tleVZhbHVlKHRoaXMuZWxlbWVudENvbmZpZywgXCJvcHRpb25zXCIsIFtcbiAgICAgIHRoaXMub3B0aW9uVHlwZVxuICAgIF0pO1xuXG4gICAgZm9yIChsZXQgb3B0aW9uIG9mIHRoaXMuZWxlbWVudENvbmZpZy5vcHRpb25zKSB7XG4gICAgICBvcHRpb25zRm9ybUFycmF5LnB1c2godGhpcy5jcmVhdGVPcHRpb25Db25maWdGb3JtR3JvdXAob3B0aW9uKSk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBwcm9wZXJ0aWVzOiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgb3JpZW50YXRpb246IG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnRDb25maWcucHJvcGVydGllcy5vcmllbnRhdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgICBvcHRpb25zOiBuZXcgRm9ybUFycmF5KG9wdGlvbnNGb3JtQXJyYXkpXG4gICAgfSk7XG4gICAgdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25TYXZlKCkge1xuICAgIGxldCBiYXNpY0VsZW1lbnRDb25maWcgPSB0aGlzLmJhc2ljUmFkaW9Gb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcblxuICAgIHRoaXMudXBkYXRlRWxlbWVudC5lbWl0KHtcbiAgICAgIGJhc2ljRWxlbWVudENvbmZpZzogYmFzaWNFbGVtZW50Q29uZmlnXG4gICAgfSk7XG4gIH1cblxuICBnZXQgb3B0aW9uc0FycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgY3JlYXRlT3B0aW9uQ29uZmlnRm9ybUdyb3VwKG9wdGlvbkNvbmZpZzogYW55KTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBvcHRpb25Gb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGxhYmVsOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmxhYmVsLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KSxcbiAgICAgIGRpc2FibGVkOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmRpc2FibGVkLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KSxcbiAgICAgIGRlc2NyaXB0aW9uOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KVxuICAgIH0pO1xuICAgIHJldHVybiBvcHRpb25Gb3JtR3JvdXA7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFkZE9wdGlvbigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldChcIm9wdGlvbnNcIikgYXMgRm9ybUFycmF5O1xuICAgIG9wdGlvbnMucHVzaCh0aGlzLmNyZWF0ZU9wdGlvbkNvbmZpZ0Zvcm1Hcm91cCh0aGlzLm9wdGlvblR5cGUpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbkluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldChcIm9wdGlvbnNcIikgYXMgRm9ybUFycmF5O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgIG9wdGlvbnMucmVtb3ZlQXQob3B0aW9uSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE9wdGlvbigpO1xuICAgICAgLy8gb3B0aW9ucy5yZXNldCgpO1xuICAgIH1cbiAgfVxufVxuIl19