@sapui5/sap.fe.base 1.125.0 → 1.126.1
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 +1 -1
- package/src/sap/fe/base/.library +1 -1
- package/src/sap/fe/base/AnnotationEnum.js +33 -0
- package/src/sap/fe/base/AnnotationEnum.ts +21 -0
- package/src/sap/fe/base/BindingToolkit.js +1822 -0
- package/src/sap/fe/base/BindingToolkit.ts +2452 -0
- package/src/sap/fe/base/ClassSupport.js +24 -4
- package/src/sap/fe/base/ClassSupport.ts +26 -3
- package/src/sap/fe/base/jsx-runtime/ViewLoader.js +1 -1
- package/src/sap/fe/base/jsx-runtime/ViewLoader.tsx +2 -1
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +31 -3
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +34 -6
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.js +7 -3
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.ts +8 -3
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +73 -21
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +90 -22
- package/src/sap/fe/base/library.js +1 -1
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/fe/
|
|
5
|
+
sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
9
|
+
function isBindingToolkitExpression(expression) {
|
|
10
|
+
return (expression === null || expression === void 0 ? void 0 : expression._type) !== undefined;
|
|
11
|
+
}
|
|
9
12
|
const writeChildren = function (val) {
|
|
10
13
|
if (Array.isArray(val)) {
|
|
11
14
|
return val.join("");
|
|
@@ -48,6 +51,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
48
51
|
return !!(children !== null && children !== void 0 && children.getMetadata);
|
|
49
52
|
};
|
|
50
53
|
const FL_DELEGATE = "fl:delegate";
|
|
54
|
+
const DT_DESIGNTIME = "dt:designtime";
|
|
51
55
|
const CORE_REQUIRE = "core:require";
|
|
52
56
|
const LOG_SOURCEPATH = "log:sourcePath";
|
|
53
57
|
const CUSTOM_LOADVALUE = "customData:loadValue";
|
|
@@ -60,18 +64,27 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
60
64
|
const childValue = childrenObject[subPropName];
|
|
61
65
|
if (childValue !== undefined) {
|
|
62
66
|
if (typeof childValue === "object") {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
if (Array.isArray(childValue)) {
|
|
68
|
+
aggregationChildren.push(`<${subPropName}>`);
|
|
69
|
+
for (const childrenObjectElement of childValue) {
|
|
70
|
+
aggregationChildren.push(processObjectPropertyValue(childrenObjectElement, namespaceAlias, subPropName));
|
|
71
|
+
}
|
|
72
|
+
aggregationChildren.push(`</${subPropName}>`);
|
|
73
|
+
} else {
|
|
74
|
+
// if the property is a value it needs to be serialized as a children
|
|
75
|
+
// <myObjectProp prop1='xxx', prop2='xxt'/>
|
|
76
|
+
aggregationChildren.push(processObjectPropertyValue(childValue, namespaceAlias, subPropName));
|
|
77
|
+
}
|
|
66
78
|
} else {
|
|
67
79
|
// Otherwise it's part of the main object just as another property
|
|
68
80
|
aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
|
|
69
81
|
}
|
|
70
82
|
}
|
|
71
83
|
});
|
|
72
|
-
|
|
84
|
+
const namespacedProperty = namespaceAlias ? `${namespaceAlias}:${propertyName}` : propertyName;
|
|
85
|
+
return `<${namespacedProperty} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespacedProperty}>`;
|
|
73
86
|
}
|
|
74
|
-
function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString) {
|
|
87
|
+
function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl) {
|
|
75
88
|
Object.keys(metadataProperties).forEach(propertyName => {
|
|
76
89
|
var _mSettings$children, _mSettings$children2;
|
|
77
90
|
if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
|
|
@@ -79,6 +92,12 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
79
92
|
if (propertyName === CORE_REQUIRE) {
|
|
80
93
|
propertiesString.push(`xmlns:core="sap.ui.core"`);
|
|
81
94
|
}
|
|
95
|
+
if (propertyName === FL_DELEGATE) {
|
|
96
|
+
propertiesString.push(`xmlns:fl="sap.ui.fl"`);
|
|
97
|
+
}
|
|
98
|
+
if (propertyName === DT_DESIGNTIME) {
|
|
99
|
+
propertiesString.push(`xmlns:dt="sap.ui.dt"`);
|
|
100
|
+
}
|
|
82
101
|
if (propertyName === LOG_SOURCEPATH) {
|
|
83
102
|
propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
84
103
|
}
|
|
@@ -88,23 +107,20 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
88
107
|
if (propertyValue && typeof propertyValue === "object") {
|
|
89
108
|
if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
|
|
90
109
|
propertiesString.push(`${propertyName}='${propertyValue.getPath()}'`);
|
|
91
|
-
} else if (isBindingToolkitExpression(propertyValue)
|
|
92
|
-
propertiesString.push(`${propertyName}='${
|
|
110
|
+
} else if (isBindingToolkitExpression(propertyValue)) {
|
|
111
|
+
propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(compileExpression(propertyValue))}'`);
|
|
93
112
|
} else if (Array.isArray(propertyValue)) {
|
|
94
113
|
if (propertyValue.length === 1) {
|
|
95
|
-
|
|
114
|
+
const outValue = typeof propertyValue[0] === "string" ? propertyValue[0] : JSON.stringify(propertyValue[0]);
|
|
115
|
+
propertiesString.push(`${propertyName}='${outValue}'`);
|
|
96
116
|
} else {
|
|
97
|
-
|
|
117
|
+
const outValue = propertyValue.every(val => typeof val === "string") ? propertyValue.join(" ") : JSON.stringify(propertyValue);
|
|
118
|
+
propertiesString.push(`${propertyName}='${outValue}'`);
|
|
98
119
|
}
|
|
120
|
+
} else if (isControl) {
|
|
121
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
99
122
|
} else {
|
|
100
|
-
|
|
101
|
-
const propertyValueObj = propertyValue;
|
|
102
|
-
Object.keys(propertyValueObj).forEach(subPropName => {
|
|
103
|
-
if (propertyValueObj[subPropName] !== undefined) {
|
|
104
|
-
complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
|
|
123
|
+
aggregationString.push(processObjectPropertyValue(propertyValue, undefined, propertyName));
|
|
108
124
|
}
|
|
109
125
|
} else {
|
|
110
126
|
const prop = mSettings[propertyName];
|
|
@@ -118,6 +134,27 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
118
134
|
}
|
|
119
135
|
});
|
|
120
136
|
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Processes the command.
|
|
140
|
+
*
|
|
141
|
+
* Resolves the command set on the control via the intrinsic class attribute "jsx:command".
|
|
142
|
+
* If no command has been set or the targeted event doesn't exist, no configuration is set.
|
|
143
|
+
*
|
|
144
|
+
* @param settings Metadata of the control
|
|
145
|
+
* @param metadataEvents Settings of the control
|
|
146
|
+
*/
|
|
147
|
+
function processCommand(settings, metadataEvents) {
|
|
148
|
+
const commandProperty = settings["jsx:command"];
|
|
149
|
+
if (commandProperty) {
|
|
150
|
+
const [command, eventName] = commandProperty.split("|");
|
|
151
|
+
const event = metadataEvents[eventName];
|
|
152
|
+
if (event && command.startsWith("cmd:")) {
|
|
153
|
+
settings[event.name] = command;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
delete settings["jsx:command"];
|
|
157
|
+
}
|
|
121
158
|
function processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString) {
|
|
122
159
|
const aggregationChildren = {};
|
|
123
160
|
addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children);
|
|
@@ -150,9 +187,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
150
187
|
const jsxXml = function (type, mSettings, key, xmlNamespaceMap, overrideNodeName) {
|
|
151
188
|
let metadata;
|
|
152
189
|
let metadataProperties;
|
|
190
|
+
let metadataEvents;
|
|
153
191
|
let controlName;
|
|
154
192
|
let metadataAggregations;
|
|
155
193
|
let defaultAggregationName;
|
|
194
|
+
let isControl = false;
|
|
156
195
|
if (isAControl(type)) {
|
|
157
196
|
metadata = type.getMetadata();
|
|
158
197
|
metadataProperties = metadata.getAllProperties();
|
|
@@ -161,9 +200,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
161
200
|
...metadata.getAllEvents(),
|
|
162
201
|
...metadata.getAllAssociations()
|
|
163
202
|
};
|
|
203
|
+
metadataEvents = metadata.getAllEvents();
|
|
164
204
|
controlName = metadata.getName();
|
|
165
205
|
metadataAggregations = metadata.getAllAggregations();
|
|
166
206
|
defaultAggregationName = metadata.getDefaultAggregationName();
|
|
207
|
+
isControl = true;
|
|
167
208
|
} else {
|
|
168
209
|
metadata = type.metadata;
|
|
169
210
|
metadataProperties = metadata.properties;
|
|
@@ -174,6 +215,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
174
215
|
},
|
|
175
216
|
...metadata.aggregations
|
|
176
217
|
};
|
|
218
|
+
metadataEvents = {};
|
|
177
219
|
defaultAggregationName = metadata.defaultAggregation;
|
|
178
220
|
controlName = metadata.namespace + "." + metadata.name;
|
|
179
221
|
}
|
|
@@ -187,9 +229,15 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
187
229
|
metadataProperties["id"] = {
|
|
188
230
|
name: "id"
|
|
189
231
|
};
|
|
232
|
+
metadataProperties["binding"] = {
|
|
233
|
+
name: "binding"
|
|
234
|
+
};
|
|
190
235
|
metadataProperties[FL_DELEGATE] = {
|
|
191
236
|
name: FL_DELEGATE
|
|
192
237
|
};
|
|
238
|
+
metadataProperties[DT_DESIGNTIME] = {
|
|
239
|
+
name: DT_DESIGNTIME
|
|
240
|
+
};
|
|
193
241
|
metadataProperties[CORE_REQUIRE] = {
|
|
194
242
|
name: CORE_REQUIRE
|
|
195
243
|
};
|
|
@@ -205,6 +253,9 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
205
253
|
metadataProperties["xmlns:fl"] = {
|
|
206
254
|
name: FL_DELEGATE
|
|
207
255
|
};
|
|
256
|
+
metadataProperties["xmlns:dt"] = {
|
|
257
|
+
name: DT_DESIGNTIME
|
|
258
|
+
};
|
|
208
259
|
metadataProperties["xmlns:core"] = {
|
|
209
260
|
name: CORE_REQUIRE
|
|
210
261
|
};
|
|
@@ -225,7 +276,8 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
225
276
|
let tagName = `${namespaceAlias}:${name}`;
|
|
226
277
|
const propertiesString = [];
|
|
227
278
|
const aggregationString = [];
|
|
228
|
-
|
|
279
|
+
processCommand(mSettings, metadataEvents);
|
|
280
|
+
processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl);
|
|
229
281
|
processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
|
|
230
282
|
if (overrideNodeName) {
|
|
231
283
|
tagName = overrideNodeName;
|
|
@@ -234,4 +286,4 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
|
|
|
234
286
|
};
|
|
235
287
|
return jsxXml;
|
|
236
288
|
}, false);
|
|
237
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cml0ZUNoaWxkcmVuIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsdWUiLCJyZXBsYWNlIiwiYWRkQ2hpbGRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ2hpbGRyZW4iLCJhZ2dyZWdhdGlvbk5hbWUiLCJjaGlsZCIsInVuZGVmaW5lZCIsInRyaW0iLCJsZW5ndGgiLCJwdXNoIiwiZm9yRWFjaCIsInN1YkNoaWxkIiwiY2hpbGRLZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBQ29udHJvbCIsImNoaWxkcmVuIiwiZ2V0TWV0YWRhdGEiLCJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJ0b1N0cmluZyIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb21wbGV4UHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlT2JqIiwicHJvcCIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJhZ2dyZWdhdGlvbkNoaWxkS2V5cyIsIndyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiIsImpzeFhtbCIsImtleSIsInhtbE5hbWVzcGFjZU1hcCIsIm92ZXJyaWRlTm9kZU5hbWUiLCJtZXRhZGF0YSIsImNvbnRyb2xOYW1lIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldEFsbEV2ZW50cyIsImdldEFsbEFzc29jaWF0aW9ucyIsImdldE5hbWUiLCJnZXRBbGxBZ2dyZWdhdGlvbnMiLCJnZXREZWZhdWx0QWdncmVnYXRpb25OYW1lIiwicHJvcGVydGllcyIsImRlcGVuZGVudHMiLCJjdXN0b21EYXRhIiwiYWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwibmFtZXNwYWNlIiwibmFtZSIsIm5hbWVzU3BsaXQiLCJzcGxpdCIsInNsaWNlIiwidGFnTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LXhtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB7IGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmNvbnN0IHdyaXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRyZXR1cm4gdmFsLmpvaW4oXCJcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufTtcblxuLyoqXG4gKiBTb21lIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aGVuIHVzZWQgYXMgWE1MIGF0dHJpYnV0ZSB2YWx1ZSwgb3RoZXJ3aXNlIHRoaXMgcmVzdWx0IGluIGluY29ycmVjdCBYTUwuXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB4bWwgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKENvbnRyb2wgfCBzdHJpbmcpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoY2hpbGQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkS2V5IG9mIE9iamVjdC5rZXlzKGNoaWxkKSkge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgdHlwZW9mIENvbnRyb2wge1xuXHRyZXR1cm4gISEoY2hpbGRyZW4gYXMgdHlwZW9mIENvbnRyb2wpPy5nZXRNZXRhZGF0YTtcbn07XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IExPR19TT1VSQ0VQQVRIID0gXCJsb2c6c291cmNlUGF0aFwiO1xuY29uc3QgQ1VTVE9NX0xPQURWQUxVRSA9IFwiY3VzdG9tRGF0YTpsb2FkVmFsdWVcIjtcbmNvbnN0IENVU1RPTV9VUkwgPSBcImN1c3RvbURhdGE6dXJsXCI7XG5cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkcmVuT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZXNwYWNlQWxpYXM6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCBpc1xuXHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IHN0cmluZ1tdID0gW107XG5cdE9iamVjdC5rZXlzKGNoaWxkcmVuT2JqZWN0KS5mb3JFYWNoKChzdWJQcm9wTmFtZSkgPT4ge1xuXHRcdGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZHJlbk9iamVjdFtzdWJQcm9wTmFtZV07XG5cdFx0aWYgKGNoaWxkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHZhbHVlIGl0IG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYSBjaGlsZHJlblxuXHRcdFx0XHQvLyA8bXlPYmplY3RQcm9wIHByb3AxPSd4eHgnLCBwcm9wMj0neHh0Jy8+XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIHBhcnQgb2YgdGhlIG1haW4gb2JqZWN0IGp1c3QgYXMgYW5vdGhlciBwcm9wZXJ0eVxuXHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnRpZXMucHVzaChgJHtzdWJQcm9wTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY2hpbGRWYWx1ZS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcblx0XHRcIlxcblwiXG5cdCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3Byb3BlcnR5TmFtZX0+YDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXM8VD4oXG5cdG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdFx0dHlwZT86IHN0cmluZztcblx0XHR9XG5cdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdHByb3BlcnRpZXNTdHJpbmc6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW11cbik6IHZvaWQge1xuXHRPYmplY3Qua2V5cyhtZXRhZGF0YVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDT1JFX1JFUVVJUkUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gTE9HX1NPVVJDRVBBVEgpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpsb2c9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IENVU1RPTV9VUkwgfHwgcHJvcGVydHlOYW1lID09PSBDVVNUT01fTE9BRFZBTFVFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKG1ldGFkYXRhUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PSckeyhwcm9wZXJ0eVZhbHVlIGFzIENvbnRleHQpLmdldFBhdGgoKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkgfHwgcHJvcGVydHlOYW1lID09PSBcImRlbGVnYXRlXCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtKU09OLnN0cmluZ2lmeShtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pfSdgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW3Byb3BlcnR5TmFtZV0pfSdgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFByb3BlcnR5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVPYmogPSBwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZU9iaikuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXhQcm9wZXJ0eS5wdXNoKGAke3N1YlByb3BOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChgPCR7cHJvcGVydHlOYW1lfSAke2NvbXBsZXhQcm9wZXJ0eS5qb2luKFwiIFwiKX0vPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUocHJvcC50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG1TZXR0aW5ncy5jaGlsZHJlbj8uaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMoKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdID8/IHt9KS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHQvLyBPYmplY3QgLyBBcnJheSBwcm9wZXJ0aWVzIGFyZSBwYXJ0IG9mIHRoZSBgY2hpbGRyZW5gIGFnZ3JlZ2F0aW9uIGFuZCBhcyBzdWNoIHN0aWxsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHByb3BlcnRpZXNcblx0XHRcdGNvbnN0IGNoaWxkcmVuT2JqZWN0ID0gKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgb2JqZWN0Pjtcblx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2gocHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3QsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0eU5hbWUpKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lID8/IFwiY3VzdG9tRGF0YVwiLCBtU2V0dGluZ3MuY2hpbGRyZW4gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzID0gT2JqZWN0LmtleXMoYWdncmVnYXRpb25DaGlsZHJlbik7XG5cdGxldCB3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSBmYWxzZTtcblx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzLmxlbmd0aCA9PT0gMSAmJiBhZ2dyZWdhdGlvbkNoaWxkS2V5c1swXSA9PT0gZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdH1cblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkgJiYgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbk5hbWUgPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgJiYgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goYCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChcblx0XHRcdFx0XHRgPCR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5cblx0XHRcdFx0XHRcdCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfVxuXHRcdFx0XHRcdDwvJHtuYW1lc3BhY2VBbGlhc306JHthZ2dyZWdhdGlvbk5hbWV9PmBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0pfSdgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIHNvbWUgY2FzZSB0aGUgYWdncmVnYXRpb24gZXhwZWN0IGEgc3RyaW5nIHZhbHVlIChsaWtlIGZvciB0aGUgdG9vbHRpcCksIGluIHRoaXMgY2FzZSB3ZSBzZXQgaXQgZGlyZWN0bHkgYXMgYSBwcm9wZXJ0eVxuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7YWdncmVnYXRpb25OYW1lfT0nJHttU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ2hpbGRyZW47XG59XG5cbmNvbnN0IGpzeFhtbCA9IGZ1bmN0aW9uIDxUPihcblx0dHlwZTogdHlwZW9mIENvbnRyb2wgfCB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRtU2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYgeyBrZXk/OiBzdHJpbmc7IGNoaWxkcmVuPzogVUk1RWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+IH0sXG5cdGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHR4bWxOYW1lc3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdG92ZXJyaWRlTm9kZU5hbWU/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGxldCBtZXRhZGF0YTtcblx0bGV0IG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgeyBuYW1lPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nIH0+O1xuXHRsZXQgY29udHJvbE5hbWU7XG5cdGxldCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucztcblx0bGV0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdGNvbnRyb2xOYW1lID0gbWV0YWRhdGEuZ2V0TmFtZSgpO1xuXHRcdG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0fSBlbHNlIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUubWV0YWRhdGE7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0gbWV0YWRhdGEucHJvcGVydGllcztcblx0XHRtZXRhZGF0YUFnZ3JlZ2F0aW9ucyA9IHsgLi4ueyBkZXBlbmRlbnRzOiB7fSwgY3VzdG9tRGF0YToge30gfSwgLi4ubWV0YWRhdGEuYWdncmVnYXRpb25zIH07XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NPUkVfUkVRVUlSRV0gPSB7IG5hbWU6IENPUkVfUkVRVUlSRSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbTE9HX1NPVVJDRVBBVEhdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbQ1VTVE9NX0xPQURWQUxVRV0gPSB7IG5hbWU6IENVU1RPTV9MT0FEVkFMVUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9VUkxdID0geyBuYW1lOiBDVVNUT01fVVJMIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmZsXCJdID0geyBuYW1lOiBGTF9ERUxFR0FURSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpjb3JlXCJdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6bG9nXCJdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRpZiAoY29udHJvbE5hbWUgPT09IFwic2FwLnVpLmNvcmUuRnJhZ21lbnRcIikge1xuXHRcdG1ldGFkYXRhUHJvcGVydGllc1tcImZyYWdtZW50TmFtZVwiXSA9IHsgbmFtZTogXCJmcmFnbWVudE5hbWVcIiB9O1xuXHR9XG5cdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRsZXQgbmFtZXNwYWNlQWxpYXMgPSBuYW1lc3BhY2VbbmFtZXNwYWNlLmxlbmd0aCAtIDFdO1xuXHRpZiAoeG1sTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRuYW1lc3BhY2VBbGlhcyA9IHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildO1xuXHR9XG5cdGxldCB0YWdOYW1lID0gYCR7bmFtZXNwYWNlQWxpYXN9OiR7bmFtZX1gO1xuXHRjb25zdCBwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc1Byb3BlcnRpZXMobVNldHRpbmdzLCBtZXRhZGF0YVByb3BlcnRpZXMsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdHByb2Nlc3NBZ2dyZWdhdGlvbnMobVNldHRpbmdzLCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucywgbmFtZXNwYWNlQWxpYXMsIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nKTtcblx0aWYgKG92ZXJyaWRlTm9kZU5hbWUpIHtcblx0XHR0YWdOYW1lID0gb3ZlcnJpZGVOb2RlTmFtZTtcblx0fVxuXHRyZXR1cm4gYDwke3RhZ05hbWV9IHhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lc3BhY2Uuam9pbihcIi5cIil9XCIgJHtwcm9wZXJ0aWVzU3RyaW5nLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uU3RyaW5nLmpvaW4oXG5cdFx0XCJcIlxuXHQpfTwvJHt0YWdOYW1lfT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGpzeFhtbDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUFPQSxNQUFNQSxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJ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
|
|
289
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJfdHlwZSIsInVuZGVmaW5lZCIsIndyaXRlQ2hpbGRyZW4iLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsInJlcGxhY2UiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidHJpbSIsImxlbmd0aCIsInB1c2giLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJjaGlsZEtleSIsIk9iamVjdCIsImtleXMiLCJpc0FDb250cm9sIiwiY2hpbGRyZW4iLCJnZXRNZXRhZGF0YSIsIkZMX0RFTEVHQVRFIiwiRFRfREVTSUdOVElNRSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJjaGlsZHJlbk9iamVjdEVsZW1lbnQiLCJ0b1N0cmluZyIsIm5hbWVzcGFjZWRQcm9wZXJ0eSIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaXNDb250cm9sIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJjb21waWxlRXhwcmVzc2lvbiIsIm91dFZhbHVlIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZXJ5IiwicHJvcCIsInByb2Nlc3NDb21tYW5kIiwic2V0dGluZ3MiLCJtZXRhZGF0YUV2ZW50cyIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50Iiwic3RhcnRzV2l0aCIsIm5hbWUiLCJwcm9jZXNzQWdncmVnYXRpb25zIiwibWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJkZWZhdWx0QWdncmVnYXRpb25OYW1lIiwiYWdncmVnYXRpb25DaGlsZEtleXMiLCJ3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24iLCJqc3hYbWwiLCJrZXkiLCJ4bWxOYW1lc3BhY2VNYXAiLCJvdmVycmlkZU5vZGVOYW1lIiwibWV0YWRhdGEiLCJjb250cm9sTmFtZSIsImdldEFsbFByb3BlcnRpZXMiLCJnZXRBbGxFdmVudHMiLCJnZXRBbGxBc3NvY2lhdGlvbnMiLCJnZXROYW1lIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsInByb3BlcnRpZXMiLCJkZXBlbmRlbnRzIiwiY3VzdG9tRGF0YSIsImFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsIm5hbWVzcGFjZSIsIm5hbWVzU3BsaXQiLCJzbGljZSIsInRhZ05hbWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImpzeC14bWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmZ1bmN0aW9uIGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKFxuXHRleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4gfCB1bmtub3duXG4pOiBleHByZXNzaW9uIGlzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB7XG5cdHJldHVybiAoZXhwcmVzc2lvbiBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4pPy5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCB3cml0ZUNoaWxkcmVuID0gZnVuY3Rpb24gKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcge1xuXHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0cmV0dXJuIHZhbC5qb2luKFwiXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cbn07XG5cbi8qKlxuICogU29tZSBjaGFyYWN0ZXJzIG5lZWRzIHRvIGJlIGVzY2FwZWQgd2hlbiB1c2VkIGFzIFhNTCBhdHRyaWJ1dGUgdmFsdWUsIG90aGVyd2lzZSB0aGlzIHJlc3VsdCBpbiBpbmNvcnJlY3QgWE1MLlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgeG1sIGF0dHJpYnV0ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChDb250cm9sIHwgc3RyaW5nKVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0aWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKCFhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBbXTtcblx0fVxuXHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKGNoaWxkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG5cdFx0Y2hpbGQuZm9yRWFjaCgoc3ViQ2hpbGQpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgYWdncmVnYXRpb25OYW1lLCBzdWJDaGlsZCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZEtleSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgY2hpbGRLZXksIGNoaWxkW2NoaWxkS2V5XSk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBpc0FDb250cm9sID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdHlwZW9mIENvbnRyb2wgfCBGdW5jdGlvbik6IGNoaWxkcmVuIGlzIHR5cGVvZiBDb250cm9sIHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5jb25zdCBGTF9ERUxFR0FURSA9IFwiZmw6ZGVsZWdhdGVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IENPUkVfUkVRVUlSRSA9IFwiY29yZTpyZXF1aXJlXCI7XG5jb25zdCBMT0dfU09VUkNFUEFUSCA9IFwibG9nOnNvdXJjZVBhdGhcIjtcbmNvbnN0IENVU1RPTV9MT0FEVkFMVUUgPSBcImN1c3RvbURhdGE6bG9hZFZhbHVlXCI7XG5jb25zdCBDVVNUT01fVVJMID0gXCJjdXN0b21EYXRhOnVybFwiO1xuXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShcblx0Y2hpbGRyZW5PYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRuYW1lc3BhY2VBbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpbGQgaXNcblx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBzdHJpbmdbXSA9IFtdO1xuXHRPYmplY3Qua2V5cyhjaGlsZHJlbk9iamVjdCkuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRjb25zdCBjaGlsZFZhbHVlID0gY2hpbGRyZW5PYmplY3Rbc3ViUHJvcE5hbWVdO1xuXHRcdGlmIChjaGlsZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZFZhbHVlKSkge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChgPCR7c3ViUHJvcE5hbWV9PmApO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRyZW5PYmplY3RFbGVtZW50IG9mIGNoaWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3RFbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuLnB1c2goYDwvJHtzdWJQcm9wTmFtZX0+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGEgdmFsdWUgaXQgbmVlZHMgdG8gYmUgc2VyaWFsaXplZCBhcyBhIGNoaWxkcmVuXG5cdFx0XHRcdFx0Ly8gPG15T2JqZWN0UHJvcCBwcm9wMT0neHh4JywgcHJvcDI9J3h4dCcvPlxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWVzcGFjZUFsaWFzLCBzdWJQcm9wTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2UgaXQncyBwYXJ0IG9mIHRoZSBtYWluIG9iamVjdCBqdXN0IGFzIGFub3RoZXIgcHJvcGVydHlcblx0XHRcdFx0YWdncmVnYXRpb25Qcm9wZXJ0aWVzLnB1c2goYCR7c3ViUHJvcE5hbWV9PScke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNoaWxkVmFsdWUudG9TdHJpbmcoKSl9J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgbmFtZXNwYWNlZFByb3BlcnR5ID0gbmFtZXNwYWNlQWxpYXMgPyBgJHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9YCA6IHByb3BlcnR5TmFtZTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VkUHJvcGVydHl9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcIlxcblwiKX08LyR7bmFtZXNwYWNlZFByb3BlcnR5fT5gO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllczxUPihcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFQcm9wZXJ0aWVzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXSxcblx0aXNDb250cm9sOiBib29sZWFuXG4pOiB2b2lkIHtcblx0T2JqZWN0LmtleXMobWV0YWRhdGFQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkgJiYgbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gQ09SRV9SRVFVSVJFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IEZMX0RFTEVHQVRFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Zmw9XCJzYXAudWkuZmxcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gRFRfREVTSUdOVElNRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmR0PVwic2FwLnVpLmR0XCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IExPR19TT1VSQ0VQQVRIKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6bG9nPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiYCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDVVNUT01fVVJMIHx8IHByb3BlcnR5TmFtZSA9PT0gQ1VTVE9NX0xPQURWQUxVRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChtZXRhZGF0YVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlID09PSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHsocHJvcGVydHlWYWx1ZSBhcyBDb250ZXh0KS5nZXRQYXRoKCl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZUV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkpfSdgKTtcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlWzBdID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZVswXSA6IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pO1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7b3V0VmFsdWV9J2ApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHByb3BlcnR5VmFsdWUuZXZlcnkoKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eVZhbHVlLmpvaW4oXCIgXCIpXG5cdFx0XHRcdFx0XHRcdDogSlNPTi5zdHJpbmdpZnkocHJvcGVydHlWYWx1ZSk7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtvdXRWYWx1ZX0nYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ29udHJvbCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHVuZGVmaW5lZCwgcHJvcGVydHlOYW1lKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3AgPSBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wLnRvU3RyaW5nKCkpfSdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bVNldHRpbmdzLmNoaWxkcmVuPy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmXG5cdFx0XHRPYmplY3Qua2V5cygobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gPz8ge30pLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdC8vIE9iamVjdCAvIEFycmF5IHByb3BlcnRpZXMgYXJlIHBhcnQgb2YgdGhlIGBjaGlsZHJlbmAgYWdncmVnYXRpb24gYW5kIGFzIHN1Y2ggc3RpbGwgbmVlZCB0byBiZSBwcm9jZXNzZWQgYXMgcHJvcGVydGllc1xuXHRcdFx0Y29uc3QgY2hpbGRyZW5PYmplY3QgPSAobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZHJlbk9iamVjdCwgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnR5TmFtZSkpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIG1ldGFkYXRhRXZlbnRzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHR9XG5cdD5cbik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGFFdmVudHNbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBjb21tYW5kO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA/PyBcImN1c3RvbURhdGFcIiwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkS2V5cyA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4pO1xuXHRsZXQgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdGlmIChhZ2dyZWdhdGlvbkNoaWxkS2V5cy5sZW5ndGggPT09IDEgJiYgYWdncmVnYXRpb25DaGlsZEtleXNbMF0gPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHR3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSB0cnVlO1xuXHR9XG5cdE9iamVjdC5rZXlzKG1ldGFkYXRhQWdncmVnYXRpb25zKS5mb3JFYWNoKChhZ2dyZWdhdGlvbk5hbWUpID0+IHtcblx0XHRpZiAoYWdncmVnYXRpb25DaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25OYW1lID09PSBkZWZhdWx0QWdncmVnYXRpb25OYW1lICYmIHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRhZ2dyZWdhdGlvblN0cmluZy5wdXNoKGAke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goXG5cdFx0XHRcdFx0YDwke25hbWVzcGFjZUFsaWFzfToke2FnZ3JlZ2F0aW9uTmFtZX0+XG5cdFx0XHRcdFx0XHQke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1cblx0XHRcdFx0XHQ8LyR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYWdncmVnYXRpb25OYW1lKSAmJiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHthZ2dyZWdhdGlvbk5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdKX0nYCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBzb21lIGNhc2UgdGhlIGFnZ3JlZ2F0aW9uIGV4cGVjdCBhIHN0cmluZyB2YWx1ZSAobGlrZSBmb3IgdGhlIHRvb2x0aXApLCBpbiB0aGlzIGNhc2Ugd2Ugc2V0IGl0IGRpcmVjdGx5IGFzIGEgcHJvcGVydHlcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV19J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhZ2dyZWdhdGlvbkNoaWxkcmVuO1xufVxuXG5jb25zdCBqc3hYbWwgPSBmdW5jdGlvbiA8VD4oXG5cdHR5cGU6IHR5cGVvZiBDb250cm9sIHwgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSxcblx0bVNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHsga2V5Pzogc3RyaW5nOyBjaGlsZHJlbj86IFVJNUVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPiB9LFxuXHRrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0eG1sTmFtZXNwYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRvdmVycmlkZU5vZGVOYW1lPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRsZXQgbWV0YWRhdGE7XG5cdGxldCBtZXRhZGF0YVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHsgbmFtZT86IHN0cmluZzsgdHlwZT86IHN0cmluZyB9Pjtcblx0bGV0IG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU6IHN0cmluZyB9Pjtcblx0bGV0IGNvbnRyb2xOYW1lO1xuXHRsZXQgbWV0YWRhdGFBZ2dyZWdhdGlvbnM7XG5cdGxldCBkZWZhdWx0QWdncmVnYXRpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBpc0NvbnRyb2wgPSBmYWxzZTtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCk7XG5cdFx0Y29udHJvbE5hbWUgPSBtZXRhZGF0YS5nZXROYW1lKCk7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0XHRkZWZhdWx0QWdncmVnYXRpb25OYW1lID0gbWV0YWRhdGEuZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSgpO1xuXHRcdGlzQ29udHJvbCA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0bWV0YWRhdGEgPSB0eXBlLm1ldGFkYXRhO1xuXHRcdG1ldGFkYXRhUHJvcGVydGllcyA9IG1ldGFkYXRhLnByb3BlcnRpZXM7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSB7IC4uLnsgZGVwZW5kZW50czoge30sIGN1c3RvbURhdGE6IHt9IH0sIC4uLm1ldGFkYXRhLmFnZ3JlZ2F0aW9ucyB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0ge307XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wiYmluZGluZ1wiXSA9IHsgbmFtZTogXCJiaW5kaW5nXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0RUX0RFU0lHTlRJTUVdID0geyBuYW1lOiBEVF9ERVNJR05USU1FIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDT1JFX1JFUVVJUkVdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0xPR19TT1VSQ0VQQVRIXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9MT0FEVkFMVUVdID0geyBuYW1lOiBDVVNUT01fTE9BRFZBTFVFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDVVNUT01fVVJMXSA9IHsgbmFtZTogQ1VTVE9NX1VSTCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpmbFwiXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6ZHRcIl0gPSB7IG5hbWU6IERUX0RFU0lHTlRJTUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6Y29yZVwiXSA9IHsgbmFtZTogQ09SRV9SRVFVSVJFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmxvZ1wiXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0aWYgKGNvbnRyb2xOYW1lID09PSBcInNhcC51aS5jb3JlLkZyYWdtZW50XCIpIHtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXNbXCJmcmFnbWVudE5hbWVcIl0gPSB7IG5hbWU6IFwiZnJhZ21lbnROYW1lXCIgfTtcblx0fVxuXHRjb25zdCBuYW1lc3BhY2UgPSBuYW1lc1NwbGl0LnNsaWNlKDAsIC0xKTtcblx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0aWYgKHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildKSB7XG5cdFx0bmFtZXNwYWNlQWxpYXMgPSB4bWxOYW1lc3BhY2VNYXBbbmFtZXNwYWNlLmpvaW4oXCIuXCIpXTtcblx0fVxuXHRsZXQgdGFnTmFtZSA9IGAke25hbWVzcGFjZUFsaWFzfToke25hbWV9YDtcblx0Y29uc3QgcHJvcGVydGllc1N0cmluZzogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdID0gW107XG5cdHByb2Nlc3NDb21tYW5kKG1TZXR0aW5ncywgbWV0YWRhdGFFdmVudHMpO1xuXHRwcm9jZXNzUHJvcGVydGllcyhtU2V0dGluZ3MsIG1ldGFkYXRhUHJvcGVydGllcywgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nLCBpc0NvbnRyb2wpO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zKG1TZXR0aW5ncywgbWV0YWRhdGFBZ2dyZWdhdGlvbnMsIG5hbWVzcGFjZUFsaWFzLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdGlmIChvdmVycmlkZU5vZGVOYW1lKSB7XG5cdFx0dGFnTmFtZSA9IG92ZXJyaWRlTm9kZU5hbWU7XG5cdH1cblx0cmV0dXJuIGA8JHt0YWdOYW1lfSB4bWxuczoke25hbWVzcGFjZUFsaWFzfT1cIiR7bmFtZXNwYWNlLmpvaW4oXCIuXCIpfVwiICR7cHJvcGVydGllc1N0cmluZy5qb2luKFwiIFwiKX0+JHthZ2dyZWdhdGlvblN0cmluZy5qb2luKFxuXHRcdFwiXCJcblx0KX08LyR7dGFnTmFtZX0+YDtcbn07XG5leHBvcnQgZGVmYXVsdCBqc3hYbWw7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBUUEsU0FBU0EsMEJBQTBCLENBQ2xDQyxVQUF1RCxFQUNMO0lBQ2xELE9BQU8sQ0FBQ0EsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQXdDQyxLQUFLLE1BQUtDLFNBQVM7RUFDOUU7RUFFQSxNQUFNQyxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJLENB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
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
|
|
2
|
+
import { compileExpression } from "sap/fe/base/BindingToolkit";
|
|
1
3
|
import type { ControlProperties, NonControlProperties } from "sap/fe/base/jsx-runtime/jsx";
|
|
2
4
|
import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
|
|
3
|
-
import { isBindingToolkitExpression } from "sap/fe/core/helpers/BindingToolkit";
|
|
4
5
|
import type Control from "sap/ui/core/Control";
|
|
5
6
|
import type UI5Element from "sap/ui/core/Element";
|
|
6
7
|
import type Context from "sap/ui/model/Context";
|
|
7
8
|
|
|
9
|
+
function isBindingToolkitExpression(
|
|
10
|
+
expression: BindingToolkitExpression<unknown> | unknown
|
|
11
|
+
): expression is BindingToolkitExpression<unknown> {
|
|
12
|
+
return (expression as BindingToolkitExpression<unknown>)?._type !== undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
8
15
|
const writeChildren = function (val: string | string[]): string {
|
|
9
16
|
if (Array.isArray(val)) {
|
|
10
17
|
return val.join("");
|
|
@@ -54,12 +61,17 @@ const isAControl = function (children?: typeof Control | Function): children is
|
|
|
54
61
|
};
|
|
55
62
|
|
|
56
63
|
const FL_DELEGATE = "fl:delegate";
|
|
64
|
+
const DT_DESIGNTIME = "dt:designtime";
|
|
57
65
|
const CORE_REQUIRE = "core:require";
|
|
58
66
|
const LOG_SOURCEPATH = "log:sourcePath";
|
|
59
67
|
const CUSTOM_LOADVALUE = "customData:loadValue";
|
|
60
68
|
const CUSTOM_URL = "customData:url";
|
|
61
69
|
|
|
62
|
-
function processObjectPropertyValue(
|
|
70
|
+
function processObjectPropertyValue(
|
|
71
|
+
childrenObject: Record<string, unknown>,
|
|
72
|
+
namespaceAlias: string | undefined,
|
|
73
|
+
propertyName: string
|
|
74
|
+
): string {
|
|
63
75
|
// This is called when the child is
|
|
64
76
|
const aggregationProperties: string[] = [];
|
|
65
77
|
const aggregationChildren: string[] = [];
|
|
@@ -67,18 +79,30 @@ function processObjectPropertyValue(childrenObject: Record<string, unknown>, nam
|
|
|
67
79
|
const childValue = childrenObject[subPropName];
|
|
68
80
|
if (childValue !== undefined) {
|
|
69
81
|
if (typeof childValue === "object") {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
82
|
+
if (Array.isArray(childValue)) {
|
|
83
|
+
aggregationChildren.push(`<${subPropName}>`);
|
|
84
|
+
for (const childrenObjectElement of childValue) {
|
|
85
|
+
aggregationChildren.push(
|
|
86
|
+
processObjectPropertyValue(childrenObjectElement as Record<string, unknown>, namespaceAlias, subPropName)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
aggregationChildren.push(`</${subPropName}>`);
|
|
90
|
+
} else {
|
|
91
|
+
// if the property is a value it needs to be serialized as a children
|
|
92
|
+
// <myObjectProp prop1='xxx', prop2='xxt'/>
|
|
93
|
+
aggregationChildren.push(
|
|
94
|
+
processObjectPropertyValue(childValue as Record<string, unknown>, namespaceAlias, subPropName)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
73
97
|
} else {
|
|
74
98
|
// Otherwise it's part of the main object just as another property
|
|
75
99
|
aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
|
|
76
100
|
}
|
|
77
101
|
}
|
|
78
102
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
)}
|
|
103
|
+
|
|
104
|
+
const namespacedProperty = namespaceAlias ? `${namespaceAlias}:${propertyName}` : propertyName;
|
|
105
|
+
return `<${namespacedProperty} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespacedProperty}>`;
|
|
82
106
|
}
|
|
83
107
|
|
|
84
108
|
function processProperties<T>(
|
|
@@ -92,7 +116,8 @@ function processProperties<T>(
|
|
|
92
116
|
>,
|
|
93
117
|
namespaceAlias: string,
|
|
94
118
|
propertiesString: string[],
|
|
95
|
-
aggregationString: string[]
|
|
119
|
+
aggregationString: string[],
|
|
120
|
+
isControl: boolean
|
|
96
121
|
): void {
|
|
97
122
|
Object.keys(metadataProperties).forEach((propertyName) => {
|
|
98
123
|
if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
|
|
@@ -100,6 +125,12 @@ function processProperties<T>(
|
|
|
100
125
|
if (propertyName === CORE_REQUIRE) {
|
|
101
126
|
propertiesString.push(`xmlns:core="sap.ui.core"`);
|
|
102
127
|
}
|
|
128
|
+
if (propertyName === FL_DELEGATE) {
|
|
129
|
+
propertiesString.push(`xmlns:fl="sap.ui.fl"`);
|
|
130
|
+
}
|
|
131
|
+
if (propertyName === DT_DESIGNTIME) {
|
|
132
|
+
propertiesString.push(`xmlns:dt="sap.ui.dt"`);
|
|
133
|
+
}
|
|
103
134
|
if (propertyName === LOG_SOURCEPATH) {
|
|
104
135
|
propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
105
136
|
}
|
|
@@ -109,23 +140,22 @@ function processProperties<T>(
|
|
|
109
140
|
if (propertyValue && typeof propertyValue === "object") {
|
|
110
141
|
if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
|
|
111
142
|
propertiesString.push(`${propertyName}='${(propertyValue as Context).getPath()}'`);
|
|
112
|
-
} else if (isBindingToolkitExpression(propertyValue)
|
|
113
|
-
propertiesString.push(`${propertyName}='${
|
|
143
|
+
} else if (isBindingToolkitExpression(propertyValue)) {
|
|
144
|
+
propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(compileExpression(propertyValue))}'`);
|
|
114
145
|
} else if (Array.isArray(propertyValue)) {
|
|
115
146
|
if (propertyValue.length === 1) {
|
|
116
|
-
|
|
147
|
+
const outValue = typeof propertyValue[0] === "string" ? propertyValue[0] : JSON.stringify(propertyValue[0]);
|
|
148
|
+
propertiesString.push(`${propertyName}='${outValue}'`);
|
|
117
149
|
} else {
|
|
118
|
-
|
|
150
|
+
const outValue = propertyValue.every((val) => typeof val === "string")
|
|
151
|
+
? propertyValue.join(" ")
|
|
152
|
+
: JSON.stringify(propertyValue);
|
|
153
|
+
propertiesString.push(`${propertyName}='${outValue}'`);
|
|
119
154
|
}
|
|
155
|
+
} else if (isControl) {
|
|
156
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
120
157
|
} else {
|
|
121
|
-
|
|
122
|
-
const propertyValueObj = propertyValue as Record<string, string>;
|
|
123
|
-
Object.keys(propertyValueObj).forEach((subPropName) => {
|
|
124
|
-
if (propertyValueObj[subPropName] !== undefined) {
|
|
125
|
-
complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
|
|
158
|
+
aggregationString.push(processObjectPropertyValue(propertyValue as Record<string, string>, undefined, propertyName));
|
|
129
159
|
}
|
|
130
160
|
} else {
|
|
131
161
|
const prop = mSettings[propertyName] as string | boolean | number;
|
|
@@ -142,6 +172,35 @@ function processProperties<T>(
|
|
|
142
172
|
});
|
|
143
173
|
}
|
|
144
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Processes the command.
|
|
177
|
+
*
|
|
178
|
+
* Resolves the command set on the control via the intrinsic class attribute "jsx:command".
|
|
179
|
+
* If no command has been set or the targeted event doesn't exist, no configuration is set.
|
|
180
|
+
*
|
|
181
|
+
* @param settings Metadata of the control
|
|
182
|
+
* @param metadataEvents Settings of the control
|
|
183
|
+
*/
|
|
184
|
+
function processCommand(
|
|
185
|
+
settings: Record<string, unknown>,
|
|
186
|
+
metadataEvents: Record<
|
|
187
|
+
string,
|
|
188
|
+
{
|
|
189
|
+
name: string;
|
|
190
|
+
}
|
|
191
|
+
>
|
|
192
|
+
): void {
|
|
193
|
+
const commandProperty = settings["jsx:command"];
|
|
194
|
+
if (commandProperty) {
|
|
195
|
+
const [command, eventName] = (commandProperty as string).split("|");
|
|
196
|
+
const event = metadataEvents[eventName];
|
|
197
|
+
if (event && command.startsWith("cmd:")) {
|
|
198
|
+
settings[event.name] = command;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
delete settings["jsx:command"];
|
|
202
|
+
}
|
|
203
|
+
|
|
145
204
|
function processAggregations(
|
|
146
205
|
mSettings: Record<string, unknown>,
|
|
147
206
|
metadataAggregations: Record<string, object>,
|
|
@@ -190,20 +249,25 @@ const jsxXml = function <T>(
|
|
|
190
249
|
): string {
|
|
191
250
|
let metadata;
|
|
192
251
|
let metadataProperties: Record<string, { name?: string; type?: string }>;
|
|
252
|
+
let metadataEvents: Record<string, { name: string }>;
|
|
193
253
|
let controlName;
|
|
194
254
|
let metadataAggregations;
|
|
195
255
|
let defaultAggregationName: string | undefined;
|
|
256
|
+
let isControl = false;
|
|
196
257
|
if (isAControl(type)) {
|
|
197
258
|
metadata = type.getMetadata();
|
|
198
259
|
metadataProperties = metadata.getAllProperties();
|
|
199
260
|
metadataProperties = { ...metadataProperties, ...metadata.getAllEvents(), ...metadata.getAllAssociations() };
|
|
261
|
+
metadataEvents = metadata.getAllEvents();
|
|
200
262
|
controlName = metadata.getName();
|
|
201
263
|
metadataAggregations = metadata.getAllAggregations();
|
|
202
264
|
defaultAggregationName = metadata.getDefaultAggregationName();
|
|
265
|
+
isControl = true;
|
|
203
266
|
} else {
|
|
204
267
|
metadata = type.metadata;
|
|
205
268
|
metadataProperties = metadata.properties;
|
|
206
269
|
metadataAggregations = { ...{ dependents: {}, customData: {} }, ...metadata.aggregations };
|
|
270
|
+
metadataEvents = {};
|
|
207
271
|
defaultAggregationName = metadata.defaultAggregation;
|
|
208
272
|
controlName = metadata.namespace + "." + metadata.name;
|
|
209
273
|
}
|
|
@@ -214,12 +278,15 @@ const jsxXml = function <T>(
|
|
|
214
278
|
|
|
215
279
|
metadataProperties["class"] = { name: "class" };
|
|
216
280
|
metadataProperties["id"] = { name: "id" };
|
|
281
|
+
metadataProperties["binding"] = { name: "binding" };
|
|
217
282
|
metadataProperties[FL_DELEGATE] = { name: FL_DELEGATE };
|
|
283
|
+
metadataProperties[DT_DESIGNTIME] = { name: DT_DESIGNTIME };
|
|
218
284
|
metadataProperties[CORE_REQUIRE] = { name: CORE_REQUIRE };
|
|
219
285
|
metadataProperties[LOG_SOURCEPATH] = { name: LOG_SOURCEPATH };
|
|
220
286
|
metadataProperties[CUSTOM_LOADVALUE] = { name: CUSTOM_LOADVALUE };
|
|
221
287
|
metadataProperties[CUSTOM_URL] = { name: CUSTOM_URL };
|
|
222
288
|
metadataProperties["xmlns:fl"] = { name: FL_DELEGATE };
|
|
289
|
+
metadataProperties["xmlns:dt"] = { name: DT_DESIGNTIME };
|
|
223
290
|
metadataProperties["xmlns:core"] = { name: CORE_REQUIRE };
|
|
224
291
|
metadataProperties["xmlns:log"] = { name: LOG_SOURCEPATH };
|
|
225
292
|
if (controlName === "sap.ui.core.Fragment") {
|
|
@@ -234,7 +301,8 @@ const jsxXml = function <T>(
|
|
|
234
301
|
let tagName = `${namespaceAlias}:${name}`;
|
|
235
302
|
const propertiesString: string[] = [];
|
|
236
303
|
const aggregationString: string[] = [];
|
|
237
|
-
|
|
304
|
+
processCommand(mSettings, metadataEvents);
|
|
305
|
+
processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl);
|
|
238
306
|
processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
|
|
239
307
|
if (overrideNodeName) {
|
|
240
308
|
tagName = overrideNodeName;
|
|
@@ -22,7 +22,7 @@ sap.ui.define(["sap/ui/core/Lib"], function (Library) {
|
|
|
22
22
|
controls: [],
|
|
23
23
|
elements: [],
|
|
24
24
|
// eslint-disable-next-line no-template-curly-in-string
|
|
25
|
-
version: "1.
|
|
25
|
+
version: "1.126.1",
|
|
26
26
|
noLibraryCSS: true
|
|
27
27
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
28
|
});
|