@ohioepa/oepa-ui-lib 1.4.5 → 1.4.7

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.
@@ -29,6 +29,7 @@ export class PTableComponent {
29
29
  visibleColumnCount = 0;
30
30
  allColumnCount = 0;
31
31
  exportVisibleOnly = false;
32
+ exportUnselectedRows = false;
32
33
  noFiltersSubject = new Subject();
33
34
  dataColumns = [];
34
35
  visibleColumns = [];
@@ -65,6 +66,7 @@ export class PTableComponent {
65
66
  this.pageInfo.itemsPerPage = conf.rowsPerPage;
66
67
  }
67
68
  this.exportVisibleOnly = conf.exportVisibleOnly;
69
+ this.exportUnselectedRows = conf.exportUnselectedRows || false;
68
70
  this._config = conf;
69
71
  }
70
72
  get config() {
@@ -630,13 +632,13 @@ export class PTableComponent {
630
632
  }
631
633
  });
632
634
  this.rows.slice();
633
- // this.updateTable();
635
+ this.copySelectionState();
634
636
  this.rowSelected.emit(selectedRows);
635
637
  }
636
638
  toggleRowSelection(row) {
637
639
  const selectedRows = [];
638
640
  row.selected = !row.selected;
639
- this.rows.forEach((dr) => {
641
+ this.rows.forEach(dr => {
640
642
  if (row.privateId === dr.privateId) {
641
643
  dr.selected = row.selected;
642
644
  }
@@ -647,9 +649,18 @@ export class PTableComponent {
647
649
  this.allRowsSelected = false;
648
650
  }
649
651
  });
650
- // this.updateTable();
652
+ this.copySelectionState();
651
653
  this.rowSelected.emit(selectedRows);
652
654
  }
655
+ copySelectionState() {
656
+ this.rows.forEach((r) => {
657
+ this._data.forEach(dr => {
658
+ if (dr.privateId === r.privateId) {
659
+ dr.selected = r.selected;
660
+ }
661
+ });
662
+ });
663
+ }
653
664
  singleRowSelection(row) {
654
665
  const selectedRows = [];
655
666
  row.selected = !row.selected;
@@ -674,6 +685,10 @@ export class PTableComponent {
674
685
  // this.dumpDetailRows();
675
686
  if (rows && rows.length) {
676
687
  rows.forEach((row) => {
688
+ if (!this.exportUnselectedRows && this.hasSelectableColumn() && !row.selected) {
689
+ // skip unselected rows
690
+ return;
691
+ }
677
692
  result.push({
678
693
  cells: this.simplifyCells(row.cells),
679
694
  actions: row.actions,
@@ -686,6 +701,15 @@ export class PTableComponent {
686
701
  }
687
702
  return result;
688
703
  }
704
+ hasSelectableColumn() {
705
+ let hasSelectable = false;
706
+ this.dataColumns.forEach((column) => {
707
+ if (column.selectColumn) {
708
+ hasSelectable = true;
709
+ }
710
+ });
711
+ return hasSelectable;
712
+ }
689
713
  simplifyCells(cells) {
690
714
  let simpleCells = [];
691
715
  if (cells && cells.length > 0) {
@@ -751,6 +775,9 @@ export class PTableComponent {
751
775
  toggleExportVisibleOnly() {
752
776
  this.exportVisibleOnly = !this.exportVisibleOnly;
753
777
  }
778
+ toggleExportUnselectedRows() {
779
+ this.exportUnselectedRows = !this.exportUnselectedRows;
780
+ }
754
781
  exportToExcel() {
755
782
  const sortedData = this.sortData(this._data);
756
783
  const exportTable = this.gatherTableData(this.exportVisibleOnly ? this.rows : sortedData);
@@ -789,11 +816,11 @@ export class PTableComponent {
789
816
  this.customBtn2Clicked.emit();
790
817
  }
791
818
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PTableComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.TableService }, { token: i3.TableExportService }, { token: i4.OepaFileUtilService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
792
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PTableComponent, selector: "oepa-p-table", inputs: { tableId: "tableId", allowEdit: "allowEdit", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", customBtnLabel2: "customBtnLabel2", customBtnVisible2: "customBtnVisible2", customBtnEnabled2: "customBtnEnabled2", small: "small", data: "data", totalRow: "totalRow" }, outputs: { cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked", customBtn2Clicked: "customBtn2Clicked" }, ngImport: i0, template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span>&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "component", type: i10.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: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i12.TableDataCellComponent, selector: "oepa-table-data-cell", inputs: ["col", "row", "i", "r", "tableId"], outputs: ["onCellClick", "onToggleRowSelection", "onSingleRowSelection", "onActionClick"] }, { kind: "component", type: i13.TableHeaderCellComponent, selector: "oepa-table-header-cell", inputs: ["column", "tableId", "allRowsSelected", "rowCount", "noFiltersSubject"], outputs: ["onToggleAllRowsSelection", "onSortChanged", "onHideColumn", "onFilterChanged"] }, { kind: "directive", type: i14.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i15.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i16.OepaTableCellClassnamePipe, name: "cellClassname" }] });
819
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PTableComponent, selector: "oepa-p-table", inputs: { tableId: "tableId", allowEdit: "allowEdit", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", customBtnLabel2: "customBtnLabel2", customBtnVisible2: "customBtnVisible2", customBtnEnabled2: "customBtnEnabled2", small: "small", data: "data", totalRow: "totalRow" }, outputs: { cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked", customBtn2Clicked: "customBtn2Clicked" }, ngImport: i0, template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span>&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n </span>\n <span>&nbsp;&nbsp;Include unselected rows in export:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "component", type: i10.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: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i12.TableDataCellComponent, selector: "oepa-table-data-cell", inputs: ["col", "row", "i", "r", "tableId"], outputs: ["onCellClick", "onToggleRowSelection", "onSingleRowSelection", "onActionClick"] }, { kind: "component", type: i13.TableHeaderCellComponent, selector: "oepa-table-header-cell", inputs: ["column", "tableId", "allRowsSelected", "rowCount", "noFiltersSubject"], outputs: ["onToggleAllRowsSelection", "onSortChanged", "onHideColumn", "onFilterChanged"] }, { kind: "directive", type: i14.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i15.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i16.OepaTableCellClassnamePipe, name: "cellClassname" }] });
793
820
  }
794
821
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PTableComponent, decorators: [{
795
822
  type: Component,
796
- args: [{ selector: 'oepa-p-table', template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span>&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"] }]
823
+ args: [{ selector: 'oepa-p-table', template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span>&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n </span>\n <span>&nbsp;&nbsp;Include unselected rows in export:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"] }]
797
824
  }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.TableService }, { type: i3.TableExportService }, { type: i4.OepaFileUtilService }, { type: i0.ElementRef }], propDecorators: { tableId: [{
798
825
  type: Input
799
826
  }], allowEdit: [{
@@ -833,4 +860,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
833
860
  }], totalRow: [{
834
861
  type: Input
835
862
  }] } });
836
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQXFCN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUy9CLE1BQU0sT0FBTyxlQUFlO0lBMkpDO0lBQ2pCO0lBQ0E7SUFDQTtJQUNBO0lBOUpILGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUEyQixFQUFFLENBQUM7SUFDeEMsSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsaUJBQWlCLEdBQXdCLEtBQUssQ0FBQztJQUMvQyxnQkFBZ0IsR0FBcUIsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUU1RCxXQUFXLEdBQTJCLEVBQUUsQ0FBQztJQUN6QyxjQUFjLEdBQTJCLEVBQUUsQ0FBQztJQUM1QyxhQUFhLEdBQTJCLEVBQUUsQ0FBQztJQUMzQyxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUNsQyxLQUFLLEdBQXdCLEVBQUUsQ0FBQztJQUMvQixPQUFPLEdBQW9CLEVBQUUsQ0FBQztJQUM5QixjQUFjLEdBQTJCLENBQUM7WUFDaEQsWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFLFNBQVM7U0FDcEIsQ0FBQyxDQUFDO0lBRUksY0FBYyxHQUFH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ZTtrQkFMM0IsU0FBUzsrQkFDRSxjQUFjO3dNQXVDZixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSyxNQUFNO3NCQURoQixLQUFLO2dCQW9CSyxhQUFhO3NCQUR2QixLQUFLO2dCQWNLLE1BQU07c0JBRGhCLEtBQUs7Z0JBV0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR1csV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFvQ0ksSUFBSTtzQkFEZCxLQUFLO2dCQXVCRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbXBvcnQgeyBPZXBhVGFibGUgfSBmcm9tICcuLi9vZXBhLXRhYmxlJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbmZpZyB9IGZyb20gJy4uL29lcGEtdGFibGUtY29uZmlnJztcbmltcG9ydCB7IE9lcGFUYWJsZUhlYWRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtaGVhZGVyJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uL29lcGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IE9lcGFUYWJsZVJvdyB9IGZyb20gJy4uL29lcGEtdGFibGUtcm93JztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGwgfSBmcm9tICcuLi9vZXBhLXRhYmxlLWNlbGwnO1xuaW1wb3J0IHsgT2VwYVRhYmxlUGFnZUluZm8gfSBmcm9tICcuLi9vZXBhLXRhYmxlLXBhZ2UtaW5mbyc7XG5pbXBvcnQgeyBPZXBhVGFibGVDZWxsQ2xpY2tFdmVudCB9IGZyb20gJy4uL29lcGEtdGFibGUtY2VsbC1jbGljay1ldmVudCc7XG5cbmltcG9ydCB7IE9lcGFBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uL2FjdGlvbi1idG4vb2VwYS1hY3Rpb24tZXZlbnQnO1xuXG5pbXBvcnQgeyBUYWJsZUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGVtcGxhdGVJbmZvIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2VwYVRhYmxlU29ydENyaXRlcmlvbiB9IGZyb20gJy4uL29lcGEtdGFibGUtc29ydC1jcml0ZXJpb24nO1xuaW1wb3J0IHsgUGFnZUNoYW5nZWRFdmVudCB9IGZyb20gJ25neC1ib290c3RyYXAvcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBPZXBhUENvbHVtbiB9IGZyb20gJy4uL29lcGEtcC1jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVEYXRhQ2VsbENsaWNrRXZlbnQgfSBmcm9tICcuLi90YWJsZS1kYXRhLWNlbGwvdGFibGUtZGF0YS1jZWxsLWNsaWNrLWV2ZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9lcGFUYWJsZUZpbHRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtZmlsdGVyJztcbmltcG9ydCB7IE9lcGFGaWxlVXRpbFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXAtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3AtdGFibGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIHB1YmxpYyBzaG93RmlsdGVyUm93OiBCb29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+ID0gW107XG4gIHB1YmxpYyByb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgYWxsQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgZXhwb3J0VmlzaWJsZU9ubHk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgcHVibGljIG5vRmlsdGVyc1N1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHB1YmxpYyBkYXRhQ29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGhpZGRlbkNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGNvbHVtbkhlYWRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHVibGljIF9kYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHByaXZhdGUgX2NvbmZpZzogT2VwYVRhYmxlQ29uZmlnID0ge307XG4gIHByaXZhdGUgY3VycmVudEZpbHRlcnM6IEFycmF5PE9lcGFUYWJsZUZpbHRlcj4gPSBbe1xuICAgIGZpbHRlclN0cmluZzogJycsXG4gICAgY29sdW1uSWQ6IHVuZGVmaW5lZFxuICB9XTtcblxuICBwdWJsaWMgZGF0YUhhc0RldGFpbHMgPSBmYWxzZTtcbiAgcHVibGljIHNob3dBbGxEZXRhaWxzID0gZmFsc2U7XG5cbiAgcHVibGljIGFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBwYWdlSW5mbzogT2VwYVRhYmxlUGFnZUluZm8gPSB7XG4gICAgcGFnZTogMSxcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgIG1heFNpemU6IDUsXG4gICAgbnVtUGFnZXM6IDEsXG4gICAgbGVuZ3RoOiAwXG4gIH07XG4gIHB1YmxpYyBjdXJyZW50UGFnZSA9IDE7XG4gIHB1YmxpYyBwYWdpbmF0aW9uT24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHRhYmxlSWQgPSAnJztcbiAgQElucHV0KCkgYWxsb3dFZGl0ID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjb25maWcoY29uZjogT2VwYVRhYmxlQ29uZmlnKSB7XG4gICAgaWYgKCFjb25mLmNsYXNzTmFtZSkge1xuICAgICAgY29uZi5jbGFzc05hbWUgPSAndGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCc7XG4gICAgfVxuICAgIGlmIChjb25mLmNsYXNzTmFtZXMpIHtcbiAgICAgIGNvbmYuY2xhc3NOYW1lID0gY29uZi5jbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICB9XG4gICAgaWYgKGNvbmYucm93c1BlclBhZ2UpIHtcbiAgICAgIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlID0gY29uZi5yb3dzUGVyUGFnZTtcbiAgICB9XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9IGNvbmYuZXhwb3J0VmlzaWJsZU9ubHk7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9lcGFUYWJsZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29tcGxleEhlYWRlcihoZHJzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+KSB7XG4gICAgdGhpcy5yZXNldEhlYWRlcnMoKTtcbiAgICBpZiAoaGRycyAmJiBoZHJzLmxlbmd0aCkge1xuICAgICAgaGRycy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgICB0aGlzLmhlYWRlclJvd3MucHVzaCh0aGlzLmV4dHJhY3RJbm5lckNvbHVtbnMoaGRyLmNvbHVtbnMpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gdGhpcy5leHRyYWN0Q29sdW1uSGVhZGVycyh0aGlzLmhlYWRlclJvd3MpO1xuICAgICAgdGhpcy5kYXRhQ29sdW1ucyA9IHRoaXMuZXh0cmFjdERhdGFDb2x1bW5zKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVIaWRkZW5Db2x1bW5zKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGVhZGVyKGhkcjogT2VwYVRhYmxlSGVhZGVyKSB7XG4gICAgdGhpcy5yZXNldEhlYWRlcnMoKTtcbiAgICBpZiAoaGRyLmNvbHVtbnMgJiYgaGRyLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5oZWFkZXJSb3dzLnB1c2godGhpcy5leHRyYWN0SW5uZXJDb2x1bW5zKGhkci5jb2x1bW5zKSk7XG4gICAgfVxuICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IHRoaXMuZXh0cmFjdENvbHVtbkhlYWRlcnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICB0aGlzLmRhdGFDb2x1bW5zID0gdGhpcy5leHRyYWN0RGF0YUNvbHVtbnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICB0aGlzLmluaXRpYWxpemVIaWRkZW5Db2x1bW5zKGZhbHNlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGN1c3RvbUJ0blZpc2libGUgPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tQnRuRW5hYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkxhYmVsMjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjdXN0b21CdG5WaXNpYmxlMiA9IGZhbHNlO1xuICBASW5wdXQoKSBjdXN0b21CdG5FbmFibGVkMiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNtYWxsID0gZmFsc2U7XG5cbiAgLy8gT3V0cHV0cyAoRXZlbnRzKVxuICBAT3V0cHV0KCkgcHVibGljIGNlbGxDbGlja2VkOiBFdmVudEVtaXR0ZXI8T2VwYVRhYmxlQ2VsbENsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGFjdGlvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxPZXBhQWN0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8QXJyYXk8T2VwYVRhYmxlUm93Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY3VzdG9tQnRuQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGN1c3RvbUJ0bjJDbGlja2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIHBDb2x1bW5zOiBPZXBhUENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZXNldEhlYWRlcnMoKSB7XG4gICAgdGhpcy5oZWFkZXJSb3dzID0gW107XG4gICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gW107XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLnBDb2x1bW5zID0gW107XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVIaWRkZW5Db2x1bW5zKGNvbXBsZXhIZWFkZXI6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCA9IDA7XG4gICAgdGhpcy5hbGxDb2x1bW5Db3VudCA9IDA7XG4gICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbHVtbi5maWVsZCA9IGNvbHVtbi5pZDtcbiAgICAgIGNvbHVtbi5oZWFkZXIgPSBjb2x1bW4udGl0bGU7XG4gICAgICBpZiAoY29tcGxleEhlYWRlciAmJiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUgfHwgY29sdW1uPy5oaWRkZW4gPT09IGZhbHNlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdkaXNhYmxpbmcgaGlkZGVuIGF0dHJpYnV0ZSBmb3IgY29sdW1uOiAnICsgY29sdW1uLmlkICtcbiAgICAgICAgICAnLiBIaWRkZW4gY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgY29tcGxleCBoZWFkZXJzICh5ZXQpLicpO1xuICAgICAgICBjb2x1bW4uaGlkZGVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICAgICAgfVxuICAgICAgdGhpcy5hbGxDb2x1bW5Db3VudCsrO1xuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhKHZhbHVlczogQXJyYXk8T2VwYVRhYmxlUm93Pikge1xuICAgIGlmICghdGhpcy5fZGF0YSB8fCB0aGlzLl9kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMudGFibGVTZXJ2aWNlLmdldERhdGEodGhpcy50YWJsZUlkKSB8fCBbXTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzW2ldLnByaXZhdGVJZCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jbGVhclBhZ2VJbmZvKHRoaXMudGFibGVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlcztcbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXREYXRhKHRoaXMudGFibGVJZCwgdGhpcy5fZGF0YSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLm1hcCh4ID0+IE9iamVjdC5hc3NpZ24oe30sIHgpKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHRvdGFsUm93OiBPZXBhVGFibGVSb3cgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICBwcml2YXRlIHRhYmxlRXhwb3J0U2VydmljZTogVGFibGVFeHBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZVV0aWxTZXJ2aWNlOiBPZXBhRmlsZVV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFnaW5hdGlvbk9uID0gIXRoaXMuX2NvbmZpZy5kaXNhYmxlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcuY2xhc3NOYW1lICE9PSAnJykge1xuICAgICAgJCgndGFibGUnKS5hZGRDbGFzcygndGFibGUgJyArIHRoaXMuY29uZmlnLmNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SW5uZXJDb2x1bW5zKGlubmVyOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+KTogT2VwYVRhYmxlSGVhZGVyIHtcbiAgICBjb25zdCBoZWFkZXI6IE9lcGFUYWJsZUhlYWRlciA9IHsgY29sdW1uczogW10gfTtcbiAgICBpbm5lci5mb3JFYWNoKCh2YWx1ZTogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBoZWFkZXIuY29sdW1ucy5maW5kKChjb2w6IE9lcGFUYWJsZUNvbHVtbikgPT4gY29sLmlkID09PSB2YWx1ZS5pZCk7XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIC8vIG92ZXJ3cml0ZSByZXBlYXRlZCBjb2x1bW5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgIGhlYWRlci5jb2x1bW5zLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RDb2x1bW5IZWFkZXJzKGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBoZWFkZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgbGV0IHJvd0luZGV4ID0gMDtcbiAgICBjb25zdCBjaGlsZENvbHVtbnM6IGFueSA9IHt9O1xuICAgIGhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goY29sdW1uLnRpdGxlKTtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMTsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBoZWFkZXJzLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uLnJvd3NwYW4pIHtcbiAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW4ucm93c3BhbiAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChjaGlsZENvbHVtbnNbY29sSW5kZXhdICYmIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPiAwKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdLS07XG4gICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJzW2NvbEluZGV4XSArPSAnICcgKyBjb2x1bW4udGl0bGU7XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDE7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBleHRyYWN0RGF0YUNvbHVtbnMoaGVhZGVyUm93czogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPik6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4ge1xuICAgIGNvbnN0IGRhdGFDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgbGV0IHJvd0luZGV4ID0gMDtcbiAgICBjb25zdCBjaGlsZENvbHVtbnM6YW55ID0ge307XG4gICAgaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgbGV0IGNvbEluZGV4ID0gMDtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChyb3dJbmRleCA9PT0gMCkge1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3BhbiAmJiBjb2x1bW4uY29sc3BhbiA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMDsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBkYXRhQ29sdW1ucy5wdXNoKHtpZDogJycsdGl0bGU6ICcnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xJbmRleCArPSAoY29sdW1uLmNvbHNwYW4gLSAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YUNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5yb3dzcGFuKSB7XG4gICAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW4ucm93c3BhbiAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChjaGlsZENvbHVtbnNbY29sSW5kZXhdICYmIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPiAwKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdLS07XG4gICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4gJiYgY29sdW1uLmNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgICBjb2xJbmRleCArPSAoY29sdW1uLmNvbHNwYW4gLSAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YUNvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgfSk7XG4gICAgICByb3dJbmRleCsrO1xuICAgIH0pO1xuICAgIHJldHVybiBkYXRhQ29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBzYW5pdGl6ZShodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRvIHNlZSBpZiBhbnkgZmlsdGVycyBhcmUgc2V0XG4gICAqL1xuICBwdWJsaWMgbm9GaWx0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBub0ZpbHRlcnMgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vRmlsdGVycyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubm9GaWx0ZXJzU3ViamVjdC5uZXh0KG5vRmlsdGVycyk7XG4gICAgcmV0dXJuIG5vRmlsdGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGZpbHRlciBzdHJpbmcgKGlmIGFueSkgYXMgYSBSZWdFeHBcbiAgICovXG4gIHByaXZhdGUgZ2V0R2xvYmFsRmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKCFmaWx0ZXIuY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gKGlmIGFueSkgYXMgYSBSZWdFeHAuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJGb3JDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIHRoZSB0YWJsZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgb3IgY29sdW1uLXNwZWNpZmljXG4gICAqIGZpbHRlcnMgc2V0IGluIHRoZSBVSS5cbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyRGF0YShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgLy8gZG9uJ3QgYXR0ZW1wdCBmaWx0ZXJpbmcgaWYgdGhlcmUgYXJlIG5vIGZpbHRlcnMgc2V0XG4gICAgaWYgKHRoaXMubm9GaWx0ZXJzKCkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBsZXQgZmlsdGVyZWREYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gZGF0YTtcbiAgICBjb25zdCB0ZW1wQXJyYXk6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICBmaWx0ZXJlZERhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGxldCBmbGFnID0gdGhpcy5maWx0ZXJCeUNvbHVtbkZpbHRlcnMocm93KTtcbiAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgIGZsYWcgPSB0aGlzLmZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdyk7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZyB8fCByb3cuaXNEaXZpZGVyKSB7XG4gICAgICAgIHRlbXBBcnJheS5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmlsdGVyZWREYXRhID0gdGVtcEFycmF5O1xuICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyBhbnkgb2YgdGhlIGNvbHVtbm4gZmlsdGVycyB0aGF0IG1heSBiZSBzZXQuXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQnlDb2x1bW5GaWx0ZXJzKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBjb25zdCByZWdFeHAgPSB0aGlzLmdldEZpbHRlckZvckNvbHVtbihjZWxsLmlkKTtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY2VsbC5maWx0ZXJWYWx1ZSB8fCBjZWxsLnZhbHVlIHx8ICcnO1xuICAgICAgaWYgKHJlZ0V4cCAmJiBmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbHRlclZhbHVlLnRvU3RyaW5nKCkubWF0Y2gocmVnRXhwKTtcbiAgICAgICAgZmxhZyA9IGZsYWcgJiYgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyB0aGUgZ2xvYmFsIGZpbHRlclxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIGNvbnN0IHJlZ0V4cCA9IHRoaXMuZ2V0R2xvYmFsRmlsdGVyKCk7XG4gICAgaWYgKHJlZ0V4cCkge1xuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBjZWxsLmZpbHRlclZhbHVlIHx8IGNlbGwudmFsdWU7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsdGVyVmFsdWUudG9TdHJpbmcoKS5tYXRjaChyZWdFeHApO1xuICAgICAgICAgIGZsYWcgPSBmbGFnIHx8IChyZXN1bHQgIT09IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICBwdWJsaWMgaGlkZUNvbHVtbihjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKG1hdGNoID0+IHtcbiAgICAgIHJldHVybiBtYXRjaC5pZCAhPT0gY29sdW1uLmlkO1xuICAgIH0pO1xuICAgIGNvbHVtbi5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50LS07XG4gIH1cblxuICBwdWJsaWMgdW5oaWRlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoaWRkZW5Db2xzOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5oaWRkZW5Db2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5pZCAhPT0gY29sdW1uSWQpIHtcbiAgICAgICAgaGlkZGVuQ29scy5wdXNoKGNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2wuaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IHZpc2libGVDb2xzOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKGRhdGFDb2x1bW4gPT4ge1xuICAgICAgbGV0IGtlZXAgPSB0cnVlO1xuICAgICAgaGlkZGVuQ29scy5mb3JFYWNoKGhpZGRlbkNvbHVtbiA9PiB7XG4gICAgICAgIGlmIChkYXRhQ29sdW1uLmlkID09PSBoaWRkZW5Db2x1bW4uaWQpIHtcbiAgICAgICAgICBrZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGtlZXApIHtcbiAgICAgICAgdmlzaWJsZUNvbHMucHVzaChkYXRhQ29sdW1uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBoaWRkZW5Db2xzO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB2aXNpYmxlQ29scztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0RGF0YShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgbGV0IHNvcnRDcml0ZXJpYTogYW55ID0gdGhpcy50YWJsZVNlcnZpY2UuZ2V0U29ydENyaXRlcmlhKHRoaXMudGFibGVJZCkgfHwgW107XG4gICAgaWYgKHNvcnRDcml0ZXJpYS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldENvbHVtblNvcnRJbmRleGVzKHNvcnRDcml0ZXJpYSk7XG5cbiAgICByZXR1cm4gZGF0YS5zb3J0KChwcmV2aW91czogT2VwYVRhYmxlUm93LCBjdXJyZW50OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGxldCBzb3J0SW5kZXggPSAwO1xuICAgICAgbGV0IHNvcnRSZXN1bHQgPSAwO1xuICAgICAgd2hpbGUgKHNvcnRJbmRleCA8IHNvcnRDcml0ZXJpYS5sZW5ndGggJiYgc29ydFJlc3VsdCA9PT0gMCkge1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMuZ2V0Um93U29ydFZhbHVlKHByZXZpb3VzLCBzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5jb2x1bW5JZCk7XG4gICAgICAgIGxldCBjdXJyID0gdGhpcy5nZXRSb3dTb3J0VmFsdWUoY3VycmVudCwgc29ydENyaXRlcmlhW3NvcnRJbmRleF0uY29sdW1uSWQpO1xuICAgICAgICBpZiAocHJldiA+IGN1cnIpIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gIChzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5zb3J0ID09PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXYgPCBjdXJyKSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9ICAoc29ydENyaXRlcmlhW3NvcnRJbmRleF0uc29ydCA9PT0gJ2FzYycgPyAtMSA6IDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHNvcnRJbmRleCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNvcnRSZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRDb2x1bW5Tb3J0SW5kZXhlcyhzb3J0Q3JpdGVyaWE6IE9lcGFUYWJsZVNvcnRDcml0ZXJpb25bXSkge1xuICAgIGlmIChzb3J0Q3JpdGVyaWEgJiYgc29ydENyaXRlcmlhLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGk9MDsgaTxzb3J0Q3JpdGVyaWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbj8uaWQgPT09IHNvcnRDcml0ZXJpYVtpXS5jb2x1bW5JZCkge1xuICAgICAgICAgICAgY29sdW1uLnNvcnRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwuXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIGNvbHVtbklkXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxWYWx1ZUhpZGRlbihyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBoaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIGhpZGRlbiA9IGNlbGwuaGlkZVZhbHVlIHx8IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBoaWRkZW47XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvdyBSZXRyaWV2ZSB0aGUgc29ydCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwgKHdpbGwgZGVmYXVsdCB0byBkaXNwbGF5IHZhbHVlIGlmIHNvcnRcbiAgICogdmFsdWUgaXMgbm90IHNwZWNpZmllZCkuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1NvcnRWYWx1ZShyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICBpZiAoY2VsbC5zb3J0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjZWxsLnNvcnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlID0gY2VsbC5zb3J0VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhZ2UoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IHRoaXMuZGF0YSk6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uT24pIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVBhZ2UoKTtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2VJbmZvLnBhZ2UgLSAxKSAqIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlID4gLTEgPyAoc3RhcnQgKyB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSkgOiBkYXRhLmxlbmd0aDtcbiAgICAvLyBub3Qgc3VyZSB3aHksIGJ1dCBtYXhTaXplIHdhcyBnZXR0aW5nIGxvc3QuIFJlc2V0IGl0IGhlcmUgdG8gcHJldmVudCB3ZWlyZG5lc3MuXG4gICAgdGhpcy5wYWdlSW5mby5tYXhTaXplID0gNTtcbiAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVQYWdpbmdhdGlvbigpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLnBhZ2luYXRpb25PbjtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2VkKGZpbHRlcjogT2VwYVRhYmxlRmlsdGVyKSB7XG4gICAgY29uc3QgbWF0Y2hGaWx0ZXIgPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZpbmQoKGYpID0+IHtcbiAgICAgIHJldHVybiBmLmNvbHVtbklkID09PSBmaWx0ZXIuY29sdW1uSWQ7XG4gICAgfSk7XG4gICAgaWYgKCFtYXRjaEZpbHRlcikge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoRmlsdGVyLmZpbHRlclN0cmluZyA9IGZpbHRlci5maWx0ZXJTdHJpbmc7XG4gICAgfVxuICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIG5vRmlsdGVycyB0byBzZW5kIHN1YmplY3RcbiAgICB0aGlzLm5vRmlsdGVycygpO1xuICAgIHRoaXMudXBkYXRlVGFibGUodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25Tb3J0Q2hhbmdlZChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFNvcnQodGhpcy50YWJsZUlkLCBjb2x1bW4pO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblBhZ2VDaGFuZ2VkKHBhZ2VFdmVudDogUGFnZUNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMucGFnZUluZm8gPSB7XG4gICAgICBwYWdlOiBwYWdlRXZlbnQucGFnZSxcbiAgICAgIGl0ZW1zUGVyUGFnZTogcGFnZUV2ZW50Lml0ZW1zUGVyUGFnZSxcbiAgICAgIG1heFNpemU6IHRoaXMucGFnZUluZm8ubWF4U2l6ZSxcbiAgICAgIGxlbmd0aDogdGhpcy5wYWdlSW5mby5sZW5ndGgsXG4gICAgICBudW1QYWdlczogdGhpcy5wYWdlSW5mby5udW1QYWdlc1xuICAgIH1cbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRQYWdlKHRoaXMudGFibGVJZCwgcGFnZUV2ZW50LnBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFibGUoY2xlYXJTZWxjdGVkUm93czogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5maWx0ZXJEYXRhKHRoaXMuZGF0YSk7XG4gICAgY29uc3Qgc29ydGVkRGF0YSA9IHRoaXMuc29ydERhdGEoZmlsdGVyZWREYXRhKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmNoYW5nZVBhZ2Uoc29ydGVkRGF0YSk7XG4gICAgdGhpcy5wYWdlSW5mby5sZW5ndGggPSBzb3J0ZWREYXRhLmxlbmd0aDtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChjbGVhclNlbGN0ZWRSb3dzKSB7XG4gICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoW10pO1xuICAgIH1cbiAgICB0aGlzLmRhdGFIYXNEZXRhaWxzID0gdGhpcy5jaGVja0ZvckRldGFpbHModGhpcy5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZSgpIHtcbiAgICBjb25zdCBzYXZlZFBhZ2VOdW1iZXIgPSB0aGlzLnRhYmxlU2VydmljZS5nZXRQYWdlKHRoaXMudGFibGVJZCk7XG4gICAgaWYgKHNhdmVkUGFnZU51bWJlciAmJiB0aGlzLnBhZ2VJbmZvLnBhZ2UgIT09IHNhdmVkUGFnZU51bWJlcikge1xuICAgICAgdGhpcy5wYWdlSW5mby5wYWdlID0gc2F2ZWRQYWdlTnVtYmVyO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZUluZm8ucGFnZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRGV0YWlscyhkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0RldGFpbHMgPSBmYWxzZTtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkge1xuICAgICAgZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgPT09IHRydWUgfHwgcm93LnNob3dEZXRhaWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaGFzRGV0YWlscyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxEZXRhaWxzKCkge1xuICAgIHRoaXMuc2hvd0FsbERldGFpbHMgPSAhdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVSb3dEZXRhaWwodG9nZ2xlUm93OiBPZXBhVGFibGVSb3cpIHtcbiAgICBpZiAodG9nZ2xlUm93ICYmIHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhU291cmNlID09PSB0b2dnbGVSb3cuZGF0YVNvdXJjZSkge1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gIXRvZ2dsZVJvdy5zaG93RGV0YWlsO1xuICAgICAgICAgIHRvZ2dsZVJvdy5zaG93RGV0YWlsID0gcm93LnNob3dEZXRhaWw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGlvbkNvbHVtbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGFjdGlvbkNvbHVtbiA9IGZhbHNlO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICBhY3Rpb25Db2x1bW4gPSBjb2x1bW4uYWN0aW9uQ29sdW1uIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIGlzQ29sdW1uSGlkZGVuKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5oZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgIGhpZGRlbiA9IGNvbHVtbi5oaWRkZW4gfHwgZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBoaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZGVuQ29sdW1ucygpOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5oZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBjZWxsQ2xpY2soZXZlbnQ6IFRhYmxlRGF0YUNlbGxDbGlja0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgcm93ID0gZXZlbnQucm93O1xuICAgIGNvbnN0IGNvbHVtbklkID0gZXZlbnQuY29sdW1uSUQ7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlKHJvdywgY29sdW1uSWQpO1xuICAgIHRoaXMuY2VsbENsaWNrZWQuZW1pdCh7IHJvdywgY29sdW1uSWQsIHZhbHVlIH0pO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uQ2xpY2soZXZlbnQ6IE9lcGFBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gIXRoaXMuYWxsUm93c1NlbGVjdGVkO1xuICAgIC8vIGRlc2VsZWN0IGFsbCByb3dzXG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICAvLyBzZWxlY3Qgb25seSB2aXNpYmxlIHJvd3NcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAoci5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHIuc2VsZWN0ZWQgPSB0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucm93cy5zbGljZSgpO1xuICAgIC8vIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93OiBPZXBhVGFibGVSb3cpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICByb3cuc2VsZWN0ZWQgPSAhcm93LnNlbGVjdGVkO1xuICAgIHRoaXMucm93cy5mb3JFYWNoKChkcjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnByaXZhdGVJZCA9PT0gZHIucHJpdmF0ZUlkKSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gcm93LnNlbGVjdGVkO1xuICAgICAgfVxuICAgICAgaWYgKGRyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKGRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdGhpcy51cGRhdGVUYWJsZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNpbmdsZVJvd1NlbGVjdGlvbihyb3c6IE9lcGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHJvdy5zZWxlY3RlZCA9ICFyb3cuc2VsZWN0ZWQ7XG4gICAgLy8gYWRkIHJvdyB0byBzZWxlY3RlZCByb3dzIGlmIGl0IGlzIHNlbGVjdGVkXG4gICAgaWYgKHJvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWRSb3dzLnB1c2gocm93KTtcbiAgICB9XG4gICAgLy8gdW5zZWxlY3QgYW55IG90aGVyIHJvdyB0aGF0IG1heSBiZSBzZWxlY3RlZFxuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgoZHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5wcml2YXRlSWQgPT09IGRyLnByaXZhdGVJZCkge1xuICAgICAgICBkci5zZWxlY3RlZCA9IHJvdy5zZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUm93c0ZvckV4cG9ydChyb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICByb3dzLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjZWxsczogdGhpcy5zaW1wbGlmeUNlbGxzKHJvdy5jZWxscyksXG4gICAgICAgICAgYWN0aW9uczogcm93LmFjdGlvbnMsXG4gICAgICAgICAgc2hvd0RldGFpbDogcm93LnNob3dEZXRhaWwsXG4gICAgICAgICAgc3ViVGFibGU6IHJvdy5kZXRhaWwgPyB0aGlzLmNvbnZlcnRUb1RhYmxlKHJvdy5kZXRhaWwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzRGl2aWRlcjogcm93LmlzRGl2aWRlcixcbiAgICAgICAgICBkaXZpZGVyQ2xhc3NOYW1lOiByb3cuZGl2aWRlckNsYXNzTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaW1wbGlmeUNlbGxzKGNlbGxzOiBPZXBhVGFibGVDZWxsW10pIHtcbiAgICBsZXQgc2ltcGxlQ2VsbHM6IE9lcGFUYWJsZUNlbGxbXSA9IFtdO1xuICAgIGlmIChjZWxscyAmJiBjZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICBjZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICBzaW1wbGVDZWxscy5wdXNoKHtcbiAgICAgICAgICBpZDogY2VsbC5pZCxcbiAgICAgICAgICB2YWx1ZTogY2VsbC52YWx1ZSxcbiAgICAgICAgICBoaWRlVmFsdWU6IGNlbGwuaGlkZVZhbHVlLFxuICAgICAgICAgIGljb25DbGFzc05hbWU6IGNlbGwuaWNvbkNsYXNzTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNlbGwuY2xhc3NOYW1lLFxuICAgICAgICAgIGltZ1NyYzogY2VsbC5pbWdTcmMsXG4gICAgICAgICAgaW5uZXJIVE1MOiBjZWxsLmlubmVySFRNTCxcbiAgICAgICAgICBjb2xTcGFuOiBjZWxsLmNvbFNwYW4sXG4gICAgICAgICAgZXhjZWxEYXRhRm9ybWF0OiBjZWxsLmV4Y2VsRGF0YUZvcm1hdFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlQ2VsbHM7XG4gIH1cblxuICBwdWJsaWMgZ2F0aGVyVGFibGVEYXRhKHJvd3M6IE9lcGFUYWJsZVJvd1tdKTogT2VwYVRhYmxlIHtcbiAgICAvLyB0aGlzLmR1bXBEZXRhaWxSb3dzKCk7XG4gICAgY29uc3Qgb2VwYVRhYmxlOiBPZXBhVGFibGUgPSB7fTtcbiAgICBvZXBhVGFibGUuaGVhZGVyUm93cyA9IHRoaXMuaGVhZGVyUm93cztcbiAgICBvZXBhVGFibGUuYWxsRGF0YVJvd3MgPSB0aGlzLnByZXBhcmVSb3dzRm9yRXhwb3J0KHJvd3MpO1xuICAgIG9lcGFUYWJsZS5zaG93QWxsRGV0YWlscyA9IHRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgb2VwYVRhYmxlLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWU7XG4gICAgb2VwYVRhYmxlLnZpc2libGVDb2x1bW5Db3VudCA9IHRoaXMudmlzaWJsZUNvbHVtbkNvdW50O1xuICAgIG9lcGFUYWJsZS5hbGxDb2x1bW5Db3VudCA9IHRoaXMuYWxsQ29sdW1uQ291bnQ7XG4gICAgcmV0dXJuIG9lcGFUYWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgZHVtcERldGFpbFJvd3MoKSB7XG4gICAgY29uc29sZS5sb2coJ2R1bXBEZXRhaWxSb3dzIC0gVG90YWwgcm93czogJyArIHRoaXMuX2RhdGEubGVuZ3RoKTtcbiAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnNob3dEZXRhaWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NIT1cgREVUQUlMOiAnICsgSlNPTi5zdHJpbmdpZnkocm93LmRhdGFTb3VyY2UpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0VG9UYWJsZSh0ZW1wbGF0ZTogT2VwYVRlbXBsYXRlSW5mbyk6IE9lcGFUYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG9lcGFUYWJsZTogT2VwYVRhYmxlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZS5jb21wb25lbnQgPT09IFBUYWJsZUNvbXBvbmVudCkge1xuICAgICAgY29uc3QgdGFibGU6IFBUYWJsZUNvbXBvbmVudCA9IG5ldyBQVGFibGVDb21wb25lbnQodGhpcy5zYW5pdGl6ZXIsIHRoaXMudGFibGVTZXJ2aWNlLCB0aGlzLnRhYmxlRXhwb3J0U2VydmljZSwgdGhpcy5maWxlVXRpbFNlcnZpY2UsIHRoaXMuZWxSZWYpO1xuICAgICAgaWYgKHRlbXBsYXRlLmlucHV0cyAmJiB0ZW1wbGF0ZS5pbnB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZW1wbGF0ZS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpbnB1dC5uYW1lID09PSAnY29uZmlnJykge1xuICAgICAgICAgICAgdGFibGUuY29uZmlnID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnY29tcGxleEhlYWRlcicpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbXBsZXhIZWFkZXIgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm5hbWUgPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICB0YWJsZS5oZWFkZXIgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm5hbWUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGFibGUuZGF0YSA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9lcGFUYWJsZSA9IHRhYmxlLmdhdGhlclRhYmxlRGF0YSh0YWJsZS5kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9lcGFUYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFeHBvcnRWaXNpYmxlT25seSgpIHtcbiAgICB0aGlzLmV4cG9ydFZpc2libGVPbmx5ID0gIXRoaXMuZXhwb3J0VmlzaWJsZU9ubHk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0VG9FeGNlbCgpIHtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gdGhpcy5zb3J0RGF0YSh0aGlzLl9kYXRhKTtcbiAgICBjb25zdCBleHBvcnRUYWJsZTogT2VwYVRhYmxlID0gdGhpcy5nYXRoZXJUYWJsZURhdGEodGhpcy5leHBvcnRWaXNpYmxlT25seSA/IHRoaXMucm93cyA6IHNvcnRlZERhdGEpO1xuXG4gICAgaWYgKChleHBvcnRUYWJsZS5hbGxEYXRhUm93cz8ubGVuZ3RoIHx8IDApID4gMCkge1xuICAgICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRFeGNlbChleHBvcnRUYWJsZSwgdGhpcy5fY29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWxlcnQoJ05vIGRhdGEgaW4gdGFibGUgYXZhaWxhYmxlIGZvciBleHBvcnQnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0VG9IVE1MKCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKHRoaXMuX2RhdGEpO1xuICAgIGNvbnN0IGV4cG9ydFRhYmxlOiBPZXBhVGFibGUgPSB0aGlzLmdhdGhlclRhYmxlRGF0YSh0aGlzLmV4cG9ydFZpc2libGVPbmx5ID8gdGhpcy5yb3dzIDogc29ydGVkRGF0YSk7XG5cbiAgICBpZiAoKGV4cG9ydFRhYmxlLmFsbERhdGFSb3dzPy5sZW5ndGggfHwgMCkgPiAwKSB7XG4gICAgICAvLyBmb3Igbm93LCBhbHdheXMgZW1iZWQgc3ViLXRhYmxlcyAgaW4gSFRNTCB2aWV3LlxuICAgICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRIVE1MKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAndGV4dC9odG1sJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGVydCgnTm8gZGF0YSBpbiB0YWJsZSBhdmFpbGFibGUgZm9yIGV4cG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkN1c3RvbUJ0bkNsaWNrKCkge1xuICAgIHRoaXMuY3VzdG9tQnRuQ2xpY2tlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25DdXN0b21CdG4yQ2xpY2soKSB7XG4gICAgdGhpcy5jdXN0b21CdG4yQ2xpY2tlZC5lbWl0KCk7XG4gIH1cblxufVxuIiwiPGRpdiAqbmdJZj1cIiFjb25maWcuaGlkZVRhYmxlXCI+XG4gIDxmb3JtICpuZ0lmPVwiaGlkZGVuQ29sdW1ucy5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPlNob3cgSGlkZGVuIENvbHVtbnM6PC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiAoY2hhbmdlKT1cInVuaGlkZUNvbHVtbigkYW55KCRldmVudCkudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19VbmhpZGVDb2x1bW5TZWxlY3QnXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkNob29zZSBhIGNvbHVtbjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbCBvZiBoaWRkZW5Db2x1bW5zXCIgW3ZhbHVlXT1cImNvbC5pZFwiPnt7Y29sLnRpdGxlfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuXG4gIDxkaXYgbmdDbGFzcz1cInt7Y29uZmlnLmRpdkNsYXNzTmFtZSB8fCAnJ319XCI+XG4gICAgPHAtdGFibGUgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIiBbdmFsdWVdPVwicm93c1wiIFxuICAgICAgW3Njcm9sbGFibGVdPVwiY29uZmlnLnZlcnRpY2FsU2Nyb2xsXCIgW3Njcm9sbEhlaWdodF09XCJjb25maWcuc2Nyb2xsSGVpZ2h0XCJcbiAgICAgIFt0YWJsZVN0eWxlXT1cInsnbWluLXdpZHRoJzogJzUwcmVtJ31cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZGVyUm93czsgbGV0IGhyPWluZGV4O1wiIHJvbGU9XCJyb3dcIj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJkYXRhSGFzRGV0YWlscyAmJiBociA9PT0gMFwiIFtyb3dTcGFuXT1cImhlYWRlclJvd3MubGVuZ3RoXCIgY2xhc3M9XCJkZXRhaWwtaW5kaWNhdG9yLWNvbFwiPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIDxpIChjbGljayk9XCJ0b2dnbGVBbGxEZXRhaWxzKClcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dBbGxEZXRhaWxzTGluaydcIiBjbGFzcz1cImJpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JpLWNoZXZyb24tZG93bic6IHNob3dBbGxEZXRhaWxzLCAnYmktY2hldnJvbi1yaWdodCc6ICFzaG93QWxsRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIihzaG93QWxsRGV0YWlscyA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIGFsbCByb3dzJ1wiIHBsYWNlbWVudD1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sIFtuZ0Zvck9mXT1cImhkci5jb2x1bW5zXCIgbGV0LWk9XCJpbmRleFwiPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgY29sLmZyb3plbkNvbHVtblwiIHBGcm96ZW5Db2x1bW4gbmdDbGFzcz1cInt7Y29sLmNsYXNzTmFtZSB8fCAnJ319XCJcbiAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiY29sLmNvbHNwYW4gfHwgMVwiIFtyb3dTcGFuXT1cImNvbC5yb3dzcGFuIHx8IDFcIj5cbiAgICAgICAgICAgICAgPG9lcGEtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2xcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgW2FsbFJvd3NTZWxlY3RlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtyb3dDb3VudF09XCJyb3dzLmxlbmd0aFwiIFtub0ZpbHRlcnNTdWJqZWN0XT1cIm5vRmlsdGVyc1N1YmplY3RcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZUFsbFJvd3NTZWxlY3Rpb24pPVwidG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpXCIgKG9uU29ydENoYW5nZWQpPVwib25Tb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25IaWRlQ29sdW1uKT1cImhpZGVDb2x1bW4oJGV2ZW50KVwiIChvbkZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9vZXBhLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmICFjb2wuZnJvemVuQ29sdW1uXCIgbmdDbGFzcz1cInt7Y29sLmNsYXNzTmFtZSB8fCAnJ319XCJcbiAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiY29sLmNvbHNwYW4gfHwgMVwiIFtyb3dTcGFuXT1cImNvbC5yb3dzcGFuIHx8IDFcIj5cbiAgICAgICAgICAgICAgPG9lcGEtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2xcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgW2FsbFJvd3NTZWxlY3RlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtyb3dDb3VudF09XCJyb3dzLmxlbmd0aFwiIFtub0ZpbHRlcnNTdWJqZWN0XT1cIm5vRmlsdGVyc1N1YmplY3RcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZUFsbFJvd3NTZWxlY3Rpb24pPVwidG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpXCIgKG9uU29ydENoYW5nZWQpPVwib25Tb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25IaWRlQ29sdW1uKT1cImhpZGVDb2x1bW4oJGV2ZW50KVwiIChvbkZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9vZXBhLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtcj1cInJvd0luZGV4XCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XG4gICAgICAgIDwhLS0gRGF0YSBSb3cgLS0+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgKm5nSWY9XCJkYXRhSGFzRGV0YWlsc1wiPlxuICAgICAgICAgICAgPCEtLSBEZXRhaWwgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnNob3dEZXRhaWwgPT09IHRydWUgfHwgcm93LnNob3dEZXRhaWwgPT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwicm93LmRldGFpbEljb25DbGFzc05hbWVcIiBbbmdDbGFzc109XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInRvZ2dsZVJvd0RldGFpbChyb3cpXCIgW2lkXT1cInRhYmxlSWQrJ19TaG93RGV0YWlsTGlua18nK3JcIiBjbGFzcz1cImJpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JpLWNoZXZyb24tZG93bic6IHJvdy5zaG93RGV0YWlsLCAnYmktY2hldnJvbi1yaWdodCc6ICFyb3cuc2hvd0RldGFpbH1cIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIihyb3cuc2hvd0RldGFpbCA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIHRoaXMgcm93J1wiIHBsYWNlbWVudD1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwhLS0gSWYgcm93IGlzIGEgZGl2aWRlciwgaXQgc3BhbnMgdGhlIHdob2xlIHRhYmxlIC0tPlxuICAgICAgICAgIDx0ZCAqbmdJZj1cInJvdy5pc0RpdmlkZXJcIiBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmRpdmlkZXJDbGFzc05hbWUgfHwgJ29lcGEtdGFibGUtZ3JheSdcIj4mbmJzcDs8L3RkPlxuICAgICAgICAgIDwhLS0gRGF0YSBSb3dzIC0tPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIiFyb3cuaXNEaXZpZGVyXCIgbmdGb3IgbGV0LWNvbCBbbmdGb3JPZl09XCJkYXRhQ29sdW1uc1wiIGxldC1pPVwiaW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmIChyb3d8Y2VsbENvbHNwYW46Y29sKSA+IDAgJiYhY29sLmZyb3plbkNvbHVtblwiXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsQ2xhc3NuYW1lOmNvbCB8fCAnJ319XCIgW2NvbFNwYW5dPVwicm93fGNlbGxDb2xzcGFuOmNvbFwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1kYXRhLWNlbGwgW2NvbF09XCJjb2xcIiBbaV09XCJpXCIgW3Jvd109XCJyb3dcIiBbcl09XCJyXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiXG4gICAgICAgICAgICAgICAgKG9uQWN0aW9uQ2xpY2spPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgKG9uQ2VsbENsaWNrKT1cImNlbGxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Ub2dnbGVSb3dTZWxlY3Rpb24pPVwidG9nZ2xlUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblNpbmdsZVJvd1NlbGVjdGlvbik9XCJzaW5nbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPjwvb2VwYS10YWJsZS1kYXRhLWNlbGw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgKHJvd3xjZWxsQ29sc3Bhbjpjb2wpID4gMCAmJmNvbC5mcm96ZW5Db2x1bW5cIiBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsQ2xhc3NuYW1lOmNvbCB8fCAnJ319XCIgW2NvbFNwYW5dPVwicm93fGNlbGxDb2xzcGFuOmNvbFwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1kYXRhLWNlbGwgW2NvbF09XCJjb2xcIiBbaV09XCJpXCIgW3Jvd109XCJyb3dcIiBbcl09XCJyXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiXG4gICAgICAgICAgICAgICAgKG9uQWN0aW9uQ2xpY2spPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgKG9uQ2VsbENsaWNrKT1cImNlbGxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Ub2dnbGVSb3dTZWxlY3Rpb24pPVwidG9nZ2xlUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblNpbmdsZVJvd1NlbGVjdGlvbik9XCJzaW5nbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPjwvb2VwYS10YWJsZS1kYXRhLWNlbGw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgPCEtLSBEZXRhaWwgUm93IC0tPlxuICAgICAgICA8dHIgKm5nSWY9XCJyb3cuc2hvd0RldGFpbFwiIGNsYXNzPVwidGFibGUtaW5mb1wiPlxuICAgICAgICAgIDx0ZCBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIj5cbiAgICAgICAgICAgIDxjbWwtdGVtcGxhdGUgW3RlbXBsYXRlSW5mb109XCJyb3cuZGV0YWlsXCI+PC9jbWwtdGVtcGxhdGU+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuICA8L2Rpdj5cbiAgPCEtLSBUYWJsZSBmb290ZXIgLS0+XG4gIDxmb3JtICpuZ0lmPVwiIWNvbmZpZy5oaWRlRm9vdGVyIHx8IChkYXRhICYmIHBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA8IGRhdGEubGVuZ3RoKVwiIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICA8IS0tIFRhYmxlLXdpZGUgZmlsdGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFjb25maWcuaGlkZUdsb2JhbEZpbHRlclwiIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGFsbCBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgW29lcGFUYWJsZUZpbHRlcmluZ109XCJ7IGZpbHRlclN0cmluZzogJycgfVwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgICAgICAgICh0YWJsZUNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIiBbaWRdPVwidGFibGVJZCsnX0ZpbHRlckFsbENvbHVtbnNJbnB1dCdcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuc2hvd1Jvd0NvdW50SW5Gb290ZXIgJiYgX2RhdGEgJiYgX2RhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXNlY29uZGFyeVwiPnt7X2RhdGEubGVuZ3RofX08L3NwYW4+Jm5ic3A7dG90YWwgcm93c1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBFeHBvcnQgQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiYWxsb3dFZGl0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWwgfHwgY29uZmlnLmV4cG9ydFRvSFRNTFwiIGNsYXNzPVwiYnRuLWdyb3VwXCIgZHJvcGRvd24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJleHBvcnRCdG5cIiBkcm9wZG93blRvZ2dsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tYmFzaWNcIj5cbiAgICAgICAgICAgICAgICBFeHBvcnQgPHNwYW4gY2xhc3M9XCJjYXJldFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dWwgaWQ9XCJleHBvcnQtZHJvcGRvd25cIiAqZHJvcGRvd25NZW51IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWxcIiByb2xlPVwibWVudWl0ZW1cIj48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0V4Y2VsKClcIj5FeHBvcnQgdG8gRXhjZWw8L2E+PC9saT5cbiAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImNvbmZpZy5leHBvcnRUb0hUTUxcIiByb2xlPVwibWVudWl0ZW1cIj48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0hUTUwoKVwiPkV4cG9ydFxuICAgICAgICAgICAgICAgICAgICAgIHRvIEhUTUw8L2E+PC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImN1c3RvbUJ0blZpc2libGVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7J2J0biBidG4tcHJpbWFyeSBtZS0xJyArIChzbWFsbCA/ICcgYnRuLXNtJyA6ICcnKX19XCIgKGNsaWNrKT1cIm9uQ3VzdG9tQnRuQ2xpY2soKVwiXG4gICAgICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfQ3VzdG9tQnRuJ1wiIFtkaXNhYmxlZF09XCIhY3VzdG9tQnRuRW5hYmxlZFwiPnt7Y3VzdG9tQnRuTGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImN1c3RvbUJ0blZpc2libGUyXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7eydidG4gYnRuLXByaW1hcnkgbWUtMScgKyAoc21hbGwgPyAnIGJ0bi1zbScgOiAnJyl9fVwiIChjbGljayk9XCJvbkN1c3RvbUJ0bjJDbGljaygpXCJcbiAgICAgICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkMlwiPnt7Y3VzdG9tQnRuTGFiZWwyfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhY29uZmlnLmRpc2FibGVQYWdpbmF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgICA8cGFnaW5hdGlvbiAqbmdJZj1cInBhZ2luYXRpb25PblwiIGNsYXNzPVwicGFnaW5hdGlvbi1zbVwiIFt0b3RhbEl0ZW1zXT1cInBhZ2VJbmZvLmxlbmd0aFwiXG4gICAgICAgICAgICAgIFtpdGVtc1BlclBhZ2VdPVwicGFnZUluZm8uaXRlbXNQZXJQYWdlXCIgW21heFNpemVdPVwicGFnZUluZm8ubWF4U2l6ZVwiIFsobmdNb2RlbCldPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICBuYW1lPVwiY3VycmVudFRhYmxlUGFnZVwiIFtib3VuZGFyeUxpbmtzXT1cInRydWVcIiBbcm90YXRlXT1cImZhbHNlXCIgKHBhZ2VDaGFuZ2VkKT1cIm9uUGFnZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChudW1QYWdlcyk9XCJwYWdlSW5mby5udW1QYWdlcyA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9wYWdpbmF0aW9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlUGFnaW5nYXRpb24oKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gbWUtMVwiPnt7IHBhZ2luYXRpb25PbiA/XG4gICAgICAgICAgICAgICdTaG93IEFsbCBSb3dzJyA6ICdSZXN0b3JlIFBhZ2luYXRpb24nfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbCB8fCBjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPHNwYW4+RXhwb3J0IG9ubHkgdmlzaWJsZSBkYXRhOiZuYnNwO1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJleHBvcnRWaXNpYmxlT25seVwiIChjbGljayk9XCJ0b2dnbGVFeHBvcnRWaXNpYmxlT25seSgpXCJcbiAgICAgICAgICAgIGlkPVwiZXhwb3J0VmlzaWJsZU9ubHlDaGVja2JveFwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj4iXX0=
863
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQXFCN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUy9CLE1BQU0sT0FBTyxlQUFlO0lBNkpDO0lBQ2pCO0lBQ0E7SUFDQTtJQUNBO0lBaEtILGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUEyQixFQUFFLENBQUM7SUFDeEMsSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsaUJBQWlCLEdBQXdCLEtBQUssQ0FBQztJQUMvQyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsZ0JBQWdCLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFFNUQsV0FBVyxHQUEyQixFQUFFLENBQUM7SUFDekMsY0FBYyxHQUEyQixFQUFFLENBQUM7SUFDNUMsYUFBYSxHQUEyQixFQUFFLENBQUM7SUFDM0MsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsS0FBSyxHQUF3QixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDOUIsY0FBYyxHQUEyQixDQUFDO1lBQ2hELFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxTQUFTO1NB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O3NCQUFqQixLQUFLO2dCQUVLLE1BQU07c0JBRGhCLEtBQUs7Z0JBcUJLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBY0ssTUFBTTtzQkFEaEIsS0FBSztnQkFXRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFHVyxXQUFXO3NCQUEzQixNQUFNO2dCQUNVLGFBQWE7c0JBQTdCLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1UsaUJBQWlCO3NCQUFqQyxNQUFNO2dCQW9DSSxJQUFJO3NCQURkLEtBQUs7Z0JBdUJHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBFbGVtZW50UmVmLCBBZnRlclZpZXdDaGVja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IE9lcGFUYWJsZSB9IGZyb20gJy4uL29lcGEtdGFibGUnO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vb2VwYS10YWJsZS1jb25maWcnO1xuaW1wb3J0IHsgT2VwYVRhYmxlSGVhZGVyIH0gZnJvbSAnLi4vb2VwYS10YWJsZS1oZWFkZXInO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vb2VwYS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgT2VwYVRhYmxlUm93IH0gZnJvbSAnLi4vb2VwYS10YWJsZS1yb3cnO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ2VsbCB9IGZyb20gJy4uL29lcGEtdGFibGUtY2VsbCc7XG5pbXBvcnQgeyBPZXBhVGFibGVQYWdlSW5mbyB9IGZyb20gJy4uL29lcGEtdGFibGUtcGFnZS1pbmZvJztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGxDbGlja0V2ZW50IH0gZnJvbSAnLi4vb2VwYS10YWJsZS1jZWxsLWNsaWNrLWV2ZW50JztcblxuaW1wb3J0IHsgT2VwYUFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vYWN0aW9uLWJ0bi9vZXBhLWFjdGlvbi1ldmVudCc7XG5cbmltcG9ydCB7IFRhYmxlRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL3RhYmxlLWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IE9lcGFUZW1wbGF0ZUluZm8gfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGFibGVTb3J0Q3JpdGVyaW9uIH0gZnJvbSAnLi4vb2VwYS10YWJsZS1zb3J0LWNyaXRlcmlvbic7XG5pbXBvcnQgeyBQYWdlQ2hhbmdlZEV2ZW50IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wYWdpbmF0aW9uJztcbmltcG9ydCB7IE9lcGFQQ29sdW1uIH0gZnJvbSAnLi4vb2VwYS1wLWNvbHVtbic7XG5pbXBvcnQgeyBUYWJsZURhdGFDZWxsQ2xpY2tFdmVudCB9IGZyb20gJy4uL3RhYmxlLWRhdGEtY2VsbC90YWJsZS1kYXRhLWNlbGwtY2xpY2stZXZlbnQnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT2VwYVRhYmxlRmlsdGVyIH0gZnJvbSAnLi4vb2VwYS10YWJsZS1maWx0ZXInO1xuaW1wb3J0IHsgT2VwYUZpbGVVdGlsU2VydmljZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29lcGEtcC10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcC10YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgcHVibGljIHNob3dGaWx0ZXJSb3c6IEJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4gPSBbXTtcbiAgcHVibGljIHJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgcHVibGljIHZpc2libGVDb2x1bW5Db3VudCA9IDA7XG4gIHB1YmxpYyBhbGxDb2x1bW5Db3VudCA9IDA7XG4gIHB1YmxpYyBleHBvcnRWaXNpYmxlT25seTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuICBwdWJsaWMgZXhwb3J0VW5zZWxlY3RlZFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG5vRmlsdGVyc1N1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHB1YmxpYyBkYXRhQ29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGhpZGRlbkNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGNvbHVtbkhlYWRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHVibGljIF9kYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHByaXZhdGUgX2NvbmZpZzogT2VwYVRhYmxlQ29uZmlnID0ge307XG4gIHByaXZhdGUgY3VycmVudEZpbHRlcnM6IEFycmF5PE9lcGFUYWJsZUZpbHRlcj4gPSBbe1xuICAgIGZpbHRlclN0cmluZzogJycsXG4gICAgY29sdW1uSWQ6IHVuZGVmaW5lZFxuICB9XTtcblxuICBwdWJsaWMgZGF0YUhhc0RldGFpbHMgPSBmYWxzZTtcbiAgcHVibGljIHNob3dBbGxEZXRhaWxzID0gZmFsc2U7XG5cbiAgcHVibGljIGFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBwYWdlSW5mbzogT2VwYVRhYmxlUGFnZUluZm8gPSB7XG4gICAgcGFnZTogMSxcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgIG1heFNpemU6IDUsXG4gICAgbnVtUGFnZXM6IDEsXG4gICAgbGVuZ3RoOiAwXG4gIH07XG4gIHB1YmxpYyBjdXJyZW50UGFnZSA9IDE7XG4gIHB1YmxpYyBwYWdpbmF0aW9uT24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHRhYmxlSWQgPSAnJztcbiAgQElucHV0KCkgYWxsb3dFZGl0ID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjb25maWcoY29uZjogT2VwYVRhYmxlQ29uZmlnKSB7XG4gICAgaWYgKCFjb25mLmNsYXNzTmFtZSkge1xuICAgICAgY29uZi5jbGFzc05hbWUgPSAndGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCc7XG4gICAgfVxuICAgIGlmIChjb25mLmNsYXNzTmFtZXMpIHtcbiAgICAgIGNvbmYuY2xhc3NOYW1lID0gY29uZi5jbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICB9XG4gICAgaWYgKGNvbmYucm93c1BlclBhZ2UpIHtcbiAgICAgIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlID0gY29uZi5yb3dzUGVyUGFnZTtcbiAgICB9XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9IGNvbmYuZXhwb3J0VmlzaWJsZU9ubHk7XG4gICAgdGhpcy5leHBvcnRVbnNlbGVjdGVkUm93cyA9IGNvbmYuZXhwb3J0VW5zZWxlY3RlZFJvd3MgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9lcGFUYWJsZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29tcGxleEhlYWRlcihoZHJzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+KSB7XG4gICAgdGhpcy5yZXNldEhlYWRlcnMoKTtcbiAgICBpZiAoaGRycyAmJiBoZHJzLmxlbmd0aCkge1xuICAgICAgaGRycy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgICB0aGlzLmhlYWRlclJvd3MucHVzaCh0aGlzLmV4dHJhY3RJbm5lckNvbHVtbnMoaGRyLmNvbHVtbnMpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gdGhpcy5leHRyYWN0Q29sdW1uSGVhZGVycyh0aGlzLmhlYWRlclJvd3MpO1xuICAgICAgdGhpcy5kYXRhQ29sdW1ucyA9IHRoaXMuZXh0cmFjdERhdGFDb2x1bW5zKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVIaWRkZW5Db2x1bW5zKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGVhZGVyKGhkcjogT2VwYVRhYmxlSGVhZGVyKSB7XG4gICAgdGhpcy5yZXNldEhlYWRlcnMoKTtcbiAgICBpZiAoaGRyLmNvbHVtbnMgJiYgaGRyLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5oZWFkZXJSb3dzLnB1c2godGhpcy5leHRyYWN0SW5uZXJDb2x1bW5zKGhkci5jb2x1bW5zKSk7XG4gICAgfVxuICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IHRoaXMuZXh0cmFjdENvbHVtbkhlYWRlcnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICB0aGlzLmRhdGFDb2x1bW5zID0gdGhpcy5leHRyYWN0RGF0YUNvbHVtbnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICB0aGlzLmluaXRpYWxpemVIaWRkZW5Db2x1bW5zKGZhbHNlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGN1c3RvbUJ0blZpc2libGUgPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tQnRuRW5hYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkxhYmVsMjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjdXN0b21CdG5WaXNpYmxlMiA9IGZhbHNlO1xuICBASW5wdXQoKSBjdXN0b21CdG5FbmFibGVkMiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNtYWxsID0gZmFsc2U7XG5cbiAgLy8gT3V0cHV0cyAoRXZlbnRzKVxuICBAT3V0cHV0KCkgcHVibGljIGNlbGxDbGlja2VkOiBFdmVudEVtaXR0ZXI8T2VwYVRhYmxlQ2VsbENsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGFjdGlvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxPZXBhQWN0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8QXJyYXk8T2VwYVRhYmxlUm93Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY3VzdG9tQnRuQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGN1c3RvbUJ0bjJDbGlja2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIHBDb2x1bW5zOiBPZXBhUENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZXNldEhlYWRlcnMoKSB7XG4gICAgdGhpcy5oZWFkZXJSb3dzID0gW107XG4gICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gW107XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLnBDb2x1bW5zID0gW107XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVIaWRkZW5Db2x1bW5zKGNvbXBsZXhIZWFkZXI6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCA9IDA7XG4gICAgdGhpcy5hbGxDb2x1bW5Db3VudCA9IDA7XG4gICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbHVtbi5maWVsZCA9IGNvbHVtbi5pZDtcbiAgICAgIGNvbHVtbi5oZWFkZXIgPSBjb2x1bW4udGl0bGU7XG4gICAgICBpZiAoY29tcGxleEhlYWRlciAmJiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUgfHwgY29sdW1uPy5oaWRkZW4gPT09IGZhbHNlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdkaXNhYmxpbmcgaGlkZGVuIGF0dHJpYnV0ZSBmb3IgY29sdW1uOiAnICsgY29sdW1uLmlkICtcbiAgICAgICAgICAnLiBIaWRkZW4gY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgY29tcGxleCBoZWFkZXJzICh5ZXQpLicpO1xuICAgICAgICBjb2x1bW4uaGlkZGVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICAgICAgfVxuICAgICAgdGhpcy5hbGxDb2x1bW5Db3VudCsrO1xuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhKHZhbHVlczogQXJyYXk8T2VwYVRhYmxlUm93Pikge1xuICAgIGlmICghdGhpcy5fZGF0YSB8fCB0aGlzLl9kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMudGFibGVTZXJ2aWNlLmdldERhdGEodGhpcy50YWJsZUlkKSB8fCBbXTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzW2ldLnByaXZhdGVJZCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jbGVhclBhZ2VJbmZvKHRoaXMudGFibGVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlcztcbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXREYXRhKHRoaXMudGFibGVJZCwgdGhpcy5fZGF0YSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLm1hcCh4ID0+IE9iamVjdC5hc3NpZ24oe30sIHgpKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHRvdGFsUm93OiBPZXBhVGFibGVSb3cgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICBwcml2YXRlIHRhYmxlRXhwb3J0U2VydmljZTogVGFibGVFeHBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZVV0aWxTZXJ2aWNlOiBPZXBhRmlsZVV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFnaW5hdGlvbk9uID0gIXRoaXMuX2NvbmZpZy5kaXNhYmxlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcuY2xhc3NOYW1lICE9PSAnJykge1xuICAgICAgJCgndGFibGUnKS5hZGRDbGFzcygndGFibGUgJyArIHRoaXMuY29uZmlnLmNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SW5uZXJDb2x1bW5zKGlubmVyOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+KTogT2VwYVRhYmxlSGVhZGVyIHtcbiAgICBjb25zdCBoZWFkZXI6IE9lcGFUYWJsZUhlYWRlciA9IHsgY29sdW1uczogW10gfTtcbiAgICBpbm5lci5mb3JFYWNoKCh2YWx1ZTogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBoZWFkZXIuY29sdW1ucy5maW5kKChjb2w6IE9lcGFUYWJsZUNvbHVtbikgPT4gY29sLmlkID09PSB2YWx1ZS5pZCk7XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIC8vIG92ZXJ3cml0ZSByZXBlYXRlZCBjb2x1bW5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgIGhlYWRlci5jb2x1bW5zLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RDb2x1bW5IZWFkZXJzKGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBoZWFkZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgbGV0IHJvd0luZGV4ID0gMDtcbiAgICBjb25zdCBjaGlsZENvbHVtbnM6IGFueSA9IHt9O1xuICAgIGhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goY29sdW1uLnRpdGxlKTtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMTsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBoZWFkZXJzLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uLnJvd3NwYW4pIHtcbiAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW4ucm93c3BhbiAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChjaGlsZENvbHVtbnNbY29sSW5kZXhdICYmIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPiAwKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdLS07XG4gICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJzW2NvbEluZGV4XSArPSAnICcgKyBjb2x1bW4udGl0bGU7XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDE7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBleHRyYWN0RGF0YUNvbHVtbnMoaGVhZGVyUm93czogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPik6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4ge1xuICAgIGNvbnN0IGRhdGFDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgbGV0IHJvd0luZGV4ID0gMDtcbiAgICBjb25zdCBjaGlsZENvbHVtbnM6YW55ID0ge307XG4gICAgaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgbGV0IGNvbEluZGV4ID0gMDtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChyb3dJbmRleCA9PT0gMCkge1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3BhbiAmJiBjb2x1bW4uY29sc3BhbiA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMDsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBkYXRhQ29sdW1ucy5wdXNoKHtpZDogJycsdGl0bGU6ICcnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xJbmRleCArPSAoY29sdW1uLmNvbHNwYW4gLSAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YUNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5yb3dzcGFuKSB7XG4gICAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW4ucm93c3BhbiAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChjaGlsZENvbHVtbnNbY29sSW5kZXhdICYmIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPiAwKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdLS07XG4gICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4gJiYgY29sdW1uLmNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgICBjb2xJbmRleCArPSAoY29sdW1uLmNvbHNwYW4gLSAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YUNvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgfSk7XG4gICAgICByb3dJbmRleCsrO1xuICAgIH0pO1xuICAgIHJldHVybiBkYXRhQ29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBzYW5pdGl6ZShodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRvIHNlZSBpZiBhbnkgZmlsdGVycyBhcmUgc2V0XG4gICAqL1xuICBwdWJsaWMgbm9GaWx0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBub0ZpbHRlcnMgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vRmlsdGVycyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubm9GaWx0ZXJzU3ViamVjdC5uZXh0KG5vRmlsdGVycyk7XG4gICAgcmV0dXJuIG5vRmlsdGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGZpbHRlciBzdHJpbmcgKGlmIGFueSkgYXMgYSBSZWdFeHBcbiAgICovXG4gIHByaXZhdGUgZ2V0R2xvYmFsRmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKCFmaWx0ZXIuY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gKGlmIGFueSkgYXMgYSBSZWdFeHAuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJGb3JDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIHRoZSB0YWJsZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgb3IgY29sdW1uLXNwZWNpZmljXG4gICAqIGZpbHRlcnMgc2V0IGluIHRoZSBVSS5cbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyRGF0YShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgLy8gZG9uJ3QgYXR0ZW1wdCBmaWx0ZXJpbmcgaWYgdGhlcmUgYXJlIG5vIGZpbHRlcnMgc2V0XG4gICAgaWYgKHRoaXMubm9GaWx0ZXJzKCkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBsZXQgZmlsdGVyZWREYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gZGF0YTtcbiAgICBjb25zdCB0ZW1wQXJyYXk6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICBmaWx0ZXJlZERhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGxldCBmbGFnID0gdGhpcy5maWx0ZXJCeUNvbHVtbkZpbHRlcnMocm93KTtcbiAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgIGZsYWcgPSB0aGlzLmZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdyk7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZyB8fCByb3cuaXNEaXZpZGVyKSB7XG4gICAgICAgIHRlbXBBcnJheS5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmlsdGVyZWREYXRhID0gdGVtcEFycmF5O1xuICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyBhbnkgb2YgdGhlIGNvbHVtbm4gZmlsdGVycyB0aGF0IG1heSBiZSBzZXQuXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQnlDb2x1bW5GaWx0ZXJzKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBjb25zdCByZWdFeHAgPSB0aGlzLmdldEZpbHRlckZvckNvbHVtbihjZWxsLmlkKTtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY2VsbC5maWx0ZXJWYWx1ZSB8fCBjZWxsLnZhbHVlIHx8ICcnO1xuICAgICAgaWYgKHJlZ0V4cCAmJiBmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbHRlclZhbHVlLnRvU3RyaW5nKCkubWF0Y2gocmVnRXhwKTtcbiAgICAgICAgZmxhZyA9IGZsYWcgJiYgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyB0aGUgZ2xvYmFsIGZpbHRlclxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIGNvbnN0IHJlZ0V4cCA9IHRoaXMuZ2V0R2xvYmFsRmlsdGVyKCk7XG4gICAgaWYgKHJlZ0V4cCkge1xuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBjZWxsLmZpbHRlclZhbHVlIHx8IGNlbGwudmFsdWU7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsdGVyVmFsdWUudG9TdHJpbmcoKS5tYXRjaChyZWdFeHApO1xuICAgICAgICAgIGZsYWcgPSBmbGFnIHx8IChyZXN1bHQgIT09IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICBwdWJsaWMgaGlkZUNvbHVtbihjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKG1hdGNoID0+IHtcbiAgICAgIHJldHVybiBtYXRjaC5pZCAhPT0gY29sdW1uLmlkO1xuICAgIH0pO1xuICAgIGNvbHVtbi5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50LS07XG4gIH1cblxuICBwdWJsaWMgdW5oaWRlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoaWRkZW5Db2xzOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5oaWRkZW5Db2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5pZCAhPT0gY29sdW1uSWQpIHtcbiAgICAgICAgaGlkZGVuQ29scy5wdXNoKGNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2wuaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IHZpc2libGVDb2xzOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKGRhdGFDb2x1bW4gPT4ge1xuICAgICAgbGV0IGtlZXAgPSB0cnVlO1xuICAgICAgaGlkZGVuQ29scy5mb3JFYWNoKGhpZGRlbkNvbHVtbiA9PiB7XG4gICAgICAgIGlmIChkYXRhQ29sdW1uLmlkID09PSBoaWRkZW5Db2x1bW4uaWQpIHtcbiAgICAgICAgICBrZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGtlZXApIHtcbiAgICAgICAgdmlzaWJsZUNvbHMucHVzaChkYXRhQ29sdW1uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBoaWRkZW5Db2xzO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB2aXNpYmxlQ29scztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0RGF0YShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgbGV0IHNvcnRDcml0ZXJpYTogYW55ID0gdGhpcy50YWJsZVNlcnZpY2UuZ2V0U29ydENyaXRlcmlhKHRoaXMudGFibGVJZCkgfHwgW107XG4gICAgaWYgKHNvcnRDcml0ZXJpYS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldENvbHVtblNvcnRJbmRleGVzKHNvcnRDcml0ZXJpYSk7XG5cbiAgICByZXR1cm4gZGF0YS5zb3J0KChwcmV2aW91czogT2VwYVRhYmxlUm93LCBjdXJyZW50OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGxldCBzb3J0SW5kZXggPSAwO1xuICAgICAgbGV0IHNvcnRSZXN1bHQgPSAwO1xuICAgICAgd2hpbGUgKHNvcnRJbmRleCA8IHNvcnRDcml0ZXJpYS5sZW5ndGggJiYgc29ydFJlc3VsdCA9PT0gMCkge1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMuZ2V0Um93U29ydFZhbHVlKHByZXZpb3VzLCBzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5jb2x1bW5JZCk7XG4gICAgICAgIGxldCBjdXJyID0gdGhpcy5nZXRSb3dTb3J0VmFsdWUoY3VycmVudCwgc29ydENyaXRlcmlhW3NvcnRJbmRleF0uY29sdW1uSWQpO1xuICAgICAgICBpZiAocHJldiA+IGN1cnIpIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gIChzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5zb3J0ID09PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXYgPCBjdXJyKSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9ICAoc29ydENyaXRlcmlhW3NvcnRJbmRleF0uc29ydCA9PT0gJ2FzYycgPyAtMSA6IDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHNvcnRJbmRleCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNvcnRSZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRDb2x1bW5Tb3J0SW5kZXhlcyhzb3J0Q3JpdGVyaWE6IE9lcGFUYWJsZVNvcnRDcml0ZXJpb25bXSkge1xuICAgIGlmIChzb3J0Q3JpdGVyaWEgJiYgc29ydENyaXRlcmlhLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGk9MDsgaTxzb3J0Q3JpdGVyaWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbj8uaWQgPT09IHNvcnRDcml0ZXJpYVtpXS5jb2x1bW5JZCkge1xuICAgICAgICAgICAgY29sdW1uLnNvcnRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwuXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIGNvbHVtbklkXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxWYWx1ZUhpZGRlbihyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBoaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIGhpZGRlbiA9IGNlbGwuaGlkZVZhbHVlIHx8IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBoaWRkZW47XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvdyBSZXRyaWV2ZSB0aGUgc29ydCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwgKHdpbGwgZGVmYXVsdCB0byBkaXNwbGF5IHZhbHVlIGlmIHNvcnRcbiAgICogdmFsdWUgaXMgbm90IHNwZWNpZmllZCkuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1NvcnRWYWx1ZShyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICBpZiAoY2VsbC5zb3J0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjZWxsLnNvcnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlID0gY2VsbC5zb3J0VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhZ2UoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IHRoaXMuZGF0YSk6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uT24pIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVBhZ2UoKTtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2VJbmZvLnBhZ2UgLSAxKSAqIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlID4gLTEgPyAoc3RhcnQgKyB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSkgOiBkYXRhLmxlbmd0aDtcbiAgICAvLyBub3Qgc3VyZSB3aHksIGJ1dCBtYXhTaXplIHdhcyBnZXR0aW5nIGxvc3QuIFJlc2V0IGl0IGhlcmUgdG8gcHJldmVudCB3ZWlyZG5lc3MuXG4gICAgdGhpcy5wYWdlSW5mby5tYXhTaXplID0gNTtcbiAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVQYWdpbmdhdGlvbigpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLnBhZ2luYXRpb25PbjtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2VkKGZpbHRlcjogT2VwYVRhYmxlRmlsdGVyKSB7XG4gICAgY29uc3QgbWF0Y2hGaWx0ZXIgPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZpbmQoKGYpID0+IHtcbiAgICAgIHJldHVybiBmLmNvbHVtbklkID09PSBmaWx0ZXIuY29sdW1uSWQ7XG4gICAgfSk7XG4gICAgaWYgKCFtYXRjaEZpbHRlcikge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoRmlsdGVyLmZpbHRlclN0cmluZyA9IGZpbHRlci5maWx0ZXJTdHJpbmc7XG4gICAgfVxuICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIG5vRmlsdGVycyB0byBzZW5kIHN1YmplY3RcbiAgICB0aGlzLm5vRmlsdGVycygpO1xuICAgIHRoaXMudXBkYXRlVGFibGUodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25Tb3J0Q2hhbmdlZChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFNvcnQodGhpcy50YWJsZUlkLCBjb2x1bW4pO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblBhZ2VDaGFuZ2VkKHBhZ2VFdmVudDogUGFnZUNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMucGFnZUluZm8gPSB7XG4gICAgICBwYWdlOiBwYWdlRXZlbnQucGFnZSxcbiAgICAgIGl0ZW1zUGVyUGFnZTogcGFnZUV2ZW50Lml0ZW1zUGVyUGFnZSxcbiAgICAgIG1heFNpemU6IHRoaXMucGFnZUluZm8ubWF4U2l6ZSxcbiAgICAgIGxlbmd0aDogdGhpcy5wYWdlSW5mby5sZW5ndGgsXG4gICAgICBudW1QYWdlczogdGhpcy5wYWdlSW5mby5udW1QYWdlc1xuICAgIH1cbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRQYWdlKHRoaXMudGFibGVJZCwgcGFnZUV2ZW50LnBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFibGUoY2xlYXJTZWxjdGVkUm93czogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5maWx0ZXJEYXRhKHRoaXMuZGF0YSk7XG4gICAgY29uc3Qgc29ydGVkRGF0YSA9IHRoaXMuc29ydERhdGEoZmlsdGVyZWREYXRhKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmNoYW5nZVBhZ2Uoc29ydGVkRGF0YSk7XG4gICAgdGhpcy5wYWdlSW5mby5sZW5ndGggPSBzb3J0ZWREYXRhLmxlbmd0aDtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChjbGVhclNlbGN0ZWRSb3dzKSB7XG4gICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoW10pO1xuICAgIH1cbiAgICB0aGlzLmRhdGFIYXNEZXRhaWxzID0gdGhpcy5jaGVja0ZvckRldGFpbHModGhpcy5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZSgpIHtcbiAgICBjb25zdCBzYXZlZFBhZ2VOdW1iZXIgPSB0aGlzLnRhYmxlU2VydmljZS5nZXRQYWdlKHRoaXMudGFibGVJZCk7XG4gICAgaWYgKHNhdmVkUGFnZU51bWJlciAmJiB0aGlzLnBhZ2VJbmZvLnBhZ2UgIT09IHNhdmVkUGFnZU51bWJlcikge1xuICAgICAgdGhpcy5wYWdlSW5mby5wYWdlID0gc2F2ZWRQYWdlTnVtYmVyO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZUluZm8ucGFnZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRGV0YWlscyhkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0RldGFpbHMgPSBmYWxzZTtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkge1xuICAgICAgZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgPT09IHRydWUgfHwgcm93LnNob3dEZXRhaWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaGFzRGV0YWlscyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxEZXRhaWxzKCkge1xuICAgIHRoaXMuc2hvd0FsbERldGFpbHMgPSAhdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVSb3dEZXRhaWwodG9nZ2xlUm93OiBPZXBhVGFibGVSb3cpIHtcbiAgICBpZiAodG9nZ2xlUm93ICYmIHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhU291cmNlID09PSB0b2dnbGVSb3cuZGF0YVNvdXJjZSkge1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gIXRvZ2dsZVJvdy5zaG93RGV0YWlsO1xuICAgICAgICAgIHRvZ2dsZVJvdy5zaG93RGV0YWlsID0gcm93LnNob3dEZXRhaWw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGlvbkNvbHVtbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGFjdGlvbkNvbHVtbiA9IGZhbHNlO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICBhY3Rpb25Db2x1bW4gPSBjb2x1bW4uYWN0aW9uQ29sdW1uIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIGlzQ29sdW1uSGlkZGVuKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5oZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgIGhpZGRlbiA9IGNvbHVtbi5oaWRkZW4gfHwgZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBoaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZGVuQ29sdW1ucygpOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgdGhpcy5oZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBjZWxsQ2xpY2soZXZlbnQ6IFRhYmxlRGF0YUNlbGxDbGlja0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgcm93ID0gZXZlbnQucm93O1xuICAgIGNvbnN0IGNvbHVtbklkID0gZXZlbnQuY29sdW1uSUQ7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlKHJvdywgY29sdW1uSWQpO1xuICAgIHRoaXMuY2VsbENsaWNrZWQuZW1pdCh7IHJvdywgY29sdW1uSWQsIHZhbHVlIH0pO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uQ2xpY2soZXZlbnQ6IE9lcGFBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gIXRoaXMuYWxsUm93c1NlbGVjdGVkO1xuICAgIC8vIGRlc2VsZWN0IGFsbCByb3dzXG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICAvLyBzZWxlY3Qgb25seSB2aXNpYmxlIHJvd3NcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAoci5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHIuc2VsZWN0ZWQgPSB0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucm93cy5zbGljZSgpO1xuICAgIHRoaXMuY29weVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93U2VsZWN0aW9uKHJvdzogT2VwYVRhYmxlUm93KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgcm93LnNlbGVjdGVkID0gIXJvdy5zZWxlY3RlZDtcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChkciA9PiB7XG4gICAgICBpZiAocm93LnByaXZhdGVJZCA9PT0gZHIucHJpdmF0ZUlkKSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gcm93LnNlbGVjdGVkO1xuICAgICAgfVxuICAgICAgaWYgKGRyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKGRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jb3B5U2VsZWN0aW9uU3RhdGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29weVNlbGVjdGlvblN0YXRlKCkge1xuICAgIHRoaXMucm93cy5mb3JFYWNoKChyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaChkciA9PiB7XG4gICAgICAgIGlmIChkci5wcml2YXRlSWQgPT09IHIucHJpdmF0ZUlkKSB7XG4gICAgICAgICAgZHIuc2VsZWN0ZWQgPSByLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaW5nbGVSb3dTZWxlY3Rpb24ocm93OiBPZXBhVGFibGVSb3cpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICByb3cuc2VsZWN0ZWQgPSAhcm93LnNlbGVjdGVkO1xuICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93cyBpZiBpdCBpcyBzZWxlY3RlZFxuICAgIGlmIChyb3cuc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIC8vIHVuc2VsZWN0IGFueSBvdGhlciByb3cgdGhhdCBtYXkgYmUgc2VsZWN0ZWRcbiAgICB0aGlzLl9kYXRhLmZvckVhY2goKGRyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGlmIChyb3cucHJpdmF0ZUlkID09PSBkci5wcml2YXRlSWQpIHtcbiAgICAgICAgZHIuc2VsZWN0ZWQgPSByb3cuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkci5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVJvd3NGb3JFeHBvcnQocm93czogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIC8vIHRoaXMuZHVtcERldGFpbFJvd3MoKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCkge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3MgJiYgdGhpcy5oYXNTZWxlY3RhYmxlQ29sdW1uKCkgJiYgIXJvdy5zZWxlY3RlZCkge1xuICAgICAgICAgIC8vIHNraXAgdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjZWxsczogdGhpcy5zaW1wbGlmeUNlbGxzKHJvdy5jZWxscyksXG4gICAgICAgICAgYWN0aW9uczogcm93LmFjdGlvbnMsXG4gICAgICAgICAgc2hvd0RldGFpbDogcm93LnNob3dEZXRhaWwsXG4gICAgICAgICAgc3ViVGFibGU6IHJvdy5kZXRhaWwgPyB0aGlzLmNvbnZlcnRUb1RhYmxlKHJvdy5kZXRhaWwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzRGl2aWRlcjogcm93LmlzRGl2aWRlcixcbiAgICAgICAgICBkaXZpZGVyQ2xhc3NOYW1lOiByb3cuZGl2aWRlckNsYXNzTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTZWxlY3RhYmxlQ29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNTZWxlY3RhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhQ29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbi5zZWxlY3RDb2x1bW4pIHtcbiAgICAgICAgaGFzU2VsZWN0YWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhhc1NlbGVjdGFibGU7XG4gIH1cblxuICBwcml2YXRlIHNpbXBsaWZ5Q2VsbHMoY2VsbHM6IE9lcGFUYWJsZUNlbGxbXSkge1xuICAgIGxldCBzaW1wbGVDZWxsczogT2VwYVRhYmxlQ2VsbFtdID0gW107XG4gICAgaWYgKGNlbGxzICYmIGNlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgIHNpbXBsZUNlbGxzLnB1c2goe1xuICAgICAgICAgIGlkOiBjZWxsLmlkLFxuICAgICAgICAgIHZhbHVlOiBjZWxsLnZhbHVlLFxuICAgICAgICAgIGhpZGVWYWx1ZTogY2VsbC5oaWRlVmFsdWUsXG4gICAgICAgICAgaWNvbkNsYXNzTmFtZTogY2VsbC5pY29uQ2xhc3NOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZTogY2VsbC5jbGFzc05hbWUsXG4gICAgICAgICAgaW1nU3JjOiBjZWxsLmltZ1NyYyxcbiAgICAgICAgICBpbm5lckhUTUw6IGNlbGwuaW5uZXJIVE1MLFxuICAgICAgICAgIGNvbFNwYW46IGNlbGwuY29sU3BhbixcbiAgICAgICAgICBleGNlbERhdGFGb3JtYXQ6IGNlbGwuZXhjZWxEYXRhRm9ybWF0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaW1wbGVDZWxscztcbiAgfVxuXG4gIHB1YmxpYyBnYXRoZXJUYWJsZURhdGEocm93czogT2VwYVRhYmxlUm93W10pOiBPZXBhVGFibGUge1xuICAgIC8vIHRoaXMuZHVtcERldGFpbFJvd3MoKTtcbiAgICBjb25zdCBvZXBhVGFibGU6IE9lcGFUYWJsZSA9IHt9O1xuICAgIG9lcGFUYWJsZS5oZWFkZXJSb3dzID0gdGhpcy5oZWFkZXJSb3dzO1xuICAgIG9lcGFUYWJsZS5hbGxEYXRhUm93cyA9IHRoaXMucHJlcGFyZVJvd3NGb3JFeHBvcnQocm93cyk7XG4gICAgb2VwYVRhYmxlLnNob3dBbGxEZXRhaWxzID0gdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICBvZXBhVGFibGUuY2xhc3NOYW1lID0gdGhpcy5fY29uZmlnLmNsYXNzTmFtZTtcbiAgICBvZXBhVGFibGUudmlzaWJsZUNvbHVtbkNvdW50ID0gdGhpcy52aXNpYmxlQ29sdW1uQ291bnQ7XG4gICAgb2VwYVRhYmxlLmFsbENvbHVtbkNvdW50ID0gdGhpcy5hbGxDb2x1bW5Db3VudDtcbiAgICByZXR1cm4gb2VwYVRhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBkdW1wRGV0YWlsUm93cygpIHtcbiAgICBjb25zb2xlLmxvZygnZHVtcERldGFpbFJvd3MgLSBUb3RhbCByb3dzOiAnICsgdGhpcy5fZGF0YS5sZW5ndGgpO1xuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGlmIChyb3cuc2hvd0RldGFpbCkge1xuICAgICAgICBjb25zb2xlLmxvZygnU0hPVyBERVRBSUw6ICcgKyBKU09OLnN0cmluZ2lmeShyb3cuZGF0YVNvdXJjZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRUb1RhYmxlKHRlbXBsYXRlOiBPZXBhVGVtcGxhdGVJbmZvKTogT2VwYVRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgb2VwYVRhYmxlOiBPZXBhVGFibGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRlbXBsYXRlLmNvbXBvbmVudCA9PT0gUFRhYmxlQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCB0YWJsZTogUFRhYmxlQ29tcG9uZW50ID0gbmV3IFBUYWJsZUNvbXBvbmVudCh0aGlzLnNhbml0aXplciwgdGhpcy50YWJsZVNlcnZpY2UsIHRoaXMudGFibGVFeHBvcnRTZXJ2aWNlLCB0aGlzLmZpbGVVdGlsU2VydmljZSwgdGhpcy5lbFJlZik7XG4gICAgICBpZiAodGVtcGxhdGUuaW5wdXRzICYmIHRlbXBsYXRlLmlucHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRlbXBsYXRlLmlucHV0cy5mb3JFYWNoKChpbnB1dDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGlucHV0Lm5hbWUgPT09ICdjb25maWcnKSB7XG4gICAgICAgICAgICB0YWJsZS5jb25maWcgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm5hbWUgPT09ICdjb21wbGV4SGVhZGVyJykge1xuICAgICAgICAgICAgdGFibGUuY29tcGxleEhlYWRlciA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgIHRhYmxlLmhlYWRlciA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0YWJsZS5kYXRhID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2VwYVRhYmxlID0gdGFibGUuZ2F0aGVyVGFibGVEYXRhKHRhYmxlLmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2VwYVRhYmxlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cG9ydFZpc2libGVPbmx5KCkge1xuICAgIHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPSAhdGhpcy5leHBvcnRWaXNpYmxlT25seTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFeHBvcnRVbnNlbGVjdGVkUm93cygpIHtcbiAgICB0aGlzLmV4cG9ydFVuc2VsZWN0ZWRSb3dzID0gIXRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3M7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0VG9FeGNlbCgpIHtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gdGhpcy5zb3J0RGF0YSh0aGlzLl9kYXRhKTtcbiAgICBjb25zdCBleHBvcnRUYWJsZTogT2VwYVRhYmxlID0gdGhpcy5nYXRoZXJUYWJsZURhdGEodGhpcy5leHBvcnRWaXNpYmxlT25seSA/IHRoaXMucm93cyA6IHNvcnRlZERhdGEpO1xuXG4gICAgaWYgKChleHBvcnRUYWJsZS5hbGxEYXRhUm93cz8ubGVuZ3RoIHx8IDApID4gMCkge1xuICAgICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRFeGNlbChleHBvcnRUYWJsZSwgdGhpcy5fY29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWxlcnQoJ05vIGRhdGEgaW4gdGFibGUgYXZhaWxhYmxlIGZvciBleHBvcnQnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0VG9IVE1MKCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKHRoaXMuX2RhdGEpO1xuICAgIGNvbnN0IGV4cG9ydFRhYmxlOiBPZXBhVGFibGUgPSB0aGlzLmdhdGhlclRhYmxlRGF0YSh0aGlzLmV4cG9ydFZpc2libGVPbmx5ID8gdGhpcy5yb3dzIDogc29ydGVkRGF0YSk7XG5cbiAgICBpZiAoKGV4cG9ydFRhYmxlLmFsbERhdGFSb3dzPy5sZW5ndGggfHwgMCkgPiAwKSB7XG4gICAgICAvLyBmb3Igbm93LCBhbHdheXMgZW1iZWQgc3ViLXRhYmxlcyAgaW4gSFRNTCB2aWV3LlxuICAgICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRIVE1MKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAndGV4dC9odG1sJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGVydCgnTm8gZGF0YSBpbiB0YWJsZSBhdmFpbGFibGUgZm9yIGV4cG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkN1c3RvbUJ0bkNsaWNrKCkge1xuICAgIHRoaXMuY3VzdG9tQnRuQ2xpY2tlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25DdXN0b21CdG4yQ2xpY2soKSB7XG4gICAgdGhpcy5jdXN0b21CdG4yQ2xpY2tlZC5lbWl0KCk7XG4gIH1cblxufVxuIiwiPGRpdiAqbmdJZj1cIiFjb25maWcuaGlkZVRhYmxlXCI+XG4gIDxmb3JtICpuZ0lmPVwiaGlkZGVuQ29sdW1ucy5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPlNob3cgSGlkZGVuIENvbHVtbnM6PC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiAoY2hhbmdlKT1cInVuaGlkZUNvbHVtbigkYW55KCRldmVudCkudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19VbmhpZGVDb2x1bW5TZWxlY3QnXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkNob29zZSBhIGNvbHVtbjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbCBvZiBoaWRkZW5Db2x1bW5zXCIgW3ZhbHVlXT1cImNvbC5pZFwiPnt7Y29sLnRpdGxlfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuXG4gIDxkaXYgbmdDbGFzcz1cInt7Y29uZmlnLmRpdkNsYXNzTmFtZSB8fCAnJ319XCI+XG4gICAgPHAtdGFibGUgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIiBbdmFsdWVdPVwicm93c1wiIFxuICAgICAgW3Njcm9sbGFibGVdPVwiY29uZmlnLnZlcnRpY2FsU2Nyb2xsXCIgW3Njcm9sbEhlaWdodF09XCJjb25maWcuc2Nyb2xsSGVpZ2h0XCJcbiAgICAgIFt0YWJsZVN0eWxlXT1cInsnbWluLXdpZHRoJzogJzUwcmVtJ31cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZGVyUm93czsgbGV0IGhyPWluZGV4O1wiIHJvbGU9XCJyb3dcIj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJkYXRhSGFzRGV0YWlscyAmJiBociA9PT0gMFwiIFtyb3dTcGFuXT1cImhlYWRlclJvd3MubGVuZ3RoXCIgY2xhc3M9XCJkZXRhaWwtaW5kaWNhdG9yLWNvbFwiPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIDxpIChjbGljayk9XCJ0b2dnbGVBbGxEZXRhaWxzKClcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dBbGxEZXRhaWxzTGluaydcIiBjbGFzcz1cImJpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JpLWNoZXZyb24tZG93bic6IHNob3dBbGxEZXRhaWxzLCAnYmktY2hldnJvbi1yaWdodCc6ICFzaG93QWxsRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIihzaG93QWxsRGV0YWlscyA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIGFsbCByb3dzJ1wiIHBsYWNlbWVudD1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sIFtuZ0Zvck9mXT1cImhkci5jb2x1bW5zXCIgbGV0LWk9XCJpbmRleFwiPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgY29sLmZyb3plbkNvbHVtblwiIHBGcm96ZW5Db2x1bW4gbmdDbGFzcz1cInt7Y29sLmNsYXNzTmFtZSB8fCAnJ319XCJcbiAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiY29sLmNvbHNwYW4gfHwgMVwiIFtyb3dTcGFuXT1cImNvbC5yb3dzcGFuIHx8IDFcIj5cbiAgICAgICAgICAgICAgPG9lcGEtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2xcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgW2FsbFJvd3NTZWxlY3RlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtyb3dDb3VudF09XCJyb3dzLmxlbmd0aFwiIFtub0ZpbHRlcnNTdWJqZWN0XT1cIm5vRmlsdGVyc1N1YmplY3RcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZUFsbFJvd3NTZWxlY3Rpb24pPVwidG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpXCIgKG9uU29ydENoYW5nZWQpPVwib25Tb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25IaWRlQ29sdW1uKT1cImhpZGVDb2x1bW4oJGV2ZW50KVwiIChvbkZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9vZXBhLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmICFjb2wuZnJvemVuQ29sdW1uXCIgbmdDbGFzcz1cInt7Y29sLmNsYXNzTmFtZSB8fCAnJ319XCJcbiAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiY29sLmNvbHNwYW4gfHwgMVwiIFtyb3dTcGFuXT1cImNvbC5yb3dzcGFuIHx8IDFcIj5cbiAgICAgICAgICAgICAgPG9lcGEtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2xcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgW2FsbFJvd3NTZWxlY3RlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtyb3dDb3VudF09XCJyb3dzLmxlbmd0aFwiIFtub0ZpbHRlcnNTdWJqZWN0XT1cIm5vRmlsdGVyc1N1YmplY3RcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZUFsbFJvd3NTZWxlY3Rpb24pPVwidG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpXCIgKG9uU29ydENoYW5nZWQpPVwib25Tb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25IaWRlQ29sdW1uKT1cImhpZGVDb2x1bW4oJGV2ZW50KVwiIChvbkZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9vZXBhLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtcj1cInJvd0luZGV4XCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XG4gICAgICAgIDwhLS0gRGF0YSBSb3cgLS0+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgKm5nSWY9XCJkYXRhSGFzRGV0YWlsc1wiPlxuICAgICAgICAgICAgPCEtLSBEZXRhaWwgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnNob3dEZXRhaWwgPT09IHRydWUgfHwgcm93LnNob3dEZXRhaWwgPT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwicm93LmRldGFpbEljb25DbGFzc05hbWVcIiBbbmdDbGFzc109XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInRvZ2dsZVJvd0RldGFpbChyb3cpXCIgW2lkXT1cInRhYmxlSWQrJ19TaG93RGV0YWlsTGlua18nK3JcIiBjbGFzcz1cImJpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JpLWNoZXZyb24tZG93bic6IHJvdy5zaG93RGV0YWlsLCAnYmktY2hldnJvbi1yaWdodCc6ICFyb3cuc2hvd0RldGFpbH1cIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIihyb3cuc2hvd0RldGFpbCA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIHRoaXMgcm93J1wiIHBsYWNlbWVudD1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwhLS0gSWYgcm93IGlzIGEgZGl2aWRlciwgaXQgc3BhbnMgdGhlIHdob2xlIHRhYmxlIC0tPlxuICAgICAgICAgIDx0ZCAqbmdJZj1cInJvdy5pc0RpdmlkZXJcIiBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmRpdmlkZXJDbGFzc05hbWUgfHwgJ29lcGEtdGFibGUtZ3JheSdcIj4mbmJzcDs8L3RkPlxuICAgICAgICAgIDwhLS0gRGF0YSBSb3dzIC0tPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIiFyb3cuaXNEaXZpZGVyXCIgbmdGb3IgbGV0LWNvbCBbbmdGb3JPZl09XCJkYXRhQ29sdW1uc1wiIGxldC1pPVwiaW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmIChyb3d8Y2VsbENvbHNwYW46Y29sKSA+IDAgJiYhY29sLmZyb3plbkNvbHVtblwiXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsQ2xhc3NuYW1lOmNvbCB8fCAnJ319XCIgW2NvbFNwYW5dPVwicm93fGNlbGxDb2xzcGFuOmNvbFwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1kYXRhLWNlbGwgW2NvbF09XCJjb2xcIiBbaV09XCJpXCIgW3Jvd109XCJyb3dcIiBbcl09XCJyXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiXG4gICAgICAgICAgICAgICAgKG9uQWN0aW9uQ2xpY2spPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgKG9uQ2VsbENsaWNrKT1cImNlbGxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Ub2dnbGVSb3dTZWxlY3Rpb24pPVwidG9nZ2xlUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblNpbmdsZVJvd1NlbGVjdGlvbik9XCJzaW5nbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPjwvb2VwYS10YWJsZS1kYXRhLWNlbGw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgKHJvd3xjZWxsQ29sc3Bhbjpjb2wpID4gMCAmJmNvbC5mcm96ZW5Db2x1bW5cIiBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsQ2xhc3NuYW1lOmNvbCB8fCAnJ319XCIgW2NvbFNwYW5dPVwicm93fGNlbGxDb2xzcGFuOmNvbFwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1kYXRhLWNlbGwgW2NvbF09XCJjb2xcIiBbaV09XCJpXCIgW3Jvd109XCJyb3dcIiBbcl09XCJyXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiXG4gICAgICAgICAgICAgICAgKG9uQWN0aW9uQ2xpY2spPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgKG9uQ2VsbENsaWNrKT1cImNlbGxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Ub2dnbGVSb3dTZWxlY3Rpb24pPVwidG9nZ2xlUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblNpbmdsZVJvd1NlbGVjdGlvbik9XCJzaW5nbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPjwvb2VwYS10YWJsZS1kYXRhLWNlbGw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgPCEtLSBEZXRhaWwgUm93IC0tPlxuICAgICAgICA8dHIgKm5nSWY9XCJyb3cuc2hvd0RldGFpbFwiIGNsYXNzPVwidGFibGUtaW5mb1wiPlxuICAgICAgICAgIDx0ZCBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIj5cbiAgICAgICAgICAgIDxjbWwtdGVtcGxhdGUgW3RlbXBsYXRlSW5mb109XCJyb3cuZGV0YWlsXCI+PC9jbWwtdGVtcGxhdGU+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuICA8L2Rpdj5cbiAgPCEtLSBUYWJsZSBmb290ZXIgLS0+XG4gIDxmb3JtICpuZ0lmPVwiIWNvbmZpZy5oaWRlRm9vdGVyIHx8IChkYXRhICYmIHBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA8IGRhdGEubGVuZ3RoKVwiIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICA8IS0tIFRhYmxlLXdpZGUgZmlsdGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFjb25maWcuaGlkZUdsb2JhbEZpbHRlclwiIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGFsbCBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgW29lcGFUYWJsZUZpbHRlcmluZ109XCJ7IGZpbHRlclN0cmluZzogJycgfVwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgICAgICAgICh0YWJsZUNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIiBbaWRdPVwidGFibGVJZCsnX0ZpbHRlckFsbENvbHVtbnNJbnB1dCdcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuc2hvd1Jvd0NvdW50SW5Gb290ZXIgJiYgX2RhdGEgJiYgX2RhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXNlY29uZGFyeVwiPnt7X2RhdGEubGVuZ3RofX08L3NwYW4+Jm5ic3A7dG90YWwgcm93c1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBFeHBvcnQgQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiYWxsb3dFZGl0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWwgfHwgY29uZmlnLmV4cG9ydFRvSFRNTFwiIGNsYXNzPVwiYnRuLWdyb3VwXCIgZHJvcGRvd24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJleHBvcnRCdG5cIiBkcm9wZG93blRvZ2dsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tYmFzaWNcIj5cbiAgICAgICAgICAgICAgICBFeHBvcnQgPHNwYW4gY2xhc3M9XCJjYXJldFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dWwgaWQ9XCJleHBvcnQtZHJvcGRvd25cIiAqZHJvcGRvd25NZW51IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWxcIiByb2xlPVwibWVudWl0ZW1cIj48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0V4Y2VsKClcIj5FeHBvcnQgdG8gRXhjZWw8L2E+PC9saT5cbiAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImNvbmZpZy5leHBvcnRUb0hUTUxcIiByb2xlPVwibWVudWl0ZW1cIj48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0hUTUwoKVwiPkV4cG9ydFxuICAgICAgICAgICAgICAgICAgICAgIHRvIEhUTUw8L2E+PC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImN1c3RvbUJ0blZpc2libGVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7J2J0biBidG4tcHJpbWFyeSBtZS0xJyArIChzbWFsbCA/ICcgYnRuLXNtJyA6ICcnKX19XCIgKGNsaWNrKT1cIm9uQ3VzdG9tQnRuQ2xpY2soKVwiXG4gICAgICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfQ3VzdG9tQnRuJ1wiIFtkaXNhYmxlZF09XCIhY3VzdG9tQnRuRW5hYmxlZFwiPnt7Y3VzdG9tQnRuTGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImN1c3RvbUJ0blZpc2libGUyXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7eydidG4gYnRuLXByaW1hcnkgbWUtMScgKyAoc21hbGwgPyAnIGJ0bi1zbScgOiAnJyl9fVwiIChjbGljayk9XCJvbkN1c3RvbUJ0bjJDbGljaygpXCJcbiAgICAgICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkMlwiPnt7Y3VzdG9tQnRuTGFiZWwyfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhY29uZmlnLmRpc2FibGVQYWdpbmF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgICA8cGFnaW5hdGlvbiAqbmdJZj1cInBhZ2luYXRpb25PblwiIGNsYXNzPVwicGFnaW5hdGlvbi1zbVwiIFt0b3RhbEl0ZW1zXT1cInBhZ2VJbmZvLmxlbmd0aFwiXG4gICAgICAgICAgICAgIFtpdGVtc1BlclBhZ2VdPVwicGFnZUluZm8uaXRlbXNQZXJQYWdlXCIgW21heFNpemVdPVwicGFnZUluZm8ubWF4U2l6ZVwiIFsobmdNb2RlbCldPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICBuYW1lPVwiY3VycmVudFRhYmxlUGFnZVwiIFtib3VuZGFyeUxpbmtzXT1cInRydWVcIiBbcm90YXRlXT1cImZhbHNlXCIgKHBhZ2VDaGFuZ2VkKT1cIm9uUGFnZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChudW1QYWdlcyk9XCJwYWdlSW5mby5udW1QYWdlcyA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9wYWdpbmF0aW9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlUGFnaW5nYXRpb24oKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gbWUtMVwiPnt7IHBhZ2luYXRpb25PbiA/XG4gICAgICAgICAgICAgICdTaG93IEFsbCBSb3dzJyA6ICdSZXN0b3JlIFBhZ2luYXRpb24nfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbCB8fCBjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPHNwYW4+RXhwb3J0IG9ubHkgdmlzaWJsZSBkYXRhOiZuYnNwO1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJleHBvcnRWaXNpYmxlT25seVwiIChjbGljayk9XCJ0b2dnbGVFeHBvcnRWaXNpYmxlT25seSgpXCJcbiAgICAgICAgICAgIGlkPVwiZXhwb3J0VmlzaWJsZU9ubHlDaGVja2JveFwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4+Jm5ic3A7Jm5ic3A7SW5jbHVkZSB1bnNlbGVjdGVkIHJvd3MgaW4gZXhwb3J0OiZuYnNwO1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJleHBvcnRVbnNlbGVjdGVkUm93c1wiIChjbGljayk9XCJ0b2dnbGVFeHBvcnRVbnNlbGVjdGVkUm93cygpXCJcbiAgICAgICAgICAgIGlkPVwiZXhwb3J0VW5zZWxlY3RlZFJvd3NDaGVja2JveFwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj4iXX0=