@sapui5/sap.fe.base 1.131.0 → 1.133.0
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/BindingToolkit.js +51 -50
- package/src/sap/fe/base/BindingToolkit.ts +21 -4
- package/src/sap/fe/base/BuildingBlockBase.js +18 -27
- package/src/sap/fe/base/BuildingBlockBase.ts +1 -1
- package/src/sap/fe/base/ClassSupport.js +135 -91
- package/src/sap/fe/base/ClassSupport.ts +150 -76
- package/src/sap/fe/base/EventDelegateHook.js +6 -7
- package/src/sap/fe/base/HookSupport.js +44 -14
- package/src/sap/fe/base/HookSupport.ts +52 -14
- package/src/sap/fe/base/jsx-runtime/ViewLoader.js +9 -13
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +100 -42
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +112 -29
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +7 -10
- package/src/sap/fe/base/library.js +1 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import deepClone from "sap/base/util/deepClone";
|
|
1
2
|
import type { ExtensionOverrideExecution } from "sap/fe/base/ClassSupport";
|
|
2
3
|
import type Controller from "sap/ui/core/mvc/Controller";
|
|
3
4
|
import type XMLView from "sap/ui/core/mvc/XMLView";
|
|
4
|
-
|
|
5
5
|
/**
|
|
6
6
|
* This type is to be extended with all controller extensions and methods that are hookable.
|
|
7
7
|
*/
|
|
8
8
|
type HookableControllerExtensions = {
|
|
9
9
|
editFlow: {
|
|
10
|
+
inlineEditEnd: true;
|
|
11
|
+
inlineEditStart: true;
|
|
10
12
|
onAfterSave: true;
|
|
11
13
|
onBeforeSave: true;
|
|
12
14
|
};
|
|
@@ -26,7 +28,7 @@ type HandlerConfiguration<CExtName extends keyof HookableControllerExtensions> =
|
|
|
26
28
|
method: keyof HookableControllerExtensions[CExtName];
|
|
27
29
|
};
|
|
28
30
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
-
type HandlerRegistration = HandlerConfiguration<any> & { targetMethod: string };
|
|
31
|
+
type HandlerRegistration = HandlerConfiguration<any> & { targetMethod: string; handlerFunction?: Function };
|
|
30
32
|
|
|
31
33
|
type FunctionMap = {
|
|
32
34
|
[key: string]: Function;
|
|
@@ -121,6 +123,8 @@ function isAlreadyRegistered(existingRegistrations: HandlerRegistration[], newRe
|
|
|
121
123
|
);
|
|
122
124
|
}
|
|
123
125
|
|
|
126
|
+
export const hooks = Symbol("hooks");
|
|
127
|
+
|
|
124
128
|
/**
|
|
125
129
|
* Registers a method as controller extension hook handler.
|
|
126
130
|
*
|
|
@@ -133,10 +137,15 @@ export function controllerExtensionHandler<CExtName extends keyof HookableContro
|
|
|
133
137
|
name: CExtName,
|
|
134
138
|
method: keyof HookableControllerExtensions[CExtName]
|
|
135
139
|
): MethodDecorator {
|
|
136
|
-
return function (target: { constructor: Function }, propertyKey: string) {
|
|
140
|
+
return function (target: { constructor: Function & { [hooks]?: HandlerRegistration[] } }, propertyKey: string) {
|
|
137
141
|
const newRegistration = { name, method: String(method), targetMethod: propertyKey };
|
|
138
142
|
const index = registeredInstances.indexOf(target.constructor);
|
|
139
|
-
|
|
143
|
+
if (!target.constructor[hooks]) {
|
|
144
|
+
Object.defineProperty(target.constructor, hooks, {
|
|
145
|
+
value: []
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
target.constructor[hooks]?.push(newRegistration);
|
|
140
149
|
// We need to check if this exact handler is already registered as handlers are registered statically (on the constructor)
|
|
141
150
|
if (index !== -1 && !isAlreadyRegistered(registeredHandlers[index], newRegistration)) {
|
|
142
151
|
registeredHandlers[index].push(newRegistration);
|
|
@@ -153,23 +162,52 @@ export function controllerExtensionHandler<CExtName extends keyof HookableContro
|
|
|
153
162
|
* @param target.constructor
|
|
154
163
|
* @param controller PageController instance to get the controller extensions instances from
|
|
155
164
|
*/
|
|
156
|
-
export function initControllerExtensionHookHandlers(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
165
|
+
export function initControllerExtensionHookHandlers(
|
|
166
|
+
target: { constructor: Function & { [hooks]?: HandlerRegistration[] } } & { [hooks]?: HandlerRegistration[] },
|
|
167
|
+
controller: Controller
|
|
168
|
+
): void {
|
|
169
|
+
if (target.constructor[hooks]) {
|
|
170
|
+
let registeredHooks = target.constructor[hooks];
|
|
171
|
+
target[hooks] = deepClone(registeredHooks);
|
|
172
|
+
registeredHooks = target[hooks]!;
|
|
160
173
|
const indexableTarget = target as unknown as FunctionMap;
|
|
161
|
-
|
|
162
|
-
for (const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
indexableController[registeredHandler.name][`attach${String(registeredHandler.method)}`](handlerFunction);
|
|
174
|
+
const indexableController = controller as unknown as DeepFunctionMap;
|
|
175
|
+
for (const registeredHook of registeredHooks) {
|
|
176
|
+
registeredHook.handlerFunction = indexableTarget[registeredHook.targetMethod].bind(target);
|
|
177
|
+
indexableController[registeredHook.name][`attach${String(registeredHook.method)}`](registeredHook.handlerFunction);
|
|
166
178
|
controller.getView()?.attachBeforeExit(() => {
|
|
167
|
-
indexableController[
|
|
179
|
+
indexableController[registeredHook.name][`detach${String(registeredHook.method)}`](registeredHook.handlerFunction);
|
|
168
180
|
});
|
|
169
181
|
}
|
|
170
182
|
}
|
|
171
183
|
}
|
|
172
184
|
|
|
185
|
+
export function removeControllerExtensionHookHandlers(
|
|
186
|
+
target: { constructor: Function & { [hooks]?: HandlerRegistration[] } } & { [hooks]?: HandlerRegistration[] },
|
|
187
|
+
controller: Controller
|
|
188
|
+
): void {
|
|
189
|
+
if (target[hooks]) {
|
|
190
|
+
const registeredHooks = target[hooks];
|
|
191
|
+
const indexableController = controller as unknown as DeepFunctionMap;
|
|
192
|
+
for (const registeredHook of registeredHooks) {
|
|
193
|
+
indexableController[registeredHook.name]?.[`detach${String(registeredHook.method)}`]?.(registeredHook.handlerFunction);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function propagateHookFromMixin(
|
|
199
|
+
target: Function & { [hooks]?: HandlerRegistration[] },
|
|
200
|
+
source: Function & { [hooks]?: HandlerRegistration[] }
|
|
201
|
+
): void {
|
|
202
|
+
if (source[hooks]) {
|
|
203
|
+
if (target[hooks]) {
|
|
204
|
+
target[hooks]!.splice(0, 0, ...source[hooks]);
|
|
205
|
+
} else {
|
|
206
|
+
Object.defineProperty(target, hooks, Object.getOwnPropertyDescriptor(source, hooks) || Object.create([]));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
173
211
|
export function xmlViewPreprocessor(source: object, _caller?: unknown, _settings?: object): void {
|
|
174
212
|
const sourceView = source as XMLView;
|
|
175
213
|
const controller = sourceView.getController() as Controller | undefined;
|
|
@@ -10,7 +10,6 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
|
|
|
10
10
|
var property = ClassSupport.property;
|
|
11
11
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
12
12
|
function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
|
|
13
|
-
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
|
14
13
|
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
|
|
15
14
|
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
16
15
|
function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
|
|
@@ -18,17 +17,17 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
|
|
|
18
17
|
let ViewLoader = (_dec = defineUI5Class("sap.fe.base.jsx-runtime.MDXViewLoader"), _dec2 = property({
|
|
19
18
|
type: "string"
|
|
20
19
|
}), _dec(_class = (_class2 = /*#__PURE__*/function (_View) {
|
|
21
|
-
_inheritsLoose(ViewLoader, _View);
|
|
22
20
|
function ViewLoader(mSettings) {
|
|
23
21
|
var _this;
|
|
24
22
|
delete mSettings.cache;
|
|
25
23
|
_this = _View.call(this, mSettings) || this;
|
|
26
|
-
_initializerDefineProperty(_this, "viewName", _descriptor,
|
|
24
|
+
_initializerDefineProperty(_this, "viewName", _descriptor, _this);
|
|
27
25
|
_this.sViewName = _this.viewName;
|
|
28
|
-
_this._oContainingView =
|
|
26
|
+
_this._oContainingView = _this;
|
|
29
27
|
return _this;
|
|
30
28
|
}
|
|
31
29
|
_exports = ViewLoader;
|
|
30
|
+
_inheritsLoose(ViewLoader, _View);
|
|
32
31
|
var _proto = ViewLoader.prototype;
|
|
33
32
|
_proto.loadDependency = async function loadDependency(name) {
|
|
34
33
|
return new Promise(resolve => {
|
|
@@ -38,11 +37,10 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
|
|
|
38
37
|
});
|
|
39
38
|
};
|
|
40
39
|
_proto.initViewSettings = async function initViewSettings(mSettings) {
|
|
41
|
-
var _getMetadata, _ref;
|
|
42
40
|
const viewConfig = this.getViewData();
|
|
43
41
|
const viewContent = viewConfig.viewContent || (await this.loadDependency(viewConfig._jsxViewName));
|
|
44
42
|
delete mSettings.cache;
|
|
45
|
-
if (viewContent
|
|
43
|
+
if (viewContent?.getMetadata?.().isA("sap.ui.core.mvc.Controller")) {
|
|
46
44
|
mSettings.controller = new viewContent(viewConfig);
|
|
47
45
|
} else {
|
|
48
46
|
this.viewContentFn = viewContent;
|
|
@@ -57,19 +55,17 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
|
|
|
57
55
|
// @ts-ignore
|
|
58
56
|
;
|
|
59
57
|
_proto.createContent = function createContent(oController) {
|
|
60
|
-
|
|
61
|
-
ViewLoader.preprocessorData = this === null || this === void 0 ? void 0 : (_mPreprocessors = this.mPreprocessors) === null || _mPreprocessors === void 0 ? void 0 : _mPreprocessors.xml;
|
|
58
|
+
ViewLoader.preprocessorData = this?.mPreprocessors?.xml;
|
|
62
59
|
ViewLoader.controller = oController;
|
|
63
60
|
const owner = Component.getOwnerComponentFor(this) ?? {
|
|
64
61
|
runAsOwner: fn => fn()
|
|
65
62
|
};
|
|
66
63
|
return owner.runAsOwner(() => {
|
|
67
64
|
return ManagedObject.runWithPreprocessors(() => {
|
|
68
|
-
var _this$viewContentFn;
|
|
69
65
|
if (oController && oController.render) {
|
|
70
66
|
return oController.render();
|
|
71
67
|
}
|
|
72
|
-
return
|
|
68
|
+
return this.viewContentFn?.();
|
|
73
69
|
}, {
|
|
74
70
|
id: sId => {
|
|
75
71
|
return this.createId(sId);
|
|
@@ -81,13 +77,13 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
|
|
|
81
77
|
});
|
|
82
78
|
};
|
|
83
79
|
return ViewLoader;
|
|
84
|
-
}(View),
|
|
80
|
+
}(View), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewName", [_dec2], {
|
|
85
81
|
configurable: true,
|
|
86
82
|
enumerable: true,
|
|
87
83
|
writable: true,
|
|
88
84
|
initializer: null
|
|
89
|
-
})
|
|
85
|
+
}), _class2)) || _class);
|
|
90
86
|
_exports = ViewLoader;
|
|
91
87
|
return _exports;
|
|
92
88
|
}, false);
|
|
93
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaWV3TG9hZGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJwcm9wZXJ0eSIsInR5cGUiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX1ZpZXciLCJtU2V0dGluZ3MiLCJfdGhpcyIsImNhY2hlIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJzVmlld05hbWUiLCJ2aWV3TmFtZSIsIl9vQ29udGFpbmluZ1ZpZXciLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwibG9hZERlcGVuZGVuY3kiLCJuYW1lIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJNRFhDb250ZW50IiwiaW5pdFZpZXdTZXR0aW5ncyIsInZpZXdDb25maWciLCJnZXRWaWV3RGF0YSIsInZpZXdDb250ZW50IiwiX2pzeFZpZXdOYW1lIiwiZ2V0TWV0YWRhdGEiLCJpc0EiLCJjb250cm9sbGVyIiwidmlld0NvbnRlbnRGbiIsImdldENvbnRyb2xsZXJOYW1lIiwidmlld0RhdGEiLCJjb250cm9sbGVyTmFtZSIsImNyZWF0ZUNvbnRlbnQiLCJvQ29udHJvbGxlciIsInByZXByb2Nlc3NvckRhdGEiLCJtUHJlcHJvY2Vzc29ycyIsInhtbCIsIm93bmVyIiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJydW5Bc093bmVyIiwiZm4iLCJNYW5hZ2VkT2JqZWN0IiwicnVuV2l0aFByZXByb2Nlc3NvcnMiLCJyZW5kZXIiLCJpZCIsInNJZCIsImNyZWF0ZUlkIiwic2V0dGluZ3MiLCJWaWV3IiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3TG9hZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5vbkFic3RyYWN0Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgcHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxudHlwZSBKU1hWaWV3Q29udHJvbGxlciA9IENvbnRyb2xsZXIgJiB7IHJlbmRlcj86ICgpID0+IENvbnRyb2wgfTtcbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLmpzeC1ydW50aW1lLk1EWFZpZXdMb2FkZXJcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdMb2FkZXIgZXh0ZW5kcyBWaWV3IHtcblx0c3RhdGljIHByZXByb2Nlc3NvckRhdGE/OiBYTUxQcmVwcm9jZXNzb3JDb250ZXh0O1xuXG5cdHN0YXRpYyBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0dmlld05hbWUhOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudD86IENvbnRyb2w7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudEZuPzogRnVuY3Rpb247XG5cblx0cHVibGljIHNWaWV3TmFtZTogc3RyaW5nO1xuXG5cdHB1YmxpYyBfb0NvbnRhaW5pbmdWaWV3OiB0aGlzO1xuXG5cdGNvbnN0cnVjdG9yKG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdHN1cGVyKG1TZXR0aW5ncyk7XG5cdFx0dGhpcy5zVmlld05hbWUgPSB0aGlzLnZpZXdOYW1lO1xuXHRcdHRoaXMuX29Db250YWluaW5nVmlldyA9IHRoaXM7XG5cdH1cblxuXHRhc3luYyBsb2FkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHNhcC51aS5yZXF1aXJlKFtuYW1lXSwgKE1EWENvbnRlbnQ6IEZ1bmN0aW9uKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJlc29sdmUoTURYQ29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGluaXRWaWV3U2V0dGluZ3MobVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHZpZXdDb25maWcgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyB2aWV3Q29udGVudD86IENvbnRyb2w7IF9qc3hWaWV3TmFtZTogc3RyaW5nIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCB2aWV3Q29udGVudCA9IHZpZXdDb25maWcudmlld0NvbnRlbnQgfHwgKChhd2FpdCB0aGlzLmxvYWREZXBlbmRlbmN5KHZpZXdDb25maWcuX2pzeFZpZXdOYW1lKSkgYXMgQ29udHJvbCB8IEZ1bmN0aW9uKTtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdGlmICgodmlld0NvbnRlbnQgYXMgQ29udHJvbCk/LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlclwiKSkge1xuXHRcdFx0bVNldHRpbmdzLmNvbnRyb2xsZXIgPSBuZXcgKHZpZXdDb250ZW50IGFzIE5vbkFic3RyYWN0Q2xhc3M8Q29udHJvbD4pKHZpZXdDb25maWcgYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudmlld0NvbnRlbnRGbiA9IHZpZXdDb250ZW50IGFzIEZ1bmN0aW9uO1xuXHRcdH1cblx0fVxuXG5cdGdldENvbnRyb2xsZXJOYW1lKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyBjb250cm9sbGVyTmFtZTogc3RyaW5nIH07XG5cdFx0cmV0dXJuIHZpZXdEYXRhLmNvbnRyb2xsZXJOYW1lO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHQvLyBAdHMtaWdub3JlXG5cdGNyZWF0ZUNvbnRlbnQob0NvbnRyb2xsZXI6IEpTWFZpZXdDb250cm9sbGVyKTogQ29udHJvbCB7XG5cdFx0Vmlld0xvYWRlci5wcmVwcm9jZXNzb3JEYXRhID0gKHRoaXMgYXMgeyBtUHJlcHJvY2Vzc29ycz86IHsgeG1sPzogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCB9IH0pPy5tUHJlcHJvY2Vzc29ycz8ueG1sO1xuXHRcdFZpZXdMb2FkZXIuY29udHJvbGxlciA9IG9Db250cm9sbGVyO1xuXG5cdFx0Y29uc3Qgb3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcykhID8/IHsgcnVuQXNPd25lcjogKGZuOiBGdW5jdGlvbikgPT4gZm4oKSB9O1xuXHRcdHJldHVybiBvd25lci5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdHJldHVybiAoTWFuYWdlZE9iamVjdCBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnJlbmRlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnJlbmRlcigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy52aWV3Q29udGVudEZuPy4oKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlkOiAoc0lkOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUlkKHNJZCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb250cm9sbGVyID0gb0NvbnRyb2xsZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7TUFhcUJBLFVBQVUsSUFBQUMsSUFBQSxHQUQ5QkMsY0FBYyxDQUFDLHVDQUF1QyxDQUFDLEVBQUFDLEtBQUEsR0FNdERDLFFBQVEsQ0FBQztJQUFFQyxJQUFJLEVBQUU7RUFBUyxDQUFDLENBQUMsRUFBQUosSUFBQSxDQUFBSyxNQUFBLElBQUFDLE9BQUEsMEJBQUFDLEtBQUE7SUFXN0IsU0FBQVIsV0FBWVMsU0FBa0MsRUFBRTtNQUFBLElBQUFDLEtBQUE7TUFDL0MsT0FBT0QsU0FBUyxDQUFDRSxLQUFLO01BQ3RCRCxLQUFBLEdBQUFGLEtBQUEsQ0FBQUksSUFBQSxPQUFNSCxTQUFTLENBQUM7TUFBQ0ksMEJBQUEsQ0FBQUgsS0FBQSxjQUFBSSxXQUFBLEVBQUFKLEtBQUE7TUFDakJBLEtBQUEsQ0FBS0ssU0FBUyxHQUFHTCxL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
|
|
@@ -2,7 +2,7 @@
|
|
|
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/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/ui/base/DataType", "sap/ui/base/ManagedObject", "sap/ui/core/mvc/EventHandlerResolver"], function (Log, BindingToolkit, Text, DataType, ManagedObject, EventHandlerResolver) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/ui/base/BindingParser", "sap/ui/base/DataType", "sap/ui/base/ManagedObject", "sap/ui/core/mvc/EventHandlerResolver"], function (Log, BindingToolkit, Text, BindingParser, DataType, ManagedObject, EventHandlerResolver) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var bindingParser = ManagedObject.bindingParser;
|
|
@@ -36,11 +36,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
38
|
const isChildAnElement = function (children) {
|
|
39
|
-
|
|
40
|
-
return children === null || children === void 0 ? void 0 : (_isA = (_ref = children).isA) === null || _isA === void 0 ? void 0 : _isA.call(_ref, "sap.ui.core.Element");
|
|
39
|
+
return children?.isA?.("sap.ui.core.Element");
|
|
41
40
|
};
|
|
42
41
|
const isAControl = function (children) {
|
|
43
|
-
return !!
|
|
42
|
+
return !!children?.getMetadata;
|
|
44
43
|
};
|
|
45
44
|
function processAggregations(metadata, mSettings) {
|
|
46
45
|
const metadataAggregations = metadata.getAllAggregations();
|
|
@@ -53,9 +52,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
53
52
|
if (aggregationChildren[aggregationName] !== undefined) {
|
|
54
53
|
if (mSettings.hasOwnProperty(aggregationName)) {
|
|
55
54
|
if (typeof mSettings[aggregationName] === "string") {
|
|
56
|
-
mSettings[aggregationName]
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
const resultingParse = BindingParser.complexParser(mSettings[aggregationName]);
|
|
56
|
+
if (resultingParse) {
|
|
57
|
+
mSettings[aggregationName] = {
|
|
58
|
+
path: resultingParse.path,
|
|
59
|
+
model: resultingParse.model
|
|
60
|
+
};
|
|
61
|
+
} else {
|
|
62
|
+
mSettings[aggregationName] = {
|
|
63
|
+
path: mSettings[aggregationName]
|
|
64
|
+
};
|
|
65
|
+
}
|
|
59
66
|
}
|
|
60
67
|
if (typeof aggregationChildren[aggregationName] === "function") {
|
|
61
68
|
mSettings[aggregationName].factory = aggregationChildren[aggregationName];
|
|
@@ -69,6 +76,78 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
69
76
|
});
|
|
70
77
|
}
|
|
71
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Processes a binding toolkit expression property for function processProperties
|
|
81
|
+
*
|
|
82
|
+
* If the property is a constant, it compiles it as a constant. If the property is an aggregation,
|
|
83
|
+
* it compiles the expression as an object. Otherwise, it compiles the expression normally.
|
|
84
|
+
* @param settings The settings of the control
|
|
85
|
+
* @param settingsKey The key of the setting being processed
|
|
86
|
+
* @param bindingToolkitExpression The binding toolkit expression to process
|
|
87
|
+
* @param allProperties All properties of the control
|
|
88
|
+
*/
|
|
89
|
+
function processBindingToolkitExpression(settings, settingsKey, bindingToolkitExpression, allProperties) {
|
|
90
|
+
if (isConstant(bindingToolkitExpression)) {
|
|
91
|
+
settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
|
|
92
|
+
} else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
|
|
93
|
+
// Aggregation case - we need to compile the expression but as an object
|
|
94
|
+
if (isPathInModelExpression(bindingToolkitExpression)) {
|
|
95
|
+
settings[settingsKey] = {
|
|
96
|
+
path: bindingToolkitExpression.path,
|
|
97
|
+
model: bindingToolkitExpression.modelName
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
settings[settingsKey] = compileExpression(bindingToolkitExpression);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Processes a string property for function processProperties
|
|
107
|
+
*
|
|
108
|
+
* If the property is not a binding expression and does not match the expected format,
|
|
109
|
+
* it parses the value to provide the expected format. If the property is an event handler,
|
|
110
|
+
* it logs an error.
|
|
111
|
+
* @param settings The settings of the control
|
|
112
|
+
* @param settingsKey The key of the setting being processed
|
|
113
|
+
* @param value The string value to process
|
|
114
|
+
* @param allEvents All events of the control
|
|
115
|
+
* @param allProperties All properties of the control
|
|
116
|
+
* @param metadata Metadata of the control
|
|
117
|
+
*/
|
|
118
|
+
function processStringProperty(settings, settingsKey, value, allEvents, allProperties, metadata) {
|
|
119
|
+
if (!value.startsWith("{")) {
|
|
120
|
+
if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
|
|
121
|
+
Log.error(`Event handlers cannot be set as string in JSX, ${settingsKey} in ${metadata.getName()}`);
|
|
122
|
+
}
|
|
123
|
+
const propertyType = allProperties[settingsKey]?.getType?.();
|
|
124
|
+
if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
|
|
125
|
+
settings[settingsKey] = propertyType.parseValue(value);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
settings[settingsKey] = value;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Processes an object property for function processProperties.
|
|
134
|
+
*
|
|
135
|
+
* If the property is a promise, it adds it to the late properties map. If the property is a binding info holder,
|
|
136
|
+
* it sets the binding info to the settings.
|
|
137
|
+
* @param settings The settings of the control
|
|
138
|
+
* @param settingsKey The key of the setting being processed
|
|
139
|
+
* @param value The object value to process
|
|
140
|
+
* @param lateProperties A map of the control's late properties
|
|
141
|
+
*/
|
|
142
|
+
function processObjectProperty(settings, settingsKey, value, lateProperties) {
|
|
143
|
+
if (value.then) {
|
|
144
|
+
lateProperties[settingsKey] = value;
|
|
145
|
+
delete settings[settingsKey];
|
|
146
|
+
} else if (value.__bindingInfo) {
|
|
147
|
+
settings[settingsKey] = value.__bindingInfo;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
72
151
|
/**
|
|
73
152
|
* Processes the properties.
|
|
74
153
|
*
|
|
@@ -87,35 +166,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
87
166
|
for (settingsKey in settings) {
|
|
88
167
|
const value = settings[settingsKey];
|
|
89
168
|
if (isBindingToolkitExpression(value)) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (isPathInModelExpression(bindingToolkitExpression)) {
|
|
96
|
-
settings[settingsKey] = {
|
|
97
|
-
path: bindingToolkitExpression.path,
|
|
98
|
-
model: bindingToolkitExpression.modelName
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
} else {
|
|
102
|
-
settings[settingsKey] = compileExpression(bindingToolkitExpression);
|
|
103
|
-
}
|
|
104
|
-
} else if (value !== null && typeof value === "object" && value.then) {
|
|
105
|
-
lateProperties[settingsKey] = value;
|
|
106
|
-
delete settings[settingsKey];
|
|
107
|
-
} else if (typeof value === "string" && !value.startsWith("{")) {
|
|
108
|
-
var _allProperties$settin, _allProperties$settin2, _allProperties$settin3;
|
|
109
|
-
const propertyType = (_allProperties$settin = allProperties[settingsKey]) === null || _allProperties$settin === void 0 ? void 0 : (_allProperties$settin2 = (_allProperties$settin3 = _allProperties$settin).getType) === null || _allProperties$settin2 === void 0 ? void 0 : _allProperties$settin2.call(_allProperties$settin3);
|
|
110
|
-
if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
|
|
111
|
-
settings[settingsKey] = propertyType.parseValue(value);
|
|
112
|
-
}
|
|
113
|
-
} else if (typeof value === "object" && value.__bindingInfo) {
|
|
114
|
-
settings[settingsKey] = value.__bindingInfo;
|
|
169
|
+
processBindingToolkitExpression(settings, settingsKey, value, allProperties);
|
|
170
|
+
} else if (value !== null && typeof value === "object") {
|
|
171
|
+
processObjectProperty(settings, settingsKey, value, lateProperties);
|
|
172
|
+
} else if (typeof value === "string") {
|
|
173
|
+
processStringProperty(settings, settingsKey, value, allEvents, allProperties, metadata);
|
|
115
174
|
} else if (value === undefined) {
|
|
116
|
-
|
|
117
|
-
delete settings[settingsKey];
|
|
118
|
-
}
|
|
175
|
+
delete settings[settingsKey];
|
|
119
176
|
}
|
|
120
177
|
}
|
|
121
178
|
return lateProperties;
|
|
@@ -142,12 +199,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
142
199
|
}
|
|
143
200
|
const jsxControl = function (ControlType, settings, key, jsxContext) {
|
|
144
201
|
let targetControl;
|
|
145
|
-
if (ControlType
|
|
202
|
+
if (ControlType?.isFragment) {
|
|
146
203
|
targetControl = settings.children;
|
|
147
|
-
} else if (ControlType
|
|
148
|
-
var _runtimeBuildingBlock;
|
|
204
|
+
} else if (ControlType?.isRuntime) {
|
|
149
205
|
const runtimeBuildingBlock = new ControlType(settings);
|
|
150
|
-
targetControl =
|
|
206
|
+
targetControl = runtimeBuildingBlock.getContent?.(jsxContext.view, jsxContext.appComponent);
|
|
151
207
|
} else if (isAControl(ControlType)) {
|
|
152
208
|
const metadata = ControlType.getMetadata();
|
|
153
209
|
if (key !== undefined) {
|
|
@@ -192,10 +248,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
192
248
|
if (bindingInfo) {
|
|
193
249
|
targetControlInstance.bindElement({
|
|
194
250
|
model: bindingInfo.model ?? undefined,
|
|
195
|
-
path: bindingInfo.path
|
|
251
|
+
path: bindingInfo.path,
|
|
252
|
+
parameters: bindingInfo.parameters ?? undefined
|
|
196
253
|
});
|
|
254
|
+
} else {
|
|
255
|
+
targetControlInstance.bindElement(bindingDef);
|
|
197
256
|
}
|
|
198
|
-
targetControlInstance.bindElement(bindingDef);
|
|
199
257
|
} else {
|
|
200
258
|
// We consider it's an object
|
|
201
259
|
Object.keys(bindingDef).forEach(bindingDefKey => {
|
|
@@ -226,4 +284,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
226
284
|
};
|
|
227
285
|
return jsxControl;
|
|
228
286
|
}, false);
|
|
229
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsImFsbEV2ZW50cyIsImdldEFsbEV2ZW50cyIsImFsbFByb3BlcnRpZXMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwidmFsdWUiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJjb21waWxlQ29uc3RhbnQiLCJpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiIsIm1vZGVsIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbiIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbjIiLCJfYWxsUHJvcGVydGllcyRzZXR0aW4zIiwicHJvcGVydHlUeXBlIiwiZ2V0VHlwZSIsIkRhdGFUeXBlIiwiaW5jbHVkZXMiLCJnZXROYW1lIiwicGFyc2VWYWx1ZSIsIl9fYmluZGluZ0luZm8iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsIl9ydW50aW1lQnVpbGRpbmdCbG9jayIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0Y29tcGlsZUNvbnN0YW50LFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0aXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdGlzQ29uc3RhbnQsXG5cdGlzUGF0aEluTW9kZWxFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nSW5mb0hvbGRlciwgTm9uQWJzdHJhY3RDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIEpTWENvbnRleHQsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgZmFjdG9yeTogRnVuY3Rpb24gfSkuZmFjdG9yeSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbk5hbWVcblx0XHRcdFx0XHRdIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgdGVtcGxhdGU6IHN0cmluZyB8IFVJNUVsZW1lbnQgfSkudGVtcGxhdGUgPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV1bMF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBwcm9wZXJ0aWVzLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb24gd2UgbmVlZCB0byBjb21waWxlIGl0LlxuICogRWxzZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzIHN0cmluZyAoY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nIGJ5IGRlZmF1bHQgZXZlbiBpZiBpdCdzIGEgYm9vbGVhbiwgaW50LCBldGMuKSBhbmQgaXQgZG9lc24ndCBtYXRjaCB3aXRoIGV4cGVjdGVkXG4gKiBmb3JtYXQgdGhlIHZhbHVlIGlzIHBhcnNlZCB0byBwcm92aWRlIGV4cGVjdGVkIGZvcm1hdC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcmV0dXJucyBBIG1hcCBvZiBsYXRlIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIGF3YWl0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiB7XG5cdGxldCBzZXR0aW5nc0tleToga2V5b2YgdHlwZW9mIHNldHRpbmdzO1xuXHRjb25zdCBsYXRlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4gPSB7fTtcblx0Y29uc3QgYWxsRXZlbnRzID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCk7XG5cdGNvbnN0IGFsbFByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdGZvciAoc2V0dGluZ3NLZXkgaW4gc2V0dGluZ3MpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHRpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiA9IHZhbHVlO1xuXHRcdFx0aWYgKGlzQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKSkge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChhbGxQcm9wZXJ0aWVzLCBzZXR0aW5nc0tleSkpIHtcblx0XHRcdFx0Ly8gQWdncmVnYXRpb24gY2FzZSAtIHdlIG5lZWQgdG8gY29tcGlsZSB0aGUgZXhwcmVzc2lvbiBidXQgYXMgYW4gb2JqZWN0XG5cdFx0XHRcdGlmIChpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0geyBwYXRoOiBiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ucGF0aCwgbW9kZWw6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5tb2RlbE5hbWUgfTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gY29tcGlsZUV4cHJlc3Npb24oYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAodmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbikge1xuXHRcdFx0bGF0ZVByb3BlcnRpZXNbc2V0dGluZ3NLZXldID0gdmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPjtcblx0XHRcdGRlbGV0ZSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSAoYWxsUHJvcGVydGllc1tzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdFx0aWYgKHByb3BlcnR5VHlwZSAmJiBwcm9wZXJ0eVR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSAmJiBbXCJib29sZWFuXCIsIFwiaW50XCIsIFwiZmxvYXRcIl0uaW5jbHVkZXMocHJvcGVydHlUeXBlLmdldE5hbWUoKSkpIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gcHJvcGVydHlUeXBlLnBhcnNlVmFsdWUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBCaW5kaW5nSW5mb0hvbGRlcjx1bmtub3duPikuX19iaW5kaW5nSW5mbykge1xuXHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyPHVua25vd24+KS5fX2JpbmRpbmdJbmZvO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbEV2ZW50cywgc2V0dGluZ3NLZXkpKSB7XG5cdFx0XHRcdGRlbGV0ZSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBsYXRlUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNvbW1hbmQuXG4gKlxuICogUmVzb2x2ZXMgdGhlIGNvbW1hbmQgc2V0IG9uIHRoZSBjb250cm9sIHZpYSB0aGUgaW50cmluc2ljIGNsYXNzIGF0dHJpYnV0ZSBcImpzeDpjb21tYW5kXCIuXG4gKiBJZiBubyBjb21tYW5kIGhhcyBiZWVuIHNldCBvciB0aGUgdGFyZ2V0ZWQgZXZlbnQgZG9lc24ndCBleGlzdCwgbm8gY29uZmlndXJhdGlvbiBpcyBzZXQuXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBzZXR0aW5ncyBTZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29tbWFuZChtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgY29tbWFuZFByb3BlcnR5ID0gc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcblx0aWYgKGNvbW1hbmRQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IFtjb21tYW5kLCBldmVudE5hbWVdID0gKGNvbW1hbmRQcm9wZXJ0eSBhcyBzdHJpbmcpLnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCBldmVudCA9IG1ldGFkYXRhLmdldEFsbEV2ZW50cygpW2V2ZW50TmFtZV07XG5cdFx0aWYgKGV2ZW50ICYmIGNvbW1hbmQuc3RhcnRzV2l0aChcImNtZDpcIikpIHtcblx0XHRcdHNldHRpbmdzW2V2ZW50Lm5hbWVdID0gRXZlbnRIYW5kbGVyUmVzb2x2ZXIucmVzb2x2ZUV2ZW50SGFuZGxlcihjb21tYW5kKTtcblx0XHR9XG5cdH1cblx0ZGVsZXRlIHNldHRpbmdzW1wianN4OmNvbW1hbmRcIl07XG59XG5cbmNvbnN0IGpzeENvbnRyb2wgPSBmdW5jdGlvbiA8VCBleHRlbmRzIEVsZW1lbnQ+KFxuXHRDb250cm9sVHlwZTogTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB8IEZ1bmN0aW9uLFxuXHRzZXR0aW5nczogTm9uQ29udHJvbFByb3BlcnRpZXM8VD4gJiB7XG5cdFx0a2V5OiBzdHJpbmc7XG5cdFx0Y2hpbGRyZW4/OiBFbGVtZW50IHwgQ29udHJvbFByb3BlcnRpZXM8VD47XG5cdFx0cmVmPzogUmVmPFQ+O1xuXHRcdGJpbmRpbmc/OiBzdHJpbmc7XG5cdFx0Y2xhc3M/OiBzdHJpbmc7XG5cdFx0W0ZMX0RFTEVHQVRFXT86IHN0cmluZztcblx0XHRbRFRfREVTSUdOVElNRV0/OiBzdHJpbmc7XG5cdFx0W0NPUkVfUkVRVUlSRV0/OiBzdHJpbmc7XG5cdH0sXG5cdGtleTogc3RyaW5nLFxuXHRqc3hDb250ZXh0OiBKU1hDb250ZXh0XG4pOiBDb250cm9sIHwgQ29udHJvbFtdIHwgdW5kZWZpbmVkIHtcblx0bGV0IHRhcmdldENvbnRyb2w6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQ7XG5cblx0aWYgKChDb250cm9sVHlwZSBhcyB7IGlzRnJhZ21lbnQ/OiBib29sZWFuIH0pPy5pc0ZyYWdtZW50KSB7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2wgfCBDb250cm9sW107XG5cdH0gZWxzZSBpZiAoKENvbnRyb2xUeXBlIGFzIHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UpPy5pc1J1bnRpbWUpIHtcblx0XHRjb25zdCBydW50aW1lQnVpbGRpbmdCbG9jayA9IG5ldyAoQ29udHJvbFR5cGUgYXMgdHlwZW9mIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrKShzZXR0aW5ncyBhcyB1bmtub3duIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdHRhcmdldENvbnRyb2wgPSBydW50aW1lQnVpbGRpbmdCbG9jay5nZXRDb250ZW50Py4oanN4Q29udGV4dC52aWV3ISwganN4Q29udGV4dC5hcHBDb21wb25lbnQhKTtcblx0fSBlbHNlIGlmIChpc0FDb250cm9sKENvbnRyb2xUeXBlKSkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gQ29udHJvbFR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHNldHRpbmdzW1wia2V5XCJdID0ga2V5O1xuXHRcdH1cblx0XHRjb25zdCBsYXRlUHJvcGVydGllcyA9IHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc0NvbW1hbmQobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgY2xhc3NEZWYgPSBzZXR0aW5ncy5jbGFzcztcblx0XHRjb25zdCByZWZEZWYgPSBzZXR0aW5ncy5yZWY7XG5cdFx0Y29uc3QgYmluZGluZ0RlZiA9IHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0Y29uc3QgZmxEZWxlZ2F0ZSA9IHNldHRpbmdzW0ZMX0RFTEVHQVRFXTtcblx0XHRjb25zdCBkdERlc2lnbnRpbWUgPSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3MucmVmO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5jbGFzcztcblx0XHRkZWxldGUgc2V0dGluZ3MuYmluZGluZztcblx0XHRkZWxldGUgc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3NbQ09SRV9SRVFVSVJFXTsgLy8gQ29yZSByZXF1aXJlIGlzIG5vdCB1c2VmdWwgaW4gY29udHJvbCBtb2RlXG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbEluc3RhbmNlID0gbmV3IENvbnRyb2xUeXBlKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdGlmIChjbGFzc0RlZikge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmFkZFN0eWxlQ2xhc3MoY2xhc3NEZWYpO1xuXHRcdH1cblx0XHRpZiAocmVmRGVmKSB7XG5cdFx0XHRyZWZEZWYuc2V0Q3VycmVudCh0YXJnZXRDb250cm9sSW5zdGFuY2UgYXMgdW5rbm93biBhcyBUKTtcblx0XHR9XG5cdFx0Y29uc3QgY3VzdG9tU2V0dGluZ3MgPSB0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIikgPz8ge307XG5cdFx0aWYgKGZsRGVsZWdhdGUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdLmRlbGVnYXRlID0gZmxEZWxlZ2F0ZTtcblx0XHR9XG5cdFx0aWYgKGR0RGVzaWdudGltZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0uZGVzaWdudGltZSA9IGR0RGVzaWdudGltZTtcblx0XHR9XG5cdFx0aWYgKE9iamVjdC5rZXlzKGN1c3RvbVNldHRpbmdzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIiwgY3VzdG9tU2V0dGluZ3MpO1xuXHRcdH1cblxuXHRcdGlmIChiaW5kaW5nRGVmKSB7XG5cdFx0XHRpZiAodHlwZW9mIGJpbmRpbmdEZWYgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0luZm8gPSBiaW5kaW5nUGFyc2VyKGJpbmRpbmdEZWYpO1xuXHRcdFx0XHRpZiAoYmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLCBwYXRoOiBiaW5kaW5nSW5mby5wYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudChiaW5kaW5nRGVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGNvbnNpZGVyIGl0J3MgYW4gb2JqZWN0XG5cdFx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdEZWYpLmZvckVhY2goKGJpbmRpbmdEZWZLZXkpID0+IHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0RlZktleSwgcGF0aDogYmluZGluZ0RlZltiaW5kaW5nRGVmS2V5XSB9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGF0ZVByb3BlcnRpZXNLZXkgaW4gbGF0ZVByb3BlcnRpZXMpIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW2xhdGVQcm9wZXJ0aWVzS2V5XVxuXHRcdFx0XHQudGhlbigodmFsdWUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbEluc3RhbmNlLnNldFByb3BlcnR5KGxhdGVQcm9wZXJ0aWVzS2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENvdWxkbid0IHNldCBwcm9wZXJ0eSAke2xhdGVQcm9wZXJ0aWVzS2V5fSBvbiAke0NvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWAsIGVycm9yLCBcImpzeENvbnRyb2xcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBDb250cm9sVHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Y29uc3QgY29udHJvbFR5cGVGbiA9IENvbnRyb2xUeXBlO1xuXHRcdHRhcmdldENvbnRyb2wgPSBjb250cm9sVHlwZUZuKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldENvbnRyb2wgPSBuZXcgVGV4dCh7IHRleHQ6IFwiTWlzc2luZyBjb21wb25lbnQgXCIgKyAoQ29udHJvbFR5cGUgYXMgc3RyaW5nKSB9KTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRDb250cm9sO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganN4Q29udHJvbDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQXNCQSxNQUFNQSxXQUFXLEdBQUcsYUFBYTtFQUNqQyxNQUFNQyxZQUFZLEdBQUcsY0FBYztFQUNuQyxNQUFNQyxhQUFhLEdBQUcsZUFBZTtFQUNyQyxNQUFNQyxtQkFBbUIsR0FBRyxTQUFBQSxDQUMzQkMsbUJBQTRELEVBQzVEQyxlQUF1QixFQUN2QkMsS0FBMEMsRUFDbkM7SUFDUCxJQUFJQSxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLEtBQUtDLFNBQVMsSUFBSSxPQUFPRCxLQUFLLEtBQUssUUFBUSxFQUFFO01BQ3ZFO0lBQ0Q7SUFDQSxJQUFJLENBQUNGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsRUFBRTtNQUMxQ0QsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7SUFDMUM7SUFDQSxJQUFJRyxnQkFBZ0IsQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDNUJGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsQ0FBQ0ksSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDakQsQ0FBQyxNQUFNLElBQUlJLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTCxLQUFLLENBQUMsRUFBRTtNQUNoQ0EsS0FBSyxDQUFDTSxPQUFPLENBQUVDLFFBQVEsSUFBSztRQUMzQlYsbUJBQW1CLENBQUNDLG1CQUFtQixFQUFFQyxlQUFlLEVBQUVRLFFBQVEs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
|
|
287
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsImlzQSIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInJlc3VsdGluZ1BhcnNlIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJwYXRoIiwibW9kZWwiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwic2V0dGluZ3MiLCJzZXR0aW5nc0tleSIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImFsbFByb3BlcnRpZXMiLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwiY2FsbCIsImlzUGF0aEluTW9kZWxFeHByZXNzaW9uIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9jZXNzU3RyaW5nUHJvcGVydHkiLCJ2YWx1ZSIsImFsbEV2ZW50cyIsInN0YXJ0c1dpdGgiLCJMb2ciLCJlcnJvciIsImdldE5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJnZXRUeXBlIiwiRGF0YVR5cGUiLCJpbmNsdWRlcyIsInBhcnNlVmFsdWUiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHkiLCJsYXRlUHJvcGVydGllcyIsInRoZW4iLCJfX2JpbmRpbmdJbmZvIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJnZXRBbGxFdmVudHMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsInBhcmFtZXRlcnMiLCJiaW5kaW5nRGVmS2V5IiwibGF0ZVByb3BlcnRpZXNLZXkiLCJzZXRQcm9wZXJ0eSIsImNhdGNoIiwiY29udHJvbFR5cGVGbiIsIlRleHQiLCJ0ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtY29udHJvbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRjb21waWxlQ29uc3RhbnQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0aXNDb25zdGFudCxcblx0aXNQYXRoSW5Nb2RlbEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdJbmZvSG9sZGVyLCBOb25BYnN0cmFjdENsYXNzIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sUHJvcGVydGllcywgSlNYQ29udGV4dCwgTm9uQ29udHJvbFByb3BlcnRpZXMsIFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL1J1bnRpbWVCdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHRpbmdQYXJzZSA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSk7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdGluZ1BhcnNlKSB7XG5cdFx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogcmVzdWx0aW5nUGFyc2UucGF0aCxcblx0XHRcdFx0XHRcdFx0bW9kZWw6IHJlc3VsdGluZ1BhcnNlLm1vZGVsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyBmYWN0b3J5OiBGdW5jdGlvbiB9KS5mYWN0b3J5ID0gYWdncmVnYXRpb25DaGlsZHJlbltcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uTmFtZVxuXHRcdFx0XHRcdF0gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyB0ZW1wbGF0ZTogc3RyaW5nIHwgVUk1RWxlbWVudCB9KS50ZW1wbGF0ZSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBwcm9wZXJ0eSBmb3IgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXNcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgaXMgYSBjb25zdGFudCwgaXQgY29tcGlsZXMgaXQgYXMgYSBjb25zdGFudC4gSWYgdGhlIHByb3BlcnR5IGlzIGFuIGFnZ3JlZ2F0aW9uLFxuICogaXQgY29tcGlsZXMgdGhlIGV4cHJlc3Npb24gYXMgYW4gb2JqZWN0LiBPdGhlcndpc2UsIGl0IGNvbXBpbGVzIHRoZSBleHByZXNzaW9uIG5vcm1hbGx5LlxuICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzS2V5IFRoZSBrZXkgb2YgdGhlIHNldHRpbmcgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiB0byBwcm9jZXNzXG4gKiBAcGFyYW0gYWxsUHJvcGVydGllcyBBbGwgcHJvcGVydGllcyBvZiB0aGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3MsXG5cdGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+LFxuXHRhbGxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdm9pZCB7XG5cdGlmIChpc0NvbnN0YW50KGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbikpIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG5cdH0gZWxzZSBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbFByb3BlcnRpZXMsIHNldHRpbmdzS2V5KSkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGNhc2UgLSB3ZSBuZWVkIHRvIGNvbXBpbGUgdGhlIGV4cHJlc3Npb24gYnV0IGFzIGFuIG9iamVjdFxuXHRcdGlmIChpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSB7IHBhdGg6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5wYXRoLCBtb2RlbDogYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLm1vZGVsTmFtZSB9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pO1xuXHR9XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGEgc3RyaW5nIHByb3BlcnR5IGZvciBmdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllc1xuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYSBiaW5kaW5nIGV4cHJlc3Npb24gYW5kIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBmb3JtYXQsXG4gKiBpdCBwYXJzZXMgdGhlIHZhbHVlIHRvIHByb3ZpZGUgdGhlIGV4cGVjdGVkIGZvcm1hdC4gSWYgdGhlIHByb3BlcnR5IGlzIGFuIGV2ZW50IGhhbmRsZXIsXG4gKiBpdCBsb2dzIGFuIGVycm9yLlxuICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzS2V5IFRoZSBrZXkgb2YgdGhlIHNldHRpbmcgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBwcm9jZXNzXG4gKiBAcGFyYW0gYWxsRXZlbnRzIEFsbCBldmVudHMgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBhbGxQcm9wZXJ0aWVzIEFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1N0cmluZ1Byb3BlcnR5KFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3MsXG5cdHZhbHVlOiBzdHJpbmcsXG5cdGFsbEV2ZW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhXG4pOiB2b2lkIHtcblx0aWYgKCF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChhbGxFdmVudHMsIHNldHRpbmdzS2V5KSkge1xuXHRcdFx0TG9nLmVycm9yKGBFdmVudCBoYW5kbGVycyBjYW5ub3QgYmUgc2V0IGFzIHN0cmluZyBpbiBKU1gsICR7c2V0dGluZ3NLZXl9IGluICR7bWV0YWRhdGEuZ2V0TmFtZSgpfWApO1xuXHRcdH1cblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSAoYWxsUHJvcGVydGllc1tzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdGlmIChwcm9wZXJ0eVR5cGUgJiYgcHJvcGVydHlUeXBlIGluc3RhbmNlb2YgRGF0YVR5cGUgJiYgW1wiYm9vbGVhblwiLCBcImludFwiLCBcImZsb2F0XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZS5nZXROYW1lKCkpKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBwcm9wZXJ0eVR5cGUucGFyc2VWYWx1ZSh2YWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IHZhbHVlO1xuXHR9XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuIG9iamVjdCBwcm9wZXJ0eSBmb3IgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgcHJvbWlzZSwgaXQgYWRkcyBpdCB0byB0aGUgbGF0ZSBwcm9wZXJ0aWVzIG1hcC4gSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZyBpbmZvIGhvbGRlcixcbiAqIGl0IHNldHMgdGhlIGJpbmRpbmcgaW5mbyB0byB0aGUgc2V0dGluZ3MuXG4gKiBAcGFyYW0gc2V0dGluZ3MgVGhlIHNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3NLZXkgVGhlIGtleSBvZiB0aGUgc2V0dGluZyBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgb2JqZWN0IHZhbHVlIHRvIHByb2Nlc3NcbiAqIEBwYXJhbSBsYXRlUHJvcGVydGllcyBBIG1hcCBvZiB0aGUgY29udHJvbCdzIGxhdGUgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0UHJvcGVydHkoXG5cdHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0c2V0dGluZ3NLZXk6IGtleW9mIHR5cGVvZiBzZXR0aW5ncyxcblx0dmFsdWU6IHVua25vd24sXG5cdGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PlxuKTogdm9pZCB7XG5cdGlmICgodmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbikge1xuXHRcdGxhdGVQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSA9IHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj47XG5cdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0fSBlbHNlIGlmICgodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm8pIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSAodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm87XG5cdH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHByb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIGNvbXBpbGUgaXQuXG4gKiBFbHNlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgYXMgc3RyaW5nIChjb21waWxlZCBiaW5kaW5nIGV4cHJlc3Npb24gcmV0dXJucyBzdHJpbmcgYnkgZGVmYXVsdCBldmVuIGlmIGl0J3MgYSBib29sZWFuLCBpbnQsIGV0Yy4pIGFuZCBpdCBkb2Vzbid0IG1hdGNoIHdpdGggZXhwZWN0ZWRcbiAqIGZvcm1hdCB0aGUgdmFsdWUgaXMgcGFyc2VkIHRvIHByb3ZpZGUgZXhwZWN0ZWQgZm9ybWF0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqIEByZXR1cm5zIEEgbWFwIG9mIGxhdGUgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgYXdhaXRlZCBhZnRlciB0aGUgY29udHJvbCBpcyBjcmVhdGVkXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+IHtcblx0bGV0IHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3M7XG5cdGNvbnN0IGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiA9IHt9O1xuXHRjb25zdCBhbGxFdmVudHMgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKTtcblx0Y29uc3QgYWxsUHJvcGVydGllcyA9IG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKTtcblxuXHRmb3IgKHNldHRpbmdzS2V5IGluIHNldHRpbmdzKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0aWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHZhbHVlKSkge1xuXHRcdFx0cHJvY2Vzc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbihzZXR0aW5ncywgc2V0dGluZ3NLZXksIHZhbHVlLCBhbGxQcm9wZXJ0aWVzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5KHNldHRpbmdzLCBzZXR0aW5nc0tleSwgdmFsdWUsIGxhdGVQcm9wZXJ0aWVzKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cHJvY2Vzc1N0cmluZ1Byb3BlcnR5KHNldHRpbmdzLCBzZXR0aW5nc0tleSwgdmFsdWUsIGFsbEV2ZW50cywgYWxsUHJvcGVydGllcywgbWV0YWRhdGEpO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGxhdGVQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCBzZXQgb24gdGhlIGNvbnRyb2wgdmlhIHRoZSBpbnRyaW5zaWMgY2xhc3MgYXR0cmlidXRlIFwianN4OmNvbW1hbmRcIi5cbiAqIElmIG5vIGNvbW1hbmQgaGFzIGJlZW4gc2V0IG9yIHRoZSB0YXJnZXRlZCBldmVudCBkb2Vzbid0IGV4aXN0LCBubyBjb25maWd1cmF0aW9uIGlzIHNldC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKClbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBFdmVudEhhbmRsZXJSZXNvbHZlci5yZXNvbHZlRXZlbnRIYW5kbGVyKGNvbW1hbmQpO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuY29uc3QganN4Q29udHJvbCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgRWxlbWVudD4oXG5cdENvbnRyb2xUeXBlOiBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHwgRnVuY3Rpb24sXG5cdHNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHtcblx0XHRrZXk6IHN0cmluZztcblx0XHRjaGlsZHJlbj86IEVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPjtcblx0XHRyZWY/OiBSZWY8VD47XG5cdFx0YmluZGluZz86IHN0cmluZztcblx0XHRjbGFzcz86IHN0cmluZztcblx0XHRbRkxfREVMRUdBVEVdPzogc3RyaW5nO1xuXHRcdFtEVF9ERVNJR05USU1FXT86IHN0cmluZztcblx0XHRbQ09SRV9SRVFVSVJFXT86IHN0cmluZztcblx0fSxcblx0a2V5OiBzdHJpbmcsXG5cdGpzeENvbnRleHQ6IEpTWENvbnRleHRcbik6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQge1xuXHRsZXQgdGFyZ2V0Q29udHJvbDogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoKENvbnRyb2xUeXBlIGFzIHsgaXNGcmFnbWVudD86IGJvb2xlYW4gfSk/LmlzRnJhZ21lbnQpIHtcblx0XHR0YXJnZXRDb250cm9sID0gc2V0dGluZ3MuY2hpbGRyZW4gYXMgQ29udHJvbCB8IENvbnRyb2xbXTtcblx0fSBlbHNlIGlmICgoQ29udHJvbFR5cGUgYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk/LmlzUnVudGltZSkge1xuXHRcdGNvbnN0IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrID0gbmV3IChDb250cm9sVHlwZSBhcyB0eXBlb2YgUnVudGltZUJ1aWxkaW5nQmxvY2spKHNldHRpbmdzIGFzIHVua25vd24gYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrLmdldENvbnRlbnQ/Lihqc3hDb250ZXh0LnZpZXchLCBqc3hDb250ZXh0LmFwcENvbXBvbmVudCEpO1xuXHR9IGVsc2UgaWYgKGlzQUNvbnRyb2woQ29udHJvbFR5cGUpKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpO1xuXHRcdGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdFx0fVxuXHRcdGNvbnN0IGxhdGVQcm9wZXJ0aWVzID0gcHJvY2Vzc1Byb3BlcnRpZXMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQ29tbWFuZChtZXRhZGF0YSwgc2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NBZ2dyZWdhdGlvbnMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRjb25zdCBjbGFzc0RlZiA9IHNldHRpbmdzLmNsYXNzO1xuXHRcdGNvbnN0IHJlZkRlZiA9IHNldHRpbmdzLnJlZjtcblx0XHRjb25zdCBiaW5kaW5nRGVmID0gc2V0dGluZ3MuYmluZGluZztcblx0XHRjb25zdCBmbERlbGVnYXRlID0gc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGNvbnN0IGR0RGVzaWdudGltZSA9IHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5yZWY7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLmNsYXNzO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5iaW5kaW5nO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tGTF9ERUxFR0FURV07XG5cdFx0ZGVsZXRlIHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tDT1JFX1JFUVVJUkVdOyAvLyBDb3JlIHJlcXVpcmUgaXMgbm90IHVzZWZ1bCBpbiBjb250cm9sIG1vZGVcblx0XHRjb25zdCB0YXJnZXRDb250cm9sSW5zdGFuY2UgPSBuZXcgQ29udHJvbFR5cGUoc2V0dGluZ3MgYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0aWYgKGNsYXNzRGVmKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYWRkU3R5bGVDbGFzcyhjbGFzc0RlZik7XG5cdFx0fVxuXHRcdGlmIChyZWZEZWYpIHtcblx0XHRcdHJlZkRlZi5zZXRDdXJyZW50KHRhcmdldENvbnRyb2xJbnN0YW5jZSBhcyB1bmtub3duIGFzIFQpO1xuXHRcdH1cblx0XHRjb25zdCBjdXN0b21TZXR0aW5ncyA9IHRhcmdldENvbnRyb2xJbnN0YW5jZS5kYXRhKFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiKSA/PyB7fTtcblx0XHRpZiAoZmxEZWxlZ2F0ZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZmxcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZmxcIl0uZGVsZWdhdGUgPSBmbERlbGVnYXRlO1xuXHRcdH1cblx0XHRpZiAoZHREZXNpZ250aW1lKSB7XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5kdFwiXSA/Pz0ge307XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5kdFwiXS5kZXNpZ250aW1lID0gZHREZXNpZ250aW1lO1xuXHRcdH1cblx0XHRpZiAoT2JqZWN0LmtleXMoY3VzdG9tU2V0dGluZ3MpLmxlbmd0aCA+IDApIHtcblx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5kYXRhKFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiLCBjdXN0b21TZXR0aW5ncyk7XG5cdFx0fVxuXG5cdFx0aWYgKGJpbmRpbmdEZWYpIHtcblx0XHRcdGlmICh0eXBlb2YgYmluZGluZ0RlZiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nSW5mbyA9IGJpbmRpbmdQYXJzZXIoYmluZGluZ0RlZik7XG5cdFx0XHRcdGlmIChiaW5kaW5nSW5mbykge1xuXHRcdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdFx0XHRtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0cGF0aDogYmluZGluZ0luZm8ucGF0aCxcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnM6IGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgPz8gdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KGJpbmRpbmdEZWYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBjb25zaWRlciBpdCdzIGFuIG9iamVjdFxuXHRcdFx0XHRPYmplY3Qua2V5cyhiaW5kaW5nRGVmKS5mb3JFYWNoKChiaW5kaW5nRGVmS2V5KSA9PiB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdEZWZLZXksIHBhdGg6IGJpbmRpbmdEZWZbYmluZGluZ0RlZktleV0gfSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGxhdGVQcm9wZXJ0aWVzS2V5IGluIGxhdGVQcm9wZXJ0aWVzKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tsYXRlUHJvcGVydGllc0tleV1cblx0XHRcdFx0LnRoZW4oKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRhcmdldENvbnRyb2xJbnN0YW5jZS5zZXRQcm9wZXJ0eShsYXRlUHJvcGVydGllc0tleSwgdmFsdWUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDb3VsZG4ndCBzZXQgcHJvcGVydHkgJHtsYXRlUHJvcGVydGllc0tleX0gb24gJHtDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gLCBlcnJvciwgXCJqc3hDb250cm9sXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHRhcmdldENvbnRyb2xJbnN0YW5jZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgQ29udHJvbFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGNvbnN0IGNvbnRyb2xUeXBlRm4gPSBDb250cm9sVHlwZTtcblx0XHR0YXJnZXRDb250cm9sID0gY29udHJvbFR5cGVGbihzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRDb250cm9sID0gbmV3IFRleHQoeyB0ZXh0OiBcIk1pc3NpbmcgY29tcG9uZW50IFwiICsgKENvbnRyb2xUeXBlIGFzIHN0cmluZykgfSk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGpzeENvbnRyb2w7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7RUF1QkEsTUFBTUEsV0FBVyxHQUFHLGFBQWE7RUFDakMsTUFBTUMsWUFBWSxHQUFHLGNBQWM7RUFDbkMsTUFBTUMsYUFBYSxHQUFHLGVBQWU7RUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0JDLG1CQUE0RCxFQUM1REMsZUFBdUIsRUFDdkJDLEtBQTBDLEVBQ25DO0lBQ1AsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLQyxTQUFTLElBQUksT0FBT0QsS0FBSyxLQUFL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
|