@sapui5/sap.fe.core 1.92.0 → 1.93.3
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 +2 -3
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +2 -2
- package/src/sap/fe/core/AppComponent.js +21 -1
- package/src/sap/fe/core/CommonUtils.js +130 -48
- package/src/sap/fe/core/ExtensionAPI.js +238 -226
- package/src/sap/fe/core/PageController.js +5 -2
- package/src/sap/fe/core/TemplateComponent.js +1 -0
- package/src/sap/fe/core/TransactionHelper.js +35 -8
- package/src/sap/fe/core/actions/draft.js +1 -1
- package/src/sap/fe/core/actions/messageHandling.js +18 -6
- package/src/sap/fe/core/actions/operations.js +17 -41
- package/src/sap/fe/core/controllerextensions/EditFlow.js +127 -43
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +11 -11
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +417 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +399 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -3
- package/src/sap/fe/core/controllerextensions/PageReady.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +102 -66
- package/src/sap/fe/core/controllerextensions/SideEffects.js +60 -14
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +53 -12
- package/src/sap/fe/core/controllerextensions/ViewState.js +18 -18
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +13 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +68 -2
- package/src/sap/fe/core/converters/ConverterContext.js +15 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +11 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +14 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -14
- package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -12
- package/src/sap/fe/core/converters/MetaModelConverter.js +32 -2
- package/src/sap/fe/core/converters/MetaModelConverter.ts +39 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +10 -6
- package/src/sap/fe/core/converters/annotations/DataField.ts +9 -5
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +14 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +25 -15
- package/src/sap/fe/core/converters/controls/Common/Action.ts +33 -19
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +50 -0
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +33 -0
- package/src/sap/fe/core/converters/controls/Common/Form.js +2 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +1 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.js +181 -0
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +220 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +121 -59
- package/src/sap/fe/core/converters/controls/Common/Table.ts +130 -62
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +9 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +62 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +58 -6
- package/src/sap/fe/core/converters/helpers/Aggregation.js +86 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +79 -8
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +44 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +43 -2
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +8 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +7 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +93 -0
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +92 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +102 -23
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -17
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +44 -5
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +39 -2
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +41 -30
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +47 -30
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +77 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +58 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +103 -0
- package/src/sap/fe/core/formatters/KPIFormatter.ts +88 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +161 -97
- package/src/sap/fe/core/helpers/BindingExpression.ts +188 -117
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +45 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -8
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +16 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +7 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +7 -2
- package/src/sap/fe/core/templating/UIFormatters.js +1 -5
- package/src/sap/fe/core/templating/UIFormatters.ts +0 -3
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/formatters/TableFormatterTypes", "sap/ui/core/format/NumberFormat", "sap/ui/core/Locale", "sap/ui/model/Filter"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, JSONModel, Log, CommonUtils, TableFormatterTypes, NumberFormat, Locale, Filter) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _dec, _dec2, _dec3, _class, _class2;
|
|
9
|
+
|
|
10
|
+
var _exports = {};
|
|
11
|
+
var MessageType = TableFormatterTypes.MessageType;
|
|
12
|
+
var Override = ClassSupport.Override;
|
|
13
|
+
var UI5Class = ClassSupport.UI5Class;
|
|
14
|
+
|
|
15
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
16
|
+
|
|
17
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
18
|
+
|
|
19
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
20
|
+
|
|
21
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
22
|
+
|
|
23
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
24
|
+
|
|
25
|
+
function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
26
|
+
|
|
27
|
+
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
28
|
+
|
|
29
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
30
|
+
|
|
31
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
|
|
32
|
+
|
|
33
|
+
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
34
|
+
|
|
35
|
+
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; }
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Function to calculate a message state from a criticality value.
|
|
39
|
+
*
|
|
40
|
+
* @param {number|string} criticalityValue The criticality values.
|
|
41
|
+
* @returns {MessageType} Returns the corresponding MessageType
|
|
42
|
+
*/
|
|
43
|
+
function messageTypeFromCriticality(criticalityValue) {
|
|
44
|
+
var criticalityProperty;
|
|
45
|
+
|
|
46
|
+
switch (criticalityValue) {
|
|
47
|
+
case 1:
|
|
48
|
+
criticalityProperty = MessageType.Error;
|
|
49
|
+
break;
|
|
50
|
+
|
|
51
|
+
case 2:
|
|
52
|
+
criticalityProperty = MessageType.Warning;
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
case 3:
|
|
56
|
+
criticalityProperty = MessageType.Success;
|
|
57
|
+
break;
|
|
58
|
+
|
|
59
|
+
case 5:
|
|
60
|
+
criticalityProperty = MessageType.Information;
|
|
61
|
+
break;
|
|
62
|
+
|
|
63
|
+
default:
|
|
64
|
+
criticalityProperty = MessageType.None;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return criticalityProperty;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Function to calculate the message state for a criticality calculation of type 'Target'.
|
|
71
|
+
*
|
|
72
|
+
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
73
|
+
* @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
74
|
+
* @returns {MessageType} Returns the corresponding MessageType
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
function messageTypeFromTargetCalculation(kpiValue, aThresholds) {
|
|
79
|
+
var criticalityProperty;
|
|
80
|
+
|
|
81
|
+
if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
|
|
82
|
+
criticalityProperty = MessageType.Error;
|
|
83
|
+
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
|
|
84
|
+
criticalityProperty = MessageType.Warning;
|
|
85
|
+
} else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
|
|
86
|
+
criticalityProperty = MessageType.None;
|
|
87
|
+
} else if (aThresholds[5] !== undefined && aThresholds[5] !== null && kpiValue > aThresholds[5]) {
|
|
88
|
+
criticalityProperty = MessageType.Error;
|
|
89
|
+
} else if (aThresholds[4] !== undefined && aThresholds[4] !== null && kpiValue > aThresholds[4]) {
|
|
90
|
+
criticalityProperty = MessageType.Warning;
|
|
91
|
+
} else if (aThresholds[3] !== undefined && aThresholds[3] !== null && kpiValue > aThresholds[3]) {
|
|
92
|
+
criticalityProperty = MessageType.None;
|
|
93
|
+
} else {
|
|
94
|
+
criticalityProperty = MessageType.Success;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return criticalityProperty;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Function to calculate the message state for a criticality calculation of type 'Minimize'.
|
|
101
|
+
*
|
|
102
|
+
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
103
|
+
* @param {number[]} aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
104
|
+
* @returns {MessageType} Returns the corresponding MessageType
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
function messageTypeFromMinimizeCalculation(kpiValue, aThresholds) {
|
|
109
|
+
var criticalityProperty;
|
|
110
|
+
|
|
111
|
+
if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue > aThresholds[2]) {
|
|
112
|
+
criticalityProperty = MessageType.Error;
|
|
113
|
+
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue > aThresholds[1]) {
|
|
114
|
+
criticalityProperty = MessageType.Warning;
|
|
115
|
+
} else if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue > aThresholds[0]) {
|
|
116
|
+
criticalityProperty = MessageType.None;
|
|
117
|
+
} else {
|
|
118
|
+
criticalityProperty = MessageType.Success;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return criticalityProperty;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Function to calculate the message state for a criticality calculation of type 'Maximize'.
|
|
125
|
+
*
|
|
126
|
+
* @param {number} kpiValue The value of the KPI to be tested against.
|
|
127
|
+
* @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
|
|
128
|
+
* @returns {MessageType} Returns the corresponding MessageType
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
function messageTypeFromMaximizeCalculation(kpiValue, aThresholds) {
|
|
133
|
+
var criticalityProperty;
|
|
134
|
+
|
|
135
|
+
if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
|
|
136
|
+
criticalityProperty = MessageType.Error;
|
|
137
|
+
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
|
|
138
|
+
criticalityProperty = MessageType.Warning;
|
|
139
|
+
} else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
|
|
140
|
+
criticalityProperty = MessageType.None;
|
|
141
|
+
} else {
|
|
142
|
+
criticalityProperty = MessageType.Success;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return criticalityProperty;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Creates a sap.ui.model.Filter from a filter definition.
|
|
149
|
+
*
|
|
150
|
+
* @param filterDefinition The filter definition
|
|
151
|
+
* @returns Returns a sap.ui.model.Filter from the definition, or undefined if the definition is empty (no ranges)
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
function createFilterFromDefinition(filterDefinition) {
|
|
156
|
+
if (filterDefinition.ranges.length === 0) {
|
|
157
|
+
return undefined;
|
|
158
|
+
} else if (filterDefinition.ranges.length === 1) {
|
|
159
|
+
return new Filter(filterDefinition.propertyPath, filterDefinition.ranges[0].operator, filterDefinition.ranges[0].rangeLow, filterDefinition.ranges[0].rangeHigh);
|
|
160
|
+
} else {
|
|
161
|
+
var aRangeFilters = filterDefinition.ranges.map(function (range) {
|
|
162
|
+
return new Filter(filterDefinition.propertyPath, range.operator, range.rangeLow, range.rangeHigh);
|
|
163
|
+
});
|
|
164
|
+
return new Filter({
|
|
165
|
+
filters: aRangeFilters,
|
|
166
|
+
and: false
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* @class A controller extension for managing KPI in an AnalyticalListPage
|
|
172
|
+
*
|
|
173
|
+
* @name sap.fe.core.controllerextensions.KPIManagement
|
|
174
|
+
* @hideconstructor
|
|
175
|
+
*
|
|
176
|
+
* @private
|
|
177
|
+
* @since 1.93.0
|
|
178
|
+
*/
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
_exports.createFilterFromDefinition = createFilterFromDefinition;
|
|
182
|
+
var KPIManagementControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.KPIManagement", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
183
|
+
_inherits(KPIManagementControllerExtension, _ControllerExtension);
|
|
184
|
+
|
|
185
|
+
var _super = _createSuper(KPIManagementControllerExtension);
|
|
186
|
+
|
|
187
|
+
function KPIManagementControllerExtension() {
|
|
188
|
+
_classCallCheck(this, KPIManagementControllerExtension);
|
|
189
|
+
|
|
190
|
+
return _super.apply(this, arguments);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
_createClass(KPIManagementControllerExtension, [{
|
|
194
|
+
key: "onInit",
|
|
195
|
+
value: function onInit() {
|
|
196
|
+
var _this = this;
|
|
197
|
+
|
|
198
|
+
this.aKPIDefinitions = this.getKPIData();
|
|
199
|
+
|
|
200
|
+
if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
|
|
201
|
+
var oView = this.getView();
|
|
202
|
+
this.oAppComponent = CommonUtils.getAppComponent(oView); // Create a JSON model to store KPI data
|
|
203
|
+
|
|
204
|
+
var oKPIModel = new JSONModel();
|
|
205
|
+
oView.setModel(oKPIModel, "kpiModel");
|
|
206
|
+
this.aKPIDefinitions.forEach(function (kpiDefinition) {
|
|
207
|
+
// Create the manifest for the KPI card and store it in the KPI model
|
|
208
|
+
var oCardManifest = {
|
|
209
|
+
"sap.app": {
|
|
210
|
+
id: "sap.fe",
|
|
211
|
+
type: "card"
|
|
212
|
+
},
|
|
213
|
+
"sap.ui": {
|
|
214
|
+
technology: "UI5"
|
|
215
|
+
},
|
|
216
|
+
"sap.card": {
|
|
217
|
+
type: "Analytical",
|
|
218
|
+
data: {
|
|
219
|
+
json: {}
|
|
220
|
+
},
|
|
221
|
+
header: {
|
|
222
|
+
type: "Numeric",
|
|
223
|
+
mainIndicator: {
|
|
224
|
+
number: "{mainValue}",
|
|
225
|
+
unit: "{mainUnit}"
|
|
226
|
+
},
|
|
227
|
+
title: "{cardTitle}"
|
|
228
|
+
},
|
|
229
|
+
content: {
|
|
230
|
+
plotArea: {
|
|
231
|
+
"dataLabel": {
|
|
232
|
+
"visible": false
|
|
233
|
+
},
|
|
234
|
+
"categoryAxisText": {
|
|
235
|
+
"visible": false
|
|
236
|
+
},
|
|
237
|
+
"valueAxisText": {
|
|
238
|
+
"visible": false
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
title: {
|
|
242
|
+
text: "{chartTitle}",
|
|
243
|
+
visible: true,
|
|
244
|
+
alignment: "Left"
|
|
245
|
+
},
|
|
246
|
+
measureAxis: "valueAxis",
|
|
247
|
+
dimensionAxis: "categoryAxis",
|
|
248
|
+
data: {
|
|
249
|
+
path: "/chartData"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
oKPIModel.setProperty("/" + kpiDefinition.id, {
|
|
255
|
+
manifest: oCardManifest
|
|
256
|
+
}); // Load tag data for the KPI
|
|
257
|
+
|
|
258
|
+
_this.loadKPITagData(kpiDefinition).catch(function (err) {
|
|
259
|
+
Log.error(err);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}, {
|
|
265
|
+
key: "onExit",
|
|
266
|
+
value: function onExit() {
|
|
267
|
+
var oKPIModel = this.getView().getModel("kpiModel");
|
|
268
|
+
|
|
269
|
+
if (oKPIModel) {
|
|
270
|
+
oKPIModel.destroy();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}, {
|
|
274
|
+
key: "getKPIData",
|
|
275
|
+
value: function getKPIData() {
|
|
276
|
+
var oView = this.getView(),
|
|
277
|
+
sCustomData = oView.getContent()[0].data("KPIData");
|
|
278
|
+
|
|
279
|
+
if (sCustomData) {
|
|
280
|
+
var vData = typeof sCustomData === "string" ? JSON.parse(sCustomData) : sCustomData;
|
|
281
|
+
|
|
282
|
+
if ("customData" in vData) {
|
|
283
|
+
return vData["customData"];
|
|
284
|
+
} else {
|
|
285
|
+
return vData;
|
|
286
|
+
}
|
|
287
|
+
} else {
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Loads tag data for a KPI.
|
|
293
|
+
*
|
|
294
|
+
* @param {KPIDefinition} kpiDefinition The definition of the KPI.
|
|
295
|
+
* @returns {Promise} Returns the Promise that is resolved when data is loaded.
|
|
296
|
+
*/
|
|
297
|
+
|
|
298
|
+
}, {
|
|
299
|
+
key: "loadKPITagData",
|
|
300
|
+
value: function loadKPITagData(kpiDefinition) {
|
|
301
|
+
var _kpiDefinition$datapo, _kpiDefinition$select;
|
|
302
|
+
|
|
303
|
+
var oModel = this.oAppComponent.getModel();
|
|
304
|
+
var oKPIModel = this.getView().getModel("kpiModel");
|
|
305
|
+
var oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
|
|
306
|
+
var oAggregate = {}; // Main value + currency/unit
|
|
307
|
+
|
|
308
|
+
if ((_kpiDefinition$datapo = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo === void 0 ? void 0 : _kpiDefinition$datapo.isPath) {
|
|
309
|
+
oAggregate[kpiDefinition.datapoint.propertyPath] = {
|
|
310
|
+
unit: kpiDefinition.datapoint.unit.value
|
|
311
|
+
};
|
|
312
|
+
} else {
|
|
313
|
+
oAggregate[kpiDefinition.datapoint.propertyPath] = {};
|
|
314
|
+
} // Property for criticality
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
if (kpiDefinition.datapoint.criticalityPath) {
|
|
318
|
+
oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
oListBinding.setAggregation({
|
|
322
|
+
aggregate: oAggregate
|
|
323
|
+
}); // Manage SelectionVariant filters
|
|
324
|
+
|
|
325
|
+
if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) === null || _kpiDefinition$select === void 0 ? void 0 : _kpiDefinition$select.length) {
|
|
326
|
+
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition);
|
|
327
|
+
oListBinding.filter(aFilters);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return oListBinding.requestContexts(0, 1).then(function (aContexts) {
|
|
331
|
+
if (aContexts.length) {
|
|
332
|
+
var _kpiDefinition$datapo2, _kpiDefinition$datapo3;
|
|
333
|
+
|
|
334
|
+
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
335
|
+
var rawUnit = ((_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.isPath) ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.value;
|
|
336
|
+
|
|
337
|
+
if (kpiDefinition.datapoint.unit && !rawUnit) {
|
|
338
|
+
// A unit/currency is defined, but its value is undefined --> multi-unit situation
|
|
339
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", "*");
|
|
340
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", "*");
|
|
341
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", undefined);
|
|
342
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
|
|
343
|
+
} else {
|
|
344
|
+
var _kpiDefinition$datapo4;
|
|
345
|
+
|
|
346
|
+
var isPercentage = ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo4 === void 0 ? void 0 : _kpiDefinition$datapo4.isCurrency) === false && rawUnit === "%"; // Main KPI value
|
|
347
|
+
|
|
348
|
+
var rawValue = Number.parseFloat(aContexts[0].getProperty(kpiDefinition.datapoint.propertyPath));
|
|
349
|
+
var kpiValue = NumberFormat.getFloatInstance({
|
|
350
|
+
style: isPercentage ? undefined : "short",
|
|
351
|
+
minFractionDigits: 0,
|
|
352
|
+
maxFractionDigits: 1,
|
|
353
|
+
showScale: !isPercentage
|
|
354
|
+
}, currentLocale).format(rawValue);
|
|
355
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", kpiValue);
|
|
356
|
+
var kpiValueUnscaled = NumberFormat.getFloatInstance({
|
|
357
|
+
maxFractionDigits: 2,
|
|
358
|
+
showScale: false,
|
|
359
|
+
groupingEnabled: true
|
|
360
|
+
}, currentLocale).format(rawValue);
|
|
361
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", kpiValueUnscaled); // Unit or currency
|
|
362
|
+
|
|
363
|
+
if (kpiDefinition.datapoint.unit && rawUnit) {
|
|
364
|
+
if (kpiDefinition.datapoint.unit.isCurrency) {
|
|
365
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", rawUnit);
|
|
366
|
+
} else {
|
|
367
|
+
// In case of unit of measure, we have to format it properly
|
|
368
|
+
var kpiUnit = NumberFormat.getUnitInstance({
|
|
369
|
+
showNumber: false
|
|
370
|
+
}, currentLocale).format(rawValue, rawUnit);
|
|
371
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", kpiUnit);
|
|
372
|
+
}
|
|
373
|
+
} // Criticality
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
if (kpiDefinition.datapoint.criticalityValue) {
|
|
377
|
+
// Criticality is a fixed value
|
|
378
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", kpiDefinition.datapoint.criticalityValue);
|
|
379
|
+
} else if (kpiDefinition.datapoint.criticalityPath) {
|
|
380
|
+
// Criticality comes from another property (via a path)
|
|
381
|
+
var criticalityValue = messageTypeFromCriticality(aContexts[0].getProperty(kpiDefinition.datapoint.criticalityPath));
|
|
382
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
|
|
383
|
+
} else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
|
|
384
|
+
// Criticality calculation
|
|
385
|
+
var calculatedCriticality;
|
|
386
|
+
|
|
387
|
+
switch (kpiDefinition.datapoint.criticalityCalculationMode) {
|
|
388
|
+
case "UI.ImprovementDirectionType/Target":
|
|
389
|
+
calculatedCriticality = messageTypeFromTargetCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
390
|
+
break;
|
|
391
|
+
|
|
392
|
+
case "UI.ImprovementDirectionType/Minimize":
|
|
393
|
+
calculatedCriticality = messageTypeFromMinimizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
394
|
+
break;
|
|
395
|
+
|
|
396
|
+
case "UI.ImprovementDirectionType/Maximize":
|
|
397
|
+
default:
|
|
398
|
+
calculatedCriticality = messageTypeFromMaximizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", calculatedCriticality);
|
|
403
|
+
} else {
|
|
404
|
+
// No criticality
|
|
405
|
+
oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}]);
|
|
412
|
+
|
|
413
|
+
return KPIManagementControllerExtension;
|
|
414
|
+
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype)), _class2)) || _class);
|
|
415
|
+
return KPIManagementControllerExtension;
|
|
416
|
+
}, false);
|
|
417
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsibWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiTm9uZSIsIm1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uIiwia3BpVmFsdWUiLCJhVGhyZXNob2xkcyIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24iLCJmaWx0ZXJEZWZpbml0aW9uIiwicmFuZ2VzIiwibGVuZ3RoIiwiRmlsdGVyIiwicHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJyYW5nZUxvdyIsInJhbmdlSGlnaCIsImFSYW5nZUZpbHRlcnMiLCJtYXAiLCJyYW5nZSIsImZpbHRlcnMiLCJhbmQiLCJLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJhS1BJRGVmaW5pdGlvbnMiLCJnZXRLUElEYXRhIiwib1ZpZXciLCJnZXRWaWV3Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib0tQSU1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJmb3JFYWNoIiwia3BpRGVmaW5pdGlvbiIsIm9DYXJkTWFuaWZlc3QiLCJpZCIsInR5cGUiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInRpdGxlIiwiY29udGVudCIsInBsb3RBcmVhIiwidGV4dCIsInZpc2libGUiLCJhbGlnbm1lbnQiLCJtZWFzdXJlQXhpcyIsImRpbWVuc2lvbkF4aXMiLCJwYXRoIiwic2V0UHJvcGVydHkiLCJtYW5pZmVzdCIsImxvYWRLUElUYWdEYXRhIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsImdldE1vZGVsIiwiZGVzdHJveSIsInNDdXN0b21EYXRhIiwiZ2V0Q29udGVudCIsInZEYXRhIiwiSlNPTiIsInBhcnNlIiwib01vZGVsIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJlbnRpdHlTZXQiLCJvQWdncmVnYXRlIiwiZGF0YXBvaW50IiwiaXNQYXRoIiwidmFsdWUiLCJjcml0aWNhbGl0eVBhdGgiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsInNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucyIsImFGaWx0ZXJzIiwiZmlsdGVyIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImFDb250ZXh0cyIsImN1cnJlbnRMb2NhbGUiLCJMb2NhbGUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRDb25maWd1cmF0aW9uIiwiZ2V0TGFuZ3VhZ2UiLCJyYXdVbml0IiwiZ2V0UHJvcGVydHkiLCJpc1BlcmNlbnRhZ2UiLCJpc0N1cnJlbmN5IiwicmF3VmFsdWUiLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiTnVtYmVyRm9ybWF0IiwiZ2V0RmxvYXRJbnN0YW5jZSIsInN0eWxlIiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsInNob3dTY2FsZSIsImZvcm1hdCIsImtwaVZhbHVlVW5zY2FsZWQiLCJncm91cGluZ0VuYWJsZWQiLCJrcGlVbml0IiwiZ2V0VW5pdEluc3RhbmNlIiwic2hvd051bWJlciIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJjYWxjdWxhdGVkQ3JpdGljYWxpdHkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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R0FBRzlHLGtDQUFrQyxDQUN6RDZGLFFBRHlELEVBRXpEOUQsYUFBYSxDQUFDdUMsU0FBZCxDQUF3QnNDLGdDQUZpQyxDQUExRDtBQUlBOztBQUVELHVCQUFLLHNDQUFMO0FBQ0E7QUFDQ0Usb0JBQUFBLHFCQUFxQixHQUFHN0csa0NBQWtDLENBQ3pENEYsUUFEeUQsRUFFekQ5RCxhQUFhLENBQUN1QyxTQUFkLENBQXdCc0MsZ0NBRmlDLENBQTFEO0FBSUE7QUFyQkY7O0FBdUJBakYsZ0JBQUFBLFNBQVMsQ0FBQ3dCLFdBQVYsQ0FDQyxNQUFNcEIsYUFBYSxDQUFDRSxFQUFwQixHQUF5Qiw4Q0FEMUIsRUFFQzZFLHFCQUZEO0FBSUEsZUFqQ00sTUFpQ0E7QUFDTjtBQUNBbkYsZ0JBQUFBLFNBQVMsQ0FBQ3dCLFdBQVYsQ0FBc0IsTUFBTXBCLGFBQWEsQ0FBQ0UsRUFBcEIsR0FBeUIsOENBQS9DLEVBQStGM0MsV0FBVyxDQUFDSyxJQUEzRztBQUNBO0FBQ0Q7QUFDRDtBQUNELFNBMUdNLENBQVA7QUEyR0E7Ozs7SUFoUDZDb0gsbUI7U0FtUGhDL0YsZ0MiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgSlNPTk1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9qc29uXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB7IEtQSURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vS1BJXCI7XG5pbXBvcnQgeyBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgRmlsdGVyRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuaW1wb3J0IHsgTnVtYmVyRm9ybWF0IH0gZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdFwiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9wZXJhdG9yIH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNyaXRpY2FsaXR5IHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY3JpdGljYWxpdHlWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5KGNyaXRpY2FsaXR5VmFsdWU6IG51bWJlciB8IHN0cmluZyk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdHN3aXRjaCAoY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdGNhc2UgMTpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDU6XG5cdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2Ugc3RhdGUgZm9yIGEgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01pbmltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0FjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZXNzYWdlIHN0YXRlIGZvciBhIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIG9mIHR5cGUgJ01heGltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNhcC51aS5tb2RlbC5GaWx0ZXIgZnJvbSBhIGZpbHRlciBkZWZpbml0aW9uLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXJEZWZpbml0aW9uIFRoZSBmaWx0ZXIgZGVmaW5pdGlvblxuICogQHJldHVybnMgUmV0dXJucyBhIHNhcC51aS5tb2RlbC5GaWx0ZXIgZnJvbSB0aGUgZGVmaW5pdGlvbiwgb3IgdW5kZWZpbmVkIGlmIHRoZSBkZWZpbml0aW9uIGlzIGVtcHR5IChubyByYW5nZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogQGNsYXNzIEEgY29udHJvbGxlciBleHRlbnNpb24gZm9yIG1hbmFnaW5nIEtQSSBpbiBhbiBBbmFseXRpY2FsTGlzdFBhZ2VcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjkzLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuS1BJTWFuYWdlbWVudFwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0FwcENvbXBvbmVudCE6IGFueTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuYUtQSURlZmluaXRpb25zID0gdGhpcy5nZXRLUElEYXRhKCk7XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0dGhpcy5vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgSlNPTiBtb2RlbCB0byBzdG9yZSBLUEkgZGF0YVxuXHRcdFx0Y29uc3Qgb0tQSU1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdFx0b1ZpZXcuc2V0TW9kZWwob0tQSU1vZGVsLCBcImtwaU1vZGVsXCIpO1xuXG5cdFx0XHR0aGlzLmFLUElEZWZpbml0aW9ucy5mb3JFYWNoKGtwaURlZmluaXRpb24gPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIG1hbmlmZXN0IGZvciB0aGUgS1BJIGNhcmQgYW5kIHN0b3JlIGl0IGluIHRoZSBLUEkgbW9kZWxcblx0XHRcdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdCA9IHtcblx0XHRcdFx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcImNhcmRcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHRcdFx0dGVjaG5vbG9neTogXCJVSTVcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcIkFuYWx5dGljYWxcIixcblx0XHRcdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoZWFkZXI6IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0XHRcdG1haW5JbmRpY2F0b3I6IHtcblx0XHRcdFx0XHRcdFx0XHRudW1iZXI6IFwie21haW5WYWx1ZX1cIixcblx0XHRcdFx0XHRcdFx0XHR1bml0OiBcInttYWluVW5pdH1cIlxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogXCJ7Y2FyZFRpdGxlfVwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHRcdFx0XHRwbG90QXJlYToge1xuXHRcdFx0XHRcdFx0XHRcdFwiZGF0YUxhYmVsXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJjYXRlZ29yeUF4aXNUZXh0XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZUF4aXNUZXh0XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidmlzaWJsZVwiOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBcIntjaGFydFRpdGxlfVwiLFxuXHRcdFx0XHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0YWxpZ25tZW50OiBcIkxlZnRcIlxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRtZWFzdXJlQXhpczogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uQXhpczogXCJjYXRlZ29yeUF4aXNcIixcblx0XHRcdFx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGg6IFwiL2NoYXJ0RGF0YVwiXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCwge1xuXHRcdFx0XHRcdG1hbmlmZXN0OiBvQ2FyZE1hbmlmZXN0XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIExvYWQgdGFnIGRhdGEgZm9yIHRoZSBLUElcblx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uKS5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAob0tQSU1vZGVsKSB7XG5cdFx0XHRvS1BJTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0S1BJRGF0YSgpOiBLUElEZWZpbml0aW9uW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRzQ3VzdG9tRGF0YSA9IG9WaWV3LmdldENvbnRlbnQoKVswXS5kYXRhKFwiS1BJRGF0YVwiKTtcblxuXHRcdGlmIChzQ3VzdG9tRGF0YSkge1xuXHRcdFx0Y29uc3QgdkRhdGEgPSB0eXBlb2Ygc0N1c3RvbURhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNDdXN0b21EYXRhKSA6IHNDdXN0b21EYXRhO1xuXHRcdFx0aWYgKFwiY3VzdG9tRGF0YVwiIGluIHZEYXRhKSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIHRhZyBkYXRhIGZvciBhIEtQSS5cblx0ICpcblx0ICogQHBhcmFtIHtLUElEZWZpbml0aW9ufSBrcGlEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBLUEkuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uKTogYW55IHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldCk7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgeyB1bml0Pzogc3RyaW5nIH0+ID0ge307XG5cblx0XHQvLyBNYWluIHZhbHVlICsgY3VycmVuY3kvdW5pdFxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHsgdW5pdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0eSBmb3IgY3JpdGljYWxpdHlcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aF0gPSB7fTtcblx0XHR9XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbik7XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAxKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRcdFx0c2FwLnVpXG5cdFx0XHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHRcdFx0PyBhQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmICFyYXdVbml0KSB7XG5cdFx0XHRcdFx0Ly8gQSB1bml0L2N1cnJlbmN5IGlzIGRlZmluZWQsIGJ1dCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIC0tPiBtdWx0aS11bml0IHNpdHVhdGlvblxuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNQZXJjZW50YWdlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNDdXJyZW5jeSA9PT0gZmFsc2UgJiYgcmF3VW5pdCA9PT0gXCIlXCI7XG5cblx0XHRcdFx0XHQvLyBNYWluIEtQSSB2YWx1ZVxuXHRcdFx0XHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoYUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHRcdGNvbnN0IGtwaVZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0XHRcdFx0c2hvd1NjYWxlOiAhaXNQZXJjZW50YWdlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0XHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBrcGlWYWx1ZSk7XG5cdFx0XHRcdFx0Y29uc3Qga3BpVmFsdWVVbnNjYWxlZCA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMixcblx0XHRcdFx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBpbmdFbmFibGVkOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0XHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIGtwaVZhbHVlVW5zY2FsZWQpO1xuXG5cdFx0XHRcdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmIHJhd1VuaXQpIHtcblx0XHRcdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LmlzQ3VycmVuY3kpIHtcblx0XHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCByYXdVbml0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgdW5pdCBvZiBtZWFzdXJlLCB3ZSBoYXZlIHRvIGZvcm1hdCBpdCBwcm9wZXJseVxuXHRcdFx0XHRcdFx0XHRjb25zdCBrcGlVbml0ID0gTnVtYmVyRm9ybWF0LmdldFVuaXRJbnN0YW5jZSh7IHNob3dOdW1iZXI6IGZhbHNlIH0sIGN1cnJlbnRMb2NhbGUpLmZvcm1hdChyYXdWYWx1ZSwgcmF3VW5pdCk7XG5cdFx0XHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwga3BpVW5pdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ3JpdGljYWxpdHlcblx0XHRcdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpbkNyaXRpY2FsaXR5XCIsXG5cdFx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdFx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdFx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eShcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBjcml0aWNhbGl0eVZhbHVlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiZcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBDcml0aWNhbGl0eSBjYWxjdWxhdGlvblxuXHRcdFx0XHRcdFx0bGV0IGNhbGN1bGF0ZWRDcml0aWNhbGl0eTogTWVzc2FnZVR5cGU7XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5ID0gbWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5ID0gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRjYWxjdWxhdGVkQ3JpdGljYWxpdHkgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIixcblx0XHRcdFx0XHRcdFx0Y2FsY3VsYXRlZENyaXRpY2FsaXR5XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBObyBjcml0aWNhbGl0eVxuXHRcdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
|