raise-common-lib-new 0.0.63 → 0.0.64
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/esm2022/lib/actions/toolbar/index.component.mjs +4 -3
- package/esm2022/lib/actions/toolbar-item/index.component.mjs +2 -2
- package/esm2022/lib/common-grid/grid-action/grid-action-item/grid-action-item.component.mjs +1 -1
- package/esm2022/lib/common-grid/grid-action/grid-action.component.mjs +3 -2
- package/esm2022/lib/common-grid/index.component.mjs +6 -3
- package/esm2022/lib/dashboard/api.mjs +33 -0
- package/esm2022/lib/dashboard/bar-charts/bar-charts.component.mjs +430 -0
- package/esm2022/lib/dashboard/bar-charts/utils.mjs +18 -0
- package/esm2022/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.mjs +442 -0
- package/esm2022/lib/dashboard/dashboard.service.mjs +295 -0
- package/esm2022/lib/dashboard/dashboardPorlets.service.mjs +2169 -0
- package/esm2022/lib/dashboard/dialog-group/download/index.component.mjs +212 -0
- package/esm2022/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.mjs +36 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.mjs +3211 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.mjs +3117 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-table/gadget-table.component.mjs +1099 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.mjs +583 -0
- package/esm2022/lib/dashboard/pane-group-new.component.mjs +2031 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.mjs +637 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-format/field-format.component.mjs +753 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.mjs +216 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.mjs +1239 -0
- package/esm2022/lib/dialog/common-delete-dialog/index.component.mjs +1 -1
- package/esm2022/lib/dialog/common-dialog/index.component.mjs +16 -5
- package/esm2022/lib/float-box/index.component.mjs +18 -4
- package/esm2022/lib/form/checkbox-group/index.component.mjs +35 -5
- package/esm2022/lib/form/drawer-form/drawer-form.component.mjs +177 -76
- package/esm2022/lib/layout/drawer/index.component.mjs +2 -2
- package/esm2022/lib/layout/page-list/index.component.mjs +9 -3
- package/esm2022/lib/layout/page-tab/index.component.mjs +5 -3
- package/esm2022/lib/layout/rs-stepper/constants.mjs +2 -0
- package/esm2022/lib/layout/rs-stepper/index.component.mjs +148 -0
- package/esm2022/lib/raise-common-lib.module.mjs +114 -7
- package/esm2022/lib/service/InjectionToken.mjs +5 -0
- package/esm2022/lib/service/keep-alive.service.mjs +2 -2
- package/esm2022/lib/smart-popup/index.component.mjs +1084 -0
- package/esm2022/public-api.mjs +19 -1
- package/fesm2022/raise-common-lib-new.mjs +18037 -220
- package/fesm2022/raise-common-lib-new.mjs.map +1 -1
- package/lib/common-grid/index.component.d.ts +2 -1
- package/lib/dashboard/api.d.ts +24 -0
- package/lib/dashboard/bar-charts/bar-charts.component.d.ts +63 -0
- package/lib/dashboard/bar-charts/utils.d.ts +1 -0
- package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +52 -0
- package/lib/dashboard/dashboard.service.d.ts +152 -0
- package/lib/dashboard/dashboardPorlets.service.d.ts +214 -0
- package/lib/dashboard/dialog-group/download/index.component.d.ts +36 -0
- package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +15 -0
- package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +128 -0
- package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +131 -0
- package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +77 -0
- package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +47 -0
- package/lib/dashboard/pane-group-new.component.d.ts +169 -0
- package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +56 -0
- package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +62 -0
- package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +30 -0
- package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +150 -0
- package/lib/dialog/common-dialog/index.component.d.ts +3 -1
- package/lib/float-box/index.component.d.ts +4 -3
- package/lib/form/checkbox-group/index.component.d.ts +5 -0
- package/lib/form/drawer-form/drawer-form.component.d.ts +21 -8
- package/lib/layout/page-list/index.component.d.ts +3 -1
- package/lib/layout/page-tab/index.component.d.ts +1 -0
- package/lib/layout/rs-stepper/constants.d.ts +5 -0
- package/lib/layout/rs-stepper/index.component.d.ts +31 -0
- package/lib/raise-common-lib.module.d.ts +61 -40
- package/lib/service/InjectionToken.d.ts +4 -0
- package/lib/smart-popup/index.component.d.ts +60 -0
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
- package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
- package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
- package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
- package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
- package/src/assets/img/dashboard_icon/Close.svg +4 -0
- package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
- package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
- package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
- package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
- package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
- package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
- package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
- package/src/assets/img/dashboard_icon/area-white.svg +3 -0
- package/src/assets/img/dashboard_icon/area.svg +3 -0
- package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
- package/src/assets/img/dashboard_icon/bar.svg +14 -0
- package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
- package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
- package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
- package/src/assets/img/dashboard_icon/column-white.svg +14 -0
- package/src/assets/img/dashboard_icon/column.svg +26 -0
- package/src/assets/img/dashboard_icon/customize.png +0 -0
- package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
- package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
- package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
- package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
- package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
- package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
- package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
- package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
- package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
- package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
- package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
- package/src/assets/img/dashboard_icon/ftable.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
- package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
- package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
- package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
- package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
- package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
- package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
- package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
- package/src/assets/img/dashboard_icon/geo.svg +14 -0
- package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
- package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
- package/src/assets/img/dashboard_icon/information-1.png +0 -0
- package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
- package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
- package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
- package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
- package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
- package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
- package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
- package/src/assets/img/dashboard_icon/more_View.svg +3 -0
- package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
- package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
- package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
- package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
- package/src/assets/img/dashboard_icon/pie.svg +16 -0
- package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
- package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
- package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
- package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
- package/src/assets/img/dashboard_icon/radar.svg +19 -0
- package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
- package/src/assets/img/dashboard_icon/search_input.svg +4 -0
- package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
- package/src/assets/img/dashboard_icon/table-3.svg +16 -0
- package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
- package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tick.svg +26 -0
- package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
- package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
- package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
- package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
- package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
- package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
- package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
- package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
- package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
- package/src/assets/img/dashboard_icon/transpose.svg +16 -0
|
@@ -0,0 +1,3211 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, ChangeDetectionStrategy, Inject, Optional, } from "@angular/core";
|
|
2
|
+
import { ToolbarService, FieldListService, NumberFormattingService, CalculatedFieldService, GroupingBarService, VirtualScrollService, DrillThroughService, } from "@syncfusion/ej2-angular-pivotview";
|
|
3
|
+
import { L10n, enableRipple, Browser, } from "@syncfusion/ej2-base";
|
|
4
|
+
import { sortBy, differenceWith, startsWith, cloneDeep, uniqBy, filter as _filter, maxBy, minBy, sumBy, meanBy, } from "lodash";
|
|
5
|
+
import { AGGREGATE_TYPES_TEXT, ALL_AGGREGATE_TYPES, } from "../../dashboardPorlets.service";
|
|
6
|
+
import { Observable } from "rxjs";
|
|
7
|
+
import { MaskedTextBox } from "@syncfusion/ej2-inputs/src/maskedtextbox/maskedtextbox";
|
|
8
|
+
import { DataManager } from "@syncfusion/ej2-data/src/manager";
|
|
9
|
+
import { Predicate, Query } from "@syncfusion/ej2-data/src/query";
|
|
10
|
+
import { DataUtil } from "@syncfusion/ej2-data";
|
|
11
|
+
import moment from "moment";
|
|
12
|
+
import { PBF_TOKEN } from "../../../service/InjectionToken";
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../../dashboardPorlets.service";
|
|
15
|
+
import * as i2 from "../../dashboard.service";
|
|
16
|
+
import * as i3 from "@angular/common";
|
|
17
|
+
import * as i4 from "@syncfusion/ej2-angular-pivotview";
|
|
18
|
+
enableRipple(false);
|
|
19
|
+
export class GadgetPivotComponent {
|
|
20
|
+
dashboardPorletsService;
|
|
21
|
+
dashboardService;
|
|
22
|
+
ref;
|
|
23
|
+
pbf;
|
|
24
|
+
portlet;
|
|
25
|
+
dashboard;
|
|
26
|
+
portlets;
|
|
27
|
+
Pivot_Data;
|
|
28
|
+
config;
|
|
29
|
+
dataSourceSettings;
|
|
30
|
+
gridSettings;
|
|
31
|
+
excludeFields = [];
|
|
32
|
+
filterSettings = [];
|
|
33
|
+
datePipeFormat;
|
|
34
|
+
translation;
|
|
35
|
+
pivotObj;
|
|
36
|
+
fieldlistObj;
|
|
37
|
+
observable = new Observable();
|
|
38
|
+
grandTotals = {};
|
|
39
|
+
subTotals = {};
|
|
40
|
+
flag = false;
|
|
41
|
+
previousSort;
|
|
42
|
+
subscriptions = [];
|
|
43
|
+
allDataValue;
|
|
44
|
+
// private calculatedFieldSettings;
|
|
45
|
+
isInit = true;
|
|
46
|
+
pivotSearchBox;
|
|
47
|
+
tooltipSettings = {
|
|
48
|
+
enable: false,
|
|
49
|
+
};
|
|
50
|
+
columnTexts = [];
|
|
51
|
+
configFields = [];
|
|
52
|
+
quarterFormat = [
|
|
53
|
+
{ value: "03/2021", format: "MM/yyyy" },
|
|
54
|
+
{ value: "03/21", format: "MM/dd" },
|
|
55
|
+
{ value: "3/2021", format: "M/yyyy" },
|
|
56
|
+
{ value: "3/21", format: "M/yy" },
|
|
57
|
+
{ value: "March 2021", format: "MMMM yyyy" },
|
|
58
|
+
{ value: "Mar, 2021", format: "MMM, yyyy" },
|
|
59
|
+
{ value: "March, 2021", format: "MMMM, yyyy" },
|
|
60
|
+
{ value: "2021", format: "yyyy" },
|
|
61
|
+
];
|
|
62
|
+
zoomSettings = {
|
|
63
|
+
enable: false,
|
|
64
|
+
};
|
|
65
|
+
itemDataTypeSortArr = [
|
|
66
|
+
"Assets",
|
|
67
|
+
"Liabilities",
|
|
68
|
+
"Equity",
|
|
69
|
+
"P&L",
|
|
70
|
+
"Cashflow",
|
|
71
|
+
];
|
|
72
|
+
formatDates = [];
|
|
73
|
+
customCalculatedFields = []; // 自定义计算列
|
|
74
|
+
allowedCalculatedFields = []; // 允许自定义算法的字段
|
|
75
|
+
zeroFormatData = {
|
|
76
|
+
emptyList: [],
|
|
77
|
+
hgList: [],
|
|
78
|
+
};
|
|
79
|
+
millionFields = [];
|
|
80
|
+
tempSubtotals = [];
|
|
81
|
+
orderByColumns; // Eg: "DueDate, Sequence"
|
|
82
|
+
isApplyIRR = false;
|
|
83
|
+
calcIRRData;
|
|
84
|
+
percentNumFields = [];
|
|
85
|
+
pageLoading;
|
|
86
|
+
constructor(dashboardPorletsService, dashboardService, ref, pbf) {
|
|
87
|
+
this.dashboardPorletsService = dashboardPorletsService;
|
|
88
|
+
this.dashboardService = dashboardService;
|
|
89
|
+
this.ref = ref;
|
|
90
|
+
this.pbf = pbf;
|
|
91
|
+
}
|
|
92
|
+
ngOnInit() {
|
|
93
|
+
this.getInfo();
|
|
94
|
+
L10n.load({
|
|
95
|
+
"en-US": {
|
|
96
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
97
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
98
|
+
},
|
|
99
|
+
zh: {
|
|
100
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
101
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
102
|
+
},
|
|
103
|
+
"zh-Hant-HK": {
|
|
104
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
105
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
106
|
+
},
|
|
107
|
+
ja: {
|
|
108
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
109
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
110
|
+
},
|
|
111
|
+
ko: {
|
|
112
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
113
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
114
|
+
},
|
|
115
|
+
fr: {
|
|
116
|
+
pivotview: AGGREGATE_TYPES_TEXT,
|
|
117
|
+
pivotfieldlist: AGGREGATE_TYPES_TEXT,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
this.getData();
|
|
121
|
+
}
|
|
122
|
+
ngAfterViewInit() {
|
|
123
|
+
this.subscriptions.push(this.dashboardService.getchangePivot().subscribe((updated) => {
|
|
124
|
+
if (updated === this.portlet.newId) {
|
|
125
|
+
this.getData();
|
|
126
|
+
}
|
|
127
|
+
}));
|
|
128
|
+
this.subscriptions.push(this.dashboardService.getStartRefresh().subscribe((dashboardId) => {
|
|
129
|
+
if (dashboardId === this.dashboard.id) {
|
|
130
|
+
this.pageLoading = true;
|
|
131
|
+
this.ref.markForCheck();
|
|
132
|
+
}
|
|
133
|
+
}));
|
|
134
|
+
this.subscriptions.push(this.dashboardService.getUpdated().subscribe((newId) => {
|
|
135
|
+
if (newId === this.portlet.newId || newId === this.portlet.id) {
|
|
136
|
+
this.getData();
|
|
137
|
+
if (this.pivotObj)
|
|
138
|
+
this.pivotObj.refreshData();
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
this.subscriptions.push(this.dashboardService.getRefreshGadget().subscribe((e) => {
|
|
142
|
+
if (!e) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const id = e["newId"];
|
|
146
|
+
if (id === this.portlet.newId || id === this.portlet.id) {
|
|
147
|
+
this.pageLoading = false;
|
|
148
|
+
this.getData();
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
this.subscriptions.push(this.dashboardService.getTableFormat().subscribe((updated) => {
|
|
152
|
+
if (updated === this.portlet.newId) {
|
|
153
|
+
this.getData();
|
|
154
|
+
if (this.pivotObj)
|
|
155
|
+
this.pivotObj.refreshData();
|
|
156
|
+
}
|
|
157
|
+
}));
|
|
158
|
+
this.subscriptions.push(this.dashboardService
|
|
159
|
+
.clearFieldListObservable()
|
|
160
|
+
.subscribe((updated) => {
|
|
161
|
+
if (updated === this.portlet.newId) {
|
|
162
|
+
this.pivotObj.dataSourceSettings.dataSource = [];
|
|
163
|
+
if (this.pivotObj)
|
|
164
|
+
this.pivotObj.refreshData();
|
|
165
|
+
if (this.fieldlistObj)
|
|
166
|
+
this.fieldlistObj.updateDataSource();
|
|
167
|
+
this.ref.markForCheck();
|
|
168
|
+
this.ref.detectChanges();
|
|
169
|
+
}
|
|
170
|
+
}));
|
|
171
|
+
// title change
|
|
172
|
+
this.subscriptions.push(this.dashboardService.updatePortletTitle().subscribe((updated) => {
|
|
173
|
+
if (updated) {
|
|
174
|
+
this.config = JSON.parse(this.portlet.config);
|
|
175
|
+
}
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
ngOnDestroy() {
|
|
179
|
+
this.subscriptions.forEach((sub) => sub.unsubscribe());
|
|
180
|
+
}
|
|
181
|
+
onMemberEditorOpen(args) {
|
|
182
|
+
// 你可以在这里根据需要修改args来自定义过滤窗口的行为
|
|
183
|
+
// 11247 专门为item data type而设置
|
|
184
|
+
if (args.fieldName === "AccountTypeCode") {
|
|
185
|
+
let res = new Array(5).fill(null);
|
|
186
|
+
const fieldMembers = [...args.fieldMembers];
|
|
187
|
+
for (let i = fieldMembers.length - 1; i >= 0; i--) {
|
|
188
|
+
let index = -1;
|
|
189
|
+
const item = this.itemDataTypeSortArr.find((name, ind) => {
|
|
190
|
+
if (fieldMembers[i].actualText === name) {
|
|
191
|
+
index = ind;
|
|
192
|
+
}
|
|
193
|
+
return fieldMembers[i].actualText === name;
|
|
194
|
+
});
|
|
195
|
+
if (!item) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const fillItem = fieldMembers.splice(i, 1);
|
|
199
|
+
res[index] = fillItem[0];
|
|
200
|
+
}
|
|
201
|
+
res = res.filter((item) => item) || [];
|
|
202
|
+
args.fieldMembers = [...res, ...fieldMembers];
|
|
203
|
+
setTimeout(() => {
|
|
204
|
+
const ele = document.querySelector(".e-member-editor-dialog");
|
|
205
|
+
if (ele) {
|
|
206
|
+
ele.querySelector(".e-filter-sort").setAttribute("style", "display: none");
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
setGridSettings() {
|
|
212
|
+
this.gridSettings = {
|
|
213
|
+
columnWidth: 140,
|
|
214
|
+
rowHeight: 40,
|
|
215
|
+
allowSelection: true,
|
|
216
|
+
selectionSettings: {
|
|
217
|
+
mode: "Cell",
|
|
218
|
+
type: "Multiple",
|
|
219
|
+
cellSelectionMode: "Box",
|
|
220
|
+
},
|
|
221
|
+
columnRender: this.observable.subscribe((args) => {
|
|
222
|
+
this.setColumnsRender(args);
|
|
223
|
+
}),
|
|
224
|
+
// 升级后 默认会有导出样式覆盖,需要手动设置导出标题样式
|
|
225
|
+
excelHeaderQueryCellInfo: this.observable.subscribe((args) => {
|
|
226
|
+
// args.style是个ExcelStyle类型
|
|
227
|
+
args.style = {
|
|
228
|
+
bold: true,
|
|
229
|
+
vAlign: "Center",
|
|
230
|
+
wrapText: false,
|
|
231
|
+
indent: 0,
|
|
232
|
+
borders: null, // 不需要border
|
|
233
|
+
};
|
|
234
|
+
}),
|
|
235
|
+
// 升级后 默认会有导出样式覆盖,需要手动设置导出内容样式
|
|
236
|
+
excelQueryCellInfo: this.observable.subscribe((args) => {
|
|
237
|
+
// #f486cfff 这里输出的是RGBA 颜色格式, xlsx里不需要透明度,去掉尾部ff
|
|
238
|
+
if (args.style && args.style.backColor) {
|
|
239
|
+
args.style.backColor = args.style.backColor.substring(0, 7);
|
|
240
|
+
}
|
|
241
|
+
let _style = {
|
|
242
|
+
bold: false,
|
|
243
|
+
wrapText: false,
|
|
244
|
+
borders: null,
|
|
245
|
+
fontColor: args.style.fontColor,
|
|
246
|
+
backColor: args.style.backColor,
|
|
247
|
+
};
|
|
248
|
+
let colIndex = args.cell.colIndex;
|
|
249
|
+
let rowIndex = args.cell.rowIndex;
|
|
250
|
+
if (this.config.showGrandTotals) {
|
|
251
|
+
// GrandTotal不需要颜色
|
|
252
|
+
if (args.data.length === rowIndex + 1) {
|
|
253
|
+
delete _style.fontColor;
|
|
254
|
+
delete _style.backColor;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (args.data[rowIndex][colIndex].formattedText == "") {
|
|
258
|
+
args.value = "";
|
|
259
|
+
}
|
|
260
|
+
args.style = Object.assign(args.style, _style);
|
|
261
|
+
if (args.value === "" && args.style.numberFormat) {
|
|
262
|
+
args.style.numberFormat = null;
|
|
263
|
+
}
|
|
264
|
+
if (this.formatDates && this.formatDates.length) {
|
|
265
|
+
let dateFields = this.formatDates.map((el) => {
|
|
266
|
+
return el.name;
|
|
267
|
+
});
|
|
268
|
+
if (args.value &&
|
|
269
|
+
(args.cell.colIndex === 0
|
|
270
|
+
? dateFields.includes(args.cell.valueSort.axis)
|
|
271
|
+
: dateFields.includes(args.cell.actualText))) {
|
|
272
|
+
//Customize the Row headers/Column headers based on your needs
|
|
273
|
+
let headers;
|
|
274
|
+
if (args.cell.colIndex === 0) {
|
|
275
|
+
headers = args.cell.actualText;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// headers = pivotValues[k][j].formattedText;
|
|
279
|
+
headers = args.value;
|
|
280
|
+
}
|
|
281
|
+
if (headers) {
|
|
282
|
+
let date = new Date(headers);
|
|
283
|
+
let quarter = Math.floor(date.getMonth() / 3) + 1;
|
|
284
|
+
let format;
|
|
285
|
+
this.formatDates.map((el) => {
|
|
286
|
+
if (args.cell.colIndex == 0) {
|
|
287
|
+
if (el.name ==
|
|
288
|
+
args.cell.valueSort.axis)
|
|
289
|
+
format = el.format;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
if (el.name == args.cell.actualText)
|
|
293
|
+
format = el.format;
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
args.value = this.getQuarterValue(format, date, quarter);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
beforeExport(exportData) {
|
|
304
|
+
if (exportData) {
|
|
305
|
+
const keyMap = {};
|
|
306
|
+
this.dataSourceSettings.formatSettings.forEach((data) => {
|
|
307
|
+
if (data.format === "#,###,,.0;(#,###,,.0)" ||
|
|
308
|
+
data.format === "#,###,,;(#,###,,)" ||
|
|
309
|
+
data.format === "#,###,,.00;(#,###,,.00)") {
|
|
310
|
+
keyMap[data.name] = true;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
if (exportData.dataCollections &&
|
|
314
|
+
exportData.dataCollections.length) {
|
|
315
|
+
exportData.dataCollections[0].forEach((row) => {
|
|
316
|
+
row.forEach((cell) => {
|
|
317
|
+
if (keyMap[cell.actualText]) {
|
|
318
|
+
cell.value = cell.actualValue;
|
|
319
|
+
}
|
|
320
|
+
if (typeof cell.value === "object" &&
|
|
321
|
+
typeof cell.formattedText === "string") {
|
|
322
|
+
cell.value = cell.formattedText;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async getData() {
|
|
330
|
+
this.pageLoading = false;
|
|
331
|
+
let columns = [];
|
|
332
|
+
let values = [];
|
|
333
|
+
let formatSettings = [];
|
|
334
|
+
let rows = [];
|
|
335
|
+
let fieldMapping = [];
|
|
336
|
+
// 清空grandTotals和subTotals
|
|
337
|
+
this.grandTotals = {};
|
|
338
|
+
this.subTotals = {};
|
|
339
|
+
this.config = JSON.parse(this.portlet.config);
|
|
340
|
+
this.setGridSettings();
|
|
341
|
+
if (this.config.fields) {
|
|
342
|
+
if (this.dashboardPorletsService.allFieldsObj[this.portlet.id]) {
|
|
343
|
+
this.configFields =
|
|
344
|
+
this.dashboardPorletsService.setConfigFields(this.dashboardPorletsService.allFieldsObj[this.portlet.id], this.config.fields);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
this.configFields = [...this.config.fields];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
this.Pivot_Data = this.dashboardPorletsService.getResultByDataTable(this.portlet, false, false, this.dashboard.id);
|
|
351
|
+
this.orderByColumns = this.dashboardPorletsService.getOrderByColumnsNew(this.portlet.figureCode, this.dashboard);
|
|
352
|
+
this.Pivot_Data = DataUtil.parse.parseJson(this.Pivot_Data);
|
|
353
|
+
if (this.Pivot_Data && this.Pivot_Data.length > 0) {
|
|
354
|
+
// 移除列名和数据key不匹配的项
|
|
355
|
+
this.getexcludeFields(this.configFields, this.Pivot_Data[0]);
|
|
356
|
+
if (!this.allowedCalculatedFields.length) {
|
|
357
|
+
this.allowedCalculatedFields = Object.keys(this.Pivot_Data[0]);
|
|
358
|
+
}
|
|
359
|
+
for (let item of this.configFields) {
|
|
360
|
+
// 字段分组 https://ej2.syncfusion.com/angular/documentation/pivotview/field-list?search=fieldMapping#group-fields-under-desired-folder-name
|
|
361
|
+
fieldMapping.push({
|
|
362
|
+
name: item.colName,
|
|
363
|
+
caption: item.addtionName
|
|
364
|
+
? `${item.langValue} ${item.addtionName}`
|
|
365
|
+
: item.langValue
|
|
366
|
+
? item.langValue
|
|
367
|
+
: this.translation[item.langCode] || item.langCode,
|
|
368
|
+
dataType: item.dataType,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (this.configFields) {
|
|
373
|
+
this.percentNumFields = [];
|
|
374
|
+
this.formatDates = [];
|
|
375
|
+
this.zeroFormatData.hgList = [];
|
|
376
|
+
this.zeroFormatData.emptyList = [];
|
|
377
|
+
this.millionFields = [];
|
|
378
|
+
this.configFields.map((el) => {
|
|
379
|
+
// SMP2-2486 & percentNum的format问题
|
|
380
|
+
if (el.dataType == "percentNum") {
|
|
381
|
+
this.percentNumFields.push(el.colName);
|
|
382
|
+
}
|
|
383
|
+
if (el.format &&
|
|
384
|
+
el.format.length &&
|
|
385
|
+
el.format[0].formatChecked &&
|
|
386
|
+
[2, 5, 8, 11, 14, 17].includes(el.format[0].selectedFormat))
|
|
387
|
+
this.zeroFormatData.hgList.push(el.colName);
|
|
388
|
+
if (el.format &&
|
|
389
|
+
el.format.length &&
|
|
390
|
+
el.format[0].formatChecked &&
|
|
391
|
+
[3, 6, 9, 12, 15, 18].includes(el.format[0].selectedFormat))
|
|
392
|
+
this.zeroFormatData.emptyList.push(el.colName);
|
|
393
|
+
// pivotTableformatPercent 百分比也有10,11,12 但是它是显示0.00x的格式,所以得排除
|
|
394
|
+
if (el.dataType !== "percent" &&
|
|
395
|
+
el.format &&
|
|
396
|
+
el.format.length &&
|
|
397
|
+
el.format[0].formatChecked &&
|
|
398
|
+
[10, 11, 12, 13, 14, 15, 16, 17, 18].includes(el.format[0].selectedFormat))
|
|
399
|
+
this.millionFields.push(el.colName);
|
|
400
|
+
if (el.dataType === "number" &&
|
|
401
|
+
(!el.format ||
|
|
402
|
+
(el.format &&
|
|
403
|
+
el.format.length &&
|
|
404
|
+
!el.format[0].formatChecked))) {
|
|
405
|
+
const formatData = {
|
|
406
|
+
name: el.colName,
|
|
407
|
+
//SMP2-3026 and SMP2-3059
|
|
408
|
+
format: el.colName !== "PortInvStk" &&
|
|
409
|
+
el.colName !== "PortFdInvStk"
|
|
410
|
+
? this.dashboardPorletsService.formatNumber(el.dp)
|
|
411
|
+
: "##0.#######0",
|
|
412
|
+
useGrouping: true,
|
|
413
|
+
};
|
|
414
|
+
formatSettings.push(formatData);
|
|
415
|
+
}
|
|
416
|
+
if ((el.dataType === "percent" ||
|
|
417
|
+
el.dataType === "percentNum") &&
|
|
418
|
+
(!el.format ||
|
|
419
|
+
(el.format &&
|
|
420
|
+
el.format.length &&
|
|
421
|
+
!el.format[0].formatChecked))) {
|
|
422
|
+
const formatData = {
|
|
423
|
+
name: el.colName,
|
|
424
|
+
format: this.dashboardPorletsService.formatPercent(el.dp),
|
|
425
|
+
};
|
|
426
|
+
formatSettings.push(formatData);
|
|
427
|
+
}
|
|
428
|
+
if (el.dataType === "multiple" &&
|
|
429
|
+
(!el.format ||
|
|
430
|
+
(el.format &&
|
|
431
|
+
el.format.length &&
|
|
432
|
+
!el.format[0].formatChecked))) {
|
|
433
|
+
const formatData = {
|
|
434
|
+
name: el.colName,
|
|
435
|
+
format: this.dashboardPorletsService.formatMultiple(el.dp),
|
|
436
|
+
};
|
|
437
|
+
formatSettings.push(formatData);
|
|
438
|
+
}
|
|
439
|
+
if (el.dataType === "datetime" || el.dataType === "date") {
|
|
440
|
+
let format = "";
|
|
441
|
+
if (el.format &&
|
|
442
|
+
el.format.length &&
|
|
443
|
+
el.format[0].formatChecked) {
|
|
444
|
+
if (el.format[0].dateType == "Quarter") {
|
|
445
|
+
let format_ = el.format[0].selectedFormatDisplay;
|
|
446
|
+
let formatInfo = this.quarterFormat.filter((qur) => qur.value == format_);
|
|
447
|
+
if (formatInfo.length) {
|
|
448
|
+
format = formatInfo[0].format;
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
const formatData = {
|
|
452
|
+
name: el.colName,
|
|
453
|
+
format: format_,
|
|
454
|
+
type: "date",
|
|
455
|
+
};
|
|
456
|
+
this.formatDates.push(formatData);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else if (el.format[0].dateType == "Date") {
|
|
460
|
+
let fromIdx = el.format[0].selectedFormatDisplay.indexOf("(");
|
|
461
|
+
let toIdx = el.format[0].selectedFormatDisplay.indexOf(")");
|
|
462
|
+
let format_ = el.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
|
|
463
|
+
switch (format_) {
|
|
464
|
+
case "DD/MM/YYYY":
|
|
465
|
+
format = "dd/MM/yyyy";
|
|
466
|
+
break;
|
|
467
|
+
case "DD/MM/YY":
|
|
468
|
+
format = "dd/MM/yy";
|
|
469
|
+
break;
|
|
470
|
+
case "MM/DD/YYYY":
|
|
471
|
+
format = "MM/dd/yyyy";
|
|
472
|
+
break;
|
|
473
|
+
case "MM/DD/YY":
|
|
474
|
+
format = "MM/dd/yy";
|
|
475
|
+
break;
|
|
476
|
+
case "YYYY-MM-DD":
|
|
477
|
+
format = "yyyy-MM-dd";
|
|
478
|
+
break;
|
|
479
|
+
case "YY-MM-DD":
|
|
480
|
+
format = "yy-MM-dd";
|
|
481
|
+
break;
|
|
482
|
+
case "DD-MM-YYYY":
|
|
483
|
+
format = "dd-MM-yyyy";
|
|
484
|
+
break;
|
|
485
|
+
case "DD-MM-YY":
|
|
486
|
+
format = "dd-MM-yy";
|
|
487
|
+
break;
|
|
488
|
+
case "MM-DD-YYYY":
|
|
489
|
+
format = "MM-dd-yyyy";
|
|
490
|
+
break;
|
|
491
|
+
case "MM-DD-YY":
|
|
492
|
+
format = "MM-dd-yy";
|
|
493
|
+
break;
|
|
494
|
+
case "MMM DD, YYYY":
|
|
495
|
+
format = "MMM dd, yyyy";
|
|
496
|
+
break;
|
|
497
|
+
case "DD-MMM-YYYY":
|
|
498
|
+
format = "dd-MMM-yyyy";
|
|
499
|
+
break;
|
|
500
|
+
default:
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
if (!format) {
|
|
506
|
+
const formatData = {
|
|
507
|
+
name: el.colName,
|
|
508
|
+
format: this.datePipeFormat,
|
|
509
|
+
type: "date",
|
|
510
|
+
};
|
|
511
|
+
formatSettings.push(formatData);
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
const formatData = {
|
|
515
|
+
name: el.colName,
|
|
516
|
+
format: format,
|
|
517
|
+
type: "date",
|
|
518
|
+
};
|
|
519
|
+
formatSettings.push(formatData);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
//calculatedFieldSettings format push to formatSettings
|
|
525
|
+
if (this.config.calculatedFieldSettings &&
|
|
526
|
+
this.config.calculatedFieldSettings.length > 0) {
|
|
527
|
+
this.config.calculatedFieldSettings.map((el) => {
|
|
528
|
+
if (el.formatString !== "") {
|
|
529
|
+
for (let i = formatSettings.length - 1; i >= 0; i--) {
|
|
530
|
+
if (formatSettings[i].name === el.name) {
|
|
531
|
+
formatSettings.splice(i, 1);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
formatSettings.push({
|
|
535
|
+
name: el.name,
|
|
536
|
+
format: el.formatString,
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
let series = this.config.yaxis.series;
|
|
542
|
+
if (series) {
|
|
543
|
+
for (let item of series) {
|
|
544
|
+
const value = {
|
|
545
|
+
name: item.colName,
|
|
546
|
+
caption: this.getCaptionByName(item.colName) || item.title,
|
|
547
|
+
type: item.calMethod,
|
|
548
|
+
};
|
|
549
|
+
values.push(value);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
let groups = this.config.xaxis.groups;
|
|
553
|
+
if (groups) {
|
|
554
|
+
for (let gitem of groups) {
|
|
555
|
+
const field = this.configFields.filter((el) => el.colName === gitem.name);
|
|
556
|
+
if (field.length > 0) {
|
|
557
|
+
gitem.showSubTotals = field[0].showSubTotals;
|
|
558
|
+
gitem.caption =
|
|
559
|
+
field[0].langValue ||
|
|
560
|
+
this.translation[field[0].langCode] ||
|
|
561
|
+
gitem.caption ||
|
|
562
|
+
field[0].langCode;
|
|
563
|
+
}
|
|
564
|
+
rows.push(gitem);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (this.config.columnGroup && this.config.columnGroup.length) {
|
|
568
|
+
for (let item of this.config.columnGroup) {
|
|
569
|
+
const field = this.configFields.filter((el) => el.colName === item.name);
|
|
570
|
+
if (field.length > 0) {
|
|
571
|
+
item.showSubTotals = field[0].showSubTotals;
|
|
572
|
+
item.caption =
|
|
573
|
+
field[0].langValue ||
|
|
574
|
+
this.translation[field[0].langCode] ||
|
|
575
|
+
field[0].langCode ||
|
|
576
|
+
item.caption;
|
|
577
|
+
}
|
|
578
|
+
columns.push(item);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
let conditionalFormatSettings = [];
|
|
582
|
+
this.configFields.forEach((field) => {
|
|
583
|
+
if (field.format && field.format.length) {
|
|
584
|
+
if (field.format[0].fontSettingChecked) {
|
|
585
|
+
let conditionalFormatObj = {
|
|
586
|
+
applyGrandTotals: true,
|
|
587
|
+
measure: "",
|
|
588
|
+
value1: null,
|
|
589
|
+
value2: null,
|
|
590
|
+
conditions: "",
|
|
591
|
+
style: {
|
|
592
|
+
backgroundColor: "",
|
|
593
|
+
color: "",
|
|
594
|
+
fontFamily: "",
|
|
595
|
+
fontSize: "",
|
|
596
|
+
},
|
|
597
|
+
};
|
|
598
|
+
let negaConditionalFormatObj = {
|
|
599
|
+
applyGrandTotals: true,
|
|
600
|
+
measure: "",
|
|
601
|
+
value1: null,
|
|
602
|
+
value2: null,
|
|
603
|
+
conditions: "",
|
|
604
|
+
style: {
|
|
605
|
+
backgroundColor: "",
|
|
606
|
+
color: "",
|
|
607
|
+
fontFamily: "",
|
|
608
|
+
fontSize: "",
|
|
609
|
+
},
|
|
610
|
+
};
|
|
611
|
+
// font setting start
|
|
612
|
+
negaConditionalFormatObj.measure =
|
|
613
|
+
field.format[0].selectedField;
|
|
614
|
+
conditionalFormatObj.measure =
|
|
615
|
+
field.format[0].selectedField;
|
|
616
|
+
if (field.format[0].formatChecked &&
|
|
617
|
+
field.format[0].compareSelect) {
|
|
618
|
+
this.setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, field.format[0]);
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
delete conditionalFormatObj.value2;
|
|
622
|
+
delete negaConditionalFormatObj.value2;
|
|
623
|
+
negaConditionalFormatObj.value1 = 0;
|
|
624
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
625
|
+
conditionalFormatObj.value1 = 0;
|
|
626
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
627
|
+
this.setFontSettingConditional(negaConditionalFormatObj, field.format[0], -1);
|
|
628
|
+
this.setFontSettingConditional(conditionalFormatObj, field.format[0], 1);
|
|
629
|
+
}
|
|
630
|
+
conditionalFormatSettings.push(negaConditionalFormatObj);
|
|
631
|
+
conditionalFormatSettings.unshift(conditionalFormatObj);
|
|
632
|
+
// font setting end
|
|
633
|
+
}
|
|
634
|
+
let formatSettingsObj = {
|
|
635
|
+
name: "",
|
|
636
|
+
format: "",
|
|
637
|
+
};
|
|
638
|
+
if (field.format[0].formatChecked) {
|
|
639
|
+
formatSettingsObj.name = field.format[0].selectedField;
|
|
640
|
+
formatSettingsObj.format =
|
|
641
|
+
this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
|
|
642
|
+
switch (field.format[0].dataType) {
|
|
643
|
+
case "number":
|
|
644
|
+
formatSettingsObj.format =
|
|
645
|
+
this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
|
|
646
|
+
break;
|
|
647
|
+
case "integer":
|
|
648
|
+
formatSettingsObj.format =
|
|
649
|
+
this.dashboardPorletsService.pivotTableformatInteger(field.format[0].selectedFormat);
|
|
650
|
+
break;
|
|
651
|
+
case "percentNum":
|
|
652
|
+
case "percent":
|
|
653
|
+
formatSettingsObj.format =
|
|
654
|
+
this.dashboardPorletsService.pivotTableformatPercent(field.format[0].selectedFormat);
|
|
655
|
+
break;
|
|
656
|
+
case "multiple":
|
|
657
|
+
formatSettingsObj.format =
|
|
658
|
+
this.dashboardPorletsService.pivotTableformatMultiple(field.format[0].selectedFormat);
|
|
659
|
+
break;
|
|
660
|
+
case "date":
|
|
661
|
+
case "datetime":
|
|
662
|
+
let format = "";
|
|
663
|
+
if (field.format && field.format.length) {
|
|
664
|
+
if (field.format[0].dateType == "Quarter") {
|
|
665
|
+
format =
|
|
666
|
+
field.format[0].selectedFormatDisplay;
|
|
667
|
+
}
|
|
668
|
+
else if (field.format[0].dateType == "Date") {
|
|
669
|
+
let fromIdx = field.format[0].selectedFormatDisplay.indexOf("(");
|
|
670
|
+
let toIdx = field.format[0].selectedFormatDisplay.indexOf(")");
|
|
671
|
+
format =
|
|
672
|
+
field.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
if (format) {
|
|
676
|
+
formatSettingsObj = {
|
|
677
|
+
name: field.colName,
|
|
678
|
+
format: "",
|
|
679
|
+
};
|
|
680
|
+
// field.dataType = "string";
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
formatSettingsObj.format = this.datePipeFormat;
|
|
684
|
+
formatSettingsObj["type"] = "date";
|
|
685
|
+
}
|
|
686
|
+
break;
|
|
687
|
+
default:
|
|
688
|
+
break;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
if (field.format[0].dataType !== "string" &&
|
|
692
|
+
formatSettingsObj.format) {
|
|
693
|
+
formatSettings.push(formatSettingsObj);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
this.customCalculatedFields = this.config.customCalculatedFields
|
|
698
|
+
? this.config.customCalculatedFields
|
|
699
|
+
: [];
|
|
700
|
+
// SMP2-4582 AGIC - Dashboard item sequence
|
|
701
|
+
let isExistSeq = false;
|
|
702
|
+
let sortSettings = this.config.sortSettings || [];
|
|
703
|
+
if (this.Pivot_Data &&
|
|
704
|
+
this.Pivot_Data[0] &&
|
|
705
|
+
this.Pivot_Data[0].Seq !== null) {
|
|
706
|
+
// 取消Name的默认排序,根据Seq来排序
|
|
707
|
+
sortSettings.push({ name: "Name", order: "None" });
|
|
708
|
+
isExistSeq = true;
|
|
709
|
+
}
|
|
710
|
+
let filterSettings = this.dashboardPorletsService.checkFilterSettings(this.config, this.configFields, this.Pivot_Data);
|
|
711
|
+
let nameFilter = filterSettings.find((x) => x.name === "Name");
|
|
712
|
+
// 存在 Name的filter时,会按照默认排序,需要对Name进行Seq排序处理
|
|
713
|
+
if (isExistSeq && nameFilter && rows.some((x) => x.name === "Name")) {
|
|
714
|
+
let items = nameFilter.items; // 拿到当前排序,默认A-Z
|
|
715
|
+
let seqArr = [];
|
|
716
|
+
items.forEach((name) => {
|
|
717
|
+
let obj = this.Pivot_Data.find((x) => x.Name === name);
|
|
718
|
+
let item = {
|
|
719
|
+
name: name,
|
|
720
|
+
seq: obj.Seq,
|
|
721
|
+
};
|
|
722
|
+
seqArr.push(item);
|
|
723
|
+
});
|
|
724
|
+
seqArr.sort((a, b) => a.seq - b.seq);
|
|
725
|
+
nameFilter.items = seqArr.map((x) => x.name);
|
|
726
|
+
}
|
|
727
|
+
const allFields = this.dashboardPorletsService.allFieldsObj[this.portlet.id];
|
|
728
|
+
if (allFields) {
|
|
729
|
+
values.forEach((value) => {
|
|
730
|
+
const item = allFields.find((field) => field.colName === value.name);
|
|
731
|
+
if (item) {
|
|
732
|
+
value.caption =
|
|
733
|
+
(item.format &&
|
|
734
|
+
item.format.length &&
|
|
735
|
+
item.format[0].displayName) ||
|
|
736
|
+
item.langValue ||
|
|
737
|
+
this.translation[item.langCode] ||
|
|
738
|
+
item.langCode;
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
let hasItemDataType = false;
|
|
743
|
+
if (this.Pivot_Data) {
|
|
744
|
+
this.Pivot_Data.map((data) => {
|
|
745
|
+
if (data["AccountTypeCode"]) {
|
|
746
|
+
hasItemDataType = true;
|
|
747
|
+
}
|
|
748
|
+
rows.forEach((row) => {
|
|
749
|
+
if (data[row.name] === "") {
|
|
750
|
+
data[row.name] = "null";
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
if (hasItemDataType) {
|
|
756
|
+
sortSettings.push({
|
|
757
|
+
name: "AccountTypeCode",
|
|
758
|
+
order: "Ascending",
|
|
759
|
+
membersOrder: [...this.itemDataTypeSortArr],
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
this.config.filters.forEach((filter) => {
|
|
763
|
+
filter.caption =
|
|
764
|
+
this.getCaptionByName(filter.name) || filter.caption;
|
|
765
|
+
});
|
|
766
|
+
this.dataSourceSettings = {
|
|
767
|
+
dataSource: this.Pivot_Data || [],
|
|
768
|
+
rows: rows || [],
|
|
769
|
+
columns: columns || [],
|
|
770
|
+
values: values || [],
|
|
771
|
+
filters: this.config.filters,
|
|
772
|
+
filterSettings: filterSettings,
|
|
773
|
+
excludeFields: this.excludeFields,
|
|
774
|
+
formatSettings: formatSettings,
|
|
775
|
+
conditionalFormatSettings: conditionalFormatSettings,
|
|
776
|
+
// 用于收起展开指定层级, 这玩意只能展开第一层,
|
|
777
|
+
// 必须设定expandAll 为false(默认是false), 这样子才能实现只展开两层
|
|
778
|
+
// drilledMembers,
|
|
779
|
+
expandAll: true,
|
|
780
|
+
enableSorting: true,
|
|
781
|
+
fieldMapping: fieldMapping,
|
|
782
|
+
calculatedFieldSettings: this.config.calculatedFieldSettings,
|
|
783
|
+
sortSettings: sortSettings,
|
|
784
|
+
// groupSettings: this.config.groupSettings,
|
|
785
|
+
valueSortSettings: this.config.valueSortSettings,
|
|
786
|
+
showGrandTotals: this.config.showGrandTotals,
|
|
787
|
+
showRowGrandTotals: this.config.showRowGrandTotals,
|
|
788
|
+
showColumnGrandTotals: this.config.showColumnGrandTotals,
|
|
789
|
+
showSubTotals: this.config.showSubTotals,
|
|
790
|
+
showRowSubTotals: this.config.showRowSubTotals,
|
|
791
|
+
showColumnSubTotals: this.config.showColumnSubTotals,
|
|
792
|
+
};
|
|
793
|
+
console.log("this.dataSourceSettings", this.dataSourceSettings);
|
|
794
|
+
this.ref.markForCheck();
|
|
795
|
+
}
|
|
796
|
+
getCaptionByName(nameString) {
|
|
797
|
+
if (!nameString)
|
|
798
|
+
return "";
|
|
799
|
+
const field = this.configFields.find((el) => el.colName === nameString);
|
|
800
|
+
return field
|
|
801
|
+
? field.langValue ||
|
|
802
|
+
this.translation[field && field.langCode] ||
|
|
803
|
+
field.langCode
|
|
804
|
+
: "";
|
|
805
|
+
}
|
|
806
|
+
afterPopulate(args) {
|
|
807
|
+
this.tempSubtotals = [];
|
|
808
|
+
this.grandTotals = {};
|
|
809
|
+
this.subTotals = {};
|
|
810
|
+
let tempshowArray = [];
|
|
811
|
+
this.config.yaxis.series.forEach((item) => {
|
|
812
|
+
if (item.hasOwnProperty("showSubTotals") &&
|
|
813
|
+
item.hasOwnProperty("showGrandTotals")) {
|
|
814
|
+
tempshowArray.push({
|
|
815
|
+
name: item.colName,
|
|
816
|
+
calMethod: item.calMethod,
|
|
817
|
+
showSubTotals: item.showSubTotals,
|
|
818
|
+
showGrandTotals: item.showGrandTotals,
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
else {
|
|
822
|
+
if (item.hasOwnProperty("showGrandTotals")) {
|
|
823
|
+
tempshowArray.push({
|
|
824
|
+
name: item.colName,
|
|
825
|
+
calMethod: item.calMethod,
|
|
826
|
+
showGrandTotals: item.showGrandTotals,
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
if (item.hasOwnProperty("showSubTotals")) {
|
|
830
|
+
tempshowArray.push({
|
|
831
|
+
name: item.colName,
|
|
832
|
+
calMethod: item.calMethod,
|
|
833
|
+
showSubTotals: item.showSubTotals,
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
});
|
|
838
|
+
if (this.fieldlistObj && this.pivotObj) {
|
|
839
|
+
this.config.columnGroup = [];
|
|
840
|
+
this.config.xaxis.groups = [];
|
|
841
|
+
this.config.yaxis.series = [];
|
|
842
|
+
this.config.filters = [];
|
|
843
|
+
this.config.filterSettings = [];
|
|
844
|
+
this.config.calculatedFieldSettings = [];
|
|
845
|
+
let groupSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "groupSettings");
|
|
846
|
+
let columns = this.getDataSourceSettingsProp(this.fieldlistObj, "columns");
|
|
847
|
+
let rows = this.getDataSourceSettingsProp(this.fieldlistObj, "rows");
|
|
848
|
+
let filters = this.getDataSourceSettingsProp(this.fieldlistObj, "filters");
|
|
849
|
+
let filterSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "filterSettings");
|
|
850
|
+
let values = this.getDataSourceSettingsProp(this.fieldlistObj, "values");
|
|
851
|
+
let sortSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "sortSettings");
|
|
852
|
+
let calculatedFieldSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "calculatedFieldSettings");
|
|
853
|
+
if (groupSettings.length === 0) {
|
|
854
|
+
for (let column of columns) {
|
|
855
|
+
this.config.columnGroup.push({
|
|
856
|
+
name: column.name,
|
|
857
|
+
caption: this.getCaptionByName(column.name) ||
|
|
858
|
+
column.caption,
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
else {
|
|
863
|
+
//If there is a group, first filter the columns of the group field, and then only save the last one
|
|
864
|
+
for (let column of columns) {
|
|
865
|
+
if (!startsWith(column.name, groupSettings[0].name + "_")) {
|
|
866
|
+
this.config.columnGroup.push({
|
|
867
|
+
name: column.name,
|
|
868
|
+
caption: column.name === groupSettings[0].name
|
|
869
|
+
? ""
|
|
870
|
+
: this.getCaptionByName(column.name) ||
|
|
871
|
+
column.caption,
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
for (let row of rows) {
|
|
877
|
+
this.config.xaxis.groups.push({
|
|
878
|
+
name: row.name,
|
|
879
|
+
caption: this.getCaptionByName(row.name) || row.caption,
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
for (let filter of filters) {
|
|
883
|
+
this.config.filters.push({
|
|
884
|
+
name: filter.name,
|
|
885
|
+
caption: this.getCaptionByName(filter.name) || filter.caption,
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
if (this.filterSettings && this.filterSettings.length > 0) {
|
|
889
|
+
args.dataSourceSettings.filterSettings = this.filterSettings;
|
|
890
|
+
this.config.filterSettings = this.filterSettings;
|
|
891
|
+
delete this.filterSettings;
|
|
892
|
+
}
|
|
893
|
+
else {
|
|
894
|
+
this.config.filterSettings = filterSettings;
|
|
895
|
+
}
|
|
896
|
+
for (let value of values) {
|
|
897
|
+
let seriesData;
|
|
898
|
+
let tempShowObj;
|
|
899
|
+
let filterTempshowArray = [];
|
|
900
|
+
if (tempshowArray.length) {
|
|
901
|
+
filterTempshowArray = tempshowArray.filter((item) => item.name === value.name &&
|
|
902
|
+
item.calMethod === value.type);
|
|
903
|
+
if (filterTempshowArray.length) {
|
|
904
|
+
tempShowObj = filterTempshowArray[0];
|
|
905
|
+
if (tempShowObj.hasOwnProperty("showSubTotals") &&
|
|
906
|
+
tempShowObj.hasOwnProperty("showGrandTotals")) {
|
|
907
|
+
seriesData = {
|
|
908
|
+
colName: value.name,
|
|
909
|
+
calMethod: value.type,
|
|
910
|
+
title: value.caption,
|
|
911
|
+
showSubTotals: tempShowObj.showSubTotals,
|
|
912
|
+
showGrandTotals: tempShowObj.showGrandTotals,
|
|
913
|
+
};
|
|
914
|
+
}
|
|
915
|
+
else {
|
|
916
|
+
if (tempShowObj.hasOwnProperty("showGrandTotals")) {
|
|
917
|
+
seriesData = {
|
|
918
|
+
colName: value.name,
|
|
919
|
+
calMethod: value.type,
|
|
920
|
+
title: value.caption,
|
|
921
|
+
showGrandTotals: tempShowObj.showGrandTotals,
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
if (tempShowObj.hasOwnProperty("showSubTotals")) {
|
|
925
|
+
seriesData = {
|
|
926
|
+
colName: value.name,
|
|
927
|
+
calMethod: value.type,
|
|
928
|
+
title: value.caption,
|
|
929
|
+
showSubTotals: tempShowObj.showSubTotals,
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
if (!seriesData) {
|
|
936
|
+
seriesData = {
|
|
937
|
+
colName: value.name,
|
|
938
|
+
title: value.caption,
|
|
939
|
+
calMethod: value.type,
|
|
940
|
+
};
|
|
941
|
+
}
|
|
942
|
+
this.config.yaxis.series.push(seriesData);
|
|
943
|
+
}
|
|
944
|
+
for (let calculate of calculatedFieldSettings) {
|
|
945
|
+
const calculateData = {
|
|
946
|
+
name: calculate.name,
|
|
947
|
+
formula: calculate.formula,
|
|
948
|
+
formatString: calculate.formatString === ""
|
|
949
|
+
? "N2"
|
|
950
|
+
: calculate.formatString,
|
|
951
|
+
};
|
|
952
|
+
this.config.calculatedFieldSettings.push(calculateData);
|
|
953
|
+
}
|
|
954
|
+
this.config.customCalculatedFields = this.customCalculatedFields;
|
|
955
|
+
this.config.sortSettings = sortSettings;
|
|
956
|
+
this.config.groupSettings = groupSettings;
|
|
957
|
+
this.fieldlistObj.updateView(this.pivotObj);
|
|
958
|
+
}
|
|
959
|
+
this.portlet.config = JSON.stringify(this.config);
|
|
960
|
+
//remove the sort
|
|
961
|
+
if (this.pivotObj.dataSourceSettings.sortSettings.length > 0) {
|
|
962
|
+
this.previousSort = this.fieldlistObj.lastSortInfo;
|
|
963
|
+
this.fieldlistObj.lastSortInfo = [];
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
afterEnginePopulate(args) {
|
|
967
|
+
if (!Browser.isDevice && this.fieldlistObj && this.pivotObj) {
|
|
968
|
+
this.config.groupSettings = this.getDataSourceSettingsProp(this.pivotObj, "groupSettings");
|
|
969
|
+
this.portlet.config = JSON.stringify(this.config);
|
|
970
|
+
if (this.fieldlistObj)
|
|
971
|
+
this.fieldlistObj.update(this.pivotObj);
|
|
972
|
+
this.pivotObj.grid.queryCellInfo = this.queryCell.bind(this);
|
|
973
|
+
this.pivotObj.grid.headerCellInfo = this.headerCell.bind(this);
|
|
974
|
+
// SMP2-3929 rollback
|
|
975
|
+
// if (!this.isApplyIRR)
|
|
976
|
+
// this.getCalculationResultByDashboardDataTableId();
|
|
977
|
+
}
|
|
978
|
+
if (this.Pivot_Data && this.Pivot_Data.length) {
|
|
979
|
+
setTimeout(() => {
|
|
980
|
+
this.enginePopulated(args);
|
|
981
|
+
}, 1500);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
getDataSourceSettingsProp(obj, key) {
|
|
985
|
+
let prop = null;
|
|
986
|
+
if (obj && obj.dataSourceSettings) {
|
|
987
|
+
prop = obj.dataSourceSettings[key];
|
|
988
|
+
if (Object.prototype.toString.call(prop) === "[object Array]" &&
|
|
989
|
+
prop.length > 0) {
|
|
990
|
+
prop = prop.map((item) => item.properties || item);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
return prop;
|
|
994
|
+
}
|
|
995
|
+
enginePopulating(args) {
|
|
996
|
+
this.grandTotals = {};
|
|
997
|
+
this.subTotals = {};
|
|
998
|
+
this.allDataValue = [];
|
|
999
|
+
// if (args.dataSourceSettings.sortSettings.length) {
|
|
1000
|
+
// for (
|
|
1001
|
+
// let i = 0;
|
|
1002
|
+
// i < args.dataSourceSettings.sortSettings.length;
|
|
1003
|
+
// i++
|
|
1004
|
+
// ) {
|
|
1005
|
+
// if (
|
|
1006
|
+
// this.fieldlistObj.lastSortInfo &&
|
|
1007
|
+
// this.fieldlistObj.lastSortInfo.name ===
|
|
1008
|
+
// args.dataSourceSettings.sortSettings[i].name &&
|
|
1009
|
+
// this.fieldlistObj.lastSortInfo.order === "Ascending" &&
|
|
1010
|
+
// !(
|
|
1011
|
+
// this.fieldlistObj.lastSortInfo.name ===
|
|
1012
|
+
// this.previousSort.name &&
|
|
1013
|
+
// this.previousSort.order === "None"
|
|
1014
|
+
// )
|
|
1015
|
+
// ) {
|
|
1016
|
+
// args.dataSourceSettings.sortSettings[i].order = "None";
|
|
1017
|
+
// } else if (
|
|
1018
|
+
// this.previousSort &&
|
|
1019
|
+
// this.fieldlistObj.lastSortInfo &&
|
|
1020
|
+
// this.fieldlistObj.lastSortInfo.name ===
|
|
1021
|
+
// this.previousSort.name &&
|
|
1022
|
+
// this.previousSort.order === "Ascending"
|
|
1023
|
+
// ) {
|
|
1024
|
+
// args.dataSourceSettings.sortSettings[i].order = "Ascending";
|
|
1025
|
+
// }
|
|
1026
|
+
// }
|
|
1027
|
+
// }
|
|
1028
|
+
}
|
|
1029
|
+
cellClick(args) {
|
|
1030
|
+
if (args.currentCell.classList.contains("e-headercell")) {
|
|
1031
|
+
this.flag = true;
|
|
1032
|
+
}
|
|
1033
|
+
// 清除排序
|
|
1034
|
+
if (this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder &&
|
|
1035
|
+
this.pivotObj.dataSourceSettings.valueSortSettings.headerText &&
|
|
1036
|
+
this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder ===
|
|
1037
|
+
"Descending" &&
|
|
1038
|
+
args.data.valueSort &&
|
|
1039
|
+
this.pivotObj.dataSourceSettings.valueSortSettings.headerText ===
|
|
1040
|
+
args.data.valueSort.levelName) {
|
|
1041
|
+
this.pivotObj.setProperties({
|
|
1042
|
+
dataSourceSettings: {
|
|
1043
|
+
valueSortSettings: {
|
|
1044
|
+
sortOrder: "Descending",
|
|
1045
|
+
headerText: "",
|
|
1046
|
+
},
|
|
1047
|
+
},
|
|
1048
|
+
}, true);
|
|
1049
|
+
if (this.pivotObj)
|
|
1050
|
+
this.pivotObj.refreshData();
|
|
1051
|
+
this.flag = false;
|
|
1052
|
+
this.config.valueSortSettings = {};
|
|
1053
|
+
this.portlet.config = JSON.stringify(this.config);
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
queryCell(args) {
|
|
1057
|
+
this.pivotObj.renderModule.rowCellBoundEvent(args);
|
|
1058
|
+
let rowIndex = Number(args.cell.getAttribute("index"));
|
|
1059
|
+
// 新版本26.x中 aria-colindex 会比旧版本v20.x 多1
|
|
1060
|
+
let colIndex = parseInt(args.cell.getAttribute("aria-colindex")) - 1;
|
|
1061
|
+
if (!this.pivotObj.dataSourceSettings.conditionalFormatSettings.length) {
|
|
1062
|
+
if (args.data && args.data[0].formattedText === "Grand Total") {
|
|
1063
|
+
args.cell.classList.add("grand-class");
|
|
1064
|
+
}
|
|
1065
|
+
else {
|
|
1066
|
+
args.cell.classList.add(rowIndex % 2 ? "odd-class" : "even-class");
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
else {
|
|
1070
|
+
let measureArr = this.pivotObj.dataSourceSettings.conditionalFormatSettings.map((obj) => {
|
|
1071
|
+
return obj.measure;
|
|
1072
|
+
});
|
|
1073
|
+
if (measureArr.includes(args.data[colIndex].actualText) &&
|
|
1074
|
+
args.data[colIndex].style) {
|
|
1075
|
+
args.cell.style.cssText += `background-color: ${args.data[colIndex].style.backgroundColor} !important`;
|
|
1076
|
+
}
|
|
1077
|
+
if (args.data && args.data[0].formattedText === "Grand Total")
|
|
1078
|
+
args.cell.classList.add("e-customclass");
|
|
1079
|
+
}
|
|
1080
|
+
if (args.data && args.data[0].formattedText === "Grand Total") {
|
|
1081
|
+
args.cell.classList.add("grand-class");
|
|
1082
|
+
}
|
|
1083
|
+
else {
|
|
1084
|
+
if (rowIndex % 2) {
|
|
1085
|
+
args.cell.classList.add("odd-class");
|
|
1086
|
+
}
|
|
1087
|
+
else {
|
|
1088
|
+
args.cell.classList.add("even-class");
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
//get sorting data
|
|
1092
|
+
if (this.flag) {
|
|
1093
|
+
this.flag = false;
|
|
1094
|
+
this.config.valueSortSettings =
|
|
1095
|
+
this.pivotObj.dataSourceSettings.valueSortSettings["properties"];
|
|
1096
|
+
this.portlet.config = JSON.stringify(this.config);
|
|
1097
|
+
}
|
|
1098
|
+
//customize the header text
|
|
1099
|
+
if (this.pivotObj.dataSourceSettings.rows.length === 0) {
|
|
1100
|
+
if (args.data &&
|
|
1101
|
+
args.data[colIndex] &&
|
|
1102
|
+
args.data[colIndex].axis === "row") {
|
|
1103
|
+
args.cell.querySelector(".e-cellvalue").innerText =
|
|
1104
|
+
args.data[colIndex].formattedText;
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
// SMP2-2912 subtotal字体加粗
|
|
1108
|
+
if (this.pivotObj.dataSourceSettings.rows.length &&
|
|
1109
|
+
args.data[colIndex] &&
|
|
1110
|
+
args.data[0].level !==
|
|
1111
|
+
this.pivotObj.dataSourceSettings.rows.length - 1 &&
|
|
1112
|
+
args.data[colIndex].rowHeaders !== "" &&
|
|
1113
|
+
args.data[colIndex].axis == "value") {
|
|
1114
|
+
args.cell.classList.add("e-customclass");
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
headerCell(args) {
|
|
1118
|
+
this.pivotObj.renderModule.columnCellBoundEvent(args);
|
|
1119
|
+
if (this.pivotObj.dataSourceSettings.columns.length === 0) {
|
|
1120
|
+
let node = args.node.querySelector(".e-headercelldiv .e-headertext");
|
|
1121
|
+
if (node)
|
|
1122
|
+
node.innerText = args.cell.column.headerText;
|
|
1123
|
+
}
|
|
1124
|
+
const textAlign = args.cell.column.textAlign;
|
|
1125
|
+
args.cell.column.headerTextAlign = textAlign;
|
|
1126
|
+
args.node.style.textAlign = textAlign === "Right" ? "right" : "left"; // Align right for numeric columns
|
|
1127
|
+
if (textAlign === "Right") {
|
|
1128
|
+
args.node.classList.add("header-align-right");
|
|
1129
|
+
}
|
|
1130
|
+
this.ref.markForCheck();
|
|
1131
|
+
}
|
|
1132
|
+
dataBound(e) {
|
|
1133
|
+
if (this.isInit) {
|
|
1134
|
+
this.isInit = false;
|
|
1135
|
+
}
|
|
1136
|
+
this.grandTotals = {};
|
|
1137
|
+
this.subTotals = {};
|
|
1138
|
+
if (this.pivotObj.grid) {
|
|
1139
|
+
this.pivotObj.grid.resizeStop = this.resizeStop.bind(this);
|
|
1140
|
+
}
|
|
1141
|
+
if (this.pivotObj) {
|
|
1142
|
+
var index = [];
|
|
1143
|
+
// Get the empty row headers here.
|
|
1144
|
+
var emptyRowHeader = document.querySelectorAll('td[aria-label=" column header "]');
|
|
1145
|
+
for (var ele of emptyRowHeader) {
|
|
1146
|
+
if (ele) {
|
|
1147
|
+
index.push(ele.getAttribute("index"));
|
|
1148
|
+
// Remove all the empty row headers here.
|
|
1149
|
+
ele.closest("tr").remove();
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
for (var i = 0; i < index.length; i++) {
|
|
1153
|
+
// Get the empty values here.
|
|
1154
|
+
var emptyValues = this.pivotObj.element.querySelectorAll(`td[index="${index[i]}"]`);
|
|
1155
|
+
if (emptyValues[0]) {
|
|
1156
|
+
// Remove all the empty value rows here.
|
|
1157
|
+
emptyValues[0].closest("tr").remove();
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
if (this.fieldlistObj &&
|
|
1162
|
+
this.fieldlistObj.pivotButtonModule &&
|
|
1163
|
+
this.fieldlistObj.pivotButtonModule.menuOption) {
|
|
1164
|
+
this.fieldlistObj.pivotButtonModule.menuOption.stringAggregateTypes = [
|
|
1165
|
+
"Count",
|
|
1166
|
+
"DistinctCount",
|
|
1167
|
+
"First",
|
|
1168
|
+
"Last",
|
|
1169
|
+
];
|
|
1170
|
+
}
|
|
1171
|
+
if (this.pivotObj.pivotButtonModule &&
|
|
1172
|
+
this.pivotObj.pivotButtonModule.menuOption) {
|
|
1173
|
+
this.pivotObj.pivotButtonModule.menuOption.stringAggregateTypes = [
|
|
1174
|
+
"Count",
|
|
1175
|
+
"DistinctCount",
|
|
1176
|
+
"First",
|
|
1177
|
+
"Last",
|
|
1178
|
+
];
|
|
1179
|
+
}
|
|
1180
|
+
let allSummaryType = ALL_AGGREGATE_TYPES;
|
|
1181
|
+
this.pivotObj.getAllSummaryType = function () {
|
|
1182
|
+
return allSummaryType;
|
|
1183
|
+
};
|
|
1184
|
+
if (this.fieldlistObj) {
|
|
1185
|
+
this.fieldlistObj.aggregateTypes = allSummaryType;
|
|
1186
|
+
this.fieldlistObj.getAllSummaryType = function () {
|
|
1187
|
+
return allSummaryType;
|
|
1188
|
+
};
|
|
1189
|
+
}
|
|
1190
|
+
this.setValueItemData();
|
|
1191
|
+
}
|
|
1192
|
+
setValueItemData() {
|
|
1193
|
+
setTimeout(() => {
|
|
1194
|
+
const fieldDom = this.fieldlistObj.fieldListSpinnerElement;
|
|
1195
|
+
this.dataSourceSettings.values.forEach((value) => {
|
|
1196
|
+
if (value.type !== "First" && value.type !== "Last") {
|
|
1197
|
+
return;
|
|
1198
|
+
}
|
|
1199
|
+
const valuesDom = fieldDom.querySelector(`.e-values .${value.name} .e-pvt-btn-content`);
|
|
1200
|
+
if (valuesDom.innerHTML !== `${value.type} of ${value.caption}`) {
|
|
1201
|
+
valuesDom.innerHTML = `${value.type} of ${value.caption}`;
|
|
1202
|
+
}
|
|
1203
|
+
});
|
|
1204
|
+
});
|
|
1205
|
+
}
|
|
1206
|
+
calculatedCellSets(args, curFields) {
|
|
1207
|
+
let matchFields = curFields["matchFields"];
|
|
1208
|
+
let formula = curFields["formula"];
|
|
1209
|
+
let value = 0;
|
|
1210
|
+
let rows = this.pivotObj.dataSourceSettings.rows;
|
|
1211
|
+
let invalidTypes = ["string", "nvarchar", "date", "datetime"];
|
|
1212
|
+
let isInvalid = matchFields.some((f) => invalidTypes.includes(this.configFields.filter((el) => el.colName === f.matchWord)[0]["dataType"]));
|
|
1213
|
+
let currentrowCellType = args.rowCellType;
|
|
1214
|
+
if (isInvalid)
|
|
1215
|
+
return "-";
|
|
1216
|
+
if (args.rowCellType === "subTotal" ||
|
|
1217
|
+
args.rowCellType === "grandTotal") {
|
|
1218
|
+
let childHeaders = [];
|
|
1219
|
+
let sum = 0;
|
|
1220
|
+
let cloneCellSets = cloneDeep(args.cellSets);
|
|
1221
|
+
let groupNameArrays = [];
|
|
1222
|
+
for (let index = args.row.level; index < rows.length; index++) {
|
|
1223
|
+
groupNameArrays.push(rows[index].name);
|
|
1224
|
+
}
|
|
1225
|
+
for (let i = 0; i < cloneCellSets.length; i++) {
|
|
1226
|
+
let values = [];
|
|
1227
|
+
let header = groupNameArrays
|
|
1228
|
+
.map((name) => {
|
|
1229
|
+
values.push(cloneCellSets[i][name]);
|
|
1230
|
+
return cloneCellSets[i][name];
|
|
1231
|
+
})
|
|
1232
|
+
.join("-");
|
|
1233
|
+
if (!childHeaders.includes(header)) {
|
|
1234
|
+
childHeaders.push(header);
|
|
1235
|
+
let filterObj = {};
|
|
1236
|
+
groupNameArrays.map((name, i) => (filterObj[name] = values[i]));
|
|
1237
|
+
args.cellSets = _filter(cloneCellSets, filterObj);
|
|
1238
|
+
args.rowCellType = "value";
|
|
1239
|
+
sum += this.calculatedValues(args, matchFields, formula);
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
args.rowCellType = currentrowCellType;
|
|
1243
|
+
// 暂存当前SubTotal, 用于收缩时读取
|
|
1244
|
+
let prefixHeader = this.getCalcHeader(args, formula);
|
|
1245
|
+
this.updateTempSubtotals(prefixHeader, sum);
|
|
1246
|
+
return sum;
|
|
1247
|
+
}
|
|
1248
|
+
else if (args.rowCellType === "value") {
|
|
1249
|
+
if (args.row.hasChild) {
|
|
1250
|
+
// collapse 读取SubTotal
|
|
1251
|
+
let header = this.getCalcHeader(args, formula);
|
|
1252
|
+
let index = this.tempSubtotals.findIndex((item) => item.rowName === header);
|
|
1253
|
+
if (index > -1) {
|
|
1254
|
+
value = this.tempSubtotals[index].rowValue;
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
else {
|
|
1258
|
+
// expand
|
|
1259
|
+
value = this.calculatedValues(args, matchFields, formula);
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
return value;
|
|
1263
|
+
}
|
|
1264
|
+
actionFailure(args) {
|
|
1265
|
+
if (args.actionName == "Drill down" || args.actionName == "Drill up") {
|
|
1266
|
+
// Triggers when the current UI action fails to achieve the desired result.
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
getCalcHeader(args, formula) {
|
|
1270
|
+
let header = "";
|
|
1271
|
+
let rows = this.pivotObj.dataSourceSettings.rows;
|
|
1272
|
+
let groupNameArrays = [];
|
|
1273
|
+
for (let index = 0; index < args.row.level; index++) {
|
|
1274
|
+
groupNameArrays.push(rows[index].name);
|
|
1275
|
+
}
|
|
1276
|
+
header = groupNameArrays.length
|
|
1277
|
+
? groupNameArrays
|
|
1278
|
+
.map((name) => {
|
|
1279
|
+
return args.cellSets[0][name];
|
|
1280
|
+
})
|
|
1281
|
+
.join("-") +
|
|
1282
|
+
"-" +
|
|
1283
|
+
args.row.actualText
|
|
1284
|
+
: args.row.actualText;
|
|
1285
|
+
if (formula)
|
|
1286
|
+
header += "___" + formula;
|
|
1287
|
+
return header;
|
|
1288
|
+
}
|
|
1289
|
+
updateTempSubtotals(rowName, rowValue) {
|
|
1290
|
+
let index = this.tempSubtotals.findIndex((item) => item.rowName === rowName);
|
|
1291
|
+
let temp = {};
|
|
1292
|
+
temp.rowName = rowName;
|
|
1293
|
+
temp.rowValue = rowValue;
|
|
1294
|
+
if (index > -1) {
|
|
1295
|
+
this.tempSubtotals.splice(index, 1, temp);
|
|
1296
|
+
}
|
|
1297
|
+
else {
|
|
1298
|
+
this.tempSubtotals.push(temp);
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
calculatedValues(args, matchFields, formula) {
|
|
1302
|
+
if (matchFields.length) {
|
|
1303
|
+
let calculedMatchFields = matchFields.map((f) => {
|
|
1304
|
+
switch (f.matchMethod) {
|
|
1305
|
+
case "First":
|
|
1306
|
+
case "Last":
|
|
1307
|
+
f.replaceValue = this.calculatedFistLast(args, f.matchMethod, f.matchWord);
|
|
1308
|
+
break;
|
|
1309
|
+
case "Max":
|
|
1310
|
+
f.replaceValue = maxBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
|
|
1311
|
+
break;
|
|
1312
|
+
case "Min":
|
|
1313
|
+
f.replaceValue = minBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
|
|
1314
|
+
break;
|
|
1315
|
+
case "Sum":
|
|
1316
|
+
f.replaceValue = sumBy(args.cellSets, (o) => Number(o[f.matchWord]));
|
|
1317
|
+
// SMP2-4094 Unicorn - L3 Adjusted NAV value issues
|
|
1318
|
+
f.replaceValue =
|
|
1319
|
+
f.replaceValue && f.replaceValue.toFixed(10);
|
|
1320
|
+
break;
|
|
1321
|
+
case "Avg":
|
|
1322
|
+
f.replaceValue = meanBy(args.cellSets, (o) => Number(o[f.matchWord]));
|
|
1323
|
+
break;
|
|
1324
|
+
default:
|
|
1325
|
+
break;
|
|
1326
|
+
}
|
|
1327
|
+
return f;
|
|
1328
|
+
});
|
|
1329
|
+
let resultFormula = formula;
|
|
1330
|
+
if (calculedMatchFields.length) {
|
|
1331
|
+
for (let i = 0; i < calculedMatchFields.length; i++) {
|
|
1332
|
+
resultFormula = resultFormula.replace(calculedMatchFields[i].matchStr, "(" + calculedMatchFields[i].replaceValue + ")");
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
try {
|
|
1336
|
+
let result = new Function("return " + resultFormula.replace(/[^-<>?:()\d/*+.]/g, ""))();
|
|
1337
|
+
if (isNaN(result) || !isFinite(result)) {
|
|
1338
|
+
return 0;
|
|
1339
|
+
}
|
|
1340
|
+
else {
|
|
1341
|
+
return result;
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
catch (error) {
|
|
1345
|
+
return NaN;
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
return 0;
|
|
1349
|
+
}
|
|
1350
|
+
totalFormatted = {};
|
|
1351
|
+
aggregateCellInfo(args) {
|
|
1352
|
+
let asOfDate = this.pbf.time(this.dashboard.asOfDate);
|
|
1353
|
+
// if calculated field
|
|
1354
|
+
if (args.aggregateType == "CalculatedField") {
|
|
1355
|
+
for (let i = 0; i < this.customCalculatedFields.length; i++) {
|
|
1356
|
+
if (args.fieldName == this.customCalculatedFields[i].name) {
|
|
1357
|
+
args.value = this.calculatedCellSets(args, this.customCalculatedFields[i]);
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
if ([
|
|
1362
|
+
"CalculateIRR",
|
|
1363
|
+
"CalculateIRRBeforeCarried",
|
|
1364
|
+
"CalculateIRRIRRDate",
|
|
1365
|
+
"CalculateIRRMTD",
|
|
1366
|
+
"CalculateIRRQTD",
|
|
1367
|
+
"CalculateIRRYTD",
|
|
1368
|
+
].includes(args.aggregateType)) {
|
|
1369
|
+
// console.log("==========================");
|
|
1370
|
+
// console.log("args:", args);
|
|
1371
|
+
let valueField;
|
|
1372
|
+
let dateField;
|
|
1373
|
+
let startDate;
|
|
1374
|
+
let endDate;
|
|
1375
|
+
switch (args.aggregateType) {
|
|
1376
|
+
case "CalculateIRR":
|
|
1377
|
+
valueField = "IRRAdjValue";
|
|
1378
|
+
dateField = "IRRDate";
|
|
1379
|
+
break;
|
|
1380
|
+
case "CalculateIRRMTD":
|
|
1381
|
+
startDate = moment(asOfDate)
|
|
1382
|
+
.startOf("month")
|
|
1383
|
+
.format("YYYY-MM-DD");
|
|
1384
|
+
endDate = moment(asOfDate).format("YYYY-MM-DD");
|
|
1385
|
+
valueField = "IRRAdjValue";
|
|
1386
|
+
dateField = "IRRDate";
|
|
1387
|
+
break;
|
|
1388
|
+
case "CalculateIRRQTD":
|
|
1389
|
+
startDate = moment(asOfDate)
|
|
1390
|
+
.startOf("quarter")
|
|
1391
|
+
.format("YYYY-MM-DD");
|
|
1392
|
+
endDate = moment(asOfDate).format("YYYY-MM-DD");
|
|
1393
|
+
valueField = "IRRAdjValue";
|
|
1394
|
+
dateField = "IRRDate";
|
|
1395
|
+
break;
|
|
1396
|
+
case "CalculateIRRYTD":
|
|
1397
|
+
startDate = moment(asOfDate)
|
|
1398
|
+
.startOf("year")
|
|
1399
|
+
.format("YYYY-MM-DD");
|
|
1400
|
+
endDate = moment(asOfDate).format("YYYY-MM-DD");
|
|
1401
|
+
valueField = "IRRAdjValue";
|
|
1402
|
+
dateField = "IRRDate";
|
|
1403
|
+
break;
|
|
1404
|
+
case "CalculateIRRIRRDate":
|
|
1405
|
+
valueField = "IRRAdjValue";
|
|
1406
|
+
dateField = "CalculateIRRDate";
|
|
1407
|
+
break;
|
|
1408
|
+
case "CalculateIRRBeforeCarried":
|
|
1409
|
+
valueField = "IRRAdjValueBeforeCarry";
|
|
1410
|
+
dateField = "IRRDate";
|
|
1411
|
+
break;
|
|
1412
|
+
default:
|
|
1413
|
+
break;
|
|
1414
|
+
}
|
|
1415
|
+
let NAVAdj = 0;
|
|
1416
|
+
let values = [];
|
|
1417
|
+
let beforeStartNAVAdj = 0; // 存储上一个阶段的NAVAdj总和
|
|
1418
|
+
let beforeStartValues = []; // 存储上一个阶段的累计集合 (只是为了打印,没有实际用途)
|
|
1419
|
+
let field = this.configFields.filter((el) => el.colName ===
|
|
1420
|
+
this.dashboardPorletsService.getAggregateType(args.aggregateType));
|
|
1421
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
1422
|
+
const data = {
|
|
1423
|
+
amount: args.cellSets[i]["IRRAmount"],
|
|
1424
|
+
date: this.pbf.time(args.cellSets[i][dateField]) ===
|
|
1425
|
+
"Invalid date"
|
|
1426
|
+
? asOfDate
|
|
1427
|
+
: this.pbf.time(args.cellSets[i][dateField]),
|
|
1428
|
+
};
|
|
1429
|
+
// SMP2-16920
|
|
1430
|
+
// If IRR Date > Dashboard report date = Takes as of dashboard report date
|
|
1431
|
+
if (args.aggregateType === "CalculateIRRIRRDate" &&
|
|
1432
|
+
asOfDate < this.pbf.time(args.cellSets[i][dateField])) {
|
|
1433
|
+
data.date = asOfDate;
|
|
1434
|
+
}
|
|
1435
|
+
NAVAdj += args.cellSets[i][valueField];
|
|
1436
|
+
// SMP2-17219 MTD QTD YTD IRR
|
|
1437
|
+
if (startDate && endDate) {
|
|
1438
|
+
if (moment(data.date).isBefore(startDate)) {
|
|
1439
|
+
data[valueField] = args.cellSets[i][valueField];
|
|
1440
|
+
beforeStartValues.push(data);
|
|
1441
|
+
beforeStartNAVAdj += data[valueField];
|
|
1442
|
+
}
|
|
1443
|
+
if (!moment(data.date).isBetween(startDate, endDate, null, "[]")) {
|
|
1444
|
+
continue;
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
if (data.amount != 0) {
|
|
1448
|
+
values.push(data);
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
|
|
1452
|
+
values.push({
|
|
1453
|
+
amount: NAVAdj,
|
|
1454
|
+
date: asOfDate,
|
|
1455
|
+
});
|
|
1456
|
+
}
|
|
1457
|
+
values = sortBy(values, "date");
|
|
1458
|
+
// 如果是MTD,QTD,YTD 则需要把当前阶段以前的所有数据进行汇总,加入计算
|
|
1459
|
+
if (startDate && endDate) {
|
|
1460
|
+
values.unshift({
|
|
1461
|
+
amount: -beforeStartNAVAdj,
|
|
1462
|
+
date: this.pbf.time(startDate),
|
|
1463
|
+
});
|
|
1464
|
+
}
|
|
1465
|
+
// console.log("beforeStartValues:", beforeStartValues);
|
|
1466
|
+
// console.log("values:", values);
|
|
1467
|
+
if (values.length > 0) {
|
|
1468
|
+
let guess = 0.1;
|
|
1469
|
+
const sumAmount = values
|
|
1470
|
+
.map((item) => item.amount)
|
|
1471
|
+
.reduce((prev, curr) => prev + curr, 0);
|
|
1472
|
+
if (sumAmount < 0) {
|
|
1473
|
+
guess = -0.1;
|
|
1474
|
+
}
|
|
1475
|
+
//SMP2-2249 fixed the big irr issue
|
|
1476
|
+
if (sumAmount === 0) {
|
|
1477
|
+
args.value = 0;
|
|
1478
|
+
}
|
|
1479
|
+
else {
|
|
1480
|
+
const valueItems = values.slice(0, values.length - 1);
|
|
1481
|
+
const valueList = valueItems.map((item) => item.amount);
|
|
1482
|
+
const dateList = valueItems.map((item) => item.date);
|
|
1483
|
+
const lastItem = values[values.length - 1];
|
|
1484
|
+
const navAdjust = lastItem.amount;
|
|
1485
|
+
const latestDate = lastItem.date;
|
|
1486
|
+
let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
|
|
1487
|
+
args.value = irr === null ? "" : irr;
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
else {
|
|
1491
|
+
args.value = "";
|
|
1492
|
+
}
|
|
1493
|
+
// console.log("args.value:", args.value);
|
|
1494
|
+
if (this.pivotObj.engineModule &&
|
|
1495
|
+
this.pivotObj.engineModule.formatFields[args.fieldName]) {
|
|
1496
|
+
delete this.pivotObj.engineModule.formatFields[args.fieldName];
|
|
1497
|
+
this.pivotObj.engineModule.formatFields[args.fieldName] = {
|
|
1498
|
+
name: args.fieldName,
|
|
1499
|
+
format: field.length > 0
|
|
1500
|
+
? field[0].format &&
|
|
1501
|
+
field[0].format.length &&
|
|
1502
|
+
field[0].format[0].formatChecked
|
|
1503
|
+
? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
|
|
1504
|
+
: this.dashboardPorletsService.formatPercent(field[0].dp)
|
|
1505
|
+
: "P2",
|
|
1506
|
+
};
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
// SMP2-16520 TWR 月/季/年 && SMP2-16683 VAR
|
|
1510
|
+
if ([
|
|
1511
|
+
"CalculateTWRMTD",
|
|
1512
|
+
"CalculateTWRQTD",
|
|
1513
|
+
"CalculateTWRYTD",
|
|
1514
|
+
"CalculateVARMTD_99",
|
|
1515
|
+
"CalculateVARQTD_99",
|
|
1516
|
+
"CalculateVARYTD_99",
|
|
1517
|
+
"CalculateVARMTD_95",
|
|
1518
|
+
"CalculateVARQTD_95",
|
|
1519
|
+
"CalculateVARYTD_95",
|
|
1520
|
+
].includes(args.aggregateType)) {
|
|
1521
|
+
// console.log("==========================");
|
|
1522
|
+
// console.log("args:", args);
|
|
1523
|
+
let valueField = "IRRAdjValue";
|
|
1524
|
+
let dateField = "IRRDate";
|
|
1525
|
+
let timeRange;
|
|
1526
|
+
switch (args.aggregateType) {
|
|
1527
|
+
case "CalculateTWRMTD":
|
|
1528
|
+
case "CalculateVARMTD_99":
|
|
1529
|
+
case "CalculateVARMTD_95":
|
|
1530
|
+
timeRange = "month";
|
|
1531
|
+
break;
|
|
1532
|
+
case "CalculateTWRQTD":
|
|
1533
|
+
case "CalculateVARQTD_99":
|
|
1534
|
+
case "CalculateVARQTD_95":
|
|
1535
|
+
timeRange = "quarter";
|
|
1536
|
+
break;
|
|
1537
|
+
case "CalculateTWRYTD":
|
|
1538
|
+
case "CalculateVARYTD_99":
|
|
1539
|
+
case "CalculateVARYTD_95":
|
|
1540
|
+
timeRange = "year";
|
|
1541
|
+
break;
|
|
1542
|
+
default:
|
|
1543
|
+
break;
|
|
1544
|
+
}
|
|
1545
|
+
let values = []; // 这个阶段的累计集合
|
|
1546
|
+
let field = this.configFields.filter((el) => el.colName ===
|
|
1547
|
+
this.dashboardPorletsService.getAggregateType(args.aggregateType));
|
|
1548
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
1549
|
+
const data = {
|
|
1550
|
+
[valueField]: args.cellSets[i][valueField],
|
|
1551
|
+
date: this.pbf.time(args.cellSets[i][dateField]) ===
|
|
1552
|
+
"Invalid date"
|
|
1553
|
+
? asOfDate
|
|
1554
|
+
: this.pbf.time(args.cellSets[i][dateField]),
|
|
1555
|
+
};
|
|
1556
|
+
values.push(data);
|
|
1557
|
+
}
|
|
1558
|
+
// 如果asOfDate不是 本月/季度/年 的最后一天,都是截至 上个月/季度/年 的最后一天的数据去计算
|
|
1559
|
+
let _asOfDate = moment(asOfDate);
|
|
1560
|
+
// console.log("_asOfDate:", _asOfDate);
|
|
1561
|
+
let isEndOfPeriod = (unit) => {
|
|
1562
|
+
return (_asOfDate.format("YYYY-MM-DD") ===
|
|
1563
|
+
_asOfDate.endOf(unit).format("YYYY-MM-DD"));
|
|
1564
|
+
};
|
|
1565
|
+
let endDate = isEndOfPeriod(timeRange)
|
|
1566
|
+
? moment(asOfDate).format("YYYY-MM-DD")
|
|
1567
|
+
: moment(asOfDate)
|
|
1568
|
+
.subtract(1, timeRange)
|
|
1569
|
+
.endOf(timeRange)
|
|
1570
|
+
.format("YYYY-MM-DD");
|
|
1571
|
+
// console.log("endDate:", endDate);
|
|
1572
|
+
values = values.filter((item) => moment(item.date).isSameOrBefore(endDate));
|
|
1573
|
+
values = sortBy(values, "date");
|
|
1574
|
+
// console.log("values:", values);
|
|
1575
|
+
if (values.length > 0) {
|
|
1576
|
+
let result = this.getTimeRanges(values, endDate, timeRange, "date"); // 各个阶段的数据
|
|
1577
|
+
let resultTotal = {}; // 各个阶段总和
|
|
1578
|
+
for (const prop in result) {
|
|
1579
|
+
resultTotal[prop] = result[prop].reduce((acc, cur) => {
|
|
1580
|
+
return acc + (cur[valueField] || 0);
|
|
1581
|
+
}, 0);
|
|
1582
|
+
}
|
|
1583
|
+
// console.log("result:", result);
|
|
1584
|
+
// console.log("resultTotal:", resultTotal);
|
|
1585
|
+
const cumulativeSum = {}; // 各个阶段累计和
|
|
1586
|
+
let sum = 0;
|
|
1587
|
+
for (const key of Object.keys(resultTotal)) {
|
|
1588
|
+
sum += resultTotal[key];
|
|
1589
|
+
cumulativeSum[`${key}`] = sum;
|
|
1590
|
+
}
|
|
1591
|
+
// console.log("cumulativeSum:", cumulativeSum);
|
|
1592
|
+
const keys = Object.keys(cumulativeSum);
|
|
1593
|
+
let twrList = [];
|
|
1594
|
+
// 遍历每两个阶段 计算TWR
|
|
1595
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
1596
|
+
const key1 = keys[i];
|
|
1597
|
+
const key2 = keys[i + 1];
|
|
1598
|
+
// 计算两个阶段之间的递增量, 出数不能为0
|
|
1599
|
+
if (cumulativeSum[key1] != 0) {
|
|
1600
|
+
const increment = cumulativeSum[key2] - cumulativeSum[key1];
|
|
1601
|
+
let twr = increment / cumulativeSum[key1];
|
|
1602
|
+
twrList.push({
|
|
1603
|
+
date: key2,
|
|
1604
|
+
twr: twr,
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
// 计算Average TWR
|
|
1609
|
+
// console.log("twrList:", twrList);
|
|
1610
|
+
let averageTWR = this.calculateGrowthRate(twrList.map((x) => x.twr));
|
|
1611
|
+
// console.log("计算Average TWR:", averageTWR);
|
|
1612
|
+
if ([
|
|
1613
|
+
"CalculateTWRMTD",
|
|
1614
|
+
"CalculateTWRQTD",
|
|
1615
|
+
"CalculateTWRYTD",
|
|
1616
|
+
].includes(args.aggregateType)) {
|
|
1617
|
+
// SMP2-16520 TWR 月/季/年
|
|
1618
|
+
args.value =
|
|
1619
|
+
isNaN(averageTWR) || averageTWR == null
|
|
1620
|
+
? ""
|
|
1621
|
+
: Number(averageTWR);
|
|
1622
|
+
}
|
|
1623
|
+
else {
|
|
1624
|
+
if (isNaN(averageTWR) || averageTWR == null) {
|
|
1625
|
+
args.value = "";
|
|
1626
|
+
}
|
|
1627
|
+
else {
|
|
1628
|
+
// SMP2-16683 VAR 区分99%和95%
|
|
1629
|
+
let ZScore = [
|
|
1630
|
+
"CalculateVARMTD_99",
|
|
1631
|
+
"CalculateVARQTD_99",
|
|
1632
|
+
"CalculateVARYTD_99",
|
|
1633
|
+
].includes(args.aggregateType)
|
|
1634
|
+
? 2.33
|
|
1635
|
+
: 1.65;
|
|
1636
|
+
if (twrList.length < 2) {
|
|
1637
|
+
args.value = "";
|
|
1638
|
+
}
|
|
1639
|
+
else {
|
|
1640
|
+
let SD = this.calculateStandardDeviation(twrList.map((x) => x.twr));
|
|
1641
|
+
// console.log("calculateStandardDeviation:", SD);
|
|
1642
|
+
let VAR = averageTWR - SD * ZScore;
|
|
1643
|
+
args.value = Number(VAR);
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
// console.log("args.value:", args.value);
|
|
1648
|
+
}
|
|
1649
|
+
if (this.pivotObj.engineModule &&
|
|
1650
|
+
this.pivotObj.engineModule.formatFields[args.fieldName]) {
|
|
1651
|
+
delete this.pivotObj.engineModule.formatFields[args.fieldName];
|
|
1652
|
+
this.pivotObj.engineModule.formatFields[args.fieldName] = {
|
|
1653
|
+
name: args.fieldName,
|
|
1654
|
+
format: field.length > 0
|
|
1655
|
+
? field[0].format &&
|
|
1656
|
+
field[0].format.length &&
|
|
1657
|
+
field[0].format[0].formatChecked
|
|
1658
|
+
? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
|
|
1659
|
+
: this.dashboardPorletsService.formatPercent(field[0].dp)
|
|
1660
|
+
: "P2",
|
|
1661
|
+
};
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
//SMP2-2701
|
|
1665
|
+
if (args.aggregateType === "CalculateIRRActualAudited") {
|
|
1666
|
+
let NAVAdj = 0;
|
|
1667
|
+
let values = [];
|
|
1668
|
+
let field = this.configFields.filter((el) => el.colName ===
|
|
1669
|
+
this.dashboardPorletsService.getAggregateType(args.aggregateType));
|
|
1670
|
+
//SMP2-2713 only judge for this dataMart(GrossNet)
|
|
1671
|
+
if (this.portlet.figureCode === "GrossNet" ||
|
|
1672
|
+
this.portlet.figureCode ===
|
|
1673
|
+
"CombinedInvestmentFundNCompanyCashflow") {
|
|
1674
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
1675
|
+
const data = {
|
|
1676
|
+
amount: args.cellSets[i]["IRRAmount"],
|
|
1677
|
+
date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
|
|
1678
|
+
"Invalid date"
|
|
1679
|
+
? asOfDate
|
|
1680
|
+
: this.pbf.time(args.cellSets[i]["IRRDate"]),
|
|
1681
|
+
};
|
|
1682
|
+
NAVAdj += args.cellSets[i]["ActualAuditedNAV"];
|
|
1683
|
+
if (data.amount != 0) {
|
|
1684
|
+
values.push(data);
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
//filter the data by the DataType(Actual Reported Audited)
|
|
1689
|
+
else {
|
|
1690
|
+
let argsdata = args.cellSets.filter((el) => el.DataType === "ACTUAL_AUDITED" ||
|
|
1691
|
+
el.DataType === "REPORTED");
|
|
1692
|
+
for (let i = 0; i < argsdata.length; i++) {
|
|
1693
|
+
const data = {
|
|
1694
|
+
amount: argsdata[i]["IRRAmount"],
|
|
1695
|
+
date: this.pbf.time(argsdata[i]["IRRDate"]) ===
|
|
1696
|
+
"Invalid date"
|
|
1697
|
+
? asOfDate
|
|
1698
|
+
: this.pbf.time(argsdata[i]["IRRDate"]),
|
|
1699
|
+
};
|
|
1700
|
+
NAVAdj += argsdata[i]["IRRAdjValue"];
|
|
1701
|
+
if (data.amount != 0) {
|
|
1702
|
+
values.push(data);
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
|
|
1707
|
+
values.push({
|
|
1708
|
+
amount: NAVAdj,
|
|
1709
|
+
date: asOfDate,
|
|
1710
|
+
});
|
|
1711
|
+
}
|
|
1712
|
+
values = sortBy(values, "date");
|
|
1713
|
+
if (values.length > 0) {
|
|
1714
|
+
let guess = 0.1;
|
|
1715
|
+
const sumAmount = values
|
|
1716
|
+
.map((item) => item.amount)
|
|
1717
|
+
.reduce((prev, curr) => prev + curr, 0);
|
|
1718
|
+
if (sumAmount < 0) {
|
|
1719
|
+
guess = -0.1;
|
|
1720
|
+
}
|
|
1721
|
+
//SMP2-2249 fixed the big irr issue
|
|
1722
|
+
if (sumAmount === 0) {
|
|
1723
|
+
args.value = 0;
|
|
1724
|
+
}
|
|
1725
|
+
else {
|
|
1726
|
+
const valueItems = values.slice(0, values.length - 1);
|
|
1727
|
+
const valueList = valueItems.map((item) => item.amount);
|
|
1728
|
+
const dateList = valueItems.map((item) => item.date);
|
|
1729
|
+
const lastItem = values[values.length - 1];
|
|
1730
|
+
const navAdjust = lastItem.amount;
|
|
1731
|
+
const latestDate = lastItem.date;
|
|
1732
|
+
let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
|
|
1733
|
+
args.value = irr === null ? 0 : irr;
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
else {
|
|
1737
|
+
args.value = 0;
|
|
1738
|
+
}
|
|
1739
|
+
if (this.pivotObj.engineModule &&
|
|
1740
|
+
this.pivotObj.engineModule.formatFields[args.fieldName]) {
|
|
1741
|
+
delete this.pivotObj.engineModule.formatFields[args.fieldName];
|
|
1742
|
+
this.pivotObj.engineModule.formatFields[args.fieldName] = {
|
|
1743
|
+
name: args.fieldName,
|
|
1744
|
+
format: field.length > 0
|
|
1745
|
+
? field[0].format &&
|
|
1746
|
+
field[0].format.length &&
|
|
1747
|
+
field[0].format[0].formatChecked
|
|
1748
|
+
? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
|
|
1749
|
+
: this.dashboardPorletsService.formatPercent(field[0].dp)
|
|
1750
|
+
: "P2",
|
|
1751
|
+
};
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1754
|
+
//SMP2-3411
|
|
1755
|
+
if (args.aggregateType === "CalculateIRRReported") {
|
|
1756
|
+
let NAVAdj = 0;
|
|
1757
|
+
let values = [];
|
|
1758
|
+
let field = this.configFields.filter((el) => el.colName ===
|
|
1759
|
+
this.dashboardPorletsService.getAggregateType(args.aggregateType));
|
|
1760
|
+
if (this.portlet.figureCode === "GrossNet" ||
|
|
1761
|
+
this.portlet.figureCode ===
|
|
1762
|
+
"CombinedInvestmentFundNCompanyCashflow") {
|
|
1763
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
1764
|
+
const data = {
|
|
1765
|
+
amount: args.cellSets[i]["IRRAmount"],
|
|
1766
|
+
date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
|
|
1767
|
+
"Invalid date"
|
|
1768
|
+
? asOfDate
|
|
1769
|
+
: this.pbf.time(args.cellSets[i]["IRRDate"]),
|
|
1770
|
+
};
|
|
1771
|
+
NAVAdj += args.cellSets[i]["ReportedNAV"];
|
|
1772
|
+
if (data.amount != 0) {
|
|
1773
|
+
values.push(data);
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
else {
|
|
1778
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
1779
|
+
const data = {
|
|
1780
|
+
amount: args.cellSets[i]["IRRAmount"],
|
|
1781
|
+
date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
|
|
1782
|
+
"Invalid date"
|
|
1783
|
+
? asOfDate
|
|
1784
|
+
: this.pbf.time(args.cellSets[i]["IRRDate"]),
|
|
1785
|
+
};
|
|
1786
|
+
NAVAdj += args.cellSets[i]["IRRAdjValue"];
|
|
1787
|
+
if (data.amount != 0) {
|
|
1788
|
+
values.push(data);
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
|
|
1793
|
+
values.push({
|
|
1794
|
+
amount: NAVAdj,
|
|
1795
|
+
date: asOfDate,
|
|
1796
|
+
});
|
|
1797
|
+
}
|
|
1798
|
+
values = sortBy(values, "date");
|
|
1799
|
+
if (values.length > 0) {
|
|
1800
|
+
let guess = 0.1;
|
|
1801
|
+
const sumAmount = values
|
|
1802
|
+
.map((item) => item.amount)
|
|
1803
|
+
.reduce((prev, curr) => prev + curr, 0);
|
|
1804
|
+
if (sumAmount < 0) {
|
|
1805
|
+
guess = -0.1;
|
|
1806
|
+
}
|
|
1807
|
+
//SMP2-2249 fixed the big irr issue
|
|
1808
|
+
if (sumAmount === 0) {
|
|
1809
|
+
args.value = 0;
|
|
1810
|
+
}
|
|
1811
|
+
else {
|
|
1812
|
+
const valueItems = values.slice(0, values.length - 1);
|
|
1813
|
+
const valueList = valueItems.map((item) => item.amount);
|
|
1814
|
+
const dateList = valueItems.map((item) => item.date);
|
|
1815
|
+
const lastItem = values[values.length - 1];
|
|
1816
|
+
const navAdjust = lastItem.amount;
|
|
1817
|
+
const latestDate = lastItem.date;
|
|
1818
|
+
let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
|
|
1819
|
+
args.value = irr === null ? 0 : irr;
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
else {
|
|
1823
|
+
args.value = 0;
|
|
1824
|
+
}
|
|
1825
|
+
if (this.pivotObj.engineModule &&
|
|
1826
|
+
this.pivotObj.engineModule.formatFields[args.fieldName]) {
|
|
1827
|
+
delete this.pivotObj.engineModule.formatFields[args.fieldName];
|
|
1828
|
+
this.pivotObj.engineModule.formatFields[args.fieldName] = {
|
|
1829
|
+
name: args.fieldName,
|
|
1830
|
+
format: field.length > 0
|
|
1831
|
+
? field[0].format &&
|
|
1832
|
+
field[0].format.length &&
|
|
1833
|
+
field[0].format[0].formatChecked
|
|
1834
|
+
? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
|
|
1835
|
+
: this.dashboardPorletsService.formatPercent(field[0].dp)
|
|
1836
|
+
: "P2",
|
|
1837
|
+
};
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
if (args.aggregateType === "CalculateMultiple" ||
|
|
1841
|
+
args.aggregateType === "CalculatePIC" ||
|
|
1842
|
+
args.aggregateType === "CalculateDPI" ||
|
|
1843
|
+
args.aggregateType === "CalculateTVPI" ||
|
|
1844
|
+
args.aggregateType === "CalculateRVPI" ||
|
|
1845
|
+
args.aggregateType === "CalculateMActualAudited" ||
|
|
1846
|
+
args.aggregateType === "CalculateMReported") {
|
|
1847
|
+
let totalNumerator = 0;
|
|
1848
|
+
let totalDenominator = 0;
|
|
1849
|
+
let numeratorName;
|
|
1850
|
+
let denominatorName;
|
|
1851
|
+
let field = this.configFields.filter((el) => el.colName ===
|
|
1852
|
+
this.dashboardPorletsService.getAggregateType(args.aggregateType));
|
|
1853
|
+
if (field.length > 0) {
|
|
1854
|
+
const formulaArray = field[0].formula.split("/");
|
|
1855
|
+
numeratorName = formulaArray[0];
|
|
1856
|
+
denominatorName = formulaArray[1];
|
|
1857
|
+
}
|
|
1858
|
+
for (let j = 0; j < args.cellSets.length; j++) {
|
|
1859
|
+
totalNumerator += args.cellSets[j][numeratorName];
|
|
1860
|
+
totalDenominator += args.cellSets[j][denominatorName];
|
|
1861
|
+
}
|
|
1862
|
+
if (totalDenominator !== 0) {
|
|
1863
|
+
args.value = totalNumerator / totalDenominator;
|
|
1864
|
+
if (this.pivotObj.engineModule &&
|
|
1865
|
+
this.pivotObj.engineModule.formatFields[args.fieldName]) {
|
|
1866
|
+
delete this.pivotObj.engineModule.formatFields[args.fieldName];
|
|
1867
|
+
this.pivotObj.engineModule.formatFields[args.fieldName] = {
|
|
1868
|
+
name: args.fieldName,
|
|
1869
|
+
format: field.length > 0
|
|
1870
|
+
? field[0].format &&
|
|
1871
|
+
field[0].format.length &&
|
|
1872
|
+
field[0].format[0].formatChecked
|
|
1873
|
+
? this.dashboardPorletsService.pivotTableformatMultiple(field[0].format[0].selectedFormat)
|
|
1874
|
+
: this.dashboardPorletsService.formatMultiple(field[0].dp)
|
|
1875
|
+
: "###0.00'x'",
|
|
1876
|
+
};
|
|
1877
|
+
}
|
|
1878
|
+
}
|
|
1879
|
+
else {
|
|
1880
|
+
args.value = "";
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
if (args.aggregateType === "First" || args.aggregateType === "Last") {
|
|
1884
|
+
args.value = this.calculatedFistLast(args, args.aggregateType, args.fieldName);
|
|
1885
|
+
}
|
|
1886
|
+
if (args.aggregateType === "Count" ||
|
|
1887
|
+
args.aggregateType === "DistinctCount") {
|
|
1888
|
+
if (args.value) {
|
|
1889
|
+
args.value = args.value.toFixed(2);
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
if (!args.value &&
|
|
1893
|
+
args.value !== 0 &&
|
|
1894
|
+
args.value !== false &&
|
|
1895
|
+
args.value !== "false") {
|
|
1896
|
+
args.skipFormatting = true;
|
|
1897
|
+
args.value = "";
|
|
1898
|
+
}
|
|
1899
|
+
// 新建pivot table, 还没有设置row, 选了column之后grandtotal会有值
|
|
1900
|
+
if (args.rowCellType === "grandTotal" &&
|
|
1901
|
+
!this.pivotObj.dataSourceSettings.rows.length) {
|
|
1902
|
+
args.value = "";
|
|
1903
|
+
}
|
|
1904
|
+
//SMP2-2889
|
|
1905
|
+
if (args.rowCellType === "subTotal") {
|
|
1906
|
+
const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
|
|
1907
|
+
if (valueField_data.length > 0) {
|
|
1908
|
+
if (valueField_data[0].showSubTotals === false) {
|
|
1909
|
+
args.value = "";
|
|
1910
|
+
args.skipFormatting = true;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
if (args.rowCellType === "grandTotal") {
|
|
1915
|
+
const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
|
|
1916
|
+
if (valueField_data.length > 0) {
|
|
1917
|
+
if (valueField_data[0].showGrandTotals === false) {
|
|
1918
|
+
args.value = "";
|
|
1919
|
+
args.skipFormatting = true;
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
// SMP2-3416 start
|
|
1924
|
+
if (this.zeroFormatData.hgList.includes(args.fieldName) &&
|
|
1925
|
+
args.value === 0) {
|
|
1926
|
+
args.value = "-";
|
|
1927
|
+
args.skipFormatting = true;
|
|
1928
|
+
}
|
|
1929
|
+
if (this.zeroFormatData.emptyList.includes(args.fieldName) &&
|
|
1930
|
+
args.value === 0) {
|
|
1931
|
+
args.value = "";
|
|
1932
|
+
args.skipFormatting = true;
|
|
1933
|
+
}
|
|
1934
|
+
if (this.millionFields.includes(args.fieldName) &&
|
|
1935
|
+
!isNaN(Number(args.value)) &&
|
|
1936
|
+
args.value !== 0 &&
|
|
1937
|
+
args.value !== "" &&
|
|
1938
|
+
args.value !== null) {
|
|
1939
|
+
if (args.columnCellType == "grandTotal" &&
|
|
1940
|
+
args.rowCellType == "grandTotal") {
|
|
1941
|
+
if (!this.totalFormatted[args.fieldName]) {
|
|
1942
|
+
this.totalFormatted[args.fieldName] = true;
|
|
1943
|
+
args.value = args.value / 1000000;
|
|
1944
|
+
}
|
|
1945
|
+
}
|
|
1946
|
+
else {
|
|
1947
|
+
args.value = args.value / 1000000;
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
// SMP2-2486 & percentNum的format问题
|
|
1951
|
+
if (this.percentNumFields.length &&
|
|
1952
|
+
this.percentNumFields.includes(args.fieldName) &&
|
|
1953
|
+
!isNaN(Number(args.value)) &&
|
|
1954
|
+
args.value !== 0 &&
|
|
1955
|
+
args.value !== "" &&
|
|
1956
|
+
args.value !== null) {
|
|
1957
|
+
if (args.columnCellType == "grandTotal" &&
|
|
1958
|
+
args.rowCellType == "grandTotal") {
|
|
1959
|
+
if (!this.totalFormatted[args.fieldName]) {
|
|
1960
|
+
this.totalFormatted[args.fieldName] = true;
|
|
1961
|
+
args.value = args.value / 100;
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
else {
|
|
1965
|
+
args.value = args.value / 100;
|
|
1966
|
+
}
|
|
1967
|
+
}
|
|
1968
|
+
if (args.aggregateType == "CalculatedField" &&
|
|
1969
|
+
!isNaN(Number(args.value)) &&
|
|
1970
|
+
!this.pivotObj.engineModule.formatFields[args.fieldName].format) {
|
|
1971
|
+
args.value = Number(args.value).toFixed(2);
|
|
1972
|
+
}
|
|
1973
|
+
// SMP2-3416 end
|
|
1974
|
+
this.ref.markForCheck();
|
|
1975
|
+
this.ref.detectChanges();
|
|
1976
|
+
}
|
|
1977
|
+
calculatedFistLast(args, aggregateType, fieldName) {
|
|
1978
|
+
if (!args.row.actualText)
|
|
1979
|
+
args.row.actualText = args.row.formattedText;
|
|
1980
|
+
if (!args.column.actualText)
|
|
1981
|
+
args.column.actualText = args.column.formattedText;
|
|
1982
|
+
let field = this.configFields.filter((el) => el.colName === fieldName)[0];
|
|
1983
|
+
if (args.rowCellType === "value" && !args.row.hasChild) {
|
|
1984
|
+
if (args.cellSets[0]) {
|
|
1985
|
+
if (aggregateType === "First") {
|
|
1986
|
+
for (let firstIndex = 0; firstIndex < args.cellSets.length; firstIndex++) {
|
|
1987
|
+
if (this.pivotObj.dataSourceSettings.columns.length ==
|
|
1988
|
+
1 &&
|
|
1989
|
+
args.columnCellType == "grandTotal") {
|
|
1990
|
+
if (field.dataType == "string" ||
|
|
1991
|
+
field.dataType == "nvarchar" ||
|
|
1992
|
+
field.dataType == "date" ||
|
|
1993
|
+
field.dataType == "datetime") {
|
|
1994
|
+
args.value = "";
|
|
1995
|
+
}
|
|
1996
|
+
else {
|
|
1997
|
+
if (this.allDataValue &&
|
|
1998
|
+
this.allDataValue.length) {
|
|
1999
|
+
let rowObjs = this.allDataValue[args.row.rowIndex];
|
|
2000
|
+
if (rowObjs) {
|
|
2001
|
+
let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
|
|
2002
|
+
let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
|
|
2003
|
+
el.isGrandSum)[0];
|
|
2004
|
+
if (obj)
|
|
2005
|
+
args.value = obj.value;
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
else {
|
|
2009
|
+
args.value = isNaN(Number(this.grandTotals["row" +
|
|
2010
|
+
args.row.actualText +
|
|
2011
|
+
fieldName]))
|
|
2012
|
+
? null
|
|
2013
|
+
: Number(this.grandTotals["row" +
|
|
2014
|
+
args.row.actualText +
|
|
2015
|
+
fieldName]);
|
|
2016
|
+
}
|
|
2017
|
+
}
|
|
2018
|
+
}
|
|
2019
|
+
else {
|
|
2020
|
+
args.value = args.cellSets[firstIndex][fieldName];
|
|
2021
|
+
}
|
|
2022
|
+
if (field.dataType == "number" ||
|
|
2023
|
+
field.dataType == "multiple" ||
|
|
2024
|
+
field.dataType == "percent" ||
|
|
2025
|
+
field.dataType == "percentNum") {
|
|
2026
|
+
if (args.value != null)
|
|
2027
|
+
break;
|
|
2028
|
+
}
|
|
2029
|
+
else if (field.dataType == "date" ||
|
|
2030
|
+
field.dataType == "datetime") {
|
|
2031
|
+
if (this.pbf.time(args.value) > "1900-01-01")
|
|
2032
|
+
break;
|
|
2033
|
+
}
|
|
2034
|
+
else if (args.value)
|
|
2035
|
+
break;
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
if (aggregateType === "Last") {
|
|
2039
|
+
for (let lastIndex = args.cellSets.length - 1; lastIndex >= 0; lastIndex--) {
|
|
2040
|
+
if (this.pivotObj.dataSourceSettings.columns.length ==
|
|
2041
|
+
1 &&
|
|
2042
|
+
args.columnCellType == "grandTotal") {
|
|
2043
|
+
if (field.dataType == "string" ||
|
|
2044
|
+
field.dataType == "nvarchar" ||
|
|
2045
|
+
field.dataType == "date" ||
|
|
2046
|
+
field.dataType == "datetime") {
|
|
2047
|
+
args.value = "";
|
|
2048
|
+
}
|
|
2049
|
+
else {
|
|
2050
|
+
if (this.allDataValue &&
|
|
2051
|
+
this.allDataValue.length) {
|
|
2052
|
+
let rowObjs = this.allDataValue[args.row.rowIndex];
|
|
2053
|
+
if (rowObjs) {
|
|
2054
|
+
let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
|
|
2055
|
+
let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
|
|
2056
|
+
el.isGrandSum)[0];
|
|
2057
|
+
if (obj)
|
|
2058
|
+
args.value = obj.value;
|
|
2059
|
+
}
|
|
2060
|
+
}
|
|
2061
|
+
else {
|
|
2062
|
+
args.value = isNaN(Number(this.grandTotals["row" +
|
|
2063
|
+
args.row.actualText +
|
|
2064
|
+
fieldName]))
|
|
2065
|
+
? null
|
|
2066
|
+
: Number(this.grandTotals["row" +
|
|
2067
|
+
args.row.actualText +
|
|
2068
|
+
fieldName]);
|
|
2069
|
+
}
|
|
2070
|
+
}
|
|
2071
|
+
}
|
|
2072
|
+
else {
|
|
2073
|
+
args.value = args.cellSets[lastIndex][fieldName];
|
|
2074
|
+
}
|
|
2075
|
+
if (field.dataType == "number" ||
|
|
2076
|
+
field.dataType == "multiple" ||
|
|
2077
|
+
field.dataType == "percent" ||
|
|
2078
|
+
field.dataType == "percentNum") {
|
|
2079
|
+
if (args.value != null)
|
|
2080
|
+
break;
|
|
2081
|
+
}
|
|
2082
|
+
else if (field.dataType == "date" ||
|
|
2083
|
+
field.dataType == "datetime") {
|
|
2084
|
+
if (this.pbf.time(args.value) > "1900-01-01")
|
|
2085
|
+
break;
|
|
2086
|
+
}
|
|
2087
|
+
else if (args.value)
|
|
2088
|
+
break;
|
|
2089
|
+
}
|
|
2090
|
+
}
|
|
2091
|
+
if (field.dataType == "number" ||
|
|
2092
|
+
field.dataType == "multiple" ||
|
|
2093
|
+
field.dataType == "percent" ||
|
|
2094
|
+
field.dataType == "percentNum") {
|
|
2095
|
+
if (this.pivotObj.dataSourceSettings.rows.length) {
|
|
2096
|
+
if (!this.pivotObj.dataSourceSettings.columns.length) {
|
|
2097
|
+
if (!Number(this.grandTotals[fieldName]) ||
|
|
2098
|
+
isNaN(Number(this.grandTotals[fieldName]))) {
|
|
2099
|
+
this.grandTotals[fieldName] = 0;
|
|
2100
|
+
}
|
|
2101
|
+
if (args.aggregateType !== "CalculatedField") {
|
|
2102
|
+
this.grandTotals[fieldName] += Number(args.value);
|
|
2103
|
+
}
|
|
2104
|
+
}
|
|
2105
|
+
else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
|
|
2106
|
+
// "row" + args.row.actualText + fieldName 表示(cell: args.rowCellType === "value" && args.columnCellType === "grandTotal")
|
|
2107
|
+
if (!Number(this.grandTotals["row" + args.row.actualText + fieldName]) ||
|
|
2108
|
+
isNaN(Number(this.grandTotals["row" +
|
|
2109
|
+
args.row.actualText +
|
|
2110
|
+
fieldName]))) {
|
|
2111
|
+
this.grandTotals["row" + args.row.actualText + fieldName] = 0;
|
|
2112
|
+
}
|
|
2113
|
+
this.grandTotals["row" + args.row.actualText + fieldName] += Number(args.value);
|
|
2114
|
+
// "col" + args.column.actualText + fieldName 表示(cell: args.rowCellType === "grandTotal" && args.columnCellType === "value")
|
|
2115
|
+
if (!Number(this.grandTotals["col" +
|
|
2116
|
+
args.column.actualText +
|
|
2117
|
+
fieldName]) ||
|
|
2118
|
+
isNaN(Number(this.grandTotals["col" +
|
|
2119
|
+
args.column.actualText +
|
|
2120
|
+
fieldName]))) {
|
|
2121
|
+
this.grandTotals["col" + args.column.actualText + fieldName] = 0;
|
|
2122
|
+
}
|
|
2123
|
+
this.grandTotals["col" + args.column.actualText + fieldName] += Number(args.value);
|
|
2124
|
+
}
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
}
|
|
2128
|
+
}
|
|
2129
|
+
else if (args.rowCellType === "subTotal" || args.row.hasChild) {
|
|
2130
|
+
const dataType = field.dataType;
|
|
2131
|
+
if (dataType === "string" ||
|
|
2132
|
+
dataType === "nvarchar" ||
|
|
2133
|
+
dataType == "date" ||
|
|
2134
|
+
dataType == "datetime") {
|
|
2135
|
+
args.value = "";
|
|
2136
|
+
}
|
|
2137
|
+
else {
|
|
2138
|
+
let value = 0;
|
|
2139
|
+
let childHeaders = [];
|
|
2140
|
+
if (aggregateType === "First") {
|
|
2141
|
+
let groupNameArrays = [];
|
|
2142
|
+
let rows = this.pivotObj.dataSourceSettings.rows;
|
|
2143
|
+
for (let index = args.row.level; index < rows.length; index++) {
|
|
2144
|
+
groupNameArrays.push(rows[index].name);
|
|
2145
|
+
}
|
|
2146
|
+
for (let i = 0; i < args.cellSets.length; i++) {
|
|
2147
|
+
let values = [];
|
|
2148
|
+
let header = groupNameArrays
|
|
2149
|
+
.map((name) => {
|
|
2150
|
+
values.push(args.cellSets[i][name]);
|
|
2151
|
+
return args.cellSets[i][name];
|
|
2152
|
+
})
|
|
2153
|
+
.join("-");
|
|
2154
|
+
if (!childHeaders.includes(header)) {
|
|
2155
|
+
let filterObj = {};
|
|
2156
|
+
groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
|
|
2157
|
+
let _CellSets = _filter(args.cellSets, filterObj);
|
|
2158
|
+
childHeaders.push(header);
|
|
2159
|
+
value += Number(_CellSets[0][fieldName]) || 0;
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
if (aggregateType === "Last") {
|
|
2164
|
+
let groupNameArrays = [];
|
|
2165
|
+
let rows = this.pivotObj.dataSourceSettings.rows;
|
|
2166
|
+
for (let index = args.row.level; index < rows.length; index++) {
|
|
2167
|
+
groupNameArrays.push(rows[index].name);
|
|
2168
|
+
}
|
|
2169
|
+
for (let i = args.cellSets.length - 1; i >= 0; i--) {
|
|
2170
|
+
let values = [];
|
|
2171
|
+
let header = groupNameArrays
|
|
2172
|
+
.map((name) => {
|
|
2173
|
+
values.push(args.cellSets[i][name]);
|
|
2174
|
+
return args.cellSets[i][name];
|
|
2175
|
+
})
|
|
2176
|
+
.join("-");
|
|
2177
|
+
if (!childHeaders.includes(header)) {
|
|
2178
|
+
let filterObj = {};
|
|
2179
|
+
groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
|
|
2180
|
+
let _CellSets = _filter(args.cellSets, filterObj);
|
|
2181
|
+
childHeaders.push(header);
|
|
2182
|
+
value +=
|
|
2183
|
+
Number(_CellSets[_CellSets.length - 1][fieldName]) || 0;
|
|
2184
|
+
}
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
if (args.column.actualText !== "Grand Total")
|
|
2188
|
+
this.columnTexts.push(args.column.actualText);
|
|
2189
|
+
if (!this.pivotObj.dataSourceSettings.columns.length) {
|
|
2190
|
+
if (!Number(this.subTotals[fieldName]) ||
|
|
2191
|
+
isNaN(Number(this.subTotals[fieldName]))) {
|
|
2192
|
+
this.subTotals[fieldName] = 0;
|
|
2193
|
+
}
|
|
2194
|
+
this.subTotals[fieldName] += Number(value);
|
|
2195
|
+
}
|
|
2196
|
+
else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
|
|
2197
|
+
if (!Number(this.subTotals[args.row.actualText +
|
|
2198
|
+
args.column.actualText +
|
|
2199
|
+
fieldName]) ||
|
|
2200
|
+
isNaN(Number(this.subTotals[args.row.actualText +
|
|
2201
|
+
args.column.actualText +
|
|
2202
|
+
fieldName]))) {
|
|
2203
|
+
this.subTotals[args.row.actualText +
|
|
2204
|
+
args.column.actualText +
|
|
2205
|
+
fieldName] = 0;
|
|
2206
|
+
}
|
|
2207
|
+
this.subTotals[args.row.actualText + args.column.actualText + fieldName] += Number(value);
|
|
2208
|
+
}
|
|
2209
|
+
// ---> allDataValue中这个单元格的值不正确
|
|
2210
|
+
if (args.columnCellType === "grandTotal" &&
|
|
2211
|
+
this.pivotObj.dataSourceSettings.columns.length == 1) {
|
|
2212
|
+
if (this.allDataValue && this.allDataValue.length) {
|
|
2213
|
+
args.value =
|
|
2214
|
+
this.subTotals[args.row.actualText + "Grand Total" + fieldName];
|
|
2215
|
+
}
|
|
2216
|
+
else {
|
|
2217
|
+
this.columnTexts = uniqBy(this.columnTexts, (el) => el);
|
|
2218
|
+
let val = 0;
|
|
2219
|
+
for (let i = 0; i < this.columnTexts.length; i++) {
|
|
2220
|
+
const element = this.columnTexts[i];
|
|
2221
|
+
val +=
|
|
2222
|
+
this.subTotals[args.row.actualText + element + fieldName];
|
|
2223
|
+
}
|
|
2224
|
+
args.value = val;
|
|
2225
|
+
}
|
|
2226
|
+
}
|
|
2227
|
+
else {
|
|
2228
|
+
args.value = value;
|
|
2229
|
+
}
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
else if (args.rowCellType === "grandTotal") {
|
|
2233
|
+
const dataType = field.dataType;
|
|
2234
|
+
if (dataType == "string" ||
|
|
2235
|
+
dataType == "nvarchar" ||
|
|
2236
|
+
dataType == "date" ||
|
|
2237
|
+
dataType == "datetime") {
|
|
2238
|
+
args.value = "";
|
|
2239
|
+
}
|
|
2240
|
+
else {
|
|
2241
|
+
if (!this.pivotObj.dataSourceSettings.columns.length) {
|
|
2242
|
+
if (this.allDataValue && this.allDataValue.length) {
|
|
2243
|
+
let rowObjs = this.allDataValue[this.allDataValue.length - 1];
|
|
2244
|
+
if (rowObjs) {
|
|
2245
|
+
let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
|
|
2246
|
+
let objArr = rowObjsArr.filter((el) => el.actualText == fieldName && el.isGrandSum);
|
|
2247
|
+
if (objArr && objArr.length) {
|
|
2248
|
+
args.value = objArr[objArr.length - 1].value;
|
|
2249
|
+
}
|
|
2250
|
+
else if (Object.keys(this.grandTotals).includes(fieldName)) {
|
|
2251
|
+
args.value = this.grandTotals[fieldName];
|
|
2252
|
+
}
|
|
2253
|
+
}
|
|
2254
|
+
}
|
|
2255
|
+
else {
|
|
2256
|
+
args.value = this.grandTotals[fieldName];
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
2259
|
+
else {
|
|
2260
|
+
if (args.columnCellType === "grandTotal") {
|
|
2261
|
+
if (this.allDataValue && this.allDataValue.length) {
|
|
2262
|
+
let rowObjs = this.allDataValue[this.allDataValue.length - 1];
|
|
2263
|
+
if (rowObjs) {
|
|
2264
|
+
let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
|
|
2265
|
+
let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
|
|
2266
|
+
el.isGrandSum);
|
|
2267
|
+
if (objArr && objArr.length) {
|
|
2268
|
+
args.value =
|
|
2269
|
+
objArr[objArr.length - 1].value;
|
|
2270
|
+
}
|
|
2271
|
+
else if (Object.keys(this.grandTotals).includes("col" +
|
|
2272
|
+
args.column.actualText +
|
|
2273
|
+
fieldName)) {
|
|
2274
|
+
args.value =
|
|
2275
|
+
this.grandTotals["col" +
|
|
2276
|
+
args.column.actualText +
|
|
2277
|
+
fieldName];
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
}
|
|
2281
|
+
else {
|
|
2282
|
+
args.value =
|
|
2283
|
+
this.grandTotals["col" + args.column.actualText + fieldName];
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
else {
|
|
2287
|
+
if (this.allDataValue && this.allDataValue.length) {
|
|
2288
|
+
let rowObjs = this.allDataValue[this.allDataValue.length - 1];
|
|
2289
|
+
let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
|
|
2290
|
+
let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
|
|
2291
|
+
el.isGrandSum &&
|
|
2292
|
+
el.columnHeaders == args.column.actualText);
|
|
2293
|
+
if (objArr && objArr.length) {
|
|
2294
|
+
args.value = objArr[objArr.length - 1].value;
|
|
2295
|
+
}
|
|
2296
|
+
else if (Object.keys(this.grandTotals).includes("col" + args.column.actualText + fieldName)) {
|
|
2297
|
+
args.value =
|
|
2298
|
+
this.grandTotals["col" +
|
|
2299
|
+
args.column.actualText +
|
|
2300
|
+
fieldName];
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
else {
|
|
2304
|
+
args.value =
|
|
2305
|
+
this.grandTotals["col" + args.column.actualText + fieldName];
|
|
2306
|
+
}
|
|
2307
|
+
}
|
|
2308
|
+
}
|
|
2309
|
+
}
|
|
2310
|
+
}
|
|
2311
|
+
this.formatVal(args, fieldName);
|
|
2312
|
+
return args.value;
|
|
2313
|
+
}
|
|
2314
|
+
formatVal(args, fieldName) {
|
|
2315
|
+
this.configFields.forEach((field) => {
|
|
2316
|
+
if (field.colName == fieldName) {
|
|
2317
|
+
switch (field.dataType) {
|
|
2318
|
+
case "date":
|
|
2319
|
+
case "datetime":
|
|
2320
|
+
if (args.value)
|
|
2321
|
+
args.value = new Date(args.value);
|
|
2322
|
+
break;
|
|
2323
|
+
default:
|
|
2324
|
+
break;
|
|
2325
|
+
}
|
|
2326
|
+
}
|
|
2327
|
+
});
|
|
2328
|
+
}
|
|
2329
|
+
getexcludeFields(fields, data) {
|
|
2330
|
+
let namearray = [];
|
|
2331
|
+
let array = [];
|
|
2332
|
+
for (let prop in data) {
|
|
2333
|
+
array.push(prop);
|
|
2334
|
+
}
|
|
2335
|
+
for (let item of fields) {
|
|
2336
|
+
namearray.push(item.colName);
|
|
2337
|
+
}
|
|
2338
|
+
this.excludeFields = differenceWith(array, namearray);
|
|
2339
|
+
if (this.excludeFields.length &&
|
|
2340
|
+
this.config.groupSettings &&
|
|
2341
|
+
this.config.groupSettings.length) {
|
|
2342
|
+
for (let i = 0; i < this.excludeFields.length; i++) {
|
|
2343
|
+
const el = this.excludeFields[i];
|
|
2344
|
+
if (startsWith(el, this.config.groupSettings[0].name + "_")) {
|
|
2345
|
+
this.excludeFields.splice(i, 1);
|
|
2346
|
+
i--;
|
|
2347
|
+
}
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
}
|
|
2351
|
+
getInfo() {
|
|
2352
|
+
this.datePipeFormat = localStorage.getItem("datePipe");
|
|
2353
|
+
this.translation = JSON.parse(localStorage.getItem("translation"));
|
|
2354
|
+
}
|
|
2355
|
+
onFieldDrop(args) {
|
|
2356
|
+
this.dataSourceSettings.values = [...args.dataSourceSettings.values];
|
|
2357
|
+
//change the calcualteField method use the corresponding calculate
|
|
2358
|
+
const calcualteField = this.configFields.filter((el) => el.colName === args.fieldName && el.isCalculatedField);
|
|
2359
|
+
if (calcualteField.length > 0) {
|
|
2360
|
+
args.dropField.type =
|
|
2361
|
+
this.dashboardPorletsService.getCalculateMethod(calcualteField[0].colName);
|
|
2362
|
+
args.dropField.caption = args.dropField.caption
|
|
2363
|
+
.replace("Calculate", "")
|
|
2364
|
+
.trim();
|
|
2365
|
+
}
|
|
2366
|
+
for (let i = 0; i < args.dataSourceSettings.filterSettings.length; i++) {
|
|
2367
|
+
if (args.dataSourceSettings.filterSettings[i].name ===
|
|
2368
|
+
args.fieldName &&
|
|
2369
|
+
args.dropAxis === "") {
|
|
2370
|
+
args.dataSourceSettings.filterSettings.splice(i, 1);
|
|
2371
|
+
this.filterSettings = args.dataSourceSettings.filterSettings;
|
|
2372
|
+
break;
|
|
2373
|
+
}
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
// Calculated field事件:创建
|
|
2377
|
+
calculatedFieldCreate(args) {
|
|
2378
|
+
if (args.calculatedField.name !== "" &&
|
|
2379
|
+
args.calculatedField.name.trim() !== "") {
|
|
2380
|
+
let index = this.fieldlistObj.dataSourceSettings.calculatedFieldSettings.findIndex((el) => el.name === args.calculatedField.name);
|
|
2381
|
+
if (index !== -1) {
|
|
2382
|
+
if (args.calculatedField.formatString === "") {
|
|
2383
|
+
this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = "N2";
|
|
2384
|
+
}
|
|
2385
|
+
else {
|
|
2386
|
+
this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = args.calculatedField.formatString;
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
else {
|
|
2390
|
+
if (args.calculatedField.formatString === "") {
|
|
2391
|
+
args.calculatedField.formatString = "N2";
|
|
2392
|
+
}
|
|
2393
|
+
}
|
|
2394
|
+
// 移除重复
|
|
2395
|
+
let fIndex = this.customCalculatedFields.findIndex((f) => f.name === args.calculatedField.name);
|
|
2396
|
+
if (fIndex > -1) {
|
|
2397
|
+
this.customCalculatedFields.splice(fIndex, 1);
|
|
2398
|
+
}
|
|
2399
|
+
// 匹配运算符 First || Last
|
|
2400
|
+
let formulaStr = args.calculatedField.formula;
|
|
2401
|
+
let reg1 = /"First\((.+?)\)"/g;
|
|
2402
|
+
let reg2 = /"Last\((.+?)\)"/g;
|
|
2403
|
+
if (reg1.test(formulaStr) || reg2.test(formulaStr)) {
|
|
2404
|
+
// 判断是否存在First || Last 表达式
|
|
2405
|
+
let matchFirstFields = Array.from(formulaStr["matchAll"](/"First\((.+?)\)"/g), (m) => {
|
|
2406
|
+
return {
|
|
2407
|
+
matchStr: m[0],
|
|
2408
|
+
matchWord: m[1],
|
|
2409
|
+
replaceValue: "",
|
|
2410
|
+
matchMethod: "First",
|
|
2411
|
+
};
|
|
2412
|
+
});
|
|
2413
|
+
let matchLastFields = Array.from(formulaStr["matchAll"](/"Last\((.+?)\)"/g), (m) => {
|
|
2414
|
+
return {
|
|
2415
|
+
matchStr: m[0],
|
|
2416
|
+
matchWord: m[1],
|
|
2417
|
+
replaceValue: "",
|
|
2418
|
+
matchMethod: "Last",
|
|
2419
|
+
};
|
|
2420
|
+
});
|
|
2421
|
+
let matchMaxFields = Array.from(formulaStr["matchAll"](/"Max\((.+?)\)"/g), (m) => {
|
|
2422
|
+
return {
|
|
2423
|
+
matchStr: m[0],
|
|
2424
|
+
matchWord: m[1],
|
|
2425
|
+
replaceValue: "",
|
|
2426
|
+
matchMethod: "Max",
|
|
2427
|
+
};
|
|
2428
|
+
});
|
|
2429
|
+
let matchMinFields = Array.from(formulaStr["matchAll"](/"Min\((.+?)\)"/g), (m) => {
|
|
2430
|
+
return {
|
|
2431
|
+
matchStr: m[0],
|
|
2432
|
+
matchWord: m[1],
|
|
2433
|
+
replaceValue: "",
|
|
2434
|
+
matchMethod: "Min",
|
|
2435
|
+
};
|
|
2436
|
+
});
|
|
2437
|
+
let matchSumFields = Array.from(formulaStr["matchAll"](/"Sum\((.+?)\)"/g), (m) => {
|
|
2438
|
+
return {
|
|
2439
|
+
matchStr: m[0],
|
|
2440
|
+
matchWord: m[1],
|
|
2441
|
+
replaceValue: "",
|
|
2442
|
+
matchMethod: "Sum",
|
|
2443
|
+
};
|
|
2444
|
+
});
|
|
2445
|
+
let matchAvgFields = Array.from(formulaStr["matchAll"](/"Avg\((.+?)\)"/g), (m) => {
|
|
2446
|
+
return {
|
|
2447
|
+
matchStr: m[0],
|
|
2448
|
+
matchWord: m[1],
|
|
2449
|
+
replaceValue: "",
|
|
2450
|
+
matchMethod: "Avg",
|
|
2451
|
+
};
|
|
2452
|
+
});
|
|
2453
|
+
if (matchFirstFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord)) &&
|
|
2454
|
+
matchLastFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord))) {
|
|
2455
|
+
// 判断First和Last表达式内的字段是否合法
|
|
2456
|
+
this.customCalculatedFields.push({
|
|
2457
|
+
name: args.calculatedField.name,
|
|
2458
|
+
formula: args.calculatedField.formula,
|
|
2459
|
+
matchFields: [
|
|
2460
|
+
// @ts-ignore
|
|
2461
|
+
...matchFirstFields,
|
|
2462
|
+
...matchLastFields,
|
|
2463
|
+
...matchMaxFields,
|
|
2464
|
+
...matchMinFields,
|
|
2465
|
+
...matchSumFields,
|
|
2466
|
+
...matchAvgFields,
|
|
2467
|
+
],
|
|
2468
|
+
grandTotal: 0,
|
|
2469
|
+
});
|
|
2470
|
+
let fieldName = (formulaStr.split("First(")[1] ||
|
|
2471
|
+
formulaStr.split("Last(")[1]).split(")")[0];
|
|
2472
|
+
args.calculatedField.formula =
|
|
2473
|
+
"'\"" + "Sum(" + fieldName + ')"=' + formulaStr + "'";
|
|
2474
|
+
}
|
|
2475
|
+
}
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2478
|
+
// Calculated field事件:完成
|
|
2479
|
+
actionComplete(args) {
|
|
2480
|
+
if (args.actionName === "Field aggregated" ||
|
|
2481
|
+
args.actionName === "Field list closed") {
|
|
2482
|
+
this.dataSourceSettings.values = [
|
|
2483
|
+
...args.dataSourceSettings.values,
|
|
2484
|
+
];
|
|
2485
|
+
this.setValueItemData();
|
|
2486
|
+
}
|
|
2487
|
+
if (args.actionName == "Field removed") {
|
|
2488
|
+
if (args.fieldInfo &&
|
|
2489
|
+
args.fieldInfo.fieldItem &&
|
|
2490
|
+
args.fieldInfo.fieldItem.type == "CalculatedField") {
|
|
2491
|
+
let field = args.fieldInfo.fieldName;
|
|
2492
|
+
// Remove the deleted calculated field from an stored array.
|
|
2493
|
+
this.customCalculatedFields =
|
|
2494
|
+
this.customCalculatedFields.filter(function (obj) {
|
|
2495
|
+
return obj.name !== field;
|
|
2496
|
+
});
|
|
2497
|
+
}
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
// Calculated field事件:开始
|
|
2501
|
+
actionBegin(args) {
|
|
2502
|
+
if (args.actionName === "Edit calculated field") {
|
|
2503
|
+
for (let i = 0; i < this.customCalculatedFields.length; i++) {
|
|
2504
|
+
if (this.customCalculatedFields[i].name &&
|
|
2505
|
+
this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name]) {
|
|
2506
|
+
this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name].formula = this.customCalculatedFields[i].formula;
|
|
2507
|
+
}
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
resizeStop(args) {
|
|
2512
|
+
if (this.config.columnsWidth) {
|
|
2513
|
+
const header_field = this.config.columnsWidth.filter((el) => el.headerText === args.column.headerText);
|
|
2514
|
+
if (header_field.length > 0) {
|
|
2515
|
+
header_field[0].width = parseInt(args.column.width);
|
|
2516
|
+
}
|
|
2517
|
+
else {
|
|
2518
|
+
this.config.columnsWidth.push({
|
|
2519
|
+
headerText: args.column.headerText,
|
|
2520
|
+
width: parseInt(args.column.width),
|
|
2521
|
+
});
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
else {
|
|
2525
|
+
this.config.columnsWidth = [];
|
|
2526
|
+
this.config.columnsWidth.push({
|
|
2527
|
+
headerText: args.column.headerText,
|
|
2528
|
+
width: parseInt(args.column.width),
|
|
2529
|
+
});
|
|
2530
|
+
}
|
|
2531
|
+
const portlet = this.portlet;
|
|
2532
|
+
portlet.config = JSON.stringify(this.config);
|
|
2533
|
+
const index = this.portlets.findIndex((x) => x.newId === portlet.newId);
|
|
2534
|
+
if (index > -1)
|
|
2535
|
+
this.portlets[index] = portlet;
|
|
2536
|
+
}
|
|
2537
|
+
setColumnsRender(args) {
|
|
2538
|
+
if (args.stackedColumns) {
|
|
2539
|
+
args.stackedColumns.forEach((col) => {
|
|
2540
|
+
if (col.format &&
|
|
2541
|
+
(col.format.indexOf("N") !== -1 ||
|
|
2542
|
+
col.format === "percent" ||
|
|
2543
|
+
col.format.indexOf("P") !== -1)) {
|
|
2544
|
+
col.textAlign = "Right";
|
|
2545
|
+
}
|
|
2546
|
+
});
|
|
2547
|
+
}
|
|
2548
|
+
if (this.config.columnsWidth) {
|
|
2549
|
+
for (let i = 0; i < args.columns.length; i++) {
|
|
2550
|
+
if (args.columns[i].headerText === "" ||
|
|
2551
|
+
!args.columns[i].headerText) {
|
|
2552
|
+
const column_row = this.config.columnsWidth.filter((el) => el.headerText === args.columns[i].headerText);
|
|
2553
|
+
if (column_row.length > 0) {
|
|
2554
|
+
args.columns[i].width = column_row[0].width;
|
|
2555
|
+
}
|
|
2556
|
+
}
|
|
2557
|
+
else {
|
|
2558
|
+
const headerText = args.columns[i].headerText
|
|
2559
|
+
.replace(/\s+/g, "")
|
|
2560
|
+
.split(".");
|
|
2561
|
+
if (headerText && headerText.length > 0) {
|
|
2562
|
+
const column = this.config.columnsWidth.filter((el) => el.headerText
|
|
2563
|
+
.replace(/\s+/g, "")
|
|
2564
|
+
.toLowerCase() ===
|
|
2565
|
+
headerText[headerText.length - 1].toLowerCase());
|
|
2566
|
+
if (column.length > 0) {
|
|
2567
|
+
args.columns[i].width = column[0].width;
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
// date format about quarterly
|
|
2572
|
+
let pivotValues = this.pivotObj.pivotValues;
|
|
2573
|
+
if (this.formatDates && this.formatDates.length) {
|
|
2574
|
+
let dateFields = this.formatDates.map((el) => {
|
|
2575
|
+
return el.name;
|
|
2576
|
+
});
|
|
2577
|
+
for (let k = 1; k < pivotValues.length; k++) {
|
|
2578
|
+
for (let j = 0; pivotValues[k] != null && j < pivotValues[k].length; j++) {
|
|
2579
|
+
if (pivotValues[k][j] != null &&
|
|
2580
|
+
(j == 0
|
|
2581
|
+
? dateFields.includes(pivotValues[k][j].valueSort.axis)
|
|
2582
|
+
: dateFields.includes(pivotValues[k][j].actualText))) {
|
|
2583
|
+
//Customize the Row headers/Column headers based on your needs
|
|
2584
|
+
let headers;
|
|
2585
|
+
if (j === 0) {
|
|
2586
|
+
headers = pivotValues[k][j].actualText;
|
|
2587
|
+
}
|
|
2588
|
+
else {
|
|
2589
|
+
// headers = pivotValues[k][j].formattedText;
|
|
2590
|
+
headers = pivotValues[k][j].value;
|
|
2591
|
+
}
|
|
2592
|
+
if (headers) {
|
|
2593
|
+
let date = new Date(headers);
|
|
2594
|
+
let quarter = Math.floor(date.getMonth() / 3) + 1;
|
|
2595
|
+
let format;
|
|
2596
|
+
this.formatDates.map((el) => {
|
|
2597
|
+
if (j == 0) {
|
|
2598
|
+
if (el.name ==
|
|
2599
|
+
pivotValues[k][j].valueSort.axis)
|
|
2600
|
+
format = el.format;
|
|
2601
|
+
}
|
|
2602
|
+
else {
|
|
2603
|
+
if (el.name ==
|
|
2604
|
+
pivotValues[k][j].actualText)
|
|
2605
|
+
format = el.format;
|
|
2606
|
+
}
|
|
2607
|
+
});
|
|
2608
|
+
pivotValues[k][j].formattedText =
|
|
2609
|
+
this.getQuarterValue(format, date, quarter);
|
|
2610
|
+
}
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
}
|
|
2614
|
+
}
|
|
2615
|
+
}
|
|
2616
|
+
// if(this.pivotObj) this.pivotObj.refreshData();
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2619
|
+
onLoad() {
|
|
2620
|
+
// SMP2-15651 开启虚拟滚动并sort列后,来回滚动会导致数据空白
|
|
2621
|
+
// 官方链接 https://ej2.syncfusion.com/angular/documentation/pivotview/virtual-scrolling#virtual-scrolling-for-static-field-list
|
|
2622
|
+
// Demo链接 https://stackblitz.com/edit/github-7ggk2u-4rkzb3?file=src%2Fapp.component.ts
|
|
2623
|
+
this.fieldlistObj.pivotGridModule = this
|
|
2624
|
+
.pivotObj;
|
|
2625
|
+
}
|
|
2626
|
+
ondataBound() {
|
|
2627
|
+
if (Browser.isDevice) {
|
|
2628
|
+
this.pivotObj.element.style.width = '100%';
|
|
2629
|
+
this.pivotObj.allowCalculatedField = true;
|
|
2630
|
+
this.pivotObj.showFieldList = true;
|
|
2631
|
+
}
|
|
2632
|
+
}
|
|
2633
|
+
enginePopulated(args) {
|
|
2634
|
+
let clonedValues;
|
|
2635
|
+
let currentPivotValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
|
|
2636
|
+
let pageSettings = this.pivotObj.engineModule.pageSettings;
|
|
2637
|
+
if (this.pivotObj.engineModule.generateGridData) {
|
|
2638
|
+
// 没法复现 https://raiselp.atlassian.net/browse/SMP2-1724 处理的这个问题情况, 直接注释掉
|
|
2639
|
+
// 下面这段代码会影响 https://raiselp.atlassian.net/browse/SMP2-12139
|
|
2640
|
+
// this.pivotObj.engineModule.generateGridData(
|
|
2641
|
+
// this.pivotObj.dataSourceSettings,
|
|
2642
|
+
// true
|
|
2643
|
+
// );
|
|
2644
|
+
clonedValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
|
|
2645
|
+
this.pivotObj.engineModule.pivotValues = currentPivotValues;
|
|
2646
|
+
this.pivotObj.engineModule.pageSettings = pageSettings;
|
|
2647
|
+
// Here "clonedValues" contains the whole pivot values.
|
|
2648
|
+
this.allDataValue = clonedValues;
|
|
2649
|
+
}
|
|
2650
|
+
}
|
|
2651
|
+
getClonedPivotValues(pivotValues) {
|
|
2652
|
+
let clonedSets = [];
|
|
2653
|
+
if (pivotValues && pivotValues.length) {
|
|
2654
|
+
for (let i = 0; i < pivotValues.length; i++) {
|
|
2655
|
+
if (pivotValues[i]) {
|
|
2656
|
+
clonedSets[i] = [];
|
|
2657
|
+
for (let j = 0; j < pivotValues[i].length; j++) {
|
|
2658
|
+
if (pivotValues[i][j]) {
|
|
2659
|
+
/* eslint-disable */
|
|
2660
|
+
clonedSets[i][j] = this.getClonedPivotValueObj(pivotValues[i][j]);
|
|
2661
|
+
/* eslint-enable */
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
2664
|
+
}
|
|
2665
|
+
}
|
|
2666
|
+
}
|
|
2667
|
+
return clonedSets;
|
|
2668
|
+
}
|
|
2669
|
+
getClonedPivotValueObj(data) {
|
|
2670
|
+
let keyPos = 0;
|
|
2671
|
+
let framedSet = {};
|
|
2672
|
+
if (!(data === null || data === undefined)) {
|
|
2673
|
+
let fields = Object.keys(data);
|
|
2674
|
+
while (keyPos < fields.length) {
|
|
2675
|
+
framedSet[fields[keyPos]] = data[fields[keyPos]];
|
|
2676
|
+
keyPos++;
|
|
2677
|
+
}
|
|
2678
|
+
}
|
|
2679
|
+
else {
|
|
2680
|
+
framedSet = data;
|
|
2681
|
+
}
|
|
2682
|
+
return framedSet;
|
|
2683
|
+
}
|
|
2684
|
+
//#region Filtering the TreeNodes
|
|
2685
|
+
searchNodes(args) {
|
|
2686
|
+
let _text = args.maskedValue;
|
|
2687
|
+
let predicats = [], _array = [], _filter = [];
|
|
2688
|
+
if (_text == "") {
|
|
2689
|
+
this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
|
|
2690
|
+
}
|
|
2691
|
+
else {
|
|
2692
|
+
let predicate = new Predicate("caption", "contains", _text, true);
|
|
2693
|
+
let filteredList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(new Query().where(predicate));
|
|
2694
|
+
for (let j = 0; j < filteredList.length; j++) {
|
|
2695
|
+
_filter.push(filteredList[j]["id"]);
|
|
2696
|
+
let filters = this.getFilterItems(filteredList[j], this.fieldlistObj.treeViewModule.getTreeData());
|
|
2697
|
+
for (let i = 0; i < filters.length; i++) {
|
|
2698
|
+
if (_array.indexOf(filters[i]) == -1 &&
|
|
2699
|
+
filters[i] != null) {
|
|
2700
|
+
_array.push(filters[i]);
|
|
2701
|
+
predicats.push(new Predicate("id", "equal", filters[i], false));
|
|
2702
|
+
}
|
|
2703
|
+
}
|
|
2704
|
+
}
|
|
2705
|
+
if (predicats.length == 0) {
|
|
2706
|
+
this.changeDataSource([]);
|
|
2707
|
+
}
|
|
2708
|
+
else {
|
|
2709
|
+
let query = new Query().where(Predicate.or(predicats));
|
|
2710
|
+
let newList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(query);
|
|
2711
|
+
this.changeDataSource(newList);
|
|
2712
|
+
}
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
//Find the Parent Nodes for corresponding childs
|
|
2716
|
+
getFilterItems(fList, list) {
|
|
2717
|
+
let nodes = [];
|
|
2718
|
+
nodes.push(fList["id"]);
|
|
2719
|
+
let query2 = new Query().where("id", "equal", fList["pid"], false);
|
|
2720
|
+
let fList1 = new DataManager(list).executeLocal(query2);
|
|
2721
|
+
if (fList1.length != 0) {
|
|
2722
|
+
let pNode = this.getFilterItems(fList1[0], list);
|
|
2723
|
+
for (let i = 0; i < pNode.length; i++) {
|
|
2724
|
+
if (nodes.indexOf(pNode[i]) == -1 && pNode[i] != null)
|
|
2725
|
+
nodes.push(pNode[i]);
|
|
2726
|
+
}
|
|
2727
|
+
return nodes;
|
|
2728
|
+
}
|
|
2729
|
+
return nodes;
|
|
2730
|
+
}
|
|
2731
|
+
created(args) {
|
|
2732
|
+
if (this.fieldlistObj && !this.fieldlistObj.engineModule.fields) {
|
|
2733
|
+
this.fieldlistObj.engineModule.fields = [];
|
|
2734
|
+
}
|
|
2735
|
+
let search = document.createElement("input");
|
|
2736
|
+
search.id = "pivotSearchBox" + this.fieldlistObj.element.id;
|
|
2737
|
+
let el = document.querySelector("#" + this.fieldlistObj.element.id + "_Container .e-field-table");
|
|
2738
|
+
if (el)
|
|
2739
|
+
el.prepend(search);
|
|
2740
|
+
this.pivotSearchBox = new MaskedTextBox({
|
|
2741
|
+
placeholder: this.translation.SEARCH || ".SEARCH",
|
|
2742
|
+
cssClass: "pivot-search",
|
|
2743
|
+
change: this.searchNodes.bind(this),
|
|
2744
|
+
});
|
|
2745
|
+
this.pivotSearchBox.appendTo("#pivotSearchBox" + this.fieldlistObj.element.id);
|
|
2746
|
+
// NEW Dashboard 点击"apply"时,请求新数据
|
|
2747
|
+
let applyBtn = document.getElementById(this.fieldlistObj.element.id + "_DeferUpdateButton1");
|
|
2748
|
+
applyBtn &&
|
|
2749
|
+
applyBtn.addEventListener("click", () => {
|
|
2750
|
+
this.pageLoading = true;
|
|
2751
|
+
this.dashboardPorletsService.getDataByPortletsNew([this.portlet], () => {
|
|
2752
|
+
this.pageLoading = false;
|
|
2753
|
+
this.Pivot_Data =
|
|
2754
|
+
this.dashboardPorletsService.getResultByDataTable(this.portlet, false, false, this.dashboard.id);
|
|
2755
|
+
this.pivotObj.dataSourceSettings.dataSource =
|
|
2756
|
+
this.Pivot_Data;
|
|
2757
|
+
if (this.Pivot_Data) {
|
|
2758
|
+
let groups = this.config.xaxis.groups;
|
|
2759
|
+
let rows = [];
|
|
2760
|
+
if (groups) {
|
|
2761
|
+
for (let gitem of groups) {
|
|
2762
|
+
const field = this.configFields.filter((el) => el.colName === gitem.name);
|
|
2763
|
+
if (field.length > 0) {
|
|
2764
|
+
gitem.showSubTotals =
|
|
2765
|
+
field[0].showSubTotals;
|
|
2766
|
+
gitem.caption =
|
|
2767
|
+
field[0].langValue ||
|
|
2768
|
+
this.translation[field[0].langCode] ||
|
|
2769
|
+
field[0].langCode ||
|
|
2770
|
+
gitem.caption;
|
|
2771
|
+
}
|
|
2772
|
+
rows.push(gitem);
|
|
2773
|
+
}
|
|
2774
|
+
}
|
|
2775
|
+
this.Pivot_Data.map((data) => {
|
|
2776
|
+
rows.forEach((row) => {
|
|
2777
|
+
if (data[row.name] === "") {
|
|
2778
|
+
data[row.name] = "null";
|
|
2779
|
+
}
|
|
2780
|
+
});
|
|
2781
|
+
});
|
|
2782
|
+
}
|
|
2783
|
+
if (this.pivotObj)
|
|
2784
|
+
this.pivotObj.refreshData();
|
|
2785
|
+
this.ref.markForCheck();
|
|
2786
|
+
this.ref.detectChanges();
|
|
2787
|
+
}, null, false, this.dashboard, false);
|
|
2788
|
+
});
|
|
2789
|
+
// 点击"cancel"时,恢复原始数据
|
|
2790
|
+
let cancelBtn = document.getElementById(this.fieldlistObj.element.id + "_DeferUpdateButton2");
|
|
2791
|
+
cancelBtn &&
|
|
2792
|
+
cancelBtn.addEventListener("click", () => {
|
|
2793
|
+
this.pivotObj.dataSourceSettings.dataSource =
|
|
2794
|
+
[...this.Pivot_Data];
|
|
2795
|
+
if (this.pivotObj)
|
|
2796
|
+
this.pivotObj.refreshData();
|
|
2797
|
+
this.ref.markForCheck();
|
|
2798
|
+
this.ref.detectChanges();
|
|
2799
|
+
});
|
|
2800
|
+
}
|
|
2801
|
+
fieldListRefreshed(args) {
|
|
2802
|
+
if (this.pivotSearchBox) {
|
|
2803
|
+
this.pivotSearchBox.value = "";
|
|
2804
|
+
this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
|
|
2805
|
+
}
|
|
2806
|
+
}
|
|
2807
|
+
changeDataSource(data) {
|
|
2808
|
+
let fieldTable = this.fieldlistObj.treeViewModule.fieldTable;
|
|
2809
|
+
if (fieldTable) {
|
|
2810
|
+
fieldTable.fields = {
|
|
2811
|
+
dataSource: data,
|
|
2812
|
+
id: "id",
|
|
2813
|
+
text: "caption",
|
|
2814
|
+
isChecked: "isSelected",
|
|
2815
|
+
parentID: "pid",
|
|
2816
|
+
iconCss: "spriteCssClass",
|
|
2817
|
+
};
|
|
2818
|
+
}
|
|
2819
|
+
}
|
|
2820
|
+
//SMP2-2957 fix the date issue on the raw data
|
|
2821
|
+
drillThrough(args) {
|
|
2822
|
+
for (let i = 0; i < args.gridColumns.length; i++) {
|
|
2823
|
+
const data = this.configFields.filter((el) => el.colName === args.gridColumns[i].field);
|
|
2824
|
+
if (data && data.length > 0) {
|
|
2825
|
+
if (data[0].dataType === "date" ||
|
|
2826
|
+
data[0].dataType === "datetime") {
|
|
2827
|
+
args.gridColumns[i].type = "date";
|
|
2828
|
+
}
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
}
|
|
2832
|
+
//#endregion
|
|
2833
|
+
setFontSettingConditional(obj, data, code) {
|
|
2834
|
+
if (code === -1) {
|
|
2835
|
+
obj.style.color = data.negaFontColor;
|
|
2836
|
+
obj.style.fontFamily = data.negaFontFamilyValue;
|
|
2837
|
+
obj.style.fontSize = data.negaFontSizeValue;
|
|
2838
|
+
obj.style.backgroundColor = data.negaBackgroundColor;
|
|
2839
|
+
}
|
|
2840
|
+
else {
|
|
2841
|
+
obj.style.color = data.fontColor;
|
|
2842
|
+
obj.style.fontFamily = data.fontFamilyValue;
|
|
2843
|
+
obj.style.fontSize = data.fontSizeValue;
|
|
2844
|
+
obj.style.backgroundColor = data.backgroundColor;
|
|
2845
|
+
}
|
|
2846
|
+
}
|
|
2847
|
+
setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, data) {
|
|
2848
|
+
if (Math.sign(data.compareValue1) == 0) {
|
|
2849
|
+
switch (data.compareSelect) {
|
|
2850
|
+
case "LessThan": // 小于
|
|
2851
|
+
case "LessThanOrEqualTo": // 小于等于
|
|
2852
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2853
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
2854
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2855
|
+
break;
|
|
2856
|
+
case "GreaterThan": // 大于
|
|
2857
|
+
case "GreaterThanOrEqualTo": // 大于等于
|
|
2858
|
+
conditionalFormatObj.value1 = 0;
|
|
2859
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2860
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2861
|
+
break;
|
|
2862
|
+
case "NotEquals": // 不等于
|
|
2863
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2864
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
2865
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2866
|
+
conditionalFormatObj.value1 = 0;
|
|
2867
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2868
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2869
|
+
break;
|
|
2870
|
+
case "Between": // value1<= val <=value2
|
|
2871
|
+
if (Math.sign(data.compareValue2) === 1) {
|
|
2872
|
+
conditionalFormatObj.value1 = 0;
|
|
2873
|
+
conditionalFormatObj.value2 = Number(data.compareValue2);
|
|
2874
|
+
conditionalFormatObj.conditions = "Between";
|
|
2875
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2876
|
+
}
|
|
2877
|
+
break;
|
|
2878
|
+
case "NotBetween": // val >= value2, val <= value1
|
|
2879
|
+
if (Math.sign(data.compareValue2) === 1) {
|
|
2880
|
+
conditionalFormatObj.value1 = Number(data.compareValue2);
|
|
2881
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2882
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2883
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2884
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
2885
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2886
|
+
}
|
|
2887
|
+
break;
|
|
2888
|
+
default:
|
|
2889
|
+
break;
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
else if (Math.sign(data.compareValue1) === 1) {
|
|
2893
|
+
switch (data.compareSelect) {
|
|
2894
|
+
case "LessThan": // 小于
|
|
2895
|
+
case "LessThanOrEqualTo": // 小于等于
|
|
2896
|
+
conditionalFormatObj.value1 = 0;
|
|
2897
|
+
conditionalFormatObj.value2 = Number(data.compareValue1);
|
|
2898
|
+
conditionalFormatObj.conditions = "Between";
|
|
2899
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2900
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2901
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
2902
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2903
|
+
break;
|
|
2904
|
+
case "GreaterThan": // 大于
|
|
2905
|
+
case "GreaterThanOrEqualTo": // 大于等于
|
|
2906
|
+
conditionalFormatObj.value1 = Number(data.compareValue1);
|
|
2907
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2908
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2909
|
+
break;
|
|
2910
|
+
case "Equals": // 等于
|
|
2911
|
+
conditionalFormatObj.value1 = Number(data.compareValue1);
|
|
2912
|
+
conditionalFormatObj.conditions = "Equals";
|
|
2913
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2914
|
+
break;
|
|
2915
|
+
case "NotEquals": // 不等于
|
|
2916
|
+
conditionalFormatObj.value1 = 0;
|
|
2917
|
+
conditionalFormatObj.value2 = Number(data.compareValue1);
|
|
2918
|
+
conditionalFormatObj.conditions = "Between";
|
|
2919
|
+
// push进数组
|
|
2920
|
+
conditionalFormatObj.value1 = Number(data.compareValue1);
|
|
2921
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2922
|
+
// push进数组
|
|
2923
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2924
|
+
negaConditionalFormatObj.conditions = "LessThanOrEqualTo";
|
|
2925
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2926
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2927
|
+
break;
|
|
2928
|
+
case "Between": // value1<= val <=value2
|
|
2929
|
+
if (Math.sign(data.compareValue2) === 1) {
|
|
2930
|
+
conditionalFormatObj.value1 = Number(data.compareValue1);
|
|
2931
|
+
conditionalFormatObj.value2 = Number(data.compareValue2);
|
|
2932
|
+
conditionalFormatObj.conditions = "Between";
|
|
2933
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2934
|
+
}
|
|
2935
|
+
break;
|
|
2936
|
+
case "NotBetween": // val >= value2, val <= value1
|
|
2937
|
+
if (Math.sign(data.compareValue2) === 1) {
|
|
2938
|
+
conditionalFormatObj.value1 = 0;
|
|
2939
|
+
conditionalFormatObj.value2 = Number(data.compareValue1);
|
|
2940
|
+
conditionalFormatObj.conditions = "Between";
|
|
2941
|
+
// push进数组
|
|
2942
|
+
conditionalFormatObj.value1 = Number(data.compareValue2);
|
|
2943
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2944
|
+
// push进数组
|
|
2945
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2946
|
+
}
|
|
2947
|
+
break;
|
|
2948
|
+
default:
|
|
2949
|
+
break;
|
|
2950
|
+
}
|
|
2951
|
+
}
|
|
2952
|
+
else if (Math.sign(data.compareValue1) === -1) {
|
|
2953
|
+
switch (data.compareSelect) {
|
|
2954
|
+
case "LessThan": // 小于
|
|
2955
|
+
case "LessThanOrEqualTo": // 小于等于
|
|
2956
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
2957
|
+
negaConditionalFormatObj.conditions = data.compareSelect;
|
|
2958
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2959
|
+
break;
|
|
2960
|
+
case "GreaterThan": // 大于
|
|
2961
|
+
case "GreaterThanOrEqualTo": // 大于等于
|
|
2962
|
+
conditionalFormatObj.value1 = 0;
|
|
2963
|
+
conditionalFormatObj.conditions = "GreaterThanOrEqualTo";
|
|
2964
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2965
|
+
negaConditionalFormatObj.value2 = data.compareValue1;
|
|
2966
|
+
negaConditionalFormatObj.conditions = "Between";
|
|
2967
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2968
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2969
|
+
break;
|
|
2970
|
+
case "Equals": // 等于
|
|
2971
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
2972
|
+
negaConditionalFormatObj.conditions = "Equals";
|
|
2973
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2974
|
+
case "NotEquals": // 不等于
|
|
2975
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
2976
|
+
negaConditionalFormatObj.conditions = "NotEquals";
|
|
2977
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2978
|
+
conditionalFormatObj.value1 = 0;
|
|
2979
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
2980
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2981
|
+
break;
|
|
2982
|
+
case "Between": // value1<= val <=value2
|
|
2983
|
+
if (Math.sign(data.compareValue2)) {
|
|
2984
|
+
negaConditionalFormatObj.value1 = 0;
|
|
2985
|
+
negaConditionalFormatObj.value2 = data.compareValue1;
|
|
2986
|
+
negaConditionalFormatObj.conditions = "Between";
|
|
2987
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2988
|
+
conditionalFormatObj.value1 = 0;
|
|
2989
|
+
conditionalFormatObj.value2 = data.compareValue2;
|
|
2990
|
+
conditionalFormatObj.conditions = "Between";
|
|
2991
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
2992
|
+
}
|
|
2993
|
+
else {
|
|
2994
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
2995
|
+
negaConditionalFormatObj.value2 = data.compareValue2;
|
|
2996
|
+
negaConditionalFormatObj.conditions = "Between";
|
|
2997
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
2998
|
+
}
|
|
2999
|
+
break;
|
|
3000
|
+
case "NotBetween": // val >= value2, val <= value1
|
|
3001
|
+
if (Math.sign(data.compareValue2)) {
|
|
3002
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
3003
|
+
negaConditionalFormatObj.conditions = "LessThan";
|
|
3004
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
3005
|
+
conditionalFormatObj.value1 = data.compareValue2;
|
|
3006
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
3007
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
3008
|
+
}
|
|
3009
|
+
else {
|
|
3010
|
+
negaConditionalFormatObj.value1 = data.compareValue1;
|
|
3011
|
+
negaConditionalFormatObj.value2 = data.compareValue2;
|
|
3012
|
+
negaConditionalFormatObj.conditions = "NotBetween";
|
|
3013
|
+
this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
|
|
3014
|
+
conditionalFormatObj.value1 = 0;
|
|
3015
|
+
conditionalFormatObj.conditions = "GreaterThan";
|
|
3016
|
+
this.setFontSettingConditional(conditionalFormatObj, data, 1);
|
|
3017
|
+
}
|
|
3018
|
+
break;
|
|
3019
|
+
default:
|
|
3020
|
+
break;
|
|
3021
|
+
}
|
|
3022
|
+
}
|
|
3023
|
+
}
|
|
3024
|
+
getQuarterValue(format, date, quarter) {
|
|
3025
|
+
let year;
|
|
3026
|
+
switch (format) {
|
|
3027
|
+
case "Q1 2021":
|
|
3028
|
+
year = date.getFullYear();
|
|
3029
|
+
return "Q" + quarter + " " + year;
|
|
3030
|
+
case "Q1 21":
|
|
3031
|
+
year = date.getYear() - 100;
|
|
3032
|
+
return "Q" + quarter + " " + year;
|
|
3033
|
+
case "2021 Q1":
|
|
3034
|
+
year = date.getFullYear();
|
|
3035
|
+
return year + " " + "Q" + quarter;
|
|
3036
|
+
case "21 Q1":
|
|
3037
|
+
year = date.getYear() - 100;
|
|
3038
|
+
return year + " " + "Q" + quarter;
|
|
3039
|
+
}
|
|
3040
|
+
}
|
|
3041
|
+
customiseCell(args) {
|
|
3042
|
+
if (args.column.type === "date" || args.column.type === "dateTime") {
|
|
3043
|
+
const { field } = args.column;
|
|
3044
|
+
if (!args.data[field]) {
|
|
3045
|
+
args.column.type = "string";
|
|
3046
|
+
args.column.format = "";
|
|
3047
|
+
}
|
|
3048
|
+
}
|
|
3049
|
+
}
|
|
3050
|
+
/**
|
|
3051
|
+
* @param timeArray 数组对象 [{"date":"2021-01-01"},{"date":"2021-02-01"}]
|
|
3052
|
+
* @param endDate 截至时间
|
|
3053
|
+
* @param interval 时间间隔 year / quarter / month
|
|
3054
|
+
* @param timeKey 时间字段名 date
|
|
3055
|
+
* @returns 划分后的时间分组对象
|
|
3056
|
+
*/
|
|
3057
|
+
getTimeRanges(timeArray, endDate, interval, timeKey) {
|
|
3058
|
+
// 将时间字符串转换为 moment 对象
|
|
3059
|
+
const dates = timeArray.map((item) => moment(item[timeKey || "date"]));
|
|
3060
|
+
// 分隔符
|
|
3061
|
+
const delimiter = "-";
|
|
3062
|
+
// 找到最小时间和最大时间
|
|
3063
|
+
const minDate = moment.min(dates);
|
|
3064
|
+
const maxDate = moment(endDate);
|
|
3065
|
+
// 初始化结果对象
|
|
3066
|
+
const result = {};
|
|
3067
|
+
// 根据入参进行划分
|
|
3068
|
+
if (interval === "year") {
|
|
3069
|
+
const startYear = minDate.year();
|
|
3070
|
+
const endYear = maxDate.year();
|
|
3071
|
+
for (let year = startYear; year <= endYear; year++) {
|
|
3072
|
+
result[year] = [];
|
|
3073
|
+
}
|
|
3074
|
+
dates.forEach((date, index) => {
|
|
3075
|
+
const year = date.year();
|
|
3076
|
+
result[year].push(timeArray[index]);
|
|
3077
|
+
});
|
|
3078
|
+
}
|
|
3079
|
+
else if (interval === "quarter") {
|
|
3080
|
+
// 存储季度字符串
|
|
3081
|
+
const quarters = [];
|
|
3082
|
+
// 逐一遍历每个季度
|
|
3083
|
+
for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(3, "months")) {
|
|
3084
|
+
const year = currentDate.year();
|
|
3085
|
+
const quarter = Math.ceil((currentDate.month() + 1) / 3); // 计算季度
|
|
3086
|
+
quarters.push(`${year}${delimiter}Q${quarter}`); // 格式化并添加到数组
|
|
3087
|
+
}
|
|
3088
|
+
// 输出所有季度
|
|
3089
|
+
quarters.forEach((quarter, index) => {
|
|
3090
|
+
result[quarter] = [];
|
|
3091
|
+
});
|
|
3092
|
+
dates.forEach((date, index) => {
|
|
3093
|
+
const year = date.year();
|
|
3094
|
+
const quarter = date.quarter(); // 获取季度
|
|
3095
|
+
if (quarter === 1)
|
|
3096
|
+
result[year + delimiter + "Q1"].push(timeArray[index]);
|
|
3097
|
+
else if (quarter === 2)
|
|
3098
|
+
result[year + delimiter + "Q2"].push(timeArray[index]);
|
|
3099
|
+
else if (quarter === 3)
|
|
3100
|
+
result[year + delimiter + "Q3"].push(timeArray[index]);
|
|
3101
|
+
else if (quarter === 4)
|
|
3102
|
+
result[year + delimiter + "Q4"].push(timeArray[index]);
|
|
3103
|
+
});
|
|
3104
|
+
}
|
|
3105
|
+
else if (interval === "month") {
|
|
3106
|
+
// 存储月份字符串
|
|
3107
|
+
const months = [];
|
|
3108
|
+
// 逐一遍历每个月
|
|
3109
|
+
for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(1, "months")) {
|
|
3110
|
+
months.push(currentDate.format(`YYYY${delimiter}MM`)); // 格式化并添加到数组
|
|
3111
|
+
}
|
|
3112
|
+
// 输出所有月份
|
|
3113
|
+
months.forEach((month, index) => {
|
|
3114
|
+
result[month] = [];
|
|
3115
|
+
});
|
|
3116
|
+
dates.forEach((date, index) => {
|
|
3117
|
+
const year = date.year();
|
|
3118
|
+
const month = (date.month() + 1).toString().padStart(2, "0"); // 0-11
|
|
3119
|
+
result[year + delimiter + month].push(timeArray[index]);
|
|
3120
|
+
});
|
|
3121
|
+
}
|
|
3122
|
+
return result;
|
|
3123
|
+
}
|
|
3124
|
+
/**
|
|
3125
|
+
* 计算几何算数平方更
|
|
3126
|
+
* @param values 数组 [0, 0, 0.2575]
|
|
3127
|
+
* @returns
|
|
3128
|
+
*/
|
|
3129
|
+
calculateGrowthRate(values) {
|
|
3130
|
+
const product = values.reduce((acc, val) => acc * (1 + val), 1);
|
|
3131
|
+
if (product >= 0) {
|
|
3132
|
+
return Math.pow(product, 1 / values.length) - 1;
|
|
3133
|
+
}
|
|
3134
|
+
else if (product < 0) {
|
|
3135
|
+
if (values.length % 2 == 0) {
|
|
3136
|
+
return null;
|
|
3137
|
+
}
|
|
3138
|
+
else {
|
|
3139
|
+
return this.nthroot(product, values.length) - 1;
|
|
3140
|
+
}
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
nthroot(x, n) {
|
|
3144
|
+
let ng = n % 2;
|
|
3145
|
+
if (ng == 1 || x < 0)
|
|
3146
|
+
x = -x;
|
|
3147
|
+
var r = Math.pow(x, 1 / n);
|
|
3148
|
+
n = Math.pow(r, n);
|
|
3149
|
+
if (Math.abs(x - n) < 1 && x > 0 === n > 0)
|
|
3150
|
+
return ng ? -r : r;
|
|
3151
|
+
}
|
|
3152
|
+
/**
|
|
3153
|
+
* 标准偏差
|
|
3154
|
+
* @param values 数组 [0, 0, -0.4775]
|
|
3155
|
+
* @returns 0.2756847535380463
|
|
3156
|
+
*/
|
|
3157
|
+
calculateStandardDeviation(values) {
|
|
3158
|
+
const n = values.length;
|
|
3159
|
+
// 检查数据点数量
|
|
3160
|
+
if (n < 2) {
|
|
3161
|
+
throw new Error("至少需要两个数据点来计算样本标准偏差");
|
|
3162
|
+
}
|
|
3163
|
+
// 计算均值
|
|
3164
|
+
const mean = values.reduce((acc, val) => acc + val, 0) / n;
|
|
3165
|
+
// 计算方差
|
|
3166
|
+
const variance = values.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
|
|
3167
|
+
(n - 1);
|
|
3168
|
+
// 返回标准偏差
|
|
3169
|
+
return Math.sqrt(variance);
|
|
3170
|
+
}
|
|
3171
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotComponent, deps: [{ token: i1.DashboardPorletsService }, { token: i2.DashboardService }, { token: i0.ChangeDetectorRef }, { token: PBF_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
3172
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GadgetPivotComponent, selector: "rs-gadget-pivot", inputs: { portlet: "portlet", dashboard: "dashboard", portlets: "portlets" }, providers: [
|
|
3173
|
+
ToolbarService,
|
|
3174
|
+
FieldListService,
|
|
3175
|
+
NumberFormattingService,
|
|
3176
|
+
CalculatedFieldService,
|
|
3177
|
+
GroupingBarService,
|
|
3178
|
+
VirtualScrollService,
|
|
3179
|
+
DrillThroughService,
|
|
3180
|
+
], viewQueries: [{ propertyName: "pivotObj", first: true, predicate: ["pivotview"], descendants: true }, { propertyName: "fieldlistObj", first: true, predicate: ["pivotfieldlist"], descendants: true }], ngImport: i0, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t[gridSettings]=\"gridSettings\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(queryCellInfo)=\"customiseCell($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t\t(dataBound)='ondataBound()'\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: ["::ng-deep .e-pivotview .e-gridcontent tr:nth-child(2n) .e-leftfreeze.e-freezeleftborder:not(.e-gtot){background-color:#fff}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:12px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}::ng-deep .e-pivotfieldlist-container .e-footer-content .e-checkbox-layout{display:none}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-grid .e-gridheader .e-headercell .e-sortfilterdiv,:host ::ng-deep .control-section .e-treegrid .e-gridheader .e-headercell .e-sortfilterdiv{right:0}:host ::ng-deep .control-section .header-align-right .e-headercelldiv{text-align:right!important;justify-content:flex-end!important;padding-right:28px!important}:host ::ng-deep .control-section .header-align-right .e-headercelldiv .e-pivotcell-container{width:100%}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#fff!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important;border-color:#eff1f3!important}:host ::ng-deep .control-section .e-gridheader{border-top:none!important;border-color:#eff1f3!important;background-color:#fff!important}:host ::ng-deep .control-section .e-headertext{font-weight:400!important;color:#43566c!important}::ng-deep .e-pivot-treeview-outer li .e-text-content .e-list-text{margin-bottom:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PivotViewComponent, selector: "ejs-pivotview", inputs: ["aggregateTypes", "allowCalculatedField", "allowConditionalFormatting", "allowDataCompression", "allowDeferLayoutUpdate", "allowDrillThrough", "allowExcelExport", "allowGrouping", "allowNumberFormatting", "allowPdfExport", "cellTemplate", "chartSettings", "chartTypes", "cssClass", "dataSourceSettings", "displayOption", "editSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePaging", "enablePersistence", "enableRtl", "enableValueSorting", "enableVirtualization", "exportAllPages", "gridSettings", "groupingBarSettings", "height", "hyperlinkSettings", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "maxRowsInDrillThrough", "pageSettings", "pagerSettings", "pivotValues", "showFieldList", "showGroupingBar", "showToolbar", "showTooltip", "showValuesButton", "spinnerTemplate", "toolbar", "toolbarTemplate", "tooltipTemplate", "virtualScrollSettings", "width"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeExport", "beforeServiceInvoke", "beginDrillThrough", "calculatedFieldCreate", "cellClick", "cellSelected", "cellSelecting", "chartSeriesCreated", "conditionalFormatting", "created", "dataBound", "destroyed", "drill", "drillThrough", "editCompleted", "enginePopulated", "enginePopulating", "exportComplete", "fetchReport", "fieldDragStart", "fieldDrop", "fieldListRefreshed", "fieldRemove", "hyperlinkCellClick", "load", "loadReport", "memberEditorOpen", "memberFiltering", "newReport", "numberFormatting", "onFieldDropped", "onHeadersSort", "onPdfCellRender", "removeReport", "renameReport", "saveReport", "toolbarClick", "toolbarRender"] }, { kind: "component", type: i4.PivotFieldListComponent, selector: "ejs-pivotfieldlist", inputs: ["aggregateTypes", "allowCalculatedField", "allowDeferLayoutUpdate", "cssClass", "currencyCode", "dataSourceSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePersistence", "enableRtl", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "renderMode", "showValuesButton", "spinnerTemplate", "target"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeServiceInvoke", "calculatedFieldCreate", "created", "dataBound", "destroyed", "enginePopulated", "enginePopulating", "fieldDragStart", "fieldDrop", "fieldRemove", "load", "memberEditorOpen", "memberFiltering", "onFieldDropped", "onHeadersSort"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3181
|
+
}
|
|
3182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotComponent, decorators: [{
|
|
3183
|
+
type: Component,
|
|
3184
|
+
args: [{ selector: "rs-gadget-pivot", providers: [
|
|
3185
|
+
ToolbarService,
|
|
3186
|
+
FieldListService,
|
|
3187
|
+
NumberFormattingService,
|
|
3188
|
+
CalculatedFieldService,
|
|
3189
|
+
GroupingBarService,
|
|
3190
|
+
VirtualScrollService,
|
|
3191
|
+
DrillThroughService,
|
|
3192
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t[gridSettings]=\"gridSettings\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(queryCellInfo)=\"customiseCell($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t\t(dataBound)='ondataBound()'\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: ["::ng-deep .e-pivotview .e-gridcontent tr:nth-child(2n) .e-leftfreeze.e-freezeleftborder:not(.e-gtot){background-color:#fff}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:12px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}::ng-deep .e-pivotfieldlist-container .e-footer-content .e-checkbox-layout{display:none}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-grid .e-gridheader .e-headercell .e-sortfilterdiv,:host ::ng-deep .control-section .e-treegrid .e-gridheader .e-headercell .e-sortfilterdiv{right:0}:host ::ng-deep .control-section .header-align-right .e-headercelldiv{text-align:right!important;justify-content:flex-end!important;padding-right:28px!important}:host ::ng-deep .control-section .header-align-right .e-headercelldiv .e-pivotcell-container{width:100%}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#fff!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important;border-color:#eff1f3!important}:host ::ng-deep .control-section .e-gridheader{border-top:none!important;border-color:#eff1f3!important;background-color:#fff!important}:host ::ng-deep .control-section .e-headertext{font-weight:400!important;color:#43566c!important}::ng-deep .e-pivot-treeview-outer li .e-text-content .e-list-text{margin-bottom:0!important}\n"] }]
|
|
3193
|
+
}], ctorParameters: function () { return [{ type: i1.DashboardPorletsService }, { type: i2.DashboardService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
3194
|
+
type: Optional
|
|
3195
|
+
}, {
|
|
3196
|
+
type: Inject,
|
|
3197
|
+
args: [PBF_TOKEN]
|
|
3198
|
+
}] }]; }, propDecorators: { portlet: [{
|
|
3199
|
+
type: Input
|
|
3200
|
+
}], dashboard: [{
|
|
3201
|
+
type: Input
|
|
3202
|
+
}], portlets: [{
|
|
3203
|
+
type: Input
|
|
3204
|
+
}], pivotObj: [{
|
|
3205
|
+
type: ViewChild,
|
|
3206
|
+
args: ["pivotview", { static: false }]
|
|
3207
|
+
}], fieldlistObj: [{
|
|
3208
|
+
type: ViewChild,
|
|
3209
|
+
args: ["pivotfieldlist", { static: false }]
|
|
3210
|
+
}] } });
|
|
3211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhaXNlLWNvbW1vbi1saWIvc3JjL2xpYi9kYXNoYm9hcmQvZ2FkZ2V0LWdyb3VwL2dhZGdldC1waXZvdC9nYWRnZXQtcGl2b3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFpc2UtY29tbW9uLWxpYi9zcmMvbGliL2Rhc2hib2FyZC9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXBpdm90L2dhZGdldC1waXZvdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFDTixRQUFRLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQU1OLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUV0QixrQkFBa0IsRUFHbEIsb0JBQW9CLEVBSXBCLG1CQUFtQixHQUduQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFDTixJQUFJLEVBQ0osWUFBWSxFQUNaLE9BQU8sR0FDUCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sSUFBSSxPQUFPLEVBQ2pCLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sR0FDTixNQUFNLFFBQVEsQ0FBQztBQUVoQixPQUFPLEVBQ04sb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUVuQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3REFBd0QsQ0FB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SztnQkFVRSxRQUFRO3NCQURmLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHbEMsWUFBWTtzQkFEbEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdENoYW5nZURldGVjdG9yUmVmLFxyXG5cdENvbXBvbmVudCxcclxuXHRJbnB1dCxcclxuXHRPbkluaXQsXHJcblx0Vmlld0NoaWxkLFxyXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG5cdEluamVjdCxcclxuXHRPcHRpb25hbCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtcclxuXHRJRGF0YU9wdGlvbnMsXHJcblx0UGl2b3RGaWVsZExpc3RDb21wb25lbnQsXHJcblx0UGl2b3RWaWV3Q29tcG9uZW50LFxyXG5cdEVuZ2luZVBvcHVsYXRlZEV2ZW50QXJncyxcclxuXHRJRGF0YVNldCxcclxuXHRUb29sYmFyU2VydmljZSxcclxuXHRGaWVsZExpc3RTZXJ2aWNlLFxyXG5cdE51bWJlckZvcm1hdHRpbmdTZXJ2aWNlLFxyXG5cdENhbGN1bGF0ZWRGaWVsZFNlcnZpY2UsXHJcblx0Q2FsY3VsYXRlZEZpZWxkQ3JlYXRlRXZlbnRBcmdzLFxyXG5cdEdyb3VwaW5nQmFyU2VydmljZSxcclxuXHRGaWVsZERyb3BFdmVudEFyZ3MsXHJcblx0SVNvcnQsXHJcblx0VmlydHVhbFNjcm9sbFNlcnZpY2UsXHJcblx0SVBpdm90VmFsdWVzLFxyXG5cdElQYWdlU2V0dGluZ3MsXHJcblx0RHJpbGxUaHJvdWdoRXZlbnRBcmdzLFxyXG5cdERyaWxsVGhyb3VnaFNlcnZpY2UsXHJcblx0UGl2b3RBY3Rpb25GYWlsdXJlRXZlbnRBcmdzLFxyXG5cdFF1ZXJ5Q2VsbEluZm9FdmVudEFyZ3MsXHJcbn0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLXBpdm90dmlld1wiO1xyXG5pbXBvcnQge1xyXG5cdEwxMG4sXHJcblx0ZW5hYmxlUmlwcGxlLFxyXG5cdEJyb3dzZXIsXHJcbn0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1iYXNlXCI7XHJcbmltcG9ydCB7IEdyaWRTZXR0aW5ncyB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItcGl2b3R2aWV3L3NyYy9waXZvdHZpZXcvbW9kZWwvZ3JpZHNldHRpbmdzXCI7XHJcbmltcG9ydCB7XHJcblx0c29ydEJ5LFxyXG5cdGRpZmZlcmVuY2VXaXRoLFxyXG5cdHN0YXJ0c1dpdGgsXHJcblx0Y2xvbmVEZWVwLFxyXG5cdHVuaXFCeSxcclxuXHRmaWx0ZXIgYXMgX2ZpbHRlcixcclxuXHRtYXhCeSxcclxuXHRtaW5CeSxcclxuXHRzdW1CeSxcclxuXHRtZWFuQnksXHJcbn0gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcblx0QUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0QUxMX0FHR1JFR0FURV9UWVBFUyxcclxuXHREYXNoYm9hcmRQb3JsZXRzU2VydmljZSxcclxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE1hc2tlZFRleHRCb3ggfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWlucHV0cy9zcmMvbWFza2VkdGV4dGJveC9tYXNrZWR0ZXh0Ym94XCI7XHJcbmltcG9ydCB7IERhdGFNYW5hZ2VyIH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhL3NyYy9tYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFByZWRpY2F0ZSwgUXVlcnkgfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWRhdGEvc3JjL3F1ZXJ5XCI7XHJcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgeyBQQkZfVE9LRU4gfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZS9JbmplY3Rpb25Ub2tlblwiO1xyXG5cclxuZW5hYmxlUmlwcGxlKGZhbHNlKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiBcInJzLWdhZGdldC1waXZvdFwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5odG1sXCIsXHJcblx0c3R5bGVVcmxzOiBbXCIuL2dhZGdldC1waXZvdC5jb21wb25lbnQuc2Nzc1wiXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdFRvb2xiYXJTZXJ2aWNlLFxyXG5cdFx0RmllbGRMaXN0U2VydmljZSxcclxuXHRcdE51bWJlckZvcm1hdHRpbmdTZXJ2aWNlLFxyXG5cdFx0Q2FsY3VsYXRlZEZpZWxkU2VydmljZSxcclxuXHRcdEdyb3VwaW5nQmFyU2VydmljZSxcclxuXHRcdFZpcnR1YWxTY3JvbGxTZXJ2aWNlLFxyXG5cdFx0RHJpbGxUaHJvdWdoU2VydmljZSxcclxuXHRdLFxyXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2FkZ2V0UGl2b3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIHBvcnRsZXQ7XHJcblx0QElucHV0KCkgZGFzaGJvYXJkO1xyXG5cdEBJbnB1dCgpIHBvcnRsZXRzO1xyXG5cdHByaXZhdGUgUGl2b3RfRGF0YTogSURhdGFTZXRbXTtcclxuXHRwcml2YXRlIGNvbmZpZztcclxuXHRwdWJsaWMgZGF0YVNvdXJjZVNldHRpbmdzOiBJRGF0YU9wdGlvbnM7XHJcblx0cHVibGljIGdyaWRTZXR0aW5nczogR3JpZFNldHRpbmdzO1xyXG5cdHByaXZhdGUgZXhjbHVkZUZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgZmlsdGVyU2V0dGluZ3MgPSBbXTtcclxuXHRwcml2YXRlIGRhdGVQaXBlRm9ybWF0O1xyXG5cdHB1YmxpYyB0cmFuc2xhdGlvbjtcclxuXHRAVmlld0NoaWxkKFwicGl2b3R2aWV3XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHByaXZhdGUgcGl2b3RPYmo6IFBpdm90Vmlld0NvbXBvbmVudDtcclxuXHRAVmlld0NoaWxkKFwicGl2b3RmaWVsZGxpc3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGZpZWxkbGlzdE9iajogUGl2b3RGaWVsZExpc3RDb21wb25lbnQ7XHJcblx0cHJpdmF0ZSBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKTtcclxuXHRwcml2YXRlIGdyYW5kVG90YWxzID0ge307XHJcblx0cHJpdmF0ZSBzdWJUb3RhbHMgPSB7fTtcclxuXHRwcml2YXRlIGZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIHByZXZpb3VzU29ydDogSVNvcnQ7XHJcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cdHByaXZhdGUgYWxsRGF0YVZhbHVlO1xyXG5cdC8vIHByaXZhdGUgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3M7XHJcblx0cHJpdmF0ZSBpc0luaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdHByaXZhdGUgcGl2b3RTZWFyY2hCb3g6IE1hc2tlZFRleHRCb3g7XHJcblx0cHVibGljIHRvb2x0aXBTZXR0aW5ncyA9IHtcclxuXHRcdGVuYWJsZTogZmFsc2UsXHJcblx0fTtcclxuXHRwcml2YXRlIGNvbHVtblRleHRzID0gW107XHJcblx0cHJpdmF0ZSBjb25maWdGaWVsZHMgPSBbXTtcclxuXHRwcml2YXRlIHF1YXJ0ZXJGb3JtYXQgPSBbXHJcblx0XHR7IHZhbHVlOiBcIjAzLzIwMjFcIiwgZm9ybWF0OiBcIk1NL3l5eXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCIwMy8yMVwiLCBmb3JtYXQ6IFwiTU0vZGRcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCIzLzIwMjFcIiwgZm9ybWF0OiBcIk0veXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIjMvMjFcIiwgZm9ybWF0OiBcIk0veXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCJNYXJjaCAyMDIxXCIsIGZvcm1hdDogXCJNTU1NIHl5eXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCJNYXIsIDIwMjFcIiwgZm9ybWF0OiBcIk1NTSwgeXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIk1hcmNoLCAyMDIxXCIsIGZvcm1hdDogXCJNTU1NLCB5eXl5XCIgfSxcclxuXHRcdHsgdmFsdWU6IFwiMjAyMVwiLCBmb3JtYXQ6IFwieXl5eVwiIH0sXHJcblx0XTtcclxuXHR6b29tU2V0dGluZ3MgPSB7XHJcblx0XHRlbmFibGU6IGZhbHNlLFxyXG5cdH07XHJcblx0aXRlbURhdGFUeXBlU29ydEFyciA9IFtcclxuXHRcdFwiQXNzZXRzXCIsXHJcblx0XHRcIkxpYWJpbGl0aWVzXCIsXHJcblx0XHRcIkVxdWl0eVwiLFxyXG5cdFx0XCJQJkxcIixcclxuXHRcdFwiQ2FzaGZsb3dcIixcclxuXHRdO1xyXG5cdHByaXZhdGUgZm9ybWF0RGF0ZXMgPSBbXTtcclxuXHRwcml2YXRlIGN1c3RvbUNhbGN1bGF0ZWRGaWVsZHM6IGFueVtdID0gW107IC8vIOiHquWumuS5ieiuoeeul+WIl1xyXG5cdHByaXZhdGUgYWxsb3dlZENhbGN1bGF0ZWRGaWVsZHM6IGFueVtdID0gW107IC8vIOWFgeiuuOiHquWumuS5ieeul+azleeahOWtl+autVxyXG5cdHByaXZhdGUgemVyb0Zvcm1hdERhdGEgPSB7XHJcblx0XHRlbXB0eUxpc3Q6IFtdLFxyXG5cdFx0aGdMaXN0OiBbXSxcclxuXHR9O1xyXG5cdHByaXZhdGUgbWlsbGlvbkZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgdGVtcFN1YnRvdGFscyA9IFtdO1xyXG5cdHB1YmxpYyBvcmRlckJ5Q29sdW1uczsgLy8gRWc6IFwiRHVlRGF0ZSwgU2VxdWVuY2VcIlxyXG5cdHB1YmxpYyBpc0FwcGx5SVJSOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHVibGljIGNhbGNJUlJEYXRhOiBhbnk7XHJcblx0cHJpdmF0ZSBwZXJjZW50TnVtRmllbGRzID0gW107XHJcblx0cHVibGljIHBhZ2VMb2FkaW5nO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2U6IERhc2hib2FyZFBvcmxldHNTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChQQkZfVE9LRU4pIHByaXZhdGUgcGJmOiBhbnksXHJcblxyXG5cdCkge31cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmdldEluZm8oKTtcclxuXHRcdEwxMG4ubG9hZCh7XHJcblx0XHRcdFwiZW4tVVNcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHR6aDoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcInpoLUhhbnQtSEtcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRqYToge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRrbzoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRmcjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmdldERhdGEoKTtcclxuXHR9XHJcblxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0Y2hhbmdlUGl2b3QoKS5zdWJzY3JpYmUoKHVwZGF0ZWQpID0+IHtcclxuXHRcdFx0XHRpZiAodXBkYXRlZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGEoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0U3RhcnRSZWZyZXNoKCkuc3Vic2NyaWJlKChkYXNoYm9hcmRJZCkgPT4ge1xyXG5cdFx0XHRcdGlmIChkYXNoYm9hcmRJZCA9PT0gdGhpcy5kYXNoYm9hcmQuaWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldFVwZGF0ZWQoKS5zdWJzY3JpYmUoKG5ld0lkKSA9PiB7XHJcblx0XHRcdFx0aWYgKG5ld0lkID09PSB0aGlzLnBvcnRsZXQubmV3SWQgfHwgbmV3SWQgPT09IHRoaXMucG9ydGxldC5pZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5nZXREYXRhKCk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZS5nZXRSZWZyZXNoR2FkZ2V0KCkuc3Vic2NyaWJlKChlKSA9PiB7XHJcblx0XHRcdFx0aWYgKCFlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGlkID0gZVtcIm5ld0lkXCJdO1xyXG5cdFx0XHRcdGlmIChpZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkIHx8IGlkID09PSB0aGlzLnBvcnRsZXQuaWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0RGF0YSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZS5nZXRUYWJsZUZvcm1hdCgpLnN1YnNjcmliZSgodXBkYXRlZCkgPT4ge1xyXG5cdFx0XHRcdGlmICh1cGRhdGVkID09PSB0aGlzLnBvcnRsZXQubmV3SWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0RGF0YSgpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopIHRoaXMucGl2b3RPYmoucmVmcmVzaERhdGEoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2VcclxuXHRcdFx0XHQuY2xlYXJGaWVsZExpc3RPYnNlcnZhYmxlKClcclxuXHRcdFx0XHQuc3Vic2NyaWJlKCh1cGRhdGVkKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAodXBkYXRlZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmRhdGFTb3VyY2UgPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopIHRoaXMucGl2b3RPYmoucmVmcmVzaERhdGEoKTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZURhdGFTb3VyY2UoKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyB0aXRsZSBjaGFuZ2VcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UudXBkYXRlUG9ydGxldFRpdGxlKCkuc3Vic2NyaWJlKCh1cGRhdGVkKSA9PiB7XHJcblx0XHRcdFx0aWYgKHVwZGF0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLnBvcnRsZXQuY29uZmlnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcblx0fVxyXG5cclxuXHRvbk1lbWJlckVkaXRvck9wZW4oYXJnczogYW55KTogdm9pZCB7XHJcblx0XHQvLyDkvaDlj6/ku6XlnKjov5nph4zmoLnmja7pnIDopoHkv67mlLlhcmdz5p2l6Ieq5a6a5LmJ6L+H5ruk56qX5Y+j55qE6KGM5Li6XHJcblx0XHQvLyAxMTI0NyDkuJPpl6jkuLppdGVtIGRhdGEgdHlwZeiAjOiuvue9rlxyXG5cdFx0aWYgKGFyZ3MuZmllbGROYW1lID09PSBcIkFjY291bnRUeXBlQ29kZVwiKSB7XHJcblx0XHRcdGxldCByZXMgPSBuZXcgQXJyYXkoNSkuZmlsbChudWxsKTtcclxuXHRcdFx0Y29uc3QgZmllbGRNZW1iZXJzID0gWy4uLmFyZ3MuZmllbGRNZW1iZXJzXTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSBmaWVsZE1lbWJlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHRsZXQgaW5kZXggPSAtMTtcclxuXHRcdFx0XHRjb25zdCBpdGVtID0gdGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyLmZpbmQoKG5hbWUsIGluZCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lKSB7XHJcblx0XHRcdFx0XHRcdGluZGV4ID0gaW5kO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmICghaXRlbSkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZpbGxJdGVtID0gZmllbGRNZW1iZXJzLnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRyZXNbaW5kZXhdID0gZmlsbEl0ZW1bMF07XHJcblx0XHRcdH1cclxuXHRcdFx0cmVzID0gcmVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSkgfHwgW107XHJcblx0XHRcdGFyZ3MuZmllbGRNZW1iZXJzID0gWy4uLnJlcywgLi4uZmllbGRNZW1iZXJzXTtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5lLW1lbWJlci1lZGl0b3ItZGlhbG9nXCIpO1xyXG5cdFx0XHRcdGlmIChlbGUpIHtcclxuXHRcdFx0XHRcdGVsZS5xdWVyeVNlbGVjdG9yKFwiLmUtZmlsdGVyLXNvcnRcIikuc2V0QXR0cmlidXRlKFxyXG5cdFx0XHRcdFx0XHRcInN0eWxlXCIsXHJcblx0XHRcdFx0XHRcdFwiZGlzcGxheTogbm9uZVwiXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNldEdyaWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuZ3JpZFNldHRpbmdzID0ge1xyXG5cdFx0XHRjb2x1bW5XaWR0aDogMTQwLFxyXG5cdFx0XHRyb3dIZWlnaHQ6IDQwLFxyXG5cdFx0XHRhbGxvd1NlbGVjdGlvbjogdHJ1ZSxcclxuXHRcdFx0c2VsZWN0aW9uU2V0dGluZ3M6IHtcclxuXHRcdFx0XHRtb2RlOiBcIkNlbGxcIixcclxuXHRcdFx0XHR0eXBlOiBcIk11bHRpcGxlXCIsXHJcblx0XHRcdFx0Y2VsbFNlbGVjdGlvbk1vZGU6IFwiQm94XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdGNvbHVtblJlbmRlcjogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJncykgPT4ge1xyXG5cdFx0XHRcdHRoaXMuc2V0Q29sdW1uc1JlbmRlcihhcmdzKTtcclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0XHQvLyDljYfnuqflkI4g6buY6K6k5Lya5pyJ5a+85Ye65qC35byP6KaG55uW77yM6ZyA6KaB5omL5Yqo6K6+572u5a+85Ye65qCH6aKY5qC35byPXHJcblx0XHRcdGV4Y2VsSGVhZGVyUXVlcnlDZWxsSW5mbzogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJnczogYW55KSA9PiB7XHJcblx0XHRcdFx0Ly8gYXJncy5zdHlsZeaYr+S4qkV4Y2VsU3R5bGXnsbvlnotcclxuXHRcdFx0XHRhcmdzLnN0eWxlID0ge1xyXG5cdFx0XHRcdFx0Ym9sZDogdHJ1ZSwgLy8g5a2X5L2T5Yqg57KXXHJcblx0XHRcdFx0XHR2QWxpZ246IFwiQ2VudGVyXCIsXHJcblx0XHRcdFx0XHR3cmFwVGV4dDogZmFsc2UsIC8vIOS4jeaNouihjFxyXG5cdFx0XHRcdFx0aW5kZW50OiAwLFxyXG5cdFx0XHRcdFx0Ym9yZGVyczogbnVsbCwgLy8g5LiN6ZyA6KaBYm9yZGVyXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0XHQvLyDljYfnuqflkI4g6buY6K6k5Lya5pyJ5a+85Ye65qC35byP6KaG55uW77yM6ZyA6KaB5omL5Yqo6K6+572u5a+85Ye65YaF5a655qC35byPXHJcblx0XHRcdGV4Y2VsUXVlcnlDZWxsSW5mbzogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJnczogYW55KSA9PiB7XHJcblx0XHRcdFx0Ly8gI2Y0ODZjZmZmIOi/memHjOi+k+WHuueahOaYr1JHQkEg6aKc6Imy5qC85byP77yMIHhsc3jph4zkuI3pnIDopoHpgI/mmI7luqYs5Y675o6J5bC+6YOoZmZcclxuXHRcdFx0XHRpZiAoYXJncy5zdHlsZSAmJiBhcmdzLnN0eWxlLmJhY2tDb2xvcikge1xyXG5cdFx0XHRcdFx0YXJncy5zdHlsZS5iYWNrQ29sb3IgPSBhcmdzLnN0eWxlLmJhY2tDb2xvci5zdWJzdHJpbmcoMCwgNyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxldCBfc3R5bGU6IGFueSA9IHtcclxuXHRcdFx0XHRcdGJvbGQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0d3JhcFRleHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Ym9yZGVyczogbnVsbCxcclxuXHRcdFx0XHRcdGZvbnRDb2xvcjogYXJncy5zdHlsZS5mb250Q29sb3IsXHJcblx0XHRcdFx0XHRiYWNrQ29sb3I6IGFyZ3Muc3R5bGUuYmFja0NvbG9yLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0bGV0IGNvbEluZGV4ID0gYXJncy5jZWxsLmNvbEluZGV4O1xyXG5cdFx0XHRcdGxldCByb3dJbmRleCA9IGFyZ3MuY2VsbC5yb3dJbmRleDtcclxuXHRcdFx0XHRpZiAodGhpcy5jb25maWcuc2hvd0dyYW5kVG90YWxzKSB7XHJcblx0XHRcdFx0XHQvLyBHcmFuZFRvdGFs5LiN6ZyA6KaB6aKc6ImyXHJcblx0XHRcdFx0XHRpZiAoYXJncy5kYXRhLmxlbmd0aCA9PT0gcm93SW5kZXggKyAxKSB7XHJcblx0XHRcdFx0XHRcdGRlbGV0ZSBfc3R5bGUuZm9udENvbG9yO1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgX3N0eWxlLmJhY2tDb2xvcjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFyZ3MuZGF0YVtyb3dJbmRleF1bY29sSW5kZXhdLmZvcm1hdHRlZFRleHQgPT0gXCJcIikge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGFyZ3Muc3R5bGUgPSBPYmplY3QuYXNzaWduKGFyZ3Muc3R5bGUsIF9zdHlsZSk7XHJcblx0XHRcdFx0aWYgKGFyZ3MudmFsdWUgPT09IFwiXCIgJiYgYXJncy5zdHlsZS5udW1iZXJGb3JtYXQpIHtcclxuXHRcdFx0XHRcdGFyZ3Muc3R5bGUubnVtYmVyRm9ybWF0ID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHRoaXMuZm9ybWF0RGF0ZXMgJiYgdGhpcy5mb3JtYXREYXRlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGxldCBkYXRlRmllbGRzID0gdGhpcy5mb3JtYXREYXRlcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBlbC5uYW1lO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdChhcmdzIGFzIGFueSkudmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0KChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PT0gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZGF0ZUZpZWxkcy5pbmNsdWRlcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jZWxsLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBkYXRlRmllbGRzLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgKSlcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvL0N1c3RvbWl6ZSB0aGUgUm93IGhlYWRlcnMvQ29sdW1uIGhlYWRlcnMgYmFzZWQgb24geW91ciBuZWVkc1xyXG5cdFx0XHRcdFx0XHRsZXQgaGVhZGVycztcclxuXHRcdFx0XHRcdFx0aWYgKChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSAoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBoZWFkZXJzID0gcGl2b3RWYWx1ZXNba11bal0uZm9ybWF0dGVkVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzID0gKGFyZ3MgYXMgYW55KS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoaGVhZGVycykge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRlID0gbmV3IERhdGUoaGVhZGVycyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBxdWFydGVyID0gTWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBmb3JtYXQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZm9ybWF0RGF0ZXMubWFwKChlbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jZWxsLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBlbC5mb3JtYXQ7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwubmFtZSA9PSAoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gZWwuZm9ybWF0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdChhcmdzIGFzIGFueSkudmFsdWUgPSB0aGlzLmdldFF1YXJ0ZXJWYWx1ZShcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGUsXHJcblx0XHRcdFx0XHRcdFx0XHRxdWFydGVyXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0fSBhcyBHcmlkU2V0dGluZ3M7XHJcblx0fVxyXG5cclxuXHRiZWZvcmVFeHBvcnQoZXhwb3J0RGF0YSkge1xyXG5cdFx0aWYgKGV4cG9ydERhdGEpIHtcclxuXHRcdFx0Y29uc3Qga2V5TWFwID0ge307XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzLmZvcm1hdFNldHRpbmdzLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRkYXRhLmZvcm1hdCA9PT0gXCIjLCMjIywsLjA7KCMsIyMjLCwuMClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLDsoIywjIyMsLClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLC4wMDsoIywjIyMsLC4wMClcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0a2V5TWFwW2RhdGEubmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9ucyAmJlxyXG5cdFx0XHRcdGV4cG9ydERhdGEuZGF0YUNvbGxlY3Rpb25zLmxlbmd0aFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9uc1swXS5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdHJvdy5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChrZXlNYXBbY2VsbC5hY3R1YWxUZXh0XSkge1xyXG5cdFx0XHRcdFx0XHRcdGNlbGwudmFsdWUgPSBjZWxsLmFjdHVhbFZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGNlbGwudmFsdWUgPT09IFwib2JqZWN0XCIgJiZcclxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgY2VsbC5mb3JtYXR0ZWRUZXh0ID09PSBcInN0cmluZ1wiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGNlbGwudmFsdWUgPSBjZWxsLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGdldERhdGEoKSB7XHJcblx0XHR0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcblx0XHRsZXQgY29sdW1ucyA9IFtdO1xyXG5cdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0bGV0IGZvcm1hdFNldHRpbmdzID0gW107XHJcblx0XHRsZXQgcm93cyA9IFtdO1xyXG5cdFx0bGV0IGZpZWxkTWFwcGluZyA9IFtdO1xyXG5cdFx0Ly8g5riF56m6Z3JhbmRUb3RhbHPlkoxzdWJUb3RhbHNcclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHR0aGlzLmNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wb3J0bGV0LmNvbmZpZyk7XHJcblx0XHR0aGlzLnNldEdyaWRTZXR0aW5ncygpO1xyXG5cdFx0aWYgKHRoaXMuY29uZmlnLmZpZWxkcykge1xyXG5cdFx0XHRpZiAodGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5hbGxGaWVsZHNPYmpbdGhpcy5wb3J0bGV0LmlkXSkge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnRmllbGRzID1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2Uuc2V0Q29uZmlnRmllbGRzKFxyXG5cdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmFsbEZpZWxkc09ialtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBvcnRsZXQuaWRcclxuXHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0dGhpcy5jb25maWcuZmllbGRzXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnRmllbGRzID0gWy4uLnRoaXMuY29uZmlnLmZpZWxkc107XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLlBpdm90X0RhdGEgPSB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldFJlc3VsdEJ5RGF0YVRhYmxlKFxyXG5cdFx0XHR0aGlzLnBvcnRsZXQsXHJcblx0XHRcdGZhbHNlLFxyXG5cdFx0XHRmYWxzZSxcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmQuaWRcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5vcmRlckJ5Q29sdW1ucyA9IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0T3JkZXJCeUNvbHVtbnNOZXcoXHJcblx0XHRcdHRoaXMucG9ydGxldC5maWd1cmVDb2RlLFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLlBpdm90X0RhdGEgPSBEYXRhVXRpbC5wYXJzZS5wYXJzZUpzb24odGhpcy5QaXZvdF9EYXRhKTtcclxuXHRcdGlmICh0aGlzLlBpdm90X0RhdGEgJiYgdGhpcy5QaXZvdF9EYXRhLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8g56e76Zmk5YiX5ZCN5ZKM5pWw5o2ua2V55LiN5Yy56YWN55qE6aG5XHJcblx0XHRcdHRoaXMuZ2V0ZXhjbHVkZUZpZWxkcyh0aGlzLmNvbmZpZ0ZpZWxkcywgdGhpcy5QaXZvdF9EYXRhWzBdKTtcclxuXHRcdFx0aWYgKCF0aGlzLmFsbG93ZWRDYWxjdWxhdGVkRmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZENhbGN1bGF0ZWRGaWVsZHMgPSBPYmplY3Qua2V5cyh0aGlzLlBpdm90X0RhdGFbMF0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWdGaWVsZHMpIHtcclxuXHRcdFx0XHQvLyDlrZfmrrXliIbnu4QgaHR0cHM6Ly9lajIuc3luY2Z1c2lvbi5jb20vYW5ndWxhci9kb2N1bWVudGF0aW9uL3Bpdm90dmlldy9maWVsZC1saXN0P3NlYXJjaD1maWVsZE1hcHBpbmcjZ3JvdXAtZmllbGRzLXVuZGVyLWRlc2lyZWQtZm9sZGVyLW5hbWVcclxuXHRcdFx0XHRmaWVsZE1hcHBpbmcucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRjYXB0aW9uOiBpdGVtLmFkZHRpb25OYW1lXHJcblx0XHRcdFx0XHRcdD8gYCR7aXRlbS5sYW5nVmFsdWV9ICR7aXRlbS5hZGR0aW9uTmFtZX1gXHJcblx0XHRcdFx0XHRcdDogaXRlbS5sYW5nVmFsdWVcclxuXHRcdFx0XHRcdFx0PyBpdGVtLmxhbmdWYWx1ZVxyXG5cdFx0XHRcdFx0XHQ6IHRoaXMudHJhbnNsYXRpb25baXRlbS5sYW5nQ29kZV0gfHwgaXRlbS5sYW5nQ29kZSxcclxuXHJcblx0XHRcdFx0XHRkYXRhVHlwZTogaXRlbS5kYXRhVHlwZSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuY29uZmlnRmllbGRzKSB7XHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmZvcm1hdERhdGVzID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuaGdMaXN0ID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0ID0gW107XHJcblx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0Ly8gU01QMi0yNDg2ICYgcGVyY2VudE51beeahGZvcm1hdOmXrumimFxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIikge1xyXG5cdFx0XHRcdFx0dGhpcy5wZXJjZW50TnVtRmllbGRzLnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQgJiZcclxuXHRcdFx0XHRcdFsyLCA1LCA4LCAxMSwgMTQsIDE3XS5pbmNsdWRlcyhlbC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0dGhpcy56ZXJvRm9ybWF0RGF0YS5oZ0xpc3QucHVzaChlbC5jb2xOYW1lKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRbMywgNiwgOSwgMTIsIDE1LCAxOF0uaW5jbHVkZXMoZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0LnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0Ly8gIHBpdm90VGFibGVmb3JtYXRQZXJjZW50IOeZvuWIhuavlOS5n+aciTEwLDExLDEyIOS9huaYr+Wug+aYr+aYvuekujAuMDB455qE5qC85byP77yM5omA5Lul5b6X5o6S6ZmkXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZWwuZGF0YVR5cGUgIT09IFwicGVyY2VudFwiICYmXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRbMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOF0uaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcy5wdXNoKGVsLmNvbE5hbWUpO1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmRhdGFUeXBlID09PSBcIm51bWJlclwiICYmXHJcblx0XHRcdFx0XHQoIWVsLmZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHQoZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCFlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb3JtYXREYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHQvL1NNUDItMzAyNiBhbmQgU01QMi0zMDU5XHJcblx0XHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0XHRlbC5jb2xOYW1lICE9PSBcIlBvcnRJbnZTdGtcIiAmJlxyXG5cdFx0XHRcdFx0XHRcdGVsLmNvbE5hbWUgIT09IFwiUG9ydEZkSW52U3RrXCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXROdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuZHBcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiBcIiMjMC4jIyMjIyMjMFwiLFxyXG5cdFx0XHRcdFx0XHR1c2VHcm91cGluZzogdHJ1ZSxcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KGVsLmRhdGFUeXBlID09PSBcInBlcmNlbnRcIiB8fFxyXG5cdFx0XHRcdFx0XHRlbC5kYXRhVHlwZSA9PT0gXCJwZXJjZW50TnVtXCIpICYmXHJcblx0XHRcdFx0XHQoIWVsLmZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHQoZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCFlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb3JtYXREYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmRhdGFUeXBlID09PSBcIm11bHRpcGxlXCIgJiZcclxuXHRcdFx0XHRcdCghZWwuZm9ybWF0IHx8XHJcblx0XHRcdFx0XHRcdChlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0IWVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkKSlcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdG5hbWU6IGVsLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRNdWx0aXBsZShcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IGVsLmRhdGFUeXBlID09PSBcImRhdGVcIikge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm1hdCA9IFwiXCI7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIlF1YXJ0ZXJcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmb3JtYXRfID0gZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0SW5mbyA9IHRoaXMucXVhcnRlckZvcm1hdC5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHQocXVyKSA9PiBxdXIudmFsdWUgPT0gZm9ybWF0X1xyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1hdEluZm8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBmb3JtYXRJbmZvWzBdLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBmb3JtYXRfLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmZvcm1hdERhdGVzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIkRhdGVcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmcm9tSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIihcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHRvSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIilcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZvcm1hdF8gPVxyXG5cdFx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5zbGljZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbUlkeCArIDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRvSWR4XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoZm9ybWF0Xykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC9NTS95eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQvTU0veXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NL2RkL3l5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS9kZC95eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWVlZLU1NLUREXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwieXl5eS1NTS1kZFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWS1NTS1ERFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcInl5LU1NLWRkXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTS15eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQtTU0teXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NLWRkLXl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS1kZC15eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJNTU0gREQsIFlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTU0gZGQsIHl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiREQtTU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTU0teXl5eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCFmb3JtYXQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXRlUGlwZUZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IGZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdC8vY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgZm9ybWF0IHB1c2ggdG8gZm9ybWF0U2V0dGluZ3NcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgJiZcclxuXHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLm1hcCgoZWwpID0+IHtcclxuXHRcdFx0XHRpZiAoZWwuZm9ybWF0U3RyaW5nICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gZm9ybWF0U2V0dGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1hdFNldHRpbmdzW2ldLm5hbWUgPT09IGVsLm5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IGVsLmZvcm1hdFN0cmluZyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRsZXQgc2VyaWVzID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzO1xyXG5cdFx0aWYgKHNlcmllcykge1xyXG5cdFx0XHRmb3IgKGxldCBpdGVtIG9mIHNlcmllcykge1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogaXRlbS5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0Y2FwdGlvbjogdGhpcy5nZXRDYXB0aW9uQnlOYW1lKGl0ZW0uY29sTmFtZSkgfHwgaXRlbS50aXRsZSxcclxuXHRcdFx0XHRcdHR5cGU6IGl0ZW0uY2FsTWV0aG9kLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dmFsdWVzLnB1c2godmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgZ3JvdXBzID0gdGhpcy5jb25maWcueGF4aXMuZ3JvdXBzO1xyXG5cdFx0aWYgKGdyb3Vwcykge1xyXG5cdFx0XHRmb3IgKGxldCBnaXRlbSBvZiBncm91cHMpIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gZ2l0ZW0ubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGdpdGVtLnNob3dTdWJUb3RhbHMgPSBmaWVsZFswXS5zaG93U3ViVG90YWxzO1xyXG5cdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0aW9uW2ZpZWxkWzBdLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRnaXRlbS5jYXB0aW9uIHx8XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdDb2RlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyb3dzLnB1c2goZ2l0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jb25maWcuY29sdW1uR3JvdXAgJiYgdGhpcy5jb25maWcuY29sdW1uR3JvdXAubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWcuY29sdW1uR3JvdXApIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gaXRlbS5uYW1lXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0aXRlbS5zaG93U3ViVG90YWxzID0gZmllbGRbMF0uc2hvd1N1YlRvdGFscztcclxuXHRcdFx0XHRcdGl0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0aW9uW2ZpZWxkWzBdLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nQ29kZSB8fFxyXG5cdFx0XHRcdFx0XHRpdGVtLmNhcHRpb247XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbHVtbnMucHVzaChpdGVtKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0bGV0IGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MgPSBbXTtcclxuXHRcdHRoaXMuY29uZmlnRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblx0XHRcdGlmIChmaWVsZC5mb3JtYXQgJiYgZmllbGQuZm9ybWF0Lmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChmaWVsZC5mb3JtYXRbMF0uZm9udFNldHRpbmdDaGVja2VkKSB7XHJcblx0XHRcdFx0XHRsZXQgY29uZGl0aW9uYWxGb3JtYXRPYmogPSB7XHJcblx0XHRcdFx0XHRcdGFwcGx5R3JhbmRUb3RhbHM6IHRydWUsXHJcblx0XHRcdFx0XHRcdG1lYXN1cmU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHZhbHVlMTogbnVsbCxcclxuXHRcdFx0XHRcdFx0dmFsdWUyOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25zOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRzdHlsZToge1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRmb250RmFtaWx5OiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGxldCBuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmogPSB7XHJcblx0XHRcdFx0XHRcdGFwcGx5R3JhbmRUb3RhbHM6IHRydWUsXHJcblx0XHRcdFx0XHRcdG1lYXN1cmU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHZhbHVlMTogbnVsbCxcclxuXHRcdFx0XHRcdFx0dmFsdWUyOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25zOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRzdHlsZToge1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRmb250RmFtaWx5OiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdC8vIGZvbnQgc2V0dGluZyBzdGFydFxyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLm1lYXN1cmUgPVxyXG5cdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLm1lYXN1cmUgPVxyXG5cdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5jb21wYXJlU2VsZWN0XHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRDb21wYXJlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0ZGVsZXRlIGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMjtcclxuXHRcdFx0XHRcdFx0ZGVsZXRlIG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTI7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTGVzc1RoYW5cIjtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0sXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdFNldHRpbmdzLnB1c2gobmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MudW5zaGlmdChjb25kaXRpb25hbEZvcm1hdE9iaik7XHJcblx0XHRcdFx0XHQvLyBmb250IHNldHRpbmcgZW5kXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxldCBmb3JtYXRTZXR0aW5nc09iaiA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IFwiXCIsXHJcblx0XHRcdFx0XHRmb3JtYXQ6IFwiXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRpZiAoZmllbGQuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQpIHtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLm5hbWUgPSBmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHN3aXRjaCAoZmllbGQuZm9ybWF0WzBdLmRhdGFUeXBlKSB7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJpbnRlZ2VyXCI6XHJcblx0XHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0ID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdEludGVnZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBcInBlcmNlbnROdW1cIjpcclxuXHRcdFx0XHRcdFx0Y2FzZSBcInBlcmNlbnRcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwibXVsdGlwbGVcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TXVsdGlwbGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcclxuXHRcdFx0XHRcdFx0Y2FzZSBcImRhdGV0aW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZvcm1hdCA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZpZWxkLmZvcm1hdCAmJiBmaWVsZC5mb3JtYXQubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmllbGQuZm9ybWF0WzBdLmRhdGVUeXBlID09IFwiUXVhcnRlclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZmllbGQuZm9ybWF0WzBdLmRhdGVUeXBlID09IFwiRGF0ZVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBmcm9tSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXREaXNwbGF5LmluZGV4T2YoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIihcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCB0b0lkeCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5pbmRleE9mKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuc2xpY2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmcm9tSWR4ICsgMSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvSWR4XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1hdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmogPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IGZpZWxkLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBmaWVsZC5kYXRhVHlwZSA9IFwic3RyaW5nXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9IHRoaXMuZGF0ZVBpcGVGb3JtYXQ7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09ialtcInR5cGVcIl0gPSBcImRhdGVcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5kYXRhVHlwZSAhPT0gXCJzdHJpbmdcIiAmJlxyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0XHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRmb3JtYXRTZXR0aW5ncy5wdXNoKGZvcm1hdFNldHRpbmdzT2JqKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzID0gdGhpcy5jb25maWcuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1xyXG5cdFx0XHQ/IHRoaXMuY29uZmlnLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNcclxuXHRcdFx0OiBbXTtcclxuXHJcblx0XHQvLyBTTVAyLTQ1ODIgQUdJQyAtIERhc2hib2FyZCBpdGVtIHNlcXVlbmNlXHJcblx0XHRsZXQgaXNFeGlzdFNlcSA9IGZhbHNlO1xyXG5cdFx0bGV0IHNvcnRTZXR0aW5ncyA9IHRoaXMuY29uZmlnLnNvcnRTZXR0aW5ncyB8fCBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5QaXZvdF9EYXRhICYmXHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YVswXSAmJlxyXG5cdFx0XHR0aGlzLlBpdm90X0RhdGFbMF0uU2VxICE9PSBudWxsXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8g5Y+W5raITmFtZeeahOm7mOiupOaOkuW6j++8jOagueaNrlNlceadpeaOkuW6j1xyXG5cdFx0XHRzb3J0U2V0dGluZ3MucHVzaCh7IG5hbWU6IFwiTmFtZVwiLCBvcmRlcjogXCJOb25lXCIgfSk7XHJcblx0XHRcdGlzRXhpc3RTZXEgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGZpbHRlclNldHRpbmdzID0gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5jaGVja0ZpbHRlclNldHRpbmdzKFxyXG5cdFx0XHR0aGlzLmNvbmZpZyxcclxuXHRcdFx0dGhpcy5jb25maWdGaWVsZHMsXHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YVxyXG5cdFx0KTtcclxuXHRcdGxldCBuYW1lRmlsdGVyID0gZmlsdGVyU2V0dGluZ3MuZmluZCgoeCkgPT4geC5uYW1lID09PSBcIk5hbWVcIik7XHJcblx0XHQvLyDlrZjlnKggTmFtZeeahGZpbHRlcuaXtu+8jOS8muaMieeFp+m7mOiupOaOkuW6j++8jOmcgOimgeWvuU5hbWXov5vooYxTZXHmjpLluo/lpITnkIZcclxuXHRcdGlmIChpc0V4aXN0U2VxICYmIG5hbWVGaWx0ZXIgJiYgcm93cy5zb21lKCh4KSA9PiB4Lm5hbWUgPT09IFwiTmFtZVwiKSkge1xyXG5cdFx0XHRsZXQgaXRlbXMgPSBuYW1lRmlsdGVyLml0ZW1zOyAvLyDmi7/liLDlvZPliY3mjpLluo/vvIzpu5jorqRBLVpcclxuXHRcdFx0bGV0IHNlcUFyciA9IFtdO1xyXG5cdFx0XHRpdGVtcy5mb3JFYWNoKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0bGV0IG9iaiA9IHRoaXMuUGl2b3RfRGF0YS5maW5kKCh4KSA9PiB4Lk5hbWUgPT09IG5hbWUpO1xyXG5cdFx0XHRcdGxldCBpdGVtOiBhbnkgPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxyXG5cdFx0XHRcdFx0c2VxOiBvYmouU2VxLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0c2VxQXJyLnB1c2goaXRlbSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRzZXFBcnIuc29ydCgoYSwgYikgPT4gYS5zZXEgLSBiLnNlcSk7XHJcblx0XHRcdG5hbWVGaWx0ZXIuaXRlbXMgPSBzZXFBcnIubWFwKCh4KSA9PiB4Lm5hbWUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFsbEZpZWxkcyA9XHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuYWxsRmllbGRzT2JqW3RoaXMucG9ydGxldC5pZF07XHJcblx0XHRpZiAoYWxsRmllbGRzKSB7XHJcblx0XHRcdHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBhbGxGaWVsZHMuZmluZChcclxuXHRcdFx0XHRcdChmaWVsZCkgPT4gZmllbGQuY29sTmFtZSA9PT0gdmFsdWUubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGl0ZW0pIHtcclxuXHRcdFx0XHRcdHZhbHVlLmNhcHRpb24gPVxyXG5cdFx0XHRcdFx0XHQoaXRlbS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmZvcm1hdFswXS5kaXNwbGF5TmFtZSkgfHxcclxuXHRcdFx0XHRcdFx0aXRlbS5sYW5nVmFsdWUgfHxcclxuXHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGlvbltpdGVtLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRpdGVtLmxhbmdDb2RlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRsZXQgaGFzSXRlbURhdGFUeXBlID0gZmFsc2U7XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhKSB7XHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YS5tYXAoKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoZGF0YVtcIkFjY291bnRUeXBlQ29kZVwiXSkge1xyXG5cdFx0XHRcdFx0aGFzSXRlbURhdGFUeXBlID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdGlmIChkYXRhW3Jvdy5uYW1lXSA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0XHRkYXRhW3Jvdy5uYW1lXSA9IFwibnVsbFwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGlmIChoYXNJdGVtRGF0YVR5cGUpIHtcclxuXHRcdFx0c29ydFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdG5hbWU6IFwiQWNjb3VudFR5cGVDb2RlXCIsXHJcblx0XHRcdFx0b3JkZXI6IFwiQXNjZW5kaW5nXCIsXHJcblx0XHRcdFx0bWVtYmVyc09yZGVyOiBbLi4udGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyXSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmNvbmZpZy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xyXG5cdFx0XHRmaWx0ZXIuY2FwdGlvbiA9XHJcblx0XHRcdFx0dGhpcy5nZXRDYXB0aW9uQnlOYW1lKGZpbHRlci5uYW1lKSB8fCBmaWx0ZXIuY2FwdGlvbjtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5kYXRhU291cmNlU2V0dGluZ3MgPSB7XHJcblx0XHRcdGRhdGFTb3VyY2U6IHRoaXMuUGl2b3RfRGF0YSB8fCBbXSxcclxuXHRcdFx0cm93czogcm93cyB8fCBbXSxcclxuXHRcdFx0Y29sdW1uczogY29sdW1ucyB8fCBbXSxcclxuXHRcdFx0dmFsdWVzOiB2YWx1ZXMgfHwgW10sXHJcblx0XHRcdGZpbHRlcnM6IHRoaXMuY29uZmlnLmZpbHRlcnMsXHJcblx0XHRcdGZpbHRlclNldHRpbmdzOiBmaWx0ZXJTZXR0aW5ncyxcclxuXHRcdFx0ZXhjbHVkZUZpZWxkczogdGhpcy5leGNsdWRlRmllbGRzLFxyXG5cdFx0XHRmb3JtYXRTZXR0aW5nczogZm9ybWF0U2V0dGluZ3MsXHJcblx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3M6IGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MsXHJcblx0XHRcdC8vIOeUqOS6juaUtui1t+WxleW8gOaMh+WumuWxgue6pywg6L+Z546p5oSP5Y+q6IO95bGV5byA56ys5LiA5bGCLFxyXG5cdFx0XHQvLyDlv4Xpobvorr7lrppleHBhbmRBbGwg5Li6ZmFsc2XvvIjpu5jorqTmmK9mYWxzZe+8ie+8jCDov5nmoLflrZDmiY3og73lrp7njrDlj6rlsZXlvIDkuKTlsYJcclxuXHRcdFx0Ly8gZHJpbGxlZE1lbWJlcnMsXHJcblx0XHRcdGV4cGFuZEFsbDogdHJ1ZSxcclxuXHRcdFx0ZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuXHRcdFx0ZmllbGRNYXBwaW5nOiBmaWVsZE1hcHBpbmcsXHJcblx0XHRcdGNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzOiB0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncyxcclxuXHRcdFx0c29ydFNldHRpbmdzOiBzb3J0U2V0dGluZ3MsXHJcblx0XHRcdC8vIGdyb3VwU2V0dGluZ3M6IHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MsXHJcblx0XHRcdHZhbHVlU29ydFNldHRpbmdzOiB0aGlzLmNvbmZpZy52YWx1ZVNvcnRTZXR0aW5ncyxcclxuXHRcdFx0c2hvd0dyYW5kVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMsXHJcblx0XHRcdHNob3dSb3dHcmFuZFRvdGFsczogdGhpcy5jb25maWcuc2hvd1Jvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRzaG93Q29sdW1uR3JhbmRUb3RhbHM6IHRoaXMuY29uZmlnLnNob3dDb2x1bW5HcmFuZFRvdGFscyxcclxuXHRcdFx0c2hvd1N1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0c2hvd1Jvd1N1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd1Jvd1N1YlRvdGFscyxcclxuXHRcdFx0c2hvd0NvbHVtblN1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFscyxcclxuXHRcdH07XHJcblx0XHRjb25zb2xlLmxvZyhcInRoaXMuZGF0YVNvdXJjZVNldHRpbmdzXCIsIHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzKTtcclxuXHJcblx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHR9XHJcblxyXG5cdGdldENhcHRpb25CeU5hbWUobmFtZVN0cmluZykge1xyXG5cdFx0aWYgKCFuYW1lU3RyaW5nKSByZXR1cm4gXCJcIjtcclxuXHRcdGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmluZCgoZWwpID0+IGVsLmNvbE5hbWUgPT09IG5hbWVTdHJpbmcpO1xyXG5cclxuXHRcdHJldHVybiBmaWVsZFxyXG5cdFx0XHQ/IGZpZWxkLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0dGhpcy50cmFuc2xhdGlvbltmaWVsZCAmJiBmaWVsZC5sYW5nQ29kZV0gfHxcclxuXHRcdFx0XHRcdGZpZWxkLmxhbmdDb2RlXHJcblx0XHRcdDogXCJcIjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhZnRlclBvcHVsYXRlKGFyZ3M6IEVuZ2luZVBvcHVsYXRlZEV2ZW50QXJncyk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZW1wU3VidG90YWxzID0gW107XHJcblx0XHR0aGlzLmdyYW5kVG90YWxzID0ge307XHJcblx0XHR0aGlzLnN1YlRvdGFscyA9IHt9O1xyXG5cdFx0bGV0IHRlbXBzaG93QXJyYXkgPSBbXTtcclxuXHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRpdGVtLmhhc093blByb3BlcnR5KFwic2hvd1N1YlRvdGFsc1wiKSAmJlxyXG5cdFx0XHRcdGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93R3JhbmRUb3RhbHNcIilcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0dGVtcHNob3dBcnJheS5wdXNoKHtcclxuXHRcdFx0XHRcdG5hbWU6IGl0ZW0uY29sTmFtZSxcclxuXHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRzaG93U3ViVG90YWxzOiBpdGVtLnNob3dTdWJUb3RhbHMsXHJcblx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6IGl0ZW0uc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChpdGVtLmhhc093blByb3BlcnR5KFwic2hvd0dyYW5kVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dHcmFuZFRvdGFsczogaXRlbS5zaG93R3JhbmRUb3RhbHMsXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93U3ViVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dTdWJUb3RhbHM6IGl0ZW0uc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmIHRoaXMucGl2b3RPYmopIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY29sdW1uR3JvdXAgPSBbXTtcclxuXHRcdFx0dGhpcy5jb25maWcueGF4aXMuZ3JvdXBzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmZpbHRlclNldHRpbmdzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzID0gW107XHJcblx0XHRcdGxldCBncm91cFNldHRpbmdzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZ3JvdXBTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBjb2x1bW5zID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiY29sdW1uc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCByb3dzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwicm93c1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZmlsdGVyc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJTZXR0aW5ncyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcImZpbHRlclNldHRpbmdzXCJcclxuXHRcdFx0KTtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcInZhbHVlc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzb3J0U2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJzb3J0U2V0dGluZ3NcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJjYWxjdWxhdGVkRmllbGRTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChncm91cFNldHRpbmdzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogY29sdW1uLm5hbWUsXHJcblx0XHRcdFx0XHRcdGNhcHRpb246XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDYXB0aW9uQnlOYW1lKGNvbHVtbi5uYW1lKSB8fFxyXG5cdFx0XHRcdFx0XHRcdGNvbHVtbi5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vSWYgdGhlcmUgaXMgYSBncm91cCwgZmlyc3QgZmlsdGVyIHRoZSBjb2x1bW5zIG9mIHRoZSBncm91cCBmaWVsZCwgYW5kIHRoZW4gb25seSBzYXZlIHRoZSBsYXN0IG9uZVxyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRpZiAoIXN0YXJ0c1dpdGgoY29sdW1uLm5hbWUsIGdyb3VwU2V0dGluZ3NbMF0ubmFtZSArIFwiX1wiKSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBjb2x1bW4ubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRjYXB0aW9uOlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLm5hbWUgPT09IGdyb3VwU2V0dGluZ3NbMF0ubmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmdldENhcHRpb25CeU5hbWUoY29sdW1uLm5hbWUpIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgY29sdW1uLmNhcHRpb24sXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCByb3cgb2Ygcm93cykge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLnhheGlzLmdyb3Vwcy5wdXNoKHtcclxuXHRcdFx0XHRcdG5hbWU6IHJvdy5uYW1lLFxyXG5cdFx0XHRcdFx0Y2FwdGlvbjogdGhpcy5nZXRDYXB0aW9uQnlOYW1lKHJvdy5uYW1lKSB8fCByb3cuY2FwdGlvbixcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCBmaWx0ZXIgb2YgZmlsdGVycykge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLmZpbHRlcnMucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBmaWx0ZXIubmFtZSxcclxuXHRcdFx0XHRcdGNhcHRpb246XHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0Q2FwdGlvbkJ5TmFtZShmaWx0ZXIubmFtZSkgfHwgZmlsdGVyLmNhcHRpb24sXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZmlsdGVyU2V0dGluZ3MgJiYgdGhpcy5maWx0ZXJTZXR0aW5ncy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0YXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3MgPSB0aGlzLmZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLmZpbHRlclNldHRpbmdzID0gdGhpcy5maWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5maWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJTZXR0aW5ncyA9IGZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xyXG5cdFx0XHRcdGxldCBzZXJpZXNEYXRhO1xyXG5cdFx0XHRcdGxldCB0ZW1wU2hvd09iajtcclxuXHRcdFx0XHRsZXQgZmlsdGVyVGVtcHNob3dBcnJheSA9IFtdO1xyXG5cdFx0XHRcdGlmICh0ZW1wc2hvd0FycmF5Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0ZmlsdGVyVGVtcHNob3dBcnJheSA9IHRlbXBzaG93QXJyYXkuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHQoaXRlbSkgPT5cclxuXHRcdFx0XHRcdFx0XHRpdGVtLm5hbWUgPT09IHZhbHVlLm5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmNhbE1ldGhvZCA9PT0gdmFsdWUudHlwZVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmIChmaWx0ZXJUZW1wc2hvd0FycmF5Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHR0ZW1wU2hvd09iaiA9IGZpbHRlclRlbXBzaG93QXJyYXlbMF07XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHR0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dTdWJUb3RhbHNcIikgJiZcclxuXHRcdFx0XHRcdFx0XHR0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dHcmFuZFRvdGFsc1wiKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRzZXJpZXNEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNhbE1ldGhvZDogdmFsdWUudHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB2YWx1ZS5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd1N1YlRvdGFsczogdGVtcFNob3dPYmouc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dHcmFuZFRvdGFsczogdGVtcFNob3dPYmouc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRlbXBTaG93T2JqLmhhc093blByb3BlcnR5KFwic2hvd0dyYW5kVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXJpZXNEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xOYW1lOiB2YWx1ZS5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYWxNZXRob2Q6IHZhbHVlLnR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB2YWx1ZS5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGVtcFNob3dPYmouc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRlbXBTaG93T2JqLmhhc093blByb3BlcnR5KFwic2hvd1N1YlRvdGFsc1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsTWV0aG9kOiB2YWx1ZS50eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdmFsdWUuY2FwdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd1N1YlRvdGFsczogdGVtcFNob3dPYmouc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICghc2VyaWVzRGF0YSkge1xyXG5cdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHZhbHVlLmNhcHRpb24sXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogdmFsdWUudHlwZSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcy5wdXNoKHNlcmllc0RhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGNhbGN1bGF0ZSBvZiBjYWxjdWxhdGVkRmllbGRTZXR0aW5ncykge1xyXG5cdFx0XHRcdGNvbnN0IGNhbGN1bGF0ZURhdGEgPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBjYWxjdWxhdGUubmFtZSxcclxuXHRcdFx0XHRcdGZvcm11bGE6IGNhbGN1bGF0ZS5mb3JtdWxhLFxyXG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOlxyXG5cdFx0XHRcdFx0XHRjYWxjdWxhdGUuZm9ybWF0U3RyaW5nID09PSBcIlwiXHJcblx0XHRcdFx0XHRcdFx0PyBcIk4yXCJcclxuXHRcdFx0XHRcdFx0XHQ6IGNhbGN1bGF0ZS5mb3JtYXRTdHJpbmcsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncy5wdXNoKGNhbGN1bGF0ZURhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuY29uZmlnLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMgPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHM7XHJcblx0XHRcdHRoaXMuY29uZmlnLnNvcnRTZXR0aW5ncyA9IHNvcnRTZXR0aW5ncztcclxuXHRcdFx0dGhpcy5jb25maWcuZ3JvdXBTZXR0aW5ncyA9IGdyb3VwU2V0dGluZ3M7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZVZpZXcodGhpcy5waXZvdE9iaik7XHJcblx0XHR9XHJcblx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0Ly9yZW1vdmUgdGhlIHNvcnRcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3MubGVuZ3RoID4gMCkge1xyXG5cdFx0XHR0aGlzLnByZXZpb3VzU29ydCA9IHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbztcclxuXHRcdFx0KHRoaXMuZmllbGRsaXN0T2JqIGFzIGFueSkubGFzdFNvcnRJbmZvID0gW107XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYWZ0ZXJFbmdpbmVQb3B1bGF0ZShhcmdzOiBhbnkpIHtcclxuXHRcdGlmICghQnJvd3Nlci5pc0RldmljZSAmJiB0aGlzLmZpZWxkbGlzdE9iaiAmJiB0aGlzLnBpdm90T2JqKSB7XHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iaixcclxuXHRcdFx0XHRcImdyb3VwU2V0dGluZ3NcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0XHRpZiAodGhpcy5maWVsZGxpc3RPYmopIHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZSh0aGlzLnBpdm90T2JqKTtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5ncmlkLnF1ZXJ5Q2VsbEluZm8gPSB0aGlzLnF1ZXJ5Q2VsbC5iaW5kKHRoaXMpO1xyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmdyaWQuaGVhZGVyQ2VsbEluZm8gPSB0aGlzLmhlYWRlckNlbGwuYmluZCh0aGlzKTtcclxuXHRcdFx0Ly8gU01QMi0zOTI5IHJvbGxiYWNrXHJcblx0XHRcdC8vIGlmICghdGhpcy5pc0FwcGx5SVJSKVxyXG5cdFx0XHQvLyBcdHRoaXMuZ2V0Q2FsY3VsYXRpb25SZXN1bHRCeURhc2hib2FyZERhdGFUYWJsZUlkKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhICYmIHRoaXMuUGl2b3RfRGF0YS5sZW5ndGgpIHtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5lbmdpbmVQb3B1bGF0ZWQoYXJncyk7XHJcblx0XHRcdH0sIDE1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKG9iaiwga2V5KSB7XHJcblx0XHRsZXQgcHJvcCA9IG51bGw7XHJcblx0XHRpZiAob2JqICYmIG9iai5kYXRhU291cmNlU2V0dGluZ3MpIHtcclxuXHRcdFx0cHJvcCA9IG9iai5kYXRhU291cmNlU2V0dGluZ3Nba2V5XTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9wKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiICYmXHJcblx0XHRcdFx0cHJvcC5sZW5ndGggPiAwXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHByb3AgPSBwcm9wLm1hcCgoaXRlbSkgPT4gaXRlbS5wcm9wZXJ0aWVzIHx8IGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcHJvcDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBlbmdpbmVQb3B1bGF0aW5nKGFyZ3MpIHtcclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IFtdO1xyXG5cdFx0Ly8gaWYgKGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGgpIHtcclxuXHRcdC8vIFx0Zm9yIChcclxuXHRcdC8vIFx0XHRsZXQgaSA9IDA7XHJcblx0XHQvLyBcdFx0aSA8IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGg7XHJcblx0XHQvLyBcdFx0aSsrXHJcblx0XHQvLyBcdCkge1xyXG5cdFx0Ly8gXHRcdGlmIChcclxuXHRcdC8vIFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHQvLyBcdFx0XHRcdGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5nc1tpXS5uYW1lICYmXHJcblx0XHQvLyBcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5sYXN0U29ydEluZm8ub3JkZXIgPT09IFwiQXNjZW5kaW5nXCIgJiZcclxuXHRcdC8vIFx0XHRcdCEoXHJcblx0XHQvLyBcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mby5uYW1lID09PVxyXG5cdFx0Ly8gXHRcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdC8vIFx0XHRcdFx0dGhpcy5wcmV2aW91c1NvcnQub3JkZXIgPT09IFwiTm9uZVwiXHJcblx0XHQvLyBcdFx0XHQpXHJcblx0XHQvLyBcdFx0KSB7XHJcblx0XHQvLyBcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIk5vbmVcIjtcclxuXHRcdC8vIFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5wcmV2aW91c1NvcnQgJiZcclxuXHRcdC8vIFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHQvLyBcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdC8vIFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm9yZGVyID09PSBcIkFzY2VuZGluZ1wiXHJcblx0XHQvLyBcdFx0KSB7XHJcblx0XHQvLyBcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIkFzY2VuZGluZ1wiO1xyXG5cdFx0Ly8gXHRcdH1cclxuXHRcdC8vIFx0fVxyXG5cdFx0Ly8gfVxyXG5cdH1cclxuXHJcblx0cHVibGljIGNlbGxDbGljayhhcmdzKSB7XHJcblx0XHRpZiAoYXJncy5jdXJyZW50Q2VsbC5jbGFzc0xpc3QuY29udGFpbnMoXCJlLWhlYWRlcmNlbGxcIikpIHtcclxuXHRcdFx0dGhpcy5mbGFnID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdC8vIOa4hemZpOaOkuW6j1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5zb3J0T3JkZXIgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVTb3J0U2V0dGluZ3MuaGVhZGVyVGV4dCAmJlxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5zb3J0T3JkZXIgPT09XHJcblx0XHRcdFx0XCJEZXNjZW5kaW5nXCIgJiZcclxuXHRcdFx0YXJncy5kYXRhLnZhbHVlU29ydCAmJlxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5oZWFkZXJUZXh0ID09PVxyXG5cdFx0XHRcdGFyZ3MuZGF0YS52YWx1ZVNvcnQubGV2ZWxOYW1lXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5zZXRQcm9wZXJ0aWVzKFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGRhdGFTb3VyY2VTZXR0aW5nczoge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZVNvcnRTZXR0aW5nczoge1xyXG5cdFx0XHRcdFx0XHRcdHNvcnRPcmRlcjogXCJEZXNjZW5kaW5nXCIsXHJcblx0XHRcdFx0XHRcdFx0aGVhZGVyVGV4dDogXCJcIixcclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR0cnVlXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHRcdHRoaXMuZmxhZyA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy52YWx1ZVNvcnRTZXR0aW5ncyA9IHt9O1xyXG5cdFx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBxdWVyeUNlbGwoYXJnczogYW55KTogdm9pZCB7XHJcblx0XHQodGhpcy5waXZvdE9iai5yZW5kZXJNb2R1bGUgYXMgYW55KS5yb3dDZWxsQm91bmRFdmVudChhcmdzKTtcclxuXHRcdGxldCByb3dJbmRleCA9IE51bWJlcihhcmdzLmNlbGwuZ2V0QXR0cmlidXRlKFwiaW5kZXhcIikpO1xyXG5cdFx0Ly8g5paw54mI5pysMjYueOS4rSBhcmlhLWNvbGluZGV4IOS8muavlOaXp+eJiOacrHYyMC54IOWkmjFcclxuXHRcdGxldCBjb2xJbmRleCA9IHBhcnNlSW50KGFyZ3MuY2VsbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbGluZGV4XCIpKSAtIDE7XHJcblx0XHRpZiAoXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb25kaXRpb25hbEZvcm1hdFNldHRpbmdzLmxlbmd0aFxyXG5cdFx0KSB7XHJcblx0XHRcdGlmIChhcmdzLmRhdGEgJiYgYXJncy5kYXRhWzBdLmZvcm1hdHRlZFRleHQgPT09IFwiR3JhbmQgVG90YWxcIikge1xyXG5cdFx0XHRcdGFyZ3MuY2VsbC5jbGFzc0xpc3QuYWRkKFwiZ3JhbmQtY2xhc3NcIik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXHJcblx0XHRcdFx0XHRyb3dJbmRleCAlIDIgPyBcIm9kZC1jbGFzc1wiIDogXCJldmVuLWNsYXNzXCJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsZXQgbWVhc3VyZUFyciA9XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29uZGl0aW9uYWxGb3JtYXRTZXR0aW5ncy5tYXAoXHJcblx0XHRcdFx0XHQob2JqKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBvYmoubWVhc3VyZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0bWVhc3VyZUFyci5pbmNsdWRlcyhhcmdzLmRhdGFbY29sSW5kZXhdLmFjdHVhbFRleHQpICYmXHJcblx0XHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XS5zdHlsZVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuc3R5bGUuY3NzVGV4dCArPSBgYmFja2dyb3VuZC1jb2xvcjogJHthcmdzLmRhdGFbY29sSW5kZXhdLnN0eWxlLmJhY2tncm91bmRDb2xvcn0gIWltcG9ydGFudGA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGFbMF0uZm9ybWF0dGVkVGV4dCA9PT0gXCJHcmFuZCBUb3RhbFwiKVxyXG5cdFx0XHRcdGFyZ3MuY2VsbC5jbGFzc0xpc3QuYWRkKFwiZS1jdXN0b21jbGFzc1wiKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoYXJncy5kYXRhICYmIGFyZ3MuZGF0YVswXS5mb3JtYXR0ZWRUZXh0ID09PSBcIkdyYW5kIFRvdGFsXCIpIHtcclxuXHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXCJncmFuZC1jbGFzc1wiKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmIChyb3dJbmRleCAlIDIpIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuY2xhc3NMaXN0LmFkZChcIm9kZC1jbGFzc1wiKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuY2xhc3NMaXN0LmFkZChcImV2ZW4tY2xhc3NcIik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvL2dldCBzb3J0aW5nIGRhdGFcclxuXHRcdGlmICh0aGlzLmZsYWcpIHtcclxuXHRcdFx0dGhpcy5mbGFnID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuY29uZmlnLnZhbHVlU29ydFNldHRpbmdzID1cclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5nc1tcclxuXHRcdFx0XHRcdFwicHJvcGVydGllc1wiXHJcblx0XHRcdFx0XTtcclxuXHRcdFx0dGhpcy5wb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcclxuXHRcdH1cclxuXHRcdC8vY3VzdG9taXplIHRoZSBoZWFkZXIgdGV4dFxyXG5cdFx0aWYgKHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3MubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRhcmdzLmRhdGEgJiZcclxuXHRcdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdICYmXHJcblx0XHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XS5heGlzID09PSBcInJvd1wiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGFyZ3MuY2VsbC5xdWVyeVNlbGVjdG9yKFwiLmUtY2VsbHZhbHVlXCIpLmlubmVyVGV4dCA9XHJcblx0XHRcdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTTVAyLTI5MTIgc3VidG90YWzlrZfkvZPliqDnspdcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGggJiZcclxuXHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XSAmJlxyXG5cdFx0XHRhcmdzLmRhdGFbMF0ubGV2ZWwgIT09XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGggLSAxICYmXHJcblx0XHRcdGFyZ3MuZGF0YVtjb2xJbmRleF0ucm93SGVhZGVycyAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdLmF4aXMgPT0gXCJ2YWx1ZVwiXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXCJlLWN1c3RvbWNsYXNzXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBoZWFkZXJDZWxsKGFyZ3M6IGFueSk6IHZvaWQge1xyXG5cdFx0KHRoaXMucGl2b3RPYmoucmVuZGVyTW9kdWxlIGFzIGFueSkuY29sdW1uQ2VsbEJvdW5kRXZlbnQoYXJncyk7XHJcblx0XHRpZiAodGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0bGV0IG5vZGUgPSBhcmdzLm5vZGUucXVlcnlTZWxlY3RvcihcclxuXHRcdFx0XHRcIi5lLWhlYWRlcmNlbGxkaXYgLmUtaGVhZGVydGV4dFwiXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChub2RlKSBub2RlLmlubmVyVGV4dCA9IGFyZ3MuY2VsbC5jb2x1bW4uaGVhZGVyVGV4dDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHRleHRBbGlnbiA9IGFyZ3MuY2VsbC5jb2x1bW4udGV4dEFsaWduO1xyXG5cdFx0YXJncy5jZWxsLmNvbHVtbi5oZWFkZXJUZXh0QWxpZ24gPSB0ZXh0QWxpZ247XHJcblx0XHRhcmdzLm5vZGUuc3R5bGUudGV4dEFsaWduID0gdGV4dEFsaWduID09PSBcIlJpZ2h0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjsgLy8gQWxpZ24gcmlnaHQgZm9yIG51bWVyaWMgY29sdW1uc1xyXG5cdFx0aWYgKHRleHRBbGlnbiA9PT0gXCJSaWdodFwiKSB7XHJcblx0XHRcdGFyZ3Mubm9kZS5jbGFzc0xpc3QuYWRkKFwiaGVhZGVyLWFsaWduLXJpZ2h0XCIpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZGF0YUJvdW5kKGUpIHtcclxuXHRcdGlmICh0aGlzLmlzSW5pdCkge1xyXG5cdFx0XHR0aGlzLmlzSW5pdCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5ncmFuZFRvdGFscyA9IHt9O1xyXG5cdFx0dGhpcy5zdWJUb3RhbHMgPSB7fTtcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqLmdyaWQpIHtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5ncmlkLnJlc2l6ZVN0b3AgPSB0aGlzLnJlc2l6ZVN0b3AuYmluZCh0aGlzKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnBpdm90T2JqKSB7XHJcblx0XHRcdHZhciBpbmRleCA9IFtdO1xyXG5cdFx0XHQvLyBHZXQgdGhlIGVtcHR5IHJvdyBoZWFkZXJzIGhlcmUuXHJcblx0XHRcdHZhciBlbXB0eVJvd0hlYWRlcjogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcclxuXHRcdFx0XHQndGRbYXJpYS1sYWJlbD1cIiBjb2x1bW4gaGVhZGVyIFwiXSdcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yICh2YXIgZWxlIG9mIGVtcHR5Um93SGVhZGVyKSB7XHJcblx0XHRcdFx0aWYgKGVsZSkge1xyXG5cdFx0XHRcdFx0aW5kZXgucHVzaChlbGUuZ2V0QXR0cmlidXRlKFwiaW5kZXhcIikpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCB0aGUgZW1wdHkgcm93IGhlYWRlcnMgaGVyZS5cclxuXHRcdFx0XHRcdGVsZS5jbG9zZXN0KFwidHJcIikucmVtb3ZlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXgubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHQvLyBHZXQgdGhlIGVtcHR5IHZhbHVlcyBoZXJlLlxyXG5cdFx0XHRcdHZhciBlbXB0eVZhbHVlcyA9IHRoaXMucGl2b3RPYmouZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxyXG5cdFx0XHRcdFx0YHRkW2luZGV4PVwiJHtpbmRleFtpXX1cIl1gXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoZW1wdHlWYWx1ZXNbMF0pIHtcclxuXHRcdFx0XHRcdC8vIFJlbW92ZSBhbGwgdGhlIGVtcHR5IHZhbHVlIHJvd3MgaGVyZS5cclxuXHRcdFx0XHRcdGVtcHR5VmFsdWVzWzBdLmNsb3Nlc3QoXCJ0clwiKS5yZW1vdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmogJiZcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUgJiZcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvblxyXG5cdFx0KSB7XHJcblx0XHRcdChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5waXZvdEJ1dHRvbk1vZHVsZS5tZW51T3B0aW9uIGFzIGFueVxyXG5cdFx0XHQpLnN0cmluZ0FnZ3JlZ2F0ZVR5cGVzID0gW1xyXG5cdFx0XHRcdFwiQ291bnRcIixcclxuXHRcdFx0XHRcIkRpc3RpbmN0Q291bnRcIixcclxuXHRcdFx0XHRcIkZpcnN0XCIsXHJcblx0XHRcdFx0XCJMYXN0XCIsXHJcblx0XHRcdF07XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMucGl2b3RPYmoucGl2b3RCdXR0b25Nb2R1bGUgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5waXZvdEJ1dHRvbk1vZHVsZS5tZW51T3B0aW9uXHJcblx0XHQpIHtcclxuXHRcdFx0KFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvbiBhcyBhbnlcclxuXHRcdFx0KS5zdHJpbmdBZ2dyZWdhdGVUeXBlcyA9IFtcclxuXHRcdFx0XHRcIkNvdW50XCIsXHJcblx0XHRcdFx0XCJEaXN0aW5jdENvdW50XCIsXHJcblx0XHRcdFx0XCJGaXJzdFwiLFxyXG5cdFx0XHRcdFwiTGFzdFwiLFxyXG5cdFx0XHRdO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGFsbFN1bW1hcnlUeXBlID0gQUxMX0FHR1JFR0FURV9UWVBFUyBhcyBhbnk7XHJcblx0XHR0aGlzLnBpdm90T2JqLmdldEFsbFN1bW1hcnlUeXBlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHR9O1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmFnZ3JlZ2F0ZVR5cGVzID0gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmdldEFsbFN1bW1hcnlUeXBlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHJldHVybiBhbGxTdW1tYXJ5VHlwZTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2V0VmFsdWVJdGVtRGF0YSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRWYWx1ZUl0ZW1EYXRhKCkge1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGNvbnN0IGZpZWxkRG9tID0gdGhpcy5maWVsZGxpc3RPYmouZmllbGRMaXN0U3Bpbm5lckVsZW1lbnQ7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzLnZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XHJcblx0XHRcdFx0aWYgKHZhbHVlLnR5cGUgIT09IFwiRmlyc3RcIiAmJiB2YWx1ZS50eXBlICE9PSBcIkxhc3RcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCB2YWx1ZXNEb20gPSBmaWVsZERvbS5xdWVyeVNlbGVjdG9yKFxyXG5cdFx0XHRcdFx0YC5lLXZhbHVlcyAuJHt2YWx1ZS5uYW1lfSAuZS1wdnQtYnRuLWNvbnRlbnRgXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHR2YWx1ZXNEb20uaW5uZXJIVE1MICE9PSBgJHt2YWx1ZS50eXBlfSBvZiAke3ZhbHVlLmNhcHRpb259YFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dmFsdWVzRG9tLmlubmVySFRNTCA9IGAke3ZhbHVlLnR5cGV9IG9mICR7dmFsdWUuY2FwdGlvbn1gO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2FsY3VsYXRlZENlbGxTZXRzKGFyZ3MsIGN1ckZpZWxkcykge1xyXG5cdFx0bGV0IG1hdGNoRmllbGRzID0gY3VyRmllbGRzW1wibWF0Y2hGaWVsZHNcIl07XHJcblx0XHRsZXQgZm9ybXVsYSA9IGN1ckZpZWxkc1tcImZvcm11bGFcIl07XHJcblx0XHRsZXQgdmFsdWUgPSAwO1xyXG5cdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0bGV0IGludmFsaWRUeXBlcyA9IFtcInN0cmluZ1wiLCBcIm52YXJjaGFyXCIsIFwiZGF0ZVwiLCBcImRhdGV0aW1lXCJdO1xyXG5cdFx0bGV0IGlzSW52YWxpZCA9IG1hdGNoRmllbGRzLnNvbWUoKGYpID0+XHJcblx0XHRcdGludmFsaWRUeXBlcy5pbmNsdWRlcyhcclxuXHRcdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoKGVsKSA9PiBlbC5jb2xOYW1lID09PSBmLm1hdGNoV29yZClbMF1bXHJcblx0XHRcdFx0XHRcImRhdGFUeXBlXCJcclxuXHRcdFx0XHRdXHJcblx0XHRcdClcclxuXHRcdCk7XHJcblx0XHRsZXQgY3VycmVudHJvd0NlbGxUeXBlID0gYXJncy5yb3dDZWxsVHlwZTtcclxuXHRcdGlmIChpc0ludmFsaWQpIHJldHVybiBcIi1cIjtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9PT0gXCJzdWJUb3RhbFwiIHx8XHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IGNoaWxkSGVhZGVycyA9IFtdO1xyXG5cdFx0XHRsZXQgc3VtID0gMDtcclxuXHRcdFx0bGV0IGNsb25lQ2VsbFNldHMgPSBjbG9uZURlZXAoYXJncy5jZWxsU2V0cyk7XHJcblx0XHRcdGxldCBncm91cE5hbWVBcnJheXMgPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgaW5kZXggPSBhcmdzLnJvdy5sZXZlbDsgaW5kZXggPCByb3dzLmxlbmd0aDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdGdyb3VwTmFtZUFycmF5cy5wdXNoKHJvd3NbaW5kZXhdLm5hbWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmVDZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRsZXQgaGVhZGVyID0gZ3JvdXBOYW1lQXJyYXlzXHJcblx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGNsb25lQ2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2xvbmVDZWxsU2V0c1tpXVtuYW1lXTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0aWYgKCEoY2hpbGRIZWFkZXJzIGFzIGFueSkuaW5jbHVkZXMoaGVhZGVyKSkge1xyXG5cdFx0XHRcdFx0Y2hpbGRIZWFkZXJzLnB1c2goaGVhZGVyKTtcclxuXHRcdFx0XHRcdGxldCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xyXG5cdFx0XHRcdFx0Z3JvdXBOYW1lQXJyYXlzLm1hcChcclxuXHRcdFx0XHRcdFx0KG5hbWUsIGkpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbaV0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YXJncy5jZWxsU2V0cyA9IF9maWx0ZXIoY2xvbmVDZWxsU2V0cywgZmlsdGVyT2JqKTtcclxuXHRcdFx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPSBcInZhbHVlXCI7XHJcblx0XHRcdFx0XHRzdW0gKz0gdGhpcy5jYWxjdWxhdGVkVmFsdWVzKGFyZ3MsIG1hdGNoRmllbGRzLCBmb3JtdWxhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9IGN1cnJlbnRyb3dDZWxsVHlwZTtcclxuXHJcblx0XHRcdC8vIOaaguWtmOW9k+WJjVN1YlRvdGFs77yMIOeUqOS6juaUtue8qeaXtuivu+WPllxyXG5cdFx0XHRsZXQgcHJlZml4SGVhZGVyID0gdGhpcy5nZXRDYWxjSGVhZGVyKGFyZ3MsIGZvcm11bGEpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRlbXBTdWJ0b3RhbHMocHJlZml4SGVhZGVyLCBzdW0pO1xyXG5cdFx0XHRyZXR1cm4gc3VtO1xyXG5cdFx0fSBlbHNlIGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcInZhbHVlXCIpIHtcclxuXHRcdFx0aWYgKGFyZ3Mucm93Lmhhc0NoaWxkKSB7XHJcblx0XHRcdFx0Ly8gY29sbGFwc2Ug6K+75Y+WU3ViVG90YWxcclxuXHRcdFx0XHRsZXQgaGVhZGVyID0gdGhpcy5nZXRDYWxjSGVhZGVyKGFyZ3MsIGZvcm11bGEpO1xyXG5cdFx0XHRcdGxldCBpbmRleCA9IHRoaXMudGVtcFN1YnRvdGFscy5maW5kSW5kZXgoXHJcblx0XHRcdFx0XHQoaXRlbSkgPT4gaXRlbS5yb3dOYW1lID09PSBoZWFkZXJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHRoaXMudGVtcFN1YnRvdGFsc1tpbmRleF0ucm93VmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGV4cGFuZFxyXG5cdFx0XHRcdHZhbHVlID0gdGhpcy5jYWxjdWxhdGVkVmFsdWVzKGFyZ3MsIG1hdGNoRmllbGRzLCBmb3JtdWxhKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cdH1cclxuXHJcblx0YWN0aW9uRmFpbHVyZShhcmdzOiBQaXZvdEFjdGlvbkZhaWx1cmVFdmVudEFyZ3MpOiB2b2lkIHtcclxuXHRcdGlmIChhcmdzLmFjdGlvbk5hbWUgPT0gXCJEcmlsbCBkb3duXCIgfHwgYXJncy5hY3Rpb25OYW1lID09IFwiRHJpbGwgdXBcIikge1xyXG5cdFx0XHQvLyBUcmlnZ2VycyB3aGVuIHRoZSBjdXJyZW50IFVJIGFjdGlvbiBmYWlscyB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Q2FsY0hlYWRlcihhcmdzLCBmb3JtdWxhPykge1xyXG5cdFx0bGV0IGhlYWRlciA9IFwiXCI7XHJcblx0XHRsZXQgcm93cyA9IHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3M7XHJcblx0XHRsZXQgZ3JvdXBOYW1lQXJyYXlzID0gW107XHJcblx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5yb3cubGV2ZWw7IGluZGV4KyspIHtcclxuXHRcdFx0Z3JvdXBOYW1lQXJyYXlzLnB1c2gocm93c1tpbmRleF0ubmFtZSk7XHJcblx0XHR9XHJcblx0XHRoZWFkZXIgPSBncm91cE5hbWVBcnJheXMubGVuZ3RoXHJcblx0XHRcdD8gZ3JvdXBOYW1lQXJyYXlzXHJcblx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhcmdzLmNlbGxTZXRzWzBdW25hbWVdO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdC5qb2luKFwiLVwiKSArXHJcblx0XHRcdCAgXCItXCIgK1xyXG5cdFx0XHQgIGFyZ3Mucm93LmFjdHVhbFRleHRcclxuXHRcdFx0OiBhcmdzLnJvdy5hY3R1YWxUZXh0O1xyXG5cdFx0aWYgKGZvcm11bGEpIGhlYWRlciArPSBcIl9fX1wiICsgZm9ybXVsYTtcclxuXHRcdHJldHVybiBoZWFkZXI7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVRlbXBTdWJ0b3RhbHMocm93TmFtZSwgcm93VmFsdWUpIHtcclxuXHRcdGxldCBpbmRleCA9IHRoaXMudGVtcFN1YnRvdGFscy5maW5kSW5kZXgoXHJcblx0XHRcdChpdGVtKSA9PiBpdGVtLnJvd05hbWUgPT09IHJvd05hbWVcclxuXHRcdCk7XHJcblx0XHRsZXQgdGVtcDogYW55ID0ge307XHJcblx0XHR0ZW1wLnJvd05hbWUgPSByb3dOYW1lO1xyXG5cdFx0dGVtcC5yb3dWYWx1ZSA9IHJvd1ZhbHVlO1xyXG5cdFx0aWYgKGluZGV4ID4gLTEpIHtcclxuXHRcdFx0dGhpcy50ZW1wU3VidG90YWxzLnNwbGljZShpbmRleCwgMSwgdGVtcCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnRlbXBTdWJ0b3RhbHMucHVzaCh0ZW1wKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2FsY3VsYXRlZFZhbHVlcyhhcmdzLCBtYXRjaEZpZWxkcywgZm9ybXVsYSkge1xyXG5cdFx0aWYgKG1hdGNoRmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRsZXQgY2FsY3VsZWRNYXRjaEZpZWxkcyA9IG1hdGNoRmllbGRzLm1hcCgoZikgPT4ge1xyXG5cdFx0XHRcdHN3aXRjaCAoZi5tYXRjaE1ldGhvZCkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIkZpcnN0XCI6XHJcblx0XHRcdFx0XHRjYXNlIFwiTGFzdFwiOlxyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlZEZpc3RMYXN0KFxyXG5cdFx0XHRcdFx0XHRcdGFyZ3MsXHJcblx0XHRcdFx0XHRcdFx0Zi5tYXRjaE1ldGhvZCxcclxuXHRcdFx0XHRcdFx0XHRmLm1hdGNoV29yZFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJNYXhcIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBtYXhCeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdClbZi5tYXRjaFdvcmRdO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJNaW5cIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBtaW5CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdClbZi5tYXRjaFdvcmRdO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJTdW1cIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBzdW1CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdC8vIFNNUDItNDA5NCBVbmljb3JuIC0gTDMgQWRqdXN0ZWQgTkFWIHZhbHVlIGlzc3Vlc1xyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgJiYgZi5yZXBsYWNlVmFsdWUudG9GaXhlZCgxMCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIkF2Z1wiOlxyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9IG1lYW5CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0bGV0IHJlc3VsdEZvcm11bGEgPSBmb3JtdWxhO1xyXG5cdFx0XHRpZiAoY2FsY3VsZWRNYXRjaEZpZWxkcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNhbGN1bGVkTWF0Y2hGaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdHJlc3VsdEZvcm11bGEgPSByZXN1bHRGb3JtdWxhLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdGNhbGN1bGVkTWF0Y2hGaWVsZHNbaV0ubWF0Y2hTdHIsXHJcblx0XHRcdFx0XHRcdFwiKFwiICsgY2FsY3VsZWRNYXRjaEZpZWxkc1tpXS5yZXBsYWNlVmFsdWUgKyBcIilcIlxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gbmV3IEZ1bmN0aW9uKFxyXG5cdFx0XHRcdFx0XCJyZXR1cm4gXCIgKyByZXN1bHRGb3JtdWxhLnJlcGxhY2UoL1teLTw+PzooKVxcZC8qKy5dL2csIFwiXCIpXHJcblx0XHRcdFx0KSgpO1xyXG5cdFx0XHRcdGlmIChpc05hTihyZXN1bHQpIHx8ICFpc0Zpbml0ZShyZXN1bHQpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0cmV0dXJuIE5hTjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDA7XHJcblx0fVxyXG5cclxuXHR0b3RhbEZvcm1hdHRlZCA9IHt9O1xyXG5cdHB1YmxpYyBhZ2dyZWdhdGVDZWxsSW5mbyhhcmdzKSB7XHJcblx0XHRsZXQgYXNPZkRhdGUgPSB0aGlzLnBiZi50aW1lKHRoaXMuZGFzaGJvYXJkLmFzT2ZEYXRlKTtcclxuXHRcdC8vIGlmIGNhbGN1bGF0ZWQgZmllbGRcclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT0gXCJDYWxjdWxhdGVkRmllbGRcIikge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChhcmdzLmZpZWxkTmFtZSA9PSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0ubmFtZSkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IHRoaXMuY2FsY3VsYXRlZENlbGxTZXRzKFxyXG5cdFx0XHRcdFx0XHRhcmdzLFxyXG5cdFx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUkJlZm9yZUNhcnJpZWRcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUklSUkRhdGVcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUk1URFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlSVJSUVREXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJZVERcIixcclxuXHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT09PT09PVwiKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhcmdzOlwiLCBhcmdzKTtcclxuXHRcdFx0bGV0IHZhbHVlRmllbGQ7XHJcblx0XHRcdGxldCBkYXRlRmllbGQ7XHJcblx0XHRcdGxldCBzdGFydERhdGU7XHJcblx0XHRcdGxldCBlbmREYXRlO1xyXG5cdFx0XHRzd2l0Y2ggKGFyZ3MuYWdncmVnYXRlVHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVJUlJcIjpcclxuXHRcdFx0XHRcdHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlXCI7XHJcblx0XHRcdFx0XHRkYXRlRmllbGQgPSBcIklSUkRhdGVcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVJUlJNVERcIjpcclxuXHRcdFx0XHRcdHN0YXJ0RGF0ZSA9IG1vbWVudChhc09mRGF0ZSlcclxuXHRcdFx0XHRcdFx0LnN0YXJ0T2YoXCJtb250aFwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSUVREXCI6XHJcblx0XHRcdFx0XHRzdGFydERhdGUgPSBtb21lbnQoYXNPZkRhdGUpXHJcblx0XHRcdFx0XHRcdC5zdGFydE9mKFwicXVhcnRlclwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSWVREXCI6XHJcblx0XHRcdFx0XHRzdGFydERhdGUgPSBtb21lbnQoYXNPZkRhdGUpXHJcblx0XHRcdFx0XHRcdC5zdGFydE9mKFwieWVhclwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiOlxyXG5cdFx0XHRcdFx0dmFsdWVGaWVsZCA9IFwiSVJSQWRqVmFsdWVcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiQ2FsY3VsYXRlSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZUlSUkJlZm9yZUNhcnJpZWRcIjpcclxuXHRcdFx0XHRcdHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlQmVmb3JlQ2FycnlcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCBOQVZBZGogPSAwO1xyXG5cdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdGxldCBiZWZvcmVTdGFydE5BVkFkaiA9IDA7IC8vIOWtmOWCqOS4iuS4gOS4qumYtuauteeahE5BVkFkauaAu+WSjFxyXG5cdFx0XHRsZXQgYmVmb3JlU3RhcnRWYWx1ZXMgPSBbXTsgLy8g5a2Y5YKo5LiK5LiA5Liq6Zi25q6155qE57Sv6K6h6ZuG5ZCIICjlj6rmmK/kuLrkuobmiZPljbDvvIzmsqHmnInlrp7pmYXnlKjpgJQpXHJcblx0XHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRlbC5jb2xOYW1lID09PVxyXG5cdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRBZ2dyZWdhdGVUeXBlKFxyXG5cdFx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGVcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdGFtb3VudDogYXJncy5jZWxsU2V0c1tpXVtcIklSUkFtb3VudFwiXSxcclxuXHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSA9PT1cclxuXHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdC8vIFNNUDItMTY5MjBcclxuXHRcdFx0XHQvLyBJZiBJUlIgRGF0ZSA+IERhc2hib2FyZCByZXBvcnQgZGF0ZSA9IFRha2VzIGFzIG9mIGRhc2hib2FyZCByZXBvcnQgZGF0ZVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVJUlJJUlJEYXRlXCIgJiZcclxuXHRcdFx0XHRcdGFzT2ZEYXRlIDwgdGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW2RhdGVGaWVsZF0pXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRkYXRhLmRhdGUgPSBhc09mRGF0ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0TkFWQWRqICs9IGFyZ3MuY2VsbFNldHNbaV1bdmFsdWVGaWVsZF07XHJcblx0XHRcdFx0Ly8gU01QMi0xNzIxOSBNVEQgUVREIFlURCBJUlJcclxuXHRcdFx0XHRpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcclxuXHRcdFx0XHRcdGlmIChtb21lbnQoZGF0YS5kYXRlKS5pc0JlZm9yZShzdGFydERhdGUpKSB7XHJcblx0XHRcdFx0XHRcdGRhdGFbdmFsdWVGaWVsZF0gPSBhcmdzLmNlbGxTZXRzW2ldW3ZhbHVlRmllbGRdO1xyXG5cdFx0XHRcdFx0XHRiZWZvcmVTdGFydFZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0XHRiZWZvcmVTdGFydE5BVkFkaiArPSBkYXRhW3ZhbHVlRmllbGRdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhbW9tZW50KGRhdGEuZGF0ZSkuaXNCZXR3ZWVuKFxyXG5cdFx0XHRcdFx0XHRcdHN0YXJ0RGF0ZSxcclxuXHRcdFx0XHRcdFx0XHRlbmREYXRlLFxyXG5cdFx0XHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRcdFx0XCJbXVwiXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0Ly8g5aaC5p6c5pivTVRELFFURCxZVEQg5YiZ6ZyA6KaB5oqK5b2T5YmN6Zi25q615Lul5YmN55qE5omA5pyJ5pWw5o2u6L+b6KGM5rGH5oC777yM5Yqg5YWl6K6h566XXHJcblx0XHRcdGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xyXG5cdFx0XHRcdHZhbHVlcy51bnNoaWZ0KHtcclxuXHRcdFx0XHRcdGFtb3VudDogLWJlZm9yZVN0YXJ0TkFWQWRqLCAvLyDlvIDlp4vnmoTmlbDmja7pnIDopoHlj5blj41cclxuXHRcdFx0XHRcdGRhdGU6IHRoaXMucGJmLnRpbWUoc3RhcnREYXRlKSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImJlZm9yZVN0YXJ0VmFsdWVzOlwiLCBiZWZvcmVTdGFydFZhbHVlcyk7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwidmFsdWVzOlwiLCB2YWx1ZXMpO1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRsZXQgZ3Vlc3MgPSAwLjE7XHJcblx0XHRcdFx0Y29uc3Qgc3VtQW1vdW50ID0gdmFsdWVzXHJcblx0XHRcdFx0XHQubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudClcclxuXHRcdFx0XHRcdC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKTtcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50IDwgMCkge1xyXG5cdFx0XHRcdFx0Z3Vlc3MgPSAtMC4xO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL1NNUDItMjI0OSBmaXhlZCB0aGUgYmlnIGlyciBpc3N1ZVxyXG5cdFx0XHRcdGlmIChzdW1BbW91bnQgPT09IDApIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSAwO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUl0ZW1zID0gdmFsdWVzLnNsaWNlKDAsIHZhbHVlcy5sZW5ndGggLSAxKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudCk7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmRhdGUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdEl0ZW0gPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmF2QWRqdXN0ID0gbGFzdEl0ZW0uYW1vdW50O1xyXG5cdFx0XHRcdFx0Y29uc3QgbGF0ZXN0RGF0ZSA9IGxhc3RJdGVtLmRhdGU7XHJcblx0XHRcdFx0XHRsZXQgaXJyID1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5FeGNlbEZvcm11bGFzLl9DYWxjdWxhdGVYaXJyKFxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRkYXRlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRuYXZBZGp1c3QsXHJcblx0XHRcdFx0XHRcdFx0bGF0ZXN0RGF0ZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGlyciA9PT0gbnVsbCA/IFwiXCIgOiBpcnI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYXJncy52YWx1ZTpcIiwgYXJncy52YWx1ZSk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZSAmJlxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV1cclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0ZGVsZXRlIHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV07XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXSA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IGFyZ3MuZmllbGROYW1lLFxyXG5cdFx0XHRcdFx0Zm9ybWF0OlxyXG5cdFx0XHRcdFx0XHRmaWVsZC5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0PyBmaWVsZFswXS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmRwXHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHQ6IFwiUDJcIixcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gIFNNUDItMTY1MjAgVFdSIOaciC/lraMv5bm0ICYmIFNNUDItMTY2ODMgVkFSXHJcblx0XHRpZiAoXHJcblx0XHRcdFtcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVRXUk1URFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVFdSUVREXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVUV1JZVERcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85OVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk5XCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTlcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85NVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk1XCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTVcIixcclxuXHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT09PT09PVwiKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhcmdzOlwiLCBhcmdzKTtcclxuXHRcdFx0bGV0IHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlXCI7XHJcblx0XHRcdGxldCBkYXRlRmllbGQgPSBcIklSUkRhdGVcIjtcclxuXHRcdFx0bGV0IHRpbWVSYW5nZTtcclxuXHRcdFx0c3dpdGNoIChhcmdzLmFnZ3JlZ2F0ZVR5cGUpIHtcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVFdSTVREXCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUk1URF85OVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJNVERfOTVcIjpcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSA9IFwibW9udGhcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVUV1JRVERcIjpcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVkFSUVREXzk5XCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUlFURF85NVwiOlxyXG5cdFx0XHRcdFx0dGltZVJhbmdlID0gXCJxdWFydGVyXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVFdSWVREXCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUllURF85OVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJZVERfOTVcIjpcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSA9IFwieWVhclwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTsgLy8g6L+Z5Liq6Zi25q6155qE57Sv6K6h6ZuG5ZCIXHJcblx0XHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRlbC5jb2xOYW1lID09PVxyXG5cdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRBZ2dyZWdhdGVUeXBlKFxyXG5cdFx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGVcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFt2YWx1ZUZpZWxkXTogYXJncy5jZWxsU2V0c1tpXVt2YWx1ZUZpZWxkXSxcclxuXHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSA9PT1cclxuXHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyDlpoLmnpxhc09mRGF0ZeS4jeaYryDmnKzmnIgv5a2j5bqmL+W5tCDnmoTmnIDlkI7kuIDlpKnvvIzpg73mmK/miKroh7Mg5LiK5Liq5pyIL+Wto+W6pi/lubQg55qE5pyA5ZCO5LiA5aSp55qE5pWw5o2u5Y676K6h566XXHJcblx0XHRcdGxldCBfYXNPZkRhdGUgPSBtb21lbnQoYXNPZkRhdGUpO1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcIl9hc09mRGF0ZTpcIiwgX2FzT2ZEYXRlKTtcclxuXHRcdFx0bGV0IGlzRW5kT2ZQZXJpb2QgPSAodW5pdCkgPT4ge1xyXG5cdFx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0XHRfYXNPZkRhdGUuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSA9PT1cclxuXHRcdFx0XHRcdF9hc09mRGF0ZS5lbmRPZih1bml0KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fTtcclxuXHRcdFx0bGV0IGVuZERhdGUgPSBpc0VuZE9mUGVyaW9kKHRpbWVSYW5nZSlcclxuXHRcdFx0XHQ/IG1vbWVudChhc09mRGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxyXG5cdFx0XHRcdDogbW9tZW50KGFzT2ZEYXRlKVxyXG5cdFx0XHRcdFx0XHQuc3VidHJhY3QoMSwgdGltZVJhbmdlKVxyXG5cdFx0XHRcdFx0XHQuZW5kT2YodGltZVJhbmdlKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiZW5kRGF0ZTpcIiwgZW5kRGF0ZSk7XHJcblx0XHRcdHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+XHJcblx0XHRcdFx0bW9tZW50KGl0ZW0uZGF0ZSkuaXNTYW1lT3JCZWZvcmUoZW5kRGF0ZSlcclxuXHRcdFx0KTtcclxuXHRcdFx0dmFsdWVzID0gc29ydEJ5KHZhbHVlcywgXCJkYXRlXCIpO1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcInZhbHVlczpcIiwgdmFsdWVzKTtcclxuXHJcblx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGxldCByZXN1bHQgPSB0aGlzLmdldFRpbWVSYW5nZXMoXHJcblx0XHRcdFx0XHR2YWx1ZXMsXHJcblx0XHRcdFx0XHRlbmREYXRlLFxyXG5cdFx0XHRcdFx0dGltZVJhbmdlLFxyXG5cdFx0XHRcdFx0XCJkYXRlXCJcclxuXHRcdFx0XHQpOyAvLyDlkITkuKrpmLbmrrXnmoTmlbDmja5cclxuXHRcdFx0XHRsZXQgcmVzdWx0VG90YWwgPSB7fTsgLy8g5ZCE5Liq6Zi25q615oC75ZKMXHJcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wIGluIHJlc3VsdCkge1xyXG5cdFx0XHRcdFx0cmVzdWx0VG90YWxbcHJvcF0gPSByZXN1bHRbcHJvcF0ucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWNjICsgKGN1clt2YWx1ZUZpZWxkXSB8fCAwKTtcclxuXHRcdFx0XHRcdH0sIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInJlc3VsdFRvdGFsOlwiLCByZXN1bHRUb3RhbCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGN1bXVsYXRpdmVTdW0gPSB7fTsgLy8g5ZCE5Liq6Zi25q6157Sv6K6h5ZKMXHJcblx0XHRcdFx0bGV0IHN1bSA9IDA7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0VG90YWwpKSB7XHJcblx0XHRcdFx0XHRzdW0gKz0gcmVzdWx0VG90YWxba2V5XTtcclxuXHRcdFx0XHRcdGN1bXVsYXRpdmVTdW1bYCR7a2V5fWBdID0gc3VtO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImN1bXVsYXRpdmVTdW06XCIsIGN1bXVsYXRpdmVTdW0pO1xyXG5cclxuXHRcdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY3VtdWxhdGl2ZVN1bSk7XHJcblx0XHRcdFx0bGV0IHR3ckxpc3QgPSBbXTtcclxuXHRcdFx0XHQvLyDpgY3ljobmr4/kuKTkuKrpmLbmrrUg6K6h566XVFdSXHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3Qga2V5MSA9IGtleXNbaV07XHJcblx0XHRcdFx0XHRjb25zdCBrZXkyID0ga2V5c1tpICsgMV07XHJcblxyXG5cdFx0XHRcdFx0Ly8g6K6h566X5Lik5Liq6Zi25q615LmL6Ze055qE6YCS5aKe6YePLCDlh7rmlbDkuI3og73kuLowXHJcblx0XHRcdFx0XHRpZiAoY3VtdWxhdGl2ZVN1bVtrZXkxXSAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluY3JlbWVudCA9XHJcblx0XHRcdFx0XHRcdFx0Y3VtdWxhdGl2ZVN1bVtrZXkyXSAtIGN1bXVsYXRpdmVTdW1ba2V5MV07XHJcblx0XHRcdFx0XHRcdGxldCB0d3IgPSBpbmNyZW1lbnQgLyBjdW11bGF0aXZlU3VtW2tleTFdO1xyXG5cdFx0XHRcdFx0XHR0d3JMaXN0LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGRhdGU6IGtleTIsXHJcblx0XHRcdFx0XHRcdFx0dHdyOiB0d3IsXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyDorqHnrpdBdmVyYWdlIFRXUlxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidHdyTGlzdDpcIiwgdHdyTGlzdCk7XHJcblx0XHRcdFx0bGV0IGF2ZXJhZ2VUV1IgPSB0aGlzLmNhbGN1bGF0ZUdyb3d0aFJhdGUoXHJcblx0XHRcdFx0XHR0d3JMaXN0Lm1hcCgoeCkgPT4geC50d3IpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIuiuoeeul0F2ZXJhZ2UgVFdSOlwiLCBhdmVyYWdlVFdSKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRbXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSTVREXCIsXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSUVREXCIsXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSWVREXCIsXHJcblx0XHRcdFx0XHRdLmluY2x1ZGVzKGFyZ3MuYWdncmVnYXRlVHlwZSlcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIFNNUDItMTY1MjAgVFdSIOaciC/lraMv5bm0XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0aXNOYU4oYXZlcmFnZVRXUikgfHwgYXZlcmFnZVRXUiA9PSBudWxsXHJcblx0XHRcdFx0XHRcdFx0PyBcIlwiXHJcblx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoYXZlcmFnZVRXUik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChpc05hTihhdmVyYWdlVFdSKSB8fCBhdmVyYWdlVFdSID09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBTTVAyLTE2NjgzIFZBUiDljLrliIY5OSXlkow5NSVcclxuXHRcdFx0XHRcdFx0bGV0IFpTY29yZSA9IFtcclxuXHRcdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85OVwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk5XCIsXHJcblx0XHRcdFx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTlcIixcclxuXHRcdFx0XHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHRcdFx0XHRcdFx0PyAyLjMzXHJcblx0XHRcdFx0XHRcdFx0OiAxLjY1O1xyXG5cdFx0XHRcdFx0XHRpZiAodHdyTGlzdC5sZW5ndGggPCAyKSB7XHJcblx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IFNEID0gdGhpcy5jYWxjdWxhdGVTdGFuZGFyZERldmlhdGlvbihcclxuXHRcdFx0XHRcdFx0XHRcdHR3ckxpc3QubWFwKCh4KSA9PiB4LnR3cilcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiY2FsY3VsYXRlU3RhbmRhcmREZXZpYXRpb246XCIsIFNEKTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgVkFSID0gYXZlcmFnZVRXUiAtIFNEICogWlNjb3JlO1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBOdW1iZXIoVkFSKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImFyZ3MudmFsdWU6XCIsIGFyZ3MudmFsdWUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vU01QMi0yNzAxXHJcblx0XHRpZiAoYXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWRcIikge1xyXG5cdFx0XHRsZXQgTkFWQWRqID0gMDtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdC8vU01QMi0yNzEzIG9ubHkganVkZ2UgZm9yIHRoaXMgZGF0YU1hcnQoR3Jvc3NOZXQpXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSA9PT0gXCJHcm9zc05ldFwiIHx8XHJcblx0XHRcdFx0dGhpcy5wb3J0bGV0LmZpZ3VyZUNvZGUgPT09XHJcblx0XHRcdFx0XHRcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJncy5jZWxsU2V0c1tpXVtcIkFjdHVhbEF1ZGl0ZWROQVZcIl07XHJcblx0XHRcdFx0XHRpZiAoZGF0YS5hbW91bnQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9maWx0ZXIgdGhlIGRhdGEgYnkgdGhlIERhdGFUeXBlKEFjdHVhbCBSZXBvcnRlZCBBdWRpdGVkKVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRsZXQgYXJnc2RhdGEgPSBhcmdzLmNlbGxTZXRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0ZWwuRGF0YVR5cGUgPT09IFwiQUNUVUFMX0FVRElURURcIiB8fFxyXG5cdFx0XHRcdFx0XHRlbC5EYXRhVHlwZSA9PT0gXCJSRVBPUlRFRFwiXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3NkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3NkYXRhW2ldW1wiSVJSQW1vdW50XCJdLFxyXG5cdFx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJnc2RhdGFbaV1bXCJJUlJEYXRlXCJdKSA9PT1cclxuXHRcdFx0XHRcdFx0XHRcIkludmFsaWQgZGF0ZVwiXHJcblx0XHRcdFx0XHRcdFx0XHQ/IGFzT2ZEYXRlXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJnc2RhdGFbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJnc2RhdGFbaV1bXCJJUlJBZGpWYWx1ZVwiXTtcclxuXHRcdFx0XHRcdGlmIChkYXRhLmFtb3VudCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0bGV0IGd1ZXNzID0gMC4xO1xyXG5cdFx0XHRcdGNvbnN0IHN1bUFtb3VudCA9IHZhbHVlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpXHJcblx0XHRcdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VyciwgMCk7XHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA8IDApIHtcclxuXHRcdFx0XHRcdGd1ZXNzID0gLTAuMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9TTVAyLTIyNDkgZml4ZWQgdGhlIGJpZyBpcnIgaXNzdWVcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50ID09PSAwKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVJdGVtcyA9IHZhbHVlcy5zbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJdGVtID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hdkFkanVzdCA9IGxhc3RJdGVtLmFtb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdERhdGUgPSBsYXN0SXRlbS5kYXRlO1xyXG5cdFx0XHRcdFx0bGV0IGlyciA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuRXhjZWxGb3JtdWxhcy5fQ2FsY3VsYXRlWGlycihcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0bmF2QWRqdXN0LFxyXG5cdFx0XHRcdFx0XHRcdGxhdGVzdERhdGVcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBpcnIgPT09IG51bGwgPyAwIDogaXJyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly9TTVAyLTM0MTFcclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlSVJSUmVwb3J0ZWRcIikge1xyXG5cdFx0XHRsZXQgTkFWQWRqID0gMDtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSA9PT0gXCJHcm9zc05ldFwiIHx8XHJcblx0XHRcdFx0dGhpcy5wb3J0bGV0LmZpZ3VyZUNvZGUgPT09XHJcblx0XHRcdFx0XHRcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJncy5jZWxsU2V0c1tpXVtcIlJlcG9ydGVkTkFWXCJdO1xyXG5cdFx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goZGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0YW1vdW50OiBhcmdzLmNlbGxTZXRzW2ldW1wiSVJSQW1vdW50XCJdLFxyXG5cdFx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtcIklSUkRhdGVcIl0pID09PVxyXG5cdFx0XHRcdFx0XHRcdFwiSW52YWxpZCBkYXRlXCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSksXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0TkFWQWRqICs9IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBZGpWYWx1ZVwiXTtcclxuXHRcdFx0XHRcdGlmIChkYXRhLmFtb3VudCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0bGV0IGd1ZXNzID0gMC4xO1xyXG5cdFx0XHRcdGNvbnN0IHN1bUFtb3VudCA9IHZhbHVlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpXHJcblx0XHRcdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VyciwgMCk7XHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA8IDApIHtcclxuXHRcdFx0XHRcdGd1ZXNzID0gLTAuMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9TTVAyLTIyNDkgZml4ZWQgdGhlIGJpZyBpcnIgaXNzdWVcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50ID09PSAwKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVJdGVtcyA9IHZhbHVlcy5zbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJdGVtID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hdkFkanVzdCA9IGxhc3RJdGVtLmFtb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdERhdGUgPSBsYXN0SXRlbS5kYXRlO1xyXG5cdFx0XHRcdFx0bGV0IGlyciA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuRXhjZWxGb3JtdWxhcy5fQ2FsY3VsYXRlWGlycihcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0bmF2QWRqdXN0LFxyXG5cdFx0XHRcdFx0XHRcdGxhdGVzdERhdGVcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXJyID09PSBudWxsID8gMCA6IGlycjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IDA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlICYmXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXTtcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogYXJncy5maWVsZE5hbWUsXHJcblx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdGZpZWxkLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdFx0XHQ/IGZpZWxkWzBdLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0WzBdLmZvcm1hdENoZWNrZWRcclxuXHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZHBcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdDogXCJQMlwiLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU11bHRpcGxlXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZVBJQ1wiIHx8XHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVEUElcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlVFZQSVwiIHx8XHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVSVlBJXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU1BY3R1YWxBdWRpdGVkXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU1SZXBvcnRlZFwiXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IHRvdGFsTnVtZXJhdG9yID0gMDtcclxuXHRcdFx0bGV0IHRvdGFsRGVub21pbmF0b3IgPSAwO1xyXG5cdFx0XHRsZXQgbnVtZXJhdG9yTmFtZTtcclxuXHRcdFx0bGV0IGRlbm9taW5hdG9yTmFtZTtcclxuXHRcdFx0bGV0IGZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdGVsLmNvbE5hbWUgPT09XHJcblx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldEFnZ3JlZ2F0ZVR5cGUoXHJcblx0XHRcdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGNvbnN0IGZvcm11bGFBcnJheSA9IGZpZWxkWzBdLmZvcm11bGEuc3BsaXQoXCIvXCIpO1xyXG5cdFx0XHRcdG51bWVyYXRvck5hbWUgPSBmb3JtdWxhQXJyYXlbMF07XHJcblx0XHRcdFx0ZGVub21pbmF0b3JOYW1lID0gZm9ybXVsYUFycmF5WzFdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdHRvdGFsTnVtZXJhdG9yICs9IGFyZ3MuY2VsbFNldHNbal1bbnVtZXJhdG9yTmFtZV07XHJcblx0XHRcdFx0dG90YWxEZW5vbWluYXRvciArPSBhcmdzLmNlbGxTZXRzW2pdW2Rlbm9taW5hdG9yTmFtZV07XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRvdGFsRGVub21pbmF0b3IgIT09IDApIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gdG90YWxOdW1lcmF0b3IgLyB0b3RhbERlbm9taW5hdG9yO1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlICYmXHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW1xyXG5cdFx0XHRcdFx0XHRhcmdzLmZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRcdG5hbWU6IGFyZ3MuZmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyBmaWVsZFswXS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdE11bHRpcGxlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0TXVsdGlwbGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogXCIjIyMwLjAwJ3gnXCIsXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiRmlyc3RcIiB8fCBhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiTGFzdFwiKSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRGaXN0TGFzdChcclxuXHRcdFx0XHRhcmdzLFxyXG5cdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSxcclxuXHRcdFx0XHRhcmdzLmZpZWxkTmFtZVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNvdW50XCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkRpc3RpbmN0Q291bnRcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGlmIChhcmdzLnZhbHVlKSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUudG9GaXhlZCgyKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0IWFyZ3MudmFsdWUgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gMCAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBmYWxzZSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBcImZhbHNlXCJcclxuXHRcdCkge1xyXG5cdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHR9XHJcblx0XHQvLyDmlrDlu7pwaXZvdCB0YWJsZSwg6L+Y5rKh5pyJ6K6+572ucm93LCDpgInkuoZjb2x1bW7kuYvlkI5ncmFuZHRvdGFs5Lya5pyJ5YC8XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiICYmXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzLmxlbmd0aFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0fVxyXG5cdFx0Ly9TTVAyLTI4ODlcclxuXHRcdGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcInN1YlRvdGFsXCIpIHtcclxuXHRcdFx0Y29uc3QgdmFsdWVGaWVsZF9kYXRhID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGEubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGFbMF0uc2hvd1N1YlRvdGFscyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0YXJncy5za2lwRm9ybWF0dGluZyA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIpIHtcclxuXHRcdFx0Y29uc3QgdmFsdWVGaWVsZF9kYXRhID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGEubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGFbMF0uc2hvd0dyYW5kVG90YWxzID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIFNNUDItMzQxNiBzdGFydFxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnplcm9Gb3JtYXREYXRhLmhnTGlzdC5pbmNsdWRlcyhhcmdzLmZpZWxkTmFtZSkgJiZcclxuXHRcdFx0YXJncy52YWx1ZSA9PT0gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBcIi1cIjtcclxuXHRcdFx0YXJncy5za2lwRm9ybWF0dGluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0LmluY2x1ZGVzKGFyZ3MuZmllbGROYW1lKSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlID09PSAwXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdGFyZ3Muc2tpcEZvcm1hdHRpbmcgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLm1pbGxpb25GaWVsZHMuaW5jbHVkZXMoYXJncy5maWVsZE5hbWUpICYmXHJcblx0XHRcdCFpc05hTihOdW1iZXIoYXJncy52YWx1ZSkpICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IDAgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBudWxsXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT0gXCJncmFuZFRvdGFsXCIgJiZcclxuXHRcdFx0XHRhcmdzLnJvd0NlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGlmICghdGhpcy50b3RhbEZvcm1hdHRlZFthcmdzLmZpZWxkTmFtZV0pIHtcclxuXHRcdFx0XHRcdHRoaXMudG90YWxGb3JtYXR0ZWRbYXJncy5maWVsZE5hbWVdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBhcmdzLnZhbHVlIC8gMTAwMDAwMDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDAwMDAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU01QMi0yNDg2ICYgcGVyY2VudE51beeahGZvcm1hdOmXrumimFxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnBlcmNlbnROdW1GaWVsZHMubGVuZ3RoICYmXHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcy5pbmNsdWRlcyhhcmdzLmZpZWxkTmFtZSkgJiZcclxuXHRcdFx0IWlzTmFOKE51bWJlcihhcmdzLnZhbHVlKSkgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gMCAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBcIlwiICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IG51bGxcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIiAmJlxyXG5cdFx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT0gXCJncmFuZFRvdGFsXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnRvdGFsRm9ybWF0dGVkW2FyZ3MuZmllbGROYW1lXSkge1xyXG5cdFx0XHRcdFx0dGhpcy50b3RhbEZvcm1hdHRlZFthcmdzLmZpZWxkTmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBhcmdzLnZhbHVlIC8gMTAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PSBcIkNhbGN1bGF0ZWRGaWVsZFwiICYmXHJcblx0XHRcdCFpc05hTihOdW1iZXIoYXJncy52YWx1ZSkpICYmXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdLmZvcm1hdFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBOdW1iZXIoYXJncy52YWx1ZSkudG9GaXhlZCgyKTtcclxuXHRcdH1cclxuXHRcdC8vIFNNUDItMzQxNiBlbmRcclxuXHRcdHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjYWxjdWxhdGVkRmlzdExhc3QoYXJncywgYWdncmVnYXRlVHlwZSwgZmllbGROYW1lKSB7XHJcblx0XHRpZiAoIWFyZ3Mucm93LmFjdHVhbFRleHQpIGFyZ3Mucm93LmFjdHVhbFRleHQgPSBhcmdzLnJvdy5mb3JtYXR0ZWRUZXh0O1xyXG5cdFx0aWYgKCFhcmdzLmNvbHVtbi5hY3R1YWxUZXh0KVxyXG5cdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ID0gYXJncy5jb2x1bW4uZm9ybWF0dGVkVGV4dDtcclxuXHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0KGVsKSA9PiBlbC5jb2xOYW1lID09PSBmaWVsZE5hbWVcclxuXHRcdClbMF07XHJcblx0XHRpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJ2YWx1ZVwiICYmICFhcmdzLnJvdy5oYXNDaGlsZCkge1xyXG5cdFx0XHRpZiAoYXJncy5jZWxsU2V0c1swXSkge1xyXG5cdFx0XHRcdGlmIChhZ2dyZWdhdGVUeXBlID09PSBcIkZpcnN0XCIpIHtcclxuXHRcdFx0XHRcdGZvciAoXHJcblx0XHRcdFx0XHRcdGxldCBmaXJzdEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdFx0Zmlyc3RJbmRleCA8IGFyZ3MuY2VsbFNldHMubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRmaXJzdEluZGV4KytcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT1cclxuXHRcdFx0XHRcdFx0XHRcdDEgJiZcclxuXHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwic3RyaW5nXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnZhcmNoYXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoXHJcblx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW2FyZ3Mucm93LnJvd0luZGV4XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVswXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqKSBhcmdzLnZhbHVlID0gb2JqLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBudWxsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy5jZWxsU2V0c1tmaXJzdEluZGV4XVtmaWVsZE5hbWVdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm51bWJlclwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJtdWx0aXBsZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSAhPSBudWxsKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYmYudGltZShhcmdzLnZhbHVlKSA+IFwiMTkwMC0wMS0wMVwiKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhcmdzLnZhbHVlKSBicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0ZVR5cGUgPT09IFwiTGFzdFwiKSB7XHJcblx0XHRcdFx0XHRmb3IgKFxyXG5cdFx0XHRcdFx0XHRsZXQgbGFzdEluZGV4ID0gYXJncy5jZWxsU2V0cy5sZW5ndGggLSAxO1xyXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPj0gMDtcclxuXHRcdFx0XHRcdFx0bGFzdEluZGV4LS1cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT1cclxuXHRcdFx0XHRcdFx0XHRcdDEgJiZcclxuXHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwic3RyaW5nXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnZhcmNoYXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoXHJcblx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW2FyZ3Mucm93LnJvd0luZGV4XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVswXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqKSBhcmdzLnZhbHVlID0gb2JqLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBudWxsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy5jZWxsU2V0c1tsYXN0SW5kZXhdW2ZpZWxkTmFtZV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm51bWJlclwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJtdWx0aXBsZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSAhPSBudWxsKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYmYudGltZShhcmdzLnZhbHVlKSA+IFwiMTkwMC0wMS0wMVwiKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhcmdzLnZhbHVlKSBicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnVtYmVyXCIgfHxcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibXVsdGlwbGVcIiB8fFxyXG5cdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwicGVyY2VudE51bVwiXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdCFOdW1iZXIodGhpcy5ncmFuZFRvdGFsc1tmaWVsZE5hbWVdKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0aXNOYU4oTnVtYmVyKHRoaXMuZ3JhbmRUb3RhbHNbZmllbGROYW1lXSkpXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV0gPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy5hZ2dyZWdhdGVUeXBlICE9PSBcIkNhbGN1bGF0ZWRGaWVsZFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV0gKz0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCA9PSAxXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIFwicm93XCIgKyBhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZmllbGROYW1lIOihqOekuihjZWxsOiBhcmdzLnJvd0NlbGxUeXBlID09PSBcInZhbHVlXCIgJiYgYXJncy5jb2x1bW5DZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIpXHJcblx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0IU51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvd1wiICsgYXJncy5yb3cuYWN0dWFsVGV4dCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHQpIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRpc05hTihcclxuXHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvd1wiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArIGFyZ3Mucm93LmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF0gPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArIGFyZ3Mucm93LmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRdICs9IE51bWJlcihhcmdzLnZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gXCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWUg6KGo56S6KGNlbGw6IGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiICYmIGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT09IFwidmFsdWVcIilcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHQhTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0aXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XSArPSBOdW1iZXIoYXJncy52YWx1ZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJzdWJUb3RhbFwiIHx8IGFyZ3Mucm93Lmhhc0NoaWxkKSB7XHJcblx0XHRcdGNvbnN0IGRhdGFUeXBlID0gZmllbGQuZGF0YVR5cGU7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09PSBcIm52YXJjaGFyXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgdmFsdWUgPSAwO1xyXG5cdFx0XHRcdGxldCBjaGlsZEhlYWRlcnMgPSBbXTtcclxuXHRcdFx0XHRpZiAoYWdncmVnYXRlVHlwZSA9PT0gXCJGaXJzdFwiKSB7XHJcblx0XHRcdFx0XHRsZXQgZ3JvdXBOYW1lQXJyYXlzID0gW107XHJcblx0XHRcdFx0XHRsZXQgcm93cyA9IHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3M7XHJcblx0XHRcdFx0XHRmb3IgKFxyXG5cdFx0XHRcdFx0XHRsZXQgaW5kZXggPSBhcmdzLnJvdy5sZXZlbDtcclxuXHRcdFx0XHRcdFx0aW5kZXggPCByb3dzLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0aW5kZXgrK1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGdyb3VwTmFtZUFycmF5cy5wdXNoKHJvd3NbaW5kZXhdLm5hbWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0bGV0IGhlYWRlciA9IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0XHRcdC5tYXAoKG5hbWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGFyZ3MuY2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFyZ3MuY2VsbFNldHNbaV1bbmFtZV07XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0XHRcdGlmICghKGNoaWxkSGVhZGVycyBhcyBhbnkpLmluY2x1ZGVzKGhlYWRlcikpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZmlsdGVyT2JqOiBhbnkgPSB7fTtcclxuXHRcdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KG5hbWUsIHgpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbeF0pXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgX0NlbGxTZXRzID0gX2ZpbHRlcihhcmdzLmNlbGxTZXRzLCBmaWx0ZXJPYmopO1xyXG5cdFx0XHRcdFx0XHRcdGNoaWxkSGVhZGVycy5wdXNoKGhlYWRlcik7XHJcblx0XHRcdFx0XHRcdFx0dmFsdWUgKz0gTnVtYmVyKF9DZWxsU2V0c1swXVtmaWVsZE5hbWVdKSB8fCAwO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhZ2dyZWdhdGVUeXBlID09PSBcIkxhc3RcIikge1xyXG5cdFx0XHRcdFx0bGV0IGdyb3VwTmFtZUFycmF5cyA9IFtdO1xyXG5cdFx0XHRcdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0bGV0IGluZGV4ID0gYXJncy5yb3cubGV2ZWw7XHJcblx0XHRcdFx0XHRcdGluZGV4IDwgcm93cy5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdGluZGV4KytcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMucHVzaChyb3dzW2luZGV4XS5uYW1lKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSBhcmdzLmNlbGxTZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0bGV0IGhlYWRlciA9IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0XHRcdC5tYXAoKG5hbWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGFyZ3MuY2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFyZ3MuY2VsbFNldHNbaV1bbmFtZV07XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0XHRcdGlmICghKGNoaWxkSGVhZGVycyBhcyBhbnkpLmluY2x1ZGVzKGhlYWRlcikpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZmlsdGVyT2JqOiBhbnkgPSB7fTtcclxuXHRcdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KG5hbWUsIHgpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbeF0pXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgX0NlbGxTZXRzID0gX2ZpbHRlcihhcmdzLmNlbGxTZXRzLCBmaWx0ZXJPYmopO1xyXG5cdFx0XHRcdFx0XHRcdGNoaWxkSGVhZGVycy5wdXNoKGhlYWRlcik7XHJcblx0XHRcdFx0XHRcdFx0dmFsdWUgKz1cclxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0X0NlbGxTZXRzW19DZWxsU2V0cy5sZW5ndGggLSAxXVtmaWVsZE5hbWVdXHJcblx0XHRcdFx0XHRcdFx0XHQpIHx8IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICE9PSBcIkdyYW5kIFRvdGFsXCIpXHJcblx0XHRcdFx0XHR0aGlzLmNvbHVtblRleHRzLnB1c2goYXJncy5jb2x1bW4uYWN0dWFsVGV4dCk7XHJcblxyXG5cdFx0XHRcdGlmICghdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IU51bWJlcih0aGlzLnN1YlRvdGFsc1tmaWVsZE5hbWVdKSB8fFxyXG5cdFx0XHRcdFx0XHRpc05hTihOdW1iZXIodGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSkpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tmaWVsZE5hbWVdICs9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09IDFcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IU51bWJlcihcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHQpIHx8XHJcblx0XHRcdFx0XHRcdGlzTmFOKFxyXG5cdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdF0gPSAwO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbXHJcblx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRdICs9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIC0tLT4gYWxsRGF0YVZhbHVl5Lit6L+Z5Liq5Y2V5YWD5qC855qE5YC85LiN5q2j56GuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIgJiZcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09IDFcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFsbERhdGFWYWx1ZSAmJiB0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICsgXCJHcmFuZCBUb3RhbFwiICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY29sdW1uVGV4dHMgPSB1bmlxQnkodGhpcy5jb2x1bW5UZXh0cywgKGVsKSA9PiBlbCk7XHJcblx0XHRcdFx0XHRcdGxldCB2YWwgPSAwO1xyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uVGV4dHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBlbGVtZW50ID0gdGhpcy5jb2x1bW5UZXh0c1tpXTtcclxuXHRcdFx0XHRcdFx0XHR2YWwgKz1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZWxlbWVudCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gdmFsO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiKSB7XHJcblx0XHRcdGNvbnN0IGRhdGFUeXBlID0gZmllbGQuZGF0YVR5cGU7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcInN0cmluZ1wiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJudmFyY2hhclwiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWxsRGF0YVZhbHVlICYmIHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgcm93T2JqcyA9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWVbdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRcdGlmIChyb3dPYmpzKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianNBcnIgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGxldCBvYmpBcnIgPSByb3dPYmpzQXJyLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiYgZWwuaXNHcmFuZFN1bVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9iakFyciAmJiBvYmpBcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gb2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModGhpcy5ncmFuZFRvdGFscykuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IHRoaXMuZ3JhbmRUb3RhbHNbZmllbGROYW1lXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChhcmdzLmNvbHVtbkNlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIikge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5hbGxEYXRhVmFsdWUgJiYgdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWVbdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzQXJyID0gSlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgb2JqQXJyID0gcm93T2Jqc0Fyci5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsLmlzR3JhbmRTdW1cclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAob2JqQXJyICYmIG9iakFyci5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZ3JhbmRUb3RhbHMpLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmFsbERhdGFWYWx1ZSAmJiB0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93T2JqcyA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbERhdGFWYWx1ZVt0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG9iakFyciA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsLmNvbHVtbkhlYWRlcnMgPT0gYXJncy5jb2x1bW4uYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9iakFyciAmJiBvYmpBcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gb2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModGhpcy5ncmFuZFRvdGFscykuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuZm9ybWF0VmFsKGFyZ3MsIGZpZWxkTmFtZSk7XHJcblx0XHRyZXR1cm4gYXJncy52YWx1ZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZm9ybWF0VmFsKGFyZ3MsIGZpZWxkTmFtZSkge1xyXG5cdFx0dGhpcy5jb25maWdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuXHRcdFx0aWYgKGZpZWxkLmNvbE5hbWUgPT0gZmllbGROYW1lKSB7XHJcblx0XHRcdFx0c3dpdGNoIChmaWVsZC5kYXRhVHlwZSkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcclxuXHRcdFx0XHRcdGNhc2UgXCJkYXRldGltZVwiOlxyXG5cdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSkgYXJncy52YWx1ZSA9IG5ldyBEYXRlKGFyZ3MudmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldGV4Y2x1ZGVGaWVsZHMoZmllbGRzLCBkYXRhKSB7XHJcblx0XHRsZXQgbmFtZWFycmF5ID0gW107XHJcblx0XHRsZXQgYXJyYXkgPSBbXTtcclxuXHRcdGZvciAobGV0IHByb3AgaW4gZGF0YSkge1xyXG5cdFx0XHRhcnJheS5wdXNoKHByb3ApO1xyXG5cdFx0fVxyXG5cdFx0Zm9yIChsZXQgaXRlbSBvZiBmaWVsZHMpIHtcclxuXHRcdFx0bmFtZWFycmF5LnB1c2goaXRlbS5jb2xOYW1lKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZXhjbHVkZUZpZWxkcyA9IGRpZmZlcmVuY2VXaXRoKGFycmF5LCBuYW1lYXJyYXkpO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLmV4Y2x1ZGVGaWVsZHMubGVuZ3RoICYmXHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MgJiZcclxuXHRcdFx0dGhpcy5jb25maWcuZ3JvdXBTZXR0aW5ncy5sZW5ndGhcclxuXHRcdCkge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXhjbHVkZUZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IGVsID0gdGhpcy5leGNsdWRlRmllbGRzW2ldO1xyXG5cdFx0XHRcdGlmIChzdGFydHNXaXRoKGVsLCB0aGlzLmNvbmZpZy5ncm91cFNldHRpbmdzWzBdLm5hbWUgKyBcIl9cIikpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXhjbHVkZUZpZWxkcy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRpLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEluZm8oKSB7XHJcblx0XHR0aGlzLmRhdGVQaXBlRm9ybWF0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkYXRlUGlwZVwiKTtcclxuXHRcdHRoaXMudHJhbnNsYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidHJhbnNsYXRpb25cIikpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIG9uRmllbGREcm9wKGFyZ3M6IEZpZWxkRHJvcEV2ZW50QXJncykge1xyXG5cdFx0dGhpcy5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVzID0gWy4uLmFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnZhbHVlc107XHJcblx0XHQvL2NoYW5nZSB0aGUgY2FsY3VhbHRlRmllbGQgbWV0aG9kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBjYWxjdWxhdGVcclxuXHRcdGNvbnN0IGNhbGN1YWx0ZUZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lICYmIGVsLmlzQ2FsY3VsYXRlZEZpZWxkXHJcblx0XHQpO1xyXG5cdFx0aWYgKGNhbGN1YWx0ZUZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJncy5kcm9wRmllbGQudHlwZSA9XHJcblx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRDYWxjdWxhdGVNZXRob2QoXHJcblx0XHRcdFx0XHRjYWxjdWFsdGVGaWVsZFswXS5jb2xOYW1lXHJcblx0XHRcdFx0KSBhcyBhbnk7XHJcblx0XHRcdGFyZ3MuZHJvcEZpZWxkLmNhcHRpb24gPSBhcmdzLmRyb3BGaWVsZC5jYXB0aW9uXHJcblx0XHRcdFx0LnJlcGxhY2UoXCJDYWxjdWxhdGVcIiwgXCJcIilcclxuXHRcdFx0XHQudHJpbSgpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yIChcclxuXHRcdFx0bGV0IGkgPSAwO1xyXG5cdFx0XHRpIDwgYXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3MubGVuZ3RoO1xyXG5cdFx0XHRpKytcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3NbaV0ubmFtZSA9PT1cclxuXHRcdFx0XHRcdGFyZ3MuZmllbGROYW1lICYmXHJcblx0XHRcdFx0YXJncy5kcm9wQXhpcyA9PT0gXCJcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5maWx0ZXJTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0dGhpcy5maWx0ZXJTZXR0aW5ncyA9IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLmZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBDYWxjdWxhdGVkIGZpZWxk5LqL5Lu277ya5Yib5bu6XHJcblx0cHVibGljIGNhbGN1bGF0ZWRGaWVsZENyZWF0ZShhcmdzOiBDYWxjdWxhdGVkRmllbGRDcmVhdGVFdmVudEFyZ3MpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQubmFtZSAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLnRyaW0oKSAhPT0gXCJcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBpbmRleCA9XHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLmZpbmRJbmRleChcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwubmFtZSA9PT0gYXJncy5jYWxjdWxhdGVkRmllbGQubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRpZiAoYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybWF0U3RyaW5nID09PSBcIlwiKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3NbXHJcblx0XHRcdFx0XHRcdGluZGV4XHJcblx0XHRcdFx0XHRdLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzW1xyXG5cdFx0XHRcdFx0XHRpbmRleFxyXG5cdFx0XHRcdFx0XS5mb3JtYXRTdHJpbmcgPSBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmcgPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdGFyZ3MuY2FsY3VsYXRlZEZpZWxkLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8g56e76Zmk6YeN5aSNXHJcblx0XHRcdGxldCBmSW5kZXggPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMuZmluZEluZGV4KFxyXG5cdFx0XHRcdChmKSA9PiBmLm5hbWUgPT09IGFyZ3MuY2FsY3VsYXRlZEZpZWxkLm5hbWVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKGZJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnNwbGljZShmSW5kZXgsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIOWMuemFjei/kOeul+espiBGaXJzdCB8fCBMYXN0XHJcblx0XHRcdGxldCBmb3JtdWxhU3RyID0gYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYTtcclxuXHRcdFx0bGV0IHJlZzEgPSAvXCJGaXJzdFxcKCguKz8pXFwpXCIvZztcclxuXHRcdFx0bGV0IHJlZzIgPSAvXCJMYXN0XFwoKC4rPylcXClcIi9nO1xyXG5cdFx0XHRpZiAocmVnMS50ZXN0KGZvcm11bGFTdHIpIHx8IHJlZzIudGVzdChmb3JtdWxhU3RyKSkge1xyXG5cdFx0XHRcdC8vIOWIpOaWreaYr+WQpuWtmOWcqEZpcnN0IHx8IExhc3Qg6KGo6L6+5byPXHJcblx0XHRcdFx0bGV0IG1hdGNoRmlyc3RGaWVsZHMgPSBBcnJheS5mcm9tKFxyXG5cdFx0XHRcdFx0Zm9ybXVsYVN0cltcIm1hdGNoQWxsXCJdKC9cIkZpcnN0XFwoKC4rPylcXClcIi9nKSxcclxuXHRcdFx0XHRcdChtKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hTdHI6IG1bMF0sXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hXb3JkOiBtWzFdLFxyXG5cdFx0XHRcdFx0XHRcdHJlcGxhY2VWYWx1ZTogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRtYXRjaE1ldGhvZDogXCJGaXJzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTGFzdEZpZWxkcyA9IEFycmF5LmZyb20oXHJcblx0XHRcdFx0XHRmb3JtdWxhU3RyW1wibWF0Y2hBbGxcIl0oL1wiTGFzdFxcKCguKz8pXFwpXCIvZyksXHJcblx0XHRcdFx0XHQobSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdG1hdGNoU3RyOiBtWzBdLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoV29yZDogbVsxXSxcclxuXHRcdFx0XHRcdFx0XHRyZXBsYWNlVmFsdWU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hNZXRob2Q6IFwiTGFzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWF4RmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNYXhcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1heFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWluRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNaW5cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1pblwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoU3VtRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJTdW1cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIlN1bVwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoQXZnRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJBdmdcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIkF2Z1wiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bWF0Y2hGaXJzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdCkgJiZcclxuXHRcdFx0XHRcdG1hdGNoTGFzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIOWIpOaWrUZpcnN05ZKMTGFzdOihqOi+vuW8j+WGheeahOWtl+auteaYr+WQpuWQiOazlVxyXG5cdFx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtdWxhLFxyXG5cdFx0XHRcdFx0XHRtYXRjaEZpZWxkczogW1xyXG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEZpcnN0RmllbGRzLFxyXG5cdFx0XHRcdFx0XHRcdC4uLm1hdGNoTGFzdEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1heEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1pbkZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaFN1bUZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEF2Z0ZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0Z3JhbmRUb3RhbDogMCxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0bGV0IGZpZWxkTmFtZSA9IChcclxuXHRcdFx0XHRcdFx0Zm9ybXVsYVN0ci5zcGxpdChcIkZpcnN0KFwiKVsxXSB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhU3RyLnNwbGl0KFwiTGFzdChcIilbMV1cclxuXHRcdFx0XHRcdCkuc3BsaXQoXCIpXCIpWzBdO1xyXG5cdFx0XHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYSA9XHJcblx0XHRcdFx0XHRcdFwiJ1xcXCJcIiArIFwiU3VtKFwiICsgZmllbGROYW1lICsgJylcIj0nICsgZm9ybXVsYVN0ciArIFwiJ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ2FsY3VsYXRlZCBmaWVsZOS6i+S7tu+8muWujOaIkFxyXG5cdHB1YmxpYyBhY3Rpb25Db21wbGV0ZShhcmdzKSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3MuYWN0aW9uTmFtZSA9PT0gXCJGaWVsZCBhZ2dyZWdhdGVkXCIgfHxcclxuXHRcdFx0YXJncy5hY3Rpb25OYW1lID09PSBcIkZpZWxkIGxpc3QgY2xvc2VkXCJcclxuXHRcdCkge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZXMgPSBbXHJcblx0XHRcdFx0Li4uYXJncy5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVzLFxyXG5cdFx0XHRdO1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlSXRlbURhdGEoKTtcclxuXHRcdH1cclxuXHRcdGlmIChhcmdzLmFjdGlvbk5hbWUgPT0gXCJGaWVsZCByZW1vdmVkXCIpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGFyZ3MuZmllbGRJbmZvICYmXHJcblx0XHRcdFx0YXJncy5maWVsZEluZm8uZmllbGRJdGVtICYmXHJcblx0XHRcdFx0YXJncy5maWVsZEluZm8uZmllbGRJdGVtLnR5cGUgPT0gXCJDYWxjdWxhdGVkRmllbGRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRsZXQgZmllbGQgPSBhcmdzLmZpZWxkSW5mby5maWVsZE5hbWU7XHJcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBkZWxldGVkIGNhbGN1bGF0ZWQgZmllbGQgZnJvbSBhbiBzdG9yZWQgYXJyYXkuXHJcblx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzID1cclxuXHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5maWx0ZXIoZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLm5hbWUgIT09IGZpZWxkO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENhbGN1bGF0ZWQgZmllbGTkuovku7bvvJrlvIDlp4tcclxuXHRwdWJsaWMgYWN0aW9uQmVnaW4oYXJncykge1xyXG5cdFx0aWYgKGFyZ3MuYWN0aW9uTmFtZSA9PT0gXCJFZGl0IGNhbGN1bGF0ZWQgZmllbGRcIikge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lICYmXHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5maWVsZExpc3RbXHJcblx0XHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5maWVsZExpc3RbXHJcblx0XHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lXHJcblx0XHRcdFx0XHRdLmZvcm11bGEgPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0uZm9ybXVsYTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVzaXplU3RvcChhcmdzKSB7XHJcblx0XHRpZiAodGhpcy5jb25maWcuY29sdW1uc1dpZHRoKSB7XHJcblx0XHRcdGNvbnN0IGhlYWRlcl9maWVsZCA9IHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aC5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PiBlbC5oZWFkZXJUZXh0ID09PSBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0XHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChoZWFkZXJfZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGhlYWRlcl9maWVsZFswXS53aWR0aCA9IHBhcnNlSW50KGFyZ3MuY29sdW1uLndpZHRoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGgucHVzaCh7XHJcblx0XHRcdFx0XHRoZWFkZXJUZXh0OiBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0LFxyXG5cdFx0XHRcdFx0d2lkdGg6IHBhcnNlSW50KGFyZ3MuY29sdW1uLndpZHRoKSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY29sdW1uc1dpZHRoID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aC5wdXNoKHtcclxuXHRcdFx0XHRoZWFkZXJUZXh0OiBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0LFxyXG5cdFx0XHRcdHdpZHRoOiBwYXJzZUludChhcmdzLmNvbHVtbi53aWR0aCksXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcG9ydGxldCA9IHRoaXMucG9ydGxldDtcclxuXHRcdHBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLnBvcnRsZXRzLmZpbmRJbmRleCgoeCkgPT4geC5uZXdJZCA9PT0gcG9ydGxldC5uZXdJZCk7XHJcblx0XHRpZiAoaW5kZXggPiAtMSkgdGhpcy5wb3J0bGV0c1tpbmRleF0gPSBwb3J0bGV0O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRDb2x1bW5zUmVuZGVyKGFyZ3MpIHtcclxuXHRcdGlmIChhcmdzLnN0YWNrZWRDb2x1bW5zKSB7XHJcblx0XHRcdGFyZ3Muc3RhY2tlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0Y29sLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0KGNvbC5mb3JtYXQuaW5kZXhPZihcIk5cIikgIT09IC0xIHx8XHJcblx0XHRcdFx0XHRcdGNvbC5mb3JtYXQgPT09IFwicGVyY2VudFwiIHx8XHJcblx0XHRcdFx0XHRcdGNvbC5mb3JtYXQuaW5kZXhPZihcIlBcIikgIT09IC0xKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Y29sLnRleHRBbGlnbiA9IFwiUmlnaHRcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGgpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAoYXJncyBhcyBhbnkpLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRhcmdzLmNvbHVtbnNbaV0uaGVhZGVyVGV4dCA9PT0gXCJcIiB8fFxyXG5cdFx0XHRcdFx0IWFyZ3MuY29sdW1uc1tpXS5oZWFkZXJUZXh0XHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBjb2x1bW5fcm93ID0gdGhpcy5jb25maWcuY29sdW1uc1dpZHRoLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0KGVsKSA9PiBlbC5oZWFkZXJUZXh0ID09PSBhcmdzLmNvbHVtbnNbaV0uaGVhZGVyVGV4dFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW5fcm93Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0YXJncy5jb2x1bW5zW2ldLndpZHRoID0gY29sdW1uX3Jvd1swXS53aWR0aDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgaGVhZGVyVGV4dCA9IGFyZ3MuY29sdW1uc1tpXS5oZWFkZXJUZXh0XHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpXHJcblx0XHRcdFx0XHRcdC5zcGxpdChcIi5cIik7XHJcblx0XHRcdFx0XHRpZiAoaGVhZGVyVGV4dCAmJiBoZWFkZXJUZXh0Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb25maWcuY29sdW1uc1dpZHRoLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRlbC5oZWFkZXJUZXh0XHJcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpID09PVxyXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyVGV4dFtoZWFkZXJUZXh0Lmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKClcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbHVtbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jb2x1bW5zW2ldLndpZHRoID0gY29sdW1uWzBdLndpZHRoO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIGRhdGUgZm9ybWF0IGFib3V0IHF1YXJ0ZXJseVxyXG5cdFx0XHRcdGxldCBwaXZvdFZhbHVlczogYW55ID0gdGhpcy5waXZvdE9iai5waXZvdFZhbHVlcztcclxuXHRcdFx0XHRpZiAodGhpcy5mb3JtYXREYXRlcyAmJiB0aGlzLmZvcm1hdERhdGVzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0bGV0IGRhdGVGaWVsZHMgPSB0aGlzLmZvcm1hdERhdGVzLm1hcCgoZWwpID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVsLm5hbWU7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGsgPSAxOyBrIDwgcGl2b3RWYWx1ZXMubGVuZ3RoOyBrKyspIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0XHRsZXQgaiA9IDA7XHJcblx0XHRcdFx0XHRcdFx0cGl2b3RWYWx1ZXNba10gIT0gbnVsbCAmJiBqIDwgcGl2b3RWYWx1ZXNba10ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdGorK1xyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRwaXZvdFZhbHVlc1trXVtqXSAhPSBudWxsICYmXHJcblx0XHRcdFx0XHRcdFx0XHQoaiA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdD8gZGF0ZUZpZWxkcy5pbmNsdWRlcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IGRhdGVGaWVsZHMuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwaXZvdFZhbHVlc1trXVtqXS5hY3R1YWxUZXh0XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKSlcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vQ3VzdG9taXplIHRoZSBSb3cgaGVhZGVycy9Db2x1bW4gaGVhZGVycyBiYXNlZCBvbiB5b3VyIG5lZWRzXHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgaGVhZGVycztcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChqID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSBwaXZvdFZhbHVlc1trXVtqXS5hY3R1YWxUZXh0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaGVhZGVycyA9IHBpdm90VmFsdWVzW2tdW2pdLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSBwaXZvdFZhbHVlc1trXVtqXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChoZWFkZXJzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBkYXRlID0gbmV3IERhdGUoaGVhZGVycyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcXVhcnRlciA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5mb3JtYXREYXRlcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IGVsLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLmFjdHVhbFRleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gZWwuZm9ybWF0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLmZvcm1hdHRlZFRleHQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UXVhcnRlclZhbHVlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHF1YXJ0ZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBpZih0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgb25Mb2FkKCk6IHZvaWQge1xyXG5cdFx0Ly8gU01QMi0xNTY1MSDlvIDlkK/omZrmi5/mu5rliqjlubZzb3J05YiX5ZCO77yM5p2l5Zue5rua5Yqo5Lya5a+86Ie05pWw5o2u56m655m9XHJcblx0XHQvLyDlrpjmlrnpk77mjqUgaHR0cHM6Ly9lajIuc3luY2Z1c2lvbi5jb20vYW5ndWxhci9kb2N1bWVudGF0aW9uL3Bpdm90dmlldy92aXJ0dWFsLXNjcm9sbGluZyN2aXJ0dWFsLXNjcm9sbGluZy1mb3Itc3RhdGljLWZpZWxkLWxpc3RcclxuXHRcdC8vIERlbW/pk77mjqUgaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2dpdGh1Yi03Z2drMnUtNHJremIzP2ZpbGU9c3JjJTJGYXBwLmNvbXBvbmVudC50c1xyXG5cdFx0KHRoaXMuZmllbGRsaXN0T2JqIGFzIFBpdm90RmllbGRMaXN0Q29tcG9uZW50KS5waXZvdEdyaWRNb2R1bGUgPSB0aGlzXHJcblx0XHRcdC5waXZvdE9iaiBhcyBQaXZvdFZpZXdDb21wb25lbnQ7XHJcblx0fVxyXG5cclxuXHRvbmRhdGFCb3VuZCgpe1xyXG5cdFx0aWYgKEJyb3dzZXIuaXNEZXZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5waXZvdE9iai5lbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICB0aGlzLnBpdm90T2JqLmFsbG93Q2FsY3VsYXRlZEZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5waXZvdE9iai5zaG93RmllbGRMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGVuZ2luZVBvcHVsYXRlZChhcmdzKSB7XHJcblx0XHRsZXQgY2xvbmVkVmFsdWVzOiBJUGl2b3RWYWx1ZXM7XHJcblx0XHRsZXQgY3VycmVudFBpdm90VmFsdWVzOiBhbnkgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlc1xyXG5cdFx0KTtcclxuXHRcdGxldCBwYWdlU2V0dGluZ3M6IElQYWdlU2V0dGluZ3MgPVxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5wYWdlU2V0dGluZ3M7XHJcblxyXG5cdFx0aWYgKHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmdlbmVyYXRlR3JpZERhdGEpIHtcclxuXHRcdFx0Ly8g5rKh5rOV5aSN546wIGh0dHBzOi8vcmFpc2VscC5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TTVAyLTE3MjQg5aSE55CG55qE6L+Z5Liq6Zeu6aKY5oOF5Ya1LCDnm7TmjqXms6jph4rmjolcclxuXHRcdFx0Ly8g5LiL6Z2i6L+Z5q615Luj56CB5Lya5b2x5ZONIGh0dHBzOi8vcmFpc2VscC5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TTVAyLTEyMTM5XHJcblx0XHRcdC8vIHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmdlbmVyYXRlR3JpZERhdGEoXHJcblx0XHRcdC8vIFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MsXHJcblx0XHRcdC8vIFx0dHJ1ZVxyXG5cdFx0XHQvLyApO1xyXG5cdFx0XHRjbG9uZWRWYWx1ZXMgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBpdm90VmFsdWVzXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlcyA9IGN1cnJlbnRQaXZvdFZhbHVlcztcclxuXHJcblx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBhZ2VTZXR0aW5ncyA9IHBhZ2VTZXR0aW5ncztcclxuXHJcblx0XHRcdC8vIEhlcmUgXCJjbG9uZWRWYWx1ZXNcIiBjb250YWlucyB0aGUgd2hvbGUgcGl2b3QgdmFsdWVzLlxyXG5cdFx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IGNsb25lZFZhbHVlcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Q2xvbmVkUGl2b3RWYWx1ZXMocGl2b3RWYWx1ZXM6IElQaXZvdFZhbHVlcyk6IElQaXZvdFZhbHVlcyB7XHJcblx0XHRsZXQgY2xvbmVkU2V0czogSVBpdm90VmFsdWVzID0gW107XHJcblx0XHRpZiAocGl2b3RWYWx1ZXMgJiYgcGl2b3RWYWx1ZXMubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwaXZvdFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXSkge1xyXG5cdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXSA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBpdm90VmFsdWVzW2ldLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXVtqXSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlICovXHJcblx0XHRcdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXVtqXSA9IHRoaXMuZ2V0Q2xvbmVkUGl2b3RWYWx1ZU9iaihcclxuXHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2ldW2pdIGFzIHsgW2tleTogc3RyaW5nXTogT2JqZWN0IH1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgKi9cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNsb25lZFNldHM7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENsb25lZFBpdm90VmFsdWVPYmooZGF0YTogeyBba2V5OiBzdHJpbmddOiBPYmplY3QgfSk6IHtcclxuXHRcdFtrZXk6IHN0cmluZ106IE9iamVjdDtcclxuXHR9IHtcclxuXHRcdGxldCBrZXlQb3M6IG51bWJlciA9IDA7XHJcblx0XHRsZXQgZnJhbWVkU2V0OiBhbnkgPSB7fTtcclxuXHRcdGlmICghKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSkge1xyXG5cdFx0XHRsZXQgZmllbGRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdFx0XHR3aGlsZSAoa2V5UG9zIDwgZmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdGZyYW1lZFNldFtmaWVsZHNba2V5UG9zXV0gPSBkYXRhW2ZpZWxkc1trZXlQb3NdXTtcclxuXHRcdFx0XHRrZXlQb3MrKztcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZnJhbWVkU2V0ID0gZGF0YTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmcmFtZWRTZXQ7XHJcblx0fVxyXG5cclxuXHQvLyNyZWdpb24gRmlsdGVyaW5nIHRoZSBUcmVlTm9kZXNcclxuXHRwcml2YXRlIHNlYXJjaE5vZGVzKGFyZ3MpIHtcclxuXHRcdGxldCBfdGV4dCA9IGFyZ3MubWFza2VkVmFsdWU7XHJcblx0XHRsZXQgcHJlZGljYXRzID0gW10sXHJcblx0XHRcdF9hcnJheSA9IFtdLFxyXG5cdFx0XHRfZmlsdGVyID0gW107XHJcblx0XHRpZiAoX3RleHQgPT0gXCJcIikge1xyXG5cdFx0XHR0aGlzLmNoYW5nZURhdGFTb3VyY2UoXHJcblx0XHRcdFx0KCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueSkuZ2V0VHJlZURhdGEoKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IHByZWRpY2F0ZSA9IG5ldyBQcmVkaWNhdGUoXCJjYXB0aW9uXCIsIFwiY29udGFpbnNcIiwgX3RleHQsIHRydWUpO1xyXG5cdFx0XHRsZXQgZmlsdGVyZWRMaXN0ID0gbmV3IERhdGFNYW5hZ2VyKFxyXG5cdFx0XHRcdCgodGhpcyBhcyBhbnkpLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZSBhcyBhbnkpLmdldFRyZWVEYXRhKClcclxuXHRcdFx0KS5leGVjdXRlTG9jYWwobmV3IFF1ZXJ5KCkud2hlcmUocHJlZGljYXRlKSk7XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsdGVyZWRMaXN0Lmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0X2ZpbHRlci5wdXNoKGZpbHRlcmVkTGlzdFtqXVtcImlkXCJdKTtcclxuXHRcdFx0XHRsZXQgZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVySXRlbXMoXHJcblx0XHRcdFx0XHRmaWx0ZXJlZExpc3Rbal0sXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0X2FycmF5LmluZGV4T2YoZmlsdGVyc1tpXSkgPT0gLTEgJiZcclxuXHRcdFx0XHRcdFx0ZmlsdGVyc1tpXSAhPSBudWxsXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0X2FycmF5LnB1c2goZmlsdGVyc1tpXSk7XHJcblx0XHRcdFx0XHRcdHByZWRpY2F0cy5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdG5ldyBQcmVkaWNhdGUoXCJpZFwiLCBcImVxdWFsXCIsIGZpbHRlcnNbaV0sIGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocHJlZGljYXRzLmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VEYXRhU291cmNlKFtdKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgcXVlcnkgPSBuZXcgUXVlcnkoKS53aGVyZShQcmVkaWNhdGUub3IocHJlZGljYXRzKSk7XHJcblx0XHRcdFx0bGV0IG5ld0xpc3QgPSBuZXcgRGF0YU1hbmFnZXIoXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KS5leGVjdXRlTG9jYWwocXVlcnkpO1xyXG5cdFx0XHRcdHRoaXMuY2hhbmdlRGF0YVNvdXJjZShuZXdMaXN0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly9GaW5kIHRoZSBQYXJlbnQgTm9kZXMgZm9yIGNvcnJlc3BvbmRpbmcgY2hpbGRzXHJcblx0cHVibGljIGdldEZpbHRlckl0ZW1zKGZMaXN0LCBsaXN0KSB7XHJcblx0XHRsZXQgbm9kZXMgPSBbXTtcclxuXHRcdG5vZGVzLnB1c2goZkxpc3RbXCJpZFwiXSk7XHJcblx0XHRsZXQgcXVlcnkyID0gbmV3IFF1ZXJ5KCkud2hlcmUoXCJpZFwiLCBcImVxdWFsXCIsIGZMaXN0W1wicGlkXCJdLCBmYWxzZSk7XHJcblx0XHRsZXQgZkxpc3QxID0gbmV3IERhdGFNYW5hZ2VyKGxpc3QpLmV4ZWN1dGVMb2NhbChxdWVyeTIpO1xyXG5cdFx0aWYgKGZMaXN0MS5sZW5ndGggIT0gMCkge1xyXG5cdFx0XHRsZXQgcE5vZGUgPSB0aGlzLmdldEZpbHRlckl0ZW1zKGZMaXN0MVswXSwgbGlzdCk7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcE5vZGUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAobm9kZXMuaW5kZXhPZihwTm9kZVtpXSkgPT0gLTEgJiYgcE5vZGVbaV0gIT0gbnVsbClcclxuXHRcdFx0XHRcdG5vZGVzLnB1c2gocE5vZGVbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBub2RlcztcclxuXHRcdH1cclxuXHRcdHJldHVybiBub2RlcztcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBjcmVhdGVkKGFyZ3M6IGFueSkge1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmICF0aGlzLmZpZWxkbGlzdE9iai5lbmdpbmVNb2R1bGUuZmllbGRzKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVuZ2luZU1vZHVsZS5maWVsZHMgPSBbXTtcclxuXHRcdH1cclxuXHRcdGxldCBzZWFyY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRzZWFyY2guaWQgPSBcInBpdm90U2VhcmNoQm94XCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkO1xyXG5cdFx0bGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuXHRcdFx0XCIjXCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkICsgXCJfQ29udGFpbmVyIC5lLWZpZWxkLXRhYmxlXCJcclxuXHRcdCk7XHJcblx0XHRpZiAoZWwpIGVsLnByZXBlbmQoc2VhcmNoKTtcclxuXHRcdHRoaXMucGl2b3RTZWFyY2hCb3ggPSBuZXcgTWFza2VkVGV4dEJveCh7XHJcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0aW9uLlNFQVJDSCB8fCBcIi5TRUFSQ0hcIixcclxuXHRcdFx0Y3NzQ2xhc3M6IFwicGl2b3Qtc2VhcmNoXCIsXHJcblx0XHRcdGNoYW5nZTogdGhpcy5zZWFyY2hOb2Rlcy5iaW5kKHRoaXMpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnBpdm90U2VhcmNoQm94LmFwcGVuZFRvKFxyXG5cdFx0XHRcIiNwaXZvdFNlYXJjaEJveFwiICsgdGhpcy5maWVsZGxpc3RPYmouZWxlbWVudC5pZFxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBORVcgRGFzaGJvYXJkIOeCueWHu1wiYXBwbHlcIuaXtu+8jOivt+axguaWsOaVsOaNrlxyXG5cdFx0bGV0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVsZW1lbnQuaWQgKyBcIl9EZWZlclVwZGF0ZUJ1dHRvbjFcIlxyXG5cdFx0KTtcclxuXHJcblx0XHRhcHBseUJ0biAmJlxyXG5cdFx0XHRhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0RGF0YUJ5UG9ydGxldHNOZXcoXHJcblx0XHRcdFx0XHRbdGhpcy5wb3J0bGV0XSxcclxuXHRcdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGEgPVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0UmVzdWx0QnlEYXRhVGFibGUoXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBvcnRsZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmQuaWRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5kYXRhU291cmNlID1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGE7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5QaXZvdF9EYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGdyb3VwcyA9IHRoaXMuY29uZmlnLnhheGlzLmdyb3VwcztcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93cyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChncm91cHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGdpdGVtIG9mIGdyb3Vwcykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGdpdGVtLm5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRnaXRlbS5zaG93U3ViVG90YWxzID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLnNob3dTdWJUb3RhbHM7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nVmFsdWUgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRpb25bXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdDb2RlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nQ29kZSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3dzLnB1c2goZ2l0ZW0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGEubWFwKChkYXRhKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRyb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVtyb3cubmFtZV0gPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW3Jvdy5uYW1lXSA9IFwibnVsbFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkLFxyXG5cdFx0XHRcdFx0ZmFsc2VcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0XHJcblx0XHQvLyDngrnlh7tcImNhbmNlbFwi5pe277yM5oGi5aSN5Y6f5aeL5pWw5o2uXHJcblx0XHRsZXQgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVsZW1lbnQuaWQgKyBcIl9EZWZlclVwZGF0ZUJ1dHRvbjJcIlxyXG5cdFx0KTtcclxuXHJcblx0XHRjYW5jZWxCdG4gJiZcclxuXHRcdFx0Y2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuZGF0YVNvdXJjZSA9XHJcblx0XHRcdFx0XHRbLi4udGhpcy5QaXZvdF9EYXRhXTtcclxuXHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0XHRcdHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0fSk7XHRcdFxyXG5cdH1cclxuXHJcblx0cHVibGljIGZpZWxkTGlzdFJlZnJlc2hlZChhcmdzKSB7XHJcblx0XHRpZiAodGhpcy5waXZvdFNlYXJjaEJveCkge1xyXG5cdFx0XHR0aGlzLnBpdm90U2VhcmNoQm94LnZhbHVlID0gXCJcIjtcclxuXHRcdFx0dGhpcy5jaGFuZ2VEYXRhU291cmNlKFxyXG5cdFx0XHRcdCh0aGlzLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZSBhcyBhbnkpLmdldFRyZWVEYXRhKClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2hhbmdlRGF0YVNvdXJjZShkYXRhKSB7XHJcblx0XHRsZXQgZmllbGRUYWJsZSA9ICh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlLmZpZWxkVGFibGU7XHJcblx0XHRpZiAoZmllbGRUYWJsZSkge1xyXG5cdFx0XHRmaWVsZFRhYmxlLmZpZWxkcyA9IHtcclxuXHRcdFx0XHRkYXRhU291cmNlOiBkYXRhLFxyXG5cdFx0XHRcdGlkOiBcImlkXCIsXHJcblx0XHRcdFx0dGV4dDogXCJjYXB0aW9uXCIsXHJcblx0XHRcdFx0aXNDaGVja2VkOiBcImlzU2VsZWN0ZWRcIixcclxuXHRcdFx0XHRwYXJlbnRJRDogXCJwaWRcIixcclxuXHRcdFx0XHRpY29uQ3NzOiBcInNwcml0ZUNzc0NsYXNzXCIsXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvL1NNUDItMjk1NyBmaXggdGhlIGRhdGUgaXNzdWUgb24gdGhlIHJhdyBkYXRhXHJcblx0cHVibGljIGRyaWxsVGhyb3VnaChhcmdzOiBEcmlsbFRocm91Z2hFdmVudEFyZ3MpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5ncmlkQ29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBkYXRhID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gYXJncy5ncmlkQ29sdW1uc1tpXS5maWVsZFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRkYXRhWzBdLmRhdGFUeXBlID09PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YVswXS5kYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRhcmdzLmdyaWRDb2x1bW5zW2ldLnR5cGUgPSBcImRhdGVcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0Ly8jZW5kcmVnaW9uXHJcblxyXG5cdHByaXZhdGUgc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChvYmosIGRhdGEsIGNvZGUpIHtcclxuXHRcdGlmIChjb2RlID09PSAtMSkge1xyXG5cdFx0XHRvYmouc3R5bGUuY29sb3IgPSBkYXRhLm5lZ2FGb250Q29sb3I7XHJcblx0XHRcdG9iai5zdHlsZS5mb250RmFtaWx5ID0gZGF0YS5uZWdhRm9udEZhbWlseVZhbHVlO1xyXG5cdFx0XHRvYmouc3R5bGUuZm9udFNpemUgPSBkYXRhLm5lZ2FGb250U2l6ZVZhbHVlO1xyXG5cdFx0XHRvYmouc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZGF0YS5uZWdhQmFja2dyb3VuZENvbG9yO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0b2JqLnN0eWxlLmNvbG9yID0gZGF0YS5mb250Q29sb3I7XHJcblx0XHRcdG9iai5zdHlsZS5mb250RmFtaWx5ID0gZGF0YS5mb250RmFtaWx5VmFsdWU7XHJcblx0XHRcdG9iai5zdHlsZS5mb250U2l6ZSA9IGRhdGEuZm9udFNpemVWYWx1ZTtcclxuXHRcdFx0b2JqLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGRhdGEuYmFja2dyb3VuZENvbG9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRDb21wYXJlQ29uZGl0aW9uYWwoXHJcblx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdGRhdGFcclxuXHQpIHtcclxuXHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUxKSA9PSAwKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5cIjogLy8g5aSn5LqOXHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuT3JFcXVhbFRvXCI6IC8vIOWkp+S6juetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEVxdWFsc1wiOiAvLyDkuI3nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQmV0d2VlblwiOiAvLyB2YWx1ZTE8PSB2YWwgPD12YWx1ZTJcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSA9PT0gMSkge1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEJldHdlZW5cIjogLy8gdmFsID49IHZhbHVlMiwgdmFsIDw9IHZhbHVlMVxyXG5cdFx0XHRcdFx0aWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTIpID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTJcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTEpID09PSAxKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoZGF0YS5jb21wYXJlVmFsdWUxKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuXCI6IC8vIOWkp+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhbk9yRXF1YWxUb1wiOiAvLyDlpKfkuo7nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiRXF1YWxzXCI6IC8vIOetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKGRhdGEuY29tcGFyZVZhbHVlMSk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJFcXVhbHNcIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiTm90RXF1YWxzXCI6IC8vIOS4jeetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKGRhdGEuY29tcGFyZVZhbHVlMSk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJHcmVhdGVyVGhhblwiO1xyXG5cdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuT3JFcXVhbFRvXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkJldHdlZW5cIjogLy8gdmFsdWUxPD0gdmFsIDw9dmFsdWUyXHJcblx0XHRcdFx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMikgPT09IDEpIHtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuY29tcGFyZVZhbHVlMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEJldHdlZW5cIjogLy8gdmFsID49IHZhbHVlMiwgdmFsIDw9IHZhbHVlMVxyXG5cdFx0XHRcdFx0aWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTIpID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHQvLyBwdXNo6L+b5pWw57uEXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTJcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMSkgPT09IC0xKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IGRhdGEuY29tcGFyZVNlbGVjdDtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhblwiOiAvLyDlpKfkuo5cclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5PckVxdWFsVG9cIjogLy8g5aSn5LqO562J5LqOXHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5PckVxdWFsVG9cIjtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkVxdWFsc1wiOiAvLyDnrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiRXF1YWxzXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEVxdWFsc1wiOiAvLyDkuI3nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTm90RXF1YWxzXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQmV0d2VlblwiOiAvLyB2YWx1ZTE8PSB2YWwgPD12YWx1ZTJcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSkge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMjtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gZGF0YS5jb21wYXJlVmFsdWUyO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RCZXR3ZWVuXCI6IC8vIHZhbCA+PSB2YWx1ZTIsIHZhbCA8PSB2YWx1ZTFcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSkge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTGVzc1RoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTI7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBkYXRhLmNvbXBhcmVWYWx1ZTI7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJOb3RCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldFF1YXJ0ZXJWYWx1ZShmb3JtYXQsIGRhdGUsIHF1YXJ0ZXIpIHtcclxuXHRcdGxldCB5ZWFyOiBhbnk7XHJcblx0XHRzd2l0Y2ggKGZvcm1hdCkge1xyXG5cdFx0XHRjYXNlIFwiUTEgMjAyMVwiOlxyXG5cdFx0XHRcdHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblx0XHRcdFx0cmV0dXJuIFwiUVwiICsgcXVhcnRlciArIFwiIFwiICsgeWVhcjtcclxuXHRcdFx0Y2FzZSBcIlExIDIxXCI6XHJcblx0XHRcdFx0eWVhciA9IChkYXRlIGFzIGFueSkuZ2V0WWVhcigpIC0gMTAwO1xyXG5cdFx0XHRcdHJldHVybiBcIlFcIiArIHF1YXJ0ZXIgKyBcIiBcIiArIHllYXI7XHJcblx0XHRcdGNhc2UgXCIyMDIxIFExXCI6XHJcblx0XHRcdFx0eWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHRcdFx0XHRyZXR1cm4geWVhciArIFwiIFwiICsgXCJRXCIgKyBxdWFydGVyO1xyXG5cdFx0XHRjYXNlIFwiMjEgUTFcIjpcclxuXHRcdFx0XHR5ZWFyID0gKGRhdGUgYXMgYW55KS5nZXRZZWFyKCkgLSAxMDA7XHJcblx0XHRcdFx0cmV0dXJuIHllYXIgKyBcIiBcIiArIFwiUVwiICsgcXVhcnRlcjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGN1c3RvbWlzZUNlbGwoYXJnczogUXVlcnlDZWxsSW5mb0V2ZW50QXJncykge1xyXG5cdFx0aWYgKGFyZ3MuY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiIHx8IGFyZ3MuY29sdW1uLnR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xyXG5cdFx0XHRjb25zdCB7IGZpZWxkIH0gPSBhcmdzLmNvbHVtbjtcclxuXHRcdFx0aWYgKCFhcmdzLmRhdGFbZmllbGRdKSB7XHJcblx0XHRcdFx0YXJncy5jb2x1bW4udHlwZSA9IFwic3RyaW5nXCI7XHJcblx0XHRcdFx0YXJncy5jb2x1bW4uZm9ybWF0ID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHBhcmFtIHRpbWVBcnJheSDmlbDnu4Tlr7nosaEgW3tcImRhdGVcIjpcIjIwMjEtMDEtMDFcIn0se1wiZGF0ZVwiOlwiMjAyMS0wMi0wMVwifV1cclxuXHQgKiBAcGFyYW0gZW5kRGF0ZSDmiKroh7Pml7bpl7RcclxuXHQgKiBAcGFyYW0gaW50ZXJ2YWwg5pe26Ze06Ze06ZqUIHllYXIgLyBxdWFydGVyIC8gbW9udGhcclxuXHQgKiBAcGFyYW0gdGltZUtleSDml7bpl7TlrZfmrrXlkI0gZGF0ZVxyXG5cdCAqIEByZXR1cm5zIOWIkuWIhuWQjueahOaXtumXtOWIhue7hOWvueixoVxyXG5cdCAqL1xyXG5cdGdldFRpbWVSYW5nZXModGltZUFycmF5LCBlbmREYXRlLCBpbnRlcnZhbCwgdGltZUtleSkge1xyXG5cdFx0Ly8g5bCG5pe26Ze05a2X56ym5Liy6L2s5o2i5Li6IG1vbWVudCDlr7nosaFcclxuXHRcdGNvbnN0IGRhdGVzID0gdGltZUFycmF5Lm1hcCgoaXRlbSkgPT4gbW9tZW50KGl0ZW1bdGltZUtleSB8fCBcImRhdGVcIl0pKTtcclxuXHJcblx0XHQvLyDliIbpmpTnrKZcclxuXHRcdGNvbnN0IGRlbGltaXRlciA9IFwiLVwiO1xyXG5cclxuXHRcdC8vIOaJvuWIsOacgOWwj+aXtumXtOWSjOacgOWkp+aXtumXtFxyXG5cdFx0Y29uc3QgbWluRGF0ZSA9IG1vbWVudC5taW4oZGF0ZXMpO1xyXG5cdFx0Y29uc3QgbWF4RGF0ZSA9IG1vbWVudChlbmREYXRlKTtcclxuXHJcblx0XHQvLyDliJ3lp4vljJbnu5Pmnpzlr7nosaFcclxuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xyXG5cclxuXHRcdC8vIOagueaNruWFpeWPgui/m+ihjOWIkuWIhlxyXG5cdFx0aWYgKGludGVydmFsID09PSBcInllYXJcIikge1xyXG5cdFx0XHRjb25zdCBzdGFydFllYXIgPSBtaW5EYXRlLnllYXIoKTtcclxuXHRcdFx0Y29uc3QgZW5kWWVhciA9IG1heERhdGUueWVhcigpO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgeWVhciA9IHN0YXJ0WWVhcjsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHtcclxuXHRcdFx0XHRyZXN1bHRbeWVhcl0gPSBbXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0cmVzdWx0W3llYXJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIGlmIChpbnRlcnZhbCA9PT0gXCJxdWFydGVyXCIpIHtcclxuXHRcdFx0Ly8g5a2Y5YKo5a2j5bqm5a2X56ym5LiyXHJcblx0XHRcdGNvbnN0IHF1YXJ0ZXJzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrlraPluqZcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDMsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoY3VycmVudERhdGUubW9udGgoKSArIDEpIC8gMyk7IC8vIOiuoeeul+Wto+W6plxyXG5cdFx0XHRcdHF1YXJ0ZXJzLnB1c2goYCR7eWVhcn0ke2RlbGltaXRlcn1RJHtxdWFydGVyfWApOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5a2j5bqmXHJcblx0XHRcdHF1YXJ0ZXJzLmZvckVhY2goKHF1YXJ0ZXIsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0cmVzdWx0W3F1YXJ0ZXJdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IGRhdGUucXVhcnRlcigpOyAvLyDojrflj5blraPluqZcclxuXHRcdFx0XHRpZiAocXVhcnRlciA9PT0gMSlcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRMVwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHRcdGVsc2UgaWYgKHF1YXJ0ZXIgPT09IDIpXHJcblx0XHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIFwiUTJcIl0ucHVzaCh0aW1lQXJyYXlbaW5kZXhdKTtcclxuXHRcdFx0XHRlbHNlIGlmIChxdWFydGVyID09PSAzKVxyXG5cdFx0XHRcdFx0cmVzdWx0W3llYXIgKyBkZWxpbWl0ZXIgKyBcIlEzXCJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdFx0ZWxzZSBpZiAocXVhcnRlciA9PT0gNClcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRNFwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAoaW50ZXJ2YWwgPT09IFwibW9udGhcIikge1xyXG5cdFx0XHQvLyDlrZjlgqjmnIjku73lrZfnrKbkuLJcclxuXHRcdFx0Y29uc3QgbW9udGhzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrmnIhcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDEsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdG1vbnRocy5wdXNoKGN1cnJlbnREYXRlLmZvcm1hdChgWVlZWSR7ZGVsaW1pdGVyfU1NYCkpOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5pyI5Lu9XHJcblx0XHRcdG1vbnRocy5mb3JFYWNoKChtb250aCwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRyZXN1bHRbbW9udGhdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgbW9udGggPSAoZGF0ZS5tb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7IC8vIDAtMTFcclxuXHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIG1vbnRoXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog6K6h566X5Yeg5L2V566X5pWw5bmz5pa55pu0XHJcblx0ICogQHBhcmFtIHZhbHVlcyDmlbDnu4QgWzAsIDAsIDAuMjU3NV1cclxuXHQgKiBAcmV0dXJuc1xyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZUdyb3d0aFJhdGUodmFsdWVzKSB7XHJcblx0XHRjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyAqICgxICsgdmFsKSwgMSk7XHJcblx0XHRpZiAocHJvZHVjdCA+PSAwKSB7XHJcblx0XHRcdHJldHVybiBNYXRoLnBvdyhwcm9kdWN0LCAxIC8gdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0fSBlbHNlIGlmIChwcm9kdWN0IDwgMCkge1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCAlIDIgPT0gMCkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLm50aHJvb3QocHJvZHVjdCwgdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdG50aHJvb3QoeCwgbikge1xyXG5cdFx0bGV0IG5nID0gbiAlIDI7XHJcblx0XHRpZiAobmcgPT0gMSB8fCB4IDwgMCkgeCA9IC14O1xyXG5cdFx0dmFyIHIgPSBNYXRoLnBvdyh4LCAxIC8gbik7XHJcblx0XHRuID0gTWF0aC5wb3cociwgbik7XHJcblxyXG5cdFx0aWYgKE1hdGguYWJzKHggLSBuKSA8IDEgJiYgeCA+IDAgPT09IG4gPiAwKSByZXR1cm4gbmcgPyAtciA6IHI7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmoIflh4blgY/lt65cclxuXHQgKiBAcGFyYW0gdmFsdWVzIOaVsOe7hCBbMCwgMCwgLTAuNDc3NV1cclxuXHQgKiBAcmV0dXJucyAwLjI3NTY4NDc1MzUzODA0NjNcclxuXHQgKi9cclxuXHRjYWxjdWxhdGVTdGFuZGFyZERldmlhdGlvbih2YWx1ZXMpIHtcclxuXHRcdGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIOajgOafpeaVsOaNrueCueaVsOmHj1xyXG5cdFx0aWYgKG4gPCAyKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIuiHs+WwkemcgOimgeS4pOS4quaVsOaNrueCueadpeiuoeeul+agt+acrOagh+WHhuWBj+W3rlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDorqHnrpflnYflgLxcclxuXHRcdGNvbnN0IG1lYW4gPSB2YWx1ZXMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKSAvIG47XHJcblxyXG5cdFx0Ly8g6K6h566X5pa55beuXHJcblx0XHRjb25zdCB2YXJpYW5jZSA9XHJcblx0XHRcdHZhbHVlcy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyBNYXRoLnBvdyh2YWwgLSBtZWFuLCAyKSwgMCkgL1xyXG5cdFx0XHQobiAtIDEpO1xyXG5cclxuXHRcdC8vIOi/lOWbnuagh+WHhuWBj+W3rlxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSk7XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250cm9sLXNlY3Rpb25cIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47IGhlaWdodDogMTAwJVwiPlxyXG5cdDxlanMtcGl2b3R2aWV3XHJcblx0XHR3aWR0aD1cIjEwMCVcIlxyXG5cdFx0aGVpZ2h0PVwiMTAwJVwiXHJcblx0XHRzdHlsZT1cImRpc3BsYXk6IGJsb2NrXCJcclxuXHRcdFtkYXRhU291cmNlU2V0dGluZ3NdPVwiZGF0YVNvdXJjZVNldHRpbmdzXCJcclxuXHRcdCNwaXZvdHZpZXdcclxuXHRcdChkYXRhQm91bmQpPVwiZGF0YUJvdW5kKCRldmVudClcIlxyXG5cdFx0ZW5hYmxlVmFsdWVTb3J0aW5nPVwidHJ1ZVwiXHJcblx0XHRhbGxvd0NvbmRpdGlvbmFsRm9ybWF0dGluZz1cInRydWVcIlxyXG5cdFx0W2FsbG93RGVmZXJMYXlvdXRVcGRhdGVdPVwidHJ1ZVwiXHJcblx0XHRbZ3JpZFNldHRpbmdzXT1cImdyaWRTZXR0aW5nc1wiXHJcblx0XHRhbGxvd0V4Y2VsRXhwb3J0PVwidHJ1ZVwiXHJcblx0XHRhbGxvd0dyb3VwaW5nPVwidHJ1ZVwiXHJcblx0XHRbem9vbVNldHRpbmdzXT1cInpvb21TZXR0aW5nc1wiXHJcblx0XHRlbmFibGVWaXJ0dWFsaXphdGlvbj1cInRydWVcIlxyXG5cdFx0KGVuZ2luZVBvcHVsYXRlZCk9XCJhZnRlckVuZ2luZVBvcHVsYXRlKCRldmVudClcIlxyXG5cdFx0KGFnZ3JlZ2F0ZUNlbGxJbmZvKT1cImFnZ3JlZ2F0ZUNlbGxJbmZvKCRldmVudClcIlxyXG5cdFx0KGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiXHJcblx0XHRhbGxvd0RyaWxsVGhyb3VnaD1cInRydWVcIlxyXG5cdFx0KGFjdGlvbkZhaWx1cmUpPVwiYWN0aW9uRmFpbHVyZSgkZXZlbnQpXCJcclxuXHRcdChhY3Rpb25Db21wbGV0ZSk9XCJhY3Rpb25Db21wbGV0ZSgkZXZlbnQpXCJcclxuXHRcdChhY3Rpb25CZWdpbik9XCJhY3Rpb25CZWdpbigkZXZlbnQpXCJcclxuXHRcdChmaWVsZExpc3RSZWZyZXNoZWQpPVwiZmllbGRMaXN0UmVmcmVzaGVkKCRldmVudClcIlxyXG5cdFx0KGRyaWxsVGhyb3VnaCk9XCJkcmlsbFRocm91Z2goJGV2ZW50KVwiXHJcblx0XHRbc2hvd1Rvb2x0aXBdPVwiZmFsc2VcIlxyXG5cdFx0KHF1ZXJ5Q2VsbEluZm8pPVwiY3VzdG9taXNlQ2VsbCgkZXZlbnQpXCJcclxuXHRcdChiZWZvcmVFeHBvcnQpPVwiYmVmb3JlRXhwb3J0KCRldmVudClcIlxyXG5cdD5cclxuXHQ8L2Vqcy1waXZvdHZpZXc+XHJcblxyXG5cdDxkaXYgY2xhc3M9XCJwaXZvdGZpZWxkbGlzdC1jb250cm9sXCI+XHJcblx0XHQ8ZWpzLXBpdm90ZmllbGRsaXN0XHJcblx0XHRcdFtpZF09XCJwb3J0bGV0Lm5ld0lkXCJcclxuXHRcdFx0I3Bpdm90ZmllbGRsaXN0XHJcblx0XHRcdFthbGxvd0RlZmVyTGF5b3V0VXBkYXRlXT1cInRydWVcIlxyXG5cdFx0XHRyZW5kZXJNb2RlPVwiUG9wdXBcIlxyXG5cdFx0XHQoZW5naW5lUG9wdWxhdGVkKT1cImFmdGVyUG9wdWxhdGUoJGV2ZW50KVwiXHJcblx0XHRcdChtZW1iZXJFZGl0b3JPcGVuKT1cIm9uTWVtYmVyRWRpdG9yT3BlbigkZXZlbnQpXCJcclxuXHRcdFx0KGVuZ2luZVBvcHVsYXRpbmcpPVwiZW5naW5lUG9wdWxhdGluZygkZXZlbnQpXCJcclxuXHRcdFx0KGFnZ3JlZ2F0ZUNlbGxJbmZvKT1cImFnZ3JlZ2F0ZUNlbGxJbmZvKCRldmVudClcIlxyXG5cdFx0XHQoZmllbGREcm9wKT1cIm9uRmllbGREcm9wKCRldmVudClcIlxyXG5cdFx0XHQoYWN0aW9uQ29tcGxldGUpPVwiYWN0aW9uQ29tcGxldGUoJGV2ZW50KVwiXHJcblx0XHRcdChhY3Rpb25CZWdpbik9XCJhY3Rpb25CZWdpbigkZXZlbnQpXCJcclxuXHRcdFx0KGNhbGN1bGF0ZWRGaWVsZENyZWF0ZSk9XCJjYWxjdWxhdGVkRmllbGRDcmVhdGUoJGV2ZW50KVwiXHJcblx0XHRcdChsb2FkKT1cIm9uTG9hZCgpXCJcclxuXHRcdFx0KGNyZWF0ZWQpPVwiY3JlYXRlZCgkZXZlbnQpXCJcclxuXHRcdFx0KGRhdGFCb3VuZCk9J29uZGF0YUJvdW5kKCknXHJcblx0XHQ+XHJcblx0XHQ8L2Vqcy1waXZvdGZpZWxkbGlzdD5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiBjbGFzcz1cImZ1bGwtYm94LW1hc2tcIiAqbmdJZj1cInBhZ2VMb2FkaW5nXCI+XHJcblx0XHQ8bWF0LXNwaW5uZXJcclxuXHRcdFx0c3R5bGU9XCJ6LWluZGV4OiA5OTlcIlxyXG5cdFx0XHRtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcblx0XHRcdFtkaWFtZXRlcl09XCIyNFwiXHJcblx0XHQ+PC9tYXQtc3Bpbm5lcj5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|