@seniorsistemas/angular-components 19.0.6 → 19.0.8
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/esm2022/kanban/lib/kanban/kanban.component.mjs +3 -3
- package/esm2022/select/lib/select/select.component.mjs +38 -17
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +37 -16
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/package.json +7 -7
- package/select/lib/select/select.component.d.ts +6 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OverlayModule } from '@angular/cdk/overlay';
|
|
2
2
|
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
3
3
|
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { Component, computed, forwardRef, inject, input, model, signal, viewChild, } from '@angular/core';
|
|
4
|
+
import { Component, computed, forwardRef, inject, input, model, signal, viewChild, effect, } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
7
7
|
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
@@ -69,6 +69,7 @@ export class SelectComponent {
|
|
|
69
69
|
values = signal([]);
|
|
70
70
|
filterValue = signal('');
|
|
71
71
|
focusedIndex = signal(-1);
|
|
72
|
+
_pendingValue = null;
|
|
72
73
|
componentId = `select${SelectComponent.nextId++}`;
|
|
73
74
|
/**
|
|
74
75
|
* Computed que indica se todas as opções filtradas estão selecionadas.
|
|
@@ -200,6 +201,13 @@ export class SelectComponent {
|
|
|
200
201
|
.subscribe((value) => {
|
|
201
202
|
this.filterValue.set(value);
|
|
202
203
|
});
|
|
204
|
+
// Efeito para tentar aplicar valor pendente quando options mudar
|
|
205
|
+
effect(() => {
|
|
206
|
+
const opts = this.options();
|
|
207
|
+
if (opts && opts.length && this._pendingValue !== null) {
|
|
208
|
+
this._applyPendingValue();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
203
211
|
}
|
|
204
212
|
ngOnInit() {
|
|
205
213
|
this._validateInputs();
|
|
@@ -213,38 +221,51 @@ export class SelectComponent {
|
|
|
213
221
|
* garantindo que apenas opções válidas sejam selecionadas conforme o modo de seleção (único ou múltiplo).
|
|
214
222
|
*/
|
|
215
223
|
writeValue(value) {
|
|
224
|
+
// Armazena valor pendente e tenta aplicar
|
|
225
|
+
this._pendingValue = value;
|
|
226
|
+
this._applyPendingValue();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Tenta aplicar o valor pendente (_pendingValue) ao estado do componente,
|
|
230
|
+
* mapeando para InternalDropdownOption<T> conforme options disponíveis.
|
|
231
|
+
*/
|
|
232
|
+
_applyPendingValue() {
|
|
233
|
+
const value = this._pendingValue;
|
|
234
|
+
const opts = this.internalOptions();
|
|
235
|
+
const optionValue = this.optionValue();
|
|
216
236
|
if (value && this.multiple()) {
|
|
217
237
|
if (Array.isArray(value)) {
|
|
218
238
|
const mapped = value
|
|
219
|
-
.map((
|
|
220
|
-
|
|
221
|
-
return
|
|
222
|
-
}
|
|
239
|
+
.map((v) => {
|
|
240
|
+
if (optionValue) {
|
|
241
|
+
return opts.find((opt) => opt.data[optionValue] === v) || null;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
return opts.find((opt) => JSON.stringify(opt.data) === JSON.stringify(v)) || null;
|
|
245
|
+
}
|
|
223
246
|
})
|
|
224
|
-
.filter((
|
|
247
|
+
.filter((opt) => !!opt);
|
|
225
248
|
this.values.set(mapped);
|
|
226
249
|
}
|
|
227
250
|
else {
|
|
228
|
-
|
|
251
|
+
this.values.set([]);
|
|
229
252
|
}
|
|
230
253
|
}
|
|
231
254
|
else {
|
|
232
|
-
const optionValue = this.optionValue();
|
|
233
255
|
let mapped = null;
|
|
234
256
|
if (Array.isArray(value)) {
|
|
235
|
-
|
|
257
|
+
mapped = null;
|
|
236
258
|
}
|
|
237
|
-
if (optionValue && value) {
|
|
238
|
-
|
|
239
|
-
|
|
259
|
+
else if (optionValue && value != null) {
|
|
260
|
+
const compareValue = typeof value === 'object' && value !== null && optionValue in value ? value[optionValue] : value;
|
|
261
|
+
mapped = opts.find((opt) => opt.data[optionValue] === compareValue) || null;
|
|
240
262
|
}
|
|
241
|
-
else {
|
|
242
|
-
mapped =
|
|
243
|
-
this.internalOptions().find((option) => JSON.stringify(option.data) === JSON.stringify(value)) ??
|
|
244
|
-
null;
|
|
263
|
+
else if (value != null) {
|
|
264
|
+
mapped = opts.find((opt) => JSON.stringify(opt.data) === JSON.stringify(value)) || null;
|
|
245
265
|
}
|
|
246
266
|
this.value.set(mapped ?? null);
|
|
247
267
|
}
|
|
268
|
+
this._pendingValue = null;
|
|
248
269
|
}
|
|
249
270
|
/**
|
|
250
271
|
* Registra uma função de callback que será chamada sempre que o valor do componente mudar.
|
|
@@ -676,4 +697,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
676
697
|
},
|
|
677
698
|
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
|
|
678
699
|
}], ctorParameters: () => [] });
|
|
679
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7QUFPM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQTRDSCxNQUFNLE9BQU8sZUFBZTtJQUNoQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUUxQixvRkFBb0Y7SUFDN0UsV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUUvQixzRkFBc0Y7SUFDL0UsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQixnRkFBZ0Y7SUFDekUsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztJQUV2QywwRUFBMEU7SUFDbkUsV0FBVyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBRXRDLDBGQUEwRjtJQUNuRixXQUFXLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFFdEMsOEVBQThFO0lBQ3ZFLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFaEMsZ0dBQWdHO0lBQ3pGLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNEZBQTRGO0lBQ3JGLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFaEMsZ0hBQWdIO0lBQ3pHLFFBQVEsR0FBRyxLQUFLLEVBQXlCLENBQUM7SUFFakQsK0lBQStJO0lBQ3hJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUIseUhBQXlIO0lBQ2xILGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEMseUhBQXlIO0lBQ2xILHFCQUFxQixHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV6Qyx1R0FBdUc7SUFDaEcsWUFBWSxHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFakQsb0dBQW9HO0lBQzdGLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0IsbUdBQW1HO0lBQzVGLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0IsS0FBSyxHQUFHLE1BQU0sQ0FBbUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxHQUFHLE1BQU0sQ0FBOEIsRUFBRSxDQUFDLENBQUM7SUFDakQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUIsV0FBVyxHQUFHLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFFekQ7Ozs7O09BS0c7SUFDSSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFN0QsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0lBRUg7OztPQUdHO0lBQ0ksV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7OztPQU1HO0lBQ0ksZUFBZSxHQUFHLFFBQVEsQ0FBOEIsR0FBRyxFQUFFO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDN0UsQ0FBQyxDQUFDLENBQUM7SUFFSDs7Ozs7OztPQU9HO0lBQ0ksS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsb0RBQW9ELEVBQUU7b0JBQ3hGLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTTtpQkFDekIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0ksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFFSDs7Ozs7T0FLRztJQUNJLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFbkUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVIOzs7Ozs7T0FNRztJQUNJLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7WUFFRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFFZixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFdkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNaLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakYsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRWEsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFrQztRQUN4RSxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzdELENBQUMsQ0FBQztJQUVLLGFBQWEsR0FBRyxTQUFTLENBQTZCLGNBQWMsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsR0FBd0MsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQzFELFVBQVUsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFekIsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFOUQ7UUFDSSxJQUFJLENBQUMsVUFBVTthQUNWLEdBQUcsQ0FBQyxRQUFRLENBQUU7YUFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUM7YUFDbEYsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFVBQVUsQ0FBQyxLQUFxQjtRQUNuQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxNQUFNLEdBQUcsS0FBSztxQkFDZixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvRCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUM7cUJBQ0QsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUF1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUV2RSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLE1BQU0sR0FBcUMsSUFBSSxDQUFDO1lBRXBELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVELElBQUksV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN2QixNQUFNO29CQUNGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ3pHLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNO29CQUNGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzlGLElBQUksQ0FBQztZQUNiLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQkFBZ0IsQ0FBQyxRQUF5QztRQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsU0FBcUI7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdCQUFnQixDQUFDLFFBQWlCO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU07UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFVBQVUsQ0FBQyxJQUErQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDM0MsT0FBTyxZQUFZLEtBQUssSUFBSSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNqRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksS0FBSyxDQUFDLEtBQWlCO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVc7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsQ0FBQyxDQUFRO1FBQzFCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQjtRQUN0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksU0FBUyxDQUFDLEtBQW9CO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssV0FBVztnQkFDWixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsTUFBTTtZQUNWLEtBQUssU0FBUztnQkFDVixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsTUFBTTtZQUNWLEtBQUssS0FBSztnQkFDTixhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixNQUFNO1lBQ1YsS0FBSyxPQUFPO2dCQUNSLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ3JCLGFBQWEsRUFBRSxDQUFDO2dCQUNwQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixDQUFDO2dCQUNELE1BQU07WUFDVixLQUFLLFFBQVE7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixNQUFNO1lBQ1YsS0FBSyxHQUFHO2dCQUNKLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDckIsYUFBYSxFQUFFLENBQUM7Z0JBQ3BCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsTUFBTTtRQUNkLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsQ0FBQyxNQUFTO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxTQUFTLENBQUMsQ0FBUyxFQUFFLElBQStCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLE1BQWlDO1FBQ3JELE9BQU8sQ0FDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FDbkIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0UsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssbUJBQW1CLENBQUMsTUFBUztRQUNqQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssZUFBZTtRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVqRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7WUFDckYsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssZUFBZSxDQUFDLE9BQVk7UUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFFLE1BQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxPQUFPO29CQUNILElBQUksRUFBRSxNQUFNO29CQUNaLEVBQUUsRUFBRSxNQUFNLFNBQVMsSUFBSSxLQUFLLEVBQUUsRUFBRTtvQkFDaEMsT0FBTyxFQUFFLElBQUk7aUJBQ2hCLENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTztnQkFDSCxJQUFJLEVBQUUsTUFBTTtnQkFDWixFQUFFLEVBQUUsTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLEVBQUU7YUFDbkMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGNBQWMsQ0FBQyxPQUFvQztRQUN2RCxNQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBRS9DLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBRSxNQUFNLENBQUMsSUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFJLE1BQU0sQ0FBQyxJQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQU8sRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzNFLElBQUksRUFBRSxJQUFJO29CQUNWLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLFNBQVMsS0FBSyxFQUFFO2lCQUNuQyxDQUFDLENBQUMsQ0FBQztnQkFDSixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxPQUFvQztRQUN6RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLE9BQU8sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlELFNBQVMsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssb0JBQW9CLENBQUMsT0FBb0M7UUFDN0QsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV4QyxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xELFNBQVMsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHNCQUFzQjtRQUMxQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRTNELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNOLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssb0JBQW9CO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ1gsYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckMsSUFBSSxhQUFhLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7d0dBbHJCUSxlQUFlOzRGQUFmLGVBQWUsa2tGQVJiO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSix5SkN6RkwsazFMQXFKQSw4SkRoR1EsWUFBWSw0SEFDWixtQkFBbUIsNDhCQUNuQixlQUFlLDRqQkFDZixxQkFBcUIsaU1BQ3JCLGlCQUFpQiwrSkFDakIsZUFBZSwyRkFDZixhQUFhOzs0RkFnQ1IsZUFBZTtrQkEzQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0Msc0JBQXNCLEVBQUUsZUFBZTt3QkFDdkMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsaURBQWlEO3dCQUNyRSw4QkFBOEIsRUFBRSxvRUFBb0U7d0JBQ3BHLG1CQUFtQixFQUFFLGtDQUFrQzt3QkFDdkQsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CLGFBYVU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIHNlbGXDp8OjbyBkcm9wZG93biBnZW7DqXJpY28gY29tIHN1cG9ydGUgYSBzZWxlw6fDo28gc2ltcGxlcyBlIG3Dumx0aXBsYSxcbiAqIGZpbHRybywgYWdydXBhbWVudG8sIHZpcnR1YWwgc2Nyb2xsIGUgYWNlc3NpYmlsaWRhZGUgKEFSSUEgY29tYm9ib3gpLiBJbXBsZW1lbnRhXG4gKiB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmEgaW50ZWdyYcOnw6NvIGNvbSBSZWFjdGl2ZSBGb3JtcyBlIFRlbXBsYXRlLWRyaXZlbiBGb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHMtc2VsZWN0XG4gKiAgIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3JpYVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtYSBjYXRlZ29yaWFcIlxuICogICBbb3B0aW9uc109XCJjYXRlZ29yaWFzXCJcbiAqICAgb3B0aW9uTGFiZWw9XCJub21lXCJcbiAqICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gKiAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gKiAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICAgICAgU2VsZWN0T3B0aW9uQ29tcG9uZW50LFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnKHdpbmRvdzpyZXNpemUpJzogJ29uV2luZG93UmVzaXplKCRldmVudCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAnc2hvd09wdGlvbnMoKScsXG4gICAgICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXG4gICAgICAgICdbYXR0ci5hcmlhLW93bnNdJzogJ3Nob3dPcHRpb25zKCkgPyBjb21wb25lbnRJZCArIFwiLWxpc3Rib3hcIiA6IG51bGwnLFxuICAgICAgICAnW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XSc6ICdmb2N1c2VkSW5kZXgoKSA+PSAwID8gZmlsdGVyZWRPcHRpb25zKClbZm9jdXNlZEluZGV4KCldPy5pZCA6IG51bGwnLFxuICAgICAgICAnW2F0dHIuYXJpYS1sYWJlbF0nOiAncGxhY2Vob2xkZXIoKSB8fCBcIlNlbGVjdCBvcHRpb25cIicsXG4gICAgICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICB9LFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIHtcbiAgICAgICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIC5zZWxlY3QtY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBlc3TDoSBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGEgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgb3DDp8O1ZXMgc2ltdWx0w6JuZWFzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXG4gICAgcHVibGljIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gbGFiZWwgZGUgZXhpYmnDp8Ojby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIHZhbG9yIGEgc2VyIGVtaXRpZG8gYW8gZm9ybXVsw6FyaW8uICovXG4gICAgcHVibGljIG9wdGlvblZhbHVlID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gYm90w6NvIHBhcmEgbGltcGFyIGEgc2VsZcOnw6NvIGF0dWFsLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93Q2xlYXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHVtIGNhbXBvIGRlIGZpbHRybyB0ZXh0dWFsIHBhcmEgcGVzcXVpc2EgbmFzIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlKHMpIGRvIG9iamV0byB1c2FkYShzKSBwYXJhIGZpbHRyYWdlbSB0ZXh0dWFsLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sIHVzYSBgb3B0aW9uTGFiZWxgLiAqL1xuICAgIHB1YmxpYyBmaWx0ZXJCeSA9IGlucHV0PGtleW9mIFQgfCAoa2V5b2YgVClbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYWdydXBhbWVudG8gZGUgb3DDp8O1ZXMuIEFzIG9ww6fDtWVzIGRldmVtIGNvbnRlciBpdGVucyBmaWxob3MgY29uZm9ybWUgYSBlc3RydXR1cmEgZGUgZ3J1cG8gc3Vwb3J0YWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIHBhcmEgbWVsaG9yIHBlcmZvcm1hbmNlIGNvbSBncmFuZGVzIHZvbHVtZXMgZGUgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGwgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEFsdHVyYSBmaXhhIGRlIGNhZGEgaXRlbSBkYSBsaXN0YSBlbSBwaXhlbHMsIG5lY2Vzc8OhcmlhIHBhcmEgbyBjw6FsY3VsbyBkbyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBNZW5zYWdlbSBleGliaWRhIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gY29ycmVzcG9uZGUgYW8gZmlsdHJvIGFwbGljYWRvLiBAZGVmYXVsdCBudWxsICovXG4gICAgcHVibGljIGVtcHR5TWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZSB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgYSB2aXNpYmlsaWRhZGUgZG8gcGFpbmVsIGRlIG9ww6fDtWVzIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dPcHRpb25zID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgcHVibGljIHZhbHVlID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oW10pO1xuICAgIHB1YmxpYyBmaWx0ZXJWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGZvY3VzZWRJbmRleCA9IHNpZ25hbCgtMSk7XG5cbiAgICBwdWJsaWMgY29tcG9uZW50SWQgPSBgc2VsZWN0JHtTZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMuXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIChleGNsdWluZG8gYWdydXBhZG9yZXMpIGVzdGl2ZXJlbSBwcmVzZW50ZXNcbiAgICAgKiBuYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcywgZSBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMudmFsdWVzKCkubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCk7XG5cbiAgICAgICAgY29uc3QgcmV0ID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMob3B0aW9uLmlkKSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmRhdGEgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGEgZSByZXRvcm5hIGEgbGlzdGEgaW50ZXJuYSBkZSBvcMOnw7VlcyBkbyBkcm9wZG93bi5cbiAgICAgKiAtIFNlIGFzIG9ww6fDtWVzIGVzdGl2ZXJlbSBhZ3J1cGFkYXMgKGBncm91cCgpYCByZXRvcm5hIHZlcmRhZGVpcm8pLFxuICAgICAqICAgdXRpbGl6YSBgX2dyb3VwZXJUb0ZsYXRgIHBhcmEgdHJhbnNmb3JtYXIgYXMgb3DDp8O1ZXMgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYS5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgcmV0b3JuYSBhcyBvcMOnw7VlcyBjb20gSURzIGFkaWNpb25hZG9zLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YCByZXByZXNlbnRhbmRvIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICovXG4gICAgcHVibGljIGludGVybmFsT3B0aW9ucyA9IGNvbXB1dGVkPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNXaXRoSWQgPSB0aGlzLl9hZGRJZFRvT3B0aW9ucyhvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA/IHRoaXMuX2dyb3VwZXJUb0ZsYXQob3B0aW9uc1dpdGhJZCkgOiBvcHRpb25zV2l0aElkO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgc3RyaW5nIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwgZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbWFpcyBkZSB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sXG4gICAgICogICByZXRvcm5hIHVtYSBtZW5zYWdlbSB0cmFkdXppZGEgaW5kaWNhbmRvIG8gbsO6bWVybyB0b3RhbCBkZSByZWdpc3Ryb3Mgc2VsZWNpb25hZG9zLlxuICAgICAqIC0gU2UgYXBlbmFzIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZGVzc2UgaXRlbS5cbiAgICAgKiAtIFNlIG8gbW9kbyBtw7psdGlwbG8gbsOjbyBlc3RpdmVyIGF0aXZhZG8sIHJldG9ybmEgbyByw7N0dWxvIGRvIGl0ZW0gc2VsZWNpb25hZG8gb3UgdW1hIHN0cmluZyB2YXppYSBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBzZWxlY2lvbmFkby5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUZXh0byByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmludCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudG90YWxfcmVjb3Jkc19zZWxlY3RlZGAsIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IHNlbGVjdGVkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZFswXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkID8gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkLmRhdGEpIDogJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2UgbyBzZWxldG9yIGVzdMOhIFwibGltcG9cIiwgb3Ugc2VqYSwgc2VtIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkby5cbiAgICAgKiAtIE5vIG1vZG8gbcO6bHRpcGxvIChgbXVsdGlwbGVgKSwgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvIChgdmFsdWVzYCBlc3TDoSB2YXppbykuXG4gICAgICogLSBObyBtb2RvIHNpbXBsZXMsIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIHZhbG9yIHNlbGVjaW9uYWRvIChgdmFsdWVgIMOpIGZhbHN5KS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgc2VsZcOnw6NvLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDbGVhbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUoKSA/ICF0aGlzLnZhbHVlcygpLmxlbmd0aCA6ICF0aGlzLnZhbHVlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIG8gZXN0YWRvIGRlIHNlbGXDp8OjbyBcIlNlbGVjaW9uYXIgVG9kb3NcIiBlc3TDoSBpbmRldGVybWluYWRvLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHF1YW5kbyBuZW0gdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIGVzdMOjbyBzZWxlY2lvbmFkb3MgZSBuZW0gdG9kb3MgZXN0w6NvIGRlc21hcmNhZG9zLFxuICAgICAqIG91IHNlamEsIHF1YW5kbyBow6EgdW1hIHNlbGXDp8OjbyBwYXJjaWFsIGRvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSBhIHNlbGXDp8OjbyBmb3IgcGFyY2lhbCwgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKS5zb21lKChvKSA9PiBvLmlkID09PSBvcHRpb24uaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IGFsbCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuICAgICAgICBjb25zdCBub25lID0gb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiAhc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuICFhbGwgJiYgIW5vbmU7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMgY29tIGJhc2Ugbm8gdmFsb3IgZGUgYnVzY2EgKGBmaWx0ZXJWYWx1ZWApIGUgbm9zIGNyaXTDqXJpb3MgZGVmaW5pZG9zLlxuICAgICAqIC0gU2UgbyBmaWx0cm8gZXN0aXZlciBkZXNhYmlsaXRhZG8gb3UgbyB2YWxvciBkZSBidXNjYSBlc3RpdmVyIHZhemlvLCByZXRvcm5hIHRvZGFzIGFzIG9ww6fDtWVzLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCBmaWx0cmEgYXMgb3DDp8O1ZXMgdXRpbGl6YW5kbyBvKHMpIGNhbXBvKHMpIGVzcGVjaWZpY2FkbyhzKSBlbSBgZmlsdGVyQnlgLlxuICAgICAqIC0gSWdub3JhIG9ww6fDtWVzIHF1ZSBwb3NzdWVtIGEgcHJvcHJpZWRhZGUgYGdyb3VwZXJgIGRlZmluaWRhLlxuICAgICAqIEByZXR1cm5zIEFzIG9ww6fDtWVzIGZpbHRyYWRhcyBjb25mb3JtZSBvIHZhbG9yIGRlIGJ1c2NhIGUgY3JpdMOpcmlvcyBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYWxsT3B0aW9ucyA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuZmlsdGVyVmFsdWUoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyKCkgfHwgIXNlYXJjaCkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbE9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJCeSA9IHRoaXMuZmlsdGVyQnkoKTtcbiAgICAgICAgcmV0dXJuIGFsbE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuXG4gICAgICAgICAgICBpZiAoIWZpbHRlckJ5KSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb24uZGF0YVtvcHRpb25MYWJlbF0pIDogU3RyaW5nKG9wdGlvbi5kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJCeSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGZpbHRlckJ5Lm1hcCgoYnkpID0+IFN0cmluZyhvcHRpb24uZGF0YVtieV0gPz8gJycpKS5qb2luKCcgJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gU3RyaW5nKG9wdGlvbi5kYXRhW2ZpbHRlckJ5XSA/PyAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBsYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwPHsgZmlsdGVyOiBGb3JtQ29udHJvbDxzdHJpbmc+IH0+KHtcbiAgICAgICAgZmlsdGVyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICB9KTtcblxuICAgIHByaXZhdGUgX2NvbnRhaW5lckRpdiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NvbnRhaW5lckRpdicpO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSB8IGFueVtdIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm1cbiAgICAgICAgICAgIC5nZXQoJ2ZpbHRlcicpIVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUlucHV0cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIHZhbG9yIHNlbGVjaW9uYWRvIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBPIHZhbG9yIGEgc2VyIGRlZmluaWRvLiBQb2RlIHNlciB1bSBvYmpldG8gZG8gdGlwbyBgVGAsIHVtIGFycmF5IGRlIGBUYCAocXVhbmRvIG3Dumx0aXBsYSBzZWxlw6fDo28gZXN0w6EgaGFiaWxpdGFkYSksIG91IGBudWxsYC5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbyB2YWxvciBuw6NvIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgZGVzYXRpdmFkbyBlIG8gdmFsb3IgZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gbWFwZWlhIG8ocykgdmFsb3IoZXMpIGZvcm5lY2lkbyhzKSBwYXJhIGFzIG9ww6fDtWVzIGludGVybmFzIGRvIGNvbXBvbmVudGUsXG4gICAgICogZ2FyYW50aW5kbyBxdWUgYXBlbmFzIG9ww6fDtWVzIHbDoWxpZGFzIHNlamFtIHNlbGVjaW9uYWRhcyBjb25mb3JtZSBvIG1vZG8gZGUgc2VsZcOnw6NvICjDum5pY28gb3UgbcO6bHRpcGxvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3B0aW9uLmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbik6IG9wdGlvbiBpcyBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+ID0+ICEhb3B0aW9uKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChtYXBwZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYW4gYXJyYXkgd2hlbiBcIm11bHRpcGxlXCIgaXMgdHJ1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuICAgICAgICAgICAgbGV0IG1hcHBlZDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3Qgbm90IGJlIGFuIGFycmF5IHdoZW4gXCJtdWx0aXBsZVwiIGlzIGZhbHNlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmRhdGFbb3B0aW9uVmFsdWVdID09PSB2YWx1ZVtvcHRpb25WYWx1ZV0pID8/IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmluZCgob3B0aW9uKSA9PiBKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgPz9cbiAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobWFwcGVkID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZSBGdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgcmVjZWJlIG8gbm92byB2YWxvciBzZWxlY2lvbmFkbyBvdSBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IFQgfCBUW10gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXG4gICAgICogQHBhcmFtIG9uVG91Y2hlZCBGdW7Dp8OjbyBkZSBjYWxsYmFjayBhIHNlciBleGVjdXRhZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgbWFyY2FkbyBjb21vIFwidG9jYWRvXCIuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyByZWFsaXphIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIENhc28gY29udHLDoXJpbywgaW52ZXJ0ZSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRhcyBvcMOnw7Vlcy5cbiAgICAgKiBBbyBhYnJpciwgbW92ZSBvIGZvY28gcGFyYSBvIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gIXRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoc2hvdWxkT3Blbik7XG5cbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB1bSBpdGVtIG5vIGNvbXBvbmVudGUgZGUgc2VsZcOnw6NvLlxuICAgICAqIEBwYXJhbSBpdGVtIE8gaXRlbSBhIHNlciBzZWxlY2lvbmFkbyBvdSBkZXNtYXJjYWRvLlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgYSBmdW7Dp8OjbyByZXRvcm5hIGltZWRpYXRhbWVudGUuXG4gICAgICogTm8gbW9kbyBtw7psdGlwbG8sIGFkaWNpb25hIG91IHJlbW92ZSBvIGl0ZW0gZGEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogTm8gbW9kbyBzaW1wbGVzLCBkZWZpbmUgbyBpdGVtIGNvbW8gdmFsb3Igc2VsZWNpb25hZG8gZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIFNlbXByZSBub3RpZmljYSBhcyBtdWRhbsOnYXMgZSBtYXJjYSBvIGNvbXBvbmVudGUgY29tbyB0b2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZSA9IFsuLi50aGlzLnZhbHVlcygpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuZmluZEluZGV4KChzZWxlY3RlZEl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtID09PSBpdGVtO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoc3RvcmUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBzdG9yZS5tYXAoKGl0ZW0pID0+IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0pIDogc3RvcmU7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoaXRlbSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0gOiBpdGVtLmRhdGE7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyB2YWxvciBzZWxlY2lvbmFkbyBubyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gZXhlY3V0YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyBtw7psdGlwbGEsIHJlbW92ZSB0b2RvcyBvcyB2YWxvcmVzIHNlbGVjaW9uYWRvcyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gw7puaWNhLCBkZWZpbmUgbyB2YWxvciBjb21vIG51bG8gZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZSBtYXJjYSBvIGNvbXBvbmVudGUgY29tbyBcInRvY2Fkb1wiLlxuICAgICAqIEltcGVkZSBhIHByb3BhZ2HDp8OjbyBkbyBldmVudG8gZG8gbW91c2UuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkbyBtb3VzZSBxdWUgYWNpb25vdSBhIGxpbXBlemEgZGEgc2VsZcOnw6NvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gZmlsdHJvIGRvIGZvcm11bMOhcmlvLCByZXNldGFuZG8gbyBjYW1wbyAnZmlsdGVyJyBkbyBmb3JtdWzDoXJpbyBkZSBmaWx0cm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIHJlZGVmaW5lIG8gdmFsb3IgZG8gY2FtcG8gJ2ZpbHRlcicgcGFyYSBzZXUgZXN0YWRvIGluaWNpYWwsXG4gICAgICogcmVtb3ZlbmRvIHF1YWxxdWVyIHRleHRvIG91IHZhbG9yIHByZXZpYW1lbnRlIGluc2VyaWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8ucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEuXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBjYXNvIGVsZSBlc3RlamEgdmlzw612ZWwgYW8gcmVkaW1lbnNpb25hciBhIGphbmVsYS5cbiAgICAgKiBAcGFyYW0gXyBFdmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICovXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKF86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGNsaXF1ZSBubyBlbGVtZW50byBjb250YWluZXIgZGEgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBhbHRlcm5hIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZG8gY29tcG9uZW50ZSBzZWxlY3QgZSxcbiAgICAgKiBlbSBzZWd1aWRhLCBkZWZpbmUgbyBmb2NvIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBjb3JyZXNwb25kZW50ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db250YWluZXJEaXZDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBldmVudG9zIGRlIHRlY2xhZG8gcGFyYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBvcMOnw7VlcyBubyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbC5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IuXG4gICAgICogLSAnVGFiJzogU2VsZWNpb25hIGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBlIGZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnRW50ZXInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiAtICcgJzogKGJhcnJhIGRlIGVzcGHDp28pIFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiBQcmV2aW5lIG8gY29tcG9ydGFtZW50byBwYWRyw6NvIGRvIG5hdmVnYWRvciBxdWFuZG8gbmVjZXNzw6FyaW8gcGFyYSBnYXJhbnRpciBhIG5hdmVnYcOnw6NvIGFkZXF1YWRhIHBlbG8gdGVjbGFkby5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IF9zZWxlY3RPcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBhc3NvY2lhZG8gYSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBkbyB0aXBvIFQgcGFyYSBhIHF1YWwgbyByw7N0dWxvIGRldmUgc2VyIG9idGlkby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wdGlvbkxhYmVsKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyBkZSB0cmFja0J5IHV0aWxpemFkYSBlbSBkaXJldGl2YXMgKm5nRm9yIHBhcmEgb3RpbWl6YXIgYSByZW5kZXJpemHDp8OjbyBkZSBsaXN0YXMuXG4gICAgICogUmV0b3JuYSBvIGlkZW50aWZpY2Fkb3Igw7puaWNvIChgaWRgKSBkZSBjYWRhIGl0ZW0gZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE8gaXRlbSBhdHVhbCBkYSBsaXN0YSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcmV0dXJucyBPIGlkZW50aWZpY2Fkb3Igw7puaWNvIGRvIGl0ZW0gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0J5SWQoXzogbnVtYmVyLCBpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpY2Egc2UgYSBvcMOnw6NvIGZvcm5lY2lkYSBlc3TDoSBzZWxlY2lvbmFkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGludGVybmEgZG8gZHJvcGRvd24gYSBzZXIgdmVyaWZpY2FkYS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgc2UgYSBvcMOnw6NvIGVzdGl2ZXIgc2VsZWNpb25hZGEsIGNhc28gY29udHLDoXJpbyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy52YWx1ZXMoKS5maW5kKChvKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8gPT09IG9wdGlvbjtcbiAgICAgICAgICAgIH0pICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgc2VsZcOnw6NvIGRlIHRvZG9zIG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbywgc2VsZWNpb25hIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBxdWUgbsOjbyBzw6NvIGFncnVwYWRvcmVzXG4gICAgICogY2FzbyBuZW0gdG9kb3MgZXN0ZWphbSBzZWxlY2lvbmFkb3MsIG91IGxpbXBhIGEgc2VsZcOnw6NvIGNhc28gdG9kb3MgasOhIGVzdGVqYW0gc2VsZWNpb25hZG9zLlxuICAgICAqIEFww7NzIGEgYWx0ZXJhw6fDo28sIG5vdGlmaWNhIGEgbXVkYW7Dp2EgZGUgdmFsb3IuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQob3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGRlIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdXRpbGl6YSBhIHByb3ByaWVkYWRlIGRlZmluaWRhIHBvciBgb3B0aW9uTGFiZWxgIHBhcmEgZXh0cmFpciBvIHZhbG9yIGRvIHLDs3R1bG8gZGEgb3DDp8Ojby5cbiAgICAgKiBDYXNvIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RlamEgZGVmaW5pZG8sIHJldG9ybmEgYSByZXByZXNlbnRhw6fDo28gZW0gc3RyaW5nIGRhIHByw7NwcmlhIG9ww6fDo28uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9uIEEgb3DDp8OjbyBkYSBxdWFsIG8gcsOzdHVsbyBzZXLDoSBleHRyYcOtZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbltvcHRpb25MYWJlbF0pIDogU3RyaW5nKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBhcyBvcMOnw7VlcyBmb3JuZWNpZGFzIHPDo28gdsOhbGlkYXMuIENhc28gYXMgb3DDp8O1ZXMgc2VqYW0gb2JqZXRvcyxcbiAgICAgKiBnYXJhbnRlIHF1ZSBhIHByb3ByaWVkYWRlIGBvcHRpb25MYWJlbGAgZXN0ZWphIGRlZmluaWRhLCBsYW7Dp2FuZG8gdW0gZXJybyBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogU2UgbsOjbyBob3V2ZXIgb3DDp8O1ZXMsIGEgdmFsaWRhw6fDo28gw6kgaWdub3JhZGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgb3DDp8O1ZXMgZm9yZW0gb2JqZXRvcyBlIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RpdmVyIGRlZmluaWRvLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzT2JqZWN0T3B0aW9ucyA9IG9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb24gIT09IG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNPYmplY3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwib3B0aW9uTGFiZWxcIiBpbnB1dCBpcyByZXF1aXJlZCB3aGVuIG9wdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEVzdGUgbcOpdG9kbyBvY3VsdGEgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIGUgcmVkZWZpbmUgbyDDrW5kaWNlIGRvIGl0ZW0gZm9jYWRvIHBhcmEgLTEsXG4gICAgICogaW5kaWNhbmRvIHF1ZSBuZW5odW0gaXRlbSBlc3TDoSBhdHVhbG1lbnRlIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gdGltZXN0YW1wIGF0dWFsIGUgbm8gw61uZGljZSBkbyBpdGVtLiBDYXNvIGEgb3DDp8OjbyBzZWphIHVtIGdydXBvXG4gICAgICogKGRldGVjdGFkbyBwZWxhIHByZXNlbsOnYSBkZSB1bSBhcnJheSBgaXRlbXNgKSwgYWRpY2lvbmEgdGFtYsOpbSBhIHByb3ByaWVkYWRlIGBncm91cGVyOiB0cnVlYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgcG9zc2l2ZWxtZW50ZSBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLlxuICAgICAqIFBhcmEgY2FkYSBvcMOnw6NvIHF1ZSBwb3NzdWkgdW0gYWdydXBhZG9yIChgZ3JvdXBlcmApIGUgdW0gYXJyYXkgZGUgaXRlbnMgZW0gYGRhdGEuaXRlbXNgLFxuICAgICAqIGFkaWNpb25hIGEgb3DDp8OjbyBkbyBhZ3J1cGFkb3IgZSwgZW0gc2VndWlkYSwgYWRpY2lvbmEgY2FkYSBpdGVtIGRvIGdydXBvIGNvbW8gdW1hIG5vdmEgb3DDp8Ojb1xuICAgICAqIGluZGl2aWR1YWwsIGF0cmlidWluZG8gdW0gYGlkYCDDum5pY28gcGFyYSBjYWRhIGl0ZW0gZG8gZ3J1cG8uXG4gICAgICogQ2FzbyBhIG9ww6fDo28gbsOjbyBzZWphIHVtIGFncnVwYWRvciwgZWxhIMOpIGFkaWNpb25hZGEgZGlyZXRhbWVudGUgYW8gcmVzdWx0YWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24sIHBvZGVuZG8gY29udGVyIGFncnVwYWRvcmVzLlxuICAgICAqIEByZXR1cm5zIExpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLCBpbmNsdWluZG8gYWdydXBhZG9yZXMgZSBzZXVzIGl0ZW5zIGV4cGFuZGlkb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JvdXBlclRvRmxhdChvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSA9IFtdO1xuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSAob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcy5tYXAoKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtvcHRpb24uaWR9X2l0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5ncm91cEl0ZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbCBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIHF1ZSBzZWphbSBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCAmJiBvcHRpb25zW25leHRJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvciBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIGRvIHRpcG8gXCJncm91cGVyXCIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHByZXZJbmRleCA+PSAwICYmIG9wdGlvbnNbcHJldkluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBwcmV2SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBvcMOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEVzdGUgbcOpdG9kbyBvYnTDqW0gbyBJRCBkYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGEgcGFydGlyIGRhIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSB1bSBJRCB2w6FsaWRvIGZvciBlbmNvbnRyYWRvLCBidXNjYSBvIGVsZW1lbnRvIGNvcnJlc3BvbmRlbnRlIG5vIERPTSBlIHV0aWxpemFcbiAgICAgKiBgc2Nyb2xsSW50b1ZpZXdgIHBhcmEgcm9sYXIgYXTDqSBhIG9ww6fDo28sIGFsaW5oYW5kby1hIGFvIGJsb2NvIG1haXMgcHLDs3hpbW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZm9jbyBubyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8gYW8gYWJyaXIgbyBkcm9wZG93bi5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGZvY2EgbyBpdGVtIHNlbGVjaW9uYWRvLiBObyBtb2RvIG3Dumx0aXBsbywgZm9jYSBvIHByaW1laXJvIGl0ZW0gc2VsZWNpb25hZG8uXG4gICAgICogQXDDs3MgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheSwgcm9sYSBhIGxpc3RhIGF0w6kgbyBpdGVtIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGZpcnN0U2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNlbGVjdC1jb250YWluZXIgZ3JvdXAgZmxleCBoLVszNXB4XSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzNweF0gYm9yZGVyIG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnkgZm9jdXM6b3V0bGluZVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01JzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCc6ICFkaXNhYmxlZCgpLFxuICAgIH1cIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgW2F0dHIuYXJpYS1vd25zXT1cIidkcm9wZG93bi1jb250YWluZXItJyArIGNvbXBvbmVudElkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY29tcG9uZW50SWQgKyAnLWxhYmVsJ1wiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbj5cbiAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1ncm93IHNlbGVjdC1ub25lIHB4LTMgcHktWzdweF1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAnOiAhZGlzYWJsZWQoKSAmJiAhaXNDbGVhbigpLFxuICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTYwJzogIWRpc2FibGVkKCkgJiYgaXNDbGVhbigpLFxuICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICB7eyBwcmludCgpIHx8IHBsYWNlaG9sZGVyKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICBAaWYgKCFkaXNhYmxlZCgpICYmIHNob3dDbGVhcigpICYmICFpc0NsZWFuKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJteC0zXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyLWwgcHgtMyBncm91cC1ob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZ3JvdXAtZm9jdXM6Ym9yZGVyLXByaW1hcnlcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdib3JkZXItZ3JheXNjYWxlLTIwJzogZGlzYWJsZWQoKSwgJ2JvcmRlci1ncmF5c2NhbGUtMzAnOiAhZGlzYWJsZWQoKSB9XCJcbiAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cImZhc1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICAgICAnZmEtY2FyZXQtZG93bic6ICFzaG93T3B0aW9ucygpLFxuICAgICAgICAgICAgICAgICdmYS1jYXJldC11cCc6IHNob3dPcHRpb25zKCksXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICAoZGV0YWNoKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cIidkcm9wZG93bi1jb250YWluZXItJyArIGNvbXBvbmVudElkXCJcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1ib2R5LWNsYXNzIHotWzEwMDBdIHJvdW5kZWQtWzNweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3ctbWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdi5vZmZzZXRXaWR0aFwiXG4gICAgPlxuICAgICAgICBAaWYgKGZpbHRlcigpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMS41XCI+XG4gICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0QWxsQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtWzM1cHhdIGdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBncm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGdyb3cgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXlzY2FsZS0zMCBwbC0yLjUgcHItNyBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoIGFic29sdXRlIHJpZ2h0LTIuNSB0b3AtMi41IHRleHQtZ3JheXNjYWxlLTkwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gVmlydHVhbCBzY3JvbGwgLS0+XG4gICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgW2l0ZW1TaXplXT1cInZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtNTIgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrQnk6IHRyYWNrQnlJZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgIEBpZiAoIXZpcnR1YWxTY3JvbGwoKSB8fCBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tMyB0ZXh0LWdyYXlzY2FsZS02MFwiPnt7XG4gICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|
|
700
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0SCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7O0FBTzNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUE0Q0gsTUFBTSxPQUFPLGVBQWU7SUFD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Q2Q7U0FDSix5SkMxRkwsazFMQXFKQSw4SkQvRlEsWUFBWSw0SEFDWixtQkFBbUIsNDhCQUNuQixlQUFlLDRqQkFDZixxQkFBcUIsaU1BQ3JCLGlCQUFpQiwrSkFDakIsZUFBZSwyRkFDZixhQUFhOzs0RkFnQ1IsZUFBZTtrQkEzQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0Msc0JBQXNCLEVBQUUsZUFBZTt3QkFDdkMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsaURBQWlEO3dCQUNyRSw4QkFBOEIsRUFBRSxvRUFBb0U7d0JBQ3BHLG1CQUFtQixFQUFFLGtDQUFrQzt3QkFDdkQsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CLGFBYVU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgZWZmZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvY2hlY2tib3gnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NlbGVjdC1vcHRpb24vc2VsZWN0LW9wdGlvbi5jb21wb25lbnQnO1xuXG5pbnRlcmZhY2UgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB7XG4gICAgZGF0YTogVDtcbiAgICBpZDogc3RyaW5nO1xuICAgIGdyb3VwZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBzZWxlw6fDo28gZHJvcGRvd24gZ2Vuw6lyaWNvIGNvbSBzdXBvcnRlIGEgc2VsZcOnw6NvIHNpbXBsZXMgZSBtw7psdGlwbGEsXG4gKiBmaWx0cm8sIGFncnVwYW1lbnRvLCB2aXJ0dWFsIHNjcm9sbCBlIGFjZXNzaWJpbGlkYWRlIChBUklBIGNvbWJvYm94KS4gSW1wbGVtZW50YVxuICoge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gUmVhY3RpdmUgRm9ybXMgZSBUZW1wbGF0ZS1kcml2ZW4gRm9ybXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXNlbGVjdFxuICogICBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yaWFcIlxuICogICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bWEgY2F0ZWdvcmlhXCJcbiAqICAgW29wdGlvbnNdPVwiY2F0ZWdvcmlhc1wiXG4gKiAgIG9wdGlvbkxhYmVsPVwibm9tZVwiXG4gKiAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICogICBbZmlsdGVyXT1cInRydWVcIlxuICogICBbc2hvd0NsZWFyXT1cInRydWVcIiAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IElucHV0c1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ3Nob3dPcHRpb25zKCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnXCJsaXN0Ym94XCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICdzaG93T3B0aW9ucygpID8gY29tcG9uZW50SWQgKyBcIi1saXN0Ym94XCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF0nOiAnZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkT3B0aW9ucygpW2ZvY3VzZWRJbmRleCgpXT8uaWQgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ3BsYWNlaG9sZGVyKCkgfHwgXCJTZWxlY3Qgb3B0aW9uXCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCB7XG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAuc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gZXN0w6Egc2VsZWNpb25hZGEuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIG9ww6fDtWVzIHNpbXVsdMOibmVhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8Ojby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIGxhYmVsIGRlIGV4aWJpw6fDo28uICovXG4gICAgcHVibGljIG9wdGlvbkxhYmVsID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyB2YWxvciBhIHNlciBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIGJvdMOjbyBwYXJhIGxpbXBhciBhIHNlbGXDp8OjbyBhdHVhbC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB1bSBjYW1wbyBkZSBmaWx0cm8gdGV4dHVhbCBwYXJhIHBlc3F1aXNhIG5hcyBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSDDrWNvbmUgZGUgY2hlY2ttYXJrIGFvIGxhZG8gZGEgb3DDp8OjbyBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgY2hlY2ttYXJrID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZShzKSBkbyBvYmpldG8gdXNhZGEocykgcGFyYSBmaWx0cmFnZW0gdGV4dHVhbC4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLCB1c2EgYG9wdGlvbkxhYmVsYC4gKi9cbiAgICBwdWJsaWMgZmlsdGVyQnkgPSBpbnB1dDxrZXlvZiBUIHwgKGtleW9mIFQpW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGFncnVwYW1lbnRvIGRlIG9ww6fDtWVzLiBBcyBvcMOnw7VlcyBkZXZlbSBjb250ZXIgaXRlbnMgZmlsaG9zIGNvbmZvcm1lIGEgZXN0cnV0dXJhIGRlIGdydXBvIHN1cG9ydGFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZ3JvdXAgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHZpcnR1YWxpemHDp8OjbyBkYSBsaXN0YSBwYXJhIG1lbGhvciBwZXJmb3JtYW5jZSBjb20gZ3JhbmRlcyB2b2x1bWVzIGRlIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBBbHR1cmEgZml4YSBkZSBjYWRhIGl0ZW0gZGEgbGlzdGEgZW0gcGl4ZWxzLCBuZWNlc3PDoXJpYSBwYXJhIG8gY8OhbGN1bG8gZG8gdmlydHVhbCBzY3JvbGwuIEBkZWZhdWx0IDM3ICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGxJdGVtU2l6ZSA9IGlucHV0KDM3KTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTWVuc2FnZW0gZXhpYmlkYSBxdWFuZG8gbmVuaHVtYSBvcMOnw6NvIGNvcnJlc3BvbmRlIGFvIGZpbHRybyBhcGxpY2Fkby4gQGRlZmF1bHQgbnVsbCAqL1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgbyBlc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBtb2RlbChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRvIHBhaW5lbCBkZSBvcMOnw7VlcyB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93T3B0aW9ucyA9IG1vZGVsKGZhbHNlKTtcblxuICAgIHB1YmxpYyB2YWx1ZSA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHZhbHVlcyA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KFtdKTtcbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSBzaWduYWwoJycpO1xuICAgIHB1YmxpYyBmb2N1c2VkSW5kZXggPSBzaWduYWwoLTEpO1xuICAgIHByaXZhdGUgX3BlbmRpbmdWYWx1ZTogVCB8IFRbXSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYHNlbGVjdCR7U2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyAoZXhjbHVpbmRvIGFncnVwYWRvcmVzKSBlc3RpdmVyZW0gcHJlc2VudGVzXG4gICAgICogbmEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MsIGUgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGFsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnZhbHVlcygpLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IHJldCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKG9wdGlvbi5pZCkpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5kYXRhID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtXG4gICAgICAgICAgICAuZ2V0KCdmaWx0ZXInKSFcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVmZWl0byBwYXJhIHRlbnRhciBhcGxpY2FyIHZhbG9yIHBlbmRlbnRlIHF1YW5kbyBvcHRpb25zIG11ZGFyXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmxlbmd0aCAmJiB0aGlzLl9wZW5kaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVBlbmRpbmdWYWx1ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gdmFsb3Igc2VsZWNpb25hZG8gZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogQHBhcmFtIHZhbHVlIE8gdmFsb3IgYSBzZXIgZGVmaW5pZG8uIFBvZGUgc2VyIHVtIG9iamV0byBkbyB0aXBvIGBUYCwgdW0gYXJyYXkgZGUgYFRgIChxdWFuZG8gbcO6bHRpcGxhIHNlbGXDp8OjbyBlc3TDoSBoYWJpbGl0YWRhKSwgb3UgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBvIHZhbG9yIG7Do28gZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBkZXNhdGl2YWRvIGUgbyB2YWxvciBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBtYXBlaWEgbyhzKSB2YWxvcihlcykgZm9ybmVjaWRvKHMpIHBhcmEgYXMgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gY29tcG9uZW50ZSxcbiAgICAgKiBnYXJhbnRpbmRvIHF1ZSBhcGVuYXMgb3DDp8O1ZXMgdsOhbGlkYXMgc2VqYW0gc2VsZWNpb25hZGFzIGNvbmZvcm1lIG8gbW9kbyBkZSBzZWxlw6fDo28gKMO6bmljbyBvdSBtw7psdGlwbG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICAvLyBBcm1hemVuYSB2YWxvciBwZW5kZW50ZSBlIHRlbnRhIGFwbGljYXJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2FwcGx5UGVuZGluZ1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVudGEgYXBsaWNhciBvIHZhbG9yIHBlbmRlbnRlIChfcGVuZGluZ1ZhbHVlKSBhbyBlc3RhZG8gZG8gY29tcG9uZW50ZSxcbiAgICAgKiBtYXBlYW5kbyBwYXJhIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gY29uZm9ybWUgb3B0aW9ucyBkaXNwb27DrXZlaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXBwbHlQZW5kaW5nVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IHYpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmZpbmQoKG9wdCkgPT4gSlNPTi5zdHJpbmdpZnkob3B0LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2KSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigob3B0KTogb3B0IGlzIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gPT4gISFvcHQpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChtYXBwZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcHBlZDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uVmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgb3B0aW9uVmFsdWUgaW4gdmFsdWUgPyB2YWx1ZVtvcHRpb25WYWx1ZV0gOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBvcHRzLmZpbmQoKG9wdCkgPT4gb3B0LmRhdGFbb3B0aW9uVmFsdWVdID09PSBjb21wYXJlVmFsdWUpIHx8IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBvcHRzLmZpbmQoKG9wdCkgPT4gSlNPTi5zdHJpbmdpZnkob3B0LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChtYXBwZWQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSByZWNlYmUgbyBub3ZvIHZhbG9yIHNlbGVjaW9uYWRvIG91IG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogVCB8IFRbXSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvIChwZXJkZXIgbyBmb2NvKS5cbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGV4ZWN1dGFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciBtYXJjYWRvIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIHJlYWxpemEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBpbnZlcnRlIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzLlxuICAgICAqIEFvIGFicmlyLCBtb3ZlIG8gZm9jbyBwYXJhIG8gaXRlbSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3VsZE9wZW4gPSAhdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcblxuICAgICAgICBpZiAoc2hvdWxkT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHVtIGl0ZW0gbm8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogQHBhcmFtIGl0ZW0gTyBpdGVtIGEgc2VyIHNlbGVjaW9uYWRvIG91IGRlc21hcmNhZG8uXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBhIGZ1bsOnw6NvIHJldG9ybmEgaW1lZGlhdGFtZW50ZS5cbiAgICAgKiBObyBtb2RvIG3Dumx0aXBsbywgYWRpY2lvbmEgb3UgcmVtb3ZlIG8gaXRlbSBkYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGRlZmluZSBvIGl0ZW0gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogU2VtcHJlIG5vdGlmaWNhIGFzIG11ZGFuw6dhcyBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIHRvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0SXRlbShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gWy4uLnRoaXMudmFsdWVzKCldO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5maW5kSW5kZXgoKHNlbGVjdGVkSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGl0ZW07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IHN0b3JlLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhW29wdGlvblZhbHVlXSkgOiBzdG9yZTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gaXRlbS5kYXRhW29wdGlvblZhbHVlXSA6IGl0ZW0uZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyBleGVjdXRhIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIG3Dumx0aXBsYSwgcmVtb3ZlIHRvZG9zIG9zIHZhbG9yZXMgc2VsZWNpb25hZG9zIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyDDum5pY2EsIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsbyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIFwidG9jYWRvXCIuXG4gICAgICogSW1wZWRlIGEgcHJvcGFnYcOnw6NvIGRvIGV2ZW50byBkbyBtb3VzZS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRvIG1vdXNlIHF1ZSBhY2lvbm91IGEgbGltcGV6YSBkYSBzZWxlw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyBmaWx0cm8gZG8gZm9ybXVsw6FyaW8sIHJlc2V0YW5kbyBvIGNhbXBvICdmaWx0ZXInIGRvIGZvcm11bMOhcmlvIGRlIGZpbHRyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gcmVkZWZpbmUgbyB2YWxvciBkbyBjYW1wbyAnZmlsdGVyJyBwYXJhIHNldSBlc3RhZG8gaW5pY2lhbCxcbiAgICAgKiByZW1vdmVuZG8gcXVhbHF1ZXIgdGV4dG8gb3UgdmFsb3IgcHJldmlhbWVudGUgaW5zZXJpZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYS5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGNhc28gZWxlIGVzdGVqYSB2aXPDrXZlbCBhbyByZWRpbWVuc2lvbmFyIGEgamFuZWxhLlxuICAgICAqIEBwYXJhbSBfIEV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoXzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgY2xpcXVlIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBkYSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIGFsdGVybmEgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkbyBjb21wb25lbnRlIHNlbGVjdCBlLFxuICAgICAqIGVtIHNlZ3VpZGEsIGRlZmluZSBvIGZvY28gbm8gZWxlbWVudG8gY29udGFpbmVyIGNvcnJlc3BvbmRlbnRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbnRhaW5lckRpdkNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBwYXJhIG5hdmVnYcOnw6NvIGUgc2VsZcOnw6NvIGRlIG9ww6fDtWVzIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvci5cbiAgICAgKiAtICdUYWInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiAtICdFbnRlcic6IFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJyAnOiAoYmFycmEgZGUgZXNwYcOnbykgU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIFByZXZpbmUgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gbmF2ZWdhZG9yIHF1YW5kbyBuZWNlc3PDoXJpbyBwYXJhIGdhcmFudGlyIGEgbmF2ZWdhw6fDo28gYWRlcXVhZGEgcGVsbyB0ZWNsYWRvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX3NlbGVjdE9wdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGFzc29jaWFkbyBhIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGRvIHRpcG8gVCBwYXJhIGEgcXVhbCBvIHLDs3R1bG8gZGV2ZSBzZXIgb2J0aWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIGRlIHRyYWNrQnkgdXRpbGl6YWRhIGVtIGRpcmV0aXZhcyAqbmdGb3IgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3Rhcy5cbiAgICAgKiBSZXRvcm5hIG8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRlIGNhZGEgaXRlbSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gTyBpdGVtIGF0dWFsIGRhIGxpc3RhIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gZG8gaXRlbSBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzZSBhIG9ww6fDo28gZm9ybmVjaWRhIGVzdMOhIHNlbGVjaW9uYWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gaW50ZXJuYSBkbyBkcm9wZG93biBhIHNlciB2ZXJpZmljYWRhLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBhIG9ww6fDo28gZXN0aXZlciBzZWxlY2lvbmFkYSwgY2FzbyBjb250csOhcmlvIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnZhbHVlcygpLmZpbmQoKG8pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbyA9PT0gb3B0aW9uO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBzZWxlw6fDo28gZGUgdG9kb3Mgb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCBzZWxlY2lvbmEgdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIHF1ZSBuw6NvIHPDo28gYWdydXBhZG9yZXNcbiAgICAgKiBjYXNvIG5lbSB0b2RvcyBlc3RlamFtIHNlbGVjaW9uYWRvcywgb3UgbGltcGEgYSBzZWxlw6fDo28gY2FzbyB0b2RvcyBqw6EgZXN0ZWphbSBzZWxlY2lvbmFkb3MuXG4gICAgICogQXDDs3MgYSBhbHRlcmHDp8Ojbywgbm90aWZpY2EgYSBtdWRhbsOnYSBkZSB2YWxvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgZGUgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIGEgcHJvcHJpZWRhZGUgZGVmaW5pZGEgcG9yIGBvcHRpb25MYWJlbGAgcGFyYSBleHRyYWlyIG8gdmFsb3IgZG8gcsOzdHVsbyBkYSBvcMOnw6NvLlxuICAgICAqIENhc28gYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGVqYSBkZWZpbmlkbywgcmV0b3JuYSBhIHJlcHJlc2VudGHDp8OjbyBlbSBzdHJpbmcgZGEgcHLDs3ByaWEgb3DDp8Ojby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb24gQSBvcMOnw6NvIGRhIHF1YWwgbyByw7N0dWxvIHNlcsOhIGV4dHJhw61kby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuICAgICAgICByZXR1cm4gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIGFzIG9ww6fDtWVzIGZvcm5lY2lkYXMgc8OjbyB2w6FsaWRhcy4gQ2FzbyBhcyBvcMOnw7VlcyBzZWphbSBvYmpldG9zLFxuICAgICAqIGdhcmFudGUgcXVlIGEgcHJvcHJpZWRhZGUgYG9wdGlvbkxhYmVsYCBlc3RlamEgZGVmaW5pZGEsIGxhbsOnYW5kbyB1bSBlcnJvIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBTZSBuw6NvIGhvdXZlciBvcMOnw7VlcywgYSB2YWxpZGHDp8OjbyDDqSBpZ25vcmFkYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTZSBhcyBvcMOnw7VlcyBmb3JlbSBvYmpldG9zIGUgYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGl2ZXIgZGVmaW5pZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNPYmplY3RPcHRpb25zID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc09iamVjdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJvcHRpb25MYWJlbFwiIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gb3B0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9jdWx0YSBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgZSByZWRlZmluZSBvIMOtbmRpY2UgZG8gaXRlbSBmb2NhZG8gcGFyYSAtMSxcbiAgICAgKiBpbmRpY2FuZG8gcXVlIG5lbmh1bSBpdGVtIGVzdMOhIGF0dWFsbWVudGUgZm9jYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBQYXJhIGNhZGEgaXRlbSBubyBhcnJheSBkZSBvcMOnw7VlcywgZ2VyYSB1bSBvYmpldG8gYEludGVybmFsRHJvcGRvd25PcHRpb25gIGNvbnRlbmRvIG8gZGFkbyBvcmlnaW5hbFxuICAgICAqIGUgdW0gY2FtcG8gYGlkYCDDum5pY28gYmFzZWFkbyBubyB0aW1lc3RhbXAgYXR1YWwgZSBubyDDrW5kaWNlIGRvIGl0ZW0uIENhc28gYSBvcMOnw6NvIHNlamEgdW0gZ3J1cG9cbiAgICAgKiAoZGV0ZWN0YWRvIHBlbGEgcHJlc2Vuw6dhIGRlIHVtIGFycmF5IGBpdGVtc2ApLCBhZGljaW9uYSB0YW1iw6ltIGEgcHJvcHJpZWRhZGUgYGdyb3VwZXI6IHRydWVgLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgb3DDp8O1ZXMgZG8gdGlwbyBgVGAgYSBzZXJlbSBwcm9jZXNzYWRhcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBvYmpldG9zIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YCBjb20gaWRlbnRpZmljYWRvcmVzIMO6bmljb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb09wdGlvbnMob3B0aW9uczogVFtdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKCkgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogYGlkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICBpZDogYGlkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRlIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBwb3NzaXZlbG1lbnRlIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMuXG4gICAgICogUGFyYSBjYWRhIG9ww6fDo28gcXVlIHBvc3N1aSB1bSBhZ3J1cGFkb3IgKGBncm91cGVyYCkgZSB1bSBhcnJheSBkZSBpdGVucyBlbSBgZGF0YS5pdGVtc2AsXG4gICAgICogYWRpY2lvbmEgYSBvcMOnw6NvIGRvIGFncnVwYWRvciBlLCBlbSBzZWd1aWRhLCBhZGljaW9uYSBjYWRhIGl0ZW0gZG8gZ3J1cG8gY29tbyB1bWEgbm92YSBvcMOnw6NvXG4gICAgICogaW5kaXZpZHVhbCwgYXRyaWJ1aW5kbyB1bSBgaWRgIMO6bmljbyBwYXJhIGNhZGEgaXRlbSBkbyBncnVwby5cbiAgICAgKiBDYXNvIGEgb3DDp8OjbyBuw6NvIHNlamEgdW0gYWdydXBhZG9yLCBlbGEgw6kgYWRpY2lvbmFkYSBkaXJldGFtZW50ZSBhbyByZXN1bHRhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93biwgcG9kZW5kbyBjb250ZXIgYWdydXBhZG9yZXMuXG4gICAgICogQHJldHVybnMgTGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMsIGluY2x1aW5kbyBhZ3J1cGFkb3JlcyBlIHNldXMgaXRlbnMgZXhwYW5kaWRvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9ncm91cGVyVG9GbGF0KG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdID0gW107XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlciAmJiBBcnJheS5pc0FycmF5KChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zLm1hcCgoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke29wdGlvbi5pZH1faXRlbV8ke2luZGV4fWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmdyb3VwSXRlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgcXVlIHNlamFtIGFncnVwYWRvcmVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgd2hpbGUgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoICYmIG9wdGlvbnNbbmV4dEluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgZG8gdGlwbyBcImdyb3VwZXJcIi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcblxuICAgICAgICB3aGlsZSAocHJldkluZGV4ID49IDAgJiYgb3B0aW9uc1twcmV2SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIHByZXZJbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm9sYSBhIGxpc3RhIGRlIG9ww6fDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBlc3RlamEgdmlzw612ZWwuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9idMOpbSBvIElEIGRhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgYSBwYXJ0aXIgZGEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFNlIHVtIElEIHbDoWxpZG8gZm9yIGVuY29udHJhZG8sIGJ1c2NhIG8gZWxlbWVudG8gY29ycmVzcG9uZGVudGUgbm8gRE9NIGUgdXRpbGl6YVxuICAgICAqIGBzY3JvbGxJbnRvVmlld2AgcGFyYSByb2xhciBhdMOpIGEgb3DDp8OjbywgYWxpbmhhbmRvLWEgYW8gYmxvY28gbWFpcyBwcsOzeGltby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpW3RoaXMuZm9jdXNlZEluZGV4KCldPy5pZDtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgZWw/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBmb2NvIG5vIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkbyBhbyBhYnJpciBvIGRyb3Bkb3duLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZm9jYSBvIGl0ZW0gc2VsZWNpb25hZG8uIE5vIG1vZG8gbcO6bHRpcGxvLCBmb2NhIG8gcHJpbWVpcm8gaXRlbSBzZWxlY2lvbmFkby5cbiAgICAgKiBBcMOzcyByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LCByb2xhIGEgbGlzdGEgYXTDqSBvIGl0ZW0gZm9jYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgICAgIGxldCBzZWxlY3RlZEluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZCA9IHRoaXMudmFsdWVzKClbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3RTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gZmlyc3RTZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gc2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHNlbGVjdGVkSW5kZXgpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lciBncm91cCBmbGV4IGgtWzM1cHhdIHctZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1bM3B4XSBib3JkZXIgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeSBmb2N1czpvdXRsaW5lXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1ub25lIGJvcmRlci1ncmF5c2NhbGUtMjAgYmctZ3JheXNjYWxlLTUnOiBkaXNhYmxlZCgpLFxuICAgICAgICAncG9pbnRlci1ldmVudHMtYXV0byBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wJzogIWRpc2FibGVkKCksXG4gICAgfVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dPcHRpb25zKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwiJ2Ryb3Bkb3duLWNvbnRhaW5lci0nICsgY29tcG9uZW50SWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJjb21wb25lbnRJZCArICctbGFiZWwnXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIChjbGljayk9XCJvbkNvbnRhaW5lckRpdkNsaWNrKClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgc2VsZWN0LW5vbmUgcHgtMyBweS1bN3B4XVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpICYmICFpc0NsZWFuKCksXG4gICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAnOiAhZGlzYWJsZWQoKSAmJiBpc0NsZWFuKCksXG4gICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZCgpLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIHt7IHByaW50KCkgfHwgcGxhY2Vob2xkZXIoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAoIWRpc2FibGVkKCkgJiYgc2hvd0NsZWFyKCkgJiYgIWlzQ2xlYW4oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm14LTNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItbCBweC0zIGdyb3VwLWhvdmVyOmJnLWdyYXlzY2FsZS0xMCBncm91cC1mb2N1czpib3JkZXItcHJpbWFyeVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2JvcmRlci1ncmF5c2NhbGUtMjAnOiBkaXNhYmxlZCgpLCAnYm9yZGVyLWdyYXlzY2FsZS0zMCc6ICFkaXNhYmxlZCgpIH1cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICdmYS1jYXJldC1kb3duJzogIXNob3dPcHRpb25zKCksXG4gICAgICAgICAgICAgICAgJ2ZhLWNhcmV0LXVwJzogc2hvd09wdGlvbnMoKSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChkZXRhY2gpPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBbaWRdPVwiJ2Ryb3Bkb3duLWNvbnRhaW5lci0nICsgY29tcG9uZW50SWRcIlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWJvZHktY2xhc3Mgei1bMTAwMF0gcm91bmRlZC1bM3B4XSBiZy1ncmF5c2NhbGUtMCBweS0xIHNoYWRvdy1tZFwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29udGFpbmVyRGl2Lm9mZnNldFdpZHRoXCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3MtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC1bMzVweF0gZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZ3JvdyByb3VuZGVkLVszcHhdIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHBsLTIuNSBwci03IG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIHNjcm9sbCAtLT5cbiAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0zIHRleHQtZ3JheXNjYWxlLTYwXCI+e3tcbiAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
|
|
@@ -402,11 +402,11 @@ class KanbanComponent {
|
|
|
402
402
|
this.itemFooterTemplate = this.getItemFooterTemplate();
|
|
403
403
|
}
|
|
404
404
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KanbanComponent, deps: [{ token: KanbanEventService }], target: i0.ɵɵFactoryTarget.Component });
|
|
405
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: KanbanComponent, selector: "s-kanban", inputs: { data: "data", showItemCheckboxes: "showItemCheckboxes", showColumnCheckboxes: "showColumnCheckboxes" }, outputs: { itemsMoved: "itemsMoved", dataUpdated: "dataUpdated", itemsSelected: "itemsSelected" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], ngImport: i0, template: "<div class=\"kanban\">\n
|
|
405
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: KanbanComponent, selector: "s-kanban", inputs: { data: "data", showItemCheckboxes: "showItemCheckboxes", showColumnCheckboxes: "showColumnCheckboxes" }, outputs: { itemsMoved: "itemsMoved", dataUpdated: "dataUpdated", itemsSelected: "itemsSelected" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], ngImport: i0, template: "<div class=\"kanban\">\n <s-kanban-column\n *ngFor=\"let column of data.columns\"\n [data]=\"column\"\n [showCheckbox]=\"showColumnCheckboxes\"\n [headerTemplate]=\"columnHeaderTemplate\"\n >\n <div\n [id]=\"column.id + ''\"\n style=\"height: 100%; width: 100%\"\n cdkDropList\n #dynamicList=\"cdkDropList\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"getLinkedColumns(column)\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @if (column.items.length === 0) {\n @if (!columnEmptyMessageTemplate) {\n <div class=\"empty-message\">\n <p class=\"text\">\n <span class=\"fas fa-clock\"></span> \n <span>{{\n 'platform.angular_components.count_items_in_target'\n | translate: { count: column.items.length, target: column.title }\n }}</span>\n </p>\n </div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"columnEmptyMessageTemplate; context: { $implicit: column }\"\n ></ng-container>\n }\n }\n\n <div\n *ngFor=\"let item of column.items\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"item.disabled || item.frozen\"\n (cdkDragStarted)=\"dragStarted()\"\n (cdkDragReleased)=\"dragReleased()\"\n (click)=\"selectItem($event, item, column)\"\n >\n <ng-container *ngTemplateOutlet=\"itemTemplate\"></ng-container>\n\n <ng-container *cdkDragPreview>\n @if (selectedItems.size > 1) {\n <s-kanban-item-dragging [quantityItems]=\"selectedItems.size\"></s-kanban-item-dragging>\n } @else {\n <div class=\"max-w-96\">\n <ng-container *ngTemplateOutlet=\"itemTemplate\"></ng-container>\n </div>\n }\n </ng-container>\n\n <ng-template #itemTemplate>\n <s-kanban-item\n [item]=\"item\"\n [selected]=\"selectedItems.has(item)\"\n [showCheckbox]=\"showItemCheckboxes\"\n [headerTemplate]=\"itemHeaderTemplate\"\n [bodyTemplate]=\"itemBodyTemplate\"\n [footerTemplate]=\"itemFooterTemplate\"\n >\n </s-kanban-item>\n </ng-template>\n\n <div *cdkDragPlaceholder>\n <div class=\"placeholder\">\n <div class=\"placeholder-line\"></div>\n </div>\n </div>\n </div>\n </div>\n </s-kanban-column>\n</div>\n\n", styles: [".kanban{display:flex;gap:16px;overflow:auto;width:100%}.kanban .empty-message{display:flex;justify-content:center;margin:16px}.kanban .empty-message .text{overflow:hidden;text-align:center;text-overflow:ellipsis;width:100%;white-space:nowrap}@media screen and (max-width: 600px){.kanban{flex-direction:column}}s-kanban-column{display:flex;flex-grow:1;min-width:292px}.placeholder{display:flex;justify-content:center}.placeholder .placeholder-line{background-color:#a5a5b2;height:1px;margin:6px 0;width:50%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3$2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i3$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: KanbanItemComponent, selector: "s-kanban-item", inputs: ["item", "selected", "showCheckbox", "headerTemplate", "bodyTemplate", "footerTemplate"] }, { kind: "component", type: KanbanColumnComponent, selector: "s-kanban-column", inputs: ["data", "showCheckbox", "headerTemplate"] }, { kind: "component", type: KanbanItemDraggingComponent, selector: "s-kanban-item-dragging", inputs: ["quantityItems"] }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }] });
|
|
406
406
|
}
|
|
407
407
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KanbanComponent, decorators: [{
|
|
408
408
|
type: Component,
|
|
409
|
-
args: [{ selector: 's-kanban', template: "<div class=\"kanban\">\n
|
|
409
|
+
args: [{ selector: 's-kanban', template: "<div class=\"kanban\">\n <s-kanban-column\n *ngFor=\"let column of data.columns\"\n [data]=\"column\"\n [showCheckbox]=\"showColumnCheckboxes\"\n [headerTemplate]=\"columnHeaderTemplate\"\n >\n <div\n [id]=\"column.id + ''\"\n style=\"height: 100%; width: 100%\"\n cdkDropList\n #dynamicList=\"cdkDropList\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"getLinkedColumns(column)\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @if (column.items.length === 0) {\n @if (!columnEmptyMessageTemplate) {\n <div class=\"empty-message\">\n <p class=\"text\">\n <span class=\"fas fa-clock\"></span> \n <span>{{\n 'platform.angular_components.count_items_in_target'\n | translate: { count: column.items.length, target: column.title }\n }}</span>\n </p>\n </div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"columnEmptyMessageTemplate; context: { $implicit: column }\"\n ></ng-container>\n }\n }\n\n <div\n *ngFor=\"let item of column.items\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"item.disabled || item.frozen\"\n (cdkDragStarted)=\"dragStarted()\"\n (cdkDragReleased)=\"dragReleased()\"\n (click)=\"selectItem($event, item, column)\"\n >\n <ng-container *ngTemplateOutlet=\"itemTemplate\"></ng-container>\n\n <ng-container *cdkDragPreview>\n @if (selectedItems.size > 1) {\n <s-kanban-item-dragging [quantityItems]=\"selectedItems.size\"></s-kanban-item-dragging>\n } @else {\n <div class=\"max-w-96\">\n <ng-container *ngTemplateOutlet=\"itemTemplate\"></ng-container>\n </div>\n }\n </ng-container>\n\n <ng-template #itemTemplate>\n <s-kanban-item\n [item]=\"item\"\n [selected]=\"selectedItems.has(item)\"\n [showCheckbox]=\"showItemCheckboxes\"\n [headerTemplate]=\"itemHeaderTemplate\"\n [bodyTemplate]=\"itemBodyTemplate\"\n [footerTemplate]=\"itemFooterTemplate\"\n >\n </s-kanban-item>\n </ng-template>\n\n <div *cdkDragPlaceholder>\n <div class=\"placeholder\">\n <div class=\"placeholder-line\"></div>\n </div>\n </div>\n </div>\n </div>\n </s-kanban-column>\n</div>\n\n", styles: [".kanban{display:flex;gap:16px;overflow:auto;width:100%}.kanban .empty-message{display:flex;justify-content:center;margin:16px}.kanban .empty-message .text{overflow:hidden;text-align:center;text-overflow:ellipsis;width:100%;white-space:nowrap}@media screen and (max-width: 600px){.kanban{flex-direction:column}}s-kanban-column{display:flex;flex-grow:1;min-width:292px}.placeholder{display:flex;justify-content:center}.placeholder .placeholder-line{background-color:#a5a5b2;height:1px;margin:6px 0;width:50%}\n"] }]
|
|
410
410
|
}], ctorParameters: () => [{ type: KanbanEventService }], propDecorators: { data: [{
|
|
411
411
|
type: Input,
|
|
412
412
|
args: [{ required: true }]
|