@oneteme/jquery-table 0.0.3 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -13
- package/esm2022/lib/component/slice-panel/slice-panel.component.mjs +36 -3
- package/esm2022/lib/component/table.component.mjs +9 -3
- package/fesm2022/oneteme-jquery-table.mjs +43 -4
- package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
- package/lib/component/slice-panel/slice-panel.component.d.ts +1 -0
- package/package.json +2 -2
|
@@ -753,6 +753,12 @@ export class TableComponent {
|
|
|
753
753
|
this.searchQuery = '';
|
|
754
754
|
this._columnWidths = {};
|
|
755
755
|
this._slicePanelCollapsed = false;
|
|
756
|
+
// Synchroniser l'état interne du slice-panel : si le composant est en état collapsed
|
|
757
|
+
// (l'utilisateur l'avait fermé après la sauvegarde), le rouvrir explicitement pour
|
|
758
|
+
// éviter que display:none soit retiré mais que isCollapsed interne reste à true.
|
|
759
|
+
if (this.slicePanelRef?.isCollapsed) {
|
|
760
|
+
this.slicePanelRef.togglePanel();
|
|
761
|
+
}
|
|
756
762
|
this._groupBy.reset();
|
|
757
763
|
this._groupBy.setDefaultCollapsed(false);
|
|
758
764
|
// Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)
|
|
@@ -1391,11 +1397,11 @@ export class TableComponent {
|
|
|
1391
1397
|
}
|
|
1392
1398
|
}
|
|
1393
1399
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1394
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "jquery-table", inputs: { config: "config", dataSource: "dataSource", data: "data", displayedColumns: "displayedColumns", columnsConfig: "columnsConfig", view: "view", columnLabels: "columnLabels", isLoading: "isLoading" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange" }, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], queries: [{ propertyName: "_cellDefs", predicate: JqtCellDefDirective }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableBodyScrollRef", first: true, predicate: ["tableBodyScroll"], descendants: true }, { propertyName: "slicePanelRef", first: true, predicate: SlicePanelComponent, descendants: true }, { propertyName: "viewMenuTrigger", first: true, predicate: ["viewMenuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">menu</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\">{{ filteredRowCount }}</span>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n ></mat-paginator>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i10.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: SlicePanelComponent, selector: "slice-panel", inputs: ["sliceConfigs", "columns", "data", "lazyData", "lazyStatus", "showToggle", "showCounts", "collapsedByDefault", "alwaysShow"], outputs: ["filterChange", "activeKeysChange", "dynamicSliceKeysChange", "collapsedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1400
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "jquery-table", inputs: { config: "config", dataSource: "dataSource", data: "data", displayedColumns: "displayedColumns", columnsConfig: "columnsConfig", view: "view", columnLabels: "columnLabels", isLoading: "isLoading" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange" }, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], queries: [{ propertyName: "_cellDefs", predicate: JqtCellDefDirective }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableBodyScrollRef", first: true, predicate: ["tableBodyScroll"], descendants: true }, { propertyName: "slicePanelRef", first: true, predicate: SlicePanelComponent, descendants: true }, { propertyName: "viewMenuTrigger", first: true, predicate: ["viewMenuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:85px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i10.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: SlicePanelComponent, selector: "slice-panel", inputs: ["sliceConfigs", "columns", "data", "lazyData", "lazyStatus", "showToggle", "showCounts", "collapsedByDefault", "alwaysShow"], outputs: ["filterChange", "activeKeysChange", "dynamicSliceKeysChange", "collapsedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1395
1401
|
}
|
|
1396
1402
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
|
|
1397
1403
|
type: Component,
|
|
1398
|
-
args: [{ standalone: true, selector: 'jquery-table', imports: [CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], template: "<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">menu</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\">{{ filteredRowCount }}</span>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n ></mat-paginator>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
1404
|
+
args: [{ standalone: true, selector: 'jquery-table', imports: [CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], template: "<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:85px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
1399
1405
|
}], propDecorators: { config: [{
|
|
1400
1406
|
type: Input
|
|
1401
1407
|
}], dataSource: [{
|
|
@@ -1451,4 +1457,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1451
1457
|
type: ContentChildren,
|
|
1452
1458
|
args: [JqtCellDefDirective]
|
|
1453
1459
|
}] } });
|
|
1454
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixNQUFNLEVBQUUsU0FBUyxFQUE4QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDelEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFN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RSxhQUFhLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBRSxtQkFHL0ssdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxDQUFDOzhCQUdyRSxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBT0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0gsU0FBUztzQkFEWixTQUFTO3VCQUFDLFlBQVk7Z0JBVUgsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUNZLGtCQUFrQjtzQkFBL0MsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0ksYUFBYTtzQkFBNUMsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0EsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ1UsU0FBUztzQkFBOUMsZUFBZTt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9ySW50bCwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblByb3ZpZGVyLCBUYWJsZUV4cG9ydENvbmZpZywgVGFibGVQcmVmZXJlbmNlc0NvbmZpZywgVGFibGVQcm92aWRlciwgVGFibGVWaWV3Q29uZmlnIH0gZnJvbSAnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IEpxdEkxOG4sIEpRVF9JMThOLCBKUVRfSTE4Tl9ERUZBVUxUUyB9IGZyb20gJy4uL2pxdC1pMThuLnRva2VuJztcbmltcG9ydCB7IEpxdENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmUvanF0LWNlbGwtZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTbGljZUNvbmZpZyB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwubW9kZWwnO1xuaW1wb3J0IHsgU2xpY2VQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50JztcbmltcG9ydCB7IGdldEZyZW5jaFBhZ2luYXRvckludGwsIGh1bWFuaXplS2V5LCBub3JtYWxpemVDZWxsVmFsdWUgfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7IFZpZXdGYWNhZGUgfSBmcm9tICcuL3ZpZXcvdmlldy5mYWNhZGUnO1xuaW1wb3J0IHsgTGF6eUNvbHVtbk1hbmFnZXIgfSBmcm9tICcuL2xhenktY29sdW1uLW1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfSBmcm9tICcuL3RhYmxlLXByZWZlcmVuY2VzLm1hbmFnZXInO1xuaW1wb3J0IHsgR3JvdXBCeU1hbmFnZXIgfSBmcm9tICcuL2dyb3VwLWJ5Lm1hbmFnZXInO1xuaW1wb3J0IHsgRXhwb3J0TWFuYWdlciB9IGZyb20gJy4vZXhwb3J0Lm1hbmFnZXInO1xuaW1wb3J0IHtcbiAgR1JPVVBfUk9XX0NPTFVNTiwgR1JPVVBfSEVBREVSX01BUktFUixcbiAgR1JPVVBfS0VZX0xBWllfTE9BRElORywgR1JPVVBfS0VZX1RPT19NQU5ZLFxuICBST1dfUkFXX0tFWSwgUk9XX0lOREVYX0tFWSxcbiAgUk9XX0dST1VQX0tFWSwgUk9XX0dST1VQX0NPVU5ULCBST1dfR1JPVVBfUEFHRSwgUk9XX0dST1VQX1BBR0VfQ09VTlQsXG4gIExBWllfTE9BRElOR19WQUxVRSwgTEFaWV9FUlJPUl9WQUxVRSxcbn0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuXG4vKiogQ2FjaGUgaW50ZXJuZSBkdSBncm91cGVtZW50IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgbGVzIGRvbm7DqWVzLCBsYSBjbMOpIG91IGxlcyBwYXJhbcOodHJlcyBkZSB0cmkgY2hhbmdlbnQuICovXG5pbnRlcmZhY2UgR3JvdXBCeUNhY2hlPFQ+IHtcbiAgcm93czogVFtdO1xuICBrZXk6IHN0cmluZztcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJztcbiAgc29ydEFjdGl2ZTogc3RyaW5nO1xuICBzb3J0RGlyOiBzdHJpbmc7XG4gIG9yZGVyOiBzdHJpbmdbXTtcbiAgbWFwOiBNYXA8c3RyaW5nLCBUW10+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdqcXVlcnktdGFibGUnLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdFRhYmxlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdERpdmlkZXJNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBTbGljZVBhbmVsQ29tcG9uZW50IF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsIHVzZUZhY3Rvcnk6IGdldEZyZW5jaFBhZ2luYXRvckludGwgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc/OiBUYWJsZVByb3ZpZGVyPFQ+O1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U/OiBUW10gfCB7IGRhdGE6IFRbXSB9O1xuICBASW5wdXQoKSBkYXRhPzogVFtdO1xuICBASW5wdXQoKSBkaXNwbGF5ZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGNvbHVtbnNDb25maWc/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W107XG5cbiAgLyoqXG4gICAqIE1vZGUgSFRNTCA6IGFjdGl2ZSBldCBjb25maWd1cmUgbGUgcGFubmVhdSBWaWV3IGluZMOpcGVuZGFtbWVudCBkdSBgW2NvbmZpZ11gLlxuICAgKiBQcmVuZCBsZSBkZXNzdXMgc3VyIGBjb25maWcudmlld2Agc2kgZMOpZmluaS5cbiAgICogRXhlbXBsZSA6IGA8anF1ZXJ5LXRhYmxlIFt2aWV3XT1cInsgZW5hYmxlZDogdHJ1ZSB9XCI+YFxuICAgKi9cbiAgQElucHV0KCkgdmlldz86IFRhYmxlVmlld0NvbmZpZztcblxuICBASW5wdXQoKSBjb2x1bW5MYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBASW5wdXQoKSBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgYWRkUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5SZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PigpO1xuICBAT3V0cHV0KCkgY2F0ZWdvcnlTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIHRyaSAoeSBjb21wcmlzIGxlIHRyaSBpbml0aWFsKS4gKi9cbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgICAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnJyB9PigpO1xuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgcGFnZSBvdSBkZSB0YWlsbGUgZGUgcGFnZS4gKi9cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgICAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfT4oKTtcbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIGxhIHJlY2hlcmNoZSB0ZXh0ZS4gKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSAgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIMOJbWlzIHF1YW5kIGxlIEdyb3VwIGJ5IGNoYW5nZSAoY2zDqSBkZSBjb2xvbm5lLCBvdSBgbnVsbGAgc2kgZMOpc2FjdGl2w6kpLiAqL1xuICBAT3V0cHV0KCkgZ3JvdXBCeUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcbiAgLyoqIMOJbWlzIHF1YW5kIGxhIGxpc3RlIGRlcyBjb2xvbm5lcyB2aXNpYmxlcyBjaGFuZ2UgKGNsw6lzIGRhbnMgbOKAmW9yZHJlIGTigJlhZmZpY2hhZ2UpLiAqL1xuICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXG4gIHNldCBwYWdpbmF0b3IodmFsdWU6IE1hdFBhZ2luYXRvciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5hdHRhY2hQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfVxuICBwcml2YXRlIF9wYWdpbmF0b3I/OiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydD86IE1hdFNvcnQ7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keVNjcm9sbCcpIHRhYmxlQm9keVNjcm9sbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFNsaWNlUGFuZWxDb21wb25lbnQpIHNsaWNlUGFuZWxSZWY/OiBTbGljZVBhbmVsQ29tcG9uZW50PFQ+O1xuICBAVmlld0NoaWxkKCd2aWV3TWVudVRyaWdnZXInKSB2aWV3TWVudVRyaWdnZXI/OiBNYXRNZW51VHJpZ2dlcjtcbiAgQENvbnRlbnRDaGlsZHJlbihKcXRDZWxsRGVmRGlyZWN0aXZlKSBfY2VsbERlZnMhOiBRdWVyeUxpc3Q8SnF0Q2VsbERlZkRpcmVjdGl2ZT47XG4gIC8qKiBNYXAgY2zDqeKGklRlbXBsYXRlUmVmIHByw6ktY2FsY3Vsw6llIGRlcHVpcyBfY2VsbERlZnMuIE1pc2Ugw6Agam91ciBkYW5zIG5nQWZ0ZXJDb250ZW50SW5pdCBldCBzdXIgX2NlbGxEZWZzLmNoYW5nZXMuICovXG4gIHByaXZhdGUgX2NlbGxEZWZNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9Pj4oKTtcblxuICByZW5kZXJlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG5cbiAgLyoqIENvbnN0YW50ZSBleHBvc8OpZSBhdSB0ZW1wbGF0ZSBwb3VyIGxlIG1hdENvbHVtbkRlZiBkZSBsYSBsaWduZSBkZSBncm91cGUuICovXG4gIHJlYWRvbmx5IF9HUk9VUF9ST1dfQ09MVU1OID0gR1JPVVBfUk9XX0NPTFVNTjtcbiAgLyoqIENsw6lzIGQnYWNjw6hzIGF1eCBwcm9wcmnDqXTDqXMgZGVzIGxpZ25lcyBwcm9qZXTDqWVzIOKAlCBleHBvc8OpZXMgcG91ciBsZSB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgX1JPV19SQVdfS0VZID0gUk9XX1JBV19LRVk7XG4gIHJlYWRvbmx5IF9ST1dfSU5ERVhfS0VZID0gUk9XX0lOREVYX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9LRVkgPSBST1dfR1JPVVBfS0VZO1xuICByZWFkb25seSBfUk9XX0dST1VQX0NPVU5UID0gUk9XX0dST1VQX0NPVU5UO1xuICByZWFkb25seSBfUk9XX0dST1VQX1BBR0UgPSBST1dfR1JPVVBfUEFHRTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9QQUdFX0NPVU5UID0gUk9XX0dST1VQX1BBR0VfQ09VTlQ7XG5cbiAgLyoqIEZhY2FkZSBWaWV3IDogw6l0YXQgZXQgYWN0aW9ucyBjZW50cmFsaXPDqXMgKENoYW1wcyAvIEdyb3VwIGJ5IC8gU2xpY2UgYnkpICovXG4gIHJlYWRvbmx5IF92aWV3ID0gbmV3IFZpZXdGYWNhZGU8VD4oKTtcblxuICAvKipcbiAgICogU25hcHNob3Qgc3RhYmxlIHN5bmNocm9uaXPDqSBkZXB1aXMgX3ZpZXcuZmllbGRzLmFjdGl2ZUNvbHVtbnMgZGFucyByZWZyZXNoVmlld01vZGVsKCkuXG4gICAqIFByb3ByacOpdMOpIChub24gZ2V0dGVyKSBwb3VyIHF1J0FuZ3VsYXIgcHVpc3NlIGxhIHN1aXZyZSBzYW5zIE5HMDEwMC5cbiAgICovXG4gIGFjdGl2ZUNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuXG4gIGFjdGl2ZVNsaWNlRmlsdGVyOiAocm93OiBUKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZTtcblxuICAvLyBQcm9wcmnDqXTDqXMgc3RhYmxlcyBwb3VyIGxlcyBiaW5kaW5ncyBkdSB0ZW1wbGF0ZSAoY29udHJlIGVycmV1ciBORzAxMDApXG4gIF9zbGljZUNvbmZpZ3M6IGFueVtdID0gW107XG4gIF9zbGljZUNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuICBfc2xpY2VEYXRhOiBUW10gPSBbXTtcbiAgX3NsaWNlU2hvd1RvZ2dsZSA9IHRydWU7XG4gIC8qKiBTbmFwc2hvdCBzdGFibGUgZGUgbGEgdmlzaWJpbGl0w6kgZHUgcGFubmVhdSBzbGljZSDigJQgamFtYWlzIGNhbGN1bMOpIGRlcHVpcyBAVmlld0NoaWxkICovXG4gIF9zaG93U2xpY2VQYW5lbCA9IGZhbHNlO1xuICAvKiogU25hcHNob3Qgc3RhYmxlIGRlIGwnw6l0YXQgY29sbGFwc2VkIGR1IHBhbm5lYXUgc2xpY2UsIG1pcyDDoCBqb3VyIHZpYSAoY29sbGFwc2VkQ2hhbmdlKSAqL1xuICBfc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIC8vIETDqWzDqWd1w6lzIHZlcnMgX3ZpZXcgKGNvbnNlcnbDqXMgcG91ciBjb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSBzYW5zIHJlZmFjdG9yaW5nIEhUTUwpXG4gIGdldCBfc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHsgcmV0dXJuIHRoaXMuX3ZpZXcuc3RhdGljU2xpY2VzRm9yTWVudTsgfVxuICBnZXQgX2FjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1uczsgfVxuICBnZXQgX2F2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hdmFpbGFibGVGb3JEeW5hbWljOyB9XG4gIGdldCBfYWxsRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFsbER5bmFtaWNDb2x1bW5zOyB9XG4gIGdldCBfYWN0aXZlU2xpY2VCeUxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92aWV3LnNsaWNlQnkuYWN0aXZlTGFiZWw7IH1cbiAgX3NsaWNlQnlNZW51SXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG5cbiAgc2VhcmNoUXVlcnkgPSAnJztcbiAgZ2V0IGFjdGl2ZUdyb3VwQnlLZXkoKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLl92aWV3Lmdyb3VwQnkuYWN0aXZlS2V5OyB9XG4gIF9tYXRTb3J0QWN0aXZlID0gJyc7XG4gIF9tYXRTb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnID0gJyc7XG4gIHByaXZhdGUgX2FjdGl2ZVNvcnQ6IHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnJyB9ID0geyBhY3RpdmU6ICcnLCBkaXJlY3Rpb246ICcnIH07XG4gIHByaXZhdGUgX3NvcnRTdWJzY3JpYmVkOiBNYXRTb3J0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdG90YWxGaWx0ZXJlZENvdW50ID0gMDtcblxuICAvKiogR2VzdGlvbm5haXJlIGR1IG1vZGUgR3JvdXAgQnkgKMOpdGF0IGNvbGxhcHNlZCwgcGFnaW5hdGlvbiwgdHJpIGRlcyBncm91cGVzKS4gKi9cbiAgcmVhZG9ubHkgX2dyb3VwQnkgPSBuZXcgR3JvdXBCeU1hbmFnZXIoXG4gICAgKCkgPT4geyB0aGlzLl9wcm9qZWN0Q3VycmVudFBhZ2UoKTsgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpOyB9LFxuICAgICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICApO1xuXG4gIC8qKiBEw6lsw6lndcOpcyB2ZXJzIEdyb3VwQnlNYW5hZ2VyIHBvdXIgbGEgY29tcGF0aWJpbGl0w6kgZGVzIHRlbXBsYXRlcy4gKi9cbiAgZ2V0IGdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2dyb3VwQnkuZ3JvdXBQYWdlU2l6ZTsgfVxuICBzZXQgZ3JvdXBQYWdlU2l6ZSh2OiBudW1iZXIpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdjsgfVxuICBnZXQgZ3JvdXBTb3J0T3JkZXIoKTogJ2FzYycgfCAnZGVzYycgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlcjsgfVxuICBzZXQgZ3JvdXBTb3J0T3JkZXIodjogJ2FzYycgfCAnZGVzYycpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciA9IHY7IH1cblxuICAvKiogR2VzdGlvbm5haXJlIGR1IGN5Y2xlIGRlIHZpZSBkZXMgY29sb25uZXMgbGF6eSAoZmV0Y2gsIGFubnVsYXRpb24sIHN0YXR1dHMsIGRvbm7DqWVzKS4gKi9cbiAgcHJpdmF0ZSBfbGF6eSA9IG5ldyBMYXp5Q29sdW1uTWFuYWdlcjxUPigpO1xuICAvKiogQ29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgOiByZXRvdXJuZSBsYSBtYXAgZGUgc3RhdHV0cyBsYXp5LiAqL1xuICBnZXQgX2xhenlDb2x1bW5TdGF0dXMoKSB7IHJldHVybiB0aGlzLl9sYXp5LnN0YXR1czsgfVxuICAvKiogQ29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgOiByZXRvdXJuZSBsYSBtYXAgZGUgZG9ubsOpZXMgbGF6eS4gKi9cbiAgZ2V0IF9sYXp5Q29sdW1uRGF0YSgpIHsgcmV0dXJuIHRoaXMuX2xhenkuZGF0YTsgfVxuICBwcml2YXRlIF9jZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIF9lbCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG4gIHByaXZhdGUgX25nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9pMThuUmF3ID0gaW5qZWN0KEpRVF9JMThOLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKiBMYWJlbHMgZGUgbOKAmWludGVyZmFjZS4gRnVzaW9ubsOpcyBkZXB1aXMgSlFUX0kxOE5fREVGQVVMVFMgZXQgbGUgdG9rZW4gSlFUX0kxOE4gaW5qZWN0w6kuICovXG4gIHJlYWRvbmx5IGkxOG46IEpxdEkxOG4gPSB7IC4uLkpRVF9JMThOX0RFRkFVTFRTLCAuLi4odGhpcy5faTE4blJhdyA/PyB7fSkgfTtcblxuICBpc0dyb3VwSGVhZGVyID0gKF86IG51bWJlciwgcm93OiBhbnkpOiBib29sZWFuID0+IHJvd1tHUk9VUF9IRUFERVJfTUFSS0VSXSA9PT0gdHJ1ZTtcblxuICAvKiogUmV0b3VybmUgdHJ1ZSBzaSBsYSBsaWduZSBkZSBncm91cGUgZXN0IHVuZSBsaWduZSBub3JtYWxlIChuaSBsYXp5LCBuaSB0b28tbWFueSkuICovXG4gIGlzTm9ybWFsR3JvdXBSb3cocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldICE9PSBHUk9VUF9LRVlfTEFaWV9MT0FESU5HICYmIHJvd1tST1dfR1JPVVBfS0VZXSAhPT0gR1JPVVBfS0VZX1RPT19NQU5ZO1xuICB9XG4gIGlzR3JvdXBSb3dMb2FkaW5nKHJvdzogYW55KTogYm9vbGVhbiB7IHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gPT09IEdST1VQX0tFWV9MQVpZX0xPQURJTkc7IH1cbiAgaXNHcm91cFJvd1Rvb01hbnkocm93OiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSA9PT0gR1JPVVBfS0VZX1RPT19NQU5ZOyB9XG5cbiAgLyoqIEfDqHJlIGxlIGNsaWMgc3VyIHVuZSBsaWduZSBkJ2VuLXTDqnRlIGRlIGdyb3VwZSAobm8tb3AgcG91ciBsZXMgw6l0YXRzIHNww6ljaWF1eCkuICovXG4gIG9uR3JvdXBIZWFkZXJDbGljayhyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc05vcm1hbEdyb3VwUm93KHJvdykpIHJldHVybjtcbiAgICB0aGlzLnRvZ2dsZUdyb3VwQ29sbGFwc2Uocm93W1JPV19HUk9VUF9LRVldKTtcbiAgfVxuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZXhwb3J0IENTVi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhwb3J0ID0gbmV3IEV4cG9ydE1hbmFnZXI8VD4oXG4gICAgKCkgPT4gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLFxuICAgICgpID0+IHRoaXMuYWN0aXZlQ29sdW1ucyxcbiAgICAoKSA9PiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydCxcbiAgICAoY29sLCByb3csIGlkeCkgPT4gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpLFxuICApO1xuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGVcblxuICBwYWdlU2l6ZSA9IDU7XG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcbiAgcGFnZVNpemVPcHRpb25zR3JvdXBCeTogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcblxuICBkcmFnZ2VkQ29sdW1uS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZHJhZ092ZXJDb2x1bW5LZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIOKUgOKUgCBNb2RlIMOpZGl0aW9uIChQcsOpZsOpcmVuY2VzKVxuICAvKiogVnJhaSBxdWFuZCBsZSBtb2RlIMOpZGl0aW9uIGVzdCBhY3RpZiAocmVzaXplICsgZHJhZyBjb2xvbm5lcywgaW50ZXJhY3Rpb25zIGTDqXNhY3RpdsOpZXMpLiAqL1xuICBfZWRpdE1vZGUgPSBmYWxzZTtcbiAgLyoqIExhcmdldXJzIGRlIGNvbG9ubmVzIHBlcnNvbm5hbGlzw6llcyBwYXIgbCd1dGlsaXNhdGV1ciAoY2zDqSDihpIgcHgpLiAqL1xuICBfY29sdW1uV2lkdGhzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIC8qKiBNZXNzYWdlIGRlIGZlZWRiYWNrIGFwcsOocyBzYXZlL2NsZWFyLiBgbnVsbGAgPSBwYXMgZGUgbWVzc2FnZS4gKi9cbiAgX3ByZWZlcmVuY2VzTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWcmFpIHNpIHVuZSBjb25maWd1cmF0aW9uIGVzdCBzYXV2ZWdhcmTDqWUgcG91ciBjZSB0YWJsZWF1LiAqL1xuICBfaGFzU2F2ZWRDb25maWcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJlZmVyZW5jZXNNYW5hZ2VyOiBUYWJsZVByZWZlcmVuY2VzTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKiogdHJ1ZSB1bmUgZm9pcyBxdWUgbGUgZ3JvdXAtYnkgcGFyIGTDqWZhdXQgYSDDqXTDqSBpbml0aWFsaXPDqSAow6l2aXRlIGRlIHJlY29uZmlndXJlciBHcm91cEJ5TWFuYWdlciDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBkb25uw6llcykuICovXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNpemVTdGF0ZTogeyBrZXk6IHN0cmluZzsgc3RhcnRYOiBudW1iZXI7IHN0YXJ0V2lkdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEeW5hbWljIHNsaWNlIGtleXMgw6AgcmVzdGF1cmVyIGFwcsOocyBuZ0FmdGVyVmlld0luaXQgKHNsaWNlUGFuZWxSZWYgcGFzIGVuY29yZSBkaXNwbykuICovXG4gIHByaXZhdGUgX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRmlsdHJlcyBkZSBzbGljZSDDoCByZXN0YXVyZXIgYXByw6hzIG5nQWZ0ZXJWaWV3SW5pdCAoc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvKS4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1NsaWNlRmlsdGVyczogUmVjb3JkPG51bWJlciwgc3RyaW5nW10+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZXNvbHZlZENvbmZpZzogVGFibGVQcm92aWRlcjxUPiA9IHsgY29sdW1uczogW10gfTtcbiAgcHJpdmF0ZSBfY29sdW1uTWFwOiBNYXA8c3RyaW5nLCBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfcmVzb2x2ZWREYXRhOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSBfcHJlc2VydmVQYWdlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pbml0aWFsU2VhcmNoQXBwbGllZCA9IGZhbHNlO1xuXG4gIC8vIFNldWlsIGF1LWRlbMOgIGR1cXVlbCBsZSByZW5kdSBncm91cMOpIGVzdCBibG9xdcOpIHBvdXIgcHJvdMOpZ2VyIGxlIG5hdmlnYXRldXJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0dST1VQX0NPVU5UID0gNTAwO1xuXG4gIC8vIOKUgOKUgCBPcHRpbWlzYXRpb24gcGVyZm9ybWFuY2VcbiAgcHJpdmF0ZSBfYWxsRmlsdGVyZWRSb3dzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSBfcGFnaW5hdG9yU3Vic2NyaWJlZDogTWF0UGFnaW5hdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIENhY2hlIGdyb3VwQnkg4oCUIGludmFsaWTDqSBkw6hzIHF1ZSByb3dzL2tleS90cmkgY2hhbmdlbnQuICovXG4gIHByaXZhdGUgX2dyb3VwQ2FjaGU6IEdyb3VwQnlDYWNoZTxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wZW5kaW5nUmVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jb25maWdIaWRkZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblxuICAvKiogQ2zDqXMgZGVzIGNvbG9ubmVzIHZpc2libGVzIGR1IGRlcm5pZXIgw6ltaXNzaW9uIGNvbHVtbnNDaGFuZ2UgKHBvdXIgw6l2aXRlciBsZXMgw6ltaXNzaW9ucyBkdXBsaXF1ZW1lbnQpLiAqL1xuICBwcml2YXRlIF9wcmV2Q29sdW1uS2V5czogc3RyaW5nW10gPSBbXTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YUNoYW5nZWQgPSAhIShjaGFuZ2VzWydjb25maWcnXSB8fCBjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snZGF0YVNvdXJjZSddKTtcbiAgICBpZiAoZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2xhenkuY2FuY2VsQWxsKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiAhdGhpcy5faW5pdGlhbFNlYXJjaEFwcGxpZWQpIHtcbiAgICAgIGNvbnN0IGluaXRpYWwgPSB0aGlzLmNvbmZpZz8uc2VhcmNoPy5pbml0aWFsUXVlcnk7XG4gICAgICBpZiAoaW5pdGlhbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBpbml0aWFsO1xuICAgICAgICB0aGlzLl9pbml0aWFsU2VhcmNoQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLmZpbHRlcihjID0+IGMubGF6eSkuZm9yRWFjaChjID0+IHRoaXMudHJpZ2dlckxhenlGZXRjaChjKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlYnVpbGRDZWxsRGVmTWFwKCk7XG4gICAgdGhpcy5fY2VsbERlZnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWJ1aWxkQ2VsbERlZk1hcCgpO1xuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgdGhpcy5hdHRhY2hTb3J0KCk7XG4gICAgdGhpcy5fbWVhc3VyZUhlYWRlckhlaWdodCgpO1xuICAgIHRoaXMuX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGVuZGluZ0R5bmFtaWMgPSAhIXRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdGaWx0ZXJzID0gISF0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgIGlmICghaGFzUGVuZGluZ0R5bmFtaWMgJiYgIWhhc1BlbmRpbmdGaWx0ZXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgIGNvbnN0IGtleXMgPSBoYXNQZW5kaW5nRHluYW1pYyA/IFsuLi50aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyFdIDogW107XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPyB7IC4uLnRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgfSA6IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuXG4gICAgLy8gVG91dCBlc3QgZGlmZsOpcsOpIGRhbnMgbGUgbcOqbWUgc2V0VGltZW91dCBwb3VyIDpcbiAgICAvLyAxLiDDiXZpdGVyIE5HMDEwMCAobW9kaWZpY2F0aW9ucyBhcHLDqHMgdsOpcmlmaWNhdGlvbiBkYW5zIG5nQWZ0ZXJWaWV3SW5pdClcbiAgICAvLyAyLiBHYXJhbnRpciBxdWUgbGVzIGR5bmFtaWMgc2xpY2VzIHNvbnQgYWpvdXTDqWVzIEFWQU5UIGxhIHJlc3RhdXJhdGlvbiBkZXMgZmlsdHJlc1xuICAgIC8vICAgIChsZXMgaW5kaWNlcyBkYW5zIHNsaWNlRmlsdGVycyBkw6lwZW5kZW50IGRlIGwnb3JkcmUgZmluYWwgZGUgX2NhY2hlZFNsaWNlcylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBjb2wgPSBhbGxDb2xzLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKGNvbCkgdGhpcy5hZGREeW5hbWljU2xpY2UoY29sKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2VQYW5lbFJlZikge1xuICAgICAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZi5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzbGljZVBhbmVsUmVmIHRvdWpvdXJzIG51bGwgKGRvbm7DqWVzIHBhcyBlbmNvcmUgYXJyaXbDqWVzKSA6XG4gICAgICAgICAgLy8gcmVtZXR0cmUgZW4gYXR0ZW50ZSBwb3VyIHF1ZSBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwgbGVzIGFwcGxpcXVlXG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyKTtcbiAgICB9XG4gICAgLy8gTmV0dG9pZSB1biDDqXZlbnR1ZWwgcmVzaXplIGVuIGNvdXJzIChsaXN0ZW5lcnMgd2luZG93IG5vbiByZXRpcsOpcylcbiAgICB0aGlzLl9yZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdmlldy5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9tZWFzdXJlSGVhZGVySGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1lYXN1cmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyLm1hdC1tZGMtaGVhZGVyLXJvdycpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKGhlYWRlclJvdykge1xuICAgICAgICBjb25zdCBoID0gaGVhZGVyUm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgaWYgKGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY3R1YWwtaGVhZGVyLWhlaWdodCcsIGggKyAncHgnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhlYWRlciBwYXMgZW5jb3JlIHJlbmR1IChleDogbGF6eSBBbmd1bGFyIE1hdGVyaWFsKSwgb24gcsOpZXNzYWllIGFwcsOocyBsZSBwcm9jaGFpbiBmcmFtZVxuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBtZWFzdXJlKCkpKTtcbiAgICB9O1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbWVhc3VyZSgpKSk7XG4gIH1cblxuICAvLyDilIDilIAgR2V0dGVycyBkJ2FmZmljaGFnZVxuXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlID8/ICcnO1xuICB9XG5cbiAgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ29sdW1ucztcbiAgfVxuXG4gIGdldCBzaG93U2VhcmNoQmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LmVuYWJsZWQgPT09IHRydWU7IH1cbiAgZ2V0IHNob3dWaWV3QnV0dG9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlldy5lbmFibGVkIHx8IHRoaXMuc2hvd0V4cG9ydEJ1dHRvbiB8fCB0aGlzLnNob3dQcmVmZXJlbmNlc01lbnU7IH1cbiAgZ2V0IHNob3dTbGljZUV4cGFuZEJ0bigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgJiYgdGhpcy5fc2xpY2VTaG93VG9nZ2xlOyB9XG4gIGdldCBzaG93RXhwb3J0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydD8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuICBnZXQgc2hvd1ByZWZlcmVuY2VzTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5wcmVmZXJlbmNlcz8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuICBnZXQgaGFzU2F2ZWRQcmVmZXJlbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hhc1NhdmVkQ29uZmlnOyB9XG5cbiAgZ2V0IHNob3dUb29sYmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93U2VhcmNoQmFyIHx8IHRoaXMuc2hvd1ZpZXdCdXR0b24gfHwgdGhpcy5zaG93U2xpY2VFeHBhbmRCdG47IH1cblxuICBleHBhbmRTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8udG9nZ2xlUGFuZWwoKTtcbiAgfVxuICBnZXQgc2hvd0ZpZWxkcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2hvd0ZpZWxkczsgfVxuICBnZXQgc2hvd0dyb3VwQnlTZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlldy5zaG93R3JvdXBCeVNlY3Rpb247IH1cblxuICBnZXQgZmlsdGVyZWRSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPyB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUdyb3VwQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5hY3RpdmVHcm91cEJ5TGFiZWw7IH1cblxuICBnZXQgdG90YWxDb2x1bW5Db3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdmlldy50b3RhbENvbHVtbkNvdW50OyB9XG5cbiAgZ2V0IGFjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUxhYmVsOyB9XG5cbiAgZ2V0IGFjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1uczsgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXkpO1xuICB9XG5cbiAgZ2V0IGdyb3VwQnlDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl92aWV3Lmdyb3VwQnlDb2x1bW5zOyB9XG5cbiAgY29sTGFiZWwoY29sOiB7IGtleTogc3RyaW5nOyBoZWFkZXI/OiBzdHJpbmcgfSk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92aWV3LmNvbExhYmVsKGNvbCk7IH1cblxuICAvLyDilIDilIAgQWN0aW9ucyB1dGlsaXNhdGV1clxuXG4gIG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFF1ZXJ5KTtcbiAgfVxuXG4gIG9uR3JvdXBCeUNoYW5nZShrZXk6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3LnNldEdyb3VwQnkoa2V5KTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoa2V5ICE9PSBudWxsKTtcbiAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5ncm91cEJ5Q2hhbmdlLmVtaXQoa2V5KTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0aGlzLnZpZXdNZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2xEZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9LCAwKSk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkub25Hcm91cFBhZ2VTaXplQ2hhbmdlKE51bWJlcihzaXplKSk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwU29ydFRvZ2dsZShkaXIsIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgTGF6eSBsb2FkaW5nXG5cbiAgZ2V0TGF6eUNvbHVtblN0YXR1cyhrZXk6IHN0cmluZyk6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhenkuZ2V0U3RhdHVzKGtleSk7XG4gIH1cblxuICBnZXRMYXp5UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIHJldHVybiB0aGlzLl9sYXp5LmdldFJlbmRlclR5cGUocm93VmFsdWUpO1xuICB9XG5cbiAgcmV0cnlMYXp5Q29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkucmV0cnkoY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICB0cmlnZ2VyTGF6eUZldGNoKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkuZmV0Y2goY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICBwcml2YXRlIF9sYXp5Q2FsbGJhY2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvblJlZnJlc2g6ICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICAgICAgb25NYXJrRm9yQ2hlY2s6ICgpID0+IHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIEdyb3VwZW1lbnRcblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5LnRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXksIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0cltkYXRhLWdyb3VwLWtleT1cIiR7Q1NTLmVzY2FwZShncm91cEtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUZsb2F0KFxuICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLWFjdHVhbC1oZWFkZXItaGVpZ2h0JykgfHwgJzU2J1xuICAgICkgfHwgNTY7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByb3dSZWN0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGN1cnJlbnRTY3JvbGxUb3AgKyAocm93UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCkgLSBoZWFkZXJIZWlnaHQ7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHsgdG9wOiB0YXJnZXRTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEJ5LmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXkpO1xuICB9XG5cbiAgZ3JvdXBQYWdlQmFjayhncm91cEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VCYWNrKGdyb3VwS2V5KTtcbiAgfVxuXG4gIGdyb3VwUGFnZUZvcndhcmQoZ3JvdXBLZXk6IHN0cmluZywgdG90YWxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5LCB0b3RhbENvdW50KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb2xvbm5lc1xuXG4gIGdldCBoYXNBZGRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnMubGVuZ3RoID4gMCB8fCB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBtZW51QmFzZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnM7XG4gIH1cblxuICBnZXQgbWVudU9wdGlvbmFsQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ29sdW1uc1RvQWRkKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IG5ldyBTZXQodGhpcy5hY3RpdmVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KSk7XG4gICAgcmV0dXJuICh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4gYy5vcHRpb25hbCAmJiAhYWN0aXZlS2V5cy5oYXMoYy5rZXkpKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NvbHVtblJlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuYWxsb3dDb2x1bW5SZW1vdmFsO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNsaWNlc1xuXG4gIGdldCBoYXNTbGljZUNvbmZpZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dTbGljZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgfVxuXG4gIG9uU2xpY2VQYW5lbENvbGxhcHNlZENoYW5nZShjb2xsYXBzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0NmZyA9IHRoaXMuX3NsaWNlQ29uZmlncy5sZW5ndGggPiAwIHx8IHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHdhc1Zpc2libGUgPSB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgICB0aGlzLl9zaG93U2xpY2VQYW5lbCA9IGhhc0NmZyAmJiB0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID4gMDtcbiAgICAvLyBMZSBTbGljZVBhbmVsQ29tcG9uZW50IHZpZW50IGQnw6p0cmUgcmVuZHUgcG91ciBsYSAxw6hyZSBmb2lzXG4gICAgLy8gKGRvbm7DqWVzIGFycml2w6llcykg4oaSIGFwcGxpcXVlciBsZXMgZmlsdHJlcyBlbiBhdHRlbnRlXG4gICAgaWYgKCF3YXNWaXNpYmxlICYmIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dBZGRTbGljZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zaG93U2xpY2VCeVNlY3Rpb247XG4gIH1cblxuICBnZXQgc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zdGF0aWNTbGljZXNGb3JNZW51O1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhjb2x1bW5LZXkpO1xuICB9XG5cbiAgdG9nZ2xlU3RhdGljU2xpY2UoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSBuZXh0LmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgIGVsc2UgbmV4dC5hZGQoY29sdW1uS2V5KTtcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXh0O1xuICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICAvLyBTaSB1bmUgc2xpY2UgdmllbnQgZCfDqnRyZSBjYWNow6llLCByw6lpbml0aWFsaXNlIGxlIGZpbHRyZSBhY3RpZiBwb3VyIMOpdml0ZXJcbiAgICAvLyB1biBmaWx0cmUgb3JwaGVsaW4gKGxhIHNsaWNlIG4nZXN0IHBsdXMgdmlzaWJsZSBtYWlzIHNvbiBmaWx0cmUgcmVzdGVyYWl0IGFjdGlmKVxuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTtcbiAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZER5bmFtaWNTbGljZShjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUGFuZWxSZWY/LmFkZER5bmFtaWNTbGljZShjb2x1bW4pO1xuICAgIGlmIChjb2x1bW4ubGF6eSAmJiB0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChjb2x1bW4ua2V5KSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnM7XG4gIH1cblxuICBpc0R5bmFtaWNTbGljZUFjdGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3LmlzRHluYW1pY1NsaWNlQWN0aXZlKGtleSk7XG4gIH1cblxuICB0b2dnbGVEeW5hbWljU2xpY2UoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEeW5hbWljU2xpY2VBY3RpdmUoY29sLmtleSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgfVxuICB9XG5cbiAgb25TbGljZUZpbHRlckNoYW5nZShwcmVkOiAocm93OiBUKSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTbGljZUZpbHRlciA9IHByZWQ7XG4gICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgfVxuXG4gIG9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZShrZXlzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXcub25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXMpO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGVtcHR5U3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8uZW1wdHkgfHwgdGhpcy5pMThuLmVtcHR5U3RhdGU7XG4gIH1cblxuICBnZXQgbG9hZGluZ1N0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5sYWJlbHM/LmxvYWRpbmcgfHwgdGhpcy5pMThuLmxvYWRpbmdTdGF0ZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gX3BlbmRpbmdSZW5kZXIgOiBsZSByZW5kdSBpbnRlcm5lIG4nZXN0IHBhcyBlbmNvcmUgdGVybWluw6kg4oaSIHBhcyBkZSBtZXNzYWdlIHZpZGUgcHLDqW1hdHVyw6lcbiAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nICYmIHRoaXMuX3BlbmRpbmdSZW5kZXIgPT09IG51bGwgJiYgdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG93UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5ICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQ7XG4gIH1cblxuICBnZXQgdG90YWxSb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXBCeUtleVxuICAgICAgPyB0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhLmZpbHRlcigocikgPT4gIXJbR1JPVVBfSEVBREVSX01BUktFUl0pLmxlbmd0aFxuICAgICAgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIEdlc3Rpb24gZGVzIGNvbG9ubmVzXG5cbiAgb25BZGRDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fdmlldy5hZGRDb2x1bW4oY29sdW1uKTtcbiAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gbnVsbDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcblxuICAgIGlmIChjb2x1bW4ubGF6eSkge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRSZXF1ZXN0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY29sdW1uQWRkZWQuZW1pdChjb2x1bW4pO1xuICB9XG5cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuX3ZpZXcuaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5rZXkpO1xuXG4gICAgaWYgKGNoZWNrZWQgJiYgIWlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5vbkFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tlZCAmJiBpc1Zpc2libGUpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl92aWV3LnJlbW92ZUNvbHVtbihjb2x1bW4ua2V5KTtcbiAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IG51bGw7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICAgIHRoaXMuY29sdW1uUmVtb3ZlZC5lbWl0KGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ29sdW1ucy5zb21lKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICBvblJlbW92ZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdGl2ZUNvbHVtbnMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3ZpZXcucmVtb3ZlQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm47XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5jb2x1bW5SZW1vdmVkLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWduZXNcblxuICBwcml2YXRlIF9yZWJ1aWxkQ2VsbERlZk1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jZWxsRGVmTWFwID0gbmV3IE1hcChcbiAgICAgICh0aGlzLl9jZWxsRGVmcyA/PyBbXSkubWFwKGQgPT4gW2QuY29sdW1uS2V5LCBkLnRlbXBsYXRlXSBhcyBbc3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+XSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGtleTogc3RyaW5nKTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jZWxsRGVmTWFwLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tQ2VsbERlZnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxEZWZNYXAuc2l6ZSA+IDA7XG4gIH1cblxuICBnZXQgaGFzUm93Q2xpY2tIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkLm9ic2VydmVkIHx8ICEhdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkO1xuICB9XG5cbiAgLyoqIExhcmdldXIgbWluaW1hbGUgZHUgdGFibGVhdSBlbiBweCwgY2FsY3Vsw6llIGRlcHVpcyBsZXMgbGFyZ2V1cnMgZXhwbGljaXRlcyBkZXMgY29sb25uZXMgYWN0aXZlcy5cbiAgICogUmV0b3VybmUgbnVsbCBzaSBhdWN1bmUgY29sb25uZSBuJ2EgZGUgbGFyZ2V1ciBkw6lmaW5pZSAobGUgdGFibGVhdSByZW1wbGl0IGFsb3JzIDEwMCUgZHUgY29udGVuZXVyKS5cbiAgICogU2V1bGVzIGxlcyB2YWxldXJzIGV4cGxpY2l0ZW1lbnQgZW4gYHB4YCBzb250IHNvbW1hYmxlcyA7IGxlcyBwb3VyY2VudGFnZXMgb3UgYXV0cmVzIHVuaXTDqXMgc29udCBpZ25vcsOpcy4gKi9cbiAgZ2V0IHRhYmxlTWluV2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGFzUmVzaXplZCA9IE9iamVjdC5rZXlzKHRoaXMuX2NvbHVtbldpZHRocykubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNTb21lRXhwbGljaXRXaWR0aCA9IGhhc1Jlc2l6ZWQgfHwgdGhpcy5hY3RpdmVDb2x1bW5zLnNvbWUoYyA9PiBjLndpZHRoKTtcbiAgICBpZiAoIWhhc1NvbWVFeHBsaWNpdFdpZHRoKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmFjdGl2ZUNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLl9jb2x1bW5XaWR0aHNbY29sLmtleV0gIT0gbnVsbCkge1xuICAgICAgICBzdW0gKz0gdGhpcy5fY29sdW1uV2lkdGhzW2NvbC5rZXldO1xuICAgICAgfSBlbHNlIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgY29uc3QgaXNQeCA9IGNvbC53aWR0aC50cmltKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgncHgnKTtcbiAgICAgICAgY29uc3QgcHggPSBOdW1iZXIucGFyc2VGbG9hdChjb2wud2lkdGgpO1xuICAgICAgICBpZiAoaXNQeCAmJiAhTnVtYmVyLmlzTmFOKHB4KSkgeyBzdW0gKz0gcHg7IH1cbiAgICAgICAgZWxzZSB7IHN1bSArPSAxNTA7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1bSArPSAxMjA7IC8vIGxhcmdldXIgbWluaW1hbGUgZXN0aW3DqWUgcG91ciB1bmUgY29sb25uZSBzYW5zIGxhcmdldXIgZXhwbGljaXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdW0gKyAncHgnO1xuICB9XG5cbiAgdHJhY2tSb3dGbiA9IChfaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnkgPT5cbiAgICByb3dbR1JPVVBfSEVBREVSX01BUktFUl0gPyBgX19ncm91cF8ke3Jvd1tST1dfR1JPVVBfS0VZXX1gIDogcm93W1JPV19JTkRFWF9LRVldID8/IF9pbmRleDtcblxuICBnZXRSb3dDbGFzcyhyb3c6IGFueSk6IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5yZXNvbHZlZENvbmZpZy5yb3dDbGFzcztcbiAgICBpZiAoIWZuIHx8IHJvdz8uW0dST1VQX0hFQURFUl9NQVJLRVJdKSByZXR1cm4ge307XG4gICAgcmV0dXJuIGZuKHJvd1tST1dfUkFXX0tFWV0gPz8gcm93LCByb3dbUk9XX0lOREVYX0tFWV0gPz8gMCk7XG4gIH1cblxuICBvblJvd0NsaWNrKHJvdzogYW55LCBldmVudDogTW91c2VFdmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocm93Py5bR1JPVVBfSEVBREVSX01BUktFUl0pIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaGFzUm93Q2xpY2tIYW5kbGVyKSByZXR1cm47XG4gICAgY29uc3QgcmVzb2x2ZWQgPSAocm93Py5bUk9XX1JBV19LRVldID8/IHJvdykgYXMgVDtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnLm9uUm93U2VsZWN0ZWQ/LihyZXNvbHZlZCwgZXZlbnQpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyZXNvbHZlZCk7XG4gIH1cblxuICAvLyDilIDilIAgRHJhZyAmIGRyb3BcblxuICBvbkhlYWRlckRyYWdTdGFydChjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBjb2x1bW5LZXk7XG4gICAgdGhpcy5kcmFnT3ZlckNvbHVtbktleSA9IG51bGw7XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsIGNvbHVtbktleSk7XG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJEcmFnT3Zlcihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICgoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB8fCAhdGhpcy5kcmFnZ2VkQ29sdW1uS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gY29sdW1uS2V5O1xuICB9XG5cbiAgb25IZWFkZXJEcm9wKHRhcmdldENvbHVtbktleTogc3RyaW5nLCBldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHx8ICF0aGlzLmRyYWdnZWRDb2x1bW5LZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgbW92ZWQgPSB0aGlzLl92aWV3LnJlb3JkZXJDb2x1bW5zKHRoaXMuZHJhZ2dlZENvbHVtbktleSwgdGFyZ2V0Q29sdW1uS2V5KTtcbiAgICBpZiAoIW1vdmVkKSB7XG4gICAgICB0aGlzLm9uSGVhZGVyRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMub25IZWFkZXJEcmFnRW5kKCk7XG4gIH1cblxuICBvbkhlYWRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gbnVsbDtcbiAgfVxuXG4gIGlzSGVhZGVyRHJvcFRhcmdldChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZHJhZ2dlZENvbHVtbktleSAmJiB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID09PSBjb2x1bW5LZXkgJiYgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBjb2x1bW5LZXk7XG4gIH1cblxuICAvLyDilIDilIAgUHLDqWbDqXJlbmNlcyA6IG1vZGUgw6lkaXRpb25cblxuICBlbnRlckVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBEw6ltYXJyZSBsZSByZXNpemUgZCd1bmUgY29sb25uZSAobW91c2Vkb3duIHN1ciBsYSBwb2lnbsOpZSBkcm9pdGUpLiAqL1xuICBvblJlc2l6ZVN0YXJ0KGNvbHVtbktleTogc3RyaW5nLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZWRpdE1vZGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGggPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCd0aCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBzY3JvbGxFbCA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChzY3JvbGxFbCkge1xuICAgICAgY29uc3QgYWxsVGggPSBzY3JvbGxFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGgubWF0LW1kYy1oZWFkZXItY2VsbCcpO1xuICAgICAgYWxsVGguZm9yRWFjaCh0aEVsID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1jb2x1bW4taGVhZGVyJykgfHwgdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1zb3J0LWhlYWRlcicpIHx8ICcnO1xuICAgICAgICBjb25zdCBjb2xDbGFzcyA9IEFycmF5LmZyb20odGhFbC5jbGFzc0xpc3QpLmZpbmQoYyA9PiBjLnN0YXJ0c1dpdGgoJ21hdC1jb2x1bW4tJykpO1xuICAgICAgICBjb25zdCBjb2xLZXkgPSBjb2xDbGFzcyA/IGNvbENsYXNzLnJlcGxhY2UoJ21hdC1jb2x1bW4tJywgJycpIDogbnVsbDtcbiAgICAgICAgaWYgKGNvbEtleSAmJiB0aGlzLl9jb2x1bW5XaWR0aHNbY29sS2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhzID0geyAuLi50aGlzLl9jb2x1bW5XaWR0aHMsIFtjb2xLZXldOiB0aEVsLm9mZnNldFdpZHRoIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc2l6ZVN0YXRlID0geyBrZXk6IGNvbHVtbktleSwgc3RhcnRYOiBldmVudC5jbGllbnRYLCBzdGFydFdpZHRoOiB0aC5vZmZzZXRXaWR0aCB9O1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5fcmVzaXplU3RhdGUpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0gZS5jbGllbnRYIC0gdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRYO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg2MCwgdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRXaWR0aCArIGRlbHRhKTtcbiAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzLCBbdGhpcy5fcmVzaXplU3RhdGUua2V5XTogbmV3V2lkdGggfTtcbiAgICAgIC8vIGRldGVjdENoYW5nZXMoKSBwb3VyIGZvcmNlciBsYSBtaXNlIMOgIGpvdXIgaW1tw6lkaWF0ZSBlbiBtb2RlIE9uUHVzaFxuICAgICAgLy8gKGxlcyBsaXN0ZW5lcnMgd2luZG93IHRvdXJuZW50IGhvcnMgem9uZSBBbmd1bGFyIGF2ZWMgcnVuT3V0c2lkZUFuZ3VsYXIpXG4gICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblVwID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmVzaXplU3RhdGUgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG5cbiAgICAvLyBMaXN0ZW5lcnMgaG9ycyB6b25lIEFuZ3VsYXIgcG91ciDDqXZpdGVyIGRlcyBjeWNsZXMgQ0Qgw6AgY2hhcXVlIG1vdXNlbW92ZVxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbGEgbGFyZ2V1ciBDU1MgZCd1bmUgY29sb25uZSAocHggc2kgcGVyc29ubmFsaXPDqWUsIHNpbm9uIGxhIHZhbGV1ciBkZSBjb25maWcgb3UgYXV0bykuICovXG4gIGdldENvbHVtbldpZHRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fY29sdW1uV2lkdGhzW2tleV0gIT0gbnVsbCkgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoc1trZXldICsgJ3B4JztcbiAgICBjb25zdCBjb2wgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGNvbD8ud2lkdGggPz8gJ2F1dG8nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByw6lmw6lyZW5jZXMgOiBzYXZlIC8gY2xlYXJcblxuICBzYXZlUHJlZmVyZW5jZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIpIHJldHVybjtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VLZXlzID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcbiAgICBjb25zdCBjb25maWc6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyA9IHtcbiAgICAgIHNlYXJjaDogICAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBCeTogICAgICAgICAgICAgdGhpcy5hY3RpdmVHcm91cEJ5S2V5LFxuICAgICAgY29sdW1uT3JkZXI6ICAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KSxcbiAgICAgIHZpc2libGVDb2x1bW5zOiAgICAgIHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBjb2x1bW5XaWR0aHM6ICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9jb2x1bW5XaWR0aHMpLmxlbmd0aCA/IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzbGljZVBhbmVsQ29sbGFwc2VkOiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkLFxuICAgICAgaGlkZGVuU2xpY2VLZXlzOiAgICAgWy4uLnRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5c10sXG4gICAgICBkeW5hbWljU2xpY2VLZXlzOiAgICBkeW5hbWljU2xpY2VLZXlzLmxlbmd0aCA/IGR5bmFtaWNTbGljZUtleXMgOiB1bmRlZmluZWQsXG4gICAgICBzbGljZUZpbHRlcnM6ICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYgPyB0aGlzLnNsaWNlUGFuZWxSZWYuZ2V0QWN0aXZlRmlsdGVycygpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLnNhdmUoY29uZmlnKTtcbiAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRydWU7XG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNTYXZlZE1lc3NhZ2UpO1xuICB9XG5cbiAgY2xlYXJQcmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcikgcmV0dXJuO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5jbGVhcigpO1xuICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG5cbiAgICAvLyBDYXB0dXJlciBsZXMgZHluYW1pYyBzbGljZXMgYWN0aXZlcyBBVkFOVCBsZSByZXNldCAocmVzZXRUb0RlZmF1bHRzKCkgbGVzIHZpZGUpXG4gICAgY29uc3QgZHluYW1pY1NsaWNlc1RvUmVtb3ZlID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLnNsaWNlKCk7XG5cbiAgICAvLyBSZXNldCBjb21wbGV0IGRlIGwnw6l0YXQgdmVycyBsZXMgdmFsZXVycyBwYXIgZMOpZmF1dCBkZSBsYSBjb25maWdcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5fY29sdW1uV2lkdGhzID0ge307XG4gICAgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoZmFsc2UpO1xuXG4gICAgLy8gU2xpY2VzIHN0YXRpcXVlcyA6IHJldmVuaXIgYXV4IHNldWxlcyBjZWxsZXMgY2FjaMOpZXMgcGFyIGxhIGNvbmZpZyAocGFzIHBhciBsJ3V0aWxpc2F0ZXVyKVxuICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQodGhpcy5fY29uZmlnSGlkZGVuS2V5cyk7XG4gICAgdGhpcy5fdmlldy51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG5cbiAgICAvLyBDb2xvbm5lcyBldCBncm91cEJ5IDogcmVzZXQgdmlhIGxhIGZhY2FkZSAocmV0aXJlIGxlcyBvcHRpb25uZWxsZXMsIHJlbWV0IGwnb3JkcmUgY29uZmlnKVxuICAgIHRoaXMuX3ZpZXcucmVzZXRUb0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdyb3VwQnlBcHBsaWVkID0gZmFsc2U7XG5cbiAgICAvLyBEeW5hbWljIHNsaWNlcyA6IGxlcyByZXRpcmVyIGR1IHNsaWNlIHBhbmVsIGF2ZWMgbGEgbGlzdGUgY2FwdHVyw6llIGF2YW50IGxlIHJlc2V0XG4gICAgZHluYW1pY1NsaWNlc1RvUmVtb3ZlLmZvckVhY2goY29sID0+IHtcbiAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8ucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0cmUgZGUgc2xpY2UgYWN0aWZcbiAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmKSB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoe30pO1xuXG4gICAgLy8gUmFmcmHDrmNoaXQgdG91dGUgbGEgdnVlXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcbiAgICB0aGlzLnJlbmRlcmVkQ29sdW1ucyA9IHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSk7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuXG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNDbGVhcmVkTWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9zaG93UHJlZmVyZW5jZXNNZXNzYWdlKG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIpO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG1zZztcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG51bGw7XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgNDAwMCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVByZWZlcmVuY2VzKHNhdmVkOiBpbXBvcnQoJy4uL2pxdWVyeS10YWJsZS5tb2RlbCcpLlNhdmVkVGFibGVDb25maWcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIC8vIFJlY2hlcmNoZVxuICAgIGlmIChzYXZlZC5zZWFyY2gpIHRoaXMuc2VhcmNoUXVlcnkgPSBzYXZlZC5zZWFyY2g7XG4gICAgLy8gTGFyZ2V1cnMgY29sb25uZXNcbiAgICBpZiAoc2F2ZWQuY29sdW1uV2lkdGhzKSB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7IC4uLnNhdmVkLmNvbHVtbldpZHRocyB9O1xuICAgIC8vIEdyb3VwIGJ5XG4gICAgaWYgKHNhdmVkLmdyb3VwQnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdmlldy5zZXRHcm91cEJ5KHNhdmVkLmdyb3VwQnkpO1xuICAgICAgaWYgKHNhdmVkLmdyb3VwQnkpIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBCeS5zZXREZWZhdWx0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIMOJdGF0IHBhbm5lYXUgc2xpY2VcbiAgICBpZiAoc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZDtcbiAgICAvLyBTbGljZXMgc3RhdGlxdWVzIGNhY2jDqWVzIOKAlCBvbiB1dGlsaXNlIGxhIHZhbGV1ciBleGFjdGUgc2F1dmVnYXJkw6llIChwYXMgbGVzIGRlZmF1bHRzIGRlIGNvbmZpZylcbiAgICBpZiAoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzKTtcbiAgICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIH1cbiAgICAvLyBDb2xvbm5lcyB2aXNpYmxlcyArIG9yZHJlIOKAlCByZWNvbnN0cnVpdCBhY3RpdmVDb2x1bW5zIGVuIHVuZSBzZXVsZSBwYXNzZS5cbiAgICAvLyBPbiBwYXJ0IGRlIHNhdmVkLmNvbHVtbk9yZGVyIChvcmRyZSBzYXV2ZWdhcmTDqSkgc2kgZGlzcG9uaWJsZSwgc2lub24gc2F2ZWQudmlzaWJsZUNvbHVtbnMuXG4gICAgLy8gQ2VsYSBnw6hyZSDDoCBsYSBmb2lzIDogY29sb25uZXMgb3B0aW9ubmVsbGVzIGFqb3V0w6llcywgY29sb25uZXMgcmV0aXLDqWVzLCBldCByw6lvcmRvbm5hbmNlbWVudC5cbiAgICBjb25zdCB0YXJnZXRLZXlzID0gc2F2ZWQuY29sdW1uT3JkZXIgPz8gc2F2ZWQudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKHRhcmdldEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYWxsQnlLZXkgPSBuZXcgTWFwKCh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcChjID0+IFtjLmtleSwgY10pKTtcbiAgICAgIC8vIENvbG9ubmVzIGRhbnMgbCdvcmRyZSBzYXV2ZWdhcmTDqSAob24gbmUgZ2FyZGUgcXVlIGNlbGxlcyBjb25udWVzIGRlIGxhIGNvbmZpZylcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSB0YXJnZXRLZXlzXG4gICAgICAgIC5tYXAoa2V5ID0+IGFsbEJ5S2V5LmdldChrZXkpKVxuICAgICAgICAuZmlsdGVyKChjKTogYyBpcyBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+ID0+IGMgIT09IHVuZGVmaW5lZCk7XG4gICAgICAvLyBDb2xvbm5lcyBhY3RpdmVzIGFjdHVlbGxsZW1lbnQgbm9uIHByw6lzZW50ZXMgZGFucyB0YXJnZXRLZXlzIChub24tb3B0aW9uYWwgcGFzc8OpZXMgc291cyBzaWxlbmNlKVxuICAgICAgLy8g4oaSIG9uIGxlcyBleGNsdXQgOiBsJ3V0aWxpc2F0ZXVyIGF2YWl0IGV4cGxpY2l0ZW1lbnQgY2hvaXNpIGNlIHNvdXMtZW5zZW1ibGVcbiAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fdmlldy5zZXRBY3RpdmVDb2x1bW5zKG9yZGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEeW5hbWljIHNsaWNlcyDigJQgZGlmZsOpcsOpIDogc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvbmlibGUgYXUgbW9tZW50IGRlIG5nT25DaGFuZ2VzXG4gICAgaWYgKHNhdmVkLmR5bmFtaWNTbGljZUtleXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBzYXZlZC5keW5hbWljU2xpY2VLZXlzO1xuICAgIH1cbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbFxuICAgIC8vIEZpbHRyZXMgYWN0aWZzIGR1IHNsaWNlIHBhbmVsIOKAlCB0b3Vqb3VycyBzdG9ja8OpcyBlbiBwZW5kaW5nIDpcbiAgICAvLyBhcHBsaXF1w6lzIHBhciBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cyAoc2kgZHluYW1pYyBzbGljZXMpIG91XG4gICAgLy8gcGFyIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCAocXVhbmQgbGVzIGRvbm7DqWVzIGFycml2ZW50IGV0IHJlbmRlbnQgbGUgcGFuZWwgdmlzaWJsZSlcbiAgICBpZiAoc2F2ZWQuc2xpY2VGaWx0ZXJzICYmIE9iamVjdC5rZXlzKHNhdmVkLnNsaWNlRmlsdGVycykubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gc2F2ZWQuc2xpY2VGaWx0ZXJzO1xuICAgIH1cbiAgfVxuXG4gIGNhblJlbW92ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fdmlldy5hbGxvd0NvbHVtblJlbW92YWwgJiZcbiAgICAgIGNvbHVtbi5yZW1vdmFibGUgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBpc0NlbGxFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsO1xuICB9XG5cbiAgYXNUaXRsZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHBvcnQgQ1NWXG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwb3J0LmV4cG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgLy8g4pSA4pSAIEluaXRpYWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBwcsOpZsOpcmVuY2VzIHNpIGwnb3B0aW9uIGVzdCBhY3RpdsOpZVxuICAgIGNvbnN0IHByZWZzSWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkXG4gICAgICA/IHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXMudGFibGVJZFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRJZCA9IHByZWZzSWQgPz8gbnVsbDtcbiAgICAvLyBQcsOpZsOpcmVuY2VzIMOgIGFwcGxpcXVlciBhcHLDqHMgX3ZpZXcudXBkYXRlKCkgKHF1YW5kIGFjdGl2ZUNvbHVtbnMgZXN0IGTDqWrDoCBwZXVwbMOpKVxuICAgIGxldCBwZW5kaW5nUHJlZnM6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdXJyZW50SWQgJiYgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyPy5rZXkgIT09ICgnanF0X3ByZWZzXycgKyBjdXJyZW50SWQpKSB7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIgPSBuZXcgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIoY3VycmVudElkKTtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLmhhc1NhdmVkKCk7XG4gICAgICBwZW5kaW5nUHJlZnMgPSB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIubG9hZCgpO1xuICAgIH0gZWxzZSBpZiAoIWN1cnJlbnRJZCkge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyID0gbnVsbDtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRMOpbMOoZ3VlIMOgIGxhIGZhY2FkZSA6IG1pc2Ugw6Agam91ciBkZSBsJ8OpdGF0IFZpZXcgKGNvbG9ubmVzLCBncm91cEJ5IG1ldGEsIHNsaWNlQnkgbWV0YSlcbiAgICB0aGlzLl92aWV3LnVwZGF0ZSh7XG4gICAgICBjb25maWc6IHRoaXMucmVzb2x2ZWRDb25maWcudmlldyxcbiAgICAgIGNvbHVtbnM6IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSxcbiAgICAgIHNsaWNlQ29uZmlnczogdGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10sXG4gICAgICBkZWZhdWx0R3JvdXBCeTogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0R3JvdXBCeSxcbiAgICB9KTtcblxuICAgIGlmICghcGVuZGluZ1ByZWZzICYmICF0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgJiYgIXRoaXMuX3ZpZXcuZ3JvdXBCeS51c2VyQ3VzdG9taXplZCAmJiB0aGlzLl92aWV3Lmdyb3VwQnkuYWN0aXZlS2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIFN5bmNocm9uaXNlIGxhIHByb3ByacOpdMOpIHN0YWJsZSAow6l2aXRlIE5HMDEwMCDigJQgbGEgZmFjYWRlIGVzdCBzb3VyY2UgZGUgdsOpcml0w6kpXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcblxuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcblxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5yZXNvbHZlUGFnZVNpemUoKTtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9ucygpO1xuICAgIHRoaXMucGFnZVNpemVPcHRpb25zR3JvdXBCeSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9uc0dyb3VwQnkoKTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplICE9PSAwICYmICF0aGlzLnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkuaW5jbHVkZXModGhpcy5ncm91cFBhZ2VTaXplKSkge1xuICAgICAgdGhpcy5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgIHRoaXMuYXR0YWNoU29ydCgpO1xuXG4gICAgLy8gUsOpaW5pdGlhbGlzZSBfc3RhdGljU2xpY2VIaWRkZW5LZXlzIHNldWxlbWVudCBzaSBsZXMgY2zDqXMgaGlkZGVuIGRlIGxhIGNvbmZpZyBvbnQgdnJhaW1lbnQgY2hhbmfDqVxuICAgIC8vIEVUIHF1J2lsIG4neSBhIHBhcyBkZSBwcsOpZsOpcmVuY2VzIHNhdXZlZ2FyZMOpZXMgKHF1aSBnw6lyZXJvbnQgaGlkZGVuU2xpY2VLZXlzIGVsbGVzLW3Dqm1lcykuXG4gICAgY29uc3QgbmV3Q29uZmlnSGlkZGVuID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIocyA9PiBzLmhpZGRlbiAmJiBzLmNvbHVtbktleSkubWFwKHMgPT4gcy5jb2x1bW5LZXkhKVxuICAgICk7XG4gICAgaWYgKCFUYWJsZUNvbXBvbmVudC5fc2V0c0VxdWFsKG5ld0NvbmZpZ0hpZGRlbiwgdGhpcy5fY29uZmlnSGlkZGVuS2V5cykpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ0hpZGRlbktleXMgPSBuZXdDb25maWdIaWRkZW47XG4gICAgICAvLyBOJ8OpY3Jhc2VyIF9zdGF0aWNTbGljZUhpZGRlbktleXMgcXVlIHNpIG9uIG4nZXN0IFBBUyBlbiB0cmFpbiBkJ2FwcGxpcXVlciBkZXMgcHJlZnNcbiAgICAgIC8vIChwZW5kaW5nUHJlZnMgbGVzIGfDqHJlcmEgbHVpLW3Dqm1lIHZpYSBfYXBwbHlQcmVmZXJlbmNlcyDihpIgaGlkZGVuU2xpY2VLZXlzKVxuICAgICAgaWYgKCFwZW5kaW5nUHJlZnMpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldChuZXdDb25maWdIaWRkZW4pO1xuICAgICAgICB0aGlzLl92aWV3LnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBsaXF1ZSBsZXMgcHLDqWbDqXJlbmNlcyBJQ0ksIEFQUsOIUyBfdmlldy51cGRhdGUoKSBFVCBhcHLDqHMgX2NvbmZpZ0hpZGRlbktleXMgbWlzIMOgIGpvdXIsXG4gICAgLy8gbWFpcyBhdmFudCBfY29tcHV0ZVNsaWNlQ29uZmlncygpIHBvdXIgcXVlIGhpZGRlblNsaWNlS2V5cyBzb2l0IGTDqWrDoCByZXN0YXVyw6kuXG4gICAgaWYgKHBlbmRpbmdQcmVmcykge1xuICAgICAgdGhpcy5fYXBwbHlQcmVmZXJlbmNlcyhwZW5kaW5nUHJlZnMpO1xuICAgIH1cblxuICAgIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlXG4gICAgLy8gT24gcmVjYWxjdWxlIF9zbGljZUNvbmZpZ3MgZW4gcmVmbMOpdGFudCBsJ8OpdGF0IGNvdXJhbnQgZGVzIHNsaWNlcyBjYWNow6llcyxcbiAgICAvLyBwb3VyIHF1ZSBTbGljZVBhbmVsQ29tcG9uZW50Lm5nT25Jbml0IHJlw6dvaXZlIGxhIGJvbm5lIHZhbGV1ciBkZSBgaGlkZGVuYFxuICAgIC8vIG3Dqm1lIHF1YW5kIGxlIGNvbXBvc2FudCBlc3QgY3LDqcOpIHBvdXIgbGEgMcOocmUgZm9pcyBhcHLDqHMgdW4gdG9nZ2xlLlxuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICB0aGlzLl9zbGljZUNvbHVtbnMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5fc2xpY2VEYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuICAgIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZSA9IHRoaXMucmVzb2x2ZWRDb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgIT09IGZhbHNlO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0KSB7XG4gICAgICB0aGlzLl9tYXRTb3J0QWN0aXZlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5hY3RpdmU7XG4gICAgICB0aGlzLl9tYXRTb3J0RGlyZWN0aW9uID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5kaXJlY3Rpb247XG4gICAgfVxuICAgIHRoaXMuX2J1aWxkU2xpY2VCeU1lbnVJdGVtcygpO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSB1bmlxdWVtZW50IGxlcyBzbGljZXMgdmlzaWJsZXMgKG5vbiBjYWNow6llcyBwYXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cykuXG4gICAqIExlIFNsaWNlUGFuZWxDb21wb25lbnQgYWZmaWNoZSB0b3V0IGNlIHF1J2lsIHJlw6dvaXQg4oCUIGMnZXN0IGljaSBxdWUgc2UgZmFpdCBsZSBmaWx0cmFnZS4gKi9cbiAgcHJpdmF0ZSBfY29tcHV0ZVNsaWNlQ29uZmlncygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIoXG4gICAgICBzID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldHNFcXVhbChhOiBTZXQ8c3RyaW5nPiwgYjogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYSkgaWYgKCFiLmhhcyh2KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlTWFwID0gbmV3IE1hcCh0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51Lm1hcChzID0+IFtzLmtleSwgc10pKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VTZXQgPSBuZXcgU2V0KHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sLmtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YXRpY1NsaWNlTWFwLmhhcyhjb2wua2V5KSkge1xuICAgICAgICBjb25zdCBzID0gc3RhdGljU2xpY2VNYXAuZ2V0KGNvbC5rZXkpITtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgICBzZWVuLmFkZChjb2wua2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY1NsaWNlU2V0Lmhhcyhjb2wua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IGZhbHNlLCBrZXk6IGNvbC5rZXksIHRpdGxlOiB0aGlzLmNvbExhYmVsKGNvbCksIGljb246IGNvbC5pY29uLCBjb2wgfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGljU2xpY2VzRm9yTWVudSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhzLmtleSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zID0gaXRlbXM7XG4gIH1cblxuICBnZXQgc2xpY2VCeU1lbnVJdGVtcygpIHsgcmV0dXJuIHRoaXMuX3NsaWNlQnlNZW51SXRlbXM7IH1cblxuICBvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaXNTdGF0aWMpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGljU2xpY2UoaXRlbS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5jb2wpIHtcbiAgICAgIHRoaXMudG9nZ2xlRHluYW1pY1NsaWNlKGl0ZW0uY29sKTtcbiAgICB9XG4gIH1cblxuICBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbTogeyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmlzU3RhdGljID8gdGhpcy5pc1N0YXRpY1NsaWNlVmlzaWJsZShpdGVtLmtleSkgOiB0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGl0ZW0ua2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlUmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fZXhlY3V0ZVJlbmRlcigpKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZVJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRlZ29yeVJvd3MgPSB0aGlzLmdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgLy8gRW4gbW9kZSBncm91cEJ5LCBwcm9qZWN0Um93cyBnw6hyZSB0b3V0IGxlIHRyaSBpbnRlcm5lbWVudCDigJQgcGFzIGRlIHNvcnQgZ2xvYmFsIGludXRpbGVcbiAgICAgIHRoaXMuX2FsbEZpbHRlcmVkUm93cyA9IGNhdGVnb3J5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcGFyZUZuID0gdGhpcy5fYnVpbGRTb3J0Q29tcGFyYXRvcigpO1xuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY29tcGFyZUZuID8gWy4uLmNhdGVnb3J5Um93c10uc29ydChjb21wYXJlRm4pIDogY2F0ZWdvcnlSb3dzO1xuICAgIH1cblxuICAgIC8vIE1ldHRyZSDDoCBqb3VyIGxlIHBhZ2luYXRvciBhdmVjIGxlIG5vdXZlYXUgdG90YWxcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA/PyB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDEpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IE1hdGgubWluKHNhdmVkSW5kZXgsIG1heFBhZ2UpO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgIC8vIGRldGVjdENoYW5nZXMoKSBhdSBsaWV1IGRlIG1hcmtGb3JDaGVjaygpIDogbWV0IMOgIGpvdXIgdW5pcXVlbWVudCBDRSBjb21wb3NhbnRcbiAgICAvLyBzYW5zIGTDqWNsZW5jaGVyIHVuIGN5Y2xlIENEIGdsb2JhbCBxdWkgcHJvdm9xdWVyYWl0IE5HMDEwMCBkYW5zIGxlcyBwYXJlbnRzLlxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q3VycmVudFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMucHJvamVjdFJvd3ModGhpcy5fYWxsRmlsdGVyZWRSb3dzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IDA7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2VSb3dzID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuXG4gICAgY29uc3QgcHJvamVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIHBhZ2VSb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgY29uc3QgcDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIHBbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICB9KTtcbiAgICAgIHByb2plY3RlZC5wdXNoKHApO1xuICAgIH0pO1xuICAgIHRoaXMudGFibGVEYXRhU291cmNlLmRhdGEgPSBwcm9qZWN0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWZmZWN0aXZlQ29uZmlnKCk6IFRhYmxlUHJvdmlkZXI8VD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9yZXNvbHZlZERhdGE7XG5cbiAgICBjb25zdCBjb2x1bW5zID1cbiAgICAgIGNvbmZpZy5jb2x1bW5zIHx8XG4gICAgICB0aGlzLmNvbHVtbnNDb25maWcgfHxcbiAgICAgIHRoaXMucmVzb2x2ZUNvbHVtbnNGcm9tQ29tcGF0KHJvd3MpO1xuXG4gICAgLy8gTW9kZSBIVE1MIDogW3ZpZXddIHByZW5kIGxlIGRlc3N1cyBzdXIgY29uZmlnLnZpZXcgc2kgZm91cm5pIChQaGFzZSAzKS5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3ID8/IGNvbmZpZy52aWV3O1xuXG4gICAgY29uc3QgYXV0b1RhYmxlSWQgPSBjb25maWcucHJlZmVyZW5jZXM/LnRhYmxlSWQgfHwgVGFibGVDb21wb25lbnQuX2hhc2hDb2x1bW5zKChjb2x1bW5zIHx8IFtdKS5tYXAoYyA9PiBjLmtleSkpO1xuICAgIGNvbnN0IGV4cG9ydENvbmZpZzogVGFibGVFeHBvcnRDb25maWc8VD4gPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgZmlsZW5hbWU6IGF1dG9UYWJsZUlkLFxuICAgICAgLi4uY29uZmlnLmV4cG9ydCxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJlZnNDb25maWc6IFRhYmxlUHJlZmVyZW5jZXNDb25maWcgPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdGFibGVJZDogYXV0b1RhYmxlSWQsXG4gICAgICAuLi5jb25maWcucHJlZmVyZW5jZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdmlldyxcbiAgICAgIHNsaWNlczogY29uZmlnLnNsaWNlcyB8fCBbXSxcbiAgICAgIGVuYWJsZVNsaWNlVG9nZ2xlOiBjb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgPz8gdHJ1ZSxcbiAgICAgIGV4cG9ydDogZXhwb3J0Q29uZmlnLFxuICAgICAgcHJlZmVyZW5jZXM6IHByZWZzQ29uZmlnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfaGFzaENvbHVtbnMoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ciA9IGtleXMuam9pbignfCcpO1xuICAgIGxldCBoID0gMHg4MTFjOWRjNTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgaCBePSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMHgwMTAwMDE5MykgPj4+IDA7XG4gICAgfVxuICAgIHJldHVybiBoLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGF0YSgpOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGEpKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uc0Zyb21Db21wYXQocm93czogVFtdKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnMubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbkxhYmVscz8uW2tleV0gfHwgaHVtYW5pemVLZXkoa2V5KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFJvdyA9IHJvd3NbMF0gYXMgYW55O1xuICAgIGlmICghZmlyc3RSb3cgfHwgdHlwZW9mIGZpcnN0Um93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhmaXJzdFJvdykubWFwKChrZXkpID0+ICh7XG4gICAgICBrZXksXG4gICAgICBoZWFkZXI6IHRoaXMuY29sdW1uTGFiZWxzPy5ba2V5XSB8fCBodW1hbml6ZUtleShrZXkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2F0ZWdvcnlGaWx0ZXJlZERhdGEoKTogVFtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuXG4gICAgbGV0IGZpbHRlcmVkID0gZGF0YS5maWx0ZXIodGhpcy5hY3RpdmVTbGljZUZpbHRlcik7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnk/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgY29uc3QgcmVzdHJpY3RlZEtleXMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaD8uc2VhcmNoQ29sdW1ucztcbiAgICAgIGNvbnN0IHNlYXJjaENvbHMgPSByZXN0cmljdGVkS2V5cz8ubGVuZ3RoXG4gICAgICAgID8gWy4uLnRoaXMuX2NvbHVtbk1hcC52YWx1ZXMoKV0uZmlsdGVyKGNvbCA9PiByZXN0cmljdGVkS2V5cy5pbmNsdWRlcyhjb2wua2V5KSlcbiAgICAgICAgOiBbLi4udGhpcy5fY29sdW1uTWFwLnZhbHVlcygpXTtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChyb3cpID0+XG4gICAgICAgIHNlYXJjaENvbHMuc29tZSgoY29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXREaXNwbGF5VmFsdWVGb3JTZWFyY2goY29sLCByb3cpO1xuICAgICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvamVjdFJvd3Mocm93czogVFtdKTogYW55W10ge1xuICAgIGNvbnN0IGdyb3VwS2V5ID0gdGhpcy5hY3RpdmVHcm91cEJ5S2V5O1xuXG4gICAgaWYgKCFncm91cEtleSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgcm93cy5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaW5kZXggfTtcbiAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgIHByb2plY3RlZFtjb2wua2V5XSA9IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cENvbERlZiA9IHRoaXMuX2NvbHVtbk1hcC5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGdyb3VwTGF6eVN0YXR1cyA9IGdyb3VwQ29sRGVmPy5sYXp5ID8gKHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGdyb3VwS2V5KSA/PyAnaWRsZScpIDogJ2xvYWRlZCc7XG5cbiAgICBpZiAoZ3JvdXBMYXp5U3RhdHVzICE9PSAnbG9hZGVkJykge1xuICAgICAgdGhpcy5fdG90YWxGaWx0ZXJlZENvdW50ID0gcm93cy5sZW5ndGg7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9MQVpZX0xPQURJTkcsIFtST1dfR1JPVVBfQ09VTlRdOiByb3dzLmxlbmd0aCwgW1JPV19HUk9VUF9QQUdFXTogMCwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogMSB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVTb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuXG4gICAgLy8gVsOpcmlmaWUgc2kgbGUgY2FjaGUgZXN0IGVuY29yZSB2YWxpZGUgKG3Dqm1lIHLDqWbDqXJlbmNlIGRlIHJvd3MgKyBtw6ptZSBwYXJhbcOodHJlcyBkZSB0cmkvZ3JvdXBlKVxuICAgIGNvbnN0IGNhY2hlVmFsaWQgPVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5yb3dzID09PSByb3dzICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLmtleSA9PT0gZ3JvdXBLZXkgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydE9yZGVyID09PSB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnRBY3RpdmUgPT09IChlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJykgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydERpciA9PT0gKGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uID8/ICcnKTtcblxuICAgIGxldCBncm91cE9yZGVyOiBzdHJpbmdbXTtcbiAgICBsZXQgZ3JvdXBNYXA6IE1hcDxzdHJpbmcsIFRbXT47XG5cbiAgICBpZiAoY2FjaGVWYWxpZCkge1xuICAgICAgZ3JvdXBPcmRlciA9IHRoaXMuX2dyb3VwQ2FjaGUhLm9yZGVyO1xuICAgICAgZ3JvdXBNYXAgPSB0aGlzLl9ncm91cENhY2hlIS5tYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByw6ktY2FsY3VsIGRlcyB2YWxldXJzIGRlIGdyb3VwZSBlbiB1biBzZXVsIHBhc3NhZ2UgKMOpdml0ZSBPKG4pIGZpbmQoKSBwYXIgY29tcGFyYWlzb24pXG4gICAgICBjb25zdCBncm91cFZhbHVlQ2FjaGUgPSBuZXcgTWFwPFQsIHN0cmluZz4oKTtcbiAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gZ3JvdXBWYWx1ZUNhY2hlLnNldChyb3csIFN0cmluZyh0aGlzLmdldExhenlBd2FyZVZhbHVlKGdyb3VwS2V5LCByb3cpID8/ICcnKSkpO1xuXG4gICAgICAvLyBQcsOpLWNhbGN1bCBkZXMgdmFsZXVycyBkZSB0cmkgKMOpdml0ZSBPKG4gbG9nIG4pIMOXIGdldExhenlBd2FyZVZhbHVlIGRhbnMgbGUgY29tcGFyYXRldXIpXG4gICAgICBsZXQgZmFzdENvbXBhcmVGbjogKChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoZWZmZWN0aXZlU29ydC5hY3RpdmUgJiYgZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgc29ydFZhbHVlQ2FjaGUgPSBuZXcgTWFwPFQsIGFueT4oKTtcbiAgICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiBzb3J0VmFsdWVDYWNoZS5zZXQocm93LCB0aGlzLmdldExhenlBd2FyZVZhbHVlKGVmZmVjdGl2ZVNvcnQuYWN0aXZlLCByb3cpKSk7XG4gICAgICAgIGNvbnN0IGRpciA9IGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uO1xuICAgICAgICBmYXN0Q29tcGFyZUZuID0gKGE6IFQsIGI6IFQpOiBudW1iZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhID0gc29ydFZhbHVlQ2FjaGUuZ2V0KGEpO1xuICAgICAgICAgIGNvbnN0IHZiID0gc29ydFZhbHVlQ2FjaGUuZ2V0KGIpO1xuICAgICAgICAgIGxldCBjbXAgPSAwO1xuICAgICAgICAgIGlmICh0eXBlb2YgdmEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNtcCA9IHZhIDwgdmIgPyAtMSA6IHZhID4gdmIgPyAxIDogMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2EgPSB2YSA9PSBudWxsID8gJycgOiBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBzYiA9IHZiID09IG51bGwgPyAnJyA6IFN0cmluZyh2YikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNtcCA9IHNhIDwgc2IgPyAtMSA6IHNhID4gc2IgPyAxIDogMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBjbXAgOiAtY21wO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCB2YSA9IGdyb3VwVmFsdWVDYWNoZS5nZXQoYSkhO1xuICAgICAgICBjb25zdCB2YiA9IGdyb3VwVmFsdWVDYWNoZS5nZXQoYikhO1xuICAgICAgICBjb25zdCBjbXAgPSB2YS5sb2NhbGVDb21wYXJlKHZiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwQnkuZ3JvdXBTb3J0T3JkZXIgPT09ICdkZXNjJyA/IC1jbXAgOiBjbXA7XG4gICAgICB9KTtcblxuICAgICAgZ3JvdXBPcmRlciA9IFtdO1xuICAgICAgZ3JvdXBNYXAgPSBuZXcgTWFwPHN0cmluZywgVFtdPigpO1xuICAgICAgc29ydGVkLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ3JvdXBWYWx1ZUNhY2hlLmdldChyb3cpITtcbiAgICAgICAgaWYgKCFncm91cE1hcC5oYXMoZ3JvdXBWYWx1ZSkpIHtcbiAgICAgICAgICBncm91cE9yZGVyLnB1c2goZ3JvdXBWYWx1ZSk7XG4gICAgICAgICAgZ3JvdXBNYXAuc2V0KGdyb3VwVmFsdWUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBncm91cE1hcC5nZXQoZ3JvdXBWYWx1ZSkhLnB1c2gocm93KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUcmkgaW50cmEtZ3JvdXBlIHN0b2Nrw6kgZGFucyBsZSBjYWNoZSDigJQgw6l2aXRlIGxlIHJlLXRyaSBzdXIgY29sbGFwc2UvZXhwYW5kL3BhZ2luYXRpb25cbiAgICAgIGlmIChmYXN0Q29tcGFyZUZuKSB7XG4gICAgICAgIGNvbnN0IGZuID0gZmFzdENvbXBhcmVGbjtcbiAgICAgICAgZ3JvdXBNYXAuZm9yRWFjaCgoZ3JvdXBSb3dzLCBrZXkpID0+IHtcbiAgICAgICAgICBncm91cE1hcC5zZXQoa2V5LCBbLi4uZ3JvdXBSb3dzXS5zb3J0KGZuKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBNaXNlIGVuIGNhY2hlXG4gICAgICB0aGlzLl9ncm91cENhY2hlID0ge1xuICAgICAgICByb3dzLFxuICAgICAgICBrZXk6IGdyb3VwS2V5LFxuICAgICAgICBzb3J0T3JkZXI6IHRoaXMuX2dyb3VwQnkuZ3JvdXBTb3J0T3JkZXIsXG4gICAgICAgIHNvcnRBY3RpdmU6IGVmZmVjdGl2ZVNvcnQuYWN0aXZlID8/ICcnLFxuICAgICAgICBzb3J0RGlyOiBlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbiA/PyAnJyxcbiAgICAgICAgb3JkZXI6IGdyb3VwT3JkZXIsXG4gICAgICAgIG1hcDogZ3JvdXBNYXAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX3RvdGFsRmlsdGVyZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xuXG4gICAgLy8gUHJvdGVjdGlvbiBjb250cmUgbGVzIGpldXggZGUgZG9ubsOpZXMgw6AgdHJvcCBoYXV0ZSBjYXJkaW5hbGl0w6lcbiAgICBpZiAoZ3JvdXBPcmRlci5sZW5ndGggPiBUYWJsZUNvbXBvbmVudC5NQVhfR1JPVVBfQ09VTlQpIHtcbiAgICAgIHJldHVybiBbeyBbR1JPVVBfSEVBREVSX01BUktFUl06IHRydWUsIFtST1dfR1JPVVBfS0VZXTogR1JPVVBfS0VZX1RPT19NQU5ZLCBbUk9XX0dST1VQX0NPVU5UXTogZ3JvdXBPcmRlci5sZW5ndGgsIFtST1dfR1JPVVBfUEFHRV06IDAsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IDEgfV07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdyb3VwUGFnZVNpemU7XG4gICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gICAgZ3JvdXBPcmRlci5mb3JFYWNoKChncm91cFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBncm91cFJvd3MgPSBncm91cE1hcC5nZXQoZ3JvdXBWYWx1ZSkhO1xuICAgICAgY29uc3QgdG90YWxDb3VudCA9IGdyb3VwUm93cy5sZW5ndGg7XG4gICAgICBjb25zdCBjdXJyZW50UGFnZSA9IHBhZ2VTaXplID09PSAwID8gMCA6IHRoaXMuX2dyb3VwQnkuZ2V0UGFnZShncm91cFZhbHVlKTtcbiAgICAgIGNvbnN0IHBhZ2VDb3VudCA9IHBhZ2VTaXplID09PSAwID8gMSA6IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbENvdW50IC8gcGFnZVNpemUpKTtcbiAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuaXNHcm91cENvbGxhcHNlZChncm91cFZhbHVlKTtcblxuICAgICAgcmVzdWx0LnB1c2goeyBbR1JPVVBfSEVBREVSX01BUktFUl06IHRydWUsIFtST1dfR1JPVVBfS0VZXTogZ3JvdXBWYWx1ZSwgW1JPV19HUk9VUF9DT1VOVF06IHRvdGFsQ291bnQsIFtST1dfR1JPVVBfUEFHRV06IGN1cnJlbnRQYWdlLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiBwYWdlQ291bnQgfSk7XG5cbiAgICAgIGlmICghY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFnZVNpemUgPT09IDAgPyAwIDogY3VycmVudFBhZ2UgKiBwYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgZW5kID0gcGFnZVNpemUgPT09IDAgPyB0b3RhbENvdW50IDogTWF0aC5taW4oc3RhcnQgKyBwYWdlU2l6ZSwgdG90YWxDb3VudCk7XG4gICAgICAgIGdyb3VwUm93cy5zbGljZShzdGFydCwgZW5kKS5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZHggPSBzdGFydCArIGk7XG4gICAgICAgICAgY29uc3QgcHJvamVjdGVkOiBhbnkgPSB7IFtST1dfUkFXX0tFWV06IHJvdywgW1JPV19JTkRFWF9LRVldOiBpZHggfTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTb3J0Q29tcGFyYXRvcigpOiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCBudWxsIHtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuICAgIGNvbnN0IHsgYWN0aXZlLCBkaXJlY3Rpb24gfSA9IHNvcnQ7XG4gICAgaWYgKCFhY3RpdmUgfHwgIWRpcmVjdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IHZhID0gdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGEpO1xuICAgICAgY29uc3QgdmIgPSB0aGlzLmdldExhenlBd2FyZVZhbHVlKGFjdGl2ZSwgYik7XG4gICAgICBsZXQgY21wID0gMDtcbiAgICAgIGlmICh0eXBlb2YgdmEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY21wID0gdmEgPCB2YiA/IC0xIDogdmEgPiB2YiA/IDEgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2EgPSB2YSA9PSBudWxsID8gJycgOiBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNiID0gdmIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjbXAgPSBzYSA8IHNiID8gLTEgOiBzYSA+IHNiID8gMSA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNtcCA6IC1jbXA7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsYSB2YWxldXIgdGVsbGUgcXUnZWxsZSBlc3QgYWZmaWNow6llIGRhbnMgbGEgY2VsbHVsZSwgZW4gc3VpdmFudCBleGFjdGVtZW50XG4gICAqIGxlIG3Dqm1lIGNoZW1pbiBxdWUgcmVzb2x2ZUNlbGxWYWx1ZSDigJQgdXRpbGlzw6llIHBvdXIgbGEgcmVjaGVyY2hlIHBsZWluLXRleHRlLlxuICAgKiBOZSBwYXNzZSBwYXMgcGFyIHNvcnRWYWx1ZSAodmFsZXVyIGJydXRlIGRlIHRyaSkgY29udHJhaXJlbWVudCDDoCBnZXRMYXp5QXdhcmVWYWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBUKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgIT09ICdsb2FkZWQnKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHJvd01hcCA9IHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2wua2V5KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgfVxuICAgIGlmIChjb2wuc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2wuc2VhcmNoVmFsdWUocm93LCAwKTtcbiAgICB9XG4gICAgY29uc3QgcmF3VmFsdWUgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93LCAwKSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2x1bW5LZXkpPy5nZXQocm93KSA/PyBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sRGVmPy5zb3J0VmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnNvcnRWYWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8udmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnZhbHVlKHJvdywgMCkpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBhbnkpW2NvbHVtbktleV07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDZWxsVmFsdWUoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+LCByb3c6IFQsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChjb2wubGF6eSkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoY29sLmtleSkgPz8gJ2lkbGUnO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnKSByZXR1cm4gTEFaWV9MT0FESU5HX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykgcmV0dXJuIExBWllfRVJST1JfVkFMVUU7XG4gICAgICBpZiAoc3RhdHVzID09PSAnbG9hZGVkJykge1xuICAgICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUHJvdmlkZXIgPSBjb2wudmFsdWU7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZVByb3ZpZGVyID8gdmFsdWVQcm92aWRlcihyb3csIGluZGV4KSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplIHx8IDUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnMgfHwgWzUsIDEwLCAyMF07XG4gICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQob3B0aW9ucy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSA+IDApKV07XG5cbiAgICBpZiAoIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplKSkge1xuICAgICAgdW5pcXVlLnB1c2godGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYWdlU2l6ZU9wdGlvbnNHcm91cEJ5KCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5IHx8IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2KSA9PiB2ID4gMCkpXTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplID4gMCAmJiAhdW5pcXVlLmluY2x1ZGVzKHRoaXMuZ3JvdXBQYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMuZ3JvdXBQYWdlU2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zO1xuICAgIGlmIChvcHRpb25zPy5sZW5ndGgpIHJldHVybiBvcHRpb25zWzBdO1xuICAgIHJldHVybiBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgNTtcbiAgfVxuXG4gIHByaXZhdGUgdW5pcXVlQ29sdW1uc0J5S2V5KGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY29sdW1uLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUGFnaW5hdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdGlvbikge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG5cbiAgICBpZiAodGhpcy5fcGFnaW5hdG9yU3Vic2NyaWJlZCAhPT0gdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IhLnBhZ2VTaXplO1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdpbmF0b3IhLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZSB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5fcHJvamVjdEN1cnJlbnRQYWdlKCk7XG4gICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc29ydCkgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2Uuc29ydCA9IG51bGwgYXMgYW55O1xuXG4gICAgaWYgKHRoaXMuX3NvcnRTdWJzY3JpYmVkICE9PSB0aGlzLnNvcnQpIHtcbiAgICAgIHRoaXMuX3NvcnRTdWJzY3JpYmVkID0gdGhpcy5zb3J0O1xuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hY3RpdmVTb3J0ID0ge1xuICAgICAgICAgIGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSxcbiAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlOiB0aGlzLnNvcnQuYWN0aXZlLCBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24gfSk7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwianF1ZXJ5LXRhYmxlLXdyYXBwZXJcIj5cbiAgPGhlYWRlciBjbGFzcz1cInRhYmxlLWhlYWRlclwiICpuZ0lmPVwic2hvd1RpdGxlXCI+XG4gICAgPGgzPnt7IHRpdGxlIH19PC9oMz5cbiAgPC9oZWFkZXI+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtbGF5b3V0XCJcbiAgICBbY2xhc3Mubm8tc2xpY2VdPVwiIV9zaG93U2xpY2VQYW5lbCB8fCBfc2xpY2VQYW5lbENvbGxhcHNlZFwiXG4gID5cbiAgICA8c2xpY2UtcGFuZWxcbiAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFfc2hvd1NsaWNlUGFuZWwgfHwgX3NsaWNlUGFuZWxDb2xsYXBzZWQgPyAnbm9uZScgOiBudWxsXCJcbiAgICAgIFtzbGljZUNvbmZpZ3NdPVwiX3NsaWNlQ29uZmlnc1wiXG4gICAgICBbY29sdW1uc109XCJfc2xpY2VDb2x1bW5zXCJcbiAgICAgIFtkYXRhXT1cIl9zbGljZURhdGFcIlxuICAgICAgW2xhenlEYXRhXT1cIl9sYXp5Q29sdW1uRGF0YVwiXG4gICAgICBbbGF6eVN0YXR1c109XCJfbGF6eUNvbHVtblN0YXR1c1wiXG4gICAgICBbc2hvd1RvZ2dsZV09XCJfc2xpY2VTaG93VG9nZ2xlXCJcbiAgICAgIFtjb2xsYXBzZWRCeURlZmF1bHRdPVwiX3NsaWNlUGFuZWxDb2xsYXBzZWRcIlxuICAgICAgKGZpbHRlckNoYW5nZSk9XCJvblNsaWNlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGR5bmFtaWNTbGljZUtleXNDaGFuZ2UpPVwib25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNsaWNlUGFuZWxDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvc2xpY2UtcGFuZWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtc2hlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10b29sYmFyXCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdG9vbGJhci1sZWZ0XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U2xpY2VFeHBhbmRCdG5cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNsaWNlLWV4cGFuZC1idG5cIlxuICAgICAgICAgICAgW3RpdGxlXT1cImkxOG4uZXhwYW5kRmlsdGVyVGl0bGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNsaWNlUGFuZWwoKVwiXG4gICAgICAgICAgPjxtYXQtaWNvbiBjbGFzcz1cInNsaWNlLWV4cGFuZC1tYXQtaWNvblwiPm1lbnU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93U2VhcmNoQmFyXCIgY2xhc3M9XCJzZWFyY2gtaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNlYXJjaC1pY29uXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOC41XCIgY3k9XCI4LjVcIiByPVwiNS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDEzTDE3IDE3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFF1ZXJ5XCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpMThuLnNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VhcmNoUXVlcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWFyY2gtY2xlYXItYnRuXCIgKGNsaWNrKT1cInNlYXJjaFF1ZXJ5ID0gJyc7IG9uU2VhcmNoQ2hhbmdlKClcIj7DlzwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtY291bnRcIj57eyBmaWx0ZXJlZFJvd0NvdW50IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dWaWV3QnV0dG9uXCIgY2xhc3M9XCJ0YWJsZS10b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dWaWV3QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1idG5cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld01lbnVcIiAjdmlld01lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWaWV3J1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1idG4taWNvblwiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxtYXQtbWVudSAjdmlld01lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctbWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93RmllbGRzXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmllbGRzU3ViTWVudVwiIGNsYXNzPVwidmlldy1tZW51LXN1Yi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi1sYWJlbFwiPnt7IGkxOG4udmlld01lbnVGaWVsZHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi12YWx1ZVwiPnt7IHZpc2libGVDb2x1bW5zLmxlbmd0aCB9fS97eyB0b3RhbENvbHVtbkNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0dyb3VwQnlTZWN0aW9uXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBCeVN1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnZpZXdNZW51R3JvdXBCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXZhbHVlXCI+e3sgYWN0aXZlR3JvdXBCeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0FkZFNsaWNlQnV0dG9uXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2xpY2VCeVN1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnZpZXdNZW51U2xpY2VCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXZhbHVlXCI+e3sgYWN0aXZlU2xpY2VCeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtZXhwb3J0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIiBtYXQtbWVudS1pdGVtIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1leHBvcnQtaXRlbVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkV4cG9ydCgpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWV4cG9ydC1pY29uXCI+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLmV4cG9ydEJ1dHRvbkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJzaG93UHJlZmVyZW5jZXNNZW51XCIgY2xhc3M9XCJ2aWV3LW1lbnUtZXhwb3J0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dQcmVmZXJlbmNlc01lbnVcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcmVmZXJlbmNlc1N1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnByZWZlcmVuY2VzTWVudUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjcHJlZmVyZW5jZXNTdWJNZW51PVwibWF0TWVudVwiIFtwYW5lbENsYXNzXT1cIid2aWV3LXN1Ym1lbnUtcGFuZWwnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1zdWJtZW51XCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cImVudGVyRWRpdE1vZGUoKTsgdmlld01lbnVUcmlnZ2VyLmNsb3NlTWVudSgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5wcmVmZXJlbmNlc0VkaXQgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cInNhdmVQcmVmZXJlbmNlcygpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBpMThuLnByZWZlcmVuY2VzU2F2ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiIFtkaXNhYmxlZF09XCIhaGFzU2F2ZWRQcmVmZXJlbmNlc1wiIChtb3VzZWRvd24pPVwiY2xlYXJQcmVmZXJlbmNlcygpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5wcmVmZXJlbmNlc0NsZWFyIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjZmllbGRzU3ViTWVudT1cIm1hdE1lbnVcIiBbcGFuZWxDbGFzc109XCIndmlldy1zdWJtZW51LXBhbmVsJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctc3VibWVudVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1pdGVtXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBtZW51QmFzZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29sdW1uLm9wdGlvbmFsICYmICFhbGxvd0NvbHVtblJlbW92YWxcIlxuICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbiwgIWlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1jaGVja1wiPnt7IGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGNvbHVtbi5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBjb2xMYWJlbChjb2x1bW4pIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudU9wdGlvbmFsQ29sdW1ucy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgbWVudU9wdGlvbmFsQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSAmJiB2aXNpYmxlQ29sdW1ucy5sZW5ndGggPT09IDEpIHx8IGdldExhenlDb2x1bW5TdGF0dXMoY29sdW1uLmtleSkgPT09ICdsb2FkaW5nJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2x1bW4sICFpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1jaGVja1wiPnt7IGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvblwiIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgY29sdW1uLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAge3sgY29sTGFiZWwoY29sdW1uKSB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4ubGF6eSAmJiBnZXRMYXp5Q29sdW1uU3RhdHVzKGNvbHVtbi5rZXkpID09PSAnbG9hZGluZydcIiBjbGFzcz1cImxhenktbWVudS1zcGlubmVyXCI+4oa7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4ubGF6eSAmJiBnZXRMYXp5Q29sdW1uU3RhdHVzKGNvbHVtbi5rZXkpID09PSAnZXJyb3InXCIgY2xhc3M9XCJsYXp5LW1lbnUtZXJyb3JcIiBbdGl0bGVdPVwiaTE4bi5sYXp5RXJyb3JNZW51VGl0bGVcIj7imqA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjZ3JvdXBCeVN1Yk1lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctc3VibWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXN1Ym1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgZ3JvdXBCeUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkdyb3VwQnlDaGFuZ2UoYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleSA/IG51bGwgOiBjb2wua2V5KVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LWNoZWNrXCI+e3sgYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGNvbC5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBjb2xMYWJlbChjb2wpIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjc2xpY2VCeVN1Yk1lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctc3VibWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXN1Ym1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNsaWNlQnlNZW51SXRlbXNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTbGljZU1lbnVJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU2xpY2VNZW51SXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIj57eyBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbSkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIml0ZW0uaWNvblwiIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgaXRlbS5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktd3JhcHBlclwiPlxuXG4gICAgICA8IS0tIEJhbm5pw6hyZSBtZXNzYWdlIHByw6lmw6lyZW5jZXMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiX3ByZWZlcmVuY2VzTWVzc2FnZVwiIGNsYXNzPVwicHJlZmVyZW5jZXMtbWVzc2FnZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJwcmVmZXJlbmNlcy1tZXNzYWdlLWljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBfcHJlZmVyZW5jZXNNZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQm91dG9uIGRlIGNvbmZpcm1hdGlvbiBkdSBtb2RlIMOpZGl0aW9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImVkaXQtY29uZmlybS1idG5cIlxuICAgICAgICBbdGl0bGVdPVwiaTE4bi5wcmVmZXJlbmNlc0NvbmZpcm1FZGl0XCJcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1FZGl0TW9kZSgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5LXNjcm9sbFwiICN0YWJsZUJvZHlTY3JvbGw+XG4gICAgICA8dGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgY2xhc3M9XCJqcXVlcnktdGFibGVcIlxuICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwidGFibGVNaW5XaWR0aFwiXG4gICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tSb3dGblwiXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiX21hdFNvcnRBY3RpdmVcIiBbbWF0U29ydERpcmVjdGlvbl09XCJfbWF0U29ydERpcmVjdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5rZXlcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFttYXQtc29ydC1oZWFkZXJdPVwiKCFfZWRpdE1vZGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkgPyBjb2x1bW4ua2V5IDogJydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9lZGl0TW9kZSB8fCBjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJhZy1lbmFibGVkXT1cImlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJvcC10YXJnZXRdPVwiaXNIZWFkZXJEcm9wVGFyZ2V0KGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtaGVhZGVyXT1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25IZWFkZXJEcmFnT3Zlcihjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uSGVhZGVyRHJvcChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1jZWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uXCIgY2xhc3M9XCJoZWFkLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2x1bW4uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC10ZXh0XCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj57eyBjb2x1bW4uaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uSGVhZGVyRHJhZ1N0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIChkcmFnZW5kKT1cIm9uSGVhZGVyRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBQb2lnbsOpZSBkZSByZXNpemUgKHZpc2libGUgdW5pcXVlbWVudCBlbiBtb2RlIMOpZGl0aW9uKSAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldENvbHVtbldpZHRoKGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtY2VsbF09XCJfZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2VkaXRNb2RlOyBlbHNlIGVkaXRNb2RlQ2VsbFRwbFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q2VsbFRlbXBsYXRlKGNvbHVtbi5rZXkpIGFzIGN1c3RvbVRwbDsgZWxzZSBkZWZhdWx0Q2VsbFRwbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3dbX1JPV19SQVdfS0VZXSwgaW5kZXg6IHJvd1tfUk9XX0lOREVYX0tFWV0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRwbD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubGF6eSA/IGdldExhenlSZW5kZXJUeXBlKHJvd1tjb2x1bW4ua2V5XSkgOiAndmFsdWUnXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2xvYWRpbmcnXCIgY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yJ1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImxhenktZXJyb3ItYnRuXCIgKGNsaWNrKT1cInJldHJ5TGF6eUNvbHVtbihjb2x1bW4pXCIgW3RpdGxlXT1cImkxOG4ubGF6eUVycm9yVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LWVycm9yLWljb25cIj7imqA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1lcnJvci1sYWJlbFwiPnt7IGkxOG4ubGF6eVJldHJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiY2VsbC10ZXh0XCIgW2NsYXNzLmNlbGwtZW1wdHldPVwiaXNDZWxsRW1wdHkocm93W2NvbHVtbi5rZXldKVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyBpc0NlbGxFbXB0eShyb3dbY29sdW1uLmtleV0pID8gaTE4bi5jZWxsRW1wdHkgOiByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGVDZWxsVHBsPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNlbGwtdGV4dCBjZWxsLWVkaXQtbW9kZVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwicmVuZGVyZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICA8dHJcbiAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHJlbmRlcmVkQ29sdW1uczsgd2hlbjogIWlzR3JvdXBIZWFkZXJcIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImhhc1Jvd0NsaWNrSGFuZGxlciAmJiAhX2VkaXRNb2RlID8gMCA6IG51bGxcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzKHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5uby1wb2ludGVyXT1cIiFoYXNSb3dDbGlja0hhbmRsZXIgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLXJvd109XCJfZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCBudWxsKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgbnVsbClcIlxuICAgICAgICA+PC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIl9HUk9VUF9ST1dfQ09MVU1OXCI+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1jaGV2cm9uXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pXCIgKm5nSWY9XCJpc05vcm1hbEdyb3VwUm93KHJvdylcIj7igLo8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNOb3JtYWxHcm91cFJvdyhyb3cpXCIgY2xhc3M9XCJncm91cC1rZXktbGFiZWxcIj57eyByb3dbX1JPV19HUk9VUF9LRVldIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR3JvdXBSb3dMb2FkaW5nKHJvdylcIiBjbGFzcz1cImxhenktc2tlbGV0b24gZ3JvdXAtbGF6eS1rZXktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNHcm91cFJvd1Rvb01hbnkocm93KVwiIGNsYXNzPVwiZ3JvdXAtdG9vLW1hbnktbGFiZWxcIj57eyBpMThuLmdyb3VwVG9vTWFueShyb3dbX1JPV19HUk9VUF9DT1VOVF0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLWNvdW50LWJhZGdlXCI+e3sgcm93W19ST1dfR1JPVVBfQ09VTlRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtcGFnaW5hdGlvblwiICpuZ0lmPVwiIWlzR3JvdXBDb2xsYXBzZWQocm93W19ST1dfR1JPVVBfS0VZXSkgJiYgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gPiAxXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcGFnZS1idG5cIiBbZGlzYWJsZWRdPVwicm93W19ST1dfR1JPVVBfUEFHRV0gPT09IDBcIiAoY2xpY2spPVwiZ3JvdXBQYWdlQmFjayhyb3dbX1JPV19HUk9VUF9LRVldKVwiPuKAuTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtcGFnZS1pbmZvXCI+e3sgcm93W19ST1dfR1JPVVBfUEFHRV0gKyAxIH19IC8ge3sgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1wYWdlLWJ0blwiIFtkaXNhYmxlZF09XCJyb3dbX1JPV19HUk9VUF9QQUdFXSA+PSByb3dbX1JPV19HUk9VUF9QQUdFX0NPVU5UXSAtIDFcIiAoY2xpY2spPVwiZ3JvdXBQYWdlRm9yd2FyZChyb3dbX1JPV19HUk9VUF9LRVldLCByb3dbX1JPV19HUk9VUF9DT1VOVF0pXCI+4oC6PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbX0dST1VQX1JPV19DT0xVTU5dOyB3aGVuOiBpc0dyb3VwSGVhZGVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXJvd1wiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLWxvYWRpbmddPVwiaXNHcm91cFJvd0xvYWRpbmcocm93KVwiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLXRvby1tYW55XT1cImlzR3JvdXBSb3dUb29NYW55KHJvdylcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1ncm91cC1rZXldPVwicm93W19ST1dfR1JPVVBfS0VZXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvdyBuby1kYXRhLXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vLWRhdGEtY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+PCEtLSAvdGFibGUtYm9keS1zY3JvbGwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keS1vdmVybGF5XCIgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmcgfHwgaXNFbXB0eVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhYmxlLWJvZHktb3ZlcmxheS10ZXh0XCI+e3sgZWZmZWN0aXZlSXNMb2FkaW5nID8gbG9hZGluZ1N0YXRlTGFiZWwgOiBlbXB0eVN0YXRlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PjwhLS0gL3RhYmxlLWJvZHktd3JhcHBlciAtLT5cblxuICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1iYXJcIiAqbmdJZj1cInNob3dQYWdpbmF0aW9uXCI+XG4gICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd3NcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyXCIgKm5nSWY9XCJhY3RpdmVHcm91cEJ5S2V5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyLWxlZnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcmVzZXQtYnRuXCIgKGNsaWNrKT1cIm9uR3JvdXBCeUNoYW5nZShudWxsKVwiPlxuICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImdyb3VwLXJlc2V0LWljb25cIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgOGE1IDUgMCAxIDAgNS01IDUgNSAwIDAgMC0zLjU0IDEuNDZMMyAzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAzdjIuNUg1LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICB7eyBpMThuLmdyb3VwUmVtb3ZlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1iYXItc2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtc29ydC1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXNvcnQtbGFiZWxcIj57eyBpMThuLmdyb3VwU29ydExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXNvcnQtYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJncm91cFNvcnRPcmRlciA9PT0gJ2FzYydcIiAoY2xpY2spPVwib25Hcm91cFNvcnRUb2dnbGUoJ2FzYycpXCIgW3RpdGxlXT1cImkxOG4uZ3JvdXBTb3J0QXNjXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXNvcnQtYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJncm91cFNvcnRPcmRlciA9PT0gJ2Rlc2MnXCIgKGNsaWNrKT1cIm9uR3JvdXBTb3J0VG9nZ2xlKCdkZXNjJylcIiBbdGl0bGVdPVwiaTE4bi5ncm91cFNvcnREZXNjXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVsXCI+e3sgaTE4bi5ncm91cFJvd3NQZXJHcm91cCB9fTwvZGl2PlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdFwiPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ3JvdXBQYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Hcm91cFBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1zZWxlY3QtcGFnZS1zaXplIGdyb3VwLXBhZ2Utc2l6ZS1wYW5lbFwiXG4gICAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwiJ2F1dG8nXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+e3sgZ3JvdXBQYWdlU2l6ZSA9PT0gMCA/IGkxOG4uZ3JvdXBTaG93QWxsIDogZ3JvdXBQYWdlU2l6ZSB9fTwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHQgb2YgcGFnZVNpemVPcHRpb25zR3JvdXBCeVwiIFt2YWx1ZV09XCJvcHRcIj57eyBvcHQgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj57eyBpMThuLmdyb3VwU2hvd0FsbCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
|
|
1460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixNQUFNLEVBQUUsU0FBUyxFQUE4QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDelEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFN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dGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9ySW50bCwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblByb3ZpZGVyLCBUYWJsZUV4cG9ydENvbmZpZywgVGFibGVQcmVmZXJlbmNlc0NvbmZpZywgVGFibGVQcm92aWRlciwgVGFibGVWaWV3Q29uZmlnIH0gZnJvbSAnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IEpxdEkxOG4sIEpRVF9JMThOLCBKUVRfSTE4Tl9ERUZBVUxUUyB9IGZyb20gJy4uL2pxdC1pMThuLnRva2VuJztcbmltcG9ydCB7IEpxdENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmUvanF0LWNlbGwtZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTbGljZUNvbmZpZyB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwubW9kZWwnO1xuaW1wb3J0IHsgU2xpY2VQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50JztcbmltcG9ydCB7IGdldEZyZW5jaFBhZ2luYXRvckludGwsIGh1bWFuaXplS2V5LCBub3JtYWxpemVDZWxsVmFsdWUgfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7IFZpZXdGYWNhZGUgfSBmcm9tICcuL3ZpZXcvdmlldy5mYWNhZGUnO1xuaW1wb3J0IHsgTGF6eUNvbHVtbk1hbmFnZXIgfSBmcm9tICcuL2xhenktY29sdW1uLW1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfSBmcm9tICcuL3RhYmxlLXByZWZlcmVuY2VzLm1hbmFnZXInO1xuaW1wb3J0IHsgR3JvdXBCeU1hbmFnZXIgfSBmcm9tICcuL2dyb3VwLWJ5Lm1hbmFnZXInO1xuaW1wb3J0IHsgRXhwb3J0TWFuYWdlciB9IGZyb20gJy4vZXhwb3J0Lm1hbmFnZXInO1xuaW1wb3J0IHtcbiAgR1JPVVBfUk9XX0NPTFVNTiwgR1JPVVBfSEVBREVSX01BUktFUixcbiAgR1JPVVBfS0VZX0xBWllfTE9BRElORywgR1JPVVBfS0VZX1RPT19NQU5ZLFxuICBST1dfUkFXX0tFWSwgUk9XX0lOREVYX0tFWSxcbiAgUk9XX0dST1VQX0tFWSwgUk9XX0dST1VQX0NPVU5ULCBST1dfR1JPVVBfUEFHRSwgUk9XX0dST1VQX1BBR0VfQ09VTlQsXG4gIExBWllfTE9BRElOR19WQUxVRSwgTEFaWV9FUlJPUl9WQUxVRSxcbn0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuXG4vKiogQ2FjaGUgaW50ZXJuZSBkdSBncm91cGVtZW50IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgbGVzIGRvbm7DqWVzLCBsYSBjbMOpIG91IGxlcyBwYXJhbcOodHJlcyBkZSB0cmkgY2hhbmdlbnQuICovXG5pbnRlcmZhY2UgR3JvdXBCeUNhY2hlPFQ+IHtcbiAgcm93czogVFtdO1xuICBrZXk6IHN0cmluZztcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJztcbiAgc29ydEFjdGl2ZTogc3RyaW5nO1xuICBzb3J0RGlyOiBzdHJpbmc7XG4gIG9yZGVyOiBzdHJpbmdbXTtcbiAgbWFwOiBNYXA8c3RyaW5nLCBUW10+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdqcXVlcnktdGFibGUnLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdFRhYmxlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdERpdmlkZXJNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBTbGljZVBhbmVsQ29tcG9uZW50IF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsIHVzZUZhY3Rvcnk6IGdldEZyZW5jaFBhZ2luYXRvckludGwgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc/OiBUYWJsZVByb3ZpZGVyPFQ+O1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U/OiBUW10gfCB7IGRhdGE6IFRbXSB9O1xuICBASW5wdXQoKSBkYXRhPzogVFtdO1xuICBASW5wdXQoKSBkaXNwbGF5ZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGNvbHVtbnNDb25maWc/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W107XG5cbiAgLyoqXG4gICAqIE1vZGUgSFRNTCA6IGFjdGl2ZSBldCBjb25maWd1cmUgbGUgcGFubmVhdSBWaWV3IGluZMOpcGVuZGFtbWVudCBkdSBgW2NvbmZpZ11gLlxuICAgKiBQcmVuZCBsZSBkZXNzdXMgc3VyIGBjb25maWcudmlld2Agc2kgZMOpZmluaS5cbiAgICogRXhlbXBsZSA6IGA8anF1ZXJ5LXRhYmxlIFt2aWV3XT1cInsgZW5hYmxlZDogdHJ1ZSB9XCI+YFxuICAgKi9cbiAgQElucHV0KCkgdmlldz86IFRhYmxlVmlld0NvbmZpZztcblxuICBASW5wdXQoKSBjb2x1bW5MYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBASW5wdXQoKSBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgYWRkUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5SZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PigpO1xuICBAT3V0cHV0KCkgY2F0ZWdvcnlTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIHRyaSAoeSBjb21wcmlzIGxlIHRyaSBpbml0aWFsKS4gKi9cbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgICAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnJyB9PigpO1xuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgcGFnZSBvdSBkZSB0YWlsbGUgZGUgcGFnZS4gKi9cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgICAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfT4oKTtcbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIGxhIHJlY2hlcmNoZSB0ZXh0ZS4gKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSAgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIMOJbWlzIHF1YW5kIGxlIEdyb3VwIGJ5IGNoYW5nZSAoY2zDqSBkZSBjb2xvbm5lLCBvdSBgbnVsbGAgc2kgZMOpc2FjdGl2w6kpLiAqL1xuICBAT3V0cHV0KCkgZ3JvdXBCeUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcbiAgLyoqIMOJbWlzIHF1YW5kIGxhIGxpc3RlIGRlcyBjb2xvbm5lcyB2aXNpYmxlcyBjaGFuZ2UgKGNsw6lzIGRhbnMgbOKAmW9yZHJlIGTigJlhZmZpY2hhZ2UpLiAqL1xuICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXG4gIHNldCBwYWdpbmF0b3IodmFsdWU6IE1hdFBhZ2luYXRvciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5hdHRhY2hQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfVxuICBwcml2YXRlIF9wYWdpbmF0b3I/OiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydD86IE1hdFNvcnQ7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keVNjcm9sbCcpIHRhYmxlQm9keVNjcm9sbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFNsaWNlUGFuZWxDb21wb25lbnQpIHNsaWNlUGFuZWxSZWY/OiBTbGljZVBhbmVsQ29tcG9uZW50PFQ+O1xuICBAVmlld0NoaWxkKCd2aWV3TWVudVRyaWdnZXInKSB2aWV3TWVudVRyaWdnZXI/OiBNYXRNZW51VHJpZ2dlcjtcbiAgQENvbnRlbnRDaGlsZHJlbihKcXRDZWxsRGVmRGlyZWN0aXZlKSBfY2VsbERlZnMhOiBRdWVyeUxpc3Q8SnF0Q2VsbERlZkRpcmVjdGl2ZT47XG4gIC8qKiBNYXAgY2zDqeKGklRlbXBsYXRlUmVmIHByw6ktY2FsY3Vsw6llIGRlcHVpcyBfY2VsbERlZnMuIE1pc2Ugw6Agam91ciBkYW5zIG5nQWZ0ZXJDb250ZW50SW5pdCBldCBzdXIgX2NlbGxEZWZzLmNoYW5nZXMuICovXG4gIHByaXZhdGUgX2NlbGxEZWZNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9Pj4oKTtcblxuICByZW5kZXJlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG5cbiAgLyoqIENvbnN0YW50ZSBleHBvc8OpZSBhdSB0ZW1wbGF0ZSBwb3VyIGxlIG1hdENvbHVtbkRlZiBkZSBsYSBsaWduZSBkZSBncm91cGUuICovXG4gIHJlYWRvbmx5IF9HUk9VUF9ST1dfQ09MVU1OID0gR1JPVVBfUk9XX0NPTFVNTjtcbiAgLyoqIENsw6lzIGQnYWNjw6hzIGF1eCBwcm9wcmnDqXTDqXMgZGVzIGxpZ25lcyBwcm9qZXTDqWVzIOKAlCBleHBvc8OpZXMgcG91ciBsZSB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgX1JPV19SQVdfS0VZID0gUk9XX1JBV19LRVk7XG4gIHJlYWRvbmx5IF9ST1dfSU5ERVhfS0VZID0gUk9XX0lOREVYX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9LRVkgPSBST1dfR1JPVVBfS0VZO1xuICByZWFkb25seSBfUk9XX0dST1VQX0NPVU5UID0gUk9XX0dST1VQX0NPVU5UO1xuICByZWFkb25seSBfUk9XX0dST1VQX1BBR0UgPSBST1dfR1JPVVBfUEFHRTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9QQUdFX0NPVU5UID0gUk9XX0dST1VQX1BBR0VfQ09VTlQ7XG5cbiAgLyoqIEZhY2FkZSBWaWV3IDogw6l0YXQgZXQgYWN0aW9ucyBjZW50cmFsaXPDqXMgKENoYW1wcyAvIEdyb3VwIGJ5IC8gU2xpY2UgYnkpICovXG4gIHJlYWRvbmx5IF92aWV3ID0gbmV3IFZpZXdGYWNhZGU8VD4oKTtcblxuICAvKipcbiAgICogU25hcHNob3Qgc3RhYmxlIHN5bmNocm9uaXPDqSBkZXB1aXMgX3ZpZXcuZmllbGRzLmFjdGl2ZUNvbHVtbnMgZGFucyByZWZyZXNoVmlld01vZGVsKCkuXG4gICAqIFByb3ByacOpdMOpIChub24gZ2V0dGVyKSBwb3VyIHF1J0FuZ3VsYXIgcHVpc3NlIGxhIHN1aXZyZSBzYW5zIE5HMDEwMC5cbiAgICovXG4gIGFjdGl2ZUNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuXG4gIGFjdGl2ZVNsaWNlRmlsdGVyOiAocm93OiBUKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZTtcblxuICAvLyBQcm9wcmnDqXTDqXMgc3RhYmxlcyBwb3VyIGxlcyBiaW5kaW5ncyBkdSB0ZW1wbGF0ZSAoY29udHJlIGVycmV1ciBORzAxMDApXG4gIF9zbGljZUNvbmZpZ3M6IGFueVtdID0gW107XG4gIF9zbGljZUNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuICBfc2xpY2VEYXRhOiBUW10gPSBbXTtcbiAgX3NsaWNlU2hvd1RvZ2dsZSA9IHRydWU7XG4gIC8qKiBTbmFwc2hvdCBzdGFibGUgZGUgbGEgdmlzaWJpbGl0w6kgZHUgcGFubmVhdSBzbGljZSDigJQgamFtYWlzIGNhbGN1bMOpIGRlcHVpcyBAVmlld0NoaWxkICovXG4gIF9zaG93U2xpY2VQYW5lbCA9IGZhbHNlO1xuICAvKiogU25hcHNob3Qgc3RhYmxlIGRlIGwnw6l0YXQgY29sbGFwc2VkIGR1IHBhbm5lYXUgc2xpY2UsIG1pcyDDoCBqb3VyIHZpYSAoY29sbGFwc2VkQ2hhbmdlKSAqL1xuICBfc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIC8vIETDqWzDqWd1w6lzIHZlcnMgX3ZpZXcgKGNvbnNlcnbDqXMgcG91ciBjb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSBzYW5zIHJlZmFjdG9yaW5nIEhUTUwpXG4gIGdldCBfc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHsgcmV0dXJuIHRoaXMuX3ZpZXcuc3RhdGljU2xpY2VzRm9yTWVudTsgfVxuICBnZXQgX2FjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1uczsgfVxuICBnZXQgX2F2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hdmFpbGFibGVGb3JEeW5hbWljOyB9XG4gIGdldCBfYWxsRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFsbER5bmFtaWNDb2x1bW5zOyB9XG4gIGdldCBfYWN0aXZlU2xpY2VCeUxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92aWV3LnNsaWNlQnkuYWN0aXZlTGFiZWw7IH1cbiAgX3NsaWNlQnlNZW51SXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG5cbiAgc2VhcmNoUXVlcnkgPSAnJztcbiAgZ2V0IGFjdGl2ZUdyb3VwQnlLZXkoKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLl92aWV3Lmdyb3VwQnkuYWN0aXZlS2V5OyB9XG4gIF9tYXRTb3J0QWN0aXZlID0gJyc7XG4gIF9tYXRTb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnID0gJyc7XG4gIHByaXZhdGUgX2FjdGl2ZVNvcnQ6IHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnJyB9ID0geyBhY3RpdmU6ICcnLCBkaXJlY3Rpb246ICcnIH07XG4gIHByaXZhdGUgX3NvcnRTdWJzY3JpYmVkOiBNYXRTb3J0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdG90YWxGaWx0ZXJlZENvdW50ID0gMDtcblxuICAvKiogR2VzdGlvbm5haXJlIGR1IG1vZGUgR3JvdXAgQnkgKMOpdGF0IGNvbGxhcHNlZCwgcGFnaW5hdGlvbiwgdHJpIGRlcyBncm91cGVzKS4gKi9cbiAgcmVhZG9ubHkgX2dyb3VwQnkgPSBuZXcgR3JvdXBCeU1hbmFnZXIoXG4gICAgKCkgPT4geyB0aGlzLl9wcm9qZWN0Q3VycmVudFBhZ2UoKTsgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpOyB9LFxuICAgICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICApO1xuXG4gIC8qKiBEw6lsw6lndcOpcyB2ZXJzIEdyb3VwQnlNYW5hZ2VyIHBvdXIgbGEgY29tcGF0aWJpbGl0w6kgZGVzIHRlbXBsYXRlcy4gKi9cbiAgZ2V0IGdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2dyb3VwQnkuZ3JvdXBQYWdlU2l6ZTsgfVxuICBzZXQgZ3JvdXBQYWdlU2l6ZSh2OiBudW1iZXIpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdjsgfVxuICBnZXQgZ3JvdXBTb3J0T3JkZXIoKTogJ2FzYycgfCAnZGVzYycgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlcjsgfVxuICBzZXQgZ3JvdXBTb3J0T3JkZXIodjogJ2FzYycgfCAnZGVzYycpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciA9IHY7IH1cblxuICAvKiogR2VzdGlvbm5haXJlIGR1IGN5Y2xlIGRlIHZpZSBkZXMgY29sb25uZXMgbGF6eSAoZmV0Y2gsIGFubnVsYXRpb24sIHN0YXR1dHMsIGRvbm7DqWVzKS4gKi9cbiAgcHJpdmF0ZSBfbGF6eSA9IG5ldyBMYXp5Q29sdW1uTWFuYWdlcjxUPigpO1xuICAvKiogQ29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgOiByZXRvdXJuZSBsYSBtYXAgZGUgc3RhdHV0cyBsYXp5LiAqL1xuICBnZXQgX2xhenlDb2x1bW5TdGF0dXMoKSB7IHJldHVybiB0aGlzLl9sYXp5LnN0YXR1czsgfVxuICAvKiogQ29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgOiByZXRvdXJuZSBsYSBtYXAgZGUgZG9ubsOpZXMgbGF6eS4gKi9cbiAgZ2V0IF9sYXp5Q29sdW1uRGF0YSgpIHsgcmV0dXJuIHRoaXMuX2xhenkuZGF0YTsgfVxuICBwcml2YXRlIF9jZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIF9lbCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG4gIHByaXZhdGUgX25nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9pMThuUmF3ID0gaW5qZWN0KEpRVF9JMThOLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKiBMYWJlbHMgZGUgbOKAmWludGVyZmFjZS4gRnVzaW9ubsOpcyBkZXB1aXMgSlFUX0kxOE5fREVGQVVMVFMgZXQgbGUgdG9rZW4gSlFUX0kxOE4gaW5qZWN0w6kuICovXG4gIHJlYWRvbmx5IGkxOG46IEpxdEkxOG4gPSB7IC4uLkpRVF9JMThOX0RFRkFVTFRTLCAuLi4odGhpcy5faTE4blJhdyA/PyB7fSkgfTtcblxuICBpc0dyb3VwSGVhZGVyID0gKF86IG51bWJlciwgcm93OiBhbnkpOiBib29sZWFuID0+IHJvd1tHUk9VUF9IRUFERVJfTUFSS0VSXSA9PT0gdHJ1ZTtcblxuICAvKiogUmV0b3VybmUgdHJ1ZSBzaSBsYSBsaWduZSBkZSBncm91cGUgZXN0IHVuZSBsaWduZSBub3JtYWxlIChuaSBsYXp5LCBuaSB0b28tbWFueSkuICovXG4gIGlzTm9ybWFsR3JvdXBSb3cocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldICE9PSBHUk9VUF9LRVlfTEFaWV9MT0FESU5HICYmIHJvd1tST1dfR1JPVVBfS0VZXSAhPT0gR1JPVVBfS0VZX1RPT19NQU5ZO1xuICB9XG4gIGlzR3JvdXBSb3dMb2FkaW5nKHJvdzogYW55KTogYm9vbGVhbiB7IHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gPT09IEdST1VQX0tFWV9MQVpZX0xPQURJTkc7IH1cbiAgaXNHcm91cFJvd1Rvb01hbnkocm93OiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSA9PT0gR1JPVVBfS0VZX1RPT19NQU5ZOyB9XG5cbiAgLyoqIEfDqHJlIGxlIGNsaWMgc3VyIHVuZSBsaWduZSBkJ2VuLXTDqnRlIGRlIGdyb3VwZSAobm8tb3AgcG91ciBsZXMgw6l0YXRzIHNww6ljaWF1eCkuICovXG4gIG9uR3JvdXBIZWFkZXJDbGljayhyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc05vcm1hbEdyb3VwUm93KHJvdykpIHJldHVybjtcbiAgICB0aGlzLnRvZ2dsZUdyb3VwQ29sbGFwc2Uocm93W1JPV19HUk9VUF9LRVldKTtcbiAgfVxuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZXhwb3J0IENTVi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhwb3J0ID0gbmV3IEV4cG9ydE1hbmFnZXI8VD4oXG4gICAgKCkgPT4gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLFxuICAgICgpID0+IHRoaXMuYWN0aXZlQ29sdW1ucyxcbiAgICAoKSA9PiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydCxcbiAgICAoY29sLCByb3csIGlkeCkgPT4gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpLFxuICApO1xuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGVcblxuICBwYWdlU2l6ZSA9IDU7XG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcbiAgcGFnZVNpemVPcHRpb25zR3JvdXBCeTogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcblxuICBkcmFnZ2VkQ29sdW1uS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZHJhZ092ZXJDb2x1bW5LZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIOKUgOKUgCBNb2RlIMOpZGl0aW9uIChQcsOpZsOpcmVuY2VzKVxuICAvKiogVnJhaSBxdWFuZCBsZSBtb2RlIMOpZGl0aW9uIGVzdCBhY3RpZiAocmVzaXplICsgZHJhZyBjb2xvbm5lcywgaW50ZXJhY3Rpb25zIGTDqXNhY3RpdsOpZXMpLiAqL1xuICBfZWRpdE1vZGUgPSBmYWxzZTtcbiAgLyoqIExhcmdldXJzIGRlIGNvbG9ubmVzIHBlcnNvbm5hbGlzw6llcyBwYXIgbCd1dGlsaXNhdGV1ciAoY2zDqSDihpIgcHgpLiAqL1xuICBfY29sdW1uV2lkdGhzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIC8qKiBNZXNzYWdlIGRlIGZlZWRiYWNrIGFwcsOocyBzYXZlL2NsZWFyLiBgbnVsbGAgPSBwYXMgZGUgbWVzc2FnZS4gKi9cbiAgX3ByZWZlcmVuY2VzTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWcmFpIHNpIHVuZSBjb25maWd1cmF0aW9uIGVzdCBzYXV2ZWdhcmTDqWUgcG91ciBjZSB0YWJsZWF1LiAqL1xuICBfaGFzU2F2ZWRDb25maWcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJlZmVyZW5jZXNNYW5hZ2VyOiBUYWJsZVByZWZlcmVuY2VzTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKiogdHJ1ZSB1bmUgZm9pcyBxdWUgbGUgZ3JvdXAtYnkgcGFyIGTDqWZhdXQgYSDDqXTDqSBpbml0aWFsaXPDqSAow6l2aXRlIGRlIHJlY29uZmlndXJlciBHcm91cEJ5TWFuYWdlciDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBkb25uw6llcykuICovXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNpemVTdGF0ZTogeyBrZXk6IHN0cmluZzsgc3RhcnRYOiBudW1iZXI7IHN0YXJ0V2lkdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEeW5hbWljIHNsaWNlIGtleXMgw6AgcmVzdGF1cmVyIGFwcsOocyBuZ0FmdGVyVmlld0luaXQgKHNsaWNlUGFuZWxSZWYgcGFzIGVuY29yZSBkaXNwbykuICovXG4gIHByaXZhdGUgX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRmlsdHJlcyBkZSBzbGljZSDDoCByZXN0YXVyZXIgYXByw6hzIG5nQWZ0ZXJWaWV3SW5pdCAoc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvKS4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1NsaWNlRmlsdGVyczogUmVjb3JkPG51bWJlciwgc3RyaW5nW10+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZXNvbHZlZENvbmZpZzogVGFibGVQcm92aWRlcjxUPiA9IHsgY29sdW1uczogW10gfTtcbiAgcHJpdmF0ZSBfY29sdW1uTWFwOiBNYXA8c3RyaW5nLCBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfcmVzb2x2ZWREYXRhOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSBfcHJlc2VydmVQYWdlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pbml0aWFsU2VhcmNoQXBwbGllZCA9IGZhbHNlO1xuXG4gIC8vIFNldWlsIGF1LWRlbMOgIGR1cXVlbCBsZSByZW5kdSBncm91cMOpIGVzdCBibG9xdcOpIHBvdXIgcHJvdMOpZ2VyIGxlIG5hdmlnYXRldXJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0dST1VQX0NPVU5UID0gNTAwO1xuXG4gIC8vIOKUgOKUgCBPcHRpbWlzYXRpb24gcGVyZm9ybWFuY2VcbiAgcHJpdmF0ZSBfYWxsRmlsdGVyZWRSb3dzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSBfcGFnaW5hdG9yU3Vic2NyaWJlZDogTWF0UGFnaW5hdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIENhY2hlIGdyb3VwQnkg4oCUIGludmFsaWTDqSBkw6hzIHF1ZSByb3dzL2tleS90cmkgY2hhbmdlbnQuICovXG4gIHByaXZhdGUgX2dyb3VwQ2FjaGU6IEdyb3VwQnlDYWNoZTxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wZW5kaW5nUmVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jb25maWdIaWRkZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblxuICAvKiogQ2zDqXMgZGVzIGNvbG9ubmVzIHZpc2libGVzIGR1IGRlcm5pZXIgw6ltaXNzaW9uIGNvbHVtbnNDaGFuZ2UgKHBvdXIgw6l2aXRlciBsZXMgw6ltaXNzaW9ucyBkdXBsaXF1ZW1lbnQpLiAqL1xuICBwcml2YXRlIF9wcmV2Q29sdW1uS2V5czogc3RyaW5nW10gPSBbXTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YUNoYW5nZWQgPSAhIShjaGFuZ2VzWydjb25maWcnXSB8fCBjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snZGF0YVNvdXJjZSddKTtcbiAgICBpZiAoZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2xhenkuY2FuY2VsQWxsKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiAhdGhpcy5faW5pdGlhbFNlYXJjaEFwcGxpZWQpIHtcbiAgICAgIGNvbnN0IGluaXRpYWwgPSB0aGlzLmNvbmZpZz8uc2VhcmNoPy5pbml0aWFsUXVlcnk7XG4gICAgICBpZiAoaW5pdGlhbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBpbml0aWFsO1xuICAgICAgICB0aGlzLl9pbml0aWFsU2VhcmNoQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLmZpbHRlcihjID0+IGMubGF6eSkuZm9yRWFjaChjID0+IHRoaXMudHJpZ2dlckxhenlGZXRjaChjKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlYnVpbGRDZWxsRGVmTWFwKCk7XG4gICAgdGhpcy5fY2VsbERlZnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWJ1aWxkQ2VsbERlZk1hcCgpO1xuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgdGhpcy5hdHRhY2hTb3J0KCk7XG4gICAgdGhpcy5fbWVhc3VyZUhlYWRlckhlaWdodCgpO1xuICAgIHRoaXMuX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGVuZGluZ0R5bmFtaWMgPSAhIXRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdGaWx0ZXJzID0gISF0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgIGlmICghaGFzUGVuZGluZ0R5bmFtaWMgJiYgIWhhc1BlbmRpbmdGaWx0ZXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgIGNvbnN0IGtleXMgPSBoYXNQZW5kaW5nRHluYW1pYyA/IFsuLi50aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyFdIDogW107XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPyB7IC4uLnRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgfSA6IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuXG4gICAgLy8gVG91dCBlc3QgZGlmZsOpcsOpIGRhbnMgbGUgbcOqbWUgc2V0VGltZW91dCBwb3VyIDpcbiAgICAvLyAxLiDDiXZpdGVyIE5HMDEwMCAobW9kaWZpY2F0aW9ucyBhcHLDqHMgdsOpcmlmaWNhdGlvbiBkYW5zIG5nQWZ0ZXJWaWV3SW5pdClcbiAgICAvLyAyLiBHYXJhbnRpciBxdWUgbGVzIGR5bmFtaWMgc2xpY2VzIHNvbnQgYWpvdXTDqWVzIEFWQU5UIGxhIHJlc3RhdXJhdGlvbiBkZXMgZmlsdHJlc1xuICAgIC8vICAgIChsZXMgaW5kaWNlcyBkYW5zIHNsaWNlRmlsdGVycyBkw6lwZW5kZW50IGRlIGwnb3JkcmUgZmluYWwgZGUgX2NhY2hlZFNsaWNlcylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBjb2wgPSBhbGxDb2xzLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKGNvbCkgdGhpcy5hZGREeW5hbWljU2xpY2UoY29sKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2VQYW5lbFJlZikge1xuICAgICAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZi5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzbGljZVBhbmVsUmVmIHRvdWpvdXJzIG51bGwgKGRvbm7DqWVzIHBhcyBlbmNvcmUgYXJyaXbDqWVzKSA6XG4gICAgICAgICAgLy8gcmVtZXR0cmUgZW4gYXR0ZW50ZSBwb3VyIHF1ZSBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwgbGVzIGFwcGxpcXVlXG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyKTtcbiAgICB9XG4gICAgLy8gTmV0dG9pZSB1biDDqXZlbnR1ZWwgcmVzaXplIGVuIGNvdXJzIChsaXN0ZW5lcnMgd2luZG93IG5vbiByZXRpcsOpcylcbiAgICB0aGlzLl9yZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdmlldy5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9tZWFzdXJlSGVhZGVySGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1lYXN1cmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyLm1hdC1tZGMtaGVhZGVyLXJvdycpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKGhlYWRlclJvdykge1xuICAgICAgICBjb25zdCBoID0gaGVhZGVyUm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgaWYgKGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY3R1YWwtaGVhZGVyLWhlaWdodCcsIGggKyAncHgnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhlYWRlciBwYXMgZW5jb3JlIHJlbmR1IChleDogbGF6eSBBbmd1bGFyIE1hdGVyaWFsKSwgb24gcsOpZXNzYWllIGFwcsOocyBsZSBwcm9jaGFpbiBmcmFtZVxuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBtZWFzdXJlKCkpKTtcbiAgICB9O1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbWVhc3VyZSgpKSk7XG4gIH1cblxuICAvLyDilIDilIAgR2V0dGVycyBkJ2FmZmljaGFnZVxuXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlID8/ICcnO1xuICB9XG5cbiAgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ29sdW1ucztcbiAgfVxuXG4gIGdldCBzaG93U2VhcmNoQmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LmVuYWJsZWQgPT09IHRydWU7IH1cbiAgZ2V0IHNob3dWaWV3QnV0dG9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlldy5lbmFibGVkIHx8IHRoaXMuc2hvd0V4cG9ydEJ1dHRvbiB8fCB0aGlzLnNob3dQcmVmZXJlbmNlc01lbnU7IH1cbiAgZ2V0IHNob3dTbGljZUV4cGFuZEJ0bigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgJiYgdGhpcy5fc2xpY2VTaG93VG9nZ2xlOyB9XG4gIGdldCBzaG93RXhwb3J0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydD8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuICBnZXQgc2hvd1ByZWZlcmVuY2VzTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5wcmVmZXJlbmNlcz8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuICBnZXQgaGFzU2F2ZWRQcmVmZXJlbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hhc1NhdmVkQ29uZmlnOyB9XG5cbiAgZ2V0IHNob3dUb29sYmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93U2VhcmNoQmFyIHx8IHRoaXMuc2hvd1ZpZXdCdXR0b24gfHwgdGhpcy5zaG93U2xpY2VFeHBhbmRCdG47IH1cblxuICBleHBhbmRTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8udG9nZ2xlUGFuZWwoKTtcbiAgfVxuICBnZXQgc2hvd0ZpZWxkcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2hvd0ZpZWxkczsgfVxuICBnZXQgc2hvd0dyb3VwQnlTZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlldy5zaG93R3JvdXBCeVNlY3Rpb247IH1cblxuICBnZXQgZmlsdGVyZWRSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPyB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUdyb3VwQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5hY3RpdmVHcm91cEJ5TGFiZWw7IH1cblxuICBnZXQgdG90YWxDb2x1bW5Db3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdmlldy50b3RhbENvbHVtbkNvdW50OyB9XG5cbiAgZ2V0IGFjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUxhYmVsOyB9XG5cbiAgZ2V0IGFjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1uczsgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXkpO1xuICB9XG5cbiAgZ2V0IGdyb3VwQnlDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl92aWV3Lmdyb3VwQnlDb2x1bW5zOyB9XG5cbiAgY29sTGFiZWwoY29sOiB7IGtleTogc3RyaW5nOyBoZWFkZXI/OiBzdHJpbmcgfSk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92aWV3LmNvbExhYmVsKGNvbCk7IH1cblxuICAvLyDilIDilIAgQWN0aW9ucyB1dGlsaXNhdGV1clxuXG4gIG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFF1ZXJ5KTtcbiAgfVxuXG4gIG9uR3JvdXBCeUNoYW5nZShrZXk6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3LnNldEdyb3VwQnkoa2V5KTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoa2V5ICE9PSBudWxsKTtcbiAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5ncm91cEJ5Q2hhbmdlLmVtaXQoa2V5KTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0aGlzLnZpZXdNZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2xEZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9LCAwKSk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkub25Hcm91cFBhZ2VTaXplQ2hhbmdlKE51bWJlcihzaXplKSk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwU29ydFRvZ2dsZShkaXIsIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgTGF6eSBsb2FkaW5nXG5cbiAgZ2V0TGF6eUNvbHVtblN0YXR1cyhrZXk6IHN0cmluZyk6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhenkuZ2V0U3RhdHVzKGtleSk7XG4gIH1cblxuICBnZXRMYXp5UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIHJldHVybiB0aGlzLl9sYXp5LmdldFJlbmRlclR5cGUocm93VmFsdWUpO1xuICB9XG5cbiAgcmV0cnlMYXp5Q29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkucmV0cnkoY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICB0cmlnZ2VyTGF6eUZldGNoKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkuZmV0Y2goY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICBwcml2YXRlIF9sYXp5Q2FsbGJhY2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvblJlZnJlc2g6ICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICAgICAgb25NYXJrRm9yQ2hlY2s6ICgpID0+IHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIEdyb3VwZW1lbnRcblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5LnRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXksIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0cltkYXRhLWdyb3VwLWtleT1cIiR7Q1NTLmVzY2FwZShncm91cEtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUZsb2F0KFxuICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLWFjdHVhbC1oZWFkZXItaGVpZ2h0JykgfHwgJzU2J1xuICAgICkgfHwgNTY7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByb3dSZWN0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGN1cnJlbnRTY3JvbGxUb3AgKyAocm93UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCkgLSBoZWFkZXJIZWlnaHQ7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHsgdG9wOiB0YXJnZXRTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEJ5LmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXkpO1xuICB9XG5cbiAgZ3JvdXBQYWdlQmFjayhncm91cEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VCYWNrKGdyb3VwS2V5KTtcbiAgfVxuXG4gIGdyb3VwUGFnZUZvcndhcmQoZ3JvdXBLZXk6IHN0cmluZywgdG90YWxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5LCB0b3RhbENvdW50KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb2xvbm5lc1xuXG4gIGdldCBoYXNBZGRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnMubGVuZ3RoID4gMCB8fCB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBtZW51QmFzZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnM7XG4gIH1cblxuICBnZXQgbWVudU9wdGlvbmFsQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ29sdW1uc1RvQWRkKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IG5ldyBTZXQodGhpcy5hY3RpdmVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KSk7XG4gICAgcmV0dXJuICh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4gYy5vcHRpb25hbCAmJiAhYWN0aXZlS2V5cy5oYXMoYy5rZXkpKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NvbHVtblJlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuYWxsb3dDb2x1bW5SZW1vdmFsO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNsaWNlc1xuXG4gIGdldCBoYXNTbGljZUNvbmZpZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dTbGljZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgfVxuXG4gIG9uU2xpY2VQYW5lbENvbGxhcHNlZENoYW5nZShjb2xsYXBzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0NmZyA9IHRoaXMuX3NsaWNlQ29uZmlncy5sZW5ndGggPiAwIHx8IHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHdhc1Zpc2libGUgPSB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgICB0aGlzLl9zaG93U2xpY2VQYW5lbCA9IGhhc0NmZyAmJiB0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID4gMDtcbiAgICAvLyBMZSBTbGljZVBhbmVsQ29tcG9uZW50IHZpZW50IGQnw6p0cmUgcmVuZHUgcG91ciBsYSAxw6hyZSBmb2lzXG4gICAgLy8gKGRvbm7DqWVzIGFycml2w6llcykg4oaSIGFwcGxpcXVlciBsZXMgZmlsdHJlcyBlbiBhdHRlbnRlXG4gICAgaWYgKCF3YXNWaXNpYmxlICYmIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dBZGRTbGljZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zaG93U2xpY2VCeVNlY3Rpb247XG4gIH1cblxuICBnZXQgc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zdGF0aWNTbGljZXNGb3JNZW51O1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhjb2x1bW5LZXkpO1xuICB9XG5cbiAgdG9nZ2xlU3RhdGljU2xpY2UoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSBuZXh0LmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgIGVsc2UgbmV4dC5hZGQoY29sdW1uS2V5KTtcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXh0O1xuICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICAvLyBTaSB1bmUgc2xpY2UgdmllbnQgZCfDqnRyZSBjYWNow6llLCByw6lpbml0aWFsaXNlIGxlIGZpbHRyZSBhY3RpZiBwb3VyIMOpdml0ZXJcbiAgICAvLyB1biBmaWx0cmUgb3JwaGVsaW4gKGxhIHNsaWNlIG4nZXN0IHBsdXMgdmlzaWJsZSBtYWlzIHNvbiBmaWx0cmUgcmVzdGVyYWl0IGFjdGlmKVxuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTtcbiAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZER5bmFtaWNTbGljZShjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUGFuZWxSZWY/LmFkZER5bmFtaWNTbGljZShjb2x1bW4pO1xuICAgIGlmIChjb2x1bW4ubGF6eSAmJiB0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChjb2x1bW4ua2V5KSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnM7XG4gIH1cblxuICBpc0R5bmFtaWNTbGljZUFjdGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3LmlzRHluYW1pY1NsaWNlQWN0aXZlKGtleSk7XG4gIH1cblxuICB0b2dnbGVEeW5hbWljU2xpY2UoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEeW5hbWljU2xpY2VBY3RpdmUoY29sLmtleSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgfVxuICB9XG5cbiAgb25TbGljZUZpbHRlckNoYW5nZShwcmVkOiAocm93OiBUKSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTbGljZUZpbHRlciA9IHByZWQ7XG4gICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgfVxuXG4gIG9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZShrZXlzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXcub25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXMpO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGVtcHR5U3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8uZW1wdHkgfHwgdGhpcy5pMThuLmVtcHR5U3RhdGU7XG4gIH1cblxuICBnZXQgbG9hZGluZ1N0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5sYWJlbHM/LmxvYWRpbmcgfHwgdGhpcy5pMThuLmxvYWRpbmdTdGF0ZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gX3BlbmRpbmdSZW5kZXIgOiBsZSByZW5kdSBpbnRlcm5lIG4nZXN0IHBhcyBlbmNvcmUgdGVybWluw6kg4oaSIHBhcyBkZSBtZXNzYWdlIHZpZGUgcHLDqW1hdHVyw6lcbiAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nICYmIHRoaXMuX3BlbmRpbmdSZW5kZXIgPT09IG51bGwgJiYgdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG93UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5ICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQ7XG4gIH1cblxuICBnZXQgdG90YWxSb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXBCeUtleVxuICAgICAgPyB0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhLmZpbHRlcigocikgPT4gIXJbR1JPVVBfSEVBREVSX01BUktFUl0pLmxlbmd0aFxuICAgICAgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIEdlc3Rpb24gZGVzIGNvbG9ubmVzXG5cbiAgb25BZGRDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fdmlldy5hZGRDb2x1bW4oY29sdW1uKTtcbiAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gbnVsbDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcblxuICAgIGlmIChjb2x1bW4ubGF6eSkge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRSZXF1ZXN0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY29sdW1uQWRkZWQuZW1pdChjb2x1bW4pO1xuICB9XG5cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuX3ZpZXcuaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5rZXkpO1xuXG4gICAgaWYgKGNoZWNrZWQgJiYgIWlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5vbkFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tlZCAmJiBpc1Zpc2libGUpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl92aWV3LnJlbW92ZUNvbHVtbihjb2x1bW4ua2V5KTtcbiAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IG51bGw7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICAgIHRoaXMuY29sdW1uUmVtb3ZlZC5lbWl0KGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ29sdW1ucy5zb21lKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICBvblJlbW92ZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdGl2ZUNvbHVtbnMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3ZpZXcucmVtb3ZlQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm47XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5jb2x1bW5SZW1vdmVkLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWduZXNcblxuICBwcml2YXRlIF9yZWJ1aWxkQ2VsbERlZk1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jZWxsRGVmTWFwID0gbmV3IE1hcChcbiAgICAgICh0aGlzLl9jZWxsRGVmcyA/PyBbXSkubWFwKGQgPT4gW2QuY29sdW1uS2V5LCBkLnRlbXBsYXRlXSBhcyBbc3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+XSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGtleTogc3RyaW5nKTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jZWxsRGVmTWFwLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tQ2VsbERlZnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxEZWZNYXAuc2l6ZSA+IDA7XG4gIH1cblxuICBnZXQgaGFzUm93Q2xpY2tIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkLm9ic2VydmVkIHx8ICEhdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkO1xuICB9XG5cbiAgLyoqIExhcmdldXIgbWluaW1hbGUgZHUgdGFibGVhdSBlbiBweCwgY2FsY3Vsw6llIGRlcHVpcyBsZXMgbGFyZ2V1cnMgZXhwbGljaXRlcyBkZXMgY29sb25uZXMgYWN0aXZlcy5cbiAgICogUmV0b3VybmUgbnVsbCBzaSBhdWN1bmUgY29sb25uZSBuJ2EgZGUgbGFyZ2V1ciBkw6lmaW5pZSAobGUgdGFibGVhdSByZW1wbGl0IGFsb3JzIDEwMCUgZHUgY29udGVuZXVyKS5cbiAgICogU2V1bGVzIGxlcyB2YWxldXJzIGV4cGxpY2l0ZW1lbnQgZW4gYHB4YCBzb250IHNvbW1hYmxlcyA7IGxlcyBwb3VyY2VudGFnZXMgb3UgYXV0cmVzIHVuaXTDqXMgc29udCBpZ25vcsOpcy4gKi9cbiAgZ2V0IHRhYmxlTWluV2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGFzUmVzaXplZCA9IE9iamVjdC5rZXlzKHRoaXMuX2NvbHVtbldpZHRocykubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNTb21lRXhwbGljaXRXaWR0aCA9IGhhc1Jlc2l6ZWQgfHwgdGhpcy5hY3RpdmVDb2x1bW5zLnNvbWUoYyA9PiBjLndpZHRoKTtcbiAgICBpZiAoIWhhc1NvbWVFeHBsaWNpdFdpZHRoKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmFjdGl2ZUNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLl9jb2x1bW5XaWR0aHNbY29sLmtleV0gIT0gbnVsbCkge1xuICAgICAgICBzdW0gKz0gdGhpcy5fY29sdW1uV2lkdGhzW2NvbC5rZXldO1xuICAgICAgfSBlbHNlIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgY29uc3QgaXNQeCA9IGNvbC53aWR0aC50cmltKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgncHgnKTtcbiAgICAgICAgY29uc3QgcHggPSBOdW1iZXIucGFyc2VGbG9hdChjb2wud2lkdGgpO1xuICAgICAgICBpZiAoaXNQeCAmJiAhTnVtYmVyLmlzTmFOKHB4KSkgeyBzdW0gKz0gcHg7IH1cbiAgICAgICAgZWxzZSB7IHN1bSArPSAxNTA7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1bSArPSAxMjA7IC8vIGxhcmdldXIgbWluaW1hbGUgZXN0aW3DqWUgcG91ciB1bmUgY29sb25uZSBzYW5zIGxhcmdldXIgZXhwbGljaXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdW0gKyAncHgnO1xuICB9XG5cbiAgdHJhY2tSb3dGbiA9IChfaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnkgPT5cbiAgICByb3dbR1JPVVBfSEVBREVSX01BUktFUl0gPyBgX19ncm91cF8ke3Jvd1tST1dfR1JPVVBfS0VZXX1gIDogcm93W1JPV19JTkRFWF9LRVldID8/IF9pbmRleDtcblxuICBnZXRSb3dDbGFzcyhyb3c6IGFueSk6IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5yZXNvbHZlZENvbmZpZy5yb3dDbGFzcztcbiAgICBpZiAoIWZuIHx8IHJvdz8uW0dST1VQX0hFQURFUl9NQVJLRVJdKSByZXR1cm4ge307XG4gICAgcmV0dXJuIGZuKHJvd1tST1dfUkFXX0tFWV0gPz8gcm93LCByb3dbUk9XX0lOREVYX0tFWV0gPz8gMCk7XG4gIH1cblxuICBvblJvd0NsaWNrKHJvdzogYW55LCBldmVudDogTW91c2VFdmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocm93Py5bR1JPVVBfSEVBREVSX01BUktFUl0pIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaGFzUm93Q2xpY2tIYW5kbGVyKSByZXR1cm47XG4gICAgY29uc3QgcmVzb2x2ZWQgPSAocm93Py5bUk9XX1JBV19LRVldID8/IHJvdykgYXMgVDtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnLm9uUm93U2VsZWN0ZWQ/LihyZXNvbHZlZCwgZXZlbnQpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyZXNvbHZlZCk7XG4gIH1cblxuICAvLyDilIDilIAgRHJhZyAmIGRyb3BcblxuICBvbkhlYWRlckRyYWdTdGFydChjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBjb2x1bW5LZXk7XG4gICAgdGhpcy5kcmFnT3ZlckNvbHVtbktleSA9IG51bGw7XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsIGNvbHVtbktleSk7XG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJEcmFnT3Zlcihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICgoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB8fCAhdGhpcy5kcmFnZ2VkQ29sdW1uS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gY29sdW1uS2V5O1xuICB9XG5cbiAgb25IZWFkZXJEcm9wKHRhcmdldENvbHVtbktleTogc3RyaW5nLCBldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHx8ICF0aGlzLmRyYWdnZWRDb2x1bW5LZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgbW92ZWQgPSB0aGlzLl92aWV3LnJlb3JkZXJDb2x1bW5zKHRoaXMuZHJhZ2dlZENvbHVtbktleSwgdGFyZ2V0Q29sdW1uS2V5KTtcbiAgICBpZiAoIW1vdmVkKSB7XG4gICAgICB0aGlzLm9uSGVhZGVyRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMub25IZWFkZXJEcmFnRW5kKCk7XG4gIH1cblxuICBvbkhlYWRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gbnVsbDtcbiAgfVxuXG4gIGlzSGVhZGVyRHJvcFRhcmdldChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZHJhZ2dlZENvbHVtbktleSAmJiB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID09PSBjb2x1bW5LZXkgJiYgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBjb2x1bW5LZXk7XG4gIH1cblxuICAvLyDilIDilIAgUHLDqWbDqXJlbmNlcyA6IG1vZGUgw6lkaXRpb25cblxuICBlbnRlckVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBEw6ltYXJyZSBsZSByZXNpemUgZCd1bmUgY29sb25uZSAobW91c2Vkb3duIHN1ciBsYSBwb2lnbsOpZSBkcm9pdGUpLiAqL1xuICBvblJlc2l6ZVN0YXJ0KGNvbHVtbktleTogc3RyaW5nLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZWRpdE1vZGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGggPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCd0aCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBzY3JvbGxFbCA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChzY3JvbGxFbCkge1xuICAgICAgY29uc3QgYWxsVGggPSBzY3JvbGxFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGgubWF0LW1kYy1oZWFkZXItY2VsbCcpO1xuICAgICAgYWxsVGguZm9yRWFjaCh0aEVsID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1jb2x1bW4taGVhZGVyJykgfHwgdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1zb3J0LWhlYWRlcicpIHx8ICcnO1xuICAgICAgICBjb25zdCBjb2xDbGFzcyA9IEFycmF5LmZyb20odGhFbC5jbGFzc0xpc3QpLmZpbmQoYyA9PiBjLnN0YXJ0c1dpdGgoJ21hdC1jb2x1bW4tJykpO1xuICAgICAgICBjb25zdCBjb2xLZXkgPSBjb2xDbGFzcyA/IGNvbENsYXNzLnJlcGxhY2UoJ21hdC1jb2x1bW4tJywgJycpIDogbnVsbDtcbiAgICAgICAgaWYgKGNvbEtleSAmJiB0aGlzLl9jb2x1bW5XaWR0aHNbY29sS2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhzID0geyAuLi50aGlzLl9jb2x1bW5XaWR0aHMsIFtjb2xLZXldOiB0aEVsLm9mZnNldFdpZHRoIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc2l6ZVN0YXRlID0geyBrZXk6IGNvbHVtbktleSwgc3RhcnRYOiBldmVudC5jbGllbnRYLCBzdGFydFdpZHRoOiB0aC5vZmZzZXRXaWR0aCB9O1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5fcmVzaXplU3RhdGUpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0gZS5jbGllbnRYIC0gdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRYO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg2MCwgdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRXaWR0aCArIGRlbHRhKTtcbiAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzLCBbdGhpcy5fcmVzaXplU3RhdGUua2V5XTogbmV3V2lkdGggfTtcbiAgICAgIC8vIGRldGVjdENoYW5nZXMoKSBwb3VyIGZvcmNlciBsYSBtaXNlIMOgIGpvdXIgaW1tw6lkaWF0ZSBlbiBtb2RlIE9uUHVzaFxuICAgICAgLy8gKGxlcyBsaXN0ZW5lcnMgd2luZG93IHRvdXJuZW50IGhvcnMgem9uZSBBbmd1bGFyIGF2ZWMgcnVuT3V0c2lkZUFuZ3VsYXIpXG4gICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblVwID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmVzaXplU3RhdGUgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG5cbiAgICAvLyBMaXN0ZW5lcnMgaG9ycyB6b25lIEFuZ3VsYXIgcG91ciDDqXZpdGVyIGRlcyBjeWNsZXMgQ0Qgw6AgY2hhcXVlIG1vdXNlbW92ZVxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbGEgbGFyZ2V1ciBDU1MgZCd1bmUgY29sb25uZSAocHggc2kgcGVyc29ubmFsaXPDqWUsIHNpbm9uIGxhIHZhbGV1ciBkZSBjb25maWcgb3UgYXV0bykuICovXG4gIGdldENvbHVtbldpZHRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fY29sdW1uV2lkdGhzW2tleV0gIT0gbnVsbCkgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoc1trZXldICsgJ3B4JztcbiAgICBjb25zdCBjb2wgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGNvbD8ud2lkdGggPz8gJ2F1dG8nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByw6lmw6lyZW5jZXMgOiBzYXZlIC8gY2xlYXJcblxuICBzYXZlUHJlZmVyZW5jZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIpIHJldHVybjtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VLZXlzID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcbiAgICBjb25zdCBjb25maWc6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyA9IHtcbiAgICAgIHNlYXJjaDogICAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBCeTogICAgICAgICAgICAgdGhpcy5hY3RpdmVHcm91cEJ5S2V5LFxuICAgICAgY29sdW1uT3JkZXI6ICAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KSxcbiAgICAgIHZpc2libGVDb2x1bW5zOiAgICAgIHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBjb2x1bW5XaWR0aHM6ICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9jb2x1bW5XaWR0aHMpLmxlbmd0aCA/IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzbGljZVBhbmVsQ29sbGFwc2VkOiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkLFxuICAgICAgaGlkZGVuU2xpY2VLZXlzOiAgICAgWy4uLnRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5c10sXG4gICAgICBkeW5hbWljU2xpY2VLZXlzOiAgICBkeW5hbWljU2xpY2VLZXlzLmxlbmd0aCA/IGR5bmFtaWNTbGljZUtleXMgOiB1bmRlZmluZWQsXG4gICAgICBzbGljZUZpbHRlcnM6ICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYgPyB0aGlzLnNsaWNlUGFuZWxSZWYuZ2V0QWN0aXZlRmlsdGVycygpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLnNhdmUoY29uZmlnKTtcbiAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRydWU7XG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNTYXZlZE1lc3NhZ2UpO1xuICB9XG5cbiAgY2xlYXJQcmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcikgcmV0dXJuO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5jbGVhcigpO1xuICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG5cbiAgICAvLyBDYXB0dXJlciBsZXMgZHluYW1pYyBzbGljZXMgYWN0aXZlcyBBVkFOVCBsZSByZXNldCAocmVzZXRUb0RlZmF1bHRzKCkgbGVzIHZpZGUpXG4gICAgY29uc3QgZHluYW1pY1NsaWNlc1RvUmVtb3ZlID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLnNsaWNlKCk7XG5cbiAgICAvLyBSZXNldCBjb21wbGV0IGRlIGwnw6l0YXQgdmVycyBsZXMgdmFsZXVycyBwYXIgZMOpZmF1dCBkZSBsYSBjb25maWdcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5fY29sdW1uV2lkdGhzID0ge307XG4gICAgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuICAgIC8vIFN5bmNocm9uaXNlciBsJ8OpdGF0IGludGVybmUgZHUgc2xpY2UtcGFuZWwgOiBzaSBsZSBjb21wb3NhbnQgZXN0IGVuIMOpdGF0IGNvbGxhcHNlZFxuICAgIC8vIChsJ3V0aWxpc2F0ZXVyIGwnYXZhaXQgZmVybcOpIGFwcsOocyBsYSBzYXV2ZWdhcmRlKSwgbGUgcm91dnJpciBleHBsaWNpdGVtZW50IHBvdXJcbiAgICAvLyDDqXZpdGVyIHF1ZSBkaXNwbGF5Om5vbmUgc29pdCByZXRpcsOpIG1haXMgcXVlIGlzQ29sbGFwc2VkIGludGVybmUgcmVzdGUgw6AgdHJ1ZS5cbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmPy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5zbGljZVBhbmVsUmVmLnRvZ2dsZVBhbmVsKCk7XG4gICAgfVxuICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoZmFsc2UpO1xuXG4gICAgLy8gU2xpY2VzIHN0YXRpcXVlcyA6IHJldmVuaXIgYXV4IHNldWxlcyBjZWxsZXMgY2FjaMOpZXMgcGFyIGxhIGNvbmZpZyAocGFzIHBhciBsJ3V0aWxpc2F0ZXVyKVxuICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQodGhpcy5fY29uZmlnSGlkZGVuS2V5cyk7XG4gICAgdGhpcy5fdmlldy51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG5cbiAgICAvLyBDb2xvbm5lcyBldCBncm91cEJ5IDogcmVzZXQgdmlhIGxhIGZhY2FkZSAocmV0aXJlIGxlcyBvcHRpb25uZWxsZXMsIHJlbWV0IGwnb3JkcmUgY29uZmlnKVxuICAgIHRoaXMuX3ZpZXcucmVzZXRUb0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdyb3VwQnlBcHBsaWVkID0gZmFsc2U7XG5cbiAgICAvLyBEeW5hbWljIHNsaWNlcyA6IGxlcyByZXRpcmVyIGR1IHNsaWNlIHBhbmVsIGF2ZWMgbGEgbGlzdGUgY2FwdHVyw6llIGF2YW50IGxlIHJlc2V0XG4gICAgZHluYW1pY1NsaWNlc1RvUmVtb3ZlLmZvckVhY2goY29sID0+IHtcbiAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8ucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0cmUgZGUgc2xpY2UgYWN0aWZcbiAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmKSB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoe30pO1xuXG4gICAgLy8gUmFmcmHDrmNoaXQgdG91dGUgbGEgdnVlXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcbiAgICB0aGlzLnJlbmRlcmVkQ29sdW1ucyA9IHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSk7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuXG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNDbGVhcmVkTWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9zaG93UHJlZmVyZW5jZXNNZXNzYWdlKG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIpO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG1zZztcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG51bGw7XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgNDAwMCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVByZWZlcmVuY2VzKHNhdmVkOiBpbXBvcnQoJy4uL2pxdWVyeS10YWJsZS5tb2RlbCcpLlNhdmVkVGFibGVDb25maWcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIC8vIFJlY2hlcmNoZVxuICAgIGlmIChzYXZlZC5zZWFyY2gpIHRoaXMuc2VhcmNoUXVlcnkgPSBzYXZlZC5zZWFyY2g7XG4gICAgLy8gTGFyZ2V1cnMgY29sb25uZXNcbiAgICBpZiAoc2F2ZWQuY29sdW1uV2lkdGhzKSB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7IC4uLnNhdmVkLmNvbHVtbldpZHRocyB9O1xuICAgIC8vIEdyb3VwIGJ5XG4gICAgaWYgKHNhdmVkLmdyb3VwQnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdmlldy5zZXRHcm91cEJ5KHNhdmVkLmdyb3VwQnkpO1xuICAgICAgaWYgKHNhdmVkLmdyb3VwQnkpIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBCeS5zZXREZWZhdWx0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIMOJdGF0IHBhbm5lYXUgc2xpY2VcbiAgICBpZiAoc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZDtcbiAgICAvLyBTbGljZXMgc3RhdGlxdWVzIGNhY2jDqWVzIOKAlCBvbiB1dGlsaXNlIGxhIHZhbGV1ciBleGFjdGUgc2F1dmVnYXJkw6llIChwYXMgbGVzIGRlZmF1bHRzIGRlIGNvbmZpZylcbiAgICBpZiAoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzKTtcbiAgICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIH1cbiAgICAvLyBDb2xvbm5lcyB2aXNpYmxlcyArIG9yZHJlIOKAlCByZWNvbnN0cnVpdCBhY3RpdmVDb2x1bW5zIGVuIHVuZSBzZXVsZSBwYXNzZS5cbiAgICAvLyBPbiBwYXJ0IGRlIHNhdmVkLmNvbHVtbk9yZGVyIChvcmRyZSBzYXV2ZWdhcmTDqSkgc2kgZGlzcG9uaWJsZSwgc2lub24gc2F2ZWQudmlzaWJsZUNvbHVtbnMuXG4gICAgLy8gQ2VsYSBnw6hyZSDDoCBsYSBmb2lzIDogY29sb25uZXMgb3B0aW9ubmVsbGVzIGFqb3V0w6llcywgY29sb25uZXMgcmV0aXLDqWVzLCBldCByw6lvcmRvbm5hbmNlbWVudC5cbiAgICBjb25zdCB0YXJnZXRLZXlzID0gc2F2ZWQuY29sdW1uT3JkZXIgPz8gc2F2ZWQudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKHRhcmdldEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYWxsQnlLZXkgPSBuZXcgTWFwKCh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcChjID0+IFtjLmtleSwgY10pKTtcbiAgICAgIC8vIENvbG9ubmVzIGRhbnMgbCdvcmRyZSBzYXV2ZWdhcmTDqSAob24gbmUgZ2FyZGUgcXVlIGNlbGxlcyBjb25udWVzIGRlIGxhIGNvbmZpZylcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSB0YXJnZXRLZXlzXG4gICAgICAgIC5tYXAoa2V5ID0+IGFsbEJ5S2V5LmdldChrZXkpKVxuICAgICAgICAuZmlsdGVyKChjKTogYyBpcyBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+ID0+IGMgIT09IHVuZGVmaW5lZCk7XG4gICAgICAvLyBDb2xvbm5lcyBhY3RpdmVzIGFjdHVlbGxsZW1lbnQgbm9uIHByw6lzZW50ZXMgZGFucyB0YXJnZXRLZXlzIChub24tb3B0aW9uYWwgcGFzc8OpZXMgc291cyBzaWxlbmNlKVxuICAgICAgLy8g4oaSIG9uIGxlcyBleGNsdXQgOiBsJ3V0aWxpc2F0ZXVyIGF2YWl0IGV4cGxpY2l0ZW1lbnQgY2hvaXNpIGNlIHNvdXMtZW5zZW1ibGVcbiAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fdmlldy5zZXRBY3RpdmVDb2x1bW5zKG9yZGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEeW5hbWljIHNsaWNlcyDigJQgZGlmZsOpcsOpIDogc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvbmlibGUgYXUgbW9tZW50IGRlIG5nT25DaGFuZ2VzXG4gICAgaWYgKHNhdmVkLmR5bmFtaWNTbGljZUtleXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBzYXZlZC5keW5hbWljU2xpY2VLZXlzO1xuICAgIH1cbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbFxuICAgIC8vIEZpbHRyZXMgYWN0aWZzIGR1IHNsaWNlIHBhbmVsIOKAlCB0b3Vqb3VycyBzdG9ja8OpcyBlbiBwZW5kaW5nIDpcbiAgICAvLyBhcHBsaXF1w6lzIHBhciBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cyAoc2kgZHluYW1pYyBzbGljZXMpIG91XG4gICAgLy8gcGFyIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCAocXVhbmQgbGVzIGRvbm7DqWVzIGFycml2ZW50IGV0IHJlbmRlbnQgbGUgcGFuZWwgdmlzaWJsZSlcbiAgICBpZiAoc2F2ZWQuc2xpY2VGaWx0ZXJzICYmIE9iamVjdC5rZXlzKHNhdmVkLnNsaWNlRmlsdGVycykubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gc2F2ZWQuc2xpY2VGaWx0ZXJzO1xuICAgIH1cbiAgfVxuXG4gIGNhblJlbW92ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fdmlldy5hbGxvd0NvbHVtblJlbW92YWwgJiZcbiAgICAgIGNvbHVtbi5yZW1vdmFibGUgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBpc0NlbGxFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsO1xuICB9XG5cbiAgYXNUaXRsZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHBvcnQgQ1NWXG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwb3J0LmV4cG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgLy8g4pSA4pSAIEluaXRpYWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBwcsOpZsOpcmVuY2VzIHNpIGwnb3B0aW9uIGVzdCBhY3RpdsOpZVxuICAgIGNvbnN0IHByZWZzSWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkXG4gICAgICA/IHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXMudGFibGVJZFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRJZCA9IHByZWZzSWQgPz8gbnVsbDtcbiAgICAvLyBQcsOpZsOpcmVuY2VzIMOgIGFwcGxpcXVlciBhcHLDqHMgX3ZpZXcudXBkYXRlKCkgKHF1YW5kIGFjdGl2ZUNvbHVtbnMgZXN0IGTDqWrDoCBwZXVwbMOpKVxuICAgIGxldCBwZW5kaW5nUHJlZnM6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdXJyZW50SWQgJiYgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyPy5rZXkgIT09ICgnanF0X3ByZWZzXycgKyBjdXJyZW50SWQpKSB7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIgPSBuZXcgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIoY3VycmVudElkKTtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLmhhc1NhdmVkKCk7XG4gICAgICBwZW5kaW5nUHJlZnMgPSB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIubG9hZCgpO1xuICAgIH0gZWxzZSBpZiAoIWN1cnJlbnRJZCkge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyID0gbnVsbDtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRMOpbMOoZ3VlIMOgIGxhIGZhY2FkZSA6IG1pc2Ugw6Agam91ciBkZSBsJ8OpdGF0IFZpZXcgKGNvbG9ubmVzLCBncm91cEJ5IG1ldGEsIHNsaWNlQnkgbWV0YSlcbiAgICB0aGlzLl92aWV3LnVwZGF0ZSh7XG4gICAgICBjb25maWc6IHRoaXMucmVzb2x2ZWRDb25maWcudmlldyxcbiAgICAgIGNvbHVtbnM6IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSxcbiAgICAgIHNsaWNlQ29uZmlnczogdGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10sXG4gICAgICBkZWZhdWx0R3JvdXBCeTogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0R3JvdXBCeSxcbiAgICB9KTtcblxuICAgIGlmICghcGVuZGluZ1ByZWZzICYmICF0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgJiYgIXRoaXMuX3ZpZXcuZ3JvdXBCeS51c2VyQ3VzdG9taXplZCAmJiB0aGlzLl92aWV3Lmdyb3VwQnkuYWN0aXZlS2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIFN5bmNocm9uaXNlIGxhIHByb3ByacOpdMOpIHN0YWJsZSAow6l2aXRlIE5HMDEwMCDigJQgbGEgZmFjYWRlIGVzdCBzb3VyY2UgZGUgdsOpcml0w6kpXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcblxuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcblxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5yZXNvbHZlUGFnZVNpemUoKTtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9ucygpO1xuICAgIHRoaXMucGFnZVNpemVPcHRpb25zR3JvdXBCeSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9uc0dyb3VwQnkoKTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplICE9PSAwICYmICF0aGlzLnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkuaW5jbHVkZXModGhpcy5ncm91cFBhZ2VTaXplKSkge1xuICAgICAgdGhpcy5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgIHRoaXMuYXR0YWNoU29ydCgpO1xuXG4gICAgLy8gUsOpaW5pdGlhbGlzZSBfc3RhdGljU2xpY2VIaWRkZW5LZXlzIHNldWxlbWVudCBzaSBsZXMgY2zDqXMgaGlkZGVuIGRlIGxhIGNvbmZpZyBvbnQgdnJhaW1lbnQgY2hhbmfDqVxuICAgIC8vIEVUIHF1J2lsIG4neSBhIHBhcyBkZSBwcsOpZsOpcmVuY2VzIHNhdXZlZ2FyZMOpZXMgKHF1aSBnw6lyZXJvbnQgaGlkZGVuU2xpY2VLZXlzIGVsbGVzLW3Dqm1lcykuXG4gICAgY29uc3QgbmV3Q29uZmlnSGlkZGVuID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIocyA9PiBzLmhpZGRlbiAmJiBzLmNvbHVtbktleSkubWFwKHMgPT4gcy5jb2x1bW5LZXkhKVxuICAgICk7XG4gICAgaWYgKCFUYWJsZUNvbXBvbmVudC5fc2V0c0VxdWFsKG5ld0NvbmZpZ0hpZGRlbiwgdGhpcy5fY29uZmlnSGlkZGVuS2V5cykpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ0hpZGRlbktleXMgPSBuZXdDb25maWdIaWRkZW47XG4gICAgICAvLyBOJ8OpY3Jhc2VyIF9zdGF0aWNTbGljZUhpZGRlbktleXMgcXVlIHNpIG9uIG4nZXN0IFBBUyBlbiB0cmFpbiBkJ2FwcGxpcXVlciBkZXMgcHJlZnNcbiAgICAgIC8vIChwZW5kaW5nUHJlZnMgbGVzIGfDqHJlcmEgbHVpLW3Dqm1lIHZpYSBfYXBwbHlQcmVmZXJlbmNlcyDihpIgaGlkZGVuU2xpY2VLZXlzKVxuICAgICAgaWYgKCFwZW5kaW5nUHJlZnMpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldChuZXdDb25maWdIaWRkZW4pO1xuICAgICAgICB0aGlzLl92aWV3LnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBsaXF1ZSBsZXMgcHLDqWbDqXJlbmNlcyBJQ0ksIEFQUsOIUyBfdmlldy51cGRhdGUoKSBFVCBhcHLDqHMgX2NvbmZpZ0hpZGRlbktleXMgbWlzIMOgIGpvdXIsXG4gICAgLy8gbWFpcyBhdmFudCBfY29tcHV0ZVNsaWNlQ29uZmlncygpIHBvdXIgcXVlIGhpZGRlblNsaWNlS2V5cyBzb2l0IGTDqWrDoCByZXN0YXVyw6kuXG4gICAgaWYgKHBlbmRpbmdQcmVmcykge1xuICAgICAgdGhpcy5fYXBwbHlQcmVmZXJlbmNlcyhwZW5kaW5nUHJlZnMpO1xuICAgIH1cblxuICAgIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlXG4gICAgLy8gT24gcmVjYWxjdWxlIF9zbGljZUNvbmZpZ3MgZW4gcmVmbMOpdGFudCBsJ8OpdGF0IGNvdXJhbnQgZGVzIHNsaWNlcyBjYWNow6llcyxcbiAgICAvLyBwb3VyIHF1ZSBTbGljZVBhbmVsQ29tcG9uZW50Lm5nT25Jbml0IHJlw6dvaXZlIGxhIGJvbm5lIHZhbGV1ciBkZSBgaGlkZGVuYFxuICAgIC8vIG3Dqm1lIHF1YW5kIGxlIGNvbXBvc2FudCBlc3QgY3LDqcOpIHBvdXIgbGEgMcOocmUgZm9pcyBhcHLDqHMgdW4gdG9nZ2xlLlxuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICB0aGlzLl9zbGljZUNvbHVtbnMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5fc2xpY2VEYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuICAgIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZSA9IHRoaXMucmVzb2x2ZWRDb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgIT09IGZhbHNlO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0KSB7XG4gICAgICB0aGlzLl9tYXRTb3J0QWN0aXZlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5hY3RpdmU7XG4gICAgICB0aGlzLl9tYXRTb3J0RGlyZWN0aW9uID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5kaXJlY3Rpb247XG4gICAgfVxuICAgIHRoaXMuX2J1aWxkU2xpY2VCeU1lbnVJdGVtcygpO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSB1bmlxdWVtZW50IGxlcyBzbGljZXMgdmlzaWJsZXMgKG5vbiBjYWNow6llcyBwYXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cykuXG4gICAqIExlIFNsaWNlUGFuZWxDb21wb25lbnQgYWZmaWNoZSB0b3V0IGNlIHF1J2lsIHJlw6dvaXQg4oCUIGMnZXN0IGljaSBxdWUgc2UgZmFpdCBsZSBmaWx0cmFnZS4gKi9cbiAgcHJpdmF0ZSBfY29tcHV0ZVNsaWNlQ29uZmlncygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIoXG4gICAgICBzID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldHNFcXVhbChhOiBTZXQ8c3RyaW5nPiwgYjogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYSkgaWYgKCFiLmhhcyh2KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlTWFwID0gbmV3IE1hcCh0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51Lm1hcChzID0+IFtzLmtleSwgc10pKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VTZXQgPSBuZXcgU2V0KHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sLmtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YXRpY1NsaWNlTWFwLmhhcyhjb2wua2V5KSkge1xuICAgICAgICBjb25zdCBzID0gc3RhdGljU2xpY2VNYXAuZ2V0KGNvbC5rZXkpITtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgICBzZWVuLmFkZChjb2wua2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY1NsaWNlU2V0Lmhhcyhjb2wua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IGZhbHNlLCBrZXk6IGNvbC5rZXksIHRpdGxlOiB0aGlzLmNvbExhYmVsKGNvbCksIGljb246IGNvbC5pY29uLCBjb2wgfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGljU2xpY2VzRm9yTWVudSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhzLmtleSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zID0gaXRlbXM7XG4gIH1cblxuICBnZXQgc2xpY2VCeU1lbnVJdGVtcygpIHsgcmV0dXJuIHRoaXMuX3NsaWNlQnlNZW51SXRlbXM7IH1cblxuICBvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaXNTdGF0aWMpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGljU2xpY2UoaXRlbS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5jb2wpIHtcbiAgICAgIHRoaXMudG9nZ2xlRHluYW1pY1NsaWNlKGl0ZW0uY29sKTtcbiAgICB9XG4gIH1cblxuICBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbTogeyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmlzU3RhdGljID8gdGhpcy5pc1N0YXRpY1NsaWNlVmlzaWJsZShpdGVtLmtleSkgOiB0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGl0ZW0ua2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlUmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fZXhlY3V0ZVJlbmRlcigpKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZVJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRlZ29yeVJvd3MgPSB0aGlzLmdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgLy8gRW4gbW9kZSBncm91cEJ5LCBwcm9qZWN0Um93cyBnw6hyZSB0b3V0IGxlIHRyaSBpbnRlcm5lbWVudCDigJQgcGFzIGRlIHNvcnQgZ2xvYmFsIGludXRpbGVcbiAgICAgIHRoaXMuX2FsbEZpbHRlcmVkUm93cyA9IGNhdGVnb3J5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcGFyZUZuID0gdGhpcy5fYnVpbGRTb3J0Q29tcGFyYXRvcigpO1xuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY29tcGFyZUZuID8gWy4uLmNhdGVnb3J5Um93c10uc29ydChjb21wYXJlRm4pIDogY2F0ZWdvcnlSb3dzO1xuICAgIH1cblxuICAgIC8vIE1ldHRyZSDDoCBqb3VyIGxlIHBhZ2luYXRvciBhdmVjIGxlIG5vdXZlYXUgdG90YWxcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA/PyB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDEpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IE1hdGgubWluKHNhdmVkSW5kZXgsIG1heFBhZ2UpO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgIC8vIGRldGVjdENoYW5nZXMoKSBhdSBsaWV1IGRlIG1hcmtGb3JDaGVjaygpIDogbWV0IMOgIGpvdXIgdW5pcXVlbWVudCBDRSBjb21wb3NhbnRcbiAgICAvLyBzYW5zIGTDqWNsZW5jaGVyIHVuIGN5Y2xlIENEIGdsb2JhbCBxdWkgcHJvdm9xdWVyYWl0IE5HMDEwMCBkYW5zIGxlcyBwYXJlbnRzLlxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q3VycmVudFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMucHJvamVjdFJvd3ModGhpcy5fYWxsRmlsdGVyZWRSb3dzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IDA7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2VSb3dzID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuXG4gICAgY29uc3QgcHJvamVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIHBhZ2VSb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgY29uc3QgcDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIHBbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICB9KTtcbiAgICAgIHByb2plY3RlZC5wdXNoKHApO1xuICAgIH0pO1xuICAgIHRoaXMudGFibGVEYXRhU291cmNlLmRhdGEgPSBwcm9qZWN0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWZmZWN0aXZlQ29uZmlnKCk6IFRhYmxlUHJvdmlkZXI8VD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9yZXNvbHZlZERhdGE7XG5cbiAgICBjb25zdCBjb2x1bW5zID1cbiAgICAgIGNvbmZpZy5jb2x1bW5zIHx8XG4gICAgICB0aGlzLmNvbHVtbnNDb25maWcgfHxcbiAgICAgIHRoaXMucmVzb2x2ZUNvbHVtbnNGcm9tQ29tcGF0KHJvd3MpO1xuXG4gICAgLy8gTW9kZSBIVE1MIDogW3ZpZXddIHByZW5kIGxlIGRlc3N1cyBzdXIgY29uZmlnLnZpZXcgc2kgZm91cm5pIChQaGFzZSAzKS5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3ID8/IGNvbmZpZy52aWV3O1xuXG4gICAgY29uc3QgYXV0b1RhYmxlSWQgPSBjb25maWcucHJlZmVyZW5jZXM/LnRhYmxlSWQgfHwgVGFibGVDb21wb25lbnQuX2hhc2hDb2x1bW5zKChjb2x1bW5zIHx8IFtdKS5tYXAoYyA9PiBjLmtleSkpO1xuICAgIGNvbnN0IGV4cG9ydENvbmZpZzogVGFibGVFeHBvcnRDb25maWc8VD4gPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgZmlsZW5hbWU6IGF1dG9UYWJsZUlkLFxuICAgICAgLi4uY29uZmlnLmV4cG9ydCxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJlZnNDb25maWc6IFRhYmxlUHJlZmVyZW5jZXNDb25maWcgPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdGFibGVJZDogYXV0b1RhYmxlSWQsXG4gICAgICAuLi5jb25maWcucHJlZmVyZW5jZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdmlldyxcbiAgICAgIHNsaWNlczogY29uZmlnLnNsaWNlcyB8fCBbXSxcbiAgICAgIGVuYWJsZVNsaWNlVG9nZ2xlOiBjb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgPz8gdHJ1ZSxcbiAgICAgIGV4cG9ydDogZXhwb3J0Q29uZmlnLFxuICAgICAgcHJlZmVyZW5jZXM6IHByZWZzQ29uZmlnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfaGFzaENvbHVtbnMoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ciA9IGtleXMuam9pbignfCcpO1xuICAgIGxldCBoID0gMHg4MTFjOWRjNTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgaCBePSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMHgwMTAwMDE5MykgPj4+IDA7XG4gICAgfVxuICAgIHJldHVybiBoLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGF0YSgpOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGEpKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uc0Zyb21Db21wYXQocm93czogVFtdKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnMubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbkxhYmVscz8uW2tleV0gfHwgaHVtYW5pemVLZXkoa2V5KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFJvdyA9IHJvd3NbMF0gYXMgYW55O1xuICAgIGlmICghZmlyc3RSb3cgfHwgdHlwZW9mIGZpcnN0Um93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhmaXJzdFJvdykubWFwKChrZXkpID0+ICh7XG4gICAgICBrZXksXG4gICAgICBoZWFkZXI6IHRoaXMuY29sdW1uTGFiZWxzPy5ba2V5XSB8fCBodW1hbml6ZUtleShrZXkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2F0ZWdvcnlGaWx0ZXJlZERhdGEoKTogVFtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuXG4gICAgbGV0IGZpbHRlcmVkID0gZGF0YS5maWx0ZXIodGhpcy5hY3RpdmVTbGljZUZpbHRlcik7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnk/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgY29uc3QgcmVzdHJpY3RlZEtleXMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaD8uc2VhcmNoQ29sdW1ucztcbiAgICAgIGNvbnN0IHNlYXJjaENvbHMgPSByZXN0cmljdGVkS2V5cz8ubGVuZ3RoXG4gICAgICAgID8gWy4uLnRoaXMuX2NvbHVtbk1hcC52YWx1ZXMoKV0uZmlsdGVyKGNvbCA9PiByZXN0cmljdGVkS2V5cy5pbmNsdWRlcyhjb2wua2V5KSlcbiAgICAgICAgOiBbLi4udGhpcy5fY29sdW1uTWFwLnZhbHVlcygpXTtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChyb3cpID0+XG4gICAgICAgIHNlYXJjaENvbHMuc29tZSgoY29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXREaXNwbGF5VmFsdWVGb3JTZWFyY2goY29sLCByb3cpO1xuICAgICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvamVjdFJvd3Mocm93czogVFtdKTogYW55W10ge1xuICAgIGNvbnN0IGdyb3VwS2V5ID0gdGhpcy5hY3RpdmVHcm91cEJ5S2V5O1xuXG4gICAgaWYgKCFncm91cEtleSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgcm93cy5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaW5kZXggfTtcbiAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgIHByb2plY3RlZFtjb2wua2V5XSA9IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cENvbERlZiA9IHRoaXMuX2NvbHVtbk1hcC5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGdyb3VwTGF6eVN0YXR1cyA9IGdyb3VwQ29sRGVmPy5sYXp5ID8gKHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGdyb3VwS2V5KSA/PyAnaWRsZScpIDogJ2xvYWRlZCc7XG5cbiAgICBpZiAoZ3JvdXBMYXp5U3RhdHVzICE9PSAnbG9hZGVkJykge1xuICAgICAgdGhpcy5fdG90YWxGaWx0ZXJlZENvdW50ID0gcm93cy5sZW5ndGg7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9MQVpZX0xPQURJTkcsIFtST1dfR1JPVVBfQ09VTlRdOiByb3dzLmxlbmd0aCwgW1JPV19HUk9VUF9QQUdFXTogMCwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogMSB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVTb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuXG4gICAgLy8gVsOpcmlmaWUgc2kgbGUgY2FjaGUgZXN0IGVuY29yZSB2YWxpZGUgKG3Dqm1lIHLDqWbDqXJlbmNlIGRlIHJvd3MgKyBtw6ptZSBwYXJhbcOodHJlcyBkZSB0cmkvZ3JvdXBlKVxuICAgIGNvbnN0IGNhY2hlVmFsaWQgPVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5yb3dzID09PSByb3dzICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLmtleSA9PT0gZ3JvdXBLZXkgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydE9yZGVyID09PSB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnRBY3RpdmUgPT09IChlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJykgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydERpciA9PT0gKGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uID8/ICcnKTtcblxuICAgIGxldCBncm91cE9yZGVyOiBzdHJpbmdbXTtcbiAgICBsZXQgZ3JvdXBNYXA6IE1hcDxzdHJpbmcsIFRbXT47XG5cbiAgICBpZiAoY2FjaGVWYWxpZCkge1xuICAgICAgZ3JvdXBPcmRlciA9IHRoaXMuX2dyb3VwQ2FjaGUhLm9yZGVyO1xuICAgICAgZ3JvdXBNYXAgPSB0aGlzLl9ncm91cENhY2hlIS5tYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByw6ktY2FsY3VsIGRlcyB2YWxldXJzIGRlIGdyb3VwZSBlbiB1biBzZXVsIHBhc3NhZ2UgKMOpdml0ZSBPKG4pIGZpbmQoKSBwYXIgY29tcGFyYWlzb24pXG4gICAgICBjb25zdCBncm91cFZhbHVlQ2FjaGUgPSBuZXcgTWFwPFQsIHN0cmluZz4oKTtcbiAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gZ3JvdXBWYWx1ZUNhY2hlLnNldChyb3csIFN0cmluZyh0aGlzLmdldExhenlBd2FyZVZhbHVlKGdyb3VwS2V5LCByb3cpID8/ICcnKSkpO1xuXG4gICAgICAvLyBQcsOpLWNhbGN1bCBkZXMgdmFsZXVycyBkZSB0cmkgKMOpdml0ZSBPKG4gbG9nIG4pIMOXIGdldExhenlBd2FyZVZhbHVlIGRhbnMgbGUgY29tcGFyYXRldXIpXG4gICAgICBsZXQgZmFzdENvbXBhcmVGbjogKChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoZWZmZWN0aXZlU29ydC5hY3RpdmUgJiYgZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgc29ydFZhbHVlQ2FjaGUgPSBuZXcgTWFwPFQsIGFueT4oKTtcbiAgICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiBzb3J0VmFsdWVDYWNoZS5zZXQocm93LCB0aGlzLmdldExhenlBd2FyZVZhbHVlKGVmZmVjdGl2ZVNvcnQuYWN0aXZlLCByb3cpKSk7XG4gICAgICAgIGNvbnN0IGRpciA9IGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uO1xuICAgICAgICBmYXN0Q29tcGFyZUZuID0gKGE6IFQsIGI6IFQpOiBudW1iZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhID0gc29ydFZhbHVlQ2FjaGUuZ2V0KGEpO1xuICAgICAgICAgIGNvbnN0IHZiID0gc29ydFZhbHVlQ2FjaGUuZ2V0KGIpO1xuICAgICAgICAgIGxldCBjbXAgPSAwO1xuICAgICAgICAgIGlmICh0eXBlb2YgdmEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNtcCA9IHZhIDwgdmIgPyAtMSA6IHZhID4gdmIgPyAxIDogMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2EgPSB2YSA9PSBudWxsID8gJycgOiBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBzYiA9IHZiID09IG51bGwgPyAnJyA6IFN0cmluZyh2YikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNtcCA9IHNhIDwgc2IgPyAtMSA6IHNhID4gc2IgPyAxIDogMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpciA9PT0gJ2FzYycgPyBjbXAgOiAtY21wO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCB2YSA9IGdyb3VwVmFsdWVDYWNoZS5nZXQoYSkhO1xuICAgICAgICBjb25zdCB2YiA9IGdyb3VwVmFsdWVDYWNoZS5nZXQoYikhO1xuICAgICAgICBjb25zdCBjbXAgPSB2YS5sb2NhbGVDb21wYXJlKHZiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwQnkuZ3JvdXBTb3J0T3JkZXIgPT09ICdkZXNjJyA/IC1jbXAgOiBjbXA7XG4gICAgICB9KTtcblxuICAgICAgZ3JvdXBPcmRlciA9IFtdO1xuICAgICAgZ3JvdXBNYXAgPSBuZXcgTWFwPHN0cmluZywgVFtdPigpO1xuICAgICAgc29ydGVkLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ3JvdXBWYWx1ZUNhY2hlLmdldChyb3cpITtcbiAgICAgICAgaWYgKCFncm91cE1hcC5oYXMoZ3JvdXBWYWx1ZSkpIHtcbiAgICAgICAgICBncm91cE9yZGVyLnB1c2goZ3JvdXBWYWx1ZSk7XG4gICAgICAgICAgZ3JvdXBNYXAuc2V0KGdyb3VwVmFsdWUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBncm91cE1hcC5nZXQoZ3JvdXBWYWx1ZSkhLnB1c2gocm93KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUcmkgaW50cmEtZ3JvdXBlIHN0b2Nrw6kgZGFucyBsZSBjYWNoZSDigJQgw6l2aXRlIGxlIHJlLXRyaSBzdXIgY29sbGFwc2UvZXhwYW5kL3BhZ2luYXRpb25cbiAgICAgIGlmIChmYXN0Q29tcGFyZUZuKSB7XG4gICAgICAgIGNvbnN0IGZuID0gZmFzdENvbXBhcmVGbjtcbiAgICAgICAgZ3JvdXBNYXAuZm9yRWFjaCgoZ3JvdXBSb3dzLCBrZXkpID0+IHtcbiAgICAgICAgICBncm91cE1hcC5zZXQoa2V5LCBbLi4uZ3JvdXBSb3dzXS5zb3J0KGZuKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBNaXNlIGVuIGNhY2hlXG4gICAgICB0aGlzLl9ncm91cENhY2hlID0ge1xuICAgICAgICByb3dzLFxuICAgICAgICBrZXk6IGdyb3VwS2V5LFxuICAgICAgICBzb3J0T3JkZXI6IHRoaXMuX2dyb3VwQnkuZ3JvdXBTb3J0T3JkZXIsXG4gICAgICAgIHNvcnRBY3RpdmU6IGVmZmVjdGl2ZVNvcnQuYWN0aXZlID8/ICcnLFxuICAgICAgICBzb3J0RGlyOiBlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbiA/PyAnJyxcbiAgICAgICAgb3JkZXI6IGdyb3VwT3JkZXIsXG4gICAgICAgIG1hcDogZ3JvdXBNYXAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX3RvdGFsRmlsdGVyZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xuXG4gICAgLy8gUHJvdGVjdGlvbiBjb250cmUgbGVzIGpldXggZGUgZG9ubsOpZXMgw6AgdHJvcCBoYXV0ZSBjYXJkaW5hbGl0w6lcbiAgICBpZiAoZ3JvdXBPcmRlci5sZW5ndGggPiBUYWJsZUNvbXBvbmVudC5NQVhfR1JPVVBfQ09VTlQpIHtcbiAgICAgIHJldHVybiBbeyBbR1JPVVBfSEVBREVSX01BUktFUl06IHRydWUsIFtST1dfR1JPVVBfS0VZXTogR1JPVVBfS0VZX1RPT19NQU5ZLCBbUk9XX0dST1VQX0NPVU5UXTogZ3JvdXBPcmRlci5sZW5ndGgsIFtST1dfR1JPVVBfUEFHRV06IDAsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IDEgfV07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdyb3VwUGFnZVNpemU7XG4gICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gICAgZ3JvdXBPcmRlci5mb3JFYWNoKChncm91cFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBncm91cFJvd3MgPSBncm91cE1hcC5nZXQoZ3JvdXBWYWx1ZSkhO1xuICAgICAgY29uc3QgdG90YWxDb3VudCA9IGdyb3VwUm93cy5sZW5ndGg7XG4gICAgICBjb25zdCBjdXJyZW50UGFnZSA9IHBhZ2VTaXplID09PSAwID8gMCA6IHRoaXMuX2dyb3VwQnkuZ2V0UGFnZShncm91cFZhbHVlKTtcbiAgICAgIGNvbnN0IHBhZ2VDb3VudCA9IHBhZ2VTaXplID09PSAwID8gMSA6IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbENvdW50IC8gcGFnZVNpemUpKTtcbiAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuaXNHcm91cENvbGxhcHNlZChncm91cFZhbHVlKTtcblxuICAgICAgcmVzdWx0LnB1c2goeyBbR1JPVVBfSEVBREVSX01BUktFUl06IHRydWUsIFtST1dfR1JPVVBfS0VZXTogZ3JvdXBWYWx1ZSwgW1JPV19HUk9VUF9DT1VOVF06IHRvdGFsQ291bnQsIFtST1dfR1JPVVBfUEFHRV06IGN1cnJlbnRQYWdlLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiBwYWdlQ291bnQgfSk7XG5cbiAgICAgIGlmICghY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFnZVNpemUgPT09IDAgPyAwIDogY3VycmVudFBhZ2UgKiBwYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgZW5kID0gcGFnZVNpemUgPT09IDAgPyB0b3RhbENvdW50IDogTWF0aC5taW4oc3RhcnQgKyBwYWdlU2l6ZSwgdG90YWxDb3VudCk7XG4gICAgICAgIGdyb3VwUm93cy5zbGljZShzdGFydCwgZW5kKS5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZHggPSBzdGFydCArIGk7XG4gICAgICAgICAgY29uc3QgcHJvamVjdGVkOiBhbnkgPSB7IFtST1dfUkFXX0tFWV06IHJvdywgW1JPV19JTkRFWF9LRVldOiBpZHggfTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTb3J0Q29tcGFyYXRvcigpOiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCBudWxsIHtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuICAgIGNvbnN0IHsgYWN0aXZlLCBkaXJlY3Rpb24gfSA9IHNvcnQ7XG4gICAgaWYgKCFhY3RpdmUgfHwgIWRpcmVjdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IHZhID0gdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGEpO1xuICAgICAgY29uc3QgdmIgPSB0aGlzLmdldExhenlBd2FyZVZhbHVlKGFjdGl2ZSwgYik7XG4gICAgICBsZXQgY21wID0gMDtcbiAgICAgIGlmICh0eXBlb2YgdmEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY21wID0gdmEgPCB2YiA/IC0xIDogdmEgPiB2YiA/IDEgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2EgPSB2YSA9PSBudWxsID8gJycgOiBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNiID0gdmIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjbXAgPSBzYSA8IHNiID8gLTEgOiBzYSA+IHNiID8gMSA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNtcCA6IC1jbXA7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsYSB2YWxldXIgdGVsbGUgcXUnZWxsZSBlc3QgYWZmaWNow6llIGRhbnMgbGEgY2VsbHVsZSwgZW4gc3VpdmFudCBleGFjdGVtZW50XG4gICAqIGxlIG3Dqm1lIGNoZW1pbiBxdWUgcmVzb2x2ZUNlbGxWYWx1ZSDigJQgdXRpbGlzw6llIHBvdXIgbGEgcmVjaGVyY2hlIHBsZWluLXRleHRlLlxuICAgKiBOZSBwYXNzZSBwYXMgcGFyIHNvcnRWYWx1ZSAodmFsZXVyIGJydXRlIGRlIHRyaSkgY29udHJhaXJlbWVudCDDoCBnZXRMYXp5QXdhcmVWYWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBUKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgIT09ICdsb2FkZWQnKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHJvd01hcCA9IHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2wua2V5KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgfVxuICAgIGlmIChjb2wuc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2wuc2VhcmNoVmFsdWUocm93LCAwKTtcbiAgICB9XG4gICAgY29uc3QgcmF3VmFsdWUgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93LCAwKSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2x1bW5LZXkpPy5nZXQocm93KSA/PyBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sRGVmPy5zb3J0VmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnNvcnRWYWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8udmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnZhbHVlKHJvdywgMCkpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBhbnkpW2NvbHVtbktleV07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDZWxsVmFsdWUoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+LCByb3c6IFQsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChjb2wubGF6eSkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoY29sLmtleSkgPz8gJ2lkbGUnO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnKSByZXR1cm4gTEFaWV9MT0FESU5HX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykgcmV0dXJuIExBWllfRVJST1JfVkFMVUU7XG4gICAgICBpZiAoc3RhdHVzID09PSAnbG9hZGVkJykge1xuICAgICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUHJvdmlkZXIgPSBjb2wudmFsdWU7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZVByb3ZpZGVyID8gdmFsdWVQcm92aWRlcihyb3csIGluZGV4KSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplIHx8IDUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnMgfHwgWzUsIDEwLCAyMF07XG4gICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQob3B0aW9ucy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSA+IDApKV07XG5cbiAgICBpZiAoIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplKSkge1xuICAgICAgdW5pcXVlLnB1c2godGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYWdlU2l6ZU9wdGlvbnNHcm91cEJ5KCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5IHx8IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2KSA9PiB2ID4gMCkpXTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplID4gMCAmJiAhdW5pcXVlLmluY2x1ZGVzKHRoaXMuZ3JvdXBQYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMuZ3JvdXBQYWdlU2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zO1xuICAgIGlmIChvcHRpb25zPy5sZW5ndGgpIHJldHVybiBvcHRpb25zWzBdO1xuICAgIHJldHVybiBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgNTtcbiAgfVxuXG4gIHByaXZhdGUgdW5pcXVlQ29sdW1uc0J5S2V5KGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY29sdW1uLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUGFnaW5hdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdGlvbikge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG5cbiAgICBpZiAodGhpcy5fcGFnaW5hdG9yU3Vic2NyaWJlZCAhPT0gdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IhLnBhZ2VTaXplO1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdpbmF0b3IhLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZSB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5fcHJvamVjdEN1cnJlbnRQYWdlKCk7XG4gICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc29ydCkgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2Uuc29ydCA9IG51bGwgYXMgYW55O1xuXG4gICAgaWYgKHRoaXMuX3NvcnRTdWJzY3JpYmVkICE9PSB0aGlzLnNvcnQpIHtcbiAgICAgIHRoaXMuX3NvcnRTdWJzY3JpYmVkID0gdGhpcy5zb3J0O1xuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hY3RpdmVTb3J0ID0ge1xuICAgICAgICAgIGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSxcbiAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlOiB0aGlzLnNvcnQuYWN0aXZlLCBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24gfSk7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwianF1ZXJ5LXRhYmxlLXdyYXBwZXJcIj5cbiAgPGhlYWRlciBjbGFzcz1cInRhYmxlLWhlYWRlclwiICpuZ0lmPVwic2hvd1RpdGxlXCI+XG4gICAgPGgzPnt7IHRpdGxlIH19PC9oMz5cbiAgPC9oZWFkZXI+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtbGF5b3V0XCJcbiAgICBbY2xhc3Mubm8tc2xpY2VdPVwiIV9zaG93U2xpY2VQYW5lbCB8fCBfc2xpY2VQYW5lbENvbGxhcHNlZFwiXG4gID5cbiAgICA8c2xpY2UtcGFuZWxcbiAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFfc2hvd1NsaWNlUGFuZWwgfHwgX3NsaWNlUGFuZWxDb2xsYXBzZWQgPyAnbm9uZScgOiBudWxsXCJcbiAgICAgIFtzbGljZUNvbmZpZ3NdPVwiX3NsaWNlQ29uZmlnc1wiXG4gICAgICBbY29sdW1uc109XCJfc2xpY2VDb2x1bW5zXCJcbiAgICAgIFtkYXRhXT1cIl9zbGljZURhdGFcIlxuICAgICAgW2xhenlEYXRhXT1cIl9sYXp5Q29sdW1uRGF0YVwiXG4gICAgICBbbGF6eVN0YXR1c109XCJfbGF6eUNvbHVtblN0YXR1c1wiXG4gICAgICBbc2hvd1RvZ2dsZV09XCJfc2xpY2VTaG93VG9nZ2xlXCJcbiAgICAgIFtjb2xsYXBzZWRCeURlZmF1bHRdPVwiX3NsaWNlUGFuZWxDb2xsYXBzZWRcIlxuICAgICAgKGZpbHRlckNoYW5nZSk9XCJvblNsaWNlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGR5bmFtaWNTbGljZUtleXNDaGFuZ2UpPVwib25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNsaWNlUGFuZWxDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvc2xpY2UtcGFuZWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtc2hlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10b29sYmFyXCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdG9vbGJhci1sZWZ0XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U2xpY2VFeHBhbmRCdG5cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNsaWNlLWV4cGFuZC1idG5cIlxuICAgICAgICAgICAgW3RpdGxlXT1cImkxOG4uZXhwYW5kRmlsdGVyVGl0bGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNsaWNlUGFuZWwoKVwiXG4gICAgICAgICAgPjxtYXQtaWNvbiBjbGFzcz1cInNsaWNlLWV4cGFuZC1tYXQtaWNvblwiPmZpbHRlcl9saXN0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiIGNsYXNzPVwic2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZWFyY2gtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjguNVwiIGN5PVwiOC41XCIgcj1cIjUuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAxM0wxNyAxN1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaTE4bi5zZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlYXJjaFF1ZXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VhcmNoLWNsZWFyLWJ0blwiIChjbGljayk9XCJzZWFyY2hRdWVyeSA9ICcnOyBvblNlYXJjaENoYW5nZSgpXCI+w5c8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VhcmNoLWNvdW50XCIgKm5nSWY9XCIhZWZmZWN0aXZlSXNMb2FkaW5nXCI+e3sgZmlsdGVyZWRSb3dDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY291bnQtbG9hZGVyXCIgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dWaWV3QnV0dG9uXCIgY2xhc3M9XCJ0YWJsZS10b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dWaWV3QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1idG5cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld01lbnVcIiAjdmlld01lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWaWV3J1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1idG4taWNvblwiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxtYXQtbWVudSAjdmlld01lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctbWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93RmllbGRzXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmllbGRzU3ViTWVudVwiIGNsYXNzPVwidmlldy1tZW51LXN1Yi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi1sYWJlbFwiPnt7IGkxOG4udmlld01lbnVGaWVsZHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi12YWx1ZVwiPnt7IHZpc2libGVDb2x1bW5zLmxlbmd0aCB9fS97eyB0b3RhbENvbHVtbkNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0dyb3VwQnlTZWN0aW9uXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBCeVN1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnZpZXdNZW51R3JvdXBCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXZhbHVlXCI+e3sgYWN0aXZlR3JvdXBCeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0FkZFNsaWNlQnV0dG9uXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2xpY2VCeVN1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnZpZXdNZW51U2xpY2VCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXZhbHVlXCI+e3sgYWN0aXZlU2xpY2VCeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtZXhwb3J0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIiBtYXQtbWVudS1pdGVtIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1leHBvcnQtaXRlbVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkV4cG9ydCgpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWV4cG9ydC1pY29uXCI+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLmV4cG9ydEJ1dHRvbkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJzaG93UHJlZmVyZW5jZXNNZW51XCIgY2xhc3M9XCJ2aWV3LW1lbnUtZXhwb3J0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dQcmVmZXJlbmNlc01lbnVcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcmVmZXJlbmNlc1N1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnByZWZlcmVuY2VzTWVudUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjcHJlZmVyZW5jZXNTdWJNZW51PVwibWF0TWVudVwiIFtwYW5lbENsYXNzXT1cIid2aWV3LXN1Ym1lbnUtcGFuZWwnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1zdWJtZW51XCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cImVudGVyRWRpdE1vZGUoKTsgdmlld01lbnVUcmlnZ2VyLmNsb3NlTWVudSgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5wcmVmZXJlbmNlc0VkaXQgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cInNhdmVQcmVmZXJlbmNlcygpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBpMThuLnByZWZlcmVuY2VzU2F2ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiIFtkaXNhYmxlZF09XCIhaGFzU2F2ZWRQcmVmZXJlbmNlc1wiIChtb3VzZWRvd24pPVwiY2xlYXJQcmVmZXJlbmNlcygpOyB2aWV3TWVudVRyaWdnZXIuY2xvc2VNZW51KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5wcmVmZXJlbmNlc0NsZWFyIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjZmllbGRzU3ViTWVudT1cIm1hdE1lbnVcIiBbcGFuZWxDbGFzc109XCIndmlldy1zdWJtZW51LXBhbmVsJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctc3VibWVudVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1pdGVtXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBtZW51QmFzZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29sdW1uLm9wdGlvbmFsICYmICFhbGxvd0NvbHVtblJlbW92YWxcIlxuICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbiwgIWlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1jaGVja1wiPnt7IGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGNvbHVtbi5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBjb2xMYWJlbChjb2x1bW4pIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudU9wdGlvbmFsQ29sdW1ucy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgbWVudU9wdGlvbmFsQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSAmJiB2aXNpYmxlQ29sdW1ucy5sZW5ndGggPT09IDEpIHx8IGdldExhenlDb2x1bW5TdGF0dXMoY29sdW1uLmtleSkgPT09ICdsb2FkaW5nJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2x1bW4sICFpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1jaGVja1wiPnt7IGlzQ29sdW1uVmlzaWJsZShjb2x1bW4ua2V5KSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvblwiIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgY29sdW1uLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAge3sgY29sTGFiZWwoY29sdW1uKSB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4ubGF6eSAmJiBnZXRMYXp5Q29sdW1uU3RhdHVzKGNvbHVtbi5rZXkpID09PSAnbG9hZGluZydcIiBjbGFzcz1cImxhenktbWVudS1zcGlubmVyXCI+4oa7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4ubGF6eSAmJiBnZXRMYXp5Q29sdW1uU3RhdHVzKGNvbHVtbi5rZXkpID09PSAnZXJyb3InXCIgY2xhc3M9XCJsYXp5LW1lbnUtZXJyb3JcIiBbdGl0bGVdPVwiaTE4bi5sYXp5RXJyb3JNZW51VGl0bGVcIj7imqA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjZ3JvdXBCeVN1Yk1lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctc3VibWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXN1Ym1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgZ3JvdXBCeUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkdyb3VwQnlDaGFuZ2UoYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleSA/IG51bGwgOiBjb2wua2V5KVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LWNoZWNrXCI+e3sgYWN0aXZlR3JvdXBCeUtleSA9PT0gY29sLmtleSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGNvbC5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBjb2xMYWJlbChjb2wpIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cblxuICAgICAgICAgIDxtYXQtbWVudSAjc2xpY2VCeVN1Yk1lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctc3VibWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXN1Ym1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNsaWNlQnlNZW51SXRlbXNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTbGljZU1lbnVJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU2xpY2VNZW51SXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIj57eyBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbSkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIml0ZW0uaWNvblwiIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgaXRlbS5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktd3JhcHBlclwiPlxuXG4gICAgICA8IS0tIEJhbm5pw6hyZSBtZXNzYWdlIHByw6lmw6lyZW5jZXMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiX3ByZWZlcmVuY2VzTWVzc2FnZVwiIGNsYXNzPVwicHJlZmVyZW5jZXMtbWVzc2FnZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJwcmVmZXJlbmNlcy1tZXNzYWdlLWljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBfcHJlZmVyZW5jZXNNZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQm91dG9uIGRlIGNvbmZpcm1hdGlvbiBkdSBtb2RlIMOpZGl0aW9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImVkaXQtY29uZmlybS1idG5cIlxuICAgICAgICBbdGl0bGVdPVwiaTE4bi5wcmVmZXJlbmNlc0NvbmZpcm1FZGl0XCJcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1FZGl0TW9kZSgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5LXNjcm9sbFwiICN0YWJsZUJvZHlTY3JvbGw+XG4gICAgICA8dGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgY2xhc3M9XCJqcXVlcnktdGFibGVcIlxuICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwidGFibGVNaW5XaWR0aFwiXG4gICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tSb3dGblwiXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiX21hdFNvcnRBY3RpdmVcIiBbbWF0U29ydERpcmVjdGlvbl09XCJfbWF0U29ydERpcmVjdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5rZXlcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFttYXQtc29ydC1oZWFkZXJdPVwiKCFfZWRpdE1vZGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkgPyBjb2x1bW4ua2V5IDogJydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9lZGl0TW9kZSB8fCBjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJhZy1lbmFibGVkXT1cImlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJvcC10YXJnZXRdPVwiaXNIZWFkZXJEcm9wVGFyZ2V0KGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtaGVhZGVyXT1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25IZWFkZXJEcmFnT3Zlcihjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uSGVhZGVyRHJvcChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1jZWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uXCIgY2xhc3M9XCJoZWFkLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2x1bW4uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC10ZXh0XCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj57eyBjb2x1bW4uaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uSGVhZGVyRHJhZ1N0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIChkcmFnZW5kKT1cIm9uSGVhZGVyRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBQb2lnbsOpZSBkZSByZXNpemUgKHZpc2libGUgdW5pcXVlbWVudCBlbiBtb2RlIMOpZGl0aW9uKSAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldENvbHVtbldpZHRoKGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtY2VsbF09XCJfZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2VkaXRNb2RlOyBlbHNlIGVkaXRNb2RlQ2VsbFRwbFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q2VsbFRlbXBsYXRlKGNvbHVtbi5rZXkpIGFzIGN1c3RvbVRwbDsgZWxzZSBkZWZhdWx0Q2VsbFRwbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3dbX1JPV19SQVdfS0VZXSwgaW5kZXg6IHJvd1tfUk9XX0lOREVYX0tFWV0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRwbD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubGF6eSA/IGdldExhenlSZW5kZXJUeXBlKHJvd1tjb2x1bW4ua2V5XSkgOiAndmFsdWUnXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2xvYWRpbmcnXCIgY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yJ1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImxhenktZXJyb3ItYnRuXCIgKGNsaWNrKT1cInJldHJ5TGF6eUNvbHVtbihjb2x1bW4pXCIgW3RpdGxlXT1cImkxOG4ubGF6eUVycm9yVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LWVycm9yLWljb25cIj7imqA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1lcnJvci1sYWJlbFwiPnt7IGkxOG4ubGF6eVJldHJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiY2VsbC10ZXh0XCIgW2NsYXNzLmNlbGwtZW1wdHldPVwiaXNDZWxsRW1wdHkocm93W2NvbHVtbi5rZXldKVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyBpc0NlbGxFbXB0eShyb3dbY29sdW1uLmtleV0pID8gaTE4bi5jZWxsRW1wdHkgOiByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGVDZWxsVHBsPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNlbGwtdGV4dCBjZWxsLWVkaXQtbW9kZVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwicmVuZGVyZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICA8dHJcbiAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHJlbmRlcmVkQ29sdW1uczsgd2hlbjogIWlzR3JvdXBIZWFkZXJcIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImhhc1Jvd0NsaWNrSGFuZGxlciAmJiAhX2VkaXRNb2RlID8gMCA6IG51bGxcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzKHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5uby1wb2ludGVyXT1cIiFoYXNSb3dDbGlja0hhbmRsZXIgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLXJvd109XCJfZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCBudWxsKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgbnVsbClcIlxuICAgICAgICA+PC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIl9HUk9VUF9ST1dfQ09MVU1OXCI+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1jaGV2cm9uXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pXCIgKm5nSWY9XCJpc05vcm1hbEdyb3VwUm93KHJvdylcIj7igLo8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNOb3JtYWxHcm91cFJvdyhyb3cpXCIgY2xhc3M9XCJncm91cC1rZXktbGFiZWxcIj57eyByb3dbX1JPV19HUk9VUF9LRVldIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR3JvdXBSb3dMb2FkaW5nKHJvdylcIiBjbGFzcz1cImxhenktc2tlbGV0b24gZ3JvdXAtbGF6eS1rZXktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNHcm91cFJvd1Rvb01hbnkocm93KVwiIGNsYXNzPVwiZ3JvdXAtdG9vLW1hbnktbGFiZWxcIj57eyBpMThuLmdyb3VwVG9vTWFueShyb3dbX1JPV19HUk9VUF9DT1VOVF0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLWNvdW50LWJhZGdlXCI+e3sgcm93W19ST1dfR1JPVVBfQ09VTlRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtcGFnaW5hdGlvblwiICpuZ0lmPVwiIWlzR3JvdXBDb2xsYXBzZWQocm93W19ST1dfR1JPVVBfS0VZXSkgJiYgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gPiAxXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcGFnZS1idG5cIiBbZGlzYWJsZWRdPVwicm93W19ST1dfR1JPVVBfUEFHRV0gPT09IDBcIiAoY2xpY2spPVwiZ3JvdXBQYWdlQmFjayhyb3dbX1JPV19HUk9VUF9LRVldKVwiPuKAuTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtcGFnZS1pbmZvXCI+e3sgcm93W19ST1dfR1JPVVBfUEFHRV0gKyAxIH19IC8ge3sgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1wYWdlLWJ0blwiIFtkaXNhYmxlZF09XCJyb3dbX1JPV19HUk9VUF9QQUdFXSA+PSByb3dbX1JPV19HUk9VUF9QQUdFX0NPVU5UXSAtIDFcIiAoY2xpY2spPVwiZ3JvdXBQYWdlRm9yd2FyZChyb3dbX1JPV19HUk9VUF9LRVldLCByb3dbX1JPV19HUk9VUF9DT1VOVF0pXCI+4oC6PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbX0dST1VQX1JPV19DT0xVTU5dOyB3aGVuOiBpc0dyb3VwSGVhZGVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXJvd1wiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLWxvYWRpbmddPVwiaXNHcm91cFJvd0xvYWRpbmcocm93KVwiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLXRvby1tYW55XT1cImlzR3JvdXBSb3dUb29NYW55KHJvdylcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1ncm91cC1rZXldPVwicm93W19ST1dfR1JPVVBfS0VZXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvdyBuby1kYXRhLXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vLWRhdGEtY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+PCEtLSAvdGFibGUtYm9keS1zY3JvbGwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keS1vdmVybGF5XCIgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmcgfHwgaXNFbXB0eVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhYmxlLWJvZHktb3ZlcmxheS10ZXh0XCI+e3sgZWZmZWN0aXZlSXNMb2FkaW5nID8gbG9hZGluZ1N0YXRlTGFiZWwgOiBlbXB0eVN0YXRlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PjwhLS0gL3RhYmxlLWJvZHktd3JhcHBlciAtLT5cblxuICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1iYXJcIiBbY2xhc3MuaXMtbG9hZGluZ109XCJlZmZlY3RpdmVJc0xvYWRpbmdcIiAqbmdJZj1cInNob3dQYWdpbmF0aW9uXCI+XG4gICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd3NcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLXJhbmdlLWxvYWRlclwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXJcIiAqbmdJZj1cImFjdGl2ZUdyb3VwQnlLZXlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItbGVmdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1yZXNldC1idG5cIiAoY2xpY2spPVwib25Hcm91cEJ5Q2hhbmdlKG51bGwpXCI+XG4gICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiZ3JvdXAtcmVzZXQtaWNvblwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA4YTUgNSAwIDEgMCA1LTUgNSA1IDAgMCAwLTMuNTQgMS40NkwzIDNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDN2Mi41SDUuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIHt7IGkxOG4uZ3JvdXBSZW1vdmUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJhci1zZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1zb3J0LWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtc29ydC1sYWJlbFwiPnt7IGkxOG4uZ3JvdXBTb3J0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtc29ydC1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdyb3VwU29ydE9yZGVyID09PSAnYXNjJ1wiIChjbGljayk9XCJvbkdyb3VwU29ydFRvZ2dsZSgnYXNjJylcIiBbdGl0bGVdPVwiaTE4bi5ncm91cFNvcnRBc2NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfdXB3YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtc29ydC1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdyb3VwU29ydE9yZGVyID09PSAnZGVzYydcIiAoY2xpY2spPVwib25Hcm91cFNvcnRUb2dnbGUoJ2Rlc2MnKVwiIFt0aXRsZV09XCJpMThuLmdyb3VwU29ydERlc2NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWxcIj57eyBpMThuLmdyb3VwUm93c1Blckdyb3VwIH19PC9kaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCIgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cFBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXNlbGVjdC1wYWdlLXNpemUgZ3JvdXAtcGFnZS1zaXplLXBhbmVsXCJcbiAgICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCInYXV0bydcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj57eyBncm91cFBhZ2VTaXplID09PSAwID8gaTE4bi5ncm91cFNob3dBbGwgOiBncm91cFBhZ2VTaXplIH19PC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBwYWdlU2l6ZU9wdGlvbnNHcm91cEJ5XCIgW3ZhbHVlXT1cIm9wdFwiPnt7IG9wdCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMFwiPnt7IGkxOG4uZ3JvdXBTaG93QWxsIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
|