fantasy-ngzorro 2.2.13 → 2.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -13
- package/bundles/fantasy-ngzorro.umd.js +512 -30
- package/bundles/fantasy-ngzorro.umd.js.map +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
- package/esm2015/fantasy-ngzorro.js +2 -2
- package/esm2015/hd-detail-lines/hd-detail-lines.service.js +5 -2
- package/esm2015/hd-table/hd-table.component.js +409 -15
- package/esm2015/hd-table/hd-table.service.js +1 -11
- package/esm2015/index.js +2 -2
- package/esm2015/public-api.js +2 -2
- package/esm5/fantasy-ngzorro.js +2 -2
- package/esm5/hd-detail-lines/hd-detail-lines.service.js +5 -2
- package/esm5/hd-table/hd-table.component.js +510 -17
- package/esm5/hd-table/hd-table.service.js +1 -15
- package/esm5/index.js +2 -2
- package/esm5/public-api.js +2 -2
- package/fantasy-ngzorro.metadata.json +1 -1
- package/fesm2015/fantasy-ngzorro.js +412 -25
- package/fesm2015/fantasy-ngzorro.js.map +1 -1
- package/fesm5/fantasy-ngzorro.js +513 -30
- package/fesm5/fantasy-ngzorro.js.map +1 -1
- package/hd-detail-lines/hd-detail-lines.service.d.ts +2 -1
- package/hd-table/hd-table.component.d.ts +58 -7
- package/hd-table/hd-table.service.d.ts +0 -5
- package/package.json +2 -2
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
4
|
*/
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, ViewChild, } from "@angular/core";
|
|
6
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild, } from "@angular/core";
|
|
7
7
|
import * as localforage from "localforage";
|
|
8
8
|
import { InputBoolean, } from "ng-zorro-antd/core";
|
|
9
9
|
import { NzTableComponent } from "ng-zorro-antd/table";
|
|
@@ -15,8 +15,9 @@ import { CommonSessionService } from "../service/common-session.service";
|
|
|
15
15
|
import { measureTableColWidth, resolveAutoTableScroll, } from "../utils/hd-table-scroll.util";
|
|
16
16
|
import { TableCacheOption, TreeGrid, } from "./hd-table.service";
|
|
17
17
|
var HdTableComponent = /** @class */ (function () {
|
|
18
|
-
function HdTableComponent(cdr, commonSessionService) {
|
|
18
|
+
function HdTableComponent(hostEl, cdr, commonSessionService) {
|
|
19
19
|
var _this = this;
|
|
20
|
+
this.hostEl = hostEl;
|
|
20
21
|
this.cdr = cdr;
|
|
21
22
|
this.commonSessionService = commonSessionService;
|
|
22
23
|
this.tableCols = [];
|
|
@@ -24,7 +25,7 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
24
25
|
this.showOperateColWarpButton = false;
|
|
25
26
|
this.virtualScroll = true;
|
|
26
27
|
this.selectField = "billNumber";
|
|
27
|
-
//
|
|
28
|
+
// 合计区域(类型与 hd-detail-lines 的 TotalOption 一致)
|
|
28
29
|
this.showTableTotal = false;
|
|
29
30
|
this.sortEvent = new EventEmitter();
|
|
30
31
|
this.selectEvent = new EventEmitter();
|
|
@@ -89,8 +90,9 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
89
90
|
* 记录当前是否处于虚拟滚动模式,用于切换 pageSize 时重建表格
|
|
90
91
|
*/
|
|
91
92
|
this.virtualScrollActive = null;
|
|
93
|
+
/** 可见列总宽,用于判断是否需要横向滚动 */
|
|
92
94
|
/**
|
|
93
|
-
*
|
|
95
|
+
* 列宽合计(含勾选/序号),footer 表宽与横向 scroll 共用
|
|
94
96
|
*/
|
|
95
97
|
this.tableColWidthTotal = 0;
|
|
96
98
|
/**
|
|
@@ -102,6 +104,14 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
102
104
|
*/
|
|
103
105
|
this.currentSortKey = null;
|
|
104
106
|
this.currentSortValue = null;
|
|
107
|
+
this.totalFooterScrollBoundBody = null;
|
|
108
|
+
this.totalFooterScrollHandler = null;
|
|
109
|
+
this.totalFooterSyncRetry = 0;
|
|
110
|
+
/**
|
|
111
|
+
* 序号列固定宽(含 padding,可容纳 6 位如 199995)。
|
|
112
|
+
* 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。
|
|
113
|
+
*/
|
|
114
|
+
this.lineNumberColWidth = 72;
|
|
105
115
|
this.trackByRow = (/**
|
|
106
116
|
* @param {?} index
|
|
107
117
|
* @param {?} data
|
|
@@ -181,6 +191,15 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
181
191
|
storeName: "hd-fscm-store",
|
|
182
192
|
});
|
|
183
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* @return {?}
|
|
196
|
+
*/
|
|
197
|
+
HdTableComponent.prototype.ngOnDestroy = /**
|
|
198
|
+
* @return {?}
|
|
199
|
+
*/
|
|
200
|
+
function () {
|
|
201
|
+
this.unbindTotalFooterScrollSync();
|
|
202
|
+
};
|
|
184
203
|
/**
|
|
185
204
|
* @return {?}
|
|
186
205
|
*/
|
|
@@ -237,6 +256,13 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
237
256
|
*/
|
|
238
257
|
function (changes) {
|
|
239
258
|
var _this = this;
|
|
259
|
+
if (changes["tableData"] ||
|
|
260
|
+
changes["tableTotalOption"] ||
|
|
261
|
+
changes["showTableTotal"] ||
|
|
262
|
+
changes["columnsNumber"] ||
|
|
263
|
+
changes["tableCols"]) {
|
|
264
|
+
this.calculateTableTotal();
|
|
265
|
+
}
|
|
240
266
|
if (changes &&
|
|
241
267
|
changes["tableData"] &&
|
|
242
268
|
changes["tableData"]["currentValue"] &&
|
|
@@ -502,6 +528,83 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
502
528
|
function (col) {
|
|
503
529
|
return col.fixed === "left" ? (col.fixedWidth || 0) + "px" : null;
|
|
504
530
|
};
|
|
531
|
+
Object.defineProperty(HdTableComponent.prototype, "lineNumberLeft", {
|
|
532
|
+
/** 开启合计时序号列的 left(勾选列占 40px) */
|
|
533
|
+
get: /**
|
|
534
|
+
* 开启合计时序号列的 left(勾选列占 40px)
|
|
535
|
+
* @return {?}
|
|
536
|
+
*/
|
|
537
|
+
function () {
|
|
538
|
+
return this.showSelected ? "40px" : "0px";
|
|
539
|
+
},
|
|
540
|
+
enumerable: true,
|
|
541
|
+
configurable: true
|
|
542
|
+
});
|
|
543
|
+
Object.defineProperty(HdTableComponent.prototype, "lineNumberColWidthPx", {
|
|
544
|
+
get: /**
|
|
545
|
+
* @return {?}
|
|
546
|
+
*/
|
|
547
|
+
function () {
|
|
548
|
+
return this.lineNumberColWidth + "px";
|
|
549
|
+
},
|
|
550
|
+
enumerable: true,
|
|
551
|
+
configurable: true
|
|
552
|
+
});
|
|
553
|
+
Object.defineProperty(HdTableComponent.prototype, "isTotalFooterFluid", {
|
|
554
|
+
/**
|
|
555
|
+
* 列总宽未超出容器:无横向 scroll,表体列会被撑满,合计走 fluid(width:100%)。
|
|
556
|
+
* 列总宽超出:有 scroll.x,合计走固定表宽 + 横滚同步。
|
|
557
|
+
*/
|
|
558
|
+
get: /**
|
|
559
|
+
* 列总宽未超出容器:无横向 scroll,表体列会被撑满,合计走 fluid(width:100%)。
|
|
560
|
+
* 列总宽超出:有 scroll.x,合计走固定表宽 + 横滚同步。
|
|
561
|
+
* @return {?}
|
|
562
|
+
*/
|
|
563
|
+
function () {
|
|
564
|
+
return !(this.scroll && this.scroll.x);
|
|
565
|
+
},
|
|
566
|
+
enumerable: true,
|
|
567
|
+
configurable: true
|
|
568
|
+
});
|
|
569
|
+
Object.defineProperty(HdTableComponent.prototype, "totalFooterTableWidth", {
|
|
570
|
+
/** fluid → 100%;固定 → scroll.x(与表体同一套横向宽度) */
|
|
571
|
+
get: /**
|
|
572
|
+
* fluid → 100%;固定 → scroll.x(与表体同一套横向宽度)
|
|
573
|
+
* @return {?}
|
|
574
|
+
*/
|
|
575
|
+
function () {
|
|
576
|
+
if (this.isTotalFooterFluid) {
|
|
577
|
+
return "100%";
|
|
578
|
+
}
|
|
579
|
+
return this.scroll && this.scroll.x
|
|
580
|
+
? String(this.scroll.x)
|
|
581
|
+
: this.tableColWidthTotal > 0
|
|
582
|
+
? this.tableColWidthTotal + "px"
|
|
583
|
+
: "100%";
|
|
584
|
+
},
|
|
585
|
+
enumerable: true,
|
|
586
|
+
configurable: true
|
|
587
|
+
});
|
|
588
|
+
/** 当前页行号(跨页连续,从 1 开始) */
|
|
589
|
+
/**
|
|
590
|
+
* 当前页行号(跨页连续,从 1 开始)
|
|
591
|
+
* @param {?} index
|
|
592
|
+
* @return {?}
|
|
593
|
+
*/
|
|
594
|
+
HdTableComponent.prototype.getLineNumber = /**
|
|
595
|
+
* 当前页行号(跨页连续,从 1 开始)
|
|
596
|
+
* @param {?} index
|
|
597
|
+
* @return {?}
|
|
598
|
+
*/
|
|
599
|
+
function (index) {
|
|
600
|
+
/** @type {?} */
|
|
601
|
+
var page = Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;
|
|
602
|
+
/** @type {?} */
|
|
603
|
+
var size = Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 0;
|
|
604
|
+
/** @type {?} */
|
|
605
|
+
var rowIndex = Number(index) >= 0 ? Number(index) : 0;
|
|
606
|
+
return (page - 1) * size + rowIndex + 1;
|
|
607
|
+
};
|
|
505
608
|
/**
|
|
506
609
|
* @return {?}
|
|
507
610
|
*/
|
|
@@ -1362,6 +1465,7 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1362
1465
|
* @return {?}
|
|
1363
1466
|
*/
|
|
1364
1467
|
function (_a, col) {
|
|
1468
|
+
var _this = this;
|
|
1365
1469
|
var width = _a.width;
|
|
1366
1470
|
this.normalizeTableCacheOption();
|
|
1367
1471
|
/** @type {?} */
|
|
@@ -1383,6 +1487,10 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1383
1487
|
}));
|
|
1384
1488
|
this.dealScroll();
|
|
1385
1489
|
this.cdr.markForCheck();
|
|
1490
|
+
setTimeout((/**
|
|
1491
|
+
* @return {?}
|
|
1492
|
+
*/
|
|
1493
|
+
function () { return _this.syncTotalFooterWithBody(); }));
|
|
1386
1494
|
};
|
|
1387
1495
|
/**
|
|
1388
1496
|
* @return {?}
|
|
@@ -1566,6 +1674,10 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1566
1674
|
if (this.scroll &&
|
|
1567
1675
|
this.scroll.x === scrollX &&
|
|
1568
1676
|
this.scroll.y === currentY) {
|
|
1677
|
+
setTimeout((/**
|
|
1678
|
+
* @return {?}
|
|
1679
|
+
*/
|
|
1680
|
+
function () { return _this.syncTotalFooterWithBody(); }));
|
|
1569
1681
|
return;
|
|
1570
1682
|
}
|
|
1571
1683
|
// 保持 y 不变,防止运行中拆/合 header 导致横向同步失效
|
|
@@ -1576,31 +1688,188 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1576
1688
|
*/
|
|
1577
1689
|
function () { return _this.syncHeaderBodyScrollLeft(); }));
|
|
1578
1690
|
};
|
|
1579
|
-
/**
|
|
1691
|
+
/** 手动把表体横向滚动同步到表头 / 合计 footer(兜底 ng-zorro 监听丢失的情况) */
|
|
1580
1692
|
/**
|
|
1581
|
-
*
|
|
1693
|
+
* 手动把表体横向滚动同步到表头 / 合计 footer(兜底 ng-zorro 监听丢失的情况)
|
|
1582
1694
|
* @private
|
|
1583
1695
|
* @return {?}
|
|
1584
1696
|
*/
|
|
1585
1697
|
HdTableComponent.prototype.syncHeaderBodyScrollLeft = /**
|
|
1586
|
-
*
|
|
1698
|
+
* 手动把表体横向滚动同步到表头 / 合计 footer(兜底 ng-zorro 监听丢失的情况)
|
|
1587
1699
|
* @private
|
|
1588
1700
|
* @return {?}
|
|
1589
1701
|
*/
|
|
1590
1702
|
function () {
|
|
1591
|
-
if (!this.nzTableComponent
|
|
1703
|
+
if (!this.nzTableComponent) {
|
|
1592
1704
|
return;
|
|
1593
1705
|
}
|
|
1594
1706
|
/** @type {?} */
|
|
1595
1707
|
var header = (/** @type {?} */ (((/** @type {?} */ (this.nzTableComponent))).tableHeaderNativeElement));
|
|
1596
1708
|
/** @type {?} */
|
|
1597
|
-
var body =
|
|
1598
|
-
if (
|
|
1709
|
+
var body = this.getTableBodyScrollEl();
|
|
1710
|
+
if (this.scroll && this.scroll.x && header && body) {
|
|
1711
|
+
if (header.scrollLeft !== body.scrollLeft) {
|
|
1712
|
+
header.scrollLeft = body.scrollLeft;
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
this.syncTotalFooterWithBody();
|
|
1716
|
+
};
|
|
1717
|
+
/** 取表体横向滚动容器(虚拟滚动优先 viewport) */
|
|
1718
|
+
/**
|
|
1719
|
+
* 取表体横向滚动容器(虚拟滚动优先 viewport)
|
|
1720
|
+
* @private
|
|
1721
|
+
* @return {?}
|
|
1722
|
+
*/
|
|
1723
|
+
HdTableComponent.prototype.getTableBodyScrollEl = /**
|
|
1724
|
+
* 取表体横向滚动容器(虚拟滚动优先 viewport)
|
|
1725
|
+
* @private
|
|
1726
|
+
* @return {?}
|
|
1727
|
+
*/
|
|
1728
|
+
function () {
|
|
1729
|
+
if (!this.nzTableComponent) {
|
|
1730
|
+
return null;
|
|
1731
|
+
}
|
|
1732
|
+
/** @type {?} */
|
|
1733
|
+
var mix = (/** @type {?} */ (((/** @type {?} */ (this.nzTableComponent))).mixTableBodyNativeElement));
|
|
1734
|
+
if (mix) {
|
|
1735
|
+
return mix;
|
|
1736
|
+
}
|
|
1737
|
+
/** @type {?} */
|
|
1738
|
+
var host = this.hostEl && ((/** @type {?} */ (this.hostEl.nativeElement)));
|
|
1739
|
+
if (!host) {
|
|
1740
|
+
return null;
|
|
1741
|
+
}
|
|
1742
|
+
return (((/** @type {?} */ (host.querySelector("cdk-virtual-scroll-viewport.ant-table-body")))) ||
|
|
1743
|
+
((/** @type {?} */ (host.querySelector(".ant-table-body")))) ||
|
|
1744
|
+
null);
|
|
1745
|
+
};
|
|
1746
|
+
/**
|
|
1747
|
+
* @private
|
|
1748
|
+
* @return {?}
|
|
1749
|
+
*/
|
|
1750
|
+
HdTableComponent.prototype.getTotalFooterScrollEl = /**
|
|
1751
|
+
* @private
|
|
1752
|
+
* @return {?}
|
|
1753
|
+
*/
|
|
1754
|
+
function () {
|
|
1755
|
+
/** @type {?} */
|
|
1756
|
+
var host = this.hostEl && ((/** @type {?} */ (this.hostEl.nativeElement)));
|
|
1757
|
+
return host
|
|
1758
|
+
? ((/** @type {?} */ (host.querySelector(".hd-table-total-footer"))))
|
|
1759
|
+
: null;
|
|
1760
|
+
};
|
|
1761
|
+
/**
|
|
1762
|
+
* 合计 footer 与表体联动:
|
|
1763
|
+
* - fluid(列未撑满):不横滚、不测宽,表宽 100% 与表体同比例拉伸;
|
|
1764
|
+
* - fixed(有 scroll.x):同步 scrollLeft。
|
|
1765
|
+
*/
|
|
1766
|
+
/**
|
|
1767
|
+
* 合计 footer 与表体联动:
|
|
1768
|
+
* - fluid(列未撑满):不横滚、不测宽,表宽 100% 与表体同比例拉伸;
|
|
1769
|
+
* - fixed(有 scroll.x):同步 scrollLeft。
|
|
1770
|
+
* @private
|
|
1771
|
+
* @return {?}
|
|
1772
|
+
*/
|
|
1773
|
+
HdTableComponent.prototype.syncTotalFooterWithBody = /**
|
|
1774
|
+
* 合计 footer 与表体联动:
|
|
1775
|
+
* - fluid(列未撑满):不横滚、不测宽,表宽 100% 与表体同比例拉伸;
|
|
1776
|
+
* - fixed(有 scroll.x):同步 scrollLeft。
|
|
1777
|
+
* @private
|
|
1778
|
+
* @return {?}
|
|
1779
|
+
*/
|
|
1780
|
+
function () {
|
|
1781
|
+
var _this = this;
|
|
1782
|
+
if (!this.showTableTotal) {
|
|
1783
|
+
this.unbindTotalFooterScrollSync();
|
|
1784
|
+
return;
|
|
1785
|
+
}
|
|
1786
|
+
/** @type {?} */
|
|
1787
|
+
var footer = this.getTotalFooterScrollEl();
|
|
1788
|
+
/** @type {?} */
|
|
1789
|
+
var body = this.getTableBodyScrollEl();
|
|
1790
|
+
if (!footer) {
|
|
1791
|
+
if (this.totalFooterSyncRetry < 10) {
|
|
1792
|
+
this.totalFooterSyncRetry++;
|
|
1793
|
+
setTimeout((/**
|
|
1794
|
+
* @return {?}
|
|
1795
|
+
*/
|
|
1796
|
+
function () { return _this.syncTotalFooterWithBody(); }), 50);
|
|
1797
|
+
}
|
|
1798
|
+
return;
|
|
1799
|
+
}
|
|
1800
|
+
this.totalFooterSyncRetry = 0;
|
|
1801
|
+
if (this.isTotalFooterFluid) {
|
|
1802
|
+
this.unbindTotalFooterScrollSync();
|
|
1803
|
+
footer.scrollLeft = 0;
|
|
1804
|
+
return;
|
|
1805
|
+
}
|
|
1806
|
+
if (body) {
|
|
1807
|
+
this.syncTotalFooterScrollLeft(body.scrollLeft);
|
|
1808
|
+
this.bindTotalFooterScrollSync(body);
|
|
1809
|
+
}
|
|
1810
|
+
};
|
|
1811
|
+
/**
|
|
1812
|
+
* @private
|
|
1813
|
+
* @param {?} scrollLeft
|
|
1814
|
+
* @return {?}
|
|
1815
|
+
*/
|
|
1816
|
+
HdTableComponent.prototype.syncTotalFooterScrollLeft = /**
|
|
1817
|
+
* @private
|
|
1818
|
+
* @param {?} scrollLeft
|
|
1819
|
+
* @return {?}
|
|
1820
|
+
*/
|
|
1821
|
+
function (scrollLeft) {
|
|
1822
|
+
/** @type {?} */
|
|
1823
|
+
var footer = this.getTotalFooterScrollEl();
|
|
1824
|
+
if (footer && footer.scrollLeft !== scrollLeft) {
|
|
1825
|
+
footer.scrollLeft = scrollLeft;
|
|
1826
|
+
}
|
|
1827
|
+
};
|
|
1828
|
+
/**
|
|
1829
|
+
* @private
|
|
1830
|
+
* @param {?} body
|
|
1831
|
+
* @return {?}
|
|
1832
|
+
*/
|
|
1833
|
+
HdTableComponent.prototype.bindTotalFooterScrollSync = /**
|
|
1834
|
+
* @private
|
|
1835
|
+
* @param {?} body
|
|
1836
|
+
* @return {?}
|
|
1837
|
+
*/
|
|
1838
|
+
function (body) {
|
|
1839
|
+
var _this = this;
|
|
1840
|
+
if (!this.showTableTotal || !body || this.isTotalFooterFluid) {
|
|
1841
|
+
return;
|
|
1842
|
+
}
|
|
1843
|
+
if (this.totalFooterScrollBoundBody === body &&
|
|
1844
|
+
this.totalFooterScrollHandler) {
|
|
1599
1845
|
return;
|
|
1600
1846
|
}
|
|
1601
|
-
|
|
1602
|
-
|
|
1847
|
+
this.unbindTotalFooterScrollSync();
|
|
1848
|
+
this.totalFooterScrollBoundBody = body;
|
|
1849
|
+
this.totalFooterScrollHandler = (/**
|
|
1850
|
+
* @return {?}
|
|
1851
|
+
*/
|
|
1852
|
+
function () {
|
|
1853
|
+
_this.syncTotalFooterScrollLeft(body.scrollLeft);
|
|
1854
|
+
});
|
|
1855
|
+
body.addEventListener("scroll", this.totalFooterScrollHandler, (/** @type {?} */ ({
|
|
1856
|
+
passive: true,
|
|
1857
|
+
})));
|
|
1858
|
+
};
|
|
1859
|
+
/**
|
|
1860
|
+
* @private
|
|
1861
|
+
* @return {?}
|
|
1862
|
+
*/
|
|
1863
|
+
HdTableComponent.prototype.unbindTotalFooterScrollSync = /**
|
|
1864
|
+
* @private
|
|
1865
|
+
* @return {?}
|
|
1866
|
+
*/
|
|
1867
|
+
function () {
|
|
1868
|
+
if (this.totalFooterScrollBoundBody && this.totalFooterScrollHandler) {
|
|
1869
|
+
this.totalFooterScrollBoundBody.removeEventListener("scroll", this.totalFooterScrollHandler);
|
|
1603
1870
|
}
|
|
1871
|
+
this.totalFooterScrollBoundBody = null;
|
|
1872
|
+
this.totalFooterScrollHandler = null;
|
|
1604
1873
|
};
|
|
1605
1874
|
/**
|
|
1606
1875
|
* @return {?}
|
|
@@ -1614,6 +1883,9 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1614
1883
|
if (this.showSelected) {
|
|
1615
1884
|
colWidth += 40;
|
|
1616
1885
|
}
|
|
1886
|
+
if (this.showTableTotal) {
|
|
1887
|
+
colWidth += this.lineNumberColWidth; // 序号列(固定宽,不随位数变化)
|
|
1888
|
+
}
|
|
1617
1889
|
this.tableCols.forEach((/**
|
|
1618
1890
|
* @param {?} item
|
|
1619
1891
|
* @return {?}
|
|
@@ -1732,6 +2004,194 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
1732
2004
|
this.tableSearchEvent.emit(reset);
|
|
1733
2005
|
}
|
|
1734
2006
|
};
|
|
2007
|
+
/**
|
|
2008
|
+
* 底部合计:与 hd-detail-lines 相同,使用 TotalOption(insertIndex / insertValue)。
|
|
2009
|
+
* 开启后强制展示序号列,「合计」落在序号列下;
|
|
2010
|
+
* insertIndex 从 1 起对应可见数据列;未传 insertValue 时按该列 name 对 content 求和。
|
|
2011
|
+
*/
|
|
2012
|
+
/**
|
|
2013
|
+
* 底部合计:与 hd-detail-lines 相同,使用 TotalOption(insertIndex / insertValue)。
|
|
2014
|
+
* 开启后强制展示序号列,「合计」落在序号列下;
|
|
2015
|
+
* insertIndex 从 1 起对应可见数据列;未传 insertValue 时按该列 name 对 content 求和。
|
|
2016
|
+
* @return {?}
|
|
2017
|
+
*/
|
|
2018
|
+
HdTableComponent.prototype.calculateTableTotal = /**
|
|
2019
|
+
* 底部合计:与 hd-detail-lines 相同,使用 TotalOption(insertIndex / insertValue)。
|
|
2020
|
+
* 开启后强制展示序号列,「合计」落在序号列下;
|
|
2021
|
+
* insertIndex 从 1 起对应可见数据列;未传 insertValue 时按该列 name 对 content 求和。
|
|
2022
|
+
* @return {?}
|
|
2023
|
+
*/
|
|
2024
|
+
function () {
|
|
2025
|
+
var _this = this;
|
|
2026
|
+
if (!this.showTableTotal ||
|
|
2027
|
+
!this.tableTotalOption ||
|
|
2028
|
+
!this.tableTotalOption.length) {
|
|
2029
|
+
this.tableTotalOptionList = [];
|
|
2030
|
+
return;
|
|
2031
|
+
}
|
|
2032
|
+
/** @type {?} */
|
|
2033
|
+
var visibleCols = (this.tableCols || []).filter((/**
|
|
2034
|
+
* @param {?} c
|
|
2035
|
+
* @return {?}
|
|
2036
|
+
*/
|
|
2037
|
+
function (c) { return c && c.isShow !== false; }));
|
|
2038
|
+
// columnsNumber 含序号列(与 detail-lines 一致),数据槽位数 = columnsNumber - 1
|
|
2039
|
+
/** @type {?} */
|
|
2040
|
+
var configured = Number(this.columnsNumber);
|
|
2041
|
+
/** @type {?} */
|
|
2042
|
+
var columnNumber = configured > 1
|
|
2043
|
+
? configured - 1
|
|
2044
|
+
: configured === 1
|
|
2045
|
+
? 1
|
|
2046
|
+
: visibleCols.length;
|
|
2047
|
+
if (!columnNumber || columnNumber < 1) {
|
|
2048
|
+
this.tableTotalOptionList = [];
|
|
2049
|
+
return;
|
|
2050
|
+
}
|
|
2051
|
+
this.tableTotalOptionList = new Array(columnNumber).fill("");
|
|
2052
|
+
/** @type {?} */
|
|
2053
|
+
var content = this.tableData && this.tableData.content ? this.tableData.content : [];
|
|
2054
|
+
this.tableTotalOption.forEach((/**
|
|
2055
|
+
* @param {?} item
|
|
2056
|
+
* @return {?}
|
|
2057
|
+
*/
|
|
2058
|
+
function (item) {
|
|
2059
|
+
if (item == null || !item.insertIndex || item.insertIndex < 1) {
|
|
2060
|
+
return;
|
|
2061
|
+
}
|
|
2062
|
+
/** @type {?} */
|
|
2063
|
+
var value = item.insertValue;
|
|
2064
|
+
// 未传 insertValue 时:按 insertIndex 对应可见列 name 自动求和
|
|
2065
|
+
if (value == null || value === "") {
|
|
2066
|
+
/** @type {?} */
|
|
2067
|
+
var col = visibleCols[item.insertIndex - 1];
|
|
2068
|
+
/** @type {?} */
|
|
2069
|
+
var field_1 = col && typeof col.name === "string" ? col.name : null;
|
|
2070
|
+
if (!field_1) {
|
|
2071
|
+
return;
|
|
2072
|
+
}
|
|
2073
|
+
/** @type {?} */
|
|
2074
|
+
var sum_1 = 0;
|
|
2075
|
+
/** @type {?} */
|
|
2076
|
+
var hasValue_1 = false;
|
|
2077
|
+
content.forEach((/**
|
|
2078
|
+
* @param {?} row
|
|
2079
|
+
* @return {?}
|
|
2080
|
+
*/
|
|
2081
|
+
function (row) {
|
|
2082
|
+
/** @type {?} */
|
|
2083
|
+
var raw = row ? row[field_1] : null;
|
|
2084
|
+
if (raw == null || raw === "") {
|
|
2085
|
+
return;
|
|
2086
|
+
}
|
|
2087
|
+
/** @type {?} */
|
|
2088
|
+
var num = Number(raw);
|
|
2089
|
+
if (!isNaN(num)) {
|
|
2090
|
+
sum_1 += num;
|
|
2091
|
+
hasValue_1 = true;
|
|
2092
|
+
}
|
|
2093
|
+
}));
|
|
2094
|
+
if (!hasValue_1) {
|
|
2095
|
+
return;
|
|
2096
|
+
}
|
|
2097
|
+
value = sum_1;
|
|
2098
|
+
}
|
|
2099
|
+
/** @type {?} */
|
|
2100
|
+
var colAtIndex = visibleCols[item.insertIndex - 1];
|
|
2101
|
+
_this.tableTotalOptionList[item.insertIndex - 1] = {
|
|
2102
|
+
value: value,
|
|
2103
|
+
align: item.align || (colAtIndex && colAtIndex.align) || "left",
|
|
2104
|
+
showDecimal: item.showDecimal || false,
|
|
2105
|
+
preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,
|
|
2106
|
+
isHide: item.isHide || false,
|
|
2107
|
+
};
|
|
2108
|
+
}));
|
|
2109
|
+
};
|
|
2110
|
+
/**
|
|
2111
|
+
* @private
|
|
2112
|
+
* @param {?} col
|
|
2113
|
+
* @param {?} colIndex
|
|
2114
|
+
* @return {?}
|
|
2115
|
+
*/
|
|
2116
|
+
HdTableComponent.prototype.getTableTotalCellMeta = /**
|
|
2117
|
+
* @private
|
|
2118
|
+
* @param {?} col
|
|
2119
|
+
* @param {?} colIndex
|
|
2120
|
+
* @return {?}
|
|
2121
|
+
*/
|
|
2122
|
+
function (col, colIndex) {
|
|
2123
|
+
if (!col || !this.tableTotalOptionList || !this.tableTotalOptionList.length) {
|
|
2124
|
+
return null;
|
|
2125
|
+
}
|
|
2126
|
+
/** @type {?} */
|
|
2127
|
+
var visibleIndex = -1;
|
|
2128
|
+
for (var i = 0; i <= colIndex; i++) {
|
|
2129
|
+
/** @type {?} */
|
|
2130
|
+
var c = this.tableCols[i];
|
|
2131
|
+
if (c && c.isShow !== false) {
|
|
2132
|
+
visibleIndex++;
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
if (visibleIndex < 0 || visibleIndex >= this.tableTotalOptionList.length) {
|
|
2136
|
+
return null;
|
|
2137
|
+
}
|
|
2138
|
+
/** @type {?} */
|
|
2139
|
+
var meta = this.tableTotalOptionList[visibleIndex];
|
|
2140
|
+
return meta && typeof meta === "object" ? meta : null;
|
|
2141
|
+
};
|
|
2142
|
+
/** 合计单元格展示文案(对齐 detail-lines 小数规则) */
|
|
2143
|
+
/**
|
|
2144
|
+
* 合计单元格展示文案(对齐 detail-lines 小数规则)
|
|
2145
|
+
* @param {?} col
|
|
2146
|
+
* @param {?} colIndex
|
|
2147
|
+
* @return {?}
|
|
2148
|
+
*/
|
|
2149
|
+
HdTableComponent.prototype.getTableTotalCellValue = /**
|
|
2150
|
+
* 合计单元格展示文案(对齐 detail-lines 小数规则)
|
|
2151
|
+
* @param {?} col
|
|
2152
|
+
* @param {?} colIndex
|
|
2153
|
+
* @return {?}
|
|
2154
|
+
*/
|
|
2155
|
+
function (col, colIndex) {
|
|
2156
|
+
/** @type {?} */
|
|
2157
|
+
var meta = this.getTableTotalCellMeta(col, colIndex);
|
|
2158
|
+
if (!meta || meta.isHide) {
|
|
2159
|
+
return "";
|
|
2160
|
+
}
|
|
2161
|
+
/** @type {?} */
|
|
2162
|
+
var value = meta.value;
|
|
2163
|
+
if (!(value || value === 0)) {
|
|
2164
|
+
return "";
|
|
2165
|
+
}
|
|
2166
|
+
/** @type {?} */
|
|
2167
|
+
var preserve = meta.preserveNumber != null ? Number(meta.preserveNumber) : 2;
|
|
2168
|
+
if (value % 1 === 0 && !meta.showDecimal) {
|
|
2169
|
+
return value;
|
|
2170
|
+
}
|
|
2171
|
+
/** @type {?} */
|
|
2172
|
+
var factor = Math.pow(10, preserve);
|
|
2173
|
+
return (Math.round(Number(value) * factor) / factor).toFixed(preserve);
|
|
2174
|
+
};
|
|
2175
|
+
/**
|
|
2176
|
+
* @param {?} col
|
|
2177
|
+
* @param {?} colIndex
|
|
2178
|
+
* @return {?}
|
|
2179
|
+
*/
|
|
2180
|
+
HdTableComponent.prototype.getTableTotalCellAlign = /**
|
|
2181
|
+
* @param {?} col
|
|
2182
|
+
* @param {?} colIndex
|
|
2183
|
+
* @return {?}
|
|
2184
|
+
*/
|
|
2185
|
+
function (col, colIndex) {
|
|
2186
|
+
/** @type {?} */
|
|
2187
|
+
var meta = this.getTableTotalCellMeta(col, colIndex);
|
|
2188
|
+
/** @type {?} */
|
|
2189
|
+
var align = (meta && meta.align) || (col && col.align) || "left";
|
|
2190
|
+
if (align === "right" || align === "center" || align === "left") {
|
|
2191
|
+
return align;
|
|
2192
|
+
}
|
|
2193
|
+
return "left";
|
|
2194
|
+
};
|
|
1735
2195
|
/** 底部「共 n 条」:非分页/前端分页用 content.length,服务端分页用 totalElements */
|
|
1736
2196
|
/**
|
|
1737
2197
|
* 底部「共 n 条」:非分页/前端分页用 content.length,服务端分页用 totalElements
|
|
@@ -2341,13 +2801,14 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
2341
2801
|
HdTableComponent.decorators = [
|
|
2342
2802
|
{ type: Component, args: [{
|
|
2343
2803
|
selector: "hd-table",
|
|
2344
|
-
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 <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\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 class=\"hd-table-col-settings-footer\">\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 </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\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [nzScroll]=\"scroll\"\n [nzShowPagination]=\"pagination\" [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\"\n [nzFrontPagination]=\"useFrontPagination\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\"\n (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (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]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{ titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\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\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\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 [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\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 {{ getTableTotalCount() }} \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 [nzDisabled]=\"isSelectDisabled(data)\" (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]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\"\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]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\"\n [disabled]=\"isEditDisabled(col, data)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\"\n [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\"\n [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\"\n [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\"\n [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\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)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [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 && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\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)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
|
|
2804
|
+
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 <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\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 class=\"hd-table-col-settings-footer\">\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 </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\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--has-total]=\"showTableTotal\"\n [nzScroll]=\"scroll\"\n [nzShowPagination]=\"pagination\" [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\"\n [nzFrontPagination]=\"useFrontPagination\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\"\n (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\" [nzFooter]=\"showTableTotal ? tableTotalFooter : null\"\n [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 <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{ titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\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\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\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 [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Afluid\uFF0C\u8868\u5BBD 100%\uFF0C\u4E0E\u8868\u4F53\u540C\u6BD4\u4F8B\u88AB\u6491\u5F00\uFF0C\u4E0D\u518D\u6309\u58F0\u660E px \u9501\u6B7B\uFF1B\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Afixed\uFF0C\u8868\u5BBD = scroll.x\uFF0C\u6A2A\u6EDA\u4E0E\u8868\u4F53\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\" [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\"\n [style.width.px]=\"lineNumberColWidth\"\n [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"col.width\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n style=\"left: 0;\"> </td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [nzChecked]=\"mapOfCheckedId[data[selectField]]\"\n [nzDisabled]=\"isSelectDisabled(data)\" (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">{{ getLineNumber(index) }}</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]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\"\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]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\"\n [disabled]=\"isEditDisabled(col, data)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\"\n [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\"\n [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\"\n [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\"\n [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\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)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [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 && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\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)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
|
|
2345
2805
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2346
|
-
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}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}: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-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.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-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-table-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-table-col-settings .hd-table-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-table-cell-with-actions{display:inline-flex;flex-wrap:wrap;align-items:center;-moz-column-gap:12px;column-gap:12px;row-gap:6px;max-width:100%}.hd-table-cell-with-actions .hd-table-cell-value{min-width:0}.hd-table-cell-with-actions .hd-table-cell-actions{flex-shrink:0}.hd-table-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-table-col-settings-list{max-height:400px;overflow-y:auto}.hd-table-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.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 .hd-table-cell-value--edit,.hd-table-container .hd-table-cell-value--rowno{display:inline-flex;align-items:center;min-width:0}.hd-table-container .hd-table-cell-value--edit>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--edit>hd-status,.hd-table-container .hd-table-cell-value--edit>span:not(.hd-table-row-no),.hd-table-container .hd-table-cell-value--rowno>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--rowno>hd-status,.hd-table-container .hd-table-cell-value--rowno>span:not(.hd-table-row-no){min-width:0}.hd-table-container .hd-table-row-no{display:inline-flex;flex-shrink:0;align-items:center;margin-left:4px;color:#1d1f29;font-size:14px;line-height:22px}.hd-table-container .hd-table-row-no-bar{display:inline-block;flex:0 0 auto;align-self:center;width:1px;height:14px;margin-right:4px;background:#1d1f29;vertical-align:middle}.hd-table-container .hd-table-edit-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;margin-left:2px;width:14px;height:14px;color:#20b95d;line-height:1;cursor:pointer}.hd-table-container .hd-table-edit-icon:hover{color:#20bd62}.hd-table-container .hd-table-edit-icon svg{display:block;width:14px;height:14px}.hd-table-container .hd-table-title-with-bar{display:inline-flex;align-items:center}.hd-table-container .hd-table-title-with-bar .hd-table-row-no-bar{width:1px;height:14px;margin:0 4px;align-self:center}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!important}.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.hd-table--scroll-x ::ng-deep .ant-table-body>table,.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-header>table,.hd-table-container.hd-table--scroll-x ::ng-deep .cdk-virtual-scroll-content-wrapper>table{table-layout:fixed}.hd-table-container:not(.hd-table--scroll-y):not(.hd-table--scroll-x) ::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}.hd-table-cell-ellipsis{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.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}::ng-deep .ant-table-th-right-sticky .nz-resizable-handle-right{right:0}.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}.hd-table-cell-edit{width:100%;min-width:0}.hd-table-cell-edit-control{width:100%!important}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select{width:100%}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select-selection{height:32px}::ng-deep .hd-table-cell-edit .ant-input-number-input{height:30px}::ng-deep .hd-table-cell-edit .ant-select-selection__rendered{line-height:30px}"]
|
|
2806
|
+
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}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}: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-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.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-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-table-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-table-col-settings .hd-table-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-table-cell-with-actions{display:inline-flex;flex-wrap:wrap;align-items:center;-moz-column-gap:12px;column-gap:12px;row-gap:6px;max-width:100%}.hd-table-cell-with-actions .hd-table-cell-value{min-width:0}.hd-table-cell-with-actions .hd-table-cell-actions{flex-shrink:0}.hd-table-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-table-col-settings-list{max-height:400px;overflow-y:auto}.hd-table-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.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 .ant-table-tbody>tr>td.hd-table-line-no-col,.hd-table-container ::ng-deep .ant-table-thead>tr>th.hd-table-line-no-col{width:72px!important;min-width:72px!important;max-width:72px!important;box-sizing:border-box}.hd-table-container .hd-table-cell-value--edit,.hd-table-container .hd-table-cell-value--rowno{display:inline-flex;align-items:center;min-width:0}.hd-table-container .hd-table-cell-value--edit>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--edit>hd-status,.hd-table-container .hd-table-cell-value--edit>span:not(.hd-table-row-no),.hd-table-container .hd-table-cell-value--rowno>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--rowno>hd-status,.hd-table-container .hd-table-cell-value--rowno>span:not(.hd-table-row-no){min-width:0}.hd-table-container .hd-table-row-no{display:inline-flex;flex-shrink:0;align-items:center;margin-left:4px;color:#1d1f29;font-size:14px;line-height:22px}.hd-table-container .hd-table-row-no-bar{display:inline-block;flex:0 0 auto;align-self:center;width:1px;height:14px;margin-right:4px;background:#1d1f29;vertical-align:middle}.hd-table-container .hd-table-edit-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;margin-left:2px;width:14px;height:14px;color:#20b95d;line-height:1;cursor:pointer}.hd-table-container .hd-table-edit-icon:hover{color:#20bd62}.hd-table-container .hd-table-edit-icon svg{display:block;width:14px;height:14px}.hd-table-container .hd-table-title-with-bar{display:inline-flex;align-items:center}.hd-table-container .hd-table-title-with-bar .hd-table-row-no-bar{width:1px;height:14px;margin:0 4px;align-self:center}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!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.hd-table--scroll-x ::ng-deep .ant-table-body>table,.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-header>table,.hd-table-container.hd-table--scroll-x ::ng-deep .cdk-virtual-scroll-content-wrapper>table{table-layout:fixed}.hd-table-container:not(.hd-table--scroll-y):not(.hd-table--scroll-x) ::ng-deep .ant-table-body{max-height:none!important;overflow-y:visible!important}.hd-table-container.hd-table--has-total ::ng-deep .ant-table-footer{padding:0;overflow:hidden;background:#fafafa;border-top:1px solid #e8e8e8}.hd-table-total-footer{width:100%;box-sizing:border-box;overflow-x:auto;overflow-y:scroll;background:#fafafa;scrollbar-width:thin;scrollbar-color:transparent transparent}.hd-table-total-footer::-webkit-scrollbar{width:12px;height:0}.hd-table-total-footer::-webkit-scrollbar-track{background:0 0}.hd-table-total-footer::-webkit-scrollbar-thumb{background:padding-box;border:4px solid transparent}.hd-table-total-footer::-webkit-scrollbar-corner{background:0 0}.hd-table-total-footer.hd-table-total-footer--fluid{overflow-x:hidden}.hd-table-total-footer-table{table-layout:fixed;border-collapse:separate;border-spacing:0}.hd-table-total-footer-cell{padding:12px 8px;font-weight:500;background:#fafafa;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-bottom:0}.hd-table-total-footer-cell.hd-table-total-align-left{text-align:left!important}.hd-table-total-footer-cell.hd-table-total-align-center{text-align:center!important}.hd-table-total-footer-cell.hd-table-total-align-right{text-align:right!important}.hd-table-total-footer-select{width:40px;min-width:40px;max-width:40px;padding-left:8px;padding-right:8px;text-align:center}.hd-table-total-footer-line-no{width:72px;min-width:72px;max-width:72px}.hd-table-total-footer-sticky-left,.hd-table-total-footer-sticky-right{position:-webkit-sticky;position:sticky;z-index:2;background:#fafafa}::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}.hd-table-cell-ellipsis{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.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}::ng-deep .ant-table-th-right-sticky .nz-resizable-handle-right{right:0}.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}.hd-table-cell-edit{width:100%;min-width:0}.hd-table-cell-edit-control{width:100%!important}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select{width:100%}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select-selection{height:32px}::ng-deep .hd-table-cell-edit .ant-input-number-input{height:30px}::ng-deep .hd-table-cell-edit .ant-select-selection__rendered{line-height:30px}"]
|
|
2347
2807
|
}] }
|
|
2348
2808
|
];
|
|
2349
2809
|
/** @nocollapse */
|
|
2350
2810
|
HdTableComponent.ctorParameters = function () { return [
|
|
2811
|
+
{ type: ElementRef },
|
|
2351
2812
|
{ type: ChangeDetectorRef },
|
|
2352
2813
|
{ type: CommonSessionService }
|
|
2353
2814
|
]; };
|
|
@@ -2364,6 +2825,7 @@ var HdTableComponent = /** @class */ (function () {
|
|
|
2364
2825
|
rowInvalidField: [{ type: Input }],
|
|
2365
2826
|
showTableTotal: [{ type: Input }],
|
|
2366
2827
|
tableTotalOption: [{ type: Input }],
|
|
2828
|
+
columnsNumber: [{ type: Input }],
|
|
2367
2829
|
sortEvent: [{ type: Output }],
|
|
2368
2830
|
selectEvent: [{ type: Output }],
|
|
2369
2831
|
tableSearchEvent: [{ type: Output }],
|
|
@@ -2446,6 +2908,12 @@ if (false) {
|
|
|
2446
2908
|
HdTableComponent.prototype.showTableTotal;
|
|
2447
2909
|
/** @type {?} */
|
|
2448
2910
|
HdTableComponent.prototype.tableTotalOption;
|
|
2911
|
+
/**
|
|
2912
|
+
* 合计列总数(含序号列,与 hd-detail-lines 一致);
|
|
2913
|
+
* 不传则按当前可见数据列数 + 1(序号)推算。
|
|
2914
|
+
* @type {?}
|
|
2915
|
+
*/
|
|
2916
|
+
HdTableComponent.prototype.columnsNumber;
|
|
2449
2917
|
/** @type {?} */
|
|
2450
2918
|
HdTableComponent.prototype.sortEvent;
|
|
2451
2919
|
/** @type {?} */
|
|
@@ -2556,9 +3024,8 @@ if (false) {
|
|
|
2556
3024
|
*/
|
|
2557
3025
|
HdTableComponent.prototype.virtualScrollActive;
|
|
2558
3026
|
/**
|
|
2559
|
-
*
|
|
3027
|
+
* 列宽合计(含勾选/序号),footer 表宽与横向 scroll 共用
|
|
2560
3028
|
* @type {?}
|
|
2561
|
-
* @private
|
|
2562
3029
|
*/
|
|
2563
3030
|
HdTableComponent.prototype.tableColWidthTotal;
|
|
2564
3031
|
/**
|
|
@@ -2580,6 +3047,27 @@ if (false) {
|
|
|
2580
3047
|
HdTableComponent.prototype.currentSortValue;
|
|
2581
3048
|
/** @type {?} */
|
|
2582
3049
|
HdTableComponent.prototype.nzTableComponent;
|
|
3050
|
+
/**
|
|
3051
|
+
* @type {?}
|
|
3052
|
+
* @private
|
|
3053
|
+
*/
|
|
3054
|
+
HdTableComponent.prototype.totalFooterScrollBoundBody;
|
|
3055
|
+
/**
|
|
3056
|
+
* @type {?}
|
|
3057
|
+
* @private
|
|
3058
|
+
*/
|
|
3059
|
+
HdTableComponent.prototype.totalFooterScrollHandler;
|
|
3060
|
+
/**
|
|
3061
|
+
* @type {?}
|
|
3062
|
+
* @private
|
|
3063
|
+
*/
|
|
3064
|
+
HdTableComponent.prototype.totalFooterSyncRetry;
|
|
3065
|
+
/**
|
|
3066
|
+
* 序号列固定宽(含 padding,可容纳 6 位如 199995)。
|
|
3067
|
+
* 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。
|
|
3068
|
+
* @type {?}
|
|
3069
|
+
*/
|
|
3070
|
+
HdTableComponent.prototype.lineNumberColWidth;
|
|
2583
3071
|
/** @type {?} */
|
|
2584
3072
|
HdTableComponent.prototype.trackByRow;
|
|
2585
3073
|
/**
|
|
@@ -2591,6 +3079,11 @@ if (false) {
|
|
|
2591
3079
|
HdTableComponent.prototype.trackByCol;
|
|
2592
3080
|
/** @type {?} */
|
|
2593
3081
|
HdTableComponent.prototype.beforeDrop;
|
|
3082
|
+
/**
|
|
3083
|
+
* @type {?}
|
|
3084
|
+
* @private
|
|
3085
|
+
*/
|
|
3086
|
+
HdTableComponent.prototype.hostEl;
|
|
2594
3087
|
/**
|
|
2595
3088
|
* @type {?}
|
|
2596
3089
|
* @private
|
|
@@ -2602,4 +3095,4 @@ if (false) {
|
|
|
2602
3095
|
*/
|
|
2603
3096
|
HdTableComponent.prototype.commonSessionService;
|
|
2604
3097
|
}
|
|
2605
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxZQUFZLEdBR2IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEdBQ3ZCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixRQUFRLEdBQ1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QjtJQWdIRSwwQkFDVSxHQUFzQixFQUN0QixvQkFBMEM7UUFGcEQsaUJBVUM7UUFUUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBMUczQyxjQUFTLEdBQXlCLEVBQUUsQ0FBQztRQUVyQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5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Qyw0Q0FBZ0Q7Ozs7O0lBRWhELHNDQUE2RDs7SUFDN0Qsd0NBQXVDOzs7OztJQUV2QyxzQ0FBb0Q7Ozs7Ozs7O0lBT3BELDJDQUEwRDs7SUFFMUQsMENBQW9DOztJQUNwQyx5Q0FBcUM7O0lBQ3JDLDhDQUFxQzs7SUFDckMsNkNBQW9DOztJQUNwQyxnREFBeUQ7O0lBQ3pELCtDQUF3RDs7SUFDeEQsb0RBQTZEOztJQUM3RCxzQ0FBNEU7O0lBQzVFLDJDQUNrQzs7SUFDbEMsNENBQ21DOztJQUNuQyxrQ0FBYzs7SUFHZCxtREFBZ0M7O0lBQ2hDLDJDQUF3Qjs7SUFDeEIsNkNBQXVCOztJQUN2Qix5Q0FBbUI7O0lBQ25CLDJDQUFnRDs7SUFDaEQsMENBQWdEOztJQUNoRCwwQ0FBNEM7O0lBRTVDLGdEQUEwQjs7SUFFMUIsNENBQTREOztJQUM1RCx1Q0FBaUI7O0lBRWpCLDBDQUEwQzs7SUFDMUMscUNBQTJCOztJQUMzQiw4Q0FBeUM7O0lBQ3pDLG1EQUE4Qzs7SUFDOUMseUNBQStCOztJQUUvQiw2Q0FBbUM7O0lBRW5DLHdDQUFtQzs7SUFFbkMseUNBQW9DOztJQUdwQyw4Q0FBeUM7O0lBQ3pDLCtDQUEwQzs7SUFDMUMsc0NBQTRCOztJQUM1Qix1Q0FBd0I7O0lBQ3hCLHdDQUEwQjs7SUFDMUIsbURBQXdDOztJQUN4QyxrREFBd0M7Ozs7O0lBR3hDLG1EQUE2Qjs7Ozs7O0lBRzdCLCtDQUFtRDs7Ozs7O0lBR25ELDhDQUErQjs7Ozs7O0lBRy9CLGlEQUFzQzs7Ozs7O0lBR3RDLDBDQUFzQzs7Ozs7SUFDdEMsNENBQXdDOztJQUV4Qyw0Q0FBNEU7O0lBa081RSxzQ0FHRTs7Ozs7SUFHRiw2Q0FBcUQ7O0lBRXJELHNDQUVFOztJQW9ZRixzQ0FnQ0U7Ozs7O0lBN29CQSwrQkFBOEI7Ozs7O0lBQzlCLGdEQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBOelRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvdGFibGVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xXaWR0aCB9IGZyb20gXCIuLi9tb2RlbC9jb2xXaWR0aFwiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBtZWFzdXJlVGFibGVDb2xXaWR0aCxcbiAgcmVzb2x2ZUF1dG9UYWJsZVNjcm9sbCxcbn0gZnJvbSBcIi4uL3V0aWxzL2hkLXRhYmxlLXNjcm9sbC51dGlsXCI7XG5pbXBvcnQge1xuICBIZFRhYmxlQ2VsbENoYW5nZSxcbiAgSGRUYWJsZUNvbHVtbixcbiAgSGRUYWJsZVRvdGFsT3B0aW9uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgdGFibGVDb2xzOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBASW5wdXQoKSB0YWJsZURhdGE6IFBhZ2U8YW55PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd09wZXJhdGVDb2xXYXJwQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvKipcbiAgICog6KGM5Yu+6YCJ56aB55So5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuemgeeUqOivpeihjOWLvumAie+8iOWFqOmAieS5n+S8mui3s+i/h++8ieOAglxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0RGlzYWJsZWRGaWVsZDogc3RyaW5nO1xuICAvKipcbiAgICog6KGM5aSx5pWI5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuaVtOihjOiDjOaZr+iJsuS4uiAjRjdGOEZB44CCXG4gICAqL1xuICBASW5wdXQoKSByb3dJbnZhbGlkRmllbGQ6IHN0cmluZztcbiAgLy8g5ZCI6K6h5Yy65Z+fXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VGFibGVUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0YWJsZVRvdGFsT3B0aW9uOiBBcnJheTxIZFRhYmxlVG90YWxPcHRpb24+O1xuICBAT3V0cHV0KCkgc29ydEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB0YWJsZVNlYXJjaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiog6KGM5YaF57yW6L6R5Y+Y5pu077yI5bey5YaZ5Zue6KGM5a+56LGh77ybcHJldmlvdXMqIOS+m+aOpeWPo+Wksei0peWbnua7mu+8iSAqL1xuICBAT3V0cHV0KCkgY2VsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SGRUYWJsZUNlbGxDaGFuZ2U+KCk7XG4gIEBJbnB1dCgpIHRhYmxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5pi+56S65YiG6aG177ybZmFsc2Ug5pe25LiA5qyh5bGV56S6IHRhYmxlRGF0YS5jb250ZW50IOWFqOmDqOihjCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKlxuICAgKiDmmK/lkKbliY3nq6/liIbpobXvvIjlr7kgY29udGVudCDlhajph4/liIfniYfvvInjgIJcbiAgICogdHJ1Ze+8mue/u+mhteS4jeinpuWPkSB0YWJsZVNlYXJjaEV2ZW5077yM6YCC5ZCI6K+m5oOF5YWo6YeP5pWw5o2u77ybXG4gICAqIGZhbHNl77yI6buY6K6k77yJ77ya5pyN5Yqh56uv5YiG6aG177yM57+76aG16Kem5Y+R5p+l6K+i77yI546w5pyJ5YiX6KGo6KGM5Li677yJ44CCXG4gICAqIOS4jiBwYWdpbmF0aW9uPWZhbHNlIOWQjOaXtueUqOaXtuS7peS4jeWIhumhteS4uuWHhuOAglxuICAgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGZyb250UGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDooajmoLzliIbpobXlj4LmlbBcbiAgQElucHV0KCkgdGFibGVQYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHRhYmxlUGFnZVNpemU6IG51bWJlciA9IDEwMDtcbiAgQElucHV0KCkgaXNGaXJzdEVudHJ5U2VhcmNoOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0Nyb3NzUGFnZVNlbGVjdDogYm9vbGVhbjtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlVG90YWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlVG90YWw6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZUxlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlTGVmdEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlUmlnaHRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlUmlnaHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIHNjcm9sbCA9IG51bGw7XG5cbiAgLy8g6KGo5qC85Yu+6YCJ5Y+C5pWwXG4gIGlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gIGlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICBsaXN0T2ZEaXNwbGF5RGF0YSA9IFtdO1xuICBsaXN0T2ZBbGxEYXRhID0gW107XG4gIGxpc3RPZlNlbGVjdGlvbjogQXJyYXk8YW55PiB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBtYXBPZkNoZWNrZWRJZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgbWFwT2ZDaGVja0xpc3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgLy8g5ZCI6K6h5Y+C5pWwXG4gIHRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gIC8vIOe8k+WtmOS/oeaBr1xuICB0YWJsZUNhY2hlT3B0aW9uOiBUYWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgdXNlclNlc3Npb246IGFueTtcblxuICB0YWJsZUNvbHNDYWNoZTogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgc2hvd1RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdENvbExpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNlbGVjdENvbExpc3ROb2Rlc0NhY2hlOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOiuvue9ruWIl+eahOWPr+ingeaTjeS9nOaVsOe7hFxuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAvLyDorr7nva7liJfnmoTkuI3lj6/op4Hmk43kvZzmlbDnu4RcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG5cbiAgLy8g54K55Ye75pe26ZyA6KaB5pyJ5Li05pe25pWw57uE5a2Y5pS+5Lik5LiqdHJlZSznlKjkuo7lj5bmtojml7blgJnmgaLlpI3osIPmlbTliY3nmoTnirbmgIFcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbG9jYWxmb3JhZ2U6IGFueSA9IG51bGw7XG4gIGxvY2FsdGlvblRtcDogc3RyaW5nID0gXCJcIjtcbiAgaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBpc0Nyb3NzUGFnZVNlbGVjdExvY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIOiHquWKqOa1i+mHj+WJjeeahOWFnOW6leihjOmrmO+8jOa1i+mHj+WujOaIkOWQjuS8muabtOaWsCAqL1xuICBtZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IDQ3O1xuXG4gIC8qKiDorrDlvZXlvZPliY3mmK/lkKblpITkuo7omZrmi5/mu5rliqjmqKHlvI/vvIznlKjkuo7liIfmjaIgcGFnZVNpemUg5pe26YeN5bu66KGo5qC8ICovXG4gIHByaXZhdGUgdmlydHVhbFNjcm9sbEFjdGl2ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiDlj6/op4HliJfmgLvlrr3vvIznlKjkuo7liKTmlq3mmK/lkKbpnIDopoHmqKrlkJHmu5rliqggKi9cbiAgcHJpdmF0ZSB0YWJsZUNvbFdpZHRoVG90YWwgPSAwO1xuXG4gIC8qKiDmlbDmja7mm7TmlrDlkI7lvoXlpI3kvY3nurXlkJHmu5rliqjkvY3nva4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcblxuICAvKiog5b2T5YmN5o6S5bqP77yM6KGo5qC86YeN5bu65ZCO55So5LqO5oGi5aSN6KGo5aS05o6S5bqP5oCBICovXG4gIHByaXZhdGUgY3VycmVudFNvcnRLZXk6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFNvcnRWYWx1ZTogc3RyaW5nID0gbnVsbDtcblxuICBAVmlld0NoaWxkKFwiaGRUYWJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbnpUYWJsZUNvbXBvbmVudDogTnpUYWJsZUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlkI3np7BcbiAgICAgIHZlcnNpb246IDEuMCwgLy8g6K6+572u5a2Y5YKo5bqT55qE54mI5pysXG4gICAgICBzdG9yZU5hbWU6IFwiaGQtZnNjbS1zdG9yZVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlrZjlgqjnqbrpl7TlkI3np7BcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3QgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCA9IHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3Q7XG4gICAgfVxuICAgIHRoaXMubG9jYWx0aW9uVG1wID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHRoaXMubG9jYWx0aW9uVG1wKSB7XG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCA9IHRoaXMubG9jYWx0aW9uVG1wLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG4gICAgfVxuICAgIHRoaXMudXNlclNlc3Npb24gPSB0aGlzLmNvbW1vblNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oXG4gICAgICBcIl9fanlfYXV0aG9yaXphdGlvbl9zZXNzaW9uX19cIixcbiAgICApO1xuICAgIC8vIOeUqOS6juW8gOWPkeeOr+Wig+iwg+ivlVxuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHtcbiAgICAgICAgdXNlckNvZGU6IFwiZGV2XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMVwiLCBlKTtcbiAgICAgICAgdGhyb3cgXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uFwiO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2UpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZVNpemVcIl0gIT09XG4gICAgICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXVtcInByZXZpb3VzVmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSB8fFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZU51bWJlclwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VOdW1iZXJcIl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAvLyDku4XomZrmi58v5pmu6YCa5qih5byP55yf5q2j5YiH5o2i5pe26YeN5bu677yM6YG/5YWN5o6S5bqP5ZCO5pWw5o2u5Yi35paw5oqK5o6S5bqP5oCB5riF5o6JXG4gICAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g57+76aG1L+aUuSBwYWdlU2l6Ze+8muS4u+WKqOWkmuasoeWkjeS9je+8jOimhuebliBDREsg5byC5q2l5riy5p+T5pe25bqPXG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0pIHtcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgLy8g5pWw5o2u5Yi35paw5LiN5by65Yi26YeN5bu677yM5Y+q5Zyo5rua5Yqo5qih5byP5Y+Y5YyW5pe2IHJlbW91bnRcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyDmlbDmja7mm7TmlrDlkI7lpI3kvY3nurXlkJHmu5rliqjvvIjlkKvomZrmi5/mu5rliqjlnLrmma/vvIlcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgLnJlYWR5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMlwiLCBlKTtcbiAgICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzW1wicGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcInBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAoY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSlcbiAgICApIHtcbiAgICAgIC8vIOWIhumhteaooeW8j+WIh+aNoumcgOmHjeW7uiBuei10YWJsZe+8iGZyb250IC8gc2VydmVyIC8gbm9uZe+8iVxuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOaYr+WQpui1sOWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWIh+eJh++8jOS4jeivt+axguWQjuerr++8iSAqL1xuICBnZXQgdXNlRnJvbnRQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGlvbiAmJiAhIXRoaXMuZnJvbnRQYWdpbmF0aW9uO1xuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0S2V5ID0gc29ydCAmJiBzb3J0LmtleTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgPSBzb3J0ICYmIHNvcnQudmFsdWU7XG4gICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgfVxuXG4gIGdldENvbFNvcnQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5jYW5Tb3J0IHx8ICF0aGlzLmN1cnJlbnRTb3J0S2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5uYW1lID09PSB0aGlzLmN1cnJlbnRTb3J0S2V5ID8gdGhpcy5jdXJyZW50U29ydFZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZVNob3dEZXRhaWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGV0YWlsID0gIXRoaXMuc2hvd0RldGFpbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gIH1cblxuICBnZXQgZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsSXRlbVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIOe6teWQkeWPr+eUqOmrmOW6puaJo+WHj++8muaMiemSruWMui/lkIjorqEv5YiG6aG1562J5Zu65a6a5Y2g5L2N44CCXG4gICAqIOW/hemhu+S4jiBkZWFsU2Nyb2xsIC8gcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCDkvb/nlKjlkIzkuIDlpZfvvIzlkKbliJnkvJror6/liKTjgIzog73mlL7kuIvjgI3ogIzkuI3orr4gc2Nyb2xsLnnjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsWU1heE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwKSArIDIxNjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3op4blj6Plrp7pmYXlsZXnpLrnmoTooYzmlbDjgIJcbiAgICog5YmN56uv5YiG6aG15oyJIHBhZ2VJbmRleC9wYWdlU2l6ZSDliIfniYfkvLDnrpfvvIzpgb/lhY3nlKjlhajph48gbGVuZ3RoIOivr+WIpOmcgOimgee6teWQkea7muWKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgY29uc3QgdG90YWwgPSBjb250ZW50Lmxlbmd0aDtcbiAgICBpZiAoIXRoaXMudXNlRnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgcGFnZVNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAxMDtcbiAgICBjb25zdCBwYWdlSW5kZXggPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc3RhcnQgPSAocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBpZiAoc3RhcnQgPj0gdG90YWwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocGFnZVNpemUsIHRvdGFsIC0gc3RhcnQpO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteWGheWuuemrmOW6puaYr+WQpui2heWHuuinhuWPo++8iOmcgOimgeihqOWGhee6teWQkea7muWKqO+8iSAqL1xuICBnZXQgbmVlZHNWZXJ0aWNhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZVJvd0NvdW50KCk7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gcm93Q291bnQgKiB0aGlzLmVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIGVzdGltYXRlZEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1heE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvdW50ID4gMTAwO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteaVsOaNruiDveWujOaVtOWxleekuuaXtuS4jeWQr+eUqOiZmuaLn+a7muWKqO+8jOmBv+WFjeWwkemHj+aVsOaNruS5n+WHuueOsOa7muWKqOadoSAqL1xuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZWVkc1ZlcnRpY2FsU2Nyb2xsO1xuICB9XG5cbiAgZ2V0UmlnaHRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJyaWdodFwiID8gYCR7Y29sLmZpeGVkUmlnaHRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICBnZXRMZWZ0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwibGVmdFwiID8gYCR7Y29sLmZpeGVkV2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgdHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyLCBkYXRhOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleSA9IGRhdGEgJiYgZGF0YVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICByZXR1cm4ga2V5ICE9IG51bGwgPyBTdHJpbmcoa2V5KSA6IGByb3ctJHtpbmRleH1gO1xuICB9O1xuXG4gIC8qKiDomZrmi5/mu5rliqjmjInmlbDnu4TkuIvmoIfov73ouKrvvIzpgb/lhY3kuJrliqHkuLvplK4gdHJhY2tCeSDlr7zoh7QgQ0RLIOihjOWkjeeUqOmUmeS9jSAqL1xuICB2aXJ0dWFsVHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIHRyYWNrQnlDb2wgPSAoX2luZGV4OiBudW1iZXIsIGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGNvbC50aXRsZTtcbiAgfTtcblxuICBnZXRJbml0TG9jYWxmb3JhZ2UoKSB7XG4gICAgLy8g6aaW5YWI6I635Y+W5b2T5YmNaGQtdGFibGXlrZjlgqjnmoTmlbDmja4g5aaC5p6c5rKh5pyJ77yM5YiZ5Yid5aeL5YyW5LiL5b2T5YmN55qE5pWw5o2uXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLmdldEl0ZW0oXG4gICAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgIHRoaXMudXVpZCxcbiAgICAgIClcbiAgICAgIC50aGVuKCh2YWx1ZTogVGFibGVDYWNoZU9wdGlvbikgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID4gMTBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZSA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZTtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB9XG4gICAgICAgIC8vIOacjeWKoeerr+WIhumhteaJjeWcqOWIneWni+WMluaXtuaKmyBwYWdlU2l6ZUNoYW5nZUV2ZW50IOinpuWPkeeItuafpeivou+8m+WJjeerr+WIhumhteS4jeaKm1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgIXRoaXMuZnJvbnRQYWdpbmF0aW9uICYmXG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluaXRUYWJsZSgpIHtcbiAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy51dWlkKSB7XG4gICAgICB0aHJvdyBcImhkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaAp1wiO1xuICAgIH1cbiAgICBpZiAodGhpcy5qdWRnZVJlcGVhdENvbHMoKSkge1xuICAgICAgdGhpcy5kZWFsQ29scygpO1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB0aGlzLmRlYWxPcGVyYXRlQnRuKCk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiog6Jma5oufL+aZrumAmuaooeW8j+WIh+aNouaXtumHjeW7uuihqOagvO+8jOmBv+WFjeaui+eVmea7muWKqOWuueWZqCAqL1xuICBhcHBseVRhYmxlU2Nyb2xsTW9kZShmb3JjZVJlbW91bnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG4gICAgY29uc3QgbW9kZUNoYW5nZWQgPVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSBudWxsICYmXG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgIT09IHVzZVZpcnR1YWw7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gdXNlVmlydHVhbDtcblxuICAgIGlmIChmb3JjZVJlbW91bnQgfHwgbW9kZUNoYW5nZWQpIHtcbiAgICAgIC8vIOW/hemhu+WFiOWGmeWlvSBzY3JvbGwuee+8jOWGjeWIm+W7uiBuei10YWJsZeOAglxuICAgICAgLy8gbmctem9ycm8g5Y+q5ZyoIEFmdGVyVmlld0luaXQg57uR5LiA5qyhIGhlYWRlci9ib2R5IOeahCBzY3JvbGwg5ZCM5q2l77ybXG4gICAgICAvLyDoi6XlhYjku6UgeT1udWxsIOWIm+W7uuWGjeaUueaIkOaciSB577yM6KGo5aS055uR5ZCs5Lya5Lii77yM6KGo546w5Li65YiX5aS05LiN6Lef552A5qiq5rua44CCXG4gICAgICB0aGlzLnByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbCk7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgY29uc3QgbmV4dEhhc1kgPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC55KTtcbiAgICAvLyDov5DooYzkuK0geSDku47mnInlj5jml6Av5LuO5peg5Y+Y5pyJ5pe277yM5Lmf5b+F6aG76YeN5bu677yM5ZCm5YiZ5ZCM5q2l55uR5ZCs5LuN5oyH5ZCR5penIERPTVxuICAgIGlmIChwcmV2SGFzWSAhPT0gbmV4dEhhc1kpIHtcbiAgICAgIHRoaXMuc2hvd1RhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dUYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICB9XG5cbiAgLyoqIOmHjeW7uuWJjemihOiuviBzY3JvbGzvvIzkv53or4EgQWZ0ZXJWaWV3SW5pdCDml7YgaGVhZGVyL2JvZHkg57uT5p6E5bey5q2j56GuICovXG4gIHByaXZhdGUgcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCh1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgeCA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueCA6IG51bGw7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7IHgsIHk6IG51bGwgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4LFxuICAgICAgeTogYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZSh0cnVlKTtcbiAgICAgIC8vIOWunua1i+ihjOmrmOWQjuWPr+iDveS7juOAjOiDveaUvuS4i+OAjeWPmOS4uuOAjOi2heWHuuOAje+8jOmcgOWIh+aNoua7muWKqOaooeW8j1xuICAgICAgaWYgKHRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydChmb3JjZU1lYXN1cmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICBpZiAoZm9yY2VNZWFzdXJlKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9XG4gICAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZWFzdXJlZCA9IHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgaWYgKG1lYXN1cmVkKSB7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDmlbDmja7liLfmlrDlkI7lsIbooajkvZPnurXlkJHmu5rliqjlpI3kvY3liLDpobbpg6ggKi9cbiAgcHJpdmF0ZSByZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuelRhYmxlID0gdGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9PZmZzZXQoMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvSW5kZXggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4KDApO1xuICAgICAgfVxuICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgIHZpZXdwb3J0LmVsZW1lbnRSZWYgJiZcbiAgICAgICAgKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICB2aWV3cG9ydEVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJvZHlDYW5kaWRhdGVzID0gW1xuICAgICAgbnpUYWJsZS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlFbGVtZW50ICYmIG56VGFibGUudGFibGVCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgIF07XG4gICAgYm9keUNhbmRpZGF0ZXMuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0YWJsZU1haW4gPVxuICAgICAgbnpUYWJsZS50YWJsZU1haW5FbGVtZW50ICYmXG4gICAgICAobnpUYWJsZS50YWJsZU1haW5FbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGlmICghdGFibGVNYWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVzID0gdGFibGVNYWluLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIi5hbnQtdGFibGUtYm9keSwgY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XCIsXG4gICAgKTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVzLCAoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaVsOaNruabtOaWsOWQjuWkmuasoeWwneivleWkjeS9jeOAglxuICAgKiBuZy16b3JybyA4ICsgQ0RLIOiZmuaLn+a7muWKqOS8muWcqOaVsOaNruWIt+aWsOWQjuW8guatpeaUueWGmSBzY3JvbGxUb3DvvIzljZXmrKHlpI3kvY3nu4/luLjooqvopobnm5bjgIJcbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICAvLyDlpJrmrKHlsJ3or5XvvJropobnm5YgbnotdGFibGUgLyBDREsg6Jma5ouf5rua5Yqo5byC5q2l5pS55YaZIHNjcm9sbFRvcFxuICAgIGNvbnN0IGRlbGF5cyA9IFswLCA1MCwgMTAwXTtcbiAgICBkZWxheXMuZm9yRWFjaCgobXMsIGluZGV4KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IGRlbGF5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICB9XG5cbiAgLyoqIOacquaJi+WKqOS8oCB2aXJ0dWFsSXRlbVNpemUg5pe277yM5LuO5bey5riy5p+T6KGM5rWL6YeP55yf5a6e6auY5bqmICovXG4gIG1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnZpcnR1YWxJdGVtU2l6ZSAhPSBudWxsICYmIHRoaXMudmlydHVhbEl0ZW1TaXplID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgY29uc3QgdGFibGVCb2R5ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJlxuICAgICAgKHRoaXMubnpUYWJsZUNvbXBvbmVudC50YWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCByb3cgPVxuICAgICAgKHZpZXdwb3J0ICYmXG4gICAgICAgICgodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwidHIuaGQtdGFibGUtdmlydHVhbC1yb3dcIixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudCkpIHx8XG4gICAgICAodGFibGVCb2R5ICYmICh0YWJsZUJvZHkucXVlcnlTZWxlY3RvcihcInRib2R5IHRyXCIpIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgaWYgKCFyb3cgfHwgcm93Lm9mZnNldEhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhlaWdodCA9IHJvdy5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKGhlaWdodCA9PT0gdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gaGVpZ2h0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8g6K6+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+KCk7XG4gICAgfSBlbHNlIGlmICghKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgT2JqZWN0LmtleXModGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbFdpZHRocy5zZXQoa2V5LCAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBhcyBhbnkpW2tleV0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gY29sV2lkdGhzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZS5zZXRJdGVtKFxuICAgICAgXCJoZC10YWJsZV9cIiArXG4gICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLnV1aWQsXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGp1ZGdlUmVwZWF0Q29scygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNbaV0udGl0bGUgPT09IHRoaXMudGFibGVDb2xzW2pdLnRpdGxlKSB7XG4gICAgICAgICAgdGhyb3cgYGhkLXRhYmxl57uE5Lu25Lit5YiX5ZCNICR7dGhpcy50YWJsZUNvbHNbaV0udGl0bGV9IOmHjeWkjWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblJlc2l6ZSh7IHdpZHRoIH06IE56UmVzaXplRXZlbnQsIGNvbDogSGRUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMubm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGxldCB0ZW1wV2lkdGggPSAwO1xuICAgIGlmICh3aWR0aCA+IGNvbC5taW5XaWR0aCkge1xuICAgICAgdGVtcFdpZHRoID0gd2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBXaWR0aCA9IGNvbC5taW5XaWR0aDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zZXQoY29sLnRpdGxlLCB0ZW1wV2lkdGgpO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLm1hcCgoZSkgPT5cbiAgICAgIGUudGl0bGUgPT09IGNvbC50aXRsZSA/IHsgLi4uZSwgd2lkdGg6IHRlbXBXaWR0aCB9IDogZSxcbiAgICApO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZGVhbE9wZXJhdGVCdG4oKSB7XG4gICAgbGV0IG9wZXJhdGVDb2wgPSB0aGlzLnRhYmxlQ29scy5maW5kKChjb2wpID0+IGNvbC50aXRsZSA9PT0gXCLmk43kvZxcIikgfHwgbnVsbDtcbiAgICBpZiAob3BlcmF0ZUNvbCkge1xuICAgICAgbGV0IHRleHRTdHIgPSBcIlwiO1xuICAgICAgb3BlcmF0ZUNvbC5idG5MaXN0LmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBpZiAoIWJ0bi5pc1JlcGVhdCkge1xuICAgICAgICAgIHRleHRTdHIgKz0gdHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIgPyBcIuaTjeS9nFwiIDogYnRuLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRTdHI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgb3BlcmF0ZUNvbC53aWR0aCA9XG4gICAgICAgIHNwYW4ub2Zmc2V0V2lkdGggK1xuICAgICAgICAob3BlcmF0ZUNvbC5idG5MaXN0LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNSZXBlYXQpLmxlbmd0aCAtIDEpICogNCArXG4gICAgICAgIDE2O1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55KSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgbmVlZFNob3dDb25maXJtKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBidG4uc2hvd0NvbmZpcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGJ0bi5zaG93Q29uZmlybShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhYnRuLnNob3dDb25maXJtO1xuICB9XG5cbiAgZ2V0QnRuTmFtZShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBidG4ubmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLm5hbWUoZGF0YSkgfHwgXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIGJ0bi5uYW1lICE9IG51bGwgPyBTdHJpbmcoYnRuLm5hbWUpIDogXCJcIjtcbiAgfVxuXG4gIGlzRGFuZ2VyQnRuKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnRuTmFtZShidG4sIGRhdGEpID09PSBcIuWIoOmZpFwiO1xuICB9XG5cbiAgLyoqIOiZmuaLn+a7muWKqOW8gOWQr+aXtuS9v+eUqOinhuWPo+acgOWkp+mrmOW6piAqL1xuICBwcml2YXRlIGdldFZpcnR1YWxTY3JvbGxZKG1heE9mZnNldDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWJsZURhdGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy50YWJsZURhdGEgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDliJfmgLvlrr3otoXlh7rlpJblsYLlrrnlmajmiY3lkK/nlKjmqKrlkJEgc2Nyb2xs77yI5LiN6IO955SoIHRhYmxlIOiHqui6q+WuveW6pu+8jOS8muiiqyBzY3JvbGwueCDmkpHlrr3vvIkgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2Nyb2xsWChjb2xXaWR0aDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IHdpZHRoID0gY29sV2lkdGg7XG4gICAgaWYgKHRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgY29uc3QgbWVhc3VyZWQgPSBtZWFzdXJlVGFibGVDb2xXaWR0aCh0aGlzLm56VGFibGVDb21wb25lbnQpO1xuICAgICAgaWYgKG1lYXN1cmVkID4gd2lkdGgpIHtcbiAgICAgICAgd2lkdGggPSBtZWFzdXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXV0b1Njcm9sbCA9IHJlc29sdmVBdXRvVGFibGVTY3JvbGwoXG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQsXG4gICAgICB0aGlzLmhhc1RhYmxlRGF0YSgpLFxuICAgICAgd2lkdGgsXG4gICAgKTtcbiAgICByZXR1cm4gYXV0b1Njcm9sbCA/IGF1dG9TY3JvbGwueCA6IG51bGw7XG4gIH1cblxuICAvKiog6KGo5qC85riy5p+T5ZCO5oyJ5a6e6ZmF5a655Zmo5a695bqm5qCh5q2j5qiq5ZCRIHNjcm9sbO+8iOWPquaUuSB477yM6YG/5YWN6Kem5Y+R6KGo5aS057uT5p6E5Y+Y5YyW77yJICovXG4gIHByaXZhdGUgc3luY0hvcml6b250YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsWCA9IHRoaXMucmVzb2x2ZVNjcm9sbFgodGhpcy50YWJsZUNvbFdpZHRoVG90YWwpO1xuICAgIGNvbnN0IGN1cnJlbnRZID0gdGhpcy5zY3JvbGwgPyB0aGlzLnNjcm9sbC55IDogbnVsbDtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNjcm9sbCAmJlxuICAgICAgdGhpcy5zY3JvbGwueCA9PT0gc2Nyb2xsWCAmJlxuICAgICAgdGhpcy5zY3JvbGwueSA9PT0gY3VycmVudFlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5L+d5oyBIHkg5LiN5Y+Y77yM6Ziy5q2i6L+Q6KGM5Lit5ouGL+WQiCBoZWFkZXIg5a+86Ie05qiq5ZCR5ZCM5q2l5aSx5pWIXG4gICAgdGhpcy5zY3JvbGwgPSB7IHg6IHNjcm9sbFgsIHk6IGN1cnJlbnRZIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNIZWFkZXJCb2R5U2Nyb2xsTGVmdCgpKTtcbiAgfVxuXG4gIC8qKiDmiYvliqjmiorooajkvZPmqKrlkJHmu5rliqjlkIzmraXliLDooajlpLTvvIjlhZzlupUgbmctem9ycm8g55uR5ZCs5Lii5aSx55qE5oOF5Ya177yJICovXG4gIHByaXZhdGUgc3luY0hlYWRlckJvZHlTY3JvbGxMZWZ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uelRhYmxlQ29tcG9uZW50IHx8ICF0aGlzLnNjcm9sbCB8fCAhdGhpcy5zY3JvbGwueCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSAodGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueSkudGFibGVIZWFkZXJOYXRpdmVFbGVtZW50IGFzXG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IG51bGw7XG4gICAgY29uc3QgYm9keSA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzXG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFoZWFkZXIgfHwgIWJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGhlYWRlci5zY3JvbGxMZWZ0ICE9PSBib2R5LnNjcm9sbExlZnQpIHtcbiAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIGRlYWxTY3JvbGwoKSB7XG4gICAgbGV0IGNvbFdpZHRoID0gMDtcbiAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWQpIHtcbiAgICAgIGNvbFdpZHRoICs9IDQwO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0ud2lkdGgpIHtcbiAgICAgICAgaXRlbS53aWR0aCA9IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uaXNTaG93KSB7XG4gICAgICAgIGl0ZW0uZml4ZWRXaWR0aCA9IGNvbFdpZHRoO1xuICAgICAgICBjb2xXaWR0aCArPSBpdGVtLndpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Y+z5L6n5Zu65a6a5YiX77ya5LuO5Y+z5b6A5bem57Sv6K6h5YGP56e777yM6YG/5YWN5aSa5YiX6YO9IHJpZ2h0OjAg5LqS55u46YGu5oyhXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmICghaXRlbS5pc1Nob3cpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRSaWdodFdpZHRoID0gcmlnaHRPZmZzZXQ7XG4gICAgICAgIHJpZ2h0T2Zmc2V0ICs9IGl0ZW0ud2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPSBjb2xXaWR0aDtcbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IHNjcm9sbFggPSB0aGlzLnJlc29sdmVTY3JvbGxYKGNvbFdpZHRoKTtcblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBudWxsLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6IHNjcm9sbFgsXG4gICAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4OiBzY3JvbGxYLFxuICAgICAgeTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQpLFxuICAgIH07XG4gIH1cblxuICAvLyDooajmoLzli77pgInpgLvovpFcbiAgY3VycmVudFBhZ2VEYXRhQ2hhbmdlKCRldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YSA9ICRldmVudDtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNlYXJjaChyZXNldDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWJjeerr+WIhumhte+8muWPquWQjOatpemhteeggS/mnaHmlbDvvIzkuI3op6blj5HniLbnu4Tku7bmn6Xor6JcbiAgICBpZiAodGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIGlmIChyZXNldCkge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4ID0gMTtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgIC8vIOaMieW9k+WJjemhteihjOaVsOmHjeeul+aYr+WQpumcgOimgSBzY3JvbGwuee+8iOacq+mhteaVsOaNruWwkeaXtuWOu+aOieWbuuWumumrmOW6pu+8jOmBv+WFjeeVmeeZve+8iVxuICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlSW5kZXgpO1xuICAgICAgLy8g6Kem5Y+R54i257uE5Lu25p+l6K+i5LqL5Lu2XG4gICAgICB0aGlzLnRhYmxlU2VhcmNoRXZlbnQuZW1pdChyZXNldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOW6lemDqOOAjOWFsSBuIOadoeOAje+8mumdnuWIhumhtS/liY3nq6/liIbpobXnlKggY29udGVudC5sZW5ndGjvvIzmnI3liqHnq6/liIbpobXnlKggdG90YWxFbGVtZW50cyAqL1xuICBnZXRUYWJsZVRvdGFsQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb24gfHwgdGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5jb250ZW50ID8gdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWJsZURhdGEudG90YWxFbGVtZW50cyAhPSBudWxsXG4gICAgICA/IHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHNcbiAgICAgIDogMDtcbiAgfVxuXG4gIHJlc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIC8vIOWFiOaYvuW8j+e9riBmYWxzZe+8jOmBv+WFjSBuei1jaGVja2JveCDlhoXpg6jnirbmgIHkuI4gbWFwT2ZDaGVja2VkSWQg5LiN5ZCM5q2l77yI6Jma5ouf5rua5Yqo5aSN55So6KGM5pe25bi46KeB77yJXG4gICAgT2JqZWN0LmtleXModGhpcy5tYXBPZkNoZWNrTGlzdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSBmYWxzZTtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xuICAgIHRoaXMubWFwT2ZDaGVja0xpc3QgPSB7fTtcbiAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoW10pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVmcmVzaFN0YXR1cyhldmVudDogYm9vbGVhbiA9IGZhbHNlLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIC8vIOemgeeUqOihjOS4jeWFgeiuuOWLvumAie+8m+WPlua2iOWLvumAieS7jeWFgeiuuO+8iOS+i+WmguaVsOaNruWPmOabtOWJjeW3suWLvumAie+8iVxuICAgICAgaWYgKGV2ZW50ICYmIHRoaXMuaXNTZWxlY3REaXNhYmxlZChkYXRhKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGV2ZW50O1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0YWJsZUxpc3QgPSB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pLFxuICAgICk7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9XG4gICAgICBzZWxlY3RhYmxlTGlzdC5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RhYmxlTGlzdC5ldmVyeSgoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSk7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPVxuICAgICAgc2VsZWN0YWJsZUxpc3Quc29tZShcbiAgICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgICApICYmICF0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkO1xuICAgIC8vIOinpuWPkXNlbGVjdOS6i+S7tlxuICAgIGlmICh0aGlzLnNlbGVjdEV2ZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZExpc3Q6IEFycmF5PGFueT4gPSBPYmplY3QudmFsdWVzKHRoaXMubWFwT2ZDaGVja0xpc3QpO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHNlbGVjdGVkTGlzdCk7XG4gICAgfVxuICAgIC8vIOWmguaenOaVsOaNruS4uuepuu+8jOWImea4heepuuWLvumAieagh+ivhlxuICAgIGlmICh0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoZWNrQWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDlhajpgIkv5Y+W5raI5YWo6YCJ5Z2H6Lez6L+H56aB55So6KGM77yI56aB55So6KGM5L+d5oyB5Y6f5Yu+6YCJ54q25oCB77yJXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3ooYzmmK/lkKbnpoHnlKjli77pgIkgKi9cbiAgaXNTZWxlY3REaXNhYmxlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnNlbGVjdERpc2FibGVkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm5aSx5pWIICovXG4gIGlzSW52YWxpZFJvdyhkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnJvd0ludmFsaWRGaWVsZCAmJlxuICAgICAgZGF0YSAmJlxuICAgICAgZGF0YVt0aGlzLnJvd0ludmFsaWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aWh+Wtl+minOiJsu+8mmNvbG9yIOS4uuWHveaVsOaXtuaMieihjOiuoeeul++8iOeUqOS6juafkOS4gOihjOafkOS4gOWIl+agh+e6ou+8ie+8jOWQpuWImeaVtOWIl+WQjOiJsuOAglxuICAgKi9cbiAgcmVzb2x2ZUNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmNvbG9yID09IG51bGwgfHwgY29sLmNvbG9yID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuY29sb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2wuY29sb3IoZGF0YSk7XG4gICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvcjtcbiAgfVxuXG4gIC8qKiDlj6/ngrnlh7vljZXlhYPmoLzpopzoibLvvJrnqbrlgLzlm7rlrprngbDvvIzlkKbliJnmjInliJcgY29sb3IgKi9cbiAgZ2V0TGlua0NlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaXNFbXB0eTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBcIiMyQTM2MzRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNlbGxDb2xvcihjb2wsIGRhdGEpO1xuICB9XG5cbiAgLyoqIOaZrumAmuaWh+acrOWNleWFg+agvOminOiJsu+8muWkseaViOihjOe7n+S4gOeBsO+8jOWQpuWImeeUqOWIl+mFjee9riBjb2xvciAqL1xuICBnZXRQbGFpbkNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNJbnZhbGlkUm93KGRhdGEpKSB7XG4gICAgICByZXR1cm4gXCIjODY4QTlDXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiPOepuj5cIjtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0ZUZpZWxkKGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5pc1N0YXRlKSB7XG4gICAgICByZXR1cm4gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIH1cbiAgICByZXR1cm4gY29sLnN0YXRlRmllbGQgfHwgXCJzdGF0ZVwiO1xuICB9XG5cbiAgLyoqIOWtl+auteWAvOWQjuaYr+WQpuWxleekuuerlue6v+ihjOWPtyAqL1xuICBoYXNSb3dObyhjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoY29sICYmIChjb2wucm93Tm8gPT09IHRydWUgfHwgKHR5cGVvZiBjb2wucm93Tm8gPT09IFwic3RyaW5nXCIgJiYgY29sLnJvd05vKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihjOWPt+aWh+ahiOOAgnJvd05vIOS4uuWtl+auteWQjeaXtuWPluihjOaVsOaNru+8m+S4uiB0cnVlIOaXtuaMieW9k+WJjemhteW6j+WPt++8iOi3qOmhtei/nue7re+8jOS7jiAxIOW8gOWni++8ieOAglxuICAgKi9cbiAgZ2V0Um93Tm9UZXh0KGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaGFzUm93Tm8oY29sKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGEgPyBkYXRhW2NvbC5yb3dOb10gOiBudWxsO1xuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZSA9IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDA7XG4gICAgY29uc3Qgcm93SW5kZXggPSBOdW1iZXIoaW5kZXgpID49IDAgPyBOdW1iZXIoaW5kZXgpIDogMDtcbiAgICByZXR1cm4gU3RyaW5nKChwYWdlIC0gMSkgKiBzaXplICsgcm93SW5kZXggKyAxKTtcbiAgfVxuXG4gIC8qKiDooajlpLTjgIzphY3pgIHljZXlj7cgfCDooYzjgI3mi4bmiJDnn63nq5bnur/vvIzpgb/lhY3lrZfnrKYgfCDmi4nmu6HooYzpq5ggKi9cbiAgZ2V0VGl0bGVQYXJ0cyhjb2w6IEhkVGFibGVDb2x1bW4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuaGFzUm93Tm8oY29sKSB8fCAhY29sIHx8ICFjb2wudGl0bGUgfHwgU3RyaW5nKGNvbC50aXRsZSkuaW5kZXhPZihcInxcIikgPCAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKGNvbC50aXRsZSkuc3BsaXQoXCJ8XCIpO1xuICAgIGlmIChyYXcubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbcmF3WzBdLnRyaW0oKSwgcmF3LnNsaWNlKDEpLmpvaW4oXCJ8XCIpLnRyaW0oKV07XG4gIH1cblxuICAvKiog5piv5ZCm5pi+56S657yW6L6R56yU5Zu+5qCH77yI5pyJIGVkaXRUeXBlIOaXtui1sOihjOWGheaOp+S7tu+8jOS4jeWGjeaYvuekuueslO+8iSAqL1xuICBpc0VkaXRhYmxlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbC5lZGl0YWJsZSA9PSBudWxsIHx8IGNvbC5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuZWRpdGFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXRhYmxlKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdGFibGU7XG4gIH1cblxuICAvKiog54K55Ye757yW6L6R56yU77yM5Zue6LCD54i257uE5Lu25Lyg5YWl55qEIGVkaXQgKi9cbiAgb25FZGl0Q2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudChjb2wuZWRpdCB8fCBudWxsLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbphY3nva7kuoblj6/nlKjnmoTooYzlhoXnvJbovpHvvIhuYW1lIOW/hemhu+aYryBzdHJpbmfvvIkgKi9cbiAgaGFzSW5saW5lRWRpdChjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmVkaXRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIWNvbC5uYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW2hkLXRhYmxlXSBlZGl0VHlwZSDopoHmsYIgbmFtZSDkuLogc3RyaW5n77yM5YiX44CMXCIgK1xuICAgICAgICAgIChjb2wudGl0bGUgfHwgXCJcIikgK1xuICAgICAgICAgIFwi44CN5bey5Zue6YCA5Y+q6K+7XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzRWRpdERpc2FibGVkKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmVkaXREaXNhYmxlZCA9PSBudWxsIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXREaXNhYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkO1xuICB9XG5cbiAgZ2V0U2VsZWN0TGlzdChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW107XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdC5zZWxlY3RMaXN0KSA/IG9wdC5zZWxlY3RMaXN0IDogW107XG4gIH1cblxuICBnZXRTZWxlY3RPcHRpb25MYWJlbChjb2w6IEhkVGFibGVDb2x1bW4sIGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtvcHQudmFsdWVdO1xuICAgIGNvbnN0IGxhYmVsID0gaXRlbVtvcHQubGFiZWxdO1xuICAgIGlmIChvcHQuc2hvd0xhYmVsQW5kVmFsdWUgfHwgb3B0LmhkU2hvd0l0ZW1Db2RlKSB7XG4gICAgICByZXR1cm4gYFske3ZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWV9XSR7bGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBsYWJlbH1gO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcobGFiZWwpO1xuICB9XG5cbiAgZ2V0SW5wdXROdW1iZXJQcm9wKFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBrZXk6IFwibWluXCIgfCBcIm1heFwiIHwgXCJzdGVwXCIgfCBcInByZWNpc2lvblwiLFxuICAgIGZhbGxiYWNrOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5pbnB1dE51bWJlcikge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBjb2wuaW5wdXROdW1iZXJba2V5XTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgPyBOdW1iZXIodmFsKSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgLyoqIElucHV0IC8gSW5wdXROdW1iZXIg5Y+Y5pu077ya5YWI6K6w5pen5YC85YaN5YaZ5Zue5bm26YCa55+l54i257uE5Lu2ICovXG4gIG9uQ2VsbENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU2VsZWN0IOWPmOabtO+8muWPjOWGmSB2YWx1ZSArIGxhYmVs77yM5bm25bimIHByZXZpb3VzKiAvIG9wdGlvbiAqL1xuICBvblNlbGVjdENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IGxhYmVsRmllbGQgPSBvcHQgJiYgb3B0LmxhYmVsID8gb3B0LmxhYmVsIDogbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBjb25zdCBwcmV2aW91c0xhYmVsID0gbGFiZWxGaWVsZCA/IGRhdGFbbGFiZWxGaWVsZF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0U2VsZWN0TGlzdChjb2wsIGRhdGEpO1xuICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID1cbiAgICAgIHByZXZpb3VzVmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHByZXZpb3VzVmFsdWUpIHx8XG4gICAgICAgICAgbnVsbDtcbiAgICBjb25zdCBvcHRpb24gPVxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHZhbHVlKSB8fCBudWxsO1xuXG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIGxldCBsYWJlbDogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmIChsYWJlbEZpZWxkKSB7XG4gICAgICBsYWJlbCA9IG9wdGlvbiA/IG9wdGlvbltvcHQubGFiZWxdIDogbnVsbDtcbiAgICAgIGRhdGFbbGFiZWxGaWVsZF0gPSBsYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdCh7XG4gICAgICBsaW5lOiBkYXRhLFxuICAgICAgY29sLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIGxhYmVsLFxuICAgICAgcHJldmlvdXNMYWJlbCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHByZXZpb3VzT3B0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
|
|
3098
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUN2QixNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7QUFDNUI7SUEwSEUsMEJBQ1UsTUFBa0IsRUFDbEIsR0FBc0IsRUFDdEIsb0JBQTBDO1FBSHBELGlCQVdDO1FBVlMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBckgzQyxjQUFT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dCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBOelRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvdGFibGVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xXaWR0aCB9IGZyb20gXCIuLi9tb2RlbC9jb2xXaWR0aFwiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBtZWFzdXJlVGFibGVDb2xXaWR0aCxcbiAgcmVzb2x2ZUF1dG9UYWJsZVNjcm9sbCxcbn0gZnJvbSBcIi4uL3V0aWxzL2hkLXRhYmxlLXNjcm9sbC51dGlsXCI7XG5pbXBvcnQgeyBUb3RhbE9wdGlvbiB9IGZyb20gXCIuLi9oZC1kZXRhaWwtbGluZXMvaGQtZGV0YWlsLWxpbmVzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIEhkVGFibGVDZWxsQ2hhbmdlLFxuICBIZFRhYmxlQ29sdW1uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSB0YWJsZUNvbHM6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIEBJbnB1dCgpIHRhYmxlRGF0YTogUGFnZTxhbnk+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93T3BlcmF0ZUNvbFdhcnBCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiog5omL5Yqo5oyH5a6a6KGM6auY77yb5LiN5Lyg5YiZ5Zyo6aaW5bGP5riy5p+T5ZCO6Ieq5Yqo5rWL6YePICovXG4gIEBJbnB1dCgpIHZpcnR1YWxJdGVtU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBzZWxlY3RGaWVsZDogc3RyaW5nID0gXCJiaWxsTnVtYmVyXCI7XG4gIC8qKlxuICAgKiDooYzli77pgInnpoHnlKjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe256aB55So6K+l6KGM5Yu+6YCJ77yI5YWo6YCJ5Lmf5Lya6Lez6L+H77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZEZpZWxkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDooYzlpLHmlYjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe25pW06KGM6IOM5pmv6Imy5Li6ICNGN0Y4RkHjgIJcbiAgICovXG4gIEBJbnB1dCgpIHJvd0ludmFsaWRGaWVsZDogc3RyaW5nO1xuICAvLyDlkIjorqHljLrln5/vvIjnsbvlnovkuI4gaGQtZGV0YWlsLWxpbmVzIOeahCBUb3RhbE9wdGlvbiDkuIDoh7TvvIlcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPjtcbiAgLyoqXG4gICAqIOWQiOiuoeWIl+aAu+aVsO+8iOWQq+W6j+WPt+WIl++8jOS4jiBoZC1kZXRhaWwtbGluZXMg5LiA6Ie077yJ77ybXG4gICAqIOS4jeS8oOWImeaMieW9k+WJjeWPr+ingeaVsOaNruWIl+aVsCArIDHvvIjluo/lj7fvvInmjqjnrpfjgIJcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgQE91dHB1dCgpIHNvcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdGFibGVTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOihjOWGhee8lui+keWPmOabtO+8iOW3suWGmeWbnuihjOWvueixoe+8m3ByZXZpb3VzKiDkvpvmjqXlj6PlpLHotKXlm57mu5rvvIkgKi9cbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhkVGFibGVDZWxsQ2hhbmdlPigpO1xuICBASW5wdXQoKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuaYvuekuuWIhumhte+8m2ZhbHNlIOaXtuS4gOasoeWxleekuiB0YWJsZURhdGEuY29udGVudCDlhajpg6jooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICog5piv5ZCm5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YWo6YeP5YiH54mH77yJ44CCXG4gICAqIHRydWXvvJrnv7vpobXkuI3op6blj5EgdGFibGVTZWFyY2hFdmVudO+8jOmAguWQiOivpuaDheWFqOmHj+aVsOaNru+8m1xuICAgKiBmYWxzZe+8iOm7mOiupO+8ie+8muacjeWKoeerr+WIhumhte+8jOe/u+mhteinpuWPkeafpeivou+8iOeOsOacieWIl+ihqOihjOS4uu+8ieOAglxuICAgKiDkuI4gcGFnaW5hdGlvbj1mYWxzZSDlkIzml7bnlKjml7bku6XkuI3liIbpobXkuLrlh4bjgIJcbiAgICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6KGo5qC85YiG6aG15Y+C5pWwXG4gIEBJbnB1dCgpIHRhYmxlUGFnZUluZGV4OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSB0YWJsZVBhZ2VTaXplOiBudW1iZXIgPSAxMDA7XG4gIEBJbnB1dCgpIGlzRmlyc3RFbnRyeVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNDcm9zc1BhZ2VTZWxlY3Q6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVRvdGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVRvdGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZUxlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVJpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJpZ2h0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGwgPSBudWxsO1xuXG4gIC8vIOihqOagvOWLvumAieWPguaVsFxuICBpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgbGlzdE9mRGlzcGxheURhdGEgPSBbXTtcbiAgbGlzdE9mQWxsRGF0YSA9IFtdO1xuICBsaXN0T2ZTZWxlY3Rpb246IEFycmF5PGFueT4gfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIG1hcE9mQ2hlY2tMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIOWQiOiuoeWPguaVsFxuICB0YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAvLyDnvJPlrZjkv6Hmga9cbiAgdGFibGVDYWNoZU9wdGlvbjogVGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gIHVzZXJTZXNzaW9uOiBhbnk7XG5cbiAgdGFibGVDb2xzQ2FjaGU6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIHNob3dUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXNDYWNoZTogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpc0Ryb3Bkb3duVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDorr7nva7liJfnmoTlj6/op4Hmk43kvZzmlbDnu4RcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgLy8g6K6+572u5YiX55qE5LiN5Y+v6KeB5pON5L2c5pWw57uEXG4gIGhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuXG4gIC8vIOeCueWHu+aXtumcgOimgeacieS4tOaXtuaVsOe7hOWtmOaUvuS4pOS4qnRyZWUs55So5LqO5Y+W5raI5pe25YCZ5oGi5aSN6LCD5pW05YmN55qE54q25oCBXG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93RGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIGlzRmlyc3RFbnRyeVNlYXJjaExvY2FsOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiDoh6rliqjmtYvph4/liY3nmoTlhZzlupXooYzpq5jvvIzmtYvph4/lrozmiJDlkI7kvJrmm7TmlrAgKi9cbiAgbWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSA0NztcblxuICAvKiog6K6w5b2V5b2T5YmN5piv5ZCm5aSE5LqO6Jma5ouf5rua5Yqo5qih5byP77yM55So5LqO5YiH5o2iIHBhZ2VTaXplIOaXtumHjeW7uuihqOagvCAqL1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxBY3RpdmU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAvKiog5Y+v6KeB5YiX5oC75a6977yM55So5LqO5Yik5pat5piv5ZCm6ZyA6KaB5qiq5ZCR5rua5YqoICovXG4gIC8qKiDliJflrr3lkIjorqHvvIjlkKvli77pgIkv5bqP5Y+377yJ77yMZm9vdGVyIOihqOWuveS4juaoquWQkSBzY3JvbGwg5YWx55SoICovXG4gIHRhYmxlQ29sV2lkdGhUb3RhbCA9IDA7XG5cbiAgLyoqIOaVsOaNruabtOaWsOWQjuW+heWkjeS9jee6teWQkea7muWKqOS9jee9riAqL1xuICBwcml2YXRlIHBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IGZhbHNlO1xuXG4gIC8qKiDlvZPliY3mjpLluo/vvIzooajmoLzph43lu7rlkI7nlKjkuo7mgaLlpI3ooajlpLTmjpLluo/mgIEgKi9cbiAgcHJpdmF0ZSBjdXJyZW50U29ydEtleTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50U29ydFZhbHVlOiBzdHJpbmcgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoXCJoZFRhYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgdG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHk6IEhUTUxFbGVtZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclNjcm9sbEhhbmRsZXI6ICgpID0+IHZvaWQgPSBudWxsO1xuICBwcml2YXRlIHRvdGFsRm9vdGVyU3luY1JldHJ5ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlkI3np7BcbiAgICAgIHZlcnNpb246IDEuMCwgLy8g6K6+572u5a2Y5YKo5bqT55qE54mI5pysXG4gICAgICBzdG9yZU5hbWU6IFwiaGQtZnNjbS1zdG9yZVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlrZjlgqjnqbrpl7TlkI3np7BcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0RW50cnlTZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaExvY2FsID0gdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2g7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwgPSB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0O1xuICAgIH1cbiAgICB0aGlzLmxvY2FsdGlvblRtcCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0aGlzLmxvY2FsdGlvblRtcCkge1xuICAgICAgdGhpcy5sb2NhbHRpb25UbXAgPSB0aGlzLmxvY2FsdGlvblRtcC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXNzaW9uID0gdGhpcy5jb21tb25TZXNzaW9uU2VydmljZS5nZXRTZXNzaW9uKFxuICAgICAgXCJfX2p5X2F1dGhvcml6YXRpb25fc2Vzc2lvbl9fXCIsXG4gICAgKTtcbiAgICAvLyDnlKjkuo7lvIDlj5Hnjq/looPosIPor5VcbiAgICBpZiAoIXRoaXMudXNlclNlc3Npb24pIHtcbiAgICAgIHRoaXMudXNlclNlc3Npb24gPSB7XG4gICAgICAgIHVzZXJDb2RlOiBcImRldlwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmRlbGV0ZUhpZGVJdGVtKCk7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmdldEluaXRMb2NhbGZvcmFnZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4c3RlcDFcIiwgZSk7XG4gICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXSB8fFxuICAgICAgY2hhbmdlc1tcInRhYmxlVG90YWxPcHRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJzaG93VGFibGVUb3RhbFwiXSB8fFxuICAgICAgY2hhbmdlc1tcImNvbHVtbnNOdW1iZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl1cbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVGFibGVUb3RhbCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXMgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VTaXplXCJdIHx8XG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlTnVtYmVyXCJdICE9PVxuICAgICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdW1wicGFnZU51bWJlclwiXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgIC8vIOS7heiZmuaLny/mma7pgJrmqKHlvI/nnJ/mraPliIfmjaLml7bph43lu7rvvIzpgb/lhY3mjpLluo/lkI7mlbDmja7liLfmlrDmiormjpLluo/mgIHmuIXmjolcbiAgICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDnv7vpobUv5pS5IHBhZ2VTaXpl77ya5Li75Yqo5aSa5qyh5aSN5L2N77yM6KaG55uWIENESyDlvILmraXmuLLmn5Pml7bluo9cbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsKSB7XG4gICAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInRhYmxlRGF0YVwiXSkge1xuICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgICAvLyDmlbDmja7liLfmlrDkuI3lvLrliLbph43lu7rvvIzlj6rlnKjmu5rliqjmqKHlvI/lj5jljJbml7YgcmVtb3VudFxuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIOaVsOaNruabtOaWsOWQjuWkjeS9jee6teWQkea7muWKqO+8iOWQq+iZmuaLn+a7muWKqOWcuuaZr++8iVxuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUpICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgICAucmVhZHkoKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAyXCIsIGUpO1xuICAgICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKGNoYW5nZXNbXCJwYWdpbmF0aW9uXCJdICYmICFjaGFuZ2VzW1wicGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSkgfHxcbiAgICAgIChjaGFuZ2VzW1wiZnJvbnRQYWdpbmF0aW9uXCJdICYmICFjaGFuZ2VzW1wiZnJvbnRQYWdpbmF0aW9uXCJdLmZpcnN0Q2hhbmdlKVxuICAgICkge1xuICAgICAgLy8g5YiG6aG15qih5byP5YiH5o2i6ZyA6YeN5bu6IG56LXRhYmxl77yIZnJvbnQgLyBzZXJ2ZXIgLyBub25l77yJXG4gICAgICB0aGlzLnRhYmxlUGFnZUluZGV4ID0gMTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKiog5piv5ZCm6LWw5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YiH54mH77yM5LiN6K+35rGC5ZCO56uv77yJICovXG4gIGdldCB1c2VGcm9udFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5wYWdpbmF0aW9uICYmICEhdGhpcy5mcm9udFBhZ2luYXRpb247XG4gIH1cblxuICBkZWxldGVIaWRlSXRlbSgpIHtcbiAgICAvLyDpppblhYjmioppc1Nob3fkuLpmYWxzZeaVsOaNruWJlOmZpOaOiVxuICAgIHRoaXMudGFibGVDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAvLyDlpoLmnpzlr7nosaHmsqHmnIkgaXNTaG93IOWxnuaAp++8jOWImem7mOiupOS4uiB0cnVl77yM5L+d55WZ6K+l5a+56LGhXG4gICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkoXCJpc1Nob3dcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyDlpoLmnpzlr7nosaHmnIkgaXNTaG93IOWxnuaAp++8jOWImeajgOafpeWFtuWAvOaYr+WQpuS4uiB0cnVlXG4gICAgICByZXR1cm4gaXRlbS5pc1Nob3cgPT09IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBzb3J0KHNvcnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuY3VycmVudFNvcnRLZXkgPSBzb3J0ICYmIHNvcnQua2V5O1xuICAgIHRoaXMuY3VycmVudFNvcnRWYWx1ZSA9IHNvcnQgJiYgc29ydC52YWx1ZTtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICB9XG5cbiAgZ2V0Q29sU29ydChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmNhblNvcnQgfHwgIXRoaXMuY3VycmVudFNvcnRLZXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29sLm5hbWUgPT09IHRoaXMuY3VycmVudFNvcnRLZXkgPyB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgOiBudWxsO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0RldGFpbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZXRhaWwgPSAhdGhpcy5zaG93RGV0YWlsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxJdGVtU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemU7XG4gIH1cblxuICAvKipcbiAgICog57q15ZCR5Y+v55So6auY5bqm5omj5YeP77ya5oyJ6ZKu5Yy6L+WQiOiuoS/liIbpobXnrYnlm7rlrprljaDkvY3jgIJcbiAgICog5b+F6aG75LiOIGRlYWxTY3JvbGwgLyBwcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50IOS9v+eUqOWQjOS4gOWll++8jOWQpuWImeS8muivr+WIpOOAjOiDveaUvuS4i+OAjeiAjOS4jeiuviBzY3JvbGwueeOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTY3JvbGxZTWF4T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLnRhYmxlVG90YWwgPyAxODAgOiAxNDApICsgMjE2O1xuICB9XG5cbiAgLyoqXG4gICAqIOW9k+WJjeinhuWPo+WunumZheWxleekuueahOihjOaVsOOAglxuICAgKiDliY3nq6/liIbpobXmjIkgcGFnZUluZGV4L3BhZ2VTaXplIOWIh+eJh+S8sOeul++8jOmBv+WFjeeUqOWFqOmHjyBsZW5ndGgg6K+v5Yik6ZyA6KaB57q15ZCR5rua5Yqo44CCXG4gICAqL1xuICBwcml2YXRlIGdldFZpc2libGVSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgdGhpcy50YWJsZURhdGEgJiYgdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQgOiBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIGlmICghdGhpcy51c2VGcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBwYWdlU2l6ZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDEwO1xuICAgIGNvbnN0IHBhZ2VJbmRleCA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgIGlmIChzdGFydCA+PSB0b3RhbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbihwYWdlU2l6ZSwgdG90YWwgLSBzdGFydCk7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15YaF5a656auY5bqm5piv5ZCm6LaF5Ye66KeG5Y+j77yI6ZyA6KaB6KGo5YaF57q15ZCR5rua5Yqo77yJICovXG4gIGdldCBuZWVkc1ZlcnRpY2FsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5nZXRWaXNpYmxlUm93Q291bnQoKTtcbiAgICBpZiAocm93Q291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRIZWlnaHQgPSByb3dDb3VudCAqIHRoaXMuZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gZXN0aW1hdGVkSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0IC0gbWF4T2Zmc2V0O1xuICAgIH1cbiAgICByZXR1cm4gcm93Q291bnQgPiAxMDA7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15pWw5o2u6IO95a6M5pW05bGV56S65pe25LiN5ZCv55So6Jma5ouf5rua5Yqo77yM6YG/5YWN5bCR6YeP5pWw5o2u5Lmf5Ye6546w5rua5Yqo5p2hICovXG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5lZWRzVmVydGljYWxTY3JvbGw7XG4gIH1cblxuICBnZXRSaWdodFN0aWNreShjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gY29sLmZpeGVkID09PSBcInJpZ2h0XCIgPyBgJHtjb2wuZml4ZWRSaWdodFdpZHRoIHx8IDB9cHhgIDogbnVsbDtcbiAgfVxuXG4gIGdldExlZnRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJsZWZ0XCIgPyBgJHtjb2wuZml4ZWRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5bqP5Y+35YiX5Zu65a6a5a6977yI5ZCrIHBhZGRpbmfvvIzlj6/lrrnnurMgNiDkvY3lpoIgMTk5OTk177yJ44CCXG4gICAqIOS4jemUgeatu+aXtuihqOS9k+S8mumaj+S9jeaVsOWPmOWuve+8iDHihpJ+NjRweO+8jDE5OTk5NeKGkn42N3B477yJ77yM5ZCI6K6h6KGM5a+55LiN6b2Q44CCXG4gICAqL1xuICByZWFkb25seSBsaW5lTnVtYmVyQ29sV2lkdGggPSA3MjtcblxuICAvKiog5byA5ZCv5ZCI6K6h5pe25bqP5Y+35YiX55qEIGxlZnTvvIjli77pgInliJfljaAgNDBweO+8iSAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U2VsZWN0ZWQgPyBcIjQwcHhcIiA6IFwiMHB4XCI7XG4gIH1cblxuICBnZXQgbGluZU51bWJlckNvbFdpZHRoUHgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGggKyBcInB4XCI7XG4gIH1cblxuICAvKipcbiAgICog5YiX5oC75a695pyq6LaF5Ye65a655Zmo77ya5peg5qiq5ZCRIHNjcm9sbO+8jOihqOS9k+WIl+S8muiiq+aSkea7oe+8jOWQiOiuoei1sCBmbHVpZO+8iHdpZHRoOjEwMCXvvInjgIJcbiAgICog5YiX5oC75a696LaF5Ye677ya5pyJIHNjcm9sbC5477yM5ZCI6K6h6LWw5Zu65a6a6KGo5a69ICsg5qiq5rua5ZCM5q2l44CCXG4gICAqL1xuICBnZXQgaXNUb3RhbEZvb3RlckZsdWlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICB9XG5cbiAgLyoqIGZsdWlkIOKGkiAxMDAl77yb5Zu65a6aIOKGkiBzY3JvbGwueO+8iOS4juihqOS9k+WQjOS4gOWll+aoquWQkeWuveW6pu+8iSAqL1xuICBnZXQgdG90YWxGb290ZXJUYWJsZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICByZXR1cm4gXCIxMDAlXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54XG4gICAgICA/IFN0cmluZyh0aGlzLnNjcm9sbC54KVxuICAgICAgOiB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCA+IDBcbiAgICAgICAgPyB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCArIFwicHhcIlxuICAgICAgICA6IFwiMTAwJVwiO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteihjOWPt++8iOi3qOmhtei/nue7re+8jOS7jiAxIOW8gOWni++8iSAqL1xuICBnZXRMaW5lTnVtYmVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID0gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIChwYWdlIC0gMSkgKiBzaXplICsgcm93SW5kZXggKyAxO1xuICB9XG5cbiAgdHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyLCBkYXRhOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleSA9IGRhdGEgJiYgZGF0YVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICByZXR1cm4ga2V5ICE9IG51bGwgPyBTdHJpbmcoa2V5KSA6IGByb3ctJHtpbmRleH1gO1xuICB9O1xuXG4gIC8qKiDomZrmi5/mu5rliqjmjInmlbDnu4TkuIvmoIfov73ouKrvvIzpgb/lhY3kuJrliqHkuLvplK4gdHJhY2tCeSDlr7zoh7QgQ0RLIOihjOWkjeeUqOmUmeS9jSAqL1xuICB2aXJ0dWFsVHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIHRyYWNrQnlDb2wgPSAoX2luZGV4OiBudW1iZXIsIGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGNvbC50aXRsZTtcbiAgfTtcblxuICBnZXRJbml0TG9jYWxmb3JhZ2UoKSB7XG4gICAgLy8g6aaW5YWI6I635Y+W5b2T5YmNaGQtdGFibGXlrZjlgqjnmoTmlbDmja4g5aaC5p6c5rKh5pyJ77yM5YiZ5Yid5aeL5YyW5LiL5b2T5YmN55qE5pWw5o2uXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLmdldEl0ZW0oXG4gICAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgIHRoaXMudXVpZCxcbiAgICAgIClcbiAgICAgIC50aGVuKCh2YWx1ZTogVGFibGVDYWNoZU9wdGlvbikgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID4gMTBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZSA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZTtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB9XG4gICAgICAgIC8vIOacjeWKoeerr+WIhumhteaJjeWcqOWIneWni+WMluaXtuaKmyBwYWdlU2l6ZUNoYW5nZUV2ZW50IOinpuWPkeeItuafpeivou+8m+WJjeerr+WIhumhteS4jeaKm1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgIXRoaXMuZnJvbnRQYWdpbmF0aW9uICYmXG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluaXRUYWJsZSgpIHtcbiAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy51dWlkKSB7XG4gICAgICB0aHJvdyBcImhkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaAp1wiO1xuICAgIH1cbiAgICBpZiAodGhpcy5qdWRnZVJlcGVhdENvbHMoKSkge1xuICAgICAgdGhpcy5kZWFsQ29scygpO1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB0aGlzLmRlYWxPcGVyYXRlQnRuKCk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiog6Jma5oufL+aZrumAmuaooeW8j+WIh+aNouaXtumHjeW7uuihqOagvO+8jOmBv+WFjeaui+eVmea7muWKqOWuueWZqCAqL1xuICBhcHBseVRhYmxlU2Nyb2xsTW9kZShmb3JjZVJlbW91bnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG4gICAgY29uc3QgbW9kZUNoYW5nZWQgPVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSBudWxsICYmXG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgIT09IHVzZVZpcnR1YWw7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gdXNlVmlydHVhbDtcblxuICAgIGlmIChmb3JjZVJlbW91bnQgfHwgbW9kZUNoYW5nZWQpIHtcbiAgICAgIC8vIOW/hemhu+WFiOWGmeWlvSBzY3JvbGwuee+8jOWGjeWIm+W7uiBuei10YWJsZeOAglxuICAgICAgLy8gbmctem9ycm8g5Y+q5ZyoIEFmdGVyVmlld0luaXQg57uR5LiA5qyhIGhlYWRlci9ib2R5IOeahCBzY3JvbGwg5ZCM5q2l77ybXG4gICAgICAvLyDoi6XlhYjku6UgeT1udWxsIOWIm+W7uuWGjeaUueaIkOaciSB577yM6KGo5aS055uR5ZCs5Lya5Lii77yM6KGo546w5Li65YiX5aS05LiN6Lef552A5qiq5rua44CCXG4gICAgICB0aGlzLnByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbCk7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgY29uc3QgbmV4dEhhc1kgPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC55KTtcbiAgICAvLyDov5DooYzkuK0geSDku47mnInlj5jml6Av5LuO5peg5Y+Y5pyJ5pe277yM5Lmf5b+F6aG76YeN5bu677yM5ZCm5YiZ5ZCM5q2l55uR5ZCs5LuN5oyH5ZCR5penIERPTVxuICAgIGlmIChwcmV2SGFzWSAhPT0gbmV4dEhhc1kpIHtcbiAgICAgIHRoaXMuc2hvd1RhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dUYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICB9XG5cbiAgLyoqIOmHjeW7uuWJjemihOiuviBzY3JvbGzvvIzkv53or4EgQWZ0ZXJWaWV3SW5pdCDml7YgaGVhZGVyL2JvZHkg57uT5p6E5bey5q2j56GuICovXG4gIHByaXZhdGUgcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCh1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgeCA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueCA6IG51bGw7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7IHgsIHk6IG51bGwgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4LFxuICAgICAgeTogYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZSh0cnVlKTtcbiAgICAgIC8vIOWunua1i+ihjOmrmOWQjuWPr+iDveS7juOAjOiDveaUvuS4i+OAjeWPmOS4uuOAjOi2heWHuuOAje+8jOmcgOWIh+aNoua7muWKqOaooeW8j1xuICAgICAgaWYgKHRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydChmb3JjZU1lYXN1cmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICBpZiAoZm9yY2VNZWFzdXJlKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9XG4gICAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZWFzdXJlZCA9IHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgaWYgKG1lYXN1cmVkKSB7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDmlbDmja7liLfmlrDlkI7lsIbooajkvZPnurXlkJHmu5rliqjlpI3kvY3liLDpobbpg6ggKi9cbiAgcHJpdmF0ZSByZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuelRhYmxlID0gdGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9PZmZzZXQoMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvSW5kZXggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4KDApO1xuICAgICAgfVxuICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgIHZpZXdwb3J0LmVsZW1lbnRSZWYgJiZcbiAgICAgICAgKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICB2aWV3cG9ydEVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJvZHlDYW5kaWRhdGVzID0gW1xuICAgICAgbnpUYWJsZS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlFbGVtZW50ICYmIG56VGFibGUudGFibGVCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgIF07XG4gICAgYm9keUNhbmRpZGF0ZXMuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0YWJsZU1haW4gPVxuICAgICAgbnpUYWJsZS50YWJsZU1haW5FbGVtZW50ICYmXG4gICAgICAobnpUYWJsZS50YWJsZU1haW5FbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGlmICghdGFibGVNYWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVzID0gdGFibGVNYWluLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIi5hbnQtdGFibGUtYm9keSwgY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XCIsXG4gICAgKTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVzLCAoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaVsOaNruabtOaWsOWQjuWkmuasoeWwneivleWkjeS9jeOAglxuICAgKiBuZy16b3JybyA4ICsgQ0RLIOiZmuaLn+a7muWKqOS8muWcqOaVsOaNruWIt+aWsOWQjuW8guatpeaUueWGmSBzY3JvbGxUb3DvvIzljZXmrKHlpI3kvY3nu4/luLjooqvopobnm5bjgIJcbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICAvLyDlpJrmrKHlsJ3or5XvvJropobnm5YgbnotdGFibGUgLyBDREsg6Jma5ouf5rua5Yqo5byC5q2l5pS55YaZIHNjcm9sbFRvcFxuICAgIGNvbnN0IGRlbGF5cyA9IFswLCA1MCwgMTAwXTtcbiAgICBkZWxheXMuZm9yRWFjaCgobXMsIGluZGV4KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IGRlbGF5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICB9XG5cbiAgLyoqIOacquaJi+WKqOS8oCB2aXJ0dWFsSXRlbVNpemUg5pe277yM5LuO5bey5riy5p+T6KGM5rWL6YeP55yf5a6e6auY5bqmICovXG4gIG1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnZpcnR1YWxJdGVtU2l6ZSAhPSBudWxsICYmIHRoaXMudmlydHVhbEl0ZW1TaXplID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgY29uc3QgdGFibGVCb2R5ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJlxuICAgICAgKHRoaXMubnpUYWJsZUNvbXBvbmVudC50YWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCByb3cgPVxuICAgICAgKHZpZXdwb3J0ICYmXG4gICAgICAgICgodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwidHIuaGQtdGFibGUtdmlydHVhbC1yb3dcIixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudCkpIHx8XG4gICAgICAodGFibGVCb2R5ICYmICh0YWJsZUJvZHkucXVlcnlTZWxlY3RvcihcInRib2R5IHRyXCIpIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgaWYgKCFyb3cgfHwgcm93Lm9mZnNldEhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhlaWdodCA9IHJvdy5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKGhlaWdodCA9PT0gdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gaGVpZ2h0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8g6K6+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+KCk7XG4gICAgfSBlbHNlIGlmICghKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgT2JqZWN0LmtleXModGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbFdpZHRocy5zZXQoa2V5LCAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBhcyBhbnkpW2tleV0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gY29sV2lkdGhzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZS5zZXRJdGVtKFxuICAgICAgXCJoZC10YWJsZV9cIiArXG4gICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLnV1aWQsXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGp1ZGdlUmVwZWF0Q29scygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNbaV0udGl0bGUgPT09IHRoaXMudGFibGVDb2xzW2pdLnRpdGxlKSB7XG4gICAgICAgICAgdGhyb3cgYGhkLXRhYmxl57uE5Lu25Lit5YiX5ZCNICR7dGhpcy50YWJsZUNvbHNbaV0udGl0bGV9IOmHjeWkjWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblJlc2l6ZSh7IHdpZHRoIH06IE56UmVzaXplRXZlbnQsIGNvbDogSGRUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMubm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGxldCB0ZW1wV2lkdGggPSAwO1xuICAgIGlmICh3aWR0aCA+IGNvbC5taW5XaWR0aCkge1xuICAgICAgdGVtcFdpZHRoID0gd2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBXaWR0aCA9IGNvbC5taW5XaWR0aDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zZXQoY29sLnRpdGxlLCB0ZW1wV2lkdGgpO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLm1hcCgoZSkgPT5cbiAgICAgIGUudGl0bGUgPT09IGNvbC50aXRsZSA/IHsgLi4uZSwgd2lkdGg6IHRlbXBXaWR0aCB9IDogZSxcbiAgICApO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpKTtcbiAgfVxuXG4gIGRlYWxPcGVyYXRlQnRuKCkge1xuICAgIGxldCBvcGVyYXRlQ29sID0gdGhpcy50YWJsZUNvbHMuZmluZCgoY29sKSA9PiBjb2wudGl0bGUgPT09IFwi5pON5L2cXCIpIHx8IG51bGw7XG4gICAgaWYgKG9wZXJhdGVDb2wpIHtcbiAgICAgIGxldCB0ZXh0U3RyID0gXCJcIjtcbiAgICAgIG9wZXJhdGVDb2wuYnRuTGlzdC5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgaWYgKCFidG4uaXNSZXBlYXQpIHtcbiAgICAgICAgICB0ZXh0U3RyICs9IHR5cGVvZiBidG4ubmFtZSA9PT0gXCJmdW5jdGlvblwiID8gXCLmk43kvZxcIiA6IGJ0bi5uYW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgc3Bhbi5pbm5lclRleHQgPSB0ZXh0U3RyO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgIG9wZXJhdGVDb2wud2lkdGggPVxuICAgICAgICBzcGFuLm9mZnNldFdpZHRoICtcbiAgICAgICAgKG9wZXJhdGVDb2wuYnRuTGlzdC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzUmVwZWF0KS5sZW5ndGggLSAxKSAqIDQgK1xuICAgICAgICAxNjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5lZWRTaG93Q29uZmlybShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYnRuLnNob3dDb25maXJtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4uc2hvd0NvbmZpcm0oZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiAhIWJ0bi5zaG93Q29uZmlybTtcbiAgfVxuXG4gIGdldEJ0bk5hbWUoYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgYnRuLm5hbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGJ0bi5uYW1lKGRhdGEpIHx8IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBidG4ubmFtZSAhPSBudWxsID8gU3RyaW5nKGJ0bi5uYW1lKSA6IFwiXCI7XG4gIH1cblxuICBpc0RhbmdlckJ0bihidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEJ0bk5hbWUoYnRuLCBkYXRhKSA9PT0gXCLliKDpmaRcIjtcbiAgfVxuXG4gIC8qKiDomZrmi5/mu5rliqjlvIDlkK/ml7bkvb/nlKjop4blj6PmnIDlpKfpq5jluqYgKi9cbiAgcHJpdmF0ZSBnZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzVGFibGVEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMudGFibGVEYXRhICYmXG4gICAgICB0aGlzLnRhYmxlRGF0YS5jb250ZW50ICYmXG4gICAgICB0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aFxuICAgICk7XG4gIH1cblxuICAvKiog5YiX5oC75a696LaF5Ye65aSW5bGC5a655Zmo5omN5ZCv55So5qiq5ZCRIHNjcm9sbO+8iOS4jeiDveeUqCB0YWJsZSDoh6rouqvlrr3luqbvvIzkvJrooqsgc2Nyb2xsLngg5pKR5a6977yJICovXG4gIHByaXZhdGUgcmVzb2x2ZVNjcm9sbFgoY29sV2lkdGg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCB3aWR0aCA9IGNvbFdpZHRoO1xuICAgIGlmICh0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVRhYmxlQ29sV2lkdGgodGhpcy5uelRhYmxlQ29tcG9uZW50KTtcbiAgICAgIGlmIChtZWFzdXJlZCA+IHdpZHRoKSB7XG4gICAgICAgIHdpZHRoID0gbWVhc3VyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF1dG9TY3JvbGwgPSByZXNvbHZlQXV0b1RhYmxlU2Nyb2xsKFxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50LFxuICAgICAgdGhpcy5oYXNUYWJsZURhdGEoKSxcbiAgICAgIHdpZHRoLFxuICAgICk7XG4gICAgcmV0dXJuIGF1dG9TY3JvbGwgPyBhdXRvU2Nyb2xsLnggOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOagvOa4suafk+WQjuaMieWunumZheWuueWZqOWuveW6puagoeato+aoquWQkSBzY3JvbGzvvIjlj6rmlLkgeO+8jOmBv+WFjeinpuWPkeihqOWktOe7k+aehOWPmOWMlu+8iSAqL1xuICBwcml2YXRlIHN5bmNIb3Jpem9udGFsU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbFggPSB0aGlzLnJlc29sdmVTY3JvbGxYKHRoaXMudGFibGVDb2xXaWR0aFRvdGFsKTtcbiAgICBjb25zdCBjdXJyZW50WSA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zY3JvbGwgJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnggPT09IHNjcm9sbFggJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnkgPT09IGN1cnJlbnRZXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOS/neaMgSB5IOS4jeWPmO+8jOmYsuatoui/kOihjOS4reaLhi/lkIggaGVhZGVyIOWvvOiHtOaoquWQkeWQjOatpeWkseaViFxuICAgIHRoaXMuc2Nyb2xsID0geyB4OiBzY3JvbGxYLCB5OiBjdXJyZW50WSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKSk7XG4gIH1cblxuICAvKiog5omL5Yqo5oqK6KGo5L2T5qiq5ZCR5rua5Yqo5ZCM5q2l5Yiw6KGo5aS0IC8g5ZCI6K6hIGZvb3Rlcu+8iOWFnOW6lSBuZy16b3JybyDnm5HlkKzkuKLlpLHnmoTmg4XlhrXvvIkgKi9cbiAgcHJpdmF0ZSBzeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gKHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnkpLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudCBhc1xuICAgICAgfCBIVE1MRWxlbWVudFxuICAgICAgfCBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggJiYgaGVhZGVyICYmIGJvZHkpIHtcbiAgICAgIGlmIChoZWFkZXIuc2Nyb2xsTGVmdCAhPT0gYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk7XG4gIH1cblxuICAvKiog5Y+W6KGo5L2T5qiq5ZCR5rua5Yqo5a655Zmo77yI6Jma5ouf5rua5Yqo5LyY5YWIIHZpZXdwb3J077yJICovXG4gIHByaXZhdGUgZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1peCA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzXG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IG51bGw7XG4gICAgaWYgKG1peCkge1xuICAgICAgcmV0dXJuIG1peDtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuYW50LXRhYmxlLWJvZHlcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmFudC10YWJsZS1ib2R5XCIpIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0RWwgJiYgKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBob3N0XG4gICAgICA/IChob3N0LnF1ZXJ5U2VsZWN0b3IoXCIuaGQtdGFibGUtdG90YWwtZm9vdGVyXCIpIGFzIEhUTUxFbGVtZW50KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQiOiuoSBmb290ZXIg5LiO6KGo5L2T6IGU5Yqo77yaXG4gICAqIC0gZmx1aWTvvIjliJfmnKrmkpHmu6HvvInvvJrkuI3mqKrmu5rjgIHkuI3mtYvlrr3vvIzooajlrr0gMTAwJSDkuI7ooajkvZPlkIzmr5Tkvovmi4nkvLjvvJtcbiAgICogLSBmaXhlZO+8iOaciSBzY3JvbGwueO+8ie+8muWQjOatpSBzY3JvbGxMZWZ044CCXG4gICAqL1xuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm9vdGVyID0gdGhpcy5nZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTtcbiAgICBpZiAoIWZvb3Rlcikge1xuICAgICAgaWYgKHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkgPCAxMCkge1xuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpLCA1MCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkgPSAwO1xuICAgIGlmICh0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICAgIGZvb3Rlci5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHRoaXMuc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChib2R5LnNjcm9sbExlZnQpO1xuICAgICAgdGhpcy5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKGJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChzY3JvbGxMZWZ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb290ZXIgPSB0aGlzLmdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTtcbiAgICBpZiAoZm9vdGVyICYmIGZvb3Rlci5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0KSB7XG4gICAgICBmb290ZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKGJvZHk6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUYWJsZVRvdGFsIHx8ICFib2R5IHx8IHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPT09IGJvZHkgJiZcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9IGJvZHk7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoYm9keS5zY3JvbGxMZWZ0KTtcbiAgICB9O1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9IGFzIGFueSk7XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSAmJiB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcikge1xuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBcInNjcm9sbFwiLFxuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPSBudWxsO1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyID0gbnVsbDtcbiAgfVxuXG4gIGRlYWxTY3JvbGwoKSB7XG4gICAgbGV0IGNvbFdpZHRoID0gMDtcbiAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWQpIHtcbiAgICAgIGNvbFdpZHRoICs9IDQwO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgY29sV2lkdGggKz0gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGg7IC8vIOW6j+WPt+WIl++8iOWbuuWumuWuve+8jOS4jemaj+S9jeaVsOWPmOWMlu+8iVxuICAgIH1cbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0ud2lkdGgpIHtcbiAgICAgICAgaXRlbS53aWR0aCA9IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uaXNTaG93KSB7XG4gICAgICAgIGl0ZW0uZml4ZWRXaWR0aCA9IGNvbFdpZHRoO1xuICAgICAgICBjb2xXaWR0aCArPSBpdGVtLndpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Y+z5L6n5Zu65a6a5YiX77ya5LuO5Y+z5b6A5bem57Sv6K6h5YGP56e777yM6YG/5YWN5aSa5YiX6YO9IHJpZ2h0OjAg5LqS55u46YGu5oyhXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmICghaXRlbS5pc1Nob3cpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRSaWdodFdpZHRoID0gcmlnaHRPZmZzZXQ7XG4gICAgICAgIHJpZ2h0T2Zmc2V0ICs9IGl0ZW0ud2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPSBjb2xXaWR0aDtcbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IHNjcm9sbFggPSB0aGlzLnJlc29sdmVTY3JvbGxYKGNvbFdpZHRoKTtcblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBudWxsLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6IHNjcm9sbFgsXG4gICAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4OiBzY3JvbGxYLFxuICAgICAgeTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQpLFxuICAgIH07XG4gIH1cblxuICAvLyDooajmoLzli77pgInpgLvovpFcbiAgY3VycmVudFBhZ2VEYXRhQ2hhbmdlKCRldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YSA9ICRldmVudDtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNlYXJjaChyZXNldDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWJjeerr+WIhumhte+8muWPquWQjOatpemhteeggS/mnaHmlbDvvIzkuI3op6blj5HniLbnu4Tku7bmn6Xor6JcbiAgICBpZiAodGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIGlmIChyZXNldCkge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4ID0gMTtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgIC8vIOaMieW9k+WJjemhteihjOaVsOmHjeeul+aYr+WQpumcgOimgSBzY3JvbGwuee+8iOacq+mhteaVsOaNruWwkeaXtuWOu+aOieWbuuWumumrmOW6pu+8jOmBv+WFjeeVmeeZve+8iVxuICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlSW5kZXgpO1xuICAgICAgLy8g6Kem5Y+R54i257uE5Lu25p+l6K+i5LqL5Lu2XG4gICAgICB0aGlzLnRhYmxlU2VhcmNoRXZlbnQuZW1pdChyZXNldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOW6lemDqOWQiOiuoe+8muS4jiBoZC1kZXRhaWwtbGluZXMg55u45ZCM77yM5L2/55SoIFRvdGFsT3B0aW9u77yIaW5zZXJ0SW5kZXggLyBpbnNlcnRWYWx1Ze+8ieOAglxuICAgKiDlvIDlkK/lkI7lvLrliLblsZXnpLrluo/lj7fliJfvvIzjgIzlkIjorqHjgI3okL3lnKjluo/lj7fliJfkuIvvvJtcbiAgICogaW5zZXJ0SW5kZXgg5LuOIDEg6LW35a+55bqU5Y+v6KeB5pWw5o2u5YiX77yb5pyq5LygIGluc2VydFZhbHVlIOaXtuaMieivpeWIlyBuYW1lIOWvuSBjb250ZW50IOaxguWSjOOAglxuICAgKi9cbiAgY2FsY3VsYXRlVGFibGVUb3RhbCgpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zaG93VGFibGVUb3RhbCB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbiB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbi5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmlzaWJsZUNvbHMgPSAodGhpcy50YWJsZUNvbHMgfHwgW10pLmZpbHRlcihcbiAgICAgIChjKSA9PiBjICYmIGMuaXNTaG93ICE9PSBmYWxzZSxcbiAgICApO1xuICAgIC8vIGNvbHVtbnNOdW1iZXIg5ZCr5bqP5Y+35YiX77yI5LiOIGRldGFpbC1saW5lcyDkuIDoh7TvvInvvIzmlbDmja7mp73kvY3mlbAgPSBjb2x1bW5zTnVtYmVyIC0gMVxuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSBOdW1iZXIodGhpcy5jb2x1bW5zTnVtYmVyKTtcbiAgICBjb25zdCBjb2x1bW5OdW1iZXIgPVxuICAgICAgY29uZmlndXJlZCA+IDFcbiAgICAgICAgPyBjb25maWd1cmVkIC0gMVxuICAgICAgICA6IGNvbmZpZ3VyZWQgPT09IDFcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHZpc2libGVDb2xzLmxlbmd0aDtcbiAgICBpZiAoIWNvbHVtbk51bWJlciB8fCBjb2x1bW5OdW1iZXIgPCAxKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgPSBuZXcgQXJyYXkoY29sdW1uTnVtYmVyKS5maWxsKFwiXCIpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgdGhpcy50YWJsZURhdGEgJiYgdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQgOiBbXTtcbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gPT0gbnVsbCB8fCAhaXRlbS5pbnNlcnRJbmRleCB8fCBpdGVtLmluc2VydEluZGV4IDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgdmFsdWU6IGFueSA9IGl0ZW0uaW5zZXJ0VmFsdWU7XG4gICAgICAvLyDmnKrkvKAgaW5zZXJ0VmFsdWUg5pe277ya5oyJIGluc2VydEluZGV4IOWvueW6lOWPr+ingeWIlyBuYW1lIOiHquWKqOaxguWSjFxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgY29uc3QgY29sID0gdmlzaWJsZUNvbHNbaXRlbS5pbnNlcnRJbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbCAmJiB0eXBlb2YgY29sLm5hbWUgPT09IFwic3RyaW5nXCIgPyBjb2wubmFtZSA6IG51bGw7XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBjb250ZW50LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IHJvdyA/IHJvd1tmaWVsZF0gOiBudWxsO1xuICAgICAgICAgIGlmIChyYXcgPT0gbnVsbCB8fCByYXcgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XG4gICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XG4gICAgICAgICAgICBzdW0gKz0gbnVtO1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzdW07XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xBdEluZGV4ID0gdmlzaWJsZUNvbHNbaXRlbS5pbnNlcnRJbmRleCAtIDFdO1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBhbGlnbjogaXRlbS5hbGlnbiB8fCAoY29sQXRJbmRleCAmJiBjb2xBdEluZGV4LmFsaWduKSB8fCBcImxlZnRcIixcbiAgICAgICAgc2hvd0RlY2ltYWw6IGl0ZW0uc2hvd0RlY2ltYWwgfHwgZmFsc2UsXG4gICAgICAgIHByZXNlcnZlTnVtYmVyOlxuICAgICAgICAgIGl0ZW0ucHJlc2VydmVOdW1iZXIgIT0gbnVsbCA/IGl0ZW0ucHJlc2VydmVOdW1iZXIgOiAyLFxuICAgICAgICBpc0hpZGU6IGl0ZW0uaXNIaWRlIHx8IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKCFjb2wgfHwgIXRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgfHwgIXRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHZpc2libGVJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChjICYmIGMuaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICB2aXNpYmxlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZpc2libGVJbmRleCA8IDAgfHwgdmlzaWJsZUluZGV4ID49IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWV0YSA9IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbdmlzaWJsZUluZGV4XTtcbiAgICByZXR1cm4gbWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiA/IG1ldGEgOiBudWxsO1xuICB9XG5cbiAgLyoqIOWQiOiuoeWNleWFg+agvOWxleekuuaWh+ahiO+8iOWvuem9kCBkZXRhaWwtbGluZXMg5bCP5pWw6KeE5YiZ77yJICovXG4gIGdldFRhYmxlVG90YWxDZWxsVmFsdWUoY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sLCBjb2xJbmRleCk7XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuaXNIaWRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtZXRhLnZhbHVlO1xuICAgIGlmICghKHZhbHVlIHx8IHZhbHVlID09PSAwKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHByZXNlcnZlID1cbiAgICAgIG1ldGEucHJlc2VydmVOdW1iZXIgIT0gbnVsbCA/IE51bWJlcihtZXRhLnByZXNlcnZlTnVtYmVyKSA6IDI7XG4gICAgaWYgKHZhbHVlICUgMSA9PT0gMCAmJiAhbWV0YS5zaG93RGVjaW1hbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlc2VydmUpO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChOdW1iZXIodmFsdWUpICogZmFjdG9yKSAvIGZhY3RvcikudG9GaXhlZChwcmVzZXJ2ZSk7XG4gIH1cblxuICBnZXRUYWJsZVRvdGFsQ2VsbEFsaWduKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGNvbnN0IGFsaWduID1cbiAgICAgIChtZXRhICYmIG1ldGEuYWxpZ24pIHx8IChjb2wgJiYgY29sLmFsaWduKSB8fCBcImxlZnRcIjtcbiAgICBpZiAoYWxpZ24gPT09IFwicmlnaHRcIiB8fCBhbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCBhbGlnbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9XG5cbiAgLyoqIOW6lemDqOOAjOWFsSBuIOadoeOAje+8mumdnuWIhumhtS/liY3nq6/liIbpobXnlKggY29udGVudC5sZW5ndGjvvIzmnI3liqHnq6/liIbpobXnlKggdG90YWxFbGVtZW50cyAqL1xuICBnZXRUYWJsZVRvdGFsQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb24gfHwgdGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5jb250ZW50ID8gdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWJsZURhdGEudG90YWxFbGVtZW50cyAhPSBudWxsXG4gICAgICA/IHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHNcbiAgICAgIDogMDtcbiAgfVxuXG4gIHJlc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIC8vIOWFiOaYvuW8j+e9riBmYWxzZe+8jOmBv+WFjSBuei1jaGVja2JveCDlhoXpg6jnirbmgIHkuI4gbWFwT2ZDaGVja2VkSWQg5LiN5ZCM5q2l77yI6Jma5ouf5rua5Yqo5aSN55So6KGM5pe25bi46KeB77yJXG4gICAgT2JqZWN0LmtleXModGhpcy5tYXBPZkNoZWNrTGlzdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSBmYWxzZTtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xuICAgIHRoaXMubWFwT2ZDaGVja0xpc3QgPSB7fTtcbiAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoW10pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVmcmVzaFN0YXR1cyhldmVudDogYm9vbGVhbiA9IGZhbHNlLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIC8vIOemgeeUqOihjOS4jeWFgeiuuOWLvumAie+8m+WPlua2iOWLvumAieS7jeWFgeiuuO+8iOS+i+WmguaVsOaNruWPmOabtOWJjeW3suWLvumAie+8iVxuICAgICAgaWYgKGV2ZW50ICYmIHRoaXMuaXNTZWxlY3REaXNhYmxlZChkYXRhKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGV2ZW50O1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0YWJsZUxpc3QgPSB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pLFxuICAgICk7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9XG4gICAgICBzZWxlY3RhYmxlTGlzdC5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RhYmxlTGlzdC5ldmVyeSgoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSk7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPVxuICAgICAgc2VsZWN0YWJsZUxpc3Quc29tZShcbiAgICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgICApICYmICF0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkO1xuICAgIC8vIOinpuWPkXNlbGVjdOS6i+S7tlxuICAgIGlmICh0aGlzLnNlbGVjdEV2ZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZExpc3Q6IEFycmF5PGFueT4gPSBPYmplY3QudmFsdWVzKHRoaXMubWFwT2ZDaGVja0xpc3QpO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHNlbGVjdGVkTGlzdCk7XG4gICAgfVxuICAgIC8vIOWmguaenOaVsOaNruS4uuepuu+8jOWImea4heepuuWLvumAieagh+ivhlxuICAgIGlmICh0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoZWNrQWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDlhajpgIkv5Y+W5raI5YWo6YCJ5Z2H6Lez6L+H56aB55So6KGM77yI56aB55So6KGM5L+d5oyB5Y6f5Yu+6YCJ54q25oCB77yJXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3ooYzmmK/lkKbnpoHnlKjli77pgIkgKi9cbiAgaXNTZWxlY3REaXNhYmxlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnNlbGVjdERpc2FibGVkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm5aSx5pWIICovXG4gIGlzSW52YWxpZFJvdyhkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnJvd0ludmFsaWRGaWVsZCAmJlxuICAgICAgZGF0YSAmJlxuICAgICAgZGF0YVt0aGlzLnJvd0ludmFsaWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aWh+Wtl+minOiJsu+8mmNvbG9yIOS4uuWHveaVsOaXtuaMieihjOiuoeeul++8iOeUqOS6juafkOS4gOihjOafkOS4gOWIl+agh+e6ou+8ie+8jOWQpuWImeaVtOWIl+WQjOiJsuOAglxuICAgKi9cbiAgcmVzb2x2ZUNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmNvbG9yID09IG51bGwgfHwgY29sLmNvbG9yID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuY29sb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2wuY29sb3IoZGF0YSk7XG4gICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvcjtcbiAgfVxuXG4gIC8qKiDlj6/ngrnlh7vljZXlhYPmoLzpopzoibLvvJrnqbrlgLzlm7rlrprngbDvvIzlkKbliJnmjInliJcgY29sb3IgKi9cbiAgZ2V0TGlua0NlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaXNFbXB0eTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBcIiMyQTM2MzRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNlbGxDb2xvcihjb2wsIGRhdGEpO1xuICB9XG5cbiAgLyoqIOaZrumAmuaWh+acrOWNleWFg+agvOminOiJsu+8muWkseaViOihjOe7n+S4gOeBsO+8jOWQpuWImeeUqOWIl+mFjee9riBjb2xvciAqL1xuICBnZXRQbGFpbkNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNJbnZhbGlkUm93KGRhdGEpKSB7XG4gICAgICByZXR1cm4gXCIjODY4QTlDXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiPOepuj5cIjtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0ZUZpZWxkKGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5pc1N0YXRlKSB7XG4gICAgICByZXR1cm4gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIH1cbiAgICByZXR1cm4gY29sLnN0YXRlRmllbGQgfHwgXCJzdGF0ZVwiO1xuICB9XG5cbiAgLyoqIOWtl+auteWAvOWQjuaYr+WQpuWxleekuuerlue6v+ihjOWPtyAqL1xuICBoYXNSb3dObyhjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoY29sICYmIChjb2wucm93Tm8gPT09IHRydWUgfHwgKHR5cGVvZiBjb2wucm93Tm8gPT09IFwic3RyaW5nXCIgJiYgY29sLnJvd05vKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihjOWPt+aWh+ahiOOAgnJvd05vIOS4uuWtl+auteWQjeaXtuWPluihjOaVsOaNru+8m+S4uiB0cnVlIOaXtuaMieW9k+WJjemhteW6j+WPt++8iOi3qOmhtei/nue7re+8jOS7jiAxIOW8gOWni++8ieOAglxuICAgKi9cbiAgZ2V0Um93Tm9UZXh0KGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaGFzUm93Tm8oY29sKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGEgPyBkYXRhW2NvbC5yb3dOb10gOiBudWxsO1xuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZSA9IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDA7XG4gICAgY29uc3Qgcm93SW5kZXggPSBOdW1iZXIoaW5kZXgpID49IDAgPyBOdW1iZXIoaW5kZXgpIDogMDtcbiAgICByZXR1cm4gU3RyaW5nKChwYWdlIC0gMSkgKiBzaXplICsgcm93SW5kZXggKyAxKTtcbiAgfVxuXG4gIC8qKiDooajlpLTjgIzphY3pgIHljZXlj7cgfCDooYzjgI3mi4bmiJDnn63nq5bnur/vvIzpgb/lhY3lrZfnrKYgfCDmi4nmu6HooYzpq5ggKi9cbiAgZ2V0VGl0bGVQYXJ0cyhjb2w6IEhkVGFibGVDb2x1bW4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuaGFzUm93Tm8oY29sKSB8fCAhY29sIHx8ICFjb2wudGl0bGUgfHwgU3RyaW5nKGNvbC50aXRsZSkuaW5kZXhPZihcInxcIikgPCAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKGNvbC50aXRsZSkuc3BsaXQoXCJ8XCIpO1xuICAgIGlmIChyYXcubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbcmF3WzBdLnRyaW0oKSwgcmF3LnNsaWNlKDEpLmpvaW4oXCJ8XCIpLnRyaW0oKV07XG4gIH1cblxuICAvKiog5piv5ZCm5pi+56S657yW6L6R56yU5Zu+5qCH77yI5pyJIGVkaXRUeXBlIOaXtui1sOihjOWGheaOp+S7tu+8jOS4jeWGjeaYvuekuueslO+8iSAqL1xuICBpc0VkaXRhYmxlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbC5lZGl0YWJsZSA9PSBudWxsIHx8IGNvbC5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuZWRpdGFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXRhYmxlKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdGFibGU7XG4gIH1cblxuICAvKiog54K55Ye757yW6L6R56yU77yM5Zue6LCD54i257uE5Lu25Lyg5YWl55qEIGVkaXQgKi9cbiAgb25FZGl0Q2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudChjb2wuZWRpdCB8fCBudWxsLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbphY3nva7kuoblj6/nlKjnmoTooYzlhoXnvJbovpHvvIhuYW1lIOW/hemhu+aYryBzdHJpbmfvvIkgKi9cbiAgaGFzSW5saW5lRWRpdChjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmVkaXRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIWNvbC5uYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW2hkLXRhYmxlXSBlZGl0VHlwZSDopoHmsYIgbmFtZSDkuLogc3RyaW5n77yM5YiX44CMXCIgK1xuICAgICAgICAgIChjb2wudGl0bGUgfHwgXCJcIikgK1xuICAgICAgICAgIFwi44CN5bey5Zue6YCA5Y+q6K+7XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzRWRpdERpc2FibGVkKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmVkaXREaXNhYmxlZCA9PSBudWxsIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXREaXNhYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkO1xuICB9XG5cbiAgZ2V0U2VsZWN0TGlzdChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW107XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdC5zZWxlY3RMaXN0KSA/IG9wdC5zZWxlY3RMaXN0IDogW107XG4gIH1cblxuICBnZXRTZWxlY3RPcHRpb25MYWJlbChjb2w6IEhkVGFibGVDb2x1bW4sIGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtvcHQudmFsdWVdO1xuICAgIGNvbnN0IGxhYmVsID0gaXRlbVtvcHQubGFiZWxdO1xuICAgIGlmIChvcHQuc2hvd0xhYmVsQW5kVmFsdWUgfHwgb3B0LmhkU2hvd0l0ZW1Db2RlKSB7XG4gICAgICByZXR1cm4gYFske3ZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWV9XSR7bGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBsYWJlbH1gO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcobGFiZWwpO1xuICB9XG5cbiAgZ2V0SW5wdXROdW1iZXJQcm9wKFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBrZXk6IFwibWluXCIgfCBcIm1heFwiIHwgXCJzdGVwXCIgfCBcInByZWNpc2lvblwiLFxuICAgIGZhbGxiYWNrOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5pbnB1dE51bWJlcikge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBjb2wuaW5wdXROdW1iZXJba2V5XTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgPyBOdW1iZXIodmFsKSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgLyoqIElucHV0IC8gSW5wdXROdW1iZXIg5Y+Y5pu077ya5YWI6K6w5pen5YC85YaN5YaZ5Zue5bm26YCa55+l54i257uE5Lu2ICovXG4gIG9uQ2VsbENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU2VsZWN0IOWPmOabtO+8muWPjOWGmSB2YWx1ZSArIGxhYmVs77yM5bm25bimIHByZXZpb3VzKiAvIG9wdGlvbiAqL1xuICBvblNlbGVjdENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IGxhYmVsRmllbGQgPSBvcHQgJiYgb3B0LmxhYmVsID8gb3B0LmxhYmVsIDogbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBjb25zdCBwcmV2aW91c0xhYmVsID0gbGFiZWxGaWVsZCA/IGRhdGFbbGFiZWxGaWVsZF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0U2VsZWN0TGlzdChjb2wsIGRhdGEpO1xuICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID1cbiAgICAgIHByZXZpb3VzVmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHByZXZpb3VzVmFsdWUpIHx8XG4gICAgICAgICAgbnVsbDtcbiAgICBjb25zdCBvcHRpb24gPVxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHZhbHVlKSB8fCBudWxsO1xuXG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIGxldCBsYWJlbDogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmIChsYWJlbEZpZWxkKSB7XG4gICAgICBsYWJlbCA9IG9wdGlvbiA/IG9wdGlvbltvcHQubGFiZWxdIDogbnVsbDtcbiAgICAgIGRhdGFbbGFiZWxGaWVsZF0gPSBsYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdCh7XG4gICAgICBsaW5lOiBkYXRhLFxuICAgICAgY29sLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIGxhYmVsLFxuICAgICAgcHJldmlvdXNMYWJlbCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHByZXZpb3VzT3B0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
|