@trudb/tru-common-lib 0.0.793 → 0.0.795

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.
@@ -4,6 +4,7 @@ import { forkJoin, skip } from 'rxjs';
4
4
  import * as _ from 'underscore';
5
5
  import { TruDataGridLoadingOverlay } from './overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay';
6
6
  import { TruDataGridNoRowsOverlay } from './overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay';
7
+ import { EntityAction } from 'breeze-client';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "../../services/tru-data-context";
9
10
  import * as i2 from "../../services/tru-search-result-view-manager";
@@ -110,6 +111,11 @@ export class TruDataGrid {
110
111
  this.subs.push(this.searchViewEventHandler.onSearch().pipe(skip(1)).subscribe((setupQuery) => {
111
112
  this.onSearch(setupQuery);
112
113
  }));
114
+ this.subs.push(this.dataContext.onPropertyChanged().subscribe((changeArgs) => {
115
+ if (changeArgs.entityAction === EntityAction.Attach) {
116
+ this.addEntity(changeArgs.entity);
117
+ }
118
+ }));
113
119
  this.subs.push(this.connectionHub.subscribe(this.dataContext, this.config.resultConfig.entityType, this.config.tableName, () => { return this.loadedEntities; }, () => { return this.latestSetupQuery; }, this.config.resultConfig.expands, [], () => { return true; }).subscribe(() => {
114
120
  this.gridOptions.api.refreshCells({ force: true });
115
121
  }));
@@ -179,6 +185,34 @@ export class TruDataGrid {
179
185
  }
180
186
  return false;
181
187
  };
188
+ addEntity = (newEntity) => {
189
+ if (this.gridType === TruDataGridTypes.DetailManyToMany) {
190
+ let parentName = this.entity.constructor.name;
191
+ let unassociatedType = this.config.resultConfig.entityManyToManyType;
192
+ let ref = this.selectedUnassociatedChoice.value.$;
193
+ let childToAssociate = this.dataContext.entityAccess().searchByRefCacheOnly(unassociatedType, ref, true);
194
+ if (childToAssociate) {
195
+ let enhancedEntity = this.enhanceRowDataForEntity(newEntity);
196
+ enhancedEntity.$entity[unassociatedType.name + 'Ref'] = childToAssociate[unassociatedType.name + 'Ref'];
197
+ enhancedEntity.$entity[parentName + 'Ref'] = this.entity[parentName + 'Ref'];
198
+ // remove item from the add dropdown control
199
+ let itemIndex = this.unassociatedChoices.findIndex((choice) => {
200
+ return choice[unassociatedType.name + 'Ref'] === childToAssociate[unassociatedType.name + 'Ref'];
201
+ });
202
+ this.unassociatedChoices.splice(itemIndex, 1);
203
+ // clear add selection
204
+ this.selectedUnassociatedChoice = undefined;
205
+ // add row to grid
206
+ this.unsavedEntities.push(enhancedEntity);
207
+ this.gridOptions.api.applyTransaction({ add: [enhancedEntity], addIndex: 0 });
208
+ }
209
+ }
210
+ else {
211
+ let enhancedEntity = this.enhanceRowDataForEntity(newEntity);
212
+ this.rowData.unshift(enhancedEntity);
213
+ this.gridOptions.api.applyTransaction({ add: [enhancedEntity], addIndex: 0 });
214
+ }
215
+ };
182
216
  defaultColDef = {
183
217
  suppressKeyboardEvent: this.onSuppressKeyboardEvent
184
218
  };
@@ -285,34 +319,7 @@ export class TruDataGrid {
285
319
  return true;
286
320
  };
287
321
  onAdd = () => {
288
- if (this.gridType === TruDataGridTypes.DetailManyToMany) {
289
- let parentName = this.entity.constructor.name;
290
- let associatedType = this.config.resultConfig.entityType;
291
- let unassociatedType = this.config.resultConfig.entityManyToManyType;
292
- let ref = this.selectedUnassociatedChoice.value.$;
293
- let childToAssociate = this.dataContext.entityAccess().searchByRefCacheOnly(unassociatedType, ref, true);
294
- if (childToAssociate) {
295
- // create many-to-many entity
296
- let newEntity = this.enhanceRowDataForEntity(this.dataContext.entityAccess().add(associatedType));
297
- newEntity.$entity[unassociatedType.name + 'Ref'] = childToAssociate[unassociatedType.name + 'Ref'];
298
- newEntity.$entity[parentName + 'Ref'] = this.entity[parentName + 'Ref'];
299
- // remove item from the add dropdown control
300
- let itemIndex = this.unassociatedChoices.findIndex((choice) => {
301
- return choice[unassociatedType.name + 'Ref'] === childToAssociate[unassociatedType.name + 'Ref'];
302
- });
303
- this.unassociatedChoices.splice(itemIndex, 1);
304
- // clear add selection
305
- this.selectedUnassociatedChoice = undefined;
306
- // add row to grid
307
- this.unsavedEntities.push(newEntity);
308
- this.gridOptions.api.applyTransaction({ add: [newEntity], addIndex: 0 });
309
- }
310
- }
311
- else {
312
- let newEntity = this.enhanceRowDataForEntity(this.dataContext.entityAccess().add(this.config.resultConfig.entityType));
313
- this.rowData.unshift(newEntity);
314
- this.gridOptions.api.applyTransaction({ add: [newEntity], addIndex: 0 });
315
- }
322
+ this.dataContext.entityAccess().add(this.config.resultConfig.entityType);
316
323
  };
317
324
  onDelete = () => {
318
325
  let selectedRows = this.gridOptions.api.getSelectedRows();
@@ -367,11 +374,11 @@ export class TruDataGrid {
367
374
  this.subs.forEach(s => s.unsubscribe());
368
375
  }
369
376
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDataGrid, deps: [{ token: i1.TruDataContext }, { token: i2.TruSearchResultViewManager }, { token: i3.TruAppEnvironment }, { token: i4.TruSearchViewEventHandler }, { token: i5.TruUiNotification }, { token: i6.TruConnectionHub }], target: i0.ɵɵFactoryTarget.Component });
370
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TruDataGrid, selector: "tru-data-grid", inputs: { config: "config", entity: "entity", name: "name" }, host: { properties: { "class.tru-data-grid": "true" } }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <div class=\"tru-data-grid-toolbar-container\">\r\n <tru-toolbar>\r\n <tru-toolbar-dropdown [options]=\"unassociatedChoices\"\r\n [(selectedOption)]=\"selectedUnassociatedChoice\"\r\n (selectionChange)=\"onUnassociatedChoiceChanged($event)\"\r\n *ngIf=\"gridType == TruDataGridTypes.DetailManyToMany\">\r\n </tru-toolbar-dropdown>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-add-icon'\" [tooltip]=\"'Add - [Ctrl + I]'\" [disabled]=\"!canAdd()\" (onClick)=\"onAdd()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-delete-icon'\" [tooltip]=\"'Delete - [Ctrl + D]'\" (click)=\"onDelete()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-keep-icon'\" [tooltip]=\"'Keep selected records - [Ctrl + K]'\" (click)=\"onKeep()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-remove-icon'\" [tooltip]=\"'Remove selected records - [Ctrl + R]'\" (click)=\"onRemove()\"></tru-toolbar-button>\r\n <tru-toolbar-separator></tru-toolbar-separator>\r\n <ng-container *ngTemplateOutlet=\"parentToolbarTemplate\"></ng-container>\r\n <tru-toolbar-separator *ngIf=\"gridType == TruDataGridTypes.Search\"></tru-toolbar-separator>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-export-icon'\" [tooltip]=\"'Export'\" (click)=\"onExport()\"></tru-toolbar-button>\r\n </tru-toolbar>\r\n </div>\r\n <div class=\"tru-data-grid-container\">\r\n <ag-grid-angular class=\"ag-theme-alpine\"\r\n [gridOptions]=\"gridOptions\"\r\n [rowData]=\"rowData\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [headerHeight]=\"25\"\r\n [rowHeight]=\"25\"\r\n [rowBuffer]=\"50\"\r\n [enterNavigatesVertically]=\"true\"\r\n [enterNavigatesVerticallyAfterEdit]=\"true\"\r\n [suppressRowHoverHighlight]=\"true\"\r\n (cellDoubleClicked)=\"onCellDoubleClicked($event)\"\r\n (cellKeyDown)=\"onCellKeyDown($event)\"\r\n (cellFocused)=\"onCellFocused($event)\"\r\n (rowDataChanged)=\"onRowDataChanged($event)\">\r\n </ag-grid-angular>\r\n </div>\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-values-container\">\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getRowCount()}}</p>\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getSelectedRowCount()}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-data-grid:first-of-type+.tru-data-grid{margin-left:5px}.tru-data-grid-toolbar-container{display:inline-flex}.tru-data-grid-container{min-height:200px}.tru-data-grid-statusbar-container{position:absolute!important;left:0;right:0;bottom:0;height:23px;background:#006dcc;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e7e7e7}.tru-data-grid-statusbar-container p{float:left;color:#fff;font-weight:700;margin-left:10px;margin-top:0!important;line-height:23px}.detail-container .tru-data-grid{position:relative}.detail-container .mat-mdc-tab-body-content{height:100%;overflow:hidden!important}ag-grid-angular{position:absolute;inset:28px 0 23px;width:100%;height:100%}.ag-root-wrapper{border-top:0px!important}.ag-root{top:0;bottom:23px!important;height:calc(100% - 23px)}.ag-root.ag-layout-normal{height:calc(100% - 23px)!important}.ag-header-cell{padding-left:0!important;padding-right:0!important}.ag-header-cell-resize:after{top:unset!important;height:25px!important}.ag-header-row{font-weight:500!important}.ag-header-cell-label{justify-content:center}.ag-row .ag-cell-value{padding-left:2px!important;padding-right:2px!important}.ag-row .ag-cell-value.invalid{border:1px solid red!important}.ag-cell-inline-editing{height:24px!important}.ag-cell{border-right:solid #dde2eb 1px!important}.ag-has-focus .ag-cell-focus:not(.ag-cell-inline-editing){border-right:solid #2196f3 1px!important}.ag-pinned-left-cols-container .ag-cell.ag-cell-focus{border:solid #dde2eb 1px!important;border-top:0px!important;border-bottom:0px!important}.ag-pinned-left-cols-container .ag-row-selected .ag-cell,.ag-pinned-left-cols-container .ag-row-focus .ag-cell{border:0px solid #dde2eb!important;border-right:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-header-cell.ag-column-focus{border:0px solid #dde2eb!important;border-bottom:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-pk-aligned-cell{text-align:center}.ag-horizontal-left-spacer{overflow:hidden}.ag-pinned-left-cols-container .ag-cell:hover{background-color:#2196f31a!important}.ag-root-wrapper-body.ag-layout-normal{margin-bottom:28px}.ag-grid-row-has-changes-gradient{background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#fff,endColorstr=#ffffff);background-image:linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-ms-linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(25%,#ffffff),color-stop(100%,#dbffdf))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spin{animation-name:spin;animation-duration:4s;animation-iteration-count:infinite;animation-timing-function:linear}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i8.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "suppressServerSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i9.TruToolbar, selector: "tru-toolbar", inputs: ["config"] }, { kind: "component", type: i10.TruToolbarButton, selector: "tru-toolbar-button", inputs: ["config", "icon", "text", "disabled", "tooltip", "type"], outputs: ["onClick", "onKeydown"] }, { kind: "component", type: i11.TruToolbarDropdown, selector: "tru-toolbar-dropdown", inputs: ["config", "options", "selectedOption", "disabled"], outputs: ["selectedOptionChange", "selectionChange"] }, { kind: "component", type: i12.TruToolbarSeparator, selector: "tru-toolbar-separator" }], encapsulation: i0.ViewEncapsulation.None });
377
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TruDataGrid, selector: "tru-data-grid", inputs: { config: "config", entity: "entity", name: "name" }, host: { properties: { "class.tru-data-grid": "true" } }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <div class=\"tru-data-grid-toolbar-container\">\r\n <tru-toolbar>\r\n <tru-toolbar-dropdown [options]=\"unassociatedChoices\"\r\n [(selectedOption)]=\"selectedUnassociatedChoice\"\r\n (selectionChange)=\"onUnassociatedChoiceChanged($event)\"\r\n *ngIf=\"gridType == TruDataGridTypes.DetailManyToMany\">\r\n </tru-toolbar-dropdown>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-add-icon'\" [tooltip]=\"'Add - [Ctrl + I]'\" [disabled]=\"!canAdd()\" (onClick)=\"onAdd()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-delete-icon'\" [tooltip]=\"'Delete - [Ctrl + D]'\" (click)=\"onDelete()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-keep-icon'\" [tooltip]=\"'Keep selected records - [Ctrl + K]'\" (click)=\"onKeep()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-remove-icon'\" [tooltip]=\"'Remove selected records - [Ctrl + R]'\" (click)=\"onRemove()\"></tru-toolbar-button>\r\n <tru-toolbar-separator></tru-toolbar-separator>\r\n <ng-container *ngTemplateOutlet=\"parentToolbarTemplate\"></ng-container>\r\n <tru-toolbar-separator *ngIf=\"gridType == TruDataGridTypes.Search\"></tru-toolbar-separator>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-export-icon'\" [tooltip]=\"'Export'\" (click)=\"onExport()\"></tru-toolbar-button>\r\n </tru-toolbar>\r\n </div>\r\n <div class=\"tru-data-grid-container\">\r\n <ag-grid-angular class=\"ag-theme-alpine\"\r\n [gridOptions]=\"gridOptions\"\r\n [rowData]=\"rowData\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [headerHeight]=\"25\"\r\n [rowHeight]=\"25\"\r\n [rowBuffer]=\"50\"\r\n [enterNavigatesVertically]=\"true\"\r\n [enterNavigatesVerticallyAfterEdit]=\"true\"\r\n [suppressRowHoverHighlight]=\"true\"\r\n (cellDoubleClicked)=\"onCellDoubleClicked($event)\"\r\n (cellKeyDown)=\"onCellKeyDown($event)\"\r\n (cellFocused)=\"onCellFocused($event)\"\r\n (rowDataChanged)=\"onRowDataChanged($event)\">\r\n </ag-grid-angular>\r\n </div>\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-values-container\">\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getRowCount()}}</p>\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getSelectedRowCount()}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-data-grid:first-of-type+.tru-data-grid{margin-left:5px}.tru-data-grid-toolbar-container{display:inline-flex}.tru-data-grid-container{min-height:200px}.tru-data-grid-statusbar-container{position:absolute!important;left:0;right:0;bottom:0;height:23px;background:#006dcc;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e7e7e7}.tru-data-grid-statusbar-container p{float:left;color:#fff;font-weight:700;margin-left:10px;margin-top:0!important;line-height:23px}.detail-container .tru-data-grid{position:relative}.detail-container .mat-mdc-tab-body-content{height:100%;overflow:hidden!important}ag-grid-angular{position:absolute;inset:28px 0 23px;width:100%;height:100%}.ag-root-wrapper{border-top:0px!important}.ag-root{top:0;bottom:23px!important;height:calc(100% - 23px)}.ag-root.ag-layout-normal{height:calc(100% - 23px)!important}.ag-header-cell{padding-left:0!important;padding-right:0!important}.ag-header-cell-resize:after{top:unset!important;height:25px!important}.ag-header-row{font-weight:500!important}.ag-header-cell-label{justify-content:center}.ag-row .ag-cell-value{padding-left:2px!important;padding-right:2px!important}.ag-row .ag-cell-value.invalid{border:1px solid red!important}.ag-cell-inline-editing{height:24px!important}.ag-cell{border-right:solid #dde2eb 1px!important}.ag-has-focus .ag-cell-focus:not(.ag-cell-inline-editing){border-right:solid #2196f3 1px!important}.ag-pinned-left-cols-container .ag-cell.ag-cell-focus{border:solid #dde2eb 1px!important;border-top:0px!important;border-bottom:0px!important}.ag-pinned-left-cols-container .ag-row-selected .ag-cell,.ag-pinned-left-cols-container .ag-row-focus .ag-cell{border:0px solid #dde2eb!important;border-right:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-header-cell.ag-column-focus{border:0px solid #dde2eb!important;border-bottom:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-pk-aligned-cell{text-align:center}.ag-horizontal-left-spacer{overflow:hidden}.ag-pinned-left-cols-container .ag-cell:hover{background-color:#2196f31a!important}.ag-root-wrapper-body.ag-layout-normal{margin-bottom:28px}.ag-overlay-loading-center{border:none!important;box-shadow:none!important}.ag-grid-row-has-changes-gradient{background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#fff,endColorstr=#ffffff);background-image:linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-ms-linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(25%,#ffffff),color-stop(100%,#dbffdf))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spin{animation-name:spin;animation-duration:4s;animation-iteration-count:infinite;animation-timing-function:linear}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i8.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "suppressServerSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i9.TruToolbar, selector: "tru-toolbar", inputs: ["config"] }, { kind: "component", type: i10.TruToolbarButton, selector: "tru-toolbar-button", inputs: ["config", "icon", "text", "disabled", "tooltip", "type"], outputs: ["onClick", "onKeydown"] }, { kind: "component", type: i11.TruToolbarDropdown, selector: "tru-toolbar-dropdown", inputs: ["config", "options", "selectedOption", "disabled"], outputs: ["selectedOptionChange", "selectionChange"] }, { kind: "component", type: i12.TruToolbarSeparator, selector: "tru-toolbar-separator" }], encapsulation: i0.ViewEncapsulation.None });
371
378
  }
372
379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDataGrid, decorators: [{
373
380
  type: Component,
374
- args: [{ selector: 'tru-data-grid', encapsulation: ViewEncapsulation.None, host: { '[class.tru-data-grid]': 'true' }, template: "<div>\r\n <div class=\"tru-data-grid-toolbar-container\">\r\n <tru-toolbar>\r\n <tru-toolbar-dropdown [options]=\"unassociatedChoices\"\r\n [(selectedOption)]=\"selectedUnassociatedChoice\"\r\n (selectionChange)=\"onUnassociatedChoiceChanged($event)\"\r\n *ngIf=\"gridType == TruDataGridTypes.DetailManyToMany\">\r\n </tru-toolbar-dropdown>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-add-icon'\" [tooltip]=\"'Add - [Ctrl + I]'\" [disabled]=\"!canAdd()\" (onClick)=\"onAdd()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-delete-icon'\" [tooltip]=\"'Delete - [Ctrl + D]'\" (click)=\"onDelete()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-keep-icon'\" [tooltip]=\"'Keep selected records - [Ctrl + K]'\" (click)=\"onKeep()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-remove-icon'\" [tooltip]=\"'Remove selected records - [Ctrl + R]'\" (click)=\"onRemove()\"></tru-toolbar-button>\r\n <tru-toolbar-separator></tru-toolbar-separator>\r\n <ng-container *ngTemplateOutlet=\"parentToolbarTemplate\"></ng-container>\r\n <tru-toolbar-separator *ngIf=\"gridType == TruDataGridTypes.Search\"></tru-toolbar-separator>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-export-icon'\" [tooltip]=\"'Export'\" (click)=\"onExport()\"></tru-toolbar-button>\r\n </tru-toolbar>\r\n </div>\r\n <div class=\"tru-data-grid-container\">\r\n <ag-grid-angular class=\"ag-theme-alpine\"\r\n [gridOptions]=\"gridOptions\"\r\n [rowData]=\"rowData\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [headerHeight]=\"25\"\r\n [rowHeight]=\"25\"\r\n [rowBuffer]=\"50\"\r\n [enterNavigatesVertically]=\"true\"\r\n [enterNavigatesVerticallyAfterEdit]=\"true\"\r\n [suppressRowHoverHighlight]=\"true\"\r\n (cellDoubleClicked)=\"onCellDoubleClicked($event)\"\r\n (cellKeyDown)=\"onCellKeyDown($event)\"\r\n (cellFocused)=\"onCellFocused($event)\"\r\n (rowDataChanged)=\"onRowDataChanged($event)\">\r\n </ag-grid-angular>\r\n </div>\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-values-container\">\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getRowCount()}}</p>\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getSelectedRowCount()}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-data-grid:first-of-type+.tru-data-grid{margin-left:5px}.tru-data-grid-toolbar-container{display:inline-flex}.tru-data-grid-container{min-height:200px}.tru-data-grid-statusbar-container{position:absolute!important;left:0;right:0;bottom:0;height:23px;background:#006dcc;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e7e7e7}.tru-data-grid-statusbar-container p{float:left;color:#fff;font-weight:700;margin-left:10px;margin-top:0!important;line-height:23px}.detail-container .tru-data-grid{position:relative}.detail-container .mat-mdc-tab-body-content{height:100%;overflow:hidden!important}ag-grid-angular{position:absolute;inset:28px 0 23px;width:100%;height:100%}.ag-root-wrapper{border-top:0px!important}.ag-root{top:0;bottom:23px!important;height:calc(100% - 23px)}.ag-root.ag-layout-normal{height:calc(100% - 23px)!important}.ag-header-cell{padding-left:0!important;padding-right:0!important}.ag-header-cell-resize:after{top:unset!important;height:25px!important}.ag-header-row{font-weight:500!important}.ag-header-cell-label{justify-content:center}.ag-row .ag-cell-value{padding-left:2px!important;padding-right:2px!important}.ag-row .ag-cell-value.invalid{border:1px solid red!important}.ag-cell-inline-editing{height:24px!important}.ag-cell{border-right:solid #dde2eb 1px!important}.ag-has-focus .ag-cell-focus:not(.ag-cell-inline-editing){border-right:solid #2196f3 1px!important}.ag-pinned-left-cols-container .ag-cell.ag-cell-focus{border:solid #dde2eb 1px!important;border-top:0px!important;border-bottom:0px!important}.ag-pinned-left-cols-container .ag-row-selected .ag-cell,.ag-pinned-left-cols-container .ag-row-focus .ag-cell{border:0px solid #dde2eb!important;border-right:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-header-cell.ag-column-focus{border:0px solid #dde2eb!important;border-bottom:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-pk-aligned-cell{text-align:center}.ag-horizontal-left-spacer{overflow:hidden}.ag-pinned-left-cols-container .ag-cell:hover{background-color:#2196f31a!important}.ag-root-wrapper-body.ag-layout-normal{margin-bottom:28px}.ag-grid-row-has-changes-gradient{background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#fff,endColorstr=#ffffff);background-image:linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-ms-linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(25%,#ffffff),color-stop(100%,#dbffdf))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spin{animation-name:spin;animation-duration:4s;animation-iteration-count:infinite;animation-timing-function:linear}\n"] }]
381
+ args: [{ selector: 'tru-data-grid', encapsulation: ViewEncapsulation.None, host: { '[class.tru-data-grid]': 'true' }, template: "<div>\r\n <div class=\"tru-data-grid-toolbar-container\">\r\n <tru-toolbar>\r\n <tru-toolbar-dropdown [options]=\"unassociatedChoices\"\r\n [(selectedOption)]=\"selectedUnassociatedChoice\"\r\n (selectionChange)=\"onUnassociatedChoiceChanged($event)\"\r\n *ngIf=\"gridType == TruDataGridTypes.DetailManyToMany\">\r\n </tru-toolbar-dropdown>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-add-icon'\" [tooltip]=\"'Add - [Ctrl + I]'\" [disabled]=\"!canAdd()\" (onClick)=\"onAdd()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-delete-icon'\" [tooltip]=\"'Delete - [Ctrl + D]'\" (click)=\"onDelete()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-keep-icon'\" [tooltip]=\"'Keep selected records - [Ctrl + K]'\" (click)=\"onKeep()\"></tru-toolbar-button>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-remove-icon'\" [tooltip]=\"'Remove selected records - [Ctrl + R]'\" (click)=\"onRemove()\"></tru-toolbar-button>\r\n <tru-toolbar-separator></tru-toolbar-separator>\r\n <ng-container *ngTemplateOutlet=\"parentToolbarTemplate\"></ng-container>\r\n <tru-toolbar-separator *ngIf=\"gridType == TruDataGridTypes.Search\"></tru-toolbar-separator>\r\n <tru-toolbar-button [icon]=\"'tru-toolbar-export-icon'\" [tooltip]=\"'Export'\" (click)=\"onExport()\"></tru-toolbar-button>\r\n </tru-toolbar>\r\n </div>\r\n <div class=\"tru-data-grid-container\">\r\n <ag-grid-angular class=\"ag-theme-alpine\"\r\n [gridOptions]=\"gridOptions\"\r\n [rowData]=\"rowData\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [headerHeight]=\"25\"\r\n [rowHeight]=\"25\"\r\n [rowBuffer]=\"50\"\r\n [enterNavigatesVertically]=\"true\"\r\n [enterNavigatesVerticallyAfterEdit]=\"true\"\r\n [suppressRowHoverHighlight]=\"true\"\r\n (cellDoubleClicked)=\"onCellDoubleClicked($event)\"\r\n (cellKeyDown)=\"onCellKeyDown($event)\"\r\n (cellFocused)=\"onCellFocused($event)\"\r\n (rowDataChanged)=\"onRowDataChanged($event)\">\r\n </ag-grid-angular>\r\n </div>\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-container\">\r\n <div class=\"tru-data-grid-statusbar-values-container\">\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getRowCount()}}</p>\r\n <p class=\"tru-data-grid-statusbar-values-text\">{{getSelectedRowCount()}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-data-grid:first-of-type+.tru-data-grid{margin-left:5px}.tru-data-grid-toolbar-container{display:inline-flex}.tru-data-grid-container{min-height:200px}.tru-data-grid-statusbar-container{position:absolute!important;left:0;right:0;bottom:0;height:23px;background:#006dcc;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e7e7e7}.tru-data-grid-statusbar-container p{float:left;color:#fff;font-weight:700;margin-left:10px;margin-top:0!important;line-height:23px}.detail-container .tru-data-grid{position:relative}.detail-container .mat-mdc-tab-body-content{height:100%;overflow:hidden!important}ag-grid-angular{position:absolute;inset:28px 0 23px;width:100%;height:100%}.ag-root-wrapper{border-top:0px!important}.ag-root{top:0;bottom:23px!important;height:calc(100% - 23px)}.ag-root.ag-layout-normal{height:calc(100% - 23px)!important}.ag-header-cell{padding-left:0!important;padding-right:0!important}.ag-header-cell-resize:after{top:unset!important;height:25px!important}.ag-header-row{font-weight:500!important}.ag-header-cell-label{justify-content:center}.ag-row .ag-cell-value{padding-left:2px!important;padding-right:2px!important}.ag-row .ag-cell-value.invalid{border:1px solid red!important}.ag-cell-inline-editing{height:24px!important}.ag-cell{border-right:solid #dde2eb 1px!important}.ag-has-focus .ag-cell-focus:not(.ag-cell-inline-editing){border-right:solid #2196f3 1px!important}.ag-pinned-left-cols-container .ag-cell.ag-cell-focus{border:solid #dde2eb 1px!important;border-top:0px!important;border-bottom:0px!important}.ag-pinned-left-cols-container .ag-row-selected .ag-cell,.ag-pinned-left-cols-container .ag-row-focus .ag-cell{border:0px solid #dde2eb!important;border-right:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-header-cell.ag-column-focus{border:0px solid #dde2eb!important;border-bottom:2px solid #006dcc!important;color:#006dcc;font-weight:700;background-color:#ddd}.ag-pk-aligned-cell{text-align:center}.ag-horizontal-left-spacer{overflow:hidden}.ag-pinned-left-cols-container .ag-cell:hover{background-color:#2196f31a!important}.ag-root-wrapper-body.ag-layout-normal{margin-bottom:28px}.ag-overlay-loading-center{border:none!important;box-shadow:none!important}.ag-grid-row-has-changes-gradient{background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#fff,endColorstr=#ffffff);background-image:linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-ms-linear-gradient(top,#fff 0%,#ffffff 25%,#dbffdf 100%);background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(25%,#ffffff),color-stop(100%,#dbffdf))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spin{animation-name:spin;animation-duration:4s;animation-iteration-count:infinite;animation-timing-function:linear}\n"] }]
375
382
  }], ctorParameters: () => [{ type: i1.TruDataContext }, { type: i2.TruSearchResultViewManager }, { type: i3.TruAppEnvironment }, { type: i4.TruSearchViewEventHandler }, { type: i5.TruUiNotification }, { type: i6.TruConnectionHub }], propDecorators: { config: [{
376
383
  type: Input
377
384
  }], entity: [{
@@ -379,4 +386,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImpor
379
386
  }], name: [{
380
387
  type: Input
381
388
  }] } });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRhdGEtZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWdyaWQvdHJ1LWRhdGEtZ3JpZC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWdyaWQvdHJ1LWRhdGEtZ3JpZC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUF3RCxNQUFNLGVBQWUsQ0FBQztBQU1sSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxLQUFLLENBQUMsTUFBTSxZQUFZLENBQUM7QUFJaEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDbkgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBU2xILE1BQU0sT0FBTyxXQUFXO0lBNkNaO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWpERCxNQUFNLENBQXNCO0lBQzVCLE1BQU0sQ0FBTztJQUNiLElBQUksQ0FBTztJQUVwQixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUVwQyxVQUFVLEdBQVEsRUFBRSxDQUFDO0lBQ3JCLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFDbEIsV0FBVyxHQUFlLEVBQUUsQ0FBQztJQUM3QixrQkFBa0IsQ0FBTTtJQUN4QixtQkFBbUIsR0FBZSxFQUFFLENBQUM7SUFDckMsMEJBQTBCLENBQU07SUFDaEMsUUFBUSxHQUFxQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUE7SUFDcEQsZUFBZSxHQUFlLEVB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QUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJ1QXBwRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtYXBwLWVudmlyb25tZW50JztcclxuaW1wb3J0IHsgVHJ1U2VhcmNoVmlld0V2ZW50SGFuZGxlciB9IGZyb20gJy4uLy4uL2Jhc2Utdmlld3Mvc2VhcmNoL3NlcnZpY2VzL3RydS1zZWFyY2gtdmlldy1ldmVudC1oYW5kbGVyJztcclxuaW1wb3J0IHsgVHJ1RGF0YUNvbnRleHQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtZGF0YS1jb250ZXh0JztcclxuaW1wb3J0IHsgVHJ1VWlOb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtdWktbm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgSVRydURhdGFHcmlkQ29uZmlnIH0gZnJvbSAnLi9jbGFzc2VzL3RydS1kYXRhLWdyaWQtY29uZmlnJztcclxuaW1wb3J0IHsgVHJ1RGF0YUdyaWRUeXBlcyB9IGZyb20gJy4vZW51bXMvdHJ1LWRhdGEtZ3JpZC10eXBlcyc7XHJcbmltcG9ydCB7IElUcnVUb29sYmFyRHJvcGRvd25PcHRpb24gfSBmcm9tICcuLi90b29sYmFyL2NsYXNzZXMvdHJ1LXRvb2xiYXItZHJvcGRvd24tb3B0aW9uJztcclxuaW1wb3J0IHsgZm9ya0pvaW4sIHNraXAsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ3VuZGVyc2NvcmUnO1xyXG5pbXBvcnQgeyBUcnVTZWFyY2hSZXN1bHRWaWV3TWFuYWdlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RydS1zZWFyY2gtcmVzdWx0LXZpZXctbWFuYWdlcic7XHJcbmltcG9ydCB7IFRydUNvbm5lY3Rpb25IdWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtY29ubmVjdGlvbi1odWInO1xyXG5pbXBvcnQgeyBDb2xEZWYsIENvbHVtbiwgU3VwcHJlc3NLZXlib2FyZEV2ZW50UGFyYW1zIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBUcnVEYXRhR3JpZExvYWRpbmdPdmVybGF5IH0gZnJvbSAnLi9vdmVybGF5cy90cnUtZGF0YS1ncmlkLWxvYWRpbmctb3ZlcmxheS90cnUtZGF0YS1ncmlkLWxvYWRpbmctb3ZlcmxheSc7XHJcbmltcG9ydCB7IFRydURhdGFHcmlkTm9Sb3dzT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheXMvdHJ1LWRhdGEtZ3JpZC1uby1yb3dzLW92ZXJsYXkvdHJ1LWRhdGEtZ3JpZC1uby1yb3dzLW92ZXJsYXknO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnUtZGF0YS1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJ1LWRhdGEtZ3JpZC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90cnUtZGF0YS1ncmlkLmNzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgaG9zdDogeydbY2xhc3MudHJ1LWRhdGEtZ3JpZF0nOiAndHJ1ZSd9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcnVEYXRhR3JpZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjb25maWchOiBJVHJ1RGF0YUdyaWRDb25maWc7XHJcbiAgQElucHV0KCkgZW50aXR5ITogYW55O1xyXG4gIEBJbnB1dCgpIG5hbWUhOiBhbnk7XHJcblxyXG4gIFRydURhdGFHcmlkVHlwZXMgPSBUcnVEYXRhR3JpZFR5cGVzO1xyXG5cclxuICBjb2x1bW5EZWZzOiBhbnkgPSBbXTtcclxuICByb3dEYXRhOiBhbnkgPSBbXTtcclxuICB2aWV3Q2hvaWNlczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNlbGVjdGVkVmlld0Nob2ljZTogYW55O1xyXG4gIHVuYXNzb2NpYXRlZENob2ljZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBzZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZTogYW55O1xyXG4gIGdyaWRUeXBlOiBUcnVEYXRhR3JpZFR5cGVzID0gVHJ1RGF0YUdyaWRUeXBlcy5TZWFyY2hcclxuICB1bnNhdmVkRW50aXRpZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBsb2FkZWRFbnRpdGllczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGxhdGVzdFNldHVwUXVlcnk6IGFueTtcclxuICBmaXJzdFNlYXJjaFJhbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdyaWRPcHRpb25zOiBhbnkgPSB7XHJcbiAgICByb3dTZWxlY3Rpb246ICdtdWx0aXBsZScsXHJcbiAgICByb3dTdHlsZTogeyBiYWNrZ3JvdW5kOiAnd2hpdGUnIH0sXHJcbiAgICBsb2FkaW5nT3ZlcmxheUNvbXBvbmVudDogVHJ1RGF0YUdyaWRMb2FkaW5nT3ZlcmxheSxcclxuICAgIGxvYWRpbmdPdmVybGF5Q29tcG9uZW50UGFyYW1zOiB7XHJcbiAgICAgIGxvYWRpbmdNZXNzYWdlOiAnU2VhcmNoaW5nIC0gT25lIG1vbWVudCBwbGVhc2UuLi4nLFxyXG4gICAgfSxcclxuICAgIG5vUm93c092ZXJsYXlDb21wb25lbnQ6IFRydURhdGFHcmlkTm9Sb3dzT3ZlcmxheSxcclxuICAgIG5vUm93c092ZXJsYXlDb21wb25lbnRQYXJhbXM6IHtcclxuICAgICAgbm9Sb3dzTWVzc2FnZUZ1bmM6ICgpID0+XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5maXJzdFNlYXJjaFJhbilcclxuICAgICAgICAgIHJldHVybiAnU29ycnkgLSBubyByb3dzIGZvdW5kISdcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gJ0NsaWNrIHNlYXJjaCB0byBkaXNwbGF5IHJlc3VsdHMuJ1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKHBhcmFtczogYW55KSA9PiB7IH0sXHJcbiAgICBvbkNlbGxFZGl0aW5nU3RvcHBlZDogKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgIC8vdGhpcy5ncmlkT3B0aW9ucy5hcGkucmVkcmF3Um93cyh7IHJvd05vZGVzOiBwYXJhbXMubm9kZSB9KTtcclxuICAgIH0sXHJcbiAgfVxyXG4gIHBhcmVudFRvb2xiYXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHN1YnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGFDb250ZXh0OiBUcnVEYXRhQ29udGV4dCxcclxuICAgIHByaXZhdGUgc2VhcmNoUmVzdWx0Vmlld01hbmFnZXI6IFRydVNlYXJjaFJlc3VsdFZpZXdNYW5hZ2VyLFxyXG4gICAgcHJpdmF0ZSBhcHBFbnZpcm9ubWVudDogVHJ1QXBwRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIHNlYXJjaFZpZXdFdmVudEhhbmRsZXI6IFRydVNlYXJjaFZpZXdFdmVudEhhbmRsZXIsXHJcbiAgICBwcml2YXRlIHVpTm90aWZpY2F0aW9uOiBUcnVVaU5vdGlmaWNhdGlvbixcclxuICAgIHByaXZhdGUgY29ubmVjdGlvbkh1YjogVHJ1Q29ubmVjdGlvbkh1Yikge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbmhhbmNlUm93RGF0YUZvckVudGl0eSA9IChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgbGV0IHJvd0RhdGEgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcucm93RGF0YUVuaGFuY2VyKGVudGl0eSk7XHJcbiAgICByb3dEYXRhLiRlbnRpdHkgPSBlbnRpdHk7XHJcbiAgICByZXR1cm4gcm93RGF0YTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHNldE5vUm93c1RlbXBsYXRlID0gKCkgPT4ge1xyXG4gICAgLy90aGlzLm5vUm93c1RlbXBsYXRlID0gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6Ym9sZDtcIj5ObyBkYXRhIGZvdW5kLjwvc3Bhbj5gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVUbyA9ICgpID0+IHtcclxuICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMuYXBwRW52aXJvbm1lbnQub25TYXZlQ29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bClcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5yZWRyYXdSb3dzKCk7XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmFwcEVudmlyb25tZW50Lm9uUmV2ZXJ0Q29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bCkge1xyXG4gICAgICAgIGxldCByb3dzVG9SZW1vdmU6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5yb3dEYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5yb3dEYXRhW2ldLiRlbnRpdHlbdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUubmFtZSArICdSZWYnXSA8IDApXHJcbiAgICAgICAgICAgIHJvd3NUb1JlbW92ZS5wdXNoKHRoaXMucm93RGF0YVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFwcGx5VHJhbnNhY3Rpb24oeyByZW1vdmU6IHJvd3NUb1JlbW92ZSB9KTtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5yZWRyYXdSb3dzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmFwcEVudmlyb25tZW50Lm9uRGVsZXRlQ29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bCAmJiBldmVudC5lbnRpdGllcyAmJiBldmVudC5lbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgcm93c1RvUmVtb3ZlOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucm93RGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGV2ZW50LmVudGl0aWVzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvd0RhdGFbaV0uJGVudGl0eSA9PT0gZXZlbnQuZW50aXRpZXNbal0pXHJcbiAgICAgICAgICAgICAgcm93c1RvUmVtb3ZlLnB1c2godGhpcy5yb3dEYXRhW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuYXBwbHlUcmFuc2FjdGlvbih7IHJlbW92ZTogcm93c1RvUmVtb3ZlIH0pO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZHJhd1Jvd3MoKTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy5zZWFyY2hWaWV3RXZlbnRIYW5kbGVyLm9uU2VhcmNoKCkucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKHNldHVwUXVlcnk6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm9uU2VhcmNoKHNldHVwUXVlcnkpO1xyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy5jb25uZWN0aW9uSHViLnN1YnNjcmliZShcclxuICAgICAgdGhpcy5kYXRhQ29udGV4dCxcclxuICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUsXHJcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcclxuICAgICAgKCkgPT4geyByZXR1cm4gdGhpcy5sb2FkZWRFbnRpdGllcyB9LFxyXG4gICAgICAoKSA9PiB7IHJldHVybiB0aGlzLmxhdGVzdFNldHVwUXVlcnkgfSxcclxuICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmV4cGFuZHMsXHJcbiAgICAgIFtdLFxyXG4gICAgICAoKSA9PiB7IHJldHVybiB0cnVlOyB9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZnJlc2hDZWxscyh7IGZvcmNlOiB0cnVlIH0pO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkR3JpZERhdGEgPSAoZW50aXRpZXM6IEFycmF5PGFueT4pID0+IHtcclxuICAgIHRoaXMucm93RGF0YSA9IGVudGl0aWVzLm1hcCh0aGlzLmVuaGFuY2VSb3dEYXRhRm9yRW50aXR5LCBlbnRpdGllcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRNYW55VG9NYW55R3JpZERhdGEgPSAoYXNzb2NpYXRlZEVudGl0aWVzOiBBcnJheTxhbnk+LCBhc3NvY2lhdGFibGVFbnRpdGllczogQXJyYXk8YW55PiwgaW5pdGFsTG9hZDogYm9vbGVhbikgPT4ge1xyXG4gICAgaWYgKGluaXRhbExvYWQpXHJcbiAgICAgIHRoaXMucm93RGF0YSA9IGFzc29jaWF0ZWRFbnRpdGllcy5tYXAodGhpcy5lbmhhbmNlUm93RGF0YUZvckVudGl0eSwgYXNzb2NpYXRlZEVudGl0aWVzKTtcclxuICAgIGVsc2VcclxuICAgICAgYXNzb2NpYXRlZEVudGl0aWVzID0gdGhpcy5yb3dEYXRhLm1hcCgoZTogYW55KSA9PiB7IHJldHVybiBlLiRlbnRpdHkgfSk7XHJcbiAgICBsZXQgYXNzb2NpYXRhYmxlVHlwZU5hbWUgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5TWFueVRvTWFueVR5cGUubmFtZVxyXG4gICAgbGV0IGFzc29jaWF0ZWRNYXBPZkFzc29jaWF0YWJsZSA9IF8ubWFwKGFzc29jaWF0ZWRFbnRpdGllcywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVbJ28nICsgYXNzb2NpYXRhYmxlVHlwZU5hbWVdOyB9KTtcclxuICAgIHRoaXMudW5hc3NvY2lhdGVkQ2hvaWNlcyA9IGFzc29jaWF0YWJsZUVudGl0aWVzLmZpbHRlcihvYmplY3QxID0+IHtcclxuICAgICAgcmV0dXJuICFhc3NvY2lhdGVkTWFwT2ZBc3NvY2lhdGFibGUuc29tZShvYmplY3QyID0+IHsgcmV0dXJuIG9iamVjdDEudmFsdWUuJCA9PT0gb2JqZWN0Mlthc3NvY2lhdGFibGVUeXBlTmFtZSArICdSZWYnXTsgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhwb3J0RGF0YSA9ICgpID0+IHtcclxuICAgIHRoaXMudWlOb3RpZmljYXRpb24uc2hvd0V4cG9ydERpYWxvZygpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xyXG4gICAgICBsZXQgZXhwb3J0R3JpZFNwZWM7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZSlcclxuICAgICAgICBleHBvcnRHcmlkU3BlYyA9IHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5lbnRpdHlUeXBlLm5hbWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBleHBvcnRHcmlkU3BlYyA9ICckY3VzdG9tPScgKyAxO1xyXG5cclxuICAgICAgbGV0IHJvd05vZGVzOiBhbnkgPSBbXTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuZm9yRWFjaE5vZGUoKHJvd05vZGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJvd05vZGVzLnB1c2gocm93Tm9kZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgcmVmcyA9IF8ubWFwKHJvd05vZGVzLCAocm93Tm9kZSkgPT4geyByZXR1cm4gcm93Tm9kZS5kYXRhLiRlbnRpdHlbdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUubmFtZSArICdSZWYnXTsgfSk7XHJcbiAgICAgIHRoaXMuZGF0YUNvbnRleHRcclxuICAgICAgICAuZW50aXR5QWNjZXNzKClcclxuICAgICAgICAuZXhwb3J0KHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5lbnRpdHlUeXBlLCBleHBvcnRHcmlkU3BlYywgdGhpcy5sYXRlc3RTZXR1cFF1ZXJ5LCByZWZzLmpvaW4oJywnKSwgcmVzdWx0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblN1cHByZXNzS2V5Ym9hcmRFdmVudCA9IChwYXJhbXM6IFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzVGFiS2V5ID0gcGFyYW1zLmV2ZW50LmtleSA9PT0gJ1RhYic7XHJcbiAgICBsZXQgaXNBcnJvd0Rvd24gPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJztcclxuICAgIGxldCBpc0Fycm93VXAgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dVcCc7XHJcbiAgICBsZXQgaXNBcnJvd0xlZnQgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JztcclxuICAgIGxldCBpc0Fycm93UmlnaHQgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCc7XHJcbiAgICBsZXQgaXNTaGlmdEtleSA9IHBhcmFtcy5ldmVudC5zaGlmdEtleTtcclxuICAgIGxldCBpc0FsdEtleSA9IHBhcmFtcy5ldmVudC5hbHRLZXk7XHJcblxyXG4gICAgbGV0IGZvY3VzZWRDZWxsID0gcGFyYW1zLmFwaS5nZXRGb2N1c2VkQ2VsbCgpO1xyXG4gICAgbGV0IGhhc0Nob2ljZXMgPSBwYXJhbXMuZGF0YVtwYXJhbXMuY29sdW1uLmdldENvbElkKCldICYmIHBhcmFtcy5kYXRhW3BhcmFtcy5jb2x1bW4uZ2V0Q29sSWQoKV0uY2hvaWNlcyA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAocGFyYW1zLmNvbHVtbi5pc1Bpbm5lZCgpKSB7XHJcbiAgICAgIGlmIChpc1RhYktleSAmJiAhaXNTaGlmdEtleSlcclxuICAgICAgICBwYXJhbXMuYXBpLnRhYlRvTmV4dENlbGwoKTtcclxuICAgICAgZWxzZSBpZiAoaXNUYWJLZXkgJiYgaXNTaGlmdEtleSlcclxuICAgICAgICBwYXJhbXMuYXBpLnRhYlRvUHJldmlvdXNDZWxsKCk7XHJcbiAgICAgIGVsc2UgaWYgKGlzQXJyb3dMZWZ0KVxyXG4gICAgICAgIHBhcmFtcy5hcGkudGFiVG9QcmV2aW91c0NlbGwoKTtcclxuICAgICAgZWxzZSBpZiAoaXNBcnJvd1JpZ2h0KVxyXG4gICAgICAgIHBhcmFtcy5hcGkudGFiVG9OZXh0Q2VsbCgpO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zdG9wRWRpdGluZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0Nob2ljZXMgJiYgaXNBbHRLZXkgJiYgKGlzQXJyb3dEb3duIHx8IGlzQXJyb3dVcCkpIHtcclxuICAgICAgcGFyYW1zLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBwYXJhbXMuYXBpLnN0YXJ0RWRpdGluZ0NlbGwoe1xyXG4gICAgICAgIHJvd0luZGV4OiBmb2N1c2VkQ2VsbD8ucm93SW5kZXggYXMgbnVtYmVyLFxyXG4gICAgICAgIGNvbEtleTogZm9jdXNlZENlbGw/LmNvbHVtbiBhcyBDb2x1bW4sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICBzdXBwcmVzc0tleWJvYXJkRXZlbnQ6IHRoaXMub25TdXBwcmVzc0tleWJvYXJkRXZlbnRcclxuICB9O1xyXG5cclxuICBnZXRSb3dDb3VudCA9ICgpID0+IHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaT8uZm9yRWFjaE5vZGVBZnRlckZpbHRlcigoKSA9PiBjb3VudCsrKTtcclxuICAgIHJldHVybiAnUm93czogJyArIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dDb3VudCA9ICgpID0+IHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBjb3VudCA9IHRoaXMuZ3JpZE9wdGlvbnMuYXBpPy5nZXRTZWxlY3RlZFJvd3MoKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gJ1NlbGVjdGVkOiAnICsgY291bnQ7XHJcbiAgfVxyXG5cclxuICBvblJvd0RhdGFDaGFuZ2VkID0gKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgaWYgKHRoaXMucm93RGF0YSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNldE5vUm93c1RlbXBsYXRlKCk7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd05vUm93c092ZXJsYXkgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DZWxsRG91YmxlQ2xpY2tlZCA9IChncmlkQ29uZmlnOiBhbnkpID0+IHtcclxuICAgIGlmIChncmlkQ29uZmlnLmNvbERlZi5jZWxsQ2xhc3MgPT09ICdhZy1way1hbGlnbmVkLWNlbGwnKVxyXG4gICAgICB0aGlzLmNvbmZpZy5yb3dIZWFkZXJEb3VibGVDbGlja2VkKGdyaWRDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgb25DZWxsS2V5RG93biA9IChldmVudDogYW55KSA9PiB7XHJcbiAgICBpZiAoIWV2ZW50LmV2ZW50KSByZXR1cm47XHJcbiAgICBjb25zdCBrZXkgPSAoZXZlbnQuZXZlbnQgYXMgdW5rbm93bikgYXMgS2V5Ym9hcmRFdmVudDtcclxuICAgIGlmIChrZXkuY29kZSA9PT0gJ1NwYWNlJykge1xyXG4gICAgICBrZXkucHJldmVudERlZmF1bHQoKTtcclxuICAgICAga2V5LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgaWYgKCFldmVudC5jb2xEZWYuY2VsbFJlbmRlcmVyKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGk/LnN0YXJ0RWRpdGluZ0NlbGwoe1xyXG4gICAgICAgICAgcm93SW5kZXg6IGV2ZW50LnJvd0luZGV4LFxyXG4gICAgICAgICAgY29sS2V5OiBldmVudC5jb2x1bW4uZ2V0Q29sSWQoKSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGVcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIG9uQ2VsbEZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LmNvbHVtbi5jb2xEZWYucGlubmVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5zdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuZGVzZWxlY3RBbGwoKTtcclxuICAgIH1cclxuICAgIC8vbGV0IGNvbHVtbkRlZnMgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuY29sdW1uRGVmcztcclxuICAgIC8vaWYgKGV2ZW50LmNvbHVtbi5jb2xEZWYucGlubmVkKSB7XHJcbiAgICAvLyAgY29sdW1uRGVmcy5mb3JFYWNoKChjb2x1bW5EZWY6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgaWYgKGluZGV4ICE9PSAwKVxyXG4gICAgLy8gICAgICBjb2x1bW5EZWYuaGVhZGVyQ2xhc3MgPSAnYWctY29sdW1uLWZvY3VzJztcclxuICAgIC8vICB9KTtcclxuICAgIC8vfSBlbHNlIHtcclxuICAgIC8vICBjb2x1bW5EZWZzLmZvckVhY2goKGNvbHVtbkRlZjogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAvLyAgICBpZiAoaW5kZXggIT09IDAgJiYgZXZlbnQuY29sdW1uLmNvbElkID09PSBjb2x1bW5EZWYuZmllbGQpXHJcbiAgICAvLyAgICAgIGNvbHVtbkRlZi5oZWFkZXJDbGFzcyA9ICdhZy1jb2x1bW4tZm9jdXMnO1xyXG4gICAgLy8gICAgZWxzZVxyXG4gICAgLy8gICAgICBjb2x1bW5EZWYuaGVhZGVyQ2xhc3MgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAgfSk7XHJcbiAgICAvL31cclxuICAgIC8vdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoID0gKHNldHVwUXVlcnk6IGFueSkgPT4ge1xyXG4gICAgdGhpcy5maXJzdFNlYXJjaFJhbiA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5oaWRlT3ZlcmxheSgpO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2hvd0xvYWRpbmdPdmVybGF5KCk7XHJcblxyXG4gICAgbGV0IGVudGl0eUxvYWRlZCA9IHRoaXMubG9hZGVkRW50aXRpZXMuc29tZSgocmVmKSA9PiB7IHJldHVybiByZWYgPT09IHRoaXMuZW50aXR5W3RoaXMuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUgKyAnUmVmJ107IH0pO1xyXG4gICAgbGV0IGpvaW5zID0gW107XHJcbiAgICBpZiAoZW50aXR5TG9hZGVkKSB7XHJcbiAgICAgIGpvaW5zLnB1c2godGhpcy5kYXRhQ29udGV4dC5lbnRpdHlBY2Nlc3MoKS5zZWFyY2hDYWNoZU9ubHkoXHJcbiAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUsXHJcbiAgICAgICAgc2V0dXBRdWVyeSxcclxuICAgICAgICB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZXhwYW5kcykpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSlcclxuICAgICAgICBqb2lucy5wdXNoKHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuc2VhcmNoUXVlcnlDaG9pY2VzKFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eU1hbnlUb01hbnlUeXBlLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLm1hbnlUb01hbnlTZXR1cFF1ZXJ5KHRoaXMuZW50aXR5KSwgbnVsbCwgZmFsc2UpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgam9pbnMucHVzaCh0aGlzLmRhdGFDb250ZXh0LmVudGl0eUFjY2VzcygpLnNlYXJjaChcclxuICAgICAgICB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZSxcclxuICAgICAgICBzZXR1cFF1ZXJ5LFxyXG4gICAgICAgIHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5leHBhbmRzLCBmYWxzZSkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSlcclxuICAgICAgICBqb2lucy5wdXNoKHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuc2VhcmNoUXVlcnlDaG9pY2VzKFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eU1hbnlUb01hbnlUeXBlLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLm1hbnlUb01hbnlTZXR1cFF1ZXJ5KHRoaXMuZW50aXR5KSwgbnVsbCwgdHJ1ZSkpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXRlc3RTZXR1cFF1ZXJ5ID0gc2V0dXBRdWVyeTtcclxuXHJcbiAgICBmb3JrSm9pbihqb2lucykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogcmVzdWx0cyA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXROb1Jvd3NUZW1wbGF0ZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnkpXHJcbiAgICAgICAgICB0aGlzLmxvYWRNYW55VG9NYW55R3JpZERhdGEocmVzdWx0c1swXSwgcmVzdWx0c1sxXSwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5sb2FkR3JpZERhdGEocmVzdWx0c1swXSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgIT09IFRydURhdGFHcmlkVHlwZXMuU2VhcmNoKVxyXG4gICAgICAgICAgdGhpcy5sb2FkZWRFbnRpdGllcy5wdXNoKHRoaXMuZW50aXR5W3RoaXMuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUgKyAnUmVmJ10pO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMucm93RGF0YSA9PT0gbnVsbCB8fCAhdGhpcy5yb3dEYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2hvd05vUm93c092ZXJsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25VbmFzc29jaWF0ZWRDaG9pY2VDaGFuZ2VkID0gKG9wdGlvbjogSVRydVRvb2xiYXJEcm9wZG93bk9wdGlvbiB8IG51bGwpID0+IHtcclxuXHJcbiAgfVxyXG5cclxuICBjYW5BZGQgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkVHlwZSA9PT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWxNYW55VG9NYW55KVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvbkFkZCA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnkpIHtcclxuICAgICAgbGV0IHBhcmVudE5hbWUgPSB0aGlzLmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICBsZXQgYXNzb2NpYXRlZFR5cGUgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZTtcclxuICAgICAgbGV0IHVuYXNzb2NpYXRlZFR5cGUgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5TWFueVRvTWFueVR5cGU7XHJcbiAgICAgIGxldCByZWYgPSB0aGlzLnNlbGVjdGVkVW5hc3NvY2lhdGVkQ2hvaWNlLnZhbHVlLiQ7XHJcbiAgICAgIGxldCBjaGlsZFRvQXNzb2NpYXRlID0gdGhpcy5kYXRhQ29udGV4dC5lbnRpdHlBY2Nlc3MoKS5zZWFyY2hCeVJlZkNhY2hlT25seSh1bmFzc29jaWF0ZWRUeXBlLCByZWYsIHRydWUpXHJcbiAgICAgIGlmIChjaGlsZFRvQXNzb2NpYXRlKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG1hbnktdG8tbWFueSBlbnRpdHlcclxuICAgICAgICBsZXQgbmV3RW50aXR5ID0gdGhpcy5lbmhhbmNlUm93RGF0YUZvckVudGl0eSh0aGlzLmRhdGFDb250ZXh0LmVudGl0eUFjY2VzcygpLmFkZChhc3NvY2lhdGVkVHlwZSkpO1xyXG4gICAgICAgIG5ld0VudGl0eS4kZW50aXR5W3VuYXNzb2NpYXRlZFR5cGUubmFtZSArICdSZWYnXSA9IGNoaWxkVG9Bc3NvY2lhdGVbdW5hc3NvY2lhdGVkVHlwZS5uYW1lICsgJ1JlZiddO1xyXG4gICAgICAgIG5ld0VudGl0eS4kZW50aXR5W3BhcmVudE5hbWUgKyAnUmVmJ10gPSB0aGlzLmVudGl0eVtwYXJlbnROYW1lICsgJ1JlZiddO1xyXG4gICAgICAgIC8vIHJlbW92ZSBpdGVtIGZyb20gdGhlIGFkZCBkcm9wZG93biBjb250cm9sXHJcbiAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMudW5hc3NvY2lhdGVkQ2hvaWNlcy5maW5kSW5kZXgoKGNob2ljZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGNob2ljZVt1bmFzc29jaWF0ZWRUeXBlLm5hbWUgKyAnUmVmJ10gPT09IGNoaWxkVG9Bc3NvY2lhdGVbdW5hc3NvY2lhdGVkVHlwZS5uYW1lICsgJ1JlZiddO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudW5hc3NvY2lhdGVkQ2hvaWNlcy5zcGxpY2UoaXRlbUluZGV4LCAxKTtcclxuICAgICAgICAvLyBjbGVhciBhZGQgc2VsZWN0aW9uXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyBhZGQgcm93IHRvIGdyaWRcclxuICAgICAgICB0aGlzLnVuc2F2ZWRFbnRpdGllcy5wdXNoKG5ld0VudGl0eSk7XHJcbiAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuYXBwbHlUcmFuc2FjdGlvbih7IGFkZDogW25ld0VudGl0eV0sIGFkZEluZGV4OiAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbmV3RW50aXR5ID0gdGhpcy5lbmhhbmNlUm93RGF0YUZvckVudGl0eSh0aGlzLmRhdGFDb250ZXh0LmVudGl0eUFjY2VzcygpLmFkZCh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZSkpO1xyXG4gICAgICB0aGlzLnJvd0RhdGEudW5zaGlmdChuZXdFbnRpdHkpO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5hcHBseVRyYW5zYWN0aW9uKHsgYWRkOiBbbmV3RW50aXR5XSwgYWRkSW5kZXg6IDAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICAgIGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBlbnRpdGllcyA9IHNlbGVjdGVkUm93cy5tYXAoZnVuY3Rpb24gKHJvdzogYW55KSB7IHJldHVybiByb3cuJGVudGl0eTsgfSk7XHJcbiAgICAgIGxldCBjb25maXJtTXNnID0gdGhpcy5hcHBFbnZpcm9ubWVudC5mb3JtYXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKHRoaXMuY29uZmlnLnRhYmxlTmFtZSwgdGhpcy5jb25maWcudGFibGVQbHVyYWxMYWJlbCwgc2VsZWN0ZWRSb3dzLmxlbmd0aCk7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnkpIHtcclxuICAgICAgICBsZXQgb25TdWNjZXNzID0gKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vblNlYXJjaCh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuc2V0dXBRdWVyeSh0aGlzLmVudGl0eSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFDb250ZXh0LmRlbGV0ZShlbnRpdGllcywgY29uZmlybU1zZywgb25TdWNjZXNzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGFDb250ZXh0LmRlbGV0ZShlbnRpdGllcywgY29uZmlybU1zZyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudWlOb3RpZmljYXRpb24ud2FybmluZyh0aGlzLmFwcEVudmlyb25tZW50Lm1zZ05vUmVjb3Jkc1NlbGVjdGVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uS2VlcCA9ICgpOiB2b2lkID0+IHtcclxuICAgIGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICAgIGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoKVxyXG4gICAgICB0aGlzLnJvd0RhdGEgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgbGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmdldFNlbGVjdGVkUm93cygpO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuYXBwbHlUcmFuc2FjdGlvbih7IHJlbW92ZTogc2VsZWN0ZWRSb3dzIH0pO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICB0aGlzLmV4cG9ydERhdGEoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUbygpO1xyXG4gICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmNvbHVtbkRlZnM7XHJcbiAgICB0aGlzLmdyaWRUeXBlID0gdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmdyaWRUeXBlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsIHx8IHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSlcclxuICAgICAgdGhpcy5vblNlYXJjaCh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuc2V0dXBRdWVyeSh0aGlzLmVudGl0eSkpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgLy9zZXRUaW1lb3V0IHRvIHByZXZlbnQ6IEVSUk9SIEVycm9yOiBORzAxMDA6IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3IuIFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucGFyZW50VG9vbGJhclRlbXBsYXRlID0gdGhpcy5zZWFyY2hSZXN1bHRWaWV3TWFuYWdlci5zZWFyY2hWaWV3VG9vbGJhclRlbXBsYXRlO1xyXG4gICAgICBpZiAodGhpcy5ncmlkVHlwZSA9PT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWwgfHwgdGhpcy5ncmlkVHlwZSA9PT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWxNYW55VG9NYW55KSB7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuc2V0dXBRdWVyeSh0aGlzLmVudGl0eSkpO1xyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXRvb2xiYXItY29udGFpbmVyXCI+XHJcbiAgICA8dHJ1LXRvb2xiYXI+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1kcm9wZG93biBbb3B0aW9uc109XCJ1bmFzc29jaWF0ZWRDaG9pY2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRPcHRpb24pXT1cInNlbGVjdGVkVW5hc3NvY2lhdGVkQ2hvaWNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25VbmFzc29jaWF0ZWRDaG9pY2VDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkVHlwZSA9PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnlcIj5cclxuICAgICAgPC90cnUtdG9vbGJhci1kcm9wZG93bj5cclxuICAgICAgPHRydS10b29sYmFyLWJ1dHRvbiBbaWNvbl09XCIndHJ1LXRvb2xiYXItYWRkLWljb24nXCIgW3Rvb2x0aXBdPVwiJ0FkZCAtIFtDdHJsICsgSV0nXCIgW2Rpc2FibGVkXT1cIiFjYW5BZGQoKVwiIChvbkNsaWNrKT1cIm9uQWRkKClcIj48L3RydS10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPHRydS10b29sYmFyLWJ1dHRvbiBbaWNvbl09XCIndHJ1LXRvb2xiYXItZGVsZXRlLWljb24nXCIgW3Rvb2x0aXBdPVwiJ0RlbGV0ZSAtIFtDdHJsICsgRF0nXCIgKGNsaWNrKT1cIm9uRGVsZXRlKClcIj48L3RydS10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPHRydS10b29sYmFyLWJ1dHRvbiBbaWNvbl09XCIndHJ1LXRvb2xiYXIta2VlcC1pY29uJ1wiIFt0b29sdGlwXT1cIidLZWVwIHNlbGVjdGVkIHJlY29yZHMgLSBbQ3RybCArIEtdJ1wiIChjbGljayk9XCJvbktlZXAoKVwiPjwvdHJ1LXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8dHJ1LXRvb2xiYXItYnV0dG9uIFtpY29uXT1cIid0cnUtdG9vbGJhci1yZW1vdmUtaWNvbidcIiBbdG9vbHRpcF09XCInUmVtb3ZlIHNlbGVjdGVkIHJlY29yZHMgLSBbQ3RybCArIFJdJ1wiIChjbGljayk9XCJvblJlbW92ZSgpXCI+PC90cnUtdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1zZXBhcmF0b3I+PC90cnUtdG9vbGJhci1zZXBhcmF0b3I+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYXJlbnRUb29sYmFyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHRydS10b29sYmFyLXNlcGFyYXRvciAqbmdJZj1cImdyaWRUeXBlID09IFRydURhdGFHcmlkVHlwZXMuU2VhcmNoXCI+PC90cnUtdG9vbGJhci1zZXBhcmF0b3I+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1idXR0b24gW2ljb25dPVwiJ3RydS10b29sYmFyLWV4cG9ydC1pY29uJ1wiIFt0b29sdGlwXT1cIidFeHBvcnQnXCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIj48L3RydS10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwvdHJ1LXRvb2xiYXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInRydS1kYXRhLWdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8YWctZ3JpZC1hbmd1bGFyIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3Jvd0RhdGFdPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyb3dIZWlnaHRdPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcm93QnVmZmVyXT1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2VudGVyTmF2aWdhdGVzVmVydGljYWxseV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2VudGVyTmF2aWdhdGVzVmVydGljYWxseUFmdGVyRWRpdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N1cHByZXNzUm93SG92ZXJIaWdobGlnaHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjZWxsRG91YmxlQ2xpY2tlZCk9XCJvbkNlbGxEb3VibGVDbGlja2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoY2VsbEtleURvd24pPVwib25DZWxsS2V5RG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGNlbGxGb2N1c2VkKT1cIm9uQ2VsbEZvY3VzZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChyb3dEYXRhQ2hhbmdlZCk9XCJvblJvd0RhdGFDaGFuZ2VkKCRldmVudClcIj5cclxuICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXN0YXR1c2Jhci1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXN0YXR1c2Jhci1jb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRydS1kYXRhLWdyaWQtc3RhdHVzYmFyLXZhbHVlcy1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzcz1cInRydS1kYXRhLWdyaWQtc3RhdHVzYmFyLXZhbHVlcy10ZXh0XCI+e3tnZXRSb3dDb3VudCgpfX08L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXN0YXR1c2Jhci12YWx1ZXMtdGV4dFwiPnt7Z2V0U2VsZWN0ZWRSb3dDb3VudCgpfX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRhdGEtZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWdyaWQvdHJ1LWRhdGEtZ3JpZC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWdyaWQvdHJ1LWRhdGEtZ3JpZC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUF3RCxNQUFNLGVBQWUsQ0FBQztBQU1sSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxLQUFLLENBQUMsTUFBTSxZQUFZLENBQUM7QUFJaEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDbkgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBMEIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBU3JFLE1BQU0sT0FBTyxXQUFXO0lBNkNaO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWpERCxNQUFNLENBQXNCO0lBQzVCLE1BQU0sQ0FBTztJQUNiLElBQUksQ0FBTztJQUVwQixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUVwQyxVQUFVLEdBQVEsRUFBRSxDQUFDO0lBQ3JCLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFDbEIsV0FBVyxHQUFlLEVBQUUsQ0FBQztJQUM3QixrQkFBa0IsQ0FBTTtJQUN4QixtQkFBbUIsR0FBZSxFQUFFLENBQUM7SUFDckMsMEJBQTBCLENBQU07SUFDaEMsUUFBUSxHQUFx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QUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO3VHQW5aVSxXQUFXOzJGQUFYLFdBQVcsaU1DeEJ4Qiw0d0ZBNkNBOzsyRkRyQmEsV0FBVztrQkFQdkIsU0FBUzsrQkFDRSxlQUFlLGlCQUdWLGlCQUFpQixDQUFDLElBQUksUUFDL0IsRUFBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUM7bVFBRzlCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcnVBcHBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RydS1hcHAtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBUcnVTZWFyY2hWaWV3RXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vYmFzZS12aWV3cy9zZWFyY2gvc2VydmljZXMvdHJ1LXNlYXJjaC12aWV3LWV2ZW50LWhhbmRsZXInO1xyXG5pbXBvcnQgeyBUcnVEYXRhQ29udGV4dCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RydS1kYXRhLWNvbnRleHQnO1xyXG5pbXBvcnQgeyBUcnVVaU5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RydS11aS1ub3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBJVHJ1RGF0YUdyaWRDb25maWcgfSBmcm9tICcuL2NsYXNzZXMvdHJ1LWRhdGEtZ3JpZC1jb25maWcnO1xyXG5pbXBvcnQgeyBUcnVEYXRhR3JpZFR5cGVzIH0gZnJvbSAnLi9lbnVtcy90cnUtZGF0YS1ncmlkLXR5cGVzJztcclxuaW1wb3J0IHsgSVRydVRvb2xiYXJEcm9wZG93bk9wdGlvbiB9IGZyb20gJy4uL3Rvb2xiYXIvY2xhc3Nlcy90cnUtdG9vbGJhci1kcm9wZG93bi1vcHRpb24nO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgc2tpcCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAndW5kZXJzY29yZSc7XHJcbmltcG9ydCB7IFRydVNlYXJjaFJlc3VsdFZpZXdNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJ1LXNlYXJjaC1yZXN1bHQtdmlldy1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVHJ1Q29ubmVjdGlvbkh1YiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RydS1jb25uZWN0aW9uLWh1Yic7XHJcbmltcG9ydCB7IENvbERlZiwgQ29sdW1uLCBTdXBwcmVzc0tleWJvYXJkRXZlbnRQYXJhbXMgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbmltcG9ydCB7IFRydURhdGFHcmlkTG9hZGluZ092ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL3RydS1kYXRhLWdyaWQtbG9hZGluZy1vdmVybGF5L3RydS1kYXRhLWdyaWQtbG9hZGluZy1vdmVybGF5JztcclxuaW1wb3J0IHsgVHJ1RGF0YUdyaWROb1Jvd3NPdmVybGF5IH0gZnJvbSAnLi9vdmVybGF5cy90cnUtZGF0YS1ncmlkLW5vLXJvd3Mtb3ZlcmxheS90cnUtZGF0YS1ncmlkLW5vLXJvd3Mtb3ZlcmxheSc7XHJcbmltcG9ydCB7IEVudGl0eUFjdGlvbiwgRW50aXR5Q2hhbmdlZEV2ZW50QXJncyB9IGZyb20gJ2JyZWV6ZS1jbGllbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnUtZGF0YS1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJ1LWRhdGEtZ3JpZC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90cnUtZGF0YS1ncmlkLmNzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgaG9zdDogeydbY2xhc3MudHJ1LWRhdGEtZ3JpZF0nOiAndHJ1ZSd9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcnVEYXRhR3JpZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjb25maWchOiBJVHJ1RGF0YUdyaWRDb25maWc7XHJcbiAgQElucHV0KCkgZW50aXR5ITogYW55O1xyXG4gIEBJbnB1dCgpIG5hbWUhOiBhbnk7XHJcblxyXG4gIFRydURhdGFHcmlkVHlwZXMgPSBUcnVEYXRhR3JpZFR5cGVzO1xyXG5cclxuICBjb2x1bW5EZWZzOiBhbnkgPSBbXTtcclxuICByb3dEYXRhOiBhbnkgPSBbXTtcclxuICB2aWV3Q2hvaWNlczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNlbGVjdGVkVmlld0Nob2ljZTogYW55O1xyXG4gIHVuYXNzb2NpYXRlZENob2ljZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBzZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZTogYW55O1xyXG4gIGdyaWRUeXBlOiBUcnVEYXRhR3JpZFR5cGVzID0gVHJ1RGF0YUdyaWRUeXBlcy5TZWFyY2hcclxuICB1bnNhdmVkRW50aXRpZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBsb2FkZWRFbnRpdGllczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGxhdGVzdFNldHVwUXVlcnk6IGFueTtcclxuICBmaXJzdFNlYXJjaFJhbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdyaWRPcHRpb25zOiBhbnkgPSB7XHJcbiAgICByb3dTZWxlY3Rpb246ICdtdWx0aXBsZScsXHJcbiAgICByb3dTdHlsZTogeyBiYWNrZ3JvdW5kOiAnd2hpdGUnIH0sXHJcbiAgICBsb2FkaW5nT3ZlcmxheUNvbXBvbmVudDogVHJ1RGF0YUdyaWRMb2FkaW5nT3ZlcmxheSxcclxuICAgIGxvYWRpbmdPdmVybGF5Q29tcG9uZW50UGFyYW1zOiB7XHJcbiAgICAgIGxvYWRpbmdNZXNzYWdlOiAnU2VhcmNoaW5nIC0gT25lIG1vbWVudCBwbGVhc2UuLi4nLFxyXG4gICAgfSxcclxuICAgIG5vUm93c092ZXJsYXlDb21wb25lbnQ6IFRydURhdGFHcmlkTm9Sb3dzT3ZlcmxheSxcclxuICAgIG5vUm93c092ZXJsYXlDb21wb25lbnRQYXJhbXM6IHtcclxuICAgICAgbm9Sb3dzTWVzc2FnZUZ1bmM6ICgpID0+XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5maXJzdFNlYXJjaFJhbilcclxuICAgICAgICAgIHJldHVybiAnU29ycnkgLSBubyByb3dzIGZvdW5kISdcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gJ0NsaWNrIHNlYXJjaCB0byBkaXNwbGF5IHJlc3VsdHMuJ1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKHBhcmFtczogYW55KSA9PiB7IH0sXHJcbiAgICBvbkNlbGxFZGl0aW5nU3RvcHBlZDogKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgIC8vdGhpcy5ncmlkT3B0aW9ucy5hcGkucmVkcmF3Um93cyh7IHJvd05vZGVzOiBwYXJhbXMubm9kZSB9KTtcclxuICAgIH0sXHJcbiAgfVxyXG4gIHBhcmVudFRvb2xiYXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHN1YnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGFDb250ZXh0OiBUcnVEYXRhQ29udGV4dCxcclxuICAgIHByaXZhdGUgc2VhcmNoUmVzdWx0Vmlld01hbmFnZXI6IFRydVNlYXJjaFJlc3VsdFZpZXdNYW5hZ2VyLFxyXG4gICAgcHJpdmF0ZSBhcHBFbnZpcm9ubWVudDogVHJ1QXBwRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIHNlYXJjaFZpZXdFdmVudEhhbmRsZXI6IFRydVNlYXJjaFZpZXdFdmVudEhhbmRsZXIsXHJcbiAgICBwcml2YXRlIHVpTm90aWZpY2F0aW9uOiBUcnVVaU5vdGlmaWNhdGlvbixcclxuICAgIHByaXZhdGUgY29ubmVjdGlvbkh1YjogVHJ1Q29ubmVjdGlvbkh1Yikge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbmhhbmNlUm93RGF0YUZvckVudGl0eSA9IChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgbGV0IHJvd0RhdGEgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcucm93RGF0YUVuaGFuY2VyKGVudGl0eSk7XHJcbiAgICByb3dEYXRhLiRlbnRpdHkgPSBlbnRpdHk7XHJcbiAgICByZXR1cm4gcm93RGF0YTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHNldE5vUm93c1RlbXBsYXRlID0gKCkgPT4ge1xyXG4gICAgLy90aGlzLm5vUm93c1RlbXBsYXRlID0gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6Ym9sZDtcIj5ObyBkYXRhIGZvdW5kLjwvc3Bhbj5gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVUbyA9ICgpID0+IHtcclxuICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMuYXBwRW52aXJvbm1lbnQub25TYXZlQ29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bClcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5yZWRyYXdSb3dzKCk7XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmFwcEVudmlyb25tZW50Lm9uUmV2ZXJ0Q29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bCkge1xyXG4gICAgICAgIGxldCByb3dzVG9SZW1vdmU6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5yb3dEYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5yb3dEYXRhW2ldLiRlbnRpdHlbdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUubmFtZSArICdSZWYnXSA8IDApXHJcbiAgICAgICAgICAgIHJvd3NUb1JlbW92ZS5wdXNoKHRoaXMucm93RGF0YVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFwcGx5VHJhbnNhY3Rpb24oeyByZW1vdmU6IHJvd3NUb1JlbW92ZSB9KTtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5yZWRyYXdSb3dzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnN1YnMucHVzaCh0aGlzLmFwcEVudmlyb25tZW50Lm9uRGVsZXRlQ29tcGxldGUkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudD8uc3VjY2Vzc2Z1bCAmJiBldmVudC5lbnRpdGllcyAmJiBldmVudC5lbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgcm93c1RvUmVtb3ZlOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucm93RGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGV2ZW50LmVudGl0aWVzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvd0RhdGFbaV0uJGVudGl0eSA9PT0gZXZlbnQuZW50aXRpZXNbal0pXHJcbiAgICAgICAgICAgICAgcm93c1RvUmVtb3ZlLnB1c2godGhpcy5yb3dEYXRhW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuYXBwbHlUcmFuc2FjdGlvbih7IHJlbW92ZTogcm93c1RvUmVtb3ZlIH0pO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZHJhd1Jvd3MoKTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy5zZWFyY2hWaWV3RXZlbnRIYW5kbGVyLm9uU2VhcmNoKCkucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKHNldHVwUXVlcnk6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm9uU2VhcmNoKHNldHVwUXVlcnkpO1xyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy5kYXRhQ29udGV4dC5vblByb3BlcnR5Q2hhbmdlZCgpLnN1YnNjcmliZSgoY2hhbmdlQXJnczogRW50aXR5Q2hhbmdlZEV2ZW50QXJncykgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlQXJncy5lbnRpdHlBY3Rpb24gPT09IEVudGl0eUFjdGlvbi5BdHRhY2gpIHtcclxuICAgICAgICB0aGlzLmFkZEVudGl0eShjaGFuZ2VBcmdzLmVudGl0eSlcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy5jb25uZWN0aW9uSHViLnN1YnNjcmliZShcclxuICAgICAgdGhpcy5kYXRhQ29udGV4dCxcclxuICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUsXHJcbiAgICAgIHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcclxuICAgICAgKCkgPT4geyByZXR1cm4gdGhpcy5sb2FkZWRFbnRpdGllcyB9LFxyXG4gICAgICAoKSA9PiB7IHJldHVybiB0aGlzLmxhdGVzdFNldHVwUXVlcnkgfSxcclxuICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmV4cGFuZHMsXHJcbiAgICAgIFtdLFxyXG4gICAgICAoKSA9PiB7IHJldHVybiB0cnVlOyB9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZnJlc2hDZWxscyh7IGZvcmNlOiB0cnVlIH0pO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkR3JpZERhdGEgPSAoZW50aXRpZXM6IEFycmF5PGFueT4pID0+IHtcclxuICAgIHRoaXMucm93RGF0YSA9IGVudGl0aWVzLm1hcCh0aGlzLmVuaGFuY2VSb3dEYXRhRm9yRW50aXR5LCBlbnRpdGllcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRNYW55VG9NYW55R3JpZERhdGEgPSAoYXNzb2NpYXRlZEVudGl0aWVzOiBBcnJheTxhbnk+LCBhc3NvY2lhdGFibGVFbnRpdGllczogQXJyYXk8YW55PiwgaW5pdGFsTG9hZDogYm9vbGVhbikgPT4ge1xyXG4gICAgaWYgKGluaXRhbExvYWQpXHJcbiAgICAgIHRoaXMucm93RGF0YSA9IGFzc29jaWF0ZWRFbnRpdGllcy5tYXAodGhpcy5lbmhhbmNlUm93RGF0YUZvckVudGl0eSwgYXNzb2NpYXRlZEVudGl0aWVzKTtcclxuICAgIGVsc2VcclxuICAgICAgYXNzb2NpYXRlZEVudGl0aWVzID0gdGhpcy5yb3dEYXRhLm1hcCgoZTogYW55KSA9PiB7IHJldHVybiBlLiRlbnRpdHkgfSk7XHJcbiAgICBsZXQgYXNzb2NpYXRhYmxlVHlwZU5hbWUgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5TWFueVRvTWFueVR5cGUubmFtZVxyXG4gICAgbGV0IGFzc29jaWF0ZWRNYXBPZkFzc29jaWF0YWJsZSA9IF8ubWFwKGFzc29jaWF0ZWRFbnRpdGllcywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVbJ28nICsgYXNzb2NpYXRhYmxlVHlwZU5hbWVdOyB9KTtcclxuICAgIHRoaXMudW5hc3NvY2lhdGVkQ2hvaWNlcyA9IGFzc29jaWF0YWJsZUVudGl0aWVzLmZpbHRlcihvYmplY3QxID0+IHtcclxuICAgICAgcmV0dXJuICFhc3NvY2lhdGVkTWFwT2ZBc3NvY2lhdGFibGUuc29tZShvYmplY3QyID0+IHsgcmV0dXJuIG9iamVjdDEudmFsdWUuJCA9PT0gb2JqZWN0Mlthc3NvY2lhdGFibGVUeXBlTmFtZSArICdSZWYnXTsgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhwb3J0RGF0YSA9ICgpID0+IHtcclxuICAgIHRoaXMudWlOb3RpZmljYXRpb24uc2hvd0V4cG9ydERpYWxvZygpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xyXG4gICAgICBsZXQgZXhwb3J0R3JpZFNwZWM7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZSlcclxuICAgICAgICBleHBvcnRHcmlkU3BlYyA9IHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5lbnRpdHlUeXBlLm5hbWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBleHBvcnRHcmlkU3BlYyA9ICckY3VzdG9tPScgKyAxO1xyXG5cclxuICAgICAgbGV0IHJvd05vZGVzOiBhbnkgPSBbXTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuZm9yRWFjaE5vZGUoKHJvd05vZGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJvd05vZGVzLnB1c2gocm93Tm9kZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgcmVmcyA9IF8ubWFwKHJvd05vZGVzLCAocm93Tm9kZSkgPT4geyByZXR1cm4gcm93Tm9kZS5kYXRhLiRlbnRpdHlbdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUubmFtZSArICdSZWYnXTsgfSk7XHJcbiAgICAgIHRoaXMuZGF0YUNvbnRleHRcclxuICAgICAgICAuZW50aXR5QWNjZXNzKClcclxuICAgICAgICAuZXhwb3J0KHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5lbnRpdHlUeXBlLCBleHBvcnRHcmlkU3BlYywgdGhpcy5sYXRlc3RTZXR1cFF1ZXJ5LCByZWZzLmpvaW4oJywnKSwgcmVzdWx0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblN1cHByZXNzS2V5Ym9hcmRFdmVudCA9IChwYXJhbXM6IFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzVGFiS2V5ID0gcGFyYW1zLmV2ZW50LmtleSA9PT0gJ1RhYic7XHJcbiAgICBsZXQgaXNBcnJvd0Rvd24gPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJztcclxuICAgIGxldCBpc0Fycm93VXAgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dVcCc7XHJcbiAgICBsZXQgaXNBcnJvd0xlZnQgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JztcclxuICAgIGxldCBpc0Fycm93UmlnaHQgPSBwYXJhbXMuZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCc7XHJcbiAgICBsZXQgaXNTaGlmdEtleSA9IHBhcmFtcy5ldmVudC5zaGlmdEtleTtcclxuICAgIGxldCBpc0FsdEtleSA9IHBhcmFtcy5ldmVudC5hbHRLZXk7XHJcblxyXG4gICAgbGV0IGZvY3VzZWRDZWxsID0gcGFyYW1zLmFwaS5nZXRGb2N1c2VkQ2VsbCgpO1xyXG4gICAgbGV0IGhhc0Nob2ljZXMgPSBwYXJhbXMuZGF0YVtwYXJhbXMuY29sdW1uLmdldENvbElkKCldICYmIHBhcmFtcy5kYXRhW3BhcmFtcy5jb2x1bW4uZ2V0Q29sSWQoKV0uY2hvaWNlcyA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAocGFyYW1zLmNvbHVtbi5pc1Bpbm5lZCgpKSB7XHJcbiAgICAgIGlmIChpc1RhYktleSAmJiAhaXNTaGlmdEtleSlcclxuICAgICAgICBwYXJhbXMuYXBpLnRhYlRvTmV4dENlbGwoKTtcclxuICAgICAgZWxzZSBpZiAoaXNUYWJLZXkgJiYgaXNTaGlmdEtleSlcclxuICAgICAgICBwYXJhbXMuYXBpLnRhYlRvUHJldmlvdXNDZWxsKCk7XHJcbiAgICAgIGVsc2UgaWYgKGlzQXJyb3dMZWZ0KVxyXG4gICAgICAgIHBhcmFtcy5hcGkudGFiVG9QcmV2aW91c0NlbGwoKTtcclxuICAgICAgZWxzZSBpZiAoaXNBcnJvd1JpZ2h0KVxyXG4gICAgICAgIHBhcmFtcy5hcGkudGFiVG9OZXh0Q2VsbCgpO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zdG9wRWRpdGluZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0Nob2ljZXMgJiYgaXNBbHRLZXkgJiYgKGlzQXJyb3dEb3duIHx8IGlzQXJyb3dVcCkpIHtcclxuICAgICAgcGFyYW1zLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBwYXJhbXMuYXBpLnN0YXJ0RWRpdGluZ0NlbGwoe1xyXG4gICAgICAgIHJvd0luZGV4OiBmb2N1c2VkQ2VsbD8ucm93SW5kZXggYXMgbnVtYmVyLFxyXG4gICAgICAgIGNvbEtleTogZm9jdXNlZENlbGw/LmNvbHVtbiBhcyBDb2x1bW4sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGFkZEVudGl0eSA9IChuZXdFbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSkge1xyXG4gICAgICBsZXQgcGFyZW50TmFtZSA9IHRoaXMuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgIGxldCB1bmFzc29jaWF0ZWRUeXBlID0gdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eU1hbnlUb01hbnlUeXBlO1xyXG4gICAgICBsZXQgcmVmID0gdGhpcy5zZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZS52YWx1ZS4kO1xyXG4gICAgICBsZXQgY2hpbGRUb0Fzc29jaWF0ZSA9IHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuc2VhcmNoQnlSZWZDYWNoZU9ubHkodW5hc3NvY2lhdGVkVHlwZSwgcmVmLCB0cnVlKVxyXG4gICAgICBpZiAoY2hpbGRUb0Fzc29jaWF0ZSkge1xyXG4gICAgICAgIGxldCBlbmhhbmNlZEVudGl0eSA9IHRoaXMuZW5oYW5jZVJvd0RhdGFGb3JFbnRpdHkobmV3RW50aXR5KTtcclxuICAgICAgICBlbmhhbmNlZEVudGl0eS4kZW50aXR5W3VuYXNzb2NpYXRlZFR5cGUubmFtZSArICdSZWYnXSA9IGNoaWxkVG9Bc3NvY2lhdGVbdW5hc3NvY2lhdGVkVHlwZS5uYW1lICsgJ1JlZiddO1xyXG4gICAgICAgIGVuaGFuY2VkRW50aXR5LiRlbnRpdHlbcGFyZW50TmFtZSArICdSZWYnXSA9IHRoaXMuZW50aXR5W3BhcmVudE5hbWUgKyAnUmVmJ107XHJcbiAgICAgICAgLy8gcmVtb3ZlIGl0ZW0gZnJvbSB0aGUgYWRkIGRyb3Bkb3duIGNvbnRyb2xcclxuICAgICAgICBsZXQgaXRlbUluZGV4ID0gdGhpcy51bmFzc29jaWF0ZWRDaG9pY2VzLmZpbmRJbmRleCgoY2hvaWNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gY2hvaWNlW3VuYXNzb2NpYXRlZFR5cGUubmFtZSArICdSZWYnXSA9PT0gY2hpbGRUb0Fzc29jaWF0ZVt1bmFzc29jaWF0ZWRUeXBlLm5hbWUgKyAnUmVmJ107XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy51bmFzc29jaWF0ZWRDaG9pY2VzLnNwbGljZShpdGVtSW5kZXgsIDEpO1xyXG4gICAgICAgIC8vIGNsZWFyIGFkZCBzZWxlY3Rpb25cclxuICAgICAgICB0aGlzLnNlbGVjdGVkVW5hc3NvY2lhdGVkQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIGFkZCByb3cgdG8gZ3JpZFxyXG4gICAgICAgIHRoaXMudW5zYXZlZEVudGl0aWVzLnB1c2goZW5oYW5jZWRFbnRpdHkpO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFwcGx5VHJhbnNhY3Rpb24oeyBhZGQ6IFtlbmhhbmNlZEVudGl0eV0sIGFkZEluZGV4OiAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZW5oYW5jZWRFbnRpdHkgPSB0aGlzLmVuaGFuY2VSb3dEYXRhRm9yRW50aXR5KG5ld0VudGl0eSk7XHJcbiAgICAgIHRoaXMucm93RGF0YS51bnNoaWZ0KGVuaGFuY2VkRW50aXR5KTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuYXBwbHlUcmFuc2FjdGlvbih7IGFkZDogW2VuaGFuY2VkRW50aXR5XSwgYWRkSW5kZXg6IDAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICBzdXBwcmVzc0tleWJvYXJkRXZlbnQ6IHRoaXMub25TdXBwcmVzc0tleWJvYXJkRXZlbnRcclxuICB9O1xyXG5cclxuICBnZXRSb3dDb3VudCA9ICgpID0+IHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaT8uZm9yRWFjaE5vZGVBZnRlckZpbHRlcigoKSA9PiBjb3VudCsrKTtcclxuICAgIHJldHVybiAnUm93czogJyArIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dDb3VudCA9ICgpID0+IHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBjb3VudCA9IHRoaXMuZ3JpZE9wdGlvbnMuYXBpPy5nZXRTZWxlY3RlZFJvd3MoKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gJ1NlbGVjdGVkOiAnICsgY291bnQ7XHJcbiAgfVxyXG5cclxuICBvblJvd0RhdGFDaGFuZ2VkID0gKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgaWYgKHRoaXMucm93RGF0YSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNldE5vUm93c1RlbXBsYXRlKCk7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd05vUm93c092ZXJsYXkgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DZWxsRG91YmxlQ2xpY2tlZCA9IChncmlkQ29uZmlnOiBhbnkpID0+IHtcclxuICAgIGlmIChncmlkQ29uZmlnLmNvbERlZi5jZWxsQ2xhc3MgPT09ICdhZy1way1hbGlnbmVkLWNlbGwnKVxyXG4gICAgICB0aGlzLmNvbmZpZy5yb3dIZWFkZXJEb3VibGVDbGlja2VkKGdyaWRDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgb25DZWxsS2V5RG93biA9IChldmVudDogYW55KSA9PiB7XHJcbiAgICBpZiAoIWV2ZW50LmV2ZW50KSByZXR1cm47XHJcbiAgICBjb25zdCBrZXkgPSAoZXZlbnQuZXZlbnQgYXMgdW5rbm93bikgYXMgS2V5Ym9hcmRFdmVudDtcclxuICAgIGlmIChrZXkuY29kZSA9PT0gJ1NwYWNlJykge1xyXG4gICAgICBrZXkucHJldmVudERlZmF1bHQoKTtcclxuICAgICAga2V5LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgaWYgKCFldmVudC5jb2xEZWYuY2VsbFJlbmRlcmVyKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGk/LnN0YXJ0RWRpdGluZ0NlbGwoe1xyXG4gICAgICAgICAgcm93SW5kZXg6IGV2ZW50LnJvd0luZGV4LFxyXG4gICAgICAgICAgY29sS2V5OiBldmVudC5jb2x1bW4uZ2V0Q29sSWQoKSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGVcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIG9uQ2VsbEZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LmNvbHVtbi5jb2xEZWYucGlubmVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5zdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuZGVzZWxlY3RBbGwoKTtcclxuICAgIH1cclxuICAgIC8vbGV0IGNvbHVtbkRlZnMgPSB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuY29sdW1uRGVmcztcclxuICAgIC8vaWYgKGV2ZW50LmNvbHVtbi5jb2xEZWYucGlubmVkKSB7XHJcbiAgICAvLyAgY29sdW1uRGVmcy5mb3JFYWNoKChjb2x1bW5EZWY6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgaWYgKGluZGV4ICE9PSAwKVxyXG4gICAgLy8gICAgICBjb2x1bW5EZWYuaGVhZGVyQ2xhc3MgPSAnYWctY29sdW1uLWZvY3VzJztcclxuICAgIC8vICB9KTtcclxuICAgIC8vfSBlbHNlIHtcclxuICAgIC8vICBjb2x1bW5EZWZzLmZvckVhY2goKGNvbHVtbkRlZjogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAvLyAgICBpZiAoaW5kZXggIT09IDAgJiYgZXZlbnQuY29sdW1uLmNvbElkID09PSBjb2x1bW5EZWYuZmllbGQpXHJcbiAgICAvLyAgICAgIGNvbHVtbkRlZi5oZWFkZXJDbGFzcyA9ICdhZy1jb2x1bW4tZm9jdXMnO1xyXG4gICAgLy8gICAgZWxzZVxyXG4gICAgLy8gICAgICBjb2x1bW5EZWYuaGVhZGVyQ2xhc3MgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAgfSk7XHJcbiAgICAvL31cclxuICAgIC8vdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoID0gKHNldHVwUXVlcnk6IGFueSkgPT4ge1xyXG4gICAgdGhpcy5maXJzdFNlYXJjaFJhbiA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5oaWRlT3ZlcmxheSgpO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2hvd0xvYWRpbmdPdmVybGF5KCk7XHJcblxyXG4gICAgbGV0IGVudGl0eUxvYWRlZCA9IHRoaXMubG9hZGVkRW50aXRpZXMuc29tZSgocmVmKSA9PiB7IHJldHVybiByZWYgPT09IHRoaXMuZW50aXR5W3RoaXMuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUgKyAnUmVmJ107IH0pO1xyXG4gICAgbGV0IGpvaW5zID0gW107XHJcbiAgICBpZiAoZW50aXR5TG9hZGVkKSB7XHJcbiAgICAgIGpvaW5zLnB1c2godGhpcy5kYXRhQ29udGV4dC5lbnRpdHlBY2Nlc3MoKS5zZWFyY2hDYWNoZU9ubHkoXHJcbiAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eVR5cGUsXHJcbiAgICAgICAgc2V0dXBRdWVyeSxcclxuICAgICAgICB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZXhwYW5kcykpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSlcclxuICAgICAgICBqb2lucy5wdXNoKHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuc2VhcmNoUXVlcnlDaG9pY2VzKFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eU1hbnlUb01hbnlUeXBlLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLm1hbnlUb01hbnlTZXR1cFF1ZXJ5KHRoaXMuZW50aXR5KSwgbnVsbCwgZmFsc2UpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgam9pbnMucHVzaCh0aGlzLmRhdGFDb250ZXh0LmVudGl0eUFjY2VzcygpLnNlYXJjaChcclxuICAgICAgICB0aGlzLmNvbmZpZy5yZXN1bHRDb25maWcuZW50aXR5VHlwZSxcclxuICAgICAgICBzZXR1cFF1ZXJ5LFxyXG4gICAgICAgIHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5leHBhbmRzLCBmYWxzZSkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSlcclxuICAgICAgICBqb2lucy5wdXNoKHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuc2VhcmNoUXVlcnlDaG9pY2VzKFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLmVudGl0eU1hbnlUb01hbnlUeXBlLFxyXG4gICAgICAgICAgdGhpcy5jb25maWcucmVzdWx0Q29uZmlnLm1hbnlUb01hbnlTZXR1cFF1ZXJ5KHRoaXMuZW50aXR5KSwgbnVsbCwgdHJ1ZSkpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXRlc3RTZXR1cFF1ZXJ5ID0gc2V0dXBRdWVyeTtcclxuXHJcbiAgICBmb3JrSm9pbihqb2lucykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogcmVzdWx0cyA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXROb1Jvd3NUZW1wbGF0ZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnkpXHJcbiAgICAgICAgICB0aGlzLmxvYWRNYW55VG9NYW55R3JpZERhdGEocmVzdWx0c1swXSwgcmVzdWx0c1sxXSwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5sb2FkR3JpZERhdGEocmVzdWx0c1swXSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgIT09IFRydURhdGFHcmlkVHlwZXMuU2VhcmNoKVxyXG4gICAgICAgICAgdGhpcy5sb2FkZWRFbnRpdGllcy5wdXNoKHRoaXMuZW50aXR5W3RoaXMuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUgKyAnUmVmJ10pO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMucm93RGF0YSA9PT0gbnVsbCB8fCAhdGhpcy5yb3dEYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2hvd05vUm93c092ZXJsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25VbmFzc29jaWF0ZWRDaG9pY2VDaGFuZ2VkID0gKG9wdGlvbjogSVRydVRvb2xiYXJEcm9wZG93bk9wdGlvbiB8IG51bGwpID0+IHtcclxuXHJcbiAgfVxyXG5cclxuICBjYW5BZGQgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkVHlwZSA9PT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWxNYW55VG9NYW55KVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvbkFkZCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuZGF0YUNvbnRleHQuZW50aXR5QWNjZXNzKCkuYWRkKHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5lbnRpdHlUeXBlKVxyXG4gIH1cclxuXHJcbiAgb25EZWxldGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICBsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcbiAgICBpZiAoc2VsZWN0ZWRSb3dzLmxlbmd0aCkge1xyXG4gICAgICBsZXQgZW50aXRpZXMgPSBzZWxlY3RlZFJvd3MubWFwKGZ1bmN0aW9uIChyb3c6IGFueSkgeyByZXR1cm4gcm93LiRlbnRpdHk7IH0pO1xyXG4gICAgICBsZXQgY29uZmlybU1zZyA9IHRoaXMuYXBwRW52aXJvbm1lbnQuZm9ybWF0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSh0aGlzLmNvbmZpZy50YWJsZU5hbWUsIHRoaXMuY29uZmlnLnRhYmxlUGx1cmFsTGFiZWwsIHNlbGVjdGVkUm93cy5sZW5ndGgpO1xyXG4gICAgICBpZiAodGhpcy5ncmlkVHlwZSA9PT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWxNYW55VG9NYW55KSB7XHJcbiAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMub25TZWFyY2godGhpcy5jb25maWcucmVzdWx0Q29uZmlnLnNldHVwUXVlcnkodGhpcy5lbnRpdHkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhQ29udGV4dC5kZWxldGUoZW50aXRpZXMsIGNvbmZpcm1Nc2csIG9uU3VjY2Vzcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhQ29udGV4dC5kZWxldGUoZW50aXRpZXMsIGNvbmZpcm1Nc2cpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLndhcm5pbmcodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dOb1JlY29yZHNTZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbktlZXAgPSAoKTogdm9pZCA9PiB7XHJcbiAgICBsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcbiAgICBpZiAoc2VsZWN0ZWRSb3dzLmxlbmd0aClcclxuICAgICAgdGhpcy5yb3dEYXRhID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFwcGx5VHJhbnNhY3Rpb24oeyByZW1vdmU6IHNlbGVjdGVkUm93cyB9KTtcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0ID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy5leHBvcnREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaWJlVG8oKTtcclxuICAgIHRoaXMuY29sdW1uRGVmcyA9IHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5jb2x1bW5EZWZzO1xyXG4gICAgdGhpcy5ncmlkVHlwZSA9IHRoaXMuY29uZmlnLnJlc3VsdENvbmZpZy5ncmlkVHlwZTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbCB8fCB0aGlzLmdyaWRUeXBlID09PSBUcnVEYXRhR3JpZFR5cGVzLkRldGFpbE1hbnlUb01hbnkpXHJcbiAgICAgIHRoaXMub25TZWFyY2godGhpcy5jb25maWcucmVzdWx0Q29uZmlnLnNldHVwUXVlcnkodGhpcy5lbnRpdHkpKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vc2V0VGltZW91dCB0byBwcmV2ZW50OiBFUlJPUiBFcnJvcjogTkcwMTAwOiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yLiBcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhcmVudFRvb2xiYXJUZW1wbGF0ZSA9IHRoaXMuc2VhcmNoUmVzdWx0Vmlld01hbmFnZXIuc2VhcmNoVmlld1Rvb2xiYXJUZW1wbGF0ZTtcclxuICAgICAgaWYgKHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsIHx8IHRoaXMuZ3JpZFR5cGUgPT09IFRydURhdGFHcmlkVHlwZXMuRGV0YWlsTWFueVRvTWFueSkge1xyXG4gICAgICAgIHRoaXMub25TZWFyY2godGhpcy5jb25maWcucmVzdWx0Q29uZmlnLnNldHVwUXVlcnkodGhpcy5lbnRpdHkpKTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdj5cclxuICA8ZGl2IGNsYXNzPVwidHJ1LWRhdGEtZ3JpZC10b29sYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgPHRydS10b29sYmFyPlxyXG4gICAgICA8dHJ1LXRvb2xiYXItZHJvcGRvd24gW29wdGlvbnNdPVwidW5hc3NvY2lhdGVkQ2hvaWNlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkT3B0aW9uKV09XCJzZWxlY3RlZFVuYXNzb2NpYXRlZENob2ljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVW5hc3NvY2lhdGVkQ2hvaWNlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZFR5cGUgPT0gVHJ1RGF0YUdyaWRUeXBlcy5EZXRhaWxNYW55VG9NYW55XCI+XHJcbiAgICAgIDwvdHJ1LXRvb2xiYXItZHJvcGRvd24+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1idXR0b24gW2ljb25dPVwiJ3RydS10b29sYmFyLWFkZC1pY29uJ1wiIFt0b29sdGlwXT1cIidBZGQgLSBbQ3RybCArIEldJ1wiIFtkaXNhYmxlZF09XCIhY2FuQWRkKClcIiAob25DbGljayk9XCJvbkFkZCgpXCI+PC90cnUtdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1idXR0b24gW2ljb25dPVwiJ3RydS10b29sYmFyLWRlbGV0ZS1pY29uJ1wiIFt0b29sdGlwXT1cIidEZWxldGUgLSBbQ3RybCArIERdJ1wiIChjbGljayk9XCJvbkRlbGV0ZSgpXCI+PC90cnUtdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1idXR0b24gW2ljb25dPVwiJ3RydS10b29sYmFyLWtlZXAtaWNvbidcIiBbdG9vbHRpcF09XCInS2VlcCBzZWxlY3RlZCByZWNvcmRzIC0gW0N0cmwgKyBLXSdcIiAoY2xpY2spPVwib25LZWVwKClcIj48L3RydS10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPHRydS10b29sYmFyLWJ1dHRvbiBbaWNvbl09XCIndHJ1LXRvb2xiYXItcmVtb3ZlLWljb24nXCIgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBzZWxlY3RlZCByZWNvcmRzIC0gW0N0cmwgKyBSXSdcIiAoY2xpY2spPVwib25SZW1vdmUoKVwiPjwvdHJ1LXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8dHJ1LXRvb2xiYXItc2VwYXJhdG9yPjwvdHJ1LXRvb2xiYXItc2VwYXJhdG9yPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFyZW50VG9vbGJhclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDx0cnUtdG9vbGJhci1zZXBhcmF0b3IgKm5nSWY9XCJncmlkVHlwZSA9PSBUcnVEYXRhR3JpZFR5cGVzLlNlYXJjaFwiPjwvdHJ1LXRvb2xiYXItc2VwYXJhdG9yPlxyXG4gICAgICA8dHJ1LXRvb2xiYXItYnV0dG9uIFtpY29uXT1cIid0cnUtdG9vbGJhci1leHBvcnQtaWNvbidcIiBbdG9vbHRpcF09XCInRXhwb3J0J1wiIChjbGljayk9XCJvbkV4cG9ydCgpXCI+PC90cnUtdG9vbGJhci1idXR0b24+XHJcbiAgICA8L3RydS10b29sYmFyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLWNvbnRhaW5lclwiPlxyXG4gICAgPGFnLWdyaWQtYW5ndWxhciBjbGFzcz1cImFnLXRoZW1lLWFscGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cInJvd0RhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJIZWlnaHRdPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcm93SGVpZ2h0XT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgW3Jvd0J1ZmZlcl09XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtlbnRlck5hdmlnYXRlc1ZlcnRpY2FsbHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtlbnRlck5hdmlnYXRlc1ZlcnRpY2FsbHlBZnRlckVkaXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzdXBwcmVzc1Jvd0hvdmVySGlnaGxpZ2h0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoY2VsbERvdWJsZUNsaWNrZWQpPVwib25DZWxsRG91YmxlQ2xpY2tlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGNlbGxLZXlEb3duKT1cIm9uQ2VsbEtleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjZWxsRm9jdXNlZCk9XCJvbkNlbGxGb2N1c2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAocm93RGF0YUNoYW5nZWQpPVwib25Sb3dEYXRhQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwidHJ1LWRhdGEtZ3JpZC1zdGF0dXNiYXItY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHJ1LWRhdGEtZ3JpZC1zdGF0dXNiYXItY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXN0YXR1c2Jhci12YWx1ZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ0cnUtZGF0YS1ncmlkLXN0YXR1c2Jhci12YWx1ZXMtdGV4dFwiPnt7Z2V0Um93Q291bnQoKX19PC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwidHJ1LWRhdGEtZ3JpZC1zdGF0dXNiYXItdmFsdWVzLXRleHRcIj57e2dldFNlbGVjdGVkUm93Q291bnQoKX19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
@@ -26,7 +26,8 @@ export class TruDataContext {
26
26
  this.entityManager.entityChanged.subscribe((changeArgs) => {
27
27
  if (changeArgs.entityAction === EntityAction.PropertyChange ||
28
28
  changeArgs.entityAction === EntityAction.RejectChanges ||
29
- changeArgs.entityAction === EntityAction.Attach)
29
+ changeArgs.entityAction === EntityAction.Attach ||
30
+ changeArgs.entityAction === EntityAction.Detach)
30
31
  this.propertyChanged(changeArgs);
31
32
  });
32
33
  }
@@ -262,4 +263,4 @@ export class TruDataContext {
262
263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TruDataContext, decorators: [{
263
264
  type: Injectable
264
265
  }], ctorParameters: () => [{ type: i1.TruBreezeContextFactory }, { type: i2.TruAppEnvironment }, { type: i3.TruEntityAccessor }, { type: i4.TruUiNotification }] });
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRhdGEtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvc2VydmljZXMvdHJ1LWRhdGEtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBVSxZQUFZLEVBQTBCLFdBQVcsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFLdkgsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQUkzQyxNQUFNLE9BQU8sY0FBYztJQVNmO0lBQ0E7SUFDQTtJQUNBO0lBWEYsaUJBQWlCLEdBQWlCLElBQUksT0FBTyxFQUFPLENBQUM7SUFDckQsYUFBYSxHQUEyQixJQUFJLE9BQU8sRUFBaUIsQ0FBQztJQUVyRSxjQUFjLENBQW1CO0lBQ2pDLHNCQUFzQixHQUFrQixFQUFFLENBQUM7SUFDM0MsNkJBQTZCLEdBQWtCLEVBQUUsQ0FBQztJQUUxRCxZQUNVLG9CQUE2QyxFQUM3QyxjQUFpQyxFQUNqQyxjQUFpQyxFQUNqQyxjQUFpQztRQUhqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXlCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBRXpDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFrQyxFQUFFLEVBQUU7WUFDaEYsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxj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QUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUE7dUdBblJVLGNBQWM7MkdBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlBY3Rpb24sIEVudGl0eUNoYW5nZWRFdmVudEFyZ3MsIEVudGl0eVN0YXRlLCBFbnRpdHlUeXBlLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBUcnVCcmVlemVDb250ZXh0RmFjdG9yeSwgVHJ1QnJlZXplQ29udGV4dCB9IGZyb20gJy4vdHJ1LWJyZWV6ZS1jb250ZXh0LWZhY3RvcnknO1xyXG5pbXBvcnQgeyBUcnVFbnRpdHlBY2Nlc3NvciB9IGZyb20gJy4vdHJ1LWVudGl0eS1hY2Nlc3Nvcic7XHJcbmltcG9ydCB7IFRydVVpTm90aWZpY2F0aW9uIH0gZnJvbSAnLi90cnUtdWktbm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgVHJ1QXBwRW52aXJvbm1lbnQgfSBmcm9tICcuL3RydS1hcHAtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRydURhdGFDaGFuZ2UgfSBmcm9tICcuLi9jbGFzc2VzL3RydS1kYXRhLWNoYW5nZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUcnVEYXRhQ29udGV4dCB7XHJcbiAgcHJpdmF0ZSBfcHJvcGVydHlDaGFuZ2VkJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHByaXZhdGUgX2RhdGFDaGFuZ2VkJDogU3ViamVjdDxUcnVEYXRhQ2hhbmdlPiA9IG5ldyBTdWJqZWN0PFRydURhdGFDaGFuZ2U+KCk7XHJcblxyXG4gIHByaXZhdGUgX2JyZWV6ZUNvbnRleHQ6IFRydUJyZWV6ZUNvbnRleHQ7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0RlbGV0ZUVudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllczogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYnJlZXplQ29udGV4dEZhY3Rvcnk6IFRydUJyZWV6ZUNvbnRleHRGYWN0b3J5LFxyXG4gICAgcHJpdmF0ZSBhcHBFbnZpcm9ubWVudDogVHJ1QXBwRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIGVudGl0eUFjY2Vzc29yOiBUcnVFbnRpdHlBY2Nlc3NvcixcclxuICAgIHByaXZhdGUgdWlOb3RpZmljYXRpb246IFRydVVpTm90aWZpY2F0aW9uXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9icmVlemVDb250ZXh0ID0gdGhpcy5icmVlemVDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KCk7XHJcbiAgICB0aGlzLmVudGl0eUFjY2Vzc29yLmNvbnRleHQgPSB0aGlzO1xyXG5cclxuICAgIHRoaXMuZW50aXR5TWFuYWdlci5lbnRpdHlDaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlQXJnczogRW50aXR5Q2hhbmdlZEV2ZW50QXJncykgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlQXJncy5lbnRpdHlBY3Rpb24gPT09IEVudGl0eUFjdGlvbi5Qcm9wZXJ0eUNoYW5nZSB8fFxyXG4gICAgICAgIGNoYW5nZUFyZ3MuZW50aXR5QWN0aW9uID09PSBFbnRpdHlBY3Rpb24uUmVqZWN0Q2hhbmdlcyB8fFxyXG4gICAgICAgIGNoYW5nZUFyZ3MuZW50aXR5QWN0aW9uID09PSBFbnRpdHlBY3Rpb24uQXR0YWNoKVxyXG4gICAgICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkKGNoYW5nZUFyZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblByb3BlcnR5Q2hhbmdlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUNoYW5nZWQkO1xyXG4gIH1cclxuXHJcbiAgcHJvcGVydHlDaGFuZ2VkKGNoYW5nZUFyZ3M6IEVudGl0eUNoYW5nZWRFdmVudEFyZ3MgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9wZXJ0eUNoYW5nZWQkLm5leHQoY2hhbmdlQXJncyk7XHJcbiAgfVxyXG5cclxuICBvbkRhdGFDaGFuZ2VkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDaGFuZ2VkJDtcclxuICB9XHJcblxyXG4gIGRhdGFDaGFuZ2VkKGNoYW5nZTogVHJ1RGF0YUNoYW5nZSkge1xyXG4gICAgdGhpcy5fZGF0YUNoYW5nZWQkLm5leHQoY2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRpb25DaGFuZ2VEZXRlY3Rpb24gPSBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlci52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5zdWJzY3JpYmUoZW50aXRpZXMgPT4ge1xyXG4gICAgICBvYnNlcnZlci5uZXh0KGVudGl0aWVzKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBnZXRWYWxpZGF0aW9uRXJyb3JzID0gKGVudGl0aWVzOiBBcnJheTxFbnRpdHk+IHwgbnVsbCA9IG51bGwpOiBhbnkgPT4ge1xyXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0Q2hhbmdlcygpO1xyXG4gICAgdmFyIGVycm9yc1BlckVudGl0eSA9IGVudGl0aWVzIS5tYXAoKGVudGl0eSk6IFZhbGlkYXRpb25FcnJvcltdID0+IHtcclxuICAgICAgdmFyIGVycm9ycyA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgICBlcnJvcnMgPSBlcnJvcnMubWFwKChlcnI6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGVudGl0eTogZW50aXR5LFxyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIuZXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgcHJvcGVydHk6IGVyci5wcm9wZXJ0eVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBlcnJvcnM7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBlcnJvcnNQZXJFbnRpdHk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdFZhbGlkYXRpb25FcnJvcnMgPSAoZW50aXRpZXM6IEFycmF5PEVudGl0eT4gfCBudWxsID0gbnVsbCk6IEFycmF5PHN0cmluZ1tdPiA9PiB7XHJcbiAgICBsZXQgZW50aXRpZXNXaXRoRXJyb3JzID0gdGhpcy5nZXRWYWxpZGF0aW9uRXJyb3JzKGVudGl0aWVzKTtcclxuICAgIGxldCBmb3JtYXR0ZWRFcnJvcnMgPSBuZXcgQXJyYXk8c3RyaW5nW10+KCk7XHJcbiAgICBlbnRpdGllc1dpdGhFcnJvcnMuZm9yRWFjaCgoZW50aXR5V2l0aEVycm9yczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlbnRpdHlXaXRoRXJyb3JzLmxlbmd0aCkge1xyXG4gICAgICAgIGZvcm1hdHRlZEVycm9ycy5wdXNoKGVudGl0eVdpdGhFcnJvcnMubWFwKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChlLnByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZS5lbnRpdHkuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lICsgJy4nICsgZS5wcm9wZXJ0eU5hbWUgKyAnOiAnICsgZS5lcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YXIgbWVyZ2VEYXRhID0gSlNPTi5wYXJzZShlLmVudGl0eS5NZXJnZV9EYXRhKTtcclxuICAgICAgICAgIGlmIChtZXJnZURhdGEgJiZcclxuICAgICAgICAgICAgbWVyZ2VEYXRhLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiZcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMobWVyZ2VEYXRhKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIG1lcmdlRGF0YVtlLnByb3BlcnR5Lm5hbWVdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXJnZURhdGFbZS5wcm9wZXJ0eS5uYW1lXS5tb2RpZmllZEJ5ICsgJyBjaGFuZ2VkICcgKyBlLnByb3BlcnR5Lm5hbWUgKyAnIHRvICcgKyBtZXJnZURhdGFbZS5wcm9wZXJ0eS5uYW1lXS52YWx1ZSArICcuIEFjY2VwdCBvciBEZWNsaW5lIHRoZSBjaGFuZ2UuICdcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBlLnByb3BlcnR5Lm5hbWUgPyBlLnByb3BlcnR5Lm5hbWUgOiAnW1Vua25vd24gUHJvcGVydHldJztcclxuICAgICAgICAgIHJldHVybiBlLmVudGl0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUgKyAnLicgKyBwcm9wZXJ0eU5hbWUgKyAnOiBoYXMgaW52YWxpZCBkYXRhLidcclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBmb3JtYXR0ZWRFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRDYWNoZWRDYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMgPSAoZW50aXR5OiBFbnRpdHkpOiBBcnJheTxFbnRpdHk+ID0+IHtcclxuICAgIGxldCBkZXNjZW5kYW50czogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG4gICAgdHlwZSBrZXlPZkVudGl0eSA9IGtleW9mIHR5cGVvZiBlbnRpdHk7XHJcbiAgICBsZXQgdHlwZSA9IGVudGl0eS5lbnRpdHlUeXBlO1xyXG4gICAgbGV0IHR5cGVOYW1lID0gdHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lO1xyXG4gICAgbGV0IGVudGl0eUNoaWxkcmVuTmFtZXM6IGFueSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoJ1JlcGxhY2Ugd2l0aDogTW9kZWxOYXZpZ2F0aW9uUHJvcGVydGllcy52YWx1ZScpKVt0eXBlTmFtZV07XHJcbiAgICBPYmplY3QuZW50cmllcyhlbnRpdHlDaGlsZHJlbk5hbWVzKVxyXG4gICAgICAuZm9yRWFjaCgoW2ssIHZdOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgcHJvcGVydHkgPSBlbnRpdHlbayBhcyBrZXlPZkVudGl0eV0gYXMgYW55O1xyXG4gICAgICAgIHByb3BlcnR5LmZvckVhY2goKGNoaWxkOiBFbnRpdHkpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdi5kb2VzQ2FzY2FkZURlbGV0ZSAmJiBjaGlsZC5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUgIT09IEVudGl0eVN0YXRlLkFkZGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZXRlIG9mIHNlbGVjdGVkIGl0ZW0gaXMgbm90IHBvc3NpYmxlIGR1ZSB0byByZWxhdGVkIGNoaWxkIHRoYXQgaXMgbm90IHNldHVwIGZvciBjYXNjYWRlIGRlbGV0ZS4gIERlbGV0ZSBjaGlsZHJlbiBpdGVtcyBmaXJzdC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KHRoaXMuZmluZENhY2hlZENhc2NhZGVEZWxldGVEZXNjZW5kYW50cyhjaGlsZCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NlbmRhbnRzID0gcHJvcGVydHkuY29uY2F0KGRlc2NlbmRhbnRzKTtcclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gZGVzY2VuZGFudHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcmtDYWNoZWREZXNjZW5kYW50c0ZvckRlbGV0ZSA9IChlbnRpdGllczogQXJyYXk8RW50aXR5PikgPT4ge1xyXG4gICAgdmFyIGNhc2NhZGVEZWxldGVEZXNjZW5kYW50c1BlckVudGl0eSA9IGVudGl0aWVzLm1hcCgoZW50aXR5OiBFbnRpdHkpID0+IHsgcmV0dXJuIHRoaXMuZmluZENhY2hlZENhc2NhZGVEZWxldGVEZXNjZW5kYW50cyhlbnRpdHkpOyB9LCBlbnRpdGllcyk7XHJcbiAgICB2YXIgY2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzID0gY2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzUGVyRW50aXR5LnJlZHVjZSgobWVtbywgaSkgPT4geyByZXR1cm4gbWVtby5jb25jYXQoaSk7IH0pO1xyXG4gICAgY2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzLmZvckVhY2goKGVudGl0eTogRW50aXR5KSA9PiB7IHRoaXMuZW50aXR5TWFuYWdlci5kZXRhY2hFbnRpdHkoZW50aXR5KTsgfSk7XHJcbiAgICB0aGlzLl9wZW5kaW5nRGVsZXRlRW50aXRpZXMgPSB0aGlzLl9wZW5kaW5nRGVsZXRlRW50aXRpZXMuY29uY2F0KGVudGl0aWVzKTtcclxuICAgIGxldCBjb21iaW5lZCA9IHRoaXMuX3BlbmRpbmdDYXNjYWRlRGVsZXRlRW50aXRpZXMuY29uY2F0KGNhc2NhZGVEZWxldGVEZXNjZW5kYW50cyk7XHJcbiAgICB0aGlzLl9wZW5kaW5nQ2FzY2FkZURlbGV0ZUVudGl0aWVzID0gY29tYmluZWQuZmlsdGVyKChuLCBpKSA9PiBjb21iaW5lZC5pbmRleE9mKG4pID09PSBpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFya0ZvckRlbGV0ZSA9IChlbnRpdGllczogQXJyYXk8RW50aXR5PikgPT4ge1xyXG4gICAgaWYgKGVudGl0aWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5tYXJrQ2FjaGVkRGVzY2VuZGFudHNGb3JEZWxldGUoZW50aXRpZXMpO1xyXG4gICAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEVudGl0eSkgPT4ge1xyXG4gICAgICAgIGVudGl0eS5lbnRpdHlBc3BlY3Quc2V0RGVsZXRlZCgpO1xyXG4gICAgICAgIC8vZW50aXR5Ll9hc3NvY2lhdGVkRGF0YUNhY2hlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBicmVlemVDb250ZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JyZWV6ZUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBnZXQgZW50aXR5TWFuYWdlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9icmVlemVDb250ZXh0LmVudGl0eU1hbmFnZXI7XHJcbiAgfVxyXG5cclxuICBoYXNDaGFuZ2VzID0gKGVudGl0eVR5cGVzOiBBcnJheTxFbnRpdHlUeXBlPiA9IFtdKSA9PiB7XHJcbiAgICBpZiAoZW50aXR5VHlwZXMubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gdGhpcy5fYnJlZXplQ29udGV4dC5lbnRpdHlNYW5hZ2VyLmdldENoYW5nZXMoZW50aXR5VHlwZXMpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2JyZWV6ZUNvbnRleHQuZW50aXR5TWFuYWdlci5nZXRDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBlbnRpdHlBY2Nlc3MgPSAoKTogVHJ1RW50aXR5QWNjZXNzb3IgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW50aXR5QWNjZXNzb3I7XHJcbiAgfVxyXG5cclxuICBleHBvcnRDYWhjZSA9ICgpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuX2JyZWV6ZUNvbnRleHQuZW50aXR5TWFuYWdlci5leHBvcnRFbnRpdGllcygpKTtcclxuICB9XHJcblxyXG4gIHNhdmUgPSAoXHJcbiAgICBlbnRpdGllczogQXJyYXk8RW50aXR5PiB8IG51bGwgPSBudWxsLFxyXG4gICAgZGVsZXRlT3BlcmF0aW9uOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nKSB7XHJcbiAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5lcnJvcih0aGlzLmFwcEVudmlyb25tZW50Lm1zZ1NhdmVJblByb2dyZXNzKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciB2YWxpZGF0aW9uRXJyb3JNZXNzYWdlcyA9IHRoaXMuZm9ybWF0VmFsaWRhdGlvbkVycm9ycyhlbnRpdGllcyk7XHJcbiAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5lcnJvcih0aGlzLmFwcEVudmlyb25tZW50Lm1zZ0ludmFsaWREYXRhLCB2YWxpZGF0aW9uRXJyb3JNZXNzYWdlc1swXSk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMoKS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLndhcm5pbmcodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dOb0NoYW5nZXNUb1NhdmUpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5pc1NhdmluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuZW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlcygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGlmICghZGVsZXRlT3BlcmF0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLnN1Y2Nlc3ModGhpcy5hcHBFbnZpcm9ubWVudC5tc2dTYXZlU3VjY2Vzc2Z1bCk7XHJcbiAgICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LnNhdmVDb21wbGV0ZSh7IHN1Y2Nlc3NmdWw6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSkuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuc2F2ZUNvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogZmFsc2UgfSk7XHJcbiAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobnVsbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlV2l0aG91dE5vdGlmaWNhdGlvbiA9ICgpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IFxyXG4gICAgICBpZiAodGhpcy5hcHBFbnZpcm9ubWVudC5pc1NhdmluZykge1xyXG4gICAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5lcnJvcih0aGlzLmFwcEVudmlyb25tZW50Lm1zZ1NhdmVJblByb2dyZXNzKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzKCkudGhlbigoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuc2F2ZUNvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSB9KTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pLmNhdGNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuc2F2ZUNvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogZmFsc2UgfSk7XHJcbiAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobnVsbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXZlcnQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICB0aGlzLnVpTm90aWZpY2F0aW9uLmNvbmZpcm0oJ0NvbmZpcm0gQWN0aW9uJywgJ1JldmVydCAnICsgdGhpcy5oYXNDaGFuZ2VzKCkubGVuZ3RoICsgJyBjaGFuZ2VkIHJlY29yZChzKScsIHRydWUsIHRydWUsIFwiTm9cIiwgXCJZZXNcIikudGhlbigoY29uZmlybTogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoY29uZmlybSkge1xyXG4gICAgICAgIHRoaXMuZW50aXR5TWFuYWdlci5yZWplY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5yZXZlcnRDb21wbGV0ZSh7IHN1Y2Nlc3NmdWw6IHRydWUgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV2ZXJ0V2l0aG91dFByb21wdCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMucmV2ZXJ0KCk7XHJcbiAgICB0aGlzLmFwcEVudmlyb25tZW50LnJldmVydENvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZSA9IChcclxuICAgIGVudGl0aWVzOiBBcnJheTxFbnRpdHk+LFxyXG4gICAgY29uZmlybU1zZzogc3RyaW5nLFxyXG4gICAgb25TdWNjZXNzOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgdmFyIG5ld0VudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgICB2YXIgZXhpc3RpbmdFbnRpdGllczogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG4gICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNBZGRlZCgpKVxyXG4gICAgICAgIG5ld0VudGl0aWVzLnB1c2goZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBleGlzdGluZ0VudGl0aWVzLnB1c2goZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGggJiYgZXhpc3RpbmdFbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi53YXJuaW5nKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnQ2Fubm90RGVsZXRlTmV3QW5kRXhpc3RpbmdSZWNvcmRzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4aXN0aW5nRW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc0NoYW5nZXMoKS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLndhcm5pbmcodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dEaXJ0eVByZXZlbnRzRGVsZXRlRXhpc3RpbmdSZWNvcmQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudWlOb3RpZmljYXRpb24uY29uZmlybSgnQ29uZmlybSBBY3Rpb24nLCBjb25maXJtTXNnLCB0cnVlLCB0cnVlLCBcIk5vXCIsIFwiWWVzXCIpLnRoZW4oKGNvbmZpcm06IGJvb2xlYW4pID0+IHtcclxuICAgICAgaWYgKGNvbmZpcm0pIHtcclxuICAgICAgICBpZiAobmV3RW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBuZXdFbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgICBlbnRpdHkuZW50aXR5QXNwZWN0LmNsZWFyVmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLm1hcmtGb3JEZWxldGUobmV3RW50aXRpZXMpO1xyXG4gICAgICAgICAgaWYgKG9uU3VjY2Vzcykgb25TdWNjZXNzKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLm1hcmtGb3JEZWxldGUoZXhpc3RpbmdFbnRpdGllcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uOiBhbnkpIHtcclxuICAgICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24uZXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNhdmUobnVsbCwgdHJ1ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICB2YXIgZW50aXRpZXNEZWxldGVkID0gdGhpcy5fcGVuZGluZ0RlbGV0ZUVudGl0aWVzLmNvbmNhdCh0aGlzLl9wZW5kaW5nQ2FzY2FkZURlbGV0ZUVudGl0aWVzKTtcclxuICAgICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuZGVsZXRlQ29tcGxldGUoeyBzdWNjZXNzZnVsOiB0cnVlLCBlbnRpdGllczogZW50aXRpZXNEZWxldGVkIH0pO1xyXG4gICAgICAgICAgaWYgKGVudGl0aWVzRGVsZXRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nRGVsZXRlRW50aXRpZXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24uc3VjY2Vzcyh0aGlzLmFwcEVudmlyb25tZW50Lm1zZ0RlbGV0ZVN1Y2Nlc3NmdWwpO1xyXG4gICAgICAgICAgaWYgKG9uU3VjY2Vzcykgb25TdWNjZXNzKHRydWUpO1xyXG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXZlcnQoKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHsgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRhdGEtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvc2VydmljZXMvdHJ1LWRhdGEtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBVSxZQUFZLEVBQTBCLFdBQVcsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFLdkgsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQUkzQyxNQUFNLE9BQU8sY0FBYztJQVNmO0lBQ0E7SUFDQTtJQUNBO0lBWEYsaUJBQWlCLEdBQWlCLElBQUksT0FBTyxFQUFPLENBQUM7SUFDckQsYUFBYSxHQUEyQixJQUFJLE9BQU8sRUFBaUIsQ0FBQztJQUVyRSxjQUFjLENBQW1CO0lBQ2pDLHNCQUFzQixHQUFrQixFQUFFLENBQUM7SUFDM0MsNkJBQTZCLEdBQWtCLEVBQUUsQ0FBQztJQUUxRCxZQUNVLG9CQUE2QyxFQUM3QyxjQUFpQyxFQUNqQyxjQUFpQyxFQUNqQyxjQUFpQztRQUhqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXlCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBRXpDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFrQyxFQUFFLEVBQUU7WUFDaEYsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxjQUFjO2dCQUN6RCxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxhQUFhO2dCQUN0RCxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUMvQyxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBeUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXFCO1FBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx5QkFBeUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzlELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILG1CQUFtQixHQUFHLENBQUMsV0FBaUMsSUFBSSxFQUFPLEVBQUU7UUFDbkUsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZELElBQUksZUFBZSxHQUFHLFFBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQXFCLEVBQUU7WUFDaEUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFPLEVBQUU7Z0JBQ3BDLE9BQU87b0JBQ0wsTUFBTSxFQUFFLE1BQU07b0JBQ2QsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO29CQUM5QixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7aUJBQ3ZCLENBQUE7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQyxDQUFBO0lBRU8sc0JBQXNCLEdBQUcsQ0FBQyxXQUFpQyxJQUFJLEVBQW1CLEVBQUU7UUFDMUYsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVksQ0FBQztRQUM1QyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBcUIsRUFBRSxFQUFFO1lBQ25ELElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFO2dCQUMzQixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUNuRCxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUU7d0JBQ2xCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7cUJBQy9GO29CQUNELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxTQUFTO3dCQUNYLFNBQVMsQ0FBQyxXQUFXLEtBQUssTUFBTTt3QkFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDcEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzVCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLGtDQUFrQyxDQUFBO3FCQUM5SjtvQkFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO29CQUM1RSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcscUJBQXFCLENBQUE7Z0JBQzdGLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDTDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQyxDQUFBO0lBRU8sa0NBQWtDLEdBQUcsQ0FBQyxNQUFjLEVBQWlCLEVBQUU7UUFDN0UsSUFBSSxXQUFXLEdBQWtCLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQzdCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN4QyxJQUFJLG1CQUFtQixHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQzthQUNoQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3ZCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFnQixDQUFRLENBQUM7WUFDL0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRTtvQkFDeEcsTUFBTSxJQUFJLEtBQUssQ0FBQyxrSUFBa0ksQ0FBQyxDQUFDO2lCQUNySjtnQkFDRCxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRixDQUFDLENBQUMsQ0FBQztZQUNILFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFBO0lBRU8sOEJBQThCLEdBQUcsQ0FBQyxRQUF1QixFQUFFLEVBQUU7UUFDbkUsSUFBSSxpQ0FBaUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoSixJQUFJLHdCQUF3QixHQUFHLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pILHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLDZCQUE2QixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQTtJQUVPLGFBQWEsR0FBRyxDQUFDLFFBQXVCLEVBQUUsRUFBRTtRQUNsRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLHVDQUF1QztZQUN6QyxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQyxDQUFBO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7SUFFRCxVQUFVLEdBQUcsQ0FBQyxjQUFpQyxFQUFFLEVBQUUsRUFBRTtRQUNuRCxJQUFJLFdBQVcsQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDeEQsQ0FBQyxDQUFBO0lBRUQsWUFBWSxHQUFHLEdBQXNCLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUMsQ0FBQTtJQUVELFdBQVcsR0FBRyxHQUFHLEVBQUU7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQTtJQUVELElBQUksR0FBRyxDQUNMLFdBQWlDLElBQUksRUFDckMsa0JBQTJCLEtBQUssRUFBRSxFQUFFO1FBQ3BDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNqRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPO2FBQ1I7WUFDRCxJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwRSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFGLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDeEQ7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQTtJQUVELHVCQUF1QixHQUFHLEdBQUcsRUFBRTtRQUM3QixPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDakUsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQTtJQUVELE1BQU0sR0FBRyxHQUFTLEVBQUU7UUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1lBQzVKLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDMUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQTtJQUVELG1CQUFtQixHQUFHLEdBQVMsRUFBRTtRQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQTtJQUVELE1BQU0sR0FBRyxDQUNQLFFBQXVCLEVBQ3ZCLFVBQWtCLEVBQ2xCLFlBQWtDLFNBQVMsRUFBRSxFQUFFO1FBQy9DLElBQUksV0FBVyxHQUFrQixFQUFFLENBQUM7UUFDcEMsSUFBSSxnQkFBZ0IsR0FBa0IsRUFBRSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFcEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDdEYsT0FBTztTQUNSO1FBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7Z0JBQ3RGLE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtZQUMzRyxJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTt3QkFDckMsTUFBTSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUM5QyxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLFNBQVM7d0JBQUUsU0FBUyxFQUFFLENBQUM7b0JBQzNCLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSTtvQkFDRixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQ3RDO2dCQUFDLE9BQU8sU0FBYyxFQUFFO29CQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzdDLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDOUIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztvQkFDN0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO29CQUNwRixJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUU7d0JBQzFCLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7cUJBQ2xDO29CQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDckUsSUFBSSxTQUFTO3dCQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUE7dUdBcFJVLGNBQWM7MkdBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlBY3Rpb24sIEVudGl0eUNoYW5nZWRFdmVudEFyZ3MsIEVudGl0eVN0YXRlLCBFbnRpdHlUeXBlLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBUcnVCcmVlemVDb250ZXh0RmFjdG9yeSwgVHJ1QnJlZXplQ29udGV4dCB9IGZyb20gJy4vdHJ1LWJyZWV6ZS1jb250ZXh0LWZhY3RvcnknO1xyXG5pbXBvcnQgeyBUcnVFbnRpdHlBY2Nlc3NvciB9IGZyb20gJy4vdHJ1LWVudGl0eS1hY2Nlc3Nvcic7XHJcbmltcG9ydCB7IFRydVVpTm90aWZpY2F0aW9uIH0gZnJvbSAnLi90cnUtdWktbm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgVHJ1QXBwRW52aXJvbm1lbnQgfSBmcm9tICcuL3RydS1hcHAtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRydURhdGFDaGFuZ2UgfSBmcm9tICcuLi9jbGFzc2VzL3RydS1kYXRhLWNoYW5nZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUcnVEYXRhQ29udGV4dCB7XHJcbiAgcHJpdmF0ZSBfcHJvcGVydHlDaGFuZ2VkJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHByaXZhdGUgX2RhdGFDaGFuZ2VkJDogU3ViamVjdDxUcnVEYXRhQ2hhbmdlPiA9IG5ldyBTdWJqZWN0PFRydURhdGFDaGFuZ2U+KCk7XHJcblxyXG4gIHByaXZhdGUgX2JyZWV6ZUNvbnRleHQ6IFRydUJyZWV6ZUNvbnRleHQ7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0RlbGV0ZUVudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllczogQXJyYXk8RW50aXR5PiA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYnJlZXplQ29udGV4dEZhY3Rvcnk6IFRydUJyZWV6ZUNvbnRleHRGYWN0b3J5LFxyXG4gICAgcHJpdmF0ZSBhcHBFbnZpcm9ubWVudDogVHJ1QXBwRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIGVudGl0eUFjY2Vzc29yOiBUcnVFbnRpdHlBY2Nlc3NvcixcclxuICAgIHByaXZhdGUgdWlOb3RpZmljYXRpb246IFRydVVpTm90aWZpY2F0aW9uXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9icmVlemVDb250ZXh0ID0gdGhpcy5icmVlemVDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KCk7XHJcbiAgICB0aGlzLmVudGl0eUFjY2Vzc29yLmNvbnRleHQgPSB0aGlzO1xyXG5cclxuICAgIHRoaXMuZW50aXR5TWFuYWdlci5lbnRpdHlDaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlQXJnczogRW50aXR5Q2hhbmdlZEV2ZW50QXJncykgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlQXJncy5lbnRpdHlBY3Rpb24gPT09IEVudGl0eUFjdGlvbi5Qcm9wZXJ0eUNoYW5nZSB8fFxyXG4gICAgICAgIGNoYW5nZUFyZ3MuZW50aXR5QWN0aW9uID09PSBFbnRpdHlBY3Rpb24uUmVqZWN0Q2hhbmdlcyB8fFxyXG4gICAgICAgIGNoYW5nZUFyZ3MuZW50aXR5QWN0aW9uID09PSBFbnRpdHlBY3Rpb24uQXR0YWNoIHx8XHJcbiAgICAgICAgY2hhbmdlQXJncy5lbnRpdHlBY3Rpb24gPT09IEVudGl0eUFjdGlvbi5EZXRhY2gpXHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQoY2hhbmdlQXJncyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUHJvcGVydHlDaGFuZ2VkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5Q2hhbmdlZCQ7XHJcbiAgfVxyXG5cclxuICBwcm9wZXJ0eUNoYW5nZWQoY2hhbmdlQXJnczogRW50aXR5Q2hhbmdlZEV2ZW50QXJncyB8IG51bGwpIHtcclxuICAgIHRoaXMuX3Byb3BlcnR5Q2hhbmdlZCQubmV4dChjaGFuZ2VBcmdzKTtcclxuICB9XHJcblxyXG4gIG9uRGF0YUNoYW5nZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YUNoYW5nZWQkO1xyXG4gIH1cclxuXHJcbiAgZGF0YUNoYW5nZWQoY2hhbmdlOiBUcnVEYXRhQ2hhbmdlKSB7XHJcbiAgICB0aGlzLl9kYXRhQ2hhbmdlZCQubmV4dChjaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGlvbkNoYW5nZURldGVjdGlvbiA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xyXG4gICAgdGhpcy5lbnRpdHlNYW5hZ2VyLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkLnN1YnNjcmliZShlbnRpdGllcyA9PiB7XHJcbiAgICAgIG9ic2VydmVyLm5leHQoZW50aXRpZXMpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGdldFZhbGlkYXRpb25FcnJvcnMgPSAoZW50aXRpZXM6IEFycmF5PEVudGl0eT4gfCBudWxsID0gbnVsbCk6IGFueSA9PiB7XHJcbiAgICBlbnRpdGllcyA9IGVudGl0aWVzIHx8IHRoaXMuZW50aXR5TWFuYWdlci5nZXRDaGFuZ2VzKCk7XHJcbiAgICB2YXIgZXJyb3JzUGVyRW50aXR5ID0gZW50aXRpZXMhLm1hcCgoZW50aXR5KTogVmFsaWRhdGlvbkVycm9yW10gPT4ge1xyXG4gICAgICB2YXIgZXJyb3JzID0gZW50aXR5LmVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzKCk7XHJcbiAgICAgIGVycm9ycyA9IGVycm9ycy5tYXAoKGVycjogYW55KTogYW55ID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZW50aXR5OiBlbnRpdHksXHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5lcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICBwcm9wZXJ0eTogZXJyLnByb3BlcnR5XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGVycm9yc1BlckVudGl0eTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VmFsaWRhdGlvbkVycm9ycyA9IChlbnRpdGllczogQXJyYXk8RW50aXR5PiB8IG51bGwgPSBudWxsKTogQXJyYXk8c3RyaW5nW10+ID0+IHtcclxuICAgIGxldCBlbnRpdGllc1dpdGhFcnJvcnMgPSB0aGlzLmdldFZhbGlkYXRpb25FcnJvcnMoZW50aXRpZXMpO1xyXG4gICAgbGV0IGZvcm1hdHRlZEVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmdbXT4oKTtcclxuICAgIGVudGl0aWVzV2l0aEVycm9ycy5mb3JFYWNoKChlbnRpdHlXaXRoRXJyb3JzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGVudGl0eVdpdGhFcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9ybWF0dGVkRXJyb3JzLnB1c2goZW50aXR5V2l0aEVycm9ycy5tYXAoKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlLmVudGl0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUgKyAnLicgKyBlLnByb3BlcnR5TmFtZSArICc6ICcgKyBlLmVycm9yTWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciBtZXJnZURhdGEgPSBKU09OLnBhcnNlKGUuZW50aXR5Lk1lcmdlX0RhdGEpO1xyXG4gICAgICAgICAgaWYgKG1lcmdlRGF0YSAmJlxyXG4gICAgICAgICAgICBtZXJnZURhdGEuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJlxyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhtZXJnZURhdGEpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgbWVyZ2VEYXRhW2UucHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlRGF0YVtlLnByb3BlcnR5Lm5hbWVdLm1vZGlmaWVkQnkgKyAnIGNoYW5nZWQgJyArIGUucHJvcGVydHkubmFtZSArICcgdG8gJyArIG1lcmdlRGF0YVtlLnByb3BlcnR5Lm5hbWVdLnZhbHVlICsgJy4gQWNjZXB0IG9yIERlY2xpbmUgdGhlIGNoYW5nZS4gJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGUucHJvcGVydHkubmFtZSA/IGUucHJvcGVydHkubmFtZSA6ICdbVW5rbm93biBQcm9wZXJ0eV0nO1xyXG4gICAgICAgICAgcmV0dXJuIGUuZW50aXR5LmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSArICcuJyArIHByb3BlcnR5TmFtZSArICc6IGhhcyBpbnZhbGlkIGRhdGEuJ1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdHRlZEVycm9ycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZENhY2hlZENhc2NhZGVEZWxldGVEZXNjZW5kYW50cyA9IChlbnRpdHk6IEVudGl0eSk6IEFycmF5PEVudGl0eT4gPT4ge1xyXG4gICAgbGV0IGRlc2NlbmRhbnRzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgICB0eXBlIGtleU9mRW50aXR5ID0ga2V5b2YgdHlwZW9mIGVudGl0eTtcclxuICAgIGxldCB0eXBlID0gZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgICBsZXQgdHlwZU5hbWUgPSB0eXBlLmRlZmF1bHRSZXNvdXJjZU5hbWU7XHJcbiAgICBsZXQgZW50aXR5Q2hpbGRyZW5OYW1lczogYW55ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgnUmVwbGFjZSB3aXRoOiBNb2RlbE5hdmlnYXRpb25Qcm9wZXJ0aWVzLnZhbHVlJykpW3R5cGVOYW1lXTtcclxuICAgIE9iamVjdC5lbnRyaWVzKGVudGl0eUNoaWxkcmVuTmFtZXMpXHJcbiAgICAgIC5mb3JFYWNoKChbaywgdl06IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBwcm9wZXJ0eSA9IGVudGl0eVtrIGFzIGtleU9mRW50aXR5XSBhcyBhbnk7XHJcbiAgICAgICAgcHJvcGVydHkuZm9yRWFjaCgoY2hpbGQ6IEVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2LmRvZXNDYXNjYWRlRGVsZXRlICYmIGNoaWxkLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZSAhPT0gRW50aXR5U3RhdGUuQWRkZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWxldGUgb2Ygc2VsZWN0ZWQgaXRlbSBpcyBub3QgcG9zc2libGUgZHVlIHRvIHJlbGF0ZWQgY2hpbGQgdGhhdCBpcyBub3Qgc2V0dXAgZm9yIGNhc2NhZGUgZGVsZXRlLiAgRGVsZXRlIGNoaWxkcmVuIGl0ZW1zIGZpcnN0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGVzY2VuZGFudHMgPSBkZXNjZW5kYW50cy5jb25jYXQodGhpcy5maW5kQ2FjaGVkQ2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzKGNoaWxkKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGVzY2VuZGFudHMgPSBwcm9wZXJ0eS5jb25jYXQoZGVzY2VuZGFudHMpO1xyXG4gICAgICB9KTtcclxuICAgIHJldHVybiBkZXNjZW5kYW50cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFya0NhY2hlZERlc2NlbmRhbnRzRm9yRGVsZXRlID0gKGVudGl0aWVzOiBBcnJheTxFbnRpdHk+KSA9PiB7XHJcbiAgICB2YXIgY2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzUGVyRW50aXR5ID0gZW50aXRpZXMubWFwKChlbnRpdHk6IEVudGl0eSkgPT4geyByZXR1cm4gdGhpcy5maW5kQ2FjaGVkQ2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzKGVudGl0eSk7IH0sIGVudGl0aWVzKTtcclxuICAgIHZhciBjYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMgPSBjYXNjYWRlRGVsZXRlRGVzY2VuZGFudHNQZXJFbnRpdHkucmVkdWNlKChtZW1vLCBpKSA9PiB7IHJldHVybiBtZW1vLmNvbmNhdChpKTsgfSk7XHJcbiAgICBjYXNjYWRlRGVsZXRlRGVzY2VuZGFudHMuZm9yRWFjaCgoZW50aXR5OiBFbnRpdHkpID0+IHsgdGhpcy5lbnRpdHlNYW5hZ2VyLmRldGFjaEVudGl0eShlbnRpdHkpOyB9KTtcclxuICAgIHRoaXMuX3BlbmRpbmdEZWxldGVFbnRpdGllcyA9IHRoaXMuX3BlbmRpbmdEZWxldGVFbnRpdGllcy5jb25jYXQoZW50aXRpZXMpO1xyXG4gICAgbGV0IGNvbWJpbmVkID0gdGhpcy5fcGVuZGluZ0Nhc2NhZGVEZWxldGVFbnRpdGllcy5jb25jYXQoY2FzY2FkZURlbGV0ZURlc2NlbmRhbnRzKTtcclxuICAgIHRoaXMuX3BlbmRpbmdDYXNjYWRlRGVsZXRlRW50aXRpZXMgPSBjb21iaW5lZC5maWx0ZXIoKG4sIGkpID0+IGNvbWJpbmVkLmluZGV4T2YobikgPT09IGkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXJrRm9yRGVsZXRlID0gKGVudGl0aWVzOiBBcnJheTxFbnRpdHk+KSA9PiB7XHJcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLm1hcmtDYWNoZWREZXNjZW5kYW50c0ZvckRlbGV0ZShlbnRpdGllcyk7XHJcbiAgICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRW50aXR5KSA9PiB7XHJcbiAgICAgICAgZW50aXR5LmVudGl0eUFzcGVjdC5zZXREZWxldGVkKCk7XHJcbiAgICAgICAgLy9lbnRpdHkuX2Fzc29jaWF0ZWREYXRhQ2FjaGVkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGJyZWV6ZUNvbnRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnJlZXplQ29udGV4dDtcclxuICB9XHJcblxyXG4gIGdldCBlbnRpdHlNYW5hZ2VyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JyZWV6ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICB9XHJcblxyXG4gIGhhc0NoYW5nZXMgPSAoZW50aXR5VHlwZXM6IEFycmF5PEVudGl0eVR5cGU+ID0gW10pID0+IHtcclxuICAgIGlmIChlbnRpdHlUeXBlcy5sZW5ndGgpXHJcbiAgICAgIHJldHVybiB0aGlzLl9icmVlemVDb250ZXh0LmVudGl0eU1hbmFnZXIuZ2V0Q2hhbmdlcyhlbnRpdHlUeXBlcyk7XHJcbiAgICByZXR1cm4gdGhpcy5fYnJlZXplQ29udGV4dC5lbnRpdHlNYW5hZ2VyLmdldENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGVudGl0eUFjY2VzcyA9ICgpOiBUcnVFbnRpdHlBY2Nlc3NvciA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlBY2Nlc3NvcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydENhaGNlID0gKCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5fYnJlZXplQ29udGV4dC5lbnRpdHlNYW5hZ2VyLmV4cG9ydEVudGl0aWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZSA9IChcclxuICAgIGVudGl0aWVzOiBBcnJheTxFbnRpdHk+IHwgbnVsbCA9IG51bGwsXHJcbiAgICBkZWxldGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHRoaXMuYXBwRW52aXJvbm1lbnQuaXNTYXZpbmcpIHtcclxuICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLmVycm9yKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnU2F2ZUluUHJvZ3Jlc3MpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHZhbGlkYXRpb25FcnJvck1lc3NhZ2VzID0gdGhpcy5mb3JtYXRWYWxpZGF0aW9uRXJyb3JzKGVudGl0aWVzKTtcclxuICAgICAgaWYgKHZhbGlkYXRpb25FcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLmVycm9yKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnSW52YWxpZERhdGEsIHZhbGlkYXRpb25FcnJvck1lc3NhZ2VzWzBdKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcygpLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24ud2FybmluZyh0aGlzLmFwcEVudmlyb25tZW50Lm1zZ05vQ2hhbmdlc1RvU2F2ZSk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkZWxldGVPcGVyYXRpb24pIHtcclxuICAgICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24uc3VjY2Vzcyh0aGlzLmFwcEVudmlyb25tZW50Lm1zZ1NhdmVTdWNjZXNzZnVsKTtcclxuICAgICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuc2F2ZUNvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS5jYXRjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5zYXZlQ29tcGxldGUoeyBzdWNjZXNzZnVsOiBmYWxzZSB9KTtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChudWxsKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVXaXRob3V0Tm90aWZpY2F0aW9uID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHsgXHJcbiAgICAgIGlmICh0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLmVycm9yKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnU2F2ZUluUHJvZ3Jlc3MpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXBwRW52aXJvbm1lbnQuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXMoKS50aGVuKCgpID0+IHsgXHJcbiAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5zYXZlQ29tcGxldGUoeyBzdWNjZXNzZnVsOiB0cnVlIH0pO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSkuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5zYXZlQ29tcGxldGUoeyBzdWNjZXNzZnVsOiBmYWxzZSB9KTtcclxuICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChudWxsKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldmVydCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMudWlOb3RpZmljYXRpb24uY29uZmlybSgnQ29uZmlybSBBY3Rpb24nLCAnUmV2ZXJ0ICcgKyB0aGlzLmhhc0NoYW5nZXMoKS5sZW5ndGggKyAnIGNoYW5nZWQgcmVjb3JkKHMpJywgdHJ1ZSwgdHJ1ZSwgXCJOb1wiLCBcIlllc1wiKS50aGVuKChjb25maXJtOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmIChjb25maXJtKSB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHlNYW5hZ2VyLnJlamVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmFwcEVudmlyb25tZW50LnJldmVydENvbXBsZXRlKHsgc3VjY2Vzc2Z1bDogdHJ1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXZlcnRXaXRob3V0UHJvbXB0ID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy5yZXZlcnQoKTtcclxuICAgIHRoaXMuYXBwRW52aXJvbm1lbnQucmV2ZXJ0Q29tcGxldGUoeyBzdWNjZXNzZnVsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlID0gKFxyXG4gICAgZW50aXRpZXM6IEFycmF5PEVudGl0eT4sXHJcbiAgICBjb25maXJtTXNnOiBzdHJpbmcsXHJcbiAgICBvblN1Y2Nlc3M6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSA9PiB7XHJcbiAgICB2YXIgbmV3RW50aXRpZXM6IEFycmF5PEVudGl0eT4gPSBbXTtcclxuICAgIHZhciBleGlzdGluZ0VudGl0aWVzOiBBcnJheTxFbnRpdHk+ID0gW107XHJcbiAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmIChlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0FkZGVkKCkpXHJcbiAgICAgICAgbmV3RW50aXRpZXMucHVzaChlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGV4aXN0aW5nRW50aXRpZXMucHVzaChlKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAmJiBleGlzdGluZ0VudGl0aWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVpTm90aWZpY2F0aW9uLndhcm5pbmcodGhpcy5hcHBFbnZpcm9ubWVudC5tc2dDYW5ub3REZWxldGVOZXdBbmRFeGlzdGluZ1JlY29yZHMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZXhpc3RpbmdFbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlcygpLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudWlOb3RpZmljYXRpb24ud2FybmluZyh0aGlzLmFwcEVudmlyb25tZW50Lm1zZ0RpcnR5UHJldmVudHNEZWxldGVFeGlzdGluZ1JlY29yZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51aU5vdGlmaWNhdGlvbi5jb25maXJtKCdDb25maXJtIEFjdGlvbicsIGNvbmZpcm1Nc2csIHRydWUsIHRydWUsIFwiTm9cIiwgXCJZZXNcIikudGhlbigoY29uZmlybTogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoY29uZmlybSkge1xyXG4gICAgICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgICAgIG5ld0VudGl0aWVzLmZvckVhY2goKGVudGl0eTogRW50aXR5KSA9PiB7XHJcbiAgICAgICAgICAgIGVudGl0eS5lbnRpdHlBc3BlY3QuY2xlYXJWYWxpZGF0aW9uRXJyb3JzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMubWFya0ZvckRlbGV0ZShuZXdFbnRpdGllcyk7XHJcbiAgICAgICAgICBpZiAob25TdWNjZXNzKSBvblN1Y2Nlc3MoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMubWFya0ZvckRlbGV0ZShleGlzdGluZ0VudGl0aWVzKTtcclxuICAgICAgICB9IGNhdGNoIChleGNlcHRpb246IGFueSkge1xyXG4gICAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5lcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2F2ZShudWxsLCB0cnVlKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHZhciBlbnRpdGllc0RlbGV0ZWQgPSB0aGlzLl9wZW5kaW5nRGVsZXRlRW50aXRpZXMuY29uY2F0KHRoaXMuX3BlbmRpbmdDYXNjYWRlRGVsZXRlRW50aXRpZXMpO1xyXG4gICAgICAgICAgdGhpcy5hcHBFbnZpcm9ubWVudC5kZWxldGVDb21wbGV0ZSh7IHN1Y2Nlc3NmdWw6IHRydWUsIGVudGl0aWVzOiBlbnRpdGllc0RlbGV0ZWQgfSk7XHJcbiAgICAgICAgICBpZiAoZW50aXRpZXNEZWxldGVkLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ2FzY2FkZURlbGV0ZUVudGl0aWVzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdEZWxldGVFbnRpdGllcyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51aU5vdGlmaWNhdGlvbi5zdWNjZXNzKHRoaXMuYXBwRW52aXJvbm1lbnQubXNnRGVsZXRlU3VjY2Vzc2Z1bCk7XHJcbiAgICAgICAgICBpZiAob25TdWNjZXNzKSBvblN1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJldmVydCgpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4geyB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==