@3kles/kles-material-dynamicforms 14.0.4 → 14.0.7

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 (102) hide show
  1. package/README.md +24 -24
  2. package/esm2020/3kles-kles-material-dynamicforms.mjs +4 -4
  3. package/esm2020/lib/decorators/component.decorator.mjs +7 -7
  4. package/esm2020/lib/directive/dynamic-component.directive.mjs +44 -44
  5. package/esm2020/lib/directive/dynamic-field.directive.mjs +50 -50
  6. package/esm2020/lib/dynamic-form.component.mjs +287 -251
  7. package/esm2020/lib/enums/type.enum.mjs +19 -19
  8. package/esm2020/lib/fields/array.component.mjs +57 -57
  9. package/esm2020/lib/fields/badge.component.mjs +40 -40
  10. package/esm2020/lib/fields/button-form.component.mjs +44 -44
  11. package/esm2020/lib/fields/button-submit.component.mjs +38 -38
  12. package/esm2020/lib/fields/button-toogle-group.component.mjs +51 -51
  13. package/esm2020/lib/fields/buttonchecker-form.component.mjs +44 -44
  14. package/esm2020/lib/fields/buttonfile-form.component.mjs +42 -42
  15. package/esm2020/lib/fields/checkbox.component.mjs +50 -50
  16. package/esm2020/lib/fields/chip.component.mjs +41 -41
  17. package/esm2020/lib/fields/color.component.mjs +84 -84
  18. package/esm2020/lib/fields/date.component.mjs +52 -52
  19. package/esm2020/lib/fields/field.abstract.mjs +66 -66
  20. package/esm2020/lib/fields/group.component.mjs +48 -48
  21. package/esm2020/lib/fields/icon.component.mjs +28 -28
  22. package/esm2020/lib/fields/input.clearable.component.mjs +112 -112
  23. package/esm2020/lib/fields/input.component.mjs +158 -158
  24. package/esm2020/lib/fields/label.component.mjs +40 -40
  25. package/esm2020/lib/fields/line-break.component.mjs +23 -23
  26. package/esm2020/lib/fields/link.component.mjs +32 -32
  27. package/esm2020/lib/fields/list-field.component.mjs +114 -114
  28. package/esm2020/lib/fields/radio.component.mjs +49 -49
  29. package/esm2020/lib/fields/select.component.mjs +270 -211
  30. package/esm2020/lib/fields/select.search.component.mjs +360 -307
  31. package/esm2020/lib/fields/selection-list.component.mjs +63 -63
  32. package/esm2020/lib/fields/slide-toggle.component.mjs +43 -43
  33. package/esm2020/lib/fields/text.component.mjs +40 -40
  34. package/esm2020/lib/fields/textarea.component.mjs +56 -56
  35. package/esm2020/lib/forms/button-control.component.mjs +115 -115
  36. package/esm2020/lib/forms/buttonchecker-control.component.mjs +85 -85
  37. package/esm2020/lib/forms/buttonfile-control.component.mjs +118 -118
  38. package/esm2020/lib/interfaces/component.interface.mjs +2 -2
  39. package/esm2020/lib/interfaces/directive.interface.mjs +2 -2
  40. package/esm2020/lib/interfaces/field.config.interface.mjs +2 -2
  41. package/esm2020/lib/interfaces/field.interface.mjs +2 -2
  42. package/esm2020/lib/interfaces/validator.interface.mjs +2 -2
  43. package/esm2020/lib/kles-material-dynamicforms.module.mjs +196 -196
  44. package/esm2020/lib/matcher/form-error.matcher.mjs +16 -16
  45. package/esm2020/lib/modules/material.module.mjs +278 -278
  46. package/esm2020/lib/pipe/array.pipe.mjs +22 -22
  47. package/esm2020/lib/pipe/transform.pipe.mjs +27 -27
  48. package/esm2020/lib/validators/autocomplete.validator.mjs +23 -23
  49. package/esm2020/public-api.mjs +59 -59
  50. package/fesm2015/3kles-kles-material-dynamicforms.mjs +2848 -2705
  51. package/fesm2015/3kles-kles-material-dynamicforms.mjs.map +1 -1
  52. package/fesm2020/3kles-kles-material-dynamicforms.mjs +2844 -2701
  53. package/fesm2020/3kles-kles-material-dynamicforms.mjs.map +1 -1
  54. package/index.d.ts +5 -5
  55. package/lib/decorators/component.decorator.d.ts +8 -8
  56. package/lib/directive/dynamic-component.directive.d.ts +16 -16
  57. package/lib/directive/dynamic-field.directive.d.ts +18 -18
  58. package/lib/dynamic-form.component.d.ts +32 -31
  59. package/lib/enums/type.enum.d.ts +17 -17
  60. package/lib/fields/array.component.d.ts +11 -11
  61. package/lib/fields/badge.component.d.ts +9 -9
  62. package/lib/fields/button-form.component.d.ts +9 -9
  63. package/lib/fields/button-submit.component.d.ts +9 -9
  64. package/lib/fields/button-toogle-group.component.d.ts +11 -11
  65. package/lib/fields/buttonchecker-form.component.d.ts +9 -9
  66. package/lib/fields/buttonfile-form.component.d.ts +9 -9
  67. package/lib/fields/checkbox.component.d.ts +9 -9
  68. package/lib/fields/chip.component.d.ts +9 -9
  69. package/lib/fields/color.component.d.ts +10 -10
  70. package/lib/fields/date.component.d.ts +9 -9
  71. package/lib/fields/field.abstract.d.ts +21 -21
  72. package/lib/fields/group.component.d.ts +11 -11
  73. package/lib/fields/icon.component.d.ts +9 -9
  74. package/lib/fields/input.clearable.component.d.ts +8 -8
  75. package/lib/fields/input.component.d.ts +15 -15
  76. package/lib/fields/label.component.d.ts +9 -9
  77. package/lib/fields/line-break.component.d.ts +9 -9
  78. package/lib/fields/link.component.d.ts +9 -9
  79. package/lib/fields/list-field.component.d.ts +19 -19
  80. package/lib/fields/radio.component.d.ts +9 -9
  81. package/lib/fields/select.component.d.ts +21 -19
  82. package/lib/fields/select.search.component.d.ts +26 -22
  83. package/lib/fields/selection-list.component.d.ts +11 -11
  84. package/lib/fields/slide-toggle.component.d.ts +9 -9
  85. package/lib/fields/text.component.d.ts +9 -9
  86. package/lib/fields/textarea.component.d.ts +9 -9
  87. package/lib/forms/button-control.component.d.ts +36 -36
  88. package/lib/forms/buttonchecker-control.component.d.ts +14 -14
  89. package/lib/forms/buttonfile-control.component.d.ts +20 -20
  90. package/lib/interfaces/component.interface.d.ts +5 -5
  91. package/lib/interfaces/directive.interface.d.ts +3 -3
  92. package/lib/interfaces/field.config.interface.d.ts +59 -58
  93. package/lib/interfaces/field.interface.d.ts +7 -7
  94. package/lib/interfaces/validator.interface.d.ts +5 -5
  95. package/lib/kles-material-dynamicforms.module.d.ts +58 -56
  96. package/lib/matcher/form-error.matcher.d.ts +9 -9
  97. package/lib/modules/material.module.d.ts +42 -42
  98. package/lib/pipe/array.pipe.d.ts +7 -7
  99. package/lib/pipe/transform.pipe.d.ts +10 -10
  100. package/lib/validators/autocomplete.validator.d.ts +3 -3
  101. package/package.json +1 -3
  102. package/public-api.d.ts +54 -54
@@ -1,211 +1,270 @@
1
- import { __decorate } from "tslib";
2
- import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
3
- import { Component, ViewChild, ViewChildren } from '@angular/core';
4
- import { MatOption } from '@angular/material/core';
5
- import { Observable, of } from 'rxjs';
6
- import { FieldMapper } from '../decorators/component.decorator';
7
- import { EnumType } from '../enums/type.enum';
8
- import { KlesFieldAbstract } from './field.abstract';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "@angular/forms";
12
- import * as i3 from "@angular/flex-layout/extended";
13
- import * as i4 from "@angular/material/form-field";
14
- import * as i5 from "@angular/material/select";
15
- import * as i6 from "@angular/material/core";
16
- import * as i7 from "@angular/material/tooltip";
17
- import * as i8 from "@angular/cdk/scrolling";
18
- import * as i9 from "../directive/dynamic-component.directive";
19
- import * as i10 from "@ngx-translate/core";
20
- import * as i11 from "../pipe/transform.pipe";
21
- let KlesFormSelectComponent = class KlesFormSelectComponent extends KlesFieldAbstract {
22
- constructor(viewRef) {
23
- super(viewRef);
24
- this.viewRef = viewRef;
25
- this.compareFn = (o1, o2) => {
26
- if (this.field.property && o1 && o2) {
27
- return o1[this.field.property] === o2[this.field.property];
28
- }
29
- return o1 === o2;
30
- };
31
- }
32
- ngOnInit() {
33
- super.ngOnInit();
34
- if (!(this.field.options instanceof Observable)) {
35
- this.options$ = of(this.field.options);
36
- }
37
- else {
38
- this.options$ = this.field.options;
39
- }
40
- }
41
- ngOnDestroy() {
42
- super.ngOnDestroy();
43
- }
44
- openChange($event) {
45
- if (this.field.virtualScroll) {
46
- if ($event) {
47
- this.cdkVirtualScrollViewport.scrollToIndex(0);
48
- this.cdkVirtualScrollViewport.checkViewportSize();
49
- }
50
- }
51
- }
52
- };
53
- KlesFormSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: KlesFormSelectComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
54
- KlesFormSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: KlesFormSelectComponent, selector: "kles-form-select", viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "options", predicate: MatOption, descendants: true }], usesInheritance: true, ngImport: i0, template: `
55
- <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
56
- <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
57
- (openedChange)="openChange($event)" [compareWith]="compareFn"
58
- [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
59
- <mat-select-trigger *ngIf="field.triggerComponent">
60
- <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
61
- </mat-select-trigger>
62
-
63
-
64
- <ng-container *ngIf="!field.virtualScroll">
65
- <ng-container *ngIf="!field.autocompleteComponent">
66
- <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
67
- </ng-container>
68
-
69
- <ng-container *ngIf="field.autocompleteComponent">
70
- <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
71
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
72
- </mat-option>
73
- </ng-container>
74
- </ng-container>
75
-
76
- <ng-container *ngIf="field.virtualScroll">
77
- <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
78
- <ng-container *ngIf="!field.autocompleteComponent">
79
- <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
80
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
81
- </mat-option>
82
-
83
- <ng-container *ngIf="field.multiple">
84
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
85
- style="display:none">
86
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
87
- </mat-option>
88
- </ng-container>
89
-
90
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
91
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
92
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
93
- </mat-option>
94
- </ng-container>
95
- </ng-container>
96
-
97
- <ng-container *ngIf="field.autocompleteComponent">
98
- <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
99
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
100
- </mat-option>
101
- <ng-container *ngIf="field.multiple">
102
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
103
- style="display:none">
104
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
105
- </mat-option>
106
- </ng-container>
107
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
108
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
109
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
110
- </mat-option>
111
- </ng-container>
112
- </ng-container>
113
- </cdk-virtual-scroll-viewport>
114
-
115
- </ng-container>
116
-
117
- </mat-select>
118
- <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
119
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
120
- </ng-container>
121
- <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
122
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
123
- </ng-container>
124
- </mat-form-field>
125
- `, isInline: true, styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i5.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i8.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i8.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i8.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i9.KlesComponentDirective, selector: "[klesComponent]", inputs: ["component", "value", "field"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }, { kind: "pipe", type: i11.KlesTransformPipe, name: "klesTransform" }] });
126
- KlesFormSelectComponent = __decorate([
127
- FieldMapper({ type: EnumType.select })
128
- ], KlesFormSelectComponent);
129
- export { KlesFormSelectComponent };
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: KlesFormSelectComponent, decorators: [{
131
- type: Component,
132
- args: [{ selector: 'kles-form-select', template: `
133
- <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
134
- <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
135
- (openedChange)="openChange($event)" [compareWith]="compareFn"
136
- [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
137
- <mat-select-trigger *ngIf="field.triggerComponent">
138
- <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
139
- </mat-select-trigger>
140
-
141
-
142
- <ng-container *ngIf="!field.virtualScroll">
143
- <ng-container *ngIf="!field.autocompleteComponent">
144
- <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
145
- </ng-container>
146
-
147
- <ng-container *ngIf="field.autocompleteComponent">
148
- <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
149
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
150
- </mat-option>
151
- </ng-container>
152
- </ng-container>
153
-
154
- <ng-container *ngIf="field.virtualScroll">
155
- <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
156
- <ng-container *ngIf="!field.autocompleteComponent">
157
- <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
158
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
159
- </mat-option>
160
-
161
- <ng-container *ngIf="field.multiple">
162
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
163
- style="display:none">
164
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
165
- </mat-option>
166
- </ng-container>
167
-
168
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
169
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
170
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
171
- </mat-option>
172
- </ng-container>
173
- </ng-container>
174
-
175
- <ng-container *ngIf="field.autocompleteComponent">
176
- <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
177
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
178
- </mat-option>
179
- <ng-container *ngIf="field.multiple">
180
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
181
- style="display:none">
182
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
183
- </mat-option>
184
- </ng-container>
185
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
186
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
187
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
188
- </mat-option>
189
- </ng-container>
190
- </ng-container>
191
- </cdk-virtual-scroll-viewport>
192
-
193
- </ng-container>
194
-
195
- </mat-select>
196
- <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
197
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
198
- </ng-container>
199
- <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
200
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
201
- </ng-container>
202
- </mat-form-field>
203
- `, styles: ["mat-form-field{width:100%}\n"] }]
204
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { cdkVirtualScrollViewport: [{
205
- type: ViewChild,
206
- args: [CdkVirtualScrollViewport]
207
- }], options: [{
208
- type: ViewChildren,
209
- args: [MatOption]
210
- }] } });
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tsZXMtbWF0ZXJpYWwtZHluYW1pY2Zvcm1zL3NyYy9saWIvZmllbGRzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBb0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRixPQUFPLEVBQW9DLFNBQVMsRUFBZ0MsU0FBUyxFQUFFLFlBQVksRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7SUErRXhDLHVCQUF1QixTQUF2Qix1QkFBd0IsU0FBUSxpQkFBaUI7SUFPMUQsWUFBc0IsT0FBeUI7UUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBREcsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUEyQi9DLGNBQVMsR0FBRyxDQUFDLEVBQU8sRUFBRSxFQUFPLEVBQUUsRUFBRTtZQUM3QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUQ7WUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFBO0lBOUJELENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQWU7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUMxQixJQUFJLE1BQU0sRUFBRTtnQkFDUixJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUNyRDtTQUNKO0lBQ0wsQ0FBQztDQVFKLENBQUE7b0hBeENZLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLGtIQUVyQix3QkFBd0IsNkRBQ3JCLFNBQVMsdUVBN0ViOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXVFYjtBQUdZLHVCQUF1QjtJQTdFbkMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQTZFMUIsdUJBQXVCLENBd0NuQztTQXhDWSx1QkFBdUI7MkZBQXZCLHVCQUF1QjtrQkE1RW5DLFNBQVM7K0JBQ0ksa0JBQWtCLFlBQ2xCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXVFYjt1R0FLd0Msd0JBQXdCO3NCQUE1RCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFDVixPQUFPO3NCQUEvQixZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0T3B0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRmllbGRNYXBwZXIgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2NvbXBvbmVudC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBFbnVtVHlwZSB9IGZyb20gJy4uL2VudW1zL3R5cGUuZW51bSc7XHJcbmltcG9ydCB7IEtsZXNGaWVsZEFic3RyYWN0IH0gZnJvbSAnLi9maWVsZC5hYnN0cmFjdCc7XHJcblxyXG5ARmllbGRNYXBwZXIoeyB0eXBlOiBFbnVtVHlwZS5zZWxlY3QgfSlcclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2tsZXMtZm9ybS1zZWxlY3QnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hcmdpbi10b3BcIiBbY29sb3JdPVwiZmllbGQuY29sb3JcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgbWF0VG9vbHRpcD1cInt7ZmllbGQudG9vbHRpcH19XCIgW2F0dHIuaWRdPVwiZmllbGQuaWRcIlxyXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib3BlbkNoYW5nZSgkZXZlbnQpXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZmllbGQubmdDbGFzc1wiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFttdWx0aXBsZV09XCJmaWVsZC5tdWx0aXBsZVwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXIgKm5nSWY9XCJmaWVsZC50cmlnZ2VyQ29tcG9uZW50XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLnRyaWdnZXJDb21wb25lbnRcIiBbdmFsdWVdPVwiZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQudmlydHVhbFNjcm9sbFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9ucyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+e3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9ucyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC52aXJ0dWFsU2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cImZpZWxkLml0ZW1TaXplIHx8IDUwXCIgW3N0eWxlLmhlaWdodC5weF09NSo0OD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiAgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5tdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5jb250cm9sc1tmaWVsZC5uYW1lXS52YWx1ZSB8IHNsaWNlOjA6MzBcIiBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQubXVsdGlwbGUgJiYgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbZ3JvdXA/LmNvbnRyb2xzW2ZpZWxkLm5hbWVdPy52YWx1ZV1cIiBbdmFsdWVdPVwiaXRlbVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbT8uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLm11bHRpcGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlIHwgc2xpY2U6MDozMFwiIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiIFt2YWx1ZV09XCJpdGVtXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLm11bHRpcGxlICYmIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtncm91cD8uY29udHJvbHNbZmllbGQubmFtZV0/LnZhbHVlXVwiIFt2YWx1ZV09XCJpdGVtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiIFt2YWx1ZV09XCJpdGVtXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uIG9mIGZpZWxkLnZhbGlkYXRpb25zO1wiIG5nUHJvamVjdEFzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ3JvdXAuZ2V0KGZpZWxkLm5hbWUpLmhhc0Vycm9yKHZhbGlkYXRpb24ubmFtZSlcIj57e3ZhbGlkYXRpb24ubWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uIG9mIGZpZWxkLmFzeW5jVmFsaWRhdGlvbnM7XCIgbmdQcm9qZWN0QXM9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJncm91cC5nZXQoZmllbGQubmFtZSkuaGFzRXJyb3IodmFsaWRhdGlvbi5uYW1lKVwiPnt7dmFsaWRhdGlvbi5tZXNzYWdlIHwgdHJhbnNsYXRlfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5gLFxyXG4gICAgc3R5bGVzOiBbJ21hdC1mb3JtLWZpZWxkIHt3aWR0aDogY2FsYygxMDAlKX0nXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgS2xlc0Zvcm1TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBLbGVzRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcbiAgICBAVmlld0NoaWxkcmVuKE1hdE9wdGlvbikgb3B0aW9uczogUXVlcnlMaXN0PE1hdE9wdGlvbj47XHJcblxyXG4gICAgb3B0aW9ucyQ6IE9ic2VydmFibGU8YW55W10+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgc3VwZXIodmlld1JlZik7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKCEodGhpcy5maWVsZC5vcHRpb25zIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IG9mKHRoaXMuZmllbGQub3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IHRoaXMuZmllbGQub3B0aW9ucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuQ2hhbmdlKCRldmVudDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgaWYgKCRldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGFyZUZuID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZC5wcm9wZXJ0eSAmJiBvMSAmJiBvMikge1xyXG4gICAgICAgICAgICByZXR1cm4gbzFbdGhpcy5maWVsZC5wcm9wZXJ0eV0gPT09IG8yW3RoaXMuZmllbGQucHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbzEgPT09IG8yO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
1
+ import { __decorate } from "tslib";
2
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
3
+ import { Component, ViewChild, ViewChildren } from '@angular/core';
4
+ import { MatOption } from '@angular/material/core';
5
+ import { BehaviorSubject, Observable, of } from 'rxjs';
6
+ import { take } from 'rxjs/operators';
7
+ import { FieldMapper } from '../decorators/component.decorator';
8
+ import { EnumType } from '../enums/type.enum';
9
+ import { KlesFieldAbstract } from './field.abstract';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/forms";
13
+ import * as i3 from "@angular/flex-layout/flex";
14
+ import * as i4 from "@angular/flex-layout/extended";
15
+ import * as i5 from "@angular/material/form-field";
16
+ import * as i6 from "@angular/material/select";
17
+ import * as i7 from "@angular/material/core";
18
+ import * as i8 from "@angular/material/tooltip";
19
+ import * as i9 from "@angular/material/progress-spinner";
20
+ import * as i10 from "@angular/cdk/scrolling";
21
+ import * as i11 from "../directive/dynamic-component.directive";
22
+ import * as i12 from "@ngx-translate/core";
23
+ import * as i13 from "../pipe/transform.pipe";
24
+ let KlesFormSelectComponent = class KlesFormSelectComponent extends KlesFieldAbstract {
25
+ constructor(viewRef, ref) {
26
+ super(viewRef);
27
+ this.viewRef = viewRef;
28
+ this.ref = ref;
29
+ this.isLoading = false;
30
+ this.compareFn = (o1, o2) => {
31
+ if (this.field.property && o1 && o2) {
32
+ return o1[this.field.property] === o2[this.field.property];
33
+ }
34
+ return o1 === o2;
35
+ };
36
+ }
37
+ ngOnInit() {
38
+ super.ngOnInit();
39
+ if (this.field.lazy) {
40
+ this.isLoading = true;
41
+ if (this.field.value) {
42
+ this.options$ = new BehaviorSubject(Array.isArray(this.field.value) ? this.field.value : [this.field.value]);
43
+ }
44
+ else {
45
+ this.options$ = new BehaviorSubject(null);
46
+ }
47
+ }
48
+ else {
49
+ if (!(this.field.options instanceof Observable)) {
50
+ this.options$ = of(this.field.options);
51
+ }
52
+ else {
53
+ this.options$ = this.field.options;
54
+ }
55
+ }
56
+ }
57
+ ngOnDestroy() {
58
+ super.ngOnDestroy();
59
+ }
60
+ openChange($event) {
61
+ if (this.field.lazy) {
62
+ if ($event) {
63
+ if (!(this.field.options instanceof Observable)) {
64
+ this.options$.next(this.field.options);
65
+ }
66
+ else {
67
+ this.isLoading = true;
68
+ this.field.options.pipe(take(1)).subscribe(options => {
69
+ this.options$.next(options);
70
+ this.isLoading = false;
71
+ this.ref.markForCheck();
72
+ });
73
+ }
74
+ }
75
+ }
76
+ if (this.field.virtualScroll) {
77
+ if ($event) {
78
+ this.cdkVirtualScrollViewport.scrollToIndex(0);
79
+ this.cdkVirtualScrollViewport.checkViewportSize();
80
+ }
81
+ }
82
+ }
83
+ };
84
+ KlesFormSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: KlesFormSelectComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
85
+ KlesFormSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: KlesFormSelectComponent, selector: "kles-form-select", viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "options", predicate: MatOption, descendants: true }], usesInheritance: true, ngImport: i0, template: `
86
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
87
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
88
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
89
+ [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
90
+ <mat-select-trigger *ngIf="field.triggerComponent">
91
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
92
+ </mat-select-trigger>
93
+
94
+ <ng-container *ngIf="!field.virtualScroll">
95
+ <ng-container *ngIf="!field.autocompleteComponent">
96
+ <ng-container *ngIf="!isLoading; else emptyOption">
97
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
98
+ </ng-container>
99
+ </ng-container>
100
+
101
+ <ng-container *ngIf="field.autocompleteComponent">
102
+ <ng-container *ngIf="!isLoading; else emptyOption">
103
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
104
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
105
+ </mat-option>
106
+ </ng-container>
107
+ </ng-container>
108
+ <ng-template #emptyOption>
109
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
110
+ </ng-template>
111
+ </ng-container>
112
+
113
+ <ng-container *ngIf="field.virtualScroll">
114
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
115
+ <ng-container *ngIf="!field.autocompleteComponent">
116
+ <ng-container *ngIf="!isLoading; else emptyOption">
117
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
118
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
119
+ </mat-option>
120
+ </ng-container>
121
+
122
+ <ng-container *ngIf="field.multiple">
123
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
124
+ style="display:none">
125
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
126
+ </mat-option>
127
+ </ng-container>
128
+
129
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
130
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
131
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
132
+ </mat-option>
133
+ </ng-container>
134
+ </ng-container>
135
+
136
+ <ng-container *ngIf="field.autocompleteComponent">
137
+ <ng-container *ngIf="!isLoading; else emptyOption">
138
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
139
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
140
+ </mat-option>
141
+ </ng-container>
142
+ <ng-container *ngIf="field.multiple">
143
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
144
+ style="display:none">
145
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
146
+ </mat-option>
147
+ </ng-container>
148
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
149
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
150
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
151
+ </mat-option>
152
+ </ng-container>
153
+ </ng-container>
154
+
155
+ <ng-template #emptyOption>
156
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
157
+ </ng-template>
158
+ </cdk-virtual-scroll-viewport>
159
+
160
+ </ng-container>
161
+
162
+ </mat-select>
163
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
164
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
165
+ </ng-container>
166
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
167
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
168
+ </ng-container>
169
+ </mat-form-field>
170
+ `, isInline: true, styles: ["mat-form-field{width:100%}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i6.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i10.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i10.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i10.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i11.KlesComponentDirective, selector: "[klesComponent]", inputs: ["component", "value", "field"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.KlesTransformPipe, name: "klesTransform" }] });
171
+ KlesFormSelectComponent = __decorate([
172
+ FieldMapper({ type: EnumType.select })
173
+ ], KlesFormSelectComponent);
174
+ export { KlesFormSelectComponent };
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: KlesFormSelectComponent, decorators: [{
176
+ type: Component,
177
+ args: [{ selector: 'kles-form-select', template: `
178
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
179
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
180
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
181
+ [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
182
+ <mat-select-trigger *ngIf="field.triggerComponent">
183
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
184
+ </mat-select-trigger>
185
+
186
+ <ng-container *ngIf="!field.virtualScroll">
187
+ <ng-container *ngIf="!field.autocompleteComponent">
188
+ <ng-container *ngIf="!isLoading; else emptyOption">
189
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
190
+ </ng-container>
191
+ </ng-container>
192
+
193
+ <ng-container *ngIf="field.autocompleteComponent">
194
+ <ng-container *ngIf="!isLoading; else emptyOption">
195
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
196
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
197
+ </mat-option>
198
+ </ng-container>
199
+ </ng-container>
200
+ <ng-template #emptyOption>
201
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
202
+ </ng-template>
203
+ </ng-container>
204
+
205
+ <ng-container *ngIf="field.virtualScroll">
206
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
207
+ <ng-container *ngIf="!field.autocompleteComponent">
208
+ <ng-container *ngIf="!isLoading; else emptyOption">
209
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
210
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
211
+ </mat-option>
212
+ </ng-container>
213
+
214
+ <ng-container *ngIf="field.multiple">
215
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
216
+ style="display:none">
217
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
218
+ </mat-option>
219
+ </ng-container>
220
+
221
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
222
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
223
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
224
+ </mat-option>
225
+ </ng-container>
226
+ </ng-container>
227
+
228
+ <ng-container *ngIf="field.autocompleteComponent">
229
+ <ng-container *ngIf="!isLoading; else emptyOption">
230
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
231
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
232
+ </mat-option>
233
+ </ng-container>
234
+ <ng-container *ngIf="field.multiple">
235
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
236
+ style="display:none">
237
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
238
+ </mat-option>
239
+ </ng-container>
240
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
241
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
242
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
243
+ </mat-option>
244
+ </ng-container>
245
+ </ng-container>
246
+
247
+ <ng-template #emptyOption>
248
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
249
+ </ng-template>
250
+ </cdk-virtual-scroll-viewport>
251
+
252
+ </ng-container>
253
+
254
+ </mat-select>
255
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
256
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
257
+ </ng-container>
258
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
259
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
260
+ </ng-container>
261
+ </mat-form-field>
262
+ `, styles: ["mat-form-field{width:100%}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"] }]
263
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { cdkVirtualScrollViewport: [{
264
+ type: ViewChild,
265
+ args: [CdkVirtualScrollViewport]
266
+ }], options: [{
267
+ type: ViewChildren,
268
+ args: [MatOption]
269
+ }] } });
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tsZXMtbWF0ZXJpYWwtZHluYW1pY2Zvcm1zL3NyYy9saWIvZmllbGRzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBcUIsU0FBUyxFQUFnQyxTQUFTLEVBQUUsWUFBWSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBdUIsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0lBOEZ4Qyx1QkFBdUIsU0FBdkIsdUJBQXdCLFNBQVEsaUJBQWlCO0lBUzFELFlBQXNCLE9BQXlCLEVBQVksR0FBc0I7UUFDN0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBREcsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBWSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUZqRixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBb0RsQixjQUFTLEdBQUcsQ0FBQyxFQUFPLEVBQUUsRUFBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNqQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQTtJQXJERCxDQUFDO0lBRUQsUUFBUTtRQUNKLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQVEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdkg7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBUSxJQUFJLENBQUMsQ0FBQzthQUNwRDtTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sWUFBWSxVQUFVLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQztpQkFBTTtnQkFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQ3RDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQWU7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNqQixJQUFJLE1BQU0sRUFBRTtnQkFDUixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sWUFBWSxVQUFVLENBQUMsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLFFBQW1DLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3RFO3FCQUFNO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNoRCxJQUFJLENBQUMsUUFBbUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzFCLElBQUksTUFBTSxFQUFFO2dCQUNSLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3JEO1NBQ0o7SUFDTCxDQUFDO0NBUUosQ0FBQTtvSEFqRVksdUJBQXVCO3dHQUF2Qix1QkFBdUIsa0hBRXJCLHdCQUF3Qiw2REFDckIsU0FBUyx1RUE1RmI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxRmI7QUFJWSx1QkFBdUI7SUE1Rm5DLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7R0E0RjFCLHVCQUF1QixDQWlFbkM7U0FqRVksdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBM0ZuQyxTQUFTOytCQUNJLGtCQUFrQixZQUNsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFGYjt1SUFNd0Msd0JBQXdCO3NCQUE1RCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFDVixPQUFPO3NCQUEvQixZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRPcHRpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWVsZE1hcHBlciB9IGZyb20gJy4uL2RlY29yYXRvcnMvY29tcG9uZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBFbnVtVHlwZSB9IGZyb20gJy4uL2VudW1zL3R5cGUuZW51bSc7XG5pbXBvcnQgeyBLbGVzRmllbGRBYnN0cmFjdCB9IGZyb20gJy4vZmllbGQuYWJzdHJhY3QnO1xuXG5ARmllbGRNYXBwZXIoeyB0eXBlOiBFbnVtVHlwZS5zZWxlY3QgfSlcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2xlcy1mb3JtLXNlbGVjdCcsXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXJnaW4tdG9wXCIgW2NvbG9yXT1cImZpZWxkLmNvbG9yXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCBtYXRUb29sdGlwPVwie3tmaWVsZC50b29sdGlwfX1cIiBbYXR0ci5pZF09XCJmaWVsZC5pZFwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib3BlbkNoYW5nZSgkZXZlbnQpXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkLm5nQ2xhc3NcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciAqbmdJZj1cImZpZWxkLnRyaWdnZXJDb21wb25lbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLnRyaWdnZXJDb21wb25lbnRcIiBbdmFsdWVdPVwiZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC52aXJ0dWFsU2Nyb2xsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGVtcHR5T3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtPy5kaXNhYmxlZFwiPnt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9ucyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eU9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGUtY2hlY2tib3hcIiBkaXNhYmxlZD48ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+e3snbG9hZGluZycgfCB0cmFuc2xhdGV9fS4uLiA8bWF0LXNwaW5uZXIgY2xhc3M9XCJzcGlubmVyXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+PC9kaXY+PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLnZpcnR1YWxTY3JvbGxcIj5cbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cImZpZWxkLml0ZW1TaXplIHx8IDUwXCIgW3N0eWxlLmhlaWdodC5weF09NSo0OD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiAgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlIHwgc2xpY2U6MDozMFwiIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC5tdWx0aXBsZSAmJiBncm91cC5jb250cm9sc1tmaWVsZC5uYW1lXS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbZ3JvdXA/LmNvbnRyb2xzW2ZpZWxkLm5hbWVdPy52YWx1ZV1cIiBbdmFsdWVdPVwiaXRlbVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGVtcHR5T3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIG9wdGlvbnMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtPy5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiIFt2YWx1ZV09XCJpdGVtXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlIHwgc2xpY2U6MDozMFwiIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQubXVsdGlwbGUgJiYgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtncm91cD8uY29udHJvbHNbZmllbGQubmFtZV0/LnZhbHVlXVwiIFt2YWx1ZV09XCJpdGVtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlPcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaGlkZS1jaGVja2JveFwiIGRpc2FibGVkPjxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIj57eydsb2FkaW5nJyB8IHRyYW5zbGF0ZX19Li4uIDxtYXQtc3Bpbm5lciBjbGFzcz1cInNwaW5uZXJcIiBkaWFtZXRlcj1cIjIwXCI+PC9tYXQtc3Bpbm5lcj48L2Rpdj48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucztcIiBuZ1Byb2plY3RBcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJncm91cC5nZXQoZmllbGQubmFtZSkuaGFzRXJyb3IodmFsaWRhdGlvbi5uYW1lKVwiPnt7dmFsaWRhdGlvbi5tZXNzYWdlIHwgdHJhbnNsYXRlfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvbiBvZiBmaWVsZC5hc3luY1ZhbGlkYXRpb25zO1wiIG5nUHJvamVjdEFzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdyb3VwLmdldChmaWVsZC5uYW1lKS5oYXNFcnJvcih2YWxpZGF0aW9uLm5hbWUpXCI+e3t2YWxpZGF0aW9uLm1lc3NhZ2UgfCB0cmFuc2xhdGV9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbmAsXG4gICAgc3R5bGVzOiBbJ21hdC1mb3JtLWZpZWxkIHt3aWR0aDogY2FsYygxMDAlKX0nLFxuICAgIGA6Om5nLWRlZXAgLmhpZGUtY2hlY2tib3ggLm1hdC1wc2V1ZG8tY2hlY2tib3ggeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7ICB9YF1cbn0pXG5leHBvcnQgY2xhc3MgS2xlc0Zvcm1TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBLbGVzRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBAVmlld0NoaWxkcmVuKE1hdE9wdGlvbikgb3B0aW9uczogUXVlcnlMaXN0PE1hdE9wdGlvbj47XG5cbiAgICBvcHRpb25zJDogT2JzZXJ2YWJsZTxhbnlbXT47XG5cbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcm90ZWN0ZWQgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICBzdXBlcih2aWV3UmVmKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZmllbGQubGF6eSkge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oQXJyYXkuaXNBcnJheSh0aGlzLmZpZWxkLnZhbHVlKSA/IHRoaXMuZmllbGQudmFsdWUgOiBbdGhpcy5maWVsZC52YWx1ZV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyQgPSBvZih0aGlzLmZpZWxkLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5maWVsZC5vcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbkNoYW5nZSgkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuZmllbGQubGF6eSkge1xuICAgICAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZmllbGQub3B0aW9ucyBpbnN0YW5jZW9mIE9ic2VydmFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMkIGFzIEJlaGF2aW9yU3ViamVjdDxhbnlbXT4pLm5leHQodGhpcy5maWVsZC5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGQub3B0aW9ucy5waXBlKHRha2UoMSkpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMkIGFzIEJlaGF2aW9yU3ViamVjdDxhbnlbXT4pLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpZWxkLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAgIGlmICgkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUb0luZGV4KDApO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYXJlRm4gPSAobzE6IGFueSwgbzI6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5maWVsZC5wcm9wZXJ0eSAmJiBvMSAmJiBvMikge1xuICAgICAgICAgICAgcmV0dXJuIG8xW3RoaXMuZmllbGQucHJvcGVydHldID09PSBvMlt0aGlzLmZpZWxkLnByb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbzEgPT09IG8yO1xuICAgIH1cbn1cbiJdfQ==