@seniorsistemas/angular-components 19.10.0-develop-ef29acb7 → 19.10.1-develop-5b6fdad4
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/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.d.ts +6 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +3 -3
- package/esm2022/lib/locale/fallback.mjs +2 -1
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +6 -4
- package/esm2022/select/lib/select/select.component.mjs +41 -8
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +45 -10
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +1 -0
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/package.json +1 -1
- package/select/README.md +18 -0
- package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
- package/select/lib/select/select.component.d.ts +17 -2
|
@@ -65,6 +65,14 @@ export class SelectComponent {
|
|
|
65
65
|
emptyMessage = input(null);
|
|
66
66
|
/** @description Controla o estado desabilitado do componente via two-way binding. @default false */
|
|
67
67
|
disabled = model(false);
|
|
68
|
+
/**
|
|
69
|
+
* @description Habilita o modo somente leitura. O usuário continua podendo abrir e fechar a
|
|
70
|
+
* lista (por mouse ou teclado) e ver quais opções estão selecionadas, mas não consegue
|
|
71
|
+
* selecionar, desmarcar nem limpar opções. Diferente de `disabled`, o campo permanece
|
|
72
|
+
* focável e é anunciado por leitores de tela como não editável (`aria-readonly`). Quando
|
|
73
|
+
* `disabled` também está ativo, prevalece o comportamento de `disabled`. @default false
|
|
74
|
+
*/
|
|
75
|
+
readonly = input(false);
|
|
68
76
|
/** @description Controla a visibilidade do painel de opções via two-way binding. @default false */
|
|
69
77
|
showOptions = model(false);
|
|
70
78
|
/** @description Label de acessibilidade do componente. @default '' */
|
|
@@ -425,7 +433,9 @@ export class SelectComponent {
|
|
|
425
433
|
// caso contrário, vai direto para o input de filtro.
|
|
426
434
|
// O foco é movido após a renderização do overlay.
|
|
427
435
|
afterNextRender(() => {
|
|
428
|
-
|
|
436
|
+
// Em somente leitura o checkbox "Selecionar todos" fica desabilitado
|
|
437
|
+
// (não focável), então o foco inicial vai direto pro input de filtro.
|
|
438
|
+
if (this.multiple() && !this.readonly()) {
|
|
429
439
|
const checkboxHost = this._selectAllCheckbox()?.nativeElement;
|
|
430
440
|
const focusable = checkboxHost?.querySelector('[tabindex]');
|
|
431
441
|
focusable?.focus();
|
|
@@ -444,6 +454,7 @@ export class SelectComponent {
|
|
|
444
454
|
* Seleciona um item no componente de seleção.
|
|
445
455
|
* @param item O item a ser selecionado ou desmarcado.
|
|
446
456
|
* Se o componente estiver desabilitado, a função retorna imediatamente.
|
|
457
|
+
* Em modo somente leitura, não altera o valor e apenas anuncia que o campo não é editável.
|
|
447
458
|
* No modo múltiplo, adiciona ou remove o item da lista de valores selecionados.
|
|
448
459
|
* No modo simples, define o item como valor selecionado e fecha o dropdown.
|
|
449
460
|
* Sempre notifica as mudanças e marca o componente como tocado.
|
|
@@ -452,6 +463,10 @@ export class SelectComponent {
|
|
|
452
463
|
if (this.disabled()) {
|
|
453
464
|
return;
|
|
454
465
|
}
|
|
466
|
+
if (this.readonly()) {
|
|
467
|
+
this._announceReadonly();
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
455
470
|
const optionValue = this.optionValue();
|
|
456
471
|
if (this.multiple()) {
|
|
457
472
|
const store = [...this.values()];
|
|
@@ -490,6 +505,14 @@ export class SelectComponent {
|
|
|
490
505
|
}
|
|
491
506
|
this._onTouched();
|
|
492
507
|
}
|
|
508
|
+
/**
|
|
509
|
+
* Anuncia via `LiveAnnouncer` que o campo é somente leitura. Chamado quando o usuário tenta
|
|
510
|
+
* alterar a seleção — sem isso, Enter/Espaço numa opção seria um no-op silencioso para quem
|
|
511
|
+
* usa leitor de tela.
|
|
512
|
+
*/
|
|
513
|
+
_announceReadonly() {
|
|
514
|
+
void this._liveAnnouncer.announce(this._translateService.instant('platform.angular_components.select_readonly_cannot_change'), 'polite');
|
|
515
|
+
}
|
|
493
516
|
/**
|
|
494
517
|
* Anuncia via `LiveAnnouncer` a opção selecionada/desmarcada. Necessário porque, na prática,
|
|
495
518
|
* nem todo navegador/leitor de tela anuncia sozinho a mudança de `aria-selected` da opção
|
|
@@ -505,7 +528,7 @@ export class SelectComponent {
|
|
|
505
528
|
}
|
|
506
529
|
/**
|
|
507
530
|
* Limpa o valor selecionado no componente select.
|
|
508
|
-
* Se o componente estiver desabilitado, não executa nenhuma ação.
|
|
531
|
+
* Se o componente estiver desabilitado ou somente leitura, não executa nenhuma ação.
|
|
509
532
|
* Para seleção múltipla, remove todos os valores selecionados e notifica a alteração.
|
|
510
533
|
* Para seleção única, define o valor como nulo e notifica a alteração.
|
|
511
534
|
* Fecha o dropdown e marca o componente como "tocado".
|
|
@@ -513,7 +536,7 @@ export class SelectComponent {
|
|
|
513
536
|
* @param event Evento do mouse que acionou a limpeza da seleção.
|
|
514
537
|
*/
|
|
515
538
|
clear(event) {
|
|
516
|
-
if (this.disabled()) {
|
|
539
|
+
if (this.disabled() || this.readonly()) {
|
|
517
540
|
return;
|
|
518
541
|
}
|
|
519
542
|
if (this.multiple()) {
|
|
@@ -788,6 +811,12 @@ export class SelectComponent {
|
|
|
788
811
|
* @returns `true` se a opção estiver selecionada, caso contrário `false`.
|
|
789
812
|
*/
|
|
790
813
|
isOptionSelected(option) {
|
|
814
|
+
// No modo simples a seleção fica em `value()`; `values()` só é usado no modo múltiplo.
|
|
815
|
+
// Sem isso, a opção escolhida nunca aparecia marcada ao reabrir a lista (o que importa
|
|
816
|
+
// principalmente no modo somente leitura, cujo objetivo é consultar o que está selecionado).
|
|
817
|
+
if (!this.multiple()) {
|
|
818
|
+
return this.value()?.id === option.id;
|
|
819
|
+
}
|
|
791
820
|
return (this.values().find((o) => {
|
|
792
821
|
return o === option;
|
|
793
822
|
}) !== undefined);
|
|
@@ -799,7 +828,11 @@ export class SelectComponent {
|
|
|
799
828
|
* Após a alteração, notifica a mudança de valor.
|
|
800
829
|
*/
|
|
801
830
|
toggleSelectAll() {
|
|
802
|
-
if (!this.multiple()) {
|
|
831
|
+
if (!this.multiple() || this.disabled()) {
|
|
832
|
+
return;
|
|
833
|
+
}
|
|
834
|
+
if (this.readonly()) {
|
|
835
|
+
this._announceReadonly();
|
|
803
836
|
return;
|
|
804
837
|
}
|
|
805
838
|
const options = this.filteredOptions().filter((option) => !option.grouper);
|
|
@@ -1071,13 +1104,13 @@ export class SelectComponent {
|
|
|
1071
1104
|
}
|
|
1072
1105
|
}
|
|
1073
1106
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1074
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectComponent, isStandalone: true, selector: "s-select", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, checkIconClass: { classPropertyName: "checkIconClass", publicName: "checkIconClass", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showOptions: { classPropertyName: "showOptions", publicName: "showOptions", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", showOptions: "showOptionsChange" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, providers: [
|
|
1107
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectComponent, isStandalone: true, selector: "s-select", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, checkIconClass: { classPropertyName: "checkIconClass", publicName: "checkIconClass", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, showOptions: { classPropertyName: "showOptions", publicName: "showOptions", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", showOptions: "showOptionsChange" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, providers: [
|
|
1075
1108
|
{
|
|
1076
1109
|
provide: NG_VALUE_ACCESSOR,
|
|
1077
1110
|
useExisting: forwardRef(() => SelectComponent),
|
|
1078
1111
|
multi: true,
|
|
1079
1112
|
},
|
|
1080
|
-
], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }, { propertyName: "_filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "_selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l group-hover:bg-grayscale-5\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\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)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (attach)=\"_syncPanelWidth()\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"panelWidth()\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\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 [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></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 role=\"presentation\"\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 [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\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 [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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 .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "isSelected", "checkIconClass", "groupAnnouncement", "posinset", "setsize"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], animations: [
|
|
1113
|
+
], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }, { propertyName: "_filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "_selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled() || readonly()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !readonly()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly() && !disabled() ? true : null\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && !readonly() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l\"\n [class.group-hover:bg-grayscale-5]=\"!readonly()\"\n [class.border-grayscale-20]=\"disabled() || readonly()\"\n [class.border-grayscale-30]=\"!disabled() && !readonly()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\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)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (attach)=\"_syncPanelWidth()\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"panelWidth()\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [attr.aria-readonly]=\"readonly() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\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 [disabled]=\"readonly()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></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 role=\"presentation\"\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 [readonly]=\"readonly()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\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 [readonly]=\"readonly()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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 .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "readonly", "isSelected", "checkIconClass", "groupAnnouncement", "posinset", "setsize"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], animations: [
|
|
1081
1114
|
trigger('visibilityChanged', [
|
|
1082
1115
|
state('void', style({ opacity: 0, transform: 'scale(0.95)' })),
|
|
1083
1116
|
transition(':enter', [
|
|
@@ -1116,6 +1149,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1116
1149
|
animate('500ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'scale(0.95)' })),
|
|
1117
1150
|
]),
|
|
1118
1151
|
]),
|
|
1119
|
-
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l
|
|
1152
|
+
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled() || readonly()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !readonly()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly() && !disabled() ? true : null\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && !readonly() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l\"\n [class.group-hover:bg-grayscale-5]=\"!readonly()\"\n [class.border-grayscale-20]=\"disabled() || readonly()\"\n [class.border-grayscale-30]=\"!disabled() && !readonly()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\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)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (attach)=\"_syncPanelWidth()\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"panelWidth()\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [attr.aria-readonly]=\"readonly() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\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 [disabled]=\"readonly()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></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 role=\"presentation\"\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 [readonly]=\"readonly()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\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 [readonly]=\"readonly()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\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 .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"] }]
|
|
1120
1153
|
}], ctorParameters: () => [] });
|
|
1121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFFSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUVOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FB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LEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDOzZCQUM1RixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2pCLE9BQU8sQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDOzZCQUNqRyxDQUFDO3lCQUNMLENBQUM7cUJBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaXZlQW5ub3VuY2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIEluamVjdG9yLFxuICAgIG1vZGVsLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIHNpZ25hbCxcbiAgICBTaWduYWwsXG4gICAgdmlld0NoaWxkLFxuICAgIGVmZmVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3Qtb3B0aW9uL3NlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5pbnRlcmZhY2UgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB7XG4gICAgZGF0YTogVDtcbiAgICBpZDogc3RyaW5nO1xuICAgIGdyb3VwZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBzZWxlw6fDo28gZHJvcGRvd24gZ2Vuw6lyaWNvIGNvbSBzdXBvcnRlIGEgc2VsZcOnw6NvIHNpbXBsZXMgZSBtw7psdGlwbGEsXG4gKiBmaWx0cm8sIGFncnVwYW1lbnRvLCB2aXJ0dWFsIHNjcm9sbCBlIGFjZXNzaWJpbGlkYWRlIChBUklBIGNvbWJvYm94KS4gSW1wbGVtZW50YVxuICoge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gUmVhY3RpdmUgRm9ybXMgZSBUZW1wbGF0ZS1kcml2ZW4gRm9ybXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXNlbGVjdFxuICogICBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yaWFcIlxuICogICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bWEgY2F0ZWdvcmlhXCJcbiAqICAgW29wdGlvbnNdPVwiY2F0ZWdvcmlhc1wiXG4gKiAgIG9wdGlvbkxhYmVsPVwibm9tZVwiXG4gKiAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICogICBbZmlsdGVyXT1cInRydWVcIlxuICogICBbc2hvd0NsZWFyXT1cInRydWVcIiAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IElucHV0c1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgICAgICBTZWxlY3RPcHRpb25Db21wb25lbnQsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE92ZXJsYXlNb2R1bGUsXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoJGV2ZW50KScsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCAuc2VsZWN0LWNvbnRhaW5lcjpub3QoOmZvY3VzLXdpdGhpbikge1xuICAgICAgICAgICAgICAgICYsXG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcigndmlzaWJpbGl0eUNoYW5nZWQnLCBbXG4gICAgICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCc1MDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOTUpJyB9KSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgXSksXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gZXN0w6Egc2VsZWNpb25hZGEuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIG9ww6fDtWVzIHNpbXVsdMOibmVhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8Ojby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIGxhYmVsIGRlIGV4aWJpw6fDo28uICovXG4gICAgcHVibGljIG9wdGlvbkxhYmVsID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyB2YWxvciBhIHNlciBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIGJvdMOjbyBwYXJhIGxpbXBhciBhIHNlbGXDp8OjbyBhdHVhbC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB1bSBjYW1wbyBkZSBmaWx0cm8gdGV4dHVhbCBwYXJhIHBlc3F1aXNhIG5hcyBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSDDrWNvbmUgZGUgY2hlY2ttYXJrIGFvIGxhZG8gZGEgb3DDp8OjbyBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgY2hlY2ttYXJrID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDbGFzc2UgZG8gw61jb25lIGRlIGNoZWNrbWFyayBleGliaWRvIHF1YW5kbyBgY2hlY2ttYXJrYCBlc3TDoSBhdGl2by4gQGRlZmF1bHQgJ2ZhciBmYS1jaGVjaycgKi9cbiAgICBwdWJsaWMgY2hlY2tJY29uQ2xhc3MgPSBpbnB1dCgnZmFyIGZhLWNoZWNrJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlKHMpIGRvIG9iamV0byB1c2FkYShzKSBwYXJhIGZpbHRyYWdlbSB0ZXh0dWFsLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sIHVzYSBgb3B0aW9uTGFiZWxgLiAqL1xuICAgIHB1YmxpYyBmaWx0ZXJCeSA9IGlucHV0PGtleW9mIFQgfCAoa2V5b2YgVClbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYWdydXBhbWVudG8gZGUgb3DDp8O1ZXMuIEFzIG9ww6fDtWVzIGRldmVtIGNvbnRlciBpdGVucyBmaWxob3MgY29uZm9ybWUgYSBlc3RydXR1cmEgZGUgZ3J1cG8gc3Vwb3J0YWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIHBhcmEgbWVsaG9yIHBlcmZvcm1hbmNlIGNvbSBncmFuZGVzIHZvbHVtZXMgZGUgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGwgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEFsdHVyYSBmaXhhIGRlIGNhZGEgaXRlbSBkYSBsaXN0YSBlbSBwaXhlbHMsIG5lY2Vzc8OhcmlhIHBhcmEgbyBjw6FsY3VsbyBkbyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBNZW5zYWdlbSBleGliaWRhIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gY29ycmVzcG9uZGUgYW8gZmlsdHJvIGFwbGljYWRvLiBAZGVmYXVsdCBudWxsICovXG4gICAgcHVibGljIGVtcHR5TWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZSB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgYSB2aXNpYmlsaWRhZGUgZG8gcGFpbmVsIGRlIG9ww6fDtWVzIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dPcHRpb25zID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMYWJlbCBkZSBhY2Vzc2liaWxpZGFkZSBkbyBjb21wb25lbnRlLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIElEIGRvIGVsZW1lbnRvIGV4dGVybm8gcXVlIGRlc2NyZXZlIG8gY29tcG9uZW50ZSAoYXJpYS1sYWJlbGxlZGJ5KS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnkgPSBpbnB1dCgnJyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5ID0gc2lnbmFsKCcnKTtcblxuICAgIC8qKlxuICAgICAqIElEIGRvIGxhYmVsIHJlc29sdmlkbyBwYXJhIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IGludGVybm8uXG4gICAgICogUHJpb3JpemEgbyB2YWxvciBleHBsw61jaXRvIGRlIGBhcmlhTGFiZWxsZWRCeWA7IGNhc28gY29udHLDoXJpbywgdXNhIG8gaWQgZGUgdW1cbiAgICAgKiBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZXh0ZXJubyBhc3NvY2lhZG8gYW8gaG9zdCAoZGV0ZWN0YWRvIGVtIHJ1bnRpbWUpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZXNvbHZlZEFyaWFMYWJlbGxlZEJ5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxsZWRCeSgpIHx8IHRoaXMuX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkoKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyB2YWx1ZSA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHZhbHVlcyA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KFtdKTtcbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSBzaWduYWwoJycpO1xuICAgIHB1YmxpYyBmb2N1c2VkSW5kZXggPSBzaWduYWwoLTEpO1xuICAgIHByaXZhdGUgX3BlbmRpbmdWYWx1ZTogVCB8IFRbXSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBzZWxlY3Qke1NlbGVjdENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcy5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgKGV4Y2x1aW5kbyBhZ3J1cGFkb3JlcykgZXN0aXZlcmVtIHByZXNlbnRlc1xuICAgICAqIG5hIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLCBlIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy52YWx1ZXMoKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmlkKTtcblxuICAgICAgICBjb25zdCByZXQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhvcHRpb24uaWQpKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIExhYmVsIGRlIGFjZXNzaWJpbGlkYWRlIGRvIGNoZWNrYm94IFwiU2VsZWNpb25hciBUb2Rvc1wiLCBjb250ZXh0dWFsIGFvIGVzdGFkbyBhdHVhbCDigJRcbiAgICAgKiByZXBvcnRhZG86IHNlbSBgYXJpYUxhYmVsYCBleHBsw61jaXRvLCBvIGxlaXRvciBkZSB0ZWxhIHPDsyBhbnVuY2lhdmEgXCJjaGVja2JveCwgbsOjb1xuICAgICAqIG1hcmNhZG9cIiwgc2VtIGluZGljYXIgYSBhw6fDo28gKHNlbGVjaW9uYXIgb3UgZGVzbWFyY2FyIHRvZGFzIGFzIG9ww6fDtWVzKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0QWxsQ2hlY2tib3hBcmlhTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuYWxsU2VsZWN0ZWQoKVxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19kZXNlbGVjdF9hY3Rpb24nXG4gICAgICAgICAgICA6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX3NlbGVjdF9hY3Rpb24nO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmRhdGEgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZE9wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmlkID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcGVpYSBvIGlkIGRlIGNhZGEgb3DDp8OjbyBxdWUgw6kgYSBQUklNRUlSQSBkZSB1bSBncnVwbyAoYGdyb3VwKClgIGhhYmlsaXRhZG8pIGFvIHRleHRvXG4gICAgICogYW51bmNpYWRvIHZpYSBgYXJpYS1kZXNjcmliZWRieWAgKGV4LjogXCJBZ3J1cGFkbyBwb3IgQW3DqXJpY2EgZG8gU3VsXCIpLiBPIGFncnVwYWRvciB2aXN1YWxcbiAgICAgKiB0ZW0gYHJvbGU9XCJwcmVzZW50YXRpb25cImAgKHNpbGVuY2lvc28gcHJvIGxlaXRvciBkZSB0ZWxhKSDigJQgcmVwb3J0YWRvOiBhbyBuYXZlZ2FyIHByYVxuICAgICAqIGRlbnRybyBkZSB1bSBncnVwbywgbmFkYSBpbmRpY2F2YSBhIHF1ZSBncnVwbyBhIG9ww6fDo28gcGVydGVuY2lhLiBTw7MgYSBwcmltZWlyYSBvcMOnw6NvIGRlXG4gICAgICogY2FkYSBncnVwbyByZWNlYmUgbyBhbsO6bmNpbywgcHJhIG7Do28gcmVwZXRpciBhIGNhZGEgb3DDp8OjbyBzdWJzZXF1ZW50ZSBkbyBtZXNtbyBncnVwby5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBBbm5vdW5jZW1lbnRzID0gY29tcHV0ZWQ8TWFwPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdW5jZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhbm5vdW5jZW1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBlbmRpbmdHcm91cExhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5maWx0ZXJlZE9wdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0dyb3VwTGFiZWwgPSB0aGlzLmdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwZW5kaW5nR3JvdXBMYWJlbCkge1xuICAgICAgICAgICAgICAgIGFubm91bmNlbWVudHMuc2V0KFxuICAgICAgICAgICAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9ncm91cGVkX2J5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IHBlbmRpbmdHcm91cExhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdHcm91cExhYmVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50cztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcGVpYSBvIGlkIGRlIGNhZGEgb3DDp8OjbyDDoCBzdWEgcG9zacOnw6NvIChgcG9zaW5zZXRgKSBlIGFvIHRhbWFuaG8gdG90YWwgZG8gY29uanVudG9cbiAgICAgKiAoYHNldHNpemVgKSwgaWdub3JhbmRvIGFncnVwYWRvcmVzIChxdWUgbsOjbyBzw6NvIGByb2xlPVwib3B0aW9uXCJgKS4gTmVjZXNzw6FyaW8gcG9ycXVlLCBjb21cbiAgICAgKiBgdmlydHVhbFNjcm9sbGAsIHPDsyB1bWEgamFuZWxhIGRlIG9ww6fDtWVzIGV4aXN0ZSBkZSBmYXRvIG5vIERPTSBhIGNhZGEgbW9tZW50byDigJQgc2VtXG4gICAgICogYGFyaWEtcG9zaW5zZXRgL2BhcmlhLXNldHNpemVgIGV4cGzDrWNpdG9zLCBvIGxlaXRvciBkZSB0ZWxhIHRlbnRhIGluZmVyaXIgYSBwb3Npw6fDo29cbiAgICAgKiBjb250YW5kbyBvcyBgcm9sZT1cIm9wdGlvblwiYCBpcm3Do29zIHByZXNlbnRlcyBubyBET00sIG8gcXVlIGZpY2EgZXJyYWRvIHByYSB1bWEgbGlzdGFcbiAgICAgKiB2aXJ0dWFsaXphZGEgKHJlcG9ydGFkbyB2aWEgTlZEQTogYW8gc2VsZWNpb25hciBhIDPCqiBvcMOnw6NvIGRlIHVtYSBsaXN0YSBkZSB+MjQwIHBhw61zZXNcbiAgICAgKiBjb20gYHZpcnR1YWxTY3JvbGxgLCBvIGFuw7puY2lvIGRlIHBvc2nDp8OjbyBcInZvbHRhdmFcIiBwcmEgMSBhbnRlcyBkZSBzZSBjb3JyaWdpcikuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvblBvc2l0aW9ucyA9IGNvbXB1dGVkPE1hcDxzdHJpbmcsIHsgcG9zaW5zZXQ6IG51bWJlcjsgc2V0c2l6ZTogbnVtYmVyIH0+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBvc2luc2V0OiBudW1iZXI7IHNldHNpemU6IG51bWJlciB9PigpO1xuICAgICAgICBjb25zdCBub25Hcm91cGVyT3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNldHNpemUgPSBub25Hcm91cGVyT3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgbm9uR3JvdXBlck9wdGlvbnMuZm9yRWFjaCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zLnNldChvcHRpb24uaWQsIHsgcG9zaW5zZXQ6IGluZGV4ICsgMSwgc2V0c2l6ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcblxuICAgIC8qKlxuICAgICAqIExhcmd1cmEgZG8gcGFpbmVsIChpZ3VhbCDDoCBkbyB0cmlnZ2VyKSwgbWVkaWRhIHF1YW5kbyBvIG92ZXJsYXkgw6kgYW5leGFkby4gTGVyIGBvZmZzZXRXaWR0aGBcbiAgICAgKiBkaXJldG8gbm8gdGVtcGxhdGUgbWVkZSBsYXlvdXQgZHVyYW50ZSBvIGNoYW5nZSBkZXRlY3Rpb24gZSBkaXNwYXJhIE5HMDEwMCBxdWFuZG8gYSBsYXJndXJhXG4gICAgICogbXVkYSBlbnRyZSBkdWFzIHZlcmlmaWNhw6fDtWVzLiBVbSByZXNpemUgZGEgamFuZWxhIGZlY2hhIG8gcGFpbmVsIChgb25XaW5kb3dSZXNpemVgKSwgZW50w6NvXG4gICAgICogbWVkaXIgbmEgYWJlcnR1cmEgYmFzdGEuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhbmVsV2lkdGggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVySW5wdXQgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2ZpbHRlcklucHV0Jyk7XG4gICAgLy8gYHJlYWQ6IEVsZW1lbnRSZWZgIMOpIG9icmlnYXTDs3JpbyBhcXVpOiBgI3NlbGVjdEFsbENoZWNrYm94YCBlc3TDoSBudW0gZWxlbWVudG8gZGVcbiAgICAvLyBjb21wb25lbnRlIChgPHMtY2hlY2tib3g+YCksIGVudMOjbyBzZW0gaXNzbyBvIHZpZXdDaGlsZCByZXNvbHZlIHByYSBpbnN0w6JuY2lhIGRvXG4gICAgLy8gYENoZWNrYm94Q29tcG9uZW50YCAocXVlIG7Do28gdGVtIGAubmF0aXZlRWxlbWVudGApLCBuw6NvIHBybyBgRWxlbWVudFJlZmAgZG8gaG9zdCDigJRcbiAgICAvLyByZXN1bHRhZG8sIG8gZm9jbyBhdXRvbcOhdGljbyBubyBjaGVja2JveCBhbyBhYnJpciAoYHRvZ2dsZSgpYCkgbnVuY2EgZnVuY2lvbmF2YS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RBbGxDaGVja2JveDogU2lnbmFsPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPiA9IHZpZXdDaGlsZCgnc2VsZWN0QWxsQ2hlY2tib3gnLCB7XG4gICAgICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25QYW5lbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2Ryb3Bkb3duUGFuZWwnKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgX2NsaWNrYWJsZUxhYmVsOiBIVE1MTGFiZWxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xpdmVBbm5vdW5jZXIgPSBpbmplY3QoTGl2ZUFubm91bmNlcik7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtXG4gICAgICAgICAgICAuZ2V0KCdmaWx0ZXInKSFcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBgZm9jdXNlZEluZGV4YCDDqSB1bSDDrW5kaWNlIGNydSBkZW50cm8gZGUgYGZpbHRlcmVkT3B0aW9ucygpYCDigJQgYW8gZGlnaXRhciB1bVxuICAgICAgICAgICAgICAgIC8vIGZpbHRybyBxdWUgcmVkdXogYSBsaXN0YSAob3UgbGltcGFyIG8gZmlsdHJvLCBxdWUgYSBhdW1lbnRhIGRlIHZvbHRhKSwgbyDDrW5kaWNlXG4gICAgICAgICAgICAgICAgLy8gYW50aWdvIHBhc3NhIGEgYXBvbnRhciBwcmEgdW1hIHBvc2nDp8OjbyBpbnbDoWxpZGEgb3UgcHJhIHVtYSBvcMOnw6NvIGNvbXBsZXRhbWVudGVcbiAgICAgICAgICAgICAgICAvLyBkaWZlcmVudGUgZGEgcXVlIGVzdGF2YSBmb2NhZGEgYW50ZXMuIFJlcG9ydGFkbyB2aWEgTlZEQTogc2VtIHJlc2V0YXIgYXF1aSxcbiAgICAgICAgICAgICAgICAvLyBBcnJvd0Rvd24vRXNwYcOnby9FbnRlciB2aXJhdmFtIG5vLW9wIHNpbGVuY2lvc28gc2VtcHJlIHF1ZSBvIMOtbmRpY2UgZmljYXZhIGZvcmFcbiAgICAgICAgICAgICAgICAvLyBkb3MgbGltaXRlcyBkYSBub3ZhIGxpc3RhIGZpbHRyYWRhIOKAlCBvIHVzdcOhcmlvIHPDsyBjb250aW51YXZhIG91dmluZG8gbyBhbsO6bmNpb1xuICAgICAgICAgICAgICAgIC8vIGRhIMOaTFRJTUEgc2VsZcOnw6NvIHbDoWxpZGEsIHNlbSBuZW5odW0gZmVlZGJhY2sgZGUgcXVlIGEgdGVjbGEgbsOjbyBmZXogbmFkYS5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRWZlaXRvIHBhcmEgdGVudGFyIGFwbGljYXIgdmFsb3IgcGVuZGVudGUgcXVhbmRvIG9wdGlvbnMgbXVkYXIuXG4gICAgICAgIC8vIEEgZXNjcml0YSBlbSB2YWx1ZS92YWx1ZXMgw6kgbmVjZXNzw6FyaWEgcGFyYSBzaW5jcm9uaXphciBvIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmxlbmd0aCAmJiB0aGlzLl9wZW5kaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jbGlja2FibGVMYWJlbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIHZhbG9yIHNlbGVjaW9uYWRvIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBPIHZhbG9yIGEgc2VyIGRlZmluaWRvLiBQb2RlIHNlciB1bSBvYmpldG8gZG8gdGlwbyBgVGAsIHVtIGFycmF5IGRlIGBUYCAocXVhbmRvIG3Dumx0aXBsYSBzZWxlw6fDo28gZXN0w6EgaGFiaWxpdGFkYSksIG91IGBudWxsYC5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbyB2YWxvciBuw6NvIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgZGVzYXRpdmFkbyBlIG8gdmFsb3IgZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gbWFwZWlhIG8ocykgdmFsb3IoZXMpIGZvcm5lY2lkbyhzKSBwYXJhIGFzIG9ww6fDtWVzIGludGVybmFzIGRvIGNvbXBvbmVudGUsXG4gICAgICogZ2FyYW50aW5kbyBxdWUgYXBlbmFzIG9ww6fDtWVzIHbDoWxpZGFzIHNlamFtIHNlbGVjaW9uYWRhcyBjb25mb3JtZSBvIG1vZG8gZGUgc2VsZcOnw6NvICjDum5pY28gb3UgbcO6bHRpcGxvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgLy8gQXJtYXplbmEgdmFsb3IgcGVuZGVudGUgZSB0ZW50YSBhcGxpY2FyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9hcHBseVBlbmRpbmdWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlbnRhIGFwbGljYXIgbyB2YWxvciBwZW5kZW50ZSAoX3BlbmRpbmdWYWx1ZSkgYW8gZXN0YWRvIGRvIGNvbXBvbmVudGUsXG4gICAgICogbWFwZWFuZG8gcGFyYSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IGNvbmZvcm1lIG9wdGlvbnMgZGlzcG9uw612ZWlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FwcGx5UGVuZGluZ1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BlbmRpbmdWYWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmZpbmQoKG9wdCkgPT4gb3B0LmRhdGFbb3B0aW9uVmFsdWVdID09PSB2KSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodikpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG9wdCk6IG9wdCBpcyBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+ID0+ICEhb3B0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQobWFwcGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvblZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIG9wdGlvblZhbHVlIGluIHZhbHVlID8gdmFsdWVbb3B0aW9uVmFsdWVdIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gY29tcGFyZVZhbHVlKSB8fCBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobWFwcGVkID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZSBGdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgcmVjZWJlIG8gbm92byB2YWxvciBzZWxlY2lvbmFkbyBvdSBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IFQgfCBUW10gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXG4gICAgICogQHBhcmFtIG9uVG91Y2hlZCBGdW7Dp8OjbyBkZSBjYWxsYmFjayBhIHNlciBleGVjdXRhZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgbWFyY2FkbyBjb21vIFwidG9jYWRvXCIuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyByZWFsaXphIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIENhc28gY29udHLDoXJpbywgaW52ZXJ0ZSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRhcyBvcMOnw7Vlcy5cbiAgICAgKiBBbyBhYnJpciwgbW92ZSBvIGZvY28gcGFyYSBvIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gIXRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBzaG91bGRPcGVuO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcblxuICAgICAgICBpZiAoc2hvdWxkT3Blbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBRdWFuZG8gaMOhIGZpbHRybyBjb20gbcO6bHRpcGxhIHNlbGXDp8OjbywgZm9jbyB2YWkgcGFyYSBvIGNoZWNrYm94IHByaW1laXJvO1xuICAgICAgICAgICAgICAgIC8vIGNhc28gY29udHLDoXJpbywgdmFpIGRpcmV0byBwYXJhIG8gaW5wdXQgZGUgZmlsdHJvLlxuICAgICAgICAgICAgICAgIC8vIE8gZm9jbyDDqSBtb3ZpZG8gYXDDs3MgYSByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LlxuICAgICAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94SG9zdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB0aGlzLl9zZWxlY3RBbGxDaGVja2JveCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IGNoZWNrYm94SG9zdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1t0YWJpbmRleF0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGU/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaXNOb3dTZWxlY3RlZCA9IGluZGV4ID09PSAtMTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IHN0b3JlLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhW29wdGlvblZhbHVlXSkgOiBzdG9yZTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCBpc05vd1NlbGVjdGVkKTtcblxuICAgICAgICAgICAgLy8gQWNvbXBhbmhhIG8gaXRlbSBxdWUgYWNhYm91IGRlIHNlciBzZWxlY2lvbmFkby9kZXNtYXJjYWRvIHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgICAgIC8vIOKAlCBzZW0gaXNzbywgY2xpY2FyIGNvbSBvIG1vdXNlIChlbSB2ZXogZGUgbmF2ZWdhciBwb3IgdGVjbGFkbykgbnVuY2EgbW92ZSBvXG4gICAgICAgICAgICAvLyBcImZvY29cIiB2aXJ0dWFsLCBxdWUgZmljYSBwYXJhZG8gb25kZSBlc3RhdmEgKG91IG51bG8pLCBlIG8gbGVpdG9yIGRlIHRlbGEgcGFzc2EgYVxuICAgICAgICAgICAgLy8gYW51bmNpYXIgc2VtcHJlIGEgbWVzbWEgb3DDp8OjbyAoYSBwcmltZWlyYSwgb3UgYSDDumx0aW1hIGFsY2Fuw6dhZGEgcG9yIHRlY2xhZG8pIGVtXG4gICAgICAgICAgICAvLyB2ZXogZGEgcXVlIGZvaSBkZSBmYXRvIGNsaWNhZGEuXG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KGl0ZW1JbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gaXRlbS5kYXRhW29wdGlvblZhbHVlXSA6IGl0ZW0uZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIERldm9sdmUgbyBmb2NvIHBybyBjb250YWluZXIgc8OzIHNlIGVsZSBlc3RhdmEgZGVudHJvIGRvIHBhaW5lbCAoZXguOiBvcMOnw6NvXG4gICAgICAgICAgICAvLyBlc2NvbGhpZGEgY29tIG8gZmlsdHJvIGZvY2Fkbykg4oCUIHZlciBgX2Nsb3NlRHJvcGRvd24oKWAuXG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgYSBvcMOnw6NvIHNlbGVjaW9uYWRhL2Rlc21hcmNhZGEuIE5lY2Vzc8OhcmlvIHBvcnF1ZSwgbmEgcHLDoXRpY2EsXG4gICAgICogbmVtIHRvZG8gbmF2ZWdhZG9yL2xlaXRvciBkZSB0ZWxhIGFudW5jaWEgc296aW5obyBhIG11ZGFuw6dhIGRlIGBhcmlhLXNlbGVjdGVkYCBkYSBvcMOnw6NvXG4gICAgICogYXBvbnRhZGEgcG9yIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIChyZXBvcnRhZG8gdmlhIE5WREEgbm8gQ2hyb21lOiBuZW5odW1hIG1lbnNhZ2VtIGVyYVxuICAgICAqIG91dmlkYSBhbyBzZWxlY2lvbmFyKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+LCBpc05vd1NlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGlzTm93U2VsZWN0ZWRcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3Rfb3B0aW9uX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9vcHRpb25fZGVzZWxlY3RlZCc7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IG9wdGlvbjogdGhpcy5nZXRPcHRpb25MYWJlbChpdGVtLmRhdGEpIH0pO1xuICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19jbGVhcmVkJyksXG4gICAgICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZExhYmVsID0gdGhpcy52YWx1ZSgpID8gdGhpcy5nZXRPcHRpb25MYWJlbCh0aGlzLnZhbHVlKCkhLmRhdGEpIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9vcHRpb25fcmVtb3ZlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjogcmVtb3ZlZExhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gTyBib3TDo28gXCJMaW1wYXJcIiBzw7Mgw6kgcmVuZGVyaXphZG8gZW5xdWFudG8gYCFpc0NsZWFuKClgIOKAlCBhbyBjaGFtYXIgYGNsZWFyKClgIGVsZVxuICAgICAgICAvLyBkZWl4YSBkZSBleGlzdGlyIG5vIERPTSBuYSBtZXNtYSByZS1yZW5kZXJpemHDp8OjbyBlbSBxdWUgYWNhYm91IGRlIHNlciBjbGljYWRvLFxuICAgICAgICAvLyBsZXZhbmRvIG8gZm9jbyBqdW50byBwcmEgYGRvY3VtZW50LmJvZHlgIChwZXJkaWRvKSBzZSBuYWRhIG8gcmVzZ2F0YXIgZXhwbGljaXRhbWVudGUuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3luY1BhbmVsV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhbmVsV2lkdGguc2V0KHdpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGlucHV0IGRlIGZpbHRybyBkbyBvdmVybGF5LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcmltZWlyYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgw7psdGltYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ1RhYicgKHNlbSBTaGlmdCk6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRhIGxpc3RhLCBlbSB2ZXogZGUgZGVpeGFyIG8gVGFiXG4gICAgICogICBuYXRpdm8gdGVudGFyIHNhaXIgZG8gb3ZlcmxheSAoYXMgb3DDp8O1ZXMgbsOjbyBzw6NvIGVsZW1lbnRvcyB0YWJ1bMOhdmVpcywgZW50w6NvIG8gVGFiXG4gICAgICogICBuYXRpdm8gXCJ2YXphdmFcIiBvIGZvY28gcHJhIGZvcmEgZG8gcGFpbmVsIHNlbSBudW5jYSBhbGNhbsOnYXIgYSBsaXN0YSkuXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93biBlIHJldG9ybmEgbyBmb2NvIGFvIGNvbWJvYm94LlxuICAgICAqIC0gJ0VudGVyJyAvICdFc3Bhw6dvJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEsIHNlIGhvdXZlci4gRXNwYcOnbyBzw7Mgw6kgaW50ZXJjZXB0YWRvXG4gICAgICogICBxdWFuZG8gasOhIGV4aXN0ZSB1bWEgb3DDp8OjbyBjb20gZm9jbyB2aXJ0dWFsIChgZm9jdXNlZEluZGV4KCkgPj0gMGApIOKAlCBzZW0gdW1hIG9ww6fDo29cbiAgICAgKiAgIGZvY2FkYSwgbyBlc3Bhw6dvIMOpIGRlaXhhZG8gcGFzc2FyIHBybyBjb21wb3J0YW1lbnRvIG5hdGl2byBkbyBgPGlucHV0PmAgKGRpZ2l0YXIgdW1cbiAgICAgKiAgIGVzcGHDp28sIG5lY2Vzc8OhcmlvIHByYSBidXNjYXMgY29tIG3Dumx0aXBsYXMgcGFsYXZyYXMpLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBubyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lbmh1bSBpdGVtIGZvY2FkbzogZm9jYSBvIMO6bHRpbW8gZGlzcG9uw612ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SW5kZXggPSBvcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgb3B0aW9uc1tsYXN0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHRlY2xhZG8gbm8gYm90w6NvIFwiTGltcGFyIGZpbHRyb1wiIGRvIG92ZXJsYXkuXG4gICAgICogw4kgbyDDumx0aW1vIGNvbnRyb2xlIHJlYWwgKHRhYnVsw6F2ZWwpIGRvIG92ZXJsYXkgYW50ZXMgZGEgbGlzdGEgZGUgb3DDp8O1ZXMg4oCUIHNlbVxuICAgICAqIGludGVyY2VwdGFyIG8gVGFiIGFxdWksIGVsZSBcInZhemF2YVwiIG8gZm9jbyBwcmEgZm9yYSBkbyBwYWluZWwgc2VtIG51bmNhIGFsY2Fuw6dhciBhXG4gICAgICogbGlzdGEsIGrDoSBxdWUgYXMgb3DDp8O1ZXMgbsOjbyBzw6NvIGVsZW1lbnRvcyB0YWJ1bMOhdmVpcyAoZm9jbyB2aXJ0dWFsIHZpYVxuICAgICAqIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkuXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIG5vIGJvdMOjby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DbGVhckZpbHRlckJ1dHRvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKHRoaXMuZmlsdGVyZWRPcHRpb25zKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYicvJ1NoaWZ0K1RhYic6IENvbSBvIGRyb3Bkb3duIGFiZXJ0byBlIHNlbSBmaWx0cm8sIG5hdmVnYSBlbnRyZSBhcyBvcMOnw7VlcyAobWVzbW9cbiAgICAgKiAgIGVmZWl0byBkZSBBcnJvd0Rvd24vQXJyb3dVcCkgZW0gdmV6IGRlIGZlY2hhciBvIHBhaW5lbCBlIFwidmF6YXJcIiBvIGZvY28gcHJvIHByw7N4aW1vXG4gICAgICogICBjYW1wbyBkYSBww6FnaW5hIHNlbSBvIHVzdcOhcmlvIG51bmNhIHRlciBhbGNhbsOnYWRvIGFzIG9ww6fDtWVzLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoICYmIGV2ZW50LmtleSAhPT0gJ0VzY2FwZScgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tIGZpbHRybywgVGFiIG5hdmVnYSBwZWxvcyBjb250cm9sZXMgcmVhaXMgZG8gb3ZlcmxheSAoY2hlY2tib3gg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCDihpIgYm90w6NvIFwiTGltcGFyIGZpbHRyb1wiKTsgYSBwYXJ0aXIgZG8gw7psdGltbyBkZWxlcywgbyBwcsOzcHJpb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbGUgaW50ZXJjZXB0YSBvIFRhYiBwcmEgZW50cmFyIG5hIGxpc3RhIOKAlCB2ZXIgb25GaWx0ZXJLZXlEb3duIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uQ2xlYXJGaWx0ZXJCdXR0b25LZXlEb3duLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbSBmaWx0cm8sIG8gZm9jbyBET00gbnVuY2Egc2FpIGRvIGNvbWJvYm94IChuYXZlZ2HDp8OjbyB2aXJ0dWFsIHZpYVxuICAgICAgICAgICAgICAgICAgICAvLyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpIOKAlCByZXBvcnRhZG86IHNlbSBpbnRlcmNlcHRhciwgVGFiIGZlY2hhdmEgb1xuICAgICAgICAgICAgICAgICAgICAvLyBkcm9wZG93biBlIG8gZm9jbyBcInZhemF2YVwiIHBybyBwcsOzeGltbyBjYW1wbyBkYSBww6FnaW5hIHNlbSBvIHVzdcOhcmlvXG4gICAgICAgICAgICAgICAgICAgIC8vIG51bmNhIHRlciBhbGNhbsOnYWRvIGFzIG9ww6fDtWVzLiBUYWIgcGFzc2EgYSBmdW5jaW9uYXIgY29tbyBBcnJvd0Rvd24vVXAuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHRleHRvIGRlIGFuw7puY2lvIGRlIGdydXBvIChleC46IFwiQWdydXBhZG8gcG9yIEFtw6lyaWNhIGRvIFN1bFwiKSBwcmEgdW1hIG9ww6fDo28sXG4gICAgICogY2FzbyBlbGEgc2VqYSBhIHByaW1laXJhIGRvIHNldSBncnVwbyDigJQgdmVyIGBncm91cEFubm91bmNlbWVudHNgLlxuICAgICAqIEBwYXJhbSBvcHRpb25JZCBJZCBkYSBvcMOnw6NvIGludGVybmEuXG4gICAgICogQHJldHVybnMgTyB0ZXh0byBkZSBhbsO6bmNpbywgb3UgYG51bGxgIHNlIGEgb3DDp8OjbyBuw6NvIGZvciBhIHByaW1laXJhIGRvIGdydXBvLlxuICAgICAqL1xuICAgIHB1YmxpYyBncm91cEFubm91bmNlbWVudEZvcihvcHRpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwQW5ub3VuY2VtZW50cygpLmdldChvcHRpb25JZCkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGEgcG9zacOnw6NvICgxLWJhc2VkKSBkZSB1bWEgb3DDp8OjbyBkZW50cm8gZG8gY29uanVudG8gbmF2ZWfDoXZlbCDigJQgdmVyIGBvcHRpb25Qb3NpdGlvbnNgLlxuICAgICAqIEBwYXJhbSBvcHRpb25JZCBJZCBkYSBvcMOnw6NvIGludGVybmEuXG4gICAgICogQHJldHVybnMgQSBwb3Npw6fDo28sIG91IGBudWxsYCBzZSBhIG9ww6fDo28gbsOjbyBmb3IgZW5jb250cmFkYSAoZXguOiDDqSB1bSBhZ3J1cGFkb3IpLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcHRpb25Qb3NpbnNldEZvcihvcHRpb25JZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvblBvc2l0aW9ucygpLmdldChvcHRpb25JZCk/LnBvc2luc2V0ID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHRhbWFuaG8gdG90YWwgZG8gY29uanVudG8gbmF2ZWfDoXZlbCBhbyBxdWFsIHVtYSBvcMOnw6NvIHBlcnRlbmNlIOKAlCB2ZXIgYG9wdGlvblBvc2l0aW9uc2AuXG4gICAgICogQHBhcmFtIG9wdGlvbklkIElkIGRhIG9ww6fDo28gaW50ZXJuYS5cbiAgICAgKiBAcmV0dXJucyBPIHRhbWFuaG8gdG90YWwsIG91IGBudWxsYCBzZSBhIG9ww6fDo28gbsOjbyBmb3IgZW5jb250cmFkYSAoZXguOiDDqSB1bSBhZ3J1cGFkb3IpLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcHRpb25TZXRzaXplRm9yKG9wdGlvbklkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uUG9zaXRpb25zKCkuZ2V0KG9wdGlvbklkKT8uc2V0c2l6ZSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIGRlIHRyYWNrQnkgdXRpbGl6YWRhIGVtIGJsb2NvcyBAZm9yIHBhcmEgb3RpbWl6YXIgYSByZW5kZXJpemHDp8OjbyBkZSBsaXN0YXMuXG4gICAgICogUmV0b3JuYSBvIGlkZW50aWZpY2Fkb3Igw7puaWNvIChgaWRgKSBkZSBjYWRhIGl0ZW0gZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE8gaXRlbSBhdHVhbCBkYSBsaXN0YSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcmV0dXJucyBPIGlkZW50aWZpY2Fkb3Igw7puaWNvIGRvIGl0ZW0gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0J5SWQoXzogbnVtYmVyLCBpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpY2Egc2UgYSBvcMOnw6NvIGZvcm5lY2lkYSBlc3TDoSBzZWxlY2lvbmFkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGludGVybmEgZG8gZHJvcGRvd24gYSBzZXIgdmVyaWZpY2FkYS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgc2UgYSBvcMOnw6NvIGVzdGl2ZXIgc2VsZWNpb25hZGEsIGNhc28gY29udHLDoXJpbyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy52YWx1ZXMoKS5maW5kKChvKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8gPT09IG9wdGlvbjtcbiAgICAgICAgICAgIH0pICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgc2VsZcOnw6NvIGRlIHRvZG9zIG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbywgc2VsZWNpb25hIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBxdWUgbsOjbyBzw6NvIGFncnVwYWRvcmVzXG4gICAgICogY2FzbyBuZW0gdG9kb3MgZXN0ZWphbSBzZWxlY2lvbmFkb3MsIG91IGxpbXBhIGEgc2VsZcOnw6NvIGNhc28gdG9kb3MgasOhIGVzdGVqYW0gc2VsZWNpb25hZG9zLlxuICAgICAqIEFww7NzIGEgYWx0ZXJhw6fDo28sIG5vdGlmaWNhIGEgbXVkYW7Dp2EgZGUgdmFsb3IuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZVNlbGVjdEFsbFRvZ2dsZShmYWxzZSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZVNlbGVjdEFsbFRvZ2dsZSh0cnVlLCBvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgbyByZXN1bHRhZG8gZGUgXCJTZWxlY2lvbmFyIFRvZG9zXCIvXCJMaW1wYXIgVG9kb3NcIi4gTmVjZXNzw6FyaW9cbiAgICAgKiBwb3JxdWUgbyBjaGVja2JveCBxdWUgZGlzcGFyYSBhIGHDp8OjbyB0ZW0gZm9jbyByZWFsIGUgYW51bmNpYSBzZXUgcHLDs3ByaW8gYGFyaWEtY2hlY2tlZGBcbiAgICAgKiBub3JtYWxtZW50ZSwgbWFzIGFzIE4gb3DDp8O1ZXMgYWZldGFkYXMgKHF1ZSBuw6NvIGVzdMOjbyBmb2NhZGFzKSBuw6NvIOKAlCBhbyBjb250csOhcmlvIGRvIHRvZ2dsZVxuICAgICAqIGRlIHVtYSBvcMOnw6NvIGluZGl2aWR1YWwsIGN1am8gYGFyaWEtc2VsZWN0ZWRgIGrDoSDDqSBsaWRvIHBlbG8gbGVpdG9yIGRlIHRlbGEgcG9ycXVlIGVsYSDDqSBvXG4gICAgICogZWxlbWVudG8gYXBvbnRhZG8gcG9yIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIG5vIG1vbWVudG8gZGEgbXVkYW7Dp2EuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYW5ub3VuY2VTZWxlY3RBbGxUb2dnbGUoaXNOb3dTZWxlY3RlZDogYm9vbGVhbiwgY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNOb3dTZWxlY3RlZFxuICAgICAgICAgICAgPyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jb3VudF9pdGVtc19zZWxlY3RlZCcsIHsgY291bnQgfSlcbiAgICAgICAgICAgIDogdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX2NsZWFyZWQnKTtcbiAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGRlIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdXRpbGl6YSBhIHByb3ByaWVkYWRlIGRlZmluaWRhIHBvciBgb3B0aW9uTGFiZWxgIHBhcmEgZXh0cmFpciBvIHZhbG9yIGRvIHLDs3R1bG8gZGEgb3DDp8Ojby5cbiAgICAgKiBDYXNvIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RlamEgZGVmaW5pZG8sIHJldG9ybmEgYSByZXByZXNlbnRhw6fDo28gZW0gc3RyaW5nIGRhIHByw7NwcmlhIG9ww6fDo28uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9uIEEgb3DDp8OjbyBkYSBxdWFsIG8gcsOzdHVsbyBzZXLDoSBleHRyYcOtZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbltvcHRpb25MYWJlbF0pIDogU3RyaW5nKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBhcyBvcMOnw7VlcyBmb3JuZWNpZGFzIHPDo28gdsOhbGlkYXMuIENhc28gYXMgb3DDp8O1ZXMgc2VqYW0gb2JqZXRvcyxcbiAgICAgKiBnYXJhbnRlIHF1ZSBhIHByb3ByaWVkYWRlIGBvcHRpb25MYWJlbGAgZXN0ZWphIGRlZmluaWRhLCBsYW7Dp2FuZG8gdW0gZXJybyBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogU2UgbsOjbyBob3V2ZXIgb3DDp8O1ZXMsIGEgdmFsaWRhw6fDo28gw6kgaWdub3JhZGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgb3DDp8O1ZXMgZm9yZW0gb2JqZXRvcyBlIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RpdmVyIGRlZmluaWRvLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzT2JqZWN0T3B0aW9ucyA9IG9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb24gIT09IG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNPYmplY3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwib3B0aW9uTGFiZWxcIiBpbnB1dCBpcyByZXF1aXJlZCB3aGVuIG9wdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NvY2lhIHVtIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBleHRlcm5vIChxdWUgYXBvbnRhIHBhcmEgbyBgaWRgIGRvIGhvc3QpIGFvXG4gICAgICogY29tYm9ib3ggaW50ZXJubywgcmVzb2x2ZW5kbyBvIHByb2JsZW1hIGRlIFwib3JwaGFuZWQgbGFiZWxcIi5cbiAgICAgKlxuICAgICAqIENvbW8gbyBob3N0IGBzLXNlbGVjdGAgbsOjbyDDqSB1bSBlbGVtZW50byByb3R1bMOhdmVsIChsYWJlbGFibGUpLCBvIGBmb3JgIG7Do29cbiAgICAgKiBjcmlhIHbDrW5jdWxvIHByb2dyYW3DoXRpY28uIEVzdGUgbcOpdG9kbzpcbiAgICAgKiAtIGxvY2FsaXphIG8gbGFiZWwgcXVlIHJlZmVyZW5jaWEgbyBgaWRgIGRvIGhvc3Q7XG4gICAgICogLSBnYXJhbnRlIHF1ZSBlc3NlIGxhYmVsIHRlbmhhIHVtIGBpZGA7XG4gICAgICogLSBhcG9udGEgbyBgYXJpYS1sYWJlbGxlZGJ5YCBkbyBjb21ib2JveCBwYXJhIGVzc2UgbGFiZWw7XG4gICAgICogLSBhZGljaW9uYSB1bSBjbGlxdWUgbm8gbGFiZWwgcGFyYSBmb2NhciBvIGNvbWJvYm94IChlcXVpdmFsZW50ZSBhbyBgZm9yYCkuXG4gICAgICpcbiAgICAgKiBOw6NvIHNvYnJlc2NyZXZlIHVtIGBhcmlhTGFiZWxsZWRCeWAgZXhwbMOtY2l0byBpbmZvcm1hZG8gcGVsbyBjb25zdW1pZG9yLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYXJpYUxhYmVsbGVkQnkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaG9zdElkID0gdGhpcy5faG9zdFJlZi5uYXRpdmVFbGVtZW50LmlkO1xuICAgICAgICBpZiAoIWhvc3RJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLl9maW5kTGFiZWxGb3IoaG9zdElkKTtcbiAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsYWJlbC5pZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKGxhYmVsLCAnaWQnLCBgJHt0aGlzLmNvbXBvbmVudElkfS1sYWJlbGApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeS5zZXQobGFiZWwuaWQpO1xuXG4gICAgICAgIC8vIE8gYXRyaWJ1dG8gYGZvcmAgbsOjbyBmdW5jaW9ubGRhIGVtIGhvc3QgbsOjby1yb3R1bMOhdmVsLCBlbnTDo28gcmVwbGljYW1vc1xuICAgICAgICAvLyBvIGNvbXBvcnRhbWVudG8gZGUgXCJjbGljYXIgbm8gbGFiZWwgZm9jYSBvIGNvbnRyb2xlXCIgbWFudWFsbWVudGUuXG4gICAgICAgIHRoaXMuX2NsaWNrYWJsZUxhYmVsID0gbGFiZWw7XG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhbGl6YSBvIGA8bGFiZWw+YCBjdWpvIGF0cmlidXRvIGBmb3JgIGNvcnJlc3BvbmRlIGFvIGlkIGluZm9ybWFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBob3N0SWQgSWQgZG8gaG9zdCByZWZlcmVuY2lhZG8gcGVsbyBsYWJlbC5cbiAgICAgKiBAcmV0dXJucyBPIGVsZW1lbnRvIGxhYmVsIGNvcnJlc3BvbmRlbnRlIG91IGBudWxsYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9maW5kTGFiZWxGb3IoaG9zdElkOiBzdHJpbmcpOiBIVE1MTGFiZWxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExhYmVsRWxlbWVudD4oJ2xhYmVsW2Zvcl0nKTtcbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBBcnJheS5mcm9tKGxhYmVscykpIHtcbiAgICAgICAgICAgIGlmIChsYWJlbC5nZXRBdHRyaWJ1dGUoJ2ZvcicpID09PSBob3N0SWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBvIGNvbWJvYm94IGludGVybm8gYW8gY2xpY2FyIG5vIGxhYmVsIGV4dGVybm8gYXNzb2NpYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25MYWJlbENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uIFNlIG8gZm9jbyBlc3RhdmEgZGVudHJvIGRvIHBhaW5lbFxuICAgICAqIHNlbmRvIGZlY2hhZG8gKGV4LjogY2FtcG8gZGUgZmlsdHJvKSwgZGV2b2x2ZSBvIGZvY28gcHJvIGNvbnRhaW5lci9jb21ib2JveCDigJQgbnVuY2FcbiAgICAgKiBmb3LDp2EgbyBmb2NvIHNlIGVsZSBqw6EgZXN0aXZlciBlbSBvdXRybyBsdWdhciAoZXguOiBvcMOnw6NvIGVzY29saGlkYSB2aWEgY2xpcXVlIGRvIG1vdXNlXG4gICAgICogc2VtIGZpbHRybywgb25kZSBvIGZvY28gRE9NIG51bmNhIHNhaXUgZG8gY29tYm9ib3ggcG9yIGNhdXNhIGRvIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkuXG4gICAgICogYHByb3RlY3RlZGAgKG7Do28gYHByaXZhdGVgKSBwb3JxdWUgdGFtYsOpbSDDqSBjaGFtYWRvIGEgcGFydGlyIGRvIHRlbXBsYXRlXG4gICAgICogKGBiYWNrZHJvcENsaWNrYC9gZGV0YWNoYCBkbyBgY2RrQ29ubmVjdGVkT3ZlcmxheWApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5fZHJvcGRvd25QYW5lbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNJc0luc2lkZVBhbmVsID1cbiAgICAgICAgICAgIHBhbmVsRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHBhbmVsRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFmb2N1c0lzSW5zaWRlUGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gYGNvbXBvbmVudElkYCBkZXN0YSBpbnN0w6JuY2lhLCBubyB0aW1lc3RhbXAgYXR1YWwgZSBubyDDrW5kaWNlIGRvXG4gICAgICogaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwbyAoZGV0ZWN0YWRvIHBlbGEgcHJlc2Vuw6dhIGRlIHVtIGFycmF5IGBpdGVtc2ApLCBhZGljaW9uYSB0YW1iw6ltIGFcbiAgICAgKiBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBPIGBjb21wb25lbnRJZGAgw6kgb2JyaWdhdMOzcmlvIG5vIHByZWZpeG86IGBEYXRlLm5vdygpYCBzb3ppbmhvIHRlbSByZXNvbHXDp8OjbyBkZSBhcGVuYXMgMW1zLCBlIGR1YXNcbiAgICAgKiBpbnN0w6JuY2lhcyBkZSBgcy1zZWxlY3RgIG5hIG1lc21hIHDDoWdpbmEgZnJlcXVlbnRlbWVudGUgaW5pY2lhbGl6YW0gZGVudHJvIGRvIG1lc21vIG1pbGlzc2VndW5kb1xuICAgICAqIChjb25maXJtYWRvIHZpYSB0ZXN0ZSBtYW51YWwg4oCUIHJlcG9ydGFkbyB2aWEgTlZEQTogdW1hIG9ww6fDo28gasOhIHNlbGVjaW9uYWRhIGVtIE9VVFJPIGBzLXNlbGVjdGAgZGFcbiAgICAgKiBww6FnaW5hIGVyYSBhbnVuY2lhZGEgZW0gdmV6IGRhIG9ww6fDo28gZGUgZmF0byBjbGljYWRhKS4gU2VtIG8gYGNvbXBvbmVudElkYCwgb3MgaWRzIGNvbGlkaWFtIGVudHJlXG4gICAgICogaW5zdMOibmNpYXMgZGlmZXJlbnRlcyAoYGlkXzxtZXNtby10aW1lc3RhbXA+XzBgIGVtIGFtYmFzKSwgZSBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YC9gZ2V0RWxlbWVudEJ5SWRgXG4gICAgICogcmVzb2x2aWFtIHBybyBlbGVtZW50byBlcnJhZG8g4oCUIGRlIG91dHJvIHNlbGVjdC4gTyB0aW1lc3RhbXAgY29udGludWEgbm8gaWQgKGFsw6ltIGRvIGBjb21wb25lbnRJZGApXG4gICAgICogcHJhIG1hbnRlciBpZHMgw7puaWNvcyBlbnRyZSByZWNvbXB1dGHDp8O1ZXMgZGEgTUVTTUEgaW5zdMOibmNpYSBxdWFuZG8gYG9wdGlvbnMoKWAgbXVkYSBkZSByZWZlcsOqbmNpYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMuY29tcG9uZW50SWR9X2lkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICBpZDogYCR7dGhpcy5jb21wb25lbnRJZH1faWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGZvY28gbm8gaXRlbSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRvIGFvIGFicmlyIG8gZHJvcGRvd24uXG4gICAgICogTm8gbW9kbyBzaW1wbGVzLCBmb2NhIG8gaXRlbSBzZWxlY2lvbmFkby4gTm8gbW9kbyBtw7psdGlwbG8sIGZvY2EgbyBwcmltZWlybyBpdGVtIHNlbGVjaW9uYWRvLlxuICAgICAqIEFww7NzIHJlbmRlcml6YcOnw6NvIGRvIG92ZXJsYXksIHJvbGEgYSBsaXN0YSBhdMOpIG8gaXRlbSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKVswXTtcbiAgICAgICAgICAgIGlmIChmaXJzdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBmaXJzdFNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBzZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1lZGl1bSBib3JkZXIgb3V0bGluZS0yIG91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV0gb3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZVwiXG4gICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1hdXRvXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwic2hvd09wdGlvbnMoKSA/IGNvbXBvbmVudElkICsgJy1saXN0Ym94JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJzaG93T3B0aW9ucygpID8gZm9jdXNlZE9wdGlvbklkKCkgOiBudWxsXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtpZF09XCJjb21wb25lbnRJZCArICctY29tYm9ib3gnXCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQoKSA/IC0xIDogMFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwoKSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwicmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSgpIHx8IG51bGxcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgc2VsZWN0LW5vbmUgcHgtWzEwcHhdIHB5LVs3cHhdXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpICYmICFpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtNjBdPVwiIWRpc2FibGVkKCkgJiYgaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmFyaWFfY2xlYXJfc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggdy05IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItbCBncm91cC1ob3ZlcjpiZy1ncmF5c2NhbGUtNVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXMgdGV4dC1iYXNlXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIXNob3dPcHRpb25zKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LXVwXT1cInNob3dPcHRpb25zKClcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cIl9jbG9zZURyb3Bkb3duKClcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChhdHRhY2gpPVwiX3N5bmNQYW5lbFdpZHRoKClcIlxuICAgIChkZXRhY2gpPVwiX2Nsb3NlRHJvcGRvd24oKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICAjZHJvcGRvd25QYW5lbFxuICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1ib2R5LWNsYXNzIHotWzEwMDBdIHJvdW5kZWQtWzNweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3ctbWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInBhbmVsV2lkdGgoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIFtAdmlzaWJpbGl0eUNoYW5nZWRdXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cInNlbGVjdEFsbENoZWNrYm94QXJpYUxhYmVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtWzM1cHhdIGdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25GaWx0ZXJLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXJfb3B0aW9ucycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZE9wdGlvbklkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25DbGVhckZpbHRlckJ1dHRvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jbGVhcl9maWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrSWNvbkNsYXNzXT1cImNoZWNrSWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEFubm91bmNlbWVudF09XCJncm91cEFubm91bmNlbWVudEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3NpbnNldF09XCJvcHRpb25Qb3NpbnNldEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZXRzaXplXT1cIm9wdGlvblNldHNpemVGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tJY29uQ2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwQW5ub3VuY2VtZW50XT1cImdyb3VwQW5ub3VuY2VtZW50Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Bvc2luc2V0XT1cIm9wdGlvblBvc2luc2V0Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NldHNpemVdPVwib3B0aW9uU2V0c2l6ZUZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj5cbiAgICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|
|
1154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFFSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUVOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FB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dW5jZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBPdmVybGF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5cbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBhZnRlck5leHRSZW5kZXIsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgSW5qZWN0b3IsXG4gICAgbW9kZWwsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsLFxuICAgIFNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgZWZmZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvY2hlY2tib3gnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NlbGVjdC1vcHRpb24vc2VsZWN0LW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIHNlbGXDp8OjbyBkcm9wZG93biBnZW7DqXJpY28gY29tIHN1cG9ydGUgYSBzZWxlw6fDo28gc2ltcGxlcyBlIG3Dumx0aXBsYSxcbiAqIGZpbHRybywgYWdydXBhbWVudG8sIHZpcnR1YWwgc2Nyb2xsIGUgYWNlc3NpYmlsaWRhZGUgKEFSSUEgY29tYm9ib3gpLiBJbXBsZW1lbnRhXG4gKiB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmEgaW50ZWdyYcOnw6NvIGNvbSBSZWFjdGl2ZSBGb3JtcyBlIFRlbXBsYXRlLWRyaXZlbiBGb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHMtc2VsZWN0XG4gKiAgIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3JpYVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtYSBjYXRlZ29yaWFcIlxuICogICBbb3B0aW9uc109XCJjYXRlZ29yaWFzXCJcbiAqICAgb3B0aW9uTGFiZWw9XCJub21lXCJcbiAqICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gKiAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gKiAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICB9LFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIC5zZWxlY3QtY29udGFpbmVyOm5vdCg6Zm9jdXMtd2l0aGluKSB7XG4gICAgICAgICAgICAgICAgJixcbiAgICAgICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCd2aXNpYmlsaXR5Q2hhbmdlZCcsIFtcbiAgICAgICAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjk1KScgfSkpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxKScgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnNTAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBdKSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBlc3TDoSBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGEgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgb3DDp8O1ZXMgc2ltdWx0w6JuZWFzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXG4gICAgcHVibGljIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gbGFiZWwgZGUgZXhpYmnDp8Ojby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIHZhbG9yIGEgc2VyIGVtaXRpZG8gYW8gZm9ybXVsw6FyaW8uICovXG4gICAgcHVibGljIG9wdGlvblZhbHVlID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gYm90w6NvIHBhcmEgbGltcGFyIGEgc2VsZcOnw6NvIGF0dWFsLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93Q2xlYXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHVtIGNhbXBvIGRlIGZpbHRybyB0ZXh0dWFsIHBhcmEgcGVzcXVpc2EgbmFzIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENsYXNzZSBkbyDDrWNvbmUgZGUgY2hlY2ttYXJrIGV4aWJpZG8gcXVhbmRvIGBjaGVja21hcmtgIGVzdMOhIGF0aXZvLiBAZGVmYXVsdCAnZmFyIGZhLWNoZWNrJyAqL1xuICAgIHB1YmxpYyBjaGVja0ljb25DbGFzcyA9IGlucHV0KCdmYXIgZmEtY2hlY2snKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUocykgZG8gb2JqZXRvIHVzYWRhKHMpIHBhcmEgZmlsdHJhZ2VtIHRleHR1YWwuIFF1YW5kbyBuw6NvIGluZm9ybWFkbywgdXNhIGBvcHRpb25MYWJlbGAuICovXG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhZ3J1cGFtZW50byBkZSBvcMOnw7Vlcy4gQXMgb3DDp8O1ZXMgZGV2ZW0gY29udGVyIGl0ZW5zIGZpbGhvcyBjb25mb3JtZSBhIGVzdHJ1dHVyYSBkZSBncnVwbyBzdXBvcnRhZGEuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGdyb3VwID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB2aXJ0dWFsaXphw6fDo28gZGEgbGlzdGEgcGFyYSBtZWxob3IgcGVyZm9ybWFuY2UgY29tIGdyYW5kZXMgdm9sdW1lcyBkZSBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQWx0dXJhIGZpeGEgZGUgY2FkYSBpdGVtIGRhIGxpc3RhIGVtIHBpeGVscywgbmVjZXNzw6FyaWEgcGFyYSBvIGPDoWxjdWxvIGRvIHZpcnR1YWwgc2Nyb2xsLiBAZGVmYXVsdCAzNyAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGV4aWJpZGEgcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBjb3JyZXNwb25kZSBhbyBmaWx0cm8gYXBsaWNhZG8uIEBkZWZhdWx0IG51bGwgKi9cbiAgICBwdWJsaWMgZW1wdHlNZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIG8gZXN0YWRvIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIG8gbW9kbyBzb21lbnRlIGxlaXR1cmEuIE8gdXN1w6FyaW8gY29udGludWEgcG9kZW5kbyBhYnJpciBlIGZlY2hhciBhXG4gICAgICogbGlzdGEgKHBvciBtb3VzZSBvdSB0ZWNsYWRvKSBlIHZlciBxdWFpcyBvcMOnw7VlcyBlc3TDo28gc2VsZWNpb25hZGFzLCBtYXMgbsOjbyBjb25zZWd1ZVxuICAgICAqIHNlbGVjaW9uYXIsIGRlc21hcmNhciBuZW0gbGltcGFyIG9ww6fDtWVzLiBEaWZlcmVudGUgZGUgYGRpc2FibGVkYCwgbyBjYW1wbyBwZXJtYW5lY2VcbiAgICAgKiBmb2PDoXZlbCBlIMOpIGFudW5jaWFkbyBwb3IgbGVpdG9yZXMgZGUgdGVsYSBjb21vIG7Do28gZWRpdMOhdmVsIChgYXJpYS1yZWFkb25seWApLiBRdWFuZG9cbiAgICAgKiBgZGlzYWJsZWRgIHRhbWLDqW0gZXN0w6EgYXRpdm8sIHByZXZhbGVjZSBvIGNvbXBvcnRhbWVudG8gZGUgYGRpc2FibGVkYC4gQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRvIHBhaW5lbCBkZSBvcMOnw7VlcyB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93T3B0aW9ucyA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGFiZWwgZGUgYWNlc3NpYmlsaWRhZGUgZG8gY29tcG9uZW50ZS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBJRCBkbyBlbGVtZW50byBleHRlcm5vIHF1ZSBkZXNjcmV2ZSBvIGNvbXBvbmVudGUgKGFyaWEtbGFiZWxsZWRieSkuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXQoJycpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeSA9IHNpZ25hbCgnJyk7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkbyBsYWJlbCByZXNvbHZpZG8gcGFyYSBgYXJpYS1sYWJlbGxlZGJ5YCBkbyBjb21ib2JveCBpbnRlcm5vLlxuICAgICAqIFByaW9yaXphIG8gdmFsb3IgZXhwbMOtY2l0byBkZSBgYXJpYUxhYmVsbGVkQnlgOyBjYXNvIGNvbnRyw6FyaW8sIHVzYSBvIGlkIGRlIHVtXG4gICAgICogYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gYXNzb2NpYWRvIGFvIGhvc3QgKGRldGVjdGFkbyBlbSBydW50aW1lKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkQnkoKSB8fCB0aGlzLl9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwcml2YXRlIF9wZW5kaW5nVmFsdWU6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29tcG9uZW50SWQgPSBgc2VsZWN0JHtTZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMuXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIChleGNsdWluZG8gYWdydXBhZG9yZXMpIGVzdGl2ZXJlbSBwcmVzZW50ZXNcbiAgICAgKiBuYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcywgZSBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMudmFsdWVzKCkubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCk7XG5cbiAgICAgICAgY29uc3QgcmV0ID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMob3B0aW9uLmlkKSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMYWJlbCBkZSBhY2Vzc2liaWxpZGFkZSBkbyBjaGVja2JveCBcIlNlbGVjaW9uYXIgVG9kb3NcIiwgY29udGV4dHVhbCBhbyBlc3RhZG8gYXR1YWwg4oCUXG4gICAgICogcmVwb3J0YWRvOiBzZW0gYGFyaWFMYWJlbGAgZXhwbMOtY2l0bywgbyBsZWl0b3IgZGUgdGVsYSBzw7MgYW51bmNpYXZhIFwiY2hlY2tib3gsIG7Do29cbiAgICAgKiBtYXJjYWRvXCIsIHNlbSBpbmRpY2FyIGEgYcOnw6NvIChzZWxlY2lvbmFyIG91IGRlc21hcmNhciB0b2RhcyBhcyBvcMOnw7VlcykuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHNlbGVjdEFsbENoZWNrYm94QXJpYUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmFsbFNlbGVjdGVkKClcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RfYWxsX29wdGlvbnNfZGVzZWxlY3RfYWN0aW9uJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19zZWxlY3RfYWN0aW9uJztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5kYXRhID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRPcHRpb25JZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5pZCA/PyBudWxsO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmRzX3NlbGVjdGVkYCwge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2VsZWN0ZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkWzBdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQgPyB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWQuZGF0YSkgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzZSBvIHNlbGV0b3IgZXN0w6EgXCJsaW1wb1wiLCBvdSBzZWphLCBzZW0gbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZXNgIGVzdMOhIHZhemlvKS5cbiAgICAgKiAtIE5vIG1vZG8gc2ltcGxlcywgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZWAgw6kgZmFsc3kpLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBzZWxlw6fDo28sIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NsZWFuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSgpID8gIXRoaXMudmFsdWVzKCkubGVuZ3RoIDogIXRoaXMudmFsdWUoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIFwiU2VsZWNpb25hciBUb2Rvc1wiIGVzdMOhIGluZGV0ZXJtaW5hZG8uXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgcXVhbmRvIG5lbSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgZXN0w6NvIHNlbGVjaW9uYWRvcyBlIG5lbSB0b2RvcyBlc3TDo28gZGVzbWFyY2Fkb3MsXG4gICAgICogb3Ugc2VqYSwgcXVhbmRvIGjDoSB1bWEgc2VsZcOnw6NvIHBhcmNpYWwgZG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIGEgc2VsZcOnw6NvIGZvciBwYXJjaWFsLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpLnNvbWUoKG8pID0+IG8uaWQgPT09IG9wdGlvbi5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3QgYWxsID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG4gICAgICAgIGNvbnN0IG5vbmUgPSBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+ICFzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcblxuICAgICAgICByZXR1cm4gIWFsbCAmJiAhbm9uZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcyBjb20gYmFzZSBubyB2YWxvciBkZSBidXNjYSAoYGZpbHRlclZhbHVlYCkgZSBub3MgY3JpdMOpcmlvcyBkZWZpbmlkb3MuXG4gICAgICogLSBTZSBvIGZpbHRybyBlc3RpdmVyIGRlc2FiaWxpdGFkbyBvdSBvIHZhbG9yIGRlIGJ1c2NhIGVzdGl2ZXIgdmF6aW8sIHJldG9ybmEgdG9kYXMgYXMgb3DDp8O1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGZpbHRyYSBhcyBvcMOnw7VlcyB1dGlsaXphbmRvIG8ocykgY2FtcG8ocykgZXNwZWNpZmljYWRvKHMpIGVtIGBmaWx0ZXJCeWAuXG4gICAgICogLSBJZ25vcmEgb3DDp8O1ZXMgcXVlIHBvc3N1ZW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcmAgZGVmaW5pZGEuXG4gICAgICogQHJldHVybnMgQXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbmZvcm1lIG8gdmFsb3IgZGUgYnVzY2EgZSBjcml0w6lyaW9zIGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5maWx0ZXJWYWx1ZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIoKSB8fCAhc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5maWx0ZXJCeSgpO1xuICAgICAgICByZXR1cm4gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSAnJztcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbi5kYXRhW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckJ5KSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gZmlsdGVyQnkubWFwKChieSkgPT4gU3RyaW5nKG9wdGlvbi5kYXRhW2J5XSA/PyAnJykpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBTdHJpbmcob3B0aW9uLmRhdGFbZmlsdGVyQnldID8/ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXBlaWEgbyBpZCBkZSBjYWRhIG9ww6fDo28gcXVlIMOpIGEgUFJJTUVJUkEgZGUgdW0gZ3J1cG8gKGBncm91cCgpYCBoYWJpbGl0YWRvKSBhbyB0ZXh0b1xuICAgICAqIGFudW5jaWFkbyB2aWEgYGFyaWEtZGVzY3JpYmVkYnlgIChleC46IFwiQWdydXBhZG8gcG9yIEFtw6lyaWNhIGRvIFN1bFwiKS4gTyBhZ3J1cGFkb3IgdmlzdWFsXG4gICAgICogdGVtIGByb2xlPVwicHJlc2VudGF0aW9uXCJgIChzaWxlbmNpb3NvIHBybyBsZWl0b3IgZGUgdGVsYSkg4oCUIHJlcG9ydGFkbzogYW8gbmF2ZWdhciBwcmFcbiAgICAgKiBkZW50cm8gZGUgdW0gZ3J1cG8sIG5hZGEgaW5kaWNhdmEgYSBxdWUgZ3J1cG8gYSBvcMOnw6NvIHBlcnRlbmNpYS4gU8OzIGEgcHJpbWVpcmEgb3DDp8OjbyBkZVxuICAgICAqIGNhZGEgZ3J1cG8gcmVjZWJlIG8gYW7Dum5jaW8sIHByYSBuw6NvIHJlcGV0aXIgYSBjYWRhIG9ww6fDo28gc3Vic2VxdWVudGUgZG8gbWVzbW8gZ3J1cG8uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdyb3VwQW5ub3VuY2VtZW50cyA9IGNvbXB1dGVkPE1hcDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgYW5ub3VuY2VtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICAgIGlmICghdGhpcy5ncm91cCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwZW5kaW5nR3JvdXBMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZmlsdGVyZWRPcHRpb25zKCkpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlcikge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdHcm91cExhYmVsID0gdGhpcy5nZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGVuZGluZ0dyb3VwTGFiZWwpIHtcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnRzLnNldChcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RfZ3JvdXBlZF9ieScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiBwZW5kaW5nR3JvdXBMYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwZW5kaW5nR3JvdXBMYWJlbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFubm91bmNlbWVudHM7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXBlaWEgbyBpZCBkZSBjYWRhIG9ww6fDo28gw6Agc3VhIHBvc2nDp8OjbyAoYHBvc2luc2V0YCkgZSBhbyB0YW1hbmhvIHRvdGFsIGRvIGNvbmp1bnRvXG4gICAgICogKGBzZXRzaXplYCksIGlnbm9yYW5kbyBhZ3J1cGFkb3JlcyAocXVlIG7Do28gc8OjbyBgcm9sZT1cIm9wdGlvblwiYCkuIE5lY2Vzc8OhcmlvIHBvcnF1ZSwgY29tXG4gICAgICogYHZpcnR1YWxTY3JvbGxgLCBzw7MgdW1hIGphbmVsYSBkZSBvcMOnw7VlcyBleGlzdGUgZGUgZmF0byBubyBET00gYSBjYWRhIG1vbWVudG8g4oCUIHNlbVxuICAgICAqIGBhcmlhLXBvc2luc2V0YC9gYXJpYS1zZXRzaXplYCBleHBsw61jaXRvcywgbyBsZWl0b3IgZGUgdGVsYSB0ZW50YSBpbmZlcmlyIGEgcG9zacOnw6NvXG4gICAgICogY29udGFuZG8gb3MgYHJvbGU9XCJvcHRpb25cImAgaXJtw6NvcyBwcmVzZW50ZXMgbm8gRE9NLCBvIHF1ZSBmaWNhIGVycmFkbyBwcmEgdW1hIGxpc3RhXG4gICAgICogdmlydHVhbGl6YWRhIChyZXBvcnRhZG8gdmlhIE5WREE6IGFvIHNlbGVjaW9uYXIgYSAzwqogb3DDp8OjbyBkZSB1bWEgbGlzdGEgZGUgfjI0MCBwYcOtc2VzXG4gICAgICogY29tIGB2aXJ0dWFsU2Nyb2xsYCwgbyBhbsO6bmNpbyBkZSBwb3Npw6fDo28gXCJ2b2x0YXZhXCIgcHJhIDEgYW50ZXMgZGUgc2UgY29ycmlnaXIpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25Qb3NpdGlvbnMgPSBjb21wdXRlZDxNYXA8c3RyaW5nLCB7IHBvc2luc2V0OiBudW1iZXI7IHNldHNpemU6IG51bWJlciB9Pj4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgeyBwb3NpbnNldDogbnVtYmVyOyBzZXRzaXplOiBudW1iZXIgfT4oKTtcbiAgICAgICAgY29uc3Qgbm9uR3JvdXBlck9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBzZXRzaXplID0gbm9uR3JvdXBlck9wdGlvbnMubGVuZ3RoO1xuXG4gICAgICAgIG5vbkdyb3VwZXJPcHRpb25zLmZvckVhY2goKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5zZXQob3B0aW9uLmlkLCB7IHBvc2luc2V0OiBpbmRleCArIDEsIHNldHNpemUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwb3NpdGlvbnM7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXA8eyBmaWx0ZXI6IEZvcm1Db250cm9sPHN0cmluZz4gfT4oe1xuICAgICAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGFpbmVyRGl2ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyRGl2Jyk7XG5cbiAgICAvKipcbiAgICAgKiBMYXJndXJhIGRvIHBhaW5lbCAoaWd1YWwgw6AgZG8gdHJpZ2dlciksIG1lZGlkYSBxdWFuZG8gbyBvdmVybGF5IMOpIGFuZXhhZG8uIExlciBgb2Zmc2V0V2lkdGhgXG4gICAgICogZGlyZXRvIG5vIHRlbXBsYXRlIG1lZGUgbGF5b3V0IGR1cmFudGUgbyBjaGFuZ2UgZGV0ZWN0aW9uIGUgZGlzcGFyYSBORzAxMDAgcXVhbmRvIGEgbGFyZ3VyYVxuICAgICAqIG11ZGEgZW50cmUgZHVhcyB2ZXJpZmljYcOnw7Vlcy4gVW0gcmVzaXplIGRhIGphbmVsYSBmZWNoYSBvIHBhaW5lbCAoYG9uV2luZG93UmVzaXplYCksIGVudMOjb1xuICAgICAqIG1lZGlyIG5hIGFiZXJ0dXJhIGJhc3RhLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwYW5lbFdpZHRoID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcklucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdmaWx0ZXJJbnB1dCcpO1xuICAgIC8vIGByZWFkOiBFbGVtZW50UmVmYCDDqSBvYnJpZ2F0w7NyaW8gYXF1aTogYCNzZWxlY3RBbGxDaGVja2JveGAgZXN0w6EgbnVtIGVsZW1lbnRvIGRlXG4gICAgLy8gY29tcG9uZW50ZSAoYDxzLWNoZWNrYm94PmApLCBlbnTDo28gc2VtIGlzc28gbyB2aWV3Q2hpbGQgcmVzb2x2ZSBwcmEgaW5zdMOibmNpYSBkb1xuICAgIC8vIGBDaGVja2JveENvbXBvbmVudGAgKHF1ZSBuw6NvIHRlbSBgLm5hdGl2ZUVsZW1lbnRgKSwgbsOjbyBwcm8gYEVsZW1lbnRSZWZgIGRvIGhvc3Qg4oCUXG4gICAgLy8gcmVzdWx0YWRvLCBvIGZvY28gYXV0b23DoXRpY28gbm8gY2hlY2tib3ggYW8gYWJyaXIgKGB0b2dnbGUoKWApIG51bmNhIGZ1bmNpb25hdmEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0QWxsQ2hlY2tib3g6IFNpZ25hbDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZD4gPSB2aWV3Q2hpbGQoJ3NlbGVjdEFsbENoZWNrYm94Jywge1xuICAgICAgICByZWFkOiBFbGVtZW50UmVmLFxuICAgIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ryb3Bkb3duUGFuZWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdkcm9wZG93blBhbmVsJyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9jbGlja2FibGVMYWJlbDogSFRNTExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saXZlQW5ub3VuY2VyID0gaW5qZWN0KExpdmVBbm5vdW5jZXIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gYGZvY3VzZWRJbmRleGAgw6kgdW0gw61uZGljZSBjcnUgZGVudHJvIGRlIGBmaWx0ZXJlZE9wdGlvbnMoKWAg4oCUIGFvIGRpZ2l0YXIgdW1cbiAgICAgICAgICAgICAgICAvLyBmaWx0cm8gcXVlIHJlZHV6IGEgbGlzdGEgKG91IGxpbXBhciBvIGZpbHRybywgcXVlIGEgYXVtZW50YSBkZSB2b2x0YSksIG8gw61uZGljZVxuICAgICAgICAgICAgICAgIC8vIGFudGlnbyBwYXNzYSBhIGFwb250YXIgcHJhIHVtYSBwb3Npw6fDo28gaW52w6FsaWRhIG91IHByYSB1bWEgb3DDp8OjbyBjb21wbGV0YW1lbnRlXG4gICAgICAgICAgICAgICAgLy8gZGlmZXJlbnRlIGRhIHF1ZSBlc3RhdmEgZm9jYWRhIGFudGVzLiBSZXBvcnRhZG8gdmlhIE5WREE6IHNlbSByZXNldGFyIGFxdWksXG4gICAgICAgICAgICAgICAgLy8gQXJyb3dEb3duL0VzcGHDp28vRW50ZXIgdmlyYXZhbSBuby1vcCBzaWxlbmNpb3NvIHNlbXByZSBxdWUgbyDDrW5kaWNlIGZpY2F2YSBmb3JhXG4gICAgICAgICAgICAgICAgLy8gZG9zIGxpbWl0ZXMgZGEgbm92YSBsaXN0YSBmaWx0cmFkYSDigJQgbyB1c3XDoXJpbyBzw7MgY29udGludWF2YSBvdXZpbmRvIG8gYW7Dum5jaW9cbiAgICAgICAgICAgICAgICAvLyBkYSDDmkxUSU1BIHNlbGXDp8OjbyB2w6FsaWRhLCBzZW0gbmVuaHVtIGZlZWRiYWNrIGRlIHF1ZSBhIHRlY2xhIG7Do28gZmV6IG5hZGEuXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVmZWl0byBwYXJhIHRlbnRhciBhcGxpY2FyIHZhbG9yIHBlbmRlbnRlIHF1YW5kbyBvcHRpb25zIG11ZGFyLlxuICAgICAgICAvLyBBIGVzY3JpdGEgZW0gdmFsdWUvdmFsdWVzIMOpIG5lY2Vzc8OhcmlhIHBhcmEgc2luY3Jvbml6YXIgbyBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5sZW5ndGggJiYgdGhpcy5fcGVuZGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5UGVuZGluZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBzZWxlY2lvbmFkbyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgTyB2YWxvciBhIHNlciBkZWZpbmlkby4gUG9kZSBzZXIgdW0gb2JqZXRvIGRvIHRpcG8gYFRgLCB1bSBhcnJheSBkZSBgVGAgKHF1YW5kbyBtw7psdGlwbGEgc2VsZcOnw6NvIGVzdMOhIGhhYmlsaXRhZGEpLCBvdSBgbnVsbGAuXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG8gdmFsb3IgbsOjbyBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGRlc2F0aXZhZG8gZSBvIHZhbG9yIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIG1hcGVpYSBvKHMpIHZhbG9yKGVzKSBmb3JuZWNpZG8ocykgcGFyYSBhcyBvcMOnw7VlcyBpbnRlcm5hcyBkbyBjb21wb25lbnRlLFxuICAgICAqIGdhcmFudGluZG8gcXVlIGFwZW5hcyBvcMOnw7VlcyB2w6FsaWRhcyBzZWphbSBzZWxlY2lvbmFkYXMgY29uZm9ybWUgbyBtb2RvIGRlIHNlbGXDp8OjbyAow7puaWNvIG91IG3Dumx0aXBsbykuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIEFybWF6ZW5hIHZhbG9yIHBlbmRlbnRlIGUgdGVudGEgYXBsaWNhclxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZW50YSBhcGxpY2FyIG8gdmFsb3IgcGVuZGVudGUgKF9wZW5kaW5nVmFsdWUpIGFvIGVzdGFkbyBkbyBjb21wb25lbnRlLFxuICAgICAqIG1hcGVhbmRvIHBhcmEgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiBjb25mb3JtZSBvcHRpb25zIGRpc3BvbsOtdmVpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hcHBseVBlbmRpbmdWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWU7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gdikgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHYpKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHQpOiBvcHQgaXMgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiA9PiAhIW9wdCk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBvcHRpb25WYWx1ZSBpbiB2YWx1ZSA/IHZhbHVlW29wdGlvblZhbHVlXSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IGNvbXBhcmVWYWx1ZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG1hcHBlZCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHJlY2ViZSBvIG5vdm8gdmFsb3Igc2VsZWNpb25hZG8gb3UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgZXhlY3V0YWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIG1hcmNhZG8gY29tbyBcInRvY2Fkb1wiLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGVzdGFkbyBkZSBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWQgSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBkZXZlIHNlciBkZXNhYmlsaXRhZG8gKGB0cnVlYCkgb3UgaGFiaWxpdGFkbyAoYGZhbHNlYCkuXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRhcyBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gcmVhbGl6YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGludmVydGUgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMuXG4gICAgICogQW8gYWJyaXIsIG1vdmUgbyBmb2NvIHBhcmEgbyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkT3BlbiA9ICF0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gc2hvdWxkT3BlbjtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoc2hvdWxkT3Blbik7XG5cbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gY29tIG3Dumx0aXBsYSBzZWxlw6fDo28sIGZvY28gdmFpIHBhcmEgbyBjaGVja2JveCBwcmltZWlybztcbiAgICAgICAgICAgICAgICAvLyBjYXNvIGNvbnRyw6FyaW8sIHZhaSBkaXJldG8gcGFyYSBvIGlucHV0IGRlIGZpbHRyby5cbiAgICAgICAgICAgICAgICAvLyBPIGZvY28gw6kgbW92aWRvIGFww7NzIGEgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheS5cbiAgICAgICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtIHNvbWVudGUgbGVpdHVyYSBvIGNoZWNrYm94IFwiU2VsZWNpb25hciB0b2Rvc1wiIGZpY2EgZGVzYWJpbGl0YWRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAobsOjbyBmb2PDoXZlbCksIGVudMOjbyBvIGZvY28gaW5pY2lhbCB2YWkgZGlyZXRvIHBybyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpICYmICF0aGlzLnJlYWRvbmx5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2JveEhvc3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3goKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBjaGVja2JveEhvc3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbdGFiaW5kZXhdJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJJbnB1dCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZE9wdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHVtIGl0ZW0gbm8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogQHBhcmFtIGl0ZW0gTyBpdGVtIGEgc2VyIHNlbGVjaW9uYWRvIG91IGRlc21hcmNhZG8uXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBhIGZ1bsOnw6NvIHJldG9ybmEgaW1lZGlhdGFtZW50ZS5cbiAgICAgKiBFbSBtb2RvIHNvbWVudGUgbGVpdHVyYSwgbsOjbyBhbHRlcmEgbyB2YWxvciBlIGFwZW5hcyBhbnVuY2lhIHF1ZSBvIGNhbXBvIG7Do28gw6kgZWRpdMOhdmVsLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VSZWFkb25seSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaXNOb3dTZWxlY3RlZCA9IGluZGV4ID09PSAtMTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IHN0b3JlLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhW29wdGlvblZhbHVlXSkgOiBzdG9yZTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCBpc05vd1NlbGVjdGVkKTtcblxuICAgICAgICAgICAgLy8gQWNvbXBhbmhhIG8gaXRlbSBxdWUgYWNhYm91IGRlIHNlciBzZWxlY2lvbmFkby9kZXNtYXJjYWRvIHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgICAgIC8vIOKAlCBzZW0gaXNzbywgY2xpY2FyIGNvbSBvIG1vdXNlIChlbSB2ZXogZGUgbmF2ZWdhciBwb3IgdGVjbGFkbykgbnVuY2EgbW92ZSBvXG4gICAgICAgICAgICAvLyBcImZvY29cIiB2aXJ0dWFsLCBxdWUgZmljYSBwYXJhZG8gb25kZSBlc3RhdmEgKG91IG51bG8pLCBlIG8gbGVpdG9yIGRlIHRlbGEgcGFzc2EgYVxuICAgICAgICAgICAgLy8gYW51bmNpYXIgc2VtcHJlIGEgbWVzbWEgb3DDp8OjbyAoYSBwcmltZWlyYSwgb3UgYSDDumx0aW1hIGFsY2Fuw6dhZGEgcG9yIHRlY2xhZG8pIGVtXG4gICAgICAgICAgICAvLyB2ZXogZGEgcXVlIGZvaSBkZSBmYXRvIGNsaWNhZGEuXG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KGl0ZW1JbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gaXRlbS5kYXRhW29wdGlvblZhbHVlXSA6IGl0ZW0uZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIERldm9sdmUgbyBmb2NvIHBybyBjb250YWluZXIgc8OzIHNlIGVsZSBlc3RhdmEgZGVudHJvIGRvIHBhaW5lbCAoZXguOiBvcMOnw6NvXG4gICAgICAgICAgICAvLyBlc2NvbGhpZGEgY29tIG8gZmlsdHJvIGZvY2Fkbykg4oCUIHZlciBgX2Nsb3NlRHJvcGRvd24oKWAuXG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgcXVlIG8gY2FtcG8gw6kgc29tZW50ZSBsZWl0dXJhLiBDaGFtYWRvIHF1YW5kbyBvIHVzdcOhcmlvIHRlbnRhXG4gICAgICogYWx0ZXJhciBhIHNlbGXDp8OjbyDigJQgc2VtIGlzc28sIEVudGVyL0VzcGHDp28gbnVtYSBvcMOnw6NvIHNlcmlhIHVtIG5vLW9wIHNpbGVuY2lvc28gcGFyYSBxdWVtXG4gICAgICogdXNhIGxlaXRvciBkZSB0ZWxhLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2Fubm91bmNlUmVhZG9ubHkoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9yZWFkb25seV9jYW5ub3RfY2hhbmdlJyksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgYSBvcMOnw6NvIHNlbGVjaW9uYWRhL2Rlc21hcmNhZGEuIE5lY2Vzc8OhcmlvIHBvcnF1ZSwgbmEgcHLDoXRpY2EsXG4gICAgICogbmVtIHRvZG8gbmF2ZWdhZG9yL2xlaXRvciBkZSB0ZWxhIGFudW5jaWEgc296aW5obyBhIG11ZGFuw6dhIGRlIGBhcmlhLXNlbGVjdGVkYCBkYSBvcMOnw6NvXG4gICAgICogYXBvbnRhZGEgcG9yIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIChyZXBvcnRhZG8gdmlhIE5WREEgbm8gQ2hyb21lOiBuZW5odW1hIG1lbnNhZ2VtIGVyYVxuICAgICAqIG91dmlkYSBhbyBzZWxlY2lvbmFyKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+LCBpc05vd1NlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGlzTm93U2VsZWN0ZWRcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3Rfb3B0aW9uX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9vcHRpb25fZGVzZWxlY3RlZCc7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IG9wdGlvbjogdGhpcy5nZXRPcHRpb25MYWJlbChpdGVtLmRhdGEpIH0pO1xuICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IHNvbWVudGUgbGVpdHVyYSwgbsOjbyBleGVjdXRhIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIG3Dumx0aXBsYSwgcmVtb3ZlIHRvZG9zIG9zIHZhbG9yZXMgc2VsZWNpb25hZG9zIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyDDum5pY2EsIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsbyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIFwidG9jYWRvXCIuXG4gICAgICogSW1wZWRlIGEgcHJvcGFnYcOnw6NvIGRvIGV2ZW50byBkbyBtb3VzZS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRvIG1vdXNlIHF1ZSBhY2lvbm91IGEgbGltcGV6YSBkYSBzZWxlw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5yZWFkb25seSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX2NsZWFyZWQnKSxcbiAgICAgICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkTGFiZWwgPSB0aGlzLnZhbHVlKCkgPyB0aGlzLmdldE9wdGlvbkxhYmVsKHRoaXMudmFsdWUoKSEuZGF0YSkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X29wdGlvbl9yZW1vdmVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiByZW1vdmVkTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyBPIGJvdMOjbyBcIkxpbXBhclwiIHPDsyDDqSByZW5kZXJpemFkbyBlbnF1YW50byBgIWlzQ2xlYW4oKWAg4oCUIGFvIGNoYW1hciBgY2xlYXIoKWAgZWxlXG4gICAgICAgIC8vIGRlaXhhIGRlIGV4aXN0aXIgbm8gRE9NIG5hIG1lc21hIHJlLXJlbmRlcml6YcOnw6NvIGVtIHF1ZSBhY2Fib3UgZGUgc2VyIGNsaWNhZG8sXG4gICAgICAgIC8vIGxldmFuZG8gbyBmb2NvIGp1bnRvIHByYSBgZG9jdW1lbnQuYm9keWAgKHBlcmRpZG8pIHNlIG5hZGEgbyByZXNnYXRhciBleHBsaWNpdGFtZW50ZS5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCksIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gZmlsdHJvIGRvIGZvcm11bMOhcmlvLCByZXNldGFuZG8gbyBjYW1wbyAnZmlsdGVyJyBkbyBmb3JtdWzDoXJpbyBkZSBmaWx0cm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIHJlZGVmaW5lIG8gdmFsb3IgZG8gY2FtcG8gJ2ZpbHRlcicgcGFyYSBzZXUgZXN0YWRvIGluaWNpYWwsXG4gICAgICogcmVtb3ZlbmRvIHF1YWxxdWVyIHRleHRvIG91IHZhbG9yIHByZXZpYW1lbnRlIGluc2VyaWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8ucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEuXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBjYXNvIGVsZSBlc3RlamEgdmlzw612ZWwgYW8gcmVkaW1lbnNpb25hciBhIGphbmVsYS5cbiAgICAgKiBAcGFyYW0gXyBFdmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zeW5jUGFuZWxXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxXaWR0aC5zZXQod2lkdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKF86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGNsaXF1ZSBubyBlbGVtZW50byBjb250YWluZXIgZGEgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBhbHRlcm5hIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZG8gY29tcG9uZW50ZSBzZWxlY3QgZSxcbiAgICAgKiBlbSBzZWd1aWRhLCBkZWZpbmUgbyBmb2NvIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBjb3JyZXNwb25kZW50ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db250YWluZXJEaXZDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBldmVudG9zIGRlIHRlY2xhZG8gbm8gaW5wdXQgZGUgZmlsdHJvIGRvIG92ZXJsYXkuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByaW1laXJhIG9ww6fDo28gZGEgbGlzdGEuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSDDumx0aW1hIG9ww6fDo28gZGEgbGlzdGEuXG4gICAgICogLSAnVGFiJyAoc2VtIFNoaWZ0KTogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGEgbGlzdGEsIGVtIHZleiBkZSBkZWl4YXIgbyBUYWJcbiAgICAgKiAgIG5hdGl2byB0ZW50YXIgc2FpciBkbyBvdmVybGF5IChhcyBvcMOnw7VlcyBuw6NvIHPDo28gZWxlbWVudG9zIHRhYnVsw6F2ZWlzLCBlbnTDo28gbyBUYWJcbiAgICAgKiAgIG5hdGl2byBcInZhemF2YVwiIG8gZm9jbyBwcmEgZm9yYSBkbyBwYWluZWwgc2VtIG51bmNhIGFsY2Fuw6dhciBhIGxpc3RhKS5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duIGUgcmV0b3JuYSBvIGZvY28gYW8gY29tYm9ib3guXG4gICAgICogLSAnRW50ZXInIC8gJ0VzcGHDp28nOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSwgc2UgaG91dmVyLiBFc3Bhw6dvIHPDsyDDqSBpbnRlcmNlcHRhZG9cbiAgICAgKiAgIHF1YW5kbyBqw6EgZXhpc3RlIHVtYSBvcMOnw6NvIGNvbSBmb2NvIHZpcnR1YWwgKGBmb2N1c2VkSW5kZXgoKSA+PSAwYCkg4oCUIHNlbSB1bWEgb3DDp8Ojb1xuICAgICAqICAgZm9jYWRhLCBvIGVzcGHDp28gw6kgZGVpeGFkbyBwYXNzYXIgcHJvIGNvbXBvcnRhbWVudG8gbmF0aXZvIGRvIGA8aW5wdXQ+YCAoZGlnaXRhciB1bVxuICAgICAqICAgZXNwYcOnbywgbmVjZXNzw6FyaW8gcHJhIGJ1c2NhcyBjb20gbcO6bHRpcGxhcyBwYWxhdnJhcykuXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIG5vIGlucHV0IGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVuaHVtIGl0ZW0gZm9jYWRvOiBmb2NhIG8gw7psdGltbyBkaXNwb27DrXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RJbmRleCA9IG9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiBvcHRpb25zW2xhc3RJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgdGVjbGFkbyBubyBib3TDo28gXCJMaW1wYXIgZmlsdHJvXCIgZG8gb3ZlcmxheS5cbiAgICAgKiDDiSBvIMO6bHRpbW8gY29udHJvbGUgcmVhbCAodGFidWzDoXZlbCkgZG8gb3ZlcmxheSBhbnRlcyBkYSBsaXN0YSBkZSBvcMOnw7VlcyDigJQgc2VtXG4gICAgICogaW50ZXJjZXB0YXIgbyBUYWIgYXF1aSwgZWxlIFwidmF6YXZhXCIgbyBmb2NvIHByYSBmb3JhIGRvIHBhaW5lbCBzZW0gbnVuY2EgYWxjYW7Dp2FyIGFcbiAgICAgKiBsaXN0YSwgasOhIHF1ZSBhcyBvcMOnw7VlcyBuw6NvIHPDo28gZWxlbWVudG9zIHRhYnVsw6F2ZWlzIChmb2NvIHZpcnR1YWwgdmlhXG4gICAgICogYXJpYS1hY3RpdmVkZXNjZW5kYW50KS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gbm8gYm90w6NvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNsZWFyRmlsdGVyQnV0dG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24odGhpcy5maWx0ZXJlZE9wdGlvbnMoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBldmVudG9zIGRlIHRlY2xhZG8gcGFyYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBvcMOnw7VlcyBubyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbC5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IuXG4gICAgICogLSAnVGFiJy8nU2hpZnQrVGFiJzogQ29tIG8gZHJvcGRvd24gYWJlcnRvIGUgc2VtIGZpbHRybywgbmF2ZWdhIGVudHJlIGFzIG9ww6fDtWVzIChtZXNtb1xuICAgICAqICAgZWZlaXRvIGRlIEFycm93RG93bi9BcnJvd1VwKSBlbSB2ZXogZGUgZmVjaGFyIG8gcGFpbmVsIGUgXCJ2YXphclwiIG8gZm9jbyBwcm8gcHLDs3hpbW9cbiAgICAgKiAgIGNhbXBvIGRhIHDDoWdpbmEgc2VtIG8gdXN1w6FyaW8gbnVuY2EgdGVyIGFsY2Fuw6dhZG8gYXMgb3DDp8O1ZXMuXG4gICAgICogLSAnRW50ZXInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiAtICcgJzogKGJhcnJhIGRlIGVzcGHDp28pIFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiBQcmV2aW5lIG8gY29tcG9ydGFtZW50byBwYWRyw6NvIGRvIG5hdmVnYWRvciBxdWFuZG8gbmVjZXNzw6FyaW8gcGFyYSBnYXJhbnRpciBhIG5hdmVnYcOnw6NvIGFkZXF1YWRhIHBlbG8gdGVjbGFkby5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGggJiYgZXZlbnQua2V5ICE9PSAnRXNjYXBlJyAmJiBldmVudC5rZXkgIT09ICdFbnRlcicgJiYgZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IF9zZWxlY3RPcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb20gZmlsdHJvLCBUYWIgbmF2ZWdhIHBlbG9zIGNvbnRyb2xlcyByZWFpcyBkbyBvdmVybGF5IChjaGVja2JveCDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IOKGkiBib3TDo28gXCJMaW1wYXIgZmlsdHJvXCIpOyBhIHBhcnRpciBkbyDDumx0aW1vIGRlbGVzLCBvIHByw7NwcmlvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9sZSBpbnRlcmNlcHRhIG8gVGFiIHByYSBlbnRyYXIgbmEgbGlzdGEg4oCUIHZlciBvbkZpbHRlcktleURvd24gL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25DbGVhckZpbHRlckJ1dHRvbktleURvd24uXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VtIGZpbHRybywgbyBmb2NvIERPTSBudW5jYSBzYWkgZG8gY29tYm9ib3ggKG5hdmVnYcOnw6NvIHZpcnR1YWwgdmlhXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkg4oCUIHJlcG9ydGFkbzogc2VtIGludGVyY2VwdGFyLCBUYWIgZmVjaGF2YSBvXG4gICAgICAgICAgICAgICAgICAgIC8vIGRyb3Bkb3duIGUgbyBmb2NvIFwidmF6YXZhXCIgcHJvIHByw7N4aW1vIGNhbXBvIGRhIHDDoWdpbmEgc2VtIG8gdXN1w6FyaW9cbiAgICAgICAgICAgICAgICAgICAgLy8gbnVuY2EgdGVyIGFsY2Fuw6dhZG8gYXMgb3DDp8O1ZXMuIFRhYiBwYXNzYSBhIGZ1bmNpb25hciBjb21vIEFycm93RG93bi9VcC5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBhc3NvY2lhZG8gYSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBkbyB0aXBvIFQgcGFyYSBhIHF1YWwgbyByw7N0dWxvIGRldmUgc2VyIG9idGlkby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wdGlvbkxhYmVsKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gdGV4dG8gZGUgYW7Dum5jaW8gZGUgZ3J1cG8gKGV4LjogXCJBZ3J1cGFkbyBwb3IgQW3DqXJpY2EgZG8gU3VsXCIpIHByYSB1bWEgb3DDp8OjbyxcbiAgICAgKiBjYXNvIGVsYSBzZWphIGEgcHJpbWVpcmEgZG8gc2V1IGdydXBvIOKAlCB2ZXIgYGdyb3VwQW5ub3VuY2VtZW50c2AuXG4gICAgICogQHBhcmFtIG9wdGlvbklkIElkIGRhIG9ww6fDo28gaW50ZXJuYS5cbiAgICAgKiBAcmV0dXJucyBPIHRleHRvIGRlIGFuw7puY2lvLCBvdSBgbnVsbGAgc2UgYSBvcMOnw6NvIG7Do28gZm9yIGEgcHJpbWVpcmEgZG8gZ3J1cG8uXG4gICAgICovXG4gICAgcHVibGljIGdyb3VwQW5ub3VuY2VtZW50Rm9yKG9wdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBBbm5vdW5jZW1lbnRzKCkuZ2V0KG9wdGlvbklkKSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgYSBwb3Npw6fDo28gKDEtYmFzZWQpIGRlIHVtYSBvcMOnw6NvIGRlbnRybyBkbyBjb25qdW50byBuYXZlZ8OhdmVsIOKAlCB2ZXIgYG9wdGlvblBvc2l0aW9uc2AuXG4gICAgICogQHBhcmFtIG9wdGlvbklkIElkIGRhIG9ww6fDo28gaW50ZXJuYS5cbiAgICAgKiBAcmV0dXJucyBBIHBvc2nDp8Ojbywgb3UgYG51bGxgIHNlIGEgb3DDp8OjbyBuw6NvIGZvciBlbmNvbnRyYWRhIChleC46IMOpIHVtIGFncnVwYWRvcikuXG4gICAgICovXG4gICAgcHVibGljIG9wdGlvblBvc2luc2V0Rm9yKG9wdGlvbklkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uUG9zaXRpb25zKCkuZ2V0KG9wdGlvbklkKT8ucG9zaW5zZXQgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gdGFtYW5obyB0b3RhbCBkbyBjb25qdW50byBuYXZlZ8OhdmVsIGFvIHF1YWwgdW1hIG9ww6fDo28gcGVydGVuY2Ug4oCUIHZlciBgb3B0aW9uUG9zaXRpb25zYC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uSWQgSWQgZGEgb3DDp8OjbyBpbnRlcm5hLlxuICAgICAqIEByZXR1cm5zIE8gdGFtYW5obyB0b3RhbCwgb3UgYG51bGxgIHNlIGEgb3DDp8OjbyBuw6NvIGZvciBlbmNvbnRyYWRhIChleC46IMOpIHVtIGFncnVwYWRvcikuXG4gICAgICovXG4gICAgcHVibGljIG9wdGlvblNldHNpemVGb3Iob3B0aW9uSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25Qb3NpdGlvbnMoKS5nZXQob3B0aW9uSWQpPy5zZXRzaXplID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gYmxvY29zIEBmb3IgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3Rhcy5cbiAgICAgKiBSZXRvcm5hIG8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRlIGNhZGEgaXRlbSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gTyBpdGVtIGF0dWFsIGRhIGxpc3RhIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gZG8gaXRlbSBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzZSBhIG9ww6fDo28gZm9ybmVjaWRhIGVzdMOhIHNlbGVjaW9uYWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gaW50ZXJuYSBkbyBkcm9wZG93biBhIHNlciB2ZXJpZmljYWRhLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBhIG9ww6fDo28gZXN0aXZlciBzZWxlY2lvbmFkYSwgY2FzbyBjb250csOhcmlvIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIE5vIG1vZG8gc2ltcGxlcyBhIHNlbGXDp8OjbyBmaWNhIGVtIGB2YWx1ZSgpYDsgYHZhbHVlcygpYCBzw7Mgw6kgdXNhZG8gbm8gbW9kbyBtw7psdGlwbG8uXG4gICAgICAgIC8vIFNlbSBpc3NvLCBhIG9ww6fDo28gZXNjb2xoaWRhIG51bmNhIGFwYXJlY2lhIG1hcmNhZGEgYW8gcmVhYnJpciBhIGxpc3RhIChvIHF1ZSBpbXBvcnRhXG4gICAgICAgIC8vIHByaW5jaXBhbG1lbnRlIG5vIG1vZG8gc29tZW50ZSBsZWl0dXJhLCBjdWpvIG9iamV0aXZvIMOpIGNvbnN1bHRhciBvIHF1ZSBlc3TDoSBzZWxlY2lvbmFkbykuXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpPy5pZCA9PT0gb3B0aW9uLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpIHx8IHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VSZWFkb25seSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2Fubm91bmNlU2VsZWN0QWxsVG9nZ2xlKGZhbHNlLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX2Fubm91bmNlU2VsZWN0QWxsVG9nZ2xlKHRydWUsIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFudW5jaWEgdmlhIGBMaXZlQW5ub3VuY2VyYCBvIHJlc3VsdGFkbyBkZSBcIlNlbGVjaW9uYXIgVG9kb3NcIi9cIkxpbXBhciBUb2Rvc1wiLiBOZWNlc3PDoXJpb1xuICAgICAqIHBvcnF1ZSBvIGNoZWNrYm94IHF1ZSBkaXNwYXJhIGEgYcOnw6NvIHRlbSBmb2NvIHJlYWwgZSBhbnVuY2lhIHNldSBwcsOzcHJpbyBgYXJpYS1jaGVja2VkYFxuICAgICAqIG5vcm1hbG1lbnRlLCBtYXMgYXMgTiBvcMOnw7VlcyBhZmV0YWRhcyAocXVlIG7Do28gZXN0w6NvIGZvY2FkYXMpIG7Do28g4oCUIGFvIGNvbnRyw6FyaW8gZG8gdG9nZ2xlXG4gICAgICogZGUgdW1hIG9ww6fDo28gaW5kaXZpZHVhbCwgY3VqbyBgYXJpYS1zZWxlY3RlZGAgasOhIMOpIGxpZG8gcGVsbyBsZWl0b3IgZGUgdGVsYSBwb3JxdWUgZWxhIMOpIG9cbiAgICAgKiBlbGVtZW50byBhcG9udGFkbyBwb3IgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAgbm8gbW9tZW50byBkYSBtdWRhbsOnYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hbm5vdW5jZVNlbGVjdEFsbFRvZ2dsZShpc05vd1NlbGVjdGVkOiBib29sZWFuLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc05vd1NlbGVjdGVkXG4gICAgICAgICAgICA/IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNvdW50X2l0ZW1zX3NlbGVjdGVkJywgeyBjb3VudCB9KVxuICAgICAgICAgICAgOiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RfYWxsX29wdGlvbnNfY2xlYXJlZCcpO1xuICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgZGUgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIGEgcHJvcHJpZWRhZGUgZGVmaW5pZGEgcG9yIGBvcHRpb25MYWJlbGAgcGFyYSBleHRyYWlyIG8gdmFsb3IgZG8gcsOzdHVsbyBkYSBvcMOnw6NvLlxuICAgICAqIENhc28gYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGVqYSBkZWZpbmlkbywgcmV0b3JuYSBhIHJlcHJlc2VudGHDp8OjbyBlbSBzdHJpbmcgZGEgcHLDs3ByaWEgb3DDp8Ojby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb24gQSBvcMOnw6NvIGRhIHF1YWwgbyByw7N0dWxvIHNlcsOhIGV4dHJhw61kby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuICAgICAgICByZXR1cm4gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIGFzIG9ww6fDtWVzIGZvcm5lY2lkYXMgc8OjbyB2w6FsaWRhcy4gQ2FzbyBhcyBvcMOnw7VlcyBzZWphbSBvYmpldG9zLFxuICAgICAqIGdhcmFudGUgcXVlIGEgcHJvcHJpZWRhZGUgYG9wdGlvbkxhYmVsYCBlc3RlamEgZGVmaW5pZGEsIGxhbsOnYW5kbyB1bSBlcnJvIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBTZSBuw6NvIGhvdXZlciBvcMOnw7VlcywgYSB2YWxpZGHDp8OjbyDDqSBpZ25vcmFkYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTZSBhcyBvcMOnw7VlcyBmb3JlbSBvYmpldG9zIGUgYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGl2ZXIgZGVmaW5pZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNPYmplY3RPcHRpb25zID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc09iamVjdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJvcHRpb25MYWJlbFwiIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gb3B0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc29jaWEgdW0gYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gKHF1ZSBhcG9udGEgcGFyYSBvIGBpZGAgZG8gaG9zdCkgYW9cbiAgICAgKiBjb21ib2JveCBpbnRlcm5vLCByZXNvbHZlbmRvIG8gcHJvYmxlbWEgZGUgXCJvcnBoYW5lZCBsYWJlbFwiLlxuICAgICAqXG4gICAgICogQ29tbyBvIGhvc3QgYHMtc2VsZWN0YCBuw6NvIMOpIHVtIGVsZW1lbnRvIHJvdHVsw6F2ZWwgKGxhYmVsYWJsZSksIG8gYGZvcmAgbsOjb1xuICAgICAqIGNyaWEgdsOtbmN1bG8gcHJvZ3JhbcOhdGljby4gRXN0ZSBtw6l0b2RvOlxuICAgICAqIC0gbG9jYWxpemEgbyBsYWJlbCBxdWUgcmVmZXJlbmNpYSBvIGBpZGAgZG8gaG9zdDtcbiAgICAgKiAtIGdhcmFudGUgcXVlIGVzc2UgbGFiZWwgdGVuaGEgdW0gYGlkYDtcbiAgICAgKiAtIGFwb250YSBvIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IHBhcmEgZXNzZSBsYWJlbDtcbiAgICAgKiAtIGFkaWNpb25hIHVtIGNsaXF1ZSBubyBsYWJlbCBwYXJhIGZvY2FyIG8gY29tYm9ib3ggKGVxdWl2YWxlbnRlIGFvIGBmb3JgKS5cbiAgICAgKlxuICAgICAqIE7Do28gc29icmVzY3JldmUgdW0gYGFyaWFMYWJlbGxlZEJ5YCBleHBsw61jaXRvIGluZm9ybWFkbyBwZWxvIGNvbnN1bWlkb3IuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hcmlhTGFiZWxsZWRCeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3N0SWQgPSB0aGlzLl9ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgICAgIGlmICghaG9zdElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX2ZpbmRMYWJlbEZvcihob3N0SWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxhYmVsLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUobGFiZWwsICdpZCcsIGAke3RoaXMuY29tcG9uZW50SWR9LWxhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5LnNldChsYWJlbC5pZCk7XG5cbiAgICAgICAgLy8gTyBhdHJpYnV0byBgZm9yYCBuw6NvIGZ1bmNpb25sZGEgZW0gaG9zdCBuw6NvLXJvdHVsw6F2ZWwsIGVudMOjbyByZXBsaWNhbW9zXG4gICAgICAgIC8vIG8gY29tcG9ydGFtZW50byBkZSBcImNsaWNhciBubyBsYWJlbCBmb2NhIG8gY29udHJvbGVcIiBtYW51YWxtZW50ZS5cbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWwgPSBsYWJlbDtcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsaXphIG8gYDxsYWJlbD5gIGN1am8gYXRyaWJ1dG8gYGZvcmAgY29ycmVzcG9uZGUgYW8gaWQgaW5mb3JtYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIGhvc3RJZCBJZCBkbyBob3N0IHJlZmVyZW5jaWFkbyBwZWxvIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIE8gZWxlbWVudG8gbGFiZWwgY29ycmVzcG9uZGVudGUgb3UgYG51bGxgLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRMYWJlbEZvcihob3N0SWQ6IHN0cmluZyk6IEhUTUxMYWJlbEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTGFiZWxFbGVtZW50PignbGFiZWxbZm9yXScpO1xuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIEFycmF5LmZyb20obGFiZWxzKSkge1xuICAgICAgICAgICAgaWYgKGxhYmVsLmdldEF0dHJpYnV0ZSgnZm9yJykgPT09IGhvc3RJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIG8gY29tYm9ib3ggaW50ZXJubyBhbyBjbGljYXIgbm8gbGFiZWwgZXh0ZXJubyBhc3NvY2lhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkxhYmVsQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEVzdGUgbcOpdG9kbyBvY3VsdGEgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIGUgcmVkZWZpbmUgbyDDrW5kaWNlIGRvIGl0ZW0gZm9jYWRvIHBhcmEgLTEsXG4gICAgICogaW5kaWNhbmRvIHF1ZSBuZW5odW0gaXRlbSBlc3TDoSBhdHVhbG1lbnRlIGZvY2Fkby4gU2UgbyBmb2NvIGVzdGF2YSBkZW50cm8gZG8gcGFpbmVsXG4gICAgICogc2VuZG8gZmVjaGFkbyAoZXguOiBjYW1wbyBkZSBmaWx0cm8pLCBkZXZvbHZlIG8gZm9jbyBwcm8gY29udGFpbmVyL2NvbWJvYm94IOKAlCBudW5jYVxuICAgICAqIGZvcsOnYSBvIGZvY28gc2UgZWxlIGrDoSBlc3RpdmVyIGVtIG91dHJvIGx1Z2FyIChleC46IG9ww6fDo28gZXNjb2xoaWRhIHZpYSBjbGlxdWUgZG8gbW91c2VcbiAgICAgKiBzZW0gZmlsdHJvLCBvbmRlIG8gZm9jbyBET00gbnVuY2Egc2FpdSBkbyBjb21ib2JveCBwb3IgY2F1c2EgZG8gYXJpYS1hY3RpdmVkZXNjZW5kYW50KS5cbiAgICAgKiBgcHJvdGVjdGVkYCAobsOjbyBgcHJpdmF0ZWApIHBvcnF1ZSB0YW1iw6ltIMOpIGNoYW1hZG8gYSBwYXJ0aXIgZG8gdGVtcGxhdGVcbiAgICAgKiAoYGJhY2tkcm9wQ2xpY2tgL2BkZXRhY2hgIGRvIGBjZGtDb25uZWN0ZWRPdmVybGF5YCkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYW5lbEVsZW1lbnQgPSB0aGlzLl9kcm9wZG93blBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcblxuICAgICAgICBjb25zdCBmb2N1c0lzSW5zaWRlUGFuZWwgPVxuICAgICAgICAgICAgcGFuZWxFbGVtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIE5vZGUgJiYgcGFuZWxFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAoIWZvY3VzSXNJbnNpZGVQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCksIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBQYXJhIGNhZGEgaXRlbSBubyBhcnJheSBkZSBvcMOnw7VlcywgZ2VyYSB1bSBvYmpldG8gYEludGVybmFsRHJvcGRvd25PcHRpb25gIGNvbnRlbmRvIG8gZGFkbyBvcmlnaW5hbFxuICAgICAqIGUgdW0gY2FtcG8gYGlkYCDDum5pY28gYmFzZWFkbyBubyBgY29tcG9uZW50SWRgIGRlc3RhIGluc3TDom5jaWEsIG5vIHRpbWVzdGFtcCBhdHVhbCBlIG5vIMOtbmRpY2UgZG9cbiAgICAgKiBpdGVtLiBDYXNvIGEgb3DDp8OjbyBzZWphIHVtIGdydXBvIChkZXRlY3RhZG8gcGVsYSBwcmVzZW7Dp2EgZGUgdW0gYXJyYXkgYGl0ZW1zYCksIGFkaWNpb25hIHRhbWLDqW0gYVxuICAgICAqIHByb3ByaWVkYWRlIGBncm91cGVyOiB0cnVlYC5cbiAgICAgKlxuICAgICAqIE8gYGNvbXBvbmVudElkYCDDqSBvYnJpZ2F0w7NyaW8gbm8gcHJlZml4bzogYERhdGUubm93KClgIHNvemluaG8gdGVtIHJlc29sdcOnw6NvIGRlIGFwZW5hcyAxbXMsIGUgZHVhc1xuICAgICAqIGluc3TDom5jaWFzIGRlIGBzLXNlbGVjdGAgbmEgbWVzbWEgcMOhZ2luYSBmcmVxdWVudGVtZW50ZSBpbmljaWFsaXphbSBkZW50cm8gZG8gbWVzbW8gbWlsaXNzZWd1bmRvXG4gICAgICogKGNvbmZpcm1hZG8gdmlhIHRlc3RlIG1hbnVhbCDigJQgcmVwb3J0YWRvIHZpYSBOVkRBOiB1bWEgb3DDp8OjbyBqw6Egc2VsZWNpb25hZGEgZW0gT1VUUk8gYHMtc2VsZWN0YCBkYVxuICAgICAqIHDDoWdpbmEgZXJhIGFudW5jaWFkYSBlbSB2ZXogZGEgb3DDp8OjbyBkZSBmYXRvIGNsaWNhZGEpLiBTZW0gbyBgY29tcG9uZW50SWRgLCBvcyBpZHMgY29saWRpYW0gZW50cmVcbiAgICAgKiBpbnN0w6JuY2lhcyBkaWZlcmVudGVzIChgaWRfPG1lc21vLXRpbWVzdGFtcD5fMGAgZW0gYW1iYXMpLCBlIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgL2BnZXRFbGVtZW50QnlJZGBcbiAgICAgKiByZXNvbHZpYW0gcHJvIGVsZW1lbnRvIGVycmFkbyDigJQgZGUgb3V0cm8gc2VsZWN0LiBPIHRpbWVzdGFtcCBjb250aW51YSBubyBpZCAoYWzDqW0gZG8gYGNvbXBvbmVudElkYClcbiAgICAgKiBwcmEgbWFudGVyIGlkcyDDum5pY29zIGVudHJlIHJlY29tcHV0YcOnw7VlcyBkYSBNRVNNQSBpbnN0w6JuY2lhIHF1YW5kbyBgb3B0aW9ucygpYCBtdWRhIGRlIHJlZmVyw6puY2lhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgb3DDp8O1ZXMgZG8gdGlwbyBgVGAgYSBzZXJlbSBwcm9jZXNzYWRhcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBvYmpldG9zIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YCBjb20gaWRlbnRpZmljYWRvcmVzIMO6bmljb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb09wdGlvbnMob3B0aW9uczogVFtdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKCkgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7dGhpcy5jb21wb25lbnRJZH1faWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgICAgICAgICBncm91cGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgIGlkOiBgJHt0aGlzLmNvbXBvbmVudElkfV9pZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgcG9zc2l2ZWxtZW50ZSBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLlxuICAgICAqIFBhcmEgY2FkYSBvcMOnw6NvIHF1ZSBwb3NzdWkgdW0gYWdydXBhZG9yIChgZ3JvdXBlcmApIGUgdW0gYXJyYXkgZGUgaXRlbnMgZW0gYGRhdGEuaXRlbXNgLFxuICAgICAqIGFkaWNpb25hIGEgb3DDp8OjbyBkbyBhZ3J1cGFkb3IgZSwgZW0gc2VndWlkYSwgYWRpY2lvbmEgY2FkYSBpdGVtIGRvIGdydXBvIGNvbW8gdW1hIG5vdmEgb3DDp8Ojb1xuICAgICAqIGluZGl2aWR1YWwsIGF0cmlidWluZG8gdW0gYGlkYCDDum5pY28gcGFyYSBjYWRhIGl0ZW0gZG8gZ3J1cG8uXG4gICAgICogQ2FzbyBhIG9ww6fDo28gbsOjbyBzZWphIHVtIGFncnVwYWRvciwgZWxhIMOpIGFkaWNpb25hZGEgZGlyZXRhbWVudGUgYW8gcmVzdWx0YWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24sIHBvZGVuZG8gY29udGVyIGFncnVwYWRvcmVzLlxuICAgICAqIEByZXR1cm5zIExpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLCBpbmNsdWluZG8gYWdydXBhZG9yZXMgZSBzZXVzIGl0ZW5zIGV4cGFuZGlkb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JvdXBlclRvRmxhdChvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSA9IFtdO1xuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSAob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcy5tYXAoKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtvcHRpb24uaWR9X2l0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5ncm91cEl0ZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbCBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIHF1ZSBzZWphbSBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCAmJiBvcHRpb25zW25leHRJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvciBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIGRvIHRpcG8gXCJncm91cGVyXCIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHByZXZJbmRleCA+PSAwICYmIG9wdGlvbnNbcHJldkluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBwcmV2SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBvcMOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEVzdGUgbcOpdG9kbyBvYnTDqW0gbyBJRCBkYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGEgcGFydGlyIGRhIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSB1bSBJRCB2w6FsaWRvIGZvciBlbmNvbnRyYWRvLCBidXNjYSBvIGVsZW1lbnRvIGNvcnJlc3BvbmRlbnRlIG5vIERPTSBlIHV0aWxpemFcbiAgICAgKiBgc2Nyb2xsSW50b1ZpZXdgIHBhcmEgcm9sYXIgYXTDqSBhIG9ww6fDo28sIGFsaW5oYW5kby1hIGFvIGJsb2NvIG1haXMgcHLDs3hpbW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZm9jbyBubyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8gYW8gYWJyaXIgbyBkcm9wZG93bi5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGZvY2EgbyBpdGVtIHNlbGVjaW9uYWRvLiBObyBtb2RvIG3Dumx0aXBsbywgZm9jYSBvIHByaW1laXJvIGl0ZW0gc2VsZWNpb25hZG8uXG4gICAgICogQXDDs3MgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheSwgcm9sYSBhIGxpc3RhIGF0w6kgbyBpdGVtIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGZpcnN0U2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCksIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNlbGVjdC1jb250YWluZXIgZ3JvdXAgZmxleCBoLVszNXB4XSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWVkaXVtIGJvcmRlciBvdXRsaW5lLTIgb3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXSBvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lXCJcbiAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpIHx8IHJlYWRvbmx5KClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtNV09XCJkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtYXV0b109XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKCkgJiYgIXJlYWRvbmx5KClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5KCkgJiYgIWRpc2FibGVkKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtb3duc109XCJzaG93T3B0aW9ucygpID8gY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cInNob3dPcHRpb25zKCkgPyBmb2N1c2VkT3B0aW9uSWQoKSA6IG51bGxcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgW2lkXT1cImNvbXBvbmVudElkICsgJy1jb21ib2JveCdcIlxuICAgIChjbGljayk9XCJvbkNvbnRhaW5lckRpdkNsaWNrKClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICBbYXR0ci50YWJpbmRleF09XCJkaXNhYmxlZCgpID8gLTEgOiAwXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCgpIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJyZXNvbHZlZEFyaWFMYWJlbGxlZEJ5KCkgfHwgbnVsbFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC1bMTBweF0gcHktWzdweF1cIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKCkgJiYgIWlzQ2xlYW4oKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS02MF09XCIhZGlzYWJsZWQoKSAmJiBpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICB7eyBwcmludCgpIHx8IHBsYWNlaG9sZGVyKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICBAaWYgKCFkaXNhYmxlZCgpICYmICFyZWFkb25seSgpICYmIHNob3dDbGVhcigpICYmICFpc0NsZWFuKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJteC0zXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYXJpYV9jbGVhcl9zZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgZmxleCB3LTkgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1sXCJcbiAgICAgICAgW2NsYXNzLmdyb3VwLWhvdmVyOmJnLWdyYXlzY2FsZS01XT1cIiFyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKCkgJiYgIXJlYWRvbmx5KClcIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtYmFzZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC1kb3duXT1cIiFzaG93T3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJzaG93T3B0aW9ucygpXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJfY2xvc2VEcm9wZG93bigpXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICAoYXR0YWNoKT1cIl9zeW5jUGFuZWxXaWR0aCgpXCJcbiAgICAoZGV0YWNoKT1cIl9jbG9zZURyb3Bkb3duKClcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI2Ryb3Bkb3duUGFuZWxcbiAgICAgICAgW2lkXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwYW5lbFdpZHRoKClcIlxuICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtdWx0aXBsZSgpID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5KCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIFtAdmlzaWJpbGl0eUNoYW5nZWRdXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cInNlbGVjdEFsbENoZWNrYm94QXJpYUxhYmVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtWzM1cHhdIGdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25GaWx0ZXJLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXJfb3B0aW9ucycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZE9wdGlvbklkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25DbGVhckZpbHRlckJ1dHRvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jbGVhcl9maWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrSWNvbkNsYXNzXT1cImNoZWNrSWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEFubm91bmNlbWVudF09XCJncm91cEFubm91bmNlbWVudEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3NpbnNldF09XCJvcHRpb25Qb3NpbnNldEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZXRzaXplXT1cIm9wdGlvblNldHNpemVGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tJY29uQ2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwQW5ub3VuY2VtZW50XT1cImdyb3VwQW5ub3VuY2VtZW50Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Bvc2luc2V0XT1cIm9wdGlvblBvc2luc2V0Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NldHNpemVdPVwib3B0aW9uU2V0c2l6ZUZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj5cbiAgICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|