@sapui5/sap.fe.base 1.126.2 → 1.127.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 +11 -4
- package/src/sap/fe/base/BindingToolkit.ts +8 -3
- package/src/sap/fe/base/ClassSupport.js +14 -16
- package/src/sap/fe/base/ClassSupport.ts +16 -24
- package/src/sap/fe/base/HookSupport.js +154 -0
- package/src/sap/fe/base/HookSupport.ts +186 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +14 -6
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +11 -7
- package/src/sap/fe/base/library.js +1 -1
|
@@ -141,6 +141,7 @@ export type PathInModelExpression<T> = BaseExpression<T> & {
|
|
|
141
141
|
targetType?: string;
|
|
142
142
|
mode?: string;
|
|
143
143
|
formatOptions?: FormatOptions;
|
|
144
|
+
alwaysKeepTargetType?: boolean;
|
|
144
145
|
};
|
|
145
146
|
|
|
146
147
|
export type EmbeddedUI5BindingExpression<T> = BaseExpression<T> & {
|
|
@@ -1677,7 +1678,9 @@ export function formatWithTypeInformation<T>(
|
|
|
1677
1678
|
});
|
|
1678
1679
|
}
|
|
1679
1680
|
if (outExpression.type === "sap.ui.model.odata.type.String" && isProperty(property)) {
|
|
1680
|
-
if (
|
|
1681
|
+
if (outExpression.constraints?.isDigitSequence || outExpression.constraints?.nullable !== false) {
|
|
1682
|
+
outExpression.formatOptions.parseKeepsEmptyString = false;
|
|
1683
|
+
} else {
|
|
1681
1684
|
outExpression.formatOptions.parseKeepsEmptyString = true;
|
|
1682
1685
|
}
|
|
1683
1686
|
const fiscalType = getFiscalType(property);
|
|
@@ -1872,7 +1875,8 @@ export function fn<T, U extends FunctionOrName<T>>(
|
|
|
1872
1875
|
export function isEmpty(expression: BindingToolkitExpression<string>): BindingToolkitExpression<boolean> {
|
|
1873
1876
|
const aBindings: ExpressionOrPrimitive<boolean>[] = [];
|
|
1874
1877
|
transformRecursively(expression, "PathInModel", (expr) => {
|
|
1875
|
-
|
|
1878
|
+
const finalExpression = { ...expr, alwaysKeepTargetType: true } as PathInModelExpression<string>;
|
|
1879
|
+
aBindings.push(or(equal(finalExpression, ""), equal(expr, undefined), equal(expr, null)));
|
|
1876
1880
|
return expr;
|
|
1877
1881
|
});
|
|
1878
1882
|
return and(...aBindings);
|
|
@@ -2181,7 +2185,8 @@ function compilePathInModelExpression<T extends PrimitiveType>(
|
|
|
2181
2185
|
};
|
|
2182
2186
|
const outBinding = compileExpression(complexBindingDefinition, false, false, true);
|
|
2183
2187
|
if (embeddedInBinding) {
|
|
2184
|
-
|
|
2188
|
+
const separator = expressionForBinding.alwaysKeepTargetType ? "$" : embeddedSeparator;
|
|
2189
|
+
return `${separator}${outBinding}`;
|
|
2185
2190
|
}
|
|
2186
2191
|
return outBinding;
|
|
2187
2192
|
} else if (embeddedInBinding) {
|
|
@@ -2,10 +2,11 @@
|
|
|
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/util/ObjectPath", "sap/base/util/merge", "sap/base/util/uid", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata"], function (ObjectPath, merge, uid, Metadata, BaseObject, ControllerMetadata) {
|
|
5
|
+
sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/HookSupport", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata"], function (ObjectPath, merge, uid, HookSupport, Metadata, BaseObject, ControllerMetadata) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
|
+
var hookable = HookSupport.hookable;
|
|
9
10
|
const ensureMetadata = function (target) {
|
|
10
11
|
target.metadata = merge({
|
|
11
12
|
controllerExtensions: {},
|
|
@@ -110,17 +111,22 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
|
|
|
110
111
|
/**
|
|
111
112
|
* Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
|
|
112
113
|
*
|
|
113
|
-
* @param
|
|
114
|
+
* @param overrideExecution The OverrideExecution defining when the override should run (Before / After / Instead)
|
|
114
115
|
* @returns The decorated method
|
|
115
116
|
*/
|
|
116
117
|
_exports.methodOverride = methodOverride;
|
|
117
|
-
function extensible(
|
|
118
|
-
return function (target, propertyKey) {
|
|
118
|
+
function extensible(overrideExecution) {
|
|
119
|
+
return function (target, propertyKey, descriptor) {
|
|
119
120
|
const metadata = ensureMetadata(target);
|
|
120
121
|
if (!metadata.methods[propertyKey.toString()]) {
|
|
121
122
|
metadata.methods[propertyKey.toString()] = {};
|
|
122
123
|
}
|
|
123
|
-
metadata.methods[propertyKey.toString()].overrideExecution =
|
|
124
|
+
metadata.methods[propertyKey.toString()].overrideExecution = overrideExecution;
|
|
125
|
+
|
|
126
|
+
// by default, every extensible method is also hookable (except those defined as Instead)
|
|
127
|
+
if (overrideExecution !== "Instead") {
|
|
128
|
+
hookable(overrideExecution)(target, propertyKey, descriptor);
|
|
129
|
+
}
|
|
124
130
|
};
|
|
125
131
|
}
|
|
126
132
|
|
|
@@ -323,11 +329,9 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
|
|
|
323
329
|
*
|
|
324
330
|
* @param sTarget The fully qualified name of the UI5 class
|
|
325
331
|
* @param metadataDefinition Inline metadata definition
|
|
326
|
-
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
327
332
|
* @returns A class decorator that will create a ui5 class
|
|
328
333
|
*/
|
|
329
334
|
function defineUI5Class(sTarget, metadataDefinition) {
|
|
330
|
-
let forceDefineCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
331
335
|
return function (constructor) {
|
|
332
336
|
if (!constructor.prototype.metadata) {
|
|
333
337
|
constructor.prototype.metadata = {};
|
|
@@ -348,7 +352,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
|
|
|
348
352
|
}
|
|
349
353
|
}
|
|
350
354
|
}
|
|
351
|
-
return registerUI5Metadata(constructor, sTarget, constructor.prototype
|
|
355
|
+
return registerUI5Metadata(constructor, sTarget, constructor.prototype);
|
|
352
356
|
};
|
|
353
357
|
}
|
|
354
358
|
_exports.defineUI5Class = defineUI5Class;
|
|
@@ -388,11 +392,10 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
|
|
|
388
392
|
* @param clazz The class prototype
|
|
389
393
|
* @param name The name of the class to create
|
|
390
394
|
* @param inObj The metadata object
|
|
391
|
-
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
392
395
|
* @returns The metadata class
|
|
393
396
|
*/
|
|
394
397
|
_exports.defineReference = defineReference;
|
|
395
|
-
function registerUI5Metadata(clazz, name, inObj
|
|
398
|
+
function registerUI5Metadata(clazz, name, inObj) {
|
|
396
399
|
var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata;
|
|
397
400
|
if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
|
|
398
401
|
Object.getOwnPropertyNames(inObj).forEach(objName => {
|
|
@@ -598,13 +601,8 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
|
|
|
598
601
|
return oClass;
|
|
599
602
|
};
|
|
600
603
|
ObjectPath.set(name, output);
|
|
601
|
-
if (forceDefineCall) {
|
|
602
|
-
sap.ui.define(output.getMetadata().getName().replaceAll(".", "/"), () => {
|
|
603
|
-
return output;
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
604
|
return output;
|
|
607
605
|
}
|
|
608
606
|
return _exports;
|
|
609
607
|
}, false);
|
|
610
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJsZW5ndGgiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJtZXRob2RPdmVycmlkZSIsImV4dGVuc2lvbk5hbWUiLCJwcm9wZXJ0eUtleSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uVHlwZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwicHVibGljRXh0ZW5zaW9uIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdWJsaWMiLCJwcml2YXRlRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJmaW5hbCIsInVzaW5nRXh0ZW5zaW9uIiwiZXh0ZW5zaW9uQ2xhc3MiLCJwcm9wZXJ0eURlc2NyaXB0b3IiLCJpbml0aWFsaXplciIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJiaW5kYWJsZSIsInVuZGVmaW5lZCIsImlzQmluZGluZ0luZm8iLCJncm91cCIsIndyaXRhYmxlIiwiZGVmYXVsdFZhbHVlIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJtdWx0aXBsZSIsImlzRGVmYXVsdCIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFzc29jaWF0aW9uIiwidWk1QXNzb2NpYXRpb25NZXRhZGF0YSIsImltcGxlbWVudEludGVyZmFjZSIsImludGVyZmFjZU5hbWUiLCJ4bWxFdmVudEhhbmRsZXIiLCJwcm9wZXJ0eWtleSIsImN1cnJlbnRDb25zdHJ1Y3RvciIsImFyZ3MiLCJkZWZpbmVVSTVDbGFzcyIsInNUYXJnZXQiLCJtZXRhZGF0YURlZmluaXRpb24iLCJmb3JjZURlZmluZUNhbGwiLCJwcm90b3R5cGUiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsImNsYXp6IiwibmFtZSIsImluT2JqIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJvYmpOYW1lIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib2JqIiwiYmFzZVR5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldFN0ZXJlb3R5cGUiLCJyZW5kZXJlckRlZmluaXRpb24iLCJyZW5kZXJlciIsInJlbmRlciIsImFwaVZlcnNpb24iLCJrZXlzIiwiZSIsImNFeHROYW1lIiwib3V0cHV0IiwiZXh0ZW5kIiwiZm5Jbml0IiwiaW5pdCIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmIiwicHJvcGVydHlEZWZhdWx0IiwiX2JpbmRpbmdQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJ2IiwibVByb3BlcnRpZXMiLCJwcm9wZXJ0eVZhbHVlIiwiZ2V0UHJvcGVydHkiLCJiaW5kaW5nUHJvcGVydHlWYWx1ZSIsInByb3BWYWx1ZSIsInNldFByb3BlcnR5IiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJhZ2dyZWdhdGlvbkRlZiIsInNldEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25Db250ZW50IiwiZ2V0QWdncmVnYXRpb24iLCJhQXNzb2NpYXRpb25LZXlzIiwiYXNzb2NpYXRpb25LZXkiLCJzZXRBc3NvY2lhdGlvbiIsImdldEFzc29jaWF0aW9uIiwicmVmZXJlbmNlUHJvcGVydGllcyIsInZhbHVlIiwibWV0aG9kTmFtZSIsIm1ldGhvZERlZmluaXRpb24iLCJtZXRob2RIb2xkZXIiLCJtZXRob2RBcnJheXMiLCJyZXZlcnNlIiwibWV0aG9kQXJncyIsImFyZyIsIm9FeHRlbnNpb24iLCJwb2wiLCJvQ2xhc3MiLCJNZXRhZGF0YSIsImNyZWF0ZUNsYXNzIiwidWlkIiwiQ29udHJvbGxlck1ldGFkYXRhIiwiX3N0YXRpY092ZXJyaWRlIiwiX292ZXJyaWRlIiwiT2JqZWN0UGF0aCIsInNhcCIsInVpIiwiZGVmaW5lIiwicmVwbGFjZUFsbCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ2xhc3NTdXBwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGV4cGVjdGVkQW5ub3RhdGlvbnM/OiBzdHJpbmdbXTtcblx0ZXhwZWN0ZWRUeXBlcz86IHN0cmluZ1tdO1xuXHRhbGxvd2VkVmFsdWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVUk1QWdncmVnYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRhbHRUeXBlcz86IHN0cmluZ1tdO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGlzRGVmYXVsdD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGRlZmF1bHRDbGFzcz86IHVua25vd247XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcblx0dmlzaWJpbGl0eT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24gPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcblx0Y29udHJvbGxlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24+O1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBVSTVQcm9wZXJ0eU1ldGFkYXRhPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhPjtcblx0cmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cdGFzc29jaWF0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QXNzb2NpYXRpb25NZXRhZGF0YT47XG5cdG1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uPjtcblx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cdGludGVyZmFjZXM6IHN0cmluZ1tdO1xuXHRsaWJyYXJ5Pzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRjb25maWc/OiB7XG5cdFx0ZnVsbFdpZHRoPzogYm9vbGVhbjtcblx0fTtcblx0bWFuaWZlc3Q/OiBzdHJpbmcgfCB1bmtub3duO1xuXHRyZXR1cm5UeXBlcz86IHN0cmluZ1tdO1xuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiB1bmtub3duO1xufTtcbnR5cGUgVUk1Q29udHJvbGxlckRlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRvdmVycmlkZXM/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1Q29udHJvbERlZmluaXRpb24gPSB7XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0b3ZlcnJpZGU/OiB1bmtub3duO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVBUElDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xuXHRfX2FwaVJlZ2lzdGVyZWQ6IGJvb2xlYW47XG59ICYge1xuXHRbazogc3RyaW5nXTogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBYTUxFdmVudEhvbGRlciA9IHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xufTtcblxudHlwZSBDb250cm9sUHJvcGVydHlOYW1lczxUPiA9IHtcblx0Ly8gbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIFRTIGNvbXBpbGVyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBhcnRpYWw8UGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGFydGlhbDxQaWNrPFQsIEs+PiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBDb252ZXJ0Q29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIFwibWV0YVBhdGhcIiB8IFwiY29udGV4dFBhdGhcIiA/IHN0cmluZyA6IFRbS107XG59O1xuZXhwb3J0IHR5cGUgU3RyaWN0UHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGljazxULCBLPiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBVSTVBY2Nlc3NvcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIGdldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgZ2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAoKSA9PiBUW1BdO1xufTtcbmV4cG9ydCB0eXBlIFVJNVNldHRlcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIHNldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgc2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAodmFsdWU6IFRbUF0pID0+IFQ7XG59O1xuZXhwb3J0IHR5cGUgRW5oYW5jZVdpdGhVSTU8VD4gPSB7XG5cdG5ldyAocHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xuXHRuZXcgKHNJZDogc3RyaW5nLCBwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG59ICYgVCAmXG5cdFVJNUFjY2Vzc29yczxUPiAmXG5cdFVJNVNldHRlcnM8VD47XG5cbmNvbnN0IGVuc3VyZU1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24ge1xuXHR0YXJnZXQubWV0YWRhdGEgPSBtZXJnZShcblx0XHR7XG5cdFx0XHRjb250cm9sbGVyRXh0ZW5zaW9uczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRyZWZlcmVuY2VzOiB7fSxcblx0XHRcdGFzc29jaWF0aW9uczoge30sXG5cdFx0XHRtZXRob2RzOiB7fSxcblx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRpbnRlcmZhY2VzOiBbXVxuXHRcdH0sXG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID8/IHt9XG5cdCkgYXMgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRoYXQgd2lsbCBmaW5kIHRoZSBjb3JyZWN0IEFQSSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udHJvbCBoaWVyYXJjaHkuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHJldHVybnMgVGhlIHByb3BlciBnZXRBUEkgZnVuY3Rpb24gZm9yIHRoaXMgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldDogVUk1QVBJQ29udHJvbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBVSTVBUElDb250cm9sPihcblx0XHR0aGlzOiBVSTVBUElDb250cm9sLFxuXHRcdG9FdmVudDogVUk1RXZlbnQsXG5cdFx0YXBpRlFOOiBzdHJpbmcgPSB0YXJnZXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKClcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0aWYgKHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKSB7XG5cdFx0XHRvU291cmNlID0gdGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24ob1NvdXJjZSkgPz8gb1NvdXJjZTtcblx0XHR9XG5cdFx0d2hpbGUgKG9Tb3VyY2UgJiYgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikgJiYgb1NvdXJjZS5nZXRQYXJlbnQpIHtcblx0XHRcdGlmICh0aGlzLmlzRGVwZW5kZW50Qm91bmQpIHtcblx0XHRcdFx0Y29uc3Qgb0RlcGVuZGVudHMgPSAob1NvdXJjZSBhcyBDb250cm9sKS5nZXREZXBlbmRlbnRzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NvcnJlY3REZXBlbmRlbnQgPSBvRGVwZW5kZW50cy5maW5kKChvRGVwZW5kZW50OiBVSTVFbGVtZW50KSA9PiBvRGVwZW5kZW50LmlzQShhcGlGUU4pKTtcblx0XHRcdFx0aWYgKGhhc0NvcnJlY3REZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRvU291cmNlID0gaGFzQ29ycmVjdERlcGVuZGVudCBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9Tb3VyY2UgfHwgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2VNYXAgPSB0aGlzLmluc3RhbmNlTWFwLmdldCh0aGlzKSBhcyBUW107XG5cdFx0XHRvU291cmNlID0gb1NvdXJjZU1hcD8uW29Tb3VyY2VNYXAubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRDb250cm9sO1xuXHRcdGlmIChvU291cmNlICYmIG9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdHRhcmdldENvbnRyb2wgPSBvU291cmNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcblx0fTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgd2hlbiBhbiB4bWxFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlIGBnZXRBUElgIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGFzc2lnbmVkLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGhvbGQgdGhlIHN0YXRpYyBmdW5jdGlvbnNcbiAqL1xuY29uc3QgZW5zdXJlR2V0QVBJID0gZnVuY3Rpb24gKHRhcmdldDogVUk1QVBJQ29udHJvbCk6IHZvaWQge1xuXHRpZiAoIXRhcmdldC5fX2FwaVJlZ2lzdGVyZWQpIHtcblx0XHR0YXJnZXQuX19hcGlSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHR0YXJnZXQuaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuXHRcdHRhcmdldC5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKF9pbnN0YW5jZTogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGlmICghdGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSkge1xuXHRcdFx0XHR0aGlzLmluc3RhbmNlTWFwLnNldChfaW5zdGFuY2UuY29uc3RydWN0b3IsIFtdKTtcblx0XHRcdH1cblx0XHRcdCh0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpIGFzIG9iamVjdFtdKS5wdXNoKF9pbnN0YW5jZSk7XG5cdFx0fTtcblx0XHR0YXJnZXQuZ2V0QVBJID0gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldCk7XG5cdH1cbn07XG5cbi8qICNyZWdpb24gQ09OVFJPTExFUiBFWFRFTlNJT05TICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kIG5hbWUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzcGVjaWZpYyBjb250cm9sbGVyIGV4dGVuc2lvbiBvciBiYXNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdGhhdCB3aWxsIGJlIG92ZXJyaWRkZW5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RPdmVycmlkZShleHRlbnNpb25OYW1lPzogc3RyaW5nKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSkge1xuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGUgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGVzKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGVzID0ge307XG5cdFx0fVxuXHRcdGxldCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm92ZXJyaWRlcztcblx0XHRpZiAoZXh0ZW5zaW9uTmFtZSkge1xuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbikge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbiA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSkge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdO1xuXHRcdH1cblx0XHRjdXJyZW50VGFyZ2V0W3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4pW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldO1xuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbiBiYXNlZCBvbiB0aGUgZGVmaW5lZCBvdmVycmlkZUV4ZWN1dGlvblR5cGUuXG4gKlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uVHlwZSBUaGUgT3ZlcnJpZGVFeGVjdXRpb24gZGVmaW5pbmcgd2hlbiB0aGUgb3ZlcnJpZGUgc2hvdWxkIHJ1biAoQmVmb3JlIC8gQWZ0ZXIgLyBJbnN0ZWFkKVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2libGUob3ZlcnJpZGVFeGVjdXRpb25UeXBlPzogT3ZlcnJpZGVFeGVjdXRpb24gfCBcIkFmdGVyQXN5bmNcIiB8IFwiQmVmb3JlQXN5bmNcIik6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvblR5cGUgYXMgdW5rbm93biBhcyBPdmVycmlkZUV4ZWN1dGlvbjtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZSBmb3IgY29udHJvbGxlciBleHRlbnNpb24gdXNhZ2UuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1YmxpY0V4dGVuc2lvbigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTogdm9pZCB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ucHVibGljID0gdHJ1ZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2Qgd2lsbCBiZSBvbmx5IGF2YWlsYWJsZSBmb3IgaW50ZXJuYWwgdXNhZ2Ugb2YgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5maW5hbCA9IHRydWU7XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UgaW5zdGFudGlhdGUgYSBjb250cm9sbGVyIGV4dGVuc2lvbiB1bmRlciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIG5hbWUuXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbkNsYXNzIFRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2luZ0V4dGVuc2lvbihleHRlbnNpb25DbGFzczogdHlwZW9mIENvbnRyb2xsZXJFeHRlbnNpb24gfCBGdW5jdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdG1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gZXh0ZW5zaW9uQ2xhc3M7XG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBJIGRlY2xhcmUgaXQgYXMgc3VjaC5cbn1cblxuLyogI2VuZHJlZ2lvbiAqL1xuXG4vKiAjcmVnaW9uIENPTlRST0wgKi9cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnR5IHNoYWxsIGJlIGRlY2xhcmVkIGFzIGFuIGV2ZW50IG9uIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleSkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmV2ZW50c1tldmVudEtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpbiB0aGUgY29udHJvbCBtZXRhdGFkYS5cbiAqXG4gKiBAcGFyYW0gYXR0cmlidXRlRGVmaW5pdGlvbiBUaGUgcHJvcGVydHkgZGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KGF0dHJpYnV0ZURlZmluaXRpb246IFVJNVByb3BlcnR5TWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uaXNCaW5kaW5nSW5mbyA9PT0gdHJ1ZSkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IGZhbHNlO1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5ncm91cCA9IFwiRGF0YVwiO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA9IGF0dHJpYnV0ZURlZmluaXRpb247XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nIGFnZ3JlZ2F0aW9uIGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc29jaWF0aW9uKHVpNUFzc29jaWF0aW9uTWV0YWRhdGE6IFVJNUFzc29jaWF0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0gPSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBpbiB0aGUgbWV0YWRhdGEgdGhhdCB0aGlzIGNvbnRyb2wgaW1wbGVtZW50cyBhIHNwZWNpZmljIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24geG1sRXZlbnRIYW5kbGVyKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlrZXkpIHtcblx0XHRjb25zdCBjdXJyZW50Q29uc3RydWN0b3I6IFVJNUFQSUNvbnRyb2wgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgdW5rbm93biBhcyBVSTVBUElDb250cm9sO1xuXHRcdGVuc3VyZUdldEFQSShjdXJyZW50Q29uc3RydWN0b3IpO1xuXHRcdGN1cnJlbnRDb25zdHJ1Y3Rvcltwcm9wZXJ0eWtleS50b1N0cmluZygpXSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRcdGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50Q29uc3RydWN0b3IuZ2V0QVBJKGFyZ3NbMF0gYXMgVUk1RXZlbnQpO1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0Py5bcHJvcGVydHlrZXkudG9TdHJpbmcoKV0oLi4uYXJncyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcbn1cblxudHlwZSBVSTVDb250cm9sQW5kTW9yZSA9IHR5cGVvZiBDb250cm9sICZcblx0RnVuY3Rpb24gJiB7XG5cdFx0cmVnaXN0ZXJJbnN0YW5jZT86IEZ1bmN0aW9uO1xuXHRcdG92ZXJyaWRlPzogRnVuY3Rpb247XG5cdFx0cmVuZGVyZXI/OiB1bmtub3duO1xuXHRcdHJlbmRlcjogRnVuY3Rpb247XG5cdFx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHR9O1xuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgY2xhc3Mgc2hvdWxkIGRlZmluZSBhIFVJNSBjb250cm9sIG9mIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAqXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHBhcmFtIGZvcmNlRGVmaW5lQ2FsbCBXaGV0aGVyIGEgZGVmaW5lIGNhbGwgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGlzLCB1c2VmdWwgd2hlbiBkZWZpbmluZyBzdWIgY2xhc3Nlc1xuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3MoXG5cdHNUYXJnZXQ6IHN0cmluZyxcblx0bWV0YWRhdGFEZWZpbml0aW9uPzogUGFydGlhbDxVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uPixcblx0Zm9yY2VEZWZpbmVDYWxsID0gZmFsc2Vcbik6IENsYXNzRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChjb25zdHJ1Y3RvcjogVUk1Q29udHJvbEFuZE1vcmUpIHtcblx0XHRpZiAoIWNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSkge1xuXHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhID0ge307XG5cdFx0fVxuXHRcdGlmIChtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0XHRpZiAoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pIHtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0Li4uY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0sXG5cdFx0XHRcdFx0XHRcdC4uLihtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dIGFzIG9iamVjdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gbWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVnaXN0ZXJVSTVNZXRhZGF0YShjb25zdHJ1Y3Rvciwgc1RhcmdldCwgY29uc3RydWN0b3IucHJvdG90eXBlLCBmb3JjZURlZmluZUNhbGwpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmZXJlbmNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50PigpOiBSZWY8VD4ge1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQsXG5cdFx0c2V0Q3VycmVudDogZnVuY3Rpb24gKG9Db250cm9sSW5zdGFuY2U6IFQpOiB2b2lkIHtcblx0XHRcdHRoaXMuY3VycmVudCA9IG9Db250cm9sSW5zdGFuY2U7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBvYmplY3Qgd2lsbCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCB0aHJvdWdoIGpzeCB0ZW1wbGF0aW5nLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSZWZlcmVuY2UoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRpZiAoQmFzZU9iamVjdC5pc09iamVjdEEodGFyZ2V0LCBcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdGlmICghbWV0YWRhdGEucmVmZXJlbmNlc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdFx0bWV0YWRhdGEucmVmZXJlbmNlc1twcm9wZXJ0eUtleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyID0gY3JlYXRlUmVmZXJlbmNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKlxuICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyBwcm90b3R5cGVcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBjcmVhdGVcbiAqIEBwYXJhbSBpbk9iaiBUaGUgbWV0YWRhdGEgb2JqZWN0XG4gKiBAcGFyYW0gZm9yY2VEZWZpbmVDYWxsIFdoZXRoZXIgYSBkZWZpbmUgY2FsbCBzaG91bGQgYmUgYWRkZWQgZm9yIHRoaXMsIHVzZWZ1bCB3aGVuIGRlZmluaW5nIHN1YiBjbGFzc2VzXG4gKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgY2xhc3NcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJVSTVNZXRhZGF0YShcblx0Y2xheno6IFVJNUNvbnRyb2xBbmRNb3JlLFxuXHRuYW1lOiBzdHJpbmcsXG5cdGluT2JqOiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uLFxuXHRmb3JjZURlZmluZUNhbGw6IGJvb2xlYW5cbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNsYXp6Lm92ZXJyaWRlID0gZnVuY3Rpb24gKG9FeHRlbnNpb246IHVua25vd24pOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgcG9sID0ge307XG5cdFx0KHBvbCBhcyBGdW5jdGlvbikuY29uc3RydWN0b3IgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogRnVuY3Rpb24ge1xuXHRcdFx0cmV0dXJuIGNsYXp6LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NsYXNzID0gKE1ldGFkYXRhIGFzIHVua25vd24gYXMgeyBjcmVhdGVDbGFzczogRnVuY3Rpb24gfSkuY3JlYXRlQ2xhc3MoXG5cdFx0XHRjbGF6eixcblx0XHRcdGBhbm9ueW1vdXNFeHRlbnNpb25+JHt1aWQoKX1gLFxuXHRcdFx0cG9sLFxuXHRcdFx0Q29udHJvbGxlck1ldGFkYXRhXG5cdFx0KTtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fc3RhdGljT3ZlcnJpZGUgPSBvRXh0ZW5zaW9uO1xuXHRcdG9DbGFzcy5nZXRNZXRhZGF0YSgpLl9vdmVycmlkZSA9IChjbGF6ei5nZXRNZXRhZGF0YSgpIGFzIHsgX292ZXJyaWRlPzogdW5rbm93biB9KS5fb3ZlcnJpZGU7XG5cdFx0cmV0dXJuIG9DbGFzcztcblx0fTtcblxuXHRPYmplY3RQYXRoLnNldChuYW1lLCBvdXRwdXQpO1xuXG5cdGlmIChmb3JjZURlZmluZUNhbGwpIHtcblx0XHRzYXAudWkuZGVmaW5lKG91dHB1dC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKS5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIiksICgpID0+IHtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztFQWdJQSxNQUFNQSxjQUFjLEdBQUcsVUFBVUMsTUFBc0QsRUFBZ0M7SUFDdEhBLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHQyxLQUFLLENBQ3RCO01BQ0NDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztNQUN4QkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO01BQ2RDLFlBQVksRUFBRSxDQUFDLENBQUM7TUFDaEJDLE9BQU8sRUFBRSxDQUFDLENBQUM7TUFDWEMsTUFBTSxFQUFFLENBQUMsQ0FBQztNQUNWQyxVQUFVLEVBQUU7SUFDYixDQUFDLEVBQ0RWLE1BQU0sQ0FBQ0MsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUNXO0lBQ2pDLE9BQU9ELE1BQU0sQ0FBQ0MsUUFBUTtFQUN2QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNVLHFCQUFxQixDQUFDWCxNQUFxQixFQUFFO0lBQ3JELE9BQU8sVUFFTlksTUFBZ0IsRUFFQTtNQUFBLElBRGhCQyxNQUFjLHVFQUFHYixNQUFNLENBQUNjLFdBQVcsRUFBRSxDQUFDQyxPQUFPLEVBQUU7TUFFL0MsSUFBSUMsT0FBTyxHQUFHSixNQUFNLENBQUNLLFNBQVMsRUFBMEI7TUFDeEQsSUFBSWpCLE1BQU0sQ0FBQ2tCLGdCQUFnQixFQUFFO1FBQzVCRixPQUFPLEdBQUdoQixNQUFNLENBQUNrQixnQkFBZ0IsQ0FBQ0YsT0FBTyxDQUFDLElBQUlBLE9BQU87TUFDdEQ7TUFDQSxPQUFPQSxPQUFPLElBQUksQ0FBQ0EsT0FBTyxDQUFDRyxHQUFHLENBQUlOLE1BQU0sQ0FBQyxJQUFJRyxPQUFPLENBQUNJLFNBQVMsRUFBRTtRQUMvRCxJQUFJLElBQUksQ0FBQ0Ms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
|
|
608
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJsZW5ndGgiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJtZXRob2RPdmVycmlkZSIsImV4dGVuc2lvbk5hbWUiLCJwcm9wZXJ0eUtleSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsInByb3BlcnR5RGVzY3JpcHRvciIsImluaXRpYWxpemVyIiwiZXZlbnQiLCJldmVudEtleSIsInByb3BlcnR5IiwiYXR0cmlidXRlRGVmaW5pdGlvbiIsImJpbmRhYmxlIiwidW5kZWZpbmVkIiwiaXNCaW5kaW5nSW5mbyIsImdyb3VwIiwid3JpdGFibGUiLCJkZWZhdWx0VmFsdWUiLCJhZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsIm11bHRpcGxlIiwiaXNEZWZhdWx0IiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYXNzb2NpYXRpb24iLCJ1aTVBc3NvY2lhdGlvbk1ldGFkYXRhIiwiaW1wbGVtZW50SW50ZXJmYWNlIiwiaW50ZXJmYWNlTmFtZSIsInhtbEV2ZW50SGFuZGxlciIsInByb3BlcnR5a2V5IiwiY3VycmVudENvbnN0cnVjdG9yIiwiYXJncyIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsInJlZ2lzdGVyVUk1TWV0YWRhdGEiLCJjcmVhdGVSZWZlcmVuY2UiLCJjdXJyZW50Iiwic2V0Q3VycmVudCIsIm9Db250cm9sSW5zdGFuY2UiLCJkZWZpbmVSZWZlcmVuY2UiLCJCYXNlT2JqZWN0IiwiaXNPYmplY3RBIiwiY2xhenoiLCJuYW1lIiwiaW5PYmoiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsIm9iak5hbWUiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvYmoiLCJiYXNlVHlwZSIsImdldFByb3RvdHlwZU9mIiwiZ2V0U3RlcmVvdHlwZSIsInJlbmRlcmVyRGVmaW5pdGlvbiIsInJlbmRlcmVyIiwicmVuZGVyIiwiYXBpVmVyc2lvbiIsImtleXMiLCJlIiwiY0V4dE5hbWUiLCJvdXRwdXQiLCJleHRlbmQiLCJmbkluaXQiLCJpbml0IiwiYXBwbHkiLCJhUHJvcGVydHlLZXlzIiwicHJvcGVydHlEZWYiLCJwcm9wZXJ0eURlZmF1bHQiLCJfYmluZGluZ1Byb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eSIsImJpbmRpbmdQcm9wZXJ0eVZhbHVlIiwicHJvcFZhbHVlIiwic2V0UHJvcGVydHkiLCJfYXBwbHlpbmdTZXR0aW5ncyIsImFBZ2dyZWdhdGlvbktleXMiLCJhZ2dyZWdhdGlvbktleSIsImFnZ3JlZ2F0aW9uRGVmIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkNvbnRlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImFBc3NvY2lhdGlvbktleXMiLCJhc3NvY2lhdGlvbktleSIsInNldEFzc29jaWF0aW9uIiwiZ2V0QXNzb2NpYXRpb24iLCJyZWZlcmVuY2VQcm9wZXJ0aWVzIiwidmFsdWUiLCJtZXRob2ROYW1lIiwibWV0aG9kRGVmaW5pdGlvbiIsIm1ldGhvZEhvbGRlciIsIm1ldGhvZEFycmF5cyIsInJldmVyc2UiLCJtZXRob2RBcmdzIiwiYXJnIiwib0V4dGVuc2lvbiIsInBvbCIsIm9DbGFzcyIsIk1ldGFkYXRhIiwiY3JlYXRlQ2xhc3MiLCJ1aWQiLCJDb250cm9sbGVyTWV0YWRhdGEiLCJfc3RhdGljT3ZlcnJpZGUiLCJfb3ZlcnJpZGUiLCJPYmplY3RQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDbGFzc1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGV4cGVjdGVkQW5ub3RhdGlvbnM/OiBzdHJpbmdbXTtcblx0ZXhwZWN0ZWRUeXBlcz86IHN0cmluZ1tdO1xuXHRhbGxvd2VkVmFsdWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVUk1QWdncmVnYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRhbHRUeXBlcz86IHN0cmluZ1tdO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGlzRGVmYXVsdD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGRlZmF1bHRDbGFzcz86IHVua25vd247XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcblx0dmlzaWJpbGl0eT86IHN0cmluZztcblx0Zm9yd2FyZGluZz86IG9iamVjdDtcbn07XG5leHBvcnQgdHlwZSBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24gPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcblx0Y29udHJvbGxlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24+O1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBVSTVQcm9wZXJ0eU1ldGFkYXRhPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhPjtcblx0cmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cdGFzc29jaWF0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QXNzb2NpYXRpb25NZXRhZGF0YT47XG5cdG1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uPjtcblx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cdGludGVyZmFjZXM6IHN0cmluZ1tdO1xuXHRsaWJyYXJ5Pzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRjb25maWc/OiB7XG5cdFx0ZnVsbFdpZHRoPzogYm9vbGVhbjtcblx0fTtcblx0bWFuaWZlc3Q/OiBzdHJpbmcgfCB1bmtub3duO1xuXHRyZXR1cm5UeXBlcz86IHN0cmluZ1tdO1xuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiB1bmtub3duO1xufTtcbnR5cGUgVUk1Q29udHJvbGxlckRlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRvdmVycmlkZXM/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1Q29udHJvbERlZmluaXRpb24gPSB7XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0b3ZlcnJpZGU/OiB1bmtub3duO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVBUElDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xuXHRfX2FwaVJlZ2lzdGVyZWQ6IGJvb2xlYW47XG59ICYge1xuXHRbazogc3RyaW5nXTogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBYTUxFdmVudEhvbGRlciA9IHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xufTtcblxudHlwZSBDb250cm9sUHJvcGVydHlOYW1lczxUPiA9IHtcblx0Ly8gbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIFRTIGNvbXBpbGVyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBhcnRpYWw8UGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGFydGlhbDxQaWNrPFQsIEs+PiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBDb252ZXJ0Q29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIFwibWV0YVBhdGhcIiB8IFwiY29udGV4dFBhdGhcIiA/IHN0cmluZyA6IFRbS107XG59O1xuZXhwb3J0IHR5cGUgU3RyaWN0UHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGljazxULCBLPiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBVSTVBY2Nlc3NvcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIGdldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgZ2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAoKSA9PiBUW1BdO1xufTtcbmV4cG9ydCB0eXBlIFVJNVNldHRlcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIHNldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgc2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAodmFsdWU6IFRbUF0pID0+IFQ7XG59O1xuZXhwb3J0IHR5cGUgRW5oYW5jZVdpdGhVSTU8VD4gPSB7XG5cdG5ldyAocHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xuXHRuZXcgKHNJZDogc3RyaW5nLCBwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG59ICYgVCAmXG5cdFVJNUFjY2Vzc29yczxUPiAmXG5cdFVJNVNldHRlcnM8VD47XG5cbmV4cG9ydCB0eXBlIEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uID0gXCJJbnN0ZWFkXCIgfCBcIkJlZm9yZVwiIHwgXCJBZnRlclwiIHwgXCJBZnRlckFzeW5jXCIgfCBcIkJlZm9yZUFzeW5jXCI7XG5cbmNvbnN0IGVuc3VyZU1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24ge1xuXHR0YXJnZXQubWV0YWRhdGEgPSBtZXJnZShcblx0XHR7XG5cdFx0XHRjb250cm9sbGVyRXh0ZW5zaW9uczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRyZWZlcmVuY2VzOiB7fSxcblx0XHRcdGFzc29jaWF0aW9uczoge30sXG5cdFx0XHRtZXRob2RzOiB7fSxcblx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRpbnRlcmZhY2VzOiBbXVxuXHRcdH0sXG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID8/IHt9XG5cdCkgYXMgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRoYXQgd2lsbCBmaW5kIHRoZSBjb3JyZWN0IEFQSSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udHJvbCBoaWVyYXJjaHkuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHJldHVybnMgVGhlIHByb3BlciBnZXRBUEkgZnVuY3Rpb24gZm9yIHRoaXMgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldDogVUk1QVBJQ29udHJvbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBVSTVBUElDb250cm9sPihcblx0XHR0aGlzOiBVSTVBUElDb250cm9sLFxuXHRcdG9FdmVudDogVUk1RXZlbnQsXG5cdFx0YXBpRlFOOiBzdHJpbmcgPSB0YXJnZXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKClcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0aWYgKHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKSB7XG5cdFx0XHRvU291cmNlID0gdGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24ob1NvdXJjZSkgPz8gb1NvdXJjZTtcblx0XHR9XG5cdFx0d2hpbGUgKG9Tb3VyY2UgJiYgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikgJiYgb1NvdXJjZS5nZXRQYXJlbnQpIHtcblx0XHRcdGlmICh0aGlzLmlzRGVwZW5kZW50Qm91bmQpIHtcblx0XHRcdFx0Y29uc3Qgb0RlcGVuZGVudHMgPSAob1NvdXJjZSBhcyBDb250cm9sKS5nZXREZXBlbmRlbnRzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NvcnJlY3REZXBlbmRlbnQgPSBvRGVwZW5kZW50cy5maW5kKChvRGVwZW5kZW50OiBVSTVFbGVtZW50KSA9PiBvRGVwZW5kZW50LmlzQShhcGlGUU4pKTtcblx0XHRcdFx0aWYgKGhhc0NvcnJlY3REZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRvU291cmNlID0gaGFzQ29ycmVjdERlcGVuZGVudCBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9Tb3VyY2UgfHwgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2VNYXAgPSB0aGlzLmluc3RhbmNlTWFwLmdldCh0aGlzKSBhcyBUW107XG5cdFx0XHRvU291cmNlID0gb1NvdXJjZU1hcD8uW29Tb3VyY2VNYXAubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRDb250cm9sO1xuXHRcdGlmIChvU291cmNlICYmIG9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdHRhcmdldENvbnRyb2wgPSBvU291cmNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcblx0fTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgd2hlbiBhbiB4bWxFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlIGBnZXRBUElgIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGFzc2lnbmVkLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGhvbGQgdGhlIHN0YXRpYyBmdW5jdGlvbnNcbiAqL1xuY29uc3QgZW5zdXJlR2V0QVBJID0gZnVuY3Rpb24gKHRhcmdldDogVUk1QVBJQ29udHJvbCk6IHZvaWQge1xuXHRpZiAoIXRhcmdldC5fX2FwaVJlZ2lzdGVyZWQpIHtcblx0XHR0YXJnZXQuX19hcGlSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHR0YXJnZXQuaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuXHRcdHRhcmdldC5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKF9pbnN0YW5jZTogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGlmICghdGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSkge1xuXHRcdFx0XHR0aGlzLmluc3RhbmNlTWFwLnNldChfaW5zdGFuY2UuY29uc3RydWN0b3IsIFtdKTtcblx0XHRcdH1cblx0XHRcdCh0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpIGFzIG9iamVjdFtdKS5wdXNoKF9pbnN0YW5jZSk7XG5cdFx0fTtcblx0XHR0YXJnZXQuZ2V0QVBJID0gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldCk7XG5cdH1cbn07XG5cbi8qICNyZWdpb24gQ09OVFJPTExFUiBFWFRFTlNJT05TICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kIG5hbWUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzcGVjaWZpYyBjb250cm9sbGVyIGV4dGVuc2lvbiBvciBiYXNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdGhhdCB3aWxsIGJlIG92ZXJyaWRkZW5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RPdmVycmlkZShleHRlbnNpb25OYW1lPzogc3RyaW5nKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSkge1xuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGUgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGVzKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGVzID0ge307XG5cdFx0fVxuXHRcdGxldCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm92ZXJyaWRlcztcblx0XHRpZiAoZXh0ZW5zaW9uTmFtZSkge1xuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbikge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbiA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSkge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdO1xuXHRcdH1cblx0XHRjdXJyZW50VGFyZ2V0W3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4pW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldO1xuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbiBiYXNlZCBvbiB0aGUgZGVmaW5lZCBvdmVycmlkZUV4ZWN1dGlvblR5cGUuXG4gKlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IGZhbHNlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIGV2ZW50S2V5KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiBUaGUgYWdncmVnYXRpb24gZGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogVUk1QWdncmVnYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gVUk1IGRlZmF1bHRzIHRoaXMgdG8gdHJ1ZSBidXQgdGhpcyBpcyBqdXN0IHdlaXJkLi4uXG5cdFx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLmlzRGVmYXVsdCkge1xuXHRcdFx0bWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uID0gcHJvcGVydHlLZXk7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYXNzb2NpYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGluIHRoZSBtZXRhZGF0YSB0aGF0IHRoaXMgY29udHJvbCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsZW1lbnRJbnRlcmZhY2UoaW50ZXJmYWNlTmFtZTogc3RyaW5nKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cblx0XHRtZXRhZGF0YS5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlTmFtZSk7XG5cdH07XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGFsc28gYmUgZXhwb3NlZCBzdGF0aWNhbGx5IHNvIHdlIGNhbiBjYWxsIGl0IGZyb20gWE1MLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3MgJiYgYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhcmdldCA9IGN1cnJlbnRDb25zdHJ1Y3Rvci5nZXRBUEkoYXJnc1swXSBhcyBVSTVFdmVudCk7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQ/Lltwcm9wZXJ0eWtleS50b1N0cmluZygpXSguLi5hcmdzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xufVxuXG50eXBlIFVJNUNvbnRyb2xBbmRNb3JlID0gdHlwZW9mIENvbnRyb2wgJlxuXHRGdW5jdGlvbiAmIHtcblx0XHRyZWdpc3Rlckluc3RhbmNlPzogRnVuY3Rpb247XG5cdFx0b3ZlcnJpZGU/OiBGdW5jdGlvbjtcblx0XHRyZW5kZXJlcj86IHVua25vd247XG5cdFx0cmVuZGVyOiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdH07XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBjbGFzcyBzaG91bGQgZGVmaW5lIGEgVUk1IGNvbnRyb2wgb2YgdGhlIHNwZWNpZmllZCBuYW1lLlxuICpcbiAqIEBwYXJhbSBzVGFyZ2V0IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgVUk1IGNsYXNzXG4gKiBAcGFyYW0gbWV0YWRhdGFEZWZpbml0aW9uIElubGluZSBtZXRhZGF0YSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHdpbGwgY3JlYXRlIGEgdWk1IGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVVSTVDbGFzcyhzVGFyZ2V0OiBzdHJpbmcsIG1ldGFkYXRhRGVmaW5pdGlvbj86IFBhcnRpYWw8VUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbj4pOiBDbGFzc0RlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0b3I6IFVJNUNvbnRyb2xBbmRNb3JlKSB7XG5cdFx0aWYgKCFjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEpIHtcblx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSA9IHt9O1xuXHRcdH1cblx0XHRpZiAobWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdC4uLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLFxuXHRcdFx0XHRcdFx0XHQuLi4obWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXSBhcyBvYmplY3QpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY29uc3RydWN0b3IsIHNUYXJnZXQsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdH0gYXMgQ2xhc3NEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWZlcmVuY2U8VCBleHRlbmRzIFVJNUVsZW1lbnQ+KCk6IFJlZjxUPiB7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVCxcblx0XHRzZXRDdXJyZW50OiBmdW5jdGlvbiAob0NvbnRyb2xJbnN0YW5jZTogVCk6IHZvaWQge1xuXHRcdFx0dGhpcy5jdXJyZW50ID0gb0NvbnRyb2xJbnN0YW5jZTtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgZm9sbG93aW5nIG9iamVjdCB3aWxsIGhvbGQgYSByZWZlcmVuY2UgdG8gYSBjb250cm9sIHRocm91Z2gganN4IHRlbXBsYXRpbmcuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaGVhdnkgbGlmdGluZyB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGNyZWF0aW5nIHRoZSBjbGFzcyBwcm9wZXJ0eSBmb3IgdWk1IHRvIHVzZS5cbiAqXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNsYXp6Lm92ZXJyaWRlID0gZnVuY3Rpb24gKG9FeHRlbnNpb246IHVua25vd24pOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgcG9sID0ge307XG5cdFx0KHBvbCBhcyBGdW5jdGlvbikuY29uc3RydWN0b3IgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogRnVuY3Rpb24ge1xuXHRcdFx0cmV0dXJuIGNsYXp6LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NsYXNzID0gKE1ldGFkYXRhIGFzIHVua25vd24gYXMgeyBjcmVhdGVDbGFzczogRnVuY3Rpb24gfSkuY3JlYXRlQ2xhc3MoXG5cdFx0XHRjbGF6eixcblx0XHRcdGBhbm9ueW1vdXNFeHRlbnNpb25+JHt1aWQoKX1gLFxuXHRcdFx0cG9sLFxuXHRcdFx0Q29udHJvbGxlck1ldGFkYXRhXG5cdFx0KTtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fc3RhdGljT3ZlcnJpZGUgPSBvRXh0ZW5zaW9uO1xuXHRcdG9DbGFzcy5nZXRNZXRhZGF0YSgpLl9vdmVycmlkZSA9IChjbGF6ei5nZXRNZXRhZGF0YSgpIGFzIHsgX292ZXJyaWRlPzogdW5rbm93biB9KS5fb3ZlcnJpZGU7XG5cdFx0cmV0dXJuIG9DbGFzcztcblx0fTtcblxuXHRPYmplY3RQYXRoLnNldChuYW1lLCBvdXRwdXQpO1xuXG5cdHJldHVybiBvdXRwdXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7OztFQW9J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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ObjectPath from "sap/base/util/ObjectPath";
|
|
2
2
|
import merge from "sap/base/util/merge";
|
|
3
3
|
import uid from "sap/base/util/uid";
|
|
4
|
+
import { hookable } from "sap/fe/base/HookSupport";
|
|
4
5
|
import type { Ref } from "sap/fe/base/jsx-runtime/jsx";
|
|
5
6
|
import type UI5Event from "sap/ui/base/Event";
|
|
6
7
|
import type ManagedObject from "sap/ui/base/ManagedObject";
|
|
@@ -42,6 +43,7 @@ export type UI5AggregationMetadata = {
|
|
|
42
43
|
defaultClass?: unknown;
|
|
43
44
|
singularName?: string;
|
|
44
45
|
visibility?: string;
|
|
46
|
+
forwarding?: object;
|
|
45
47
|
};
|
|
46
48
|
export type UI5AssociationMetadata = {
|
|
47
49
|
type: string;
|
|
@@ -126,6 +128,8 @@ export type EnhanceWithUI5<T> = {
|
|
|
126
128
|
UI5Accessors<T> &
|
|
127
129
|
UI5Setters<T>;
|
|
128
130
|
|
|
131
|
+
export type ExtensionOverrideExecution = "Instead" | "Before" | "After" | "AfterAsync" | "BeforeAsync";
|
|
132
|
+
|
|
129
133
|
const ensureMetadata = function (target: UI5ControllerDefinition | UI5ControlDefinition): UI5ControlMetadataDefinition {
|
|
130
134
|
target.metadata = merge(
|
|
131
135
|
{
|
|
@@ -237,16 +241,21 @@ export function methodOverride(extensionName?: string): MethodDecorator {
|
|
|
237
241
|
/**
|
|
238
242
|
* Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
|
|
239
243
|
*
|
|
240
|
-
* @param
|
|
244
|
+
* @param overrideExecution The OverrideExecution defining when the override should run (Before / After / Instead)
|
|
241
245
|
* @returns The decorated method
|
|
242
246
|
*/
|
|
243
|
-
export function extensible(
|
|
244
|
-
return function (target: UI5ControllerDefinition, propertyKey) {
|
|
247
|
+
export function extensible(overrideExecution: ExtensionOverrideExecution): MethodDecorator {
|
|
248
|
+
return function (target: UI5ControllerDefinition, propertyKey, descriptor: PropertyDescriptor) {
|
|
245
249
|
const metadata = ensureMetadata(target);
|
|
246
250
|
if (!metadata.methods[propertyKey.toString()]) {
|
|
247
251
|
metadata.methods[propertyKey.toString()] = {};
|
|
248
252
|
}
|
|
249
|
-
metadata.methods[propertyKey.toString()].overrideExecution =
|
|
253
|
+
metadata.methods[propertyKey.toString()].overrideExecution = overrideExecution as unknown as OverrideExecution;
|
|
254
|
+
|
|
255
|
+
// by default, every extensible method is also hookable (except those defined as Instead)
|
|
256
|
+
if (overrideExecution !== "Instead") {
|
|
257
|
+
hookable(overrideExecution)(target, propertyKey, descriptor);
|
|
258
|
+
}
|
|
250
259
|
};
|
|
251
260
|
}
|
|
252
261
|
|
|
@@ -447,14 +456,9 @@ type UI5ControlAndMore = typeof Control &
|
|
|
447
456
|
*
|
|
448
457
|
* @param sTarget The fully qualified name of the UI5 class
|
|
449
458
|
* @param metadataDefinition Inline metadata definition
|
|
450
|
-
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
451
459
|
* @returns A class decorator that will create a ui5 class
|
|
452
460
|
*/
|
|
453
|
-
export function defineUI5Class(
|
|
454
|
-
sTarget: string,
|
|
455
|
-
metadataDefinition?: Partial<UI5ControlMetadataDefinition>,
|
|
456
|
-
forceDefineCall = false
|
|
457
|
-
): ClassDecorator {
|
|
461
|
+
export function defineUI5Class(sTarget: string, metadataDefinition?: Partial<UI5ControlMetadataDefinition>): ClassDecorator {
|
|
458
462
|
return function (constructor: UI5ControlAndMore) {
|
|
459
463
|
if (!constructor.prototype.metadata) {
|
|
460
464
|
constructor.prototype.metadata = {};
|
|
@@ -477,7 +481,7 @@ export function defineUI5Class(
|
|
|
477
481
|
}
|
|
478
482
|
}
|
|
479
483
|
}
|
|
480
|
-
return registerUI5Metadata(constructor, sTarget, constructor.prototype
|
|
484
|
+
return registerUI5Metadata(constructor, sTarget, constructor.prototype);
|
|
481
485
|
} as ClassDecorator;
|
|
482
486
|
}
|
|
483
487
|
|
|
@@ -517,15 +521,9 @@ export function defineReference(): PropertyDecorator {
|
|
|
517
521
|
* @param clazz The class prototype
|
|
518
522
|
* @param name The name of the class to create
|
|
519
523
|
* @param inObj The metadata object
|
|
520
|
-
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
521
524
|
* @returns The metadata class
|
|
522
525
|
*/
|
|
523
|
-
function registerUI5Metadata(
|
|
524
|
-
clazz: UI5ControlAndMore,
|
|
525
|
-
name: string,
|
|
526
|
-
inObj: UI5ControllerDefinition | UI5ControlDefinition,
|
|
527
|
-
forceDefineCall: boolean
|
|
528
|
-
): Function {
|
|
526
|
+
function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5ControllerDefinition | UI5ControlDefinition): Function {
|
|
529
527
|
if (clazz.getMetadata?.().isA("sap.ui.core.mvc.ControllerExtension")) {
|
|
530
528
|
Object.getOwnPropertyNames(inObj).forEach((objName) => {
|
|
531
529
|
const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
|
|
@@ -727,11 +725,5 @@ function registerUI5Metadata(
|
|
|
727
725
|
|
|
728
726
|
ObjectPath.set(name, output);
|
|
729
727
|
|
|
730
|
-
if (forceDefineCall) {
|
|
731
|
-
sap.ui.define(output.getMetadata().getName().replaceAll(".", "/"), () => {
|
|
732
|
-
return output;
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
|
-
|
|
736
728
|
return output;
|
|
737
729
|
}
|