@sapui5/sap.fe.templates 1.108.8 → 1.108.11
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/package.json +6 -3
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
- package/src/sap/fe/templates/Feedback.js +3 -13
- package/src/sap/fe/templates/ListComponent.js +2 -19
- package/src/sap/fe/templates/ListReport/Component.js +1 -18
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +10 -35
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +1 -1
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +80 -226
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +9 -2
- package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
- package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
- package/src/sap/fe/templates/ObjectPage/Component.js +13 -38
- package/src/sap/fe/templates/ObjectPage/Component.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +17 -54
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +256 -467
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +69 -15
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +66 -198
- package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
- package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
- package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +1 -1
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +15 -20
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +18 -68
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -2
- package/src/sap/fe/templates/TableScroller.js +1 -6
- package/src/sap/fe/templates/library.js +2 -5
- package/src/sap/fe/templates/messagebundle_it.properties +1 -1
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MessageStrip", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/TableHelper", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Component", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./ListReportTemplating", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, ActionRuntime, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, MessageStrip, StableIdHelper, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableHelper, ExtensionAPI, EditFlowOverrides, TableScroller, Component, OverrideExecution, Device, StateUtil, hasher, ListReportTemplating, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MessageStrip", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/TableHelper", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/base/ManagedObject", "sap/ui/core/Component", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./ListReportTemplating", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, ActionRuntime, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, MessageStrip, StableIdHelper, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableHelper, ExtensionAPI, EditFlowOverrides, TableScroller, ManagedObject, Component, OverrideExecution, Device, StateUtil, hasher, ListReportTemplating, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
|
|
9
|
-
|
|
10
9
|
var system = Device.system;
|
|
11
10
|
var usingExtension = ClassSupport.usingExtension;
|
|
12
11
|
var publicExtension = ClassSupport.publicExtension;
|
|
@@ -14,21 +13,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
14
13
|
var finalExtension = ClassSupport.finalExtension;
|
|
15
14
|
var extensible = ClassSupport.extensible;
|
|
16
15
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
17
|
-
|
|
18
16
|
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
19
|
-
|
|
20
17
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
21
|
-
|
|
22
18
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
23
|
-
|
|
24
19
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
25
|
-
|
|
26
20
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
27
|
-
|
|
28
21
|
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
29
|
-
|
|
30
22
|
var TemplateContentView = CoreLibrary.TemplateContentView,
|
|
31
|
-
|
|
23
|
+
InitialLoadMode = CoreLibrary.InitialLoadMode;
|
|
32
24
|
var ListReportController = (_dec = defineUI5Class("sap.fe.templates.ListReport.ListReportController"), _dec2 = usingExtension(InternalRouting.override({
|
|
33
25
|
onAfterBinding: function () {
|
|
34
26
|
this.getView().getController()._onAfterBinding();
|
|
@@ -39,49 +31,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
39
31
|
}
|
|
40
32
|
})), _dec4 = usingExtension(SideEffects), _dec5 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec6 = usingExtension(Share.override(ShareOverrides)), _dec7 = usingExtension(EditFlow.override(EditFlowOverrides)), _dec8 = usingExtension(ViewState.override(ViewStateOverrides)), _dec9 = usingExtension(KPIManagement), _dec10 = usingExtension(Placeholder), _dec11 = usingExtension(MassEdit), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = privateExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
|
|
41
33
|
_inheritsLoose(ListReportController, _PageController);
|
|
42
|
-
|
|
43
34
|
function ListReportController() {
|
|
44
35
|
var _this;
|
|
45
|
-
|
|
46
36
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
47
37
|
args[_key] = arguments[_key];
|
|
48
38
|
}
|
|
49
|
-
|
|
50
39
|
_this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
|
|
51
|
-
|
|
52
40
|
_initializerDefineProperty(_this, "_routing", _descriptor, _assertThisInitialized(_this));
|
|
53
|
-
|
|
54
41
|
_initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor2, _assertThisInitialized(_this));
|
|
55
|
-
|
|
56
42
|
_initializerDefineProperty(_this, "sideEffects", _descriptor3, _assertThisInitialized(_this));
|
|
57
|
-
|
|
58
43
|
_initializerDefineProperty(_this, "intentBasedNavigation", _descriptor4, _assertThisInitialized(_this));
|
|
59
|
-
|
|
60
44
|
_initializerDefineProperty(_this, "share", _descriptor5, _assertThisInitialized(_this));
|
|
61
|
-
|
|
62
45
|
_initializerDefineProperty(_this, "editFlow", _descriptor6, _assertThisInitialized(_this));
|
|
63
|
-
|
|
64
46
|
_initializerDefineProperty(_this, "viewState", _descriptor7, _assertThisInitialized(_this));
|
|
65
|
-
|
|
66
47
|
_initializerDefineProperty(_this, "kpiManagement", _descriptor8, _assertThisInitialized(_this));
|
|
67
|
-
|
|
68
48
|
_initializerDefineProperty(_this, "placeholder", _descriptor9, _assertThisInitialized(_this));
|
|
69
|
-
|
|
70
49
|
_initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
|
|
71
|
-
|
|
72
50
|
_this.handlers = {
|
|
73
51
|
onFilterSearch: function () {
|
|
74
52
|
this._getFilterBarControl().triggerSearch();
|
|
75
53
|
},
|
|
76
54
|
onFiltersChanged: function (oEvent) {
|
|
77
55
|
var oFilterBar = this._getFilterBarControl();
|
|
78
|
-
|
|
79
56
|
if (oFilterBar) {
|
|
80
|
-
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
81
|
-
|
|
57
|
+
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
58
|
+
// Pending filters into FilterBar to be used for custom views
|
|
82
59
|
this.onPendingFilters();
|
|
83
|
-
|
|
84
|
-
|
|
60
|
+
var appliedFiltersText = oFilterBar.getAssignedFiltersText().filtersText;
|
|
61
|
+
var appliedFilterBinding = ManagedObject.bindingParser(appliedFiltersText);
|
|
62
|
+
if (appliedFilterBinding) {
|
|
63
|
+
var _this$getView$byId;
|
|
64
|
+
(_this$getView$byId = this.getView().byId("fe::appliedFiltersText")) === null || _this$getView$byId === void 0 ? void 0 : _this$getView$byId.bindText(appliedFilterBinding);
|
|
65
|
+
} else {
|
|
66
|
+
var _this$getView$byId2;
|
|
67
|
+
(_this$getView$byId2 = this.getView().byId("fe::appliedFiltersText")) === null || _this$getView$byId2 === void 0 ? void 0 : _this$getView$byId2.setText(appliedFiltersText);
|
|
68
|
+
}
|
|
85
69
|
if (oEvent.getParameter("conditionsBased")) {
|
|
86
70
|
oInternalModelContext.setProperty("hasPendingFilters", true);
|
|
87
71
|
}
|
|
@@ -89,19 +73,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
89
73
|
},
|
|
90
74
|
onVariantSelected: function (oEvent) {
|
|
91
75
|
var _this2 = this;
|
|
92
|
-
|
|
93
76
|
var oVM = oEvent.getSource();
|
|
94
77
|
var currentVariantKey = oEvent.getParameter("key");
|
|
95
|
-
|
|
96
78
|
var oMultiModeControl = this._getMultiModeControl();
|
|
97
|
-
|
|
98
79
|
if (oMultiModeControl && !(oVM !== null && oVM !== void 0 && oVM.getParent().isA("sap.ui.mdc.ActionToolbar"))) {
|
|
99
80
|
//Not a Control Variant
|
|
100
81
|
oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.invalidateContent();
|
|
101
82
|
oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.setFreezeContent(true);
|
|
102
|
-
}
|
|
103
|
-
|
|
83
|
+
}
|
|
104
84
|
|
|
85
|
+
// setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
|
|
105
86
|
setTimeout(function () {
|
|
106
87
|
if (_this2._shouldAutoTriggerSearch(oVM)) {
|
|
107
88
|
// the app state will be updated via onSearch handler
|
|
@@ -113,7 +94,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
113
94
|
},
|
|
114
95
|
onVariantSaved: function () {
|
|
115
96
|
var _this3 = this;
|
|
116
|
-
|
|
117
97
|
//TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save!!!
|
|
118
98
|
setTimeout(function () {
|
|
119
99
|
_this3.getExtensionAPI().updateAppState();
|
|
@@ -121,52 +101,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
121
101
|
},
|
|
122
102
|
onSearch: function () {
|
|
123
103
|
var _this4 = this;
|
|
124
|
-
|
|
125
104
|
var oFilterBar = this._getFilterBarControl();
|
|
126
|
-
|
|
127
105
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
128
106
|
var oMdcChart = this.getChartControl();
|
|
129
107
|
var bHideDraft = FilterUtils.getEditStateIsHideDraft(oFilterBar.getConditions());
|
|
130
108
|
oInternalModelContext.setProperty("hasPendingFilters", false);
|
|
131
109
|
oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
|
|
132
|
-
|
|
133
110
|
if (!this._getMultiModeControl()) {
|
|
134
111
|
this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
|
|
135
112
|
}
|
|
136
|
-
|
|
137
113
|
if (oMdcChart) {
|
|
138
114
|
// disable bound actions TODO: this clears everything for the chart?
|
|
139
115
|
oMdcChart.getBindingContext("internal").setProperty("", {});
|
|
140
116
|
var oPageInternalModelContext = oMdcChart.getBindingContext("pageInternal");
|
|
141
117
|
var sTemplateContentView = oPageInternalModelContext.getProperty("".concat(oPageInternalModelContext.getPath(), "/alpContentView"));
|
|
142
|
-
|
|
143
118
|
if (sTemplateContentView === TemplateContentView.Chart) {
|
|
144
119
|
this.hasPendingChartChanges = true;
|
|
145
120
|
}
|
|
146
|
-
|
|
147
121
|
if (sTemplateContentView === TemplateContentView.Table) {
|
|
148
122
|
this.hasPendingTableChanges = true;
|
|
149
123
|
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
124
|
+
}
|
|
125
|
+
// store filter bar conditions to use later while navigation
|
|
153
126
|
StateUtil.retrieveExternalState(oFilterBar).then(function (oExternalState) {
|
|
154
127
|
_this4.filterBarConditions = oExternalState.filter;
|
|
155
128
|
}).catch(function (oError) {
|
|
156
129
|
Log.error("Error while retrieving the external state", oError);
|
|
157
130
|
});
|
|
158
|
-
|
|
159
131
|
if (this.getView().getViewData().liveMode === false) {
|
|
160
132
|
this.getExtensionAPI().updateAppState();
|
|
161
133
|
}
|
|
162
|
-
|
|
163
134
|
if (system.phone) {
|
|
164
135
|
var oDynamicPage = this._getDynamicListReportControl();
|
|
165
|
-
|
|
166
136
|
oDynamicPage.setHeaderExpanded(false);
|
|
167
137
|
}
|
|
168
138
|
},
|
|
169
|
-
|
|
170
139
|
/**
|
|
171
140
|
* Triggers an outbound navigation when a user chooses the chevron.
|
|
172
141
|
*
|
|
@@ -183,19 +152,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
183
152
|
},
|
|
184
153
|
onChartSelectionChanged: function (oEvent) {
|
|
185
154
|
var oMdcChart = oEvent.getSource().getContent(),
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
155
|
+
oTable = this._getTable(),
|
|
156
|
+
aData = oEvent.getParameter("data"),
|
|
157
|
+
oInternalModelContext = this.getView().getBindingContext("internal");
|
|
190
158
|
if (aData) {
|
|
191
159
|
// update action buttons enablement / disablement
|
|
192
|
-
ChartRuntime.fnUpdateChart(oEvent);
|
|
193
|
-
|
|
160
|
+
ChartRuntime.fnUpdateChart(oEvent);
|
|
161
|
+
// update selections on selection or deselection
|
|
194
162
|
ChartUtils.setChartFilters(oMdcChart);
|
|
195
163
|
}
|
|
196
|
-
|
|
197
164
|
var sTemplateContentView = oInternalModelContext.getProperty("".concat(oInternalModelContext.getPath(), "/alpContentView"));
|
|
198
|
-
|
|
199
165
|
if (sTemplateContentView === TemplateContentView.Chart) {
|
|
200
166
|
this.hasPendingChartChanges = true;
|
|
201
167
|
} else if (oTable) {
|
|
@@ -208,9 +174,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
208
174
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
209
175
|
oInternalModelContext.setProperty("alpContentView", sSelectedKey);
|
|
210
176
|
var oChart = this.getChartControl();
|
|
211
|
-
|
|
212
177
|
var oTable = this._getTable();
|
|
213
|
-
|
|
214
178
|
var oSegmentedButtonDelegate = {
|
|
215
179
|
onAfterRendering: function () {
|
|
216
180
|
var aItems = oSegmentedButton.getItems();
|
|
@@ -223,40 +187,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
223
187
|
}
|
|
224
188
|
};
|
|
225
189
|
var oSegmentedButton = sSelectedKey === TemplateContentView.Table ? this._getSegmentedButton("Table") : this._getSegmentedButton("Chart");
|
|
226
|
-
|
|
227
190
|
if (oSegmentedButton !== oEvent.getSource()) {
|
|
228
191
|
oSegmentedButton.addEventDelegate(oSegmentedButtonDelegate);
|
|
229
192
|
}
|
|
230
|
-
|
|
231
193
|
switch (sSelectedKey) {
|
|
232
194
|
case TemplateContentView.Table:
|
|
233
195
|
this._updateTable(oTable);
|
|
234
|
-
|
|
235
196
|
break;
|
|
236
|
-
|
|
237
197
|
case TemplateContentView.Chart:
|
|
238
198
|
this._updateChart(oChart);
|
|
239
|
-
|
|
240
199
|
break;
|
|
241
|
-
|
|
242
200
|
case TemplateContentView.Hybrid:
|
|
243
201
|
this._updateTable(oTable);
|
|
244
|
-
|
|
245
202
|
this._updateChart(oChart);
|
|
246
|
-
|
|
247
203
|
break;
|
|
248
|
-
|
|
249
204
|
default:
|
|
250
205
|
break;
|
|
251
206
|
}
|
|
252
|
-
|
|
253
207
|
this.getExtensionAPI().updateAppState();
|
|
254
208
|
},
|
|
255
209
|
onFiltersSegmentedButtonPressed: function (oEvent) {
|
|
256
210
|
var isCompact = oEvent.getParameter("key") === "Compact";
|
|
257
|
-
|
|
258
211
|
this._getFilterBarControl().setVisible(isCompact);
|
|
259
|
-
|
|
260
212
|
this._getVisualFilterBarControl().setVisible(!isCompact);
|
|
261
213
|
},
|
|
262
214
|
onStateChange: function () {
|
|
@@ -264,7 +216,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
264
216
|
},
|
|
265
217
|
onDynamicPageTitleStateChanged: function (oEvent) {
|
|
266
218
|
var filterBar = this._getFilterBarControl();
|
|
267
|
-
|
|
268
219
|
if (filterBar && filterBar.getSegmentedButton()) {
|
|
269
220
|
if (oEvent.getParameter("isExpanded")) {
|
|
270
221
|
filterBar.getSegmentedButton().setVisible(true);
|
|
@@ -278,9 +229,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
278
229
|
setALPControlMessageStrip: function (aIgnoredFields, bIsChart, oApplySupported) {
|
|
279
230
|
var sText = "";
|
|
280
231
|
bIsChart = bIsChart === "true" || bIsChart === true;
|
|
281
|
-
|
|
282
232
|
var oFilterBar = this._getFilterBarControl();
|
|
283
|
-
|
|
284
233
|
if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && bIsChart) {
|
|
285
234
|
var aIgnoredLabels = MessageStrip.getLabels(aIgnoredFields, oFilterBar.data("entityType"), oFilterBar, this.oResourceBundle);
|
|
286
235
|
var bIsSearchIgnored = !oApplySupported.enableSearch;
|
|
@@ -291,69 +240,55 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
291
240
|
};
|
|
292
241
|
return _this;
|
|
293
242
|
}
|
|
294
|
-
|
|
295
243
|
var _proto = ListReportController.prototype;
|
|
296
|
-
|
|
297
244
|
_proto.getExtensionAPI = function getExtensionAPI() {
|
|
298
245
|
if (!this.extensionAPI) {
|
|
299
246
|
this.extensionAPI = new ExtensionAPI(this);
|
|
300
247
|
}
|
|
301
|
-
|
|
302
248
|
return this.extensionAPI;
|
|
303
249
|
};
|
|
304
|
-
|
|
305
250
|
_proto.onInit = function onInit() {
|
|
306
251
|
PageController.prototype.onInit.apply(this);
|
|
307
252
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
308
253
|
oInternalModelContext.setProperty("hasPendingFilters", true);
|
|
309
|
-
oInternalModelContext.setProperty("appliedFilters", "");
|
|
310
254
|
oInternalModelContext.setProperty("hideDraftInfo", false);
|
|
311
255
|
oInternalModelContext.setProperty("uom", {});
|
|
312
256
|
oInternalModelContext.setProperty("scalefactor", {});
|
|
313
257
|
oInternalModelContext.setProperty("scalefactorNumber", {});
|
|
314
258
|
oInternalModelContext.setProperty("currency", {});
|
|
315
|
-
|
|
316
259
|
if (this._hasMultiVisualizations()) {
|
|
317
260
|
var alpContentView = this._getDefaultPath();
|
|
318
|
-
|
|
319
261
|
if (!system.desktop && alpContentView === TemplateContentView.Hybrid) {
|
|
320
262
|
alpContentView = TemplateContentView.Chart;
|
|
321
263
|
}
|
|
322
|
-
|
|
323
264
|
oInternalModelContext.setProperty("alpContentView", alpContentView);
|
|
324
|
-
}
|
|
325
|
-
// this is later used before navigation to get conditions applied on the filter bar
|
|
265
|
+
}
|
|
326
266
|
|
|
267
|
+
// Store conditions from filter bar
|
|
268
|
+
// this is later used before navigation to get conditions applied on the filter bar
|
|
269
|
+
this.filterBarConditions = {};
|
|
327
270
|
|
|
328
|
-
|
|
271
|
+
// As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
|
|
329
272
|
// happen after the routeMatch event has been processed (otherwise the router gets broken)
|
|
273
|
+
this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation();
|
|
330
274
|
|
|
331
|
-
|
|
332
|
-
|
|
275
|
+
// Configure the initial load settings
|
|
333
276
|
this._setInitLoad();
|
|
334
277
|
};
|
|
335
|
-
|
|
336
278
|
_proto.onExit = function onExit() {
|
|
337
279
|
delete this.filterBarConditions;
|
|
338
|
-
|
|
339
280
|
if (this.extensionAPI) {
|
|
340
281
|
this.extensionAPI.destroy();
|
|
341
282
|
}
|
|
342
|
-
|
|
343
283
|
delete this.extensionAPI;
|
|
344
284
|
};
|
|
345
|
-
|
|
346
285
|
_proto._onAfterBinding = function _onAfterBinding() {
|
|
347
286
|
var _this5 = this;
|
|
348
|
-
|
|
349
287
|
var aTables = this._getControls("table");
|
|
350
|
-
|
|
351
288
|
if (EditState.isEditStateDirty()) {
|
|
352
289
|
var _this$_getMultiModeCo, _this$_getTable;
|
|
353
|
-
|
|
354
290
|
(_this$_getMultiModeCo = this._getMultiModeControl()) === null || _this$_getMultiModeCo === void 0 ? void 0 : _this$_getMultiModeCo.invalidateContent();
|
|
355
291
|
var oTableBinding = (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.getRowBinding();
|
|
356
|
-
|
|
357
292
|
if (oTableBinding) {
|
|
358
293
|
if (CommonUtils.getAppComponent(this.getView())._isFclEnabled()) {
|
|
359
294
|
// there is an issue if we use a timeout with a kept alive context used on another page
|
|
@@ -364,43 +299,32 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
364
299
|
oTableBinding.refresh();
|
|
365
300
|
delete _this5.sUpdateTimer;
|
|
366
301
|
}, 0);
|
|
367
|
-
}
|
|
368
|
-
|
|
302
|
+
}
|
|
369
303
|
|
|
304
|
+
// Update action enablement and visibility upon table data update.
|
|
370
305
|
var fnUpdateTableActions = function () {
|
|
371
306
|
_this5._updateTableActions(aTables);
|
|
372
|
-
|
|
373
307
|
oTableBinding.detachDataReceived(fnUpdateTableActions);
|
|
374
308
|
};
|
|
375
|
-
|
|
376
309
|
oTableBinding.attachDataReceived(fnUpdateTableActions);
|
|
377
310
|
}
|
|
378
311
|
}
|
|
379
|
-
|
|
380
312
|
EditState.setEditStateProcessed();
|
|
381
313
|
}
|
|
382
|
-
|
|
383
314
|
if (!this.sUpdateTimer) {
|
|
384
315
|
this._updateTableActions(aTables);
|
|
385
316
|
}
|
|
386
|
-
|
|
387
317
|
this.pageReady.waitFor(this.getAppComponent().getAppStateHandler().applyAppState());
|
|
388
318
|
};
|
|
389
|
-
|
|
390
319
|
_proto.onBeforeRendering = function onBeforeRendering() {
|
|
391
320
|
PageController.prototype.onBeforeRendering.apply(this);
|
|
392
321
|
};
|
|
393
|
-
|
|
394
322
|
_proto.onAfterRendering = function onAfterRendering() {
|
|
395
323
|
var _this6 = this;
|
|
396
|
-
|
|
397
324
|
this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
|
|
398
325
|
_this6.oResourceBundle = response;
|
|
399
|
-
|
|
400
326
|
var aTables = _this6._getControls();
|
|
401
|
-
|
|
402
327
|
var sEntitySet = _this6.getView().getViewData().entitySet;
|
|
403
|
-
|
|
404
328
|
var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this6.oResourceBundle, undefined, sEntitySet);
|
|
405
329
|
aTables.forEach(function (oTable) {
|
|
406
330
|
oTable.setNoData(sText);
|
|
@@ -409,15 +333,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
409
333
|
Log.error("Error while retrieving the resource bundle", oError);
|
|
410
334
|
});
|
|
411
335
|
};
|
|
412
|
-
|
|
413
336
|
_proto.onPageReady = function onPageReady(mParameters) {
|
|
414
337
|
if (mParameters.forceFocus) {
|
|
415
338
|
this._setInitialFocus();
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
|
|
339
|
+
}
|
|
340
|
+
// Remove the handler on back navigation that displays Draft confirmation
|
|
419
341
|
this.getAppComponent().getShellServices().setBackNavigation(undefined);
|
|
420
342
|
}
|
|
343
|
+
|
|
421
344
|
/**
|
|
422
345
|
* Method called when the content of a list report view needs to be refreshed.
|
|
423
346
|
* This happens either when there is a change on the FilterBar and the search is triggered,
|
|
@@ -445,13 +368,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
445
368
|
* }
|
|
446
369
|
* </pre></code>
|
|
447
370
|
* @public
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
371
|
+
*/;
|
|
372
|
+
_proto.
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
452
374
|
onViewNeedsRefresh = function onViewNeedsRefresh(mParameters) {
|
|
453
375
|
/* To be overriden */
|
|
454
376
|
}
|
|
377
|
+
|
|
455
378
|
/**
|
|
456
379
|
* Method called when a filter or search value has been changed in the FilterBar,
|
|
457
380
|
* but has not been validated yet by the end user (with the 'Go' or 'Search' button).
|
|
@@ -459,35 +382,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
459
382
|
* This method can be overwritten by the controller extension in case of customization.
|
|
460
383
|
*
|
|
461
384
|
* @public
|
|
462
|
-
|
|
463
|
-
;
|
|
464
|
-
|
|
385
|
+
*/;
|
|
465
386
|
_proto.onPendingFilters = function onPendingFilters() {
|
|
466
387
|
/* To be overriden */
|
|
467
388
|
};
|
|
468
|
-
|
|
469
389
|
_proto.getCurrentEntitySet = function getCurrentEntitySet() {
|
|
470
390
|
var _this$_getTable2;
|
|
471
|
-
|
|
472
391
|
return (_this$_getTable2 = this._getTable()) === null || _this$_getTable2 === void 0 ? void 0 : _this$_getTable2.data("targetCollectionPath").slice(1);
|
|
473
392
|
}
|
|
393
|
+
|
|
474
394
|
/**
|
|
475
395
|
* This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
|
|
476
396
|
*
|
|
477
397
|
* @param aTables Array of tables in the list report
|
|
478
398
|
* @private
|
|
479
|
-
|
|
480
|
-
;
|
|
481
|
-
|
|
399
|
+
*/;
|
|
482
400
|
_proto._updateTableActions = function _updateTableActions(aTables) {
|
|
483
401
|
var aIBNActions = [];
|
|
484
402
|
aTables.forEach(function (oTable) {
|
|
485
|
-
aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
|
|
403
|
+
aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
|
|
404
|
+
// Update 'enabled' property of DataFieldForAction buttons on table toolbar
|
|
486
405
|
// The same is also performed on Table selectionChange event
|
|
487
|
-
|
|
488
406
|
var oInternalModelContext = oTable.getBindingContext("internal"),
|
|
489
|
-
|
|
490
|
-
|
|
407
|
+
oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
|
|
408
|
+
aSelectedContexts = oTable.getSelectedContexts();
|
|
491
409
|
oInternalModelContext.setProperty("selectedContexts", aSelectedContexts);
|
|
492
410
|
oInternalModelContext.setProperty("numberOfSelectedContexts", aSelectedContexts.length);
|
|
493
411
|
TableHelper.handleTableDeleteEnablementForSideEffects(oTable, oInternalModelContext);
|
|
@@ -495,44 +413,40 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
495
413
|
});
|
|
496
414
|
CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
|
|
497
415
|
}
|
|
416
|
+
|
|
498
417
|
/**
|
|
499
418
|
* This method scrolls to a specific row on all the available tables.
|
|
500
419
|
*
|
|
501
420
|
* @function
|
|
502
421
|
* @name sap.fe.templates.ListReport.ListReportController.controller#_scrollTablesToRow
|
|
503
422
|
* @param sRowPath The path of the table row context to be scrolled to
|
|
504
|
-
|
|
505
|
-
;
|
|
506
|
-
|
|
423
|
+
*/;
|
|
507
424
|
_proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
|
|
508
425
|
this._getControls("table").forEach(function (oTable) {
|
|
509
426
|
TableScroller.scrollTableToRow(oTable, sRowPath);
|
|
510
427
|
});
|
|
511
428
|
}
|
|
429
|
+
|
|
512
430
|
/**
|
|
513
431
|
* This method set the initial focus within the List Report according to the UX guide lines.
|
|
514
432
|
*
|
|
515
433
|
* @function
|
|
516
434
|
* @name sap.fe.templates.ListReport.ListReportController.controller#_setInitialFocus
|
|
517
|
-
|
|
518
|
-
;
|
|
519
|
-
|
|
435
|
+
*/;
|
|
520
436
|
_proto._setInitialFocus = function _setInitialFocus() {
|
|
521
437
|
var dynamicPage = this._getDynamicListReportControl(),
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
438
|
+
isHeaderExpanded = dynamicPage.getHeaderExpanded(),
|
|
439
|
+
filterBar = this._getFilterBarControl();
|
|
525
440
|
if (filterBar) {
|
|
526
441
|
if (isHeaderExpanded) {
|
|
527
442
|
//Enabling mandatory filter fields message dialog
|
|
528
443
|
if (!filterBar.getShowMessages()) {
|
|
529
444
|
filterBar.setShowMessages(true);
|
|
530
445
|
}
|
|
531
|
-
|
|
532
446
|
var firstEmptyMandatoryField = filterBar.getFilterItems().find(function (oFilterItem) {
|
|
533
447
|
return oFilterItem.getRequired() && oFilterItem.getConditions().length === 0;
|
|
534
|
-
});
|
|
535
|
-
|
|
448
|
+
});
|
|
449
|
+
//Focusing on the first empty mandatory filter field, or on the first filter field if the table data is loaded
|
|
536
450
|
if (firstEmptyMandatoryField) {
|
|
537
451
|
firstEmptyMandatoryField.focus();
|
|
538
452
|
} else if (this._isInitLoadEnabled()) {
|
|
@@ -543,16 +457,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
543
457
|
}
|
|
544
458
|
} else if (this._isInitLoadEnabled()) {
|
|
545
459
|
var _this$_getTable3;
|
|
546
|
-
|
|
547
460
|
(_this$_getTable3 = this._getTable()) === null || _this$_getTable3 === void 0 ? void 0 : _this$_getTable3.focusRow(0);
|
|
548
461
|
}
|
|
549
462
|
} else {
|
|
550
463
|
var _this$_getTable4;
|
|
551
|
-
|
|
552
464
|
(_this$_getTable4 = this._getTable()) === null || _this$_getTable4 === void 0 ? void 0 : _this$_getTable4.focusRow(0);
|
|
553
465
|
}
|
|
554
466
|
};
|
|
555
|
-
|
|
556
467
|
_proto._getPageTitleInformation = function _getPageTitleInformation() {
|
|
557
468
|
var oManifestEntry = this.getAppComponent().getManifestEntry("sap.app");
|
|
558
469
|
return {
|
|
@@ -562,93 +473,69 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
562
473
|
icon: ""
|
|
563
474
|
};
|
|
564
475
|
};
|
|
565
|
-
|
|
566
476
|
_proto._getFilterBarControl = function _getFilterBarControl() {
|
|
567
477
|
return this.getView().byId(this._getFilterBarControlId());
|
|
568
478
|
};
|
|
569
|
-
|
|
570
479
|
_proto._getDynamicListReportControl = function _getDynamicListReportControl() {
|
|
571
480
|
return this.getView().byId(this._getDynamicListReportControlId());
|
|
572
481
|
};
|
|
573
|
-
|
|
574
482
|
_proto._getAdaptationFilterBarControl = function _getAdaptationFilterBarControl() {
|
|
575
483
|
// If the adaptation filter bar is part of the DOM tree, the "Adapt Filter" dialog is open,
|
|
576
484
|
// and we return the adaptation filter bar as an active control (visible for the user)
|
|
577
485
|
var adaptationFilterBar = this._getFilterBarControl().getInbuiltFilter();
|
|
578
|
-
|
|
579
486
|
return adaptationFilterBar !== null && adaptationFilterBar !== void 0 && adaptationFilterBar.getParent() ? adaptationFilterBar : undefined;
|
|
580
487
|
};
|
|
581
|
-
|
|
582
488
|
_proto._getSegmentedButton = function _getSegmentedButton(sControl) {
|
|
583
489
|
var _ref;
|
|
584
|
-
|
|
585
490
|
var sSegmentedButtonId = (_ref = sControl === "Chart" ? this.getChartControl() : this._getTable()) === null || _ref === void 0 ? void 0 : _ref.data("segmentedButtonId");
|
|
586
491
|
return this.getView().byId(sSegmentedButtonId);
|
|
587
492
|
};
|
|
588
|
-
|
|
589
493
|
_proto._getControlFromPageModelProperty = function _getControlFromPageModelProperty(sPath) {
|
|
590
494
|
var _this$_getPageModel;
|
|
591
|
-
|
|
592
495
|
var controlId = (_this$_getPageModel = this._getPageModel()) === null || _this$_getPageModel === void 0 ? void 0 : _this$_getPageModel.getProperty(sPath);
|
|
593
496
|
return controlId && this.getView().byId(controlId);
|
|
594
497
|
};
|
|
595
|
-
|
|
596
498
|
_proto._getPageModel = function _getPageModel() {
|
|
597
499
|
var pageComponent = Component.getOwnerComponentFor(this.getView());
|
|
598
500
|
return pageComponent.getModel("_pageModel");
|
|
599
501
|
};
|
|
600
|
-
|
|
601
502
|
_proto._getDynamicListReportControlId = function _getDynamicListReportControlId() {
|
|
602
503
|
var _this$_getPageModel2;
|
|
603
|
-
|
|
604
504
|
return ((_this$_getPageModel2 = this._getPageModel()) === null || _this$_getPageModel2 === void 0 ? void 0 : _this$_getPageModel2.getProperty("/dynamicListReportId")) || "";
|
|
605
505
|
};
|
|
606
|
-
|
|
607
506
|
_proto._getFilterBarControlId = function _getFilterBarControlId() {
|
|
608
507
|
var _this$_getPageModel3;
|
|
609
|
-
|
|
610
508
|
return ((_this$_getPageModel3 = this._getPageModel()) === null || _this$_getPageModel3 === void 0 ? void 0 : _this$_getPageModel3.getProperty("/filterBarId")) || "";
|
|
611
509
|
};
|
|
612
|
-
|
|
613
510
|
_proto.getChartControl = function getChartControl() {
|
|
614
511
|
return this._getControlFromPageModelProperty("/singleChartId");
|
|
615
512
|
};
|
|
616
|
-
|
|
617
513
|
_proto._getVisualFilterBarControl = function _getVisualFilterBarControl() {
|
|
618
514
|
var sVisualFilterBarId = StableIdHelper.generate(["visualFilter", this._getFilterBarControlId()]);
|
|
619
515
|
return sVisualFilterBarId && this.getView().byId(sVisualFilterBarId);
|
|
620
516
|
};
|
|
621
|
-
|
|
622
517
|
_proto._getFilterBarVariantControl = function _getFilterBarVariantControl() {
|
|
623
518
|
return this._getControlFromPageModelProperty("/variantManagement/id");
|
|
624
519
|
};
|
|
625
|
-
|
|
626
520
|
_proto._getMultiModeControl = function _getMultiModeControl() {
|
|
627
521
|
return this.getView().byId("fe::TabMultipleMode::Control");
|
|
628
522
|
};
|
|
629
|
-
|
|
630
523
|
_proto._getTable = function _getTable() {
|
|
631
524
|
if (this._isMultiMode()) {
|
|
632
525
|
var _this$_getMultiModeCo2, _this$_getMultiModeCo3;
|
|
633
|
-
|
|
634
526
|
var oControl = (_this$_getMultiModeCo2 = this._getMultiModeControl()) === null || _this$_getMultiModeCo2 === void 0 ? void 0 : (_this$_getMultiModeCo3 = _this$_getMultiModeCo2.getSelectedInnerControl()) === null || _this$_getMultiModeCo3 === void 0 ? void 0 : _this$_getMultiModeCo3.content;
|
|
635
527
|
return oControl !== null && oControl !== void 0 && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
|
|
636
528
|
} else {
|
|
637
529
|
return this._getControlFromPageModelProperty("/singleTableId");
|
|
638
530
|
}
|
|
639
531
|
};
|
|
640
|
-
|
|
641
532
|
_proto._getControls = function _getControls(sKey) {
|
|
642
533
|
var _this7 = this;
|
|
643
|
-
|
|
644
534
|
if (this._isMultiMode()) {
|
|
645
535
|
var aControls = [];
|
|
646
|
-
|
|
647
536
|
var oTabMultiMode = this._getMultiModeControl().content;
|
|
648
|
-
|
|
649
537
|
oTabMultiMode.getItems().forEach(function (oItem) {
|
|
650
538
|
var oControl = _this7.getView().byId(oItem.getKey());
|
|
651
|
-
|
|
652
539
|
if (oControl && sKey) {
|
|
653
540
|
if (oItem.getKey().indexOf("fe::".concat(sKey)) > -1) {
|
|
654
541
|
aControls.push(oControl);
|
|
@@ -663,119 +550,103 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
663
550
|
return oChart ? [oChart] : [];
|
|
664
551
|
} else {
|
|
665
552
|
var oTable = this._getTable();
|
|
666
|
-
|
|
667
553
|
return oTable ? [oTable] : [];
|
|
668
554
|
}
|
|
669
555
|
};
|
|
670
|
-
|
|
671
556
|
_proto._getDefaultPath = function _getDefaultPath() {
|
|
672
557
|
var _this$_getPageModel4;
|
|
673
|
-
|
|
674
558
|
var defaultPath = ListReportTemplating.getDefaultPath(((_this$_getPageModel4 = this._getPageModel()) === null || _this$_getPageModel4 === void 0 ? void 0 : _this$_getPageModel4.getProperty("/views")) || []);
|
|
675
|
-
|
|
676
559
|
switch (defaultPath) {
|
|
677
560
|
case "primary":
|
|
678
561
|
return TemplateContentView.Chart;
|
|
679
|
-
|
|
680
562
|
case "secondary":
|
|
681
563
|
return TemplateContentView.Table;
|
|
682
|
-
|
|
683
564
|
case "both":
|
|
684
565
|
default:
|
|
685
566
|
return TemplateContentView.Hybrid;
|
|
686
567
|
}
|
|
687
568
|
}
|
|
569
|
+
|
|
688
570
|
/**
|
|
689
571
|
* Method to know if ListReport is configured with Multiple Table mode.
|
|
690
572
|
*
|
|
691
573
|
* @function
|
|
692
574
|
* @name _isMultiMode
|
|
693
575
|
* @returns Is Multiple Table mode set?
|
|
694
|
-
|
|
695
|
-
;
|
|
696
|
-
|
|
576
|
+
*/;
|
|
697
577
|
_proto._isMultiMode = function _isMultiMode() {
|
|
698
578
|
var _this$_getPageModel5;
|
|
699
|
-
|
|
700
579
|
return !!((_this$_getPageModel5 = this._getPageModel()) !== null && _this$_getPageModel5 !== void 0 && _this$_getPageModel5.getProperty("/multiViewsControl"));
|
|
701
580
|
}
|
|
581
|
+
|
|
702
582
|
/**
|
|
703
583
|
* Method to know if ListReport is configured to load data at start up.
|
|
704
584
|
*
|
|
705
585
|
* @function
|
|
706
586
|
* @name _isInitLoadDisabled
|
|
707
587
|
* @returns Is InitLoad enabled?
|
|
708
|
-
|
|
709
|
-
;
|
|
710
|
-
|
|
588
|
+
*/;
|
|
711
589
|
_proto._isInitLoadEnabled = function _isInitLoadEnabled() {
|
|
712
590
|
var initLoadMode = this.getView().getViewData().initialLoad;
|
|
713
591
|
return initLoadMode === InitialLoadMode.Enabled;
|
|
714
592
|
};
|
|
715
|
-
|
|
716
593
|
_proto._hasMultiVisualizations = function _hasMultiVisualizations() {
|
|
717
594
|
var _this$_getPageModel6;
|
|
718
|
-
|
|
719
595
|
return (_this$_getPageModel6 = this._getPageModel()) === null || _this$_getPageModel6 === void 0 ? void 0 : _this$_getPageModel6.getProperty("/hasMultiVisualizations");
|
|
720
596
|
}
|
|
597
|
+
|
|
721
598
|
/**
|
|
722
599
|
* Method to suspend search on the filter bar. The initial loading of data is disabled based on the manifest configuration InitLoad - Disabled/Auto.
|
|
723
600
|
* It is enabled later when the view state is set, when it is possible to realize if there are default filters.
|
|
724
|
-
|
|
725
|
-
;
|
|
726
|
-
|
|
601
|
+
*/;
|
|
727
602
|
_proto._disableInitLoad = function _disableInitLoad() {
|
|
728
|
-
var filterBar = this._getFilterBarControl();
|
|
729
|
-
|
|
730
|
-
|
|
603
|
+
var filterBar = this._getFilterBarControl();
|
|
604
|
+
// check for filter bar hidden
|
|
731
605
|
if (filterBar) {
|
|
732
606
|
filterBar.setSuspendSelection(true);
|
|
733
607
|
}
|
|
734
608
|
}
|
|
609
|
+
|
|
735
610
|
/**
|
|
736
611
|
* Method called by flex to determine if the applyAutomatically setting on the variant is valid.
|
|
737
612
|
* Called only for Standard Variant and only when there is display text set for applyAutomatically (FE only sets it for Auto).
|
|
738
613
|
*
|
|
739
614
|
* @returns Boolean true if data should be loaded automatically, false otherwise
|
|
740
|
-
|
|
741
|
-
;
|
|
742
|
-
|
|
615
|
+
*/;
|
|
743
616
|
_proto._applyAutomaticallyOnStandardVariant = function _applyAutomaticallyOnStandardVariant() {
|
|
744
617
|
// We always return false and take care of it when view state is set
|
|
745
618
|
return false;
|
|
746
619
|
}
|
|
620
|
+
|
|
747
621
|
/**
|
|
748
622
|
* Configure the settings for initial load based on
|
|
749
623
|
* - manifest setting initLoad - Enabled/Disabled/Auto
|
|
750
624
|
* - user's setting of applyAutomatically on variant
|
|
751
625
|
* - if there are default filters
|
|
752
626
|
* We disable the filter bar search at the beginning and enable it when view state is set.
|
|
753
|
-
|
|
754
|
-
;
|
|
755
|
-
|
|
627
|
+
*/;
|
|
756
628
|
_proto._setInitLoad = function _setInitLoad() {
|
|
757
629
|
// if initLoad is Disabled or Auto, switch off filter bar search temporarily at start
|
|
758
630
|
if (!this._isInitLoadEnabled()) {
|
|
759
631
|
this._disableInitLoad();
|
|
760
|
-
}
|
|
632
|
+
}
|
|
633
|
+
// set hook for flex for when standard variant is set (at start or by user at runtime)
|
|
761
634
|
// required to override the user setting 'apply automatically' behaviour if there are no filters
|
|
762
|
-
|
|
763
|
-
|
|
764
635
|
var variantManagementId = ListReportTemplating.getVariantBackReference(this.getView().getViewData(), this._getPageModel());
|
|
765
636
|
var variantManagement = variantManagementId && this.getView().byId(variantManagementId);
|
|
766
|
-
|
|
767
637
|
if (variantManagement) {
|
|
768
638
|
variantManagement.registerApplyAutomaticallyOnStandardVariant(this._applyAutomaticallyOnStandardVariant.bind(this));
|
|
769
639
|
}
|
|
770
640
|
};
|
|
771
|
-
|
|
772
641
|
_proto._setShareModel = function _setShareModel() {
|
|
773
642
|
// TODO: deactivated for now - currently there is no _templPriv anymore, to be discussed
|
|
774
643
|
// this method is currently not called anymore from the init method
|
|
775
|
-
|
|
644
|
+
|
|
645
|
+
var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser");
|
|
646
|
+
//var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
|
|
776
647
|
//var sBookmarkIcon = (oManifest && oManifest.icons && oManifest.icons.icon) || "";
|
|
777
|
-
//shareModel: Holds all the sharing relevant information and info used in XML view
|
|
778
648
|
|
|
649
|
+
//shareModel: Holds all the sharing relevant information and info used in XML view
|
|
779
650
|
var oShareInfo = {
|
|
780
651
|
bookmarkTitle: document.title,
|
|
781
652
|
//To name the bookmark according to the app title.
|
|
@@ -783,7 +654,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
783
654
|
var sHash = hasher.getHash();
|
|
784
655
|
return sHash ? "#".concat(sHash) : window.location.href;
|
|
785
656
|
},
|
|
786
|
-
|
|
787
657
|
/*
|
|
788
658
|
To be activated once the FLP shows the count - see comment above
|
|
789
659
|
bookmarkServiceUrl: function() {
|
|
@@ -797,64 +667,53 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
797
667
|
var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
|
|
798
668
|
oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
|
|
799
669
|
}
|
|
670
|
+
|
|
800
671
|
/**
|
|
801
672
|
* Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
|
|
802
673
|
*
|
|
803
674
|
* @param oInternalModelContext The internal model context
|
|
804
675
|
* @param oFilterBar MDC filter bar
|
|
805
|
-
|
|
806
|
-
;
|
|
807
|
-
|
|
676
|
+
*/;
|
|
808
677
|
_proto._updateALPNotApplicableFields = function _updateALPNotApplicableFields(oInternalModelContext, oFilterBar) {
|
|
809
678
|
var mCache = {};
|
|
810
|
-
|
|
811
679
|
var ignoredFields = {},
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
680
|
+
aTables = this._getControls("table"),
|
|
681
|
+
aCharts = this._getControls("Chart");
|
|
815
682
|
if (!aTables.length || !aCharts.length) {
|
|
816
683
|
// If there's not a table and a chart, we're not in the ALP case
|
|
817
684
|
return;
|
|
818
|
-
}
|
|
819
|
-
|
|
685
|
+
}
|
|
820
686
|
|
|
687
|
+
// For the moment, there's nothing for tables...
|
|
821
688
|
aCharts.forEach(function (oChart) {
|
|
822
689
|
var sChartEntityPath = oChart.data("targetCollectionPath"),
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
690
|
+
sChartEntitySet = sChartEntityPath.slice(1),
|
|
691
|
+
sCacheKey = "".concat(sChartEntitySet, "Chart");
|
|
826
692
|
if (!mCache[sCacheKey]) {
|
|
827
693
|
mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
|
|
828
694
|
}
|
|
829
|
-
|
|
830
695
|
ignoredFields[sCacheKey] = mCache[sCacheKey];
|
|
831
696
|
});
|
|
832
697
|
oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
|
|
833
698
|
};
|
|
834
|
-
|
|
835
699
|
_proto._isFilterBarHidden = function _isFilterBarHidden() {
|
|
836
700
|
return this.getView().getViewData().hideFilterBar;
|
|
837
701
|
};
|
|
838
|
-
|
|
839
702
|
_proto._getApplyAutomaticallyOnVariant = function _getApplyAutomaticallyOnVariant(VariantManagement, key) {
|
|
840
703
|
if (!VariantManagement || !key) {
|
|
841
704
|
return false;
|
|
842
705
|
}
|
|
843
|
-
|
|
844
706
|
var variants = VariantManagement.getVariants();
|
|
845
707
|
var currentVariant = variants.find(function (variant) {
|
|
846
708
|
return variant && variant.key === key;
|
|
847
709
|
});
|
|
848
710
|
return currentVariant && currentVariant.executeOnSelect || false;
|
|
849
711
|
};
|
|
850
|
-
|
|
851
712
|
_proto._shouldAutoTriggerSearch = function _shouldAutoTriggerSearch(oVM) {
|
|
852
713
|
if (this.getView().getViewData().initialLoad === InitialLoadMode.Auto && (!oVM || oVM.getStandardVariantKey() === oVM.getCurrentVariantKey())) {
|
|
853
714
|
var oFilterBar = this._getFilterBarControl();
|
|
854
|
-
|
|
855
715
|
if (oFilterBar) {
|
|
856
716
|
var oConditions = oFilterBar.getConditions();
|
|
857
|
-
|
|
858
717
|
for (var sKey in oConditions) {
|
|
859
718
|
// ignore filters starting with $ (e.g. $search, $editState)
|
|
860
719
|
if (!sKey.startsWith("$") && Array.isArray(oConditions[sKey]) && oConditions[sKey].length) {
|
|
@@ -867,26 +726,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
867
726
|
}
|
|
868
727
|
}
|
|
869
728
|
}
|
|
870
|
-
|
|
871
729
|
return false;
|
|
872
730
|
};
|
|
873
|
-
|
|
874
731
|
_proto._updateTable = function _updateTable(oTable) {
|
|
875
732
|
if (!oTable.isTableBound() || this.hasPendingChartChanges) {
|
|
876
733
|
oTable.rebind();
|
|
877
734
|
this.hasPendingChartChanges = false;
|
|
878
735
|
}
|
|
879
736
|
};
|
|
880
|
-
|
|
881
737
|
_proto._updateChart = function _updateChart(oChart) {
|
|
882
738
|
var oInnerChart = oChart.getControlDelegate()._getChart(oChart);
|
|
883
|
-
|
|
884
739
|
if (!(oInnerChart && oInnerChart.isBound("data")) || this.hasPendingTableChanges) {
|
|
885
740
|
oChart.getControlDelegate().rebind(oChart, oInnerChart.getBindingInfo("data"));
|
|
886
741
|
this.hasPendingTableChanges = false;
|
|
887
742
|
}
|
|
888
743
|
};
|
|
889
|
-
|
|
890
744
|
return ListReportController;
|
|
891
745
|
}(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec2], {
|
|
892
746
|
configurable: true,
|
|
@@ -941,4 +795,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
|
|
|
941
795
|
}), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype)), _class2)) || _class);
|
|
942
796
|
return ListReportController;
|
|
943
797
|
}, false);
|
|
944
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiQ29yZUxpYnJhcnkiLCJJbml0aWFsTG9hZE1vZGUiLCJMaXN0UmVwb3J0Q29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJJbnRlcm5hbFJvdXRpbmciLCJvdmVycmlkZSIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfb25BZnRlckJpbmRpbmciLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldEVudGl0eVNldCIsImJhc2UiLCJnZXRDdXJyZW50RW50aXR5U2V0IiwiU2lkZUVmZmVjdHMiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIlNoYXJlIiwiU2hhcmVPdmVycmlkZXMiLCJFZGl0RmxvdyIsIkVkaXRGbG93T3ZlcnJpZGVzIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiS1BJTWFuYWdlbWVudCIsIlBsYWNlaG9sZGVyIiwiTWFzc0VkaXQiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25GaWx0ZXJTZWFyY2giLCJfZ2V0RmlsdGVyQmFyQ29udHJvbCIsInRyaWdnZXJTZWFyY2giLCJvbkZpbHRlcnNDaGFuZ2VkIiwib0V2ZW50Iiwib0ZpbHRlckJhciIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib25QZW5kaW5nRmlsdGVycyIsInNldFByb3BlcnR5IiwiZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCIsImZpbHRlcnNUZXh0IiwiZ2V0UGFyYW1ldGVyIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvVk0iLCJnZXRTb3VyY2UiLCJjdXJyZW50VmFyaWFudEtleSIsIm9NdWx0aU1vZGVDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJnZXRQYXJlbnQiLCJpc0EiLCJpbnZhbGlkYXRlQ29udGVudCIsInNldEZyZWV6ZUNvbnRlbnQiLCJzZXRUaW1lb3V0IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwiX2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudCIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwib25WYXJpYW50U2F2ZWQiLCJvblNlYXJjaCIsIm9NZGNDaGFydCIsImdldENoYXJ0Q29udHJvbCIsImJIaWRlRHJhZnQiLCJGaWx0ZXJVdGlscyIsImdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0IiwiZ2V0Q29uZGl0aW9ucyIsIl91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzIiwib1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCIsInNUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiZ2V0UHJvcGVydHkiLCJnZXRQYXRoIiwiQ2hhcnQiLCJoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzIiwiVGFibGUiLCJoYXNQZW5kaW5nVGFibGVDaGFuZ2VzIiwiU3RhdGVVdGlsIiwicmV0cmlldmVFeHRlcm5hbFN0YXRlIiwidGhlbiIsIm9FeHRlcm5hbFN0YXRlIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlciIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJnZXRWaWV3RGF0YSIsImxpdmVNb2RlIiwic3lzdGVtIiwicGhvbmUiLCJvRHluYW1pY1BhZ2UiLCJfZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJvQ29udHJvbGxlciIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJnZXRDb250ZW50Iiwib1RhYmxlIiwiX2dldFRhYmxlIiwiYURhdGEiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0IiwiQ2hhcnRVdGlscyIsInNldENoYXJ0RmlsdGVycyIsInJlYmluZCIsIm9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsInNTZWxlY3RlZEtleSIsIm1QYXJhbWV0ZXJzIiwia2V5Iiwib0NoYXJ0Iiwib1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlIiwib25BZnRlclJlbmRlcmluZyIsImFJdGVtcyIsIm9TZWdtZW50ZWRCdXR0b24iLCJnZXRJdGVtcyIsImZvckVhY2giLCJvSXRlbSIsImdldEtleSIsImZvY3VzIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9nZXRTZWdtZW50ZWRCdXR0b24iLCJhZGRFdmVudERlbGVnYXRlIiwiX3VwZGF0ZVRhYmxlIiwiX3VwZGF0ZUNoYXJ0IiwiSHlicmlkIiwib25GaWx0ZXJzU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsImlzQ29tcGFjdCIsInNldFZpc2libGUiLCJfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCIsIm9uU3RhdGVDaGFuZ2UiLCJvbkR5bmFtaWNQYWdlVGl0bGVTdGF0ZUNoYW5nZWQiLCJmaWx0ZXJCYXIiLCJnZXRTZWdtZW50ZWRCdXR0b24iLCJmb3JtYXR0ZXJzIiwic2V0QUxQQ29udHJvbE1lc3NhZ2VTdHJpcCIsImFJZ25vcmVkRmllbGRzIiwiYklzQ2hhcnQiLCJvQXBwbHlTdXBwb3J0ZWQiLCJzVGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImFJZ25vcmVkTGFiZWxzIiwiTWVzc2FnZVN0cmlwIiwiZ2V0TGFiZWxzIiwiZGF0YSIsIm9SZXNvdXJjZUJ1bmRsZSIsImJJc1NlYXJjaElnbm9yZWQiLCJlbmFibGVTZWFyY2giLCJnZXRBTFBUZXh0IiwiZ2V0VGV4dCIsIkRlbGVnYXRlVXRpbCIsImdldExvY2FsaXplZFRleHQiLCJleHRlbnNpb25BUEkiLCJFeHRlbnNpb25BUEkiLCJvbkluaXQiLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImFwcGx5IiwiX2hhc011bHRpVmlzdWFsaXphdGlvbnMiLCJhbHBDb250ZW50VmlldyIsIl9nZXREZWZhdWx0UGF0aCIsImRlc2t0b3AiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsIl9zZXRJbml0TG9hZCIsIm9uRXhpdCIsImRlc3Ryb3kiLCJhVGFibGVzIiwiX2dldENvbnRyb2xzIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIm9UYWJsZUJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiQ29tbW9uVXRpbHMiLCJfaXNGY2xFbmFibGVkIiwicmVmcmVzaCIsInNVcGRhdGVUaW1lciIsImZuVXBkYXRlVGFibGVBY3Rpb25zIiwiX3VwZGF0ZVRhYmxlQWN0aW9ucyIsImRldGFjaERhdGFSZWNlaXZlZCIsImF0dGFjaERhdGFSZWNlaXZlZCIsInNldEVkaXRTdGF0ZVByb2Nlc3NlZCIsInBhZ2VSZWFkeSIsIndhaXRGb3IiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJhcHBseUFwcFN0YXRlIiwib25CZWZvcmVSZW5kZXJpbmciLCJnZXRNb2RlbCIsImdldFJlc291cmNlQnVuZGxlIiwicmVzcG9uc2UiLCJzRW50aXR5U2V0IiwiZW50aXR5U2V0IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJ1bmRlZmluZWQiLCJzZXROb0RhdGEiLCJvblBhZ2VSZWFkeSIsImZvcmNlRm9jdXMiLCJfc2V0SW5pdGlhbEZvY3VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwib25WaWV3TmVlZHNSZWZyZXNoIiwic2xpY2UiLCJhSUJOQWN0aW9ucyIsImdldElCTkFjdGlvbnMiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiSlNPTiIsInBhcnNlIiwiQ29tbW9uSGVscGVyIiwicGFyc2VDdXN0b21EYXRhIiwiZ2V0Q3VzdG9tRGF0YSIsImFTZWxlY3RlZENvbnRleHRzIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIlRhYmxlSGVscGVyIiwiaGFuZGxlVGFibGVEZWxldGVFbmFibGVtZW50Rm9yU2lkZUVmZmVjdHMiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5IiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsImR5bmFtaWNQYWdlIiwiaXNIZWFkZXJFeHBhbmRlZCIsImdldEhlYWRlckV4cGFuZGVkIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwiZmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkIiwiZ2V0RmlsdGVySXRlbXMiLCJmaW5kIiwib0ZpbHRlckl0ZW0iLCJnZXRSZXF1aXJlZCIsIl9pc0luaXRMb2FkRW5hYmxlZCIsImJ5SWQiLCJfZ2V0RmlsdGVyQmFyQ29udHJvbElkIiwiZm9jdXNSb3ciLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvTWFuaWZlc3RFbnRyeSIsImdldE1hbmlmZXN0RW50cnkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiYXBwU3ViVGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbElkIiwiX2dldEFkYXB0YXRpb25GaWx0ZXJCYXJDb250cm9sIiwiYWRhcHRhdGlvbkZpbHRlckJhciIsImdldEluYnVpbHRGaWx0ZXIiLCJzQ29udHJvbCIsInNTZWdtZW50ZWRCdXR0b25JZCIsIl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5Iiwic1BhdGgiLCJjb250cm9sSWQiLCJfZ2V0UGFnZU1vZGVsIiwicGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwic1Zpc3VhbEZpbHRlckJhcklkIiwiU3RhYmxlSWRIZWxwZXIiLCJnZW5lcmF0ZSIsIl9nZXRGaWx0ZXJCYXJWYXJpYW50Q29udHJvbCIsIl9pc011bHRpTW9kZSIsIm9Db250cm9sIiwiZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2wiLCJjb250ZW50Iiwic0tleSIsImFDb250cm9scyIsIm9UYWJNdWx0aU1vZGUiLCJpbmRleE9mIiwicHVzaCIsImRlZmF1bHRQYXRoIiwiTGlzdFJlcG9ydFRlbXBsYXRpbmciLCJnZXREZWZhdWx0UGF0aCIsImluaXRMb2FkTW9kZSIsImluaXRpYWxMb2FkIiwiRW5hYmxlZCIsIl9kaXNhYmxlSW5pdExvYWQiLCJzZXRTdXNwZW5kU2VsZWN0aW9uIiwiX2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50IiwidmFyaWFudE1hbmFnZW1lbnRJZCIsImdldFZhcmlhbnRCYWNrUmVmZXJlbmNlIiwidmFyaWFudE1hbmFnZW1lbnQiLCJyZWdpc3RlckFwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50IiwiYmluZCIsIl9zZXRTaGFyZU1vZGVsIiwiZm5HZXRVc2VyIiwiT2JqZWN0UGF0aCIsImdldCIsIm9TaGFyZUluZm8iLCJib29rbWFya1RpdGxlIiwiZG9jdW1lbnQiLCJib29rbWFya0N1c3RvbVVybCIsInNIYXNoIiwiaGFzaGVyIiwiZ2V0SGFzaCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsImlzU2hhcmVJbkphbUFjdGl2ZSIsImlzSmFtQWN0aXZlIiwib1RlbXBsYXRlUHJpdmF0ZU1vZGVsIiwiZ2V0T3duZXJDb21wb25lbnQiLCJtQ2FjaGUiLCJpZ25vcmVkRmllbGRzIiwiYUNoYXJ0cyIsInNDaGFydEVudGl0eVBhdGgiLCJzQ2hhcnRFbnRpdHlTZXQiLCJzQ2FjaGVLZXkiLCJnZXROb3RBcHBsaWNhYmxlRmlsdGVycyIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImhpZGVGaWx0ZXJCYXIiLCJWYXJpYW50TWFuYWdlbWVudCIsInZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJjdXJyZW50VmFyaWFudCIsInZhcmlhbnQiLCJleGVjdXRlT25TZWxlY3QiLCJBdXRvIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJvQ29uZGl0aW9ucyIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZFZhcmlhbnQiLCJpc1RhYmxlQm91bmQiLCJvSW5uZXJDaGFydCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImlzQm91bmQiLCJnZXRCaW5kaW5nSW5mbyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgdHlwZSBEeW5hbWljUGFnZSBmcm9tIFwic2FwL2YvRHluYW1pY1BhZ2VcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IEtQSU1hbmFnZW1lbnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0tQSU1hbmFnZW1lbnRcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7XG5cdGRlZmluZVVJNUNsYXNzLFxuXHRleHRlbnNpYmxlLFxuXHRmaW5hbEV4dGVuc2lvbixcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uLFxuXHR1c2luZ0V4dGVuc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTWVzc2FnZVN0cmlwIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0ICogYXMgU3RhYmxlSWRIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IFRhYmxlSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlSGVscGVyXCI7XG5pbXBvcnQgTXVsdGlwbGVNb2RlQ29udHJvbCBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L2NvbnRyb2xzL011bHRpcGxlTW9kZUNvbnRyb2xcIjtcbmltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBFZGl0Rmxvd092ZXJyaWRlcyBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9Sb290Q29udGFpbmVyL292ZXJyaWRlcy9FZGl0Rmxvd1wiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IHR5cGUgU2VnbWVudGVkQnV0dG9uIGZyb20gXCJzYXAvbS9TZWdtZW50ZWRCdXR0b25cIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgaGFzaGVyIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9oYXNoZXJcIjtcbmltcG9ydCB0eXBlIHsgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0ICogYXMgTGlzdFJlcG9ydFRlbXBsYXRpbmcgZnJvbSBcIi4vTGlzdFJlcG9ydFRlbXBsYXRpbmdcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuY29uc3QgVGVtcGxhdGVDb250ZW50VmlldyA9IENvcmVMaWJyYXJ5LlRlbXBsYXRlQ29udGVudFZpZXcsXG5cdEluaXRpYWxMb2FkTW9kZSA9IENvcmVMaWJyYXJ5LkluaXRpYWxMb2FkTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyXCIpXG5jbGFzcyBMaXN0UmVwb3J0Q29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsUm91dGluZy5vdmVycmlkZSh7XG5cdFx0XHRvbkFmdGVyQmluZGluZzogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsUm91dGluZykge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5fb25BZnRlckJpbmRpbmcoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0RW50aXR5U2V0OiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmJhc2UgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLmdldEN1cnJlbnRFbnRpdHlTZXQoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFNpZGVFZmZlY3RzKVxuXHRzaWRlRWZmZWN0cyE6IFNpZGVFZmZlY3RzO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oRWRpdEZsb3cub3ZlcnJpZGUoRWRpdEZsb3dPdmVycmlkZXMpKVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihLUElNYW5hZ2VtZW50KVxuXHRrcGlNYW5hZ2VtZW50ITogS1BJTWFuYWdlbWVudDtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBFeHRlbnNpb25BUEk7XG5cdHByaXZhdGUgZmlsdGVyQmFyQ29uZGl0aW9ucz86IGFueTtcblx0cHJpdmF0ZSBzVXBkYXRlVGltZXI/OiBhbnk7XG5cdHByaXZhdGUgb1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdHByaXZhdGUgaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcz86IGJvb2xlYW47XG5cdHByaXZhdGUgaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcz86IGJvb2xlYW47XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSSgpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkluaXQuYXBwbHkodGhpcyk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIFwiXCIpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgZmFsc2UpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInVvbVwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yTnVtYmVyXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjdXJyZW5jeVwiLCB7fSk7XG5cblx0XHRpZiAodGhpcy5faGFzTXVsdGlWaXN1YWxpemF0aW9ucygpKSB7XG5cdFx0XHRsZXQgYWxwQ29udGVudFZpZXcgPSB0aGlzLl9nZXREZWZhdWx0UGF0aCgpO1xuXHRcdFx0aWYgKCFzeXN0ZW0uZGVza3RvcCAmJiBhbHBDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQpIHtcblx0XHRcdFx0YWxwQ29udGVudFZpZXcgPSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0fVxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgYWxwQ29udGVudFZpZXcpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIGNvbmRpdGlvbnMgZnJvbSBmaWx0ZXIgYmFyXG5cdFx0Ly8gdGhpcyBpcyBsYXRlciB1c2VkIGJlZm9yZSBuYXZpZ2F0aW9uIHRvIGdldCBjb25kaXRpb25zIGFwcGxpZWQgb24gdGhlIGZpbHRlciBiYXJcblx0XHR0aGlzLmZpbHRlckJhckNvbmRpdGlvbnMgPSB7fTtcblxuXHRcdC8vIEFzIEFwcFN0YXRlSGFuZGxlci5hcHBseUFwcFN0YXRlIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCB3aWxsXG5cdFx0Ly8gaGFwcGVuIGFmdGVyIHRoZSByb3V0ZU1hdGNoIGV2ZW50IGhhcyBiZWVuIHByb2Nlc3NlZCAob3RoZXJ3aXNlIHRoZSByb3V0ZXIgZ2V0cyBicm9rZW4pXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0Ly8gQ29uZmlndXJlIHRoZSBpbml0aWFsIGxvYWQgc2V0dGluZ3Ncblx0XHR0aGlzLl9zZXRJbml0TG9hZCgpO1xuXHR9XG5cblx0b25FeGl0KCkge1xuXHRcdGRlbGV0ZSB0aGlzLmZpbHRlckJhckNvbmRpdGlvbnM7XG5cdFx0aWYgKHRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblx0fVxuXG5cdF9vbkFmdGVyQmluZGluZygpIHtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKTtcblx0XHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpPy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IHRoaXMuX2dldFRhYmxlKCk/LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIHRoZXJlIGlzIGFuIGlzc3VlIGlmIHdlIHVzZSBhIHRpbWVvdXQgd2l0aCBhIGtlcHQgYWxpdmUgY29udGV4dCB1c2VkIG9uIGFub3RoZXIgcGFnZVxuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMuc1VwZGF0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zVXBkYXRlVGltZXI7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgdXBvbiB0YWJsZSBkYXRhIHVwZGF0ZS5cblx0XHRcdFx0XHRjb25zdCBmblVwZGF0ZVRhYmxlQWN0aW9ucyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZVByb2Nlc3NlZCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VSZWFkeS53YWl0Rm9yKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0KCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IHJlc3BvbnNlO1xuXHRcdFx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoKSBhcyBUYWJsZVtdO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJUX1RBQkxFX0FORF9DSEFSVF9OT19EQVRBX1RFWFRcIixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdFx0XHRvVGFibGUuc2V0Tm9EYXRhKHNUZXh0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHR0aGlzLl9zZXRJbml0aWFsRm9jdXMoKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlIHRoZSBoYW5kbGVyIG9uIGJhY2sgbmF2aWdhdGlvbiB0aGF0IGRpc3BsYXlzIERyYWZ0IGNvbmZpcm1hdGlvblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IG9mIGEgbGlzdCByZXBvcnQgdmlldyBuZWVkcyB0byBiZSByZWZyZXNoZWQuXG5cdCAqIFRoaXMgaGFwcGVucyBlaXRoZXIgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBvbiB0aGUgRmlsdGVyQmFyIGFuZCB0aGUgc2VhcmNoIGlzIHRyaWdnZXJlZCxcblx0ICogb3Igd2hlbiBhIHRhYiB3aXRoIGN1c3RvbSBjb250ZW50IGlzIHNlbGVjdGVkLlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGluIGNhc2Ugb2YgY3VzdG9taXphdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE1hcCBjb250YWluaW5nIHRoZSBmaWx0ZXIgY29uZGl0aW9ucyBvZiB0aGUgRmlsdGVyQmFyLCB0aGUgY3VycmVudFRhYklEXG5cdCAqIGFuZCB0aGUgdmlldyByZWZyZXNoIGNhdXNlICh0YWJDaGFuZ2VkIG9yIHNlYXJjaCkuXG5cdCAqIFRoZSBtYXAgbG9va3MgbGlrZSB0aGlzOlxuXHQgKiA8Y29kZT48cHJlPlxuXHQgKiBcdHtcblx0ICogXHRcdGZpbHRlckNvbmRpdGlvbnM6IHtcblx0ICogXHRcdFx0Q291bnRyeTogW1xuXHQgKiBcdFx0XHRcdHtcblx0ICogXHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCJcblx0ICpcdFx0XHRcdFx0dmFsaWRhdGVkOiBcIk5vdFZhbGlkYXRlZFwiXG5cdCAqXHRcdFx0XHRcdHZhbHVlczogW1wiR2VybWFueVwiLCAuLi5dXG5cdCAqIFx0XHRcdFx0fSxcblx0ICogXHRcdFx0XHQuLi5cblx0ICogXHRcdFx0XVxuXHQgKiBcdFx0XHQuLi5cblx0ICogXHRcdH0sXG5cdCAqXHRcdGN1cnJlbnRUYWJJZDogXCJmZTo6Q3VzdG9tVGFiOjp0YWIxXCIsXG5cdCAqXHRcdHJlZnJlc2hDYXVzZTogXCJ0YWJDaGFuZ2VkXCIgfCBcInNlYXJjaFwiXG5cdCAqXHR9XG5cdCAqIDwvcHJlPjwvY29kZT5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uVmlld05lZWRzUmVmcmVzaChtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgZmlsdGVyIG9yIHNlYXJjaCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBGaWx0ZXJCYXIsXG5cdCAqIGJ1dCBoYXMgbm90IGJlZW4gdmFsaWRhdGVkIHlldCBieSB0aGUgZW5kIHVzZXIgKHdpdGggdGhlICdHbycgb3IgJ1NlYXJjaCcgYnV0dG9uKS5cblx0ICogVHlwaWNhbGx5LCB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB0YWIgaXMgZ3JleWVkIG91dCB1bnRpbCB0aGUgZmlsdGVycyBhcmUgdmFsaWRhdGVkLlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGluIGNhc2Ugb2YgY3VzdG9taXphdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBlbmRpbmdGaWx0ZXJzKCkge1xuXHRcdC8qIFRvIGJlIG92ZXJyaWRlbiAqL1xuXHR9XG5cblx0Z2V0Q3VycmVudEVudGl0eVNldCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0VGFibGUoKT8uZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpLnNsaWNlKDEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYXRlcyB0aGUgdXBkYXRlIG9mIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JJQk4gYnV0dG9ucy5cblx0ICpcblx0ICogQHBhcmFtIGFUYWJsZXMgQXJyYXkgb2YgdGFibGVzIGluIHRoZSBsaXN0IHJlcG9ydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzOiBhbnkpIHtcblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKTtcblx0XHRcdFRhYmxlSGVscGVyLmhhbmRsZVRhYmxlRGVsZXRlRW5hYmxlbWVudEZvclNpZGVFZmZlY3RzKG9UYWJsZSwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLnVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2Qgc2Nyb2xscyB0byBhIHNwZWNpZmljIHJvdyBvbiBhbGwgdGhlIGF2YWlsYWJsZSB0YWJsZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHNSb3dQYXRoIFRoZSBwYXRoIG9mIHRoZSB0YWJsZSByb3cgY29udGV4dCB0byBiZSBzY3JvbGxlZCB0b1xuXHQgKi9cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3cob1RhYmxlLCBzUm93UGF0aCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2Qgc2V0IHRoZSBpbml0aWFsIGZvY3VzIHdpdGhpbiB0aGUgTGlzdCBSZXBvcnQgYWNjb3JkaW5nIHRvIHRoZSBVWCBndWlkZSBsaW5lcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zZXRJbml0aWFsRm9jdXNcblx0ICovXG5cdF9zZXRJbml0aWFsRm9jdXMoKSB7XG5cdFx0Y29uc3QgZHluYW1pY1BhZ2UgPSB0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2woKSxcblx0XHRcdGlzSGVhZGVyRXhwYW5kZWQgPSBkeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpLFxuXHRcdFx0ZmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueTtcblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRpZiAoaXNIZWFkZXJFeHBhbmRlZCkge1xuXHRcdFx0XHQvL0VuYWJsaW5nIG1hbmRhdG9yeSBmaWx0ZXIgZmllbGRzIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRcdGlmICghZmlsdGVyQmFyLmdldFNob3dNZXNzYWdlcygpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLnNldFNob3dNZXNzYWdlcyh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQgPSBmaWx0ZXJCYXIuZ2V0RmlsdGVySXRlbXMoKS5maW5kKGZ1bmN0aW9uIChvRmlsdGVySXRlbTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWx0ZXJJdGVtLmdldFJlcXVpcmVkKCkgJiYgb0ZpbHRlckl0ZW0uZ2V0Q29uZGl0aW9ucygpLmxlbmd0aCA9PT0gMDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vRm9jdXNpbmcgb24gdGhlIGZpcnN0IGVtcHR5IG1hbmRhdG9yeSBmaWx0ZXIgZmllbGQsIG9yIG9uIHRoZSBmaXJzdCBmaWx0ZXIgZmllbGQgaWYgdGhlIHRhYmxlIGRhdGEgaXMgbG9hZGVkXG5cdFx0XHRcdGlmIChmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQpIHtcblx0XHRcdFx0XHRmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQuZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9pc0luaXRMb2FkRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKClbMF0uZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL0ZvY3VzaW5nIG9uIHRoZSBHbyBidXR0b25cblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5ieUlkKGAke3RoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpfS1idG5TZWFyY2hgKS5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGFibGUoKT8uZm9jdXNSb3coMCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2dldFRhYmxlKCk/LmZvY3VzUm93KDApO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvTWFuaWZlc3RFbnRyeSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIik7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiBvTWFuaWZlc3RFbnRyeS50aXRsZSxcblx0XHRcdHN1YnRpdGxlOiBvTWFuaWZlc3RFbnRyeS5hcHBTdWJUaXRsZSB8fCBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHRfZ2V0RmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKSkgYXMgRmlsdGVyQmFyO1xuXHR9XG5cblx0X2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2xJZCgpKSBhcyBEeW5hbWljUGFnZTtcblx0fVxuXG5cdF9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHQvLyBJZiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGlzIHBhcnQgb2YgdGhlIERPTSB0cmVlLCB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2cgaXMgb3Blbixcblx0XHQvLyBhbmQgd2UgcmV0dXJuIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgYXMgYW4gYWN0aXZlIGNvbnRyb2wgKHZpc2libGUgZm9yIHRoZSB1c2VyKVxuXHRcdGNvbnN0IGFkYXB0YXRpb25GaWx0ZXJCYXIgPSAodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueSkuZ2V0SW5idWlsdEZpbHRlcigpO1xuXHRcdHJldHVybiBhZGFwdGF0aW9uRmlsdGVyQmFyPy5nZXRQYXJlbnQoKSA/IGFkYXB0YXRpb25GaWx0ZXJCYXIgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0U2VnbWVudGVkQnV0dG9uKHNDb250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBzU2VnbWVudGVkQnV0dG9uSWQgPSAoc0NvbnRyb2wgPT09IFwiQ2hhcnRcIiA/IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCkgOiB0aGlzLl9nZXRUYWJsZSgpKT8uZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHNTZWdtZW50ZWRCdXR0b25JZCk7XG5cdH1cblxuXHRfZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShzUGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgY29udHJvbElkID0gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KHNQYXRoKTtcblx0XHRyZXR1cm4gY29udHJvbElkICYmIHRoaXMuZ2V0VmlldygpLmJ5SWQoY29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRQYWdlTW9kZWwoKTogSlNPTk1vZGVsIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuZ2V0VmlldygpKSBhcyBhbnk7XG5cdFx0cmV0dXJuIHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXHR9XG5cblx0X2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9keW5hbWljTGlzdFJlcG9ydElkXCIpIHx8IFwiXCI7XG5cdH1cblxuXHRfZ2V0RmlsdGVyQmFyQ29udHJvbElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9maWx0ZXJCYXJJZFwiKSB8fCBcIlwiO1xuXHR9XG5cblx0Z2V0Q2hhcnRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3NpbmdsZUNoYXJ0SWRcIik7XG5cdH1cblxuXHRfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHRjb25zdCBzVmlzdWFsRmlsdGVyQmFySWQgPSBTdGFibGVJZEhlbHBlci5nZW5lcmF0ZShbXCJ2aXN1YWxGaWx0ZXJcIiwgdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCldKTtcblx0XHRyZXR1cm4gc1Zpc3VhbEZpbHRlckJhcklkICYmIHRoaXMuZ2V0VmlldygpLmJ5SWQoc1Zpc3VhbEZpbHRlckJhcklkKTtcblx0fVxuXHRfZ2V0RmlsdGVyQmFyVmFyaWFudENvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldENvbnRyb2xGcm9tUGFnZU1vZGVsUHJvcGVydHkoXCIvdmFyaWFudE1hbmFnZW1lbnQvaWRcIik7XG5cdH1cblxuXHRfZ2V0TXVsdGlNb2RlQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpUYWJNdWx0aXBsZU1vZGU6OkNvbnRyb2xcIikgYXMgTXVsdGlwbGVNb2RlQ29udHJvbDtcblx0fVxuXG5cdF9nZXRUYWJsZSgpOiBUYWJsZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpPy5nZXRTZWxlY3RlZElubmVyQ29udHJvbCgpPy5jb250ZW50O1xuXHRcdFx0cmV0dXJuIG9Db250cm9sPy5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpID8gKG9Db250cm9sIGFzIFRhYmxlKSA6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldENvbnRyb2xGcm9tUGFnZU1vZGVsUHJvcGVydHkoXCIvc2luZ2xlVGFibGVJZFwiKSBhcyBUYWJsZTtcblx0XHR9XG5cdH1cblx0X2dldENvbnRyb2xzKHNLZXk/OiBhbnkpIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3QgYUNvbnRyb2xzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3Qgb1RhYk11bHRpTW9kZSA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKS5jb250ZW50O1xuXHRcdFx0b1RhYk11bHRpTW9kZS5nZXRJdGVtcygpLmZvckVhY2goKG9JdGVtOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG9JdGVtLmdldEtleSgpKTtcblx0XHRcdFx0aWYgKG9Db250cm9sICYmIHNLZXkpIHtcblx0XHRcdFx0XHRpZiAob0l0ZW0uZ2V0S2V5KCkuaW5kZXhPZihgZmU6OiR7c0tleX1gKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRhQ29udHJvbHMucHVzaChvQ29udHJvbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKG9Db250cm9sICE9PSB1bmRlZmluZWQgJiYgb0NvbnRyb2wgIT09IG51bGwpIHtcblx0XHRcdFx0XHRhQ29udHJvbHMucHVzaChvQ29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFDb250cm9scztcblx0XHR9IGVsc2UgaWYgKHNLZXkgPT09IFwiQ2hhcnRcIikge1xuXHRcdFx0Y29uc3Qgb0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdHJldHVybiBvQ2hhcnQgPyBbb0NoYXJ0XSA6IFtdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0cmV0dXJuIG9UYWJsZSA/IFtvVGFibGVdIDogW107XG5cdFx0fVxuXHR9XG5cblx0X2dldERlZmF1bHRQYXRoKCkge1xuXHRcdGNvbnN0IGRlZmF1bHRQYXRoID0gTGlzdFJlcG9ydFRlbXBsYXRpbmcuZ2V0RGVmYXVsdFBhdGgodGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL3ZpZXdzXCIpIHx8IFtdKTtcblx0XHRzd2l0Y2ggKGRlZmF1bHRQYXRoKSB7XG5cdFx0XHRjYXNlIFwicHJpbWFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydDtcblx0XHRcdGNhc2UgXCJzZWNvbmRhcnlcIjpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGU7XG5cdFx0XHRjYXNlIFwiYm90aFwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuSHlicmlkO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8ga25vdyBpZiBMaXN0UmVwb3J0IGlzIGNvbmZpZ3VyZWQgd2l0aCBNdWx0aXBsZSBUYWJsZSBtb2RlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2lzTXVsdGlNb2RlXG5cdCAqIEByZXR1cm5zIElzIE11bHRpcGxlIFRhYmxlIG1vZGUgc2V0P1xuXHQgKi9cblx0X2lzTXVsdGlNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9tdWx0aVZpZXdzQ29udHJvbFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8ga25vdyBpZiBMaXN0UmVwb3J0IGlzIGNvbmZpZ3VyZWQgdG8gbG9hZCBkYXRhIGF0IHN0YXJ0IHVwLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2lzSW5pdExvYWREaXNhYmxlZFxuXHQgKiBAcmV0dXJucyBJcyBJbml0TG9hZCBlbmFibGVkP1xuXHQgKi9cblx0X2lzSW5pdExvYWRFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGluaXRMb2FkTW9kZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaW5pdGlhbExvYWQ7XG5cdFx0cmV0dXJuIGluaXRMb2FkTW9kZSA9PT0gSW5pdGlhbExvYWRNb2RlLkVuYWJsZWQ7XG5cdH1cblxuXHRfaGFzTXVsdGlWaXN1YWxpemF0aW9ucygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL2hhc011bHRpVmlzdWFsaXphdGlvbnNcIik7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHN1c3BlbmQgc2VhcmNoIG9uIHRoZSBmaWx0ZXIgYmFyLiBUaGUgaW5pdGlhbCBsb2FkaW5nIG9mIGRhdGEgaXMgZGlzYWJsZWQgYmFzZWQgb24gdGhlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gSW5pdExvYWQgLSBEaXNhYmxlZC9BdXRvLlxuXHQgKiBJdCBpcyBlbmFibGVkIGxhdGVyIHdoZW4gdGhlIHZpZXcgc3RhdGUgaXMgc2V0LCB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWxpemUgaWYgdGhlcmUgYXJlIGRlZmF1bHQgZmlsdGVycy5cblx0ICovXG5cdF9kaXNhYmxlSW5pdExvYWQoKSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdC8vIGNoZWNrIGZvciBmaWx0ZXIgYmFyIGhpZGRlblxuXHRcdGlmIChmaWx0ZXJCYXIpIHtcblx0XHRcdGZpbHRlckJhci5zZXRTdXNwZW5kU2VsZWN0aW9uKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIGJ5IGZsZXggdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHBseUF1dG9tYXRpY2FsbHkgc2V0dGluZyBvbiB0aGUgdmFyaWFudCBpcyB2YWxpZC5cblx0ICogQ2FsbGVkIG9ubHkgZm9yIFN0YW5kYXJkIFZhcmlhbnQgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBkaXNwbGF5IHRleHQgc2V0IGZvciBhcHBseUF1dG9tYXRpY2FsbHkgKEZFIG9ubHkgc2V0cyBpdCBmb3IgQXV0bykuXG5cdCAqXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdHJ1ZSBpZiBkYXRhIHNob3VsZCBiZSBsb2FkZWQgYXV0b21hdGljYWxseSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfYXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQoKSB7XG5cdFx0Ly8gV2UgYWx3YXlzIHJldHVybiBmYWxzZSBhbmQgdGFrZSBjYXJlIG9mIGl0IHdoZW4gdmlldyBzdGF0ZSBpcyBzZXRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29uZmlndXJlIHRoZSBzZXR0aW5ncyBmb3IgaW5pdGlhbCBsb2FkIGJhc2VkIG9uXG5cdCAqIC0gbWFuaWZlc3Qgc2V0dGluZyBpbml0TG9hZCAtIEVuYWJsZWQvRGlzYWJsZWQvQXV0b1xuXHQgKiAtIHVzZXIncyBzZXR0aW5nIG9mIGFwcGx5QXV0b21hdGljYWxseSBvbiB2YXJpYW50XG5cdCAqIC0gaWYgdGhlcmUgYXJlIGRlZmF1bHQgZmlsdGVyc1xuXHQgKiBXZSBkaXNhYmxlIHRoZSBmaWx0ZXIgYmFyIHNlYXJjaCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmFibGUgaXQgd2hlbiB2aWV3IHN0YXRlIGlzIHNldC5cblx0ICovXG5cdF9zZXRJbml0TG9hZCgpIHtcblx0XHQvLyBpZiBpbml0TG9hZCBpcyBEaXNhYmxlZCBvciBBdXRvLCBzd2l0Y2ggb2ZmIGZpbHRlciBiYXIgc2VhcmNoIHRlbXBvcmFyaWx5IGF0IHN0YXJ0XG5cdFx0aWYgKCF0aGlzLl9pc0luaXRMb2FkRW5hYmxlZCgpKSB7XG5cdFx0XHR0aGlzLl9kaXNhYmxlSW5pdExvYWQoKTtcblx0XHR9XG5cdFx0Ly8gc2V0IGhvb2sgZm9yIGZsZXggZm9yIHdoZW4gc3RhbmRhcmQgdmFyaWFudCBpcyBzZXQgKGF0IHN0YXJ0IG9yIGJ5IHVzZXIgYXQgcnVudGltZSlcblx0XHQvLyByZXF1aXJlZCB0byBvdmVycmlkZSB0aGUgdXNlciBzZXR0aW5nICdhcHBseSBhdXRvbWF0aWNhbGx5JyBiZWhhdmlvdXIgaWYgdGhlcmUgYXJlIG5vIGZpbHRlcnNcblx0XHRjb25zdCB2YXJpYW50TWFuYWdlbWVudElkOiBhbnkgPSBMaXN0UmVwb3J0VGVtcGxhdGluZy5nZXRWYXJpYW50QmFja1JlZmVyZW5jZSh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLCB0aGlzLl9nZXRQYWdlTW9kZWwoKSk7XG5cdFx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQgPSB2YXJpYW50TWFuYWdlbWVudElkICYmIHRoaXMuZ2V0VmlldygpLmJ5SWQodmFyaWFudE1hbmFnZW1lbnRJZCk7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHR2YXJpYW50TWFuYWdlbWVudC5yZWdpc3RlckFwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KHRoaXMuX2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50LmJpbmQodGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdF9zZXRTaGFyZU1vZGVsKCkge1xuXHRcdC8vIFRPRE86IGRlYWN0aXZhdGVkIGZvciBub3cgLSBjdXJyZW50bHkgdGhlcmUgaXMgbm8gX3RlbXBsUHJpdiBhbnltb3JlLCB0byBiZSBkaXNjdXNzZWRcblx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IGNhbGxlZCBhbnltb3JlIGZyb20gdGhlIGluaXQgbWV0aG9kXG5cblx0XHRjb25zdCBmbkdldFVzZXIgPSBPYmplY3RQYXRoLmdldChcInNhcC51c2hlbGwuQ29udGFpbmVyLmdldFVzZXJcIik7XG5cdFx0Ly92YXIgb01hbmlmZXN0ID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC51aVwiKTtcblx0XHQvL3ZhciBzQm9va21hcmtJY29uID0gKG9NYW5pZmVzdCAmJiBvTWFuaWZlc3QuaWNvbnMgJiYgb01hbmlmZXN0Lmljb25zLmljb24pIHx8IFwiXCI7XG5cblx0XHQvL3NoYXJlTW9kZWw6IEhvbGRzIGFsbCB0aGUgc2hhcmluZyByZWxldmFudCBpbmZvcm1hdGlvbiBhbmQgaW5mbyB1c2VkIGluIFhNTCB2aWV3XG5cdFx0Y29uc3Qgb1NoYXJlSW5mbyA9IHtcblx0XHRcdGJvb2ttYXJrVGl0bGU6IGRvY3VtZW50LnRpdGxlLCAvL1RvIG5hbWUgdGhlIGJvb2ttYXJrIGFjY29yZGluZyB0byB0aGUgYXBwIHRpdGxlLlxuXHRcdFx0Ym9va21hcmtDdXN0b21Vcmw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSBoYXNoZXIuZ2V0SGFzaCgpO1xuXHRcdFx0XHRyZXR1cm4gc0hhc2ggPyBgIyR7c0hhc2h9YCA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0fSxcblx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdFRvIGJlIGFjdGl2YXRlZCBvbmNlIHRoZSBGTFAgc2hvd3MgdGhlIGNvdW50IC0gc2VlIGNvbW1lbnQgYWJvdmVcblx0XHRcdFx0XHRcdFx0Ym9va21hcmtTZXJ2aWNlVXJsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHQvL3ZhciBvVGFibGUgPSBvVGFibGUuZ2V0SW5uZXJUYWJsZSgpOyBvVGFibGUgaXMgYWxyZWFkeSB0aGUgc2FwLmZlIHRhYmxlIChidXQgbm90IHRoZSBpbm5lciBvbmUpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHVzZSB0YWJsZS5nZXRMaXN0QmluZGluZ0luZm8gaW5zdGVhZCBvZiB0aGUgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdHZhciBvQmluZGluZyA9IG9UYWJsZS5nZXRCaW5kaW5nKFwicm93c1wiKSB8fCBvVGFibGUuZ2V0QmluZGluZyhcIml0ZW1zXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZyA/IGZuR2V0RG93bmxvYWRVcmwob0JpbmRpbmcpIDogXCJcIjtcblx0XHRcdFx0XHRcdFx0fSwqL1xuXHRcdFx0aXNTaGFyZUluSmFtQWN0aXZlOiAhIWZuR2V0VXNlciAmJiBmbkdldFVzZXIoKS5pc0phbUFjdGl2ZSgpXG5cdFx0fTtcblxuXHRcdGNvbnN0IG9UZW1wbGF0ZVByaXZhdGVNb2RlbCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRNb2RlbChcIl90ZW1wbFByaXZcIikgYXMgSlNPTk1vZGVsO1xuXHRcdG9UZW1wbGF0ZVByaXZhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi9saXN0UmVwb3J0L3NoYXJlXCIsIG9TaGFyZUluZm8pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byB1cGRhdGUgdGhlIGxvY2FsIFVJIG1vZGVsIG9mIHRoZSBwYWdlIHdpdGggdGhlIGZpZWxkcyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSB0byB0aGUgZmlsdGVyIGJhciAodGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgQUxQIHNjZW5hcmlvKS5cblx0ICpcblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBUaGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHQgKiBAcGFyYW0gb0ZpbHRlckJhciBNREMgZmlsdGVyIGJhclxuXHQgKi9cblx0X3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCwgb0ZpbHRlckJhcjogRmlsdGVyQmFyKSB7XG5cdFx0Y29uc3QgbUNhY2hlOiBhbnkgPSB7fTtcblx0XHRjb25zdCBpZ25vcmVkRmllbGRzOiBhbnkgPSB7fSxcblx0XHRcdGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpLFxuXHRcdFx0YUNoYXJ0cyA9IHRoaXMuX2dldENvbnRyb2xzKFwiQ2hhcnRcIik7XG5cblx0XHRpZiAoIWFUYWJsZXMubGVuZ3RoIHx8ICFhQ2hhcnRzLmxlbmd0aCkge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBub3QgYSB0YWJsZSBhbmQgYSBjaGFydCwgd2UncmUgbm90IGluIHRoZSBBTFAgY2FzZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZvciB0aGUgbW9tZW50LCB0aGVyZSdzIG5vdGhpbmcgZm9yIHRhYmxlcy4uLlxuXHRcdGFDaGFydHMuZm9yRWFjaChmdW5jdGlvbiAob0NoYXJ0OiBhbnkpIHtcblx0XHRcdGNvbnN0IHNDaGFydEVudGl0eVBhdGggPSBvQ2hhcnQuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpLFxuXHRcdFx0XHRzQ2hhcnRFbnRpdHlTZXQgPSBzQ2hhcnRFbnRpdHlQYXRoLnNsaWNlKDEpLFxuXHRcdFx0XHRzQ2FjaGVLZXkgPSBgJHtzQ2hhcnRFbnRpdHlTZXR9Q2hhcnRgO1xuXHRcdFx0aWYgKCFtQ2FjaGVbc0NhY2hlS2V5XSkge1xuXHRcdFx0XHRtQ2FjaGVbc0NhY2hlS2V5XSA9IEZpbHRlclV0aWxzLmdldE5vdEFwcGxpY2FibGVGaWx0ZXJzKG9GaWx0ZXJCYXIsIG9DaGFydCk7XG5cdFx0XHR9XG5cdFx0XHRpZ25vcmVkRmllbGRzW3NDYWNoZUtleV0gPSBtQ2FjaGVbc0NhY2hlS2V5XTtcblx0XHR9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjb250cm9scy9pZ25vcmVkRmllbGRzXCIsIGlnbm9yZWRGaWVsZHMpO1xuXHR9XG5cblx0X2lzRmlsdGVyQmFySGlkZGVuKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmhpZGVGaWx0ZXJCYXI7XG5cdH1cblxuXHRfZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50KFZhcmlhbnRNYW5hZ2VtZW50OiBhbnksIGtleTogc3RyaW5nKTogQm9vbGVhbiB7XG5cdFx0aWYgKCFWYXJpYW50TWFuYWdlbWVudCB8fCAha2V5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IHZhcmlhbnRzID0gVmFyaWFudE1hbmFnZW1lbnQuZ2V0VmFyaWFudHMoKTtcblx0XHRjb25zdCBjdXJyZW50VmFyaWFudCA9IHZhcmlhbnRzLmZpbmQoZnVuY3Rpb24gKHZhcmlhbnQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIHZhcmlhbnQgJiYgdmFyaWFudC5rZXkgPT09IGtleTtcblx0XHR9KTtcblx0XHRyZXR1cm4gKGN1cnJlbnRWYXJpYW50ICYmIGN1cnJlbnRWYXJpYW50LmV4ZWN1dGVPblNlbGVjdCkgfHwgZmFsc2U7XG5cdH1cblxuXHRfc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2gob1ZNOiBhbnkpIHtcblx0XHRpZiAoXG5cdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmluaXRpYWxMb2FkID09PSBJbml0aWFsTG9hZE1vZGUuQXV0byAmJlxuXHRcdFx0KCFvVk0gfHwgb1ZNLmdldFN0YW5kYXJkVmFyaWFudEtleSgpID09PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0XHRjb25zdCBvQ29uZGl0aW9ucyA9IG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbmRpdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBpZ25vcmUgZmlsdGVycyBzdGFydGluZyB3aXRoICQgKGUuZy4gJHNlYXJjaCwgJGVkaXRTdGF0ZSlcblx0XHRcdFx0XHRpZiAoIXNLZXkuc3RhcnRzV2l0aChcIiRcIikgJiYgQXJyYXkuaXNBcnJheShvQ29uZGl0aW9uc1tzS2V5XSkgJiYgb0NvbmRpdGlvbnNbc0tleV0ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBsb2FkIGRhdGEgYXMgcGVyIHVzZXIncyBzZXR0aW5nIG9mIGFwcGx5QXV0b21hdGljYWxseSBvbiB0aGUgdmFyaWFudFxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhbmRhcmRWYXJpYW50OiBhbnkgPSBvVk0uZ2V0VmFyaWFudHMoKS5maW5kKCh2YXJpYW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhcmlhbnQua2V5ID09PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHN0YW5kYXJkVmFyaWFudCAmJiBzdGFuZGFyZFZhcmlhbnQuZXhlY3V0ZU9uU2VsZWN0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRfdXBkYXRlVGFibGUob1RhYmxlOiBhbnkpIHtcblx0XHRpZiAoIW9UYWJsZS5pc1RhYmxlQm91bmQoKSB8fCB0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMpIHtcblx0XHRcdG9UYWJsZS5yZWJpbmQoKTtcblx0XHRcdHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdF91cGRhdGVDaGFydChvQ2hhcnQ6IGFueSkge1xuXHRcdGNvbnN0IG9Jbm5lckNoYXJ0ID0gb0NoYXJ0LmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvQ2hhcnQpO1xuXHRcdGlmICghKG9Jbm5lckNoYXJ0ICYmIG9Jbm5lckNoYXJ0LmlzQm91bmQoXCJkYXRhXCIpKSB8fCB0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMpIHtcblx0XHRcdG9DaGFydC5nZXRDb250cm9sRGVsZWdhdGUoKS5yZWJpbmQob0NoYXJ0LCBvSW5uZXJDaGFydC5nZXRCaW5kaW5nSW5mbyhcImRhdGFcIikpO1xuXHRcdFx0dGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0b25GaWx0ZXJTZWFyY2godGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdC8vIFBlbmRpbmcgZmlsdGVycyBpbnRvIEZpbHRlckJhciB0byBiZSB1c2VkIGZvciBjdXN0b20gdmlld3Ncblx0XHRcdFx0dGhpcy5vblBlbmRpbmdGaWx0ZXJzKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIG9GaWx0ZXJCYXIuZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCgpLmZpbHRlcnNUZXh0KTtcblx0XHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb25kaXRpb25zQmFzZWRcIikpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvVk0gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRjb25zdCBjdXJyZW50VmFyaWFudEtleSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJrZXlcIik7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblxuXHRcdFx0aWYgKG9NdWx0aU1vZGVDb250cm9sICYmICFvVk0/LmdldFBhcmVudCgpLmlzQShcInNhcC51aS5tZGMuQWN0aW9uVG9vbGJhclwiKSkge1xuXHRcdFx0XHQvL05vdCBhIENvbnRyb2wgVmFyaWFudFxuXHRcdFx0XHRvTXVsdGlNb2RlQ29udHJvbD8uaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHRcdFx0b011bHRpTW9kZUNvbnRyb2w/LnNldEZyZWV6ZUNvbnRlbnQodHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNldFRpbWVvdXQgY2F1c2UgdGhlIHZhcmlhbnQgbmVlZHMgdG8gYmUgYXBwbGllZCBiZWZvcmUganVkZ2luZyB0aGUgYXV0byBzZWFyY2ggb3IgdXBkYXRpbmcgdGhlIGFwcCBzdGF0ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk0pKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGFwcCBzdGF0ZSB3aWxsIGJlIHVwZGF0ZWQgdmlhIG9uU2VhcmNoIGhhbmRsZXJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpLnRyaWdnZXJTZWFyY2goKTtcblx0XHRcdFx0fSBlbHNlIGlmICghdGhpcy5fZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50KG9WTSwgY3VycmVudFZhcmlhbnRLZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAwKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlISEhXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSxcblx0XHRvblNlYXJjaCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvTWRjQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgYkhpZGVEcmFmdCA9IEZpbHRlclV0aWxzLmdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0KG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIGZhbHNlKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgYkhpZGVEcmFmdCk7XG5cblx0XHRcdGlmICghdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWRjQ2hhcnQpIHtcblx0XHRcdFx0Ly8gZGlzYWJsZSBib3VuZCBhY3Rpb25zIFRPRE86IHRoaXMgY2xlYXJzIGV2ZXJ5dGhpbmcgZm9yIHRoZSBjaGFydD9cblx0XHRcdFx0KG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcIlwiLCB7fSk7XG5cblx0XHRcdFx0Y29uc3Qgb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9hbHBDb250ZW50Vmlld2ApO1xuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHN0b3JlIGZpbHRlciBiYXIgY29uZGl0aW9ucyB0byB1c2UgbGF0ZXIgd2hpbGUgbmF2aWdhdGlvblxuXHRcdFx0U3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvRmlsdGVyQmFyKVxuXHRcdFx0XHQudGhlbigob0V4dGVybmFsU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IG9FeHRlcm5hbFN0YXRlLmZpbHRlcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGV4dGVybmFsIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkubGl2ZU1vZGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN5c3RlbS5waG9uZSkge1xuXHRcdFx0XHRjb25zdCBvRHluYW1pY1BhZ2UgPSB0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2woKTtcblx0XHRcdFx0b0R5bmFtaWNQYWdlLnNldEhlYWRlckV4cGFuZGVkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoXG5cdFx0XHRvQ29udHJvbGxlcjogTGlzdFJlcG9ydENvbnRyb2xsZXIsXG5cdFx0XHRzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZyxcblx0XHRcdG9Db250ZXh0OiBWNENvbnRleHQsXG5cdFx0XHRzQ3JlYXRlUGF0aDogc3RyaW5nXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXHRcdG9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb01kY0NoYXJ0ID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldENvbnRlbnQoKSxcblx0XHRcdFx0b1RhYmxlID0gdGhpcy5fZ2V0VGFibGUoKSxcblx0XHRcdFx0YURhdGEgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZGF0YVwiKSxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdGlmIChhRGF0YSkge1xuXHRcdFx0XHQvLyB1cGRhdGUgYWN0aW9uIGJ1dHRvbnMgZW5hYmxlbWVudCAvIGRpc2FibGVtZW50XG5cdFx0XHRcdENoYXJ0UnVudGltZS5mblVwZGF0ZUNoYXJ0KG9FdmVudCk7XG5cdFx0XHRcdC8vIHVwZGF0ZSBzZWxlY3Rpb25zIG9uIHNlbGVjdGlvbiBvciBkZXNlbGVjdGlvblxuXHRcdFx0XHRDaGFydFV0aWxzLnNldENoYXJ0RmlsdGVycyhvTWRjQ2hhcnQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vYWxwQ29udGVudFZpZXdgKTtcblx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydCkge1xuXHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChvVGFibGUpIHtcblx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLnJlYmluZCgpO1xuXHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IHNTZWxlY3RlZEtleSA9IG9FdmVudC5tUGFyYW1ldGVycy5rZXkgPyBvRXZlbnQubVBhcmFtZXRlcnMua2V5IDogbnVsbDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBzU2VsZWN0ZWRLZXkpO1xuXHRcdFx0Y29uc3Qgb0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRjb25zdCBvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUgPSB7XG5cdFx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUl0ZW1zID0gb1NlZ21lbnRlZEJ1dHRvbi5nZXRJdGVtcygpO1xuXHRcdFx0XHRcdGFJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChvSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob0l0ZW0uZ2V0S2V5KCkgPT09IHNTZWxlY3RlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRvSXRlbS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9TZWdtZW50ZWRCdXR0b24ucmVtb3ZlRXZlbnREZWxlZ2F0ZShvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbiA9IChcblx0XHRcdFx0c1NlbGVjdGVkS2V5ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlID8gdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiVGFibGVcIikgOiB0aGlzLl9nZXRTZWdtZW50ZWRCdXR0b24oXCJDaGFydFwiKVxuXHRcdFx0KSBhcyBTZWdtZW50ZWRCdXR0b247XG5cdFx0XHRpZiAob1NlZ21lbnRlZEJ1dHRvbiAhPT0gb0V2ZW50LmdldFNvdXJjZSgpKSB7XG5cdFx0XHRcdG9TZWdtZW50ZWRCdXR0b24uYWRkRXZlbnREZWxlZ2F0ZShvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUpO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoIChzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlOlxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlKG9UYWJsZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVDaGFydChvQ2hhcnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuSHlicmlkOlxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlKG9UYWJsZSk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uRmlsdGVyc1NlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBpc0NvbXBhY3QgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpID09PSBcIkNvbXBhY3RcIjtcblx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKGlzQ29tcGFjdCk7XG5cdFx0XHQodGhpcy5fZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCgpIGFzIENvbnRyb2wpLnNldFZpc2libGUoIWlzQ29tcGFjdCk7XG5cdFx0fSxcblx0XHRvblN0YXRlQ2hhbmdlKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkR5bmFtaWNQYWdlVGl0bGVTdGF0ZUNoYW5nZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJCYXI6IGFueSA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChmaWx0ZXJCYXIgJiYgZmlsdGVyQmFyLmdldFNlZ21lbnRlZEJ1dHRvbigpKSB7XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXNFeHBhbmRlZFwiKSkge1xuXHRcdFx0XHRcdGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKS5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Zm9ybWF0dGVycyA9IHtcblx0XHRzZXRBTFBDb250cm9sTWVzc2FnZVN0cmlwKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBhSWdub3JlZEZpZWxkczogYW55W10sIGJJc0NoYXJ0OiBhbnksIG9BcHBseVN1cHBvcnRlZD86IGFueSkge1xuXHRcdFx0bGV0IHNUZXh0ID0gXCJcIjtcblx0XHRcdGJJc0NoYXJ0ID0gYklzQ2hhcnQgPT09IFwidHJ1ZVwiIHx8IGJJc0NoYXJ0ID09PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyICYmIEFycmF5LmlzQXJyYXkoYUlnbm9yZWRGaWVsZHMpICYmIGFJZ25vcmVkRmllbGRzLmxlbmd0aCA+IDAgJiYgYklzQ2hhcnQpIHtcblx0XHRcdFx0Y29uc3QgYUlnbm9yZWRMYWJlbHMgPSBNZXNzYWdlU3RyaXAuZ2V0TGFiZWxzKFxuXHRcdFx0XHRcdGFJZ25vcmVkRmllbGRzLFxuXHRcdFx0XHRcdG9GaWx0ZXJCYXIuZGF0YShcImVudGl0eVR5cGVcIiksXG5cdFx0XHRcdFx0b0ZpbHRlckJhcixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBiSXNTZWFyY2hJZ25vcmVkID0gIW9BcHBseVN1cHBvcnRlZC5lbmFibGVTZWFyY2g7XG5cdFx0XHRcdHNUZXh0ID0gYklzQ2hhcnRcblx0XHRcdFx0XHQ/IE1lc3NhZ2VTdHJpcC5nZXRBTFBUZXh0KGFJZ25vcmVkTGFiZWxzLCBvRmlsdGVyQmFyLCBiSXNTZWFyY2hJZ25vcmVkKVxuXHRcdFx0XHRcdDogTWVzc2FnZVN0cmlwLmdldFRleHQoYUlnbm9yZWRMYWJlbHMsIG9GaWx0ZXJCYXIsIFwiXCIsIERlbGVnYXRlVXRpbC5nZXRMb2NhbGl6ZWRUZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNUZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlzdFJlcG9ydENvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBeURBLElBQU1BLG1CQUFtQixHQUFHQyxXQUFXLENBQUNELG1CQUF4QztFQUFBLElBQ0NFLGVBQWUsR0FBR0QsV0FBVyxDQUFDQyxlQUQvQjtNQUlNQyxvQixXQURMQyxjQUFjLENBQUMsa0RBQUQsQyxVQUViQyxjQUFjLENBQ2RDLGVBQWUsQ0FBQ0MsUUFBaEIsQ0FBeUI7SUFDeEJDLGNBQWMsRUFBRSxZQUFpQztNQUMvQyxLQUFLQyxPQUFMLEdBQWVDLGFBQWYsRUFBRCxDQUF5REMsZUFBekQ7SUFDQTtFQUh1QixDQUF6QixDQURjLEMsVUFRZE4sY0FBYyxDQUNkTyw2QkFBNkIsQ0FBQ0wsUUFBOUIsQ0FBdUM7SUFDdENNLFlBQVksRUFBRSxZQUErQztNQUM1RCxPQUFRLEtBQUtDLElBQU4sQ0FBb0NDLG1CQUFwQyxFQUFQO0lBQ0E7RUFIcUMsQ0FBdkMsQ0FEYyxDLFVBUWRWLGNBQWMsQ0FBQ1csV0FBRCxDLFVBR2RYLGNBQWMsQ0FBQ1kscUJBQXFCLENBQUNWLFFBQXRCLENBQStCVyw2QkFBL0IsQ0FBRCxDLFVBR2RiLGNBQWMsQ0FBQ2MsS0FBSyxDQUFDWixRQUFOLENBQWVhLGNBQWYsQ0FBRCxDLFVBR2RmLGNBQWMsQ0FBQ2dCLFFBQVEsQ0FBQ2QsUUFBVCxDQUFrQmUsaUJBQWxCLENBQUQsQyxVQUdkakIsY0FBYyxDQUFDa0IsU0FBUyxDQUFDaEIsUUFBVixDQUFtQmlCLGtCQUFuQixDQUFELEMsVUFHZG5CLGNBQWMsQ0FBQ29CLGFBQUQsQyxXQUVkcEIsY0FBYyxDQUFDcUIsV0FBRCxDLFdBRWRyQixjQUFjLENBQUNzQixRQUFELEMsV0FTZEMsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQTRHZEMsZ0JBQWdCLEUs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
|
|
798
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiQ29yZUxpYnJhcnkiLCJJbml0aWFsTG9hZE1vZGUiLCJMaXN0UmVwb3J0Q29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJJbnRlcm5hbFJvdXRpbmciLCJvdmVycmlkZSIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfb25BZnRlckJpbmRpbmciLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldEVudGl0eVNldCIsImJhc2UiLCJnZXRDdXJyZW50RW50aXR5U2V0IiwiU2lkZUVmZmVjdHMiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIlNoYXJlIiwiU2hhcmVPdmVycmlkZXMiLCJFZGl0RmxvdyIsIkVkaXRGbG93T3ZlcnJpZGVzIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiS1BJTWFuYWdlbWVudCIsIlBsYWNlaG9sZGVyIiwiTWFzc0VkaXQiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25GaWx0ZXJTZWFyY2giLCJfZ2V0RmlsdGVyQmFyQ29udHJvbCIsInRyaWdnZXJTZWFyY2giLCJvbkZpbHRlcnNDaGFuZ2VkIiwib0V2ZW50Iiwib0ZpbHRlckJhciIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib25QZW5kaW5nRmlsdGVycyIsImFwcGxpZWRGaWx0ZXJzVGV4dCIsImdldEFzc2lnbmVkRmlsdGVyc1RleHQiLCJmaWx0ZXJzVGV4dCIsImFwcGxpZWRGaWx0ZXJCaW5kaW5nIiwiTWFuYWdlZE9iamVjdCIsImJpbmRpbmdQYXJzZXIiLCJieUlkIiwiYmluZFRleHQiLCJzZXRUZXh0IiwiZ2V0UGFyYW1ldGVyIiwic2V0UHJvcGVydHkiLCJvblZhcmlhbnRTZWxlY3RlZCIsIm9WTSIsImdldFNvdXJjZSIsImN1cnJlbnRWYXJpYW50S2V5Iiwib011bHRpTW9kZUNvbnRyb2wiLCJfZ2V0TXVsdGlNb2RlQ29udHJvbCIsImdldFBhcmVudCIsImlzQSIsImludmFsaWRhdGVDb250ZW50Iiwic2V0RnJlZXplQ29udGVudCIsInNldFRpbWVvdXQiLCJfc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2giLCJfZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50IiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvblZhcmlhbnRTYXZlZCIsIm9uU2VhcmNoIiwib01kY0NoYXJ0IiwiZ2V0Q2hhcnRDb250cm9sIiwiYkhpZGVEcmFmdCIsIkZpbHRlclV0aWxzIiwiZ2V0RWRpdFN0YXRlSXNIaWRlRHJhZnQiLCJnZXRDb25kaXRpb25zIiwiX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMiLCJvUGFnZUludGVybmFsTW9kZWxDb250ZXh0Iiwic1RlbXBsYXRlQ29udGVudFZpZXciLCJnZXRQcm9wZXJ0eSIsImdldFBhdGgiLCJDaGFydCIsImhhc1BlbmRpbmdDaGFydENoYW5nZXMiLCJUYWJsZSIsImhhc1BlbmRpbmdUYWJsZUNoYW5nZXMiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwib0V4dGVybmFsU3RhdGUiLCJmaWx0ZXJCYXJDb25kaXRpb25zIiwiZmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldFZpZXdEYXRhIiwibGl2ZU1vZGUiLCJzeXN0ZW0iLCJwaG9uZSIsIm9EeW5hbWljUGFnZSIsIl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2wiLCJzZXRIZWFkZXJFeHBhbmRlZCIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm9Db250cm9sbGVyIiwic091dGJvdW5kVGFyZ2V0Iiwib0NvbnRleHQiLCJzQ3JlYXRlUGF0aCIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCIsImdldENvbnRlbnQiLCJvVGFibGUiLCJfZ2V0VGFibGUiLCJhRGF0YSIsIkNoYXJ0UnVudGltZSIsImZuVXBkYXRlQ2hhcnQiLCJDaGFydFV0aWxzIiwic2V0Q2hhcnRGaWx0ZXJzIiwicmViaW5kIiwib25TZWdtZW50ZWRCdXR0b25QcmVzc2VkIiwic1NlbGVjdGVkS2V5IiwibVBhcmFtZXRlcnMiLCJrZXkiLCJvQ2hhcnQiLCJvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiYUl0ZW1zIiwib1NlZ21lbnRlZEJ1dHRvbiIsImdldEl0ZW1zIiwiZm9yRWFjaCIsIm9JdGVtIiwiZ2V0S2V5IiwiZm9jdXMiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiX2dldFNlZ21lbnRlZEJ1dHRvbiIsImFkZEV2ZW50RGVsZWdhdGUiLCJfdXBkYXRlVGFibGUiLCJfdXBkYXRlQ2hhcnQiLCJIeWJyaWQiLCJvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkIiwiaXNDb21wYWN0Iiwic2V0VmlzaWJsZSIsIl9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sIiwib25TdGF0ZUNoYW5nZSIsIm9uRHluYW1pY1BhZ2VUaXRsZVN0YXRlQ2hhbmdlZCIsImZpbHRlckJhciIsImdldFNlZ21lbnRlZEJ1dHRvbiIsImZvcm1hdHRlcnMiLCJzZXRBTFBDb250cm9sTWVzc2FnZVN0cmlwIiwiYUlnbm9yZWRGaWVsZHMiLCJiSXNDaGFydCIsIm9BcHBseVN1cHBvcnRlZCIsInNUZXh0IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiYUlnbm9yZWRMYWJlbHMiLCJNZXNzYWdlU3RyaXAiLCJnZXRMYWJlbHMiLCJkYXRhIiwib1Jlc291cmNlQnVuZGxlIiwiYklzU2VhcmNoSWdub3JlZCIsImVuYWJsZVNlYXJjaCIsImdldEFMUFRleHQiLCJnZXRUZXh0IiwiRGVsZWdhdGVVdGlsIiwiZ2V0TG9jYWxpemVkVGV4dCIsImV4dGVuc2lvbkFQSSIsIkV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsIlBhZ2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYXBwbHkiLCJfaGFzTXVsdGlWaXN1YWxpemF0aW9ucyIsImFscENvbnRlbnRWaWV3IiwiX2dldERlZmF1bHRQYXRoIiwiZGVza3RvcCIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5Iiwid2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uIiwiX3NldEluaXRMb2FkIiwib25FeGl0IiwiZGVzdHJveSIsImFUYWJsZXMiLCJfZ2V0Q29udHJvbHMiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5Iiwib1RhYmxlQmluZGluZyIsImdldFJvd0JpbmRpbmciLCJDb21tb25VdGlscyIsIl9pc0ZjbEVuYWJsZWQiLCJyZWZyZXNoIiwic1VwZGF0ZVRpbWVyIiwiZm5VcGRhdGVUYWJsZUFjdGlvbnMiLCJfdXBkYXRlVGFibGVBY3Rpb25zIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwic2V0RWRpdFN0YXRlUHJvY2Vzc2VkIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldE1vZGVsIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJyZXNwb25zZSIsInNFbnRpdHlTZXQiLCJlbnRpdHlTZXQiLCJnZXRUcmFuc2xhdGVkVGV4dCIsInVuZGVmaW5lZCIsInNldE5vRGF0YSIsIm9uUGFnZVJlYWR5IiwiZm9yY2VGb2N1cyIsIl9zZXRJbml0aWFsRm9jdXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvblZpZXdOZWVkc1JlZnJlc2giLCJzbGljZSIsImFJQk5BY3Rpb25zIiwiZ2V0SUJOQWN0aW9ucyIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJKU09OIiwicGFyc2UiLCJDb21tb25IZWxwZXIiLCJwYXJzZUN1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiVGFibGVIZWxwZXIiLCJoYW5kbGVUYWJsZURlbGV0ZUVuYWJsZW1lbnRGb3JTaWRlRWZmZWN0cyIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiZHluYW1pY1BhZ2UiLCJpc0hlYWRlckV4cGFuZGVkIiwiZ2V0SGVhZGVyRXhwYW5kZWQiLCJnZXRTaG93TWVzc2FnZXMiLCJzZXRTaG93TWVzc2FnZXMiLCJmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQiLCJnZXRGaWx0ZXJJdGVtcyIsImZpbmQiLCJvRmlsdGVySXRlbSIsImdldFJlcXVpcmVkIiwiX2lzSW5pdExvYWRFbmFibGVkIiwiX2dldEZpbHRlckJhckNvbnRyb2xJZCIsImZvY3VzUm93IiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwib01hbmlmZXN0RW50cnkiLCJnZXRNYW5pZmVzdEVudHJ5IiwidGl0bGUiLCJzdWJ0aXRsZSIsImFwcFN1YlRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2xJZCIsIl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCIsImFkYXB0YXRpb25GaWx0ZXJCYXIiLCJnZXRJbmJ1aWx0RmlsdGVyIiwic0NvbnRyb2wiLCJzU2VnbWVudGVkQnV0dG9uSWQiLCJfZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eSIsInNQYXRoIiwiY29udHJvbElkIiwiX2dldFBhZ2VNb2RlbCIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsInNWaXN1YWxGaWx0ZXJCYXJJZCIsIlN0YWJsZUlkSGVscGVyIiwiZ2VuZXJhdGUiLCJfZ2V0RmlsdGVyQmFyVmFyaWFudENvbnRyb2wiLCJfaXNNdWx0aU1vZGUiLCJvQ29udHJvbCIsImdldFNlbGVjdGVkSW5uZXJDb250cm9sIiwiY29udGVudCIsInNLZXkiLCJhQ29udHJvbHMiLCJvVGFiTXVsdGlNb2RlIiwiaW5kZXhPZiIsInB1c2giLCJkZWZhdWx0UGF0aCIsIkxpc3RSZXBvcnRUZW1wbGF0aW5nIiwiZ2V0RGVmYXVsdFBhdGgiLCJpbml0TG9hZE1vZGUiLCJpbml0aWFsTG9hZCIsIkVuYWJsZWQiLCJfZGlzYWJsZUluaXRMb2FkIiwic2V0U3VzcGVuZFNlbGVjdGlvbiIsIl9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsInZhcmlhbnRNYW5hZ2VtZW50SWQiLCJnZXRWYXJpYW50QmFja1JlZmVyZW5jZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwicmVnaXN0ZXJBcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsImJpbmQiLCJfc2V0U2hhcmVNb2RlbCIsImZuR2V0VXNlciIsIk9iamVjdFBhdGgiLCJnZXQiLCJvU2hhcmVJbmZvIiwiYm9va21hcmtUaXRsZSIsImRvY3VtZW50IiwiYm9va21hcmtDdXN0b21VcmwiLCJzSGFzaCIsImhhc2hlciIsImdldEhhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpc1NoYXJlSW5KYW1BY3RpdmUiLCJpc0phbUFjdGl2ZSIsIm9UZW1wbGF0ZVByaXZhdGVNb2RlbCIsImdldE93bmVyQ29tcG9uZW50IiwibUNhY2hlIiwiaWdub3JlZEZpZWxkcyIsImFDaGFydHMiLCJzQ2hhcnRFbnRpdHlQYXRoIiwic0NoYXJ0RW50aXR5U2V0Iiwic0NhY2hlS2V5IiwiZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJoaWRlRmlsdGVyQmFyIiwiVmFyaWFudE1hbmFnZW1lbnQiLCJ2YXJpYW50cyIsImdldFZhcmlhbnRzIiwiY3VycmVudFZhcmlhbnQiLCJ2YXJpYW50IiwiZXhlY3V0ZU9uU2VsZWN0IiwiQXV0byIsImdldFN0YW5kYXJkVmFyaWFudEtleSIsImdldEN1cnJlbnRWYXJpYW50S2V5Iiwib0NvbmRpdGlvbnMiLCJzdGFydHNXaXRoIiwic3RhbmRhcmRWYXJpYW50IiwiaXNUYWJsZUJvdW5kIiwib0lubmVyQ2hhcnQiLCJnZXRDb250cm9sRGVsZWdhdGUiLCJfZ2V0Q2hhcnQiLCJpc0JvdW5kIiwiZ2V0QmluZGluZ0luZm8iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IHR5cGUgRHluYW1pY1BhZ2UgZnJvbSBcInNhcC9mL0R5bmFtaWNQYWdlXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBLUElNYW5hZ2VtZW50IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9LUElNYW5hZ2VtZW50XCI7XG5pbXBvcnQgTWFzc0VkaXQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01hc3NFZGl0XCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRmlsdGVyQmFyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdHByaXZhdGVFeHRlbnNpb24sXG5cdHB1YmxpY0V4dGVuc2lvbixcblx0dXNpbmdFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXNzYWdlU3RyaXBcIjtcbmltcG9ydCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFN0YWJsZUlkSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ2hhcnRVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IE11bHRpcGxlTW9kZUNvbnRyb2wgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9jb250cm9scy9NdWx0aXBsZU1vZGVDb250cm9sXCI7XG5pbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgRWRpdEZsb3dPdmVycmlkZXMgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvUm9vdENvbnRhaW5lci9vdmVycmlkZXMvRWRpdEZsb3dcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFNlZ21lbnRlZEJ1dHRvbiBmcm9tIFwic2FwL20vU2VnbWVudGVkQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHsgc3lzdGVtIH0gZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBoYXNoZXIgZnJvbSBcInNhcC91aS90aGlyZHBhcnR5L2hhc2hlclwiO1xuaW1wb3J0IHR5cGUgeyBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgKiBhcyBMaXN0UmVwb3J0VGVtcGxhdGluZyBmcm9tIFwiLi9MaXN0UmVwb3J0VGVtcGxhdGluZ1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5jb25zdCBUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gQ29yZUxpYnJhcnkuVGVtcGxhdGVDb250ZW50Vmlldyxcblx0SW5pdGlhbExvYWRNb2RlID0gQ29yZUxpYnJhcnkuSW5pdGlhbExvYWRNb2RlO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuTGlzdFJlcG9ydENvbnRyb2xsZXJcIilcbmNsYXNzIExpc3RSZXBvcnRDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKHtcblx0XHRcdG9uQWZ0ZXJCaW5kaW5nOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxSb3V0aW5nKSB7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLl9vbkFmdGVyQmluZGluZygpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZSh7XG5cdFx0XHRnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gKHRoaXMuYmFzZSBhcyBMaXN0UmVwb3J0Q29udHJvbGxlcikuZ2V0Q3VycmVudEVudGl0eVNldCgpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X2ludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oU2lkZUVmZmVjdHMpXG5cdHNpZGVFZmZlY3RzITogU2lkZUVmZmVjdHM7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihFZGl0Rmxvdy5vdmVycmlkZShFZGl0Rmxvd092ZXJyaWRlcykpXG5cdGVkaXRGbG93ITogRWRpdEZsb3c7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEtQSU1hbmFnZW1lbnQpXG5cdGtwaU1hbmFnZW1lbnQhOiBLUElNYW5hZ2VtZW50O1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdHBsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblx0cHJvdGVjdGVkIGV4dGVuc2lvbkFQST86IEV4dGVuc2lvbkFQSTtcblx0cHJpdmF0ZSBmaWx0ZXJCYXJDb25kaXRpb25zPzogYW55O1xuXHRwcml2YXRlIHNVcGRhdGVUaW1lcj86IGFueTtcblx0cHJpdmF0ZSBvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblx0cHJpdmF0ZSBoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBoYXNQZW5kaW5nVGFibGVDaGFuZ2VzPzogYm9vbGVhbjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKCk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uSW5pdC5hcHBseSh0aGlzKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGlkZURyYWZ0SW5mb1wiLCBmYWxzZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidW9tXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3RvclwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JOdW1iZXJcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImN1cnJlbmN5XCIsIHt9KTtcblxuXHRcdGlmICh0aGlzLl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkpIHtcblx0XHRcdGxldCBhbHBDb250ZW50VmlldyA9IHRoaXMuX2dldERlZmF1bHRQYXRoKCk7XG5cdFx0XHRpZiAoIXN5c3RlbS5kZXNrdG9wICYmIGFscENvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZCkge1xuXHRcdFx0XHRhbHBDb250ZW50VmlldyA9IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHR9XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBhbHBDb250ZW50Vmlldyk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgY29uZGl0aW9ucyBmcm9tIGZpbHRlciBiYXJcblx0XHQvLyB0aGlzIGlzIGxhdGVyIHVzZWQgYmVmb3JlIG5hdmlnYXRpb24gdG8gZ2V0IGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgZmlsdGVyIGJhclxuXHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IHt9O1xuXG5cdFx0Ly8gQXMgQXBwU3RhdGVIYW5kbGVyLmFwcGx5QXBwU3RhdGUgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IHdpbGxcblx0XHQvLyBoYXBwZW4gYWZ0ZXIgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIChvdGhlcndpc2UgdGhlIHJvdXRlciBnZXRzIGJyb2tlbilcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBDb25maWd1cmUgdGhlIGluaXRpYWwgbG9hZCBzZXR0aW5nc1xuXHRcdHRoaXMuX3NldEluaXRMb2FkKCk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0ZGVsZXRlIHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucztcblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0X29uQWZ0ZXJCaW5kaW5nKCkge1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpO1xuXHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHR0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk/LmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gdGhpcy5fZ2V0VGFibGUoKT8uZ2V0Um93QmluZGluZygpO1xuXHRcdFx0aWYgKG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlcmUgaXMgYW4gaXNzdWUgaWYgd2UgdXNlIGEgdGltZW91dCB3aXRoIGEga2VwdCBhbGl2ZSBjb250ZXh0IHVzZWQgb24gYW5vdGhlciBwYWdlXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0XHRcdFx0dGhpcy5zVXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnNVcGRhdGVUaW1lcjtcblx0XHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBhY3Rpb24gZW5hYmxlbWVudCBhbmQgdmlzaWJpbGl0eSB1cG9uIHRhYmxlIGRhdGEgdXBkYXRlLlxuXHRcdFx0XHRcdGNvbnN0IGZuVXBkYXRlVGFibGVBY3Rpb25zID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5kZXRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlUHJvY2Vzc2VkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKCkpO1xuXHR9XG5cblx0b25CZWZvcmVSZW5kZXJpbmcoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scygpIGFzIFRhYmxlW107XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldDtcblx0XHRcdFx0Y29uc3Qgc1RleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIlRfVEFCTEVfQU5EX0NIQVJUX05PX0RBVEFfVEVYVFwiLFxuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSkge1xuXHRcdFx0XHRcdG9UYWJsZS5zZXROb0RhdGEoc1RleHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmZvcmNlRm9jdXMpIHtcblx0XHRcdHRoaXMuX3NldEluaXRpYWxGb2N1cygpO1xuXHRcdH1cblx0XHQvLyBSZW1vdmUgdGhlIGhhbmRsZXIgb24gYmFjayBuYXZpZ2F0aW9uIHRoYXQgZGlzcGxheXMgRHJhZnQgY29uZmlybWF0aW9uXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgb2YgYSBsaXN0IHJlcG9ydCB2aWV3IG5lZWRzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogVGhpcyBoYXBwZW5zIGVpdGhlciB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIG9uIHRoZSBGaWx0ZXJCYXIgYW5kIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkLFxuXHQgKiBvciB3aGVuIGEgdGFiIHdpdGggY3VzdG9tIGNvbnRlbnQgaXMgc2VsZWN0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgTWFwIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBjb25kaXRpb25zIG9mIHRoZSBGaWx0ZXJCYXIsIHRoZSBjdXJyZW50VGFiSURcblx0ICogYW5kIHRoZSB2aWV3IHJlZnJlc2ggY2F1c2UgKHRhYkNoYW5nZWQgb3Igc2VhcmNoKS5cblx0ICogVGhlIG1hcCBsb29rcyBsaWtlIHRoaXM6XG5cdCAqIDxjb2RlPjxwcmU+XG5cdCAqIFx0e1xuXHQgKiBcdFx0ZmlsdGVyQ29uZGl0aW9uczoge1xuXHQgKiBcdFx0XHRDb3VudHJ5OiBbXG5cdCAqIFx0XHRcdFx0e1xuXHQgKiBcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHQgKlx0XHRcdFx0XHR2YWxpZGF0ZWQ6IFwiTm90VmFsaWRhdGVkXCJcblx0ICpcdFx0XHRcdFx0dmFsdWVzOiBbXCJHZXJtYW55XCIsIC4uLl1cblx0ICogXHRcdFx0XHR9LFxuXHQgKiBcdFx0XHRcdC4uLlxuXHQgKiBcdFx0XHRdXG5cdCAqIFx0XHRcdC4uLlxuXHQgKiBcdFx0fSxcblx0ICpcdFx0Y3VycmVudFRhYklkOiBcImZlOjpDdXN0b21UYWI6OnRhYjFcIixcblx0ICpcdFx0cmVmcmVzaENhdXNlOiBcInRhYkNoYW5nZWRcIiB8IFwic2VhcmNoXCJcblx0ICpcdH1cblx0ICogPC9wcmU+PC9jb2RlPlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25WaWV3TmVlZHNSZWZyZXNoKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBmaWx0ZXIgb3Igc2VhcmNoIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIEZpbHRlckJhcixcblx0ICogYnV0IGhhcyBub3QgYmVlbiB2YWxpZGF0ZWQgeWV0IGJ5IHRoZSBlbmQgdXNlciAod2l0aCB0aGUgJ0dvJyBvciAnU2VhcmNoJyBidXR0b24pLlxuXHQgKiBUeXBpY2FsbHksIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHRhYiBpcyBncmV5ZWQgb3V0IHVudGlsIHRoZSBmaWx0ZXJzIGFyZSB2YWxpZGF0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGVuZGluZ0ZpbHRlcnMoKSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHRnZXRDdXJyZW50RW50aXR5U2V0KCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRUYWJsZSgpPy5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIikuc2xpY2UoMSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaW5pdGlhdGVzIHRoZSB1cGRhdGUgb2YgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgdGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIERhdGFGaWVsZEZvcklCTiBidXR0b25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVRhYmxlcyBBcnJheSBvZiB0YWJsZXMgaW4gdGhlIGxpc3QgcmVwb3J0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXM6IGFueSkge1xuXHRcdGxldCBhSUJOQWN0aW9uczogYW55W10gPSBbXTtcblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHQvLyBVcGRhdGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIERhdGFGaWVsZEZvckFjdGlvbiBidXR0b25zIG9uIHRhYmxlIHRvb2xiYXJcblx0XHRcdC8vIFRoZSBzYW1lIGlzIGFsc28gcGVyZm9ybWVkIG9uIFRhYmxlIHNlbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHRcdG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKFxuXHRcdFx0XHRcdENvbW1vbkhlbHBlci5wYXJzZUN1c3RvbURhdGEoRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGEob1RhYmxlLCBcIm9wZXJhdGlvbkF2YWlsYWJsZU1hcFwiKSlcblx0XHRcdFx0KSxcblx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHMgPSBvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpO1xuXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIGFTZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgpO1xuXHRcdFx0VGFibGVIZWxwZXIuaGFuZGxlVGFibGVEZWxldGVFbmFibGVtZW50Rm9yU2lkZUVmZmVjdHMob1RhYmxlLCBvSW50ZXJuYWxNb2RlbENvbnRleHQpO1xuXHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgYVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIHRvIGEgc3BlY2lmaWMgcm93IG9uIGFsbCB0aGUgYXZhaWxhYmxlIHRhYmxlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0gc1Jvd1BhdGggVGhlIHBhdGggb2YgdGhlIHRhYmxlIHJvdyBjb250ZXh0IHRvIGJlIHNjcm9sbGVkIHRvXG5cdCAqL1xuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIikuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhvVGFibGUsIHNSb3dQYXRoKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzZXQgdGhlIGluaXRpYWwgZm9jdXMgd2l0aGluIHRoZSBMaXN0IFJlcG9ydCBhY2NvcmRpbmcgdG8gdGhlIFVYIGd1aWRlIGxpbmVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIjX3NldEluaXRpYWxGb2N1c1xuXHQgKi9cblx0X3NldEluaXRpYWxGb2N1cygpIHtcblx0XHRjb25zdCBkeW5hbWljUGFnZSA9IHRoaXMuX2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbCgpLFxuXHRcdFx0aXNIZWFkZXJFeHBhbmRlZCA9IGR5bmFtaWNQYWdlLmdldEhlYWRlckV4cGFuZGVkKCksXG5cdFx0XHRmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkgYXMgYW55O1xuXHRcdGlmIChmaWx0ZXJCYXIpIHtcblx0XHRcdGlmIChpc0hlYWRlckV4cGFuZGVkKSB7XG5cdFx0XHRcdC8vRW5hYmxpbmcgbWFuZGF0b3J5IGZpbHRlciBmaWVsZHMgbWVzc2FnZSBkaWFsb2dcblx0XHRcdFx0aWYgKCFmaWx0ZXJCYXIuZ2V0U2hvd01lc3NhZ2VzKCkpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuc2V0U2hvd01lc3NhZ2VzKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZCA9IGZpbHRlckJhci5nZXRGaWx0ZXJJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9GaWx0ZXJJdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0ZpbHRlckl0ZW0uZ2V0UmVxdWlyZWQoKSAmJiBvRmlsdGVySXRlbS5nZXRDb25kaXRpb25zKCkubGVuZ3RoID09PSAwO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly9Gb2N1c2luZyBvbiB0aGUgZmlyc3QgZW1wdHkgbWFuZGF0b3J5IGZpbHRlciBmaWVsZCwgb3Igb24gdGhlIGZpcnN0IGZpbHRlciBmaWVsZCBpZiB0aGUgdGFibGUgZGF0YSBpcyBsb2FkZWRcblx0XHRcdFx0aWYgKGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0XHRcdGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZC5mb2N1cygpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0RmlsdGVySXRlbXMoKVswXS5mb2N1cygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vRm9jdXNpbmcgb24gdGhlIEdvIGJ1dHRvblxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLmJ5SWQoYCR7dGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCl9LWJ0blNlYXJjaGApLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5faXNJbml0TG9hZEVuYWJsZWQoKSkge1xuXHRcdFx0XHR0aGlzLl9nZXRUYWJsZSgpPy5mb2N1c1JvdygwKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZ2V0VGFibGUoKT8uZm9jdXNSb3coMCk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9NYW5pZmVzdEVudHJ5ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IG9NYW5pZmVzdEVudHJ5LnRpdGxlLFxuXHRcdFx0c3VidGl0bGU6IG9NYW5pZmVzdEVudHJ5LmFwcFN1YlRpdGxlIHx8IFwiXCIsXG5cdFx0XHRpbnRlbnQ6IFwiXCIsXG5cdFx0XHRpY29uOiBcIlwiXG5cdFx0fTtcblx0fVxuXG5cdF9nZXRGaWx0ZXJCYXJDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpKSBhcyBGaWx0ZXJCYXI7XG5cdH1cblxuXHRfZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbElkKCkpIGFzIER5bmFtaWNQYWdlO1xuXHR9XG5cblx0X2dldEFkYXB0YXRpb25GaWx0ZXJCYXJDb250cm9sKCkge1xuXHRcdC8vIElmIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgaXMgcGFydCBvZiB0aGUgRE9NIHRyZWUsIHRoZSBcIkFkYXB0IEZpbHRlclwiIGRpYWxvZyBpcyBvcGVuLFxuXHRcdC8vIGFuZCB3ZSByZXR1cm4gdGhlIGFkYXB0YXRpb24gZmlsdGVyIGJhciBhcyBhbiBhY3RpdmUgY29udHJvbCAodmlzaWJsZSBmb3IgdGhlIHVzZXIpXG5cdFx0Y29uc3QgYWRhcHRhdGlvbkZpbHRlckJhciA9ICh0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkgYXMgYW55KS5nZXRJbmJ1aWx0RmlsdGVyKCk7XG5cdFx0cmV0dXJuIGFkYXB0YXRpb25GaWx0ZXJCYXI/LmdldFBhcmVudCgpID8gYWRhcHRhdGlvbkZpbHRlckJhciA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdF9nZXRTZWdtZW50ZWRCdXR0b24oc0NvbnRyb2w6IGFueSkge1xuXHRcdGNvbnN0IHNTZWdtZW50ZWRCdXR0b25JZCA9IChzQ29udHJvbCA9PT0gXCJDaGFydFwiID8gdGhpcy5nZXRDaGFydENvbnRyb2woKSA6IHRoaXMuX2dldFRhYmxlKCkpPy5kYXRhKFwic2VnbWVudGVkQnV0dG9uSWRcIik7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoc1NlZ21lbnRlZEJ1dHRvbklkKTtcblx0fVxuXG5cdF9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KHNQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBjb250cm9sSWQgPSB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoc1BhdGgpO1xuXHRcdHJldHVybiBjb250cm9sSWQgJiYgdGhpcy5nZXRWaWV3KCkuYnlJZChjb250cm9sSWQpO1xuXHR9XG5cblx0X2dldFBhZ2VNb2RlbCgpOiBKU09OTW9kZWwgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHBhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5nZXRWaWV3KCkpIGFzIGFueTtcblx0XHRyZXR1cm4gcGFnZUNvbXBvbmVudC5nZXRNb2RlbChcIl9wYWdlTW9kZWxcIik7XG5cdH1cblxuXHRfZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL2R5bmFtaWNMaXN0UmVwb3J0SWRcIikgfHwgXCJcIjtcblx0fVxuXG5cdF9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL2ZpbHRlckJhcklkXCIpIHx8IFwiXCI7XG5cdH1cblxuXHRnZXRDaGFydENvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldENvbnRyb2xGcm9tUGFnZU1vZGVsUHJvcGVydHkoXCIvc2luZ2xlQ2hhcnRJZFwiKTtcblx0fVxuXG5cdF9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sKCkge1xuXHRcdGNvbnN0IHNWaXN1YWxGaWx0ZXJCYXJJZCA9IFN0YWJsZUlkSGVscGVyLmdlbmVyYXRlKFtcInZpc3VhbEZpbHRlclwiLCB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKV0pO1xuXHRcdHJldHVybiBzVmlzdWFsRmlsdGVyQmFySWQgJiYgdGhpcy5nZXRWaWV3KCkuYnlJZChzVmlzdWFsRmlsdGVyQmFySWQpO1xuXHR9XG5cdF9nZXRGaWx0ZXJCYXJWYXJpYW50Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShcIi92YXJpYW50TWFuYWdlbWVudC9pZFwiKTtcblx0fVxuXG5cdF9nZXRNdWx0aU1vZGVDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OlRhYk11bHRpcGxlTW9kZTo6Q29udHJvbFwiKSBhcyBNdWx0aXBsZU1vZGVDb250cm9sO1xuXHR9XG5cblx0X2dldFRhYmxlKCk6IFRhYmxlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk/LmdldFNlbGVjdGVkSW5uZXJDb250cm9sKCk/LmNvbnRlbnQ7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2w/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgPyAob0NvbnRyb2wgYXMgVGFibGUpIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShcIi9zaW5nbGVUYWJsZUlkXCIpIGFzIFRhYmxlO1xuXHRcdH1cblx0fVxuXHRfZ2V0Q29udHJvbHMoc0tleT86IGFueSkge1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBhQ29udHJvbHM6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBvVGFiTXVsdGlNb2RlID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpLmNvbnRlbnQ7XG5cdFx0XHRvVGFiTXVsdGlNb2RlLmdldEl0ZW1zKCkuZm9yRWFjaCgob0l0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQob0l0ZW0uZ2V0S2V5KCkpO1xuXHRcdFx0XHRpZiAob0NvbnRyb2wgJiYgc0tleSkge1xuXHRcdFx0XHRcdGlmIChvSXRlbS5nZXRLZXkoKS5pbmRleE9mKGBmZTo6JHtzS2V5fWApID4gLTEpIHtcblx0XHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAob0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJiBvQ29udHJvbCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUNvbnRyb2xzO1xuXHRcdH0gZWxzZSBpZiAoc0tleSA9PT0gXCJDaGFydFwiKSB7XG5cdFx0XHRjb25zdCBvQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0cmV0dXJuIG9DaGFydCA/IFtvQ2hhcnRdIDogW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRyZXR1cm4gb1RhYmxlID8gW29UYWJsZV0gOiBbXTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0RGVmYXVsdFBhdGgoKSB7XG5cdFx0Y29uc3QgZGVmYXVsdFBhdGggPSBMaXN0UmVwb3J0VGVtcGxhdGluZy5nZXREZWZhdWx0UGF0aCh0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvdmlld3NcIikgfHwgW10pO1xuXHRcdHN3aXRjaCAoZGVmYXVsdFBhdGgpIHtcblx0XHRcdGNhc2UgXCJwcmltYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0Y2FzZSBcInNlY29uZGFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTtcblx0XHRcdGNhc2UgXCJib3RoXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB3aXRoIE11bHRpcGxlIFRhYmxlIG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNNdWx0aU1vZGVcblx0ICogQHJldHVybnMgSXMgTXVsdGlwbGUgVGFibGUgbW9kZSBzZXQ/XG5cdCAqL1xuXHRfaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL211bHRpVmlld3NDb250cm9sXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB0byBsb2FkIGRhdGEgYXQgc3RhcnQgdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNJbml0TG9hZERpc2FibGVkXG5cdCAqIEByZXR1cm5zIElzIEluaXRMb2FkIGVuYWJsZWQ/XG5cdCAqL1xuXHRfaXNJbml0TG9hZEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaW5pdExvYWRNb2RlID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5pbml0aWFsTG9hZDtcblx0XHRyZXR1cm4gaW5pdExvYWRNb2RlID09PSBJbml0aWFsTG9hZE1vZGUuRW5hYmxlZDtcblx0fVxuXG5cdF9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvaGFzTXVsdGlWaXN1YWxpemF0aW9uc1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gc3VzcGVuZCBzZWFyY2ggb24gdGhlIGZpbHRlciBiYXIuIFRoZSBpbml0aWFsIGxvYWRpbmcgb2YgZGF0YSBpcyBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBJbml0TG9hZCAtIERpc2FibGVkL0F1dG8uXG5cdCAqIEl0IGlzIGVuYWJsZWQgbGF0ZXIgd2hlbiB0aGUgdmlldyBzdGF0ZSBpcyBzZXQsIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gcmVhbGl6ZSBpZiB0aGVyZSBhcmUgZGVmYXVsdCBmaWx0ZXJzLlxuXHQgKi9cblx0X2Rpc2FibGVJbml0TG9hZCgpIHtcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0Ly8gY2hlY2sgZm9yIGZpbHRlciBiYXIgaGlkZGVuXG5cdFx0aWYgKGZpbHRlckJhcikge1xuXHRcdFx0ZmlsdGVyQmFyLnNldFN1c3BlbmRTZWxlY3Rpb24odHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgYnkgZmxleCB0byBkZXRlcm1pbmUgaWYgdGhlIGFwcGx5QXV0b21hdGljYWxseSBzZXR0aW5nIG9uIHRoZSB2YXJpYW50IGlzIHZhbGlkLlxuXHQgKiBDYWxsZWQgb25seSBmb3IgU3RhbmRhcmQgVmFyaWFudCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGRpc3BsYXkgdGV4dCBzZXQgZm9yIGFwcGx5QXV0b21hdGljYWxseSAoRkUgb25seSBzZXRzIGl0IGZvciBBdXRvKS5cblx0ICpcblx0ICogQHJldHVybnMgQm9vbGVhbiB0cnVlIGlmIGRhdGEgc2hvdWxkIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCgpIHtcblx0XHQvLyBXZSBhbHdheXMgcmV0dXJuIGZhbHNlIGFuZCB0YWtlIGNhcmUgb2YgaXQgd2hlbiB2aWV3IHN0YXRlIGlzIHNldFxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25maWd1cmUgdGhlIHNldHRpbmdzIGZvciBpbml0aWFsIGxvYWQgYmFzZWQgb25cblx0ICogLSBtYW5pZmVzdCBzZXR0aW5nIGluaXRMb2FkIC0gRW5hYmxlZC9EaXNhYmxlZC9BdXRvXG5cdCAqIC0gdXNlcidzIHNldHRpbmcgb2YgYXBwbHlBdXRvbWF0aWNhbGx5IG9uIHZhcmlhbnRcblx0ICogLSBpZiB0aGVyZSBhcmUgZGVmYXVsdCBmaWx0ZXJzXG5cdCAqIFdlIGRpc2FibGUgdGhlIGZpbHRlciBiYXIgc2VhcmNoIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuYWJsZSBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0LlxuXHQgKi9cblx0X3NldEluaXRMb2FkKCkge1xuXHRcdC8vIGlmIGluaXRMb2FkIGlzIERpc2FibGVkIG9yIEF1dG8sIHN3aXRjaCBvZmYgZmlsdGVyIGJhciBzZWFyY2ggdGVtcG9yYXJpbHkgYXQgc3RhcnRcblx0XHRpZiAoIXRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuX2Rpc2FibGVJbml0TG9hZCgpO1xuXHRcdH1cblx0XHQvLyBzZXQgaG9vayBmb3IgZmxleCBmb3Igd2hlbiBzdGFuZGFyZCB2YXJpYW50IGlzIHNldCAoYXQgc3RhcnQgb3IgYnkgdXNlciBhdCBydW50aW1lKVxuXHRcdC8vIHJlcXVpcmVkIHRvIG92ZXJyaWRlIHRoZSB1c2VyIHNldHRpbmcgJ2FwcGx5IGF1dG9tYXRpY2FsbHknIGJlaGF2aW91ciBpZiB0aGVyZSBhcmUgbm8gZmlsdGVyc1xuXHRcdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50SWQ6IGFueSA9IExpc3RSZXBvcnRUZW1wbGF0aW5nLmdldFZhcmlhbnRCYWNrUmVmZXJlbmNlKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCksIHRoaXMuX2dldFBhZ2VNb2RlbCgpKTtcblx0XHRjb25zdCB2YXJpYW50TWFuYWdlbWVudCA9IHZhcmlhbnRNYW5hZ2VtZW50SWQgJiYgdGhpcy5nZXRWaWV3KCkuYnlJZCh2YXJpYW50TWFuYWdlbWVudElkKTtcblx0XHRpZiAodmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdHZhcmlhbnRNYW5hZ2VtZW50LnJlZ2lzdGVyQXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQodGhpcy5fYXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHR9XG5cblx0X3NldFNoYXJlTW9kZWwoKSB7XG5cdFx0Ly8gVE9ETzogZGVhY3RpdmF0ZWQgZm9yIG5vdyAtIGN1cnJlbnRseSB0aGVyZSBpcyBubyBfdGVtcGxQcml2IGFueW1vcmUsIHRvIGJlIGRpc2N1c3NlZFxuXHRcdC8vIHRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBub3QgY2FsbGVkIGFueW1vcmUgZnJvbSB0aGUgaW5pdCBtZXRob2RcblxuXHRcdGNvbnN0IGZuR2V0VXNlciA9IE9iamVjdFBhdGguZ2V0KFwic2FwLnVzaGVsbC5Db250YWluZXIuZ2V0VXNlclwiKTtcblx0XHQvL3ZhciBvTWFuaWZlc3QgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLnVpXCIpO1xuXHRcdC8vdmFyIHNCb29rbWFya0ljb24gPSAob01hbmlmZXN0ICYmIG9NYW5pZmVzdC5pY29ucyAmJiBvTWFuaWZlc3QuaWNvbnMuaWNvbikgfHwgXCJcIjtcblxuXHRcdC8vc2hhcmVNb2RlbDogSG9sZHMgYWxsIHRoZSBzaGFyaW5nIHJlbGV2YW50IGluZm9ybWF0aW9uIGFuZCBpbmZvIHVzZWQgaW4gWE1MIHZpZXdcblx0XHRjb25zdCBvU2hhcmVJbmZvID0ge1xuXHRcdFx0Ym9va21hcmtUaXRsZTogZG9jdW1lbnQudGl0bGUsIC8vVG8gbmFtZSB0aGUgYm9va21hcmsgYWNjb3JkaW5nIHRvIHRoZSBhcHAgdGl0bGUuXG5cdFx0XHRib29rbWFya0N1c3RvbVVybDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBzSGFzaCA9IGhhc2hlci5nZXRIYXNoKCk7XG5cdFx0XHRcdHJldHVybiBzSGFzaCA/IGAjJHtzSGFzaH1gIDogd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHR9LFxuXHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0VG8gYmUgYWN0aXZhdGVkIG9uY2UgdGhlIEZMUCBzaG93cyB0aGUgY291bnQgLSBzZWUgY29tbWVudCBhYm92ZVxuXHRcdFx0XHRcdFx0XHRib29rbWFya1NlcnZpY2VVcmw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vdmFyIG9UYWJsZSA9IG9UYWJsZS5nZXRJbm5lclRhYmxlKCk7IG9UYWJsZSBpcyBhbHJlYWR5IHRoZSBzYXAuZmUgdGFibGUgKGJ1dCBub3QgdGhlIGlubmVyIG9uZSlcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgdXNlIHRhYmxlLmdldExpc3RCaW5kaW5nSW5mbyBpbnN0ZWFkIG9mIHRoZSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0dmFyIG9CaW5kaW5nID0gb1RhYmxlLmdldEJpbmRpbmcoXCJyb3dzXCIpIHx8IG9UYWJsZS5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gZm5HZXREb3dubG9hZFVybChvQmluZGluZykgOiBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9LCovXG5cdFx0XHRpc1NoYXJlSW5KYW1BY3RpdmU6ICEhZm5HZXRVc2VyICYmIGZuR2V0VXNlcigpLmlzSmFtQWN0aXZlKClcblx0XHR9O1xuXG5cdFx0Y29uc3Qgb1RlbXBsYXRlUHJpdmF0ZU1vZGVsID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiX3RlbXBsUHJpdlwiKSBhcyBKU09OTW9kZWw7XG5cdFx0b1RlbXBsYXRlUHJpdmF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL2xpc3RSZXBvcnQvc2hhcmVcIiwgb1NoYXJlSW5mbyk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHVwZGF0ZSB0aGUgbG9jYWwgVUkgbW9kZWwgb2YgdGhlIHBhZ2Ugd2l0aCB0aGUgZmllbGRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBmaWx0ZXIgYmFyICh0aGlzIGlzIHNwZWNpZmljIHRvIHRoZSBBTFAgc2NlbmFyaW8pLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvRmlsdGVyQmFyIE1EQyBmaWx0ZXIgYmFyXG5cdCAqL1xuXHRfdXBkYXRlQUxQTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyOiBGaWx0ZXJCYXIpIHtcblx0XHRjb25zdCBtQ2FjaGU6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGlnbm9yZWRGaWVsZHM6IGFueSA9IHt9LFxuXHRcdFx0YVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIiksXG5cdFx0XHRhQ2hhcnRzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJDaGFydFwiKTtcblxuXHRcdGlmICghYVRhYmxlcy5sZW5ndGggfHwgIWFDaGFydHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5vdCBhIHRhYmxlIGFuZCBhIGNoYXJ0LCB3ZSdyZSBub3QgaW4gdGhlIEFMUCBjYXNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90aGluZyBmb3IgdGFibGVzLi4uXG5cdFx0YUNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0NoYXJ0RW50aXR5UGF0aCA9IG9DaGFydC5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNDaGFydEVudGl0eVNldCA9IHNDaGFydEVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNDYWNoZUtleSA9IGAke3NDaGFydEVudGl0eVNldH1DaGFydGA7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc0NhY2hlS2V5XSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNvbnRyb2xzL2lnbm9yZWRGaWVsZHNcIiwgaWdub3JlZEZpZWxkcyk7XG5cdH1cblxuXHRfaXNGaWx0ZXJCYXJIaWRkZW4oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaGlkZUZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXRBcHBseUF1dG9tYXRpY2FsbHlPblZhcmlhbnQoVmFyaWFudE1hbmFnZW1lbnQ6IGFueSwga2V5OiBzdHJpbmcpOiBCb29sZWFuIHtcblx0XHRpZiAoIVZhcmlhbnRNYW5hZ2VtZW50IHx8ICFrZXkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgdmFyaWFudHMgPSBWYXJpYW50TWFuYWdlbWVudC5nZXRWYXJpYW50cygpO1xuXHRcdGNvbnN0IGN1cnJlbnRWYXJpYW50ID0gdmFyaWFudHMuZmluZChmdW5jdGlvbiAodmFyaWFudDogYW55KSB7XG5cdFx0XHRyZXR1cm4gdmFyaWFudCAmJiB2YXJpYW50LmtleSA9PT0ga2V5O1xuXHRcdH0pO1xuXHRcdHJldHVybiAoY3VycmVudFZhcmlhbnQgJiYgY3VycmVudFZhcmlhbnQuZXhlY3V0ZU9uU2VsZWN0KSB8fCBmYWxzZTtcblx0fVxuXG5cdF9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk06IGFueSkge1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaW5pdGlhbExvYWQgPT09IEluaXRpYWxMb2FkTW9kZS5BdXRvICYmXG5cdFx0XHQoIW9WTSB8fCBvVk0uZ2V0U3RhbmRhcmRWYXJpYW50S2V5KCkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9Db25kaXRpb25zID0gb0ZpbHRlckJhci5nZXRDb25kaXRpb25zKCk7XG5cdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvQ29uZGl0aW9ucykge1xuXHRcdFx0XHRcdC8vIGlnbm9yZSBmaWx0ZXJzIHN0YXJ0aW5nIHdpdGggJCAoZS5nLiAkc2VhcmNoLCAkZWRpdFN0YXRlKVxuXHRcdFx0XHRcdGlmICghc0tleS5zdGFydHNXaXRoKFwiJFwiKSAmJiBBcnJheS5pc0FycmF5KG9Db25kaXRpb25zW3NLZXldKSAmJiBvQ29uZGl0aW9uc1tzS2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIGxvYWQgZGF0YSBhcyBwZXIgdXNlcidzIHNldHRpbmcgb2YgYXBwbHlBdXRvbWF0aWNhbGx5IG9uIHRoZSB2YXJpYW50XG5cdFx0XHRcdFx0XHRjb25zdCBzdGFuZGFyZFZhcmlhbnQ6IGFueSA9IG9WTS5nZXRWYXJpYW50cygpLmZpbmQoKHZhcmlhbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFyaWFudC5rZXkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RhbmRhcmRWYXJpYW50ICYmIHN0YW5kYXJkVmFyaWFudC5leGVjdXRlT25TZWxlY3Q7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF91cGRhdGVUYWJsZShvVGFibGU6IGFueSkge1xuXHRcdGlmICghb1RhYmxlLmlzVGFibGVCb3VuZCgpIHx8IHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcykge1xuXHRcdFx0b1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0X3VwZGF0ZUNoYXJ0KG9DaGFydDogYW55KSB7XG5cdFx0Y29uc3Qgb0lubmVyQ2hhcnQgPSBvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkuX2dldENoYXJ0KG9DaGFydCk7XG5cdFx0aWYgKCEob0lubmVyQ2hhcnQgJiYgb0lubmVyQ2hhcnQuaXNCb3VuZChcImRhdGFcIikpIHx8IHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcykge1xuXHRcdFx0b0NoYXJ0LmdldENvbnRyb2xEZWxlZ2F0ZSgpLnJlYmluZChvQ2hhcnQsIG9Jbm5lckNoYXJ0LmdldEJpbmRpbmdJbmZvKFwiZGF0YVwiKSk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHRvbkZpbHRlclNlYXJjaCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpLnRyaWdnZXJTZWFyY2goKTtcblx0XHR9LFxuXHRcdG9uRmlsdGVyc0NoYW5nZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Ly8gUGVuZGluZyBmaWx0ZXJzIGludG8gRmlsdGVyQmFyIHRvIGJlIHVzZWQgZm9yIGN1c3RvbSB2aWV3c1xuXHRcdFx0XHR0aGlzLm9uUGVuZGluZ0ZpbHRlcnMoKTtcblx0XHRcdFx0Y29uc3QgYXBwbGllZEZpbHRlcnNUZXh0ID0gb0ZpbHRlckJhci5nZXRBc3NpZ25lZEZpbHRlcnNUZXh0KCkuZmlsdGVyc1RleHQ7XG5cdFx0XHRcdGNvbnN0IGFwcGxpZWRGaWx0ZXJCaW5kaW5nID0gKE1hbmFnZWRPYmplY3QgYXMgYW55KS5iaW5kaW5nUGFyc2VyKGFwcGxpZWRGaWx0ZXJzVGV4dCk7XG5cdFx0XHRcdGlmIChhcHBsaWVkRmlsdGVyQmluZGluZykge1xuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OmFwcGxpZWRGaWx0ZXJzVGV4dFwiKSBhcyBUZXh0IHwgdW5kZWZpbmVkKT8uYmluZFRleHQoYXBwbGllZEZpbHRlckJpbmRpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OmFwcGxpZWRGaWx0ZXJzVGV4dFwiKSBhcyBUZXh0IHwgdW5kZWZpbmVkKT8uc2V0VGV4dChhcHBsaWVkRmlsdGVyc1RleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZGl0aW9uc0Jhc2VkXCIpKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1ZNID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0Y29uc3QgY3VycmVudFZhcmlhbnRLZXkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpO1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cblx0XHRcdGlmIChvTXVsdGlNb2RlQ29udHJvbCAmJiAhb1ZNPy5nZXRQYXJlbnQoKS5pc0EoXCJzYXAudWkubWRjLkFjdGlvblRvb2xiYXJcIikpIHtcblx0XHRcdFx0Ly9Ob3QgYSBDb250cm9sIFZhcmlhbnRcblx0XHRcdFx0b011bHRpTW9kZUNvbnRyb2w/LmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0XHRcdG9NdWx0aU1vZGVDb250cm9sPy5zZXRGcmVlemVDb250ZW50KHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXRUaW1lb3V0IGNhdXNlIHRoZSB2YXJpYW50IG5lZWRzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGp1ZGdpbmcgdGhlIGF1dG8gc2VhcmNoIG9yIHVwZGF0aW5nIHRoZSBhcHAgc3RhdGVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5fc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2gob1ZNKSkge1xuXHRcdFx0XHRcdC8vIHRoZSBhcHAgc3RhdGUgd2lsbCBiZSB1cGRhdGVkIHZpYSBvblNlYXJjaCBoYW5kbGVyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuX2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudChvVk0sIGN1cnJlbnRWYXJpYW50S2V5KSkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZSEhIVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDEwMDApO1xuXHRcdH0sXG5cdFx0b25TZWFyY2godGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb01kY0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdGNvbnN0IGJIaWRlRHJhZnQgPSBGaWx0ZXJVdGlscy5nZXRFZGl0U3RhdGVJc0hpZGVEcmFmdChvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCBmYWxzZSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoaWRlRHJhZnRJbmZvXCIsIGJIaWRlRHJhZnQpO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0ZpbHRlckJhcik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01kY0NoYXJ0KSB7XG5cdFx0XHRcdC8vIGRpc2FibGUgYm91bmQgYWN0aW9ucyBUT0RPOiB0aGlzIGNsZWFycyBldmVyeXRoaW5nIGZvciB0aGUgY2hhcnQ/XG5cdFx0XHRcdChvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXCJcIiwge30pO1xuXG5cdFx0XHRcdGNvbnN0IG9QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vYWxwQ29udGVudFZpZXdgKTtcblx0XHRcdFx0aWYgKHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0KSB7XG5cdFx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBzdG9yZSBmaWx0ZXIgYmFyIGNvbmRpdGlvbnMgdG8gdXNlIGxhdGVyIHdoaWxlIG5hdmlnYXRpb25cblx0XHRcdFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcilcblx0XHRcdFx0LnRoZW4oKG9FeHRlcm5hbFN0YXRlOiBhbnkpID0+IHtcblx0XHRcdFx0XHR0aGlzLmZpbHRlckJhckNvbmRpdGlvbnMgPSBvRXh0ZXJuYWxTdGF0ZS5maWx0ZXI7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBleHRlcm5hbCBzdGF0ZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdGlmICgodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmxpdmVNb2RlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzeXN0ZW0ucGhvbmUpIHtcblx0XHRcdFx0Y29uc3Qgb0R5bmFtaWNQYWdlID0gdGhpcy5fZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sKCk7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdFx0c0NyZWF0ZVBhdGg6IHN0cmluZ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZW50KCksXG5cdFx0XHRcdG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCksXG5cdFx0XHRcdGFEYXRhID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImRhdGFcIiksXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoYURhdGEpIHtcblx0XHRcdFx0Ly8gdXBkYXRlIGFjdGlvbiBidXR0b25zIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudFxuXHRcdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdFx0XHQvLyB1cGRhdGUgc2VsZWN0aW9ucyBvbiBzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb25cblx0XHRcdFx0Q2hhcnRVdGlscy5zZXRDaGFydEZpbHRlcnMob01kY0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2FscENvbnRlbnRWaWV3YCk7XG5cdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1RhYmxlKSB7XG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5yZWJpbmQoKTtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvRXZlbnQubVBhcmFtZXRlcnMua2V5ID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA6IG51bGw7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlID0ge1xuXHRcdFx0XHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9TZWdtZW50ZWRCdXR0b24uZ2V0SXRlbXMoKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpID09PSBzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0b0l0ZW0uZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnJlbW92ZUV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b24gPSAoXG5cdFx0XHRcdHNTZWxlY3RlZEtleSA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSA/IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIlRhYmxlXCIpIDogdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiQ2hhcnRcIilcblx0XHRcdCkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdFx0aWYgKG9TZWdtZW50ZWRCdXR0b24gIT09IG9FdmVudC5nZXRTb3VyY2UoKSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLmFkZEV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgaXNDb21wYWN0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImtleVwiKSA9PT0gXCJDb21wYWN0XCI7XG5cdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkuc2V0VmlzaWJsZShpc0NvbXBhY3QpO1xuXHRcdFx0KHRoaXMuX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSBhcyBDb250cm9sKS5zZXRWaXNpYmxlKCFpc0NvbXBhY3QpO1xuXHRcdH0sXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25EeW5hbWljUGFnZVRpdGxlU3RhdGVDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgZmlsdGVyQmFyOiBhbnkgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAoZmlsdGVyQmFyICYmIGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKSkge1xuXHRcdFx0XHRpZiAob0V2ZW50LmdldFBhcmFtZXRlcihcImlzRXhwYW5kZWRcIikpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGZvcm1hdHRlcnMgPSB7XG5cdFx0c2V0QUxQQ29udHJvbE1lc3NhZ2VTdHJpcCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgYUlnbm9yZWRGaWVsZHM6IGFueVtdLCBiSXNDaGFydDogYW55LCBvQXBwbHlTdXBwb3J0ZWQ/OiBhbnkpIHtcblx0XHRcdGxldCBzVGV4dCA9IFwiXCI7XG5cdFx0XHRiSXNDaGFydCA9IGJJc0NoYXJ0ID09PSBcInRydWVcIiB8fCBiSXNDaGFydCA9PT0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhciAmJiBBcnJheS5pc0FycmF5KGFJZ25vcmVkRmllbGRzKSAmJiBhSWdub3JlZEZpZWxkcy5sZW5ndGggPiAwICYmIGJJc0NoYXJ0KSB7XG5cdFx0XHRcdGNvbnN0IGFJZ25vcmVkTGFiZWxzID0gTWVzc2FnZVN0cmlwLmdldExhYmVscyhcblx0XHRcdFx0XHRhSWdub3JlZEZpZWxkcyxcblx0XHRcdFx0XHRvRmlsdGVyQmFyLmRhdGEoXCJlbnRpdHlUeXBlXCIpLFxuXHRcdFx0XHRcdG9GaWx0ZXJCYXIsXG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgYXMgUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgYklzU2VhcmNoSWdub3JlZCA9ICFvQXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoO1xuXHRcdFx0XHRzVGV4dCA9IGJJc0NoYXJ0XG5cdFx0XHRcdFx0PyBNZXNzYWdlU3RyaXAuZ2V0QUxQVGV4dChhSWdub3JlZExhYmVscywgb0ZpbHRlckJhciwgYklzU2VhcmNoSWdub3JlZClcblx0XHRcdFx0XHQ6IE1lc3NhZ2VTdHJpcC5nZXRUZXh0KGFJZ25vcmVkTGFiZWxzLCBvRmlsdGVyQmFyLCBcIlwiLCBEZWxlZ2F0ZVV0aWwuZ2V0TG9jYWxpemVkVGV4dCk7XG5cdFx0XHRcdHJldHVybiBzVGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RSZXBvcnRDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyREEsSUFBTUEsbUJBQW1CLEdBQUdDLFdBQVcsQ0FBQ0QsbUJBQW1CO0lBQzFERSxlQUFlLEdBQUdELFdBQVcsQ0FBQ0MsZUFBZTtFQUFDLElBR3pDQyxvQkFBb0IsV0FEekJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxVQUVqRUMsY0FBYyxDQUNkQyxlQUFlLENBQUNDLFFBQVEsQ0FBQztJQUN4QkMsY0FBYyxFQUFFLFlBQWlDO01BQy9DLElBQUksQ0FBQ0MsT0FBTyxFQUFFLENBQUNDLGFBQWEsRUFBRSxDQUEwQkMsZUFBZSxFQUFFO0lBQzNFO0VBQ0QsQ0FBQyxD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
|