@seniorsistemas/angular-components 19.9.4 → 19.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/autocomplete/README.md +4 -0
  2. package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +7 -1
  3. package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +3 -1
  4. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +10 -4
  5. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +5 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +2 -2
  7. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  8. package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +21 -3
  9. package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +14 -3
  10. package/esm2022/insights/lib/insights/insights.component.mjs +15 -4
  11. package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
  12. package/esm2022/rating-scale/lib/rating-scale/models/rating-scale-node.mjs +1 -1
  13. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +23 -3
  14. package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +5 -3
  15. package/esm2022/select/lib/select/select.component.mjs +6 -4
  16. package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +7 -3
  17. package/esm2022/split-button/lib/split-button/split-button.component.mjs +11 -3
  18. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
  19. package/esm2022/text-area/lib/text-area/text-area.component.mjs +1 -1
  20. package/esm2022/token-list/lib/token-list/token-list.component.mjs +7 -3
  21. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +13 -5
  22. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  23. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  24. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  25. package/fesm2022/seniorsistemas-angular-components-editor.mjs +2 -2
  26. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-insights.mjs +47 -7
  28. package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
  30. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +22 -2
  32. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-select.mjs +9 -5
  34. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +6 -2
  36. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +10 -2
  38. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  39. package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +1 -1
  42. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  43. package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -2
  44. package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
  45. package/insights/README.md +12 -0
  46. package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +22 -1
  47. package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +9 -1
  48. package/insights/lib/insights/insights.component.d.ts +9 -1
  49. package/package.json +7 -7
  50. package/rating-scale/README.md +38 -13
  51. package/rating-scale/lib/rating-scale/models/rating-scale-node.d.ts +8 -0
  52. package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +4 -1
  53. package/select/README.md +2 -0
  54. package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
  55. package/select/lib/select/select.component.d.ts +3 -1
  56. package/speech-recognition/README.md +1 -0
  57. package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +3 -1
  58. package/split-button/README.md +2 -0
  59. package/split-button/lib/split-button/split-button.component.d.ts +5 -1
  60. package/token-list/lib/token-list/token-list.component.d.ts +3 -1
@@ -50,6 +50,8 @@ export class SelectComponent {
50
50
  filter = input(false);
51
51
  /** @description Exibe um ícone de checkmark ao lado da opção selecionada. @default false */
52
52
  checkmark = input(false);
53
+ /** @description Classe do ícone de checkmark exibido quando `checkmark` está ativo. @default 'far fa-check' */
54
+ checkIconClass = input('far fa-check');
53
55
  /** @description Chave(s) do objeto usada(s) para filtragem textual. Quando não informado, usa `optionLabel`. */
54
56
  filterBy = input();
55
57
  /** @description Habilita agrupamento de opções. As opções devem conter itens filhos conforme a estrutura de grupo suportada. @default false */
@@ -839,13 +841,13 @@ export class SelectComponent {
839
841
  }
840
842
  }
841
843
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
842
- 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 }, 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: [
844
+ 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: [
843
845
  {
844
846
  provide: NG_VALUE_ACCESSOR,
845
847
  useExisting: forwardRef(() => SelectComponent),
846
848
  multi: true,
847
849
  },
848
- ], 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, 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-[3px] border outline-1 outline-primary focus: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-3 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 [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 items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas\"\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)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\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]=\"containerDiv.offsetWidth\"\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 (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 outline-1 outline-primary\"\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 [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 >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"], 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"], 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: [
850
+ ], 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, 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-[3px] border outline-1 outline-primary focus: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-3 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 [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 items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas\"\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)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\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]=\"containerDiv.offsetWidth\"\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 (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 outline-1 outline-primary\"\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 [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 >\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 ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"], 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"], 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: [
849
851
  trigger('visibilityChanged', [
850
852
  state('void', style({ opacity: 0, transform: 'scale(0.95)' })),
851
853
  transition(':enter', [
@@ -884,6 +886,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
884
886
  animate('500ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'scale(0.95)' })),
885
887
  ]),
886
888
  ]),
887
- ], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [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-3 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 [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 items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas\"\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)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\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]=\"containerDiv.offsetWidth\"\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 (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 outline-1 outline-primary\"\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 [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 >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
889
+ ], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [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-3 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 [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 items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas\"\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)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\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]=\"containerDiv.offsetWidth\"\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 (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 outline-1 outline-primary\"\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 [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 >\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 ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
888
890
  }], ctorParameters: () => [] });
889
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUVILFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFD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QixPQUFPLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzs2QkFDakcsQ0FBQzt5QkFDTCxDQUFDO3FCQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICBlZmZlY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW50ZXJmYWNlIEludGVybmFsRHJvcGRvd25PcHRpb248VD4ge1xuICAgIGRhdGE6IFQ7XG4gICAgaWQ6IHN0cmluZztcbiAgICBncm91cGVyPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudGUgZGUgc2VsZcOnw6NvIGRyb3Bkb3duIGdlbsOpcmljbyBjb20gc3Vwb3J0ZSBhIHNlbGXDp8OjbyBzaW1wbGVzIGUgbcO6bHRpcGxhLFxuICogZmlsdHJvLCBhZ3J1cGFtZW50bywgdmlydHVhbCBzY3JvbGwgZSBhY2Vzc2liaWxpZGFkZSAoQVJJQSBjb21ib2JveCkuIEltcGxlbWVudGFcbiAqIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gcGFyYSBpbnRlZ3Jhw6fDo28gY29tIFJlYWN0aXZlIEZvcm1zIGUgVGVtcGxhdGUtZHJpdmVuIEZvcm1zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1zZWxlY3RcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcmlhXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgdW1hIGNhdGVnb3JpYVwiXG4gKiAgIFtvcHRpb25zXT1cImNhdGVnb3JpYXNcIlxuICogICBvcHRpb25MYWJlbD1cIm5vbWVcIlxuICogICBvcHRpb25WYWx1ZT1cImlkXCJcbiAqICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAqICAgW3Nob3dDbGVhcl09XCJ0cnVlXCIgLz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBJbnB1dHNcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICAgICAgU2VsZWN0T3B0aW9uQ29tcG9uZW50LFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnKHdpbmRvdzpyZXNpemUpJzogJ29uV2luZG93UmVzaXplKCRldmVudCknLFxuICAgIH0sXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0Lm5nLWRpcnR5Lm5nLWludmFsaWQge1xuICAgICAgICAgICAgICAgIC5kcm9wZG93bi1jb250YWluZXIsXG4gICAgICAgICAgICAgICAgLnNlbGVjdC1jb250YWluZXIge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBgLFxuICAgIF0sXG5cbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHRyaWdnZXIoJ3Zpc2liaWxpdHlDaGFuZ2VkJywgW1xuICAgICAgICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOTUpJyB9KSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnNTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCc1MDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjk1KScgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0pLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkID0gMDtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtYSBvcMOnw6NvIGVzdMOhIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IGlucHV0KCcnKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYSBzZWxlw6fDo28gZGUgbcO6bHRpcGxhcyBvcMOnw7VlcyBzaW11bHTDom5lYXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIG11bHRpcGxlID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMaXN0YSBkZSBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBzZWxlw6fDo28uIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyBsYWJlbCBkZSBleGliacOnw6NvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gdmFsb3IgYSBzZXIgZW1pdGlkbyBhbyBmb3JtdWzDoXJpby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uVmFsdWUgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSBib3TDo28gcGFyYSBsaW1wYXIgYSBzZWxlw6fDo28gYXR1YWwuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdW0gY2FtcG8gZGUgZmlsdHJvIHRleHR1YWwgcGFyYSBwZXNxdWlzYSBuYXMgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGZpbHRlciA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gw61jb25lIGRlIGNoZWNrbWFyayBhbyBsYWRvIGRhIG9ww6fDo28gc2VsZWNpb25hZGEuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUocykgZG8gb2JqZXRvIHVzYWRhKHMpIHBhcmEgZmlsdHJhZ2VtIHRleHR1YWwuIFF1YW5kbyBuw6NvIGluZm9ybWFkbywgdXNhIGBvcHRpb25MYWJlbGAuICovXG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhZ3J1cGFtZW50byBkZSBvcMOnw7Vlcy4gQXMgb3DDp8O1ZXMgZGV2ZW0gY29udGVyIGl0ZW5zIGZpbGhvcyBjb25mb3JtZSBhIGVzdHJ1dHVyYSBkZSBncnVwbyBzdXBvcnRhZGEuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGdyb3VwID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB2aXJ0dWFsaXphw6fDo28gZGEgbGlzdGEgcGFyYSBtZWxob3IgcGVyZm9ybWFuY2UgY29tIGdyYW5kZXMgdm9sdW1lcyBkZSBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQWx0dXJhIGZpeGEgZGUgY2FkYSBpdGVtIGRhIGxpc3RhIGVtIHBpeGVscywgbmVjZXNzw6FyaWEgcGFyYSBvIGPDoWxjdWxvIGRvIHZpcnR1YWwgc2Nyb2xsLiBAZGVmYXVsdCAzNyAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGV4aWJpZGEgcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBjb3JyZXNwb25kZSBhbyBmaWx0cm8gYXBsaWNhZG8uIEBkZWZhdWx0IG51bGwgKi9cbiAgICBwdWJsaWMgZW1wdHlNZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIG8gZXN0YWRvIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBhIHZpc2liaWxpZGFkZSBkbyBwYWluZWwgZGUgb3DDp8O1ZXMgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd09wdGlvbnMgPSBtb2RlbChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExhYmVsIGRlIGFjZXNzaWJpbGlkYWRlIGRvIGNvbXBvbmVudGUuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIGFyaWFMYWJlbCA9IGlucHV0KCcnKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSUQgZG8gZWxlbWVudG8gZXh0ZXJubyBxdWUgZGVzY3JldmUgbyBjb21wb25lbnRlIChhcmlhLWxhYmVsbGVkYnkpLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IGlucHV0KCcnKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkgPSBzaWduYWwoJycpO1xuXG4gICAgLyoqXG4gICAgICogSUQgZG8gbGFiZWwgcmVzb2x2aWRvIHBhcmEgYGFyaWEtbGFiZWxsZWRieWAgZG8gY29tYm9ib3ggaW50ZXJuby5cbiAgICAgKiBQcmlvcml6YSBvIHZhbG9yIGV4cGzDrWNpdG8gZGUgYGFyaWFMYWJlbGxlZEJ5YDsgY2FzbyBjb250csOhcmlvLCB1c2EgbyBpZCBkZSB1bVxuICAgICAqIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBleHRlcm5vIGFzc29jaWFkbyBhbyBob3N0IChkZXRlY3RhZG8gZW0gcnVudGltZSkuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc29sdmVkQXJpYUxhYmVsbGVkQnkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbGxlZEJ5KCkgfHwgdGhpcy5fZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeSgpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHZhbHVlID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oW10pO1xuICAgIHB1YmxpYyBmaWx0ZXJWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGZvY3VzZWRJbmRleCA9IHNpZ25hbCgtMSk7XG4gICAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlOiBUIHwgVFtdIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYHNlbGVjdCR7U2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyAoZXhjbHVpbmRvIGFncnVwYWRvcmVzKSBlc3RpdmVyZW0gcHJlc2VudGVzXG4gICAgICogbmEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MsIGUgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGFsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnZhbHVlcygpLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IHJldCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKG9wdGlvbi5pZCkpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5kYXRhID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRPcHRpb25JZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5pZCA/PyBudWxsO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmRzX3NlbGVjdGVkYCwge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2VsZWN0ZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkWzBdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQgPyB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWQuZGF0YSkgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzZSBvIHNlbGV0b3IgZXN0w6EgXCJsaW1wb1wiLCBvdSBzZWphLCBzZW0gbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZXNgIGVzdMOhIHZhemlvKS5cbiAgICAgKiAtIE5vIG1vZG8gc2ltcGxlcywgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZWAgw6kgZmFsc3kpLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBzZWxlw6fDo28sIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NsZWFuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSgpID8gIXRoaXMudmFsdWVzKCkubGVuZ3RoIDogIXRoaXMudmFsdWUoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIFwiU2VsZWNpb25hciBUb2Rvc1wiIGVzdMOhIGluZGV0ZXJtaW5hZG8uXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgcXVhbmRvIG5lbSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgZXN0w6NvIHNlbGVjaW9uYWRvcyBlIG5lbSB0b2RvcyBlc3TDo28gZGVzbWFyY2Fkb3MsXG4gICAgICogb3Ugc2VqYSwgcXVhbmRvIGjDoSB1bWEgc2VsZcOnw6NvIHBhcmNpYWwgZG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIGEgc2VsZcOnw6NvIGZvciBwYXJjaWFsLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpLnNvbWUoKG8pID0+IG8uaWQgPT09IG9wdGlvbi5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3QgYWxsID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG4gICAgICAgIGNvbnN0IG5vbmUgPSBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+ICFzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcblxuICAgICAgICByZXR1cm4gIWFsbCAmJiAhbm9uZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcyBjb20gYmFzZSBubyB2YWxvciBkZSBidXNjYSAoYGZpbHRlclZhbHVlYCkgZSBub3MgY3JpdMOpcmlvcyBkZWZpbmlkb3MuXG4gICAgICogLSBTZSBvIGZpbHRybyBlc3RpdmVyIGRlc2FiaWxpdGFkbyBvdSBvIHZhbG9yIGRlIGJ1c2NhIGVzdGl2ZXIgdmF6aW8sIHJldG9ybmEgdG9kYXMgYXMgb3DDp8O1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGZpbHRyYSBhcyBvcMOnw7VlcyB1dGlsaXphbmRvIG8ocykgY2FtcG8ocykgZXNwZWNpZmljYWRvKHMpIGVtIGBmaWx0ZXJCeWAuXG4gICAgICogLSBJZ25vcmEgb3DDp8O1ZXMgcXVlIHBvc3N1ZW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcmAgZGVmaW5pZGEuXG4gICAgICogQHJldHVybnMgQXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbmZvcm1lIG8gdmFsb3IgZGUgYnVzY2EgZSBjcml0w6lyaW9zIGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5maWx0ZXJWYWx1ZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIoKSB8fCAhc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5maWx0ZXJCeSgpO1xuICAgICAgICByZXR1cm4gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSAnJztcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbi5kYXRhW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckJ5KSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gZmlsdGVyQnkubWFwKChieSkgPT4gU3RyaW5nKG9wdGlvbi5kYXRhW2J5XSA/PyAnJykpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBTdHJpbmcob3B0aW9uLmRhdGFbZmlsdGVyQnldID8/ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXA8eyBmaWx0ZXI6IEZvcm1Db250cm9sPHN0cmluZz4gfT4oe1xuICAgICAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGFpbmVyRGl2ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyRGl2Jyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVySW5wdXQgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2ZpbHRlcklucHV0Jyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0QWxsQ2hlY2tib3ggPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdzZWxlY3RBbGxDaGVja2JveCcpO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSB8IGFueVtdIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSBfY2xpY2thYmxlTGFiZWw6IEhUTUxMYWJlbEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaG9zdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm1cbiAgICAgICAgICAgIC5nZXQoJ2ZpbHRlcicpIVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRWZlaXRvIHBhcmEgdGVudGFyIGFwbGljYXIgdmFsb3IgcGVuZGVudGUgcXVhbmRvIG9wdGlvbnMgbXVkYXIuXG4gICAgICAgIC8vIEEgZXNjcml0YSBlbSB2YWx1ZS92YWx1ZXMgw6kgbmVjZXNzw6FyaWEgcGFyYSBzaW5jcm9uaXphciBvIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmxlbmd0aCAmJiB0aGlzLl9wZW5kaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jbGlja2FibGVMYWJlbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIHZhbG9yIHNlbGVjaW9uYWRvIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBPIHZhbG9yIGEgc2VyIGRlZmluaWRvLiBQb2RlIHNlciB1bSBvYmpldG8gZG8gdGlwbyBgVGAsIHVtIGFycmF5IGRlIGBUYCAocXVhbmRvIG3Dumx0aXBsYSBzZWxlw6fDo28gZXN0w6EgaGFiaWxpdGFkYSksIG91IGBudWxsYC5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbyB2YWxvciBuw6NvIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgZGVzYXRpdmFkbyBlIG8gdmFsb3IgZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gbWFwZWlhIG8ocykgdmFsb3IoZXMpIGZvcm5lY2lkbyhzKSBwYXJhIGFzIG9ww6fDtWVzIGludGVybmFzIGRvIGNvbXBvbmVudGUsXG4gICAgICogZ2FyYW50aW5kbyBxdWUgYXBlbmFzIG9ww6fDtWVzIHbDoWxpZGFzIHNlamFtIHNlbGVjaW9uYWRhcyBjb25mb3JtZSBvIG1vZG8gZGUgc2VsZcOnw6NvICjDum5pY28gb3UgbcO6bHRpcGxvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgLy8gQXJtYXplbmEgdmFsb3IgcGVuZGVudGUgZSB0ZW50YSBhcGxpY2FyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9hcHBseVBlbmRpbmdWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlbnRhIGFwbGljYXIgbyB2YWxvciBwZW5kZW50ZSAoX3BlbmRpbmdWYWx1ZSkgYW8gZXN0YWRvIGRvIGNvbXBvbmVudGUsXG4gICAgICogbWFwZWFuZG8gcGFyYSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IGNvbmZvcm1lIG9wdGlvbnMgZGlzcG9uw612ZWlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FwcGx5UGVuZGluZ1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BlbmRpbmdWYWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmZpbmQoKG9wdCkgPT4gb3B0LmRhdGFbb3B0aW9uVmFsdWVdID09PSB2KSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodikpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG9wdCk6IG9wdCBpcyBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+ID0+ICEhb3B0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQobWFwcGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvblZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIG9wdGlvblZhbHVlIGluIHZhbHVlID8gdmFsdWVbb3B0aW9uVmFsdWVdIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gY29tcGFyZVZhbHVlKSB8fCBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobWFwcGVkID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZSBGdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgcmVjZWJlIG8gbm92byB2YWxvciBzZWxlY2lvbmFkbyBvdSBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IFQgfCBUW10gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXG4gICAgICogQHBhcmFtIG9uVG91Y2hlZCBGdW7Dp8OjbyBkZSBjYWxsYmFjayBhIHNlciBleGVjdXRhZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgbWFyY2FkbyBjb21vIFwidG9jYWRvXCIuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyByZWFsaXphIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIENhc28gY29udHLDoXJpbywgaW52ZXJ0ZSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRhcyBvcMOnw7Vlcy5cbiAgICAgKiBBbyBhYnJpciwgbW92ZSBvIGZvY28gcGFyYSBvIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gIXRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBzaG91bGRPcGVuO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcblxuICAgICAgICBpZiAoc2hvdWxkT3Blbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBRdWFuZG8gaMOhIGZpbHRybyBjb20gbcO6bHRpcGxhIHNlbGXDp8OjbywgZm9jbyB2YWkgcGFyYSBvIGNoZWNrYm94IHByaW1laXJvO1xuICAgICAgICAgICAgICAgIC8vIGNhc28gY29udHLDoXJpbywgdmFpIGRpcmV0byBwYXJhIG8gaW5wdXQgZGUgZmlsdHJvLlxuICAgICAgICAgICAgICAgIC8vIE8gZm9jbyDDqSBtb3ZpZG8gYXDDs3MgYSByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LlxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2JveEhvc3QgPSB0aGlzLl9zZWxlY3RBbGxDaGVja2JveCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gY2hlY2tib3hIb3N0Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW3RhYmluZGV4XScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVySW5wdXQoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB1bSBpdGVtIG5vIGNvbXBvbmVudGUgZGUgc2VsZcOnw6NvLlxuICAgICAqIEBwYXJhbSBpdGVtIE8gaXRlbSBhIHNlciBzZWxlY2lvbmFkbyBvdSBkZXNtYXJjYWRvLlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgYSBmdW7Dp8OjbyByZXRvcm5hIGltZWRpYXRhbWVudGUuXG4gICAgICogTm8gbW9kbyBtw7psdGlwbG8sIGFkaWNpb25hIG91IHJlbW92ZSBvIGl0ZW0gZGEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogTm8gbW9kbyBzaW1wbGVzLCBkZWZpbmUgbyBpdGVtIGNvbW8gdmFsb3Igc2VsZWNpb25hZG8gZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIFNlbXByZSBub3RpZmljYSBhcyBtdWRhbsOnYXMgZSBtYXJjYSBvIGNvbXBvbmVudGUgY29tbyB0b2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZSA9IFsuLi50aGlzLnZhbHVlcygpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuZmluZEluZGV4KChzZWxlY3RlZEl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtID09PSBpdGVtO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoc3RvcmUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBzdG9yZS5tYXAoKGl0ZW0pID0+IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0pIDogc3RvcmU7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoaXRlbSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0gOiBpdGVtLmRhdGE7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGlucHV0IGRlIGZpbHRybyBkbyBvdmVybGF5LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcmltZWlyYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgw7psdGltYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24gZSByZXRvcm5hIG8gZm9jbyBhbyBjb21ib2JveC5cbiAgICAgKiAtICdFbnRlcic6IFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhLCBzZSBob3V2ZXIuXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIG5vIGlucHV0IGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVuaHVtIGl0ZW0gZm9jYWRvOiBmb2NhIG8gw7psdGltbyBkaXNwb27DrXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RJbmRleCA9IG9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiBvcHRpb25zW2xhc3RJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBldmVudG9zIGRlIHRlY2xhZG8gcGFyYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBvcMOnw7VlcyBubyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbC5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IuXG4gICAgICogLSAnVGFiJzogU2VsZWNpb25hIGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBlIGZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnRW50ZXInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiAtICcgJzogKGJhcnJhIGRlIGVzcGHDp28pIFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiBQcmV2aW5lIG8gY29tcG9ydGFtZW50byBwYWRyw6NvIGRvIG5hdmVnYWRvciBxdWFuZG8gbmVjZXNzw6FyaW8gcGFyYSBnYXJhbnRpciBhIG5hdmVnYcOnw6NvIGFkZXF1YWRhIHBlbG8gdGVjbGFkby5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGggJiYgZXZlbnQua2V5ICE9PSAnRXNjYXBlJyAmJiBldmVudC5rZXkgIT09ICdFbnRlcicgJiYgZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IF9zZWxlY3RPcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICAvLyBRdWFuZG8gaMOhIGZpbHRybyBhYmVydG8sIFRhYiBkZXZlIG5hdmVnYXIgcGFyYSBkZW50cm8gZG8gb3ZlcmxheSAobsOjbyBmZWNoYXIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSAmJiB0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gYmxvY29zIEBmb3IgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3Rhcy5cbiAgICAgKiBSZXRvcm5hIG8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRlIGNhZGEgaXRlbSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gTyBpdGVtIGF0dWFsIGRhIGxpc3RhIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gZG8gaXRlbSBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzZSBhIG9ww6fDo28gZm9ybmVjaWRhIGVzdMOhIHNlbGVjaW9uYWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gaW50ZXJuYSBkbyBkcm9wZG93biBhIHNlciB2ZXJpZmljYWRhLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBhIG9ww6fDo28gZXN0aXZlciBzZWxlY2lvbmFkYSwgY2FzbyBjb250csOhcmlvIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnZhbHVlcygpLmZpbmQoKG8pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbyA9PT0gb3B0aW9uO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBzZWxlw6fDo28gZGUgdG9kb3Mgb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCBzZWxlY2lvbmEgdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIHF1ZSBuw6NvIHPDo28gYWdydXBhZG9yZXNcbiAgICAgKiBjYXNvIG5lbSB0b2RvcyBlc3RlamFtIHNlbGVjaW9uYWRvcywgb3UgbGltcGEgYSBzZWxlw6fDo28gY2FzbyB0b2RvcyBqw6EgZXN0ZWphbSBzZWxlY2lvbmFkb3MuXG4gICAgICogQXDDs3MgYSBhbHRlcmHDp8Ojbywgbm90aWZpY2EgYSBtdWRhbsOnYSBkZSB2YWxvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgZGUgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIGEgcHJvcHJpZWRhZGUgZGVmaW5pZGEgcG9yIGBvcHRpb25MYWJlbGAgcGFyYSBleHRyYWlyIG8gdmFsb3IgZG8gcsOzdHVsbyBkYSBvcMOnw6NvLlxuICAgICAqIENhc28gYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGVqYSBkZWZpbmlkbywgcmV0b3JuYSBhIHJlcHJlc2VudGHDp8OjbyBlbSBzdHJpbmcgZGEgcHLDs3ByaWEgb3DDp8Ojby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb24gQSBvcMOnw6NvIGRhIHF1YWwgbyByw7N0dWxvIHNlcsOhIGV4dHJhw61kby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuICAgICAgICByZXR1cm4gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIGFzIG9ww6fDtWVzIGZvcm5lY2lkYXMgc8OjbyB2w6FsaWRhcy4gQ2FzbyBhcyBvcMOnw7VlcyBzZWphbSBvYmpldG9zLFxuICAgICAqIGdhcmFudGUgcXVlIGEgcHJvcHJpZWRhZGUgYG9wdGlvbkxhYmVsYCBlc3RlamEgZGVmaW5pZGEsIGxhbsOnYW5kbyB1bSBlcnJvIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBTZSBuw6NvIGhvdXZlciBvcMOnw7VlcywgYSB2YWxpZGHDp8OjbyDDqSBpZ25vcmFkYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTZSBhcyBvcMOnw7VlcyBmb3JlbSBvYmpldG9zIGUgYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGl2ZXIgZGVmaW5pZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNPYmplY3RPcHRpb25zID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc09iamVjdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJvcHRpb25MYWJlbFwiIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gb3B0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc29jaWEgdW0gYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gKHF1ZSBhcG9udGEgcGFyYSBvIGBpZGAgZG8gaG9zdCkgYW9cbiAgICAgKiBjb21ib2JveCBpbnRlcm5vLCByZXNvbHZlbmRvIG8gcHJvYmxlbWEgZGUgXCJvcnBoYW5lZCBsYWJlbFwiLlxuICAgICAqXG4gICAgICogQ29tbyBvIGhvc3QgYHMtc2VsZWN0YCBuw6NvIMOpIHVtIGVsZW1lbnRvIHJvdHVsw6F2ZWwgKGxhYmVsYWJsZSksIG8gYGZvcmAgbsOjb1xuICAgICAqIGNyaWEgdsOtbmN1bG8gcHJvZ3JhbcOhdGljby4gRXN0ZSBtw6l0b2RvOlxuICAgICAqIC0gbG9jYWxpemEgbyBsYWJlbCBxdWUgcmVmZXJlbmNpYSBvIGBpZGAgZG8gaG9zdDtcbiAgICAgKiAtIGdhcmFudGUgcXVlIGVzc2UgbGFiZWwgdGVuaGEgdW0gYGlkYDtcbiAgICAgKiAtIGFwb250YSBvIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IHBhcmEgZXNzZSBsYWJlbDtcbiAgICAgKiAtIGFkaWNpb25hIHVtIGNsaXF1ZSBubyBsYWJlbCBwYXJhIGZvY2FyIG8gY29tYm9ib3ggKGVxdWl2YWxlbnRlIGFvIGBmb3JgKS5cbiAgICAgKlxuICAgICAqIE7Do28gc29icmVzY3JldmUgdW0gYGFyaWFMYWJlbGxlZEJ5YCBleHBsw61jaXRvIGluZm9ybWFkbyBwZWxvIGNvbnN1bWlkb3IuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hcmlhTGFiZWxsZWRCeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3N0SWQgPSB0aGlzLl9ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgICAgIGlmICghaG9zdElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX2ZpbmRMYWJlbEZvcihob3N0SWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxhYmVsLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUobGFiZWwsICdpZCcsIGAke3RoaXMuY29tcG9uZW50SWR9LWxhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5LnNldChsYWJlbC5pZCk7XG5cbiAgICAgICAgLy8gTyBhdHJpYnV0byBgZm9yYCBuw6NvIGZ1bmNpb25sZGEgZW0gaG9zdCBuw6NvLXJvdHVsw6F2ZWwsIGVudMOjbyByZXBsaWNhbW9zXG4gICAgICAgIC8vIG8gY29tcG9ydGFtZW50byBkZSBcImNsaWNhciBubyBsYWJlbCBmb2NhIG8gY29udHJvbGVcIiBtYW51YWxtZW50ZS5cbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWwgPSBsYWJlbDtcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsaXphIG8gYDxsYWJlbD5gIGN1am8gYXRyaWJ1dG8gYGZvcmAgY29ycmVzcG9uZGUgYW8gaWQgaW5mb3JtYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIGhvc3RJZCBJZCBkbyBob3N0IHJlZmVyZW5jaWFkbyBwZWxvIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIE8gZWxlbWVudG8gbGFiZWwgY29ycmVzcG9uZGVudGUgb3UgYG51bGxgLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRMYWJlbEZvcihob3N0SWQ6IHN0cmluZyk6IEhUTUxMYWJlbEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTGFiZWxFbGVtZW50PignbGFiZWxbZm9yXScpO1xuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIEFycmF5LmZyb20obGFiZWxzKSkge1xuICAgICAgICAgICAgaWYgKGxhYmVsLmdldEF0dHJpYnV0ZSgnZm9yJykgPT09IGhvc3RJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIG8gY29tYm9ib3ggaW50ZXJubyBhbyBjbGljYXIgbm8gbGFiZWwgZXh0ZXJubyBhc3NvY2lhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkxhYmVsQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEVzdGUgbcOpdG9kbyBvY3VsdGEgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIGUgcmVkZWZpbmUgbyDDrW5kaWNlIGRvIGl0ZW0gZm9jYWRvIHBhcmEgLTEsXG4gICAgICogaW5kaWNhbmRvIHF1ZSBuZW5odW0gaXRlbSBlc3TDoSBhdHVhbG1lbnRlIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gdGltZXN0YW1wIGF0dWFsIGUgbm8gw61uZGljZSBkbyBpdGVtLiBDYXNvIGEgb3DDp8OjbyBzZWphIHVtIGdydXBvXG4gICAgICogKGRldGVjdGFkbyBwZWxhIHByZXNlbsOnYSBkZSB1bSBhcnJheSBgaXRlbXNgKSwgYWRpY2lvbmEgdGFtYsOpbSBhIHByb3ByaWVkYWRlIGBncm91cGVyOiB0cnVlYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgcG9zc2l2ZWxtZW50ZSBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLlxuICAgICAqIFBhcmEgY2FkYSBvcMOnw6NvIHF1ZSBwb3NzdWkgdW0gYWdydXBhZG9yIChgZ3JvdXBlcmApIGUgdW0gYXJyYXkgZGUgaXRlbnMgZW0gYGRhdGEuaXRlbXNgLFxuICAgICAqIGFkaWNpb25hIGEgb3DDp8OjbyBkbyBhZ3J1cGFkb3IgZSwgZW0gc2VndWlkYSwgYWRpY2lvbmEgY2FkYSBpdGVtIGRvIGdydXBvIGNvbW8gdW1hIG5vdmEgb3DDp8Ojb1xuICAgICAqIGluZGl2aWR1YWwsIGF0cmlidWluZG8gdW0gYGlkYCDDum5pY28gcGFyYSBjYWRhIGl0ZW0gZG8gZ3J1cG8uXG4gICAgICogQ2FzbyBhIG9ww6fDo28gbsOjbyBzZWphIHVtIGFncnVwYWRvciwgZWxhIMOpIGFkaWNpb25hZGEgZGlyZXRhbWVudGUgYW8gcmVzdWx0YWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24sIHBvZGVuZG8gY29udGVyIGFncnVwYWRvcmVzLlxuICAgICAqIEByZXR1cm5zIExpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLCBpbmNsdWluZG8gYWdydXBhZG9yZXMgZSBzZXVzIGl0ZW5zIGV4cGFuZGlkb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JvdXBlclRvRmxhdChvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSA9IFtdO1xuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSAob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcy5tYXAoKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtvcHRpb24uaWR9X2l0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5ncm91cEl0ZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbCBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIHF1ZSBzZWphbSBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCAmJiBvcHRpb25zW25leHRJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvciBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIGRvIHRpcG8gXCJncm91cGVyXCIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHByZXZJbmRleCA+PSAwICYmIG9wdGlvbnNbcHJldkluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBwcmV2SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBvcMOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEVzdGUgbcOpdG9kbyBvYnTDqW0gbyBJRCBkYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGEgcGFydGlyIGRhIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSB1bSBJRCB2w6FsaWRvIGZvciBlbmNvbnRyYWRvLCBidXNjYSBvIGVsZW1lbnRvIGNvcnJlc3BvbmRlbnRlIG5vIERPTSBlIHV0aWxpemFcbiAgICAgKiBgc2Nyb2xsSW50b1ZpZXdgIHBhcmEgcm9sYXIgYXTDqSBhIG9ww6fDo28sIGFsaW5oYW5kby1hIGFvIGJsb2NvIG1haXMgcHLDs3hpbW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZm9jbyBubyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8gYW8gYWJyaXIgbyBkcm9wZG93bi5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGZvY2EgbyBpdGVtIHNlbGVjaW9uYWRvLiBObyBtb2RvIG3Dumx0aXBsbywgZm9jYSBvIHByaW1laXJvIGl0ZW0gc2VsZWNpb25hZG8uXG4gICAgICogQXDDs3MgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheSwgcm9sYSBhIGxpc3RhIGF0w6kgbyBpdGVtIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGZpcnN0U2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVszcHhdIGJvcmRlciBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5IGZvY3VzOm91dGxpbmVcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtNV09XCJkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtYXV0b109XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dPcHRpb25zKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgW2F0dHIuYXJpYS1vd25zXT1cInNob3dPcHRpb25zKCkgPyBjb21wb25lbnRJZCArICctbGlzdGJveCcgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwic2hvd09wdGlvbnMoKSA/IGZvY3VzZWRPcHRpb25JZCgpIDogbnVsbFwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWNvbWJvYm94J1wiXG4gICAgKGNsaWNrKT1cIm9uQ29udGFpbmVyRGl2Q2xpY2soKVwiXG4gICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkKCkgPyAtMSA6IDBcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsKCkgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInJlc29sdmVkQXJpYUxhYmVsbGVkQnkoKSB8fCBudWxsXCJcbj5cbiAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1ncm93IHNlbGVjdC1ub25lIHB4LTMgcHktWzdweF1cIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKCkgJiYgIWlzQ2xlYW4oKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS02MF09XCIhZGlzYWJsZWQoKSAmJiBpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICB7eyBwcmludCgpIHx8IHBsYWNlaG9sZGVyKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICBAaWYgKCFkaXNhYmxlZCgpICYmIHNob3dDbGVhcigpICYmICFpc0NsZWFuKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJteC0zXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5hcmlhX2NsZWFyX3NlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItbCBweC0zIGdyb3VwLWhvdmVyOmJnLWdyYXlzY2FsZS0xMCBncm91cC1mb2N1czpib3JkZXItcHJpbWFyeVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhc2hvd09wdGlvbnMoKVwiXG4gICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtdXBdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgICAgID48L2k+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2Ryb3Bkb3duVGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInNob3dPcHRpb25zKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgKGRldGFjaCk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIFtpZF09XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWJvZHktY2xhc3Mgei1bMTAwMF0gcm91bmRlZC1bM3B4XSBiZy1ncmF5c2NhbGUtMCBweS0xIHNoYWRvdy1tZFwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29udGFpbmVyRGl2Lm9mZnNldFdpZHRoXCJcbiAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUoKSA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgW0B2aXNpYmlsaXR5Q2hhbmdlZF1cbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgID5cbiAgICAgICAgQGlmIChmaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMyBweC0zIHB5LTEuNVwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdEFsbENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLVszNXB4XSBncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZ3JvdyByb3VuZGVkLVszcHhdIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHBsLTIuNSBwci03IG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uRmlsdGVyS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZmlsdGVyX29wdGlvbnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRPcHRpb25JZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtc2VhcmNoIGFic29sdXRlIHJpZ2h0LTIuNSB0b3AtMi41IHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jbGVhcl9maWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IC0tPlxuICAgICAgICBAaWYgKCF2aXJ0dWFsU2Nyb2xsKCkgfHwgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIDw9IDEwKSB7XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj5cbiAgICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
891
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUVILFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFD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LENBQUMsQ0FBQzs2QkFDNUYsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNqQixPQUFPLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzs2QkFDakcsQ0FBQzt5QkFDTCxDQUFDO3FCQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICBlZmZlY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW50ZXJmYWNlIEludGVybmFsRHJvcGRvd25PcHRpb248VD4ge1xuICAgIGRhdGE6IFQ7XG4gICAgaWQ6IHN0cmluZztcbiAgICBncm91cGVyPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudGUgZGUgc2VsZcOnw6NvIGRyb3Bkb3duIGdlbsOpcmljbyBjb20gc3Vwb3J0ZSBhIHNlbGXDp8OjbyBzaW1wbGVzIGUgbcO6bHRpcGxhLFxuICogZmlsdHJvLCBhZ3J1cGFtZW50bywgdmlydHVhbCBzY3JvbGwgZSBhY2Vzc2liaWxpZGFkZSAoQVJJQSBjb21ib2JveCkuIEltcGxlbWVudGFcbiAqIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gcGFyYSBpbnRlZ3Jhw6fDo28gY29tIFJlYWN0aXZlIEZvcm1zIGUgVGVtcGxhdGUtZHJpdmVuIEZvcm1zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1zZWxlY3RcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcmlhXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgdW1hIGNhdGVnb3JpYVwiXG4gKiAgIFtvcHRpb25zXT1cImNhdGVnb3JpYXNcIlxuICogICBvcHRpb25MYWJlbD1cIm5vbWVcIlxuICogICBvcHRpb25WYWx1ZT1cImlkXCJcbiAqICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAqICAgW3Nob3dDbGVhcl09XCJ0cnVlXCIgLz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBJbnB1dHNcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICAgICAgU2VsZWN0T3B0aW9uQ29tcG9uZW50LFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnKHdpbmRvdzpyZXNpemUpJzogJ29uV2luZG93UmVzaXplKCRldmVudCknLFxuICAgIH0sXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0Lm5nLWRpcnR5Lm5nLWludmFsaWQge1xuICAgICAgICAgICAgICAgIC5kcm9wZG93bi1jb250YWluZXIsXG4gICAgICAgICAgICAgICAgLnNlbGVjdC1jb250YWluZXIge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBgLFxuICAgIF0sXG5cbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHRyaWdnZXIoJ3Zpc2liaWxpdHlDaGFuZ2VkJywgW1xuICAgICAgICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOTUpJyB9KSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnNTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCc1MDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjk1KScgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0pLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkID0gMDtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtYSBvcMOnw6NvIGVzdMOhIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IGlucHV0KCcnKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYSBzZWxlw6fDo28gZGUgbcO6bHRpcGxhcyBvcMOnw7VlcyBzaW11bHTDom5lYXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIG11bHRpcGxlID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMaXN0YSBkZSBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBzZWxlw6fDo28uIENhbXBvIG9icmlnYXTDs3Jpby4gKi9cbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyBsYWJlbCBkZSBleGliacOnw6NvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gdmFsb3IgYSBzZXIgZW1pdGlkbyBhbyBmb3JtdWzDoXJpby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uVmFsdWUgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSBib3TDo28gcGFyYSBsaW1wYXIgYSBzZWxlw6fDo28gYXR1YWwuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdW0gY2FtcG8gZGUgZmlsdHJvIHRleHR1YWwgcGFyYSBwZXNxdWlzYSBuYXMgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGZpbHRlciA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gw61jb25lIGRlIGNoZWNrbWFyayBhbyBsYWRvIGRhIG9ww6fDo28gc2VsZWNpb25hZGEuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2xhc3NlIGRvIMOtY29uZSBkZSBjaGVja21hcmsgZXhpYmlkbyBxdWFuZG8gYGNoZWNrbWFya2AgZXN0w6EgYXRpdm8uIEBkZWZhdWx0ICdmYXIgZmEtY2hlY2snICovXG4gICAgcHVibGljIGNoZWNrSWNvbkNsYXNzID0gaW5wdXQoJ2ZhciBmYS1jaGVjaycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZShzKSBkbyBvYmpldG8gdXNhZGEocykgcGFyYSBmaWx0cmFnZW0gdGV4dHVhbC4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLCB1c2EgYG9wdGlvbkxhYmVsYC4gKi9cbiAgICBwdWJsaWMgZmlsdGVyQnkgPSBpbnB1dDxrZXlvZiBUIHwgKGtleW9mIFQpW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGFncnVwYW1lbnRvIGRlIG9ww6fDtWVzLiBBcyBvcMOnw7VlcyBkZXZlbSBjb250ZXIgaXRlbnMgZmlsaG9zIGNvbmZvcm1lIGEgZXN0cnV0dXJhIGRlIGdydXBvIHN1cG9ydGFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZ3JvdXAgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHZpcnR1YWxpemHDp8OjbyBkYSBsaXN0YSBwYXJhIG1lbGhvciBwZXJmb3JtYW5jZSBjb20gZ3JhbmRlcyB2b2x1bWVzIGRlIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBBbHR1cmEgZml4YSBkZSBjYWRhIGl0ZW0gZGEgbGlzdGEgZW0gcGl4ZWxzLCBuZWNlc3PDoXJpYSBwYXJhIG8gY8OhbGN1bG8gZG8gdmlydHVhbCBzY3JvbGwuIEBkZWZhdWx0IDM3ICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGxJdGVtU2l6ZSA9IGlucHV0KDM3KTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTWVuc2FnZW0gZXhpYmlkYSBxdWFuZG8gbmVuaHVtYSBvcMOnw6NvIGNvcnJlc3BvbmRlIGFvIGZpbHRybyBhcGxpY2Fkby4gQGRlZmF1bHQgbnVsbCAqL1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgbyBlc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBtb2RlbChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRvIHBhaW5lbCBkZSBvcMOnw7VlcyB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93T3B0aW9ucyA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGFiZWwgZGUgYWNlc3NpYmlsaWRhZGUgZG8gY29tcG9uZW50ZS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBJRCBkbyBlbGVtZW50byBleHRlcm5vIHF1ZSBkZXNjcmV2ZSBvIGNvbXBvbmVudGUgKGFyaWEtbGFiZWxsZWRieSkuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXQoJycpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeSA9IHNpZ25hbCgnJyk7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkbyBsYWJlbCByZXNvbHZpZG8gcGFyYSBgYXJpYS1sYWJlbGxlZGJ5YCBkbyBjb21ib2JveCBpbnRlcm5vLlxuICAgICAqIFByaW9yaXphIG8gdmFsb3IgZXhwbMOtY2l0byBkZSBgYXJpYUxhYmVsbGVkQnlgOyBjYXNvIGNvbnRyw6FyaW8sIHVzYSBvIGlkIGRlIHVtXG4gICAgICogYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gYXNzb2NpYWRvIGFvIGhvc3QgKGRldGVjdGFkbyBlbSBydW50aW1lKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkQnkoKSB8fCB0aGlzLl9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwcml2YXRlIF9wZW5kaW5nVmFsdWU6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29tcG9uZW50SWQgPSBgc2VsZWN0JHtTZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMuXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIChleGNsdWluZG8gYWdydXBhZG9yZXMpIGVzdGl2ZXJlbSBwcmVzZW50ZXNcbiAgICAgKiBuYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcywgZSBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMudmFsdWVzKCkubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCk7XG5cbiAgICAgICAgY29uc3QgcmV0ID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMob3B0aW9uLmlkKSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmRhdGEgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZE9wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmlkID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJJbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignZmlsdGVySW5wdXQnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RBbGxDaGVja2JveCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ3NlbGVjdEFsbENoZWNrYm94Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9jbGlja2FibGVMYWJlbDogSFRNTExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBFZmVpdG8gcGFyYSB0ZW50YXIgYXBsaWNhciB2YWxvciBwZW5kZW50ZSBxdWFuZG8gb3B0aW9ucyBtdWRhci5cbiAgICAgICAgLy8gQSBlc2NyaXRhIGVtIHZhbHVlL3ZhbHVlcyDDqSBuZWNlc3PDoXJpYSBwYXJhIHNpbmNyb25pemFyIG8gQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMubGVuZ3RoICYmIHRoaXMuX3BlbmRpbmdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVBlbmRpbmdWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUlucHV0cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Fzc29jaWF0ZUV4dGVybmFsTGFiZWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NsaWNrYWJsZUxhYmVsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uTGFiZWxDbGljayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gdmFsb3Igc2VsZWNpb25hZG8gZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogQHBhcmFtIHZhbHVlIE8gdmFsb3IgYSBzZXIgZGVmaW5pZG8uIFBvZGUgc2VyIHVtIG9iamV0byBkbyB0aXBvIGBUYCwgdW0gYXJyYXkgZGUgYFRgIChxdWFuZG8gbcO6bHRpcGxhIHNlbGXDp8OjbyBlc3TDoSBoYWJpbGl0YWRhKSwgb3UgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBvIHZhbG9yIG7Do28gZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBkZXNhdGl2YWRvIGUgbyB2YWxvciBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBtYXBlaWEgbyhzKSB2YWxvcihlcykgZm9ybmVjaWRvKHMpIHBhcmEgYXMgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gY29tcG9uZW50ZSxcbiAgICAgKiBnYXJhbnRpbmRvIHF1ZSBhcGVuYXMgb3DDp8O1ZXMgdsOhbGlkYXMgc2VqYW0gc2VsZWNpb25hZGFzIGNvbmZvcm1lIG8gbW9kbyBkZSBzZWxlw6fDo28gKMO6bmljbyBvdSBtw7psdGlwbG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICAvLyBBcm1hemVuYSB2YWxvciBwZW5kZW50ZSBlIHRlbnRhIGFwbGljYXJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2FwcGx5UGVuZGluZ1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVudGEgYXBsaWNhciBvIHZhbG9yIHBlbmRlbnRlIChfcGVuZGluZ1ZhbHVlKSBhbyBlc3RhZG8gZG8gY29tcG9uZW50ZSxcbiAgICAgKiBtYXBlYW5kbyBwYXJhIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gY29uZm9ybWUgb3B0aW9ucyBkaXNwb27DrXZlaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXBwbHlQZW5kaW5nVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IHYpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmZpbmQoKG9wdCkgPT4gSlNPTi5zdHJpbmdpZnkob3B0LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2KSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigob3B0KTogb3B0IGlzIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gPT4gISFvcHQpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChtYXBwZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcHBlZDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uVmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgb3B0aW9uVmFsdWUgaW4gdmFsdWUgPyB2YWx1ZVtvcHRpb25WYWx1ZV0gOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBvcHRzLmZpbmQoKG9wdCkgPT4gb3B0LmRhdGFbb3B0aW9uVmFsdWVdID09PSBjb21wYXJlVmFsdWUpIHx8IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBvcHRzLmZpbmQoKG9wdCkgPT4gSlNPTi5zdHJpbmdpZnkob3B0LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChtYXBwZWQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSByZWNlYmUgbyBub3ZvIHZhbG9yIHNlbGVjaW9uYWRvIG91IG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogVCB8IFRbXSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvIChwZXJkZXIgbyBmb2NvKS5cbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGV4ZWN1dGFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciBtYXJjYWRvIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIHJlYWxpemEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBpbnZlcnRlIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzLlxuICAgICAqIEFvIGFicmlyLCBtb3ZlIG8gZm9jbyBwYXJhIG8gaXRlbSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3VsZE9wZW4gPSAhdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHNob3VsZE9wZW47XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KHNob3VsZE9wZW4pO1xuXG4gICAgICAgIGlmIChzaG91bGRPcGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgIC8vIFF1YW5kbyBow6EgZmlsdHJvIGNvbSBtw7psdGlwbGEgc2VsZcOnw6NvLCBmb2NvIHZhaSBwYXJhIG8gY2hlY2tib3ggcHJpbWVpcm87XG4gICAgICAgICAgICAgICAgLy8gY2FzbyBjb250csOhcmlvLCB2YWkgZGlyZXRvIHBhcmEgbyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICAgICAgICAgICAgLy8gTyBmb2NvIMOpIG1vdmlkbyBhcMOzcyBhIHJlbmRlcml6YcOnw6NvIGRvIG92ZXJsYXkuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94SG9zdCA9IHRoaXMuX3NlbGVjdEFsbENoZWNrYm94KCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBjaGVja2JveEhvc3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbdGFiaW5kZXhdJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGU/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJJbnB1dCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZE9wdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHVtIGl0ZW0gbm8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogQHBhcmFtIGl0ZW0gTyBpdGVtIGEgc2VyIHNlbGVjaW9uYWRvIG91IGRlc21hcmNhZG8uXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBhIGZ1bsOnw6NvIHJldG9ybmEgaW1lZGlhdGFtZW50ZS5cbiAgICAgKiBObyBtb2RvIG3Dumx0aXBsbywgYWRpY2lvbmEgb3UgcmVtb3ZlIG8gaXRlbSBkYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGRlZmluZSBvIGl0ZW0gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogU2VtcHJlIG5vdGlmaWNhIGFzIG11ZGFuw6dhcyBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIHRvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0SXRlbShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gWy4uLnRoaXMudmFsdWVzKCldO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5maW5kSW5kZXgoKHNlbGVjdGVkSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGl0ZW07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IHN0b3JlLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhW29wdGlvblZhbHVlXSkgOiBzdG9yZTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gaXRlbS5kYXRhW29wdGlvblZhbHVlXSA6IGl0ZW0uZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyB2YWxvciBzZWxlY2lvbmFkbyBubyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gZXhlY3V0YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyBtw7psdGlwbGEsIHJlbW92ZSB0b2RvcyBvcyB2YWxvcmVzIHNlbGVjaW9uYWRvcyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gw7puaWNhLCBkZWZpbmUgbyB2YWxvciBjb21vIG51bG8gZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZSBtYXJjYSBvIGNvbXBvbmVudGUgY29tbyBcInRvY2Fkb1wiLlxuICAgICAqIEltcGVkZSBhIHByb3BhZ2HDp8OjbyBkbyBldmVudG8gZG8gbW91c2UuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkbyBtb3VzZSBxdWUgYWNpb25vdSBhIGxpbXBlemEgZGEgc2VsZcOnw6NvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gZmlsdHJvIGRvIGZvcm11bMOhcmlvLCByZXNldGFuZG8gbyBjYW1wbyAnZmlsdGVyJyBkbyBmb3JtdWzDoXJpbyBkZSBmaWx0cm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIHJlZGVmaW5lIG8gdmFsb3IgZG8gY2FtcG8gJ2ZpbHRlcicgcGFyYSBzZXUgZXN0YWRvIGluaWNpYWwsXG4gICAgICogcmVtb3ZlbmRvIHF1YWxxdWVyIHRleHRvIG91IHZhbG9yIHByZXZpYW1lbnRlIGluc2VyaWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8ucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEuXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBjYXNvIGVsZSBlc3RlamEgdmlzw612ZWwgYW8gcmVkaW1lbnNpb25hciBhIGphbmVsYS5cbiAgICAgKiBAcGFyYW0gXyBFdmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICovXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKF86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGNsaXF1ZSBubyBlbGVtZW50byBjb250YWluZXIgZGEgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBhbHRlcm5hIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZG8gY29tcG9uZW50ZSBzZWxlY3QgZSxcbiAgICAgKiBlbSBzZWd1aWRhLCBkZWZpbmUgbyBmb2NvIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBjb3JyZXNwb25kZW50ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db250YWluZXJEaXZDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBldmVudG9zIGRlIHRlY2xhZG8gbm8gaW5wdXQgZGUgZmlsdHJvIGRvIG92ZXJsYXkuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByaW1laXJhIG9ww6fDo28gZGEgbGlzdGEuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSDDumx0aW1hIG9ww6fDo28gZGEgbGlzdGEuXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93biBlIHJldG9ybmEgbyBmb2NvIGFvIGNvbWJvYm94LlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEsIHNlIGhvdXZlci5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gbm8gaW5wdXQgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZpbHRlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZW5odW0gaXRlbSBmb2NhZG86IGZvY2EgbyDDumx0aW1vIGRpc3BvbsOtdmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEluZGV4ID0gb3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxhc3RJbmRleCA+PSAwICYmIG9wdGlvbnNbbGFzdEluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBwYXJhIG5hdmVnYcOnw6NvIGUgc2VsZcOnw6NvIGRlIG9ww6fDtWVzIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvci5cbiAgICAgKiAtICdUYWInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiAtICdFbnRlcic6IFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJyAnOiAoYmFycmEgZGUgZXNwYcOnbykgU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIFByZXZpbmUgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gbmF2ZWdhZG9yIHF1YW5kbyBuZWNlc3PDoXJpbyBwYXJhIGdhcmFudGlyIGEgbmF2ZWdhw6fDo28gYWRlcXVhZGEgcGVsbyB0ZWNsYWRvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCAmJiBldmVudC5rZXkgIT09ICdFc2NhcGUnICYmIGV2ZW50LmtleSAhPT0gJ0VudGVyJyAmJiBldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX3NlbGVjdE9wdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIC8vIFF1YW5kbyBow6EgZmlsdHJvIGFiZXJ0bywgVGFiIGRldmUgbmF2ZWdhciBwYXJhIGRlbnRybyBkbyBvdmVybGF5IChuw6NvIGZlY2hhcilcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpICYmIHRoaXMuZmlsdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBhc3NvY2lhZG8gYSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBkbyB0aXBvIFQgcGFyYSBhIHF1YWwgbyByw7N0dWxvIGRldmUgc2VyIG9idGlkby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wdGlvbkxhYmVsKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyBkZSB0cmFja0J5IHV0aWxpemFkYSBlbSBibG9jb3MgQGZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzb2NpYSB1bSBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZXh0ZXJubyAocXVlIGFwb250YSBwYXJhIG8gYGlkYCBkbyBob3N0KSBhb1xuICAgICAqIGNvbWJvYm94IGludGVybm8sIHJlc29sdmVuZG8gbyBwcm9ibGVtYSBkZSBcIm9ycGhhbmVkIGxhYmVsXCIuXG4gICAgICpcbiAgICAgKiBDb21vIG8gaG9zdCBgcy1zZWxlY3RgIG7Do28gw6kgdW0gZWxlbWVudG8gcm90dWzDoXZlbCAobGFiZWxhYmxlKSwgbyBgZm9yYCBuw6NvXG4gICAgICogY3JpYSB2w61uY3VsbyBwcm9ncmFtw6F0aWNvLiBFc3RlIG3DqXRvZG86XG4gICAgICogLSBsb2NhbGl6YSBvIGxhYmVsIHF1ZSByZWZlcmVuY2lhIG8gYGlkYCBkbyBob3N0O1xuICAgICAqIC0gZ2FyYW50ZSBxdWUgZXNzZSBsYWJlbCB0ZW5oYSB1bSBgaWRgO1xuICAgICAqIC0gYXBvbnRhIG8gYGFyaWEtbGFiZWxsZWRieWAgZG8gY29tYm9ib3ggcGFyYSBlc3NlIGxhYmVsO1xuICAgICAqIC0gYWRpY2lvbmEgdW0gY2xpcXVlIG5vIGxhYmVsIHBhcmEgZm9jYXIgbyBjb21ib2JveCAoZXF1aXZhbGVudGUgYW8gYGZvcmApLlxuICAgICAqXG4gICAgICogTsOjbyBzb2JyZXNjcmV2ZSB1bSBgYXJpYUxhYmVsbGVkQnlgIGV4cGzDrWNpdG8gaW5mb3JtYWRvIHBlbG8gY29uc3VtaWRvci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Fzc29jaWF0ZUV4dGVybmFsTGFiZWwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFyaWFMYWJlbGxlZEJ5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvc3RJZCA9IHRoaXMuX2hvc3RSZWYubmF0aXZlRWxlbWVudC5pZDtcbiAgICAgICAgaWYgKCFob3N0SWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fZmluZExhYmVsRm9yKGhvc3RJZCk7XG4gICAgICAgIGlmICghbGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGFiZWwuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShsYWJlbCwgJ2lkJywgYCR7dGhpcy5jb21wb25lbnRJZH0tbGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkuc2V0KGxhYmVsLmlkKTtcblxuICAgICAgICAvLyBPIGF0cmlidXRvIGBmb3JgIG7Do28gZnVuY2lvbmxkYSBlbSBob3N0IG7Do28tcm90dWzDoXZlbCwgZW50w6NvIHJlcGxpY2Ftb3NcbiAgICAgICAgLy8gbyBjb21wb3J0YW1lbnRvIGRlIFwiY2xpY2FyIG5vIGxhYmVsIGZvY2EgbyBjb250cm9sZVwiIG1hbnVhbG1lbnRlLlxuICAgICAgICB0aGlzLl9jbGlja2FibGVMYWJlbCA9IGxhYmVsO1xuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uTGFiZWxDbGljayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYWxpemEgbyBgPGxhYmVsPmAgY3VqbyBhdHJpYnV0byBgZm9yYCBjb3JyZXNwb25kZSBhbyBpZCBpbmZvcm1hZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gaG9zdElkIElkIGRvIGhvc3QgcmVmZXJlbmNpYWRvIHBlbG8gbGFiZWwuXG4gICAgICogQHJldHVybnMgTyBlbGVtZW50byBsYWJlbCBjb3JyZXNwb25kZW50ZSBvdSBgbnVsbGAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZmluZExhYmVsRm9yKGhvc3RJZDogc3RyaW5nKTogSFRNTExhYmVsRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMYWJlbEVsZW1lbnQ+KCdsYWJlbFtmb3JdJyk7XG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgQXJyYXkuZnJvbShsYWJlbHMpKSB7XG4gICAgICAgICAgICBpZiAobGFiZWwuZ2V0QXR0cmlidXRlKCdmb3InKSA9PT0gaG9zdElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgbyBjb21ib2JveCBpbnRlcm5vIGFvIGNsaWNhciBubyBsYWJlbCBleHRlcm5vIGFzc29jaWFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uTGFiZWxDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9jdWx0YSBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgZSByZWRlZmluZSBvIMOtbmRpY2UgZG8gaXRlbSBmb2NhZG8gcGFyYSAtMSxcbiAgICAgKiBpbmRpY2FuZG8gcXVlIG5lbmh1bSBpdGVtIGVzdMOhIGF0dWFsbWVudGUgZm9jYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBQYXJhIGNhZGEgaXRlbSBubyBhcnJheSBkZSBvcMOnw7VlcywgZ2VyYSB1bSBvYmpldG8gYEludGVybmFsRHJvcGRvd25PcHRpb25gIGNvbnRlbmRvIG8gZGFkbyBvcmlnaW5hbFxuICAgICAqIGUgdW0gY2FtcG8gYGlkYCDDum5pY28gYmFzZWFkbyBubyB0aW1lc3RhbXAgYXR1YWwgZSBubyDDrW5kaWNlIGRvIGl0ZW0uIENhc28gYSBvcMOnw6NvIHNlamEgdW0gZ3J1cG9cbiAgICAgKiAoZGV0ZWN0YWRvIHBlbGEgcHJlc2Vuw6dhIGRlIHVtIGFycmF5IGBpdGVtc2ApLCBhZGljaW9uYSB0YW1iw6ltIGEgcHJvcHJpZWRhZGUgYGdyb3VwZXI6IHRydWVgLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgb3DDp8O1ZXMgZG8gdGlwbyBgVGAgYSBzZXJlbSBwcm9jZXNzYWRhcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBvYmpldG9zIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YCBjb20gaWRlbnRpZmljYWRvcmVzIMO6bmljb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb09wdGlvbnMob3B0aW9uczogVFtdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKCkgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogYGlkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICBpZDogYGlkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRlIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBwb3NzaXZlbG1lbnRlIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMuXG4gICAgICogUGFyYSBjYWRhIG9ww6fDo28gcXVlIHBvc3N1aSB1bSBhZ3J1cGFkb3IgKGBncm91cGVyYCkgZSB1bSBhcnJheSBkZSBpdGVucyBlbSBgZGF0YS5pdGVtc2AsXG4gICAgICogYWRpY2lvbmEgYSBvcMOnw6NvIGRvIGFncnVwYWRvciBlLCBlbSBzZWd1aWRhLCBhZGljaW9uYSBjYWRhIGl0ZW0gZG8gZ3J1cG8gY29tbyB1bWEgbm92YSBvcMOnw6NvXG4gICAgICogaW5kaXZpZHVhbCwgYXRyaWJ1aW5kbyB1bSBgaWRgIMO6bmljbyBwYXJhIGNhZGEgaXRlbSBkbyBncnVwby5cbiAgICAgKiBDYXNvIGEgb3DDp8OjbyBuw6NvIHNlamEgdW0gYWdydXBhZG9yLCBlbGEgw6kgYWRpY2lvbmFkYSBkaXJldGFtZW50ZSBhbyByZXN1bHRhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93biwgcG9kZW5kbyBjb250ZXIgYWdydXBhZG9yZXMuXG4gICAgICogQHJldHVybnMgTGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMsIGluY2x1aW5kbyBhZ3J1cGFkb3JlcyBlIHNldXMgaXRlbnMgZXhwYW5kaWRvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9ncm91cGVyVG9GbGF0KG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdID0gW107XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlciAmJiBBcnJheS5pc0FycmF5KChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zLm1hcCgoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke29wdGlvbi5pZH1faXRlbV8ke2luZGV4fWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmdyb3VwSXRlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgcXVlIHNlamFtIGFncnVwYWRvcmVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgd2hpbGUgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoICYmIG9wdGlvbnNbbmV4dEluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgZG8gdGlwbyBcImdyb3VwZXJcIi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcblxuICAgICAgICB3aGlsZSAocHJldkluZGV4ID49IDAgJiYgb3B0aW9uc1twcmV2SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIHByZXZJbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm9sYSBhIGxpc3RhIGRlIG9ww6fDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBlc3RlamEgdmlzw612ZWwuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9idMOpbSBvIElEIGRhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgYSBwYXJ0aXIgZGEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFNlIHVtIElEIHbDoWxpZG8gZm9yIGVuY29udHJhZG8sIGJ1c2NhIG8gZWxlbWVudG8gY29ycmVzcG9uZGVudGUgbm8gRE9NIGUgdXRpbGl6YVxuICAgICAqIGBzY3JvbGxJbnRvVmlld2AgcGFyYSByb2xhciBhdMOpIGEgb3DDp8OjbywgYWxpbmhhbmRvLWEgYW8gYmxvY28gbWFpcyBwcsOzeGltby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpW3RoaXMuZm9jdXNlZEluZGV4KCldPy5pZDtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgZWw/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBmb2NvIG5vIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkbyBhbyBhYnJpciBvIGRyb3Bkb3duLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZm9jYSBvIGl0ZW0gc2VsZWNpb25hZG8uIE5vIG1vZG8gbcO6bHRpcGxvLCBmb2NhIG8gcHJpbWVpcm8gaXRlbSBzZWxlY2lvbmFkby5cbiAgICAgKiBBcMOzcyByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LCByb2xhIGEgbGlzdGEgYXTDqSBvIGl0ZW0gZm9jYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgICAgIGxldCBzZWxlY3RlZEluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZCA9IHRoaXMudmFsdWVzKClbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3RTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gZmlyc3RTZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gc2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHNlbGVjdGVkSW5kZXgpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNlbGVjdC1jb250YWluZXIgZ3JvdXAgZmxleCBoLVszNXB4XSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzNweF0gYm9yZGVyIG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnkgZm9jdXM6b3V0bGluZVwiXG4gICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1hdXRvXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwic2hvd09wdGlvbnMoKSA/IGNvbXBvbmVudElkICsgJy1saXN0Ym94JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJzaG93T3B0aW9ucygpID8gZm9jdXNlZE9wdGlvbklkKCkgOiBudWxsXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtpZF09XCJjb21wb25lbnRJZCArICctY29tYm9ib3gnXCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQoKSA/IC0xIDogMFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwoKSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwicmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSgpIHx8IG51bGxcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgc2VsZWN0LW5vbmUgcHgtMyBweS1bN3B4XVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKSAmJiAhaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTYwXT1cIiFkaXNhYmxlZCgpICYmIGlzQ2xlYW4oKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICA+XG4gICAgICAgIHt7IHByaW50KCkgfHwgcGxhY2Vob2xkZXIoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAoIWRpc2FibGVkKCkgJiYgc2hvd0NsZWFyKCkgJiYgIWlzQ2xlYW4oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm14LTNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmFyaWFfY2xlYXJfc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1sIHB4LTMgZ3JvdXAtaG92ZXI6YmctZ3JheXNjYWxlLTEwIGdyb3VwLWZvY3VzOmJvcmRlci1wcmltYXJ5XCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cImZhc1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC1kb3duXT1cIiFzaG93T3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJzaG93T3B0aW9ucygpXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICAoZGV0YWNoKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtdWx0aXBsZSgpID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICBbQHZpc2liaWxpdHlDaGFuZ2VkXVxuICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgPlxuICAgICAgICBAaWYgKGZpbHRlcigpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMS41XCI+XG4gICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0QWxsQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtWzM1cHhdIGdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25GaWx0ZXJLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXJfb3B0aW9ucycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZE9wdGlvbklkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNsZWFyX2ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gVmlydHVhbCBzY3JvbGwgLS0+XG4gICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgW2l0ZW1TaXplXT1cInZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtNTIgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrQnk6IHRyYWNrQnlJZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tJY29uQ2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgIEBpZiAoIXZpcnR1YWxTY3JvbGwoKSB8fCBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tJY29uQ2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tMyB0ZXh0LWdyYXlzY2FsZS02MFwiPlxuICAgICAgICAgICAgICAgIHt7IGVtcHR5TWVzc2FnZSgpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubm9fcmVjb3Jkc19mb3VuZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19