@seniorsistemas/data-seniorx-core 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/chips.const.d.ts +1 -0
- package/core/constants/combobox.const.d.ts +1 -1
- package/core/constants/fileupload.const.d.ts +9 -0
- package/core/constants/icon-picker.const.d.ts +1 -0
- package/core/constants/picklist.const.d.ts +1 -0
- package/core/constants/table.const.d.ts +43 -0
- package/core/types/button.type.d.ts +18 -2
- package/core/types/fileupload.type.d.ts +17 -0
- package/core/types/filters.type.d.ts +4 -0
- package/core/types/table-column.type.d.ts +31 -0
- package/core/types/table-options.type.d.ts +90 -0
- package/core/types/table-shared.type.d.ts +13 -0
- package/core/types/table-visual.type.d.ts +23 -0
- package/core/types/table.type.d.ts +4 -113
- package/core/utils/layout.util.d.ts +4 -0
- package/esm2022/core/constants/chips.const.mjs +2 -1
- package/esm2022/core/constants/combobox.const.mjs +2 -2
- package/esm2022/core/constants/fileupload.const.mjs +10 -0
- package/esm2022/core/constants/icon-picker.const.mjs +76 -1
- package/esm2022/core/constants/picklist.const.mjs +2 -1
- package/esm2022/core/constants/table.const.mjs +53 -6
- package/esm2022/core/types/button.type.mjs +1 -1
- package/esm2022/core/types/fileupload.type.mjs +2 -0
- package/esm2022/core/types/filters.type.mjs +1 -1
- package/esm2022/core/types/table-column.type.mjs +2 -0
- package/esm2022/core/types/table-options.type.mjs +2 -0
- package/esm2022/core/types/table-shared.type.mjs +2 -0
- package/esm2022/core/types/table-visual.type.mjs +2 -0
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/utils/combobox.util.mjs +2 -2
- package/esm2022/core/utils/layout.util.mjs +21 -5
- package/esm2022/features/accordion/accordion-item.component.mjs +1 -1
- package/esm2022/features/badge/badge.component.mjs +1 -1
- package/esm2022/features/button/button.component.mjs +76 -11
- package/esm2022/features/button/components/button-menu.component.mjs +81 -0
- package/esm2022/features/card-list/card/card.component.mjs +3 -3
- package/esm2022/features/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/features/chips/chips.component.mjs +8 -5
- package/esm2022/features/color-picker/color-picker.component.mjs +1 -1
- package/esm2022/features/combobox/combobox.component.mjs +17 -4
- package/esm2022/features/fileupload/fileupload.component.mjs +311 -0
- package/esm2022/features/filters/filters.component.mjs +3 -3
- package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
- package/esm2022/features/icon-picker/icon-picker.component.mjs +34 -7
- package/esm2022/features/info-sign/info-sign.component.mjs +1 -1
- package/esm2022/features/mask/mask.component.mjs +1 -1
- package/esm2022/features/modal/modal.component.mjs +1 -1
- package/esm2022/features/number-input/number-input.component.mjs +1 -1
- package/esm2022/features/paginator/paginator.component.mjs +3 -3
- package/esm2022/features/picklist/picklist.component.mjs +33 -6
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/searchbox/searchbox.component.mjs +3 -3
- package/esm2022/features/stats-card/stats-card.component.mjs +1 -1
- package/esm2022/features/switch/switch.component.mjs +3 -2
- package/esm2022/features/table/components/table-actions-menu.component.mjs +86 -0
- package/esm2022/features/table/components/table-cell-content.component.mjs +124 -0
- package/esm2022/features/table/components/table-sort-indicator.component.mjs +65 -0
- package/esm2022/features/table/table.component.mjs +116 -319
- package/esm2022/features/table/utils/table-config.util.mjs +35 -0
- package/esm2022/features/table/utils/table-data.util.mjs +96 -0
- package/esm2022/features/table/utils/table-layout.util.mjs +25 -0
- package/esm2022/features/table/utils/table-truncate.pipe.mjs +19 -0
- package/esm2022/features/table/utils/table-visual.util.mjs +221 -0
- package/esm2022/features/textarea/textarea.component.mjs +1 -1
- package/esm2022/features/textbox/textbox.component.mjs +1 -1
- package/esm2022/features/tooltip/tooltip.component.mjs +12 -3
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
- package/esm2022/locales/en.json +194 -0
- package/esm2022/locales/es-CO.json +187 -1
- package/esm2022/locales/pt.json +194 -0
- package/esm2022/providers/features.provider.mjs +3 -1
- package/esm2022/public-api.mjs +3 -1
- package/features/button/button.component.d.ts +14 -7
- package/features/button/components/button-menu.component.d.ts +25 -0
- package/features/chips/chips.component.d.ts +1 -0
- package/features/combobox/combobox.component.d.ts +4 -1
- package/features/fileupload/fileupload.component.d.ts +66 -0
- package/features/icon-picker/icon-picker.component.d.ts +3 -0
- package/features/modal/modal.component.d.ts +1 -1
- package/features/picklist/picklist.component.d.ts +6 -1
- package/features/table/components/table-actions-menu.component.d.ts +12 -0
- package/features/table/components/table-cell-content.component.d.ts +41 -0
- package/features/table/components/table-sort-indicator.component.d.ts +11 -0
- package/features/table/table.component.d.ts +28 -44
- package/features/table/utils/table-config.util.d.ts +3 -0
- package/features/table/utils/table-data.util.d.ts +10 -0
- package/features/table/utils/table-layout.util.d.ts +4 -0
- package/features/table/utils/table-truncate.pipe.d.ts +12 -0
- package/features/table/utils/table-visual.util.d.ts +21 -0
- package/features/tooltip/tooltip.component.d.ts +3 -1
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +3525 -1848
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +5 -2
- package/src/locales/en.json +194 -0
- package/src/locales/es-CO.json +187 -1
- package/src/locales/pt.json +194 -0
|
@@ -36,7 +36,9 @@ export class ComboboxComponent extends InputsComponent {
|
|
|
36
36
|
infoTooltip = null;
|
|
37
37
|
infoTooltipPosition = 'right';
|
|
38
38
|
infoTooltipEvent = 'both';
|
|
39
|
+
infoTooltipAllowHtml = false;
|
|
39
40
|
selectedValueEvent = new EventEmitter();
|
|
41
|
+
panelClosed = new EventEmitter();
|
|
40
42
|
popover;
|
|
41
43
|
triggerControlRef;
|
|
42
44
|
singleInputRef;
|
|
@@ -339,6 +341,12 @@ export class ComboboxComponent extends InputsComponent {
|
|
|
339
341
|
this.toggleOption(option, checked);
|
|
340
342
|
this.focusSearchboxSoon();
|
|
341
343
|
}
|
|
344
|
+
onOptionCheckboxKeydown(event) {
|
|
345
|
+
event.stopPropagation();
|
|
346
|
+
if (event.key === 'Enter') {
|
|
347
|
+
this.closePanel('toggle');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
342
350
|
onOptionKeydown(event, option) {
|
|
343
351
|
if (event.key !== 'Enter' && event.key !== ' ') {
|
|
344
352
|
return;
|
|
@@ -471,6 +479,7 @@ export class ComboboxComponent extends InputsComponent {
|
|
|
471
479
|
this.resetVirtualWindow();
|
|
472
480
|
this.refreshFilteredItems();
|
|
473
481
|
this.syncHighlightWithSelection();
|
|
482
|
+
this.panelClosed.emit();
|
|
474
483
|
this.cdr.markForCheck();
|
|
475
484
|
if (restoreTriggerFocus) {
|
|
476
485
|
this.focusTriggerSoon();
|
|
@@ -926,13 +935,13 @@ export class ComboboxComponent extends InputsComponent {
|
|
|
926
935
|
this.visibleFilteredItems = [];
|
|
927
936
|
}
|
|
928
937
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
929
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "sdc-combobox", inputs: { multiple: "multiple", appendTo: "appendTo", zIndex: "zIndex", options: "options", overrideChipMessage: "overrideChipMessage", maxSelectedLabels: "maxSelectedLabels", showClear: "showClear", iconSelector: "iconSelector", showIconClass: "showIconClass", infoTooltip: "infoTooltip", infoTooltipPosition: "infoTooltipPosition", infoTooltipEvent: "infoTooltipEvent" }, outputs: { selectedValueEvent: "onSelectedItem" }, providers: [
|
|
938
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "sdc-combobox", inputs: { multiple: "multiple", appendTo: "appendTo", zIndex: "zIndex", options: "options", overrideChipMessage: "overrideChipMessage", maxSelectedLabels: "maxSelectedLabels", showClear: "showClear", iconSelector: "iconSelector", showIconClass: "showIconClass", infoTooltip: "infoTooltip", infoTooltipPosition: "infoTooltipPosition", infoTooltipEvent: "infoTooltipEvent", infoTooltipAllowHtml: "infoTooltipAllowHtml" }, outputs: { selectedValueEvent: "onSelectedItem", panelClosed: "panelClosed" }, providers: [
|
|
930
939
|
{
|
|
931
940
|
provide: NG_VALUE_ACCESSOR,
|
|
932
941
|
useExisting: forwardRef(() => ComboboxComponent),
|
|
933
942
|
multi: true
|
|
934
943
|
}
|
|
935
|
-
], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
944
|
+
], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
936
945
|
}
|
|
937
946
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
938
947
|
type: Component,
|
|
@@ -952,7 +961,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
952
961
|
useExisting: forwardRef(() => ComboboxComponent),
|
|
953
962
|
multi: true
|
|
954
963
|
}
|
|
955
|
-
], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
|
|
964
|
+
], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
|
|
956
965
|
}], ctorParameters: () => [], propDecorators: { multiple: [{
|
|
957
966
|
type: Input
|
|
958
967
|
}], appendTo: [{
|
|
@@ -977,9 +986,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
977
986
|
type: Input
|
|
978
987
|
}], infoTooltipEvent: [{
|
|
979
988
|
type: Input
|
|
989
|
+
}], infoTooltipAllowHtml: [{
|
|
990
|
+
type: Input
|
|
980
991
|
}], selectedValueEvent: [{
|
|
981
992
|
type: Output,
|
|
982
993
|
args: ['onSelectedItem']
|
|
994
|
+
}], panelClosed: [{
|
|
995
|
+
type: Output
|
|
983
996
|
}], popover: [{
|
|
984
997
|
type: ViewChild,
|
|
985
998
|
args: [PopoverComponent]
|
|
@@ -1002,4 +1015,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1002
1015
|
type: ViewChild,
|
|
1003
1016
|
args: ['optionsViewportRef']
|
|
1004
1017
|
}] } });
|
|
1005
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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QTNDLE1BQU07dUJBQUMsZ0JBQWdCO2dCQUNLLE9BQU87c0JBQW5DLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNLLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0QsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0ssY0FBYztzQkFBN0MsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0YsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNHLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIGZvcndhcmRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUyxcbiAgQ09NQk9CT1hfREVGQVVMVF9QQU5FTF9NQVhfSEVJR0hULFxuICBDT01CT0JPWF9ERUZBVUxUX1pfSU5ERVgsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hULFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTUyxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9WSUVXUE9SVF9GQUxMQkFDS19IRUlHSFQsXG4gIENPTUJPQk9YX1JFTU9WRV9DSElQX0xBQkVMX0tFWSxcbiAgQ09NQk9CT1hfU0VMRUNURURfSVRFTVNfTEFCRUxfS0VZXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2NvbWJvYm94LmNvbnN0JztcbmltcG9ydCB7IEljb25TZWxlY3RvckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9pY29uLXNlbGVjdG9yLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvaW5wdXRzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgdHlwZSB7IENoaXBSZW1vdmVFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvY2hpcHMudHlwZSc7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbkl0ZW0sIE9wdGlvbnMsIE9wdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZW1hbnRpY3MudHlwZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2x0aXBFdmVudCwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90b29sdGlwLnR5cGUnO1xuaW1wb3J0IHsgcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2kxOG4udXRpbCc7XG5pbXBvcnQgeyBuZXh0U2VxdWVudGlhbElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pZC51dGlsJztcbmltcG9ydCB7IEljb25SZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvY29tcG9uZW50cy9pY29uLXJlbmRlcmVyL2ljb24tcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoYm94L3NlYXJjaGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgYXNDb21ib2JveEFycmF5LCBidWlsZENvbWJvYm94U2VhcmNoVGV4dCwgYnVpbGRDb21ib2JveFVpU3RhdGUsIGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zLCBidWlsZFZpc2libGVDb21ib2JveE9wdGlvbnMsIGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24sIGdldEFjdGl2ZU9wdGlvblZhbHVlLCBnZXRGaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSwgZ2V0U2VsZWN0ZWRDb3VudCwgbm9ybWFsaXplQ29tYm9ib3hTZWFyY2hUZXh0LCBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUsIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSwgdHlwZSBDb21ib2JveERpc3BsYXlNb2RlLCB0eXBlIENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIHR5cGUgQ29tYm9ib3hVaVN0YXRlLCB0eXBlIENvbWJvYm94VmFsdWUsIHR5cGUgQ29tYm9ib3hWaXNpYmxlT3B0aW9uLCB0eXBlIEhpZ2hsaWdodFN0ZXAsIHR5cGUgUGFuZWxDbG9zZVJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvY29tYm9ib3gudXRpbCc7XG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgSWNvblJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ3NkYy1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIElucHV0c0NvbXBvbmVudDxPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGljb25TZWxlY3RvckRhdGEgPSBpbmplY3QoSWNvblNlbGVjdG9yRGF0YVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdGVkSWQgPSBuZXh0U2VxdWVudGlhbElkKCdzZGMtY29tYm9ib3gnKTtcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwZW5kVG86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgekluZGV4ID0gQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYO1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zIHwgc3RyaW5nID0gW107XG4gIEBJbnB1dCgpIG92ZXJyaWRlQ2hpcE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heFNlbGVjdGVkTGFiZWxzID0gQ09NQk9CT1hfREVGQVVMVF9NQVhfU0VMRUNURURfTEFCRUxTO1xuICBASW5wdXQoKSBzaG93Q2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBpY29uU2VsZWN0b3IgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0ljb25DbGFzcyA9IGZhbHNlO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwUG9zaXRpb246IFRvb2x0aXBQb3NpdGlvbiA9ICdyaWdodCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwRXZlbnQ6IFRvb2x0aXBFdmVudCA9ICdib3RoJztcbiAgQE91dHB1dCgnb25TZWxlY3RlZEl0ZW0nKSBzZWxlY3RlZFZhbHVlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvYm94VmFsdWU+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGlzT3B0aW9uc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nICYmIHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5nO1xuICB9XG4gIGdldCB1c2VWaXJ0dWFsaXplZE9wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzaG93RW1wdHlTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPcHRpb25zTG9hZGluZyAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwO1xuICB9XG4gIGdldCBvcHRpb25Sb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbkNsYXNzXG4gICAgICA/IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfUk9XX0hFSUdIVF9XSVRIX0NMQVNTXG4gICAgICA6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hUO1xuICB9XG4gIGdldCBiZWZvcmVWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggKiB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgfVxuICBnZXQgYWZ0ZXJWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsICh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy52aXNpYmxlRW5kSW5kZXgpICogdGhpcy5vcHRpb25Sb3dIZWlnaHQpO1xuICB9XG4gIG9uU2VhcmNoKGV2ZW50OiB7IHF1ZXJ5Pzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoU3RyaW5nKGV2ZW50Py5xdWVyeSA/PyAnJykpO1xuICB9XG4gIG9uUGFuZWxJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VhcmNoVGVybUNoYW5nZSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8udmFsdWUgPz8gJycpO1xuICB9XG4gIG9uU2VhcmNoVGVybUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uc1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gIH1cbiAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNraXBOZXh0Rm9jdXNPcGVuKSB7XG4gICAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICB9XG4gIG9uSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnRhcmdldC5pZCA9PT0gdGhpcy51aS5wYW5lbFNlYXJjaElkZW50aXR5LmlkKSB7XG4gICAgICB0aGlzLm9uU2VhcmNoYm94S2V5ZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25UcmlnZ2VyS2V5ZG93bihldmVudCk7XG4gIH1cbiAgb25UcmlnZ2VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVRyaWdnZXJBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlck9wZW5LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25TZWFyY2hib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94QXJyb3dLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveEJvdW5kYXJ5S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25Db250cm9sTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAvLyBLZWVwIHRoZSBwYW5lbCBzZWFyY2hib3ggZm9jdXNlZCBldmVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB0cmlnZ2VyIGFyZWEgYWdhaW4uXG4gICAgICAvLyBXaXRob3V0IHByZXZlbnRpbmcgdGhlIHRyaWdnZXIgZnJvbSB0YWtpbmcgZm9jdXMgZmlyc3QsIHRoZSBjYXJldCBtYXkgZGlzYXBwZWFyIGV2ZW5cbiAgICAgIC8vIHRob3VnaCB0eXBpbmcgc3RpbGwgdXBkYXRlcyB0aGUgc2VhcmNoYm94LlxuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3VwcHJlc3MgZm9jdXMtdHJpZ2dlcmVkIG9wZW46IGluIHNpbmdsZSBtb2RlIHRoZSBpbnB1dCByZWNlaXZlcyBmb2N1cyBvbiBtb3VzZWRvd24sXG4gICAgLy8gd2hpY2ggZmlyZXMgb25JbnB1dEZvY3VzKCkgYmVmb3JlIHRoZSBjbGljayBldmVudC4gV2l0aG91dCB0aGlzIGZsYWcsIG9uSW5wdXRGb2N1c1xuICAgIC8vIHdvdWxkIG9wZW4gdGhlIHBhbmVsIGFuZCB0aGUgc3Vic2VxdWVudCBjbGljayAob25Db250cm9sQ2xpY2spIHdvdWxkIGltbWVkaWF0ZWx5IGNsb3NlIGl0LlxuICAgIHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSBmYWxzZTsgfSwgMCk7XG4gIH1cbiAgb25Db250cm9sQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25Ub2dnbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBvblBvcG92ZXJPcGVuQ2hhbmdlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob3BlbiB8fCAhdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZVBhbmVsKCdvdXRzaWRlJyk7XG4gIH1cbiAgdG9nZ2xlUGFuZWwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoJ3RvZ2dsZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgY2xlYXJBbGwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogbnVsbDtcbiAgICBjb25zdCBzaG91bGRSZWZvY3VzU2VhcmNoID0gdGhpcy5wYW5lbE9wZW47XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy52YWx1ZSA9IGNsZWFyZWRWYWx1ZTtcbiAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZShjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoY2xlYXJlZFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChzaG91bGRSZWZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBvbk9wdGlvbkNsaWNrKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihvcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uKTtcbiAgfVxuICBvbk9wdGlvbkNoZWNrYm94Q2hhbmdlKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbiwgY2hlY2tlZCk7XG4gICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgfVxuICBvbk9wdGlvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicgJiYgZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9uT3B0aW9uQ2xpY2sob3B0aW9uKTtcbiAgfVxuICB0b2dnbGVBbGxGaWx0ZXJlZEl0ZW1zKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEFjdGl2ZVZhbHVlID0gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IG5ldyBTZXQoYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpKTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLmZpbHRlcmVkSXRlbXMpIHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLmFkZChvcHRpb24udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuZGVsZXRlKG9wdGlvbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9yZGVyZWRWYWx1ZXMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IHNlbGVjdGVkVmFsdWVzLmhhcyhlbnRyeS52YWx1ZSkpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpO1xuICAgIHRoaXMucHJvcGFnYXRlRnJvbVZhbHVlKG9yZGVyZWRWYWx1ZXMpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKGN1cnJlbnRBY3RpdmVWYWx1ZSk7XG4gICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgfVxuICByZW1vdmVTZWxlY3RlZEl0ZW0ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEFjdGl2ZVZhbHVlID0gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLmZpbHRlcigoZW50cnkpID0+ICFPYmplY3QuaXMoZW50cnksIG9wdGlvbi52YWx1ZSkpO1xuICAgIHRoaXMucHJvcGFnYXRlRnJvbVZhbHVlKGN1cnJlbnRWYWx1ZXMpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKGN1cnJlbnRBY3RpdmVWYWx1ZSk7XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBvbkNoaXBSZW1vdmVkKGV2ZW50OiBDaGlwUmVtb3ZlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLnJlc29sdmVPcHRpb24oZXZlbnQudmFsdWUpO1xuICAgIGlmICghb3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtKG9wdGlvbiwgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gIH1cbiAgcmVzb2x2ZU9wdGlvbihvcHRPclZhbHVlOiB1bmtub3duKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpO1xuICAgIGlmIChvcHRPclZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdE9yVmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBvYmogPSBvcHRPclZhbHVlIGFzIHsgdGV4dD86IHN0cmluZzsgdmFsdWU/OiBPcHRpb25WYWx1ZSB9O1xuICAgICAgaWYgKCd0ZXh0JyBpbiBvYmogJiYgJ3ZhbHVlJyBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi4ob2JqIGFzIE9wdGlvbkl0ZW0pLFxuICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlVGV4dChvYmoudGV4dCksXG4gICAgICAgICAgc2VhcmNoVGV4dDogYnVpbGRDb21ib2JveFNlYXJjaFRleHQodGhpcy50cmFuc2xhdGVUZXh0KG9iai50ZXh0KSwgdGhpcy5hc1RleHQob2JqLnZhbHVlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICgndmFsdWUnIGluIG9iaikge1xuICAgICAgICByZXR1cm4gYWxsLmZpbmQoKG9wdGlvbikgPT4gT2JqZWN0LmlzKG9wdGlvbi52YWx1ZSwgb2JqLnZhbHVlKSkgPz8gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbC5maW5kKChvcHRpb24pID0+IE9iamVjdC5pcyhvcHRpb24udmFsdWUsIG9wdE9yVmFsdWUgYXMgT3B0aW9uVmFsdWUpKSA/PyBudWxsO1xuICB9XG4gIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5zb21lKChlbnRyeSkgPT4gT2JqZWN0LmlzKGVudHJ5LCBvcHRpb24udmFsdWUpKTtcbiAgfVxuICBpc09wdGlvbkFjdGl2ZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9PT0gaW5kZXg7XG4gIH1cbiAgb25PcHRpb25Nb3VzZUVudGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoaW5kZXgsIGZhbHNlKTtcbiAgfVxuICBvbk9wdGlvbnNQYW5lbE1vdXNlTW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIG9uT3B0aW9uc1BhbmVsTW91c2VMZWF2ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvcHRpb25NZXRhVGV4dChvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaWNvblNlbGVjdG9yIHx8ICF0aGlzLnNob3dJY29uQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uLmljb25DbGFzc05hbWUgPz8gbnVsbDtcbiAgfVxuICBvcHRpb25JZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy51aS5jb250cm9sSWR9LW9wdGlvbi0ke2luZGV4fWA7XG4gIH1cbiAgY2hpcFJlbW92ZUFyaWFMYWJlbChvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQodGhpcy50cmFuc2xhdGUsIG51bGwsIENPTUJPQk9YX1JFTU9WRV9DSElQX0xBQkVMX0tFWSk7XG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xce2xhYmVsXFx9L2csIG9wdGlvbi50ZXh0KTtcbiAgfVxuICB0cmFja0J5T3B0aW9uVmFsdWUgPSAoX2luZGV4OiBudW1iZXIsIGl0ZW06IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiBPcHRpb25WYWx1ZSA9PiBpdGVtLnZhbHVlO1xuICBwcml2YXRlIG9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMub3BlblBhbmVsKHsgZm9jdXNTZWFyY2g6IHRydWUgfSk7XG4gIH1cbiAgcHJpdmF0ZSBvcGVuUGFuZWwob3B0aW9uczogeyBmb2N1c1NlYXJjaDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbih0aGlzLnJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnBvcG92ZXI/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHRydWUpO1xuICAgIGlmIChvcHRpb25zLmZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsb3NlUGFuZWwocmVhc29uOiBQYW5lbENsb3NlUmVhc29uKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdG9yZVRyaWdnZXJGb2N1cyA9IHJlYXNvbiA9PT0gJ2VzY2FwZScgfHwgcmVhc29uID09PSAnc2VsZWN0aW9uJyB8fCByZWFzb24gPT09ICd0b2dnbGUnO1xuICAgIHRoaXMucGFuZWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChyZXN0b3JlVHJpZ2dlckZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJpZ2dlclNvb24oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveFNvb24oKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNTZWFyY2hib3goKSwgMCk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgfVxuICBwcml2YXRlIGZvY3VzVHJpZ2dlclNvb24oKTogdm9pZCB7IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNUcmlnZ2VyKCkpOyB9XG4gIHByaXZhdGUgZm9jdXNTZWFyY2hib3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyKCk7XG4gICAgdGhpcy50cmlnZ2VyQ29udHJvbFJlZj8ubmF0aXZlRWxlbWVudD8uYmx1cj8uKCk7XG4gICAgdGhpcy5wYW5lbFNlYXJjaGJveD8uZm9jdXNJbnB1dCgpO1xuICAgIHRoaXMucG9wb3Zlcj8ucmVwb3NpdGlvbigpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmMoKTtcbiAgfVxuICBwcml2YXRlIGZvY3VzVHJpZ2dlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy50cmlnZ2VyQ29udHJvbFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5za2lwTmV4dEZvY3VzT3BlbiA9IHRydWU7XG4gICAgdGhpcy5zaW5nbGVJbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuICBwcml2YXRlIHJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHByZXNlcnZlQ3VycmVudEludmFsaWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbm9ybWFsaXplQ29tYm9ib3hTZWFyY2hUZXh0KHRoaXMuc2VhcmNoVGVybSk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKCk7XG4gICAgaWYgKHRoaXMuaXNPcHRpb25zTG9hZGluZykge1xuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gW107XG4gICAgICB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyh0cnVlKTtcbiAgICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBxdWVyeVxuICAgICAgPyBhbGwuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnNlYXJjaFRleHQuaW5jbHVkZXMocXVlcnkpKVxuICAgICAgOiBhbGwuc2xpY2UoKTtcbiAgICB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyghcXVlcnkpO1xuICAgIGlmICghcXVlcnkgJiYgcHJlc2VydmVDdXJyZW50SW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludmFsaWQgPSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwICYmIGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5sZW5ndGggPT09IDAgJiYgcXVlcnkubGVuZ3RoID4gMDtcbiAgfVxuICBwcml2YXRlIHNldEhpZ2hsaWdodGVkSW5kZXgoaW5kZXg6IG51bWJlciwgZW5zdXJlVmlzaWJsZSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpKTtcbiAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGVuc3VyZVZpc2libGUgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuc2Nyb2xsSGlnaGxpZ2h0ZWRPcHRpb25JbnRvVmlldygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG1vdmVIaWdobGlnaHQoc3RlcDogSGlnaGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSW5kZXggPCAwKSB7XG4gICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoc3RlcCA+IDAgPyAwIDogdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQgPSBmYWxzZTtcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCArIHN0ZXAgKyB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSAlIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpO1xuICB9XG4gIHByaXZhdGUgc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24ocHJlZmVycmVkVmFsdWU6IE9wdGlvblZhbHVlIHwgbnVsbCA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYW5kaWRhdGVWYWx1ZXMgPSBbXG4gICAgICBwcmVmZXJyZWRWYWx1ZSxcbiAgICAgICF0aGlzLm11bHRpcGxlID8gdGhpcy5zZWxlY3RlZFNpbmdsZU9wdGlvbj8udmFsdWUgPz8gbnVsbCA6IHRoaXMuZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUsXG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXNbMF0/LnZhbHVlID8/IG51bGxcbiAgICBdO1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGNhbmRpZGF0ZVZhbHVlc1xuICAgICAgLm1hcCgodmFsdWUpID0+IHZhbHVlID09IG51bGwgPyAtMSA6IHRoaXMuZmlsdGVyZWRJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IE9iamVjdC5pcyhpdGVtLnZhbHVlLCB2YWx1ZSkpKVxuICAgICAgLmZpbmQoKGluZGV4KSA9PiBpbmRleCA+PSAwKTtcbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgobmV4dEluZGV4ID8/IDApO1xuICB9XG4gIHByaXZhdGUgc2Nyb2xsSGlnaGxpZ2h0ZWRPcHRpb25JbnRvVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5vcHRpb25zVmlld3BvcnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9uVG9wID0gdGhpcy5oaWdobGlnaHRlZEluZGV4ICogdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gICAgICBjb25zdCBvcHRpb25Cb3R0b20gPSBvcHRpb25Ub3AgKyB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0VG9wID0gdmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgICAgY29uc3Qgdmlld3BvcnRCb3R0b20gPSB2aWV3cG9ydFRvcCArIHZpZXdwb3J0LmNsaWVudEhlaWdodDtcbiAgICAgIGlmIChvcHRpb25Ub3AgPCB2aWV3cG9ydFRvcCkge1xuICAgICAgICB2aWV3cG9ydC5zY3JvbGxUb3AgPSBvcHRpb25Ub3A7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbkJvdHRvbSA+IHZpZXdwb3J0Qm90dG9tKSB7XG4gICAgICAgIHZpZXdwb3J0LnNjcm9sbFRvcCA9IG9wdGlvbkJvdHRvbSAtIHZpZXdwb3J0LmNsaWVudEhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBoaWdobGlnaHRlZCBvcHRpb24gaXMgYWxyZWFkeSBmdWxseSB2aXNpYmxlLlxuICAgICAgfVxuICAgICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9uSWQodGhpcy5oaWdobGlnaHRlZEluZGV4KSk7XG4gICAgICBpZiAodHlwZW9mIG5vZGU/LnNjcm9sbEludG9WaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5vZGUuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgc2VsZWN0SGlnaGxpZ2h0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gdGhpcy5maWx0ZXJlZEl0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJbmRleF07XG4gICAgaWYgKCFhY3RpdmVPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlT3B0aW9uKGFjdGl2ZU9wdGlvbik7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNpbmdsZU9wdGlvbihhY3RpdmVPcHRpb24pO1xuICB9XG4gIHByaXZhdGUgc2VsZWN0U2luZ2xlT3B0aW9uKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMucHJvcGFnYXRlRnJvbVZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgdGhpcy5jbG9zZVBhbmVsKCdzZWxlY3Rpb24nKTtcbiAgfVxuICBwcml2YXRlIHRvZ2dsZU9wdGlvbihvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIGZvcmNlQ2hlY2tlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKSk7XG4gICAgY29uc3Qgc2hvdWxkU2VsZWN0ID0gdGhpcy5yZXNvbHZlT3B0aW9uQ2hlY2tlZFN0YXRlKHNlbGVjdGVkVmFsdWVzLCBvcHRpb24sIGZvcmNlQ2hlY2tlZCk7XG4gICAgaWYgKHNob3VsZFNlbGVjdCkge1xuICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVzLmRlbGV0ZShvcHRpb24udmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkVmFsdWVzID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKClcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBzZWxlY3RlZFZhbHVlcy5oYXMoZW50cnkudmFsdWUpKVxuICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcmRlcmVkVmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihvcHRpb24udmFsdWUpO1xuICB9XG4gIHByaXZhdGUgc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKHJlc2V0U2Nyb2xsID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBidWlsZFZpc2libGVDb21ib2JveE9wdGlvbnMoe1xuICAgICAgcmVzZXRTY3JvbGwsXG4gICAgICBidWZmZXJTaXplOiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0JVRkZFUl9TSVpFLFxuICAgICAgZmFsbGJhY2tWaWV3cG9ydEhlaWdodDogQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9WSUVXUE9SVF9GQUxMQkFDS19IRUlHSFQsXG4gICAgICBmaWx0ZXJlZEl0ZW1zOiB0aGlzLmZpbHRlcmVkSXRlbXMsXG4gICAgICBvcHRpb25Sb3dIZWlnaHQ6IHRoaXMub3B0aW9uUm93SGVpZ2h0LFxuICAgICAgdXNlVmlydHVhbGl6ZWRPcHRpb25zOiB0aGlzLnVzZVZpcnR1YWxpemVkT3B0aW9ucyxcbiAgICAgIHZpZXdwb3J0OiB0aGlzLm9wdGlvbnNWaWV3cG9ydFJlZj8ubmF0aXZlRWxlbWVudFxuICAgIH0pO1xuICAgIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggPSBuZXh0U3RhdGUudmlzaWJsZVN0YXJ0SW5kZXg7XG4gICAgdGhpcy52aXNpYmxlRW5kSW5kZXggPSBuZXh0U3RhdGUudmlzaWJsZUVuZEluZGV4O1xuICAgIHRoaXMudmlzaWJsZUZpbHRlcmVkSXRlbXMgPSBuZXh0U3RhdGUudmlzaWJsZUZpbHRlcmVkSXRlbXM7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemVPcHRpb25zKCk6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSB7XG4gICAgaWYgKHRoaXMuaWNvblNlbGVjdG9yKSB7XG4gICAgICB0aGlzLmVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTtcbiAgICAgIGlmICh0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9PT0gdGhpcy5jdXJyZW50TGFuZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faWNvbk9wdGlvbnNDYWNoZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmN1cnJlbnRMYW5nO1xuICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IHRoaXMuX29wdGlvbnNDYWNoZUtleSAmJiB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID09PSBjdXJyZW50TGFuZykge1xuICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHRoaXMucGFyc2VOb3JtYWxpemVkT3B0aW9uc0lucHV0KCk7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlS2V5ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPSBjdXJyZW50TGFuZztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGUgPSBuZXh0Lm1hcCgob3B0aW9uKSA9PiBjcmVhdGVSZXNvbHZlZENvbWJvYm94T3B0aW9uKG9wdGlvbiwgKHZhbHVlKSA9PiB0aGlzLnRyYW5zbGF0ZVRleHQodmFsdWUpKSk7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDYWNoZTtcbiAgfVxuICBwcml2YXRlIGFzVGV4dCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJzsgfVxuICBwcml2YXRlIHRyYW5zbGF0ZVRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgeyByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQodGhpcy50cmFuc2xhdGUsIHRoaXMuYXNUZXh0KHZhbHVlKSk7IH1cbiAgcHJpdmF0ZSBwYXJzZU5vcm1hbGl6ZWRPcHRpb25zSW5wdXQoKTogT3B0aW9uSXRlbVtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zIGFzIE9wdGlvbkl0ZW1bXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGhpcy5vcHRpb25zIHx8ICdbXScpO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IChwYXJzZWQgYXMgT3B0aW9uSXRlbVtdKSA6IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCBjdXJyZW50TGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA/PyB0aGlzLnRyYW5zbGF0ZS5nZXREZWZhdWx0TGFuZz8uKCkgPz8gJyc7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRTZWxlY3RlZENvdW50KHRoaXMudmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGFjdGl2ZU9wdGlvblZhbHVlKCk6IE9wdGlvblZhbHVlIHwgbnVsbCB7XG4gICAgcmV0dXJuIGdldEFjdGl2ZU9wdGlvblZhbHVlKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy5oaWdobGlnaHRlZEluZGV4KTtcbiAgfVxuICBwcml2YXRlIGdldCBmaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBnZXRGaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMudmFsdWUpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheU1vZGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmRpc3BsYXlNb2RlID0gJ3N1bW1hcnknO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXlNb2RlID0gdGhpcy5zaG91bGRDb2xsYXBzZUNoaXBEaXNwbGF5VG9TdW1tYXJ5KCkgPyAnc3VtbWFyeScgOiAnY2hpcCc7XG4gIH1cbiAgcHJpdmF0ZSBwcm9wYWdhdGVGcm9tVmFsdWUodmFsdWU6IE9wdGlvblZhbHVlIHwgT3B0aW9uVmFsdWVbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgaWYgKGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZW1pdHRlZFZhbHVlID0gdGhpcy52YWx1ZSA/PyAodGhpcy5tdWx0aXBsZSA/IFtdIDogbnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlRXZlbnQuZW1pdChlbWl0dGVkVmFsdWUpO1xuICAgIHRoaXMuY29tbWl0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIGlzUHJpbnRhYmxlQ2hhcmFjdGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LmtleS5sZW5ndGggPT09IDEgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleTtcbiAgfVxuICBwcml2YXRlIHNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5zeW5jQ2hpcFByZXNlbnRhdGlvbigpKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLnN5bmNDaGlwUHJlc2VudGF0aW9uKCkpO1xuICB9XG4gIHByaXZhdGUgc3luY0NoaXBQcmVzZW50YXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dERpc3BsYXlNb2RlOiAnY2hpcCcgfCAnc3VtbWFyeScgPSB0aGlzLnNob3VsZENvbGxhcHNlQ2hpcERpc3BsYXlUb1N1bW1hcnkoKSA/ICdzdW1tYXJ5JyA6ICdjaGlwJztcbiAgICBpZiAodGhpcy5kaXNwbGF5TW9kZSA9PT0gbmV4dERpc3BsYXlNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheU1vZGUgPSBuZXh0RGlzcGxheU1vZGU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRDb2xsYXBzZUNoaXBEaXNwbGF5VG9TdW1tYXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzaG91bGRDb2xsYXBzZUNvbWJvYm94Q2hpcERpc3BsYXkoe1xuICAgICAgbXVsdGlwbGU6IHRoaXMubXVsdGlwbGUsXG4gICAgICBzZWxlY3RlZEl0ZW1Db3VudDogdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCxcbiAgICAgIHNlbGVjdGVkQ291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCxcbiAgICAgIG1heFNlbGVjdGVkTGFiZWxzOiB0aGlzLm1heFNlbGVjdGVkTGFiZWxzLFxuICAgICAgYXZhaWxhYmxlV2lkdGg6IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudD8uY2xpZW50V2lkdGggPz8gMCxcbiAgICAgIHJlcXVpcmVkV2lkdGg6IHRoaXMuY2hpcE1lYXN1cmVSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbFdpZHRoID8/IDBcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHJlc2V0T3B0aW9uc0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUtleSA9IG51bGw7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9ICcnO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZSA9IFtdO1xuICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZSA9IFtdO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaENvbWJvYm94U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ29wdGlvbnMnXSkge1xuICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaWNvblNlbGVjdG9yJ10gfHwgY2hhbmdlc1snc2hvd0ljb25DbGFzcyddKSB7XG4gICAgICB0aGlzLnJlc2V0VmlydHVhbFdpbmRvdygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhbmRsZUljb25TZWxlY3RvckNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpY29uU2VsZWN0b3InXSkge1xuICAgICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaEZpbHRlcmVkU3RhdGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc09wdGlvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ29wdGlvbnMnXTtcbiAgICBjb25zdCBoYXNTZWxlY3Rpb25DaGFuZ2VzID0gISFjaGFuZ2VzWydtdWx0aXBsZSddIHx8ICEhY2hhbmdlc1sndmFsdWUnXTtcbiAgICBjb25zdCBoYXNJY29uQ2hhbmdlcyA9ICEhY2hhbmdlc1snaWNvblNlbGVjdG9yJ10gfHwgISFjaGFuZ2VzWydzaG93SWNvbkNsYXNzJ107XG5cbiAgICByZXR1cm4gaGFzT3B0aW9uQ2hhbmdlcyB8fCBoYXNTZWxlY3Rpb25DaGFuZ2VzIHx8IGhhc0ljb25DaGFuZ2VzO1xuICB9XG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaERpc3BsYXlNb2RlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoY2hhbmdlc1snbXVsdGlwbGUnXSB8fCBjaGFuZ2VzWydtYXhTZWxlY3RlZExhYmVscyddIHx8IGNoYW5nZXNbJ3ZhbHVlJ10pO1xuICB9XG4gIHByaXZhdGUgbm9ybWFsaXplVmFsdWVGb3JNdWx0aXBsZU1vZGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICghY2hhbmdlc1snbXVsdGlwbGUnXSB8fCAhdGhpcy5tdWx0aXBsZSB8fCBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpIHx8IHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gW3RoaXMudmFsdWVdO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlUHJpbnRhYmxlVHJpZ2dlcktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1ByaW50YWJsZUNoYXJhY3RlcihldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5rZXk7XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQXJyb3dLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubmF2aWdhdGVUcmlnZ2VyQXJyb3coMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgbmF2aWdhdGVUcmlnZ2VyQXJyb3coc3RlcDogSGlnaGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICAgIGlmIChzdGVwIDwgMCkge1xuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdmVIaWdobGlnaHQoc3RlcCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyT3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT3BlbktleSA9IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJztcblxuICAgIGlmICghaXNPcGVuS2V5IHx8IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KDApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgnZXNjYXBlJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuY2xvc2VQYW5lbCgndGFiJykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdCYWNrc3BhY2UnIHx8ICF0aGlzLm11bHRpcGxlIHx8IHRoaXMuaGFzU2VhcmNoUXVlcnkgfHwgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0sIGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc1NlYXJjaFF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNpbmdsZU9wdGlvbj8udmFsdWUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uQ2hlY2tlZFN0YXRlKFxuICAgIHNlbGVjdGVkVmFsdWVzOiBTZXQ8T3B0aW9uVmFsdWU+LFxuICAgIG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbixcbiAgICBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChmb3JjZUNoZWNrZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmb3JjZUNoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiAhc2VsZWN0ZWRWYWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSB0aGlzLmljb25TZWxlY3RvckRhdGFcbiAgICAgIC5sb2FkRm9udEF3ZXNvbWVWNVNvbGlkSWNvbnMoKVxuICAgICAgLnRoZW4oKGljb25zKSA9PiB7XG4gICAgICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucyhpY29ucywgKHZhbHVlKSA9PiB0aGlzLnRyYW5zbGF0ZVRleHQodmFsdWUpKTtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSB0aGlzLmN1cnJlbnRMYW5nO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29tYm9ib3hTdGF0ZSgpO1xuICAgICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpc2libGVPcHRpb25zU3luYyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwpKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRWaXJ0dWFsV2luZG93KCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gMDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gW107XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hcIj5cbiAgQGlmICh1aS5sYWJlbFRleHQgfHwgdWkuaW5mb1Rvb2x0aXBUZXh0KSB7XG4gICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWwtcm93XCI+XG4gICAgICBAaWYgKHVpLmxhYmVsVGV4dCkge1xuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBbaWRdPVwidWkubGFiZWxJZFwiXG4gICAgICAgICAgW2Zvcl09XCJ1aS5sYWJlbEZvcklkXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVxdWlyZWQgPyB1aS5sYWJlbFRleHQgKyAnICcgKyB1aS5yZXF1aXJlZEZpZWxkVGV4dCA6IHVpLmxhYmVsVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC10ZXh0XCI+XG4gICAgICAgICAgICB7eyB1aS5sYWJlbFRleHQgfX1cbiAgICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuICAgICAgQGlmICh1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICAgICAgPHNkYy10b29sdGlwXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2luZm8tdG9vbHRpcC13cmFwXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwidWkuaW5mb1Rvb2x0aXBUZXh0XCJcbiAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImluZm9Ub29sdGlwUG9zaXRpb25cIlxuICAgICAgICAgIFt0b29sdGlwRXZlbnRdPVwiaW5mb1Rvb2x0aXBFdmVudFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlIHNkYy1jb21ib2JveF9faW5mby10b29sdGlwLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXG4gICAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICAgIFtvZmZzZXRdPVwidWkucGFuZWxPZmZzZXRcIlxuICAgIFthcmlhTGFiZWxdPVwidWkuZHJvcGRvd25BcmlhTGFiZWxcIlxuICAgIFttYXRjaFRyaWdnZXJXaWR0aF09XCJ0cnVlXCJcbiAgICBbdG9nZ2xlT25UcmlnZ2VyQ2xpY2tdPVwiZmFsc2VcIlxuICAgIFtjbG9zZU9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICBbcGFuZWxDbGFzc109XCJ1aS5wYW5lbE92ZXJsYXlDbGFzc1wiXG4gICAgKG9wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPGRpdlxuICAgICAgc2RjLXBvcG92ZXItdHJpZ2dlclxuICAgICAgI3RyaWdnZXJDb250cm9sUmVmXG4gICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY29udHJvbFwiXG4gICAgICBbYXR0ci5pZF09XCJtdWx0aXBsZSA/IHVpLmNvbnRyb2xJZCA6IG51bGxcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLXNtYWxsXT1cInNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgW25nU3R5bGVdPVwiZ2V0SW5wdXRTdHlsZSgpXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIm11bHRpcGxlICYmICFkaXNhYmxlZCA/IDAgOiBudWxsXCJcbiAgICAgIFthdHRyLnJvbGVdPVwibXVsdGlwbGUgPyAnY29tYm9ib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIm11bHRpcGxlID8gJ2xpc3Rib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm11bHRpcGxlID8gdWkuY29tYm9ib3hBcmlhTGFiZWwgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJtdWx0aXBsZSA/IHVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwibXVsdGlwbGUgPyByZXF1aXJlZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIm11bHRpcGxlID8gaW52YWxpZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtdWx0aXBsZSA/IChwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJtdWx0aXBsZSA/IHVpLmxpc3Rib3hJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm11bHRpcGxlID8gYWN0aXZlRGVzY2VuZGFudCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJtdWx0aXBsZSA/IHVpLm1lc3NhZ2VJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25Db250cm9sTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uQ29udHJvbENsaWNrKClcIlxuICAgICAgKGtleWRvd24pPVwibXVsdGlwbGUgPyBvblRyaWdnZXJLZXlkb3duKCRldmVudCkgOiBudWxsXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZhbHVlXCI+XG4gICAgICAgIEBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgQGlmIChzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvbikge1xuICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19sZWFkaW5nLWljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblwiXG4gICAgICAgICAgICAgIFtpY29uVHlwZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblR5cGVcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjc2luZ2xlSW5wdXRSZWZcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19pbnB1dFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbaWRdPVwidWkuY29udHJvbElkXCJcbiAgICAgICAgICAgIFtuYW1lXT1cInVpLmlucHV0TmFtZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8udGV4dCA/PyAnJ1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidWkucGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJjb21ib2JveC1maWVsZC1saXN0Ym94XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgI211bHRpVmFsdWVSZWYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX211bHRpLXZhbHVlXCI+XG4gICAgICAgICAgICAgIEBpZiAoIXNob3VsZERpc3BsYXlDaGlwU3VtbWFyeSkge1xuICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2VsZWN0ZWRTdW1tYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwiaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCIgW2F0dHIudGl0bGVdPVwiaXRlbS50ZXh0XCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtcmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjaGlwUmVtb3ZlQXJpYUxhYmVsKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3N1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0ZWRTdW1tYXJ5VGV4dCB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyB1aS5wbGFjZWhvbGRlclRleHQgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICNjaGlwTWVhc3VyZVJlZlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdCBzZGMtY29tYm9ib3hfX2NoaXAtbGlzdC0tbWVhc3VyZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJpdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLXJlbW92ZS1wbGFjZWhvbGRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19hY3Rpb25zXCI+XG4gICAgICAgICAgQGlmIChoYXNDbGVhckFjdGlvbikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLWNsZWFyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jbGVhckZpZWxkVGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckFsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLXRvZ2dsZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5kcm9wZG93bkFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uVG9nZ2xlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2FyZXQtZG93biBzZGMtY29tYm9ib3hfX2NhcmV0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY2FyZXQtLW9wZW5dPVwicGFuZWxPcGVuXCJcbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgc2RjLXBvcG92ZXItY29udGVudFxuICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWxcIlxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJwYW5lbE1heEhlaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VhcmNoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VhcmNoLXJvd1wiPlxuICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VsZWN0LWFsbFwiPlxuICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImFyZUFsbEZpbHRlcmVkSXRlbXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLnNlbGVjdEFsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlQWxsRmlsdGVyZWRJdGVtcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9zZGMtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgI3BhbmVsU2VhcmNoYm94UmVmXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2hib3hcIlxuICAgICAgICAgICAgICBbaWRlbnRpdHldPVwidWkucGFuZWxTZWFyY2hJZGVudGl0eVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ1aS5wYW5lbFNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoVGVybVwiXG4gICAgICAgICAgICAgIFtkZWJvdW5jZVRpbWVNc109XCIwXCJcbiAgICAgICAgICAgICAgW3N1Ym1pdE9uRW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbY2xlYXJPbkVzY2FwZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwidWkucGFuZWxTZWFyY2hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICBbaW5wdXRSb2xlXT1cIm51bGxcIlxuICAgICAgICAgICAgICBbaW5wdXRBdXRvY29tcGxldGVdPVwiJ29mZidcIlxuICAgICAgICAgICAgICBbaW5wdXRBcmlhQ29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgICAgW2lucHV0QXJpYURlc2NyaWJlZEJ5XT1cInVpLm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoVGVybUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25TZWFyY2hDbGVhcmVkKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblNlYXJjaGJveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9zZGMtc2VhcmNoYm94PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGlzT3B0aW9uc0xvYWRpbmcpIHtcbiAgICAgICAgICA8b3V0cHV0IGNsYXNzPVwic2RjLWNvbWJvYm94X19sb2FkaW5nXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW4gc2RjLWNvbWJvYm94X19sb2FkaW5nLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fbG9hZGluZy10ZXh0XCI+e3sgdWkubG9hZGluZ0l0ZW1zVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L291dHB1dD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtcHR5U3RhdGUpIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fZW1wdHlcIlxuICAgICAgICAgICAgdmFyaWFudD1cImlubGluZS10ZXh0XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJ1aS5lbXB0eVRpdGxlVGV4dFwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBAaWYgKHVzZVZpcnR1YWxpemVkT3B0aW9ucykge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAjb3B0aW9uc1ZpZXdwb3J0UmVmXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25zIHNkYy1jb21ib2JveF9fb3B0aW9ucy0tdmlydHVhbGl6ZWRcIlxuICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uT3B0aW9uc1Njcm9sbCgpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTW92ZSgpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25PcHRpb25zUGFuZWxNb3VzZUxlYXZlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwhLS0gTk9TT05BUjogY3VzdG9tIGNvbWJvYm94IHBvcHVwIGludGVudGlvbmFsbHkgdXNlcyBBUklBIGxpc3Rib3ggc2VtYW50aWNzIGluc3RlYWQgb2YgYSBuYXRpdmUgc2VsZWN0IC0tPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnMtbGlzdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInbGlzdGJveCdcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X192aXJ0dWFsLXNwYWNlclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImJlZm9yZVZpcnR1YWxTcGFjZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICB2aXNpYmxlT3B0aW9uIG9mIHZpc2libGVGaWx0ZXJlZEl0ZW1zO1xuICAgICAgICAgICAgICAgICAgdHJhY2sgdHJhY2tCeU9wdGlvblZhbHVlKHZpc2libGVPcHRpb24uaW5kZXgsIHZpc2libGVPcHRpb24uaXRlbSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0tYWN0aXZlXT1cImlzT3B0aW9uQWN0aXZlKHZpc2libGVPcHRpb24uaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1pY29uLXNlbGVjdG9yXT1cImljb25TZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0tc2VsZWN0ZWRdPVwiIW11bHRpcGxlICYmIGlzT3B0aW9uU2VsZWN0ZWQodmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtb3B0aW9uLWluZGV4XT1cInZpc2libGVPcHRpb24uaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk9wdGlvbk1vdXNlRW50ZXIodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY2hlY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2UodmlzaWJsZU9wdGlvbi5pdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodmlzaWJsZU9wdGlvbi5pdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ2aXNpYmxlT3B0aW9uLml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IHZpc2libGVPcHRpb24uaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KHZpc2libGVPcHRpb24uaXRlbSk7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJhZnRlclZpcnR1YWxTcGFjZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnNcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZShpbmRleCwgb3B0aW9uKTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWFjdGl2ZV09XCJpc09wdGlvbkFjdGl2ZShpbmRleClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1pY29uLXNlbGVjdG9yXT1cImljb25TZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLXNlbGVjdGVkXT1cIiFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25PcHRpb25Nb3VzZUVudGVyKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9wdGlvbkNoZWNrYm94Q2hhbmdlKG9wdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwhLS0gTk9TT05BUiAtLT5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIm9wdGlvbklkKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25PcHRpb25DbGljayhvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbi5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwib3B0aW9uLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tbGFiZWxcIj57eyBvcHRpb24udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uTWV0YVRleHQob3B0aW9uKTsgYXMgb3B0aW9uTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tbWV0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hlY2sgc2RjLWNvbWJvYm94X19vcHRpb24tc2VsZWN0ZWQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLXBvcG92ZXI+XG5cbiAgICBAaWYgKHVpLm1lc3NhZ2VUZXh0KSB7XG4gICAgICA8c21hbGxcbiAgICAgICAgW2lkXT1cInVpLm1lc3NhZ2VJZFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldEludmFsaWRNZXNzYWdlQ2xhc3MoKVwiXG4gICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAge3sgdWkubWVzc2FnZVRleHQgfX1cbiAgICAgIDwvc21hbGw+XG4gICAgfVxuICA8L2Rpdj5cbiJdfQ==
|
|
1018
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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UTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDb0Isa0JBQWtCO3NCQUEzQyxNQUFNO3VCQUFDLGdCQUFnQjtnQkFDZCxXQUFXO3NCQUFwQixNQUFNO2dCQUNzQixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDSyxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNELGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNLLGNBQWM7c0JBQTdDLFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNGLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDRyxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDTSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDT01CT0JPWF9ERUZBVUxUX01BWF9TRUxFQ1RFRF9MQUJFTFMsXG4gIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVCxcbiAgQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYLFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0JVRkZFUl9TSVpFLFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0RFRkFVTFRfUk9XX0hFSUdIVCxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9ST1dfSEVJR0hUX1dJVEhfQ0xBU1MsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfVklFV1BPUlRfRkFMTEJBQ0tfSEVJR0hULFxuICBDT01CT0JPWF9SRU1PVkVfQ0hJUF9MQUJFTF9LRVksXG4gIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWVxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9jb21ib2JveC5jb25zdCc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvaWNvbi1zZWxlY3Rvci1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW5wdXRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL2lucHV0cy5kaXJlY3RpdmUnO1xuaW1wb3J0IHR5cGUgeyBDaGlwUmVtb3ZlRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2NoaXBzLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25JdGVtLCBPcHRpb25zLCBPcHRpb25WYWx1ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvc2VtYW50aWNzLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUb29sdGlwRXZlbnQsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvdG9vbHRpcC50eXBlJztcbmltcG9ydCB7IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pMThuLnV0aWwnO1xuaW1wb3J0IHsgbmV4dFNlcXVlbnRpYWxJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvaWQudXRpbCc7XG5pbXBvcnQgeyBJY29uUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2NvbXBvbmVudHMvaWNvbi1yZW5kZXJlci9pY29uLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuLi90b29sdGlwL3Rvb2x0aXAuY29tcG9uZW50JztcbmltcG9ydCB7IGFzQ29tYm9ib3hBcnJheSwgYnVpbGRDb21ib2JveFNlYXJjaFRleHQsIGJ1aWxkQ29tYm9ib3hVaVN0YXRlLCBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucywgYnVpbGRWaXNpYmxlQ29tYm9ib3hPcHRpb25zLCBjcmVhdGVSZXNvbHZlZENvbWJvYm94T3B0aW9uLCBnZXRBY3RpdmVPcHRpb25WYWx1ZSwgZ2V0Rmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUsIGdldFNlbGVjdGVkQ291bnQsIG5vcm1hbGl6ZUNvbWJvYm94U2VhcmNoVGV4dCwgbm9ybWFsaXplRXh0ZXJuYWxDb21ib2JveFZhbHVlLCBzaG91bGRDb2xsYXBzZUNvbWJvYm94Q2hpcERpc3BsYXksIHR5cGUgQ29tYm9ib3hEaXNwbGF5TW9kZSwgdHlwZSBDb21ib2JveFJlc29sdmVkT3B0aW9uLCB0eXBlIENvbWJvYm94VWlTdGF0ZSwgdHlwZSBDb21ib2JveFZhbHVlLCB0eXBlIENvbWJvYm94VmlzaWJsZU9wdGlvbiwgdHlwZSBIaWdobGlnaHRTdGVwLCB0eXBlIFBhbmVsQ2xvc2VSZWFzb24gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2NvbWJvYm94LnV0aWwnO1xuQENvbXBvbmVudCh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEljb25SZW5kZXJlckNvbXBvbmVudCxcbiAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFBvcG92ZXJDb21wb25lbnQsXG4gICAgU2VhcmNoYm94Q29tcG9uZW50LFxuICAgIFRvb2x0aXBDb21wb25lbnRcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdzZGMtY29tYm9ib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBJbnB1dHNDb21wb25lbnQ8T3B0aW9uVmFsdWUgfCBPcHRpb25WYWx1ZVtdPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VsZWN0b3JEYXRhID0gaW5qZWN0KEljb25TZWxlY3RvckRhdGFTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRlZElkID0gbmV4dFNlcXVlbnRpYWxJZCgnc2RjLWNvbWJvYm94Jyk7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGVuZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHpJbmRleCA9IENPTUJPQk9YX0RFRkFVTFRfWl9JTkRFWDtcbiAgQElucHV0KCkgb3B0aW9uczogT3B0aW9ucyB8IHN0cmluZyA9IFtdO1xuICBASW5wdXQoKSBvdmVycmlkZUNoaXBNZXNzYWdlPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhTZWxlY3RlZExhYmVscyA9IENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUztcbiAgQElucHV0KCkgc2hvd0NsZWFyID0gdHJ1ZTtcbiAgQElucHV0KCkgaWNvblNlbGVjdG9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uQ2xhc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5mb1Rvb2x0aXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAncmlnaHQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcEV2ZW50OiBUb29sdGlwRXZlbnQgPSAnYm90aCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQWxsb3dIdG1sID0gZmFsc2U7XG4gIEBPdXRwdXQoJ29uU2VsZWN0ZWRJdGVtJykgc2VsZWN0ZWRWYWx1ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveFZhbHVlPigpO1xuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGlzT3B0aW9uc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nICYmIHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5nO1xuICB9XG4gIGdldCB1c2VWaXJ0dWFsaXplZE9wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzaG93RW1wdHlTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPcHRpb25zTG9hZGluZyAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwO1xuICB9XG4gIGdldCBvcHRpb25Sb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbkNsYXNzXG4gICAgICA/IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfUk9XX0hFSUdIVF9XSVRIX0NMQVNTXG4gICAgICA6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hUO1xuICB9XG4gIGdldCBiZWZvcmVWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggKiB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgfVxuICBnZXQgYWZ0ZXJWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsICh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy52aXNpYmxlRW5kSW5kZXgpICogdGhpcy5vcHRpb25Sb3dIZWlnaHQpO1xuICB9XG4gIG9uU2VhcmNoKGV2ZW50OiB7IHF1ZXJ5Pzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoU3RyaW5nKGV2ZW50Py5xdWVyeSA/PyAnJykpO1xuICB9XG4gIG9uUGFuZWxJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VhcmNoVGVybUNoYW5nZSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8udmFsdWUgPz8gJycpO1xuICB9XG4gIG9uU2VhcmNoVGVybUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uc1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gIH1cbiAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNraXBOZXh0Rm9jdXNPcGVuKSB7XG4gICAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICB9XG4gIG9uSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnRhcmdldC5pZCA9PT0gdGhpcy51aS5wYW5lbFNlYXJjaElkZW50aXR5LmlkKSB7XG4gICAgICB0aGlzLm9uU2VhcmNoYm94S2V5ZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25UcmlnZ2VyS2V5ZG93bihldmVudCk7XG4gIH1cbiAgb25UcmlnZ2VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVRyaWdnZXJBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlck9wZW5LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25TZWFyY2hib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94QXJyb3dLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveEJvdW5kYXJ5S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25Db250cm9sTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAvLyBLZWVwIHRoZSBwYW5lbCBzZWFyY2hib3ggZm9jdXNlZCBldmVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB0cmlnZ2VyIGFyZWEgYWdhaW4uXG4gICAgICAvLyBXaXRob3V0IHByZXZlbnRpbmcgdGhlIHRyaWdnZXIgZnJvbSB0YWtpbmcgZm9jdXMgZmlyc3QsIHRoZSBjYXJldCBtYXkgZGlzYXBwZWFyIGV2ZW5cbiAgICAgIC8vIHRob3VnaCB0eXBpbmcgc3RpbGwgdXBkYXRlcyB0aGUgc2VhcmNoYm94LlxuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3VwcHJlc3MgZm9jdXMtdHJpZ2dlcmVkIG9wZW46IGluIHNpbmdsZSBtb2RlIHRoZSBpbnB1dCByZWNlaXZlcyBmb2N1cyBvbiBtb3VzZWRvd24sXG4gICAgLy8gd2hpY2ggZmlyZXMgb25JbnB1dEZvY3VzKCkgYmVmb3JlIHRoZSBjbGljayBldmVudC4gV2l0aG91dCB0aGlzIGZsYWcsIG9uSW5wdXRGb2N1c1xuICAgIC8vIHdvdWxkIG9wZW4gdGhlIHBhbmVsIGFuZCB0aGUgc3Vic2VxdWVudCBjbGljayAob25Db250cm9sQ2xpY2spIHdvdWxkIGltbWVkaWF0ZWx5IGNsb3NlIGl0LlxuICAgIHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSBmYWxzZTsgfSwgMCk7XG4gIH1cbiAgb25Db250cm9sQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25Ub2dnbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBvblBvcG92ZXJPcGVuQ2hhbmdlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob3BlbiB8fCAhdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZVBhbmVsKCdvdXRzaWRlJyk7XG4gIH1cbiAgdG9nZ2xlUGFuZWwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoJ3RvZ2dsZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgY2xlYXJBbGwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogbnVsbDtcbiAgICBjb25zdCBzaG91bGRSZWZvY3VzU2VhcmNoID0gdGhpcy5wYW5lbE9wZW47XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy52YWx1ZSA9IGNsZWFyZWRWYWx1ZTtcbiAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZShjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoY2xlYXJlZFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChzaG91bGRSZWZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBvbk9wdGlvbkNsaWNrKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihvcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uKTtcbiAgfVxuICBvbk9wdGlvbkNoZWNrYm94Q2hhbmdlKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbiwgY2hlY2tlZCk7XG4gICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgfVxuICBvbk9wdGlvbkNoZWNrYm94S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgndG9nZ2xlJyk7XG4gICAgfVxuICB9XG4gIG9uT3B0aW9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgb3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VudGVyJyAmJiBldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub25PcHRpb25DbGljayhvcHRpb24pO1xuICB9XG4gIHRvZ2dsZUFsbEZpbHRlcmVkSXRlbXMoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlVmFsdWUgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gbmV3IFNldChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZmlsdGVyZWRJdGVtcykge1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFZhbHVlcy5kZWxldGUob3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3JkZXJlZFZhbHVlcyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gc2VsZWN0ZWRWYWx1ZXMuaGFzKGVudHJ5LnZhbHVlKSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3JkZXJlZFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIHJlbW92ZVNlbGVjdGVkSXRlbShvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQ/LigpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24/LigpO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlVmFsdWUgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkuZmlsdGVyKChlbnRyeSkgPT4gIU9iamVjdC5pcyhlbnRyeSwgb3B0aW9uLnZhbHVlKSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUoY3VycmVudFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIG9uQ2hpcFJlbW92ZWQoZXZlbnQ6IENoaXBSZW1vdmVFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMucmVzb2x2ZU9wdGlvbihldmVudC52YWx1ZSk7XG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEl0ZW0ob3B0aW9uLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgfVxuICByZXNvbHZlT3B0aW9uKG9wdE9yVmFsdWU6IHVua25vd24pOiBDb21ib2JveFJlc29sdmVkT3B0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKCk7XG4gICAgaWYgKG9wdE9yVmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0T3JWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG9iaiA9IG9wdE9yVmFsdWUgYXMgeyB0ZXh0Pzogc3RyaW5nOyB2YWx1ZT86IE9wdGlvblZhbHVlIH07XG4gICAgICBpZiAoJ3RleHQnIGluIG9iaiAmJiAndmFsdWUnIGluIG9iaikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLihvYmogYXMgT3B0aW9uSXRlbSksXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVUZXh0KG9iai50ZXh0KSxcbiAgICAgICAgICBzZWFyY2hUZXh0OiBidWlsZENvbWJvYm94U2VhcmNoVGV4dCh0aGlzLnRyYW5zbGF0ZVRleHQob2JqLnRleHQpLCB0aGlzLmFzVGV4dChvYmoudmFsdWUpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCd2YWx1ZScgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiBhbGwuZmluZCgob3B0aW9uKSA9PiBPYmplY3QuaXMob3B0aW9uLnZhbHVlLCBvYmoudmFsdWUpKSA/PyBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsLmZpbmQoKG9wdGlvbikgPT4gT2JqZWN0LmlzKG9wdGlvbi52YWx1ZSwgb3B0T3JWYWx1ZSBhcyBPcHRpb25WYWx1ZSkpID8/IG51bGw7XG4gIH1cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLnNvbWUoKGVudHJ5KSA9PiBPYmplY3QuaXMoZW50cnksIG9wdGlvbi52YWx1ZSkpO1xuICB9XG4gIGlzT3B0aW9uQWN0aXZlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEluZGV4ID09PSBpbmRleDtcbiAgfVxuICBvbk9wdGlvbk1vdXNlRW50ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChpbmRleCwgZmFsc2UpO1xuICB9XG4gIG9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCA9IHRydWU7XG4gIH1cbiAgb25PcHRpb25zUGFuZWxNb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIG9wdGlvbk1ldGFUZXh0KG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgIXRoaXMuc2hvd0ljb25DbGFzcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb24uaWNvbkNsYXNzTmFtZSA/PyBudWxsO1xuICB9XG4gIG9wdGlvbklkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnVpLmNvbnRyb2xJZH0tb3B0aW9uLSR7aW5kZXh9YDtcbiAgfVxuICBjaGlwUmVtb3ZlQXJpYUxhYmVsKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCh0aGlzLnRyYW5zbGF0ZSwgbnVsbCwgQ09NQk9CT1hfUkVNT1ZFX0NISVBfTEFCRUxfS0VZKTtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFx7bGFiZWxcXH0vZywgb3B0aW9uLnRleHQpO1xuICB9XG4gIHRyYWNrQnlPcHRpb25WYWx1ZSA9IChfaW5kZXg6IG51bWJlciwgaXRlbTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IE9wdGlvblZhbHVlID0+IGl0ZW0udmFsdWU7XG4gIHByaXZhdGUgb3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogdHJ1ZSB9KTtcbiAgfVxuICBwcml2YXRlIG9wZW5QYW5lbChvcHRpb25zOiB7IGZvY3VzU2VhcmNoOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTtcbiAgICB0aGlzLnBhbmVsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcyh0cnVlKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKHRoaXMucmVzb2x2ZVByZWZlcnJlZEhpZ2hsaWdodFZhbHVlKCkpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucG9wb3Zlcj8ucmVwb3NpdGlvbigpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmModHJ1ZSk7XG4gICAgaWYgKG9wdGlvbnMuZm9jdXNTZWFyY2gpIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2xvc2VQYW5lbChyZWFzb246IFBhbmVsQ2xvc2VSZWFzb24pOiB2b2lkIHtcbiAgICBjb25zdCByZXN0b3JlVHJpZ2dlckZvY3VzID0gcmVhc29uID09PSAnZXNjYXBlJyB8fCByZWFzb24gPT09ICdzZWxlY3Rpb24nIHx8IHJlYXNvbiA9PT0gJ3RvZ2dsZSc7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnJlc2V0VmlydHVhbFdpbmRvdygpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHJlc3RvcmVUcmlnZ2VyRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXNUcmlnZ2VyU29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZvY3VzU2VhcmNoYm94U29vbigpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmZvY3VzU2VhcmNoYm94KCkpO1xuICAgIGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpLCAwKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLmZvY3VzU2VhcmNoYm94KCkpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyU29vbigpOiB2b2lkIHsgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1RyaWdnZXIoKSk7IH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2luZ2xlSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmJsdXIoKTtcbiAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyPy4oKTtcbiAgICB0aGlzLnBhbmVsU2VhcmNoYm94Py5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5wb3BvdmVyPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaEZpbHRlcmVkSXRlbXMocHJlc2VydmVDdXJyZW50SW52YWxpZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBub3JtYWxpemVDb21ib2JveFNlYXJjaFRleHQodGhpcy5zZWFyY2hUZXJtKTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy5pc09wdGlvbnNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKHRydWUpO1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VhcmNoVGV4dC5pbmNsdWRlcyhxdWVyeSkpXG4gICAgICA6IGFsbC5zbGljZSgpO1xuICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCFxdWVyeSk7XG4gICAgaWYgKCFxdWVyeSAmJiBwcmVzZXJ2ZUN1cnJlbnRJbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW52YWxpZCA9IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPT09IDAgJiYgYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLmxlbmd0aCA9PT0gMCAmJiBxdWVyeS5sZW5ndGggPiAwO1xuICB9XG4gIHByaXZhdGUgc2V0SGlnaGxpZ2h0ZWRJbmRleChpbmRleDogbnVtYmVyLCBlbnN1cmVWaXNpYmxlID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSkpO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IG5leHRJbmRleDtcbiAgICBpZiAoZW5zdXJlVmlzaWJsZSAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5zY3JvbGxIaWdobGlnaHRlZE9wdGlvbkludG9WaWV3KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbW92ZUhpZ2hsaWdodChzdGVwOiBIaWdobGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA8IDApIHtcbiAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChzdGVwID4gMCA/IDAgOiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleCgodGhpcy5oaWdobGlnaHRlZEluZGV4ICsgc3RlcCArIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpICUgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihwcmVmZXJyZWRWYWx1ZTogT3B0aW9uVmFsdWUgfCBudWxsID0gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbmRpZGF0ZVZhbHVlcyA9IFtcbiAgICAgIHByZWZlcnJlZFZhbHVlLFxuICAgICAgIXRoaXMubXVsdGlwbGUgPyB0aGlzLnNlbGVjdGVkU2luZ2xlT3B0aW9uPy52YWx1ZSA/PyBudWxsIDogdGhpcy5maXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSxcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc1swXT8udmFsdWUgPz8gbnVsbFxuICAgIF07XG4gICAgY29uc3QgbmV4dEluZGV4ID0gY2FuZGlkYXRlVmFsdWVzXG4gICAgICAubWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbCA/IC0xIDogdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gT2JqZWN0LmlzKGl0ZW0udmFsdWUsIHZhbHVlKSkpXG4gICAgICAuZmluZCgoaW5kZXgpID0+IGluZGV4ID49IDApO1xuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChuZXh0SW5kZXggPz8gMCk7XG4gIH1cbiAgcHJpdmF0ZSBzY3JvbGxIaWdobGlnaHRlZE9wdGlvbkludG9WaWV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZVZpcnR1YWxpemVkT3B0aW9ucykge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm9wdGlvbnNWaWV3cG9ydFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25Ub3AgPSB0aGlzLmhpZ2hsaWdodGVkSW5kZXggKiB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgICAgIGNvbnN0IG9wdGlvbkJvdHRvbSA9IG9wdGlvblRvcCArIHRoaXMub3B0aW9uUm93SGVpZ2h0O1xuICAgICAgY29uc3Qgdmlld3BvcnRUb3AgPSB2aWV3cG9ydC5zY3JvbGxUb3A7XG4gICAgICBjb25zdCB2aWV3cG9ydEJvdHRvbSA9IHZpZXdwb3J0VG9wICsgdmlld3BvcnQuY2xpZW50SGVpZ2h0O1xuICAgICAgaWYgKG9wdGlvblRvcCA8IHZpZXdwb3J0VG9wKSB7XG4gICAgICAgIHZpZXdwb3J0LnNjcm9sbFRvcCA9IG9wdGlvblRvcDtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uQm90dG9tID4gdmlld3BvcnRCb3R0b20pIHtcbiAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG9wID0gb3B0aW9uQm90dG9tIC0gdmlld3BvcnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGhpZ2hsaWdodGVkIG9wdGlvbiBpcyBhbHJlYWR5IGZ1bGx5IHZpc2libGUuXG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpKTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZT8uc2Nyb2xsSW50b1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm9kZS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLmZpbHRlcmVkSXRlbXNbdGhpcy5oaWdobGlnaHRlZEluZGV4XTtcbiAgICBpZiAoIWFjdGl2ZU9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy50b2dnbGVPcHRpb24oYWN0aXZlT3B0aW9uKTtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0U2luZ2xlT3B0aW9uKGFjdGl2ZU9wdGlvbik7XG4gIH1cbiAgcHJpdmF0ZSBzZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLmNsb3NlUGFuZWwoJ3NlbGVjdGlvbicpO1xuICB9XG4gIHByaXZhdGUgdG9nZ2xlT3B0aW9uKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgZm9yY2VDaGVja2VkOiBib29sZWFuIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IG5ldyBTZXQoYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpKTtcbiAgICBjb25zdCBzaG91bGRTZWxlY3QgPSB0aGlzLnJlc29sdmVPcHRpb25DaGVja2VkU3RhdGUoc2VsZWN0ZWRWYWx1ZXMsIG9wdGlvbiwgZm9yY2VDaGVja2VkKTtcbiAgICBpZiAoc2hvdWxkU2VsZWN0KSB7XG4gICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRWYWx1ZXMuZGVsZXRlKG9wdGlvbi52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG9yZGVyZWRWYWx1ZXMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IHNlbGVjdGVkVmFsdWVzLmhhcyhlbnRyeS52YWx1ZSkpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpO1xuICAgIHRoaXMucHJvcGFnYXRlRnJvbVZhbHVlKG9yZGVyZWRWYWx1ZXMpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IGJ1aWxkVmlzaWJsZUNvbWJvYm94T3B0aW9ucyh7XG4gICAgICByZXNldFNjcm9sbCxcbiAgICAgIGJ1ZmZlclNpemU6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gICAgICBmYWxsYmFja1ZpZXdwb3J0SGVpZ2h0OiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1ZJRVdQT1JUX0ZBTExCQUNLX0hFSUdIVCxcbiAgICAgIGZpbHRlcmVkSXRlbXM6IHRoaXMuZmlsdGVyZWRJdGVtcyxcbiAgICAgIG9wdGlvblJvd0hlaWdodDogdGhpcy5vcHRpb25Sb3dIZWlnaHQsXG4gICAgICB1c2VWaXJ0dWFsaXplZE9wdGlvbnM6IHRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zLFxuICAgICAgdmlld3BvcnQ6IHRoaXMub3B0aW9uc1ZpZXdwb3J0UmVmPy5uYXRpdmVFbGVtZW50XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlU3RhcnRJbmRleCA9IG5leHRTdGF0ZS52aXNpYmxlU3RhcnRJbmRleDtcbiAgICB0aGlzLnZpc2libGVFbmRJbmRleCA9IG5leHRTdGF0ZS52aXNpYmxlRW5kSW5kZXg7XG4gICAgdGhpcy52aXNpYmxlRmlsdGVyZWRJdGVtcyA9IG5leHRTdGF0ZS52aXNpYmxlRmlsdGVyZWRJdGVtcztcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZU9wdGlvbnMoKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdIHtcbiAgICBpZiAodGhpcy5pY29uU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgICAgaWYgKHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nID09PSB0aGlzLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pY29uT3B0aW9uc0NhY2hlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMuY3VycmVudExhbmc7XG4gICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gdGhpcy5fb3B0aW9uc0NhY2hlS2V5ICYmIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NhY2hlO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5wYXJzZU5vcm1hbGl6ZWRPcHRpb25zSW5wdXQoKTtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9IGN1cnJlbnRMYW5nO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZSA9IG5leHQubWFwKChvcHRpb24pID0+IGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24ob3B0aW9uLCAodmFsdWUpID0+IHRoaXMudHJhbnNsYXRlVGV4dCh2YWx1ZSkpKTtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NhY2hlO1xuICB9XG4gIHByaXZhdGUgYXNUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnOyB9XG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7IHJldHVybiByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCh0aGlzLnRyYW5zbGF0ZSwgdGhpcy5hc1RleHQodmFsdWUpKTsgfVxuICBwcml2YXRlIHBhcnNlTm9ybWFsaXplZE9wdGlvbnNJbnB1dCgpOiBPcHRpb25JdGVtW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgYXMgT3B0aW9uSXRlbVtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMgfHwgJ1tdJyk7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gKHBhcnNlZCBhcyBPcHRpb25JdGVtW10pIDogW107XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nID8/IHRoaXMudHJhbnNsYXRlLmdldERlZmF1bHRMYW5nPy4oKSA/PyAnJztcbiAgfVxuICBwcml2YXRlIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkQ291bnQodGhpcy52YWx1ZSwgdGhpcy5tdWx0aXBsZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgYWN0aXZlT3B0aW9uVmFsdWUoKTogT3B0aW9uVmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0QWN0aXZlT3B0aW9uVmFsdWUodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLmhpZ2hsaWdodGVkSW5kZXgpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlKCk6IE9wdGlvblZhbHVlIHwgbnVsbCB7XG4gICAgcmV0dXJuIGdldEZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5TW9kZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuZGlzcGxheU1vZGUgPSAnc3VtbWFyeSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheU1vZGUgPSB0aGlzLnNob3VsZENvbGxhcHNlQ2hpcERpc3BsYXlUb1N1bW1hcnkoKSA/ICdzdW1tYXJ5JyA6ICdjaGlwJztcbiAgfVxuICBwcml2YXRlIHByb3BhZ2F0ZUZyb21WYWx1ZSh2YWx1ZTogT3B0aW9uVmFsdWUgfCBPcHRpb25WYWx1ZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlbWl0dGVkVmFsdWUgPSB0aGlzLnZhbHVlID8/ICh0aGlzLm11bHRpcGxlID8gW10gOiBudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVFdmVudC5lbWl0KGVtaXR0ZWRWYWx1ZSk7XG4gICAgdGhpcy5jb21taXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgaXNQcmludGFibGVDaGFyYWN0ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICB9XG4gIHByaXZhdGUgc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnN5bmNDaGlwUHJlc2VudGF0aW9uKCkpO1xuICAgIGNvbnN0IHNjaGVkdWxlID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgIDogKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjaykgPT4gZ2xvYmFsVGhpcy53aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayhwZXJmb3JtYW5jZS5ub3coKSksIDApO1xuICAgIHNjaGVkdWxlKCgpID0+IHRoaXMuc3luY0NoaXBQcmVzZW50YXRpb24oKSk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jQ2hpcFByZXNlbnRhdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0RGlzcGxheU1vZGU6ICdjaGlwJyB8ICdzdW1tYXJ5JyA9IHRoaXMuc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpID8gJ3N1bW1hcnknIDogJ2NoaXAnO1xuICAgIGlmICh0aGlzLmRpc3BsYXlNb2RlID09PSBuZXh0RGlzcGxheU1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IG5leHREaXNwbGF5TW9kZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIHNob3VsZENvbGxhcHNlQ2hpcERpc3BsYXlUb1N1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSh7XG4gICAgICBtdWx0aXBsZTogdGhpcy5tdWx0aXBsZSxcbiAgICAgIHNlbGVjdGVkSXRlbUNvdW50OiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoLFxuICAgICAgc2VsZWN0ZWRDb3VudDogdGhpcy5zZWxlY3RlZENvdW50LFxuICAgICAgbWF4U2VsZWN0ZWRMYWJlbHM6IHRoaXMubWF4U2VsZWN0ZWRMYWJlbHMsXG4gICAgICBhdmFpbGFibGVXaWR0aDogdGhpcy5tdWx0aVZhbHVlUmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyAwLFxuICAgICAgcmVxdWlyZWRXaWR0aDogdGhpcy5jaGlwTWVhc3VyZVJlZj8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsV2lkdGggPz8gMFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmVzZXRPcHRpb25zQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlS2V5ID0gbnVsbDtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlID0gW107XG4gICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSAnJztcbiAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlID0gW107XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoQ29tYm9ib3hTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVPcHRpb25zQ2FjaGVDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snb3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnJlc2V0T3B0aW9uc0NhY2hlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlVmlydHVhbFdpbmRvd0NoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpY29uU2VsZWN0b3InXSB8fCBjaGFuZ2VzWydzaG93SWNvbkNsYXNzJ10pIHtcbiAgICAgIHRoaXMucmVzZXRWaXJ0dWFsV2luZG93KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZWxlY3RvciddKSB7XG4gICAgICB0aGlzLmVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoRmlsdGVyZWRTdGF0ZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzT3B0aW9uQ2hhbmdlcyA9ICEhY2hhbmdlc1snb3B0aW9ucyddO1xuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ211bHRpcGxlJ10gfHwgISFjaGFuZ2VzWyd2YWx1ZSddO1xuICAgIGNvbnN0IGhhc0ljb25DaGFuZ2VzID0gISFjaGFuZ2VzWydpY29uU2VsZWN0b3InXSB8fCAhIWNoYW5nZXNbJ3Nob3dJY29uQ2xhc3MnXTtcblxuICAgIHJldHVybiBoYXNPcHRpb25DaGFuZ2VzIHx8IGhhc1NlbGVjdGlvbkNoYW5nZXMgfHwgaGFzSWNvbkNoYW5nZXM7XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoRGlzcGxheU1vZGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShjaGFuZ2VzWydtdWx0aXBsZSddIHx8IGNoYW5nZXNbJ21heFNlbGVjdGVkTGFiZWxzJ10gfHwgY2hhbmdlc1sndmFsdWUnXSk7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemVWYWx1ZUZvck11bHRpcGxlTW9kZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCFjaGFuZ2VzWydtdWx0aXBsZSddIHx8ICF0aGlzLm11bHRpcGxlIHx8IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgfHwgdGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBbdGhpcy52YWx1ZV07XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVQcmludGFibGVUcmlnZ2VyS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzUHJpbnRhYmxlQ2hhcmFjdGVyKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGV2ZW50LmtleTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm5hdmlnYXRlVHJpZ2dlckFycm93KC0xKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRyaWdnZXJBcnJvdyhzdGVwOiBIaWdobGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgICAgaWYgKHN0ZXAgPCAwKSB7XG4gICAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleCh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubW92ZUhpZ2hsaWdodChzdGVwKTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJPcGVuS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNPcGVuS2V5ID0gZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnO1xuXG4gICAgaWYgKCFpc09wZW5LZXkgfHwgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVNlYXJjaGJveEFycm93S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm1vdmVIaWdobGlnaHQoMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KC0xKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hCb3VuZGFyeUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoMCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVNlYXJjaGJveFNlbGVjdGlvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkT3B0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFuZGxlUGFuZWxDbG9zZUtleShldmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVCYWNrc3BhY2VLZXkoZXZlbnQpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlUGFuZWxDbG9zZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCdlc2NhcGUnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5jbG9zZVBhbmVsKCd0YWInKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0JhY2tzcGFjZScgfHwgIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5oYXNTZWFyY2hRdWVyeSB8fCB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEl0ZW0odGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXSwgZXZlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVByZWZlcnJlZEhpZ2hsaWdodFZhbHVlKCk6IE9wdGlvblZhbHVlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaGFzU2VhcmNoUXVlcnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU2luZ2xlT3B0aW9uPy52YWx1ZSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVPcHRpb25DaGVja2VkU3RhdGUoXG4gICAgc2VsZWN0ZWRWYWx1ZXM6IFNldDxPcHRpb25WYWx1ZT4sXG4gICAgb3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLFxuICAgIGZvcmNlQ2hlY2tlZDogYm9vbGVhbiB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGZvcmNlQ2hlY2tlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvcmNlQ2hlY2tlZDtcbiAgICB9XG4gICAgcmV0dXJuICFzZWxlY3RlZFZhbHVlcy5oYXMob3B0aW9uLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmljb25TZWxlY3RvciB8fCB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9PT0gdGhpcy5jdXJyZW50TGFuZyB8fCB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkUHJvbWlzZSA9IHRoaXMuaWNvblNlbGVjdG9yRGF0YVxuICAgICAgLmxvYWRGb250QXdlc29tZVY1U29saWRJY29ucygpXG4gICAgICAudGhlbigoaWNvbnMpID0+IHtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZSA9IGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zKGljb25zLCAodmFsdWUpID0+IHRoaXMudHJhbnNsYXRlVGV4dCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9IHRoaXMuY3VycmVudExhbmc7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHJlc2V0U2Nyb2xsID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8ICF0aGlzLnVzZVZpcnR1YWxpemVkT3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICAgIGNvbnN0IHNjaGVkdWxlID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgIDogKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjaykgPT4gZ2xvYmFsVGhpcy53aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayhwZXJmb3JtYW5jZS5ub3coKSksIDApO1xuICAgIHNjaGVkdWxlKCgpID0+IHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKHJlc2V0U2Nyb2xsKSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldFZpcnR1YWxXaW5kb3coKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlU3RhcnRJbmRleCA9IDA7XG4gICAgdGhpcy52aXNpYmxlRW5kSW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveFwiPlxuICBAaWYgKHVpLmxhYmVsVGV4dCB8fCB1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC1yb3dcIj5cbiAgICAgIEBpZiAodWkubGFiZWxUZXh0KSB7XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIFtpZF09XCJ1aS5sYWJlbElkXCJcbiAgICAgICAgICBbZm9yXT1cInVpLmxhYmVsRm9ySWRcIlxuICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXF1aXJlZCA/IHVpLmxhYmVsVGV4dCArICcgJyArIHVpLnJlcXVpcmVkRmllbGRUZXh0IDogdWkubGFiZWxUZXh0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xhYmVsLXRleHRcIj5cbiAgICAgICAgICAgIHt7IHVpLmxhYmVsVGV4dCB9fVxuICAgICAgICAgICAgQGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICB9XG4gICAgICBAaWYgKHVpLmluZm9Ub29sdGlwVGV4dCkge1xuICAgICAgICA8c2RjLXRvb2x0aXBcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faW5mby10b29sdGlwLXdyYXBcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCJ1aS5pbmZvVG9vbHRpcFRleHRcIlxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiaW5mb1Rvb2x0aXBQb3NpdGlvblwiXG4gICAgICAgICAgW3Rvb2x0aXBFdmVudF09XCJpbmZvVG9vbHRpcEV2ZW50XCJcbiAgICAgICAgICBbYWxsb3dIdG1sXT1cImluZm9Ub29sdGlwQWxsb3dIdG1sXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGUgc2RjLWNvbWJvYm94X19pbmZvLXRvb2x0aXAtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zZGMtdG9vbHRpcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxzZGMtcG9wb3ZlclxuICAgIFtvcGVuXT1cInBhbmVsT3BlblwiXG4gICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcbiAgICBbekluZGV4XT1cInpJbmRleFwiXG4gICAgW29mZnNldF09XCJ1aS5wYW5lbE9mZnNldFwiXG4gICAgW2FyaWFMYWJlbF09XCJ1aS5kcm9wZG93bkFyaWFMYWJlbFwiXG4gICAgW21hdGNoVHJpZ2dlcldpZHRoXT1cInRydWVcIlxuICAgIFt0b2dnbGVPblRyaWdnZXJDbGlja109XCJmYWxzZVwiXG4gICAgW2Nsb3NlT25Fc2NhcGVdPVwiZmFsc2VcIlxuICAgIFtwYW5lbENsYXNzXT1cInVpLnBhbmVsT3ZlcmxheUNsYXNzXCJcbiAgICAob3BlbkNoYW5nZSk9XCJvblBvcG92ZXJPcGVuQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8ZGl2XG4gICAgICBzZGMtcG9wb3Zlci10cmlnZ2VyXG4gICAgICAjdHJpZ2dlckNvbnRyb2xSZWZcbiAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jb250cm9sXCJcbiAgICAgIFthdHRyLmlkXT1cIm11bHRpcGxlID8gdWkuY29udHJvbElkIDogbnVsbFwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tc21hbGxdPVwic2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbbmdTdHlsZV09XCJnZXRJbnB1dFN0eWxlKClcIlxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwibXVsdGlwbGUgJiYgIWRpc2FibGVkID8gMCA6IG51bGxcIlxuICAgICAgW2F0dHIucm9sZV09XCJtdWx0aXBsZSA/ICdjb21ib2JveCcgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwibXVsdGlwbGUgPyAnbGlzdGJveCcgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibXVsdGlwbGUgPyB1aS5jb21ib2JveEFyaWFMYWJlbCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIm11bHRpcGxlID8gdWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJtdWx0aXBsZSA/IHJlcXVpcmVkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibXVsdGlwbGUgPyBpbnZhbGlkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm11bHRpcGxlID8gKHBhbmVsT3BlbiA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm11bHRpcGxlID8gdWkubGlzdGJveElkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwibXVsdGlwbGUgPyBhY3RpdmVEZXNjZW5kYW50IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm11bHRpcGxlID8gdWkubWVzc2FnZUlkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWF1dG9jb21wbGV0ZV09XCJtdWx0aXBsZSA/ICdsaXN0JyA6IG51bGxcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkNvbnRyb2xNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwib25Db250cm9sQ2xpY2soKVwiXG4gICAgICAoa2V5ZG93bik9XCJtdWx0aXBsZSA/IG9uVHJpZ2dlcktleWRvd24oJGV2ZW50KSA6IG51bGxcIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fdmFsdWVcIj5cbiAgICAgICAgQGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgICBAaWYgKHNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uKSB7XG4gICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xlYWRpbmctaWNvblwiXG4gICAgICAgICAgICAgIFtpY29uXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uXCJcbiAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uVHlwZVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNzaW5nbGVJbnB1dFJlZlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2lucHV0XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtpZF09XCJ1aS5jb250cm9sSWRcIlxuICAgICAgICAgICAgW25hbWVdPVwidWkuaW5wdXROYW1lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy50ZXh0ID8/ICcnXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ1aS5wbGFjZWhvbGRlclRleHRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jb21ib2JveEFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgICAgICAgICAgYXJpYS1jb250cm9scz1cImNvbWJvYm94LWZpZWxkLWxpc3Rib3hcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJ1aS5tZXNzYWdlSWRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cygpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiAjbXVsdGlWYWx1ZVJlZiBjbGFzcz1cInNkYy1jb21ib2JveF9fbXVsdGktdmFsdWVcIj5cbiAgICAgICAgICAgICAgQGlmICghc2hvdWxkRGlzcGxheUNoaXBTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1saXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzZWxlY3RlZFN1bW1hcnlUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlbGVjdGVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJpdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGFiZWxcIiBbYXR0ci50aXRsZV09XCJpdGVtLnRleHRcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1yZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNoaXBSZW1vdmVBcmlhTGFiZWwoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRJdGVtKGl0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fc3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFN1bW1hcnlUZXh0IH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHVpLnBsYWNlaG9sZGVyVGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgI2NoaXBNZWFzdXJlUmVmXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1saXN0IHNkYy1jb21ib2JveF9fY2hpcC1saXN0LS1tZWFzdXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlbGVjdGVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cIml0ZW0uaWNvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGFiZWxcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtcmVtb3ZlLXBsYWNlaG9sZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2FjdGlvbnNcIj5cbiAgICAgICAgICBAaWYgKGhhc0NsZWFyQWN0aW9uKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faWNvbi1idXR0b24gc2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbi0tY2xlYXJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNsZWFyRmllbGRUZXh0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faWNvbi1idXR0b24gc2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbi0tdG9nZ2xlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmRyb3Bkb3duQXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxPcGVuXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Ub2dnbGVNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jYXJldC1kb3duIHNkYy1jb21ib2JveF9fY2FyZXRcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jYXJldC0tb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBzZGMtcG9wb3Zlci1jb250ZW50XG4gICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbFwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cInBhbmVsTWF4SGVpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2gtcm93XCI+XG4gICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWxlY3QtYWxsXCI+XG4gICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuc2VsZWN0QWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVBbGxGaWx0ZXJlZEl0ZW1zKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICAjcGFuZWxTZWFyY2hib3hSZWZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlYXJjaGJveFwiXG4gICAgICAgICAgICAgIFtpZGVudGl0eV09XCJ1aS5wYW5lbFNlYXJjaElkZW50aXR5XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVpLnBhbmVsU2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAgICAgW2RlYm91bmNlVGltZU1zXT1cIjBcIlxuICAgICAgICAgICAgICBbc3VibWl0T25FbnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtjbGVhck9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJ1aS5wYW5lbFNlYXJjaEFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgIFtpbnB1dFJvbGVdPVwibnVsbFwiXG4gICAgICAgICAgICAgIFtpbnB1dEF1dG9jb21wbGV0ZV09XCInb2ZmJ1wiXG4gICAgICAgICAgICAgIFtpbnB1dEFyaWFDb250cm9sc109XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbaW5wdXRBcmlhRGVzY3JpYmVkQnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hUZXJtQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvblNlYXJjaENsZWFyZWQoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1zZWFyY2hib3g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaXNPcHRpb25zTG9hZGluZykge1xuICAgICAgICAgIDxvdXRwdXQgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xvYWRpbmdcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtc3BpbiBzZGMtY29tYm9ib3hfX2xvYWRpbmctaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sb2FkaW5nLXRleHRcIj57eyB1aS5sb2FkaW5nSXRlbXNUZXh0IH19PC9zcGFuPlxuICAgICAgICAgIDwvb3V0cHV0PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93RW1wdHlTdGF0ZSkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19lbXB0eVwiXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5saW5lLXRleHRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInVpLmVtcHR5VGl0bGVUZXh0XCJcbiAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIEBpZiAodXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICNvcHRpb25zVmlld3BvcnRSZWZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnMgc2RjLWNvbWJvYm94X19vcHRpb25zLS12aXJ0dWFsaXplZFwiXG4gICAgICAgICAgICAgIChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKClcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBOT1NPTkFSOiBjdXN0b20gY29tYm9ib3ggcG9wdXAgaW50ZW50aW9uYWxseSB1c2VzIEFSSUEgbGlzdGJveCBzZW1hbnRpY3MgaW5zdGVhZCBvZiBhIG5hdGl2ZSBzZWxlY3QgLS0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9ucy1saXN0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aS5jb21ib2JveEFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZpcnR1YWwtc3BhY2VyXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgIHZpc2libGVPcHRpb24gb2YgdmlzaWJsZUZpbHRlcmVkSXRlbXM7XG4gICAgICAgICAgICAgICAgICB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUodmlzaWJsZU9wdGlvbi5pbmRleCwgdmlzaWJsZU9wdGlvbi5pdGVtKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNPcHRpb25BY3RpdmUodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWljb24tc2VsZWN0b3JdPVwiaWNvblNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1zZWxlY3RlZF09XCIhbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwidmlzaWJsZU9wdGlvbi5pbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uT3B0aW9uTW91c2VFbnRlcih2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25DaGVja2JveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2UodmlzaWJsZU9wdGlvbi5pdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodmlzaWJsZU9wdGlvbi5pdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ2aXNpYmxlT3B0aW9uLml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IHZpc2libGVPcHRpb24uaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KHZpc2libGVPcHRpb24uaXRlbSk7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJhZnRlclZpcnR1YWxTcGFjZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnNcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZShpbmRleCwgb3B0aW9uKTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWFjdGl2ZV09XCJpc09wdGlvbkFjdGl2ZShpbmRleClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1pY29uLXNlbGVjdG9yXT1cImljb25TZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLXNlbGVjdGVkXT1cIiFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25PcHRpb25Nb3VzZUVudGVyKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uQ2hlY2tib3hLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25PcHRpb25DaGVja2JveENoYW5nZShvcHRpb24sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICA8IS0tIHRoZSBjdXN0b20gbGlzdGJveCBrZWVwcyBvcHRpb24gc2VtYW50aWNzIG9uIHRoZSBmb2N1c2FibGUgYWN0aW9uIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJvcHRpb25JZChpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidvcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbikgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbktleWRvd24oJGV2ZW50LCBvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2xpY2sob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChvcHRpb24uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cIm9wdGlvbi5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLXRleHRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWxhYmVsXCI+e3sgb3B0aW9uLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KG9wdGlvbik7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLW1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb25NZXRhIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHNkYy1jb21ib2JveF9fb3B0aW9uLXNlbGVjdGVkLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1wb3BvdmVyPlxuXG4gICAgQGlmICh1aS5tZXNzYWdlVGV4dCkge1xuICAgICAgPHNtYWxsXG4gICAgICAgIFtpZF09XCJ1aS5tZXNzYWdlSWRcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXRJbnZhbGlkTWVzc2FnZUNsYXNzKClcIlxuICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICA+XG4gICAgICAgIHt7IHVpLm1lc3NhZ2VUZXh0IH19XG4gICAgICA8L3NtYWxsPlxuICAgIH1cbiAgPC9kaXY+XG4iXX0=
|