@mediusinc/mng-commons 5.4.0-rc.3 → 5.4.0-rc.5
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.
- package/core/data-list/data-list-params-helpers.d.ts +1 -1
- package/core/data-list/data-list.model.d.ts +1 -0
- package/core/helpers/type-helpers.d.ts +12 -0
- package/esm2022/core/data-list/data-list-params-helpers.mjs +29 -5
- package/esm2022/core/data-list/data-list.model.mjs +1 -1
- package/esm2022/core/helpers/type-helpers.mjs +1 -1
- package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +21 -0
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +1 -1
- package/esm2022/filter/descriptors/filter.descriptor.mjs +40 -1
- package/esm2022/filter/index.mjs +3 -1
- package/esm2022/filter/models/filter-generic-property.model.mjs +2 -0
- package/esm2022/form/components/dropdown/dropdown.component.mjs +159 -10
- package/esm2022/table/api/descriptors/table.descriptor.mjs +51 -2
- package/esm2022/table/components/column-filter/column-filter.component.mjs +2 -2
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +4 -1
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +42 -9
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +95 -11
- package/esm2022/table/components/table/table.component.mjs +57 -13
- package/esm2022/table/helpers/filters.mjs +32 -2
- package/esm2022/table/services/table-feature-config.token.mjs +1 -1
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +2 -2
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +11 -10
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +16 -2
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +2 -1
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +23 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +2 -2
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +3 -3
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +3 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +2 -1
- package/fesm2022/mediusinc-mng-commons-core.mjs +28 -4
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs +61 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +156 -7
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +50 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +230 -45
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +26 -10
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +29 -8
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/filter/descriptors/filter-generic.descriptor.d.ts +11 -0
- package/filter/descriptors/filter.descriptor.d.ts +21 -2
- package/filter/index.d.ts +2 -0
- package/filter/models/filter-generic-property.model.d.ts +7 -0
- package/form/components/dropdown/dropdown.component.d.ts +27 -1
- package/i18n/en.json +4 -0
- package/i18n/sl.json +4 -0
- package/package.json +1 -1
- package/table/api/descriptors/table.descriptor.d.ts +33 -1
- package/table/components/filter/filter-form/filter-form.component.d.ts +11 -2
- package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +21 -1
- package/table/components/table/table.component.d.ts +20 -5
- package/table/helpers/filters.d.ts +9 -1
- package/table/services/table-feature-config.token.d.ts +1 -0
- package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +6 -4
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +10 -1
- package/version-info.json +5 -5
|
@@ -4,8 +4,8 @@ import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
|
4
4
|
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
5
5
|
import { Dropdown, DropdownModule } from 'primeng/dropdown';
|
|
6
6
|
import { MultiSelect, MultiSelectModule } from 'primeng/multiselect';
|
|
7
|
-
import { combineLatest, map, of, switchMap, tap } from 'rxjs';
|
|
8
|
-
import { CommonsInternalError, LoggerService, toObservable as commonsToObservable, fromSubscribeError, getErrorLogLevel } from '@mediusinc/mng-commons/core';
|
|
7
|
+
import { ReplaySubject, combineLatest, map, of, switchMap, take, tap } from 'rxjs';
|
|
8
|
+
import { CommonsInternalError, FilterMatchMode, LoggerService, toObservable as commonsToObservable, fromSubscribeError, getErrorLogLevel } from '@mediusinc/mng-commons/core';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "primeng/dropdown";
|
|
11
11
|
import * as i2 from "primeng/multiselect";
|
|
@@ -41,7 +41,10 @@ export class DropdownComponent {
|
|
|
41
41
|
this.changeValueOnBlur = input(false, { transform: booleanAttribute });
|
|
42
42
|
this.loadingInput = input(false, { alias: 'loading', transform: booleanAttribute });
|
|
43
43
|
this.disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });
|
|
44
|
+
this.allowInput = input(false, { transform: booleanAttribute });
|
|
44
45
|
this.appendTo = input('body');
|
|
46
|
+
this.inlineSearch = input(false, { transform: booleanAttribute });
|
|
47
|
+
this.searchTrim = input(undefined);
|
|
45
48
|
this.valueChange = output();
|
|
46
49
|
this.blur = output();
|
|
47
50
|
this.primeDropdown = viewChild(Dropdown);
|
|
@@ -59,6 +62,8 @@ export class DropdownComponent {
|
|
|
59
62
|
this.items = signal([]);
|
|
60
63
|
this.firstTimeSettingItems = true;
|
|
61
64
|
this.isDropdownPanelShown = false;
|
|
65
|
+
// used with custom input functionality
|
|
66
|
+
this.valueSuggestionProviderSubscription = null;
|
|
62
67
|
this.optionsLabelProperty = computed(() => {
|
|
63
68
|
if (this.optionsLabelTranslate()) {
|
|
64
69
|
// setup translation properties
|
|
@@ -105,18 +110,31 @@ export class DropdownComponent {
|
|
|
105
110
|
}), switchMap(items => this.transformItems(items)), takeUntilDestroyed())
|
|
106
111
|
.subscribe({
|
|
107
112
|
next: res => {
|
|
108
|
-
this.
|
|
113
|
+
this.setItems(res);
|
|
114
|
+
if (this.inlineSearch()) {
|
|
115
|
+
if (!this.valueSuggestionResultCacheSubject) {
|
|
116
|
+
this.valueSuggestionResultCacheSubject = new ReplaySubject(1);
|
|
117
|
+
}
|
|
118
|
+
this.valueSuggestionResultCacheSubject?.next(res);
|
|
119
|
+
}
|
|
109
120
|
this._loading.set(false);
|
|
110
|
-
this.selectFirstItem();
|
|
121
|
+
this.selectFirstItem(); // only selects first item if selectFirstItemInput is set accordingly
|
|
111
122
|
this.adjustValueOnItemsValuePropertyTypeMismatch();
|
|
112
123
|
},
|
|
113
124
|
error: err => {
|
|
114
|
-
this.
|
|
125
|
+
this.setItems([]);
|
|
115
126
|
this._loading.set(false);
|
|
116
127
|
const error = fromSubscribeError(err, 'DropdownComponentError');
|
|
117
128
|
this.logger.log(error, getErrorLogLevel(error));
|
|
118
129
|
}
|
|
119
130
|
});
|
|
131
|
+
effect(() => {
|
|
132
|
+
if (this.allowInput()) {
|
|
133
|
+
if (this.optionsLabelProperty() && !this.optionsValueProperty()) {
|
|
134
|
+
throw new CommonsInternalError(`allowInput is not supported when optionsLabelProperty is defined but optionsValueProperty is missing. Set optionsValueProperty to enable allowInput.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
120
138
|
}
|
|
121
139
|
registerOnChange(fn) {
|
|
122
140
|
this.onChangeFn = fn;
|
|
@@ -139,7 +157,9 @@ export class DropdownComponent {
|
|
|
139
157
|
this.adjustValueOnItemsValuePropertyTypeMismatch(true);
|
|
140
158
|
}
|
|
141
159
|
onDropdownBlur(event) {
|
|
142
|
-
if
|
|
160
|
+
// if allowCustomInput is enabled, the input element might still be in focus with the
|
|
161
|
+
// dropdown panel hidden - that's why the !this.allowCustomInput() check is needed
|
|
162
|
+
if (this.isDropdownPanelShown && !this.allowInput()) {
|
|
143
163
|
// ignore this blur event
|
|
144
164
|
return;
|
|
145
165
|
}
|
|
@@ -154,6 +174,103 @@ export class DropdownComponent {
|
|
|
154
174
|
if (!this.changeValueOnBlur()) {
|
|
155
175
|
this.propagateValueChange(event.value);
|
|
156
176
|
}
|
|
177
|
+
if (this.allowInput()) {
|
|
178
|
+
const optionsLabelProperty = this.optionsLabelProperty();
|
|
179
|
+
let query = undefined;
|
|
180
|
+
if (typeof event?.value === 'string' && event?.value.trim() === '') {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
else if (typeof event.value === 'string') {
|
|
184
|
+
query = this.trimValue(event.value);
|
|
185
|
+
}
|
|
186
|
+
this.valueSuggestionProviderSubscription?.unsubscribe();
|
|
187
|
+
if (this.dataProvider()) {
|
|
188
|
+
if (!this.inlineSearch()) {
|
|
189
|
+
const params = {
|
|
190
|
+
limit: 10
|
|
191
|
+
};
|
|
192
|
+
if (optionsLabelProperty) {
|
|
193
|
+
params.sort = [{ property: optionsLabelProperty }];
|
|
194
|
+
}
|
|
195
|
+
if (query && query.length > 0 && optionsLabelProperty) {
|
|
196
|
+
params.filters = {
|
|
197
|
+
[optionsLabelProperty]: {
|
|
198
|
+
value: query,
|
|
199
|
+
matchMode: FilterMatchMode.StartsWith
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
this.valueSuggestionProviderSubscription = this.getLookup(params, query)
|
|
204
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
205
|
+
.subscribe({
|
|
206
|
+
next: items => {
|
|
207
|
+
this.setItems(items);
|
|
208
|
+
},
|
|
209
|
+
error: err => {
|
|
210
|
+
this.setItems([]);
|
|
211
|
+
const error = fromSubscribeError(err, 'DropdownComponentError', {
|
|
212
|
+
search: query,
|
|
213
|
+
params: params
|
|
214
|
+
});
|
|
215
|
+
this.logger.log(error, getErrorLogLevel(error));
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
else if (this.valueSuggestionResultCacheSubject) {
|
|
220
|
+
this.valueSuggestionProviderSubscription = this.valueSuggestionResultCacheSubject.pipe(take(1)).subscribe(result => {
|
|
221
|
+
this.setItems(result, query);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else if (this.options().length > 0) {
|
|
226
|
+
this.setItems(this.options(), query);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Sets the items in the dropdown. If a query is provided, the items will be filtered by the query (using a 'starts with' filter).
|
|
232
|
+
*
|
|
233
|
+
* @param items The items to set.
|
|
234
|
+
* @param [query] The query to filter the items by.
|
|
235
|
+
*/
|
|
236
|
+
setItems(items, query) {
|
|
237
|
+
if (this.allowInput()) {
|
|
238
|
+
if (items.length > 0) {
|
|
239
|
+
// items can either be objects (with optionsValueProperty specifying a string property) or strings
|
|
240
|
+
if (typeof items[0] === 'object') {
|
|
241
|
+
if (!this.optionsValueProperty()) {
|
|
242
|
+
throw new CommonsInternalError(`allowInput is not supported when optionValueProperty is not set and the dropdown items are of type object. Set optionsValueProperty to enable allowInput.`);
|
|
243
|
+
}
|
|
244
|
+
if (typeof items[0]?.[this.optionsValueProperty()] !== 'string') {
|
|
245
|
+
throw new CommonsInternalError(`allowInput is only supported when the value property (specified with optionsValueProperty) is of type string.`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (!(typeof items[0] === 'string' && !this.optionsLabelProperty() && !this.optionsValueProperty())) {
|
|
249
|
+
throw new CommonsInternalError(`'allowInput' is only supported for items of type string or object. For object types, ensure that the 'optionsValueProperty' is specified and represents a property of type string.`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (query) {
|
|
254
|
+
const queryLowerCase = query?.toLowerCase() ?? '';
|
|
255
|
+
const filteredItems = items.filter(i => {
|
|
256
|
+
let itemLabel = i;
|
|
257
|
+
const optionsLabelProperty = this.optionsLabelProperty();
|
|
258
|
+
if (optionsLabelProperty && typeof i === 'object') {
|
|
259
|
+
itemLabel = i[optionsLabelProperty];
|
|
260
|
+
}
|
|
261
|
+
if (itemLabel == null) {
|
|
262
|
+
return queryLowerCase == null || !queryLowerCase.length;
|
|
263
|
+
}
|
|
264
|
+
if (typeof itemLabel !== 'string') {
|
|
265
|
+
itemLabel = itemLabel.toString();
|
|
266
|
+
}
|
|
267
|
+
return itemLabel.toLowerCase().startsWith(queryLowerCase);
|
|
268
|
+
});
|
|
269
|
+
this.items.set([...filteredItems]);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
this.items.set([...items]);
|
|
273
|
+
}
|
|
157
274
|
}
|
|
158
275
|
onDropdownPanelShow() {
|
|
159
276
|
this.isDropdownPanelShown = true;
|
|
@@ -227,7 +344,7 @@ export class DropdownComponent {
|
|
|
227
344
|
}
|
|
228
345
|
}
|
|
229
346
|
else if (typeof this.items()[0][optionsValueProp] !== typeof this._value) {
|
|
230
|
-
// types
|
|
347
|
+
// types don't match, search and compare by string
|
|
231
348
|
const selectedOption = this.items().find(i => i[optionsValueProp] != null && i[optionsValueProp].toString() === this._value.toString());
|
|
232
349
|
if (selectedOption) {
|
|
233
350
|
this.ngModelValue.set(selectedOption[optionsValueProp]);
|
|
@@ -245,11 +362,43 @@ export class DropdownComponent {
|
|
|
245
362
|
this.onChangeFn(value);
|
|
246
363
|
this.valueChange.emit(value);
|
|
247
364
|
}
|
|
365
|
+
/**
|
|
366
|
+
* Gets the lookup from the data provider.
|
|
367
|
+
*
|
|
368
|
+
* @param params The parameters to pass to the lookup.
|
|
369
|
+
* @param [query] The search query to filter the items by.
|
|
370
|
+
*/
|
|
371
|
+
getLookup(params, query) {
|
|
372
|
+
const dataProvider = this.dataProvider();
|
|
373
|
+
if (dataProvider) {
|
|
374
|
+
return commonsToObservable(dataProvider.lookup(params, this.dataProviderService, query)).pipe(switchMap(res => {
|
|
375
|
+
return of(res ?? []);
|
|
376
|
+
}));
|
|
377
|
+
}
|
|
378
|
+
return of([]);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Trims the leading and/or trailing whitespace from the given value based on the search trimming mode.
|
|
382
|
+
*
|
|
383
|
+
* @param value - The value to be trimmed.
|
|
384
|
+
*/
|
|
385
|
+
trimValue(value) {
|
|
386
|
+
switch (this.searchTrim()) {
|
|
387
|
+
case 'start':
|
|
388
|
+
return value?.trimStart();
|
|
389
|
+
case 'end':
|
|
390
|
+
return value?.trimEnd();
|
|
391
|
+
case 'both':
|
|
392
|
+
return value?.trim();
|
|
393
|
+
default:
|
|
394
|
+
return value;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
248
397
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
249
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: DropdownComponent, isStandalone: true, selector: "mng-dropdown", inputs: { dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionsTrackProperty: { classPropertyName: "optionsTrackProperty", publicName: "optionsTrackProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsLabelPropertyInit: { classPropertyName: "optionsLabelPropertyInit", publicName: "optionsLabelProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsLabelTranslate: { classPropertyName: "optionsLabelTranslate", publicName: "optionsLabelTranslate", isSignal: true, isRequired: false, transformFunction: null }, optionsValuePropertyInput: { classPropertyName: "optionsValuePropertyInput", publicName: "optionsValueProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsDisabledProperty: { classPropertyName: "optionsDisabledProperty", publicName: "optionsDisabledProperty", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, selectFirstItemInput: { classPropertyName: "selectFirstItemInput", publicName: "selectFirstItem", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, dropdownClassName: { classPropertyName: "dropdownClassName", publicName: "dropdownClassName", isSignal: true, isRequired: false, transformFunction: null }, changeValueOnBlur: { classPropertyName: "changeValueOnBlur", publicName: "changeValueOnBlur", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur" }, providers: [DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true, isSignal: true }, { propertyName: "primeMultiselect", first: true, predicate: MultiSelect, descendants: true, isSignal: true }], ngImport: i0, template: "@if (!multiselect()) {\n <p-dropdown\n [ngModel]=\"ngModelValue
|
|
398
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: DropdownComponent, isStandalone: true, selector: "mng-dropdown", inputs: { dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionsTrackProperty: { classPropertyName: "optionsTrackProperty", publicName: "optionsTrackProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsLabelPropertyInit: { classPropertyName: "optionsLabelPropertyInit", publicName: "optionsLabelProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsLabelTranslate: { classPropertyName: "optionsLabelTranslate", publicName: "optionsLabelTranslate", isSignal: true, isRequired: false, transformFunction: null }, optionsValuePropertyInput: { classPropertyName: "optionsValuePropertyInput", publicName: "optionsValueProperty", isSignal: true, isRequired: false, transformFunction: null }, optionsDisabledProperty: { classPropertyName: "optionsDisabledProperty", publicName: "optionsDisabledProperty", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, selectFirstItemInput: { classPropertyName: "selectFirstItemInput", publicName: "selectFirstItem", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, dropdownClassName: { classPropertyName: "dropdownClassName", publicName: "dropdownClassName", isSignal: true, isRequired: false, transformFunction: null }, changeValueOnBlur: { classPropertyName: "changeValueOnBlur", publicName: "changeValueOnBlur", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowInput: { classPropertyName: "allowInput", publicName: "allowInput", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, inlineSearch: { classPropertyName: "inlineSearch", publicName: "inlineSearch", isSignal: true, isRequired: false, transformFunction: null }, searchTrim: { classPropertyName: "searchTrim", publicName: "searchTrim", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur" }, providers: [DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true, isSignal: true }, { propertyName: "primeMultiselect", first: true, predicate: MultiSelect, descendants: true, isSignal: true }], ngImport: i0, template: "@if (!multiselect()) {\n <p-dropdown\n [(ngModel)]=\"ngModelValue\"\n [placeholder]=\"placeholder()\"\n [dataKey]=\"optionsTrackProperty()\"\n [optionLabel]=\"optionsLabelProperty()\"\n [optionValue]=\"optionsValueProperty()\"\n [optionDisabled]=\"optionsDisabledProperty()\"\n [options]=\"items()\"\n [showClear]=\"showClear()\"\n [editable]=\"allowInput()\"\n [styleClass]=\"className()\"\n [panelStyleClass]=\"dropdownClassName()\"\n [disabled]=\"disabled()\"\n (onBlur)=\"onDropdownBlur($event)\"\n (onChange)=\"onDropdownChange($event)\"\n (onShow)=\"onDropdownPanelShow()\"\n (onHide)=\"onDropdownPanelHide()\"\n [dropdownIcon]=\"loading() ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n [appendTo]=\"appendTo()\">\n </p-dropdown>\n} @else {\n <p-multiSelect\n [ngModel]=\"ngModelValue()\"\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [placeholder]=\"placeholder()\"\n [dataKey]=\"optionsTrackProperty()\"\n [optionLabel]=\"optionsLabelProperty()\"\n [optionValue]=\"optionsValueProperty()\"\n [optionDisabled]=\"optionsDisabledProperty()\"\n [options]=\"items()\"\n [styleClass]=\"className()\"\n [panelStyleClass]=\"dropdownClassName()\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n [disabled]=\"disabled()\"\n (onChange)=\"onMultiselectChange($event)\"\n (onPanelHide)=\"onMultiselectPanelHide()\"\n (onBlur)=\"onMultiselectBlur($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n}\n", dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i1.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i2.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
250
399
|
}
|
|
251
400
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DropdownComponent, decorators: [{
|
|
252
401
|
type: Component,
|
|
253
|
-
args: [{ standalone: true, selector: 'mng-dropdown', providers: [DROPDOWN_VALUE_ACCESSOR], imports: [DropdownModule, MultiSelectModule, TranslateModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!multiselect()) {\n <p-dropdown\n [ngModel]=\"ngModelValue
|
|
402
|
+
args: [{ standalone: true, selector: 'mng-dropdown', providers: [DROPDOWN_VALUE_ACCESSOR], imports: [DropdownModule, MultiSelectModule, TranslateModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!multiselect()) {\n <p-dropdown\n [(ngModel)]=\"ngModelValue\"\n [placeholder]=\"placeholder()\"\n [dataKey]=\"optionsTrackProperty()\"\n [optionLabel]=\"optionsLabelProperty()\"\n [optionValue]=\"optionsValueProperty()\"\n [optionDisabled]=\"optionsDisabledProperty()\"\n [options]=\"items()\"\n [showClear]=\"showClear()\"\n [editable]=\"allowInput()\"\n [styleClass]=\"className()\"\n [panelStyleClass]=\"dropdownClassName()\"\n [disabled]=\"disabled()\"\n (onBlur)=\"onDropdownBlur($event)\"\n (onChange)=\"onDropdownChange($event)\"\n (onShow)=\"onDropdownPanelShow()\"\n (onHide)=\"onDropdownPanelHide()\"\n [dropdownIcon]=\"loading() ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n [appendTo]=\"appendTo()\">\n </p-dropdown>\n} @else {\n <p-multiSelect\n [ngModel]=\"ngModelValue()\"\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [placeholder]=\"placeholder()\"\n [dataKey]=\"optionsTrackProperty()\"\n [optionLabel]=\"optionsLabelProperty()\"\n [optionValue]=\"optionsValueProperty()\"\n [optionDisabled]=\"optionsDisabledProperty()\"\n [options]=\"items()\"\n [styleClass]=\"className()\"\n [panelStyleClass]=\"dropdownClassName()\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n [disabled]=\"disabled()\"\n (onChange)=\"onMultiselectChange($event)\"\n (onPanelHide)=\"onMultiselectPanelHide()\"\n (onBlur)=\"onMultiselectBlur($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n}\n" }]
|
|
254
403
|
}], ctorParameters: () => [] });
|
|
255
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZm9ybS9zcmMvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9mb3JtL3NyYy9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFFVixRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEYsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQXVCLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxXQUFXLEVBQWdELGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakgsT0FBTyxFQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFDLG9CQUFvQixFQUF1QixhQUFhLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7Ozs7OztBQUVoTCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBcUI7SUFD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RyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELE9BQU87Z0JBQ1gsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNsQixxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBVTtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBMVFRLGlCQUFpQjtrR0FBakIsaUJBQWlCLHdtRkFKZixDQUFDLHVCQUF1QixDQUFDLHlFQWdDSCxRQUFRLG1HQUNMLFdBQVcsZ0VDckVuRCxvcURBMENBLDJDRExjLGNBQWMsMnFDQUFFLGlCQUFpQixvMUNBQUUsZUFBZSwyRkFBRSxXQUFXOzsyRkFHaEUsaUJBQWlCO2tCQVI3QixTQUFTO2lDQUNNLElBQUksWUFDTixjQUFjLGFBRWIsQ0FBQyx1QkFBdUIsQ0FBQyxXQUMzQixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLG1CQUN6RCx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFeGlzdGluZ1Byb3ZpZGVyLFxuICAgIEluamVjdG9yLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgZWZmZWN0LFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RHJvcGRvd24sIERyb3Bkb3duQ2hhbmdlRXZlbnQsIERyb3Bkb3duTW9kdWxlfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7TXVsdGlTZWxlY3QsIE11bHRpU2VsZWN0Qmx1ckV2ZW50LCBNdWx0aVNlbGVjdENoYW5nZUV2ZW50LCBNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge2NvbWJpbmVMYXRlc3QsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtDb21tb25zSW50ZXJuYWxFcnJvciwgSUxvb2t1cERhdGFQcm92aWRlciwgTG9nZ2VyU2VydmljZSwgdG9PYnNlcnZhYmxlIGFzIGNvbW1vbnNUb09ic2VydmFibGUsIGZyb21TdWJzY3JpYmVFcnJvciwgZ2V0RXJyb3JMb2dMZXZlbH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcblxuZXhwb3J0IGNvbnN0IERST1BET1dOX1ZBTFVFX0FDQ0VTU09SOiBFeGlzdGluZ1Byb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERyb3Bkb3duQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1kcm9wZG93bicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtEUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgaW1wb3J0czogW0Ryb3Bkb3duTW9kdWxlLCBNdWx0aVNlbGVjdE1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTG9nZ2VyU2VydmljZSkuY3JlYXRlKCdEcm9wZG93bkNvbXBvbmVudCcpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgcHVibGljIGRhdGFQcm92aWRlciA9IGlucHV0PElMb29rdXBEYXRhUHJvdmlkZXI8YW55LCBhbnksIGFueSwgYW55Pj4oKTtcbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0PEFycmF5PGFueT4+KFtdKTtcbiAgICBwdWJsaWMgb3B0aW9uc1RyYWNrUHJvcGVydHkgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIG9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7YWxpYXM6ICdvcHRpb25zTGFiZWxQcm9wZXJ0eSd9KTtcbiAgICBwdWJsaWMgb3B0aW9uc0xhYmVsVHJhbnNsYXRlID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgb3B0aW9uc1ZhbHVlUHJvcGVydHlJbnB1dCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7YWxpYXM6ICdvcHRpb25zVmFsdWVQcm9wZXJ0eSd9KTtcbiAgICBwdWJsaWMgb3B0aW9uc0Rpc2FibGVkUHJvcGVydHkgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIG11bHRpc2VsZWN0ID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIHNlbGVjdEZpcnN0SXRlbUlucHV0ID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAnc2VsZWN0Rmlyc3RJdGVtJ30pO1xuICAgIHB1YmxpYyBjbGFzc05hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGRyb3Bkb3duQ2xhc3NOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBjaGFuZ2VWYWx1ZU9uQmx1ciA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGxvYWRpbmdJbnB1dCA9IGlucHV0KGZhbHNlLCB7YWxpYXM6ICdsb2FkaW5nJywgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGRpc2FibGVkSW5wdXQgPSBpbnB1dChmYWxzZSwge2FsaWFzOiAnZGlzYWJsZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgYXBwZW5kVG8gPSBpbnB1dDxzdHJpbmcgfCBudWxsPignYm9keScpO1xuXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgYmx1ciA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIHB1YmxpYyBwcmltZURyb3Bkb3duID0gdmlld0NoaWxkKERyb3Bkb3duKTtcbiAgICBwdWJsaWMgcHJpbWVNdWx0aXNlbGVjdCA9IHZpZXdDaGlsZChNdWx0aVNlbGVjdCk7XG5cbiAgICBwcml2YXRlIF92YWx1ZT86IGFueSB8IG51bGw7XG4gICAgcHVibGljIG5nTW9kZWxWYWx1ZSA9IHNpZ25hbDx1bmRlZmluZWQgfCBudWxsIHwgYW55Pih1bmRlZmluZWQpO1xuXG4gICAgcHJpdmF0ZSBfbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5sb2FkaW5nSW5wdXQoKSB8fCB0aGlzLl9sb2FkaW5nKCkpO1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlzYWJsZWRJbnB1dCgpIHx8IHRoaXMuX2Rpc2FibGVkKCkpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25DaGFuZ2VGbjogYW55ID0gKCkgPT4ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25Ub3VjaGVkRm46IGFueSA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBpdGVtcyA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gICAgcHJpdmF0ZSBmaXJzdFRpbWVTZXR0aW5nSXRlbXMgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBpc0Ryb3Bkb3duUGFuZWxTaG93biA9IGZhbHNlO1xuXG4gICAgcHVibGljIG9wdGlvbnNMYWJlbFByb3BlcnR5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zTGFiZWxUcmFuc2xhdGUoKSkge1xuICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNsYXRpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKX1faTE4bmA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpICYmICF0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5wdXQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndGl0bGVfaTE4bic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgSW52YWxpZCB1c2Ugd2l0aCB2YWx1ZSAoJHt0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5wdXQoKX0pIGFuZCBsYWJlbCAoJHt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpfSkgcHJvcGVydHkgc2V0dXAuYCwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRHJvcGRvd25Db21wb25lbnRFcnJvcidcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpO1xuICAgIH0pO1xuICAgIHB1YmxpYyBvcHRpb25zVmFsdWVQcm9wZXJ0eSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc0xhYmVsVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgICAgIC8vIHNldHVwIHRyYW5zbGF0aW9uIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSAmJiAhdGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eUlucHV0KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZhbHVlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEludmFsaWQgdXNlIHdpdGggdmFsdWUgKCR7dGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eUlucHV0KCl9KSBhbmQgbGFiZWwgKCR7dGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKX0pIHByb3BlcnR5IHNldHVwLmAsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0Ryb3Bkb3duQ29tcG9uZW50RXJyb3InXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eUlucHV0KCk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubmdNb2RlbFZhbHVlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLmRhdGFQcm92aWRlciksIHRvT2JzZXJ2YWJsZSh0aGlzLm9wdGlvbnMpXSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLl9sb2FkaW5nLnNldCh0cnVlKSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChbZGF0YVByb3ZpZGVyLCBvcHRpb25zXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSBkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUgPyB0aGlzLmluamVjdG9yLmdldDxhbnk+KGRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbnNUb09ic2VydmFibGUoZGF0YVByb3ZpZGVyLmxvb2t1cCh7bGltaXQ6IDUwfSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Yob3B0aW9ucyA/PyBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoaXRlbXMgPT4gdGhpcy50cmFuc2Zvcm1JdGVtcyhpdGVtcykpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnNldChyZXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJdGVtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0VmFsdWVPbkl0ZW1zVmFsdWVQcm9wZXJ0eVR5cGVNaXNtYXRjaCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGZyb21TdWJzY3JpYmVFcnJvcihlcnIsICdEcm9wZG93bkNvbXBvbmVudEVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhlcnJvciwgZ2V0RXJyb3JMb2dMZXZlbChlcnJvcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCkpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYW5ndWxhciBpbiBzb21lIGNhc2VzIHdyaXRlcyBudWxsIHZhbHVlXG4gICAgICAgIC8vIGJlZm9yZSB2YWx1ZSBhY2Nlc3NvciBpcyBpbml0aWFsaXplZFxuICAgICAgICAvLyBpZiBmb3JtIGNvbnRyb2wgdmFsdWUgaXMgb2YgcHJpbWl0aXZlIHR5cGUgKGV4OiBlbnVtcykgdGhlbiB3cml0ZSB2YWx1ZSBpcyBub3QgY2FsbGVkICh3ZSB0aGluaylcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgdGhpcy5fdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlIGltbWVkaWF0ZWx5IC0gaXQgaXMgaW1wb3J0YW50IHNvIHRoYXQgZmlyc3Qgc2VsZWN0IGlzIG5vdCB0cmlnZ2VyZWQhXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuYWRqdXN0VmFsdWVPbkl0ZW1zVmFsdWVQcm9wZXJ0eVR5cGVNaXNtYXRjaCh0cnVlKTtcbiAgICB9XG5cbiAgICBvbkRyb3Bkb3duQmx1cihldmVudDogRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blBhbmVsU2hvd24pIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGJsdXIgZXZlbnRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmltZURyb3Bkb3duID0gdGhpcy5wcmltZURyb3Bkb3duKCk7XG4gICAgICAgIGlmICh0aGlzLmNoYW5nZVZhbHVlT25CbHVyKCkgJiYgcHJpbWVEcm9wZG93bikge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZShwcmltZURyb3Bkb3duLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICAgIHRoaXMuYmx1ci5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkRyb3Bkb3duQ2hhbmdlKGV2ZW50OiBEcm9wZG93bkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFuZ2VWYWx1ZU9uQmx1cigpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJvcGRvd25QYW5lbFNob3coKSB7XG4gICAgICAgIHRoaXMuaXNEcm9wZG93blBhbmVsU2hvd24gPSB0cnVlO1xuICAgIH1cblxuICAgIG9uRHJvcGRvd25QYW5lbEhpZGUoKSB7XG4gICAgICAgIHRoaXMuaXNEcm9wZG93blBhbmVsU2hvd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvbk11bHRpc2VsZWN0Q2hhbmdlKGV2ZW50OiBNdWx0aVNlbGVjdENoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFuZ2VWYWx1ZU9uQmx1cigpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTXVsdGlzZWxlY3RCbHVyKGV2ZW50OiBNdWx0aVNlbGVjdEJsdXJFdmVudCkge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICAgIHRoaXMuYmx1ci5lbWl0KGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgIH1cblxuICAgIG9uTXVsdGlzZWxlY3RQYW5lbEhpZGUoKSB7XG4gICAgICAgIGNvbnN0IHByaW1lTXVsdGlzZWxlY3QgPSB0aGlzLnByaW1lTXVsdGlzZWxlY3QoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIoKSAmJiBwcmltZU11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHByaW1lTXVsdGlzZWxlY3QudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RGaXJzdEl0ZW0oKSB7XG4gICAgICAgIGlmICh0aGlzLmZpcnN0VGltZVNldHRpbmdJdGVtcyAmJiB0aGlzLml0ZW1zKCkubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdEZpcnN0SXRlbUlucHV0KCkgJiYgIXRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zVmFsdWVQcm9wZXJ0eSA9IHRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHkoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1ZhbHVlUHJvcGVydHkgPyB0aGlzLml0ZW1zKClbMF1bb3B0aW9uc1ZhbHVlUHJvcGVydHldIDogdGhpcy5pdGVtcygpWzBdO1xuICAgICAgICAgICAgdGhpcy5uZ01vZGVsVmFsdWUuc2V0KHZhbHVlKTsgLy8gc2V0IHRvIHdyaXRlIGZvciBpbnB1dFxuICAgICAgICAgICAgdGhpcy5maXJzdFRpbWVTZXR0aW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1JdGVtcyhpdGVtczogYW55W10pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc0xhYmVsVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5czogc3RyaW5nW10gPSBpdGVtcy5tYXAoXG4gICAgICAgICAgICAgICAgaXRlbSA9PiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCkgPyAoaXRlbVt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpIGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nKSA6IGl0ZW0pIGFzIHN0cmluZ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuc3RyZWFtKHRyYW5zbGF0aW9uS2V5cykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodHJhbnNsYXRpb25zID0+XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXRlbVt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpIGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0cmFuc2xhdGlvbnNbbGFiZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW0sIFt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5KCkhXTogdHJhbnNsYXRpb259O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW19O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tpdGVtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eSgpIV06IHRyYW5zbGF0aW9uID8/IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5KCkhXTogaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZihpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkanVzdFZhbHVlT25JdGVtc1ZhbHVlUHJvcGVydHlUeXBlTWlzbWF0Y2goc2V0TmdNb2RlbFZhbHVlID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1ZhbHVlUHJvcCA9IHRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHkoKTtcbiAgICAgICAgaWYgKG9wdGlvbnNWYWx1ZVByb3AgJiYgdGhpcy5fdmFsdWUgIT0gbnVsbCAmJiB0aGlzLml0ZW1zKCkubGVuZ3RoID4gMCAmJiB0aGlzLml0ZW1zKClbMF1bb3B0aW9uc1ZhbHVlUHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHRoaXMuaXRlbXMoKVswXVtvcHRpb25zVmFsdWVQcm9wXSAhPT0gdHlwZW9mIHRoaXMuX3ZhbHVlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlcyA9IHRoaXMuX3ZhbHVlLm1hcCh2ID0+IHYudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMuaXRlbXMoKS5maWx0ZXIoaSA9PiBpW29wdGlvbnNWYWx1ZVByb3BdICE9IG51bGwgJiYgc3RyaW5nVmFsdWVzLmluY2x1ZGVzKGlbb3B0aW9uc1ZhbHVlUHJvcF0udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbFZhbHVlLnNldChzZWxlY3RlZE9wdGlvbnMubWFwKGkgPT4gaVtvcHRpb25zVmFsdWVQcm9wXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5pdGVtcygpWzBdW29wdGlvbnNWYWx1ZVByb3BdICE9PSB0eXBlb2YgdGhpcy5fdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyB0eXBlcyBkb250IG1hdGNoLCBzZWFyY2ggYW5kIGNvbXBhcmUgYnkgc3RyaW5nXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLml0ZW1zKCkuZmluZChpID0+IGlbb3B0aW9uc1ZhbHVlUHJvcF0gIT0gbnVsbCAmJiBpW29wdGlvbnNWYWx1ZVByb3BdLnRvU3RyaW5nKCkgPT09IHRoaXMuX3ZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxWYWx1ZS5zZXQoc2VsZWN0ZWRPcHRpb25bb3B0aW9uc1ZhbHVlUHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldE5nTW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgLy8gZm9yY2Ugd3JpdGUgdG8gbmdNb2RlbFZhbHVlIGFueXdheVxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsVmFsdWUuc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJvcGFnYXRlVmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cbn1cbiIsIkBpZiAoIW11bHRpc2VsZWN0KCkpIHtcbiAgICA8cC1kcm9wZG93blxuICAgICAgICBbbmdNb2RlbF09XCJuZ01vZGVsVmFsdWUoKVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpXCJcbiAgICAgICAgW2RhdGFLZXldPVwib3B0aW9uc1RyYWNrUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25MYWJlbF09XCJvcHRpb25zTGFiZWxQcm9wZXJ0eSgpXCJcbiAgICAgICAgW29wdGlvblZhbHVlXT1cIm9wdGlvbnNWYWx1ZVByb3BlcnR5KClcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwib3B0aW9uc0Rpc2FibGVkUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25zXT1cIml0ZW1zKClcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInNob3dDbGVhcigpXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lKClcIlxuICAgICAgICBbcGFuZWxTdHlsZUNsYXNzXT1cImRyb3Bkb3duQ2xhc3NOYW1lKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIChvbkJsdXIpPVwib25Ecm9wZG93bkJsdXIoJGV2ZW50KVwiXG4gICAgICAgIChvbkNoYW5nZSk9XCJvbkRyb3Bkb3duQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAob25TaG93KT1cIm9uRHJvcGRvd25QYW5lbFNob3coKVwiXG4gICAgICAgIChvbkhpZGUpPVwib25Ecm9wZG93blBhbmVsSGlkZSgpXCJcbiAgICAgICAgW2Ryb3Bkb3duSWNvbl09XCJsb2FkaW5nKCkgPyAncGkgcGktc3Bpbm5lciBwaS1zcGluJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcbiAgICAgICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvKClcIj5cbiAgICA8L3AtZHJvcGRvd24+XG59IEBlbHNlIHtcbiAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICBbbmdNb2RlbF09XCJuZ01vZGVsVmFsdWUoKVwiXG4gICAgICAgIFttYXhTZWxlY3RlZExhYmVsc109XCIxXCJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNMYWJlbF09XCInbW5nRHJvcGRvd24ubXVsdGlzZWxlY3RPdmVyTWF4RGlzcGxheUxpbWl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpXCJcbiAgICAgICAgW2RhdGFLZXldPVwib3B0aW9uc1RyYWNrUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25MYWJlbF09XCJvcHRpb25zTGFiZWxQcm9wZXJ0eSgpXCJcbiAgICAgICAgW29wdGlvblZhbHVlXT1cIm9wdGlvbnNWYWx1ZVByb3BlcnR5KClcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwib3B0aW9uc0Rpc2FibGVkUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25zXT1cIml0ZW1zKClcIlxuICAgICAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWUoKVwiXG4gICAgICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZHJvcGRvd25DbGFzc05hbWUoKVwiXG4gICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAob25DaGFuZ2UpPVwib25NdWx0aXNlbGVjdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uUGFuZWxIaWRlKT1cIm9uTXVsdGlzZWxlY3RQYW5lbEhpZGUoKVwiXG4gICAgICAgIChvbkJsdXIpPVwib25NdWx0aXNlbGVjdEJsdXIoJGV2ZW50KVwiXG4gICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgIDwvcC1tdWx0aVNlbGVjdD5cbn1cbiJdfQ==
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZm9ybS9zcmMvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9mb3JtL3NyYy9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFFVixRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEYsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQXVCLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxXQUFXLEVBQWdELGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakgsT0FBTyxFQUFhLGFBQWEsRUFBZ0IsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFM0csT0FBTyxFQUNILG9CQUFvQixFQUVwQixlQUFlLEVBRWYsYUFBYSxFQUNiLFlBQVksSUFBSSxtQkFBbUIsRUFDbkMsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNuQixNQUFNLDZCQUE2QixDQUFDOzs7Ozs7QUFH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QUFDO1lBQ2YsT0FBTyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pGLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDWixPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVMsQ0FBQyxLQUF5QjtRQUN2QyxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssT0FBTztnQkFDUixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUM5QixLQUFLLEtBQUs7Z0JBQ04sT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNO2dCQUNQLE9BQU8sS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3pCO2dCQUNJLE9BQU8sS0FBSyxDQUFDO1FBQ3JCLENBQUM7SUFDTCxDQUFDOzhHQWhiUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixtZ0dBSmYsQ0FBQyx1QkFBdUIsQ0FBQyx5RUFvQ0gsUUFBUSxtR0FDTCxXQUFXLGdFQ25GbkQseXNEQTJDQSwyQ0RJYyxjQUFjLDJxQ0FBRSxpQkFBaUIsbzFDQUFFLGVBQWUsMkZBQUUsV0FBVzs7MkZBR2hFLGlCQUFpQjtrQkFSN0IsU0FBUztpQ0FDTSxJQUFJLFlBQ04sY0FBYyxhQUViLENBQUMsdUJBQXVCLENBQUMsV0FDM0IsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQyxtQkFDekQsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRXhpc3RpbmdQcm92aWRlcixcbiAgICBJbmplY3RvcixcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIGNvbXB1dGVkLFxuICAgIGVmZmVjdCxcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0Ryb3Bkb3duLCBEcm9wZG93bkNoYW5nZUV2ZW50LCBEcm9wZG93bk1vZHVsZX0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQge011bHRpU2VsZWN0LCBNdWx0aVNlbGVjdEJsdXJFdmVudCwgTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCwgTXVsdGlTZWxlY3RNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFrZSwgdGFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICBDb21tb25zSW50ZXJuYWxFcnJvcixcbiAgICBEYXRhTGlzdFBhcmFtcyxcbiAgICBGaWx0ZXJNYXRjaE1vZGUsXG4gICAgSUxvb2t1cERhdGFQcm92aWRlcixcbiAgICBMb2dnZXJTZXJ2aWNlLFxuICAgIHRvT2JzZXJ2YWJsZSBhcyBjb21tb25zVG9PYnNlcnZhYmxlLFxuICAgIGZyb21TdWJzY3JpYmVFcnJvcixcbiAgICBnZXRFcnJvckxvZ0xldmVsXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0lucHV0VHJpbVR5cGV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuXG5leHBvcnQgY29uc3QgRFJPUERPV05fVkFMVUVfQUNDRVNTT1I6IEV4aXN0aW5nUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHJvcGRvd25Db21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0RST1BET1dOX1ZBTFVFX0FDQ0VTU09SXSxcbiAgICBpbXBvcnRzOiBbRHJvcGRvd25Nb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGluamVjdChMb2dnZXJTZXJ2aWNlKS5jcmVhdGUoJ0Ryb3Bkb3duQ29tcG9uZW50Jyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVyID0gaW5wdXQ8SUxvb2t1cERhdGFQcm92aWRlcjxhbnksIGFueSwgYW55LCBhbnk+PigpO1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQ8QXJyYXk8YW55Pj4oW10pO1xuICAgIHB1YmxpYyBvcHRpb25zVHJhY2tQcm9wZXJ0eSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgb3B0aW9uc0xhYmVsUHJvcGVydHlJbml0ID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHthbGlhczogJ29wdGlvbnNMYWJlbFByb3BlcnR5J30pO1xuICAgIHB1YmxpYyBvcHRpb25zTGFiZWxUcmFuc2xhdGUgPSBpbnB1dChmYWxzZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyBvcHRpb25zVmFsdWVQcm9wZXJ0eUlucHV0ID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHthbGlhczogJ29wdGlvbnNWYWx1ZVByb3BlcnR5J30pO1xuICAgIHB1YmxpYyBvcHRpb25zRGlzYWJsZWRQcm9wZXJ0eSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgbXVsdGlzZWxlY3QgPSBpbnB1dChmYWxzZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgc2VsZWN0Rmlyc3RJdGVtSW5wdXQgPSBpbnB1dChmYWxzZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdzZWxlY3RGaXJzdEl0ZW0nfSk7XG4gICAgcHVibGljIGNsYXNzTmFtZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGNoYW5nZVZhbHVlT25CbHVyID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgbG9hZGluZ0lucHV0ID0gaW5wdXQoZmFsc2UsIHthbGlhczogJ2xvYWRpbmcnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgZGlzYWJsZWRJbnB1dCA9IGlucHV0KGZhbHNlLCB7YWxpYXM6ICdkaXNhYmxlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyBhbGxvd0lucHV0ID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgYXBwZW5kVG8gPSBpbnB1dDxzdHJpbmcgfCBudWxsPignYm9keScpO1xuXG4gICAgcHVibGljIGlubGluZVNlYXJjaCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIHNlYXJjaFRyaW0gPSBpbnB1dDxJbnB1dFRyaW1UeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgYmx1ciA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIHB1YmxpYyBwcmltZURyb3Bkb3duID0gdmlld0NoaWxkKERyb3Bkb3duKTtcbiAgICBwdWJsaWMgcHJpbWVNdWx0aXNlbGVjdCA9IHZpZXdDaGlsZChNdWx0aVNlbGVjdCk7XG5cbiAgICBwcml2YXRlIF92YWx1ZT86IGFueSB8IG51bGw7XG4gICAgcHVibGljIG5nTW9kZWxWYWx1ZSA9IHNpZ25hbDx1bmRlZmluZWQgfCBudWxsIHwgYW55Pih1bmRlZmluZWQpO1xuXG4gICAgcHJpdmF0ZSBfbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5sb2FkaW5nSW5wdXQoKSB8fCB0aGlzLl9sb2FkaW5nKCkpO1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlzYWJsZWRJbnB1dCgpIHx8IHRoaXMuX2Rpc2FibGVkKCkpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25DaGFuZ2VGbjogYW55ID0gKCkgPT4ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25Ub3VjaGVkRm46IGFueSA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBpdGVtcyA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gICAgcHJpdmF0ZSBmaXJzdFRpbWVTZXR0aW5nSXRlbXMgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBpc0Ryb3Bkb3duUGFuZWxTaG93biA9IGZhbHNlO1xuXG4gICAgLy8gdXNlZCB3aXRoIGN1c3RvbSBpbnB1dCBmdW5jdGlvbmFsaXR5XG4gICAgcHJpdmF0ZSB2YWx1ZVN1Z2dlc3Rpb25Qcm92aWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSB2YWx1ZVN1Z2dlc3Rpb25SZXN1bHRDYWNoZVN1YmplY3Q/OiBSZXBsYXlTdWJqZWN0PGFueT47XG5cbiAgICBwdWJsaWMgb3B0aW9uc0xhYmVsUHJvcGVydHkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNMYWJlbFRyYW5zbGF0ZSgpKSB7XG4gICAgICAgICAgICAvLyBzZXR1cCB0cmFuc2xhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpfV9pMThuYDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCkgJiYgIXRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHlJbnB1dCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0aXRsZV9pMThuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBJbnZhbGlkIHVzZSB3aXRoIHZhbHVlICgke3RoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHlJbnB1dCgpfSkgYW5kIGxhYmVsICgke3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCl9KSBwcm9wZXJ0eSBzZXR1cC5gLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEcm9wZG93bkNvbXBvbmVudEVycm9yJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCk7XG4gICAgfSk7XG4gICAgcHVibGljIG9wdGlvbnNWYWx1ZVByb3BlcnR5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zTGFiZWxUcmFuc2xhdGUoKSkge1xuICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNsYXRpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpICYmICF0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5wdXQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndmFsdWUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgSW52YWxpZCB1c2Ugd2l0aCB2YWx1ZSAoJHt0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5wdXQoKX0pIGFuZCBsYWJlbCAoJHt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpfSkgcHJvcGVydHkgc2V0dXAuYCwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRHJvcGRvd25Db21wb25lbnRFcnJvcidcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5wdXQoKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5uZ01vZGVsVmFsdWUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tYmluZUxhdGVzdChbdG9PYnNlcnZhYmxlKHRoaXMuZGF0YVByb3ZpZGVyKSwgdG9PYnNlcnZhYmxlKHRoaXMub3B0aW9ucyldKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuX2xvYWRpbmcuc2V0KHRydWUpKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtkYXRhUHJvdmlkZXIsIG9wdGlvbnNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IGRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4oZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbW9uc1RvT2JzZXJ2YWJsZShkYXRhUHJvdmlkZXIubG9va3VwKHtsaW1pdDogNTB9LCB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihvcHRpb25zID8/IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChpdGVtcyA9PiB0aGlzLnRyYW5zZm9ybUl0ZW1zKGl0ZW1zKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbXMocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5saW5lU2VhcmNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWx1ZVN1Z2dlc3Rpb25SZXN1bHRDYWNoZVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3VnZ2VzdGlvblJlc3VsdENhY2hlU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueT4oMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3VnZ2VzdGlvblJlc3VsdENhY2hlU3ViamVjdD8ubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0oKTsgLy8gb25seSBzZWxlY3RzIGZpcnN0IGl0ZW0gaWYgc2VsZWN0Rmlyc3RJdGVtSW5wdXQgaXMgc2V0IGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0VmFsdWVPbkl0ZW1zVmFsdWVQcm9wZXJ0eVR5cGVNaXNtYXRjaCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbXMoW10pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZnJvbVN1YnNjcmliZUVycm9yKGVyciwgJ0Ryb3Bkb3duQ29tcG9uZW50RXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGVycm9yLCBnZXRFcnJvckxvZ0xldmVsKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93SW5wdXQoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5KCkgJiYgIXRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgYWxsb3dJbnB1dCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gb3B0aW9uc0xhYmVsUHJvcGVydHkgaXMgZGVmaW5lZCBidXQgb3B0aW9uc1ZhbHVlUHJvcGVydHkgaXMgbWlzc2luZy4gU2V0IG9wdGlvbnNWYWx1ZVByb3BlcnR5IHRvIGVuYWJsZSBhbGxvd0lucHV0LmBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCkpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYW5ndWxhciBpbiBzb21lIGNhc2VzIHdyaXRlcyBudWxsIHZhbHVlXG4gICAgICAgIC8vIGJlZm9yZSB2YWx1ZSBhY2Nlc3NvciBpcyBpbml0aWFsaXplZFxuICAgICAgICAvLyBpZiBmb3JtIGNvbnRyb2wgdmFsdWUgaXMgb2YgcHJpbWl0aXZlIHR5cGUgKGV4OiBlbnVtcykgdGhlbiB3cml0ZSB2YWx1ZSBpcyBub3QgY2FsbGVkICh3ZSB0aGluaylcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgdGhpcy5fdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlIGltbWVkaWF0ZWx5IC0gaXQgaXMgaW1wb3J0YW50IHNvIHRoYXQgZmlyc3Qgc2VsZWN0IGlzIG5vdCB0cmlnZ2VyZWQhXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuYWRqdXN0VmFsdWVPbkl0ZW1zVmFsdWVQcm9wZXJ0eVR5cGVNaXNtYXRjaCh0cnVlKTtcbiAgICB9XG5cbiAgICBvbkRyb3Bkb3duQmx1cihldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gaWYgYWxsb3dDdXN0b21JbnB1dCBpcyBlbmFibGVkLCB0aGUgaW5wdXQgZWxlbWVudCBtaWdodCBzdGlsbCBiZSBpbiBmb2N1cyB3aXRoIHRoZVxuICAgICAgICAvLyBkcm9wZG93biBwYW5lbCBoaWRkZW4gLSB0aGF0J3Mgd2h5IHRoZSAhdGhpcy5hbGxvd0N1c3RvbUlucHV0KCkgY2hlY2sgaXMgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25QYW5lbFNob3duICYmICF0aGlzLmFsbG93SW5wdXQoKSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgYmx1ciBldmVudFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByaW1lRHJvcGRvd24gPSB0aGlzLnByaW1lRHJvcGRvd24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIoKSAmJiBwcmltZURyb3Bkb3duKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHByaW1lRHJvcGRvd24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4oKTtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uRHJvcGRvd25DaGFuZ2UoZXZlbnQ6IERyb3Bkb3duQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5nZVZhbHVlT25CbHVyKCkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UoZXZlbnQudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsb3dJbnB1dCgpKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zTGFiZWxQcm9wZXJ0eSA9IHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkoKTtcbiAgICAgICAgICAgIGxldCBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Py52YWx1ZSA9PT0gJ3N0cmluZycgJiYgZXZlbnQ/LnZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHRoaXMudHJpbVZhbHVlKGV2ZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZVN1Z2dlc3Rpb25Qcm92aWRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcigpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlubGluZVNlYXJjaCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtczogRGF0YUxpc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMTBcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc0xhYmVsUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gW3twcm9wZXJ0eTogb3B0aW9uc0xhYmVsUHJvcGVydHl9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkgJiYgcXVlcnkubGVuZ3RoID4gMCAmJiBvcHRpb25zTGFiZWxQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFByb3BlcnR5XToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogRmlsdGVyTWF0Y2hNb2RlLlN0YXJ0c1dpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZVN1Z2dlc3Rpb25Qcm92aWRlclN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0TG9va3VwKHBhcmFtcywgcXVlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtcyhpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtcyhbXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBmcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnRHJvcGRvd25Db21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGVycm9yLCBnZXRFcnJvckxvZ0xldmVsKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlU3VnZ2VzdGlvblJlc3VsdENhY2hlU3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3VnZ2VzdGlvblByb3ZpZGVyU3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZVN1Z2dlc3Rpb25SZXN1bHRDYWNoZVN1YmplY3QucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbXMocmVzdWx0LCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbXModGhpcy5vcHRpb25zKCksIHF1ZXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGl0ZW1zIGluIHRoZSBkcm9wZG93bi4gSWYgYSBxdWVyeSBpcyBwcm92aWRlZCwgdGhlIGl0ZW1zIHdpbGwgYmUgZmlsdGVyZWQgYnkgdGhlIHF1ZXJ5ICh1c2luZyBhICdzdGFydHMgd2l0aCcgZmlsdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgdG8gc2V0LlxuICAgICAqIEBwYXJhbSBbcXVlcnldIFRoZSBxdWVyeSB0byBmaWx0ZXIgdGhlIGl0ZW1zIGJ5LlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SXRlbXMoaXRlbXM6IEFycmF5PGFueT4sIHF1ZXJ5Pzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93SW5wdXQoKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBpdGVtcyBjYW4gZWl0aGVyIGJlIG9iamVjdHMgKHdpdGggb3B0aW9uc1ZhbHVlUHJvcGVydHkgc3BlY2lmeWluZyBhIHN0cmluZyBwcm9wZXJ0eSkgb3Igc3RyaW5nc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbXNbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFsbG93SW5wdXQgaXMgbm90IHN1cHBvcnRlZCB3aGVuIG9wdGlvblZhbHVlUHJvcGVydHkgaXMgbm90IHNldCBhbmQgdGhlIGRyb3Bkb3duIGl0ZW1zIGFyZSBvZiB0eXBlIG9iamVjdC4gU2V0IG9wdGlvbnNWYWx1ZVByb3BlcnR5IHRvIGVuYWJsZSBhbGxvd0lucHV0LmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtc1swXT8uW3RoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHkoKSFdICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBhbGxvd0lucHV0IGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlIHZhbHVlIHByb3BlcnR5IChzcGVjaWZpZWQgd2l0aCBvcHRpb25zVmFsdWVQcm9wZXJ0eSkgaXMgb2YgdHlwZSBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEodHlwZW9mIGl0ZW1zWzBdID09PSAnc3RyaW5nJyAmJiAhdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eSgpICYmICF0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnYWxsb3dJbnB1dCcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGl0ZW1zIG9mIHR5cGUgc3RyaW5nIG9yIG9iamVjdC4gRm9yIG9iamVjdCB0eXBlcywgZW5zdXJlIHRoYXQgdGhlICdvcHRpb25zVmFsdWVQcm9wZXJ0eScgaXMgc3BlY2lmaWVkIGFuZCByZXByZXNlbnRzIGEgcHJvcGVydHkgb2YgdHlwZSBzdHJpbmcuYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlMb3dlckNhc2UgPSBxdWVyeT8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1MYWJlbCA9IGk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0xhYmVsUHJvcGVydHkgPSB0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5KCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNMYWJlbFByb3BlcnR5ICYmIHR5cGVvZiBpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtTGFiZWwgPSBpW29wdGlvbnNMYWJlbFByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1MYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUxvd2VyQ2FzZSA9PSBudWxsIHx8ICFxdWVyeUxvd2VyQ2FzZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbUxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtTGFiZWwgPSBpdGVtTGFiZWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocXVlcnlMb3dlckNhc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNldChbLi4uZmlsdGVyZWRJdGVtc10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5zZXQoWy4uLml0ZW1zXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRyb3Bkb3duUGFuZWxTaG93KCkge1xuICAgICAgICB0aGlzLmlzRHJvcGRvd25QYW5lbFNob3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkRyb3Bkb3duUGFuZWxIaWRlKCkge1xuICAgICAgICB0aGlzLmlzRHJvcGRvd25QYW5lbFNob3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25NdWx0aXNlbGVjdENoYW5nZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbmdlVmFsdWVPbkJsdXIoKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZShldmVudC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk11bHRpc2VsZWN0Qmx1cihldmVudDogTXVsdGlTZWxlY3RCbHVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgICB0aGlzLmJsdXIuZW1pdChldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICB9XG5cbiAgICBvbk11bHRpc2VsZWN0UGFuZWxIaWRlKCkge1xuICAgICAgICBjb25zdCBwcmltZU11bHRpc2VsZWN0ID0gdGhpcy5wcmltZU11bHRpc2VsZWN0KCk7XG4gICAgICAgIGlmICh0aGlzLmNoYW5nZVZhbHVlT25CbHVyKCkgJiYgcHJpbWVNdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZShwcmltZU11bHRpc2VsZWN0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0Rmlyc3RJdGVtKCkge1xuICAgICAgICBpZiAodGhpcy5maXJzdFRpbWVTZXR0aW5nSXRlbXMgJiYgdGhpcy5pdGVtcygpLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RGaXJzdEl0ZW1JbnB1dCgpICYmICF0aGlzLl92YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1ZhbHVlUHJvcGVydHkgPSB0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNWYWx1ZVByb3BlcnR5ID8gdGhpcy5pdGVtcygpWzBdW29wdGlvbnNWYWx1ZVByb3BlcnR5XSA6IHRoaXMuaXRlbXMoKVswXTtcbiAgICAgICAgICAgIHRoaXMubmdNb2RlbFZhbHVlLnNldCh2YWx1ZSk7IC8vIHNldCB0byB3cml0ZSBmb3IgaW5wdXRcbiAgICAgICAgICAgIHRoaXMuZmlyc3RUaW1lU2V0dGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJhbnNmb3JtSXRlbXMoaXRlbXM6IGFueVtdKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNMYWJlbFRyYW5zbGF0ZSgpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbktleXM6IHN0cmluZ1tdID0gaXRlbXMubWFwKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCgpID8gKGl0ZW1bdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZykgOiBpdGVtKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLnN0cmVhbSh0cmFuc2xhdGlvbktleXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHRyYW5zbGF0aW9ucyA9PlxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1bdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQoKSBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdHJhbnNsYXRpb25zW2xhYmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtLCBbdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eSgpIV06IHRyYW5zbGF0aW9ufTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkoKSFdOiB0cmFuc2xhdGlvbiA/PyBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eSgpIV06IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoaXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGp1c3RWYWx1ZU9uSXRlbXNWYWx1ZVByb3BlcnR5VHlwZU1pc21hdGNoKHNldE5nTW9kZWxWYWx1ZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNWYWx1ZVByb3AgPSB0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5KCk7XG4gICAgICAgIGlmIChvcHRpb25zVmFsdWVQcm9wICYmIHRoaXMuX3ZhbHVlICE9IG51bGwgJiYgdGhpcy5pdGVtcygpLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtcygpWzBdW29wdGlvbnNWYWx1ZVByb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiB0aGlzLml0ZW1zKClbMF1bb3B0aW9uc1ZhbHVlUHJvcF0gIT09IHR5cGVvZiB0aGlzLl92YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZXMgPSB0aGlzLl92YWx1ZS5tYXAodiA9PiB2LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSB0aGlzLml0ZW1zKCkuZmlsdGVyKGkgPT4gaVtvcHRpb25zVmFsdWVQcm9wXSAhPSBudWxsICYmIHN0cmluZ1ZhbHVlcy5pbmNsdWRlcyhpW29wdGlvbnNWYWx1ZVByb3BdLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxWYWx1ZS5zZXQoc2VsZWN0ZWRPcHRpb25zLm1hcChpID0+IGlbb3B0aW9uc1ZhbHVlUHJvcF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuaXRlbXMoKVswXVtvcHRpb25zVmFsdWVQcm9wXSAhPT0gdHlwZW9mIHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gdHlwZXMgZG9uJ3QgbWF0Y2gsIHNlYXJjaCBhbmQgY29tcGFyZSBieSBzdHJpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuaXRlbXMoKS5maW5kKGkgPT4gaVtvcHRpb25zVmFsdWVQcm9wXSAhPSBudWxsICYmIGlbb3B0aW9uc1ZhbHVlUHJvcF0udG9TdHJpbmcoKSA9PT0gdGhpcy5fdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbFZhbHVlLnNldChzZWxlY3RlZE9wdGlvbltvcHRpb25zVmFsdWVQcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0TmdNb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBmb3JjZSB3cml0ZSB0byBuZ01vZGVsVmFsdWUgYW55d2F5XG4gICAgICAgICAgICB0aGlzLm5nTW9kZWxWYWx1ZS5zZXQodGhpcy5fdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVWYWx1ZUNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG9va3VwIGZyb20gdGhlIGRhdGEgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGxvb2t1cC5cbiAgICAgKiBAcGFyYW0gW3F1ZXJ5XSBUaGUgc2VhcmNoIHF1ZXJ5IHRvIGZpbHRlciB0aGUgaXRlbXMgYnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMb29rdXAocGFyYW1zOiBEYXRhTGlzdFBhcmFtcywgcXVlcnk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFycmF5PGFueT4+IHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gdGhpcy5kYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgaWYgKGRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbnNUb09ic2VydmFibGUoZGF0YVByb3ZpZGVyLmxvb2t1cChwYXJhbXMsIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSwgcXVlcnkpKS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzID8/IFtdKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaW1zIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGdpdmVuIHZhbHVlIGJhc2VkIG9uIHRoZSBzZWFyY2ggdHJpbW1pbmcgbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB0cmltbWVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgdHJpbVZhbHVlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNlYXJjaFRyaW0oKSkge1xuICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZT8udHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZT8udHJpbUVuZCgpO1xuICAgICAgICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlPy50cmltKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpZiAoIW11bHRpc2VsZWN0KCkpIHtcbiAgICA8cC1kcm9wZG93blxuICAgICAgICBbKG5nTW9kZWwpXT1cIm5nTW9kZWxWYWx1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpXCJcbiAgICAgICAgW2RhdGFLZXldPVwib3B0aW9uc1RyYWNrUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25MYWJlbF09XCJvcHRpb25zTGFiZWxQcm9wZXJ0eSgpXCJcbiAgICAgICAgW29wdGlvblZhbHVlXT1cIm9wdGlvbnNWYWx1ZVByb3BlcnR5KClcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwib3B0aW9uc0Rpc2FibGVkUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25zXT1cIml0ZW1zKClcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInNob3dDbGVhcigpXCJcbiAgICAgICAgW2VkaXRhYmxlXT1cImFsbG93SW5wdXQoKVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImNsYXNzTmFtZSgpXCJcbiAgICAgICAgW3BhbmVsU3R5bGVDbGFzc109XCJkcm9wZG93bkNsYXNzTmFtZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAob25CbHVyKT1cIm9uRHJvcGRvd25CbHVyKCRldmVudClcIlxuICAgICAgICAob25DaGFuZ2UpPVwib25Ecm9wZG93bkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uU2hvdyk9XCJvbkRyb3Bkb3duUGFuZWxTaG93KClcIlxuICAgICAgICAob25IaWRlKT1cIm9uRHJvcGRvd25QYW5lbEhpZGUoKVwiXG4gICAgICAgIFtkcm9wZG93bkljb25dPVwibG9hZGluZygpID8gJ3BpIHBpLXNwaW5uZXIgcGktc3BpbicgOiAncGkgcGktY2hldnJvbi1kb3duJ1wiXG4gICAgICAgIFthcHBlbmRUb109XCJhcHBlbmRUbygpXCI+XG4gICAgPC9wLWRyb3Bkb3duPlxufSBAZWxzZSB7XG4gICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgW25nTW9kZWxdPVwibmdNb2RlbFZhbHVlKClcIlxuICAgICAgICBbbWF4U2VsZWN0ZWRMYWJlbHNdPVwiMVwiXG4gICAgICAgIFtzZWxlY3RlZEl0ZW1zTGFiZWxdPVwiJ21uZ0Ryb3Bkb3duLm11bHRpc2VsZWN0T3Zlck1heERpc3BsYXlMaW1pdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKVwiXG4gICAgICAgIFtkYXRhS2V5XT1cIm9wdGlvbnNUcmFja1Byb3BlcnR5KClcIlxuICAgICAgICBbb3B0aW9uTGFiZWxdPVwib3B0aW9uc0xhYmVsUHJvcGVydHkoKVwiXG4gICAgICAgIFtvcHRpb25WYWx1ZV09XCJvcHRpb25zVmFsdWVQcm9wZXJ0eSgpXCJcbiAgICAgICAgW29wdGlvbkRpc2FibGVkXT1cIm9wdGlvbnNEaXNhYmxlZFByb3BlcnR5KClcIlxuICAgICAgICBbb3B0aW9uc109XCJpdGVtcygpXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lKClcIlxuICAgICAgICBbcGFuZWxTdHlsZUNsYXNzXT1cImRyb3Bkb3duQ2xhc3NOYW1lKClcIlxuICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgKG9uQ2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChvblBhbmVsSGlkZSk9XCJvbk11bHRpc2VsZWN0UGFuZWxIaWRlKClcIlxuICAgICAgICAob25CbHVyKT1cIm9uTXVsdGlzZWxlY3RCbHVyKCRldmVudClcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICA8L3AtbXVsdGlTZWxlY3Q+XG59XG4iXX0=
|