@huntsman-cancer-institute/dictionary-editor 17.3.3 → 17.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import { Component, Inject, isDevMode, HostBinding } from "@angular/core";
2
2
  import { ActivatedRoute } from "@angular/router";
3
- import { BehaviorSubject } from "rxjs";
4
- import { finalize, map } from "rxjs/operators";
3
+ import { BehaviorSubject, Subject } from 'rxjs';
4
+ import { map, takeUntil } from 'rxjs/operators';
5
5
  import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
6
- import { DictionaryService, DICTIONARY_ENDPOINT } from "@huntsman-cancer-institute/dictionary-service";
6
+ import { DICTIONARY_ENDPOINT, DictionaryService } from '@huntsman-cancer-institute/dictionary-service';
7
7
  import { SelectRenderer } from "../grid-renderers/select.renderer";
8
8
  import { SelectEditor } from "../grid-editors/select.editor";
9
9
  import { NewRowComponent } from "./new-row.component";
@@ -26,15 +26,19 @@ import * as i5 from "ag-grid-angular";
26
26
  * @since 1.0.0
27
27
  */
28
28
  export class DictionaryEditorDetailComponent {
29
- constructor(route, modalService, dictionaryService, dictionaryEndpoint) {
29
+ constructor(route, modalService, dictionaryService, DictionaryEndpoint) {
30
30
  this.route = route;
31
31
  this.modalService = modalService;
32
32
  this.dictionaryService = dictionaryService;
33
- this.dictionaryEndpoint = dictionaryEndpoint;
33
+ this.DictionaryEndpoint = DictionaryEndpoint;
34
34
  this.classList = "outlet-column y-auto";
35
35
  this.dictionaryEntries = [];
36
36
  this.selectedRows = [];
37
37
  this.loadingSubjects = [];
38
+ this.halfLoaded = false;
39
+ this.processingCall = false;
40
+ this.callQueued = false;
41
+ this.destroy = new Subject();
38
42
  this.metaGridOptions = {
39
43
  rowStyle: {
40
44
  "font-family": "Prompt, sans-serif"
@@ -62,11 +66,20 @@ export class DictionaryEditorDetailComponent {
62
66
  ngOnInit() {
63
67
  this.boundNewRowPostCall = this.newRowPost.bind(this);
64
68
  this.loadingSubjects.push(new BehaviorSubject(false));
65
- this.loadingSubjects.push(new BehaviorSubject(false));
66
69
  this.route.params.subscribe(params => {
67
70
  let className = params["className"];
68
71
  this.getDictionary(className);
69
72
  });
73
+ this.loadingSubjects[0].subscribe((value) => {
74
+ if (value === true) {
75
+ // A new call was made to be processed, process the call
76
+ this.getDictionaryBegin(this.className);
77
+ }
78
+ else {
79
+ // A call completed while another call was not queued, processing complete
80
+ this.processingCall = false;
81
+ }
82
+ });
70
83
  }
71
84
  openModal(modal) {
72
85
  this.modalService.open(modal, { windowClass: "modal-xl" }).result.then((result) => {
@@ -101,7 +114,6 @@ export class DictionaryEditorDetailComponent {
101
114
  this.gridApiMeta = params.api;
102
115
  this.gridApiMeta.setColumnDefs(this.columnDefMeta());
103
116
  this.gridApiMeta.setRowData(this.dictionary?.fields);
104
- // this.gridApiMeta.sizeColumnsToFit();
105
117
  }
106
118
  openAreYouSureModal(modal) {
107
119
  this.modalService.open(modal).result.then((result) => {
@@ -112,37 +124,59 @@ export class DictionaryEditorDetailComponent {
112
124
  });
113
125
  }
114
126
  /**
115
- * Fetch the dictionary metadata and dictionary entries based upon the dictionary class name.
127
+ * Determine if we are loading something, and then wait until it is done to .
116
128
  *
117
129
  * @param {string} className
118
130
  */
119
131
  getDictionary(className) {
132
+ this.className = className;
133
+ if (this.processingCall === false) {
134
+ // Call is not being processed, process this call
135
+ this.processingCall = true;
136
+ this.loadingSubjects[0].next(true);
137
+ }
138
+ else {
139
+ // A call is already being processed, queue a recall when it is complete
140
+ this.callQueued = true;
141
+ }
142
+ }
143
+ /**
144
+ * Fetch the dictionary metadata and dictionary entries based upon the dictionary class name.
145
+ *
146
+ * @param {string} className
147
+ */
148
+ getDictionaryBegin(className) {
149
+ this.halfLoaded = false;
120
150
  // When Selecting A New Dictionary, Navigate To First Page
121
151
  if (this.gridOptions && this.gridOptions.api) {
122
152
  this.gridOptions.api.paginationGoToFirstPage();
123
153
  }
124
- this.className = className;
125
154
  this.dataColumns = undefined;
126
- this.loadingSubjects[0].next(true);
127
- this.dictionaryService.getDictionary(className)
128
- .pipe(finalize(() => {
129
- this.loadingSubjects[0].next(false);
130
- })).subscribe((dictionary) => {
155
+ this.destroy.next();
156
+ this.destroy.complete();
157
+ this.dictionaryService.getDictionary(className).pipe(takeUntil(this.destroy)).subscribe((dictionary) => {
131
158
  this.setUpDictionaryGrid(dictionary);
132
- this.loadingSubjects[0].next(false);
133
159
  });
134
160
  this.getDictionaryEntries();
135
161
  }
136
162
  getDictionaryEntries() {
137
- this.loadingSubjects[1].next(true);
138
- this.dictionaryService.getDictionaryEntries(this.className)
139
- .pipe(finalize(() => {
140
- this.loadingSubjects[1].next(false);
141
- })).subscribe((dictionaryEntries) => {
163
+ this.dictionaryService.getDictionaryEntries(this.className).pipe(takeUntil(this.destroy)).subscribe((dictionaryEntries) => {
142
164
  this.dictionaryEntries = dictionaryEntries;
143
165
  this.gridOptions.api.setRowData(dictionaryEntries);
144
166
  this.gridOptions.api.sizeColumnsToFit();
145
- this.loadingSubjects[1].next(false);
167
+ if (this.halfLoaded) {
168
+ if (this.callQueued === true) {
169
+ // A call completed while another call was queued so make that call now
170
+ this.callQueued = false;
171
+ this.getDictionaryBegin(this.className);
172
+ }
173
+ else {
174
+ this.loadingSubjects[0].next(false);
175
+ }
176
+ }
177
+ else {
178
+ this.halfLoaded = true;
179
+ }
146
180
  });
147
181
  }
148
182
  /**
@@ -172,7 +206,7 @@ export class DictionaryEditorDetailComponent {
172
206
  }
173
207
  else {
174
208
  let dictionaryName = dictionaryNames.pop();
175
- this.dictionaryService.getDictionaryDropdownEntries(dictionaryName).subscribe((response) => {
209
+ this.dictionaryService.getDictionaryDropdownEntries(dictionaryName).pipe(takeUntil(this.destroy)).subscribe((response) => {
176
210
  this.secondaryDictionaryEntries.push({ dictionaryName: dictionaryName, entries: response });
177
211
  this.getSecondaryDictionaries(dictionaryNames);
178
212
  });
@@ -443,6 +477,19 @@ export class DictionaryEditorDetailComponent {
443
477
  this.gridOptions.api.setColumnDefs(this.dataColumns);
444
478
  this.gridOptions.api.sizeColumnsToFit();
445
479
  }
480
+ if (this.halfLoaded) {
481
+ if (this.callQueued === true) {
482
+ // A call completed while another call was queued so make that call now
483
+ this.callQueued = false;
484
+ this.getDictionaryBegin(this.className);
485
+ }
486
+ else {
487
+ this.loadingSubjects[0].next(false);
488
+ }
489
+ }
490
+ else {
491
+ this.halfLoaded = true;
492
+ }
446
493
  }
447
494
  isEditable(params) {
448
495
  let isEditable;
@@ -578,8 +625,7 @@ export class DictionaryEditorDetailComponent {
578
625
  }
579
626
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DictionaryEditorDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.NgbModal }, { token: i3.DictionaryService }, { token: DICTIONARY_ENDPOINT }], target: i0.ɵɵFactoryTarget.Component }); }
580
627
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DictionaryEditorDetailComponent, selector: "hci-dictionary-editor-detail", host: { properties: { "class": "this.classList" } }, ngImport: i0, template: `
581
- <div class="d-flex flex-column hci-dictionary-detail-body"
582
- >
628
+ <div class="d-flex flex-column hci-dictionary-detail-body">
583
629
  <hci-busy [busySubjects]="loadingSubjects"></hci-busy>
584
630
 
585
631
  <!-- Dictionary Title And Metadata -->
@@ -600,7 +646,7 @@ export class DictionaryEditorDetailComponent {
600
646
  (click)="openAreYouSureModal(areYouSureModal)">
601
647
  <i class="fas fa-minus"></i>
602
648
  </button>
603
- <button style="color: var(--bluewarm-dark); float: right; font-size: 15px;"
649
+ <button style="color: var(--bluewarm-darkest); float: right; font-size: 15px;"
604
650
  [disabled]="disableAddRow"
605
651
  (click)="onClickAddRow()">
606
652
  <i class="fas fa-plus"></i>
@@ -611,15 +657,14 @@ export class DictionaryEditorDetailComponent {
611
657
  <div class="d-flex flex-column flex-grow-1">
612
658
  <ag-grid-angular id="dictionary-grid-display"
613
659
  #dataGrid
614
- class="ag-theme-balham full-height full-width hci-dictoinary-display-grid"
660
+ class="ag-theme-balham full-height full-width hci-dictionary-display-grid"
615
661
  [rowData]="dictionaryEntries"
616
662
  [rowSelection]="'multiple'"
617
663
  [singleClickEdit]="'true'"
618
664
  [pagination]="'true'"
619
665
  [paginationAutoPageSize]="'true'"
620
666
  [gridOptions]="gridOptions"
621
- (cellValueChanged)="updateDictionary($event)"
622
- >
667
+ (cellValueChanged)="updateDictionary($event)">
623
668
  </ag-grid-angular>
624
669
  </div>
625
670
 
@@ -661,13 +706,12 @@ export class DictionaryEditorDetailComponent {
661
706
  </div>
662
707
  </ng-template>
663
708
  </div>
664
- `, isInline: true, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-not-inline-editing{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-inline-editing{color:var(--black-darkest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"], dependencies: [{ kind: "component", type: i4.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }, { kind: "component", type: i5.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }] }); }
709
+ `, isInline: true, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-darkest)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-darkest)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictionary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:var(--grey-darkest)!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-not-inline-editing{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-inline-editing{color:var(--black-darkest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darkest)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"], dependencies: [{ kind: "component", type: i4.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }, { kind: "component", type: i5.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }] }); }
665
710
  }
666
711
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DictionaryEditorDetailComponent, decorators: [{
667
712
  type: Component,
668
713
  args: [{ selector: "hci-dictionary-editor-detail", template: `
669
- <div class="d-flex flex-column hci-dictionary-detail-body"
670
- >
714
+ <div class="d-flex flex-column hci-dictionary-detail-body">
671
715
  <hci-busy [busySubjects]="loadingSubjects"></hci-busy>
672
716
 
673
717
  <!-- Dictionary Title And Metadata -->
@@ -688,7 +732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
688
732
  (click)="openAreYouSureModal(areYouSureModal)">
689
733
  <i class="fas fa-minus"></i>
690
734
  </button>
691
- <button style="color: var(--bluewarm-dark); float: right; font-size: 15px;"
735
+ <button style="color: var(--bluewarm-darkest); float: right; font-size: 15px;"
692
736
  [disabled]="disableAddRow"
693
737
  (click)="onClickAddRow()">
694
738
  <i class="fas fa-plus"></i>
@@ -699,15 +743,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
699
743
  <div class="d-flex flex-column flex-grow-1">
700
744
  <ag-grid-angular id="dictionary-grid-display"
701
745
  #dataGrid
702
- class="ag-theme-balham full-height full-width hci-dictoinary-display-grid"
746
+ class="ag-theme-balham full-height full-width hci-dictionary-display-grid"
703
747
  [rowData]="dictionaryEntries"
704
748
  [rowSelection]="'multiple'"
705
749
  [singleClickEdit]="'true'"
706
750
  [pagination]="'true'"
707
751
  [paginationAutoPageSize]="'true'"
708
752
  [gridOptions]="gridOptions"
709
- (cellValueChanged)="updateDictionary($event)"
710
- >
753
+ (cellValueChanged)="updateDictionary($event)">
711
754
  </ag-grid-angular>
712
755
  </div>
713
756
 
@@ -749,7 +792,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
749
792
  </div>
750
793
  </ng-template>
751
794
  </div>
752
- `, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-not-inline-editing{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-inline-editing{color:var(--black-darkest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"] }]
795
+ `, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-darkest)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-darkest)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictionary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:var(--grey-darkest)!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-not-inline-editing{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected .ag-cell-inline-editing{color:var(--black-darkest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darkest)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"] }]
753
796
  }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.NgbModal }, { type: i3.DictionaryService }, { type: undefined, decorators: [{
754
797
  type: Inject,
755
798
  args: [DICTIONARY_ENDPOINT]
@@ -770,4 +813,4 @@ function monthToComparableNumber(date) {
770
813
  let dayNumber = date.substring(8, 10);
771
814
  return yearNumber * 10000 + monthNumber * 100 + dayNumber;
772
815
  }
773
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9jb21wb25lbnRzL2RldGFpbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFhLFdBQVcsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLEVBQWMsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQVFyRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7O0FBRWpHOzs7Ozs7OztHQVFHO0FBd01ILE1BQU0sT0FBTywrQkFBK0I7SUE4QjFDLFlBQ1UsS0FBcUIsRUFDckIsWUFBc0IsRUFDdEIsaUJBQW9DLEVBQ1Asa0JBQTBCO1FBSHZELFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLHNC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RUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDekcsRUFBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDbkksRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDM0YsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztZQUN0RyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO1lBQzlGLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDOUYsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDN0YsRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFB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RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxPQUFPLFVBQVUsR0FBRyxLQUFLLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIGlzRGV2TW9kZSwgVmlld0NoaWxkLCBIb3N0QmluZGluZywgVGVtcGxhdGVSZWZ9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2ZpbmFsaXplLCBtYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge05nYk1vZGFsLCBOZ2JNb2RhbFJlZn0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcblxyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlLCBESUNUSU9OQVJZX0VORFBPSU5UfSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvZGljdGlvbmFyeS1zZXJ2aWNlXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbHVtbkFwaSxcclxuICBHcmlkT3B0aW9ucyxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBHcmlkQXBpXHJcbn0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcbmltcG9ydCB7U2VsZWN0UmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9zZWxlY3QucmVuZGVyZXJcIjtcclxuaW1wb3J0IHtTZWxlY3RFZGl0b3J9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvclwiO1xyXG5pbXBvcnQge05ld1Jvd0NvbXBvbmVudH0gZnJvbSBcIi4vbmV3LXJvdy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHtEYXRlUmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9kYXRlLnJlbmRlcmVyXCI7XHJcbmltcG9ydCB7QWdHcmlkRGF0ZUNlbGxFZGl0b3JDb21wb25lbnR9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvYWctZ3JpZC1kYXRlLWNlbGwtZWRpdG9yLmNvbXBvbmVudFwiO1xyXG5cclxuLyoqXHJcbiAqIFdoZW4gYSBkaWN0aW9uYXJ5IGlzIHNlbGVjdGVkIHRoaXMgY29tcG9uZW50IGlzIHNob3duLiAgVGhlcmUgaXMgYSB0b3AgZ3JpZCB3aGljaCBmb3IgaXRzIGRhdGEgc2hvd3MgYWxsIHRoZSBjb2x1bW5zXHJcbiAqIGZvciB0aGUgZGljdGlvbmFyeS4gQ3VycmVudGx5LCBrZWVwIHRoaXMgZm9yIHJlZmVyZW5jZSBvbmx5IGFuZCBoYXZlIG5vbi1lZGl0YWJsZS5cclxuICogVGhlIGJvdHRvbSBncmlkIHdpbGwgc2hvdyB0aG9zZSBjb2x1bW5zIGFzIGFjdHVhbCBjb2x1bW5zIGFuZCBpdHMgZGF0YSBhcmUgYWxsIHRoZSBkaWN0aW9uYXJ5IHZhbHVlcy4gIFJvd3MgY2FuIGJlXHJcbiAqIGFkZGVkLiAgRm9yIGRlbGV0aW5nLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaWQgaXMgbm90IHVzZWQgYW55d2hlcmUuICBGb3IgZWRpdGluZywgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNvZGUgb3IgYW55dGhpbmdcclxuICogZWxzZSBpc24ndCBiZWluZyByZWZlcmVuY2VkLlxyXG4gKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBDb21wb25lbnQoXHJcbiAge1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLWRpY3Rpb25hcnktZWRpdG9yLWRldGFpbFwiLFxyXG4gICAgdGVtcGxhdGU6XHJcbiAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGhjaS1kaWN0aW9uYXJ5LWRldGFpbC1ib2R5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aGNpLWJ1c3kgW2J1c3lTdWJqZWN0c109XCJsb2FkaW5nU3ViamVjdHNcIj48L2hjaS1idXN5PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBUaXRsZSBBbmQgTWV0YWRhdGEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGljdGlvbmFyeS1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaWN0aW9uYXJ5LXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAge3tkaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtZXRhZGF0YS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTW9kYWwobWV0YURhdGFNb2RhbClcIj5cclxuICAgICAgICAgICAgICBWaWV3IE1ldGEgRGF0YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBFZGl0IEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJkaXNhYmxlRGVsZXRlPyAnZGVhY3RpdmF0ZWQtY29sb3InOiAnYWN0aXZlLWNvbG9yJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQXJlWW91U3VyZU1vZGFsKGFyZVlvdVN1cmVNb2RhbClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmx1ZXdhcm0tZGFyayk7IGZsb2F0OiByaWdodDsgZm9udC1zaXplOiAxNXB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVBZGRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrQWRkUm93KClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBEaXNwbGF5IEdyaWQgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgaWQ9XCJkaWN0aW9uYXJ5LWdyaWQtZGlzcGxheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RhdGFHcmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC1oZWlnaHQgZnVsbC13aWR0aCBoY2ktZGljdG9pbmFyeS1kaXNwbGF5LWdyaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImRpY3Rpb25hcnlFbnRyaWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaW5nbGVDbGlja0VkaXRdPVwiJ3RydWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvbl09XCIndHJ1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uQXV0b1BhZ2VTaXplXT1cIid0cnVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbFZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVEaWN0aW9uYXJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaWN0aW9uYXJ5IE1ldGFkYXRhIFBvcHVwIC0tPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNtZXRhRGF0YU1vZGFsIGxldC1jbG9zZT1cImNsb3NlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDoxMDAwcHhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICBNZXRhIERhdGEgZm9yIHt7Y2xhc3NOYW1lfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIG1vZGFsLWJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjY2VkNGRhOyB3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgI21ldGFHcmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWctdGhlbWUtYmFsaGFtIGZ1bGwtd2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMjUwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uTWV0YUdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cInRoaXMubWV0YUdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93RGF0YV09XCJkaWN0aW9uYXJ5Py5maWVsZHNcIj5cclxuICAgICAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoJ0Nsb3NlJylcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaWN0aW9uYXJ5IERlbGV0ZSBDb21maXJtYXRpb24gUG9wdXAgLS0+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2FyZVlvdVN1cmVNb2RhbCBsZXQtY2xvc2U9XCJjbG9zZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgQ29uZmlybWF0aW9uXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBkLWZsZXhcIj5cclxuICAgICAgICAgICAgICBBcmUgeW91IHN1cmU/XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgnQ2FuY2VsJylcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1yZWRcIiAoY2xpY2spPVwiY2xvc2UoJ0RlbGV0ZScpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYCxcclxuICAgIHN0eWxlczogW1xyXG4gICAgICBgXHJcbiAgICAgICAgLmZ1bGwtaGVpZ2h0IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmFnLXRoZW1lLWJhbGhhbSB7XHJcbiAgICAgICAgICBmb250LWZhbWlseTogXCJQcm9tcHRcIjtcclxuICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuYWN0aXZlLWNvbG9yIHtcclxuICAgICAgICAgIGZsb2F0OiByaWdodDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ibHVld2FybS1kYXJrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kZWFjdGl2YXRlZC1jb2xvciB7XHJcbiAgICAgICAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICAgICAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JleXdhcm0tbWVkbGlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmRpY3Rpb25hcnktaW5mby1zZWN0aW9uIHtcclxuICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmRpY3Rpb25hcnktdGl0bGUge1xyXG4gICAgICAgICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgICAgICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5tZXRhZGF0YS1idXR0b24ge1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLXdoaXRlLWxpZ2h0ZXN0KTtcclxuICAgICAgICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLWhlYWRlci1jZWxsIHtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXN0KTtcclxuICAgICAgICAgIGJvcmRlcjogbGlnaHRncmF5IHNvbGlkIHRoaW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctY2VsbCB7XHJcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLXJvdyB7XHJcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xyXG4gICAgICAgICAgYm9yZGVyLXRvcDogMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctZXZlbiB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS13aGl0ZS1tZWRpdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmhjaS1kaWN0aW9uYXJ5LWRldGFpbC1ib2R5IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDBkZWcsIHZhcigtLXdoaXRlLWxpZ2h0ZXN0KSAzMCUsIHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXIpIDEwMCUpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuaGNpLWRpY3RvaW5hcnktZGlzcGxheS1ncmlkIHtcclxuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcclxuICAgICAgICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjM1KSAwcHggNXB4IDE1cHg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgUm93IEhvdmVyIENTU1xyXG4gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctaG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6ICM2NjYgIWltcG9ydGFudDtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXIpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgQ2VsbCBTZWxlY3RlZCBDU1NcclxuICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LXNlbGVjdGVkIC5hZy1jZWxsIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1saWdodGVzdCkgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctc2VsZWN0ZWQgLmFnLWNlbGwtbm90LWlubGluZS1lZGl0aW5nIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1saWdodGVzdCkgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctc2VsZWN0ZWQgLmFnLWNlbGwtaW5saW5lLWVkaXRpbmcge1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLWJsYWNrLWRhcmtlc3QpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgUm93IFNlbGVjdGVkIENTU1xyXG4gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctc2VsZWN0ZWQge1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLXdoaXRlLWRhcmtlcikgIWltcG9ydGFudDtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWQtbGlnaHRlcikgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgIF1cclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnlFZGl0b3JEZXRhaWxDb21wb25lbnQge1xyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKSBjbGFzc0xpc3Q6IHN0cmluZyA9IFwib3V0bGV0LWNvbHVtbiB5LWF1dG9cIjtcclxuXHJcbiAgcHJpdmF0ZSBzZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllczogYW55O1xyXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lOiBhbnk7XHJcbiAgZGljdGlvbmFyeTogYW55O1xyXG4gIGRpY3Rpb25hcnlFbnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGRhdGFDb2x1bW5zOiBhbnlbXTtcclxuXHJcbiAgaWRDb2x1bW46IHN0cmluZztcclxuICBzZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcbiAgbG9hZGluZ1N1YmplY3RzOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5bXSA9IFtdO1xyXG5cclxuICBib3VuZE5ld1Jvd1Bvc3RDYWxsOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XHJcbiAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xyXG4gIG5ld1Jvd1N1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICBtZXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICByb3dTdHlsZToge1xyXG4gICAgICBcImZvbnQtZmFtaWx5XCI6IFwiUHJvbXB0LCBzYW5zLXNlcmlmXCJcclxuICAgIH0sXHJcbiAgICBlbmFibGVDZWxsVGV4dFNlbGVjdGlvbjogdHJ1ZSxcclxuICAgIGVuc3VyZURvbU9yZGVyOiB0cnVlXHJcbiAgfTtcclxuICBmcmFtZXdvcmtDb21wb25lbnRzOiBhbnk7XHJcbiAgcHVibGljIGdyaWRBcGlNZXRhOiBHcmlkQXBpO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgQEluamVjdChESUNUSU9OQVJZX0VORFBPSU5UKSBwcml2YXRlIGRpY3Rpb25hcnlFbmRwb2ludDogc3RyaW5nXHJcbiAgKSB7XHJcblxyXG4gICAgdGhpcy5ncmlkT3B0aW9ucyA9IDxHcmlkT3B0aW9ucz57XHJcbiAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICBjb21wb25lbnRQYXJlbnQ6IHRoaXNcclxuICAgICAgfSxcclxuICAgICAgb25HcmlkUmVhZHk6IERpY3Rpb25hcnlFZGl0b3JEZXRhaWxDb21wb25lbnQub25TYW1wbGVzR3JpZFJlYWR5LFxyXG4gICAgICBvbkdyaWRTaXplQ2hhbmdlZDogRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5vbkdyaWRTaXplQ2hhbmdlZCxcclxuICAgICAgc3VwcHJlc3NIb3Jpem9udGFsU2Nyb2xsOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uTW9kZTogXCJtdWx0aXBsZVwiLFxyXG4gICAgICBzdG9wRWRpdGluZ1doZW5HcmlkTG9zZXNGb2N1czogdHJ1ZSxcclxuICAgICAgZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuICAgICAgZW5hYmxlRmlsdGVyOiB0cnVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZWQgb24gdGhlIHJvdXRlIGNsYXNzIG5hbWUsIG1ha2UgdGhlIGNhbGwgdG8gZmV0Y2ggdGhlIGRpY3Rpb25hcnkgZGF0YS4gIFNpbmNlIHRoaXMgY29tcG9uZW50IGlzIHJvdXRlIGJhc2VkLFxyXG4gICAqIHdoZW4gdGhlIGRpY3Rpb25hcnkgY2xhc3MgaW4gdGhlIHJvdXRlIGNoYW5nZXMsIHRoaXMgY29tcG9uZW50IGlzIHJlbG9hZGVkLlxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYm91bmROZXdSb3dQb3N0Q2FsbCA9IHRoaXMubmV3Um93UG9zdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3RzLnB1c2gobmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSkpO1xyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHMucHVzaChuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKFxyXG4gICAgICBwYXJhbXMgPT4ge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWU6IHN0cmluZyA9IHBhcmFtc1tcImNsYXNzTmFtZVwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5KGNsYXNzTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsLCB7d2luZG93Q2xhc3M6IFwibW9kYWwteGxcIn0pLnJlc3VsdC50aGVuKFxyXG4gICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgIH0sXHJcbiAgICAgIChyZWFzb24pID0+IHtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29sdW1uRGVmTWV0YSgpIDogYW55W10ge1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtmaWVsZDogXCJuYW1lXCIsIGhlYWRlck5hbWU6IFwiTmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGVzY3JpcHRpb25cIiwgaGVhZGVyTmFtZTogXCJEZXNjcmlwdGlvblwiLCB3aWR0aDogMjUwLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaWRcIiwgaGVhZGVyTmFtZTogXCJJZFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJ0eXBlXCIsIGhlYWRlck5hbWU6IFwiVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwicHJvdGVjdGlvblR5cGVcIiwgaGVhZGVyTmFtZTogXCJQcm90ZWN0aW9uVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIHdpZHRoOiAxODAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJub3ROdWxsXCIsIGhlYWRlck5hbWU6IFwiTm90TnVsbFwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaW50ZWdlclwiLCBoZWFkZXJOYW1lOiBcIkludGVnZXJcIiwgd2lkdGg6IDc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwibWluXCIsIGhlYWRlck5hbWU6IFwiTWluXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcIm1heFwiLCBoZWFkZXJOYW1lOiBcIk1heFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmcmFjdGlvblwiLCBoZWFkZXJOYW1lOiBcIkZyYWN0aW9uXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5VG9vbHRpcFwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlUb29sdGlwXCIsIHdpZHRoOiAyMDAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5RGlzcGxheVwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlEaXNwbGF5XCIsIHdpZHRoOiAxNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmaWx0ZXJhYmxlXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyYWJsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU5hbWVcIiwgaGVhZGVyTmFtZTogXCJEaXNwbGF5TmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU9yZGVyXCIsIGhlYWRlck5hbWU6IFwiRGlzcGxheU9yZGVyXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImNlbGxTdHlsZVwiLCBoZWFkZXJOYW1lOiBcIkNlbGxTdHlsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgXTsgLy8gdGhlIHdpZHRocyBmb3IgdGhlIGxhc3QgMiBjb3VsZCBiZSB3cm9uZy5cclxuXHJcbiAgfVxyXG5cclxuICBvbk1ldGFHcmlkUmVhZHkocGFyYW1zIDogYW55KSB7XHJcblxyXG4gICAgdGhpcy5ncmlkQXBpTWV0YSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRBcGlNZXRhLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5EZWZNZXRhKCkpO1xyXG4gICAgdGhpcy5ncmlkQXBpTWV0YS5zZXRSb3dEYXRhKHRoaXMuZGljdGlvbmFyeT8uZmllbGRzKTtcclxuICAgIC8vIHRoaXMuZ3JpZEFwaU1ldGEuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG5cclxuICB9XHJcblxyXG4gIG9wZW5BcmVZb3VTdXJlTW9kYWwobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsKS5yZXN1bHQudGhlbihcclxuICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT09IFwiRGVsZXRlXCIpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlRGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChyZWFzb24pID0+IHtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoIHRoZSBkaWN0aW9uYXJ5IG1ldGFkYXRhIGFuZCBkaWN0aW9uYXJ5IGVudHJpZXMgYmFzZWQgdXBvbiB0aGUgZGljdGlvbmFyeSBjbGFzcyBuYW1lLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxyXG4gICAqL1xyXG4gIGdldERpY3Rpb25hcnkoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuXHJcbiAgICAvLyBXaGVuIFNlbGVjdGluZyBBIE5ldyBEaWN0aW9uYXJ5LCBOYXZpZ2F0ZSBUbyBGaXJzdCBQYWdlXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5wYWdpbmF0aW9uR29Ub0ZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5KGNsYXNzTmFtZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgIChkaWN0aW9uYXJ5OiBPYmplY3QpID0+IHtcclxuICAgICAgICB0aGlzLnNldFVwRGljdGlvbmFyeUdyaWQoZGljdGlvbmFyeSk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0ubmV4dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaW5hbGl6ZShcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICApLnN1YnNjcmliZShcclxuICAgICAgKGRpY3Rpb25hcnlFbnRyaWVzOiBPYmplY3RbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkaWN0aW9uYXJ5RW50cmllcztcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKGRpY3Rpb25hcnlFbnRyaWVzKTtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGRpY3Rpb25hcnkgbWV0YWRhdGEuICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGNvbHVtbnMgZm9yIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMuICBUaGUgbmFtZXMsIHZhbGlkYXRpb24sXHJcbiAgICogYW5kIGZpbHRlciBjbGFzc2VzIGJ1aWxkIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBkaWN0aW9uYXJ5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcERpY3Rpb25hcnlHcmlkKGRpY3Rpb25hcnk6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5zZXREaWN0aW9uYXJ5XCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGRpY3Rpb25hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7XHJcbiAgICB0aGlzLnNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzID0gW107XHJcbiAgICBsZXQgZGljdGlvbmFyeUNsYXNzTmFtZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBkaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzKSB7XHJcbiAgICAgICAgZGljdGlvbmFyeUNsYXNzTmFtZXMucHVzaChmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeUNsYXNzTmFtZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeU5hbWVzOiBzdHJpbmdbXSkge1xyXG5cclxuICAgIGlmIChkaWN0aW9uYXJ5TmFtZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5maW5pc2hDb2x1bW5TZXR1cCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRpY3Rpb25hcnlOYW1lID0gZGljdGlvbmFyeU5hbWVzLnBvcCgpO1xyXG5cclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RHJvcGRvd25FbnRyaWVzKGRpY3Rpb25hcnlOYW1lKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5RGljdGlvbmFyeUVudHJpZXMucHVzaCh7ZGljdGlvbmFyeU5hbWU6IGRpY3Rpb25hcnlOYW1lLCBlbnRyaWVzOiByZXNwb25zZX0pO1xyXG4gICAgICAgICAgdGhpcy5nZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeU5hbWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaENvbHVtblNldHVwKCkge1xyXG5cclxuICAgIHRoaXMuZGlzcGxheU5hbWUgPSB0aGlzLmRpY3Rpb25hcnkuZGlzcGxheU5hbWU7XHJcblxyXG4gICAgLy8gVGhpcyBlc3RhYmxpc2hlcyB0aGUgcmVhZE9ubHkgZnVuY3Rpb25hbGl0eVxyXG4gICAgbGV0IGNvbHM6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gUHJvY2VzcyBDb2x1bW5zIEFuZCBDcmVhdGUgQ29sdW1uIERlZmluaXRpb25cclxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLmlkICYmIChpc051bGxPclVuZGVmaW5lZChmaWVsZC5jb2RlKSB8fCBmaWVsZC5jb2RlID09IGZhbHNlKSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY29sOiBhbnk7XHJcblxyXG4gICAgICBpZiAoZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIGRyb3Bkb3duIG9mIGFub3RoZXIgZGljdGlvbmFyeVxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5zZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllcy5maW5kKFxyXG4gICAgICAgICAgKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5kaWN0aW9uYXJ5TmFtZSA9PT0gZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbCA9IHtcclxuICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZmllbGQuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBjZWxsUmVuZGVyZXJGcmFtZXdvcms6IFNlbGVjdFJlbmRlcmVyLFxyXG4gICAgICAgICAgY2VsbEVkaXRvckZyYW1ld29yazogU2VsZWN0RWRpdG9yLFxyXG4gICAgICAgICAgc2VsZWN0T3B0aW9uc0Rpc3BsYXlGaWVsZDogXCJkaXNwbGF5XCIsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zVmFsdWVGaWVsZDogXCJpZFwiLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXJWYWx1ZUdldHRlcjogdGhpcy5jb21ib0ZpbHRlclZhbHVlR2V0dGVyLFxyXG4gICAgICAgICAgc2VsZWN0T3B0aW9uczogW10sXHJcbiAgICAgICAgICBjb21wYXJhdG9yOiAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVudHJpZXMpIHtcclxuICAgICAgICAgIGNvbC5zZWxlY3RPcHRpb25zID0gb3B0aW9ucy5lbnRyaWVzLnNvcnQoXHJcbiAgICAgICAgICAgIChvcHRpb25BLCBvcHRpb25CKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbkEgJiYgIW9wdGlvbkIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbkIgJiYgIW9wdGlvbkEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghb3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgob3B0aW9uQi5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUIgJiYgIXZhbHVlQSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF2YWx1ZUEgJiYgIXZhbHVlQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgb3B0aW9uQSA9IG9wdGlvbnMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gKFwiXCIgKyBlbnRyeS5pZCA9PT0gXCJcIiArIHZhbHVlQSkpO1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9uQiA9IG9wdGlvbnMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gKFwiXCIgKyBlbnRyeS5pZCA9PT0gXCJcIiArIHZhbHVlQikpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbkEgJiYgIW9wdGlvbkIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbkIgJiYgIW9wdGlvbkEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkEuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbC5jZWxsU3R5bGUgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbjogYW55ID0ge307XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgcGFyYW1zLmNvbnRleHQuY29tcG9uZW50UGFyZW50LmRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29sRGVmLmZpZWxkID09IGZpZWxkLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4gPSBmaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChwYXJhbXMuZGF0YS5lZGl0T3JOZXcgJiYgcGFyYW1zLmRhdGEuZWRpdE9yTmV3ID09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIgfHwgY29sdW1uLmNyZWF0ZU9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJDcmVhdGUgT25seVwiIHx8IGNvbHVtbi5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmRpc3BsYXlPcmRlciA9IGZpZWxkLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICBjb2wuZGljdGlvbmFyeURpc3BsYXkgPSBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheTtcclxuICAgICAgICBjb2wuZGljdGlvbmFyeVRvb2x0aXAgPSBmaWVsZC5kaWN0aW9uYXJ5VG9vbHRpcDtcclxuXHJcbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgZmlsdGVyIGFzIGNvbXBhcmUgYnkgdGV4dC9udW1iZXJcclxuICAgICAgICAvLyBjb2wuZmlsdGVyUmVuZGVyZXIgPSBDb21wYXJlRmlsdGVyUmVuZGVyZXI7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSAmJiBmaWVsZC50eXBlID09IFwiRGF0ZVwiKSB7XHJcbiAgICAgICAgLy9kYXRlIHZhbHVlXHJcbiAgICAgICAgY29sID0ge1xyXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBmaWVsZC5kaXNwbGF5TmFtZSxcclxuICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogRGF0ZVJlbmRlcmVyLFxyXG4gICAgICAgICAgY2VsbEVkaXRvckZyYW1ld29yazogQWdHcmlkRGF0ZUNlbGxFZGl0b3JDb21wb25lbnQsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgIGxldCBudW0gPSB0aGlzLmRhdGVDb21wYXJhdG9yKHZhbHVlQSwgdmFsdWVCKTtcclxuICAgICAgICAgIHJldHVybiBpc0ludmVydGVkID8gLTEgKiBudW0gOiBudW07IC8vZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyB3aXRoIGludmVydGVkP1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jZWxsU3R5bGUgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgdmFyIGNvbHVtbjogYW55ID0ge307XHJcbiAgICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBwYXJhbXMuY29udGV4dC5jb21wb25lbnRQYXJlbnQuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYuZmllbGQgPT0gZmllbGQubmFtZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbiA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcgdmFsdWVcclxuICAgICAgICBjb2wgPSB7XHJcbiAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGZpZWxkLmRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgZWRpdGFibGU6IHRoaXMuaXNFZGl0YWJsZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICAgICAgICBkaWN0aW9uYXJ5RGlzcGxheTogZmllbGQuZGljdGlvbmFyeURpc3BsYXlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuY29tcGFyYXRvciA9ICh2YWx1ZUEsIHZhbHVlQiwgbm9kZUEsIG5vZGVCLCBpc0ludmVydGVkKSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHZhbHVlQiAmJiAhdmFsdWVBKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh2YWx1ZUEudG9Mb3dlckNhc2UoKSA+IHZhbHVlQi50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICgodmFsdWVCLnRvTG93ZXJDYXNlKCkgPiB2YWx1ZUEudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICB2YXIgY29sdW1uOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHBhcmFtcy5jb250ZXh0LmNvbXBvbmVudFBhcmVudC5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChwYXJhbXMuZGF0YS5lZGl0T3JOZXcgJiYgcGFyYW1zLmRhdGEuZWRpdE9yTmV3ID09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIgfHwgY29sdW1uLmNyZWF0ZU9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJDcmVhdGUgT25seVwiIHx8IGNvbHVtbi5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmRpc3BsYXlPcmRlciA9IGZpZWxkLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBmaWx0ZXIgYXMgY29tcGFyZSBieSB0ZXh0L251bWJlclxyXG4gICAgICAgIC8vIGNvbC5maWx0ZXJSZW5kZXJlciA9IENvbXBhcmVGaWx0ZXJSZW5kZXJlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29scy5wdXNoKGNvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm93IHdlIG5lZWQgdG8gc29ydCB0aGUgY29sdW1uc1xyXG4gICAgaWYgKCF0aGlzLmRpY3Rpb25hcnkuZmllbGRzWzBdLmhhc093blByb3BlcnR5KFwiZGlzcGxheU9yZGVyXCIpKSB7XHJcbiAgICAgIC8vIGRlZmF1bHQgY2FzZSwgbm8gZGlzcGxheU9yZGVyXHJcbiAgICAgIGNvbHMgPSBjb2xzLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmICghYS5oZWFkZXJOYW1lICYmIGIuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWIuaGVhZGVyTmFtZSAmJiBhLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRpY3Rpb25hcnlEaXNwbGF5ID09PSB0cnVlICYmIGIuZGljdGlvbmFyeURpc3BsYXkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYi5kaWN0aW9uYXJ5RGlzcGxheSA9PT0gdHJ1ZSAmJiBhLmRpY3Rpb25hcnlEaXNwbGF5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gdHJ1ZSAmJiBiLmRpY3Rpb25hcnlUb29sdGlwID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGIuZGljdGlvbmFyeVRvb2x0aXAgPT09IHRydWUgJiYgYS5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRGlzcGxheU9yZGVyIGNhc2VcclxuICAgICAgLy8gSSB0aGluayB0aGlzIHdvcmtzPyBDaGVjayBsYXRlclxyXG4gICAgICBjb2xzID0gY29scy5zb3J0KFxyXG4gICAgICAgIChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWEuaGVhZGVyTmFtZSAmJiBiLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCFiLmhlYWRlck5hbWUgJiYgYS5oZWFkZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmRpc3BsYXlPcmRlciAtIGIuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZnRlciBDb2x1bW5zIEhhdmUgQmVlbiBTb3J0ZWRcclxuICAgIC8vIERpY3Rpb25hcnkgR3JpZCBXaWxsIFNvcnQgVGhlIEdyaWQgQXNjZW5kaW5nIE9yZGVyIEJ5IEZpcnN0IENvbHVtblxyXG4gICAgaWYoY29scyAgJiYgY29scy5sZW5ndGggIT0gMCkge1xyXG4gICAgICBjb2xzWzBdLnNvcnQgPSBcImFzY1wiO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSBjb2xzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhQ29sdW1ucykgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRDb2x1bW5EZWZzKHRoaXMuZGF0YUNvbHVtbnMpO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0VkaXRhYmxlKHBhcmFtcyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBpc0VkaXRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgIGxldCBjb2x1bW46IGFueSA9IHt9O1xyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyYW1zLmRhdGEuZWRpdE9yTmV3ICYmIHBhcmFtcy5kYXRhLmVkaXRPck5ldyA9PSBcIm5ld1wiKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwibmV3IGVkaXRhYmxlP1wiKTtcclxuICAgICAgaXNFZGl0YWJsZSA9ICEodGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWRpdCBlZGl0YWJsZT9cIik7XHJcbiAgICAgIGlzRWRpdGFibGUgPSAhKHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0VkaXRhYmxlO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRGljdGlvbmFyeUVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IGRlbGV0ZVJvd3M6IGFueVtdID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcblxyXG4gICAgZm9yIChsZXQgZGVsZXRlSWQgb2YgdGhpcy5zZWxlY3RlZFJvd3MpIHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5kaWN0aW9uYXJ5RW50cmllcykge1xyXG4gICAgICAgIGlmIChlbnRyeVt0aGlzLmlkQ29sdW1uXSA9PT0gZGVsZXRlSWQpIHtcclxuICAgICAgICAgIGRlbGV0ZVJvd3MucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmRlbGV0ZURpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lLCBkZWxldGVSb3dzKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGljdGlvbmFyeShldmVudDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgLy8gSW1wb3J0YW50IHRvIG5vdGUgdGhpcyB3aWxsIG5vdCB1cGRhdGUgY2VsbHMgdG8gdGhlIGRlbW8gYnV0IHdpbGwgd2hlbiBpbXBvcnRlZCB0byBDT1JFIG9yIG90aGVyIGFwcGxpY2F0aW9ucy5cclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UudXBkYXRlRGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUsIFtldmVudC5kYXRhXSkuc3Vic2NyaWJlKFxyXG4gICAgICAoZGF0YTogYW55W10pID0+IHtcclxuICAgICAgICB0aGlzLmdldERpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRTZWxlY3RlZEVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIG5ld1Jvd1Bvc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5hZGREaWN0aW9uYXJ5RW50cmllcyh0aGlzLmNsYXNzTmFtZSwgW2RhdGFdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoXHJcbiAgICAgICAgICAoZGF0YTogT2JqZWN0W10pID0+IHtcclxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gPGFueT5kYXRhWzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBvblNhbXBsZXNHcmlkUmVhZHkoZXZlbnQ6IEdyaWRSZWFkeUV2ZW50KTogdm9pZCB7XHJcblxyXG4gICAgZXZlbnQuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgb25HcmlkU2l6ZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xyXG5cclxuICAgIGlmIChldmVudCAmJiBldmVudC5hcGkpIHtcclxuICAgICAgZXZlbnQuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUFkZFJvdygpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ICYmIHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZURlbGV0ZSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ICYmIHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCkubGVuZ3RoID09PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbWJvRmlsdGVyVmFsdWVHZXR0ZXIocGFyYW1zKTogYW55IHtcclxuXHJcbiAgICBsZXQgdmFsdWUgPSBwYXJhbXMuZGF0YVtwYXJhbXMuY29sRGVmLmZpZWxkXTtcclxuXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgbGV0IG9wdGlvbiA9ICgocGFyYW1zLmNvbERlZiBhcyBhbnkpLnNlbGVjdE9wdGlvbnMgYXMgYW55W10pLmZpbmQoKGVudHJ5KSA9PiAoZW50cnlbcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zVmFsdWVGaWVsZF0gPT09IHZhbHVlKSk7XHJcbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkXSA6IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrQWRkUm93KCkge1xyXG5cclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihOZXdSb3dDb21wb25lbnQsXHJcbiAgICAgIHtcclxuICAgICAgICBzaXplOiBcImxnXCIsXHJcbiAgICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbERlZnMgPSB0aGlzLmRhdGFDb2x1bW5zO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeTtcclxuXHJcbiAgICAvLyBpZiAoIXRoaXMubmV3Um93U3Vic2NyaXB0aW9uKSB7IC8vIHJlbW92ZWQgYmVjYXVzZSBpdCB3YXMgcHJldmVudGluZyBzYXZlIGFmdGVyIGNhbmNlbFxyXG4gICAgICAvLyB0ZWxsIG90aGVyIGFnLWdyaWQgdG8gYWRkIHJvdyB0byBpdFxyXG4gICAgICB0aGlzLm5ld1Jvd1N1YnNjcmlwdGlvbiA9IG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLm5ld1Jvd1N1YmplY3Quc3Vic2NyaWJlKFxyXG4gICAgICAgICh0aGVOZXdSb3c6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzID0gdGhlTmV3Um93LmNvbmNhdCh0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldFJvd0RhdGEodGhpcy5kaWN0aW9uYXJ5RW50cmllcyk7XHJcbiAgICAgICAgICB0aGlzLm5ld1Jvd1N1YnNjcmlwdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICAgICAgLy8gSW1wb3J0YW50IHRvIG5vdGUgdGhpcyB3aWxsIG5vdCBhZGQgcm93cyB0byB0aGUgZGVtbyBidXQgd2lsbCB3aGVuIGltcG9ydGVkIHRvIENPUkUgb3Igb3RoZXIgYXBwbGljYXRpb25zLlxyXG4gICAgICAgICAgdGhpcy5uZXdSb3dQb3N0KHRoZU5ld1Jvd1swXSkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGFyYXRlciBUbyBDb21wYXJlIDIgRGF0ZXNcclxuICAgKiBAcGFyYW0gZGF0ZTEgRGF0ZSAxXHJcbiAgICogQHBhcmFtIGRhdGUyIERhdGUgMlxyXG4gICAqL1xyXG4gIGRhdGVDb21wYXJhdG9yKGRhdGUxLCBkYXRlMikge1xyXG5cclxuICAgIGxldCBkYXRlMU51bWJlciA9IG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUxKTtcclxuICAgIGxldCBkYXRlMk51bWJlciA9IG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUyKTtcclxuXHJcbiAgICBpZiAoZGF0ZTFOdW1iZXIgPT09IG51bGwgJiYgZGF0ZTJOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGUxTnVtYmVyID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0ZTJOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGUxTnVtYmVyIC0gZGF0ZTJOdW1iZXI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXh0cmFjdHMgRGF0ZSBBbmQgVHVybiBUbyBBIE51bWVyaWNhbCBWYWx1ZSBGb3IgQ29tcGFyaW5nIFB1cnBvc2VzXHJcbiAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIGNvbXBhcmFibGUgbnVtYmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBtb250aFRvQ29tcGFyYWJsZU51bWJlcihkYXRlKSB7XHJcblxyXG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCB8fCBkYXRlLmxlbmd0aCAhPT0gMTApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGV0IHllYXJOdW1iZXIgPSBkYXRlLnN1YnN0cmluZygwLCA0KTtcclxuICBsZXQgbW9udGhOdW1iZXIgPSBkYXRlLnN1YnN0cmluZyg1LCA3KTtcclxuICBsZXQgZGF5TnVtYmVyID0gZGF0ZS5zdWJzdHJpbmcoOCwgMTApO1xyXG5cclxuICByZXR1cm4geWVhck51bWJlciAqIDEwMDAwICsgbW9udGhOdW1iZXIgKiAxMDAgKyBkYXlOdW1iZXI7XHJcbn1cclxuIl19
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9jb21wb25lbnRzL2RldGFpbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFhLFdBQVcsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFXLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsUUFBUSxFQUFjLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFRckcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUVqRzs7Ozs7Ozs7R0FRRztBQXNNSCxNQUFNLE9BQU8sK0JBQStCO0lBa0MxQyxZQUNVLEtBQXFCLEVBQ3JCLFlBQXNCLEVBQ3RCLGlCQUFvQyxFQUNQLGtCQUEwQjtRQUh2RCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixpQkFBWSxHQUFaLFlBQVksQ0FB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QUFDLE9BQU87O0FBaXVCdEI7OztHQUdHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxJQUFJO0lBRW5DLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdEMsT0FBTyxVQUFVLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBpc0Rldk1vZGUsIFZpZXdDaGlsZCwgSG9zdEJpbmRpbmcsIFRlbXBsYXRlUmVmfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZmluYWxpemUsIG1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7TmdiTW9kYWwsIE5nYk1vZGFsUmVmfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuXHJcbmltcG9ydCB7RElDVElPTkFSWV9FTkRQT0lOVCwgRGljdGlvbmFyeVNlcnZpY2V9IGZyb20gJ0BodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbHVtbkFwaSxcclxuICBHcmlkT3B0aW9ucyxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBHcmlkQXBpXHJcbn0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcbmltcG9ydCB7U2VsZWN0UmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9zZWxlY3QucmVuZGVyZXJcIjtcclxuaW1wb3J0IHtTZWxlY3RFZGl0b3J9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvclwiO1xyXG5pbXBvcnQge05ld1Jvd0NvbXBvbmVudH0gZnJvbSBcIi4vbmV3LXJvdy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHtEYXRlUmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9kYXRlLnJlbmRlcmVyXCI7XHJcbmltcG9ydCB7QWdHcmlkRGF0ZUNlbGxFZGl0b3JDb21wb25lbnR9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvYWctZ3JpZC1kYXRlLWNlbGwtZWRpdG9yLmNvbXBvbmVudFwiO1xyXG5cclxuLyoqXHJcbiAqIFdoZW4gYSBkaWN0aW9uYXJ5IGlzIHNlbGVjdGVkIHRoaXMgY29tcG9uZW50IGlzIHNob3duLiAgVGhlcmUgaXMgYSB0b3AgZ3JpZCB3aGljaCBmb3IgaXRzIGRhdGEgc2hvd3MgYWxsIHRoZSBjb2x1bW5zXHJcbiAqIGZvciB0aGUgZGljdGlvbmFyeS4gQ3VycmVudGx5LCBrZWVwIHRoaXMgZm9yIHJlZmVyZW5jZSBvbmx5IGFuZCBoYXZlIG5vbi1lZGl0YWJsZS5cclxuICogVGhlIGJvdHRvbSBncmlkIHdpbGwgc2hvdyB0aG9zZSBjb2x1bW5zIGFzIGFjdHVhbCBjb2x1bW5zIGFuZCBpdHMgZGF0YSBhcmUgYWxsIHRoZSBkaWN0aW9uYXJ5IHZhbHVlcy4gIFJvd3MgY2FuIGJlXHJcbiAqIGFkZGVkLiAgRm9yIGRlbGV0aW5nLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaWQgaXMgbm90IHVzZWQgYW55d2hlcmUuICBGb3IgZWRpdGluZywgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNvZGUgb3IgYW55dGhpbmdcclxuICogZWxzZSBpc24ndCBiZWluZyByZWZlcmVuY2VkLlxyXG4gKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBDb21wb25lbnQoXHJcbiAge1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLWRpY3Rpb25hcnktZWRpdG9yLWRldGFpbFwiLFxyXG4gICAgdGVtcGxhdGU6XHJcbiAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGhjaS1kaWN0aW9uYXJ5LWRldGFpbC1ib2R5XCI+XHJcbiAgICAgICAgICA8aGNpLWJ1c3kgW2J1c3lTdWJqZWN0c109XCJsb2FkaW5nU3ViamVjdHNcIj48L2hjaS1idXN5PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBUaXRsZSBBbmQgTWV0YWRhdGEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGljdGlvbmFyeS1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaWN0aW9uYXJ5LXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAge3tkaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtZXRhZGF0YS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTW9kYWwobWV0YURhdGFNb2RhbClcIj5cclxuICAgICAgICAgICAgICBWaWV3IE1ldGEgRGF0YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBFZGl0IEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJkaXNhYmxlRGVsZXRlPyAnZGVhY3RpdmF0ZWQtY29sb3InOiAnYWN0aXZlLWNvbG9yJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQXJlWW91U3VyZU1vZGFsKGFyZVlvdVN1cmVNb2RhbClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmx1ZXdhcm0tZGFya2VzdCk7IGZsb2F0OiByaWdodDsgZm9udC1zaXplOiAxNXB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVBZGRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrQWRkUm93KClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBEaXNwbGF5IEdyaWQgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgaWQ9XCJkaWN0aW9uYXJ5LWdyaWQtZGlzcGxheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RhdGFHcmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC1oZWlnaHQgZnVsbC13aWR0aCBoY2ktZGljdGlvbmFyeS1kaXNwbGF5LWdyaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImRpY3Rpb25hcnlFbnRyaWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaW5nbGVDbGlja0VkaXRdPVwiJ3RydWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvbl09XCIndHJ1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uQXV0b1BhZ2VTaXplXT1cIid0cnVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbFZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVEaWN0aW9uYXJ5KCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIERpY3Rpb25hcnkgTWV0YWRhdGEgUG9wdXAgLS0+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI21ldGFEYXRhTW9kYWwgbGV0LWNsb3NlPVwiY2xvc2VcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjEwMDBweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIE1ldGEgRGF0YSBmb3Ige3tjbGFzc05hbWV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbW9kYWwtYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNjZWQ0ZGE7IHdpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGFnLWdyaWQtYW5ndWxhciAjbWV0YUdyaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAyNTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JpZFJlYWR5KT1cInRoaXMub25NZXRhR3JpZFJlYWR5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5tZXRhR3JpZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uXT1cIidzaW5nbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZyYW1ld29ya0NvbXBvbmVudHNdPVwiZnJhbWV3b3JrQ29tcG9uZW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImRpY3Rpb25hcnk/LmZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgnQ2xvc2UnKVwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICA8IS0tIERpY3Rpb25hcnkgRGVsZXRlIENvbWZpcm1hdGlvbiBQb3B1cCAtLT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYXJlWW91U3VyZU1vZGFsIGxldC1jbG9zZT1cImNsb3NlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICBDb25maXJtYXRpb25cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGQtZmxleFwiPlxyXG4gICAgICAgICAgICAgIEFyZSB5b3Ugc3VyZT9cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKCdDYW5jZWwnKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXJlZFwiIChjbGljayk9XCJjbG9zZSgnRGVsZXRlJylcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICBgLFxyXG4gICAgc3R5bGVzOiBbXHJcbiAgICAgIGBcclxuICAgICAgICAuZnVsbC1oZWlnaHQge1xyXG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZ1bGwtd2lkdGgge1xyXG4gICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuYWctdGhlbWUtYmFsaGFtIHtcclxuICAgICAgICAgIGZvbnQtZmFtaWx5OiBcIlByb21wdFwiO1xyXG4gICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5hY3RpdmUtY29sb3Ige1xyXG4gICAgICAgICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLWJsdWV3YXJtLWRhcmtlc3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmRlYWN0aXZhdGVkLWNvbG9yIHtcclxuICAgICAgICAgIGZsb2F0OiByaWdodDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmV5d2FybS1kYXJrZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kaWN0aW9uYXJ5LWluZm8tc2VjdGlvbiB7XHJcbiAgICAgICAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kaWN0aW9uYXJ5LXRpdGxlIHtcclxuICAgICAgICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgICAgICAgIHBhZGRpbmctdG9wOiA1cHg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAubWV0YWRhdGEtYnV0dG9uIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1saWdodGVzdCk7XHJcbiAgICAgICAgICBmbG9hdDogbGVmdDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1oZWFkZXItY2VsbCB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVzdCk7XHJcbiAgICAgICAgICBib3JkZXI6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLWNlbGwge1xyXG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiBsaWdodGdyYXkgc29saWQgdGhpbjtcclxuICAgICAgICAgIGJvcmRlci1sZWZ0OiBsaWdodGdyYXkgc29saWQgdGhpbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3cge1xyXG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcclxuICAgICAgICAgIGJvcmRlci10b3A6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LWV2ZW4ge1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUtbWVkaXVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5oY2ktZGljdGlvbmFyeS1kZXRhaWwtYm9keSB7XHJcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgwZGVnLCB2YXIoLS13aGl0ZS1saWdodGVzdCkgMzAlLCB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVyKSAxMDAlKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmhjaS1kaWN0aW9uYXJ5LWRpc3BsYXktZ3JpZCB7XHJcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XHJcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4zNSkgMHB4IDVweCAxNXB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgKiBEaWN0aW9uYXJ5IFJvdyBIb3ZlciBDU1NcclxuICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LWhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmV5LWRhcmtlc3QpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVyKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgKiBEaWN0aW9uYXJ5IENlbGwgU2VsZWN0ZWQgQ1NTXHJcbiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLXJvdy1zZWxlY3RlZCAuYWctY2VsbCB7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0td2hpdGUtbGlnaHRlc3QpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LXNlbGVjdGVkIC5hZy1jZWxsLW5vdC1pbmxpbmUtZWRpdGluZyB7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0td2hpdGUtbGlnaHRlc3QpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LXNlbGVjdGVkIC5hZy1jZWxsLWlubGluZS1lZGl0aW5nIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ibGFjay1kYXJrZXN0KSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgKiBEaWN0aW9uYXJ5IFJvdyBTZWxlY3RlZCBDU1NcclxuICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LXNlbGVjdGVkIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1kYXJrZXN0KSAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmx1ZXdhcm12aXZpZC1saWdodGVyKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuICAgICAgYFxyXG4gICAgXVxyXG4gIH1cclxuKVxyXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudCB7XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpIGNsYXNzTGlzdDogc3RyaW5nID0gXCJvdXRsZXQtY29sdW1uIHktYXV0b1wiO1xyXG5cclxuICBwcml2YXRlIHNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzOiBhbnk7XHJcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IGFueTtcclxuICBkaWN0aW9uYXJ5OiBhbnk7XHJcbiAgZGljdGlvbmFyeUVudHJpZXM6IGFueVtdID0gW107XHJcbiAgZGF0YUNvbHVtbnM6IGFueVtdO1xyXG5cclxuICBpZENvbHVtbjogc3RyaW5nO1xyXG4gIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcclxuICBsb2FkaW5nU3ViamVjdHM6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPltdID0gW107XHJcbiAgaGFsZkxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb2Nlc3NpbmdDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FsbFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBib3VuZE5ld1Jvd1Bvc3RDYWxsOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XHJcbiAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xyXG4gIG5ld1Jvd1N1YnNjcmlwdGlvbjogYW55O1xyXG4gIHByaXZhdGUgZGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIG1ldGFHcmlkT3B0aW9ucyA9IHtcclxuICAgIHJvd1N0eWxlOiB7XHJcbiAgICAgIFwiZm9udC1mYW1pbHlcIjogXCJQcm9tcHQsIHNhbnMtc2VyaWZcIlxyXG4gICAgfSxcclxuICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgZW5zdXJlRG9tT3JkZXI6IHRydWVcclxuICB9O1xyXG4gIGZyYW1ld29ya0NvbXBvbmVudHM6IGFueTtcclxuICBwdWJsaWMgZ3JpZEFwaU1ldGE6IEdyaWRBcGk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KERJQ1RJT05BUllfRU5EUE9JTlQpIHByaXZhdGUgRGljdGlvbmFyeUVuZHBvaW50OiBzdHJpbmdcclxuICApIHtcclxuXHJcbiAgICB0aGlzLmdyaWRPcHRpb25zID0gPEdyaWRPcHRpb25zPntcclxuICAgICAgY29udGV4dDoge1xyXG4gICAgICAgIGNvbXBvbmVudFBhcmVudDogdGhpc1xyXG4gICAgICB9LFxyXG4gICAgICBvbkdyaWRSZWFkeTogRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5vblNhbXBsZXNHcmlkUmVhZHksXHJcbiAgICAgIG9uR3JpZFNpemVDaGFuZ2VkOiBEaWN0aW9uYXJ5RWRpdG9yRGV0YWlsQ29tcG9uZW50Lm9uR3JpZFNpemVDaGFuZ2VkLFxyXG4gICAgICBzdXBwcmVzc0hvcml6b250YWxTY3JvbGw6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb25Nb2RlOiBcIm11bHRpcGxlXCIsXHJcbiAgICAgIHN0b3BFZGl0aW5nV2hlbkdyaWRMb3Nlc0ZvY3VzOiB0cnVlLFxyXG4gICAgICBlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG4gICAgICBlbmFibGVGaWx0ZXI6IHRydWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlZCBvbiB0aGUgcm91dGUgY2xhc3MgbmFtZSwgbWFrZSB0aGUgY2FsbCB0byBmZXRjaCB0aGUgZGljdGlvbmFyeSBkYXRhLiAgU2luY2UgdGhpcyBjb21wb25lbnQgaXMgcm91dGUgYmFzZWQsXHJcbiAgICogd2hlbiB0aGUgZGljdGlvbmFyeSBjbGFzcyBpbiB0aGUgcm91dGUgY2hhbmdlcywgdGhpcyBjb21wb25lbnQgaXMgcmVsb2FkZWQuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmJvdW5kTmV3Um93UG9zdENhbGwgPSB0aGlzLm5ld1Jvd1Bvc3QuYmluZCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0cy5wdXNoKG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpKTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoXHJcbiAgICAgIHBhcmFtcyA9PiB7XHJcblxyXG4gICAgICAgIGxldCBjbGFzc05hbWU6IHN0cmluZyA9IHBhcmFtc1tcImNsYXNzTmFtZVwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5KGNsYXNzTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0uc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAvLyBBIG5ldyBjYWxsIHdhcyBtYWRlIHRvIGJlIHByb2Nlc3NlZCwgcHJvY2VzcyB0aGUgY2FsbFxyXG4gICAgICAgIHRoaXMuZ2V0RGljdGlvbmFyeUJlZ2luKHRoaXMuY2xhc3NOYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBBIGNhbGwgY29tcGxldGVkIHdoaWxlIGFub3RoZXIgY2FsbCB3YXMgbm90IHF1ZXVlZCwgcHJvY2Vzc2luZyBjb21wbGV0ZVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsLCB7d2luZG93Q2xhc3M6IFwibW9kYWwteGxcIn0pLnJlc3VsdC50aGVuKFxyXG4gICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgIH0sXHJcbiAgICAgIChyZWFzb24pID0+IHtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29sdW1uRGVmTWV0YSgpIDogYW55W10ge1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtmaWVsZDogXCJuYW1lXCIsIGhlYWRlck5hbWU6IFwiTmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGVzY3JpcHRpb25cIiwgaGVhZGVyTmFtZTogXCJEZXNjcmlwdGlvblwiLCB3aWR0aDogMjUwLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaWRcIiwgaGVhZGVyTmFtZTogXCJJZFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJ0eXBlXCIsIGhlYWRlck5hbWU6IFwiVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwicHJvdGVjdGlvblR5cGVcIiwgaGVhZGVyTmFtZTogXCJQcm90ZWN0aW9uVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIHdpZHRoOiAxODAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJub3ROdWxsXCIsIGhlYWRlck5hbWU6IFwiTm90TnVsbFwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaW50ZWdlclwiLCBoZWFkZXJOYW1lOiBcIkludGVnZXJcIiwgd2lkdGg6IDc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwibWluXCIsIGhlYWRlck5hbWU6IFwiTWluXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcIm1heFwiLCBoZWFkZXJOYW1lOiBcIk1heFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmcmFjdGlvblwiLCBoZWFkZXJOYW1lOiBcIkZyYWN0aW9uXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5VG9vbHRpcFwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlUb29sdGlwXCIsIHdpZHRoOiAyMDAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5RGlzcGxheVwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlEaXNwbGF5XCIsIHdpZHRoOiAxNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmaWx0ZXJhYmxlXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyYWJsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU5hbWVcIiwgaGVhZGVyTmFtZTogXCJEaXNwbGF5TmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU9yZGVyXCIsIGhlYWRlck5hbWU6IFwiRGlzcGxheU9yZGVyXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImNlbGxTdHlsZVwiLCBoZWFkZXJOYW1lOiBcIkNlbGxTdHlsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgXTsgLy8gdGhlIHdpZHRocyBmb3IgdGhlIGxhc3QgMiBjb3VsZCBiZSB3cm9uZy5cclxuXHJcbiAgfVxyXG5cclxuICBvbk1ldGFHcmlkUmVhZHkocGFyYW1zIDogYW55KSB7XHJcblxyXG4gICAgdGhpcy5ncmlkQXBpTWV0YSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRBcGlNZXRhLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5EZWZNZXRhKCkpO1xyXG4gICAgdGhpcy5ncmlkQXBpTWV0YS5zZXRSb3dEYXRhKHRoaXMuZGljdGlvbmFyeT8uZmllbGRzKTtcclxuXHJcbiAgfVxyXG5cclxuICBvcGVuQXJlWW91U3VyZU1vZGFsKG1vZGFsOiBUZW1wbGF0ZVJlZjxhbnk+KTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihtb2RhbCkucmVzdWx0LnRoZW4oXHJcbiAgICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBcIkRlbGV0ZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZURpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAocmVhc29uKSA9PiB7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmUgaWYgd2UgYXJlIGxvYWRpbmcgc29tZXRoaW5nLCBhbmQgdGhlbiB3YWl0IHVudGlsIGl0IGlzIGRvbmUgdG8gLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxyXG4gICAqL1xyXG4gIGdldERpY3Rpb25hcnkoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZ0NhbGwgPT09IGZhbHNlKSB7XHJcbiAgICAgIC8vIENhbGwgaXMgbm90IGJlaW5nIHByb2Nlc3NlZCwgcHJvY2VzcyB0aGlzIGNhbGxcclxuICAgICAgdGhpcy5wcm9jZXNzaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBIGNhbGwgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQsIHF1ZXVlIGEgcmVjYWxsIHdoZW4gaXQgaXMgY29tcGxldGVcclxuICAgICAgdGhpcy5jYWxsUXVldWVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoIHRoZSBkaWN0aW9uYXJ5IG1ldGFkYXRhIGFuZCBkaWN0aW9uYXJ5IGVudHJpZXMgYmFzZWQgdXBvbiB0aGUgZGljdGlvbmFyeSBjbGFzcyBuYW1lLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RGljdGlvbmFyeUJlZ2luKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmhhbGZMb2FkZWQgPSBmYWxzZTtcclxuICAgIC8vIFdoZW4gU2VsZWN0aW5nIEEgTmV3IERpY3Rpb25hcnksIE5hdmlnYXRlIFRvIEZpcnN0IFBhZ2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnBhZ2luYXRpb25Hb1RvRmlyc3RQYWdlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFDb2x1bW5zID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeShjbGFzc05hbWUpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpXHJcbiAgICApLnN1YnNjcmliZSgoZGljdGlvbmFyeTogT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRVcERpY3Rpb25hcnlHcmlkKGRpY3Rpb25hcnkpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZ2V0RGljdGlvbmFyeUVudHJpZXMoKTtcclxuICB9XHJcblxyXG4gIGdldERpY3Rpb25hcnlFbnRyaWVzKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgKGRpY3Rpb25hcnlFbnRyaWVzOiBPYmplY3RbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkaWN0aW9uYXJ5RW50cmllcztcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKGRpY3Rpb25hcnlFbnRyaWVzKTtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFsZkxvYWRlZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2FsbFF1ZXVlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAvLyBBIGNhbGwgY29tcGxldGVkIHdoaWxlIGFub3RoZXIgY2FsbCB3YXMgcXVldWVkIHNvIG1ha2UgdGhhdCBjYWxsIG5vd1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5QmVnaW4odGhpcy5jbGFzc05hbWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0ubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaGFsZkxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBkaWN0aW9uYXJ5IG1ldGFkYXRhLiAgVGhpcyBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBjb2x1bW5zIGZvciB0aGUgZGljdGlvbmFyeSBlbnRyaWVzLiAgVGhlIG5hbWVzLCB2YWxpZGF0aW9uLFxyXG4gICAqIGFuZCBmaWx0ZXIgY2xhc3NlcyBidWlsZCB0aGUgY29sdW1uIGRlZmluaXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGljdGlvbmFyeVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0VXBEaWN0aW9uYXJ5R3JpZChkaWN0aW9uYXJ5OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkRpY3Rpb25hcnlFZGl0b3JEZXRhaWxDb21wb25lbnQuc2V0RGljdGlvbmFyeVwiKTtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhkaWN0aW9uYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5O1xyXG4gICAgdGhpcy5zZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllcyA9IFtdO1xyXG4gICAgbGV0IGRpY3Rpb25hcnlDbGFzc05hbWVzID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLmZpbHRlckRpY3Rpb25hcnlDbGFzcykge1xyXG4gICAgICAgIGRpY3Rpb25hcnlDbGFzc05hbWVzLnB1c2goZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0U2Vjb25kYXJ5RGljdGlvbmFyaWVzKGRpY3Rpb25hcnlDbGFzc05hbWVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vjb25kYXJ5RGljdGlvbmFyaWVzKGRpY3Rpb25hcnlOYW1lczogc3RyaW5nW10pIHtcclxuICAgIGlmIChkaWN0aW9uYXJ5TmFtZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5maW5pc2hDb2x1bW5TZXR1cCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRpY3Rpb25hcnlOYW1lID0gZGljdGlvbmFyeU5hbWVzLnBvcCgpO1xyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoZGljdGlvbmFyeU5hbWUpLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSlcclxuICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5RGljdGlvbmFyeUVudHJpZXMucHVzaCh7ZGljdGlvbmFyeU5hbWU6IGRpY3Rpb25hcnlOYW1lLCBlbnRyaWVzOiByZXNwb25zZX0pO1xyXG4gICAgICAgICAgdGhpcy5nZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeU5hbWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaENvbHVtblNldHVwKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHRoaXMuZGljdGlvbmFyeS5kaXNwbGF5TmFtZTtcclxuXHJcbiAgICAvLyBUaGlzIGVzdGFibGlzaGVzIHRoZSByZWFkT25seSBmdW5jdGlvbmFsaXR5XHJcbiAgICBsZXQgY29sczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvLyBQcm9jZXNzIENvbHVtbnMgQW5kIENyZWF0ZSBDb2x1bW4gRGVmaW5pdGlvblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuaWQgJiYgKGlzTnVsbE9yVW5kZWZpbmVkKGZpZWxkLmNvZGUpIHx8IGZpZWxkLmNvZGUgPT0gZmFsc2UpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb2w6IGFueTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3MpIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGEgZHJvcGRvd24gb2YgYW5vdGhlciBkaWN0aW9uYXJ5XHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzLmZpbmQoXHJcbiAgICAgICAgICAoYTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmRpY3Rpb25hcnlOYW1lID09PSBmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29sID0ge1xyXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBmaWVsZC5kaXNwbGF5TmFtZSxcclxuICAgICAgICAgIGVkaXRhYmxlOiB0aGlzLmlzRWRpdGFibGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogU2VsZWN0UmVuZGVyZXIsXHJcbiAgICAgICAgICBjZWxsRWRpdG9yRnJhbWV3b3JrOiBTZWxlY3RFZGl0b3IsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkOiBcImRpc3BsYXlcIixcclxuICAgICAgICAgIHNlbGVjdE9wdGlvbnNWYWx1ZUZpZWxkOiBcImlkXCIsXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlclZhbHVlR2V0dGVyOiB0aGlzLmNvbWJvRmlsdGVyVmFsdWVHZXR0ZXIsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zOiBbXSxcclxuICAgICAgICAgIGNvbXBhcmF0b3I6ICh2YWx1ZUEsIHZhbHVlQiwgbm9kZUEsIG5vZGVCLCBpc0ludmVydGVkKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW50cmllcykge1xyXG4gICAgICAgICAgY29sLnNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLmVudHJpZXMuc29ydChcclxuICAgICAgICAgICAgKG9wdGlvbkEsIG9wdGlvbkIpID0+IHtcclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQiAmJiAhb3B0aW9uQSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFvcHRpb25BICYmICFvcHRpb25CKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkEuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY29sLmNvbXBhcmF0b3IgPSAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuZW50cmllcykge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlQiAmJiAhdmFsdWVBKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBvcHRpb25BID0gb3B0aW9ucy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiAoXCJcIiArIGVudHJ5LmlkID09PSBcIlwiICsgdmFsdWVBKSk7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25CID0gb3B0aW9ucy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiAoXCJcIiArIGVudHJ5LmlkID09PSBcIlwiICsgdmFsdWVCKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQiAmJiAhb3B0aW9uQSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25BICYmICFvcHRpb25CKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpID4gb3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICBsZXQgY29sdW1uOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBwYXJhbXMuY29udGV4dC5jb21wb25lbnRQYXJlbnQuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYuZmllbGQgPT0gZmllbGQubmFtZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbiA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgIGNvbC5kaWN0aW9uYXJ5RGlzcGxheSA9IGZpZWxkLmRpY3Rpb25hcnlEaXNwbGF5O1xyXG4gICAgICAgIGNvbC5kaWN0aW9uYXJ5VG9vbHRpcCA9IGZpZWxkLmRpY3Rpb25hcnlUb29sdGlwO1xyXG5cclxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBmaWx0ZXIgYXMgY29tcGFyZSBieSB0ZXh0L251bWJlclxyXG4gICAgICAgIC8vIGNvbC5maWx0ZXJSZW5kZXJlciA9IENvbXBhcmVGaWx0ZXJSZW5kZXJlcjtcclxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlICYmIGZpZWxkLnR5cGUgPT0gXCJEYXRlXCIpIHtcclxuICAgICAgICAvL2RhdGUgdmFsdWVcclxuICAgICAgICBjb2wgPSB7XHJcbiAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGZpZWxkLmRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgY2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBEYXRlUmVuZGVyZXIsXHJcbiAgICAgICAgICBjZWxsRWRpdG9yRnJhbWV3b3JrOiBBZ0dyaWREYXRlQ2VsbEVkaXRvckNvbXBvbmVudCxcclxuICAgICAgICAgIGVkaXRhYmxlOiB0aGlzLmlzRWRpdGFibGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgZmlsdGVyOiB0cnVlLFxyXG4gICAgICAgICAgZGljdGlvbmFyeURpc3BsYXk6IGZpZWxkLmRpY3Rpb25hcnlEaXNwbGF5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNvbXBhcmF0b3IgPSAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgbGV0IG51bSA9IHRoaXMuZGF0ZUNvbXBhcmF0b3IodmFsdWVBLCB2YWx1ZUIpO1xyXG4gICAgICAgICAgcmV0dXJuIGlzSW52ZXJ0ZWQgPyAtMSAqIG51bSA6IG51bTsgLy9kb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGggaW52ZXJ0ZWQ/XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICB2YXIgY29sdW1uOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHBhcmFtcy5jb250ZXh0LmNvbXBvbmVudFBhcmVudC5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocGFyYW1zLmRhdGEuZWRpdE9yTmV3ICYmIHBhcmFtcy5kYXRhLmVkaXRPck5ldyA9PSBcIm5ld1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIikge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7Y29sb3I6IFwiIzhhOTQ5OVwifTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiIHx8IGNvbHVtbi5jcmVhdGVPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiQ3JlYXRlIE9ubHlcIiB8fCBjb2x1bW4uY29kZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7Y29sb3I6IFwiIzhhOTQ5OVwifTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5kaXNwbGF5T3JkZXIgPSBmaWVsZC5kaXNwbGF5T3JkZXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZyB2YWx1ZVxyXG4gICAgICAgIGNvbCA9IHtcclxuICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZmllbGQuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZUEgJiYgIXZhbHVlQikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodmFsdWVCICYmICF2YWx1ZUEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghdmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHZhbHVlQS50b0xvd2VyQ2FzZSgpID4gdmFsdWVCLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCh2YWx1ZUIudG9Mb3dlckNhc2UoKSA+IHZhbHVlQS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuY2VsbFN0eWxlID0gcGFyYW1zID0+IHtcclxuICAgICAgICAgIHZhciBjb2x1bW46IGFueSA9IHt9O1xyXG4gICAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgcGFyYW1zLmNvbnRleHQuY29tcG9uZW50UGFyZW50LmRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29sRGVmLmZpZWxkID09IGZpZWxkLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4gPSBmaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGZpbHRlciBhcyBjb21wYXJlIGJ5IHRleHQvbnVtYmVyXHJcbiAgICAgICAgLy8gY29sLmZpbHRlclJlbmRlcmVyID0gQ29tcGFyZUZpbHRlclJlbmRlcmVyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2xzLnB1c2goY29sKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOb3cgd2UgbmVlZCB0byBzb3J0IHRoZSBjb2x1bW5zXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeS5maWVsZHNbMF0uaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5T3JkZXJcIikpIHtcclxuICAgICAgLy8gZGVmYXVsdCBjYXNlLCBubyBkaXNwbGF5T3JkZXJcclxuICAgICAgY29scyA9IGNvbHMuc29ydChcclxuICAgICAgICAoYSwgYikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFhLmhlYWRlck5hbWUgJiYgYi5oZWFkZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICghYi5oZWFkZXJOYW1lICYmIGEuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEuZGljdGlvbmFyeURpc3BsYXkgPT09IHRydWUgJiYgYi5kaWN0aW9uYXJ5RGlzcGxheSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChiLmRpY3Rpb25hcnlEaXNwbGF5ID09PSB0cnVlICYmIGEuZGljdGlvbmFyeURpc3BsYXkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRpY3Rpb25hcnlUb29sdGlwID09PSB0cnVlICYmIGIuZGljdGlvbmFyeVRvb2x0aXAgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYi5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gdHJ1ZSAmJiBhLmRpY3Rpb25hcnlUb29sdGlwID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBEaXNwbGF5T3JkZXIgY2FzZVxyXG4gICAgICAvLyBJIHRoaW5rIHRoaXMgd29ya3M/IENoZWNrIGxhdGVyXHJcbiAgICAgIGNvbHMgPSBjb2xzLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmICghYS5oZWFkZXJOYW1lICYmIGIuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWIuaGVhZGVyTmFtZSAmJiBhLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGEuZGlzcGxheU9yZGVyIC0gYi5kaXNwbGF5T3JkZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFmdGVyIENvbHVtbnMgSGF2ZSBCZWVuIFNvcnRlZFxyXG4gICAgLy8gRGljdGlvbmFyeSBHcmlkIFdpbGwgU29ydCBUaGUgR3JpZCBBc2NlbmRpbmcgT3JkZXIgQnkgRmlyc3QgQ29sdW1uXHJcbiAgICBpZihjb2xzICAmJiBjb2xzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIGNvbHNbMF0uc29ydCA9IFwiYXNjXCI7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IGNvbHM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFDb2x1bW5zKSAmJiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldENvbHVtbkRlZnModGhpcy5kYXRhQ29sdW1ucyk7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmhhbGZMb2FkZWQpIHtcclxuICAgICAgaWYgKHRoaXMuY2FsbFF1ZXVlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIC8vIEEgY2FsbCBjb21wbGV0ZWQgd2hpbGUgYW5vdGhlciBjYWxsIHdhcyBxdWV1ZWQgc28gbWFrZSB0aGF0IGNhbGwgbm93XHJcbiAgICAgICAgdGhpcy5jYWxsUXVldWVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5QmVnaW4odGhpcy5jbGFzc05hbWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhhbGZMb2FkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNFZGl0YWJsZShwYXJhbXMpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgaXNFZGl0YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICBsZXQgY29sdW1uOiBhbnkgPSB7fTtcclxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgaWYgKHBhcmFtcy5jb2xEZWYuZmllbGQgPT0gZmllbGQubmFtZSkge1xyXG4gICAgICAgIGNvbHVtbiA9IGZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm5ldyBlZGl0YWJsZT9cIik7XHJcbiAgICAgIGlzRWRpdGFibGUgPSAhKHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImVkaXQgZWRpdGFibGU/XCIpO1xyXG4gICAgICBpc0VkaXRhYmxlID0gISh0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIgfHwgY29sdW1uLmNyZWF0ZU9ubHkgfHxcclxuICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJDcmVhdGUgT25seVwiIHx8IGNvbHVtbi5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFZGl0YWJsZTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZURpY3Rpb25hcnlFbnRyaWVzKCk6IHZvaWQge1xyXG5cclxuICAgIGxldCBkZWxldGVSb3dzOiBhbnlbXSA9IHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmdldFNlbGVjdGVkUm93cygpO1xyXG5cclxuICAgIGZvciAobGV0IGRlbGV0ZUlkIG9mIHRoaXMuc2VsZWN0ZWRSb3dzKSB7XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuZGljdGlvbmFyeUVudHJpZXMpIHtcclxuICAgICAgICBpZiAoZW50cnlbdGhpcy5pZENvbHVtbl0gPT09IGRlbGV0ZUlkKSB7XHJcbiAgICAgICAgICBkZWxldGVSb3dzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5kZWxldGVEaWN0aW9uYXJ5RW50cmllcyh0aGlzLmNsYXNzTmFtZSwgZGVsZXRlUm93cykuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0RGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZURpY3Rpb25hcnkoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIC8vIEltcG9ydGFudCB0byBub3RlIHRoaXMgd2lsbCBub3QgdXBkYXRlIGNlbGxzIHRvIHRoZSBkZW1vIGJ1dCB3aWxsIHdoZW4gaW1wb3J0ZWQgdG8gQ09SRSBvciBvdGhlciBhcHBsaWNhdGlvbnMuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLnVwZGF0ZURpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lLCBbZXZlbnQuZGF0YV0pLnN1YnNjcmliZShcclxuICAgICAgKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VsZWN0ZWRFbnRyaWVzKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICBuZXdSb3dQb3N0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuYWRkRGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUsIFtkYXRhXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKFxyXG4gICAgICAgICAgKGRhdGE6IE9iamVjdFtdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDxhbnk+ZGF0YVswXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgb25TYW1wbGVzR3JpZFJlYWR5KGV2ZW50OiBHcmlkUmVhZHlFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIGV2ZW50LmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG9uR3JpZFNpemVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuYXBpKSB7XHJcbiAgICAgIGV2ZW50LmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpc2FibGVBZGRSb3coKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRpY3Rpb25hcnkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSAmJiB0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgPT09IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpc2FibGVEZWxldGUoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRpY3Rpb25hcnkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSAmJiB0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5hcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmdldFNlbGVjdGVkUm93cygpLmxlbmd0aCA9PT0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21ib0ZpbHRlclZhbHVlR2V0dGVyKHBhcmFtcyk6IGFueSB7XHJcblxyXG4gICAgbGV0IHZhbHVlID0gcGFyYW1zLmRhdGFbcGFyYW1zLmNvbERlZi5maWVsZF07XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGxldCBvcHRpb24gPSAoKHBhcmFtcy5jb2xEZWYgYXMgYW55KS5zZWxlY3RPcHRpb25zIGFzIGFueVtdKS5maW5kKChlbnRyeSkgPT4gKGVudHJ5W3BhcmFtcy5jb2xEZWYuc2VsZWN0T3B0aW9uc1ZhbHVlRmllbGRdID09PSB2YWx1ZSkpO1xyXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3BhcmFtcy5jb2xEZWYuc2VsZWN0T3B0aW9uc0Rpc3BsYXlGaWVsZF0gOiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0FkZFJvdygpIHtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTmV3Um93Q29tcG9uZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgc2l6ZTogXCJsZ1wiLFxyXG4gICAgICAgIGtleWJvYXJkOiBmYWxzZSxcclxuICAgICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb2xEZWZzID0gdGhpcy5kYXRhQ29sdW1ucztcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnk7XHJcblxyXG4gICAgLy8gaWYgKCF0aGlzLm5ld1Jvd1N1YnNjcmlwdGlvbikgeyAvLyByZW1vdmVkIGJlY2F1c2UgaXQgd2FzIHByZXZlbnRpbmcgc2F2ZSBhZnRlciBjYW5jZWxcclxuICAgICAgLy8gdGVsbCBvdGhlciBhZy1ncmlkIHRvIGFkZCByb3cgdG8gaXRcclxuICAgICAgdGhpcy5uZXdSb3dTdWJzY3JpcHRpb24gPSBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5uZXdSb3dTdWJqZWN0LnN1YnNjcmliZShcclxuICAgICAgICAodGhlTmV3Um93OiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5RW50cmllcyA9IHRoZU5ld1Jvdy5jb25jYXQodGhpcy5kaWN0aW9uYXJ5RW50cmllcyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKHRoaXMuZGljdGlvbmFyeUVudHJpZXMpO1xyXG4gICAgICAgICAgdGhpcy5uZXdSb3dTdWJzY3JpcHRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICAgIC8vIEltcG9ydGFudCB0byBub3RlIHRoaXMgd2lsbCBub3QgYWRkIHJvd3MgdG8gdGhlIGRlbW8gYnV0IHdpbGwgd2hlbiBpbXBvcnRlZCB0byBDT1JFIG9yIG90aGVyIGFwcGxpY2F0aW9ucy5cclxuICAgICAgICAgIHRoaXMubmV3Um93UG9zdCh0aGVOZXdSb3dbMF0pLnN1YnNjcmliZShcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wYXJhdGVyIFRvIENvbXBhcmUgMiBEYXRlc1xyXG4gICAqIEBwYXJhbSBkYXRlMSBEYXRlIDFcclxuICAgKiBAcGFyYW0gZGF0ZTIgRGF0ZSAyXHJcbiAgICovXHJcbiAgZGF0ZUNvbXBhcmF0b3IoZGF0ZTEsIGRhdGUyKSB7XHJcblxyXG4gICAgbGV0IGRhdGUxTnVtYmVyID0gbW9udGhUb0NvbXBhcmFibGVOdW1iZXIoZGF0ZTEpO1xyXG4gICAgbGV0IGRhdGUyTnVtYmVyID0gbW9udGhUb0NvbXBhcmFibGVOdW1iZXIoZGF0ZTIpO1xyXG5cclxuICAgIGlmIChkYXRlMU51bWJlciA9PT0gbnVsbCAmJiBkYXRlMk51bWJlciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0ZTFOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlMk51bWJlciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZTFOdW1iZXIgLSBkYXRlMk51bWJlcjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBEYXRlIEFuZCBUdXJuIFRvIEEgTnVtZXJpY2FsIFZhbHVlIEZvciBDb21wYXJpbmcgUHVycG9zZXNcclxuICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gY29tcGFyYWJsZSBudW1iZXJcclxuICovXHJcbmZ1bmN0aW9uIG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUpIHtcclxuXHJcbiAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsIHx8IGRhdGUubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBsZXQgeWVhck51bWJlciA9IGRhdGUuc3Vic3RyaW5nKDAsIDQpO1xyXG4gIGxldCBtb250aE51bWJlciA9IGRhdGUuc3Vic3RyaW5nKDUsIDcpO1xyXG4gIGxldCBkYXlOdW1iZXIgPSBkYXRlLnN1YnN0cmluZyg4LCAxMCk7XHJcblxyXG4gIHJldHVybiB5ZWFyTnVtYmVyICogMTAwMDAgKyBtb250aE51bWJlciAqIDEwMCArIGRheU51bWJlcjtcclxufVxyXG4iXX0=