fantasy-ngzorro 2.1.19 → 2.1.21

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.
@@ -72,6 +72,14 @@ export class HdTableComponent {
72
72
  * 自动测量前的兜底行高,测量完成后会更新
73
73
  */
74
74
  this.measuredVirtualItemSize = 47;
75
+ /**
76
+ * 记录当前是否处于虚拟滚动模式,用于切换 pageSize 时重建表格
77
+ */
78
+ this.virtualScrollActive = null;
79
+ /**
80
+ * 可见列总宽,用于判断是否需要横向滚动
81
+ */
82
+ this.tableColWidthTotal = 0;
75
83
  this.trackByRow = (/**
76
84
  * @param {?} index
77
85
  * @param {?} data
@@ -207,8 +215,7 @@ export class HdTableComponent {
207
215
  changes["tableData"]["currentValue"]["pageNumber"] !==
208
216
  changes["tableData"]["previousValue"]["pageNumber"]) {
209
217
  if (this.virtualScroll) {
210
- this.dealScroll();
211
- this.refreshVirtualScrollViewport(true);
218
+ this.applyTableScrollMode(true);
212
219
  }
213
220
  return;
214
221
  }
@@ -217,8 +224,7 @@ export class HdTableComponent {
217
224
  }
218
225
  }
219
226
  if (changes["tableData"] && this.virtualScroll) {
220
- this.dealScroll();
221
- this.refreshVirtualScrollViewport(true);
227
+ this.applyTableScrollMode(true);
222
228
  }
223
229
  if (changes["tableCols"] &&
224
230
  JSON.stringify(changes["tableCols"].currentValue) !==
@@ -371,11 +377,60 @@ export class HdTableComponent {
371
377
  if (this.judgeRepeatCols()) {
372
378
  this.dealCols();
373
379
  this.setCols();
374
- this.dealScroll();
375
380
  this.dealOperateBtn();
376
- this.showTable = true;
381
+ this.virtualScrollActive = null;
382
+ this.applyTableScrollMode(true);
383
+ }
384
+ }
385
+ /**
386
+ * 虚拟/普通模式切换时重建表格,避免残留滚动容器
387
+ * @param {?=} forceRemount
388
+ * @return {?}
389
+ */
390
+ applyTableScrollMode(forceRemount = false) {
391
+ /** @type {?} */
392
+ const useVirtual = this.useVirtualScroll;
393
+ /** @type {?} */
394
+ const modeChanged = this.virtualScrollActive !== null &&
395
+ this.virtualScrollActive !== useVirtual;
396
+ this.virtualScrollActive = useVirtual;
397
+ if (forceRemount || modeChanged) {
398
+ this.showTable = false;
377
399
  this.cdr.markForCheck();
400
+ setTimeout((/**
401
+ * @return {?}
402
+ */
403
+ () => {
404
+ this.showTable = true;
405
+ this.cdr.markForCheck();
406
+ setTimeout((/**
407
+ * @return {?}
408
+ */
409
+ () => {
410
+ this.dealScroll();
411
+ this.cdr.markForCheck();
412
+ this.afterTableRender(useVirtual);
413
+ }));
414
+ }));
415
+ return;
416
+ }
417
+ this.dealScroll();
418
+ this.cdr.markForCheck();
419
+ this.afterTableRender(useVirtual);
420
+ }
421
+ /**
422
+ * @private
423
+ * @param {?} useVirtual
424
+ * @return {?}
425
+ */
426
+ afterTableRender(useVirtual) {
427
+ if (useVirtual) {
378
428
  this.refreshVirtualScrollViewport(true);
429
+ return;
430
+ }
431
+ if (this.virtualScroll) {
432
+ this.measureVirtualItemSize(true);
433
+ this.syncHorizontalScroll();
379
434
  }
380
435
  }
381
436
  /**
@@ -926,6 +981,70 @@ export class HdTableComponent {
926
981
  getVirtualScrollY(maxOffset) {
927
982
  return `calc(100vh - ${maxOffset}px)`;
928
983
  }
984
+ /**
985
+ * @private
986
+ * @return {?}
987
+ */
988
+ getTableViewportWidth() {
989
+ if (!this.nzTableComponent || !this.nzTableComponent.tableMainElement) {
990
+ return 0;
991
+ }
992
+ /** @type {?} */
993
+ const tableMain = (/** @type {?} */ (this.nzTableComponent.tableMainElement
994
+ .nativeElement));
995
+ /** @type {?} */
996
+ const wrapper = (/** @type {?} */ (tableMain.closest(".ant-table-wrapper")));
997
+ if (wrapper && wrapper.clientWidth > 0) {
998
+ return wrapper.clientWidth;
999
+ }
1000
+ /** @type {?} */
1001
+ const host = (/** @type {?} */ (tableMain.closest(".hd-table-container")));
1002
+ if (host && host.clientWidth > 0) {
1003
+ return host.clientWidth;
1004
+ }
1005
+ return 0;
1006
+ }
1007
+ /**
1008
+ * 列总宽超出外层容器才启用横向 scroll(不能用 table 自身宽度,会被 scroll.x 撑宽)
1009
+ * @private
1010
+ * @param {?} colWidth
1011
+ * @param {?} useVirtual
1012
+ * @return {?}
1013
+ */
1014
+ resolveScrollX(colWidth, useVirtual) {
1015
+ if (colWidth <= 0) {
1016
+ return useVirtual ? "1px" : null;
1017
+ }
1018
+ if (useVirtual) {
1019
+ return `${colWidth}px`;
1020
+ }
1021
+ /** @type {?} */
1022
+ const viewportWidth = this.getTableViewportWidth();
1023
+ if (viewportWidth > 0) {
1024
+ return colWidth > viewportWidth ? `${colWidth}px` : null;
1025
+ }
1026
+ if (typeof window !== "undefined" && colWidth > window.innerWidth - 32) {
1027
+ return `${colWidth}px`;
1028
+ }
1029
+ return null;
1030
+ }
1031
+ /**
1032
+ * 表格渲染后按实际容器宽度校正横向 scroll
1033
+ * @private
1034
+ * @return {?}
1035
+ */
1036
+ syncHorizontalScroll() {
1037
+ if (!this.virtualScroll || this.useVirtualScroll) {
1038
+ return;
1039
+ }
1040
+ /** @type {?} */
1041
+ const scrollX = this.resolveScrollX(this.tableColWidthTotal, false);
1042
+ if (this.scroll && this.scroll.x === scrollX && this.scroll.y === null) {
1043
+ return;
1044
+ }
1045
+ this.scroll = { x: scrollX, y: null };
1046
+ this.cdr.markForCheck();
1047
+ }
929
1048
  /**
930
1049
  * @return {?}
931
1050
  */
@@ -948,26 +1067,28 @@ export class HdTableComponent {
948
1067
  colWidth += item.width;
949
1068
  }
950
1069
  }));
1070
+ this.tableColWidthTotal = colWidth;
951
1071
  /** @type {?} */
952
1072
  const maxOffset = this.tableTotal ? 180 : 140;
953
1073
  /** @type {?} */
954
1074
  const useVirtual = this.useVirtualScroll;
955
- /** @type {?} */
956
- let scrollY;
957
- if (!this.virtualScroll) {
958
- scrollY = `calc(100vh - ${maxOffset}px)`;
959
- }
960
- else if (useVirtual) {
961
- scrollY = this.getVirtualScrollY(maxOffset);
1075
+ if (this.virtualScroll && !useVirtual) {
1076
+ this.scroll = {
1077
+ x: this.resolveScrollX(colWidth, false),
1078
+ y: null,
1079
+ };
1080
+ return;
962
1081
  }
963
- else {
964
- scrollY = null;
1082
+ if (!this.virtualScroll) {
1083
+ this.scroll = {
1084
+ x: "1px",
1085
+ y: `calc(100vh - ${maxOffset}px)`,
1086
+ };
1087
+ return;
965
1088
  }
966
- /** @type {?} */
967
- const scrollX = useVirtual && colWidth > 0 ? `${colWidth}px` : "1px";
968
1089
  this.scroll = {
969
- x: scrollX,
970
- y: scrollY,
1090
+ x: this.resolveScrollX(colWidth, true),
1091
+ y: this.getVirtualScrollY(maxOffset),
971
1092
  };
972
1093
  }
973
1094
  // 表格勾选逻辑
@@ -1097,9 +1218,9 @@ export class HdTableComponent {
1097
1218
  HdTableComponent.decorators = [
1098
1219
  { type: Component, args: [{
1099
1220
  selector: "hd-table",
1100
- template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <hd-button type=\"primary\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\" (clickAction)=\"confirmDropdown()\"\n [nzVisible]=\"isDropdownVisible\">\u8BBE\u7F6E\u5217</hd-button>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div style=\"max-height: 400px;overflow-y: scroll;\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div style=\"text-align: right;background: #fff;padding: 4px;\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </nz-dropdown-menu>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [nzScroll]=\"scroll\" nzShowSizeChanger\n nzShowSizeChanger nzShowQuickJumper nzFrontPagination=\"false\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"tableData.totalElements\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\" (nzPageSizeChange)=\"search(true)\"\n (nzPageIndexChange)=\"search(false)\" (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\" [nzVirtualScroll]=\"useVirtualScroll\" [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\"\n [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\">\n {{ col.title }}\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <tfoot *ngIf=\"showTableTotal\">\n <tr class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let tableTotalOption of tableTotalOptionList\">\n <td>{{ tableTotalOption }}</td>\n </ng-container>\n </tr>\n </tfoot>\n <ng-template #tableTotalTemplate>\n \u5171 {{tableData.totalElements}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [nzChecked]=\"mapOfCheckedId[data[selectField]]\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ btn.name }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + btn.name + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n btn.name }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">{{ cell.display }}</ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click;else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a [attr.title]=\"cell.title\"\n [ngStyle]=\"{'color': cell.isEmpty ? '#2A3634' : (col?.color ? col.color : null)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span [attr.title]=\"cell.title\" [ngStyle]=\"{'color': col?.color ? col.color : null}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
1221
+ template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <hd-button type=\"primary\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\" (clickAction)=\"confirmDropdown()\"\n [nzVisible]=\"isDropdownVisible\">\u8BBE\u7F6E\u5217</hd-button>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div style=\"max-height: 400px;overflow-y: scroll;\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div style=\"text-align: right;background: #fff;padding: 4px;\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </nz-dropdown-menu>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\" [nzScroll]=\"scroll\"\n nzShowSizeChanger nzShowQuickJumper nzFrontPagination=\"false\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"tableData.totalElements\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\" (nzPageSizeChange)=\"search(true)\"\n (nzPageIndexChange)=\"search(false)\" (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\" [nzVirtualScroll]=\"useVirtualScroll\" [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\"\n [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\">\n {{ col.title }}\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <tfoot *ngIf=\"showTableTotal\">\n <tr class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let tableTotalOption of tableTotalOptionList\">\n <td>{{ tableTotalOption }}</td>\n </ng-container>\n </tr>\n </tfoot>\n <ng-template #tableTotalTemplate>\n \u5171 {{tableData.totalElements}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [nzChecked]=\"mapOfCheckedId[data[selectField]]\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ btn.name }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + btn.name + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n btn.name }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" nz-tooltip [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click;else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" nz-tooltip [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': cell.isEmpty ? '#2A3634' : (col?.color ? col.color : null)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': cell.isEmpty ? '#2A3634' : (col?.color ? col.color : null)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" nz-tooltip [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': col?.color ? col.color : null}\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': col?.color ? col.color : null}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
1101
1222
  changeDetection: ChangeDetectionStrategy.OnPush,
1102
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .hd-table-total>td{border:0!important}.hd-table-container ::ng-deep cdk-virtual-scroll-viewport.ant-table-body .hd-table-virtual-row>td{box-sizing:border-box}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}"]
1223
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .hd-table-total>td{border:0!important}.hd-table-container ::ng-deep cdk-virtual-scroll-viewport.ant-table-body .hd-table-virtual-row>td{box-sizing:border-box}.hd-table-container:not(.hd-table--virtual) ::ng-deep .ant-table-body{max-height:none!important;overflow-y:visible!important}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}"]
1103
1224
  }] }
1104
1225
  ];
1105
1226
  /** @nocollapse */
@@ -1259,6 +1380,18 @@ if (false) {
1259
1380
  * @type {?}
1260
1381
  */
1261
1382
  HdTableComponent.prototype.measuredVirtualItemSize;
1383
+ /**
1384
+ * 记录当前是否处于虚拟滚动模式,用于切换 pageSize 时重建表格
1385
+ * @type {?}
1386
+ * @private
1387
+ */
1388
+ HdTableComponent.prototype.virtualScrollActive;
1389
+ /**
1390
+ * 可见列总宽,用于判断是否需要横向滚动
1391
+ * @type {?}
1392
+ * @private
1393
+ */
1394
+ HdTableComponent.prototype.tableColWidthTotal;
1262
1395
  /** @type {?} */
1263
1396
  HdTableComponent.prototype.nzTableComponent;
1264
1397
  /** @type {?} */
@@ -1283,4 +1416,4 @@ if (false) {
1283
1416
  */
1284
1417
  HdTableComponent.prototype.commonSessionService;
1285
1418
  }
1286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxZQUFZLEdBR2IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7QUFPNUIsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7SUF3RTNCLFlBQ1UsR0FBc0IsRUFDdEIsb0JBQTBDO1FBRDFDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUF4RTNDLGNBQVMsR0FBeUIsRUFBRSxDQUFDO1FBRXJCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUMxQyxrQkFBYSxHQUFZLElBQUksQ0FB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cEMsZ0RBQXlEOztJQUN6RCwrQ0FBd0Q7O0lBQ3hELG9EQUE2RDs7SUFDN0Qsc0NBQTRFOztJQUM1RSwyQ0FDa0M7O0lBQ2xDLDRDQUNtQzs7SUFDbkMsa0NBQWM7O0lBR2QsbURBQWdDOztJQUNoQywyQ0FBd0I7O0lBQ3hCLDZDQUF1Qjs7SUFDdkIseUNBQW1COztJQUNuQiwyQ0FBZ0Q7O0lBQ2hELDBDQUFnRDs7SUFDaEQsMENBQTRDOztJQUU1QyxnREFBMEI7O0lBRTFCLDRDQUE0RDs7SUFDNUQsdUNBQWlCOztJQUVqQiwwQ0FBMEM7O0lBQzFDLHFDQUEyQjs7SUFDM0IsOENBQXlDOztJQUN6QyxtREFBOEM7O0lBQzlDLHlDQUErQjs7SUFFL0IsNkNBQW1DOztJQUVuQyx3Q0FBbUM7O0lBRW5DLHlDQUFvQzs7SUFHcEMsOENBQXlDOztJQUN6QywrQ0FBMEM7O0lBQzFDLHNDQUE0Qjs7SUFDNUIsdUNBQXdCOztJQUN4Qix3Q0FBMEI7O0lBQzFCLG1EQUF3Qzs7SUFDeEMsa0RBQXdDOzs7OztJQUd4QyxtREFBNkI7O0lBRTdCLDRDQUE0RTs7SUF1SjVFLHNDQUdFOzs7OztJQUdGLDZDQUFxRDs7SUFFckQsc0NBRUU7O0lBdU9GLHNDQWdDRTs7Ozs7SUFyYUEsK0JBQThCOzs7OztJQUM5QixnREFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTnpUYWJsZUNvbXBvbmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3RhYmxlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgQ29sV2lkdGggfSBmcm9tIFwiLi4vbW9kZWwvY29sV2lkdGhcIjtcbmltcG9ydCB7IFBhZ2UgfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvY29tbW9uLXNlc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgSGRUYWJsZUNvbHVtbixcbiAgSGRUYWJsZVRvdGFsT3B0aW9uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgdGFibGVDb2xzOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBASW5wdXQoKSB0YWJsZURhdGE6IFBhZ2U8YW55PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd09wZXJhdGVDb2xXYXJwQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PEhkVGFibGVUb3RhbE9wdGlvbj47XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHRhYmxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDooajmoLzliIbpobXlj4LmlbBcbiAgQElucHV0KCkgdGFibGVQYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHRhYmxlUGFnZVNpemU6IG51bWJlciA9IDEwMDtcbiAgQElucHV0KCkgaXNGaXJzdEVudHJ5U2VhcmNoOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0Nyb3NzUGFnZVNlbGVjdDogYm9vbGVhbjtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlVG90YWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlVG90YWw6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZUxlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlTGVmdEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlUmlnaHRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlUmlnaHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIHNjcm9sbCA9IG51bGw7XG5cbiAgLy8g6KGo5qC85Yu+6YCJ5Y+C5pWwXG4gIGlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gIGlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICBsaXN0T2ZEaXNwbGF5RGF0YSA9IFtdO1xuICBsaXN0T2ZBbGxEYXRhID0gW107XG4gIGxpc3RPZlNlbGVjdGlvbjogQXJyYXk8YW55PiB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBtYXBPZkNoZWNrZWRJZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgbWFwT2ZDaGVja0xpc3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgLy8g5ZCI6K6h5Y+C5pWwXG4gIHRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gIC8vIOe8k+WtmOS/oeaBr1xuICB0YWJsZUNhY2hlT3B0aW9uOiBUYWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgdXNlclNlc3Npb246IGFueTtcblxuICB0YWJsZUNvbHNDYWNoZTogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgc2hvd1RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdENvbExpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNlbGVjdENvbExpc3ROb2Rlc0NhY2hlOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOiuvue9ruWIl+eahOWPr+ingeaTjeS9nOaVsOe7hFxuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAvLyDorr7nva7liJfnmoTkuI3lj6/op4Hmk43kvZzmlbDnu4RcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG5cbiAgLy8g54K55Ye75pe26ZyA6KaB5pyJ5Li05pe25pWw57uE5a2Y5pS+5Lik5LiqdHJlZSznlKjkuo7lj5bmtojml7blgJnmgaLlpI3osIPmlbTliY3nmoTnirbmgIFcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbG9jYWxmb3JhZ2U6IGFueSA9IG51bGw7XG4gIGxvY2FsdGlvblRtcDogc3RyaW5nID0gXCJcIjtcbiAgaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBpc0Nyb3NzUGFnZVNlbGVjdExvY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIOiHquWKqOa1i+mHj+WJjeeahOWFnOW6leihjOmrmO+8jOa1i+mHj+WujOaIkOWQjuS8muabtOaWsCAqL1xuICBtZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IDQ3O1xuXG4gIEBWaWV3Q2hpbGQoXCJoZFRhYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNvbW1vblNlc3Npb25TZXJ2aWNlOiBDb21tb25TZXNzaW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZSA9IGxvY2FsZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIGRyaXZlcjogbG9jYWxmb3JhZ2UuSU5ERVhFRERCLFxuICAgICAgbmFtZTogXCJoZC1mc2NtXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWQjeensFxuICAgICAgdmVyc2lvbjogMS4wLCAvLyDorr7nva7lrZjlgqjlupPnmoTniYjmnKxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWtmOWCqOepuumXtOWQjeensFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Nyb3NzUGFnZVNlbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsID0gdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdDtcbiAgICB9XG4gICAgdGhpcy5sb2NhbHRpb25UbXAgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodGhpcy5sb2NhbHRpb25UbXApIHtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wID0gdGhpcy5sb2NhbHRpb25UbXAucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbiAgICB9XG4gICAgdGhpcy51c2VyU2Vzc2lvbiA9IHRoaXMuY29tbW9uU2Vzc2lvblNlcnZpY2UuZ2V0U2Vzc2lvbihcbiAgICAgIFwiX19qeV9hdXRob3JpemF0aW9uX3Nlc3Npb25fX1wiLFxuICAgICk7XG4gICAgLy8g55So5LqO5byA5Y+R546v5aKD6LCD6K+VXG4gICAgaWYgKCF0aGlzLnVzZXJTZXNzaW9uKSB7XG4gICAgICB0aGlzLnVzZXJTZXNzaW9uID0ge1xuICAgICAgICB1c2VyQ29kZTogXCJkZXZcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLnJlYWR5KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAxXCIsIGUpO1xuICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZSkge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VTaXplXCJdIHx8XG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlTnVtYmVyXCJdICE9PVxuICAgICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdW1wicGFnZU51bWJlclwiXVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmIHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUpICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgICAucmVhZHkoKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAyXCIsIGUpO1xuICAgICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0RldGFpbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZXRhaWwgPSAhdGhpcy5zaG93RGV0YWlsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxJdGVtU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15pWw5o2u6IO95a6M5pW05bGV56S65pe25LiN5ZCv55So6Jma5ouf5rua5Yqo77yM6YG/5YWN5bCR6YeP5pWw5o2u5Lmf5Ye6546w5rua5Yqo5p2hICovXG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJvd0NvdW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnRcbiAgICAgICAgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aFxuICAgICAgICA6IDA7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHJvd0NvdW50ICogdGhpcy5lZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemU7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtYXhPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiByb3dDb3VudCA+IDEwMDtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPiAxMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplO1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluaXRUYWJsZSgpIHtcbiAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy51dWlkKSB7XG4gICAgICB0aHJvdyBcImhkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaAp1wiO1xuICAgIH1cbiAgICBpZiAodGhpcy5qdWRnZVJlcGVhdENvbHMoKSkge1xuICAgICAgdGhpcy5kZWFsQ29scygpO1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgIHRoaXMuZGVhbE9wZXJhdGVCdG4oKTtcbiAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoZm9yY2VNZWFzdXJlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKGZvcmNlTWVhc3VyZSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICBpZiAobWVhc3VyZWQpIHtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiog5pyq5omL5Yqo5LygIHZpcnR1YWxJdGVtU2l6ZSDml7bvvIzku47lt7LmuLLmn5PooYzmtYvph4/nnJ/lrp7pq5jluqYgKi9cbiAgbWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJlxuICAgICAgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwICYmXG4gICAgICAhZm9yY2VcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgY29uc3QgdGFibGVCb2R5ID0gdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmXG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQudGFibGVCb2R5TmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByb3cgPVxuICAgICAgKHZpZXdwb3J0ICYmXG4gICAgICAgICgodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwidHIuaGQtdGFibGUtdmlydHVhbC1yb3dcIixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudCkpIHx8XG4gICAgICAodGFibGVCb2R5ICYmICh0YWJsZUJvZHkucXVlcnlTZWxlY3RvcihcInRib2R5IHRyXCIpIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgaWYgKCFyb3cgfHwgcm93Lm9mZnNldEhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhlaWdodCA9IHJvdy5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKGhlaWdodCA9PT0gdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gaGVpZ2h0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8g6K6+572u5YiX54K55Ye75Y+W5raIXG4gIGNhbmNlbERyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsSGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMubm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g54K55Ye76Kem5Y+R6K6+572u5YiXXG4gIGNvbmZpcm1Ecm9wZG93bigpOiB2b2lkIHtcbiAgICAvLyDkuLTml7blrZjmlL7kuIvvvIzlj5bmtojnmoTml7blgJnmgaLlpI3ljp/mnaXnmoTnirbmgIEgICDmt7Hmi7fotJ3kuIvlr7nosaHmlbDnu4RcbiAgICB0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc3VibWl0R3JpZHMoKSB7XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgPSBbXTtcbiAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5wdXNoKGl0ZW0udGl0bGUpO1xuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOS7jue8k+WtmOiuvue9ruWIl1xuICBzZXRDb2xzKCkge1xuICAgIHRoaXMuc2hvd0xpc3ROb2RlcyA9IGZhbHNlO1xuICAgIHRoaXMubm93TGlzdE5vZGVzID0gW107XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gW107XG4gICAgaWYgKHRoaXMuaGFzQ29sc0NhY2hlKCkpIHtcbiAgICAgIGxldCB7IG5vdEluY29scywgaW5jb2xzIH0gPSB0aGlzLnRhYmxlQ29sc0NhY2hlLnJlZHVjZShcbiAgICAgICAgKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICAgICAgYWNjLmluY29scy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Mubm90SW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHsgbm90SW5jb2xzOiBbXSwgaW5jb2xzOiBbXSB9LFxuICAgICAgKTtcbiAgICAgIGluY29scy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5kZXhPZihhLnRpdGxlKSAtXG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5kZXhPZihiLnRpdGxlKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ29scyA9IGluY29scy5jb25jYXQobm90SW5jb2xzKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQ29sc0NhY2hlKCkpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50LmlzU2hvdykge1xuICAgICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgIGNoZWNrZWQ6IHRydWUsXG4gICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g6LCD5pW05YiX5a695Li657yT5a2Y5a695bqmXG4gICAgaWYgKFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNpemUgIT09IDBcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5oYXMoY29sLnRpdGxlKSkge1xuICAgICAgICAgIGNvbC53aWR0aCA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuZ2V0KGNvbC50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0xpc3ROb2RlcyA9IHRydWU7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyDmi5bmi73mk43kvZxcbiAgYmVmb3JlRHJvcCA9IChhcmc6IE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50KTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKFxuICAgICAgYXJnLm5vZGUub3JpZ2luLmRpc2FibGVkIHx8XG4gICAgICAhYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkIHx8XG4gICAgICBhcmcucG9zID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uY2hlY2tlZDtcbiAgICAgIG5vZGUuZGlzYWJsZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmRpc2FibGVkO1xuICAgICAgbm9kZS5leHBhbmRlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZXhwYW5kZWQ7XG4gICAgICBub2RlLmlzTGVhZiA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uaXNMZWFmO1xuICAgICAgbm9kZS5rZXkgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmtleTtcbiAgICAgIG5vZGUuc2VsZWN0YWJsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uc2VsZWN0YWJsZTtcbiAgICAgIG5vZGUudGl0bGUgPSBhcmcuZHJhZ05vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgLy8g5ouW5ou95YWD57Sg5LiL5qCHXG4gICAgICBsZXQgZHJhZ05vZGVJbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PSBhcmcuZHJhZ05vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgICAvLyDnm67moIfkvY3nva7nmoTkuIvmoIdcbiAgICAgIGxldCBub2RlSW5kZXggPVxuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PSBhcmcubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAgIH0pICsgKGFyZy5wb3MgPT09IC0xID8gMCA6IGFyZy5wb3MpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKG5vZGVJbmRleCwgMCwgbm9kZSk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5zcGxpY2UoXG4gICAgICAgIG5vZGVJbmRleCA+PSBkcmFnTm9kZUluZGV4ID8gZHJhZ05vZGVJbmRleCA6IGRyYWdOb2RlSW5kZXggKyAxLFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBvZih0cnVlKS5waXBlKGRlbGF5KDEwMCkpO1xuICAgIH1cbiAgfTtcblxuICBtb3ZlRWxlbWVudE5lYXJieShhcnIsIGVsZW1lbnRUb01vdmVUaXRsZSwgdGFyZ2V0RWxlbWVudFRpdGxlLCBwb3MpIHtcbiAgICBjb25zdCB0bXBBcnJheSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50aXRsZSA9PT0gdGFyZ2V0RWxlbWVudFRpdGxlLFxuICAgICk7XG4gICAgY29uc3QgZWxlbWVudEluZGV4ID0gdG1wQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGl0bGUgPT09IGVsZW1lbnRUb01vdmVUaXRsZSxcbiAgICApO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gcG9zIDwgMCA/IHRhcmdldEluZGV4ICsgcG9zIDogdGFyZ2V0SW5kZXg7XG4gICAgLy8g56e76Zmk55uu5qCH5YWD57Sg77yM5bm25o+S5YWl5Yiw5paw55qE5L2N572uXG4gICAgY29uc3QgcmVtb3ZlZEVsZW1lbnQgPSB0bXBBcnJheS5zcGxpY2UoZWxlbWVudEluZGV4LCAxKTtcbiAgICB0bXBBcnJheS5zcGxpY2UobmV3SW5kZXggKyAxLCAwLCByZW1vdmVkRWxlbWVudFswXSk7XG4gICAgcmV0dXJuIHRtcEFycmF5O1xuICB9XG5cbiAgLy8g5Yu+6YCJ5pON5L2cXG4gIGNoZWNrQWN0aW9uKGV2ZW50OiBOekZvcm1hdEVtaXRFdmVudCk6IHZvaWQge1xuICAgIC8vIOWLvumAieWPquacieWcqGhpZGVMaXN0Tm9kZXMs5Y+W5raI5Yu+6YCJ5Y+q5pyJ5Zyobm93TGlzdE5vZGVzXG4gICAgaWYgKGV2ZW50Lm5vZGUub3JpZ2luLmNoZWNrZWQpIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZSA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgICAgbm9kZS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIC8vIOaJvuWIsOesrOS4gOS4qmZpeGVk5bGe5oCn5Li6cmlnaHTnmoR0aXRsZe+8jOaJvuWIsOaPkuWFpeWFg+e0oOeahOS9jee9rlxuICAgICAgbGV0IHRpdGxlID0gbnVsbDtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRhYmxlQ29sc0NhY2hlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ29sc0NhY2hlW2ldLmZpeGVkID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICB0aXRsZSA9IHRoaXMudGFibGVDb2xzQ2FjaGVbaV0udGl0bGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMubm93TGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoXG4gICAgICAgICAgKG5vZGUpID0+IG5vZGUudGl0bGUgPT09IHRpdGxlLFxuICAgICAgICApO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5zcGxpY2UoaW5kZXgsIDAsIG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmICh0aGlzLmhpZGVMaXN0Tm9kZXMubGVuZ3RoID09PSAwICYmIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scykge1xuICAgICAgLy8gICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmdldEhpZGVMaXN0Tm9kZXMoKTtcbiAgICAgIC8vIH1cbiAgICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGl0bGUgPT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgICAgICAgaW5uZXJJdGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKGlubmVySXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG5cbiAgICAgIC8vIOS4uuS6humYsuatouacqumAieaLqeeahOaVsOe7hOmhuuW6j+WboOS4unB1c2jmlrnms5XogIzmlLnlj5jvvIzpgJrov4fliJ3lp4vmlbDmja7ojrflj5bmmL7npLrnmoTlrZfmrrXliJfooahcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOmYsuatouacqumAieaLqeeahOaVsOe7hOmhuuW6j+WboOS4unB1c2jmlrnms5XogIzmlLnlj5jvvIzku47liJ3lp4vmlbDmja7ojrflj5bpmpDol4/mnKrmmL7npLrnmoTlrZfmrrXliJfooahcbiAgZ2V0SGlkZUxpc3ROb2RlcygpOiBBcnJheTxUcmVlR3JpZD4ge1xuICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdDogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gICAgLy8g5LuOdGFibGVDb2xzQ2FjaGXph4zpnaLmib7msqHmnInlnKhzdG9yYWdl6YeM6Z2i5Ye6546w55qE5a2X5q61LOe7hOaIkGhpZGVMaXN0XG4gICAgdGhpcy50YWJsZUNvbHNDYWNoZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGl0ZW0udGl0bGUpKSB7XG4gICAgICAgIGxldCBub2RlSXRlbTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgICAgbm9kZUl0ZW0udGl0bGUgPSBpdGVtLnRpdGxlO1xuICAgICAgICBub2RlSXRlbS5rZXkgPSBpdGVtLnRpdGxlO1xuICAgICAgICBub2RlSXRlbS5kaXNhYmxlZCA9IGl0ZW0uZml4ZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIG5vZGVJdGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChub2RlSXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlbXBvcmFyeU5vZGVMaXN0O1xuICB9XG5cbiAgZGVhbENvbHMoKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29sc1swXS5taW5XaWR0aCkge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgICBzcGFuLmlubmVyVGV4dCA9IGl0ZW0udGl0bGU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIGl0ZW0ubWluV2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgMTY7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIOWkhOeQhuW3puWPs+WQuOmZhOeahOaVsOaNruWcqOaVsOe7hOS4reeahOS9jee9rlxuICAgIGNvbnN0IGxlZnRGaXhlZENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoKGNvbCkgPT4gY29sLmZpeGVkID09PSBcImxlZnRcIik7XG4gICAgY29uc3QgcmlnaHRGaXhlZENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoXG4gICAgICAoY29sKSA9PiBjb2wuZml4ZWQgPT09IFwicmlnaHRcIixcbiAgICApO1xuICAgIGNvbnN0IG5vcm1hbENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5maXhlZCk7XG4gICAgY29uc3QgcmVzdWx0Q29scyA9IGxlZnRGaXhlZENvbHMuY29uY2F0KG5vcm1hbENvbHMpLmNvbmNhdChyaWdodEZpeGVkQ29scyk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSByZXN1bHRDb2xzO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNDYWNoZSB8fCB0aGlzLnRhYmxlQ29sc0NhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8g57yT5a2Y5LiA5LiL6KGo5qC855qE5pWw5o2uXG4gICAgICB0aGlzLnRhYmxlQ29sc0NhY2hlID0gWy4uLnRoaXMudGFibGVDb2xzXTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykge1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgfSBlbHNlIGlmICghKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgT2JqZWN0LmtleXModGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbFdpZHRocy5zZXQoa2V5LCAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBhcyBhbnkpW2tleV0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gY29sV2lkdGhzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMubGVuZ3RoID4gMCk7XG4gIH1cblxuICBzYXZlVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0oXG4gICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMudXVpZCxcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbixcbiAgICApO1xuICB9XG5cbiAganVkZ2VSZXBlYXRDb2xzKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ29sc1tpXS50aXRsZSA9PT0gdGhpcy50YWJsZUNvbHNbal0udGl0bGUpIHtcbiAgICAgICAgICB0aHJvdyBgaGQtdGFibGXnu4Tku7bkuK3liJflkI0gJHt0aGlzLnRhYmxlQ29sc1tpXS50aXRsZX0g6YeN5aSNYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uUmVzaXplKHsgd2lkdGggfTogTnpSZXNpemVFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgbGV0IHRlbXBXaWR0aCA9IDA7XG4gICAgaWYgKHdpZHRoID4gY29sLm1pbldpZHRoKSB7XG4gICAgICB0ZW1wV2lkdGggPSB3aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcFdpZHRoID0gY29sLm1pbldpZHRoO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNldChjb2wudGl0bGUsIHRlbXBXaWR0aCk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMudGFibGVDb2xzID0gdGhpcy50YWJsZUNvbHMubWFwKChlKSA9PlxuICAgICAgZS50aXRsZSA9PT0gY29sLnRpdGxlID8geyAuLi5lLCB3aWR0aDogdGVtcFdpZHRoIH0gOiBlLFxuICAgICk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBkZWFsT3BlcmF0ZUJ0bigpIHtcbiAgICBsZXQgb3BlcmF0ZUNvbCA9IHRoaXMudGFibGVDb2xzLmZpbmQoKGNvbCkgPT4gY29sLnRpdGxlID09PSBcIuaTjeS9nFwiKSB8fCBudWxsO1xuICAgIGlmIChvcGVyYXRlQ29sKSB7XG4gICAgICBsZXQgdGV4dFN0ciA9IFwiXCI7XG4gICAgICBvcGVyYXRlQ29sLmJ0bkxpc3QuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGlmICghYnRuLmlzUmVwZWF0KSB7XG4gICAgICAgICAgdGV4dFN0ciArPSBidG4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dFN0cjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICBvcGVyYXRlQ29sLndpZHRoID1cbiAgICAgICAgc3Bhbi5vZmZzZXRXaWR0aCArXG4gICAgICAgIChvcGVyYXRlQ29sLmJ0bkxpc3QuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1JlcGVhdCkubGVuZ3RoIC0gMSkgKiA0ICtcbiAgICAgICAgMTY7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBuZWVkU2hvd0NvbmZpcm0oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5zaG93Q29uZmlybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLnNob3dDb25maXJtKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFidG4uc2hvd0NvbmZpcm07XG4gIH1cblxuICAvKiog6Jma5ouf5rua5Yqo5byA5ZCv5pe25L2/55So6KeG5Y+j5pyA5aSn6auY5bqmICovXG4gIHByaXZhdGUgZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWA7XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgIGxldCBjb2xXaWR0aCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBjb2xXaWR0aCArPSA0MDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtLndpZHRoKSB7XG4gICAgICAgIGl0ZW0ud2lkdGggPSBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmlzU2hvdykge1xuICAgICAgICBpdGVtLmZpeGVkV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgY29sV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMudGFibGVUb3RhbCA/IDE4MCA6IDE0MDtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGxldCBzY3JvbGxZOiBzdHJpbmcgfCBudWxsO1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICBzY3JvbGxZID0gYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgO1xuICAgIH0gZWxzZSBpZiAodXNlVmlydHVhbCkge1xuICAgICAgc2Nyb2xsWSA9IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsWSA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbFggPVxuICAgICAgdXNlVmlydHVhbCAmJiBjb2xXaWR0aCA+IDAgPyBgJHtjb2xXaWR0aH1weGAgOiBcIjFweFwiO1xuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeDogc2Nyb2xsWCxcbiAgICAgIHk6IHNjcm9sbFksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOihqOagvOWLvumAiemAu+i+kVxuICBjdXJyZW50UGFnZURhdGFDaGFuZ2UoJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhID0gJGV2ZW50O1xuICAgIHRoaXMucmVmcmVzaFN0YXR1cygpO1xuICAgIGlmICghdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsKSB7XG4gICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2VhcmNoKHJlc2V0OiBib29sZWFuKSB7XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KFtdKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZnJlc2hTdGF0dXMoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmIChldmVudCAmJiBkYXRhKSB7XG4gICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50ICYmIGRhdGEpIHtcbiAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgfVxuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmV2ZXJ5KFxuICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgKTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9XG4gICAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLnNvbWUoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKSAmJiAhdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZDtcbiAgICAvLyDop6blj5FzZWxlY3Tkuovku7ZcbiAgICBpZiAodGhpcy5zZWxlY3RFdmVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRMaXN0OiBBcnJheTxhbnk+ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm1hcE9mQ2hlY2tMaXN0KTtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChzZWxlY3RlZExpc3QpO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmlbDmja7kuLrnqbrvvIzliJnmuIXnqbrli77pgInmoIfor4ZcbiAgICBpZiAodGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFN0YXR1cygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI856m6PlwiO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlRmllbGQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmlzU3RhdGUpIHtcbiAgICAgIHJldHVybiBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBjb2wuc3RhdGVGaWVsZCB8fCAnc3RhdGUnO1xuICB9XG59XG4iXX0=
1419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxZQUFZLEdBR2IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7QUFPNUIsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7SUE4RTNCLFlBQ1UsR0FBc0IsRUFDdEIsb0JBQTBDO1FBRDFDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUE5RTNDLGNBQVMsR0FBeUIsRUFBRSxDQUFDO1FBRXJCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUMxQyxrQkFBYSxHQUFZLElBQUksQ0FB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QyxtREFBOEM7O0lBQzlDLHlDQUErQjs7SUFFL0IsNkNBQW1DOztJQUVuQyx3Q0FBbUM7O0lBRW5DLHlDQUFvQzs7SUFHcEMsOENBQXlDOztJQUN6QywrQ0FBMEM7O0lBQzFDLHNDQUE0Qjs7SUFDNUIsdUNBQXdCOztJQUN4Qix3Q0FBMEI7O0lBQzFCLG1EQUF3Qzs7SUFDeEMsa0RBQXdDOzs7OztJQUd4QyxtREFBNkI7Ozs7OztJQUc3QiwrQ0FBbUQ7Ozs7OztJQUduRCw4Q0FBK0I7O0lBRS9CLDRDQUE0RTs7SUFxSjVFLHNDQUdFOzs7OztJQUdGLDZDQUFxRDs7SUFFckQsc0NBRUU7O0lBNFFGLHNDQWdDRTs7Ozs7SUF4Y0EsK0JBQThCOzs7OztJQUM5QixnREFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTnpUYWJsZUNvbXBvbmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3RhYmxlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgQ29sV2lkdGggfSBmcm9tIFwiLi4vbW9kZWwvY29sV2lkdGhcIjtcbmltcG9ydCB7IFBhZ2UgfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvY29tbW9uLXNlc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgSGRUYWJsZUNvbHVtbixcbiAgSGRUYWJsZVRvdGFsT3B0aW9uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgdGFibGVDb2xzOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBASW5wdXQoKSB0YWJsZURhdGE6IFBhZ2U8YW55PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd09wZXJhdGVDb2xXYXJwQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PEhkVGFibGVUb3RhbE9wdGlvbj47XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHRhYmxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDooajmoLzliIbpobXlj4LmlbBcbiAgQElucHV0KCkgdGFibGVQYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHRhYmxlUGFnZVNpemU6IG51bWJlciA9IDEwMDtcbiAgQElucHV0KCkgaXNGaXJzdEVudHJ5U2VhcmNoOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0Nyb3NzUGFnZVNlbGVjdDogYm9vbGVhbjtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlVG90YWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlVG90YWw6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZUxlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlTGVmdEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlUmlnaHRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlUmlnaHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIHNjcm9sbCA9IG51bGw7XG5cbiAgLy8g6KGo5qC85Yu+6YCJ5Y+C5pWwXG4gIGlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gIGlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICBsaXN0T2ZEaXNwbGF5RGF0YSA9IFtdO1xuICBsaXN0T2ZBbGxEYXRhID0gW107XG4gIGxpc3RPZlNlbGVjdGlvbjogQXJyYXk8YW55PiB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBtYXBPZkNoZWNrZWRJZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgbWFwT2ZDaGVja0xpc3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgLy8g5ZCI6K6h5Y+C5pWwXG4gIHRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gIC8vIOe8k+WtmOS/oeaBr1xuICB0YWJsZUNhY2hlT3B0aW9uOiBUYWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgdXNlclNlc3Npb246IGFueTtcblxuICB0YWJsZUNvbHNDYWNoZTogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgc2hvd1RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdENvbExpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNlbGVjdENvbExpc3ROb2Rlc0NhY2hlOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOiuvue9ruWIl+eahOWPr+ingeaTjeS9nOaVsOe7hFxuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAvLyDorr7nva7liJfnmoTkuI3lj6/op4Hmk43kvZzmlbDnu4RcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG5cbiAgLy8g54K55Ye75pe26ZyA6KaB5pyJ5Li05pe25pWw57uE5a2Y5pS+5Lik5LiqdHJlZSznlKjkuo7lj5bmtojml7blgJnmgaLlpI3osIPmlbTliY3nmoTnirbmgIFcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbG9jYWxmb3JhZ2U6IGFueSA9IG51bGw7XG4gIGxvY2FsdGlvblRtcDogc3RyaW5nID0gXCJcIjtcbiAgaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBpc0Nyb3NzUGFnZVNlbGVjdExvY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIOiHquWKqOa1i+mHj+WJjeeahOWFnOW6leihjOmrmO+8jOa1i+mHj+WujOaIkOWQjuS8muabtOaWsCAqL1xuICBtZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IDQ3O1xuXG4gIC8qKiDorrDlvZXlvZPliY3mmK/lkKblpITkuo7omZrmi5/mu5rliqjmqKHlvI/vvIznlKjkuo7liIfmjaIgcGFnZVNpemUg5pe26YeN5bu66KGo5qC8ICovXG4gIHByaXZhdGUgdmlydHVhbFNjcm9sbEFjdGl2ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiDlj6/op4HliJfmgLvlrr3vvIznlKjkuo7liKTmlq3mmK/lkKbpnIDopoHmqKrlkJHmu5rliqggKi9cbiAgcHJpdmF0ZSB0YWJsZUNvbFdpZHRoVG90YWwgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoXCJoZFRhYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNvbW1vblNlc3Npb25TZXJ2aWNlOiBDb21tb25TZXNzaW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZSA9IGxvY2FsZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIGRyaXZlcjogbG9jYWxmb3JhZ2UuSU5ERVhFRERCLFxuICAgICAgbmFtZTogXCJoZC1mc2NtXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWQjeensFxuICAgICAgdmVyc2lvbjogMS4wLCAvLyDorr7nva7lrZjlgqjlupPnmoTniYjmnKxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWtmOWCqOepuumXtOWQjeensFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Nyb3NzUGFnZVNlbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsID0gdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdDtcbiAgICB9XG4gICAgdGhpcy5sb2NhbHRpb25UbXAgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodGhpcy5sb2NhbHRpb25UbXApIHtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wID0gdGhpcy5sb2NhbHRpb25UbXAucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbiAgICB9XG4gICAgdGhpcy51c2VyU2Vzc2lvbiA9IHRoaXMuY29tbW9uU2Vzc2lvblNlcnZpY2UuZ2V0U2Vzc2lvbihcbiAgICAgIFwiX19qeV9hdXRob3JpemF0aW9uX3Nlc3Npb25fX1wiLFxuICAgICk7XG4gICAgLy8g55So5LqO5byA5Y+R546v5aKD6LCD6K+VXG4gICAgaWYgKCF0aGlzLnVzZXJTZXNzaW9uKSB7XG4gICAgICB0aGlzLnVzZXJTZXNzaW9uID0ge1xuICAgICAgICB1c2VyQ29kZTogXCJkZXZcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLnJlYWR5KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAxXCIsIGUpO1xuICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZSkge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VTaXplXCJdIHx8XG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlTnVtYmVyXCJdICE9PVxuICAgICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdW1wicGFnZU51bWJlclwiXVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsKSB7XG4gICAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInRhYmxlRGF0YVwiXSAmJiB0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUpICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgICAucmVhZHkoKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAyXCIsIGUpO1xuICAgICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0RldGFpbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZXRhaWwgPSAhdGhpcy5zaG93RGV0YWlsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxJdGVtU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15pWw5o2u6IO95a6M5pW05bGV56S65pe25LiN5ZCv55So6Jma5ouf5rua5Yqo77yM6YG/5YWN5bCR6YeP5pWw5o2u5Lmf5Ye6546w5rua5Yqo5p2hICovXG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJvd0NvdW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnRcbiAgICAgICAgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aFxuICAgICAgICA6IDA7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHJvd0NvdW50ICogdGhpcy5lZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemU7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtYXhPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiByb3dDb3VudCA+IDEwMDtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPiAxMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplO1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluaXRUYWJsZSgpIHtcbiAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy51dWlkKSB7XG4gICAgICB0aHJvdyBcImhkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaAp1wiO1xuICAgIH1cbiAgICBpZiAodGhpcy5qdWRnZVJlcGVhdENvbHMoKSkge1xuICAgICAgdGhpcy5kZWFsQ29scygpO1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB0aGlzLmRlYWxPcGVyYXRlQnRuKCk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiog6Jma5oufL+aZrumAmuaooeW8j+WIh+aNouaXtumHjeW7uuihqOagvO+8jOmBv+WFjeaui+eVmea7muWKqOWuueWZqCAqL1xuICBhcHBseVRhYmxlU2Nyb2xsTW9kZShmb3JjZVJlbW91bnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG4gICAgY29uc3QgbW9kZUNoYW5nZWQgPVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSBudWxsICYmXG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgIT09IHVzZVZpcnR1YWw7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gdXNlVmlydHVhbDtcblxuICAgIGlmIChmb3JjZVJlbW91bnQgfHwgbW9kZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuc2hvd1RhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dUYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB0aGlzLmFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUodHJ1ZSk7XG4gICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydChmb3JjZU1lYXN1cmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICBpZiAoZm9yY2VNZWFzdXJlKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVhc3VyZWQgPSB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDmnKrmiYvliqjkvKAgdmlydHVhbEl0ZW1TaXplIOaXtu+8jOS7juW3sua4suafk+ihjOa1i+mHj+ecn+WunumrmOW6piAqL1xuICBtZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZpcnR1YWxJdGVtU2l6ZSAhPSBudWxsICYmXG4gICAgICB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDAgJiZcbiAgICAgICFmb3JjZVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJlxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBjb25zdCB0YWJsZUJvZHkgPSB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudC50YWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJvdyA9XG4gICAgICAodmlld3BvcnQgJiZcbiAgICAgICAgKCh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCJ0ci5oZC10YWJsZS12aXJ0dWFsLXJvd1wiLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50KSkgfHxcbiAgICAgICh0YWJsZUJvZHkgJiYgKHRhYmxlQm9keS5xdWVyeVNlbGVjdG9yKFwidGJvZHkgdHJcIikgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICBpZiAoIXJvdyB8fCByb3cub2Zmc2V0SGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGVpZ2h0ID0gcm93Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoaGVpZ2h0ID09PSB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyDorr7nva7liJfngrnlh7vlj5bmtohcbiAgY2FuY2VsRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDngrnlh7vop6blj5Horr7nva7liJdcbiAgY29uZmlybURyb3Bkb3duKCk6IHZvaWQge1xuICAgIC8vIOS4tOaXtuWtmOaUvuS4i++8jOWPlua2iOeahOaXtuWAmeaBouWkjeWOn+adpeeahOeKtuaAgSAgIOa3seaLt+i0neS4i+WvueixoeaVsOe7hFxuICAgIHRoaXMuY2FuY2VsSGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdWJtaXRHcmlkcygpIHtcbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyA9IFtdO1xuICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLnB1c2goaXRlbS50aXRsZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g5LuO57yT5a2Y6K6+572u5YiXXG4gIHNldENvbHMoKSB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgbGV0IHsgbm90SW5jb2xzLCBpbmNvbHMgfSA9IHRoaXMudGFibGVDb2xzQ2FjaGUucmVkdWNlKFxuICAgICAgICAoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGl0ZW0udGl0bGUpKSB7XG4gICAgICAgICAgICBhY2MuaW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5ub3RJbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBub3RJbmNvbHM6IFtdLCBpbmNvbHM6IFtdIH0sXG4gICAgICApO1xuICAgICAgaW5jb2xzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGEudGl0bGUpIC1cbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGIudGl0bGUpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDb2xzID0gaW5jb2xzLmNvbmNhdChub3RJbmNvbHMpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTaG93KSB7XG4gICAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDosIPmlbTliJflrr3kuLrnvJPlrZjlrr3luqZcbiAgICBpZiAoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2l6ZSAhPT0gMFxuICAgICkge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmhhcyhjb2wudGl0bGUpKSB7XG4gICAgICAgICAgY29sLndpZHRoID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5nZXQoY29sLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWFsQ29scygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TGlzdE5vZGVzID0gdHJ1ZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIOaLluaLveaTjeS9nFxuICBiZWZvcmVEcm9wID0gKGFyZzogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoXG4gICAgICBhcmcubm9kZS5vcmlnaW4uZGlzYWJsZWQgfHxcbiAgICAgICFhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQgfHxcbiAgICAgIGFyZy5wb3MgPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZS5jaGVja2VkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkO1xuICAgICAgbm9kZS5kaXNhYmxlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZGlzYWJsZWQ7XG4gICAgICBub2RlLmV4cGFuZGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5leHBhbmRlZDtcbiAgICAgIG5vZGUuaXNMZWFmID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5pc0xlYWY7XG4gICAgICBub2RlLmtleSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4ua2V5O1xuICAgICAgbm9kZS5zZWxlY3RhYmxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5zZWxlY3RhYmxlO1xuICAgICAgbm9kZS50aXRsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAvLyDmi5bmi73lhYPntKDkuIvmoIdcbiAgICAgIGxldCBkcmFnTm9kZUluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIC8vIOebruagh+S9jee9rueahOS4i+agh1xuICAgICAgbGV0IG5vZGVJbmRleCA9XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgICAgfSkgKyAoYXJnLnBvcyA9PT0gLTEgPyAwIDogYXJnLnBvcyk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5zcGxpY2Uobm9kZUluZGV4LCAwLCBub2RlKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShcbiAgICAgICAgbm9kZUluZGV4ID49IGRyYWdOb2RlSW5kZXggPyBkcmFnTm9kZUluZGV4IDogZHJhZ05vZGVJbmRleCArIDEsXG4gICAgICAgIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9mKHRydWUpLnBpcGUoZGVsYXkoMTAwKSk7XG4gICAgfVxuICB9O1xuXG4gIG1vdmVFbGVtZW50TmVhcmJ5KGFyciwgZWxlbWVudFRvTW92ZVRpdGxlLCB0YXJnZXRFbGVtZW50VGl0bGUsIHBvcykge1xuICAgIGNvbnN0IHRtcEFycmF5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKTtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSB0YXJnZXRFbGVtZW50VGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50aXRsZSA9PT0gZWxlbWVudFRvTW92ZVRpdGxlLFxuICAgICk7XG4gICAgY29uc3QgbmV3SW5kZXggPSBwb3MgPCAwID8gdGFyZ2V0SW5kZXggKyBwb3MgOiB0YXJnZXRJbmRleDtcbiAgICAvLyDnp7vpmaTnm67moIflhYPntKDvvIzlubbmj5LlhaXliLDmlrDnmoTkvY3nva5cbiAgICBjb25zdCByZW1vdmVkRWxlbWVudCA9IHRtcEFycmF5LnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xuICAgIHRtcEFycmF5LnNwbGljZShuZXdJbmRleCArIDEsIDAsIHJlbW92ZWRFbGVtZW50WzBdKTtcbiAgICByZXR1cm4gdG1wQXJyYXk7XG4gIH1cblxuICAvLyDli77pgInmk43kvZxcbiAgY2hlY2tBY3Rpb24oZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgLy8g5Yu+6YCJ5Y+q5pyJ5ZyoaGlkZUxpc3ROb2Rlcyzlj5bmtojli77pgInlj6rmnInlnKhub3dMaXN0Tm9kZXNcbiAgICBpZiAoZXZlbnQubm9kZS5vcmlnaW4uY2hlY2tlZCkge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgICBub2RlLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgLy8g5om+5Yiw56ys5LiA5LiqZml4ZWTlsZ7mgKfkuLpyaWdodOeahHRpdGxl77yM5om+5Yiw5o+S5YWl5YWD57Sg55qE5L2N572uXG4gICAgICBsZXQgdGl0bGUgPSBudWxsO1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzQ2FjaGVbaV0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRpdGxlID0gdGhpcy50YWJsZUNvbHNDYWNoZVtpXS50aXRsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5ub3dMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleChcbiAgICAgICAgICAobm9kZSkgPT4gbm9kZS50aXRsZSA9PT0gdGl0bGUsXG4gICAgICAgICk7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnNwbGljZShpbmRleCwgMCwgbm9kZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgKHRoaXMuaGlkZUxpc3ROb2Rlcy5sZW5ndGggPT09IDAgJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzKSB7XG4gICAgICAvLyAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuZ2V0SGlkZUxpc3ROb2RlcygpO1xuICAgICAgLy8gfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5oaWRlTGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcblxuICAgICAgLy8g5Li65LqG6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOmAmui/h+WIneWni+aVsOaNruiOt+WPluaYvuekuueahOWtl+auteWIl+ihqFxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOS7juWIneWni+aVsOaNruiOt+WPlumakOiXj+acquaYvuekuueahOWtl+auteWIl+ihqFxuICBnZXRIaWRlTGlzdE5vZGVzKCk6IEFycmF5PFRyZWVHcmlkPiB7XG4gICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0OiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgICAvLyDku450YWJsZUNvbHNDYWNoZemHjOmdouaJvuayoeacieWcqHN0b3JhZ2Xph4zpnaLlh7rnjrDnmoTlrZfmrrUs57uE5oiQaGlkZUxpc3RcbiAgICB0aGlzLnRhYmxlQ29sc0NhY2hlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgbGV0IG5vZGVJdGVtOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgICBub2RlSXRlbS50aXRsZSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmtleSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmRpc2FibGVkID0gaXRlbS5maXhlZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbm9kZUl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGVJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gIH1cblxuICBkZWFsQ29scygpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzWzBdLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gaXRlbS50aXRsZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgICAgaXRlbS5taW5XaWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyAxNjtcbiAgICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8g5aSE55CG5bem5Y+z5ZC46ZmE55qE5pWw5o2u5Zyo5pWw57uE5Lit55qE5L2N572uXG4gICAgY29uc3QgbGVmdEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiBjb2wuZml4ZWQgPT09IFwibGVmdFwiKTtcbiAgICBjb25zdCByaWdodEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcihcbiAgICAgIChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJyaWdodFwiLFxuICAgICk7XG4gICAgY29uc3Qgbm9ybWFsQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiAhY29sLmZpeGVkKTtcbiAgICBjb25zdCByZXN1bHRDb2xzID0gbGVmdEZpeGVkQ29scy5jb25jYXQobm9ybWFsQ29scykuY29uY2F0KHJpZ2h0Rml4ZWRDb2xzKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHJlc3VsdENvbHM7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29sc0NhY2hlIHx8IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyDnvJPlrZjkuIDkuIvooajmoLznmoTmlbDmja5cbiAgICAgIHRoaXMudGFibGVDb2xzQ2FjaGUgPSBbLi4udGhpcy50YWJsZUNvbHNdO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKSB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB9IGVsc2UgaWYgKCEodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGNvbnN0IGNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29sV2lkdGhzLnNldChrZXksICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGFzIGFueSlba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBjb2xXaWR0aHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDb2xzQ2FjaGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHNhdmVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2Uuc2V0SXRlbShcbiAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy51dWlkLFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLFxuICAgICk7XG4gIH1cblxuICBqdWRnZVJlcGVhdENvbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzW2ldLnRpdGxlID09PSB0aGlzLnRhYmxlQ29sc1tqXS50aXRsZSkge1xuICAgICAgICAgIHRocm93IGBoZC10YWJsZee7hOS7tuS4reWIl+WQjSAke3RoaXMudGFibGVDb2xzW2ldLnRpdGxlfSDph43lpI1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25SZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICBpZiAod2lkdGggPiBjb2wubWluV2lkdGgpIHtcbiAgICAgIHRlbXBXaWR0aCA9IHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wV2lkdGggPSBjb2wubWluV2lkdGg7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2V0KGNvbC50aXRsZSwgdGVtcFdpZHRoKTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5tYXAoKGUpID0+XG4gICAgICBlLnRpdGxlID09PSBjb2wudGl0bGUgPyB7IC4uLmUsIHdpZHRoOiB0ZW1wV2lkdGggfSA6IGUsXG4gICAgKTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGRlYWxPcGVyYXRlQnRuKCkge1xuICAgIGxldCBvcGVyYXRlQ29sID0gdGhpcy50YWJsZUNvbHMuZmluZCgoY29sKSA9PiBjb2wudGl0bGUgPT09IFwi5pON5L2cXCIpIHx8IG51bGw7XG4gICAgaWYgKG9wZXJhdGVDb2wpIHtcbiAgICAgIGxldCB0ZXh0U3RyID0gXCJcIjtcbiAgICAgIG9wZXJhdGVDb2wuYnRuTGlzdC5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgaWYgKCFidG4uaXNSZXBlYXQpIHtcbiAgICAgICAgICB0ZXh0U3RyICs9IGJ0bi5uYW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgc3Bhbi5pbm5lclRleHQgPSB0ZXh0U3RyO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgIG9wZXJhdGVDb2wud2lkdGggPVxuICAgICAgICBzcGFuLm9mZnNldFdpZHRoICtcbiAgICAgICAgKG9wZXJhdGVDb2wuYnRuTGlzdC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzUmVwZWF0KS5sZW5ndGggLSAxKSAqIDQgK1xuICAgICAgICAxNjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5lZWRTaG93Q29uZmlybShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYnRuLnNob3dDb25maXJtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4uc2hvd0NvbmZpcm0oZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiAhIWJ0bi5zaG93Q29uZmlybTtcbiAgfVxuXG4gIC8qKiDomZrmi5/mu5rliqjlvIDlkK/ml7bkvb/nlKjop4blj6PmnIDlpKfpq5jluqYgKi9cbiAgcHJpdmF0ZSBnZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVWaWV3cG9ydFdpZHRoKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQgfHwgIXRoaXMubnpUYWJsZUNvbXBvbmVudC50YWJsZU1haW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgdGFibGVNYWluID0gdGhpcy5uelRhYmxlQ29tcG9uZW50LnRhYmxlTWFpbkVsZW1lbnRcbiAgICAgIC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0YWJsZU1haW4uY2xvc2VzdChcIi5hbnQtdGFibGUtd3JhcHBlclwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAod3JhcHBlciAmJiB3cmFwcGVyLmNsaWVudFdpZHRoID4gMCkge1xuICAgICAgcmV0dXJuIHdyYXBwZXIuY2xpZW50V2lkdGg7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSB0YWJsZU1haW4uY2xvc2VzdChcIi5oZC10YWJsZS1jb250YWluZXJcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGhvc3QgJiYgaG9zdC5jbGllbnRXaWR0aCA+IDApIHtcbiAgICAgIHJldHVybiBob3N0LmNsaWVudFdpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiDliJfmgLvlrr3otoXlh7rlpJblsYLlrrnlmajmiY3lkK/nlKjmqKrlkJEgc2Nyb2xs77yI5LiN6IO955SoIHRhYmxlIOiHqui6q+WuveW6pu+8jOS8muiiqyBzY3JvbGwueCDmkpHlrr3vvIkgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2Nyb2xsWChjb2xXaWR0aDogbnVtYmVyLCB1c2VWaXJ0dWFsOiBib29sZWFuKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGNvbFdpZHRoIDw9IDApIHtcbiAgICAgIHJldHVybiB1c2VWaXJ0dWFsID8gXCIxcHhcIiA6IG51bGw7XG4gICAgfVxuICAgIGlmICh1c2VWaXJ0dWFsKSB7XG4gICAgICByZXR1cm4gYCR7Y29sV2lkdGh9cHhgO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gdGhpcy5nZXRUYWJsZVZpZXdwb3J0V2lkdGgoKTtcbiAgICBpZiAodmlld3BvcnRXaWR0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb2xXaWR0aCA+IHZpZXdwb3J0V2lkdGggPyBgJHtjb2xXaWR0aH1weGAgOiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb2xXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoIC0gMzIpIHtcbiAgICAgIHJldHVybiBgJHtjb2xXaWR0aH1weGA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOagvOa4suafk+WQjuaMieWunumZheWuueWZqOWuveW6puagoeato+aoquWQkSBzY3JvbGwgKi9cbiAgcHJpdmF0ZSBzeW5jSG9yaXpvbnRhbFNjcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCB8fCB0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsWCA9IHRoaXMucmVzb2x2ZVNjcm9sbFgodGhpcy50YWJsZUNvbFdpZHRoVG90YWwsIGZhbHNlKTtcbiAgICBpZiAodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCA9PT0gc2Nyb2xsWCAmJiB0aGlzLnNjcm9sbC55ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsID0geyB4OiBzY3JvbGxYLCB5OiBudWxsIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgIGxldCBjb2xXaWR0aCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBjb2xXaWR0aCArPSA0MDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtLndpZHRoKSB7XG4gICAgICAgIGl0ZW0ud2lkdGggPSBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmlzU2hvdykge1xuICAgICAgICBpdGVtLmZpeGVkV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgY29sV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID0gY29sV2lkdGg7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwO1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogdGhpcy5yZXNvbHZlU2Nyb2xsWChjb2xXaWR0aCwgZmFsc2UpLFxuICAgICAgICB5OiBudWxsLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6IFwiMXB4XCIsXG4gICAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4OiB0aGlzLnJlc29sdmVTY3JvbGxYKGNvbFdpZHRoLCB0cnVlKSxcbiAgICAgIHk6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWFyY2gocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlSW5kZXgpO1xuICAgICAgLy8g6Kem5Y+R54i257uE5Lu25p+l6K+i5LqL5Lu2XG4gICAgICB0aGlzLnRhYmxlU2VhcmNoRXZlbnQuZW1pdChyZXNldCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTdGF0dXMoKSB7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xuICAgIHRoaXMubWFwT2ZDaGVja0xpc3QgPSB7fTtcbiAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoW10pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVmcmVzaFN0YXR1cyhldmVudDogYm9vbGVhbiA9IGZhbHNlLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50ICYmIGRhdGEpIHtcbiAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZGF0YSk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQgJiYgZGF0YSkge1xuICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICB9XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IHRoaXMubGlzdE9mRGlzcGxheURhdGEuZXZlcnkoXG4gICAgICAoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSxcbiAgICApO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID1cbiAgICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuc29tZShcbiAgICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgICApICYmICF0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkO1xuICAgIC8vIOinpuWPkXNlbGVjdOS6i+S7tlxuICAgIGlmICh0aGlzLnNlbGVjdEV2ZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZExpc3Q6IEFycmF5PGFueT4gPSBPYmplY3QudmFsdWVzKHRoaXMubWFwT2ZDaGVja0xpc3QpO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHNlbGVjdGVkTGlzdCk7XG4gICAgfVxuICAgIC8vIOWmguaenOaVsOaNruS4uuepuu+8jOWImea4heepuuWLvumAieagh+ivhlxuICAgIGlmICh0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoZWNrQWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGVGaWVsZChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaXNTdGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5zdGF0ZUZpZWxkIHx8ICdzdGF0ZSc7XG4gIH1cbn1cbiJdfQ==