@sapui5/sap.fe.core 1.92.0 → 1.93.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -3
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +2 -2
- package/src/sap/fe/core/AppComponent.js +21 -1
- package/src/sap/fe/core/CommonUtils.js +130 -48
- package/src/sap/fe/core/ExtensionAPI.js +238 -226
- package/src/sap/fe/core/PageController.js +5 -2
- package/src/sap/fe/core/TemplateComponent.js +1 -0
- package/src/sap/fe/core/TransactionHelper.js +35 -8
- package/src/sap/fe/core/actions/draft.js +1 -1
- package/src/sap/fe/core/actions/messageHandling.js +18 -6
- package/src/sap/fe/core/actions/operations.js +17 -41
- package/src/sap/fe/core/controllerextensions/EditFlow.js +127 -43
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +11 -11
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +417 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +399 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -3
- package/src/sap/fe/core/controllerextensions/PageReady.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +102 -66
- package/src/sap/fe/core/controllerextensions/SideEffects.js +60 -14
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +53 -12
- package/src/sap/fe/core/controllerextensions/ViewState.js +18 -18
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +13 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +68 -2
- package/src/sap/fe/core/converters/ConverterContext.js +15 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +11 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +14 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -14
- package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -12
- package/src/sap/fe/core/converters/MetaModelConverter.js +32 -2
- package/src/sap/fe/core/converters/MetaModelConverter.ts +39 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +10 -6
- package/src/sap/fe/core/converters/annotations/DataField.ts +9 -5
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +14 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +25 -15
- package/src/sap/fe/core/converters/controls/Common/Action.ts +33 -19
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +50 -0
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +33 -0
- package/src/sap/fe/core/converters/controls/Common/Form.js +2 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +1 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.js +181 -0
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +220 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +121 -59
- package/src/sap/fe/core/converters/controls/Common/Table.ts +130 -62
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +9 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +62 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +58 -6
- package/src/sap/fe/core/converters/helpers/Aggregation.js +86 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +79 -8
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +44 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +43 -2
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +8 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +7 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +93 -0
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +92 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +102 -23
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -17
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +44 -5
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +39 -2
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +41 -30
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +47 -30
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +77 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +58 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +103 -0
- package/src/sap/fe/core/formatters/KPIFormatter.ts +88 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +161 -97
- package/src/sap/fe/core/helpers/BindingExpression.ts +188 -117
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +45 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -8
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +16 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +7 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +7 -2
- package/src/sap/fe/core/templating/UIFormatters.js +1 -5
- package/src/sap/fe/core/templating/UIFormatters.ts +0 -3
|
@@ -96,7 +96,10 @@ sap.ui.define(
|
|
|
96
96
|
|
|
97
97
|
// View level for FCL cases is calculated from the target pattern
|
|
98
98
|
if (that._mTargets[sTargetName].contextPattern !== undefined) {
|
|
99
|
-
that._mTargets[sTargetName].viewLevel = that._getViewLevelFromPattern(
|
|
99
|
+
that._mTargets[sTargetName].viewLevel = that._getViewLevelFromPattern(
|
|
100
|
+
that._mTargets[sTargetName].contextPattern,
|
|
101
|
+
0
|
|
102
|
+
);
|
|
100
103
|
}
|
|
101
104
|
});
|
|
102
105
|
|
|
@@ -112,8 +115,7 @@ sap.ui.define(
|
|
|
112
115
|
if (sRoutePattern.length < 8 || sRoutePattern.indexOf(":?query:") !== sRoutePattern.length - 8) {
|
|
113
116
|
Log.error("Pattern for route " + sRouteName + " doesn't end with ':?query:' : " + sRoutePattern);
|
|
114
117
|
}
|
|
115
|
-
|
|
116
|
-
var iRouteLevel = that._getViewLevelFromPattern(sRoutePattern);
|
|
118
|
+
var iRouteLevel = that._getViewLevelFromPattern(sRoutePattern, 0);
|
|
117
119
|
that._mRoutes[sRouteName] = {
|
|
118
120
|
name: sRouteName,
|
|
119
121
|
pattern: sRoutePattern,
|
|
@@ -267,14 +269,25 @@ sap.ui.define(
|
|
|
267
269
|
* Calculates a view level from a pattern by counting the number of segments.
|
|
268
270
|
*
|
|
269
271
|
* @param {string} sPattern The pattern
|
|
272
|
+
* @param {number} viewLevel The current level of view
|
|
270
273
|
* @returns {number} The level
|
|
271
274
|
*/
|
|
272
|
-
_getViewLevelFromPattern: function(sPattern) {
|
|
275
|
+
_getViewLevelFromPattern: function(sPattern, viewLevel) {
|
|
273
276
|
sPattern = sPattern.replace(":?query:", "");
|
|
277
|
+
var regex = new RegExp("/[^/]*$");
|
|
274
278
|
if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
|
|
275
279
|
sPattern = "/" + sPattern;
|
|
276
280
|
}
|
|
277
|
-
|
|
281
|
+
if (sPattern.length) {
|
|
282
|
+
sPattern = sPattern.replace(regex, "");
|
|
283
|
+
if (this.oRouter.match(sPattern) || sPattern === "") {
|
|
284
|
+
return this._getViewLevelFromPattern(sPattern, ++viewLevel);
|
|
285
|
+
} else {
|
|
286
|
+
return this._getViewLevelFromPattern(sPattern, viewLevel);
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
return viewLevel;
|
|
290
|
+
}
|
|
278
291
|
},
|
|
279
292
|
|
|
280
293
|
_getRouteInformation: function(sRouteName) {
|
|
@@ -530,6 +543,16 @@ sap.ui.define(
|
|
|
530
543
|
}
|
|
531
544
|
},
|
|
532
545
|
|
|
546
|
+
_findPathToNavigate: function(sPath) {
|
|
547
|
+
var regex = new RegExp("/[^/]*$");
|
|
548
|
+
sPath = sPath.replace(regex, "");
|
|
549
|
+
if (this.oRouter.match(sPath) || sPath === "") {
|
|
550
|
+
return sPath;
|
|
551
|
+
} else {
|
|
552
|
+
return this._findPathToNavigate(sPath);
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
|
|
533
556
|
_getPathFromContext: function(oContext, mParameters) {
|
|
534
557
|
var sPath;
|
|
535
558
|
|
|
@@ -541,8 +564,7 @@ sap.ui.define(
|
|
|
541
564
|
|
|
542
565
|
if (mParameters.updateFCLLevel === -1) {
|
|
543
566
|
// When navigating back from a context, we need to remove the last component of the path
|
|
544
|
-
|
|
545
|
-
sPath = sPath.replace(regex, "");
|
|
567
|
+
sPath = this._findPathToNavigate(sPath);
|
|
546
568
|
|
|
547
569
|
// Check if we're navigating back to a semantic path that was previously resolved
|
|
548
570
|
if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
|
|
@@ -695,7 +717,7 @@ sap.ui.define(
|
|
|
695
717
|
// Reset internal state
|
|
696
718
|
this.navigationInfoQueue = [];
|
|
697
719
|
EditState.resetEditState();
|
|
698
|
-
this.bExitOnNavigateBackToRoot =
|
|
720
|
+
this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
|
|
699
721
|
|
|
700
722
|
var bIsIappState =
|
|
701
723
|
that.oRouter
|
|
@@ -225,7 +225,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
225
225
|
* @param {Array} aPathExpressions Targets of SideEffects to be executed
|
|
226
226
|
* @param {object} oContext Context where SideEffects need to be executed
|
|
227
227
|
* @param {string} sGroupId The group ID to be used for the request
|
|
228
|
-
* @returns {
|
|
228
|
+
* @returns {Promise} Promise on SideEffects request
|
|
229
229
|
*/
|
|
230
230
|
|
|
231
231
|
}, {
|
|
@@ -233,7 +233,19 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
233
233
|
value: function requestSideEffects(aPathExpressions, oContext, sGroupId) {
|
|
234
234
|
this._logRequest(aPathExpressions, oContext);
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
var oPromise;
|
|
237
|
+
/**
|
|
238
|
+
* Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
|
|
239
|
+
* to avoid breaking the promise chain.
|
|
240
|
+
*/
|
|
241
|
+
|
|
242
|
+
try {
|
|
243
|
+
oPromise = oContext.requestSideEffects(aPathExpressions, sGroupId);
|
|
244
|
+
} catch (e) {
|
|
245
|
+
oPromise = Promise.reject(e);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return oPromise;
|
|
237
249
|
}
|
|
238
250
|
/**
|
|
239
251
|
* Request SideEffects for a navigation property on a specific context.
|
|
@@ -524,7 +536,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
524
536
|
mTarget = mTarget.map(function (mProperty) {
|
|
525
537
|
var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
526
538
|
|
|
527
|
-
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp(sBindingParameterName + "
|
|
539
|
+
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "?."), "");
|
|
528
540
|
return bNavigationPropertyPath ? {
|
|
529
541
|
$NavigationPropertyPath: sValue
|
|
530
542
|
} : sValue;
|
|
@@ -717,4 +729,4 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
717
729
|
|
|
718
730
|
return SideEffectsServiceFactory;
|
|
719
731
|
}, false);
|
|
720
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwidmFsdWUiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsInNQcm9wZXJ0eVBhdGgiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9FbnRpdHlUeXBlIiwib1RlbXBTaWRlRWZmZWN0cyIsIl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyIiwiX2NvbnZlcnRUYXJnZXRzRm9ybWF0IiwiX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiYVRhcmdldFByb3BlcnRpZXMiLCJ2VGFyZ2V0Iiwic1RhcmdldCIsInR5cGUiLCJtVGFyZ2V0RW50aXR5Iiwib1NvdXJjZSIsImF1dGhvcml6ZWRUeXBlcyIsIl90eXBlIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwiX2NvbnZlcnRTaWRlRWZmZWN0cyIsInNUYXJnZXRQYXRocyIsInNQYXRocyIsImRlYnVnIiwic0JpbmRpbmdQYXJhbWV0ZXJOYW1lIiwiYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiaUluZGV4IiwiZmluZEluZGV4IiwibVNlYXJjaFRhcmdldCIsImJTaWRlRWZmZWN0c0NoYW5nZWQiLCJhRW50aXRpZXMiLCJtTmF2aWdhdGlvbiIsImFQcm9wZXJ0aWVzIiwiYlRhcmdldENoYW5nZWQiLCJpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCIsInNOYXZpZ2F0aW9uUGF0aCIsIm9UYXJnZXQiLCJpbmNsdWRlcyIsImFBY3Rpb25zIiwib0FjdGlvbiIsInRyaWdnZXJBY3Rpb25zIiwicGF0aEV4cHJlc3Npb25zIiwiX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsIm9FbnRpdHlTaWRlRWZmZWN0cyIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7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QUFsRCxDQUEwRDdELFdBQVcsQ0FBQzhELGdCQUFiLElBQTJDLEVBQXBHLENBQVg7O0FBQ0Esa0JBQUl6RCxjQUFjLElBQUlpSixjQUFjLENBQUMvRixPQUFmLENBQXVCbEQsY0FBdkIsTUFBMkMsQ0FBQyxDQUFsRSxFQUFxRTtBQUNwRWlKLGdCQUFBQSxjQUFjLENBQUN0RixJQUFmLENBQW9CM0QsY0FBcEI7QUFDQTtBQUNELGFBTkQ7O0FBT0FrSixZQUFBQSxlQUFlLEdBQUcsTUFBSSxDQUFDdEYsdUJBQUwsQ0FBNkJsQixRQUE3QixDQUFsQjtBQUNBRyxZQUFBQSxZQUFZLENBQUN4QixXQUFELENBQVosR0FBNEI7QUFBRTZILGNBQUFBLGVBQWUsRUFBZkEsZUFBRjtBQUFtQkQsY0FBQUEsY0FBYyxFQUFkQTtBQUFuQixhQUE1QjtBQUNBLFdBZkQ7QUFnQkE7O0FBQ0QsZUFBT3BHLFlBQVA7QUFDQTtBQUVEOzs7Ozs7Ozs7Ozs7OztzREFXd0NxQixXLEVBQStEO0FBQ3RHLFlBQU1rRixrQkFBd0QsR0FBRyxFQUFqRTs7QUFDQSxhQUFLRCx5QkFBTCxDQUErQmpGLFdBQS9CLEVBQTRDdEMsT0FBNUMsQ0FBb0QsVUFBQWlCLFlBQVksRUFBSTtBQUNuRXVHLFVBQUFBLGtCQUFrQixDQUFDdkcsWUFBWSxDQUFDL0Msa0JBQWQsQ0FBbEIsR0FBc0QrQyxZQUF0RDtBQUNBLFNBRkQ7O0FBR0EsZUFBT3VHLGtCQUFQO0FBQ0E7OztxQ0FFbUI7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUEvakIrQkMsTzs7TUFra0IzQkMseUI7Ozs7Ozs7Ozs7Ozs7cUNBQ1VDLGUsRUFBc0Q7QUFDcEUsWUFBTUMseUJBQXlCLEdBQUcsSUFBSXhLLGtCQUFKLENBQXVCdUssZUFBdkIsQ0FBbEM7QUFDQSxlQUFPQyx5QkFBeUIsQ0FBQ2pLLFdBQWpDO0FBQ0E7Ozs7SUFKc0NrSyxjOztTQU96QkgseUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VGYWN0b3J5LCBTZXJ2aWNlLCBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29udGV4dCwgT0RhdGFNZXRhTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0XCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMsIFF1YWxpZmllZE5hbWUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ29tbW9uXCI7XG5pbXBvcnQgeyBBY3Rpb24sIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSA9IHtcblx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZztcbn07XG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0ID0gU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlIHwgc3RyaW5nO1xuXG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG50eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdO1xuXHR0cmlnZ2VyQWN0aW9ucz86IFF1YWxpZmllZE5hbWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0U291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBCYXNlU2lkZUVmZmVjdHNUeXBlICYge1xuXHRTb3VyY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cdFNvdXJjZUVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRUcmlnZ2VyQWN0aW9uPzogUXVhbGlmaWVkTmFtZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzQWN0aW9uRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIEV4dHJhY3RvclByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydHk6IFByb3BlcnR5O1xuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcbn07XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0X29TaWRlRWZmZWN0c1R5cGUhOiBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5O1xuXHRfb0NhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXHRfYkluaXRpYWxpemVkITogQm9vbGVhbjtcblx0Ly8gITogbWVhbnMgdGhhdCB3ZSBrbm93IGl0IHdpbGwgYmUgYXNzaWduZWQgYmVmb3JlIHVzYWdlXG5cdGluaXQoKSB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdG9EYXRhOiB7XG5cdFx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdFx0YWN0aW9uczoge31cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sOiB7fVxuXHRcdH07XG5cdFx0dGhpcy5fYkluaXRpYWxpemVkID0gZmFsc2U7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbFxuXHQgKiBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGlzIGFkZGVkIGJ5IGEgY29udHJvbCB0byBrZWVwIGRhdGEgdXAgdG8gZGF0ZVxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBnZXQgbGltaXRlZCBzY29wZSBjb21wYXJlZCB3aXRoIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIHNlcnZpY2U6XG5cdCAqIC0gT25seSBvbmUgU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGNvbWJpbmF0aW9uIGVudGl0eSB0eXBlIC0gY29udHJvbCBJZFxuXHQgKiAtIE9ubHkgU2lkZUVmZmVjdHMgc291cmNlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHVzZWQgdG8gdHJpZ2dlciBTaWRlRWZmZWN0c1xuXHQgKlxuXHQgKiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ29udHJvbFNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlOiBzdHJpbmcsIG9TaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0OiBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0XHQuLi5vU2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzRW50aXR5VHlwZSArIFwiL1NpZGVFZmZlY3RzRm9yQ29udHJvbC9cIiArIG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHMgPSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdIHx8IHt9O1xuXHRcdFx0bUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0c1tvQ29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IG9Db250cm9sU2lkZUVmZmVjdDtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gPSBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBTaWRlRWZmZWN0cyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICovXG5cdHB1YmxpYyBleGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uOiBTdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRcdGNvbnN0IG9UcmlnZ2VyQWN0aW9uOiBhbnkgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KHNUcmlnZ2VyQWN0aW9uICsgXCIoLi4uKVwiLCBvQ29udGV4dCk7XG5cdFx0b1RyaWdnZXJBY3Rpb24uZXhlY3V0ZShzR3JvdXBJZCB8fCAob0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGNvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWwuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgT0RhdGEgbWV0YU1vZGVsXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk6IENvbnZlcnRlck91dHB1dCB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgYW55O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb0NvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBjb252ZXJ0VHlwZXMob01ldGFNb2RlbCwgdGhpcy5fb0NhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWQgfSBFbnRpdHkgVHlwZVxuXHQgKi9cblx0cHVibGljIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRzRW50aXR5VHlwZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aClbXCIkVHlwZVwiXTtcblx0XHRyZXR1cm4gc0VudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWU6IHN0cmluZywgb0NvbnRleHQ/OiBDb250ZXh0KTogQWN0aW9uU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0aWYgKHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmFjdGlvbnNbc0VudGl0eVR5cGVdPy5bc0FjdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9DYXBhYmlsaXRpZXMgVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzXG5cdCAqL1xuXHRwdWJsaWMgaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9DYXBhYmlsaXRpZXM/OiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyk6IHZvaWQge1xuXHRcdHRoaXMuX29DYXBhYmlsaXRpZXMgPSBvQ2FwYWJpbGl0aWVzO1xuXHRcdGlmICghdGhpcy5fYkluaXRpYWxpemVkKSB7XG5cdFx0XHRjb25zdCBvQ29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRcdG9Db252ZXJ0ZWRNZXRhTW9kZWwuZW50aXR5VHlwZXMuZm9yRWFjaChlbnRpdHlUeXBlID0+IHtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGVudGl0eVR5cGUpOyAvLyBvbmx5IGJvdW5kIGFjdGlvbnMgYXJlIGFuYWx5emVkIHNpbmNlIHVuYm91bmQgb25lcyBkb24ndCBnZXQgU2lkZUVmZmVjdHNcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fYkluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbGwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbCkuZm9yRWFjaChzRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXVtzQ29udHJvbElkXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXVtzQ29udHJvbElkXTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFRhcmdldHMgb2YgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdHB1YmxpYyByZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHR0aGlzLl9sb2dSZXF1ZXN0KGFQYXRoRXhwcmVzc2lvbnMsIG9Db250ZXh0KTtcblx0XHRyZXR1cm4gKG9Db250ZXh0IGFzIGFueSkucmVxdWVzdFNpZGVFZmZlY3RzKGFQYXRoRXhwcmVzc2lvbnMsIHNHcm91cElkKSBhcyBQcm9taXNlPGFueT47XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlQYXRoID0+IG9Qcm9wZXJ0eVBhdGgudmFsdWUuaW5kZXhPZihzTmF2aWdhdGlvblByb3BlcnR5KSA+IC0xXG5cdFx0XHRcdFx0XHRcdCkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PiBvTmF2aWdhdGlvblByb3BlcnR5UGF0aC52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihvU2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtVGFyZ2V0ID0+IGFUYXJnZXRzLnB1c2gobVRhcmdldCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgcHJvcGVydGllc1xuXHRcdFx0YVRhcmdldHMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdGlmIChhVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpLmNhdGNoKG9FcnJvciA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSBcIiArIHNOYXZpZ2F0aW9uUHJvcGVydHksIG9FcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBOYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIHRleHQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU2lkZUVmZmVjdHNcblx0ICogSWYgYSBwcm9wZXJ0eSBoYXMgYW4gYXNzb2NpYXRlZCB0ZXh0IHRoZW4gdGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBhSW5pdGlhbFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5wcm9wZXJ0aWVzIHx8XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdGlmIChiSXNTdGFyUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYmVoaW5kIHRoZSAqXG5cdFx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5tYXAobVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogbVByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0bVByb3BlcnR5ID0+IG1Qcm9wZXJ0eS5uYW1lID09PSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKVxuXHRcdFx0XHRcdFx0XHQpIGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgZW50aXR5IHR5cGUgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJTaWRlRWZmZWN0cyAtIFRoZSBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFEZXJpdmVkUHJvcGVydGllcy5mb3JFYWNoKG1Qcm9wZXJ0eUluZm8gPT4ge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldFRleHRQYXRoID0gKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCBhcyBhbnkpPy5wYXRoLFxuXHRcdFx0XHRcdHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5ID0gbVByb3BlcnR5SW5mby5uYXZpZ2F0aW9uUGF0aCArIHNUYXJnZXRUZXh0UGF0aDtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBwcm9wZXJ0eSBUZXh0IG11c3QgYmUgYWRkZWQgb25seSBpZiB0aGUgcHJvcGVydHkgaXNcblx0XHRcdFx0ICogLSBub3QgcGFydCBvZiBhIHN0YXIgcHJvcGVydHkgKC5pLmUgJyonIG9yICduYXZpZ2F0aW9uLyonKSBvciBhIHRhcmdldGVkIEVudGl0eVxuXHRcdFx0XHQgKiAtIG5vdCBpbmNsdWRlIGludG8gdGhlIGluaXRpYWwgdGFyZ2V0ZWQgcHJvcGVydGllcyBvZiBTaWRlRWZmZWN0c1xuXHRcdFx0XHQgKiAgSW5kZWVkIGluIHRoZSB0d28gbGlzdGVkIGNhc2VzLCB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0ZXh0IHdpbGwgYmUvaXMgcmVxdWVzdGVkIGJ5IGluaXRpYWwgU2lkZUVmZmVjdHMgY29uZmlndXJhdGlvbi5cblx0XHRcdFx0ICovXG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNUYXJnZXRUZXh0UGF0aCAmJlxuXHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5LnN1YnN0cmluZygwLCBzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5sYXN0SW5kZXhPZihcIi9cIikpKSA9PT1cblx0XHRcdFx0XHRcdC0xICYmXG5cdFx0XHRcdFx0YUluaXRpYWxQcm9wZXJ0aWVzLmluZGV4T2Yoc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0c0VudGl0eVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRzQmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0VudGl0eVR5cGU7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb1RlbXBTaWRlRWZmZWN0cyA9IHRoaXMuX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIodGhpcy5fY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzKSwgc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZVxuXHRcdFx0PyB0aGlzLl9yZXBsYWNlUmVmZXJlbmNlZFByb3BlcnRpZXModGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSksIG1FbnRpdHlUeXBlKVxuXHRcdFx0OiBvVGVtcFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gQ29udmVydGVkIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLnJlZHVjZShmdW5jdGlvbihhVGFyZ2V0UHJvcGVydGllcywgdlRhcmdldCkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0ID0gKHR5cGVvZiB2VGFyZ2V0ID09PSBcInN0cmluZ1wiICYmIHZUYXJnZXQpIHx8ICh2VGFyZ2V0LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIgJiYgdlRhcmdldC52YWx1ZSk7XG5cdFx0XHRcdGlmIChzVGFyZ2V0KSB7XG5cdFx0XHRcdFx0YVRhcmdldFByb3BlcnRpZXMucHVzaChzVGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgVGFyZ2V0UHJvcGVydGllcyBmb3IgU2lkZUVmZmVjdHNcIiArIG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhVGFyZ2V0UHJvcGVydGllcztcblx0XHRcdH0sIFtdKSxcblx0XHRcdFRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGVbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkubWFwKG1UYXJnZXRFbnRpdHkgPT4ge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogIFNpZGVFZmZlY3RzIHRoYXQgY29tZXMgZnJvbSBTQVAgRkUgZ2V0IFRhcmdldEVudGl0aWVzIHdpdGggJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggd2hlcmVhc1xuXHRcdFx0XHQgKiAgb25lcyBjb21pbmcgZnJvbSB0aGUgY29udmVydGVkIE9EYXRhIG1vZGVsIGdldHMgYSBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGZvcm1hdFxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0cmV0dXJuIHsgXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiOiBtVGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IG1UYXJnZXRFbnRpdHkudmFsdWUgfHwgXCJcIiB9O1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIHsgLi4ub1NpZGVFZmZlY3RzLCAuLi57IFRhcmdldFByb3BlcnRpZXMsIFRhcmdldEVudGl0aWVzIH0gfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG9Tb3VyY2U6IGFueSk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGNvbnN0IGFTaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGF1dGhvcml6ZWRUeXBlcyA9IFtcIkVudGl0eVR5cGVcIiwgXCJBY3Rpb25cIl07XG5cdFx0aWYgKG9Tb3VyY2UuX3R5cGUgJiYgYXV0aG9yaXplZFR5cGVzLmluZGV4T2Yob1NvdXJjZS5fdHlwZSkgPiAtMSkge1xuXHRcdFx0Y29uc3QgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBvU291cmNlLl90eXBlID09PSBcIkVudGl0eVR5cGVcIiA/IG9Tb3VyY2UgOiBvU291cmNlLnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3QgbUNvbW1vbkFubm90YXRpb246IGFueSA9IG9Tb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXIgPSAoKG9Tb3VyY2UgYXMgQWN0aW9uKS5wYXJhbWV0ZXJzIHx8IFtdKS5maW5kKFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXIgPT4gbVBhcmFtZXRlci50eXBlID09PSAobUVudGl0eVR5cGUgfHwgb1NvdXJjZSkuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gbUJpbmRpbmdQYXJhbWV0ZXIgPyBtQmluZGluZ1BhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdIDogXCJcIjtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbW1vbkFubm90YXRpb24pXG5cdFx0XHRcdFx0LmZpbHRlcihzQW5ub3RhdGlvbk5hbWUgPT4gbUNvbW1vbkFubm90YXRpb25bc0Fubm90YXRpb25OYW1lXS4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZSlcblx0XHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIHNCaW5kaW5nUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChzQmluZGluZ1BhcmFtZXRlck5hbWUgKyBcIi5cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIFNpZGVFZmZlY3RzIFNvdXJjZSBQcm9wZXJ0eSBpcyBhbiBuYXZpZ2F0aW9uIGVudGl0eSByZWZlcmVuY2UsIHRoZSBTaWRlRWZmZWN0cyBUYXJnZXQgUHJvcGVydGllcyBjYW5ub3QgYmUgYSBwcm9wZXJ0eSBvZiB0aGlzIG5hdmlnYXRpb24gZW50aXR5LlxuXHQgKiBJbmRlZWQgdGhpcyBjb25maWd1cmF0aW9uIGxlYWRzIHRvIGVycm9yIGludG8gdGhlIE9EYXRhIFY0IE1vZGVsIHNpbmNlIHJlc3BvbnNlIGNhbm5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSB0aGlzIHdvdWxkIG1lYW4gdGhhdCB3ZSBtZXJnZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgdGFyZ2V0IGludG8gdGhlIG9sZCB0YXJnZXQgb2YgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdCAqIEluIG9yZGVyIHRvIHJlcXVlc3QgbmV3IHZhbHVlIG9mIHRoZXNlIHRhcmdldCBwcm9wZXJ0aWVzIHRoZSBTaWRlRWZmZWN0cyB3aWxsIHJlcXVlc3QgZm9yIHRoZSBlbnRpcmUgRW50aXR5IGluc3RlYWQgb2YganVzdCBhIHNldCBvZiBwcm9wZXJ0aWVzLlxuXHQgKiBGb3IgdGhlIGZpcnN0IHZlcnNpb24sIHdlIHJlbW92ZSBhbGwgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFuZCByZXBsYWNlIHRoZW0gYnkgdGFyZ2V0RW50aXRpZXMuIFRoaXMgY2hhbmdlIGNvdWxkIGJlIGltcHJvdmVkIGluIG5leHQgdmVyc2lvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSAgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRob3V0IHJlZmVyZW5jZWQgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRsZXQgYlNpZGVFZmZlY3RzQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdGNvbnN0IGFFbnRpdGllczogc3RyaW5nW10gPVxuXHRcdFx0XHQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLm1hcChtTmF2aWdhdGlvbiA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1OYXZpZ2F0aW9uLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdFx0XHR9KSB8fCBbXSxcblx0XHRcdGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0bGV0IGJUYXJnZXRDaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRjb25zdCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCA9IHNQcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0aWYgKGlMYXN0UGF0aFNlcGFyYXRvckluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCk7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRpZiAob1RhcmdldCAmJiBvVGFyZ2V0Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0Ly9UZXN0IGlmIGl0J3Mgbm90IGEgcHJvcGVydHkgYm91bmQgb24gY29tcGxleFR5cGUgKF9Db21wbGV4VHlwZS9NeVByb3BlcnR5KVxuXHRcdFx0XHRcdGJTaWRlRWZmZWN0c0NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGJUYXJnZXRDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoIWFFbnRpdGllcy5pbmNsdWRlcyhzTmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0XHRhRW50aXRpZXMucHVzaChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFiVGFyZ2V0Q2hhbmdlZCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGJTaWRlRWZmZWN0c0NoYW5nZWQpIHtcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydGllcztcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzID0gYUVudGl0aWVzLm1hcChzTmF2aWdhdGlvblBhdGggPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2aWdhdGlvblBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBvU2lkZUVmZmVjdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGFjdGlvbiB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgb24gYWN0aW9uc1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IGFBY3Rpb25zID0gbUVudGl0eVR5cGUuYWN0aW9ucztcblx0XHRpZiAoYUFjdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGFBY3Rpb25zKS5mb3JFYWNoKHNBY3Rpb25OYW1lID0+IHtcblx0XHRcdFx0Y29uc3Qgb0FjdGlvbiA9IG1FbnRpdHlUeXBlLmFjdGlvbnNbc0FjdGlvbk5hbWVdO1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uczogU3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblxuXHRcdFx0XHR0aGlzLl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob0FjdGlvbikuZm9yRWFjaChvU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RyaWdnZXJBY3Rpb24gPSBvU2lkZUVmZmVjdC5UcmlnZ2VyQWN0aW9uO1xuXHRcdFx0XHRcdGFUYXJnZXRzID0gYVRhcmdldHMuY29uY2F0KG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKTtcblx0XHRcdFx0XHRpZiAoc1RyaWdnZXJBY3Rpb24gJiYgdHJpZ2dlckFjdGlvbnMuaW5kZXhPZihzVHJpZ2dlckFjdGlvbikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXRoRXhwcmVzc2lvbnMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdFx0b1NpZGVFZmZlY3RzW3NBY3Rpb25OYW1lXSA9IHsgcGF0aEV4cHJlc3Npb25zLCB0cmlnZ2VyQWN0aW9ucyB9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9FbnRpdHlTaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG1FbnRpdHlUeXBlKS5mb3JFYWNoKG9TaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRvRW50aXR5U2lkZUVmZmVjdHNbb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvU2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9FbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
|
|
732
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwidmFsdWUiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsInNQcm9wZXJ0eVBhdGgiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9FbnRpdHlUeXBlIiwib1RlbXBTaWRlRWZmZWN0cyIsIl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyIiwiX2NvbnZlcnRUYXJnZXRzRm9ybWF0IiwiX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiYVRhcmdldFByb3BlcnRpZXMiLCJ2VGFyZ2V0Iiwic1RhcmdldCIsInR5cGUiLCJtVGFyZ2V0RW50aXR5Iiwib1NvdXJjZSIsImF1dGhvcml6ZWRUeXBlcyIsIl90eXBlIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwiX2NvbnZlcnRTaWRlRWZmZWN0cyIsInNUYXJnZXRQYXRocyIsInNQYXRocyIsImRlYnVnIiwic0JpbmRpbmdQYXJhbWV0ZXJOYW1lIiwiYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiaUluZGV4IiwiZmluZEluZGV4IiwibVNlYXJjaFRhcmdldCIsImJTaWRlRWZmZWN0c0NoYW5nZWQiLCJhRW50aXRpZXMiLCJtTmF2aWdhdGlvbiIsImFQcm9wZXJ0aWVzIiwiYlRhcmdldENoYW5nZWQiLCJpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCIsInNOYXZpZ2F0aW9uUGF0aCIsIm9UYXJnZXQiLCJpbmNsdWRlcyIsImFBY3Rpb25zIiwib0FjdGlvbiIsInRyaWdnZXJBY3Rpb25zIiwicGF0aEV4cHJlc3Npb25zIiwiX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsIm9FbnRpdHlTaWRlRWZmZWN0cyIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0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c0Q7QUFDcEUsWUFBTUMseUJBQXlCLEdBQUcsSUFBSTNLLGtCQUFKLENBQXVCMEssZUFBdkIsQ0FBbEM7QUFDQSxlQUFPQyx5QkFBeUIsQ0FBQ3BLLFdBQWpDO0FBQ0E7Ozs7SUFKc0NxSyxjOztTQU96QkgseUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VGYWN0b3J5LCBTZXJ2aWNlLCBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29udGV4dCwgT0RhdGFNZXRhTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0XCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMsIFF1YWxpZmllZE5hbWUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ29tbW9uXCI7XG5pbXBvcnQgeyBBY3Rpb24sIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSA9IHtcblx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZztcbn07XG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0ID0gU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlIHwgc3RyaW5nO1xuXG50eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG50eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdO1xuXHR0cmlnZ2VyQWN0aW9ucz86IFF1YWxpZmllZE5hbWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0U291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBCYXNlU2lkZUVmZmVjdHNUeXBlICYge1xuXHRTb3VyY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cdFNvdXJjZUVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRUcmlnZ2VyQWN0aW9uPzogUXVhbGlmaWVkTmFtZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzQWN0aW9uRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIEV4dHJhY3RvclByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydHk6IFByb3BlcnR5O1xuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcbn07XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0X29TaWRlRWZmZWN0c1R5cGUhOiBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5O1xuXHRfb0NhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXHRfYkluaXRpYWxpemVkITogQm9vbGVhbjtcblx0Ly8gITogbWVhbnMgdGhhdCB3ZSBrbm93IGl0IHdpbGwgYmUgYXNzaWduZWQgYmVmb3JlIHVzYWdlXG5cdGluaXQoKSB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdG9EYXRhOiB7XG5cdFx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdFx0YWN0aW9uczoge31cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sOiB7fVxuXHRcdH07XG5cdFx0dGhpcy5fYkluaXRpYWxpemVkID0gZmFsc2U7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbFxuXHQgKiBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGlzIGFkZGVkIGJ5IGEgY29udHJvbCB0byBrZWVwIGRhdGEgdXAgdG8gZGF0ZVxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBnZXQgbGltaXRlZCBzY29wZSBjb21wYXJlZCB3aXRoIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIHNlcnZpY2U6XG5cdCAqIC0gT25seSBvbmUgU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGNvbWJpbmF0aW9uIGVudGl0eSB0eXBlIC0gY29udHJvbCBJZFxuXHQgKiAtIE9ubHkgU2lkZUVmZmVjdHMgc291cmNlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHVzZWQgdG8gdHJpZ2dlciBTaWRlRWZmZWN0c1xuXHQgKlxuXHQgKiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ29udHJvbFNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlOiBzdHJpbmcsIG9TaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0OiBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0XHQuLi5vU2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzRW50aXR5VHlwZSArIFwiL1NpZGVFZmZlY3RzRm9yQ29udHJvbC9cIiArIG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHMgPSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdIHx8IHt9O1xuXHRcdFx0bUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0c1tvQ29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IG9Db250cm9sU2lkZUVmZmVjdDtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gPSBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBTaWRlRWZmZWN0cyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICovXG5cdHB1YmxpYyBleGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uOiBTdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRcdGNvbnN0IG9UcmlnZ2VyQWN0aW9uOiBhbnkgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KHNUcmlnZ2VyQWN0aW9uICsgXCIoLi4uKVwiLCBvQ29udGV4dCk7XG5cdFx0b1RyaWdnZXJBY3Rpb24uZXhlY3V0ZShzR3JvdXBJZCB8fCAob0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGNvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWwuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgT0RhdGEgbWV0YU1vZGVsXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk6IENvbnZlcnRlck91dHB1dCB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgYW55O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb0NvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBjb252ZXJ0VHlwZXMob01ldGFNb2RlbCwgdGhpcy5fb0NhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWQgfSBFbnRpdHkgVHlwZVxuXHQgKi9cblx0cHVibGljIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRzRW50aXR5VHlwZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aClbXCIkVHlwZVwiXTtcblx0XHRyZXR1cm4gc0VudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWU6IHN0cmluZywgb0NvbnRleHQ/OiBDb250ZXh0KTogQWN0aW9uU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0aWYgKHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmFjdGlvbnNbc0VudGl0eVR5cGVdPy5bc0FjdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9DYXBhYmlsaXRpZXMgVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzXG5cdCAqL1xuXHRwdWJsaWMgaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9DYXBhYmlsaXRpZXM/OiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyk6IHZvaWQge1xuXHRcdHRoaXMuX29DYXBhYmlsaXRpZXMgPSBvQ2FwYWJpbGl0aWVzO1xuXHRcdGlmICghdGhpcy5fYkluaXRpYWxpemVkKSB7XG5cdFx0XHRjb25zdCBvQ29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRcdG9Db252ZXJ0ZWRNZXRhTW9kZWwuZW50aXR5VHlwZXMuZm9yRWFjaChlbnRpdHlUeXBlID0+IHtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGVudGl0eVR5cGUpOyAvLyBvbmx5IGJvdW5kIGFjdGlvbnMgYXJlIGFuYWx5emVkIHNpbmNlIHVuYm91bmQgb25lcyBkb24ndCBnZXQgU2lkZUVmZmVjdHNcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fYkluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbGwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbCkuZm9yRWFjaChzRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXVtzQ29udHJvbElkXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXVtzQ29udHJvbElkXTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFRhcmdldHMgb2YgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0ICovXG5cdHB1YmxpYyByZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHR0aGlzLl9sb2dSZXF1ZXN0KGFQYXRoRXhwcmVzc2lvbnMsIG9Db250ZXh0KTtcblx0XHRsZXQgb1Byb21pc2U6IFByb21pc2U8YW55Pjtcblx0XHQvKipcblx0XHQgKiBDb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyBlaXRoZXIgcmV0dXJucyBhIHByb21pc2Ugb3IgdGhyb3dzIGEgbmV3IGVycm9yLiBUaGlzIHJldHVybiBpcyBjYXVnaHQgaWYgYW4gZXJyb3IgaXMgdGhyb3duXG5cdFx0ICogdG8gYXZvaWQgYnJlYWtpbmcgdGhlIHByb21pc2UgY2hhaW4uXG5cdFx0ICovXG5cdFx0dHJ5IHtcblx0XHRcdG9Qcm9taXNlID0gKG9Db250ZXh0IGFzIGFueSkucmVxdWVzdFNpZGVFZmZlY3RzKGFQYXRoRXhwcmVzc2lvbnMsIHNHcm91cElkKSBhcyBQcm9taXNlPGFueT47XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLnJlamVjdChlKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgZm9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNOYXZpZ2F0aW9uUHJvcGVydHkgTmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdHB1YmxpYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoc05hdmlnYXRpb25Qcm9wZXJ0eTogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0Jhc2VFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdGlmIChzQmFzZUVudGl0eVR5cGUpIHtcblx0XHRcdGNvbnN0IGFTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzQmFzZUVudGl0eVR5cGUpO1xuXHRcdFx0bGV0IGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhhU2lkZUVmZmVjdHMpXG5cdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWxldmFudCBTaWRlRWZmZWN0c1xuXHRcdFx0XHRcdHNBbm5vdGF0aW9uTmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQob1NpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5UGF0aCA9PiBvUHJvcGVydHlQYXRoLnZhbHVlLmluZGV4T2Yoc05hdmlnYXRpb25Qcm9wZXJ0eSkgPiAtMVxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24sIG9Db250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKVxuXHRcdFx0XHRcdFx0LmNvbmNhdCgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKVxuXHRcdFx0XHRcdFx0LmZvckVhY2gobVRhcmdldCA9PiBhVGFyZ2V0cy5wdXNoKG1UYXJnZXQpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHByb3BlcnRpZXNcblx0XHRcdGFUYXJnZXRzID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRpZiAoYVRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldHMsIG9Db250ZXh0KS5jYXRjaChvRXJyb3IgPT5cblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIE5hdmlnYXRpb24gUHJvcGVydHkgXCIgKyBzTmF2aWdhdGlvblByb3BlcnR5LCBvRXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgTmFtZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFNpZGVFZmZlY3RzXG5cdCAqIElmIGEgcHJvcGVydHkgaGFzIGFuIGFzc29jaWF0ZWQgdGV4dCB0aGVuIHRoaXMgdGV4dCBuZWVkcyB0byBiZSBhZGRlZCBhcyB0YXJnZXRQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMob1NpZGVFZmZlY3Q6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgYUluaXRpYWxQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZDogc3RyaW5nW10gPSAob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLm1hcChuYXZpZ2F0aW9uID0+IG5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGxldCBhRGVyaXZlZFByb3BlcnRpZXM6IEV4dHJhY3RvclByb3BlcnR5SW5mb1tdID0gW107XG5cblx0XHRhSW5pdGlhbFByb3BlcnRpZXMuZm9yRWFjaChzUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdGNvbnN0IGJJc1N0YXJQcm9wZXJ0eSA9IHNQcm9wZXJ0eVBhdGguZW5kc1dpdGgoXCIqXCIpLCAvLyBDYW4gYmUgJyonIG9yICcuLi4vbmF2UHJvcC8qJ1xuXHRcdFx0XHRzTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nID0gc1Byb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgc1Byb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpLFxuXHRcdFx0XHRzUmVsYXRpdmVQYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCArIFwiL1wiIDogXCJcIixcblx0XHRcdFx0bVRhcmdldDogYW55ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIHx8IG1FbnRpdHlUeXBlO1xuXG5cdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHQvLyBtVGFyZ2V0IGNhbiBiZSBhbiBlbnRpdHkgdHlwZSwgbmF2aWdhdGlvblByb3BlcnR5IG9yIG9yIGEgY29tcGxleFR5cGVcblx0XHRcdFx0Y29uc3QgYVRhcmdldEVudGl0eVByb3BlcnRpZXM6IFByb3BlcnR5W10gPVxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIEVudGl0eVR5cGUpLmVudGl0eVByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZT8ucHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHRcdFx0XHRpZiAoYVRhcmdldEVudGl0eVByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRpZiAoYklzU3RhclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldEVudGl0eVByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQucHVzaChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcyA9IGFEZXJpdmVkUHJvcGVydGllcy5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGg7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5zdWJzdHJpbmcoMCwgc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkubGFzdEluZGV4T2YoXCIvXCIpKSkgPT09XG5cdFx0XHRcdFx0XHQtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0O1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gUmVtb3ZlcyBiaW5kaW5nIHBhcmFtZXRlciBmcm9tIFNpZGVFZmZlY3RzIHRhcmdldHMgcHJvcGVydGllc1xuXHQgKiAgLSBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXNcblx0ICogIC0gUmVwbGFjZXMgVGFyZ2V0UHJvcGVydGllcyBoYXZpbmcgcmVmZXJlbmNlIHRvIFNvdXJjZSBQcm9wZXJ0aWVzIGZvciBhIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0JpbmRpbmdQYXJhbWV0ZXIgTmFtZSBvZiB0aGUgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBfY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlLFxuXHRcdHNFbnRpdHlUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gKHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkgYXMgQ29udmVydGVyT3V0cHV0KS5lbnRpdHlUeXBlcy5maW5kKG9FbnRpdHlUeXBlID0+IHtcblx0XHRcdHJldHVybiBvRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPT09IHNFbnRpdHlUeXBlO1xuXHRcdH0pO1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gbUVudGl0eVR5cGVcblx0XHRcdD8gdGhpcy5fcmVwbGFjZVJlZmVyZW5jZWRQcm9wZXJ0aWVzKHRoaXMuX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMob1RlbXBTaWRlRWZmZWN0cywgbUVudGl0eVR5cGUpLCBtRW50aXR5VHlwZSlcblx0XHRcdDogb1RlbXBTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIChUYXJnZXRFbnRpdGllcyBhbmQgVGFyZ2V0UHJvcGVydGllcykgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFRhcmdldFByb3BlcnRpZXMgYXMgYXJyYXkgb2Ygc3RyaW5nXG5cdCAqICAtIFRhcmdldEVudGl0aWVzIGFzIGFycmF5IG9mIG9iamVjdCB3aXRoIHByb3BlcnR5ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKS5yZWR1Y2UoZnVuY3Rpb24oYVRhcmdldFByb3BlcnRpZXMsIHZUYXJnZXQpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9ICh0eXBlb2YgdlRhcmdldCA9PT0gXCJzdHJpbmdcIiAmJiB2VGFyZ2V0KSB8fCAodlRhcmdldC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiICYmIHZUYXJnZXQudmFsdWUpO1xuXHRcdFx0XHRpZiAoc1RhcmdldCkge1xuXHRcdFx0XHRcdGFUYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RhcmdldCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFRhcmdldFByb3BlcnRpZXMgZm9yIFNpZGVFZmZlY3RzXCIgKyBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYVRhcmdldFByb3BlcnRpZXM7XG5cdFx0XHR9LCBbXSksXG5cdFx0XHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pLm1hcChtVGFyZ2V0RW50aXR5ID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqICBTaWRlRWZmZWN0cyB0aGF0IGNvbWVzIGZyb20gU0FQIEZFIGdldCBUYXJnZXRFbnRpdGllcyB3aXRoICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHdoZXJlYXNcblx0XHRcdFx0ICogIG9uZXMgY29taW5nIGZyb20gdGhlIGNvbnZlcnRlZCBPRGF0YSBtb2RlbCBnZXRzIGEgTmF2aWdhdGlvblByb3BlcnR5UGF0aCBmb3JtYXRcblx0XHRcdFx0ICpcblx0XHRcdFx0ICovXG5cdFx0XHRcdHJldHVybiB7IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjogbVRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0RW50aXR5LnZhbHVlIHx8IFwiXCIgfTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiB7IC4uLm9TaWRlRWZmZWN0cywgLi4ueyBUYXJnZXRQcm9wZXJ0aWVzLCBUYXJnZXRFbnRpdGllcyB9IH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aCBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMge29iamVjdH0gQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvU291cmNlOiBhbnkpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBhU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRjb25zdCBhdXRob3JpemVkVHlwZXMgPSBbXCJFbnRpdHlUeXBlXCIsIFwiQWN0aW9uXCJdO1xuXHRcdGlmIChvU291cmNlLl90eXBlICYmIGF1dGhvcml6ZWRUeXBlcy5pbmRleE9mKG9Tb3VyY2UuX3R5cGUpID4gLTEpIHtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gb1NvdXJjZS5fdHlwZSA9PT0gXCJFbnRpdHlUeXBlXCIgPyBvU291cmNlIDogb1NvdXJjZS5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0aWYgKG1FbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IG1Db21tb25Bbm5vdGF0aW9uOiBhbnkgPSBvU291cmNlLmFubm90YXRpb25zPy5Db21tb24gfHwge307XG5cdFx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyID0gKChvU291cmNlIGFzIEFjdGlvbikucGFyYW1ldGVycyB8fCBbXSkuZmluZChcblx0XHRcdFx0XHRtUGFyYW1ldGVyID0+IG1QYXJhbWV0ZXIudHlwZSA9PT0gKG1FbnRpdHlUeXBlIHx8IG9Tb3VyY2UpLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLl9jb252ZXJ0U2lkZUVmZmVjdHMobUNvbW1vbkFubm90YXRpb25bc0Fubm90YXRpb25OYW1lXSwgbUVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBzQmluZGluZ1BhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyBTaWRlRWZmZWN0cyByZXF1ZXN0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtBcnJheX0gYVBhdGhFeHByZXNzaW9ucyBTaWRlRWZmZWN0cyB0YXJnZXRzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIF9sb2dSZXF1ZXN0KGFQYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1RhcmdldFBhdGhzID0gYVBhdGhFeHByZXNzaW9ucy5yZWR1Y2UoZnVuY3Rpb24oc1BhdGhzLCBtVGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gc1BhdGhzICsgXCJcXG5cXHRcXHRcIiArICgobVRhcmdldCBhcyBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUpLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IG1UYXJnZXQgfHwgXCJcIik7XG5cdFx0fSwgXCJcIik7XG5cdFx0TG9nLmRlYnVnKFwiU2lkZUVmZmVjdHMgLSBSZXF1ZXN0OlxcblxcdENvbnRleHQgcGF0aCA6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpICsgXCJcXG5cXHRQcm9wZXJ0eSBwYXRocyA6XCIgKyBzVGFyZ2V0UGF0aHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgbmFtZSBvZiBiaW5kaW5nIHBhcmFtZXRlciBvbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlck5hbWUgTmFtZSBvZiBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXJOYW1lPzogc3RyaW5nKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0aWYgKHNCaW5kaW5nUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0Y29uc3QgYVRhcmdldHMgPSBbXCJUYXJnZXRQcm9wZXJ0aWVzXCIsIFwiVGFyZ2V0RW50aXRpZXNcIl07XG5cdFx0XHRhVGFyZ2V0cy5mb3JFYWNoKHNUYXJnZXQgPT4ge1xuXHRcdFx0XHRsZXQgbVRhcmdldCA9IChvU2lkZUVmZmVjdHMgYXMgYW55KVtzVGFyZ2V0XTtcblx0XHRcdFx0aWYgKG1UYXJnZXQpIHtcblx0XHRcdFx0XHRtVGFyZ2V0ID0gbVRhcmdldC5tYXAoKG1Qcm9wZXJ0eTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkOyAvLyBOZWVkIHRvIHRlc3Qgd2l0aCB1bmRlZmluZWQgc2luY2UgIG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCBjb3VsZCBiZSBcIlwiIChlbXB0eSBzdHJpbmcpXG5cdFx0XHRcdFx0XHRjb25zdCBzVmFsdWUgPSAoYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggOiBtUHJvcGVydHkpLnJlcGxhY2UoXG5cdFx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXCJeXCIgKyBzQmluZGluZ1BhcmFtZXRlck5hbWUgKyBcIj8uXCIpLFxuXHRcdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc1ZhbHVlIH0gOiBzVmFsdWU7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0KG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdID0gbVRhcmdldDtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBkdXBsaWNhdGVzIGluIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVGFyZ2V0cyBTaWRlRWZmZWN0cyB0YXJnZXRzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gU2lkZUVmZmVjdHMgdGFyZ2V0cyB3aXRob3V0IGR1cGxpY2F0ZXNcblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10pOiBTaWRlRWZmZWN0c1RhcmdldFtdIHtcblx0XHRyZXR1cm4gYVRhcmdldHMuZmlsdGVyKFxuXHRcdFx0KG1UYXJnZXQ6IGFueSwgaUluZGV4LCBhVGFyZ2V0cykgPT5cblx0XHRcdFx0YVRhcmdldHMuZmluZEluZGV4KChtU2VhcmNoVGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0bVNlYXJjaFRhcmdldCA9PT0gbVRhcmdldCB8fCAvLyBQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdChtVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1TZWFyY2hUYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIC8vIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KSA9PT0gaUluZGV4XG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHNcblx0ICogSWYgYSBTaWRlRWZmZWN0cyBTb3VyY2UgUHJvcGVydHkgaXMgYW4gbmF2aWdhdGlvbiBlbnRpdHkgcmVmZXJlbmNlLCB0aGUgU2lkZUVmZmVjdHMgVGFyZ2V0IFByb3BlcnRpZXMgY2Fubm90IGJlIGEgcHJvcGVydHkgb2YgdGhpcyBuYXZpZ2F0aW9uIGVudGl0eS5cblx0ICogSW5kZWVkIHRoaXMgY29uZmlndXJhdGlvbiBsZWFkcyB0byBlcnJvciBpbnRvIHRoZSBPRGF0YSBWNCBNb2RlbCBzaW5jZSByZXNwb25zZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2UgdGhpcyB3b3VsZCBtZWFuIHRoYXQgd2UgbWVyZ2UgcHJvcGVydGllcyBvZiB0aGUgbmV3IHRhcmdldCBpbnRvIHRoZSBvbGQgdGFyZ2V0IG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHQgKiBJbiBvcmRlciB0byByZXF1ZXN0IG5ldyB2YWx1ZSBvZiB0aGVzZSB0YXJnZXQgcHJvcGVydGllcyB0aGUgU2lkZUVmZmVjdHMgd2lsbCByZXF1ZXN0IGZvciB0aGUgZW50aXJlIEVudGl0eSBpbnN0ZWFkIG9mIGp1c3QgYSBzZXQgb2YgcHJvcGVydGllcy5cblx0ICogRm9yIHRoZSBmaXJzdCB2ZXJzaW9uLCB3ZSByZW1vdmUgYWxsIG5hdmlnYXRpb24gcHJvcGVydGllcyBhbmQgcmVwbGFjZSB0aGVtIGJ5IHRhcmdldEVudGl0aWVzLiBUaGlzIGNoYW5nZSBjb3VsZCBiZSBpbXByb3ZlZCBpbiBuZXh0IHZlcnNpb24uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb24gd2l0aG91dCByZWZlcmVuY2VkIHRhcmdldCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9yZXBsYWNlUmVmZXJlbmNlZFByb3BlcnRpZXMob1NpZGVFZmZlY3Q6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0bGV0IGJTaWRlRWZmZWN0c0NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRjb25zdCBhRW50aXRpZXM6IHN0cmluZ1tdID1cblx0XHRcdFx0KG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5tYXAobU5hdmlnYXRpb24gPT4ge1xuXHRcdFx0XHRcdHJldHVybiBtTmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHRcdFx0fSkgfHwgW10sXG5cdFx0XHRhUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblxuXHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMuZm9yRWFjaChzUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdGxldCBiVGFyZ2V0Q2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3QgaUxhc3RQYXRoU2VwYXJhdG9ySW5kZXggPSBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGlmIChpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc1Byb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgaUxhc3RQYXRoU2VwYXJhdG9ySW5kZXgpO1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc05hdmlnYXRpb25QYXRoKTtcblx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgb1RhcmdldC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdC8vVGVzdCBpZiBpdCdzIG5vdCBhIHByb3BlcnR5IGJvdW5kIG9uIGNvbXBsZXhUeXBlIChfQ29tcGxleFR5cGUvTXlQcm9wZXJ0eSlcblx0XHRcdFx0XHRiU2lkZUVmZmVjdHNDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRiVGFyZ2V0Q2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKCFhRW50aXRpZXMuaW5jbHVkZXMoc05hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHRcdFx0YUVudGl0aWVzLnB1c2goc05hdmlnYXRpb25QYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYlRhcmdldENoYW5nZWQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChzUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChiU2lkZUVmZmVjdHNDaGFuZ2VkKSB7XG5cdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnRpZXM7XG5cdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyA9IGFFbnRpdGllcy5tYXAoc05hdmlnYXRpb25QYXRoID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc05hdmlnYXRpb25QYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBhY3Rpb24gdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIG9uIGFjdGlvbnNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHRjb25zdCBhQWN0aW9ucyA9IG1FbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0aWYgKGFBY3Rpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhhQWN0aW9ucykuZm9yRWFjaChzQWN0aW9uTmFtZSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb24gPSBtRW50aXR5VHlwZS5hY3Rpb25zW3NBY3Rpb25OYW1lXTtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlckFjdGlvbnM6IFN0cmluZ1tdID0gW107XG5cdFx0XHRcdGxldCBwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdFx0bGV0IGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cblx0XHRcdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG9BY3Rpb24pLmZvckVhY2gob1NpZGVFZmZlY3QgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNUcmlnZ2VyQWN0aW9uID0gb1NpZGVFZmZlY3QuVHJpZ2dlckFjdGlvbjtcblx0XHRcdFx0XHRhVGFyZ2V0cyA9IGFUYXJnZXRzLmNvbmNhdChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSk7XG5cdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uICYmIHRyaWdnZXJBY3Rpb25zLmluZGV4T2Yoc1RyaWdnZXJBY3Rpb24pID09PSAtMSkge1xuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnMucHVzaChzVHJpZ2dlckFjdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KSB7XG5cdFx0Y29uc3QgU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSA9IG5ldyBTaWRlRWZmZWN0c1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZS5pbml0UHJvbWlzZTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5O1xuIl19
|
|
@@ -230,11 +230,21 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
230
230
|
* @param {Array} aPathExpressions Targets of SideEffects to be executed
|
|
231
231
|
* @param {object} oContext Context where SideEffects need to be executed
|
|
232
232
|
* @param {string} sGroupId The group ID to be used for the request
|
|
233
|
-
* @returns {
|
|
233
|
+
* @returns {Promise} Promise on SideEffects request
|
|
234
234
|
*/
|
|
235
235
|
public requestSideEffects(aPathExpressions: SideEffectsTarget[], oContext: Context, sGroupId?: string): Promise<any> {
|
|
236
236
|
this._logRequest(aPathExpressions, oContext);
|
|
237
|
-
|
|
237
|
+
let oPromise: Promise<any>;
|
|
238
|
+
/**
|
|
239
|
+
* Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
|
|
240
|
+
* to avoid breaking the promise chain.
|
|
241
|
+
*/
|
|
242
|
+
try {
|
|
243
|
+
oPromise = (oContext as any).requestSideEffects(aPathExpressions, sGroupId) as Promise<any>;
|
|
244
|
+
} catch (e) {
|
|
245
|
+
oPromise = Promise.reject(e);
|
|
246
|
+
}
|
|
247
|
+
return oPromise;
|
|
238
248
|
}
|
|
239
249
|
|
|
240
250
|
/**
|
|
@@ -504,7 +514,7 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
504
514
|
mTarget = mTarget.map((mProperty: any) => {
|
|
505
515
|
const bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
506
516
|
const sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(
|
|
507
|
-
new RegExp(sBindingParameterName + "
|
|
517
|
+
new RegExp("^" + sBindingParameterName + "?."),
|
|
508
518
|
""
|
|
509
519
|
);
|
|
510
520
|
return bNavigationPropertyPath ? { $NavigationPropertyPath: sValue } : sValue;
|