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