@meshmakers/shared-ui 2.0.2304-14001 → 2.0.2304-23001

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 (42) hide show
  1. package/README.md +24 -27
  2. package/esm2020/lib/confirmation-dialog/confirmation-dialog.module.mjs +40 -40
  3. package/esm2020/lib/confirmation-dialog/confirmation-window/confirmation-window.component.mjs +69 -65
  4. package/esm2020/lib/confirmation-dialog/services/confirmation.service.mjs +68 -68
  5. package/esm2020/lib/confirmation-dialog/shared/confirmation.mjs +15 -15
  6. package/esm2020/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.mjs +276 -263
  7. package/esm2020/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.mjs +276 -264
  8. package/esm2020/lib/ia-shared-ui/ia-multiple-entity-select-input/ia-multiple-entity-select-input.component.mjs +300 -285
  9. package/esm2020/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.mjs +36 -35
  10. package/esm2020/lib/ia-shared-ui/ia-shared-ui.module.mjs +88 -88
  11. package/esm2020/lib/ia-shared-ui/message-details/message-details.component.mjs +24 -24
  12. package/esm2020/lib/progress-notifier/progress-notifier.module.mjs +44 -44
  13. package/esm2020/lib/progress-notifier/progress-window/progress-window.component.mjs +34 -33
  14. package/esm2020/lib/progress-notifier/services/progress-notifier.service.mjs +59 -58
  15. package/esm2020/lib/progress-notifier/shared/progressValue.mjs +7 -3
  16. package/esm2020/lib/shared/abstractDetailsComponent.mjs +38 -37
  17. package/esm2020/lib/shared/commonValidators.mjs +30 -29
  18. package/esm2020/meshmakers-shared-ui.mjs +4 -4
  19. package/esm2020/public-api.mjs +16 -16
  20. package/fesm2015/meshmakers-shared-ui.mjs +1273 -1212
  21. package/fesm2015/meshmakers-shared-ui.mjs.map +1 -1
  22. package/fesm2020/meshmakers-shared-ui.mjs +1251 -1202
  23. package/fesm2020/meshmakers-shared-ui.mjs.map +1 -1
  24. package/index.d.ts +5 -5
  25. package/lib/confirmation-dialog/confirmation-dialog.module.d.ts +13 -13
  26. package/lib/confirmation-dialog/confirmation-window/confirmation-window.component.d.ts +21 -21
  27. package/lib/confirmation-dialog/services/confirmation.service.d.ts +14 -14
  28. package/lib/confirmation-dialog/shared/confirmation.d.ts +20 -20
  29. package/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.d.ts +69 -69
  30. package/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.d.ts +70 -70
  31. package/lib/ia-shared-ui/ia-multiple-entity-select-input/ia-multiple-entity-select-input.component.d.ts +73 -73
  32. package/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.d.ts +15 -15
  33. package/lib/ia-shared-ui/ia-shared-ui.module.d.ts +22 -22
  34. package/lib/ia-shared-ui/message-details/message-details.component.d.ts +13 -13
  35. package/lib/progress-notifier/progress-notifier.module.d.ts +14 -14
  36. package/lib/progress-notifier/progress-window/progress-window.component.d.ts +23 -23
  37. package/lib/progress-notifier/services/progress-notifier.service.d.ts +17 -17
  38. package/lib/progress-notifier/shared/progressValue.d.ts +5 -4
  39. package/lib/shared/abstractDetailsComponent.d.ts +15 -15
  40. package/lib/shared/commonValidators.d.ts +10 -10
  41. package/package.json +8 -4
  42. package/public-api.d.ts +12 -12
@@ -1,285 +1,300 @@
1
- import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from '@angular/core';
2
- import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
- import { Subject } from "rxjs";
4
- import { coerceBooleanProperty } from "@angular/cdk/coercion";
5
- import { debounceTime, filter, switchMap, tap } from "rxjs/operators";
6
- import { MatFormFieldControl } from "@angular/material/form-field";
7
- import { COMMA, ENTER } from "@angular/cdk/keycodes";
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/cdk/a11y";
10
- import * as i2 from "@angular/common";
11
- import * as i3 from "@angular/material/autocomplete";
12
- import * as i4 from "@angular/material/core";
13
- import * as i5 from "@angular/material/input";
14
- import * as i6 from "@angular/material/progress-spinner";
15
- import * as i7 from "@angular/material/chips";
16
- import * as i8 from "@angular/material/icon";
17
- import * as i9 from "@angular/forms";
18
- export class IaMultipleEntitySelectInput {
19
- constructor(elRef, injector, fm) {
20
- this.elRef = elRef;
21
- this.injector = injector;
22
- this.fm = fm;
23
- this.filteredEntities = [];
24
- this.stateChanges = new Subject();
25
- this.id = `ia-multiple-entity-select-${IaMultipleEntitySelectInput.nextId++}`;
26
- this.valuesChange = new EventEmitter();
27
- this.describedBy = '';
28
- this.separatorKeysCodes = [ENTER, COMMA];
29
- this._disabled = false;
30
- this._required = false;
31
- this._propagateChange = (_) => {
32
- };
33
- this._onTouched = () => {
34
- };
35
- this.valuesFormControl = new FormControl();
36
- this.searchFormControl = new FormControl();
37
- this.isLoading = false;
38
- this._disabled = false;
39
- this.focused = false;
40
- fm.monitor(elRef.nativeElement, true).subscribe(origin => {
41
- this.focused = !!origin;
42
- this.stateChanges.next();
43
- });
44
- }
45
- get dataSource() {
46
- return this._dataSource;
47
- }
48
- set dataSource(value) {
49
- this._dataSource = value;
50
- }
51
- get disabled() {
52
- return this._disabled;
53
- }
54
- set disabled(dis) {
55
- this._disabled = coerceBooleanProperty(dis);
56
- this._disabled ? this.searchFormControl.disable() : this.searchFormControl.enable();
57
- this.stateChanges.next();
58
- }
59
- get placeholder() {
60
- return this._placeholder;
61
- }
62
- set placeholder(plh) {
63
- this._placeholder = plh;
64
- this.stateChanges.next();
65
- }
66
- get required() {
67
- return this._required;
68
- }
69
- set required(req) {
70
- this._required = coerceBooleanProperty(req);
71
- this.inputField.required = this._required;
72
- this.stateChanges.next();
73
- }
74
- get prefix() {
75
- return this._prefix;
76
- }
77
- set prefix(value) {
78
- if (value !== this._prefix) {
79
- this._prefix = value;
80
- }
81
- }
82
- get value() {
83
- return this._selectedEntities;
84
- }
85
- set value(value) {
86
- if (value !== this._selectedEntities) {
87
- this.valuesFormControl.setValue(value);
88
- this.setValue(value);
89
- }
90
- }
91
- get empty() {
92
- let n = this.valuesFormControl.value;
93
- return !!!n;
94
- }
95
- get shouldLabelFloat() {
96
- return this.focused || !this.empty;
97
- }
98
- ngOnInit() {
99
- this.ngControl = this.injector.get(NgControl, null);
100
- if (this.ngControl != null) {
101
- this.ngControl.valueAccessor = this;
102
- }
103
- // If prefix defined, usually this is used for a code scanner.
104
- // The goal is to select the entity in direct way.
105
- if (this._prefix) {
106
- this.searchFormControl
107
- .valueChanges
108
- .pipe(debounceTime(300), filter(value => typeof value === 'string'), filter(value => value.startsWith(this._prefix)), tap(() => this.isLoading = true), switchMap(value => this._dataSource.onFilter(value.replace(this._prefix, "").trim())))
109
- .subscribe(resultSet => {
110
- this.filteredEntities = resultSet.list;
111
- this.isLoading = false;
112
- });
113
- }
114
- // This is the search functionality when search by human.
115
- this.searchFormControl
116
- .valueChanges
117
- .pipe(debounceTime(300), tap(() => this.filteredEntities = []), filter(value => typeof value === 'string'), filter(value => value.toString().length >= 3), tap(() => this.isLoading = true), switchMap(value => this._dataSource.onFilter(value)))
118
- .subscribe(resultSet => {
119
- const resultList = new Array();
120
- resultSet.list.forEach(value1 => {
121
- if (!this.value.find(value2 => this._dataSource.getIdEntity(value2) === this._dataSource.getIdEntity(value1))) {
122
- resultList.push(value1);
123
- }
124
- });
125
- this.filteredEntities = resultList;
126
- this.isLoading = false;
127
- });
128
- }
129
- ngOnDestroy() {
130
- this.stateChanges.complete();
131
- this.fm.stopMonitoring(this.elRef.nativeElement);
132
- }
133
- ngDoCheck() {
134
- if (this.ngControl) {
135
- this.errorState = this.ngControl.invalid && this.ngControl.touched;
136
- this.stateChanges.next();
137
- }
138
- }
139
- clear() {
140
- this.filteredEntities = [];
141
- this.searchFormControl.reset(null);
142
- }
143
- focus() {
144
- this.elRef.nativeElement.querySelector('input').focus();
145
- }
146
- onEntitySelected(event) {
147
- let list = this.value;
148
- if (!list) {
149
- list = new Array();
150
- }
151
- list.push(event.option.value);
152
- this.value = list;
153
- this.filteredEntities = [];
154
- this.searchFormControl.setValue(null);
155
- this.valuesFormControl.updateValueAndValidity();
156
- }
157
- onEntityActivated(event) {
158
- this.activatedValue = event.option?.value;
159
- }
160
- onEntityClosed() {
161
- if (this.activatedValue) {
162
- this.value = this.activatedValue;
163
- this.activatedValue = null;
164
- }
165
- }
166
- reset() {
167
- this.value = new Array();
168
- }
169
- onFocusOut() {
170
- // if (this.filteredEntities.length === 1) {
171
- // this.activatedValue = this.filteredEntities[0];
172
- // this.value = this.filteredEntities[0];
173
- // }
174
- }
175
- onTouched() {
176
- this._onTouched();
177
- this.stateChanges.next();
178
- }
179
- registerOnChange(fn) {
180
- this._propagateChange = fn;
181
- }
182
- registerOnTouched(fn) {
183
- this.onTouched = fn;
184
- }
185
- writeValue(obj) {
186
- this.clear();
187
- this.value = obj;
188
- }
189
- setDisabledState(isDisabled) {
190
- this.disabled = isDisabled;
191
- }
192
- onContainerClick(event) {
193
- if (event.target.tagName.toLowerCase() != 'input') {
194
- this.focus();
195
- }
196
- }
197
- setDescribedByIds(ids) {
198
- this.describedBy = ids.join(' ');
199
- }
200
- validate(control) {
201
- const selection = control.value;
202
- if (typeof selection === 'string') {
203
- return { incorrect: true };
204
- }
205
- return null;
206
- }
207
- remove(value) {
208
- const list = this.value;
209
- const index = list.indexOf(value);
210
- if (index !== -1) {
211
- list.splice(index, 1);
212
- }
213
- this.valuesFormControl.updateValueAndValidity();
214
- }
215
- setValue(values) {
216
- if (values !== this._selectedEntities) {
217
- this._selectedEntities = values;
218
- this.valuesChange.emit(values);
219
- this._propagateChange(this._selectedEntities);
220
- this.stateChanges.next();
221
- }
222
- }
223
- }
224
- IaMultipleEntitySelectInput.nextId = 0;
225
- IaMultipleEntitySelectInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: IaMultipleEntitySelectInput, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
226
- IaMultipleEntitySelectInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: IaMultipleEntitySelectInput, selector: "ia-multiple-entity-select", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
227
- {
228
- provide: NG_VALUE_ACCESSOR,
229
- useExisting: forwardRef(() => IaMultipleEntitySelectInput),
230
- multi: true
231
- },
232
- {
233
- provide: MatFormFieldControl,
234
- useExisting: IaMultipleEntitySelectInput
235
- },
236
- {
237
- provide: NG_VALIDATORS,
238
- useExisting: forwardRef(() => IaMultipleEntitySelectInput),
239
- multi: true
240
- }
241
- ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<mat-chip-grid #list>\r\n <mat-chip-row *ngFor=\"let entity of valuesFormControl.value\"\r\n (removed)=\"remove(entity)\"\r\n [editable]=\"false\"\r\n [aria-description]=\"'press enter to edit ' + dataSource.onDisplayEntity(entity)\">\r\n {{dataSource.onDisplayEntity(entity)}}\r\n <button matChipRemove [attr.aria-label]=\"'remove ' + dataSource.onDisplayEntity(entity)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"list\"\r\n matChipInputAddOnBlur=\"true\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [placeholder]=\"placeholder\" matInput>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\r\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\r\n [displayWith]=\"dataSource.onDisplayEntity\">\r\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n </mat-option>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\r\n {{dataSource.onDisplayEntity(entity)}}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n</mat-chip-grid>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i7.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i7.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i7.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
242
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: IaMultipleEntitySelectInput, decorators: [{
243
- type: Component,
244
- args: [{ selector: 'ia-multiple-entity-select', host: {
245
- '[id]': 'id',
246
- '[attr.aria-describedby]': 'describedBy'
247
- }, providers: [
248
- {
249
- provide: NG_VALUE_ACCESSOR,
250
- useExisting: forwardRef(() => IaMultipleEntitySelectInput),
251
- multi: true
252
- },
253
- {
254
- provide: MatFormFieldControl,
255
- useExisting: IaMultipleEntitySelectInput
256
- },
257
- {
258
- provide: NG_VALIDATORS,
259
- useExisting: forwardRef(() => IaMultipleEntitySelectInput),
260
- multi: true
261
- }
262
- ], template: "<mat-chip-grid #list>\r\n <mat-chip-row *ngFor=\"let entity of valuesFormControl.value\"\r\n (removed)=\"remove(entity)\"\r\n [editable]=\"false\"\r\n [aria-description]=\"'press enter to edit ' + dataSource.onDisplayEntity(entity)\">\r\n {{dataSource.onDisplayEntity(entity)}}\r\n <button matChipRemove [attr.aria-label]=\"'remove ' + dataSource.onDisplayEntity(entity)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"list\"\r\n matChipInputAddOnBlur=\"true\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [placeholder]=\"placeholder\" matInput>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\r\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\r\n [displayWith]=\"dataSource.onDisplayEntity\">\r\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n </mat-option>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\r\n {{dataSource.onDisplayEntity(entity)}}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n</mat-chip-grid>\r\n" }]
263
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }]; }, propDecorators: { id: [{
264
- type: HostBinding
265
- }], inputField: [{
266
- type: ViewChild,
267
- args: ['input']
268
- }], describedBy: [{
269
- type: HostBinding,
270
- args: ['attr.aria-describedby']
271
- }], dataSource: [{
272
- type: Input
273
- }], disabled: [{
274
- type: Input
275
- }], placeholder: [{
276
- type: Input
277
- }], required: [{
278
- type: Input
279
- }], prefix: [{
280
- type: Input
281
- }], shouldLabelFloat: [{
282
- type: HostBinding,
283
- args: ['class.floating']
284
- }] } });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWEtbXVsdGlwbGUtZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL2lhLXNoYXJlZC11aS9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0L2lhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9pYS1zaGFyZWQtdWkvaWEtbXVsdGlwbGUtZW50aXR5LXNlbGVjdC1pbnB1dC9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBRVgsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBR0wsV0FBVyxFQUFFLGFBQWEsRUFDMUIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFHVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0IsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7O0FBMkJuRCxNQUFNLE9BQU8sMkJBQTJCO0lBbUJ0QyxZQUFtQixLQUFpQixF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Q0UsT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyw2QkFBNkI7eUJBQ3pDO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQzs0QkFDMUQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7bUpBYThCLEVBQUU7c0JBQWhDLFdBQVc7Z0JBR2dCLFVBQVU7c0JBQXJDLFNBQVM7dUJBQUMsT0FBTztnQkFDNEIsV0FBVztzQkFBeEQsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBd0J6QixVQUFVO3NCQURwQixLQUFLO2dCQVFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBY0ssV0FBVztzQkFEckIsS0FBSztnQkFhSyxRQUFRO3NCQURsQixLQUFLO2dCQWNLLE1BQU07c0JBRGhCLEtBQUs7Z0JBNEJLLGdCQUFnQjtzQkFEMUIsV0FBVzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtFbnRpdHlTZWxlY3REYXRhU291cmNlfSBmcm9tIFwiQG1lc2htYWtlcnMvc2hhcmVkLXNlcnZpY2VzXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLFxyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIE5nQ29udHJvbCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvclxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7TWF0SW5wdXR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xyXG5pbXBvcnQge0ZvY3VzTW9uaXRvcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XHJcbmltcG9ydCB7Y29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVBY3RpdmF0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZENvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XHJcbmltcG9ydCB7Q09NTUEsIEVOVEVSfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2tleWNvZGVzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0LmNvbXBvbmVudC5jc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICAnW2lkXSc6ICdpZCcsXHJcbiAgICAnW2F0dHIuYXJpYS1kZXNjcmliZWRieV0nOiAnZGVzY3JpYmVkQnknXHJcbiAgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElhTXVsdGlwbGVFbnRpdHlTZWxlY3RJbnB1dCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLFxyXG4gICAgICB1c2VFeGlzdGluZzogSWFNdWx0aXBsZUVudGl0eVNlbGVjdElucHV0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYU11bHRpcGxlRW50aXR5U2VsZWN0SW5wdXQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIElhTXVsdGlwbGVFbnRpdHlTZWxlY3RJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTWF0Rm9ybUZpZWxkQ29udHJvbDxBcnJheTxhbnk+PiwgVmFsaWRhdG9yIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkID0gMDtcclxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICBwdWJsaWMgZmlsdGVyZWRFbnRpdGllczogYW55W10gPSBbXTtcclxuICBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2w7XHJcbiAgcHVibGljIGVycm9yU3RhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIGZvY3VzZWQ6IGJvb2xlYW47XHJcbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgQEhvc3RCaW5kaW5nKCkgcHVibGljIHJlYWRvbmx5IGlkID0gYGlhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QtJHtJYU11bHRpcGxlRW50aXR5U2VsZWN0SW5wdXQubmV4dElkKyt9YDtcclxuICBwdWJsaWMgdmFsdWVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRFbnRpdGllczogQXJyYXk8YW55PjtcclxuICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRGaWVsZDogTWF0SW5wdXQ7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBwcml2YXRlIGRlc2NyaWJlZEJ5ID0gJyc7XHJcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRWYWx1ZTogYW55O1xyXG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIGZtOiBGb2N1c01vbml0b3IpIHtcclxuXHJcbiAgICB0aGlzLnZhbHVlc0Zvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgZm0ubW9uaXRvcihlbFJlZi5uYXRpdmVFbGVtZW50LCB0cnVlKS5zdWJzY3JpYmUob3JpZ2luID0+IHtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gISFvcmlnaW47XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZTogRW50aXR5U2VsZWN0RGF0YVNvdXJjZTxhbnk+O1xyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHZhbHVlOiBFbnRpdHlTZWxlY3REYXRhU291cmNlPGFueT4pIHtcclxuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQoZGlzKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShkaXMpO1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPyB0aGlzLnNlYXJjaEZvcm1Db250cm9sLmRpc2FibGUoKSA6IHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHBsaCkge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGg7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHJlcSkge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxKTtcclxuICAgIHRoaXMuaW5wdXRGaWVsZC5yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlZml4OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmVmaXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHByZWZpeCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ByZWZpeCkge1xyXG4gICAgICB0aGlzLl9wcmVmaXggPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQXJyYXk8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRFbnRpdGllcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IEFycmF5PGFueT4pIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fc2VsZWN0ZWRFbnRpdGllcykge1xyXG4gICAgICB0aGlzLnZhbHVlc0Zvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGVtcHR5KCkge1xyXG4gICAgbGV0IG4gPSB0aGlzLnZhbHVlc0Zvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgcmV0dXJuICEhIW47XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZsb2F0aW5nJylcclxuICBwdWJsaWMgZ2V0IHNob3VsZExhYmVsRmxvYXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCk7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBwcmVmaXggZGVmaW5lZCwgdXN1YWxseSB0aGlzIGlzIHVzZWQgZm9yIGEgY29kZSBzY2FubmVyLlxyXG4gICAgLy8gVGhlIGdvYWwgaXMgdG8gc2VsZWN0IHRoZSBlbnRpdHkgaW4gZGlyZWN0IHdheS5cclxuICAgIGlmICh0aGlzLl9wcmVmaXgpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxyXG4gICAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpLFxyXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLnN0YXJ0c1dpdGgodGhpcy5fcHJlZml4KSksXHJcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5pc0xvYWRpbmcgPSB0cnVlKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlLm9uRmlsdGVyKHZhbHVlLnJlcGxhY2UodGhpcy5fcHJlZml4LCBcIlwiKS50cmltKCkpKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdFNldCA9PiB7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEVudGl0aWVzID0gcmVzdWx0U2V0Lmxpc3Q7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgaXMgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdoZW4gc2VhcmNoIGJ5IGh1bWFuLlxyXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxyXG4gICAgICAudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSBbXSksXHJcbiAgICAgICAgZmlsdGVyKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpLFxyXG4gICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+PSAzKSxcclxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5pc0xvYWRpbmcgPSB0cnVlKSxcclxuICAgICAgICBzd2l0Y2hNYXAodmFsdWUgPT4gdGhpcy5fZGF0YVNvdXJjZS5vbkZpbHRlcih2YWx1ZSkpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShyZXN1bHRTZXQgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHRMaXN0ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICByZXN1bHRTZXQubGlzdC5mb3JFYWNoKHZhbHVlMSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudmFsdWUuZmluZCh2YWx1ZTIgPT5cclxuICAgICAgICAgICAgdGhpcy5fZGF0YVNvdXJjZS5nZXRJZEVudGl0eSh2YWx1ZTIpID09PSB0aGlzLl9kYXRhU291cmNlLmdldElkRW50aXR5KHZhbHVlMSkpKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICByZXN1bHRMaXN0LnB1c2godmFsdWUxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IHJlc3VsdExpc3Q7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZm0uc3RvcE1vbml0b3JpbmcodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmVycm9yU3RhdGUgPSB0aGlzLm5nQ29udHJvbC5pbnZhbGlkICYmIHRoaXMubmdDb250cm9sLnRvdWNoZWQ7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhcigpIHtcclxuICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IFtdO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5yZXNldChudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbnRpdHlTZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkge1xyXG5cclxuICAgIGxldCBsaXN0ID0gdGhpcy52YWx1ZTtcclxuICAgIGlmICghbGlzdCkge1xyXG4gICAgICBsaXN0ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgIH1cclxuICAgIGxpc3QucHVzaChldmVudC5vcHRpb24udmFsdWUpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGxpc3Q7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZEVudGl0aWVzID0gW107XHJcbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy52YWx1ZXNGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbnRpdHlBY3RpdmF0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZUFjdGl2YXRlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gZXZlbnQub3B0aW9uPy52YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkVudGl0eUNsb3NlZCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmF0ZWRWYWx1ZSkge1xyXG5cclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWN0aXZhdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVkVmFsdWUgPSBudWxsO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIHRoaXMudmFsdWUgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNPdXQoKSB7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMuZmlsdGVyZWRFbnRpdGllcy5sZW5ndGggPT09IDEpIHtcclxuICAgIC8vICAgdGhpcy5hY3RpdmF0ZWRWYWx1ZSA9IHRoaXMuZmlsdGVyZWRFbnRpdGllc1swXTtcclxuICAgIC8vICAgdGhpcy52YWx1ZSA9IHRoaXMuZmlsdGVyZWRFbnRpdGllc1swXTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7XHJcblxyXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIHRoaXMudmFsdWUgPSBvYmo7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0Jykge1xyXG4gICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb246IGFueSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHtpbmNvcnJlY3Q6IHRydWV9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IGFueSkge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMudmFsdWU7XHJcbiAgICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICAgIHRoaXMudmFsdWVzRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlID0gKF86IEFycmF5PGFueT4pID0+IHtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIF9vblRvdWNoZWQgPSAoKSA9PiB7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZXM6IEFycmF5PGFueT4pIHtcclxuICAgIGlmICh2YWx1ZXMgIT09IHRoaXMuX3NlbGVjdGVkRW50aXRpZXMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdGllcyA9IHZhbHVlcztcclxuICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh2YWx1ZXMpO1xyXG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UodGhpcy5fc2VsZWN0ZWRFbnRpdGllcyk7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG1hdC1jaGlwLWdyaWQgI2xpc3Q+XHJcbiAgPG1hdC1jaGlwLXJvdyAqbmdGb3I9XCJsZXQgZW50aXR5IG9mIHZhbHVlc0Zvcm1Db250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZShlbnRpdHkpXCJcclxuICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbYXJpYS1kZXNjcmlwdGlvbl09XCIncHJlc3MgZW50ZXIgdG8gZWRpdCAnICsgZGF0YVNvdXJjZS5vbkRpc3BsYXlFbnRpdHkoZW50aXR5KVwiPlxyXG4gICAge3tkYXRhU291cmNlLm9uRGlzcGxheUVudGl0eShlbnRpdHkpfX1cclxuICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGRhdGFTb3VyY2Uub25EaXNwbGF5RW50aXR5KGVudGl0eSlcIj5cclxuICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L21hdC1jaGlwLXJvdz5cclxuICA8aW5wdXQgI2lucHV0IChibHVyKT1cIm9uVG91Y2hlZCgpXCIgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiIFtmb3JtQ29udHJvbF09XCJzZWFyY2hGb3JtQ29udHJvbFwiXHJcbiAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwibGlzdFwiXHJcbiAgICAgICAgIG1hdENoaXBJbnB1dEFkZE9uQmx1cj1cInRydWVcIlxyXG4gICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcclxuICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgbWF0SW5wdXQ+XHJcbiAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAoY2xvc2VkKT1cIm9uRW50aXR5Q2xvc2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25BY3RpdmF0ZWQpPVwib25FbnRpdHlBY3RpdmF0ZWQoJGV2ZW50KVwiIChvcHRpb25TZWxlY3RlZCk9XCJvbkVudGl0eVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkYXRhU291cmNlLm9uRGlzcGxheUVudGl0eVwiPlxyXG4gICAgPG1hdC1vcHRpb24gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImlzLWxvYWRpbmdcIj5cclxuICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBmaWx0ZXJlZEVudGl0aWVzXCIgW3ZhbHVlXT1cImVudGl0eVwiPlxyXG4gICAgICAgIHt7ZGF0YVNvdXJjZS5vbkRpc3BsYXlFbnRpdHkoZW50aXR5KX19XHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuPC9tYXQtY2hpcC1ncmlkPlxyXG4iXX0=
1
+ import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from '@angular/core';
2
+ import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
+ import { of, Subject } from "rxjs";
4
+ import { coerceBooleanProperty } from "@angular/cdk/coercion";
5
+ import { debounceTime, filter, switchMap, tap } from "rxjs/operators";
6
+ import { MatFormFieldControl } from "@angular/material/form-field";
7
+ import { COMMA, ENTER } from "@angular/cdk/keycodes";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/cdk/a11y";
10
+ import * as i2 from "@angular/common";
11
+ import * as i3 from "@angular/material/autocomplete";
12
+ import * as i4 from "@angular/material/core";
13
+ import * as i5 from "@angular/material/input";
14
+ import * as i6 from "@angular/material/progress-spinner";
15
+ import * as i7 from "@angular/material/chips";
16
+ import * as i8 from "@angular/material/icon";
17
+ import * as i9 from "@angular/forms";
18
+ export class IaMultipleEntitySelectInput {
19
+ constructor(elRef, injector, fm) {
20
+ this.elRef = elRef;
21
+ this.injector = injector;
22
+ this.fm = fm;
23
+ this.filteredEntities = [];
24
+ this.stateChanges = new Subject();
25
+ this.id = `ia-multiple-entity-select-${IaMultipleEntitySelectInput.nextId++}`;
26
+ this.valuesChange = new EventEmitter();
27
+ this.describedBy = '';
28
+ this.separatorKeysCodes = [ENTER, COMMA];
29
+ this._disabled = false;
30
+ this._required = false;
31
+ this._propagateChange = (_) => {
32
+ };
33
+ this._onTouched = () => {
34
+ };
35
+ this.ngControl = null;
36
+ this.errorState = false;
37
+ this.inputField = null;
38
+ this._dataSource = null;
39
+ this._placeholder = "";
40
+ this._prefix = "";
41
+ this._selectedEntities = null;
42
+ this.valuesFormControl = new FormControl();
43
+ this.searchFormControl = new FormControl();
44
+ this.isLoading = false;
45
+ this._disabled = false;
46
+ this.focused = false;
47
+ fm.monitor(elRef.nativeElement, true).subscribe(origin => {
48
+ this.focused = !!origin;
49
+ this.stateChanges.next();
50
+ });
51
+ }
52
+ get dataSource() {
53
+ return this._dataSource;
54
+ }
55
+ set dataSource(value) {
56
+ this._dataSource = value;
57
+ }
58
+ get disabled() {
59
+ return this._disabled;
60
+ }
61
+ set disabled(dis) {
62
+ this._disabled = coerceBooleanProperty(dis);
63
+ this._disabled ? this.searchFormControl.disable() : this.searchFormControl.enable();
64
+ this.stateChanges.next();
65
+ }
66
+ get placeholder() {
67
+ return this._placeholder;
68
+ }
69
+ set placeholder(plh) {
70
+ this._placeholder = plh;
71
+ this.stateChanges.next();
72
+ }
73
+ get required() {
74
+ return this._required;
75
+ }
76
+ set required(req) {
77
+ this._required = coerceBooleanProperty(req);
78
+ if (this.inputField) {
79
+ this.inputField.required = this._required;
80
+ }
81
+ this.stateChanges.next();
82
+ }
83
+ get prefix() {
84
+ return this._prefix;
85
+ }
86
+ set prefix(value) {
87
+ if (value !== this._prefix) {
88
+ this._prefix = value;
89
+ }
90
+ }
91
+ get value() {
92
+ return this._selectedEntities;
93
+ }
94
+ set value(value) {
95
+ if (value !== this._selectedEntities) {
96
+ this.valuesFormControl.setValue(value);
97
+ this.setValue(value);
98
+ }
99
+ }
100
+ get empty() {
101
+ let n = this.valuesFormControl.value;
102
+ return !n;
103
+ }
104
+ get shouldLabelFloat() {
105
+ return this.focused || !this.empty;
106
+ }
107
+ ngOnInit() {
108
+ this.ngControl = this.injector.get(NgControl, null);
109
+ if (this.ngControl != null) {
110
+ this.ngControl.valueAccessor = this;
111
+ }
112
+ // If prefix defined, usually this is used for a code scanner.
113
+ // The goal is to select the entity in direct way.
114
+ if (this._prefix) {
115
+ this.searchFormControl
116
+ .valueChanges
117
+ .pipe(debounceTime(300), filter(value => typeof value === 'string'), filter(value => value.startsWith(this._prefix)), tap(() => this.isLoading = true), switchMap(value => this._dataSource?.onFilter(value.replace(this._prefix, "").trim()) ?? of(null)))
118
+ .subscribe(resultSet => {
119
+ if (resultSet && resultSet.list) {
120
+ this.filteredEntities = resultSet.list;
121
+ }
122
+ this.isLoading = false;
123
+ });
124
+ }
125
+ // This is the search functionality when search by human.
126
+ this.searchFormControl
127
+ .valueChanges
128
+ .pipe(debounceTime(300), tap(() => this.filteredEntities = []), filter(value => typeof value === 'string'), filter(value => value.toString().length >= 3), tap(() => this.isLoading = true), switchMap(value => this._dataSource?.onFilter(value) ?? of(null)))
129
+ .subscribe(resultSet => {
130
+ const resultList = new Array();
131
+ if (resultSet && resultSet.list) {
132
+ resultSet.list.forEach(value1 => {
133
+ if (!this.value?.find(value2 => this._dataSource?.getIdEntity(value2) === this._dataSource?.getIdEntity(value1))) {
134
+ resultList.push(value1);
135
+ }
136
+ });
137
+ }
138
+ this.filteredEntities = resultList;
139
+ this.isLoading = false;
140
+ });
141
+ }
142
+ ngOnDestroy() {
143
+ this.stateChanges.complete();
144
+ this.fm.stopMonitoring(this.elRef.nativeElement);
145
+ }
146
+ ngDoCheck() {
147
+ if (this.ngControl) {
148
+ this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;
149
+ this.stateChanges.next();
150
+ }
151
+ }
152
+ clear() {
153
+ this.filteredEntities = [];
154
+ this.searchFormControl.reset(null);
155
+ }
156
+ focus() {
157
+ this.elRef.nativeElement.querySelector('input').focus();
158
+ }
159
+ onEntitySelected(event) {
160
+ let list = this.value;
161
+ if (!list) {
162
+ list = new Array();
163
+ }
164
+ list.push(event.option.value);
165
+ this.value = list;
166
+ this.filteredEntities = [];
167
+ this.searchFormControl.setValue(null);
168
+ this.valuesFormControl.updateValueAndValidity();
169
+ }
170
+ onEntityActivated(event) {
171
+ this.activatedValue = event.option?.value;
172
+ }
173
+ onEntityClosed() {
174
+ if (this.activatedValue) {
175
+ this.value = this.activatedValue;
176
+ this.activatedValue = null;
177
+ }
178
+ }
179
+ reset() {
180
+ this.value = new Array();
181
+ }
182
+ onFocusOut() {
183
+ // if (this.filteredEntities.length === 1) {
184
+ // this.activatedValue = this.filteredEntities[0];
185
+ // this.value = this.filteredEntities[0];
186
+ // }
187
+ }
188
+ onTouched() {
189
+ this._onTouched();
190
+ this.stateChanges.next();
191
+ }
192
+ registerOnChange(fn) {
193
+ this._propagateChange = fn;
194
+ }
195
+ registerOnTouched(fn) {
196
+ this.onTouched = fn;
197
+ }
198
+ writeValue(obj) {
199
+ this.clear();
200
+ this.value = obj;
201
+ }
202
+ setDisabledState(isDisabled) {
203
+ this.disabled = isDisabled;
204
+ }
205
+ onContainerClick(event) {
206
+ if (event.target.tagName.toLowerCase() != 'input') {
207
+ this.focus();
208
+ }
209
+ }
210
+ setDescribedByIds(ids) {
211
+ this.describedBy = ids.join(' ');
212
+ }
213
+ validate(control) {
214
+ const selection = control.value;
215
+ if (typeof selection === 'string') {
216
+ return { incorrect: true };
217
+ }
218
+ return null;
219
+ }
220
+ remove(value) {
221
+ const list = this.value;
222
+ if (list) {
223
+ const index = list.indexOf(value);
224
+ if (index !== -1) {
225
+ list.splice(index, 1);
226
+ }
227
+ this.valuesFormControl.updateValueAndValidity();
228
+ }
229
+ }
230
+ setValue(values) {
231
+ if (values !== this._selectedEntities) {
232
+ this._selectedEntities = values;
233
+ this.valuesChange.emit(values ?? []);
234
+ this._propagateChange(this._selectedEntities ?? []);
235
+ this.stateChanges.next();
236
+ }
237
+ }
238
+ }
239
+ IaMultipleEntitySelectInput.nextId = 0;
240
+ IaMultipleEntitySelectInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: IaMultipleEntitySelectInput, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
241
+ IaMultipleEntitySelectInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: IaMultipleEntitySelectInput, selector: "ia-multiple-entity-select", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
242
+ {
243
+ provide: NG_VALUE_ACCESSOR,
244
+ useExisting: forwardRef(() => IaMultipleEntitySelectInput),
245
+ multi: true
246
+ },
247
+ {
248
+ provide: MatFormFieldControl,
249
+ useExisting: IaMultipleEntitySelectInput
250
+ },
251
+ {
252
+ provide: NG_VALIDATORS,
253
+ useExisting: forwardRef(() => IaMultipleEntitySelectInput),
254
+ multi: true
255
+ }
256
+ ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<mat-chip-grid #list>\n <mat-chip-row *ngFor=\"let entity of valuesFormControl.value\"\n (removed)=\"remove(entity)\"\n [editable]=\"false\"\n [aria-description]=\"'press enter to edit ' + dataSource?.onDisplayEntity(entity) ?? null\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + dataSource?.onDisplayEntity(entity) ?? null\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"list\"\n matChipInputAddOnBlur=\"true\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [placeholder]=\"placeholder\" matInput>\n <mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n</mat-chip-grid>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i7.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i7.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i7.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: IaMultipleEntitySelectInput, decorators: [{
258
+ type: Component,
259
+ args: [{ selector: 'ia-multiple-entity-select', host: {
260
+ '[id]': 'id',
261
+ '[attr.aria-describedby]': 'describedBy'
262
+ }, providers: [
263
+ {
264
+ provide: NG_VALUE_ACCESSOR,
265
+ useExisting: forwardRef(() => IaMultipleEntitySelectInput),
266
+ multi: true
267
+ },
268
+ {
269
+ provide: MatFormFieldControl,
270
+ useExisting: IaMultipleEntitySelectInput
271
+ },
272
+ {
273
+ provide: NG_VALIDATORS,
274
+ useExisting: forwardRef(() => IaMultipleEntitySelectInput),
275
+ multi: true
276
+ }
277
+ ], template: "<mat-chip-grid #list>\n <mat-chip-row *ngFor=\"let entity of valuesFormControl.value\"\n (removed)=\"remove(entity)\"\n [editable]=\"false\"\n [aria-description]=\"'press enter to edit ' + dataSource?.onDisplayEntity(entity) ?? null\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + dataSource?.onDisplayEntity(entity) ?? null\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"list\"\n matChipInputAddOnBlur=\"true\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [placeholder]=\"placeholder\" matInput>\n <mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n</mat-chip-grid>\n" }]
278
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }]; }, propDecorators: { id: [{
279
+ type: HostBinding
280
+ }], inputField: [{
281
+ type: ViewChild,
282
+ args: ['input']
283
+ }], describedBy: [{
284
+ type: HostBinding,
285
+ args: ['attr.aria-describedby']
286
+ }], dataSource: [{
287
+ type: Input
288
+ }], disabled: [{
289
+ type: Input
290
+ }], placeholder: [{
291
+ type: Input
292
+ }], required: [{
293
+ type: Input
294
+ }], prefix: [{
295
+ type: Input
296
+ }], shouldLabelFloat: [{
297
+ type: HostBinding,
298
+ args: ['class.floating']
299
+ }] } });
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWEtbXVsdGlwbGUtZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL2lhLXNoYXJlZC11aS9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0L2lhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9pYS1zaGFyZWQtdWkvaWEtbXVsdGlwbGUtZW50aXR5LXNlbGVjdC1pbnB1dC9pYS1tdWx0aXBsZS1lbnRpdHktc2VsZWN0LWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBRVgsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBR0wsV0FBVyxFQUFFLGFBQWEsRUFDMUIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFHVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxFQUFFLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2pDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7OztBQTJCbkQsTUFBTSxPQUFPLDJCQUEyQjtJQW1CdEMsWUFB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QUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtFbnRpdHlTZWxlY3REYXRhU291cmNlfSBmcm9tIFwiQG1lc2htYWtlcnMvc2hhcmVkLXNlcnZpY2VzXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCwgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtvZiwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7TWF0SW5wdXR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xuaW1wb3J0IHtGb2N1c01vbml0b3J9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcbmltcG9ydCB7Q09NTUEsIEVOVEVSfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2tleWNvZGVzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaWEtbXVsdGlwbGUtZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QtaW5wdXQuY29tcG9uZW50LmNzcyddLFxuICBob3N0OiB7XG4gICAgJ1tpZF0nOiAnaWQnLFxuICAgICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdkZXNjcmliZWRCeSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYU11bHRpcGxlRW50aXR5U2VsZWN0SW5wdXQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsXG4gICAgICB1c2VFeGlzdGluZzogSWFNdWx0aXBsZUVudGl0eVNlbGVjdElucHV0XG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWFNdWx0aXBsZUVudGl0eVNlbGVjdElucHV0KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElhTXVsdGlwbGVFbnRpdHlTZWxlY3RJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTWF0Rm9ybUZpZWxkQ29udHJvbDxBcnJheTxhbnk+PiwgVmFsaWRhdG9yIHtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xuICBwdWJsaWMgZmlsdGVyZWRFbnRpdGllczogYW55W10gPSBbXTtcbiAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbDtcbiAgcHVibGljIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RCaW5kaW5nKCkgcHVibGljIHJlYWRvbmx5IGlkID0gYGlhLW11bHRpcGxlLWVudGl0eS1zZWxlY3QtJHtJYU11bHRpcGxlRW50aXR5U2VsZWN0SW5wdXQubmV4dElkKyt9YDtcbiAgcHVibGljIHZhbHVlc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xuICBwcml2YXRlIF9zZWxlY3RlZEVudGl0aWVzOiBBcnJheTxhbnk+IHwgbnVsbDtcbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBwcml2YXRlIHJlYWRvbmx5IGlucHV0RmllbGQ6IE1hdElucHV0IHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBwcml2YXRlIGRlc2NyaWJlZEJ5ID0gJyc7XG4gIHByaXZhdGUgYWN0aXZhdGVkVmFsdWU6IGFueTtcbiAgcmVhZG9ubHkgc2VwYXJhdG9yS2V5c0NvZGVzID0gW0VOVEVSLCBDT01NQV0gYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBmbTogRm9jdXNNb25pdG9yKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaW5wdXRGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBcIlwiO1xuICAgIHRoaXMuX3ByZWZpeCA9IFwiXCI7XG4gICAgdGhpcy5fc2VsZWN0ZWRFbnRpdGllcyA9IG51bGw7XG5cbiAgICB0aGlzLnZhbHVlc0Zvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICBmbS5tb25pdG9yKGVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRydWUpLnN1YnNjcmliZShvcmlnaW4gPT4ge1xuICAgICAgdGhpcy5mb2N1c2VkID0gISFvcmlnaW47XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRhU291cmNlOiBFbnRpdHlTZWxlY3REYXRhU291cmNlPGFueT4gfCBudWxsO1xuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBFbnRpdHlTZWxlY3REYXRhU291cmNlPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogRW50aXR5U2VsZWN0RGF0YVNvdXJjZTxhbnk+IHwgbnVsbCkge1xuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGRpc2FibGVkKGRpcykge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGRpcyk7XG4gICAgdGhpcy5fZGlzYWJsZWQgPyB0aGlzLnNlYXJjaEZvcm1Db250cm9sLmRpc2FibGUoKSA6IHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIocGxoKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGg7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQocmVxKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxKTtcbiAgICBpZiAodGhpcy5pbnB1dEZpZWxkKSB7XG4gICAgICB0aGlzLmlucHV0RmllbGQucmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlZml4OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4O1xuICB9XG5cbiAgcHVibGljIHNldCBwcmVmaXgodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fcHJlZml4KSB7XG4gICAgICB0aGlzLl9wcmVmaXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IEFycmF5PGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRFbnRpdGllcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IEFycmF5PGFueT4gfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9zZWxlY3RlZEVudGl0aWVzKSB7XG4gICAgICB0aGlzLnZhbHVlc0Zvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW1wdHkoKSB7XG4gICAgbGV0IG4gPSB0aGlzLnZhbHVlc0Zvcm1Db250cm9sLnZhbHVlO1xuICAgIHJldHVybiAhbjtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmxvYXRpbmcnKVxuICBwdWJsaWMgZ2V0IHNob3VsZExhYmVsRmxvYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgcHJlZml4IGRlZmluZWQsIHVzdWFsbHkgdGhpcyBpcyB1c2VkIGZvciBhIGNvZGUgc2Nhbm5lci5cbiAgICAvLyBUaGUgZ29hbCBpcyB0byBzZWxlY3QgdGhlIGVudGl0eSBpbiBkaXJlY3Qgd2F5LlxuICAgIGlmICh0aGlzLl9wcmVmaXgpIHtcbiAgICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2xcbiAgICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyksXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLnN0YXJ0c1dpdGgodGhpcy5fcHJlZml4KSksXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuaXNMb2FkaW5nID0gdHJ1ZSksXG4gICAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHRoaXMuX2RhdGFTb3VyY2U/Lm9uRmlsdGVyKHZhbHVlLnJlcGxhY2UodGhpcy5fcHJlZml4LCBcIlwiKS50cmltKCkpID8/IG9mKG51bGwpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0U2V0ID0+IHtcblxuICAgICAgICAgIGlmIChyZXN1bHRTZXQgJiYgcmVzdWx0U2V0Lmxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IHJlc3VsdFNldC5saXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSB3aGVuIHNlYXJjaCBieSBodW1hbi5cbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sXG4gICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSBbXSksXG4gICAgICAgIGZpbHRlcih2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSxcbiAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDMpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5pc0xvYWRpbmcgPSB0cnVlKSxcbiAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHRoaXMuX2RhdGFTb3VyY2U/Lm9uRmlsdGVyKHZhbHVlKSA/PyBvZihudWxsKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0U2V0ID0+IHtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdExpc3QgPSBuZXcgQXJyYXk8YW55PigpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdFNldCAmJiByZXN1bHRTZXQubGlzdCkge1xuXG4gICAgICAgICAgICByZXN1bHRTZXQubGlzdC5mb3JFYWNoKHZhbHVlMSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy52YWx1ZT8uZmluZCh2YWx1ZTIgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlPy5nZXRJZEVudGl0eSh2YWx1ZTIpID09PSB0aGlzLl9kYXRhU291cmNlPy5nZXRJZEVudGl0eSh2YWx1ZTEpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdExpc3QucHVzaCh2YWx1ZTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IHJlc3VsdExpc3Q7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mbS5zdG9wTW9uaXRvcmluZyh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5lcnJvclN0YXRlID0gKHRoaXMubmdDb250cm9sLmludmFsaWQgJiYgdGhpcy5uZ0NvbnRyb2wudG91Y2hlZCkgPz8gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IFtdO1xuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wucmVzZXQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eVNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICBsZXQgbGlzdCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICB9XG4gICAgbGlzdC5wdXNoKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gICAgdGhpcy52YWx1ZSA9IGxpc3Q7XG5cbiAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSBbXTtcbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMudmFsdWVzRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIG9uRW50aXR5QWN0aXZhdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVBY3RpdmF0ZWRFdmVudCkge1xuICAgIHRoaXMuYWN0aXZhdGVkVmFsdWUgPSBldmVudC5vcHRpb24/LnZhbHVlO1xuICB9XG5cbiAgcHVibGljIG9uRW50aXR5Q2xvc2VkKCkge1xuXG4gICAgaWYgKHRoaXMuYWN0aXZhdGVkVmFsdWUpIHtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWN0aXZhdGVkVmFsdWU7XG4gICAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gbnVsbDtcblxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5PGFueT4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzT3V0KCkge1xuXG4gICAgLy8gaWYgKHRoaXMuZmlsdGVyZWRFbnRpdGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyAgIHRoaXMuYWN0aXZhdGVkVmFsdWUgPSB0aGlzLmZpbHRlcmVkRW50aXRpZXNbMF07XG4gICAgLy8gICB0aGlzLnZhbHVlID0gdGhpcy5maWx0ZXJlZEVudGl0aWVzWzBdO1xuICAgIC8vIH1cbiAgfVxuXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0Jykge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XG4gIH1cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uOiBhbnkgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHtpbmNvcnJlY3Q6IHRydWV9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbW92ZSh2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGxpc3QpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZXNGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlID0gKF86IEFycmF5PGFueT4pID0+IHtcbiAgfTtcblxuICBwcml2YXRlIF9vblRvdWNoZWQgPSAoKSA9PiB7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZXM6IEFycmF5PGFueT4gfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlcyAhPT0gdGhpcy5fc2VsZWN0ZWRFbnRpdGllcykge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdGllcyA9IHZhbHVlcztcbiAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQodmFsdWVzID8/IFtdKTtcbiAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSh0aGlzLl9zZWxlY3RlZEVudGl0aWVzID8/IFtdKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxtYXQtY2hpcC1ncmlkICNsaXN0PlxuICA8bWF0LWNoaXAtcm93ICpuZ0Zvcj1cImxldCBlbnRpdHkgb2YgdmFsdWVzRm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZShlbnRpdHkpXCJcbiAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFthcmlhLWRlc2NyaXB0aW9uXT1cIidwcmVzcyBlbnRlciB0byBlZGl0ICcgKyBkYXRhU291cmNlPy5vbkRpc3BsYXlFbnRpdHkoZW50aXR5KSA/PyBudWxsXCI+XG4gICAge3tkYXRhU291cmNlPy5vbkRpc3BsYXlFbnRpdHkoZW50aXR5KSA/PyBudWxsfX1cbiAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmUgW2F0dHIuYXJpYS1sYWJlbF09XCIncmVtb3ZlICcgKyBkYXRhU291cmNlPy5vbkRpc3BsYXlFbnRpdHkoZW50aXR5KSA/PyBudWxsXCI+XG4gICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtY2hpcC1yb3c+XG4gIDxpbnB1dCAjaW5wdXQgKGJsdXIpPVwib25Ub3VjaGVkKClcIiAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaEZvcm1Db250cm9sXCJcbiAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImxpc3RcIlxuICAgICAgICAgbWF0Q2hpcElucHV0QWRkT25CbHVyPVwidHJ1ZVwiXG4gICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIG1hdElucHV0PlxuICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChjbG9zZWQpPVwib25FbnRpdHlDbG9zZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25BY3RpdmF0ZWQpPVwib25FbnRpdHlBY3RpdmF0ZWQoJGV2ZW50KVwiIChvcHRpb25TZWxlY3RlZCk9XCJvbkVudGl0eVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGF0YVNvdXJjZT8ub25EaXNwbGF5RW50aXR5ID8/IG51bGxcIj5cbiAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwiaXMtbG9hZGluZ1wiPlxuICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBmaWx0ZXJlZEVudGl0aWVzXCIgW3ZhbHVlXT1cImVudGl0eVwiPlxuICAgICAgICB7e2RhdGFTb3VyY2U/Lm9uRGlzcGxheUVudGl0eShlbnRpdHkpID8/IG51bGx9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L21hdC1hdXRvY29tcGxldGU+XG48L21hdC1jaGlwLWdyaWQ+XG4iXX0=