@onecx/angular-accelerator 5.23.5 → 5.24.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.
@@ -602,11 +602,11 @@ export class DataTableComponent extends DataSortBase {
602
602
  };
603
603
  }
604
604
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DataTableComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.Router }, { token: i0.Injector }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component }); }
605
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", allowSelectAll: "allowSelectAll", paginator: "paginator", page: "page", tableStyle: "tableStyle", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"(currentEqualFilterOptions$ | async) || []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i9.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.OcxTimeAgoPipe, name: "timeago" }] }); }
605
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", allowSelectAll: "allowSelectAll", paginator: "paginator", page: "page", tableStyle: "tableStyle", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n tableStyleClass=\"h-full\"\n >\n <ng-template pTemplate=\"header\">\n <tr style=\"vertical-align: top\">\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div\n class=\"table-header-wrapper flex flex-column justify-content-between align-items-start\"\n style=\"height: 100%\"\n >\n <span class=\"flex\" id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"flex icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton pl-0\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"(currentEqualFilterOptions$ | async) || []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i9.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.OcxTimeAgoPipe, name: "timeago" }] }); }
606
606
  }
607
607
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DataTableComponent, decorators: [{
608
608
  type: Component,
609
- args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"(currentEqualFilterOptions$ | async) || []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
609
+ args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [style]=\"tableStyle\"\n paginatorDropdownAppendTo=\"body\"\n tableStyleClass=\"h-full\"\n >\n <ng-template pTemplate=\"header\">\n <tr style=\"vertical-align: top\">\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div\n class=\"table-header-wrapper flex flex-column justify-content-between align-items-start\"\n style=\"height: 100%\"\n >\n <span class=\"flex\" id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"flex icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton pl-0\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && (!column.filterType || column.filterType === FilterType.EQUAL)\"\n [options]=\"(currentEqualFilterOptions$ | async) || []\"\n [ngModel]=\"(currentEqualSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable && column.filterType === FilterType.TRUTHY\"\n [options]=\"truthyFilterOptions\"\n [ngModel]=\"(currentTruthySelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onMultiselectFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value> {{value.key | translate}} </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
610
610
  }], ctorParameters: () => [{ type: undefined, decorators: [{
611
611
  type: Inject,
612
612
  args: [LOCALE_ID]
@@ -773,4 +773,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImpor
773
773
  }], parentTemplates: [{
774
774
  type: Input
775
775
  }] } });
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixFQUFFLEVBQ0YsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFBO0FBQ2IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBSTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFF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S0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQThCSCxTQUFTO3NCQURaLGVBQWU7dUJBQUMsYUFBYTtnQkFTMUIsYUFBYTtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhO2dCQVN2QixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSB9IGZyb20gJ0BvbmVjeC9hY2NlbGVyYXRvcidcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lVGVtcGxhdGUsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgb2YsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2NvbHVtbi10eXBlLm1vZGVsJ1xuaW1wb3J0IHsgRGF0YUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtYWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXNvcnQtZGlyZWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdHV0aWxzJ1xuaW1wb3J0IHsgRGF0YVNvcnRCYXNlIH0gZnJvbSAnLi4vZGF0YS1zb3J0LWJhc2UvZGF0YS1zb3J0LWJhc2UnXG5pbXBvcnQgeyBNdWx0aVNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0J1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZmlsdGVyLm1vZGVsJ1xuaW1wb3J0IHsgZmluZFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGVtcGxhdGUudXRpbHMnXG5cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBiaWdpbnQgfCBEYXRlXG5leHBvcnQgdHlwZSBSb3cgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFRlbXBsYXRlVHlwZSB7XG4gIENFTEwgPSAnQ0VMTCcsXG4gIEZJTFRFUkNFTEwgPSAnRklMVEVSQ0VMTCcsXG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZXNEYXRhIHtcbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PlxuICBpZFN1ZmZpeDogQXJyYXk8c3RyaW5nPlxuICB0ZW1wbGF0ZU5hbWVzOiBSZWNvcmQ8Q29sdW1uVHlwZSwgQXJyYXk8c3RyaW5nPj5cbn1cblxuZXhwb3J0IHR5cGUgU29ydCA9IHsgc29ydENvbHVtbjogc3RyaW5nOyBzb3J0RGlyZWN0aW9uOiBEYXRhU29ydERpcmVjdGlvbiB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUge1xuICBmaWx0ZXJzPzogRmlsdGVyW11cbiAgc29ydGluZz86IFNvcnRcbiAgc2VsZWN0ZWRSb3dzPzogUm93W11cbiAgYWN0aXZlUGFnZT86IG51bWJlclxuICBwYWdlU2l6ZT86IG51bWJlclxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICBGaWx0ZXJUeXBlID0gRmlsdGVyVHlwZVxuICBUZW1wbGF0ZVR5cGUgPSBUZW1wbGF0ZVR5cGVcbiAgY2hlY2tlZCA9IHRydWVcbiAgX3Jvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCByb3dzKHZhbHVlOiBSb3dbXSkge1xuICAgICF0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uSWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KHN0cmluZyB8IG51bWJlcilbXT4oW10pXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZFJvd3ModmFsdWU6IFJvd1tdIHwgc3RyaW5nW10gfCBudW1iZXJbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChcbiAgICAgIHZhbHVlLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm93ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiByb3cuaWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIF9maWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgZmlsdGVycygpOiBGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZmlsdGVycyh2YWx1ZTogRmlsdGVyW10pIHtcbiAgICAhdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKS5sZW5ndGggPz8gdGhpcy5yZXNldFBhZ2UoKVxuICAgIHRoaXMuX2ZpbHRlcnMkLm5leHQodmFsdWUpXG4gIH1cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydENvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIEBJbnB1dCgpXG4gIGdldCBzb3J0Q29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0Q29sdW1uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnRDb2x1bW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXM/Ll9zb3J0Q29sdW1uJC5uZXh0KHZhbHVlKVxuICB9XG4gIGNvbHVtblRlbXBsYXRlcyQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiB8IHVuZGVmaW5lZFxuICBfY29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbltdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGNvbHVtbnMoKTogRGF0YVRhYmxlQ29sdW1uW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGNvbHVtbnModmFsdWU6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fY29sdW1ucyQubmV4dCh2YWx1ZSlcbiAgICBjb25zdCBvYnMgPSB2YWx1ZS5tYXAoKGMpID0+IHRoaXMuZ2V0VGVtcGxhdGUoYywgVGVtcGxhdGVUeXBlLkNFTEwpKVxuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzJCA9IGNvbWJpbmVMYXRlc3Qob2JzKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZXMpID0+IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZS5tYXAoKGMsIGkpID0+IFtjLmlkLCB2YWx1ZXNbaV1dKSkpXG4gICAgKVxuICB9XG4gIEBJbnB1dCgpIGNsaWVudFNpZGVGaWx0ZXJpbmcgPSB0cnVlXG4gIEBJbnB1dCgpIGNsaWVudFNpZGVTb3J0aW5nID0gdHJ1ZVxuICBASW5wdXQoKSBzb3J0U3RhdGVzOiBEYXRhU29ydERpcmVjdGlvbltdID0gW0RhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORywgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElOR11cblxuICBkaXNwbGF5ZWRQYWdlU2l6ZXMkOiBPYnNlcnZhYmxlPChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPlxuICBfcGFnZVNpemVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10+KFsxMCwgMjUsIDUwXSlcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplcygpOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplcyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZXModmFsdWU6IChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdKSB7XG4gICAgdGhpcy5fcGFnZVNpemVzJC5uZXh0KHZhbHVlKVxuICB9XG4gIGRpc3BsYXllZFBhZ2VTaXplJDogT2JzZXJ2YWJsZTxudW1iZXI+XG4gIF9wYWdlU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemUkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2VTaXplJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgQElucHV0KCkgZW1wdHlSZXN1bHRzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIG5hbWUgPSAnJ1xuICBASW5wdXQoKSBkZWxldGVQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld1Blcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0UGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBzZWxlY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBhbGxvd1NlbGVjdEFsbCA9IHRydWVcbiAgQElucHV0KCkgcGFnaW5hdG9yID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdlID0gMFxuICBASW5wdXQoKSB0YWJsZVN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWRcbiAgQElucHV0KClcbiAgZ2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID8gTnVtYmVyKHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddKSA6IHVuZGVmaW5lZFxuICB9XG4gIHNldCB0b3RhbFJlY29yZHNPblNlcnZlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPSB2YWx1ZT8udG9TdHJpbmcoKSA/PyAnMCdcbiAgfVxuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lORydcbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lOR19XSVRIX1RPVEFMX09OX1NFUlZFUidcbiAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGN1cnJlbnRQYWdlOiAne2N1cnJlbnRQYWdlfScsXG4gICAgdG90YWxQYWdlczogJ3t0b3RhbFBhZ2VzfScsXG4gICAgcm93czogJ3tyb3dzfScsXG4gICAgZmlyc3Q6ICd7Zmlyc3R9JyxcbiAgICBsYXN0OiAne2xhc3R9JyxcbiAgICB0b3RhbFJlY29yZHM6ICd7dG90YWxSZWNvcmRzfScsXG4gIH1cblxuICBASW5wdXQoKSBzdHJpbmdDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nQ2VsbCcpIHN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfc3RyaW5nQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdDZWxsVGVtcGxhdGUgfHwgdGhpcy5zdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbnVtYmVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ251bWJlckNlbGwnKSBudW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX251bWJlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tQ2VsbCcpIGN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21DZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgZGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlQ2VsbCcpIGRhdGVDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdyZWxhdGl2ZURhdGVDZWxsJykgcmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9yZWxhdGl2ZURhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBjZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnY2VsbCcpIGNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsVGVtcGxhdGUgfHwgdGhpcy5jZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5Q2VsbCcpIHRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0ZpbHRlckNlbGwnKSBzdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0ZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBudW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyRmlsdGVyQ2VsbCcpIG51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtbiBmaWx0ZXJcbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkRmlsdGVyQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRGaWx0ZXJDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21GaWx0ZXJDZWxsJykgY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jdXN0b21GaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgZGF0ZUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlRmlsdGVyQ2VsbCcpIGRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCcpIHJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdmaWx0ZXJDZWxsJykgZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9maWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJykgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIF9hZGRpdGlvbmFsQWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFBY3Rpb25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBhZGRpdGlvbmFsQWN0aW9ucygpOiBEYXRhQWN0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBhZGRpdGlvbmFsQWN0aW9ucyh2YWx1ZTogRGF0YUFjdGlvbltdKSB7XG4gICAgdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZnJvemVuQWN0aW9uQ29sdW1uID0gZmFsc2VcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1uUG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAncmlnaHQnXG5cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJbXT4oKVxuICBAT3V0cHV0KCkgc29ydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpXG4gIEBPdXRwdXQoKSB2aWV3VGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgZWRpdFRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGRlbGV0ZVRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1tdPigpXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgY29tcG9uZW50U3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb21wb25lbnRTdGF0ZT4oKVxuXG4gIGRpc3BsYXllZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcbiAgc2VsZWN0ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG5cbiAgY3VycmVudEZpbHRlckNvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbiB8IG51bGw+KG51bGwpXG4gIGN1cnJlbnRFcXVhbEZpbHRlck9wdGlvbnMkOiBPYnNlcnZhYmxlPFNlbGVjdEl0ZW1bXT4gfCB1bmRlZmluZWRcbiAgY3VycmVudEVxdWFsU2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIHRydXRoeUZpbHRlck9wdGlvbnMgPSBbXG4gICAge1xuICAgICAga2V5OiAnT0NYX0RBVEFfVEFCTEUuRklMVEVSX1lFUycsXG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9OTycsXG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgfSxcbiAgXVxuICBjdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIGZpbHRlckFtb3VudHMkOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHwgdW5kZWZpbmVkXG5cbiAgb3ZlcmZsb3dBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIGlubGluZUFjdGlvbnMkOiBPYnNlcnZhYmxlPERhdGFBY3Rpb25bXT5cbiAgb3ZlcmZsb3dNZW51SXRlbXMkOiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+XG4gIGN1cnJlbnRNZW51Um93JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93IHwgbnVsbD4obnVsbClcblxuICB0ZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBAQ29udGVudENoaWxkcmVuKFByaW1lVGVtcGxhdGUpXG4gIHNldCB0ZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgdmlld1RlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBWaWV3Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHZpZXdUZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudmlld1RlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIHBhcmVudFRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgc2V0IHBhcmVudFRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgZ2V0IHZpZXdUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LnZpZXdJdGVtT2JzZXJ2ZWQgfHwgZHY/LnZpZXdJdGVtLm9ic2VydmVkIHx8IHRoaXMudmlld1RhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGVkaXRUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmVkaXRJdGVtT2JzZXJ2ZWQgfHwgZHY/LmVkaXRJdGVtLm9ic2VydmVkIHx8IHRoaXMuZWRpdFRhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZGVsZXRlSXRlbU9ic2VydmVkIHx8IGR2Py5kZWxldGVJdGVtLm9ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgYW55Um93QWN0aW9uT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlld1RhYmxlUm93T2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWRcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uc2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkIHx8IGR2Py5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkIHx8IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5vYnNlcnZlZFxuICB9XG5cbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiA9IHt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIHRyYW5zbGF0ZVNlcnZpY2UpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMucm91dGVyLnVybC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vLCAnXycpXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemVzJCwgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnT0NYX0RBVEFfVEFCTEUuQUxMJyldKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemVzLCB0cmFuc2xhdGlvbl0pID0+IHBhZ2VTaXplcy5jb25jYXQoeyBzaG93QWxsOiB0cmFuc2xhdGlvbiB9KSlcbiAgICApXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdlU2l6ZSQsIHRoaXMuX3BhZ2VTaXplcyRdKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemUsIHBhZ2VTaXplc10pID0+IHBhZ2VTaXplID8/IHBhZ2VTaXplcy5maW5kKCh2YWwpOiB2YWwgaXMgbnVtYmVyID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSA/PyA1MClcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd0FjdGlvbnMkID0gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMuaW5saW5lQWN0aW9ucyQgPSB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gIWFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMub3ZlcmZsb3dNZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5vdmVyZmxvd0FjdGlvbnMkLCB0aGlzLmN1cnJlbnRNZW51Um93JF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW2FjdGlvbnMsIHJvd10pID0+XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoWy4uLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKV0pLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhLnBlcm1pc3Npb24pKVxuICAgICAgICAgICAgICAubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleSB8fCAnJ10sXG4gICAgICAgICAgICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IChhLmNsYXNzZXMgfHwgW10pLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25WaXNpYmxlRmllbGQpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IGEuY2FsbGJhY2socm93KSxcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5fZmlsdGVycyQsIHRoaXMuX3NvcnRDb2x1bW4kLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW3Jvd3NdKSA9PiB0aGlzLmZsYXR0ZW5JdGVtcyhyb3dzKSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiYgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRSVVRIWVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsU2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiZcbiAgICAgICAgICAgICAgKCFjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgfHwgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLkVRVUFMKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsRmlsdGVyT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJCwgdGhpcy5fZmlsdGVycyRdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW18sIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIF9fXSkgPT5cbiAgICAgICAgICAhY3VycmVudEZpbHRlckNvbHVtbj8uZmlsdGVyVHlwZSB8fCBjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRVFVQUxcbiAgICAgICksXG4gICAgICBtZXJnZU1hcCgoW3Jvd3MsIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudEZpbHRlckNvbHVtbj8uaWQpIHtcbiAgICAgICAgICByZXR1cm4gb2YoW10pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IGZpbHRlcnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGZpbHRlcikgPT5cbiAgICAgICAgICAgICAgZmlsdGVyLmNvbHVtbklkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCAmJlxuICAgICAgICAgICAgICAoIWN1cnJlbnRGaWx0ZXJDb2x1bW4uZmlsdGVyVHlwZSB8fCBjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRVFVQUwpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tjdXJyZW50RmlsdGVyQ29sdW1uPy5pZF0pXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZU9ic2VydmFibGUgPVxuICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCk/LmNvbHVtblR5cGUgPT09IENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlQ29sdW1uVmFsdWVzKGNvbHVtblZhbHVlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogb2YoT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtblZhbHVlcy5tYXAoKGN2KSA9PiBbY3YsIGN2XSkpKVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRlZFZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJhbnNsYXRlZFZhbHVlcylcbiAgICAgICAgICAgICAgLmNvbmNhdChjdXJyZW50RmlsdGVycylcbiAgICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCAmJiB2YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChmaWx0ZXJPcHRpb24pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgfSkgYXMgU2VsZWN0SXRlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5maWx0ZXJBbW91bnRzJCA9IHRoaXMuX2ZpbHRlcnMkLnBpcGUoXG4gICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZClcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4gW2NvbHVtbklkLCBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5sZW5ndGhdKVxuICAgICAgKSxcbiAgICAgIG1hcCgoYW1vdW50cykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGFtb3VudHMpKVxuICAgIClcbiAgICB0aGlzLm1hcFNlbGVjdGlvblRvUm93cygpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIHRyYW5zbGF0ZUNvbHVtblZhbHVlcyhjb2x1bW5WYWx1ZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gY29sdW1uVmFsdWVzLmxlbmd0aCA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKSA6IG9mKHt9KVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJCksIGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFnZVNpemUsIHNlbGVjdGVkSWRzLCByb3dzXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgc29ydGluZzoge1xuICAgICAgICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0Q29sdW1uLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgYWN0aXZlUGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgIHNlbGVjdGVkUm93czogcm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMocm93LmlkKSksXG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC52YWx1ZT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdzdHJpbmdDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuY2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3RyaW5nRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmlsdGVyQ2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU29ydENvbHVtbkNsaWNrKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1NvcnREaXJlY3Rpb24gPSB0aGlzLmNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKHNvcnRDb2x1bW4pXG5cbiAgICB0aGlzLl9zb3J0Q29sdW1uJC5uZXh0KHNvcnRDb2x1bW4pXG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dChuZXdTb3J0RGlyZWN0aW9uKVxuXG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7IHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb24gfSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc29ydGluZzoge1xuICAgICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2hvc2VuKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJC5uZXh0KGNvbHVtbilcbiAgfVxuXG4gIG9uTXVsdGlzZWxlY3RGaWx0ZXJDaGFuZ2UoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCAhPT0gY29sdW1uLmlkKVxuICAgICAgLmNvbmNhdChcbiAgICAgICAgZXZlbnQudmFsdWUubWFwKCh2YWx1ZTogUHJpbWl0aXZlKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZmlsdGVyVHlwZTogY29sdW1uLmZpbHRlclR5cGUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnNcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZC5lbWl0KGZpbHRlcnMpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGZpbHRlcnMsXG4gICAgfSlcbiAgICB0aGlzLnJlc2V0UGFnZSgpXG4gIH1cblxuICBnZXRTZWxlY3RlZEZpbHRlcnMoY29sdW1uSWQ6IHN0cmluZyk6IHVua25vd25bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCkubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgfVxuXG4gIHNvcnRJY29uVGl0bGUoc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvblRvVGl0bGUoXG4gICAgICBzb3J0Q29sdW1uICE9PSB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICAgICAgPyBEYXRhU29ydERpcmVjdGlvbi5OT05FXG4gICAgICAgIDogdGhpcy5zb3J0U3RhdGVzW3RoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICAgIClcbiAgfVxuXG4gIHNvcnREaXJlY3Rpb25Ub1RpdGxlKHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChzb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFTQ0VORElOR19USVRMRSdcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFU0NFTkRJTkdfVElUTEUnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVGQVVMVF9USVRMRSdcbiAgICB9XG4gIH1cblxuICBtYXBTZWxlY3Rpb25Ub1Jvd3MoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy5fc2VsZWN0aW9uSWRzJCwgdGhpcy5fcm93cyRdKS5waXBlKFxuICAgICAgbWFwKChbc2VsZWN0ZWRSb3dJZHMsIHJvd3NdKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcy5tYXAoKHJvd0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvd3MuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogUm93W10pIHtcbiAgICBsZXQgbmV3U2VsZWN0aW9uSWRzID0gc2VsZWN0aW9uLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jvd3MkLmdldFZhbHVlKClcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkge1xuICAgICAgY29uc3QgZGlzYWJsZWRSb3dJZHMgPSByb3dzLmZpbHRlcigocikgPT4gIXRoaXMuZmllbGRJc1RydXRoeShyLCB0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkpLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgICBpZiAoZGlzYWJsZWRSb3dJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZWxlY3Rpb25JZHMgPSB0aGlzLm1lcmdlV2l0aERpc2FibGVkS2V5cyhuZXdTZWxlY3Rpb25JZHMsIGRpc2FibGVkUm93SWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChuZXdTZWxlY3Rpb25JZHMpXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5fcm93cyQuZ2V0VmFsdWUoKS5maWx0ZXIoKHJvdykgPT4gbmV3U2VsZWN0aW9uSWRzLmluY2x1ZGVzKHJvdy5pZCkpKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBtZXJnZVdpdGhEaXNhYmxlZEtleXMobmV3U2VsZWN0aW9uSWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkaXNhYmxlZFJvd0lkczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uSWRzID0gdGhpcy5fc2VsZWN0aW9uSWRzJC5nZXRWYWx1ZSgpXG4gICAgY29uc3QgcHJldmlvdXNseVNlbGVjdGVkQW5kRGlzYWJsZWQgPSBwcmV2aW91c1NlbGVjdGlvbklkcy5maWx0ZXIoKGlkKSA9PiBkaXNhYmxlZFJvd0lkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgZGlzYWJsZWRBbmRQcmV2aW91c2x5RGVzZWxlY3RlZCA9IGRpc2FibGVkUm93SWRzLmZpbHRlcigoaWQpID0+ICFwcmV2aW91c1NlbGVjdGlvbklkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgdXBkYXRlZFNlbGVjdGlvbiA9IFsuLi5uZXdTZWxlY3Rpb25JZHNdXG5cbiAgICBwcmV2aW91c2x5U2VsZWN0ZWRBbmREaXNhYmxlZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF1cGRhdGVkU2VsZWN0aW9uLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICB1cGRhdGVkU2VsZWN0aW9uLnB1c2goaWQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRpc2FibGVkQW5kUHJldmlvdXNseURlc2VsZWN0ZWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdXBkYXRlZFNlbGVjdGlvbi5pbmRleE9mKGlkKVxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdXBkYXRlZFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB1cGRhdGVkU2VsZWN0aW9uXG4gIH1cblxuICBpc1NlbGVjdGVkKHJvdzogUm93KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbklkcyQuZ2V0VmFsdWUoKS5pbmNsdWRlcyhyb3cuaWQpXG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5maXJzdCAvIGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2UgPSBwYWdlXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZSlcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlZC5lbWl0KGV2ZW50LnJvd3MpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGFjdGl2ZVBhZ2U6IHBhZ2UsXG4gICAgICBwYWdlU2l6ZTogZXZlbnQucm93cyxcbiAgICB9KVxuICB9XG5cbiAgcmVzZXRQYWdlKCkge1xuICAgIHRoaXMucGFnZSA9IDBcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5wYWdlKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBmaWVsZElzVHJ1dGh5KG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiAhIU9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICB0b2dnbGVPdmVyZmxvd01lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIG1lbnU6IE1lbnUsIHJvdzogUm93KSB7XG4gICAgdGhpcy5jdXJyZW50TWVudVJvdyQubmV4dChyb3cpXG4gICAgbWVudS50b2dnbGUoZXZlbnQpXG4gIH1cblxuICBoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+XG4gICAgICAgIGFjdGlvbnMuc29tZShcbiAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICFhLmFjdGlvblZpc2libGVGaWVsZCB8fFxuICAgICAgICAgICAgKHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSAmJiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGlzRGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICByZXR1cm4gaXNWYWxpZERhdGUoZClcbiAgfVxuXG4gIGNlbGxUZW1wbGF0ZXNEYXRhOiBUZW1wbGF0ZXNEYXRhID0ge1xuICAgIHRlbXBsYXRlc09ic2VydmFibGVzOiB7fSxcbiAgICBpZFN1ZmZpeDogWydJZFRhYmxlQ2VsbCcsICdJZENlbGwnXSxcbiAgICB0ZW1wbGF0ZU5hbWVzOiB7XG4gICAgICBbQ29sdW1uVHlwZS5EQVRFXTogWydkYXRlQ2VsbCcsICdkYXRlVGFibGVDZWxsJywgJ2RlZmF1bHREYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuTlVNQkVSXTogWydudW1iZXJDZWxsJywgJ251bWJlclRhYmxlQ2VsbCcsICdkZWZhdWx0TnVtYmVyQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuUkVMQVRJVkVfREFURV06IFsncmVsYXRpdmVEYXRlQ2VsbCcsICdyZWxhdGl2ZURhdGVUYWJsZUNlbGwnLCAnZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWV06IFsndHJhbnNsYXRpb25LZXlDZWxsJywgJ3RyYW5zbGF0aW9uS2V5VGFibGVDZWxsJywgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLkNVU1RPTV06IFsnY3VzdG9tQ2VsbCcsICdjdXN0b21UYWJsZUNlbGwnLCAnZGVmYXVsdEN1c3RvbUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlNUUklOR106IFsnc3RyaW5nQ2VsbCcsICdzdHJpbmdUYWJsZUNlbGwnLCAnZGVmYXVsdFN0cmluZ0NlbGwnXSxcbiAgICB9LFxuICB9XG5cbiAgZmlsdGVyVGVtcGxhdGVzRGF0YTogVGVtcGxhdGVzRGF0YSA9IHtcbiAgICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczoge30sXG4gICAgaWRTdWZmaXg6IFsnSWRUYWJsZUZpbHRlckNlbGwnLCAnSWRGaWx0ZXJDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUZpbHRlckNlbGwnLCAnZGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0RGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLk5VTUJFUl06IFsnbnVtYmVyRmlsdGVyQ2VsbCcsICdudW1iZXJUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdE51bWJlckNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnLCAncmVsYXRpdmVEYXRlVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHRSZWxhdGl2ZURhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVldOiBbXG4gICAgICAgICd0cmFuc2xhdGlvbktleUZpbHRlckNlbGwnLFxuICAgICAgICAndHJhbnNsYXRpb25LZXlUYWJsZUZpbHRlckNlbGwnLFxuICAgICAgICAnZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbCcsXG4gICAgICBdLFxuICAgICAgW0NvbHVtblR5cGUuQ1VTVE9NXTogWydjdXN0b21GaWx0ZXJDZWxsJywgJ2N1c3RvbVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0Q3VzdG9tQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogWydzdHJpbmdGaWx0ZXJDZWxsJywgJ3N0cmluZ1RhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0U3RyaW5nQ2VsbCddLFxuICAgIH0sXG4gIH1cblxuICB0ZW1wbGF0ZXNEYXRhTWFwOiBSZWNvcmQ8VGVtcGxhdGVUeXBlLCBUZW1wbGF0ZXNEYXRhPiA9IHtcbiAgICBbVGVtcGxhdGVUeXBlLkNFTExdOiB0aGlzLmNlbGxUZW1wbGF0ZXNEYXRhLFxuICAgIFtUZW1wbGF0ZVR5cGUuRklMVEVSQ0VMTF06IHRoaXMuZmlsdGVyVGVtcGxhdGVzRGF0YSxcbiAgfVxuXG4gIGdldENvbHVtblR5cGVUZW1wbGF0ZSh0ZW1wbGF0ZXM6IFByaW1lVGVtcGxhdGVbXSwgY29sdW1uVHlwZTogQ29sdW1uVHlwZSwgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUpIHtcbiAgICBsZXQgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICAgIHN3aXRjaCAodGVtcGxhdGVUeXBlKSB7XG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5DRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgVGVtcGxhdGVUeXBlLkZJTFRFUkNFTEw6XG4gICAgICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9kYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuTlVNQkVSOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9udW1iZXJGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVk6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9jdXN0b21GaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3N0cmluZ0ZpbHRlckNlbGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0ZW1wbGF0ZSA/P1xuICAgICAgZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV0udGVtcGxhdGVOYW1lc1tjb2x1bW5UeXBlXSk/LnRlbXBsYXRlID8/XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZ2V0VGVtcGxhdGUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlc0RhdGEgPSB0aGlzLnRlbXBsYXRlc0RhdGFNYXBbdGVtcGxhdGVUeXBlXVxuXG4gICAgaWYgKCF0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0pIHtcbiAgICAgIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLnRlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMudmlld1RlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJCxcbiAgICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3QsIHZ0LCBwdF0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbLi4uKHQgPz8gW10pLCAuLi4odnQgPz8gW10pLCAuLi4ocHQgPz8gW10pXVxuICAgICAgICAgIGNvbnN0IGNvbHVtblRlbXBsYXRlID0gZmluZFRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVzLFxuICAgICAgICAgICAgdGVtcGxhdGVzRGF0YS5pZFN1ZmZpeC5tYXAoKHN1ZmZpeCkgPT4gY29sdW1uLmlkICsgc3VmZml4KVxuICAgICAgICAgICk/LnRlbXBsYXRlXG4gICAgICAgICAgaWYgKGNvbHVtblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uVGVtcGxhdGVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVHlwZVRlbXBsYXRlKHRlbXBsYXRlcywgY29sdW1uLmNvbHVtblR5cGUsIHRlbXBsYXRlVHlwZSlcbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlVGltZSg1MClcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXVxuICB9XG5cbiAgcmVzb2x2ZUZpZWxkRGF0YShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIGdldFJvd09iamVjdEZyb21NdWx0aXNlbGVjdEl0ZW0odmFsdWU6IE11bHRpU2VsZWN0SXRlbSwgY29sdW1uOiBEYXRhVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW2NvbHVtbi5pZF06IHZhbHVlLmxhYmVsLFxuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW4gbGV0LXJvd09iamVjdD1cImxvY2FsUm93T2JqZWN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGRcbiAgICAgIGNsYXNzPVwiYWN0aW9uc1wiXG4gICAgICBwRnJvemVuQ29sdW1uXG4gICAgICBbZnJvemVuXT1cImZyb3plbkFjdGlvbkNvbHVtblwiXG4gICAgICBbYWxpZ25Gcm96ZW5dPVwiYWN0aW9uQ29sdW1uUG9zaXRpb25cIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4tbGVmdCcgOiAnYWN0aW9uLWNvbHVtbi1yaWdodCdcIlxuICAgICAgW25nQ2xhc3NdPVwiKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnKSA/ICdib3JkZXItcmlnaHQtMScgOiAoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdib3JkZXItbGVmdC0xJyA6ICcnXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1idXR0b24tcm93LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwidmlld1RhYmxlUm93T2JzZXJ2ZWQgJiYgKCF2aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cInZpZXdQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXZpZXdBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCB2aWV3VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5WSUVXJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlld1Jvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImVkaXRUYWJsZVJvd09ic2VydmVkICYmICghZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJlZGl0UGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFlZGl0QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgZWRpdFRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuRURJVCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJkZWxldGVUYWJsZVJvd09ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZGVsZXRlUGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFkZWxldGVBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBkZWxldGVUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiYWN0aW9uLnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uY2FsbGJhY2socm93T2JqZWN0KVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93T2JqZWN0KSB8IGFzeW5jXCI+XG4gICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiKG92ZXJmbG93TWVudUl0ZW1zJCB8IGFzeW5jKSB8fCBbXVwiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ3BpIHBpLWVsbGlwc2lzLXYnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPdmVyZmxvd01lbnUoJGV2ZW50LCBtZW51LCByb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbkNvbHVtbkhlYWRlcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwICB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGhcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4taGVhZGVyLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4taGVhZGVyLXJpZ2h0J1wiXG4gICAgPlxuICAgICAge3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlNfQ09MVU1OX05BTUUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiKGRpc3BsYXllZFBhZ2VTaXplJCB8IGFzeW5jKSBhcyBkaXNwbGF5ZWRQYWdlU2l6ZVwiPlxuICA8cC10YWJsZVxuICAgICpuZ0lmPVwiKGNvbHVtblRlbXBsYXRlcyQgfCBhc3luYykgPz8ge30gYXMgY29sdW1uVGVtcGxhdGVzXCJcbiAgICBbdmFsdWVdPVwiKGRpc3BsYXllZFJvd3MkIHwgYXN5bmMpID8/IFtdXCJcbiAgICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXG4gICAgW2ZpcnN0XT1cInBhZ2UgKiBkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gICAgKG9uUGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW3Jvd3NdPVwiZGlzcGxheWVkUGFnZVNpemVcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICh0b3RhbFJlY29yZHNPblNlcnZlciA/IGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5IDogY3VycmVudFBhZ2VTaG93aW5nS2V5KSB8IHRyYW5zbGF0ZTpwYXJhbXMgfX1cIlxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiKGRpc3BsYXllZFBhZ2VTaXplcyQgfCBhc3luYykgPz8gW11cIlxuICAgIGlkPVwiZGF0YVRhYmxlX3t7bmFtZX19XCJcbiAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgIFtzZWxlY3Rpb25dPVwiKHNlbGVjdGVkUm93cyQgfCBhc3luYykgPz8gW11cIlxuICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgIFtzdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0cmVtXCIgc2NvcGU9XCJjb2xcIiAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3hcbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dTZWxlY3RBbGxcIlxuICAgICAgICAgICAgYXJpYUxhYmVsPVwie3snT0NYX0RBVEFfVEFCTEUuU0VMRUNUX0FMTF9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICA+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlOyBlbHNlIHNpbXBsZUhlYWRlclwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJ7e2NvbHVtbi5pZH19LWhlYWRlci1uYW1lXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1idXR0b24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHNvcnRCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYWx0XT1cIihjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdOT05FJykgfHwgY29sdW1uPy5pZCAhPT0gc29ydENvbHVtblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtdXBdPVwiY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnQVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtZG93bl09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdERVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Tb3J0Q29sdW1uQ2xpY2soY29sdW1uLmlkKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKHNvcnRJY29uVGl0bGUoY29sdW1uLmlkKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiAoY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUpLCBkaXJlY3Rpb246IChzb3J0RGlyZWN0aW9uVG9UaXRsZShjb2x1bW5OZXh0U29ydERpcmVjdGlvbihjb2x1bW4uaWQpKSB8IHRyYW5zbGF0ZSl9KVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlck11bHRpU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGUgJiYgKCFjb2x1bW4uZmlsdGVyVHlwZSB8fCBjb2x1bW4uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5FUVVBTClcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiKGN1cnJlbnRFcXVhbEZpbHRlck9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihjdXJyZW50RXF1YWxTZWxlY3RlZEZpbHRlcnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkVNUFRZX0ZJTFRFUl9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RGaWx0ZXJDaGFuZ2UoY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSWNvblwiXG4gICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwib25GaWx0ZXJDaG9zZW4oY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQ09MVU1OX0ZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXJpYUZpbHRlckxhYmVsXT1cIignT0NYX0RBVEFfVEFCTEUuRklMVEVSX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGV9KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyXT1cIiEoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyLWZpbGxdPVwiKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXSA+IDBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtblRlbXBsYXRlc1tjb2x1bW4uaWRdIGFzIHRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICByb3dPYmplY3Q6IGdldFJvd09iamVjdEZyb21NdWx0aXNlbGVjdEl0ZW0odmFsdWUsIGNvbHVtbiksXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyTXVsdGlTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5UUlVUSFlcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidHJ1dGh5RmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoY3VycmVudFRydXRoeVNlbGVjdGVkRmlsdGVycyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuRU1QVFlfRklMVEVSX01FU1NBR0UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25NdWx0aXNlbGVjdEZpbHRlckNoYW5nZShjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJJY29uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJvbkZpbHRlckNob3Nlbihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuRklMVEVSX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5DT0xVTU5fRklMVEVSX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthcmlhRmlsdGVyTGFiZWxdPVwiKCdPQ1hfREFUQV9UQUJMRS5GSUxURVJfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZX0pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtc1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1maWx0ZXJdPVwiISgoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1maWx0ZXItZmlsbF09XCIoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdID4gMFwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC12YWx1ZT4ge3t2YWx1ZS5rZXkgfCB0cmFuc2xhdGV9fSA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbXBsZUhlYWRlcj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93T2JqZWN0PlxuICAgICAgPHRyPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgKm5nSWY9XCIoISFzZWxlY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBzZWxlY3Rpb25FbmFibGVkRmllbGQpKSAmJiBpc1NlbGVjdGVkKHJvd09iamVjdCk7IGVsc2UgZGVmYXVsdENoZWNrYm94XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hlY2tlZFwiXG4gICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuU0VMRUNUX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGtleTogcm93T2JqZWN0LmlkfVwiXG4gICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDaGVja2JveD5cbiAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvd09iamVjdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsga2V5OiByb3dPYmplY3QuaWR9XCJcbiAgICAgICAgICAgID48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgICAgX2NlbGwgPyBfY2VsbDogY29sdW1uVGVtcGxhdGVzW2NvbHVtbi5pZF1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPHRyPlxuICAgICAgICA8dGQgW2NvbFNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoKGFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCkgPyAxIDogMClcIj5cbiAgICAgICAgICB7eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX1RBQkxFLkVNUFRZX1JFU1VMVFwiIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRTdHJpbmdDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCl9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0TnVtYmVyQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgbnVtYmVyIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRDdXN0b21DZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj4gPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHREYXRlQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgZGF0ZTogY29sdW1uLmRhdGVGb3JtYXQgPz8gJ21lZGl1bScgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPlxuICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5FRElURUQnIHwgdHJhbnNsYXRlIH19IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdGltZWFnbyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
776
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixFQUFFLEVBQ0YsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFBO0FBQ2IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBSTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFF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S0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQThCSCxTQUFTO3NCQURaLGVBQWU7dUJBQUMsYUFBYTtnQkFTMUIsYUFBYTtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhO2dCQVN2QixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSB9IGZyb20gJ0BvbmVjeC9hY2NlbGVyYXRvcidcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lVGVtcGxhdGUsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgb2YsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2NvbHVtbi10eXBlLm1vZGVsJ1xuaW1wb3J0IHsgRGF0YUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtYWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXNvcnQtZGlyZWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdHV0aWxzJ1xuaW1wb3J0IHsgRGF0YVNvcnRCYXNlIH0gZnJvbSAnLi4vZGF0YS1zb3J0LWJhc2UvZGF0YS1zb3J0LWJhc2UnXG5pbXBvcnQgeyBNdWx0aVNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0J1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZmlsdGVyLm1vZGVsJ1xuaW1wb3J0IHsgZmluZFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGVtcGxhdGUudXRpbHMnXG5cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBiaWdpbnQgfCBEYXRlXG5leHBvcnQgdHlwZSBSb3cgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFRlbXBsYXRlVHlwZSB7XG4gIENFTEwgPSAnQ0VMTCcsXG4gIEZJTFRFUkNFTEwgPSAnRklMVEVSQ0VMTCcsXG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZXNEYXRhIHtcbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PlxuICBpZFN1ZmZpeDogQXJyYXk8c3RyaW5nPlxuICB0ZW1wbGF0ZU5hbWVzOiBSZWNvcmQ8Q29sdW1uVHlwZSwgQXJyYXk8c3RyaW5nPj5cbn1cblxuZXhwb3J0IHR5cGUgU29ydCA9IHsgc29ydENvbHVtbjogc3RyaW5nOyBzb3J0RGlyZWN0aW9uOiBEYXRhU29ydERpcmVjdGlvbiB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUge1xuICBmaWx0ZXJzPzogRmlsdGVyW11cbiAgc29ydGluZz86IFNvcnRcbiAgc2VsZWN0ZWRSb3dzPzogUm93W11cbiAgYWN0aXZlUGFnZT86IG51bWJlclxuICBwYWdlU2l6ZT86IG51bWJlclxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICBGaWx0ZXJUeXBlID0gRmlsdGVyVHlwZVxuICBUZW1wbGF0ZVR5cGUgPSBUZW1wbGF0ZVR5cGVcbiAgY2hlY2tlZCA9IHRydWVcbiAgX3Jvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCByb3dzKHZhbHVlOiBSb3dbXSkge1xuICAgICF0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uSWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KHN0cmluZyB8IG51bWJlcilbXT4oW10pXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZFJvd3ModmFsdWU6IFJvd1tdIHwgc3RyaW5nW10gfCBudW1iZXJbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChcbiAgICAgIHZhbHVlLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm93ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiByb3cuaWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIF9maWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgZmlsdGVycygpOiBGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZmlsdGVycyh2YWx1ZTogRmlsdGVyW10pIHtcbiAgICAhdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKS5sZW5ndGggPz8gdGhpcy5yZXNldFBhZ2UoKVxuICAgIHRoaXMuX2ZpbHRlcnMkLm5leHQodmFsdWUpXG4gIH1cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydENvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIEBJbnB1dCgpXG4gIGdldCBzb3J0Q29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0Q29sdW1uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnRDb2x1bW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXM/Ll9zb3J0Q29sdW1uJC5uZXh0KHZhbHVlKVxuICB9XG4gIGNvbHVtblRlbXBsYXRlcyQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiB8IHVuZGVmaW5lZFxuICBfY29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbltdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGNvbHVtbnMoKTogRGF0YVRhYmxlQ29sdW1uW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGNvbHVtbnModmFsdWU6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fY29sdW1ucyQubmV4dCh2YWx1ZSlcbiAgICBjb25zdCBvYnMgPSB2YWx1ZS5tYXAoKGMpID0+IHRoaXMuZ2V0VGVtcGxhdGUoYywgVGVtcGxhdGVUeXBlLkNFTEwpKVxuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzJCA9IGNvbWJpbmVMYXRlc3Qob2JzKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZXMpID0+IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZS5tYXAoKGMsIGkpID0+IFtjLmlkLCB2YWx1ZXNbaV1dKSkpXG4gICAgKVxuICB9XG4gIEBJbnB1dCgpIGNsaWVudFNpZGVGaWx0ZXJpbmcgPSB0cnVlXG4gIEBJbnB1dCgpIGNsaWVudFNpZGVTb3J0aW5nID0gdHJ1ZVxuICBASW5wdXQoKSBzb3J0U3RhdGVzOiBEYXRhU29ydERpcmVjdGlvbltdID0gW0RhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORywgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElOR11cblxuICBkaXNwbGF5ZWRQYWdlU2l6ZXMkOiBPYnNlcnZhYmxlPChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPlxuICBfcGFnZVNpemVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10+KFsxMCwgMjUsIDUwXSlcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplcygpOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplcyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZXModmFsdWU6IChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdKSB7XG4gICAgdGhpcy5fcGFnZVNpemVzJC5uZXh0KHZhbHVlKVxuICB9XG4gIGRpc3BsYXllZFBhZ2VTaXplJDogT2JzZXJ2YWJsZTxudW1iZXI+XG4gIF9wYWdlU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemUkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2VTaXplJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgQElucHV0KCkgZW1wdHlSZXN1bHRzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIG5hbWUgPSAnJ1xuICBASW5wdXQoKSBkZWxldGVQZXJtaXNzaW9uOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3UGVybWlzc2lvbjogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBzZWxlY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBhbGxvd1NlbGVjdEFsbCA9IHRydWVcbiAgQElucHV0KCkgcGFnaW5hdG9yID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdlID0gMFxuICBASW5wdXQoKSB0YWJsZVN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWRcbiAgQElucHV0KClcbiAgZ2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID8gTnVtYmVyKHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddKSA6IHVuZGVmaW5lZFxuICB9XG4gIHNldCB0b3RhbFJlY29yZHNPblNlcnZlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPSB2YWx1ZT8udG9TdHJpbmcoKSA/PyAnMCdcbiAgfVxuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lORydcbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lOR19XSVRIX1RPVEFMX09OX1NFUlZFUidcbiAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGN1cnJlbnRQYWdlOiAne2N1cnJlbnRQYWdlfScsXG4gICAgdG90YWxQYWdlczogJ3t0b3RhbFBhZ2VzfScsXG4gICAgcm93czogJ3tyb3dzfScsXG4gICAgZmlyc3Q6ICd7Zmlyc3R9JyxcbiAgICBsYXN0OiAne2xhc3R9JyxcbiAgICB0b3RhbFJlY29yZHM6ICd7dG90YWxSZWNvcmRzfScsXG4gIH1cblxuICBASW5wdXQoKSBzdHJpbmdDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nQ2VsbCcpIHN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfc3RyaW5nQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdDZWxsVGVtcGxhdGUgfHwgdGhpcy5zdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbnVtYmVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ251bWJlckNlbGwnKSBudW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX251bWJlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tQ2VsbCcpIGN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21DZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgZGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlQ2VsbCcpIGRhdGVDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdyZWxhdGl2ZURhdGVDZWxsJykgcmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9yZWxhdGl2ZURhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBjZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnY2VsbCcpIGNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsVGVtcGxhdGUgfHwgdGhpcy5jZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5Q2VsbCcpIHRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0ZpbHRlckNlbGwnKSBzdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0ZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBudW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyRmlsdGVyQ2VsbCcpIG51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtbiBmaWx0ZXJcbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkRmlsdGVyQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRGaWx0ZXJDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21GaWx0ZXJDZWxsJykgY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jdXN0b21GaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgZGF0ZUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlRmlsdGVyQ2VsbCcpIGRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCcpIHJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdmaWx0ZXJDZWxsJykgZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9maWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJykgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIF9hZGRpdGlvbmFsQWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFBY3Rpb25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBhZGRpdGlvbmFsQWN0aW9ucygpOiBEYXRhQWN0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBhZGRpdGlvbmFsQWN0aW9ucyh2YWx1ZTogRGF0YUFjdGlvbltdKSB7XG4gICAgdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZnJvemVuQWN0aW9uQ29sdW1uID0gZmFsc2VcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1uUG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAncmlnaHQnXG5cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJbXT4oKVxuICBAT3V0cHV0KCkgc29ydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpXG4gIEBPdXRwdXQoKSB2aWV3VGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgZWRpdFRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGRlbGV0ZVRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1tdPigpXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgY29tcG9uZW50U3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb21wb25lbnRTdGF0ZT4oKVxuXG4gIGRpc3BsYXllZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcbiAgc2VsZWN0ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG5cbiAgY3VycmVudEZpbHRlckNvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbiB8IG51bGw+KG51bGwpXG4gIGN1cnJlbnRFcXVhbEZpbHRlck9wdGlvbnMkOiBPYnNlcnZhYmxlPFNlbGVjdEl0ZW1bXT4gfCB1bmRlZmluZWRcbiAgY3VycmVudEVxdWFsU2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIHRydXRoeUZpbHRlck9wdGlvbnMgPSBbXG4gICAge1xuICAgICAga2V5OiAnT0NYX0RBVEFfVEFCTEUuRklMVEVSX1lFUycsXG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9OTycsXG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgfSxcbiAgXVxuICBjdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIGZpbHRlckFtb3VudHMkOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHwgdW5kZWZpbmVkXG5cbiAgb3ZlcmZsb3dBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIGlubGluZUFjdGlvbnMkOiBPYnNlcnZhYmxlPERhdGFBY3Rpb25bXT5cbiAgb3ZlcmZsb3dNZW51SXRlbXMkOiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+XG4gIGN1cnJlbnRNZW51Um93JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93IHwgbnVsbD4obnVsbClcblxuICB0ZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBAQ29udGVudENoaWxkcmVuKFByaW1lVGVtcGxhdGUpXG4gIHNldCB0ZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgdmlld1RlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBWaWV3Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHZpZXdUZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudmlld1RlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIHBhcmVudFRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgc2V0IHBhcmVudFRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgZ2V0IHZpZXdUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LnZpZXdJdGVtT2JzZXJ2ZWQgfHwgZHY/LnZpZXdJdGVtLm9ic2VydmVkIHx8IHRoaXMudmlld1RhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGVkaXRUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmVkaXRJdGVtT2JzZXJ2ZWQgfHwgZHY/LmVkaXRJdGVtLm9ic2VydmVkIHx8IHRoaXMuZWRpdFRhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZGVsZXRlSXRlbU9ic2VydmVkIHx8IGR2Py5kZWxldGVJdGVtLm9ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgYW55Um93QWN0aW9uT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlld1RhYmxlUm93T2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWRcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uc2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkIHx8IGR2Py5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkIHx8IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5vYnNlcnZlZFxuICB9XG5cbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiA9IHt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIHRyYW5zbGF0ZVNlcnZpY2UpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMucm91dGVyLnVybC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vLCAnXycpXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemVzJCwgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnT0NYX0RBVEFfVEFCTEUuQUxMJyldKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemVzLCB0cmFuc2xhdGlvbl0pID0+IHBhZ2VTaXplcy5jb25jYXQoeyBzaG93QWxsOiB0cmFuc2xhdGlvbiB9KSlcbiAgICApXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdlU2l6ZSQsIHRoaXMuX3BhZ2VTaXplcyRdKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemUsIHBhZ2VTaXplc10pID0+IHBhZ2VTaXplID8/IHBhZ2VTaXplcy5maW5kKCh2YWwpOiB2YWwgaXMgbnVtYmVyID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSA/PyA1MClcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd0FjdGlvbnMkID0gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMuaW5saW5lQWN0aW9ucyQgPSB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gIWFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMub3ZlcmZsb3dNZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5vdmVyZmxvd0FjdGlvbnMkLCB0aGlzLmN1cnJlbnRNZW51Um93JF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW2FjdGlvbnMsIHJvd10pID0+XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoWy4uLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKV0pLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhLnBlcm1pc3Npb24pKVxuICAgICAgICAgICAgICAubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleSB8fCAnJ10sXG4gICAgICAgICAgICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IChhLmNsYXNzZXMgfHwgW10pLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25WaXNpYmxlRmllbGQpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IGEuY2FsbGJhY2socm93KSxcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5fZmlsdGVycyQsIHRoaXMuX3NvcnRDb2x1bW4kLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW3Jvd3NdKSA9PiB0aGlzLmZsYXR0ZW5JdGVtcyhyb3dzKSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50VHJ1dGh5U2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiYgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRSVVRIWVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsU2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChmaWx0ZXIpID0+XG4gICAgICAgICAgICAgIGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQgJiZcbiAgICAgICAgICAgICAgKCFjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgfHwgY3VycmVudEZpbHRlckNvbHVtbi5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLkVRVUFMKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEVxdWFsRmlsdGVyT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJCwgdGhpcy5fZmlsdGVycyRdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW18sIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIF9fXSkgPT5cbiAgICAgICAgICAhY3VycmVudEZpbHRlckNvbHVtbj8uZmlsdGVyVHlwZSB8fCBjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRVFVQUxcbiAgICAgICksXG4gICAgICBtZXJnZU1hcCgoW3Jvd3MsIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudEZpbHRlckNvbHVtbj8uaWQpIHtcbiAgICAgICAgICByZXR1cm4gb2YoW10pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IGZpbHRlcnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGZpbHRlcikgPT5cbiAgICAgICAgICAgICAgZmlsdGVyLmNvbHVtbklkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCAmJlxuICAgICAgICAgICAgICAoIWN1cnJlbnRGaWx0ZXJDb2x1bW4uZmlsdGVyVHlwZSB8fCBjdXJyZW50RmlsdGVyQ29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRVFVQUwpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tjdXJyZW50RmlsdGVyQ29sdW1uPy5pZF0pXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZU9ic2VydmFibGUgPVxuICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCk/LmNvbHVtblR5cGUgPT09IENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlQ29sdW1uVmFsdWVzKGNvbHVtblZhbHVlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogb2YoT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtblZhbHVlcy5tYXAoKGN2KSA9PiBbY3YsIGN2XSkpKVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRlZFZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJhbnNsYXRlZFZhbHVlcylcbiAgICAgICAgICAgICAgLmNvbmNhdChjdXJyZW50RmlsdGVycylcbiAgICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCAmJiB2YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChmaWx0ZXJPcHRpb24pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgfSkgYXMgU2VsZWN0SXRlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5maWx0ZXJBbW91bnRzJCA9IHRoaXMuX2ZpbHRlcnMkLnBpcGUoXG4gICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZClcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4gW2NvbHVtbklkLCBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5sZW5ndGhdKVxuICAgICAgKSxcbiAgICAgIG1hcCgoYW1vdW50cykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGFtb3VudHMpKVxuICAgIClcbiAgICB0aGlzLm1hcFNlbGVjdGlvblRvUm93cygpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIHRyYW5zbGF0ZUNvbHVtblZhbHVlcyhjb2x1bW5WYWx1ZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gY29sdW1uVmFsdWVzLmxlbmd0aCA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKSA6IG9mKHt9KVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJCksIGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFnZVNpemUsIHNlbGVjdGVkSWRzLCByb3dzXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgc29ydGluZzoge1xuICAgICAgICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0Q29sdW1uLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgYWN0aXZlUGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgIHNlbGVjdGVkUm93czogcm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMocm93LmlkKSksXG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC52YWx1ZT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdzdHJpbmdDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuY2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3RyaW5nRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmlsdGVyQ2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU29ydENvbHVtbkNsaWNrKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1NvcnREaXJlY3Rpb24gPSB0aGlzLmNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKHNvcnRDb2x1bW4pXG5cbiAgICB0aGlzLl9zb3J0Q29sdW1uJC5uZXh0KHNvcnRDb2x1bW4pXG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dChuZXdTb3J0RGlyZWN0aW9uKVxuXG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7IHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb24gfSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc29ydGluZzoge1xuICAgICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2hvc2VuKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJC5uZXh0KGNvbHVtbilcbiAgfVxuXG4gIG9uTXVsdGlzZWxlY3RGaWx0ZXJDaGFuZ2UoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCAhPT0gY29sdW1uLmlkKVxuICAgICAgLmNvbmNhdChcbiAgICAgICAgZXZlbnQudmFsdWUubWFwKCh2YWx1ZTogUHJpbWl0aXZlKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZmlsdGVyVHlwZTogY29sdW1uLmZpbHRlclR5cGUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnNcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZC5lbWl0KGZpbHRlcnMpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGZpbHRlcnMsXG4gICAgfSlcbiAgICB0aGlzLnJlc2V0UGFnZSgpXG4gIH1cblxuICBnZXRTZWxlY3RlZEZpbHRlcnMoY29sdW1uSWQ6IHN0cmluZyk6IHVua25vd25bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCkubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgfVxuXG4gIHNvcnRJY29uVGl0bGUoc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvblRvVGl0bGUoXG4gICAgICBzb3J0Q29sdW1uICE9PSB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICAgICAgPyBEYXRhU29ydERpcmVjdGlvbi5OT05FXG4gICAgICAgIDogdGhpcy5zb3J0U3RhdGVzW3RoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICAgIClcbiAgfVxuXG4gIHNvcnREaXJlY3Rpb25Ub1RpdGxlKHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChzb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFTQ0VORElOR19USVRMRSdcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFU0NFTkRJTkdfVElUTEUnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVGQVVMVF9USVRMRSdcbiAgICB9XG4gIH1cblxuICBtYXBTZWxlY3Rpb25Ub1Jvd3MoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy5fc2VsZWN0aW9uSWRzJCwgdGhpcy5fcm93cyRdKS5waXBlKFxuICAgICAgbWFwKChbc2VsZWN0ZWRSb3dJZHMsIHJvd3NdKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcy5tYXAoKHJvd0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvd3MuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogUm93W10pIHtcbiAgICBsZXQgbmV3U2VsZWN0aW9uSWRzID0gc2VsZWN0aW9uLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jvd3MkLmdldFZhbHVlKClcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkge1xuICAgICAgY29uc3QgZGlzYWJsZWRSb3dJZHMgPSByb3dzLmZpbHRlcigocikgPT4gIXRoaXMuZmllbGRJc1RydXRoeShyLCB0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkpLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgICBpZiAoZGlzYWJsZWRSb3dJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZWxlY3Rpb25JZHMgPSB0aGlzLm1lcmdlV2l0aERpc2FibGVkS2V5cyhuZXdTZWxlY3Rpb25JZHMsIGRpc2FibGVkUm93SWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChuZXdTZWxlY3Rpb25JZHMpXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5fcm93cyQuZ2V0VmFsdWUoKS5maWx0ZXIoKHJvdykgPT4gbmV3U2VsZWN0aW9uSWRzLmluY2x1ZGVzKHJvdy5pZCkpKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBtZXJnZVdpdGhEaXNhYmxlZEtleXMobmV3U2VsZWN0aW9uSWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkaXNhYmxlZFJvd0lkczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uSWRzID0gdGhpcy5fc2VsZWN0aW9uSWRzJC5nZXRWYWx1ZSgpXG4gICAgY29uc3QgcHJldmlvdXNseVNlbGVjdGVkQW5kRGlzYWJsZWQgPSBwcmV2aW91c1NlbGVjdGlvbklkcy5maWx0ZXIoKGlkKSA9PiBkaXNhYmxlZFJvd0lkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgZGlzYWJsZWRBbmRQcmV2aW91c2x5RGVzZWxlY3RlZCA9IGRpc2FibGVkUm93SWRzLmZpbHRlcigoaWQpID0+ICFwcmV2aW91c1NlbGVjdGlvbklkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgdXBkYXRlZFNlbGVjdGlvbiA9IFsuLi5uZXdTZWxlY3Rpb25JZHNdXG5cbiAgICBwcmV2aW91c2x5U2VsZWN0ZWRBbmREaXNhYmxlZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF1cGRhdGVkU2VsZWN0aW9uLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICB1cGRhdGVkU2VsZWN0aW9uLnB1c2goaWQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRpc2FibGVkQW5kUHJldmlvdXNseURlc2VsZWN0ZWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdXBkYXRlZFNlbGVjdGlvbi5pbmRleE9mKGlkKVxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdXBkYXRlZFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB1cGRhdGVkU2VsZWN0aW9uXG4gIH1cblxuICBpc1NlbGVjdGVkKHJvdzogUm93KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbklkcyQuZ2V0VmFsdWUoKS5pbmNsdWRlcyhyb3cuaWQpXG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5maXJzdCAvIGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2UgPSBwYWdlXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZSlcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlZC5lbWl0KGV2ZW50LnJvd3MpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGFjdGl2ZVBhZ2U6IHBhZ2UsXG4gICAgICBwYWdlU2l6ZTogZXZlbnQucm93cyxcbiAgICB9KVxuICB9XG5cbiAgcmVzZXRQYWdlKCkge1xuICAgIHRoaXMucGFnZSA9IDBcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5wYWdlKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBmaWVsZElzVHJ1dGh5KG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiAhIU9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICB0b2dnbGVPdmVyZmxvd01lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIG1lbnU6IE1lbnUsIHJvdzogUm93KSB7XG4gICAgdGhpcy5jdXJyZW50TWVudVJvdyQubmV4dChyb3cpXG4gICAgbWVudS50b2dnbGUoZXZlbnQpXG4gIH1cblxuICBoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+XG4gICAgICAgIGFjdGlvbnMuc29tZShcbiAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICFhLmFjdGlvblZpc2libGVGaWVsZCB8fFxuICAgICAgICAgICAgKHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSAmJiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGlzRGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICByZXR1cm4gaXNWYWxpZERhdGUoZClcbiAgfVxuXG4gIGNlbGxUZW1wbGF0ZXNEYXRhOiBUZW1wbGF0ZXNEYXRhID0ge1xuICAgIHRlbXBsYXRlc09ic2VydmFibGVzOiB7fSxcbiAgICBpZFN1ZmZpeDogWydJZFRhYmxlQ2VsbCcsICdJZENlbGwnXSxcbiAgICB0ZW1wbGF0ZU5hbWVzOiB7XG4gICAgICBbQ29sdW1uVHlwZS5EQVRFXTogWydkYXRlQ2VsbCcsICdkYXRlVGFibGVDZWxsJywgJ2RlZmF1bHREYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuTlVNQkVSXTogWydudW1iZXJDZWxsJywgJ251bWJlclRhYmxlQ2VsbCcsICdkZWZhdWx0TnVtYmVyQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuUkVMQVRJVkVfREFURV06IFsncmVsYXRpdmVEYXRlQ2VsbCcsICdyZWxhdGl2ZURhdGVUYWJsZUNlbGwnLCAnZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWV06IFsndHJhbnNsYXRpb25LZXlDZWxsJywgJ3RyYW5zbGF0aW9uS2V5VGFibGVDZWxsJywgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLkNVU1RPTV06IFsnY3VzdG9tQ2VsbCcsICdjdXN0b21UYWJsZUNlbGwnLCAnZGVmYXVsdEN1c3RvbUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlNUUklOR106IFsnc3RyaW5nQ2VsbCcsICdzdHJpbmdUYWJsZUNlbGwnLCAnZGVmYXVsdFN0cmluZ0NlbGwnXSxcbiAgICB9LFxuICB9XG5cbiAgZmlsdGVyVGVtcGxhdGVzRGF0YTogVGVtcGxhdGVzRGF0YSA9IHtcbiAgICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczoge30sXG4gICAgaWRTdWZmaXg6IFsnSWRUYWJsZUZpbHRlckNlbGwnLCAnSWRGaWx0ZXJDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUZpbHRlckNlbGwnLCAnZGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0RGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLk5VTUJFUl06IFsnbnVtYmVyRmlsdGVyQ2VsbCcsICdudW1iZXJUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdE51bWJlckNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnLCAncmVsYXRpdmVEYXRlVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHRSZWxhdGl2ZURhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVldOiBbXG4gICAgICAgICd0cmFuc2xhdGlvbktleUZpbHRlckNlbGwnLFxuICAgICAgICAndHJhbnNsYXRpb25LZXlUYWJsZUZpbHRlckNlbGwnLFxuICAgICAgICAnZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbCcsXG4gICAgICBdLFxuICAgICAgW0NvbHVtblR5cGUuQ1VTVE9NXTogWydjdXN0b21GaWx0ZXJDZWxsJywgJ2N1c3RvbVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0Q3VzdG9tQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogWydzdHJpbmdGaWx0ZXJDZWxsJywgJ3N0cmluZ1RhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0U3RyaW5nQ2VsbCddLFxuICAgIH0sXG4gIH1cblxuICB0ZW1wbGF0ZXNEYXRhTWFwOiBSZWNvcmQ8VGVtcGxhdGVUeXBlLCBUZW1wbGF0ZXNEYXRhPiA9IHtcbiAgICBbVGVtcGxhdGVUeXBlLkNFTExdOiB0aGlzLmNlbGxUZW1wbGF0ZXNEYXRhLFxuICAgIFtUZW1wbGF0ZVR5cGUuRklMVEVSQ0VMTF06IHRoaXMuZmlsdGVyVGVtcGxhdGVzRGF0YSxcbiAgfVxuXG4gIGdldENvbHVtblR5cGVUZW1wbGF0ZSh0ZW1wbGF0ZXM6IFByaW1lVGVtcGxhdGVbXSwgY29sdW1uVHlwZTogQ29sdW1uVHlwZSwgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUpIHtcbiAgICBsZXQgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICAgIHN3aXRjaCAodGVtcGxhdGVUeXBlKSB7XG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5DRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgVGVtcGxhdGVUeXBlLkZJTFRFUkNFTEw6XG4gICAgICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9kYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuTlVNQkVSOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9udW1iZXJGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVk6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9jdXN0b21GaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3N0cmluZ0ZpbHRlckNlbGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0ZW1wbGF0ZSA/P1xuICAgICAgZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV0udGVtcGxhdGVOYW1lc1tjb2x1bW5UeXBlXSk/LnRlbXBsYXRlID8/XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZ2V0VGVtcGxhdGUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlc0RhdGEgPSB0aGlzLnRlbXBsYXRlc0RhdGFNYXBbdGVtcGxhdGVUeXBlXVxuXG4gICAgaWYgKCF0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0pIHtcbiAgICAgIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLnRlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMudmlld1RlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJCxcbiAgICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3QsIHZ0LCBwdF0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbLi4uKHQgPz8gW10pLCAuLi4odnQgPz8gW10pLCAuLi4ocHQgPz8gW10pXVxuICAgICAgICAgIGNvbnN0IGNvbHVtblRlbXBsYXRlID0gZmluZFRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVzLFxuICAgICAgICAgICAgdGVtcGxhdGVzRGF0YS5pZFN1ZmZpeC5tYXAoKHN1ZmZpeCkgPT4gY29sdW1uLmlkICsgc3VmZml4KVxuICAgICAgICAgICk/LnRlbXBsYXRlXG4gICAgICAgICAgaWYgKGNvbHVtblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uVGVtcGxhdGVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVHlwZVRlbXBsYXRlKHRlbXBsYXRlcywgY29sdW1uLmNvbHVtblR5cGUsIHRlbXBsYXRlVHlwZSlcbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlVGltZSg1MClcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXVxuICB9XG5cbiAgcmVzb2x2ZUZpZWxkRGF0YShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIGdldFJvd09iamVjdEZyb21NdWx0aXNlbGVjdEl0ZW0odmFsdWU6IE11bHRpU2VsZWN0SXRlbSwgY29sdW1uOiBEYXRhVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW2NvbHVtbi5pZF06IHZhbHVlLmxhYmVsLFxuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW4gbGV0LXJvd09iamVjdD1cImxvY2FsUm93T2JqZWN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGRcbiAgICAgIGNsYXNzPVwiYWN0aW9uc1wiXG4gICAgICBwRnJvemVuQ29sdW1uXG4gICAgICBbZnJvemVuXT1cImZyb3plbkFjdGlvbkNvbHVtblwiXG4gICAgICBbYWxpZ25Gcm96ZW5dPVwiYWN0aW9uQ29sdW1uUG9zaXRpb25cIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4tbGVmdCcgOiAnYWN0aW9uLWNvbHVtbi1yaWdodCdcIlxuICAgICAgW25nQ2xhc3NdPVwiKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnKSA/ICdib3JkZXItcmlnaHQtMScgOiAoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdib3JkZXItbGVmdC0xJyA6ICcnXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1idXR0b24tcm93LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwidmlld1RhYmxlUm93T2JzZXJ2ZWQgJiYgKCF2aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cInZpZXdQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXZpZXdBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCB2aWV3VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5WSUVXJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlld1Jvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImVkaXRUYWJsZVJvd09ic2VydmVkICYmICghZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJlZGl0UGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFlZGl0QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgZWRpdFRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuRURJVCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJkZWxldGVUYWJsZVJvd09ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZGVsZXRlUGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFkZWxldGVBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBkZWxldGVUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiYWN0aW9uLnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uY2FsbGJhY2socm93T2JqZWN0KVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93T2JqZWN0KSB8IGFzeW5jXCI+XG4gICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiKG92ZXJmbG93TWVudUl0ZW1zJCB8IGFzeW5jKSB8fCBbXVwiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ3BpIHBpLWVsbGlwc2lzLXYnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPdmVyZmxvd01lbnUoJGV2ZW50LCBtZW51LCByb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbkNvbHVtbkhlYWRlcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwICB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGhcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4taGVhZGVyLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4taGVhZGVyLXJpZ2h0J1wiXG4gICAgPlxuICAgICAge3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlNfQ09MVU1OX05BTUUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiKGRpc3BsYXllZFBhZ2VTaXplJCB8IGFzeW5jKSBhcyBkaXNwbGF5ZWRQYWdlU2l6ZVwiPlxuICA8cC10YWJsZVxuICAgICpuZ0lmPVwiKGNvbHVtblRlbXBsYXRlcyQgfCBhc3luYykgPz8ge30gYXMgY29sdW1uVGVtcGxhdGVzXCJcbiAgICBbdmFsdWVdPVwiKGRpc3BsYXllZFJvd3MkIHwgYXN5bmMpID8/IFtdXCJcbiAgICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcbiAgICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXG4gICAgW2ZpcnN0XT1cInBhZ2UgKiBkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gICAgKG9uUGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW3Jvd3NdPVwiZGlzcGxheWVkUGFnZVNpemVcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICh0b3RhbFJlY29yZHNPblNlcnZlciA/IGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5IDogY3VycmVudFBhZ2VTaG93aW5nS2V5KSB8IHRyYW5zbGF0ZTpwYXJhbXMgfX1cIlxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiKGRpc3BsYXllZFBhZ2VTaXplcyQgfCBhc3luYykgPz8gW11cIlxuICAgIGlkPVwiZGF0YVRhYmxlX3t7bmFtZX19XCJcbiAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgIFtzZWxlY3Rpb25dPVwiKHNlbGVjdGVkUm93cyQgfCBhc3luYykgPz8gW11cIlxuICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgIFtzdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gICAgdGFibGVTdHlsZUNsYXNzPVwiaC1mdWxsXCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgIDx0ciBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiB0b3BcIj5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDRyZW1cIiBzY29wZT1cImNvbFwiICpuZ0lmPVwic2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkXCI+XG4gICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveFxuICAgICAgICAgICAgKm5nSWY9XCJhbGxvd1NlbGVjdEFsbFwiXG4gICAgICAgICAgICBhcmlhTGFiZWw9XCJ7eydPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQUxMX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgID48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCc7XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW4uc29ydGFibGUgfHwgY29sdW1uLmZpbHRlcmFibGU7IGVsc2Ugc2ltcGxlSGVhZGVyXCIgc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1oZWFkZXItd3JhcHBlciBmbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXhcIiBpZD1cInt7Y29sdW1uLmlkfX0taGVhZGVyLW5hbWVcIj57eyBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGljb24tYnV0dG9uLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaSBzb3J0QnV0dG9uIHBsLTBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYWx0XT1cIihjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdOT05FJykgfHwgY29sdW1uPy5pZCAhPT0gc29ydENvbHVtblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtdXBdPVwiY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnQVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtZG93bl09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdERVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Tb3J0Q29sdW1uQ2xpY2soY29sdW1uLmlkKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKHNvcnRJY29uVGl0bGUoY29sdW1uLmlkKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiAoY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUpLCBkaXJlY3Rpb246IChzb3J0RGlyZWN0aW9uVG9UaXRsZShjb2x1bW5OZXh0U29ydERpcmVjdGlvbihjb2x1bW4uaWQpKSB8IHRyYW5zbGF0ZSl9KVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlck11bHRpU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGUgJiYgKCFjb2x1bW4uZmlsdGVyVHlwZSB8fCBjb2x1bW4uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5FUVVBTClcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiKGN1cnJlbnRFcXVhbEZpbHRlck9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihjdXJyZW50RXF1YWxTZWxlY3RlZEZpbHRlcnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkVNUFRZX0ZJTFRFUl9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RGaWx0ZXJDaGFuZ2UoY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSWNvblwiXG4gICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwib25GaWx0ZXJDaG9zZW4oY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQ09MVU1OX0ZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXJpYUZpbHRlckxhYmVsXT1cIignT0NYX0RBVEFfVEFCTEUuRklMVEVSX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGV9KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyXT1cIiEoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyLWZpbGxdPVwiKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXSA+IDBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtblRlbXBsYXRlc1tjb2x1bW4uaWRdIGFzIHRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICByb3dPYmplY3Q6IGdldFJvd09iamVjdEZyb21NdWx0aXNlbGVjdEl0ZW0odmFsdWUsIGNvbHVtbiksXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyTXVsdGlTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5UUlVUSFlcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidHJ1dGh5RmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoY3VycmVudFRydXRoeVNlbGVjdGVkRmlsdGVycyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuRU1QVFlfRklMVEVSX01FU1NBR0UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25NdWx0aXNlbGVjdEZpbHRlckNoYW5nZShjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJJY29uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJvbkZpbHRlckNob3Nlbihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuRklMVEVSX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5DT0xVTU5fRklMVEVSX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthcmlhRmlsdGVyTGFiZWxdPVwiKCdPQ1hfREFUQV9UQUJMRS5GSUxURVJfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZX0pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtc1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1maWx0ZXJdPVwiISgoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1maWx0ZXItZmlsbF09XCIoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdID4gMFwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC12YWx1ZT4ge3t2YWx1ZS5rZXkgfCB0cmFuc2xhdGV9fSA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbXBsZUhlYWRlcj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93T2JqZWN0PlxuICAgICAgPHRyPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgKm5nSWY9XCIoISFzZWxlY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBzZWxlY3Rpb25FbmFibGVkRmllbGQpKSAmJiBpc1NlbGVjdGVkKHJvd09iamVjdCk7IGVsc2UgZGVmYXVsdENoZWNrYm94XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hlY2tlZFwiXG4gICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuU0VMRUNUX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGtleTogcm93T2JqZWN0LmlkfVwiXG4gICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDaGVja2JveD5cbiAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvd09iamVjdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsga2V5OiByb3dPYmplY3QuaWR9XCJcbiAgICAgICAgICAgID48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgICAgX2NlbGwgPyBfY2VsbDogY29sdW1uVGVtcGxhdGVzW2NvbHVtbi5pZF1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPHRyPlxuICAgICAgICA8dGQgW2NvbFNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoKGFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCkgPyAxIDogMClcIj5cbiAgICAgICAgICB7eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX1RBQkxFLkVNUFRZX1JFU1VMVFwiIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRTdHJpbmdDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCl9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0TnVtYmVyQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgbnVtYmVyIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRDdXN0b21DZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj4gPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHREYXRlQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgZGF0ZTogY29sdW1uLmRhdGVGb3JtYXQgPz8gJ21lZGl1bScgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPlxuICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5FRElURUQnIHwgdHJhbnNsYXRlIH19IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdGltZWFnbyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19